From a33cacfd75c4ac71297f7e2b1bdb9a24de6e5933 Mon Sep 17 00:00:00 2001 From: catlog22 Date: Sun, 28 Dec 2025 20:14:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E4=BB=A5=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=88=E7=8A=B6=E6=80=81=E3=80=81=E4=BC=98?= =?UTF-8?q?=E5=85=88=E7=BA=A7=E3=80=81=E6=A0=87=E9=A2=98=E7=AD=89=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/commands/issue/queue.md | 3 +- ccw/src/commands/issue.ts | 67 +++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/.claude/commands/issue/queue.md b/.claude/commands/issue/queue.md index 5cbf9b4b..f7cbf96f 100644 --- a/.claude/commands/issue/queue.md +++ b/.claude/commands/issue/queue.md @@ -338,7 +338,8 @@ console.log(` Next: \`/issue:execute\` `); -// Update issue statuses via CLI +// Update issue statuses via CLI (use `update` for pure field changes) +// Note: `queue add` has its own logic; here we only need status update for (const issueId of summary.issues_queued) { Bash(`ccw issue update ${issueId} --status queued`); } diff --git a/ccw/src/commands/issue.ts b/ccw/src/commands/issue.ts index d773563c..c5fd6cc5 100644 --- a/ccw/src/commands/issue.ts +++ b/ccw/src/commands/issue.ts @@ -686,6 +686,69 @@ async function taskAction(issueId: string | undefined, taskId: string | undefine } } +/** + * update - Update issue fields (status, priority, title, etc.) + */ +async function updateAction(issueId: string | undefined, options: IssueOptions): Promise { + if (!issueId) { + console.error(chalk.red('Issue ID is required')); + console.error(chalk.gray('Usage: ccw issue update --status [--priority ] [--title "..."]')); + process.exit(1); + } + + const issue = findIssue(issueId); + if (!issue) { + console.error(chalk.red(`Issue "${issueId}" not found`)); + process.exit(1); + } + + const updates: Partial = {}; + + if (options.status) { + const validStatuses = ['registered', 'planning', 'planned', 'queued', 'executing', 'completed', 'failed', 'paused']; + if (!validStatuses.includes(options.status)) { + console.error(chalk.red(`Invalid status: ${options.status}`)); + console.error(chalk.gray(`Valid: ${validStatuses.join(', ')}`)); + process.exit(1); + } + updates.status = options.status as Issue['status']; + + // Auto-set timestamps based on status + if (options.status === 'planned') updates.planned_at = new Date().toISOString(); + if (options.status === 'queued') updates.queued_at = new Date().toISOString(); + if (options.status === 'completed') updates.completed_at = new Date().toISOString(); + } + + if (options.priority) { + updates.priority = parseInt(options.priority); + } + + if (options.title) { + updates.title = options.title; + } + + if (options.description) { + updates.context = options.description; + } + + if (Object.keys(updates).length === 0) { + console.error(chalk.yellow('No updates specified')); + console.error(chalk.gray('Use --status, --priority, --title, or --description')); + return; + } + + updateIssue(issueId, updates); + + if (options.json) { + console.log(JSON.stringify({ success: true, issue_id: issueId, updates })); + } else { + console.log(chalk.green(`✓ Issue "${issueId}" updated`)); + Object.entries(updates).forEach(([k, v]) => { + console.log(chalk.gray(` ${k}: ${v}`)); + }); + } +} + /** * bind - Register and/or bind a solution */ @@ -1453,6 +1516,9 @@ export async function issueCommand( case 'bind': await bindAction(argsArray[0], argsArray[1], options); break; + case 'update': + await updateAction(argsArray[0], options); + break; case 'queue': await queueAction(argsArray[0], argsArray[1], options); break; @@ -1487,6 +1553,7 @@ export async function issueCommand( console.log(chalk.gray(' status [issue-id] Show detailed status')); console.log(chalk.gray(' task [task-id] Add or update task')); console.log(chalk.gray(' bind [sol-id] Bind solution (--solution to register)')); + console.log(chalk.gray(' update Update issue (--status, --priority, --title)')); console.log(); console.log(chalk.bold('Queue Commands:')); console.log(chalk.gray(' queue Show active queue'));