Compare commits
4 Commits
docs/auto-
...
docs/auto-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
93977b6dd5 | ||
|
|
83af314879 | ||
|
|
dd03374496 | ||
|
|
4ab0affba7 |
5
.changeset/wild-ears-look.md
Normal file
5
.changeset/wild-ears-look.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"extension": minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Added a Start Build button to the VSCODE Task Properties Right Panel
|
||||||
@@ -47,20 +47,6 @@ sidebarTitle: "CLI Commands"
|
|||||||
|
|
||||||
# View a specific subtask (e.g., subtask 2 of task 1)
|
# View a specific subtask (e.g., subtask 2 of task 1)
|
||||||
task-master show 1.2
|
task-master show 1.2
|
||||||
|
|
||||||
# Show multiple tasks at once (comma-separated)
|
|
||||||
task-master show 1,2,3
|
|
||||||
task-master show --id=1,2,3
|
|
||||||
|
|
||||||
# Filter subtasks by status
|
|
||||||
task-master show <id> --status=pending
|
|
||||||
task-master show <id> --status=done
|
|
||||||
|
|
||||||
# Output in JSON format (useful for scripts)
|
|
||||||
task-master show <id> --format=json
|
|
||||||
|
|
||||||
# Silent mode (suppress output, useful for programmatic usage)
|
|
||||||
task-master show <id> --silent
|
|
||||||
```
|
```
|
||||||
</Accordion>
|
</Accordion>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
"description": "Task Master documentation powered by Mintlify",
|
"description": "Task Master documentation powered by Mintlify",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "mintlify dev",
|
"dev": "mintlify dev",
|
||||||
"build": "mintlify build",
|
|
||||||
"preview": "mintlify preview"
|
"preview": "mintlify preview"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ The extension automatically handles the Taskmaster MCP server connection:
|
|||||||
| **View Kanban Board** | `Ctrl/Cmd + Shift + P` → "Taskmaster: Show Board" |
|
| **View Kanban Board** | `Ctrl/Cmd + Shift + P` → "Taskmaster: Show Board" |
|
||||||
| **Change Task Status** | Drag task card to different column |
|
| **Change Task Status** | Drag task card to different column |
|
||||||
| **View Task Details** | Click on any task card |
|
| **View Task Details** | Click on any task card |
|
||||||
|
| **Start Working on Task** | Click task → Click "Start Task" button in properties panel |
|
||||||
| **Edit Task Content** | Click task → Use edit buttons in details panel |
|
| **Edit Task Content** | Click task → Use edit buttons in details panel |
|
||||||
| **Add Subtasks** | Click the + button on parent task cards |
|
| **Add Subtasks** | Click the + button on parent task cards |
|
||||||
| **Use AI Features** | Open task details → Click AI action buttons |
|
| **Use AI Features** | Open task details → Click AI action buttons |
|
||||||
@@ -95,6 +96,14 @@ The extension automatically handles the Taskmaster MCP server connection:
|
|||||||
- ✅ **Done** - Completed tasks
|
- ✅ **Done** - Completed tasks
|
||||||
- ⏸️ **Deferred** - Postponed for later
|
- ⏸️ **Deferred** - Postponed for later
|
||||||
|
|
||||||
|
### **Built-in Development Tools**
|
||||||
|
|
||||||
|
**Start Task Button** - Quickly begin working on any task:
|
||||||
|
- **One-Click Terminal** - Opens a new VS Code terminal named after your task
|
||||||
|
- **Context Awareness** - Terminal automatically opens in your workspace root
|
||||||
|
- **Smart State Management** - Button is disabled for completed tasks
|
||||||
|
- **Seamless Workflow** - Go from task planning to implementation instantly
|
||||||
|
|
||||||
### **AI-Powered Task Management**
|
### **AI-Powered Task Management**
|
||||||
|
|
||||||
The extension integrates seamlessly with Taskmaster AI via MCP to provide:
|
The extension integrates seamlessly with Taskmaster AI via MCP to provide:
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import type React from 'react';
|
import type React from 'react';
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Loader2 } from 'lucide-react';
|
import { Loader2, Play } from 'lucide-react';
|
||||||
import { PriorityBadge } from './PriorityBadge';
|
import { PriorityBadge } from './PriorityBadge';
|
||||||
import type { TaskMasterTask } from '../../webview/types';
|
import type { TaskMasterTask } from '../../webview/types';
|
||||||
|
import { useVSCodeContext } from '../../webview/contexts/VSCodeContext';
|
||||||
|
|
||||||
interface TaskMetadataSidebarProps {
|
interface TaskMetadataSidebarProps {
|
||||||
currentTask: TaskMasterTask;
|
currentTask: TaskMasterTask;
|
||||||
@@ -28,10 +29,12 @@ export const TaskMetadataSidebar: React.FC<TaskMetadataSidebarProps> = ({
|
|||||||
isRegenerating = false,
|
isRegenerating = false,
|
||||||
isAppending = false
|
isAppending = false
|
||||||
}) => {
|
}) => {
|
||||||
|
const { vscode } = useVSCodeContext();
|
||||||
const [isLoadingComplexity, setIsLoadingComplexity] = useState(false);
|
const [isLoadingComplexity, setIsLoadingComplexity] = useState(false);
|
||||||
const [mcpComplexityScore, setMcpComplexityScore] = useState<
|
const [mcpComplexityScore, setMcpComplexityScore] = useState<
|
||||||
number | undefined
|
number | undefined
|
||||||
>(undefined);
|
>(undefined);
|
||||||
|
const [isStartingTask, setIsStartingTask] = useState(false);
|
||||||
|
|
||||||
// Get complexity score from task
|
// Get complexity score from task
|
||||||
const currentComplexityScore = complexity?.score;
|
const currentComplexityScore = complexity?.score;
|
||||||
@@ -97,6 +100,29 @@ export const TaskMetadataSidebar: React.FC<TaskMetadataSidebarProps> = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Handle starting a task
|
||||||
|
const handleStartTask = () => {
|
||||||
|
if (!currentTask || isStartingTask) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setIsStartingTask(true);
|
||||||
|
|
||||||
|
// Send message to extension to open terminal
|
||||||
|
if (vscode) {
|
||||||
|
vscode.postMessage({
|
||||||
|
type: 'openTerminal',
|
||||||
|
taskId: currentTask.id,
|
||||||
|
taskTitle: currentTask.title
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset loading state after a short delay
|
||||||
|
setTimeout(() => {
|
||||||
|
setIsStartingTask(false);
|
||||||
|
}, 500);
|
||||||
|
};
|
||||||
|
|
||||||
// Effect to handle complexity on task change
|
// Effect to handle complexity on task change
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (currentTask?.id) {
|
if (currentTask?.id) {
|
||||||
@@ -284,6 +310,24 @@ export const TaskMetadataSidebar: React.FC<TaskMetadataSidebarProps> = ({
|
|||||||
{currentTask.dependencies && currentTask.dependencies.length > 0 && (
|
{currentTask.dependencies && currentTask.dependencies.length > 0 && (
|
||||||
<div className="border-b border-textSeparator-foreground" />
|
<div className="border-b border-textSeparator-foreground" />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Start Task Button */}
|
||||||
|
<div className="mt-4">
|
||||||
|
<Button
|
||||||
|
onClick={handleStartTask}
|
||||||
|
variant="default"
|
||||||
|
size="sm"
|
||||||
|
className="w-full text-xs"
|
||||||
|
disabled={isRegenerating || isAppending || isStartingTask || currentTask?.status === 'done'}
|
||||||
|
>
|
||||||
|
{isStartingTask ? (
|
||||||
|
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
|
||||||
|
) : (
|
||||||
|
<Play className="w-4 h-4 mr-2" />
|
||||||
|
)}
|
||||||
|
{isStartingTask ? 'Starting...' : 'Start Task'}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -202,16 +202,16 @@ export const TaskDetailsView: React.FC<TaskDetailsViewProps> = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Right column - Metadata (1/3 width) */}
|
{/* Right column - Metadata (1/3 width) */}
|
||||||
<TaskMetadataSidebar
|
<TaskMetadataSidebar
|
||||||
currentTask={currentTask}
|
currentTask={currentTask}
|
||||||
tasks={allTasks}
|
tasks={allTasks}
|
||||||
complexity={complexity}
|
complexity={complexity}
|
||||||
isSubtask={isSubtask}
|
isSubtask={isSubtask}
|
||||||
sendMessage={sendMessage}
|
sendMessage={sendMessage}
|
||||||
onStatusChange={handleStatusChange}
|
onStatusChange={handleStatusChange}
|
||||||
onDependencyClick={handleDependencyClick}
|
onDependencyClick={handleDependencyClick}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -361,6 +361,25 @@ export class WebviewManager {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case 'openTerminal':
|
||||||
|
// Open VS Code terminal for task execution
|
||||||
|
this.logger.info(`Opening terminal for task ${data.taskId}: ${data.taskTitle}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const terminal = vscode.window.createTerminal({
|
||||||
|
name: `Task ${data.taskId}: ${data.taskTitle}`,
|
||||||
|
cwd: this.workspaceRoot
|
||||||
|
});
|
||||||
|
terminal.show();
|
||||||
|
|
||||||
|
this.logger.info('Terminal created and shown successfully');
|
||||||
|
response = { success: true };
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error('Failed to create terminal:', error);
|
||||||
|
response = { success: false, error: error.message };
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown message type: ${type}`);
|
throw new Error(`Unknown message type: ${type}`);
|
||||||
}
|
}
|
||||||
|
|||||||
90
output.txt
90
output.txt
File diff suppressed because one or more lines are too long
1
package-lock.json
generated
1
package-lock.json
generated
@@ -29,6 +29,7 @@
|
|||||||
"@inquirer/search": "^3.0.15",
|
"@inquirer/search": "^3.0.15",
|
||||||
"@openrouter/ai-sdk-provider": "^0.4.5",
|
"@openrouter/ai-sdk-provider": "^0.4.5",
|
||||||
"@streamparser/json": "^0.0.22",
|
"@streamparser/json": "^0.0.22",
|
||||||
|
"@tm/cli": "*",
|
||||||
"ai": "^4.3.10",
|
"ai": "^4.3.10",
|
||||||
"ajv": "^8.17.1",
|
"ajv": "^8.17.1",
|
||||||
"ajv-formats": "^3.0.1",
|
"ajv-formats": "^3.0.1",
|
||||||
|
|||||||
19
package.json
19
package.json
@@ -28,13 +28,11 @@
|
|||||||
"typecheck:all": "turbo typecheck",
|
"typecheck:all": "turbo typecheck",
|
||||||
"typecheck:core": "npm run typecheck -w @tm/core",
|
"typecheck:core": "npm run typecheck -w @tm/core",
|
||||||
"typecheck:cli": "npm run typecheck -w @tm/cli",
|
"typecheck:cli": "npm run typecheck -w @tm/cli",
|
||||||
"test": "turbo test",
|
"test": "node --experimental-vm-modules node_modules/.bin/jest",
|
||||||
"test:watch": "turbo test:watch",
|
"test:unit": "node --experimental-vm-modules node_modules/.bin/jest --testPathPattern=unit",
|
||||||
"test:legacy": "NODE_ENV=development node --experimental-vm-modules node_modules/.bin/jest",
|
"test:integration": "node --experimental-vm-modules node_modules/.bin/jest --testPathPattern=integration",
|
||||||
"test:debug": "NODE_ENV=development node --inspect --experimental-vm-modules node_modules/.bin/jest --no-cache --verbose",
|
"test:fails": "node --experimental-vm-modules node_modules/.bin/jest --onlyFailures",
|
||||||
"test:unit": "NODE_ENV=development node --experimental-vm-modules node_modules/.bin/jest --testPathPattern=unit",
|
"test:watch": "node --experimental-vm-modules node_modules/.bin/jest --watch",
|
||||||
"test:integration": "NODE_ENV=development node --experimental-vm-modules node_modules/.bin/jest --testPathPattern=integration",
|
|
||||||
"test:fails": "NODE_ENV=development node --experimental-vm-modules node_modules/.bin/jest --onlyFailures",
|
|
||||||
"test:coverage": "node --experimental-vm-modules node_modules/.bin/jest --coverage",
|
"test:coverage": "node --experimental-vm-modules node_modules/.bin/jest --coverage",
|
||||||
"test:ci": "node --experimental-vm-modules node_modules/.bin/jest --coverage --ci",
|
"test:ci": "node --experimental-vm-modules node_modules/.bin/jest --coverage --ci",
|
||||||
"test:e2e": "./tests/e2e/run_e2e.sh",
|
"test:e2e": "./tests/e2e/run_e2e.sh",
|
||||||
@@ -46,11 +44,7 @@
|
|||||||
"inspector": "npx @modelcontextprotocol/inspector node dist/mcp-server.js",
|
"inspector": "npx @modelcontextprotocol/inspector node dist/mcp-server.js",
|
||||||
"mcp-server": "node dist/mcp-server.js",
|
"mcp-server": "node dist/mcp-server.js",
|
||||||
"format-check": "biome format .",
|
"format-check": "biome format .",
|
||||||
"format": "biome format . --write",
|
"format": "biome format . --write"
|
||||||
"lint": "turbo lint",
|
|
||||||
"lint:all": "turbo lint",
|
|
||||||
"lint:legacy": "npm run lint --workspaces --if-present",
|
|
||||||
"test:all": "turbo test"
|
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"claude",
|
"claude",
|
||||||
@@ -68,6 +62,7 @@
|
|||||||
"license": "MIT WITH Commons-Clause",
|
"license": "MIT WITH Commons-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ai-sdk/amazon-bedrock": "^2.2.9",
|
"@ai-sdk/amazon-bedrock": "^2.2.9",
|
||||||
|
"@tm/cli": "*",
|
||||||
"@ai-sdk/anthropic": "^1.2.10",
|
"@ai-sdk/anthropic": "^1.2.10",
|
||||||
"@ai-sdk/azure": "^1.3.17",
|
"@ai-sdk/azure": "^1.3.17",
|
||||||
"@ai-sdk/google": "^1.2.13",
|
"@ai-sdk/google": "^1.2.13",
|
||||||
|
|||||||
@@ -17,15 +17,6 @@
|
|||||||
"!{packages,apps}/**/node_modules/**"
|
"!{packages,apps}/**/node_modules/**"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"test": {
|
|
||||||
"dependsOn": ["^build"],
|
|
||||||
"inputs": [
|
|
||||||
"$TURBO_DEFAULT$",
|
|
||||||
"!{packages,apps}/**/dist/**",
|
|
||||||
"!{packages,apps}/**/node_modules/**"
|
|
||||||
],
|
|
||||||
"outputLogs": "new-only"
|
|
||||||
},
|
|
||||||
"test:watch": {
|
"test:watch": {
|
||||||
"cache": false,
|
"cache": false,
|
||||||
"persistent": true,
|
"persistent": true,
|
||||||
|
|||||||
Reference in New Issue
Block a user