feat: add functionality to copy task details as Claude Code prompt
This commit is contained in:
parent
b782511ee9
commit
0605c7b908
|
|
@ -22,6 +22,7 @@ import {
|
||||||
RefreshCcw,
|
RefreshCcw,
|
||||||
Settings,
|
Settings,
|
||||||
ShieldCheck,
|
ShieldCheck,
|
||||||
|
Terminal,
|
||||||
X,
|
X,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
|
|
@ -2545,6 +2546,33 @@ export default function BoardDetailPage() {
|
||||||
};
|
};
|
||||||
}, [commentIdFromUrl, comments, isDetailOpen]);
|
}, [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 = () => {
|
const closeComments = () => {
|
||||||
openedTaskIdFromUrlRef.current = null;
|
openedTaskIdFromUrlRef.current = null;
|
||||||
if (searchParams.get("taskId") || searchParams.get("commentId")) {
|
if (searchParams.get("taskId") || searchParams.get("commentId")) {
|
||||||
|
|
@ -3710,6 +3738,15 @@ export default function BoardDetailPage() {
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleDispatchToClaudeCode}
|
||||||
|
className="rounded-lg border border-border p-2 text-muted-foreground transition hover:bg-muted disabled:opacity-40"
|
||||||
|
disabled={!selectedTask}
|
||||||
|
title="Copy task as Claude Code prompt"
|
||||||
|
>
|
||||||
|
<Terminal className="h-4 w-4" />
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => setIsEditDialogOpen(true)}
|
onClick={() => setIsEditDialogOpen(true)}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue