claude-code-workflow 6.3.34 → 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 (162) hide show
  1. package/.claude/agents/cli-execution-agent.md +61 -0
  2. package/.claude/agents/cli-lite-planning-agent.md +322 -36
  3. package/.claude/agents/issue-plan-agent.md +95 -11
  4. package/.claude/commands/cli/codex-review.md +8 -2
  5. package/.claude/commands/issue/plan.md +20 -6
  6. package/.claude/commands/workflow/lite-execute.md +56 -16
  7. package/.claude/commands/workflow/lite-fix.md +108 -9
  8. package/.claude/commands/workflow/lite-plan.md +1 -1
  9. package/.claude/skills/ccw-loop/README.md +303 -0
  10. package/.claude/skills/ccw-loop/SKILL.md +259 -0
  11. package/.claude/skills/ccw-loop/phases/actions/action-complete.md +320 -0
  12. package/.claude/skills/ccw-loop/phases/actions/action-debug-with-file.md +485 -0
  13. package/.claude/skills/ccw-loop/phases/actions/action-develop-with-file.md +365 -0
  14. package/.claude/skills/ccw-loop/phases/actions/action-init.md +200 -0
  15. package/.claude/skills/ccw-loop/phases/actions/action-menu.md +192 -0
  16. package/.claude/skills/ccw-loop/phases/actions/action-validate-with-file.md +307 -0
  17. package/.claude/skills/ccw-loop/phases/orchestrator.md +486 -0
  18. package/.claude/skills/ccw-loop/phases/state-schema.md +474 -0
  19. package/.claude/skills/ccw-loop/specs/action-catalog.md +300 -0
  20. package/.claude/skills/ccw-loop/specs/loop-requirements.md +192 -0
  21. package/.claude/skills/ccw-loop/templates/progress-template.md +175 -0
  22. package/.claude/skills/ccw-loop/templates/understanding-template.md +303 -0
  23. package/.claude/skills/ccw-loop/templates/validation-template.md +258 -0
  24. package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +29 -0
  25. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +200 -0
  26. package/.codex/prompts/debug-with-file.md +609 -0
  27. package/ccw/dist/cli.d.ts.map +1 -1
  28. package/ccw/dist/cli.js +8 -1
  29. package/ccw/dist/cli.js.map +1 -1
  30. package/ccw/dist/commands/cli.d.ts.map +1 -1
  31. package/ccw/dist/commands/cli.js +16 -4
  32. package/ccw/dist/commands/cli.js.map +1 -1
  33. package/ccw/dist/commands/issue.d.ts.map +1 -1
  34. package/ccw/dist/commands/issue.js +37 -4
  35. package/ccw/dist/commands/issue.js.map +1 -1
  36. package/ccw/dist/commands/loop.d.ts +10 -0
  37. package/ccw/dist/commands/loop.d.ts.map +1 -0
  38. package/ccw/dist/commands/loop.js +289 -0
  39. package/ccw/dist/commands/loop.js.map +1 -0
  40. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  41. package/ccw/dist/core/dashboard-generator.js +4 -1
  42. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  43. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  44. package/ccw/dist/core/routes/claude-routes.js +5 -3
  45. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  46. package/ccw/dist/core/routes/cli-routes.d.ts +6 -0
  47. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  48. package/ccw/dist/core/routes/cli-routes.js +42 -13
  49. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  50. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -1
  51. package/ccw/dist/core/routes/cli-settings-routes.js +44 -0
  52. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -1
  53. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -1
  54. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +3 -2
  55. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -1
  56. package/ccw/dist/core/routes/core-memory-routes.d.ts.map +1 -1
  57. package/ccw/dist/core/routes/core-memory-routes.js +4 -2
  58. package/ccw/dist/core/routes/core-memory-routes.js.map +1 -1
  59. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  60. package/ccw/dist/core/routes/files-routes.js +4 -2
  61. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  62. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  63. package/ccw/dist/core/routes/hooks-routes.js +3 -0
  64. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  65. package/ccw/dist/core/routes/loop-routes.d.ts +24 -0
  66. package/ccw/dist/core/routes/loop-routes.d.ts.map +1 -0
  67. package/ccw/dist/core/routes/loop-routes.js +334 -0
  68. package/ccw/dist/core/routes/loop-routes.js.map +1 -0
  69. package/ccw/dist/core/routes/loop-v2-routes.d.ts +35 -0
  70. package/ccw/dist/core/routes/loop-v2-routes.d.ts.map +1 -0
  71. package/ccw/dist/core/routes/loop-v2-routes.js +1208 -0
  72. package/ccw/dist/core/routes/loop-v2-routes.js.map +1 -0
  73. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  74. package/ccw/dist/core/routes/memory-routes.js +2 -1
  75. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  76. package/ccw/dist/core/routes/task-routes.d.ts +12 -0
  77. package/ccw/dist/core/routes/task-routes.d.ts.map +1 -0
  78. package/ccw/dist/core/routes/task-routes.js +321 -0
  79. package/ccw/dist/core/routes/task-routes.js.map +1 -0
  80. package/ccw/dist/core/routes/test-loop-routes.d.ts +11 -0
  81. package/ccw/dist/core/routes/test-loop-routes.d.ts.map +1 -0
  82. package/ccw/dist/core/routes/test-loop-routes.js +298 -0
  83. package/ccw/dist/core/routes/test-loop-routes.js.map +1 -0
  84. package/ccw/dist/core/server.d.ts.map +1 -1
  85. package/ccw/dist/core/server.js +43 -3
  86. package/ccw/dist/core/server.js.map +1 -1
  87. package/ccw/dist/core/websocket.d.ts +59 -0
  88. package/ccw/dist/core/websocket.d.ts.map +1 -1
  89. package/ccw/dist/core/websocket.js +34 -0
  90. package/ccw/dist/core/websocket.js.map +1 -1
  91. package/ccw/dist/tools/claude-cli-tools.d.ts +40 -0
  92. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  93. package/ccw/dist/tools/claude-cli-tools.js +119 -0
  94. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  95. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  96. package/ccw/dist/tools/codex-lens.js +66 -47
  97. package/ccw/dist/tools/codex-lens.js.map +1 -1
  98. package/ccw/dist/tools/loop-manager.d.ts +84 -0
  99. package/ccw/dist/tools/loop-manager.d.ts.map +1 -0
  100. package/ccw/dist/tools/loop-manager.js +425 -0
  101. package/ccw/dist/tools/loop-manager.js.map +1 -0
  102. package/ccw/dist/tools/loop-state-manager.d.ts +47 -0
  103. package/ccw/dist/tools/loop-state-manager.d.ts.map +1 -0
  104. package/ccw/dist/tools/loop-state-manager.js +149 -0
  105. package/ccw/dist/tools/loop-state-manager.js.map +1 -0
  106. package/ccw/dist/tools/loop-task-manager.d.ts +138 -0
  107. package/ccw/dist/tools/loop-task-manager.d.ts.map +1 -0
  108. package/ccw/dist/tools/loop-task-manager.js +270 -0
  109. package/ccw/dist/tools/loop-task-manager.js.map +1 -0
  110. package/ccw/dist/types/index.d.ts +1 -0
  111. package/ccw/dist/types/index.d.ts.map +1 -1
  112. package/ccw/dist/types/index.js +1 -0
  113. package/ccw/dist/types/index.js.map +1 -1
  114. package/ccw/dist/types/loop.d.ts +257 -0
  115. package/ccw/dist/types/loop.d.ts.map +1 -0
  116. package/ccw/dist/types/loop.js +17 -0
  117. package/ccw/dist/types/loop.js.map +1 -0
  118. package/ccw/scripts/IMPLEMENTATION-SUMMARY.md +2 -2
  119. package/ccw/scripts/QUICK-REFERENCE.md +1 -1
  120. package/ccw/scripts/README-memory-embedder.md +1 -1
  121. package/ccw/scripts/memory_embedder.py +1 -1
  122. package/ccw/src/cli.ts +9 -1
  123. package/ccw/src/commands/cli.ts +16 -4
  124. package/ccw/src/commands/issue.ts +41 -5
  125. package/ccw/src/commands/loop.ts +344 -0
  126. package/ccw/src/core/dashboard-generator.ts +4 -1
  127. package/ccw/src/core/routes/claude-routes.ts +5 -3
  128. package/ccw/src/core/routes/cli-routes.ts +47 -15
  129. package/ccw/src/core/routes/cli-settings-routes.ts +47 -0
  130. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +3 -2
  131. package/ccw/src/core/routes/core-memory-routes.ts +4 -2
  132. package/ccw/src/core/routes/files-routes.ts +4 -2
  133. package/ccw/src/core/routes/hooks-routes.ts +3 -0
  134. package/ccw/src/core/routes/loop-routes.ts +386 -0
  135. package/ccw/src/core/routes/loop-v2-routes.ts +1412 -0
  136. package/ccw/src/core/routes/memory-routes.ts +2 -1
  137. package/ccw/src/core/routes/task-routes.ts +361 -0
  138. package/ccw/src/core/routes/test-loop-routes.ts +312 -0
  139. package/ccw/src/core/server.ts +44 -3
  140. package/ccw/src/core/websocket.ts +104 -0
  141. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +56 -0
  142. package/ccw/src/templates/dashboard-css/32-issue-manager.css +160 -0
  143. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +57 -2
  144. package/ccw/src/templates/dashboard-css/36-loop-monitor.css +1896 -0
  145. package/ccw/src/templates/dashboard-css/36-loop-monitor.css.backup +1877 -0
  146. package/ccw/src/templates/dashboard-js/components/cli-status.js +64 -3
  147. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +251 -110
  148. package/ccw/src/templates/dashboard-js/components/navigation.js +10 -0
  149. package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
  150. package/ccw/src/templates/dashboard-js/i18n.js +475 -1
  151. package/ccw/src/templates/dashboard-js/views/cli-manager.js +3 -2
  152. package/ccw/src/templates/dashboard-js/views/issue-manager.js +159 -0
  153. package/ccw/src/templates/dashboard-js/views/loop-monitor.js +3244 -0
  154. package/ccw/src/templates/dashboard.html +20 -2
  155. package/ccw/src/tools/claude-cli-tools.ts +143 -0
  156. package/ccw/src/tools/codex-lens.ts +71 -44
  157. package/ccw/src/tools/loop-manager.ts +519 -0
  158. package/ccw/src/tools/loop-state-manager.ts +173 -0
  159. package/ccw/src/tools/loop-task-manager.ts +380 -0
  160. package/ccw/src/types/index.ts +1 -0
  161. package/ccw/src/types/loop.ts +316 -0
  162. package/package.json +1 -1
@@ -0,0 +1,365 @@
1
+ # Action: Develop With File
2
+
3
+ 增量开发任务执行,记录进度到 progress.md,支持 Gemini 辅助实现。
4
+
5
+ ## Purpose
6
+
7
+ 执行开发任务并记录进度,包括:
8
+ - 分析任务需求
9
+ - 使用 Gemini/CLI 实现代码
10
+ - 记录代码变更
11
+ - 更新进度文档
12
+
13
+ ## Preconditions
14
+
15
+ - [ ] state.status === 'running'
16
+ - [ ] state.skill_state !== null
17
+ - [ ] state.skill_state.develop.tasks.some(t => t.status === 'pending')
18
+
19
+ ## Session Setup (Unified Location)
20
+
21
+ ```javascript
22
+ const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
23
+
24
+ // 统一位置: .loop/{loopId}
25
+ const loopId = state.loop_id
26
+ const loopFile = `.loop/${loopId}.json`
27
+ const progressDir = `.loop/${loopId}.progress`
28
+ const progressPath = `${progressDir}/develop.md`
29
+ const changesLogPath = `${progressDir}/changes.log`
30
+ ```
31
+
32
+ ---
33
+
34
+ ## Execution
35
+
36
+ ### Step 0: Check Control Signals (CRITICAL)
37
+
38
+ ```javascript
39
+ /**
40
+ * CRITICAL: 每个 Action 必须在开始时检查控制信号
41
+ * 如果 API 设置了 paused/stopped,Skill 应立即退出
42
+ */
43
+ function checkControlSignals(loopId) {
44
+ const state = JSON.parse(Read(`.loop/${loopId}.json`))
45
+
46
+ switch (state.status) {
47
+ case 'paused':
48
+ console.log('⏸️ Loop paused by API. Exiting action.')
49
+ return { continue: false, reason: 'paused' }
50
+
51
+ case 'failed':
52
+ console.log('⏹️ Loop stopped by API. Exiting action.')
53
+ return { continue: false, reason: 'stopped' }
54
+
55
+ case 'running':
56
+ return { continue: true, reason: 'running' }
57
+
58
+ default:
59
+ return { continue: false, reason: 'unknown_status' }
60
+ }
61
+ }
62
+
63
+ // Execute check
64
+ const control = checkControlSignals(loopId)
65
+ if (!control.continue) {
66
+ return {
67
+ skillStateUpdates: { current_action: null },
68
+ continue: false,
69
+ message: `Action terminated: ${control.reason}`
70
+ }
71
+ }
72
+ ```
73
+
74
+ ### Step 1: 加载任务列表
75
+
76
+ ```javascript
77
+ // 读取任务列表 (从 skill_state)
78
+ let tasks = state.skill_state?.develop?.tasks || []
79
+
80
+ // 如果任务列表为空,询问用户创建
81
+ if (tasks.length === 0) {
82
+ // 使用 Gemini 分析任务描述,生成任务列表
83
+ const analysisPrompt = `
84
+ PURPOSE: 分析开发任务并分解为可执行步骤
85
+ Success: 生成 3-7 个具体、可验证的子任务
86
+
87
+ TASK:
88
+ • 分析任务描述: ${state.task_description}
89
+ • 识别关键功能点
90
+ • 分解为独立子任务
91
+ • 为每个子任务指定工具和模式
92
+
93
+ MODE: analysis
94
+
95
+ CONTEXT: @package.json @src/**/*.ts | Memory: 项目结构
96
+
97
+ EXPECTED:
98
+ JSON 格式:
99
+ {
100
+ "tasks": [
101
+ {
102
+ "id": "task-001",
103
+ "description": "任务描述",
104
+ "tool": "gemini",
105
+ "mode": "write",
106
+ "files": ["src/xxx.ts"]
107
+ }
108
+ ]
109
+ }
110
+ `
111
+
112
+ const result = await Task({
113
+ subagent_type: 'cli-execution-agent',
114
+ run_in_background: false,
115
+ prompt: `Execute Gemini CLI with prompt: ${analysisPrompt}`
116
+ })
117
+
118
+ tasks = JSON.parse(result).tasks
119
+ }
120
+
121
+ // 找到第一个待处理任务
122
+ const currentTask = tasks.find(t => t.status === 'pending')
123
+
124
+ if (!currentTask) {
125
+ return {
126
+ skillStateUpdates: {
127
+ develop: { ...state.skill_state.develop, current_task: null }
128
+ },
129
+ continue: true,
130
+ message: '所有开发任务已完成'
131
+ }
132
+ }
133
+ ```
134
+
135
+ ### Step 2: 执行开发任务
136
+
137
+ ```javascript
138
+ console.log(`\n执行任务: ${currentTask.description}`)
139
+
140
+ // 更新任务状态
141
+ currentTask.status = 'in_progress'
142
+
143
+ // 使用 Gemini 实现
144
+ const implementPrompt = `
145
+ PURPOSE: 实现开发任务
146
+ Task: ${currentTask.description}
147
+ Success criteria: 代码实现完成,测试通过
148
+
149
+ TASK:
150
+ • 分析现有代码结构
151
+ • 实现功能代码
152
+ • 添加必要的类型定义
153
+ • 确保代码风格一致
154
+
155
+ MODE: write
156
+
157
+ CONTEXT: @${currentTask.files?.join(' @') || 'src/**/*.ts'}
158
+
159
+ EXPECTED:
160
+ - 完整的代码实现
161
+ - 代码变更列表
162
+ - 简要实现说明
163
+
164
+ CONSTRAINTS: 遵循现有代码风格 | 不破坏现有功能
165
+ `
166
+
167
+ const implementResult = await Bash({
168
+ command: `ccw cli -p "${implementPrompt}" --tool gemini --mode write --rule development-implement-feature`,
169
+ run_in_background: false
170
+ })
171
+
172
+ // 记录代码变更
173
+ const timestamp = getUtc8ISOString()
174
+ const changeEntry = {
175
+ timestamp,
176
+ task_id: currentTask.id,
177
+ description: currentTask.description,
178
+ files_changed: currentTask.files || [],
179
+ result: 'success'
180
+ }
181
+
182
+ // 追加到 changes.log (NDJSON 格式)
183
+ const changesContent = Read(changesLogPath) || ''
184
+ Write(changesLogPath, changesContent + JSON.stringify(changeEntry) + '\n')
185
+ ```
186
+
187
+ ### Step 3: 更新进度文档
188
+
189
+ ```javascript
190
+ const timestamp = getUtc8ISOString()
191
+ const iteration = state.develop.completed_count + 1
192
+
193
+ // 读取现有进度文档
194
+ let progressContent = Read(progressPath) || ''
195
+
196
+ // 如果是新文档,添加头部
197
+ if (!progressContent) {
198
+ progressContent = `# Development Progress
199
+
200
+ **Session ID**: ${state.session_id}
201
+ **Task**: ${state.task_description}
202
+ **Started**: ${timestamp}
203
+
204
+ ---
205
+
206
+ ## Progress Timeline
207
+
208
+ `
209
+ }
210
+
211
+ // 追加本次进度
212
+ const progressEntry = `
213
+ ### Iteration ${iteration} - ${currentTask.description} (${timestamp})
214
+
215
+ #### Task Details
216
+
217
+ - **ID**: ${currentTask.id}
218
+ - **Tool**: ${currentTask.tool}
219
+ - **Mode**: ${currentTask.mode}
220
+
221
+ #### Implementation Summary
222
+
223
+ ${implementResult.summary || '实现完成'}
224
+
225
+ #### Files Changed
226
+
227
+ ${currentTask.files?.map(f => `- \`${f}\``).join('\n') || '- No files specified'}
228
+
229
+ #### Status: COMPLETED
230
+
231
+ ---
232
+
233
+ `
234
+
235
+ Write(progressPath, progressContent + progressEntry)
236
+
237
+ // 更新任务状态
238
+ currentTask.status = 'completed'
239
+ currentTask.completed_at = timestamp
240
+ ```
241
+
242
+ ### Step 4: 更新任务列表文件
243
+
244
+ ```javascript
245
+ // 更新 tasks.json
246
+ const updatedTasks = tasks.map(t =>
247
+ t.id === currentTask.id ? currentTask : t
248
+ )
249
+
250
+ Write(tasksPath, JSON.stringify(updatedTasks, null, 2))
251
+ ```
252
+
253
+ ## State Updates
254
+
255
+ ```javascript
256
+ return {
257
+ stateUpdates: {
258
+ develop: {
259
+ tasks: updatedTasks,
260
+ current_task_id: null,
261
+ completed_count: state.develop.completed_count + 1,
262
+ total_count: updatedTasks.length,
263
+ last_progress_at: getUtc8ISOString()
264
+ },
265
+ last_action: 'action-develop-with-file'
266
+ },
267
+ continue: true,
268
+ message: `任务完成: ${currentTask.description}\n进度: ${state.develop.completed_count + 1}/${updatedTasks.length}`
269
+ }
270
+ ```
271
+
272
+ ## Error Handling
273
+
274
+ | Error Type | Recovery |
275
+ |------------|----------|
276
+ | Gemini CLI 失败 | 提示用户手动实现,记录到 progress.md |
277
+ | 文件写入失败 | 重试一次,失败则记录错误 |
278
+ | 任务解析失败 | 询问用户手动输入任务 |
279
+
280
+ ## Progress Document Template
281
+
282
+ ```markdown
283
+ # Development Progress
284
+
285
+ **Session ID**: LOOP-xxx-2026-01-22
286
+ **Task**: 实现用户认证功能
287
+ **Started**: 2026-01-22T10:00:00+08:00
288
+
289
+ ---
290
+
291
+ ## Progress Timeline
292
+
293
+ ### Iteration 1 - 分析登录组件 (2026-01-22T10:05:00+08:00)
294
+
295
+ #### Task Details
296
+
297
+ - **ID**: task-001
298
+ - **Tool**: gemini
299
+ - **Mode**: analysis
300
+
301
+ #### Implementation Summary
302
+
303
+ 分析了现有登录组件结构,识别了需要修改的文件和依赖关系。
304
+
305
+ #### Files Changed
306
+
307
+ - `src/components/Login.tsx`
308
+ - `src/hooks/useAuth.ts`
309
+
310
+ #### Status: COMPLETED
311
+
312
+ ---
313
+
314
+ ### Iteration 2 - 实现登录 API (2026-01-22T10:15:00+08:00)
315
+
316
+ ...
317
+
318
+ ---
319
+
320
+ ## Current Statistics
321
+
322
+ | Metric | Value |
323
+ |--------|-------|
324
+ | Total Tasks | 5 |
325
+ | Completed | 2 |
326
+ | In Progress | 1 |
327
+ | Pending | 2 |
328
+ | Progress | 40% |
329
+
330
+ ---
331
+
332
+ ## Next Steps
333
+
334
+ - [ ] 完成剩余任务
335
+ - [ ] 运行测试
336
+ - [ ] 代码审查
337
+ ```
338
+
339
+ ## CLI Integration
340
+
341
+ ### 任务分析
342
+ ```bash
343
+ ccw cli -p "PURPOSE: 分解开发任务为子任务
344
+ TASK: • 分析任务描述 • 识别功能点 • 生成任务列表
345
+ MODE: analysis
346
+ CONTEXT: @package.json @src/**/*
347
+ EXPECTED: JSON 任务列表
348
+ " --tool gemini --mode analysis --rule planning-breakdown-task-steps
349
+ ```
350
+
351
+ ### 代码实现
352
+ ```bash
353
+ ccw cli -p "PURPOSE: 实现功能代码
354
+ TASK: • 分析需求 • 编写代码 • 添加类型
355
+ MODE: write
356
+ CONTEXT: @src/xxx.ts
357
+ EXPECTED: 完整实现
358
+ " --tool gemini --mode write --rule development-implement-feature
359
+ ```
360
+
361
+ ## Next Actions (Hints)
362
+
363
+ - 所有任务完成: `action-debug-with-file` (开始调试)
364
+ - 任务失败: `action-develop-with-file` (重试或下一个任务)
365
+ - 用户选择: `action-menu` (返回菜单)
@@ -0,0 +1,200 @@
1
+ # Action: Initialize
2
+
3
+ 初始化 CCW Loop 会话,创建目录结构和初始状态。
4
+
5
+ ## Purpose
6
+
7
+ - 创建会话目录结构
8
+ - 初始化状态文件
9
+ - 分析任务描述生成初始任务列表
10
+ - 准备执行环境
11
+
12
+ ## Preconditions
13
+
14
+ - [ ] state.status === 'pending'
15
+ - [ ] state.initialized === false
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 taskSlug = state.task_description.toLowerCase().replace(/[^a-z0-9]+/g, '-').substring(0, 30)
25
+ const dateStr = getUtc8ISOString().substring(0, 10)
26
+ const sessionId = `LOOP-${taskSlug}-${dateStr}`
27
+ const sessionFolder = `.workflow/.loop/${sessionId}`
28
+
29
+ Bash(`mkdir -p "${sessionFolder}/develop"`)
30
+ Bash(`mkdir -p "${sessionFolder}/debug"`)
31
+ Bash(`mkdir -p "${sessionFolder}/validate"`)
32
+
33
+ console.log(`Session created: ${sessionId}`)
34
+ console.log(`Location: ${sessionFolder}`)
35
+ ```
36
+
37
+ ### Step 2: 创建元数据文件
38
+
39
+ ```javascript
40
+ const meta = {
41
+ session_id: sessionId,
42
+ task_description: state.task_description,
43
+ created_at: getUtc8ISOString(),
44
+ mode: state.mode || 'interactive'
45
+ }
46
+
47
+ Write(`${sessionFolder}/meta.json`, JSON.stringify(meta, null, 2))
48
+ ```
49
+
50
+ ### Step 3: 分析任务生成开发任务列表
51
+
52
+ ```javascript
53
+ // 使用 Gemini 分析任务描述
54
+ console.log('\n分析任务描述...')
55
+
56
+ const analysisPrompt = `
57
+ PURPOSE: 分析开发任务并分解为可执行步骤
58
+ Success: 生成 3-7 个具体、可验证的子任务
59
+
60
+ TASK:
61
+ • 分析任务描述: ${state.task_description}
62
+ • 识别关键功能点
63
+ • 分解为独立子任务
64
+ • 为每个子任务指定工具和模式
65
+
66
+ MODE: analysis
67
+
68
+ CONTEXT: @package.json @src/**/*.ts (如存在)
69
+
70
+ EXPECTED:
71
+ JSON 格式:
72
+ {
73
+ "tasks": [
74
+ {
75
+ "id": "task-001",
76
+ "description": "任务描述",
77
+ "tool": "gemini",
78
+ "mode": "write",
79
+ "priority": 1
80
+ }
81
+ ],
82
+ "estimated_complexity": "low|medium|high",
83
+ "key_files": ["file1.ts", "file2.ts"]
84
+ }
85
+
86
+ CONSTRAINTS: 生成实际可执行的任务
87
+ `
88
+
89
+ const result = await Bash({
90
+ command: `ccw cli -p "${analysisPrompt}" --tool gemini --mode analysis --rule planning-breakdown-task-steps`,
91
+ run_in_background: false
92
+ })
93
+
94
+ const analysis = JSON.parse(result.stdout)
95
+ const tasks = analysis.tasks.map((t, i) => ({
96
+ ...t,
97
+ id: t.id || `task-${String(i + 1).padStart(3, '0')}`,
98
+ status: 'pending',
99
+ created_at: getUtc8ISOString(),
100
+ completed_at: null,
101
+ files_changed: []
102
+ }))
103
+
104
+ // 保存任务列表
105
+ Write(`${sessionFolder}/develop/tasks.json`, JSON.stringify(tasks, null, 2))
106
+ ```
107
+
108
+ ### Step 4: 初始化进度文档
109
+
110
+ ```javascript
111
+ const progressInitial = `# Development Progress
112
+
113
+ **Session ID**: ${sessionId}
114
+ **Task**: ${state.task_description}
115
+ **Started**: ${getUtc8ISOString()}
116
+ **Estimated Complexity**: ${analysis.estimated_complexity}
117
+
118
+ ---
119
+
120
+ ## Task List
121
+
122
+ ${tasks.map((t, i) => `${i + 1}. [ ] ${t.description}`).join('\n')}
123
+
124
+ ## Key Files
125
+
126
+ ${analysis.key_files?.map(f => `- \`${f}\``).join('\n') || '- To be determined'}
127
+
128
+ ---
129
+
130
+ ## Progress Timeline
131
+
132
+ `
133
+
134
+ Write(`${sessionFolder}/develop/progress.md`, progressInitial)
135
+ ```
136
+
137
+ ### Step 5: 显示初始化结果
138
+
139
+ ```javascript
140
+ console.log(`\n✅ 会话初始化完成`)
141
+ console.log(`\n任务列表 (${tasks.length} 项):`)
142
+ tasks.forEach((t, i) => {
143
+ console.log(` ${i + 1}. ${t.description} [${t.tool}/${t.mode}]`)
144
+ })
145
+ console.log(`\n预估复杂度: ${analysis.estimated_complexity}`)
146
+ console.log(`\n执行 'develop' 开始开发,或 'menu' 查看更多选项`)
147
+ ```
148
+
149
+ ## State Updates
150
+
151
+ ```javascript
152
+ return {
153
+ stateUpdates: {
154
+ session_id: sessionId,
155
+ status: 'running',
156
+ initialized: true,
157
+ develop: {
158
+ tasks: tasks,
159
+ current_task_id: null,
160
+ completed_count: 0,
161
+ total_count: tasks.length,
162
+ last_progress_at: null
163
+ },
164
+ debug: {
165
+ current_bug: null,
166
+ hypotheses: [],
167
+ confirmed_hypothesis: null,
168
+ iteration: 0,
169
+ last_analysis_at: null,
170
+ understanding_updated: false
171
+ },
172
+ validate: {
173
+ test_results: [],
174
+ coverage: null,
175
+ passed: false,
176
+ failed_tests: [],
177
+ last_run_at: null
178
+ },
179
+ context: {
180
+ estimated_complexity: analysis.estimated_complexity,
181
+ key_files: analysis.key_files
182
+ }
183
+ },
184
+ continue: true,
185
+ message: `会话 ${sessionId} 已初始化\n${tasks.length} 个开发任务待执行`
186
+ }
187
+ ```
188
+
189
+ ## Error Handling
190
+
191
+ | Error Type | Recovery |
192
+ |------------|----------|
193
+ | 目录创建失败 | 检查权限,重试 |
194
+ | Gemini 分析失败 | 提示用户手动输入任务 |
195
+ | 任务解析失败 | 使用默认任务列表 |
196
+
197
+ ## Next Actions
198
+
199
+ - 成功: `action-menu` (显示操作菜单) 或 `action-develop-with-file` (直接开始开发)
200
+ - 失败: 报错退出