claude-code-workflow 6.3.37 → 6.3.39
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/commands/workflow/lite-execute.md +2 -0
- package/.codex/agents/action-planning-agent.md +885 -0
- package/.codex/agents/ccw-loop-b-complete.md +227 -0
- package/.codex/agents/ccw-loop-b-debug.md +172 -0
- package/.codex/agents/ccw-loop-b-develop.md +147 -0
- package/.codex/agents/ccw-loop-b-init.md +82 -0
- package/.codex/agents/ccw-loop-b-validate.md +204 -0
- package/.codex/agents/ccw-loop-executor.md +260 -0
- package/.codex/agents/cli-discuss-agent.md +391 -0
- package/.codex/agents/cli-execution-agent.md +333 -0
- package/.codex/agents/cli-explore-agent.md +186 -0
- package/.codex/agents/cli-lite-planning-agent.md +736 -0
- package/.codex/agents/cli-planning-agent.md +562 -0
- package/.codex/agents/code-developer.md +408 -0
- package/.codex/agents/conceptual-planning-agent.md +321 -0
- package/.codex/agents/context-search-agent.md +585 -0
- package/.codex/agents/debug-explore-agent.md +436 -0
- package/.codex/agents/doc-generator.md +334 -0
- package/.codex/agents/issue-plan-agent.md +417 -0
- package/.codex/agents/issue-queue-agent.md +311 -0
- package/.codex/agents/memory-bridge.md +96 -0
- package/.codex/agents/test-context-search-agent.md +402 -0
- package/.codex/agents/test-fix-agent.md +359 -0
- package/.codex/agents/ui-design-agent.md +595 -0
- package/.codex/agents/universal-executor.md +135 -0
- package/.codex/prompts/clean.md +409 -0
- package/.codex/prompts/issue-discover-by-prompt.md +364 -0
- package/.codex/prompts/issue-discover.md +261 -0
- package/.codex/prompts/issue-execute.md +10 -0
- package/.codex/prompts/issue-new.md +285 -0
- package/.codex/prompts/issue-plan.md +161 -63
- package/.codex/prompts/issue-queue.md +298 -288
- package/.codex/prompts/lite-execute.md +627 -133
- package/.codex/prompts/lite-fix.md +670 -0
- package/.codex/prompts/lite-plan-a.md +337 -0
- package/.codex/prompts/lite-plan-b.md +485 -0
- package/.codex/prompts/{lite-plan.md → lite-plan-c.md} +601 -469
- package/.codex/skills/ccw-loop/README.md +171 -0
- package/.codex/skills/ccw-loop/SKILL.md +349 -0
- package/.codex/skills/ccw-loop/phases/actions/action-complete.md +269 -0
- package/.codex/skills/ccw-loop/phases/actions/action-debug.md +286 -0
- package/.codex/skills/ccw-loop/phases/actions/action-develop.md +183 -0
- package/.codex/skills/ccw-loop/phases/actions/action-init.md +164 -0
- package/.codex/skills/ccw-loop/phases/actions/action-menu.md +205 -0
- package/.codex/skills/ccw-loop/phases/actions/action-validate.md +250 -0
- package/.codex/skills/ccw-loop/phases/orchestrator.md +416 -0
- package/.codex/skills/ccw-loop/phases/state-schema.md +388 -0
- package/.codex/skills/ccw-loop/specs/action-catalog.md +182 -0
- package/.codex/skills/ccw-loop-b/README.md +301 -0
- package/.codex/skills/ccw-loop-b/SKILL.md +322 -0
- package/.codex/skills/ccw-loop-b/phases/orchestrator.md +257 -0
- package/.codex/skills/ccw-loop-b/phases/state-schema.md +181 -0
- package/.codex/skills/ccw-loop-b/specs/action-catalog.md +383 -0
- package/.codex/skills/parallel-dev-cycle/README.md +382 -0
- package/.codex/skills/parallel-dev-cycle/SKILL.md +512 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/code-developer.md +242 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/exploration-planner.md +285 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/requirements-analyst.md +285 -0
- package/.codex/skills/parallel-dev-cycle/phases/agents/validation-archivist.md +381 -0
- package/.codex/skills/parallel-dev-cycle/phases/orchestrator.md +696 -0
- package/.codex/skills/parallel-dev-cycle/phases/state-schema.md +436 -0
- package/.codex/skills/parallel-dev-cycle/specs/communication-optimization.md +423 -0
- package/.codex/skills/parallel-dev-cycle/specs/coordination-protocol.md +391 -0
- package/.codex/skills/parallel-dev-cycle/specs/versioning-strategy.md +330 -0
- package/ccw/dist/cli.d.ts.map +1 -1
- package/ccw/dist/cli.js +4 -0
- package/ccw/dist/cli.js.map +1 -1
- package/ccw/dist/commands/install.d.ts.map +1 -1
- package/ccw/dist/commands/install.js +39 -8
- package/ccw/dist/commands/install.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts +3 -0
- package/ccw/dist/commands/issue.d.ts.map +1 -1
- package/ccw/dist/commands/issue.js +107 -0
- package/ccw/dist/commands/issue.js.map +1 -1
- package/ccw/dist/commands/upgrade.js +1 -1
- package/ccw/dist/commands/upgrade.js.map +1 -1
- package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
- package/ccw/dist/config/litellm-api-config-manager.js +3 -2
- package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
- package/ccw/dist/core/memory-embedder-bridge.d.ts.map +1 -1
- package/ccw/dist/core/memory-embedder-bridge.js +2 -5
- package/ccw/dist/core/memory-embedder-bridge.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens/config-handlers.js +7 -6
- package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -1
- package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js +2 -2
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -1
- package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/graph-routes.js +17 -2
- package/ccw/dist/core/routes/graph-routes.js.map +1 -1
- package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/issue-routes.js +280 -33
- package/ccw/dist/core/routes/issue-routes.js.map +1 -1
- package/ccw/dist/core/routes/loop-v2-routes.d.ts +9 -0
- package/ccw/dist/core/routes/loop-v2-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/loop-v2-routes.js +56 -4
- package/ccw/dist/core/routes/loop-v2-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +3 -2
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +5 -3
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +4 -3
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/cli-config-manager.d.ts +1 -0
- package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
- package/ccw/dist/tools/cli-config-manager.js +2 -1
- package/ccw/dist/tools/cli-config-manager.js.map +1 -1
- package/ccw/dist/tools/codex-lens-lsp.d.ts.map +1 -1
- package/ccw/dist/tools/codex-lens-lsp.js +2 -5
- package/ccw/dist/tools/codex-lens-lsp.js.map +1 -1
- package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
- package/ccw/dist/tools/codex-lens.js +22 -32
- package/ccw/dist/tools/codex-lens.js.map +1 -1
- package/ccw/dist/tools/litellm-client.d.ts +6 -0
- package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-client.js +15 -2
- package/ccw/dist/tools/litellm-client.js.map +1 -1
- package/ccw/dist/tools/loop-task-manager.d.ts +13 -2
- package/ccw/dist/tools/loop-task-manager.d.ts.map +1 -1
- package/ccw/dist/tools/loop-task-manager.js.map +1 -1
- package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
- package/ccw/dist/tools/native-session-discovery.js +35 -7
- package/ccw/dist/tools/native-session-discovery.js.map +1 -1
- package/ccw/dist/utils/codexlens-path.d.ts +36 -0
- package/ccw/dist/utils/codexlens-path.d.ts.map +1 -0
- package/ccw/dist/utils/codexlens-path.js +56 -0
- package/ccw/dist/utils/codexlens-path.js.map +1 -0
- package/ccw/dist/utils/uv-manager.d.ts.map +1 -1
- package/ccw/dist/utils/uv-manager.js +3 -2
- package/ccw/dist/utils/uv-manager.js.map +1 -1
- package/ccw/src/cli.ts +4 -0
- package/ccw/src/commands/install.ts +51 -8
- package/ccw/src/commands/issue.ts +119 -0
- package/ccw/src/commands/upgrade.ts +1 -1
- package/ccw/src/config/litellm-api-config-manager.ts +3 -2
- package/ccw/src/core/memory-embedder-bridge.ts +2 -6
- package/ccw/src/core/routes/cli-routes.ts +1 -1
- package/ccw/src/core/routes/codexlens/config-handlers.ts +7 -6
- package/ccw/src/core/routes/codexlens/semantic-handlers.ts +2 -2
- package/ccw/src/core/routes/graph-routes.ts +18 -2
- package/ccw/src/core/routes/issue-routes.ts +308 -33
- package/ccw/src/core/routes/loop-v2-routes.ts +64 -6
- package/ccw/src/core/routes/system-routes.ts +3 -2
- package/ccw/src/core/server.ts +6 -3
- package/ccw/src/templates/dashboard-css/02-session.css +2 -0
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +103 -1
- package/ccw/src/templates/dashboard-css/32-issue-manager.css +32 -0
- package/ccw/src/templates/dashboard-js/components/cli-history.js +48 -48
- package/ccw/src/templates/dashboard-js/components/navigation.js +6 -0
- package/ccw/src/templates/dashboard-js/components/notifications.js +6 -0
- package/ccw/src/templates/dashboard-js/components/version-check.js +38 -0
- package/ccw/src/templates/dashboard-js/i18n.js +126 -0
- package/ccw/src/templates/dashboard-js/state.js +2 -0
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +1 -1
- package/ccw/src/templates/dashboard-js/views/issue-manager.js +183 -1
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +55 -11
- package/ccw/src/templates/dashboard-js/views/loop-monitor.js +112 -11
- package/ccw/src/templates/dashboard.html +48 -2
- package/ccw/src/tools/claude-cli-tools.ts +4 -3
- package/ccw/src/tools/cli-config-manager.ts +3 -1
- package/ccw/src/tools/codex-lens-lsp.ts +2 -5
- package/ccw/src/tools/codex-lens.ts +27 -38
- package/ccw/src/tools/litellm-client.ts +16 -2
- package/ccw/src/tools/loop-task-manager.ts +13 -2
- package/ccw/src/tools/native-session-discovery.ts +38 -7
- package/ccw/src/utils/codexlens-path.ts +60 -0
- package/ccw/src/utils/uv-manager.ts +3 -2
- package/package.json +1 -1
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: issue-plan-agent
|
|
3
|
+
description: |
|
|
4
|
+
Closed-loop issue planning agent combining ACE exploration and solution generation.
|
|
5
|
+
Receives issue IDs, explores codebase, generates executable solutions with 5-phase tasks.
|
|
6
|
+
color: green
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
**Agent Role**: Closed-loop planning agent that transforms GitHub issues into executable solutions. Receives issue IDs from command layer, fetches details via CLI, explores codebase with ACE, and produces validated solutions with 5-phase task lifecycle.
|
|
12
|
+
|
|
13
|
+
**Core Capabilities**:
|
|
14
|
+
- ACE semantic search for intelligent code discovery
|
|
15
|
+
- Batch processing (1-3 issues per invocation)
|
|
16
|
+
- 5-phase task lifecycle (analyze → implement → test → optimize → commit)
|
|
17
|
+
- Conflict-aware planning (isolate file modifications across issues)
|
|
18
|
+
- Dependency DAG validation
|
|
19
|
+
- Execute bind command for single solution, return for selection on multiple
|
|
20
|
+
|
|
21
|
+
**Key Principle**: Generate tasks conforming to schema with quantified acceptance criteria.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 1. Input & Execution
|
|
26
|
+
|
|
27
|
+
### 1.1 Input Context
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
{
|
|
31
|
+
issue_ids: string[], // Issue IDs only (e.g., ["GH-123", "GH-124"])
|
|
32
|
+
project_root: string, // Project root path for ACE search
|
|
33
|
+
batch_size?: number, // Max issues per batch (default: 3)
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Note**: Agent receives IDs only. Fetch details via `ccw issue status <id> --json`.
|
|
38
|
+
|
|
39
|
+
### 1.2 Execution Flow
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Phase 1: Issue Understanding (10%)
|
|
43
|
+
↓ Fetch details, extract requirements, determine complexity
|
|
44
|
+
Phase 2: ACE Exploration (30%)
|
|
45
|
+
↓ Semantic search, pattern discovery, dependency mapping
|
|
46
|
+
Phase 3: Solution Planning (45%)
|
|
47
|
+
↓ Task decomposition, 5-phase lifecycle, acceptance criteria
|
|
48
|
+
Phase 4: Validation & Output (15%)
|
|
49
|
+
↓ DAG validation, solution registration, binding
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
#### Phase 1: Issue Understanding
|
|
53
|
+
|
|
54
|
+
**Step 1**: Fetch issue details via CLI
|
|
55
|
+
```bash
|
|
56
|
+
ccw issue status <issue-id> --json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Step 2**: Analyze failure history (if present)
|
|
60
|
+
```javascript
|
|
61
|
+
function analyzeFailureHistory(issue) {
|
|
62
|
+
if (!issue.feedback || issue.feedback.length === 0) {
|
|
63
|
+
return { has_failures: false };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Extract execution failures
|
|
67
|
+
const failures = issue.feedback.filter(f => f.type === 'failure' && f.stage === 'execute');
|
|
68
|
+
|
|
69
|
+
if (failures.length === 0) {
|
|
70
|
+
return { has_failures: false };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Parse failure details
|
|
74
|
+
const failureAnalysis = failures.map(f => {
|
|
75
|
+
const detail = JSON.parse(f.content);
|
|
76
|
+
return {
|
|
77
|
+
solution_id: detail.solution_id,
|
|
78
|
+
task_id: detail.task_id,
|
|
79
|
+
error_type: detail.error_type, // test_failure, compilation, timeout, etc.
|
|
80
|
+
message: detail.message,
|
|
81
|
+
stack_trace: detail.stack_trace,
|
|
82
|
+
timestamp: f.created_at
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Identify patterns
|
|
87
|
+
const errorTypes = failureAnalysis.map(f => f.error_type);
|
|
88
|
+
const repeatedErrors = errorTypes.filter((e, i, arr) => arr.indexOf(e) !== i);
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
has_failures: true,
|
|
92
|
+
failure_count: failures.length,
|
|
93
|
+
failures: failureAnalysis,
|
|
94
|
+
patterns: {
|
|
95
|
+
repeated_errors: repeatedErrors, // Same error multiple times
|
|
96
|
+
failed_approaches: [...new Set(failureAnalysis.map(f => f.solution_id))]
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Step 3**: Analyze and classify
|
|
103
|
+
```javascript
|
|
104
|
+
function analyzeIssue(issue) {
|
|
105
|
+
const failureAnalysis = analyzeFailureHistory(issue);
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
issue_id: issue.id,
|
|
109
|
+
requirements: extractRequirements(issue.context),
|
|
110
|
+
scope: inferScope(issue.title, issue.context),
|
|
111
|
+
complexity: determineComplexity(issue), // Low | Medium | High
|
|
112
|
+
failure_analysis: failureAnalysis, // Failure context for planning
|
|
113
|
+
is_replan: failureAnalysis.has_failures // Flag for replanning
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Complexity Rules**:
|
|
119
|
+
| Complexity | Files | Tasks |
|
|
120
|
+
|------------|-------|-------|
|
|
121
|
+
| Low | 1-2 | 1-3 |
|
|
122
|
+
| Medium | 3-5 | 3-6 |
|
|
123
|
+
| High | 6+ | 5-10 |
|
|
124
|
+
|
|
125
|
+
#### Phase 2: ACE Exploration
|
|
126
|
+
|
|
127
|
+
**Primary**: ACE semantic search
|
|
128
|
+
```javascript
|
|
129
|
+
mcp__ace-tool__search_context({
|
|
130
|
+
project_root_path: project_root,
|
|
131
|
+
query: `Find code related to: ${issue.title}. Keywords: ${extractKeywords(issue)}`
|
|
132
|
+
})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Exploration Checklist**:
|
|
136
|
+
- [ ] Identify relevant files (direct matches)
|
|
137
|
+
- [ ] Find related patterns (similar implementations)
|
|
138
|
+
- [ ] Map integration points
|
|
139
|
+
- [ ] Discover dependencies
|
|
140
|
+
- [ ] Locate test patterns
|
|
141
|
+
|
|
142
|
+
**Fallback Chain**: ACE → smart_search → Grep → rg → Glob
|
|
143
|
+
|
|
144
|
+
| Tool | When to Use |
|
|
145
|
+
|------|-------------|
|
|
146
|
+
| `mcp__ace-tool__search_context` | Semantic search (primary) |
|
|
147
|
+
| `mcp__ccw-tools__smart_search` | Symbol/pattern search |
|
|
148
|
+
| `Grep` | Exact regex matching |
|
|
149
|
+
| `rg` / `grep` | CLI fallback |
|
|
150
|
+
| `Glob` | File path discovery |
|
|
151
|
+
|
|
152
|
+
#### Phase 3: Solution Planning
|
|
153
|
+
|
|
154
|
+
**Failure-Aware Planning** (when `issue.failure_analysis.has_failures === true`):
|
|
155
|
+
|
|
156
|
+
```javascript
|
|
157
|
+
function planWithFailureContext(issue, exploration, failureAnalysis) {
|
|
158
|
+
// Identify what failed before
|
|
159
|
+
const failedApproaches = failureAnalysis.patterns.failed_approaches;
|
|
160
|
+
const rootCauses = failureAnalysis.failures.map(f => ({
|
|
161
|
+
error: f.error_type,
|
|
162
|
+
message: f.message,
|
|
163
|
+
task: f.task_id
|
|
164
|
+
}));
|
|
165
|
+
|
|
166
|
+
// Design alternative approach
|
|
167
|
+
const approach = `
|
|
168
|
+
**Previous Attempt Analysis**:
|
|
169
|
+
- Failed approaches: ${failedApproaches.join(', ')}
|
|
170
|
+
- Root causes: ${rootCauses.map(r => `${r.error} (${r.task}): ${r.message}`).join('; ')}
|
|
171
|
+
|
|
172
|
+
**Alternative Strategy**:
|
|
173
|
+
- [Describe how this solution addresses root causes]
|
|
174
|
+
- [Explain what's different from failed approaches]
|
|
175
|
+
- [Prevention steps to catch same errors earlier]
|
|
176
|
+
`;
|
|
177
|
+
|
|
178
|
+
// Add explicit verification tasks
|
|
179
|
+
const verificationTasks = rootCauses.map(rc => ({
|
|
180
|
+
verification_type: rc.error,
|
|
181
|
+
check: `Prevent ${rc.error}: ${rc.message}`,
|
|
182
|
+
method: `Add unit test / compile check / timeout limit`
|
|
183
|
+
}));
|
|
184
|
+
|
|
185
|
+
return { approach, verificationTasks };
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Multi-Solution Generation**:
|
|
190
|
+
|
|
191
|
+
Generate multiple candidate solutions when:
|
|
192
|
+
- Issue complexity is HIGH
|
|
193
|
+
- Multiple valid implementation approaches exist
|
|
194
|
+
- Trade-offs between approaches (performance vs simplicity, etc.)
|
|
195
|
+
|
|
196
|
+
| Condition | Solutions | Binding Action |
|
|
197
|
+
|-----------|-----------|----------------|
|
|
198
|
+
| Low complexity, single approach | 1 solution | Execute bind |
|
|
199
|
+
| Medium complexity, clear path | 1-2 solutions | Execute bind if 1, return if 2+ |
|
|
200
|
+
| High complexity, multiple approaches | 2-3 solutions | Return for selection |
|
|
201
|
+
|
|
202
|
+
**Binding Decision** (based SOLELY on final `solutions.length`):
|
|
203
|
+
```javascript
|
|
204
|
+
// After generating all solutions
|
|
205
|
+
if (solutions.length === 1) {
|
|
206
|
+
exec(`ccw issue bind ${issueId} ${solutions[0].id}`); // MUST execute
|
|
207
|
+
} else {
|
|
208
|
+
return { pending_selection: solutions }; // Return for user choice
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Solution Evaluation** (for each candidate):
|
|
213
|
+
```javascript
|
|
214
|
+
{
|
|
215
|
+
analysis: { risk: "low|medium|high", impact: "low|medium|high", complexity: "low|medium|high" },
|
|
216
|
+
score: 0.0-1.0 // Higher = recommended
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Task Decomposition** following schema:
|
|
221
|
+
```javascript
|
|
222
|
+
function decomposeTasks(issue, exploration) {
|
|
223
|
+
const tasks = groups.map(group => ({
|
|
224
|
+
id: `T${taskId++}`, // Pattern: ^T[0-9]+$
|
|
225
|
+
title: group.title,
|
|
226
|
+
scope: inferScope(group), // Module path
|
|
227
|
+
action: inferAction(group), // Create | Update | Implement | ...
|
|
228
|
+
description: group.description,
|
|
229
|
+
modification_points: mapModificationPoints(group),
|
|
230
|
+
implementation: generateSteps(group), // Step-by-step guide
|
|
231
|
+
test: {
|
|
232
|
+
unit: generateUnitTests(group),
|
|
233
|
+
commands: ['npm test']
|
|
234
|
+
},
|
|
235
|
+
acceptance: {
|
|
236
|
+
criteria: generateCriteria(group), // Quantified checklist
|
|
237
|
+
verification: generateVerification(group)
|
|
238
|
+
},
|
|
239
|
+
commit: {
|
|
240
|
+
type: inferCommitType(group), // feat | fix | refactor | ...
|
|
241
|
+
scope: inferScope(group),
|
|
242
|
+
message_template: generateCommitMsg(group)
|
|
243
|
+
},
|
|
244
|
+
depends_on: inferDependencies(group, tasks),
|
|
245
|
+
priority: calculatePriority(group) // 1-5 (1=highest)
|
|
246
|
+
}));
|
|
247
|
+
|
|
248
|
+
// GitHub Reply Task: Add final task if issue has github_url
|
|
249
|
+
if (issue.github_url || issue.github_number) {
|
|
250
|
+
const lastTaskId = tasks[tasks.length - 1]?.id;
|
|
251
|
+
tasks.push({
|
|
252
|
+
id: `T${taskId++}`,
|
|
253
|
+
title: 'Reply to GitHub Issue',
|
|
254
|
+
scope: 'github',
|
|
255
|
+
action: 'Notify',
|
|
256
|
+
description: `Comment on GitHub issue to report completion status`,
|
|
257
|
+
modification_points: [],
|
|
258
|
+
implementation: [
|
|
259
|
+
`Generate completion summary (tasks completed, files changed)`,
|
|
260
|
+
`Post comment via: gh issue comment ${issue.github_number || extractNumber(issue.github_url)} --body "..."`,
|
|
261
|
+
`Include: solution approach, key changes, verification results`
|
|
262
|
+
],
|
|
263
|
+
test: { unit: [], commands: [] },
|
|
264
|
+
acceptance: {
|
|
265
|
+
criteria: ['GitHub comment posted successfully', 'Comment includes completion summary'],
|
|
266
|
+
verification: ['Check GitHub issue for new comment']
|
|
267
|
+
},
|
|
268
|
+
commit: null, // No commit for notification task
|
|
269
|
+
depends_on: lastTaskId ? [lastTaskId] : [], // Depends on last implementation task
|
|
270
|
+
priority: 5 // Lowest priority (run last)
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return tasks;
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
#### Phase 4: Validation & Output
|
|
279
|
+
|
|
280
|
+
**Validation**:
|
|
281
|
+
- DAG validation (no circular dependencies)
|
|
282
|
+
- Task validation (all 5 phases present)
|
|
283
|
+
- File isolation check (ensure minimal overlap across issues in batch)
|
|
284
|
+
|
|
285
|
+
**Solution Registration** (via file write):
|
|
286
|
+
|
|
287
|
+
**Step 1: Create solution files**
|
|
288
|
+
|
|
289
|
+
Write solution JSON to JSONL file (one line per solution):
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
.workflow/issues/solutions/{issue-id}.jsonl
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**File Format** (JSONL - each line is a complete solution):
|
|
296
|
+
```
|
|
297
|
+
{"id":"SOL-GH-123-a7x9","description":"...","approach":"...","analysis":{...},"score":0.85,"tasks":[...]}
|
|
298
|
+
{"id":"SOL-GH-123-b2k4","description":"...","approach":"...","analysis":{...},"score":0.75,"tasks":[...]}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**Solution Schema** (must match CLI `Solution` interface):
|
|
302
|
+
```typescript
|
|
303
|
+
{
|
|
304
|
+
id: string; // Format: SOL-{issue-id}-{uid}
|
|
305
|
+
description?: string;
|
|
306
|
+
approach?: string;
|
|
307
|
+
tasks: SolutionTask[];
|
|
308
|
+
analysis?: { risk, impact, complexity };
|
|
309
|
+
score?: number;
|
|
310
|
+
// Note: is_bound, created_at are added by CLI on read
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Write Operation**:
|
|
315
|
+
```javascript
|
|
316
|
+
// Append solution to JSONL file (one line per solution)
|
|
317
|
+
// Use 4-char random uid to avoid collisions across multiple plan runs
|
|
318
|
+
const uid = Math.random().toString(36).slice(2, 6); // e.g., "a7x9"
|
|
319
|
+
const solutionId = `SOL-${issueId}-${uid}`;
|
|
320
|
+
const solutionLine = JSON.stringify({ id: solutionId, ...solution });
|
|
321
|
+
|
|
322
|
+
// Bash equivalent for uid generation:
|
|
323
|
+
// uid=$(cat /dev/urandom | tr -dc 'a-z0-9' | head -c 4)
|
|
324
|
+
|
|
325
|
+
// Read existing, append new line, write back
|
|
326
|
+
const filePath = `.workflow/issues/solutions/${issueId}.jsonl`;
|
|
327
|
+
const existing = existsSync(filePath) ? readFileSync(filePath) : '';
|
|
328
|
+
const newContent = existing.trimEnd() + (existing ? '\n' : '') + solutionLine + '\n';
|
|
329
|
+
Write({ file_path: filePath, content: newContent })
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
**Step 2: Bind decision**
|
|
333
|
+
- 1 solution → Execute `ccw issue bind <issue-id> <solution-id>`
|
|
334
|
+
- 2+ solutions → Return `pending_selection` (no bind)
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## 2. Output Requirements
|
|
339
|
+
|
|
340
|
+
### 2.1 Generate Files (Primary)
|
|
341
|
+
|
|
342
|
+
**Solution file per issue**:
|
|
343
|
+
```
|
|
344
|
+
.workflow/issues/solutions/{issue-id}.jsonl
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
Each line is a solution JSON containing tasks. Schema: `cat .claude/workflows/cli-templates/schemas/solution-schema.json`
|
|
348
|
+
|
|
349
|
+
### 2.2 Return Summary
|
|
350
|
+
|
|
351
|
+
```json
|
|
352
|
+
{
|
|
353
|
+
"bound": [{ "issue_id": "...", "solution_id": "...", "task_count": N }],
|
|
354
|
+
"pending_selection": [{ "issue_id": "GH-123", "solutions": [{ "id": "SOL-GH-123-1", "description": "...", "task_count": N }] }]
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## 3. Quality Standards
|
|
361
|
+
|
|
362
|
+
### 3.1 Acceptance Criteria
|
|
363
|
+
|
|
364
|
+
| Good | Bad |
|
|
365
|
+
|------|-----|
|
|
366
|
+
| "3 API endpoints: GET, POST, DELETE" | "API works correctly" |
|
|
367
|
+
| "Response time < 200ms p95" | "Good performance" |
|
|
368
|
+
| "All 4 test cases pass" | "Tests pass" |
|
|
369
|
+
|
|
370
|
+
### 3.2 Validation Checklist
|
|
371
|
+
|
|
372
|
+
- [ ] ACE search performed for each issue
|
|
373
|
+
- [ ] All modification_points verified against codebase
|
|
374
|
+
- [ ] Tasks have 2+ implementation steps
|
|
375
|
+
- [ ] All 5 lifecycle phases present
|
|
376
|
+
- [ ] Quantified acceptance criteria with verification
|
|
377
|
+
- [ ] Dependencies form valid DAG
|
|
378
|
+
- [ ] Commit follows conventional commits
|
|
379
|
+
|
|
380
|
+
### 3.3 Guidelines
|
|
381
|
+
|
|
382
|
+
**Bash Tool**:
|
|
383
|
+
- Use `run_in_background=false` for all Bash/CLI calls to ensure foreground execution
|
|
384
|
+
|
|
385
|
+
**ALWAYS**:
|
|
386
|
+
1. **Search Tool Priority**: ACE (`mcp__ace-tool__search_context`) → CCW (`mcp__ccw-tools__smart_search`) / Built-in (`Grep`, `Glob`, `Read`)
|
|
387
|
+
2. Read schema first: `cat .claude/workflows/cli-templates/schemas/solution-schema.json`
|
|
388
|
+
3. Use ACE semantic search as PRIMARY exploration tool
|
|
389
|
+
4. Fetch issue details via `ccw issue status <id> --json`
|
|
390
|
+
5. **Analyze failure history**: Check `issue.feedback` for type='failure', stage='execute'
|
|
391
|
+
6. **For replanning**: Reference previous failures in `solution.approach`, add prevention steps
|
|
392
|
+
7. Quantify acceptance.criteria with testable conditions
|
|
393
|
+
8. Validate DAG before output
|
|
394
|
+
9. Evaluate each solution with `analysis` and `score`
|
|
395
|
+
10. Write solutions to `.workflow/issues/solutions/{issue-id}.jsonl` (append mode)
|
|
396
|
+
11. For HIGH complexity: generate 2-3 candidate solutions
|
|
397
|
+
12. **Solution ID format**: `SOL-{issue-id}-{uid}` where uid is 4 random alphanumeric chars (e.g., `SOL-GH-123-a7x9`)
|
|
398
|
+
13. **GitHub Reply Task**: If issue has `github_url` or `github_number`, add final task to comment on GitHub issue with completion summary
|
|
399
|
+
|
|
400
|
+
**CONFLICT AVOIDANCE** (for batch processing of similar issues):
|
|
401
|
+
1. **File isolation**: Each issue's solution should target distinct files when possible
|
|
402
|
+
2. **Module boundaries**: Prefer solutions that modify different modules/directories
|
|
403
|
+
3. **Multiple solutions**: When file overlap is unavoidable, generate alternative solutions with different file targets
|
|
404
|
+
4. **Dependency ordering**: If issues must touch same files, encode execution order via `depends_on`
|
|
405
|
+
5. **Scope minimization**: Prefer smaller, focused modifications over broad refactoring
|
|
406
|
+
|
|
407
|
+
**NEVER**:
|
|
408
|
+
1. Execute implementation (return plan only)
|
|
409
|
+
2. Use vague criteria ("works correctly", "good performance")
|
|
410
|
+
3. Create circular dependencies
|
|
411
|
+
4. Generate more than 10 tasks per issue
|
|
412
|
+
5. Skip bind when `solutions.length === 1` (MUST execute bind command)
|
|
413
|
+
|
|
414
|
+
**OUTPUT**:
|
|
415
|
+
1. Write solutions to `.workflow/issues/solutions/{issue-id}.jsonl`
|
|
416
|
+
2. Execute bind or return `pending_selection` based on solution count
|
|
417
|
+
3. Return JSON: `{ bound: [...], pending_selection: [...] }`
|