From 6d978228d9d293caeb4ea2cec50df8af192dc27c Mon Sep 17 00:00:00 2001 From: losolosol Date: Thu, 11 Sep 2025 20:35:57 -0700 Subject: [PATCH] feat: added vscode start task button (#1201) Co-authored-by: Carlos Montoya Co-authored-by: Carlos Montoya --- .changeset/wild-ears-look.md | 5 ++ .../TaskDetails/TaskMetadataSidebar.tsx | 46 ++++++++++++++++++- .../src/components/TaskDetailsView.tsx | 20 ++++---- .../extension/src/services/webview-manager.ts | 19 ++++++++ 4 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 .changeset/wild-ears-look.md diff --git a/.changeset/wild-ears-look.md b/.changeset/wild-ears-look.md new file mode 100644 index 00000000..ff64add2 --- /dev/null +++ b/.changeset/wild-ears-look.md @@ -0,0 +1,5 @@ +--- +"extension": minor +--- + +Added a Start Build button to the VSCODE Task Properties Right Panel diff --git a/apps/extension/src/components/TaskDetails/TaskMetadataSidebar.tsx b/apps/extension/src/components/TaskDetails/TaskMetadataSidebar.tsx index ac512723..bd2e35f9 100644 --- a/apps/extension/src/components/TaskDetails/TaskMetadataSidebar.tsx +++ b/apps/extension/src/components/TaskDetails/TaskMetadataSidebar.tsx @@ -1,9 +1,10 @@ import type React from 'react'; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; -import { Loader2 } from 'lucide-react'; +import { Loader2, Play } from 'lucide-react'; import { PriorityBadge } from './PriorityBadge'; import type { TaskMasterTask } from '../../webview/types'; +import { useVSCodeContext } from '../../webview/contexts/VSCodeContext'; interface TaskMetadataSidebarProps { currentTask: TaskMasterTask; @@ -28,10 +29,12 @@ export const TaskMetadataSidebar: React.FC = ({ isRegenerating = false, isAppending = false }) => { + const { vscode } = useVSCodeContext(); const [isLoadingComplexity, setIsLoadingComplexity] = useState(false); const [mcpComplexityScore, setMcpComplexityScore] = useState< number | undefined >(undefined); + const [isStartingTask, setIsStartingTask] = useState(false); // Get complexity score from task const currentComplexityScore = complexity?.score; @@ -97,6 +100,29 @@ export const TaskMetadataSidebar: React.FC = ({ } }; + // 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 useEffect(() => { if (currentTask?.id) { @@ -284,6 +310,24 @@ export const TaskMetadataSidebar: React.FC = ({ {currentTask.dependencies && currentTask.dependencies.length > 0 && (
)} + + {/* Start Task Button */} +
+ +
diff --git a/apps/extension/src/components/TaskDetailsView.tsx b/apps/extension/src/components/TaskDetailsView.tsx index 8cdb4b56..ff722527 100644 --- a/apps/extension/src/components/TaskDetailsView.tsx +++ b/apps/extension/src/components/TaskDetailsView.tsx @@ -202,16 +202,16 @@ export const TaskDetailsView: React.FC = ({ /> - {/* Right column - Metadata (1/3 width) */} - + {/* Right column - Metadata (1/3 width) */} + ); diff --git a/apps/extension/src/services/webview-manager.ts b/apps/extension/src/services/webview-manager.ts index 6ec2663d..46d050b0 100644 --- a/apps/extension/src/services/webview-manager.ts +++ b/apps/extension/src/services/webview-manager.ts @@ -361,6 +361,25 @@ export class WebviewManager { } 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: throw new Error(`Unknown message type: ${type}`); }