diff --git a/frontend/src/app/boards/[boardId]/page.tsx b/frontend/src/app/boards/[boardId]/page.tsx index f239136..5ad6322 100644 --- a/frontend/src/app/boards/[boardId]/page.tsx +++ b/frontend/src/app/boards/[boardId]/page.tsx @@ -22,6 +22,7 @@ import { RefreshCcw, Settings, ShieldCheck, + Terminal, X, } from "lucide-react"; @@ -2545,6 +2546,33 @@ export default function BoardDetailPage() { }; }, [commentIdFromUrl, comments, isDetailOpen]); + const handleDispatchToClaudeCode = useCallback(async () => { + if (!selectedTask) return; + const boardName = board?.name ?? "Unknown board"; + const parts: string[] = [ + `You have been assigned a task from Pipeline.\n`, + `**Task**: ${selectedTask.title}`, + `**Board**: ${boardName}`, + `**Status**: ${selectedTask.status}`, + `**Priority**: ${selectedTask.priority}`, + ]; + if (selectedTask.due_at) { + parts.push(`**Due**: ${new Date(selectedTask.due_at).toLocaleDateString()}`); + } + if (selectedTask.description?.trim()) { + parts.push(`\n**Description**:\n${selectedTask.description.trim()}`); + } + parts.push(`\n---\nPlease review this task and begin working on it.`); + parts.push(`Task ID: ${selectedTask.id}`); + const prompt = parts.join("\n"); + try { + await navigator.clipboard.writeText(prompt); + pushToast("Task copied — paste into Claude Code in VSCode to dispatch.", "success"); + } catch { + pushToast("Failed to copy to clipboard.", "error"); + } + }, [selectedTask, board, pushToast]); + const closeComments = () => { openedTaskIdFromUrlRef.current = null; if (searchParams.get("taskId") || searchParams.get("commentId")) { @@ -3710,6 +3738,15 @@ export default function BoardDetailPage() {

+