claude-code-workflow 6.3.36 → 6.3.37

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.
Files changed (134) hide show
  1. package/.claude/commands/workflow/lite-fix.md +108 -9
  2. package/.claude/skills/ccw-loop/README.md +303 -0
  3. package/.claude/skills/ccw-loop/SKILL.md +259 -0
  4. package/.claude/skills/ccw-loop/phases/actions/action-complete.md +320 -0
  5. package/.claude/skills/ccw-loop/phases/actions/action-debug-with-file.md +485 -0
  6. package/.claude/skills/ccw-loop/phases/actions/action-develop-with-file.md +365 -0
  7. package/.claude/skills/ccw-loop/phases/actions/action-init.md +200 -0
  8. package/.claude/skills/ccw-loop/phases/actions/action-menu.md +192 -0
  9. package/.claude/skills/ccw-loop/phases/actions/action-validate-with-file.md +307 -0
  10. package/.claude/skills/ccw-loop/phases/orchestrator.md +486 -0
  11. package/.claude/skills/ccw-loop/phases/state-schema.md +474 -0
  12. package/.claude/skills/ccw-loop/specs/action-catalog.md +300 -0
  13. package/.claude/skills/ccw-loop/specs/loop-requirements.md +192 -0
  14. package/.claude/skills/ccw-loop/templates/progress-template.md +175 -0
  15. package/.claude/skills/ccw-loop/templates/understanding-template.md +303 -0
  16. package/.claude/skills/ccw-loop/templates/validation-template.md +258 -0
  17. package/ccw/dist/cli.d.ts.map +1 -1
  18. package/ccw/dist/cli.js +8 -1
  19. package/ccw/dist/cli.js.map +1 -1
  20. package/ccw/dist/commands/cli.d.ts.map +1 -1
  21. package/ccw/dist/commands/cli.js +14 -1
  22. package/ccw/dist/commands/cli.js.map +1 -1
  23. package/ccw/dist/commands/loop.d.ts +10 -0
  24. package/ccw/dist/commands/loop.d.ts.map +1 -0
  25. package/ccw/dist/commands/loop.js +289 -0
  26. package/ccw/dist/commands/loop.js.map +1 -0
  27. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  28. package/ccw/dist/core/dashboard-generator.js +4 -1
  29. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  30. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  31. package/ccw/dist/core/routes/claude-routes.js +5 -3
  32. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  33. package/ccw/dist/core/routes/cli-routes.d.ts +6 -0
  34. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  35. package/ccw/dist/core/routes/cli-routes.js +42 -13
  36. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  37. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -1
  38. package/ccw/dist/core/routes/cli-settings-routes.js +44 -0
  39. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -1
  40. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -1
  41. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +3 -2
  42. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -1
  43. package/ccw/dist/core/routes/core-memory-routes.d.ts.map +1 -1
  44. package/ccw/dist/core/routes/core-memory-routes.js +4 -2
  45. package/ccw/dist/core/routes/core-memory-routes.js.map +1 -1
  46. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  47. package/ccw/dist/core/routes/files-routes.js +4 -2
  48. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  49. package/ccw/dist/core/routes/loop-routes.d.ts +24 -0
  50. package/ccw/dist/core/routes/loop-routes.d.ts.map +1 -0
  51. package/ccw/dist/core/routes/loop-routes.js +334 -0
  52. package/ccw/dist/core/routes/loop-routes.js.map +1 -0
  53. package/ccw/dist/core/routes/loop-v2-routes.d.ts +35 -0
  54. package/ccw/dist/core/routes/loop-v2-routes.d.ts.map +1 -0
  55. package/ccw/dist/core/routes/loop-v2-routes.js +1208 -0
  56. package/ccw/dist/core/routes/loop-v2-routes.js.map +1 -0
  57. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  58. package/ccw/dist/core/routes/memory-routes.js +2 -1
  59. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  60. package/ccw/dist/core/routes/task-routes.d.ts +12 -0
  61. package/ccw/dist/core/routes/task-routes.d.ts.map +1 -0
  62. package/ccw/dist/core/routes/task-routes.js +321 -0
  63. package/ccw/dist/core/routes/task-routes.js.map +1 -0
  64. package/ccw/dist/core/routes/test-loop-routes.d.ts +11 -0
  65. package/ccw/dist/core/routes/test-loop-routes.d.ts.map +1 -0
  66. package/ccw/dist/core/routes/test-loop-routes.js +298 -0
  67. package/ccw/dist/core/routes/test-loop-routes.js.map +1 -0
  68. package/ccw/dist/core/server.d.ts.map +1 -1
  69. package/ccw/dist/core/server.js +43 -3
  70. package/ccw/dist/core/server.js.map +1 -1
  71. package/ccw/dist/core/websocket.d.ts +59 -0
  72. package/ccw/dist/core/websocket.d.ts.map +1 -1
  73. package/ccw/dist/core/websocket.js +34 -0
  74. package/ccw/dist/core/websocket.js.map +1 -1
  75. package/ccw/dist/tools/claude-cli-tools.d.ts +40 -0
  76. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  77. package/ccw/dist/tools/claude-cli-tools.js +119 -0
  78. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  79. package/ccw/dist/tools/loop-manager.d.ts +84 -0
  80. package/ccw/dist/tools/loop-manager.d.ts.map +1 -0
  81. package/ccw/dist/tools/loop-manager.js +425 -0
  82. package/ccw/dist/tools/loop-manager.js.map +1 -0
  83. package/ccw/dist/tools/loop-state-manager.d.ts +47 -0
  84. package/ccw/dist/tools/loop-state-manager.d.ts.map +1 -0
  85. package/ccw/dist/tools/loop-state-manager.js +149 -0
  86. package/ccw/dist/tools/loop-state-manager.js.map +1 -0
  87. package/ccw/dist/tools/loop-task-manager.d.ts +138 -0
  88. package/ccw/dist/tools/loop-task-manager.d.ts.map +1 -0
  89. package/ccw/dist/tools/loop-task-manager.js +270 -0
  90. package/ccw/dist/tools/loop-task-manager.js.map +1 -0
  91. package/ccw/dist/types/index.d.ts +1 -0
  92. package/ccw/dist/types/index.d.ts.map +1 -1
  93. package/ccw/dist/types/index.js +1 -0
  94. package/ccw/dist/types/index.js.map +1 -1
  95. package/ccw/dist/types/loop.d.ts +257 -0
  96. package/ccw/dist/types/loop.d.ts.map +1 -0
  97. package/ccw/dist/types/loop.js +17 -0
  98. package/ccw/dist/types/loop.js.map +1 -0
  99. package/ccw/src/cli.ts +9 -1
  100. package/ccw/src/commands/cli.ts +14 -1
  101. package/ccw/src/commands/loop.ts +344 -0
  102. package/ccw/src/core/dashboard-generator.ts +4 -1
  103. package/ccw/src/core/routes/claude-routes.ts +5 -3
  104. package/ccw/src/core/routes/cli-routes.ts +47 -15
  105. package/ccw/src/core/routes/cli-settings-routes.ts +47 -0
  106. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +3 -2
  107. package/ccw/src/core/routes/core-memory-routes.ts +4 -2
  108. package/ccw/src/core/routes/files-routes.ts +4 -2
  109. package/ccw/src/core/routes/loop-routes.ts +386 -0
  110. package/ccw/src/core/routes/loop-v2-routes.ts +1412 -0
  111. package/ccw/src/core/routes/memory-routes.ts +2 -1
  112. package/ccw/src/core/routes/task-routes.ts +361 -0
  113. package/ccw/src/core/routes/test-loop-routes.ts +312 -0
  114. package/ccw/src/core/server.ts +44 -3
  115. package/ccw/src/core/websocket.ts +104 -0
  116. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +56 -0
  117. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +55 -0
  118. package/ccw/src/templates/dashboard-css/36-loop-monitor.css +1896 -0
  119. package/ccw/src/templates/dashboard-css/36-loop-monitor.css.backup +1877 -0
  120. package/ccw/src/templates/dashboard-js/components/cli-status.js +64 -3
  121. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +251 -110
  122. package/ccw/src/templates/dashboard-js/components/navigation.js +10 -0
  123. package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
  124. package/ccw/src/templates/dashboard-js/i18n.js +475 -1
  125. package/ccw/src/templates/dashboard-js/views/cli-manager.js +3 -2
  126. package/ccw/src/templates/dashboard-js/views/loop-monitor.js +3244 -0
  127. package/ccw/src/templates/dashboard.html +20 -2
  128. package/ccw/src/tools/claude-cli-tools.ts +143 -0
  129. package/ccw/src/tools/loop-manager.ts +519 -0
  130. package/ccw/src/tools/loop-state-manager.ts +173 -0
  131. package/ccw/src/tools/loop-task-manager.ts +380 -0
  132. package/ccw/src/types/index.ts +1 -0
  133. package/ccw/src/types/loop.ts +316 -0
  134. package/package.json +1 -1
@@ -0,0 +1,259 @@
1
+ ---
2
+ name: ccw-loop
3
+ description: Stateless iterative development loop workflow with documented progress. Supports develop, debug, and validate phases with file-based state tracking. Triggers on "ccw-loop", "dev loop", "development loop", "开发循环", "迭代开发".
4
+ allowed-tools: Task(*), AskUserQuestion(*), Read(*), Grep(*), Glob(*), Bash(*), Edit(*), Write(*), TodoWrite(*)
5
+ ---
6
+
7
+ # CCW Loop - Stateless Iterative Development Workflow
8
+
9
+ 无状态迭代开发循环工作流,支持开发 (develop)、调试 (debug)、验证 (validate) 三个阶段,每个阶段都有独立的文件记录进展。
10
+
11
+ ## Arguments
12
+
13
+ | Arg | Required | Description |
14
+ |-----|----------|-------------|
15
+ | task | No | Task description (for new loop, mutually exclusive with --loop-id) |
16
+ | --loop-id | No | Existing loop ID to continue (from API or previous session) |
17
+ | --auto | No | Auto-cycle mode (develop → debug → validate → complete) |
18
+
19
+ ## Unified Architecture (API + Skill Integration)
20
+
21
+ ```
22
+ ┌─────────────────────────────────────────────────────────────────┐
23
+ │ Dashboard (UI) │
24
+ │ [Create] [Start] [Pause] [Resume] [Stop] [View Progress] │
25
+ └─────────────────────────────────────────────────────────────────┘
26
+
27
+
28
+ ┌─────────────────────────────────────────────────────────────────┐
29
+ │ loop-v2-routes.ts (Control Plane) │
30
+ │ │
31
+ │ State: .loop/{loopId}.json (MASTER) │
32
+ │ Tasks: .loop/{loopId}.tasks.jsonl │
33
+ │ │
34
+ │ /start → Trigger ccw-loop skill with --loop-id │
35
+ │ /pause → Set status='paused' (skill checks before action) │
36
+ │ /stop → Set status='failed' (skill terminates) │
37
+ │ /resume → Set status='running' (skill continues) │
38
+ └─────────────────────────────────────────────────────────────────┘
39
+
40
+
41
+ ┌─────────────────────────────────────────────────────────────────┐
42
+ │ ccw-loop Skill (Execution Plane) │
43
+ │ │
44
+ │ Reads/Writes: .loop/{loopId}.json (unified state) │
45
+ │ Writes: .loop/{loopId}.progress/* (progress files) │
46
+ │ │
47
+ │ BEFORE each action: │
48
+ │ → Check status: paused/stopped → exit gracefully │
49
+ │ → running → continue with action │
50
+ │ │
51
+ │ Actions: init → develop → debug → validate → complete │
52
+ └─────────────────────────────────────────────────────────────────┘
53
+ ```
54
+
55
+ ## Key Design Principles
56
+
57
+ 1. **统一状态**: API 和 Skill 共享 `.loop/{loopId}.json` 状态文件
58
+ 2. **控制信号**: Skill 每个 Action 前检查 status 字段 (paused/stopped)
59
+ 3. **文件驱动**: 所有进度、理解、结果都记录在 `.loop/{loopId}.progress/`
60
+ 4. **可恢复**: 任何时候可以继续之前的循环 (`--loop-id`)
61
+ 5. **双触发**: 支持 API 触发 (`--loop-id`) 和直接调用 (task description)
62
+ 6. **Gemini 辅助**: 使用 CLI 工具进行深度分析和假设验证
63
+
64
+ ## Execution Modes
65
+
66
+ ### Mode 1: Interactive (交互式)
67
+
68
+ 用户手动选择每个动作,适合复杂任务。
69
+
70
+ ```
71
+ 用户 → 选择动作 → 执行 → 查看结果 → 选择下一动作
72
+ ```
73
+
74
+ ### Mode 2: Auto-Loop (自动循环)
75
+
76
+ 按预设顺序自动执行,适合标准开发流程。
77
+
78
+ ```
79
+ Develop → Debug → Validate → (如有问题) → Develop → ...
80
+ ```
81
+
82
+ ## Session Structure (Unified Location)
83
+
84
+ ```
85
+ .loop/
86
+ ├── {loopId}.json # 主状态文件 (API + Skill 共享)
87
+ ├── {loopId}.tasks.jsonl # 任务列表 (API 管理)
88
+ └── {loopId}.progress/ # Skill 进度文件
89
+ ├── develop.md # 开发进度记录
90
+ ├── debug.md # 理解演变文档
91
+ ├── validate.md # 验证报告
92
+ ├── changes.log # 代码变更日志 (NDJSON)
93
+ └── debug.log # 调试日志 (NDJSON)
94
+ ```
95
+
96
+ ## Directory Setup
97
+
98
+ ```javascript
99
+ // loopId 来源:
100
+ // 1. API 触发时: 从 --loop-id 参数获取
101
+ // 2. 直接调用时: 生成新的 loop-v2-{timestamp}-{random}
102
+
103
+ const loopId = args['--loop-id'] || generateLoopId()
104
+ const loopFile = `.loop/${loopId}.json`
105
+ const progressDir = `.loop/${loopId}.progress`
106
+
107
+ // 创建进度目录
108
+ Bash(`mkdir -p "${progressDir}"`)
109
+ ```
110
+
111
+ ## Action Catalog
112
+
113
+ | Action | Purpose | Output Files | CLI Integration |
114
+ |--------|---------|--------------|-----------------|
115
+ | [action-init](phases/actions/action-init.md) | 初始化循环会话 | meta.json, state.json | - |
116
+ | [action-develop-with-file](phases/actions/action-develop-with-file.md) | 开发任务执行 | progress.md, tasks.json | gemini --mode write |
117
+ | [action-debug-with-file](phases/actions/action-debug-with-file.md) | 假设驱动调试 | understanding.md, hypotheses.json | gemini --mode analysis |
118
+ | [action-validate-with-file](phases/actions/action-validate-with-file.md) | 测试与验证 | validation.md, test-results.json | gemini --mode analysis |
119
+ | [action-complete](phases/actions/action-complete.md) | 完成循环 | summary.md | - |
120
+ | [action-menu](phases/actions/action-menu.md) | 显示操作菜单 | - | - |
121
+
122
+ ## Usage
123
+
124
+ ```bash
125
+ # 启动新循环 (直接调用)
126
+ /ccw-loop "实现用户认证功能"
127
+
128
+ # 继续现有循环 (API 触发或手动恢复)
129
+ /ccw-loop --loop-id loop-v2-20260122-abc123
130
+
131
+ # 自动循环模式
132
+ /ccw-loop --auto "修复登录bug并添加测试"
133
+
134
+ # API 触发自动循环
135
+ /ccw-loop --loop-id loop-v2-20260122-abc123 --auto
136
+ ```
137
+
138
+ ## Execution Flow
139
+
140
+ ```
141
+ ┌─────────────────────────────────────────────────────────────────┐
142
+ │ /ccw-loop [<task> | --loop-id <id>] [--auto] │
143
+ ├─────────────────────────────────────────────────────────────────┤
144
+ │ │
145
+ │ 1. Parameter Detection: │
146
+ │ ├─ IF --loop-id provided: │
147
+ │ │ ├─ Read .loop/{loopId}.json │
148
+ │ │ ├─ Validate status === 'running' │
149
+ │ │ └─ Continue from skill_state.current_action │
150
+ │ └─ ELSE (task description): │
151
+ │ ├─ Generate new loopId │
152
+ │ ├─ Create .loop/{loopId}.json │
153
+ │ └─ Initialize with action-init │
154
+ │ │
155
+ │ 2. Orchestrator Loop: │
156
+ │ ├─ Read state from .loop/{loopId}.json │
157
+ │ ├─ Check control signals: │
158
+ │ │ ├─ status === 'paused' → Exit (wait for resume) │
159
+ │ │ ├─ status === 'failed' → Exit with error │
160
+ │ │ └─ status === 'running' → Continue │
161
+ │ ├─ Show menu / auto-select next action │
162
+ │ ├─ Execute action │
163
+ │ ├─ Update .loop/{loopId}.progress/{action}.md │
164
+ │ ├─ Update .loop/{loopId}.json (skill_state) │
165
+ │ └─ Loop or exit based on user choice / completion │
166
+ │ │
167
+ │ 3. Action Execution: │
168
+ │ ├─ BEFORE: checkControlSignals() → exit if paused/stopped │
169
+ │ ├─ Develop: Plan → Implement → Document progress │
170
+ │ ├─ Debug: Hypothesize → Instrument → Analyze → Fix │
171
+ │ ├─ Validate: Test → Check → Report │
172
+ │ └─ AFTER: Update skill_state in .loop/{loopId}.json │
173
+ │ │
174
+ │ 4. Termination: │
175
+ │ ├─ Control signal: paused (graceful exit, wait resume) │
176
+ │ ├─ Control signal: stopped (failed state) │
177
+ │ ├─ User exits (interactive mode) │
178
+ │ ├─ All tasks completed (status → completed) │
179
+ │ └─ Max iterations reached │
180
+ │ │
181
+ └─────────────────────────────────────────────────────────────────┘
182
+ ```
183
+
184
+ ## Reference Documents
185
+
186
+ | Document | Purpose |
187
+ |----------|---------|
188
+ | [phases/orchestrator.md](phases/orchestrator.md) | 编排器:状态读取 + 动作选择 |
189
+ | [phases/state-schema.md](phases/state-schema.md) | 状态结构定义 |
190
+ | [specs/loop-requirements.md](specs/loop-requirements.md) | 循环需求规范 |
191
+ | [specs/action-catalog.md](specs/action-catalog.md) | 动作目录 |
192
+ | [templates/progress-template.md](templates/progress-template.md) | 进度文档模板 |
193
+ | [templates/understanding-template.md](templates/understanding-template.md) | 理解文档模板 |
194
+
195
+ ## Integration with Loop Monitor (Dashboard)
196
+
197
+ 此 Skill 与 CCW Dashboard 的 Loop Monitor 实现 **控制平面 + 执行平面** 分离架构:
198
+
199
+ ### Control Plane (Dashboard/API → loop-v2-routes.ts)
200
+
201
+ 1. **创建循环**: `POST /api/loops/v2` → 创建 `.loop/{loopId}.json`
202
+ 2. **启动执行**: `POST /api/loops/v2/:loopId/start` → 触发 `/ccw-loop --loop-id {loopId} --auto`
203
+ 3. **暂停执行**: `POST /api/loops/v2/:loopId/pause` → 设置 `status='paused'` (Skill 下次检查时退出)
204
+ 4. **恢复执行**: `POST /api/loops/v2/:loopId/resume` → 设置 `status='running'` → 重新触发 Skill
205
+ 5. **停止执行**: `POST /api/loops/v2/:loopId/stop` → 设置 `status='failed'`
206
+
207
+ ### Execution Plane (ccw-loop Skill)
208
+
209
+ 1. **读取状态**: 从 `.loop/{loopId}.json` 读取 API 设置的状态
210
+ 2. **检查控制**: 每个 Action 前检查 `status` 字段
211
+ 3. **执行动作**: develop → debug → validate → complete
212
+ 4. **更新进度**: 写入 `.loop/{loopId}.progress/*.md` 和更新 `skill_state`
213
+ 5. **状态同步**: Dashboard 通过读取 `.loop/{loopId}.json` 获取进度
214
+
215
+ ## CLI Integration Points
216
+
217
+ ### Develop Phase
218
+ ```bash
219
+ ccw cli -p "PURPOSE: Implement {task}...
220
+ TASK: • Analyze requirements • Write code • Update progress
221
+ MODE: write
222
+ CONTEXT: @progress.md @tasks.json
223
+ EXPECTED: Implementation + updated progress.md
224
+ " --tool gemini --mode write --rule development-implement-feature
225
+ ```
226
+
227
+ ### Debug Phase
228
+ ```bash
229
+ ccw cli -p "PURPOSE: Generate debugging hypotheses...
230
+ TASK: • Analyze error • Generate hypotheses • Add instrumentation
231
+ MODE: analysis
232
+ CONTEXT: @understanding.md @debug.log
233
+ EXPECTED: Hypotheses + instrumentation plan
234
+ " --tool gemini --mode analysis --rule analysis-diagnose-bug-root-cause
235
+ ```
236
+
237
+ ### Validate Phase
238
+ ```bash
239
+ ccw cli -p "PURPOSE: Validate implementation...
240
+ TASK: • Run tests • Check coverage • Verify requirements
241
+ MODE: analysis
242
+ CONTEXT: @validation.md @test-results.json
243
+ EXPECTED: Validation report
244
+ " --tool gemini --mode analysis --rule analysis-review-code-quality
245
+ ```
246
+
247
+ ## Error Handling
248
+
249
+ | Situation | Action |
250
+ |-----------|--------|
251
+ | Session not found | Create new session |
252
+ | State file corrupted | Rebuild from file contents |
253
+ | CLI tool fails | Fallback to manual analysis |
254
+ | Tests fail | Loop back to develop/debug |
255
+ | >10 iterations | Warn user, suggest break |
256
+
257
+ ## Post-Completion Expansion
258
+
259
+ 完成后询问用户是否扩展为 issue (test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"`
@@ -0,0 +1,320 @@
1
+ # Action: Complete
2
+
3
+ 完成 CCW Loop 会话,生成总结报告。
4
+
5
+ ## Purpose
6
+
7
+ - 生成完成报告
8
+ - 汇总所有阶段成果
9
+ - 提供后续建议
10
+ - 询问是否扩展为 Issue
11
+
12
+ ## Preconditions
13
+
14
+ - [ ] state.initialized === true
15
+ - [ ] state.status === 'running'
16
+
17
+ ## Execution
18
+
19
+ ### Step 1: 汇总统计
20
+
21
+ ```javascript
22
+ const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
23
+
24
+ const sessionFolder = `.workflow/.loop/${state.session_id}`
25
+
26
+ const stats = {
27
+ // 时间统计
28
+ duration: Date.now() - new Date(state.created_at).getTime(),
29
+ iterations: state.iteration_count,
30
+
31
+ // 开发统计
32
+ develop: {
33
+ total_tasks: state.develop.total_count,
34
+ completed_tasks: state.develop.completed_count,
35
+ completion_rate: state.develop.total_count > 0
36
+ ? (state.develop.completed_count / state.develop.total_count * 100).toFixed(1)
37
+ : 0
38
+ },
39
+
40
+ // 调试统计
41
+ debug: {
42
+ iterations: state.debug.iteration,
43
+ hypotheses_tested: state.debug.hypotheses.length,
44
+ root_cause_found: state.debug.confirmed_hypothesis !== null
45
+ },
46
+
47
+ // 验证统计
48
+ validate: {
49
+ runs: state.validate.test_results.length,
50
+ passed: state.validate.passed,
51
+ coverage: state.validate.coverage,
52
+ failed_tests: state.validate.failed_tests.length
53
+ }
54
+ }
55
+
56
+ console.log('\n生成完成报告...')
57
+ ```
58
+
59
+ ### Step 2: 生成总结报告
60
+
61
+ ```javascript
62
+ const summaryReport = `# CCW Loop Session Summary
63
+
64
+ **Session ID**: ${state.session_id}
65
+ **Task**: ${state.task_description}
66
+ **Started**: ${state.created_at}
67
+ **Completed**: ${getUtc8ISOString()}
68
+ **Duration**: ${formatDuration(stats.duration)}
69
+
70
+ ---
71
+
72
+ ## Executive Summary
73
+
74
+ ${state.validate.passed
75
+ ? '✅ **任务成功完成** - 所有测试通过,验证成功'
76
+ : state.develop.completed_count === state.develop.total_count
77
+ ? '⚠️ **开发完成,验证未通过** - 需要进一步调试'
78
+ : '⏸️ **任务部分完成** - 仍有待处理项'}
79
+
80
+ ---
81
+
82
+ ## Development Phase
83
+
84
+ | Metric | Value |
85
+ |--------|-------|
86
+ | Total Tasks | ${stats.develop.total_tasks} |
87
+ | Completed | ${stats.develop.completed_tasks} |
88
+ | Completion Rate | ${stats.develop.completion_rate}% |
89
+
90
+ ### Completed Tasks
91
+
92
+ ${state.develop.tasks.filter(t => t.status === 'completed').map(t => `
93
+ - ✅ ${t.description}
94
+ - Files: ${t.files_changed?.join(', ') || 'N/A'}
95
+ - Completed: ${t.completed_at}
96
+ `).join('\n')}
97
+
98
+ ### Pending Tasks
99
+
100
+ ${state.develop.tasks.filter(t => t.status !== 'completed').map(t => `
101
+ - ⏳ ${t.description}
102
+ `).join('\n') || '_None_'}
103
+
104
+ ---
105
+
106
+ ## Debug Phase
107
+
108
+ | Metric | Value |
109
+ |--------|-------|
110
+ | Iterations | ${stats.debug.iterations} |
111
+ | Hypotheses Tested | ${stats.debug.hypotheses_tested} |
112
+ | Root Cause Found | ${stats.debug.root_cause_found ? 'Yes' : 'No'} |
113
+
114
+ ${stats.debug.root_cause_found ? `
115
+ ### Confirmed Root Cause
116
+
117
+ **${state.debug.confirmed_hypothesis}**: ${state.debug.hypotheses.find(h => h.id === state.debug.confirmed_hypothesis)?.description || 'N/A'}
118
+ ` : ''}
119
+
120
+ ### Hypothesis Summary
121
+
122
+ ${state.debug.hypotheses.map(h => `
123
+ - **${h.id}**: ${h.status.toUpperCase()}
124
+ - ${h.description}
125
+ `).join('\n') || '_No hypotheses tested_'}
126
+
127
+ ---
128
+
129
+ ## Validation Phase
130
+
131
+ | Metric | Value |
132
+ |--------|-------|
133
+ | Test Runs | ${stats.validate.runs} |
134
+ | Status | ${stats.validate.passed ? 'PASSED' : 'FAILED'} |
135
+ | Coverage | ${stats.validate.coverage || 'N/A'}% |
136
+ | Failed Tests | ${stats.validate.failed_tests} |
137
+
138
+ ${stats.validate.failed_tests > 0 ? `
139
+ ### Failed Tests
140
+
141
+ ${state.validate.failed_tests.map(t => `- ❌ ${t}`).join('\n')}
142
+ ` : ''}
143
+
144
+ ---
145
+
146
+ ## Files Modified
147
+
148
+ ${listModifiedFiles(sessionFolder)}
149
+
150
+ ---
151
+
152
+ ## Key Learnings
153
+
154
+ ${state.debug.iteration > 0 ? `
155
+ ### From Debugging
156
+
157
+ ${extractLearnings(state.debug.hypotheses)}
158
+ ` : ''}
159
+
160
+ ---
161
+
162
+ ## Recommendations
163
+
164
+ ${generateRecommendations(stats, state)}
165
+
166
+ ---
167
+
168
+ ## Session Artifacts
169
+
170
+ | File | Description |
171
+ |------|-------------|
172
+ | \`develop/progress.md\` | Development progress timeline |
173
+ | \`develop/tasks.json\` | Task list with status |
174
+ | \`debug/understanding.md\` | Debug exploration and learnings |
175
+ | \`debug/hypotheses.json\` | Hypothesis history |
176
+ | \`validate/validation.md\` | Validation report |
177
+ | \`validate/test-results.json\` | Test execution results |
178
+
179
+ ---
180
+
181
+ *Generated by CCW Loop at ${getUtc8ISOString()}*
182
+ `
183
+
184
+ Write(`${sessionFolder}/summary.md`, summaryReport)
185
+ console.log(`\n报告已保存: ${sessionFolder}/summary.md`)
186
+ ```
187
+
188
+ ### Step 3: 询问后续扩展
189
+
190
+ ```javascript
191
+ console.log('\n' + '═'.repeat(60))
192
+ console.log(' 任务已完成')
193
+ console.log('═'.repeat(60))
194
+
195
+ const expansionResponse = await AskUserQuestion({
196
+ questions: [{
197
+ question: "是否将发现扩展为 Issue?",
198
+ header: "扩展选项",
199
+ multiSelect: true,
200
+ options: [
201
+ { label: "测试 (Test)", description: "添加更多测试用例" },
202
+ { label: "增强 (Enhance)", description: "功能增强建议" },
203
+ { label: "重构 (Refactor)", description: "代码重构建议" },
204
+ { label: "文档 (Doc)", description: "文档更新需求" },
205
+ { label: "否,直接完成", description: "不创建 Issue" }
206
+ ]
207
+ }]
208
+ })
209
+
210
+ const selectedExpansions = expansionResponse["扩展选项"]
211
+
212
+ if (selectedExpansions && !selectedExpansions.includes("否,直接完成")) {
213
+ for (const expansion of selectedExpansions) {
214
+ const dimension = expansion.split(' ')[0].toLowerCase()
215
+ const issueSummary = `${state.task_description} - ${dimension}`
216
+
217
+ console.log(`\n创建 Issue: ${issueSummary}`)
218
+
219
+ // 调用 /issue:new 创建 issue
220
+ await Bash({
221
+ command: `/issue:new "${issueSummary}"`,
222
+ run_in_background: false
223
+ })
224
+ }
225
+ }
226
+ ```
227
+
228
+ ### Step 4: 最终输出
229
+
230
+ ```javascript
231
+ console.log(`
232
+ ═══════════════════════════════════════════════════════════
233
+ ✅ CCW Loop 会话完成
234
+ ═══════════════════════════════════════════════════════════
235
+
236
+ 会话 ID: ${state.session_id}
237
+ 用时: ${formatDuration(stats.duration)}
238
+ 迭代: ${stats.iterations}
239
+
240
+ 开发: ${stats.develop.completed_tasks}/${stats.develop.total_tasks} 任务完成
241
+ 调试: ${stats.debug.iterations} 次迭代
242
+ 验证: ${stats.validate.passed ? '通过 ✅' : '未通过 ❌'}
243
+
244
+ 报告: ${sessionFolder}/summary.md
245
+
246
+ ═══════════════════════════════════════════════════════════
247
+ `)
248
+ ```
249
+
250
+ ## State Updates
251
+
252
+ ```javascript
253
+ return {
254
+ stateUpdates: {
255
+ status: 'completed',
256
+ completed_at: getUtc8ISOString(),
257
+ summary: stats
258
+ },
259
+ continue: false,
260
+ message: `会话 ${state.session_id} 已完成`
261
+ }
262
+ ```
263
+
264
+ ## Helper Functions
265
+
266
+ ```javascript
267
+ function formatDuration(ms) {
268
+ const seconds = Math.floor(ms / 1000)
269
+ const minutes = Math.floor(seconds / 60)
270
+ const hours = Math.floor(minutes / 60)
271
+
272
+ if (hours > 0) {
273
+ return `${hours}h ${minutes % 60}m`
274
+ } else if (minutes > 0) {
275
+ return `${minutes}m ${seconds % 60}s`
276
+ } else {
277
+ return `${seconds}s`
278
+ }
279
+ }
280
+
281
+ function generateRecommendations(stats, state) {
282
+ const recommendations = []
283
+
284
+ if (stats.develop.completion_rate < 100) {
285
+ recommendations.push('- 完成剩余开发任务')
286
+ }
287
+
288
+ if (!stats.validate.passed) {
289
+ recommendations.push('- 修复失败的测试')
290
+ }
291
+
292
+ if (stats.validate.coverage && stats.validate.coverage < 80) {
293
+ recommendations.push(`- 提高测试覆盖率 (当前: ${stats.validate.coverage}%)`)
294
+ }
295
+
296
+ if (stats.debug.iterations > 3 && !stats.debug.root_cause_found) {
297
+ recommendations.push('- 考虑代码重构以简化调试')
298
+ }
299
+
300
+ if (recommendations.length === 0) {
301
+ recommendations.push('- 考虑代码审查')
302
+ recommendations.push('- 更新相关文档')
303
+ recommendations.push('- 准备部署')
304
+ }
305
+
306
+ return recommendations.join('\n')
307
+ }
308
+ ```
309
+
310
+ ## Error Handling
311
+
312
+ | Error Type | Recovery |
313
+ |------------|----------|
314
+ | 报告生成失败 | 显示基本统计,跳过文件写入 |
315
+ | Issue 创建失败 | 记录错误,继续完成 |
316
+
317
+ ## Next Actions
318
+
319
+ - 无 (终止状态)
320
+ - 如需继续: 使用 `ccw-loop --resume {session-id}` 重新打开会话