chore: rename Task Master to TaskMaster

This commit is contained in:
Ralph Khreish
2025-07-31 13:13:34 +03:00
parent cd92be61e5
commit e04a849c56
14 changed files with 67 additions and 71 deletions

View File

@@ -1,8 +1,8 @@
# Official Task Master AI Extension # Official TaskMaster AI Extension
Transform your [Task Master AI](https://github.com/TaskMasterEYJ/task-master-ai) projects into a beautiful, interactive Kanban board directly in VS Code. Drag, drop, and manage your tasks with ease while maintaining real-time synchronization with your Task Master project files. Transform your [TaskMaster AI](https://github.com/TaskMasterEYJ/task-master-ai) projects into a beautiful, interactive Kanban board directly in VS Code. Drag, drop, and manage your tasks with ease while maintaining real-time synchronization with your TaskMaster project files.
![Task Master AI Kanban](https://img.shields.io/badge/VS%20Code-Extension-blue) ![TaskMaster AI Kanban](https://img.shields.io/badge/VS%20Code-Extension-blue)
![Free](https://img.shields.io/badge/Price-Free-brightgreen) ![Free](https://img.shields.io/badge/Price-Free-brightgreen)
![Version](https://img.shields.io/badge/Version-1.0.0-blue) ![Version](https://img.shields.io/badge/Version-1.0.0-blue)
@@ -10,7 +10,7 @@ Transform your [Task Master AI](https://github.com/TaskMasterEYJ/task-master-ai)
### 🎯 **Visual Task Management** ### 🎯 **Visual Task Management**
- **Drag & Drop Kanban Board** - Intuitive task management with visual columns - **Drag & Drop Kanban Board** - Intuitive task management with visual columns
- **Real-time Synchronization** - Changes sync instantly with your Task Master project files - **Real-time Synchronization** - Changes sync instantly with your TaskMaster project files
- **Status Columns** - To Do, In Progress, Review, Done, and Deferred - **Status Columns** - To Do, In Progress, Review, Done, and Deferred
- **Task Details View** - View and edit implementation details, test strategies, and notes - **Task Details View** - View and edit implementation details, test strategies, and notes
@@ -19,7 +19,7 @@ Transform your [Task Master AI](https://github.com/TaskMasterEYJ/task-master-ai)
### 🤖 **AI-Powered Features** ### 🤖 **AI-Powered Features**
- **Task Content Generation** - Regenerate task descriptions using AI - **Task Content Generation** - Regenerate task descriptions using AI
- **Smart Task Updates** - Append findings and progress notes automatically - **Smart Task Updates** - Append findings and progress notes automatically
- **MCP Integration** - Seamless connection to Task Master AI via Model Context Protocol - **MCP Integration** - Seamless connection to TaskMaster AI via Model Context Protocol
- **Intelligent Caching** - Smart performance optimization with background refresh - **Intelligent Caching** - Smart performance optimization with background refresh
![Task Details](assets/screenshots/task-details.png) ![Task Details](assets/screenshots/task-details.png)
@@ -35,7 +35,7 @@ Transform your [Task Master AI](https://github.com/TaskMasterEYJ/task-master-ai)
### Prerequisites ### Prerequisites
1. **VS Code** 1.90.0 or higher 1. **VS Code** 1.90.0 or higher
2. **Node.js** 18.0 or higher (for Task Master MCP server) 2. **Node.js** 18.0 or higher (for TaskMaster MCP server)
### Install the Extension ### Install the Extension
@@ -45,21 +45,21 @@ Transform your [Task Master AI](https://github.com/TaskMasterEYJ/task-master-ai)
## 🚀 Quick Start ## 🚀 Quick Start
### 1. **Initialize Task Master Project** ### 1. **Initialize TaskMaster Project**
If you don't have a Task Master project yet: If you don't have a TaskMaster project yet:
```bash ```bash
cd your-project cd your-project
npx task-master-ai init npx task-master-ai init
``` ```
### 2. **Open Kanban Board** ### 2. **Open Kanban Board**
- **Command Palette** (Ctrl+Shift+P): `Task Master Kanban: Show Board` - **Command Palette** (Ctrl+Shift+P): `TaskMaster Kanban: Show Board`
- **Or** the extension automatically activates when you have a `.taskmaster` folder in your workspace - **Or** the extension automatically activates when you have a `.taskmaster` folder in your workspace
### 3. **MCP Server Setup** ### 3. **MCP Server Setup**
The extension automatically handles the Task Master MCP server connection: The extension automatically handles the TaskMaster MCP server connection:
- **No manual installation required** - The extension spawns the MCP server automatically - **No manual installation required** - The extension spawns the MCP server automatically
- **Uses npx by default** - Automatically downloads Task Master AI when needed - **Uses npx by default** - Automatically downloads TaskMaster AI when needed
- **Configurable** - You can customize the MCP server command in settings if needed - **Configurable** - You can customize the MCP server command in settings if needed
### 4. **Start Managing Tasks** ### 4. **Start Managing Tasks**
@@ -90,7 +90,7 @@ The extension automatically handles the Task Master MCP server connection:
### **AI-Powered Task Management** ### **AI-Powered Task Management**
The extension integrates seamlessly with Task Master AI via MCP to provide: The extension integrates seamlessly with TaskMaster AI via MCP to provide:
- **Smart Task Generation** - AI creates detailed implementation plans - **Smart Task Generation** - AI creates detailed implementation plans
- **Progress Tracking** - Append timestamped notes and findings - **Progress Tracking** - Append timestamped notes and findings
- **Content Enhancement** - Regenerate task descriptions for clarity - **Content Enhancement** - Regenerate task descriptions for clarity
@@ -98,7 +98,7 @@ The extension integrates seamlessly with Task Master AI via MCP to provide:
## ⚙️ Configuration ## ⚙️ Configuration
Access settings via **File → Preferences → Settings** and search for "Task Master": Access settings via **File → Preferences → Settings** and search for "TaskMaster":
### **MCP Connection Settings** ### **MCP Connection Settings**
- **MCP Server Command** - Path to task-master-ai executable (default: `npx`) - **MCP Server Command** - Path to task-master-ai executable (default: `npx`)
@@ -121,7 +121,7 @@ Access settings via **File → Preferences → Settings** and search for "Task M
1. Ensure Node.js 18+ is installed 1. Ensure Node.js 18+ is installed
2. Check workspace contains `.taskmaster` folder 2. Check workspace contains `.taskmaster` folder
3. Restart VS Code 3. Restart VS Code
4. Check Output panel (View → Output → Task Master Kanban) 4. Check Output panel (View → Output → TaskMaster Kanban)
### **MCP Connection Issues** ### **MCP Connection Issues**
1. **Command not found**: Ensure Node.js and npx are in your PATH 1. **Command not found**: Ensure Node.js and npx are in your PATH
@@ -132,7 +132,7 @@ Access settings via **File → Preferences → Settings** and search for "Task M
### **Tasks Not Updating** ### **Tasks Not Updating**
1. Check MCP connection status in status bar 1. Check MCP connection status in status bar
2. Verify `.taskmaster/tasks/tasks.json` exists 2. Verify `.taskmaster/tasks/tasks.json` exists
3. Try manual refresh: `Task Master Kanban: Check Connection` 3. Try manual refresh: `TaskMaster Kanban: Check Connection`
4. Review error logs in Output panel 4. Review error logs in Output panel
### **Performance Issues** ### **Performance Issues**
@@ -144,7 +144,7 @@ Access settings via **File → Preferences → Settings** and search for "Task M
## 🆘 Support & Resources ## 🆘 Support & Resources
### **Getting Help** ### **Getting Help**
- 📖 **Documentation**: [Task Master AI Docs](https://github.com/eyaltoledano/claude-task-master) - 📖 **Documentation**: [TaskMaster AI Docs](https://github.com/eyaltoledano/claude-task-master)
- 🐛 **Report Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) - 🐛 **Report Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues)
- 💬 **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions) - 💬 **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions)
@@ -173,9 +173,9 @@ Access settings via **File → Preferences → Settings** and search for "Task M
--- ---
## 🏆 Why Task Master Kanban? ## 🏆 Why TaskMaster Kanban?
**Visual workflow management** for your Task Master projects **Visual workflow management** for your TaskMaster projects
**AI-powered task enhancement** built right in **AI-powered task enhancement** built right in
**Real-time synchronization** keeps everything in sync **Real-time synchronization** keeps everything in sync
**Native VS Code integration** feels like part of the editor **Native VS Code integration** feels like part of the editor

View File

@@ -1,8 +1,8 @@
{ {
"name": "extension", "name": "extension",
"private": true, "private": true,
"displayName": "Task Master", "displayName": "TaskMaster",
"description": "A visual Kanban board interface for Task Master projects in VS Code", "description": "A visual Kanban board interface for TaskMaster projects in VS Code",
"version": "1.1.0", "version": "1.1.0",
"publisher": "Hamster", "publisher": "Hamster",
"icon": "assets/icon.png", "icon": "assets/icon.png",
@@ -16,7 +16,7 @@
"activitybar": [ "activitybar": [
{ {
"id": "taskmaster", "id": "taskmaster",
"title": "Task Master", "title": "TaskMaster",
"icon": "assets/sidebar-icon.svg" "icon": "assets/sidebar-icon.svg"
} }
] ]
@@ -25,7 +25,7 @@
"taskmaster": [ "taskmaster": [
{ {
"id": "taskmaster.welcome", "id": "taskmaster.welcome",
"name": "Task Master", "name": "TaskMaster",
"type": "webview" "type": "webview"
} }
] ]
@@ -33,20 +33,20 @@
"commands": [ "commands": [
{ {
"command": "tm.showKanbanBoard", "command": "tm.showKanbanBoard",
"title": "Task Master: Show Board", "title": "TaskMaster: Show Board",
"icon": "$(checklist)" "icon": "$(checklist)"
}, },
{ {
"command": "tm.checkConnection", "command": "tm.checkConnection",
"title": "Task Master: Check Connection" "title": "TaskMaster: Check Connection"
}, },
{ {
"command": "tm.reconnect", "command": "tm.reconnect",
"title": "Task Master: Reconnect" "title": "TaskMaster: Reconnect"
}, },
{ {
"command": "tm.openSettings", "command": "tm.openSettings",
"title": "Task Master: Open Settings" "title": "TaskMaster: Open Settings"
} }
], ],
"menus": { "menus": {
@@ -59,7 +59,7 @@
] ]
}, },
"configuration": { "configuration": {
"title": "Task Master Kanban", "title": "TaskMaster Kanban",
"properties": { "properties": {
"taskmaster.mcp.command": { "taskmaster.mcp.command": {
"type": "string", "type": "string",
@@ -71,16 +71,16 @@
"items": { "items": {
"type": "string" "type": "string"
}, },
"default": ["-y", "--package=task-master-ai", "task-master-ai"], "default": ["task-master-ai"],
"description": "An array of arguments to pass to the MCP server command." "description": "An array of arguments to pass to the MCP server command."
}, },
"taskmaster.mcp.cwd": { "taskmaster.mcp.cwd": {
"type": "string", "type": "string",
"description": "Working directory for the Task Master MCP server (defaults to workspace root)" "description": "Working directory for the TaskMaster MCP server (defaults to workspace root)"
}, },
"taskmaster.mcp.env": { "taskmaster.mcp.env": {
"type": "object", "type": "object",
"description": "Environment variables for the Task Master MCP server" "description": "Environment variables for the TaskMaster MCP server"
}, },
"taskmaster.mcp.timeout": { "taskmaster.mcp.timeout": {
"type": "number", "type": "number",

View File

@@ -1,7 +1,7 @@
{ {
"name": "task-master", "name": "task-master",
"displayName": "Task Master", "displayName": "TaskMaster",
"description": "A visual Kanban board interface for Task Master projects in VS Code", "description": "A visual Kanban board interface for TaskMaster projects in VS Code",
"version": "1.0.0", "version": "1.0.0",
"publisher": "Hamster", "publisher": "Hamster",
"icon": "assets/icon.png", "icon": "assets/icon.png",
@@ -54,23 +54,23 @@
"commands": [ "commands": [
{ {
"command": "tm.showKanbanBoard", "command": "tm.showKanbanBoard",
"title": "Task Master: Show Board" "title": "TaskMaster: Show Board"
}, },
{ {
"command": "tm.checkConnection", "command": "tm.checkConnection",
"title": "Task Master: Check Connection" "title": "TaskMaster: Check Connection"
}, },
{ {
"command": "tm.reconnect", "command": "tm.reconnect",
"title": "Task Master: Reconnect" "title": "TaskMaster: Reconnect"
}, },
{ {
"command": "tm.openSettings", "command": "tm.openSettings",
"title": "Task Master: Open Settings" "title": "TaskMaster: Open Settings"
} }
], ],
"configuration": { "configuration": {
"title": "Task Master Kanban", "title": "TaskMaster Kanban",
"properties": { "properties": {
"taskmaster.mcp.command": { "taskmaster.mcp.command": {
"type": "string", "type": "string",

View File

@@ -1,5 +1,5 @@
/** /**
* Task Master Extension - Simplified Architecture * TaskMaster Extension - Simplified Architecture
* Only using patterns where they add real value * Only using patterns where they add real value
*/ */
@@ -32,7 +32,7 @@ export async function activate(context: vscode.ExtensionContext) {
try { try {
// Initialize logger (needed to prevent MCP stdio issues) // Initialize logger (needed to prevent MCP stdio issues)
logger = ExtensionLogger.getInstance(); logger = ExtensionLogger.getInstance();
logger.log('🎉 Task Master Extension activating...'); logger.log('🎉 TaskMaster Extension activating...');
// Simple event emitter for webview communication // Simple event emitter for webview communication
events = new EventEmitter(); events = new EventEmitter();
@@ -46,7 +46,7 @@ export async function activate(context: vscode.ExtensionContext) {
// Repository with caching (actually useful for performance) // Repository with caching (actually useful for performance)
repository = new TaskRepository(api, logger); repository = new TaskRepository(api, logger);
// Config service for Task Master config.json // Config service for TaskMaster config.json
configService = new ConfigService(logger); configService = new ConfigService(logger);
// Polling service with strategy pattern (makes sense for different polling behaviors) // Polling service with strategy pattern (makes sense for different polling behaviors)
@@ -91,18 +91,18 @@ export async function activate(context: vscode.ExtensionContext) {
webviewManager.broadcast('tasksUpdated', { tasks, source: 'polling' }); webviewManager.broadcast('tasksUpdated', { tasks, source: 'polling' });
}); });
logger.log('✅ Task Master Extension activated'); logger.log('✅ TaskMaster Extension activated');
} catch (error) { } catch (error) {
logger?.error('Failed to activate', error); logger?.error('Failed to activate', error);
vscode.window.showErrorMessage( vscode.window.showErrorMessage(
`Failed to activate Task Master: ${error instanceof Error ? error.message : 'Unknown error'}` `Failed to activate TaskMaster: ${error instanceof Error ? error.message : 'Unknown error'}`
); );
} }
} }
async function initializeConnection() { async function initializeConnection() {
try { try {
logger.log('🔗 Connecting to Task Master...'); logger.log('🔗 Connecting to TaskMaster...');
// Notify webviews that we're connecting // Notify webviews that we're connecting
if (webviewManager) { if (webviewManager) {
@@ -117,8 +117,8 @@ async function initializeConnection() {
const testResult = await api.testConnection(); const testResult = await api.testConnection();
if (testResult.success) { if (testResult.success) {
logger.log('✅ Connected to Task Master'); logger.log('✅ Connected to TaskMaster');
vscode.window.showInformationMessage('Task Master connected!'); vscode.window.showInformationMessage('TaskMaster connected!');
// Notify webviews that we're connected // Notify webviews that we're connected
if (webviewManager) { if (webviewManager) {
@@ -157,7 +157,7 @@ function handleConnectionError(error: any) {
if (message.includes('ENOENT') && message.includes('npx')) { if (message.includes('ENOENT') && message.includes('npx')) {
vscode.window vscode.window
.showWarningMessage( .showWarningMessage(
'Task Master: npx not found. Please ensure Node.js is installed.', 'TaskMaster: npx not found. Please ensure Node.js is installed.',
'Open Settings' 'Open Settings'
) )
.then((action) => { .then((action) => {
@@ -170,7 +170,7 @@ function handleConnectionError(error: any) {
}); });
} else { } else {
vscode.window.showWarningMessage( vscode.window.showWarningMessage(
`Task Master connection failed: ${message}` `TaskMaster connection failed: ${message}`
); );
} }
} }
@@ -211,7 +211,7 @@ function registerCommands(context: vscode.ExtensionContext) {
} }
export function deactivate() { export function deactivate() {
logger?.log('👋 Task Master Extension deactivating...'); logger?.log('👋 TaskMaster Extension deactivating...');
pollingService?.stop(); pollingService?.stop();
webviewManager?.dispose(); webviewManager?.dispose();
api?.destroy(); api?.destroy();

View File

@@ -94,7 +94,7 @@ export class ErrorHandler {
switch (context.severity) { switch (context.severity) {
case ErrorSeverity.CRITICAL: case ErrorSeverity.CRITICAL:
vscode.window vscode.window
.showErrorMessage(`Task Master: ${context.message}`, ...actions) .showErrorMessage(`TaskMaster: ${context.message}`, ...actions)
.then((action) => { .then((action) => {
if (action) { if (action) {
this.handleUserAction(action, context); this.handleUserAction(action, context);
@@ -106,7 +106,7 @@ export class ErrorHandler {
if (context.category === ErrorCategory.MCP_CONNECTION) { if (context.category === ErrorCategory.MCP_CONNECTION) {
vscode.window vscode.window
.showWarningMessage( .showWarningMessage(
`Task Master: ${context.message}`, `TaskMaster: ${context.message}`,
'Retry', 'Retry',
'Settings' 'Settings'
) )
@@ -118,7 +118,7 @@ export class ErrorHandler {
} }
}); });
} else { } else {
vscode.window.showWarningMessage(`Task Master: ${context.message}`); vscode.window.showWarningMessage(`TaskMaster: ${context.message}`);
} }
break; break;
@@ -130,7 +130,7 @@ export class ErrorHandler {
) )
) { ) {
vscode.window.showInformationMessage( vscode.window.showInformationMessage(
`Task Master: ${context.message}` `TaskMaster: ${context.message}`
); );
} }
break; break;

View File

@@ -69,7 +69,7 @@ export class SidebarWebviewManager implements vscode.WebviewViewProvider {
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${webview.cspSource} https:; script-src 'nonce-${nonce}'; style-src ${webview.cspSource} 'unsafe-inline';"> <meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${webview.cspSource} https:; script-src 'nonce-${nonce}'; style-src ${webview.cspSource} 'unsafe-inline';">
<link href="${styleUri}" rel="stylesheet"> <link href="${styleUri}" rel="stylesheet">
<title>Task Master</title> <title>TaskMaster</title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@@ -37,7 +37,7 @@ export class WebviewManager {
async createOrShowPanel(): Promise<void> { async createOrShowPanel(): Promise<void> {
// Find existing panel // Find existing panel
const existing = Array.from(this.panels).find( const existing = Array.from(this.panels).find(
(p) => p.title === 'Task Master Kanban' (p) => p.title === 'TaskMaster Kanban'
); );
if (existing) { if (existing) {
existing.reveal(); existing.reveal();
@@ -47,7 +47,7 @@ export class WebviewManager {
// Create new panel // Create new panel
const panel = vscode.window.createWebviewPanel( const panel = vscode.window.createWebviewPanel(
'taskrKanban', 'taskrKanban',
'Task Master Kanban', 'TaskMaster Kanban',
vscode.ViewColumn.One, vscode.ViewColumn.One,
{ {
enableScripts: true, enableScripts: true,
@@ -87,7 +87,7 @@ export class WebviewManager {
}); });
this.events.emit('webview:opened'); this.events.emit('webview:opened');
vscode.window.showInformationMessage('Task Master Kanban opened!'); vscode.window.showInformationMessage('TaskMaster Kanban opened!');
} }
broadcast(type: string, data: any): void { broadcast(type: string, data: any): void {
@@ -360,7 +360,7 @@ export class WebviewManager {
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${webview.cspSource} https:; script-src 'nonce-${nonce}'; style-src ${webview.cspSource} 'unsafe-inline';"> <meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${webview.cspSource} https:; script-src 'nonce-${nonce}'; style-src ${webview.cspSource} 'unsafe-inline';">
<link href="${styleUri}" rel="stylesheet"> <link href="${styleUri}" rel="stylesheet">
<title>Task Master Kanban</title> <title>TaskMaster Kanban</title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@@ -430,7 +430,7 @@ export class ConfigManager {
return { return {
mcp: { mcp: {
command: 'npx', command: 'npx',
args: ['-y', '--package=task-master-ai', 'task-master-ai'], args: ['task-master-ai'],
cwd: vscode.workspace.rootPath || '', cwd: vscode.workspace.rootPath || '',
env: undefined, env: undefined,
timeout: 30000, timeout: 30000,

View File

@@ -22,7 +22,7 @@ export class ExtensionLogger implements ILogger {
private debugMode: boolean; private debugMode: boolean;
private constructor() { private constructor() {
this.outputChannel = vscode.window.createOutputChannel('Task Master'); this.outputChannel = vscode.window.createOutputChannel('TaskMaster');
const config = vscode.workspace.getConfiguration('taskmaster'); const config = vscode.workspace.getConfiguration('taskmaster');
this.debugMode = config.get<boolean>('debug.enableLogging', true); this.debugMode = config.get<boolean>('debug.enableLogging', true);
} }

View File

@@ -124,7 +124,7 @@ export class MCPClientManager {
}); });
this.status = { isRunning: false, error: error.message }; this.status = { isRunning: false, error: error.message };
vscode.window.showErrorMessage( vscode.window.showErrorMessage(
`Task Master MCP transport error: ${error.message}` `TaskMaster MCP transport error: ${error.message}`
); );
}; };
@@ -346,11 +346,7 @@ export function createMCPConfigFromSettings(): MCPConfig {
const config = vscode.workspace.getConfiguration('taskmaster'); const config = vscode.workspace.getConfiguration('taskmaster');
let command = config.get<string>('mcp.command', 'npx'); let command = config.get<string>('mcp.command', 'npx');
const args = config.get<string[]>('mcp.args', [ const args = config.get<string[]>('mcp.args', ['task-master-ai']);
'-y',
'--package=task-master-ai',
'task-master-ai'
]);
// Use proper VS Code workspace detection // Use proper VS Code workspace detection
const defaultCwd = const defaultCwd =

View File

@@ -1,5 +1,5 @@
/** /**
* Task Master API * TaskMaster API
* Main API class that coordinates all modules * Main API class that coordinates all modules
*/ */
@@ -105,7 +105,7 @@ export class TaskMasterApi {
} }
/** /**
* Get tasks from Task Master * Get tasks from TaskMaster
*/ */
async getTasks( async getTasks(
options?: GetTasksOptions options?: GetTasksOptions

View File

@@ -1,6 +1,6 @@
/** /**
* Task Master API Types * TaskMaster API Types
* All type definitions for the Task Master API * All type definitions for the TaskMaster API
*/ */
// MCP Response Types // MCP Response Types

View File

@@ -127,7 +127,7 @@ export const EmptyState: React.FC<EmptyStateProps> = ({ currentTag }) => {
> >
<ExternalLink className="w-4 h-4" /> <ExternalLink className="w-4 h-4" />
<span className="text-sm font-medium"> <span className="text-sm font-medium">
View Task Master Documentation View TaskMaster Documentation
</span> </span>
</a> </a>
</div> </div>

View File

@@ -33,7 +33,7 @@ export const SidebarView: React.FC<SidebarViewProps> = ({
<TaskMasterLogo className="w-20 h-20 mx-auto mb-5 opacity-80 text-vscode-foreground" /> <TaskMasterLogo className="w-20 h-20 mx-auto mb-5 opacity-80 text-vscode-foreground" />
<h2 className="text-xl font-semibold mb-6 text-vscode-foreground"> <h2 className="text-xl font-semibold mb-6 text-vscode-foreground">
Task Master TaskMaster
</h2> </h2>
<button <button