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.
- package/.claude/commands/workflow/lite-fix.md +108 -9
- 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/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 +14 -1
- package/ccw/dist/commands/cli.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/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/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/src/cli.ts +9 -1
- package/ccw/src/commands/cli.ts +14 -1
- 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/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/33-cli-stream-viewer.css +55 -0
- 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/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/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,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}` 重新打开会话
|