claude-code-workflow 6.3.4 → 6.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/issue-plan-agent.md +859 -0
- package/.claude/agents/issue-queue-agent.md +702 -0
- package/.claude/commands/issue/execute.md +453 -0
- package/.claude/commands/issue/manage.md +865 -0
- package/.claude/commands/issue/new.md +484 -0
- package/.claude/commands/issue/plan.md +421 -0
- package/.claude/commands/issue/queue.md +354 -0
- package/.claude/commands/{clean.md → workflow/clean.md} +5 -5
- package/.claude/commands/workflow/docs/analyze.md +1467 -0
- package/.claude/commands/workflow/docs/copyright.md +1265 -0
- package/.claude/commands/workflow/execute.md +0 -1
- package/.claude/commands/workflow/tools/conflict-resolution.md +76 -240
- package/.claude/commands/workflow/tools/context-gather.md +0 -2
- package/.claude/commands/workflow/tools/task-generate-agent.md +81 -8
- package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -9
- package/.claude/commands/workflow/tools/test-context-gather.md +2 -3
- package/.claude/commands/workflow/tools/test-task-generate.md +0 -2
- package/.claude/skills/_shared/mermaid-utils.md +584 -0
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -2
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +1 -2
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +1 -8
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +1 -4
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -2
- package/.claude/skills/copyright-docs/SKILL.md +132 -0
- package/.claude/skills/copyright-docs/phases/01-metadata-collection.md +78 -0
- package/.claude/skills/copyright-docs/phases/01.5-project-exploration.md +150 -0
- package/.claude/skills/copyright-docs/phases/02-deep-analysis.md +664 -0
- package/.claude/skills/copyright-docs/phases/02.5-consolidation.md +192 -0
- package/.claude/skills/copyright-docs/phases/04-document-assembly.md +261 -0
- package/.claude/skills/copyright-docs/phases/05-compliance-refinement.md +192 -0
- package/.claude/skills/copyright-docs/specs/cpcc-requirements.md +121 -0
- package/.claude/skills/copyright-docs/templates/agent-base.md +200 -0
- package/.claude/skills/project-analyze/SKILL.md +162 -0
- package/.claude/skills/project-analyze/phases/01-requirements-discovery.md +79 -0
- package/.claude/skills/project-analyze/phases/02-project-exploration.md +176 -0
- package/.claude/skills/project-analyze/phases/03-deep-analysis.md +854 -0
- package/.claude/skills/project-analyze/phases/03.5-consolidation.md +233 -0
- package/.claude/skills/project-analyze/phases/04-report-generation.md +217 -0
- package/.claude/skills/project-analyze/phases/05-iterative-refinement.md +124 -0
- package/.claude/skills/project-analyze/specs/quality-standards.md +115 -0
- package/.claude/skills/project-analyze/specs/writing-style.md +152 -0
- package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +79 -65
- package/.claude/workflows/cli-templates/schemas/issue-task-jsonl-schema.json +136 -0
- package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +74 -0
- package/.claude/workflows/cli-templates/schemas/queue-schema.json +136 -0
- package/.claude/workflows/cli-templates/schemas/registry-schema.json +94 -0
- package/.claude/workflows/cli-templates/schemas/solution-schema.json +120 -0
- package/.claude/workflows/cli-templates/schemas/solutions-jsonl-schema.json +125 -0
- package/.codex/prompts/issue-execute.md +266 -0
- package/README.md +11 -1
- package/ccw/dist/cli.d.ts.map +1 -1
- package/ccw/dist/cli.js +25 -0
- package/ccw/dist/cli.js.map +1 -1
- package/ccw/dist/commands/cli.d.ts.map +1 -1
- package/ccw/dist/commands/cli.js +46 -8
- package/ccw/dist/commands/cli.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts +21 -0
- package/ccw/dist/commands/issue.d.ts.map +1 -0
- package/ccw/dist/commands/issue.js +895 -0
- package/ccw/dist/commands/issue.js.map +1 -0
- package/ccw/dist/core/dashboard-generator-patch.js +1 -0
- package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +2 -2
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/issue-routes.d.ts +34 -0
- package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/issue-routes.js +487 -0
- package/ccw/dist/core/routes/issue-routes.js.map +1 -0
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +17 -2
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts +7 -3
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +31 -17
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/smart-search.d.ts +25 -0
- package/ccw/dist/tools/smart-search.d.ts.map +1 -1
- package/ccw/dist/tools/smart-search.js +121 -17
- package/ccw/dist/tools/smart-search.js.map +1 -1
- package/ccw/src/cli.ts +26 -0
- package/ccw/src/commands/cli.ts +49 -7
- package/ccw/src/commands/issue.ts +1184 -0
- package/ccw/src/core/dashboard-generator-patch.ts +1 -0
- package/ccw/src/core/routes/cli-routes.ts +3 -3
- package/ccw/src/core/routes/issue-routes.ts +559 -0
- package/ccw/src/core/server.ts +17 -2
- package/ccw/src/templates/dashboard-css/32-issue-manager.css +2544 -0
- package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +467 -0
- package/ccw/src/templates/dashboard-js/components/cli-history.js +40 -13
- package/ccw/src/templates/dashboard-js/components/cli-status.js +26 -2
- package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +461 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +8 -0
- package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
- package/ccw/src/templates/dashboard-js/i18n.js +290 -2
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +5 -0
- package/ccw/src/templates/dashboard-js/views/history.js +19 -4
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +11 -5
- package/ccw/src/templates/dashboard-js/views/issue-manager.js +1546 -0
- package/ccw/src/templates/dashboard.html +55 -0
- package/ccw/src/tools/claude-cli-tools.ts +37 -20
- package/ccw/src/tools/smart-search.ts +157 -16
- package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/config.py +5 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/hybrid_search.py +144 -11
- package/codex-lens/src/codexlens/search/ranking.py +267 -1
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/chunker.py +55 -10
- package/package.json +2 -2
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan
|
|
3
|
+
description: Batch plan issue resolution using issue-plan-agent (explore + plan closed-loop)
|
|
4
|
+
argument-hint: "<issue-id>[,<issue-id>,...] [--batch-size 3]"
|
|
5
|
+
allowed-tools: TodoWrite(*), Task(*), SlashCommand(*), AskUserQuestion(*), Bash(*), Read(*), Write(*)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Issue Plan Command (/issue:plan)
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Unified planning command using **issue-plan-agent** that combines exploration and planning into a single closed-loop workflow. The agent handles ACE semantic search, solution generation, and task breakdown.
|
|
13
|
+
|
|
14
|
+
**Core capabilities:**
|
|
15
|
+
- **Closed-loop agent**: issue-plan-agent combines explore + plan
|
|
16
|
+
- Batch processing: 1 agent processes 1-3 issues
|
|
17
|
+
- ACE semantic search integrated into planning
|
|
18
|
+
- Solution with executable tasks and acceptance criteria
|
|
19
|
+
- Automatic solution registration and binding
|
|
20
|
+
|
|
21
|
+
## Storage Structure (Flat JSONL)
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
.workflow/issues/
|
|
25
|
+
├── issues.jsonl # All issues (one per line)
|
|
26
|
+
├── queue.json # Execution queue
|
|
27
|
+
└── solutions/
|
|
28
|
+
├── {issue-id}.jsonl # Solutions for issue (one per line)
|
|
29
|
+
└── ...
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
/issue:plan <issue-id>[,<issue-id>,...] [FLAGS]
|
|
36
|
+
|
|
37
|
+
# Examples
|
|
38
|
+
/issue:plan GH-123 # Single issue
|
|
39
|
+
/issue:plan GH-123,GH-124,GH-125 # Batch (up to 3)
|
|
40
|
+
/issue:plan --all-pending # All pending issues
|
|
41
|
+
|
|
42
|
+
# Flags
|
|
43
|
+
--batch-size <n> Max issues per agent batch (default: 3)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Execution Process
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Phase 1: Issue Loading
|
|
50
|
+
├─ Parse input (single, comma-separated, or --all-pending)
|
|
51
|
+
├─ Load issues from .workflow/issues/issues.jsonl
|
|
52
|
+
├─ Validate issues exist (create if needed)
|
|
53
|
+
└─ Group into batches (max 3 per batch)
|
|
54
|
+
|
|
55
|
+
Phase 2: Unified Explore + Plan (issue-plan-agent)
|
|
56
|
+
├─ Launch issue-plan-agent per batch
|
|
57
|
+
├─ Agent performs:
|
|
58
|
+
│ ├─ ACE semantic search for each issue
|
|
59
|
+
│ ├─ Codebase exploration (files, patterns, dependencies)
|
|
60
|
+
│ ├─ Solution generation with task breakdown
|
|
61
|
+
│ └─ Conflict detection across issues
|
|
62
|
+
└─ Output: solution JSON per issue
|
|
63
|
+
|
|
64
|
+
Phase 3: Solution Registration & Binding
|
|
65
|
+
├─ Append solutions to solutions/{issue-id}.jsonl
|
|
66
|
+
├─ Single solution per issue → auto-bind
|
|
67
|
+
├─ Multiple candidates → AskUserQuestion to select
|
|
68
|
+
└─ Update issues.jsonl with bound_solution_id
|
|
69
|
+
|
|
70
|
+
Phase 4: Summary
|
|
71
|
+
├─ Display bound solutions
|
|
72
|
+
├─ Show task counts per issue
|
|
73
|
+
└─ Display next steps (/issue:queue)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Implementation
|
|
77
|
+
|
|
78
|
+
### Phase 1: Issue Loading
|
|
79
|
+
|
|
80
|
+
```javascript
|
|
81
|
+
// Parse input
|
|
82
|
+
const issueIds = userInput.includes(',')
|
|
83
|
+
? userInput.split(',').map(s => s.trim())
|
|
84
|
+
: [userInput.trim()];
|
|
85
|
+
|
|
86
|
+
// Read issues.jsonl
|
|
87
|
+
const issuesPath = '.workflow/issues/issues.jsonl';
|
|
88
|
+
const allIssues = Bash(`cat "${issuesPath}" 2>/dev/null || echo ''`)
|
|
89
|
+
.split('\n')
|
|
90
|
+
.filter(line => line.trim())
|
|
91
|
+
.map(line => JSON.parse(line));
|
|
92
|
+
|
|
93
|
+
// Load and validate issues
|
|
94
|
+
const issues = [];
|
|
95
|
+
for (const id of issueIds) {
|
|
96
|
+
let issue = allIssues.find(i => i.id === id);
|
|
97
|
+
|
|
98
|
+
if (!issue) {
|
|
99
|
+
console.log(`Issue ${id} not found. Creating...`);
|
|
100
|
+
issue = {
|
|
101
|
+
id,
|
|
102
|
+
title: `Issue ${id}`,
|
|
103
|
+
status: 'registered',
|
|
104
|
+
priority: 3,
|
|
105
|
+
context: '',
|
|
106
|
+
created_at: new Date().toISOString(),
|
|
107
|
+
updated_at: new Date().toISOString()
|
|
108
|
+
};
|
|
109
|
+
// Append to issues.jsonl
|
|
110
|
+
Bash(`echo '${JSON.stringify(issue)}' >> "${issuesPath}"`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
issues.push(issue);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Group into batches
|
|
117
|
+
const batchSize = flags.batchSize || 3;
|
|
118
|
+
const batches = [];
|
|
119
|
+
for (let i = 0; i < issues.length; i += batchSize) {
|
|
120
|
+
batches.push(issues.slice(i, i + batchSize));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
TodoWrite({
|
|
124
|
+
todos: batches.flatMap((batch, i) => [
|
|
125
|
+
{ content: `Plan batch ${i+1}`, status: 'pending', activeForm: `Planning batch ${i+1}` }
|
|
126
|
+
])
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Phase 2: Unified Explore + Plan (issue-plan-agent)
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
for (const [batchIndex, batch] of batches.entries()) {
|
|
134
|
+
updateTodo(`Plan batch ${batchIndex + 1}`, 'in_progress');
|
|
135
|
+
|
|
136
|
+
// Build issue prompt for agent with lifecycle requirements
|
|
137
|
+
const issuePrompt = `
|
|
138
|
+
## Issues to Plan (Closed-Loop Tasks Required)
|
|
139
|
+
|
|
140
|
+
${batch.map((issue, i) => `
|
|
141
|
+
### Issue ${i + 1}: ${issue.id}
|
|
142
|
+
**Title**: ${issue.title}
|
|
143
|
+
**Context**: ${issue.context || 'No context provided'}
|
|
144
|
+
**Affected Components**: ${issue.affected_components?.join(', ') || 'Not specified'}
|
|
145
|
+
|
|
146
|
+
**Lifecycle Requirements**:
|
|
147
|
+
- Test Strategy: ${issue.lifecycle_requirements?.test_strategy || 'auto'}
|
|
148
|
+
- Regression Scope: ${issue.lifecycle_requirements?.regression_scope || 'affected'}
|
|
149
|
+
- Commit Strategy: ${issue.lifecycle_requirements?.commit_strategy || 'per-task'}
|
|
150
|
+
`).join('\n')}
|
|
151
|
+
|
|
152
|
+
## Project Root
|
|
153
|
+
${process.cwd()}
|
|
154
|
+
|
|
155
|
+
## Requirements - CLOSED-LOOP TASKS
|
|
156
|
+
|
|
157
|
+
Each task MUST include ALL lifecycle phases:
|
|
158
|
+
|
|
159
|
+
### 1. Implementation
|
|
160
|
+
- implementation: string[] (2-7 concrete steps)
|
|
161
|
+
- modification_points: { file, target, change }[]
|
|
162
|
+
|
|
163
|
+
### 2. Test
|
|
164
|
+
- test.unit: string[] (unit test requirements)
|
|
165
|
+
- test.integration: string[] (integration test requirements if needed)
|
|
166
|
+
- test.commands: string[] (actual test commands to run)
|
|
167
|
+
- test.coverage_target: number (minimum coverage %)
|
|
168
|
+
|
|
169
|
+
### 3. Regression
|
|
170
|
+
- regression: string[] (commands to run for regression check)
|
|
171
|
+
- Based on issue's regression_scope setting
|
|
172
|
+
|
|
173
|
+
### 4. Acceptance
|
|
174
|
+
- acceptance.criteria: string[] (testable acceptance criteria)
|
|
175
|
+
- acceptance.verification: string[] (how to verify each criterion)
|
|
176
|
+
- acceptance.manual_checks: string[] (manual checks if needed)
|
|
177
|
+
|
|
178
|
+
### 5. Commit
|
|
179
|
+
- commit.type: feat|fix|refactor|test|docs|chore
|
|
180
|
+
- commit.scope: string (module name)
|
|
181
|
+
- commit.message_template: string (full commit message)
|
|
182
|
+
- commit.breaking: boolean
|
|
183
|
+
|
|
184
|
+
## Additional Requirements
|
|
185
|
+
1. Use ACE semantic search (mcp__ace-tool__search_context) for exploration
|
|
186
|
+
2. Detect file conflicts if multiple issues
|
|
187
|
+
3. Generate executable test commands based on project's test framework
|
|
188
|
+
4. Infer commit scope from affected files
|
|
189
|
+
`;
|
|
190
|
+
|
|
191
|
+
// Launch issue-plan-agent (combines explore + plan)
|
|
192
|
+
const result = Task(
|
|
193
|
+
subagent_type="issue-plan-agent",
|
|
194
|
+
run_in_background=false,
|
|
195
|
+
description=`Explore & plan ${batch.length} issues`,
|
|
196
|
+
prompt=issuePrompt
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
// Parse agent output
|
|
200
|
+
const agentOutput = JSON.parse(result);
|
|
201
|
+
|
|
202
|
+
// Register solutions for each issue (append to solutions/{issue-id}.jsonl)
|
|
203
|
+
for (const item of agentOutput.solutions) {
|
|
204
|
+
const solutionPath = `.workflow/issues/solutions/${item.issue_id}.jsonl`;
|
|
205
|
+
|
|
206
|
+
// Ensure solutions directory exists
|
|
207
|
+
Bash(`mkdir -p .workflow/issues/solutions`);
|
|
208
|
+
|
|
209
|
+
// Append solution as new line
|
|
210
|
+
Bash(`echo '${JSON.stringify(item.solution)}' >> "${solutionPath}"`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Handle conflicts if any
|
|
214
|
+
if (agentOutput.conflicts?.length > 0) {
|
|
215
|
+
console.log(`\n⚠ File conflicts detected:`);
|
|
216
|
+
agentOutput.conflicts.forEach(c => {
|
|
217
|
+
console.log(` ${c.file}: ${c.issues.join(', ')} → suggested: ${c.suggested_order.join(' → ')}`);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
updateTodo(`Plan batch ${batchIndex + 1}`, 'completed');
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Phase 3: Solution Binding
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
// Re-read issues.jsonl
|
|
229
|
+
let allIssuesUpdated = Bash(`cat "${issuesPath}"`)
|
|
230
|
+
.split('\n')
|
|
231
|
+
.filter(line => line.trim())
|
|
232
|
+
.map(line => JSON.parse(line));
|
|
233
|
+
|
|
234
|
+
for (const issue of issues) {
|
|
235
|
+
const solPath = `.workflow/issues/solutions/${issue.id}.jsonl`;
|
|
236
|
+
const solutions = Bash(`cat "${solPath}" 2>/dev/null || echo ''`)
|
|
237
|
+
.split('\n')
|
|
238
|
+
.filter(line => line.trim())
|
|
239
|
+
.map(line => JSON.parse(line));
|
|
240
|
+
|
|
241
|
+
if (solutions.length === 0) {
|
|
242
|
+
console.log(`⚠ No solutions for ${issue.id}`);
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
let selectedSolId;
|
|
247
|
+
|
|
248
|
+
if (solutions.length === 1) {
|
|
249
|
+
// Auto-bind single solution
|
|
250
|
+
selectedSolId = solutions[0].id;
|
|
251
|
+
console.log(`✓ Auto-bound ${selectedSolId} to ${issue.id} (${solutions[0].tasks?.length || 0} tasks)`);
|
|
252
|
+
} else {
|
|
253
|
+
// Multiple solutions - ask user
|
|
254
|
+
const answer = AskUserQuestion({
|
|
255
|
+
questions: [{
|
|
256
|
+
question: `Select solution for ${issue.id}:`,
|
|
257
|
+
header: issue.id,
|
|
258
|
+
multiSelect: false,
|
|
259
|
+
options: solutions.map(s => ({
|
|
260
|
+
label: `${s.id}: ${s.description || 'Solution'}`,
|
|
261
|
+
description: `${s.tasks?.length || 0} tasks`
|
|
262
|
+
}))
|
|
263
|
+
}]
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
selectedSolId = extractSelectedSolutionId(answer);
|
|
267
|
+
console.log(`✓ Bound ${selectedSolId} to ${issue.id}`);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Update issue in allIssuesUpdated
|
|
271
|
+
const issueIndex = allIssuesUpdated.findIndex(i => i.id === issue.id);
|
|
272
|
+
if (issueIndex !== -1) {
|
|
273
|
+
allIssuesUpdated[issueIndex].bound_solution_id = selectedSolId;
|
|
274
|
+
allIssuesUpdated[issueIndex].status = 'planned';
|
|
275
|
+
allIssuesUpdated[issueIndex].planned_at = new Date().toISOString();
|
|
276
|
+
allIssuesUpdated[issueIndex].updated_at = new Date().toISOString();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Mark solution as bound in solutions file
|
|
280
|
+
const updatedSolutions = solutions.map(s => ({
|
|
281
|
+
...s,
|
|
282
|
+
is_bound: s.id === selectedSolId,
|
|
283
|
+
bound_at: s.id === selectedSolId ? new Date().toISOString() : s.bound_at
|
|
284
|
+
}));
|
|
285
|
+
Write(solPath, updatedSolutions.map(s => JSON.stringify(s)).join('\n'));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Write updated issues.jsonl
|
|
289
|
+
Write(issuesPath, allIssuesUpdated.map(i => JSON.stringify(i)).join('\n'));
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Phase 4: Summary
|
|
293
|
+
|
|
294
|
+
```javascript
|
|
295
|
+
console.log(`
|
|
296
|
+
## Planning Complete
|
|
297
|
+
|
|
298
|
+
**Issues Planned**: ${issues.length}
|
|
299
|
+
|
|
300
|
+
### Bound Solutions
|
|
301
|
+
${issues.map(i => {
|
|
302
|
+
const issue = allIssuesUpdated.find(a => a.id === i.id);
|
|
303
|
+
return issue?.bound_solution_id
|
|
304
|
+
? `✓ ${i.id}: ${issue.bound_solution_id}`
|
|
305
|
+
: `○ ${i.id}: No solution bound`;
|
|
306
|
+
}).join('\n')}
|
|
307
|
+
|
|
308
|
+
### Next Steps
|
|
309
|
+
1. Review: \`ccw issue status <issue-id>\`
|
|
310
|
+
2. Form queue: \`/issue:queue\`
|
|
311
|
+
3. Execute: \`/issue:execute\`
|
|
312
|
+
`);
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Solution Format (Closed-Loop Tasks)
|
|
316
|
+
|
|
317
|
+
Each solution line in `solutions/{issue-id}.jsonl`:
|
|
318
|
+
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"id": "SOL-20251226-001",
|
|
322
|
+
"description": "Direct Implementation",
|
|
323
|
+
"tasks": [
|
|
324
|
+
{
|
|
325
|
+
"id": "T1",
|
|
326
|
+
"title": "Create auth middleware",
|
|
327
|
+
"scope": "src/middleware/",
|
|
328
|
+
"action": "Create",
|
|
329
|
+
"description": "Create JWT validation middleware",
|
|
330
|
+
"modification_points": [
|
|
331
|
+
{ "file": "src/middleware/auth.ts", "target": "new file", "change": "Create middleware" }
|
|
332
|
+
],
|
|
333
|
+
|
|
334
|
+
"implementation": [
|
|
335
|
+
"Create auth.ts file in src/middleware/",
|
|
336
|
+
"Implement JWT token validation using jsonwebtoken",
|
|
337
|
+
"Add error handling for invalid/expired tokens",
|
|
338
|
+
"Export middleware function"
|
|
339
|
+
],
|
|
340
|
+
|
|
341
|
+
"test": {
|
|
342
|
+
"unit": [
|
|
343
|
+
"Test valid token passes through",
|
|
344
|
+
"Test invalid token returns 401",
|
|
345
|
+
"Test expired token returns 401",
|
|
346
|
+
"Test missing token returns 401"
|
|
347
|
+
],
|
|
348
|
+
"commands": [
|
|
349
|
+
"npm test -- --grep 'auth middleware'",
|
|
350
|
+
"npm run test:coverage -- src/middleware/auth.ts"
|
|
351
|
+
],
|
|
352
|
+
"coverage_target": 80
|
|
353
|
+
},
|
|
354
|
+
|
|
355
|
+
"regression": [
|
|
356
|
+
"npm test -- --grep 'protected routes'",
|
|
357
|
+
"npm run test:integration -- auth"
|
|
358
|
+
],
|
|
359
|
+
|
|
360
|
+
"acceptance": {
|
|
361
|
+
"criteria": [
|
|
362
|
+
"Middleware validates JWT tokens successfully",
|
|
363
|
+
"Returns 401 for invalid or missing tokens",
|
|
364
|
+
"Passes decoded token to request context"
|
|
365
|
+
],
|
|
366
|
+
"verification": [
|
|
367
|
+
"curl -H 'Authorization: Bearer valid_token' /api/protected → 200",
|
|
368
|
+
"curl /api/protected → 401",
|
|
369
|
+
"curl -H 'Authorization: Bearer invalid' /api/protected → 401"
|
|
370
|
+
]
|
|
371
|
+
},
|
|
372
|
+
|
|
373
|
+
"commit": {
|
|
374
|
+
"type": "feat",
|
|
375
|
+
"scope": "auth",
|
|
376
|
+
"message_template": "feat(auth): add JWT validation middleware\n\n- Implement token validation\n- Add error handling for invalid tokens\n- Export for route protection",
|
|
377
|
+
"breaking": false
|
|
378
|
+
},
|
|
379
|
+
|
|
380
|
+
"depends_on": [],
|
|
381
|
+
"estimated_minutes": 30,
|
|
382
|
+
"executor": "codex"
|
|
383
|
+
}
|
|
384
|
+
],
|
|
385
|
+
"exploration_context": {
|
|
386
|
+
"relevant_files": ["src/config/auth.ts"],
|
|
387
|
+
"patterns": "Follow existing middleware pattern"
|
|
388
|
+
},
|
|
389
|
+
"is_bound": true,
|
|
390
|
+
"created_at": "2025-12-26T10:00:00Z",
|
|
391
|
+
"bound_at": "2025-12-26T10:05:00Z"
|
|
392
|
+
}
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Error Handling
|
|
396
|
+
|
|
397
|
+
| Error | Resolution |
|
|
398
|
+
|-------|------------|
|
|
399
|
+
| Issue not found | Auto-create in issues.jsonl |
|
|
400
|
+
| ACE search fails | Agent falls back to ripgrep |
|
|
401
|
+
| No solutions generated | Display error, suggest manual planning |
|
|
402
|
+
| User cancels selection | Skip issue, continue with others |
|
|
403
|
+
| File conflicts | Agent detects and suggests resolution order |
|
|
404
|
+
|
|
405
|
+
## Agent Integration
|
|
406
|
+
|
|
407
|
+
The command uses `issue-plan-agent` which:
|
|
408
|
+
1. Performs ACE semantic search per issue
|
|
409
|
+
2. Identifies modification points and patterns
|
|
410
|
+
3. Generates task breakdown with dependencies
|
|
411
|
+
4. Detects cross-issue file conflicts
|
|
412
|
+
5. Outputs solution JSON for registration
|
|
413
|
+
|
|
414
|
+
See `.claude/agents/issue-plan-agent.md` for agent specification.
|
|
415
|
+
|
|
416
|
+
## Related Commands
|
|
417
|
+
|
|
418
|
+
- `/issue:queue` - Form execution queue from bound solutions
|
|
419
|
+
- `/issue:execute` - Execute queue with codex
|
|
420
|
+
- `ccw issue list` - List all issues
|
|
421
|
+
- `ccw issue status` - View issue and solution details
|