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.
- package/.claude/agents/cli-execution-agent.md +61 -0
- package/.claude/agents/cli-lite-planning-agent.md +322 -36
- package/.claude/agents/issue-plan-agent.md +95 -11
- package/.claude/commands/cli/codex-review.md +8 -2
- package/.claude/commands/issue/plan.md +20 -6
- package/.claude/commands/workflow/lite-execute.md +56 -16
- package/.claude/commands/workflow/lite-fix.md +108 -9
- package/.claude/commands/workflow/lite-plan.md +1 -1
- package/.claude/skills/ccw-loop/README.md +303 -0
- package/.claude/skills/ccw-loop/SKILL.md +259 -0
- package/.claude/skills/ccw-loop/phases/actions/action-complete.md +320 -0
- package/.claude/skills/ccw-loop/phases/actions/action-debug-with-file.md +485 -0
- package/.claude/skills/ccw-loop/phases/actions/action-develop-with-file.md +365 -0
- package/.claude/skills/ccw-loop/phases/actions/action-init.md +200 -0
- package/.claude/skills/ccw-loop/phases/actions/action-menu.md +192 -0
- package/.claude/skills/ccw-loop/phases/actions/action-validate-with-file.md +307 -0
- package/.claude/skills/ccw-loop/phases/orchestrator.md +486 -0
- package/.claude/skills/ccw-loop/phases/state-schema.md +474 -0
- package/.claude/skills/ccw-loop/specs/action-catalog.md +300 -0
- package/.claude/skills/ccw-loop/specs/loop-requirements.md +192 -0
- package/.claude/skills/ccw-loop/templates/progress-template.md +175 -0
- package/.claude/skills/ccw-loop/templates/understanding-template.md +303 -0
- package/.claude/skills/ccw-loop/templates/validation-template.md +258 -0
- package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +29 -0
- package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +200 -0
- package/.codex/prompts/debug-with-file.md +609 -0
- package/ccw/dist/cli.d.ts.map +1 -1
- package/ccw/dist/cli.js +8 -1
- package/ccw/dist/cli.js.map +1 -1
- package/ccw/dist/commands/cli.d.ts.map +1 -1
- package/ccw/dist/commands/cli.js +16 -4
- package/ccw/dist/commands/cli.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts.map +1 -1
- package/ccw/dist/commands/issue.js +37 -4
- package/ccw/dist/commands/issue.js.map +1 -1
- package/ccw/dist/commands/loop.d.ts +10 -0
- package/ccw/dist/commands/loop.d.ts.map +1 -0
- package/ccw/dist/commands/loop.js +289 -0
- package/ccw/dist/commands/loop.js.map +1 -0
- package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
- package/ccw/dist/core/dashboard-generator.js +4 -1
- package/ccw/dist/core/dashboard-generator.js.map +1 -1
- package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/claude-routes.js +5 -3
- package/ccw/dist/core/routes/claude-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts +6 -0
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +42 -13
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-settings-routes.js +44 -0
- package/ccw/dist/core/routes/cli-settings-routes.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 +3 -2
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -1
- package/ccw/dist/core/routes/core-memory-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/core-memory-routes.js +4 -2
- package/ccw/dist/core/routes/core-memory-routes.js.map +1 -1
- package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/files-routes.js +4 -2
- package/ccw/dist/core/routes/files-routes.js.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.js +3 -0
- package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
- package/ccw/dist/core/routes/loop-routes.d.ts +24 -0
- package/ccw/dist/core/routes/loop-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/loop-routes.js +334 -0
- package/ccw/dist/core/routes/loop-routes.js.map +1 -0
- package/ccw/dist/core/routes/loop-v2-routes.d.ts +35 -0
- package/ccw/dist/core/routes/loop-v2-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/loop-v2-routes.js +1208 -0
- package/ccw/dist/core/routes/loop-v2-routes.js.map +1 -0
- package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/memory-routes.js +2 -1
- package/ccw/dist/core/routes/memory-routes.js.map +1 -1
- package/ccw/dist/core/routes/task-routes.d.ts +12 -0
- package/ccw/dist/core/routes/task-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/task-routes.js +321 -0
- package/ccw/dist/core/routes/task-routes.js.map +1 -0
- package/ccw/dist/core/routes/test-loop-routes.d.ts +11 -0
- package/ccw/dist/core/routes/test-loop-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/test-loop-routes.js +298 -0
- package/ccw/dist/core/routes/test-loop-routes.js.map +1 -0
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +43 -3
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/core/websocket.d.ts +59 -0
- package/ccw/dist/core/websocket.d.ts.map +1 -1
- package/ccw/dist/core/websocket.js +34 -0
- package/ccw/dist/core/websocket.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts +40 -0
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +119 -0
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
- package/ccw/dist/tools/codex-lens.js +66 -47
- package/ccw/dist/tools/codex-lens.js.map +1 -1
- package/ccw/dist/tools/loop-manager.d.ts +84 -0
- package/ccw/dist/tools/loop-manager.d.ts.map +1 -0
- package/ccw/dist/tools/loop-manager.js +425 -0
- package/ccw/dist/tools/loop-manager.js.map +1 -0
- package/ccw/dist/tools/loop-state-manager.d.ts +47 -0
- package/ccw/dist/tools/loop-state-manager.d.ts.map +1 -0
- package/ccw/dist/tools/loop-state-manager.js +149 -0
- package/ccw/dist/tools/loop-state-manager.js.map +1 -0
- package/ccw/dist/tools/loop-task-manager.d.ts +138 -0
- package/ccw/dist/tools/loop-task-manager.d.ts.map +1 -0
- package/ccw/dist/tools/loop-task-manager.js +270 -0
- package/ccw/dist/tools/loop-task-manager.js.map +1 -0
- package/ccw/dist/types/index.d.ts +1 -0
- package/ccw/dist/types/index.d.ts.map +1 -1
- package/ccw/dist/types/index.js +1 -0
- package/ccw/dist/types/index.js.map +1 -1
- package/ccw/dist/types/loop.d.ts +257 -0
- package/ccw/dist/types/loop.d.ts.map +1 -0
- package/ccw/dist/types/loop.js +17 -0
- package/ccw/dist/types/loop.js.map +1 -0
- package/ccw/scripts/IMPLEMENTATION-SUMMARY.md +2 -2
- package/ccw/scripts/QUICK-REFERENCE.md +1 -1
- package/ccw/scripts/README-memory-embedder.md +1 -1
- package/ccw/scripts/memory_embedder.py +1 -1
- package/ccw/src/cli.ts +9 -1
- package/ccw/src/commands/cli.ts +16 -4
- package/ccw/src/commands/issue.ts +41 -5
- package/ccw/src/commands/loop.ts +344 -0
- package/ccw/src/core/dashboard-generator.ts +4 -1
- package/ccw/src/core/routes/claude-routes.ts +5 -3
- package/ccw/src/core/routes/cli-routes.ts +47 -15
- package/ccw/src/core/routes/cli-settings-routes.ts +47 -0
- package/ccw/src/core/routes/codexlens/semantic-handlers.ts +3 -2
- package/ccw/src/core/routes/core-memory-routes.ts +4 -2
- package/ccw/src/core/routes/files-routes.ts +4 -2
- package/ccw/src/core/routes/hooks-routes.ts +3 -0
- package/ccw/src/core/routes/loop-routes.ts +386 -0
- package/ccw/src/core/routes/loop-v2-routes.ts +1412 -0
- package/ccw/src/core/routes/memory-routes.ts +2 -1
- package/ccw/src/core/routes/task-routes.ts +361 -0
- package/ccw/src/core/routes/test-loop-routes.ts +312 -0
- package/ccw/src/core/server.ts +44 -3
- package/ccw/src/core/websocket.ts +104 -0
- package/ccw/src/templates/dashboard-css/12-cli-legacy.css +56 -0
- package/ccw/src/templates/dashboard-css/32-issue-manager.css +160 -0
- package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +57 -2
- package/ccw/src/templates/dashboard-css/36-loop-monitor.css +1896 -0
- package/ccw/src/templates/dashboard-css/36-loop-monitor.css.backup +1877 -0
- package/ccw/src/templates/dashboard-js/components/cli-status.js +64 -3
- package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +251 -110
- package/ccw/src/templates/dashboard-js/components/navigation.js +10 -0
- package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
- package/ccw/src/templates/dashboard-js/i18n.js +475 -1
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +3 -2
- package/ccw/src/templates/dashboard-js/views/issue-manager.js +159 -0
- package/ccw/src/templates/dashboard-js/views/loop-monitor.js +3244 -0
- package/ccw/src/templates/dashboard.html +20 -2
- package/ccw/src/tools/claude-cli-tools.ts +143 -0
- package/ccw/src/tools/codex-lens.ts +71 -44
- package/ccw/src/tools/loop-manager.ts +519 -0
- package/ccw/src/tools/loop-state-manager.ts +173 -0
- package/ccw/src/tools/loop-task-manager.ts +380 -0
- package/ccw/src/types/index.ts +1 -0
- package/ccw/src/types/loop.ts +316 -0
- 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
|
+
- 失败: 报错退出
|