@specpow/framework 0.5.10 → 0.5.11
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/CHANGELOG.md +623 -623
- package/LICENSE +21 -21
- package/bin/specpow.js +9 -9
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +12 -11
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +6 -3
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +5 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +29 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +5 -2
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/explore.d.ts.map +1 -1
- package/dist/commands/explore.js +8 -10
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/propose.d.ts.map +1 -1
- package/dist/commands/propose.js +4 -3
- package/dist/commands/propose.js.map +1 -1
- package/dist/commands/schema.d.ts.map +1 -1
- package/dist/commands/schema.js +5 -2
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +5 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/store.d.ts.map +1 -1
- package/dist/commands/store.js +8 -6
- package/dist/commands/store.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +3 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate-specs.d.ts.map +1 -1
- package/dist/commands/validate-specs.js +8 -5
- package/dist/commands/validate-specs.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +5 -2
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/workflow/index.d.ts.map +1 -1
- package/dist/commands/workflow/index.js +13 -8
- package/dist/commands/workflow/index.js.map +1 -1
- package/dist/core/archive/engine.d.ts.map +1 -1
- package/dist/core/archive/engine.js +10 -6
- package/dist/core/archive/engine.js.map +1 -1
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
- package/dist/core/artifact-graph/resolver.js +5 -2
- package/dist/core/artifact-graph/resolver.js.map +1 -1
- package/dist/core/config/config-schema.d.ts +104 -0
- package/dist/core/config/config-schema.d.ts.map +1 -1
- package/dist/core/config/config-schema.js +15 -1
- package/dist/core/config/config-schema.js.map +1 -1
- package/dist/core/hooks/session-start-hook.d.ts.map +1 -1
- package/dist/core/hooks/session-start-hook.js +50 -45
- package/dist/core/hooks/session-start-hook.js.map +1 -1
- package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -1
- package/dist/core/hooks/workflow-state-hook.js +3 -1
- package/dist/core/hooks/workflow-state-hook.js.map +1 -1
- package/dist/core/init/engine.d.ts.map +1 -1
- package/dist/core/init/engine.js +15 -12
- package/dist/core/init/engine.js.map +1 -1
- package/dist/core/memory/adapters/sqlite-adapter.js +55 -55
- package/dist/core/migration/index.d.ts.map +1 -1
- package/dist/core/migration/index.js +128 -4
- package/dist/core/migration/index.js.map +1 -1
- package/dist/core/store/index.d.ts +4 -3
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/index.js +7 -7
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/templates/index.d.ts +1 -1
- package/dist/core/templates/index.d.ts.map +1 -1
- package/dist/core/templates/index.js +11 -6
- package/dist/core/templates/index.js.map +1 -1
- package/dist/core/workflow-state.d.ts +1 -1
- package/dist/core/workflow-state.d.ts.map +1 -1
- package/dist/core/workflow-state.js +10 -5
- package/dist/core/workflow-state.js.map +1 -1
- package/dist/templates/claude-commands/specpow-apply.md +23 -23
- package/dist/templates/claude-commands/specpow-archive.md +22 -22
- package/dist/templates/claude-commands/specpow-propose.md +27 -27
- package/dist/templates/claude-commands/specpow-status.md +22 -22
- package/dist/templates/claude-commands/specpow-validate-specs.md +28 -28
- package/dist/templates/claude-commands/specpow-verify.md +21 -21
- package/dist/templates/claude-commands/specpow.md +34 -34
- package/package.json +121 -122
- package/.specpow/skills/business-code-review/SKILL.md +0 -78
- package/.specpow/skills/business-db-design/SKILL.md +0 -74
- package/.specpow/skills/business-deploy-check/SKILL.md +0 -72
- package/.specpow/skills/business-doc-sync/SKILL.md +0 -72
- package/.specpow/skills/business-java-codegen/SKILL.md +0 -97
- package/.specpow/skills/business-menu-register/SKILL.md +0 -63
- package/.specpow/skills/business-prd-writer/SKILL.md +0 -80
- package/.specpow/skills/business-test-gen/SKILL.md +0 -82
- package/.specpow/skills/business-ui-codegen/SKILL.md +0 -104
- package/.specpow/skills/cli-router/SKILL.md +0 -107
- package/.specpow/skills/execution-finish-branch/SKILL.md +0 -58
- package/.specpow/skills/execution-git-worktrees/SKILL.md +0 -48
- package/.specpow/skills/execution-parallel-agents/SKILL.md +0 -46
- package/.specpow/skills/execution-receiving-review/SKILL.md +0 -47
- package/.specpow/skills/execution-requesting-review/SKILL.md +0 -51
- package/.specpow/skills/execution-sdd-orchestrator/SKILL.md +0 -366
- package/.specpow/skills/execution-subagent-dispatch/SKILL.md +0 -295
- package/.specpow/skills/execution-subagent-driven-dev/SKILL.md +0 -143
- package/.specpow/skills/execution-systematic-debugging/SKILL.md +0 -95
- package/.specpow/skills/execution-tdd/SKILL.md +0 -74
- package/.specpow/skills/execution-verification-before-completion/SKILL.md +0 -75
- package/.specpow/skills/meta-create-skill/SKILL.md +0 -374
- package/.specpow/skills/meta-using-skills/SKILL.md +0 -97
- package/.specpow/skills/meta-writing-skills/SKILL.md +0 -66
- package/.specpow/skills/planning-apply-change/SKILL.md +0 -194
- package/.specpow/skills/planning-archive-change/SKILL.md +0 -53
- package/.specpow/skills/planning-explore/SKILL.md +0 -99
- package/.specpow/skills/planning-onboard/SKILL.md +0 -60
- package/.specpow/skills/planning-propose/SKILL.md +0 -156
- package/.specpow/skills/planning-update-change/SKILL.md +0 -45
- package/.specpow/skills/planning-verify-change/SKILL.md +0 -72
- package/.specpow/skills/planning-write-design/SKILL.md +0 -59
- package/.specpow/skills/planning-write-plans/SKILL.md +0 -55
- package/.specpow/skills/planning-write-specs/SKILL.md +0 -73
- package/.specpow/skills/using-specpow/SKILL.md +0 -232
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: execution-sdd-orchestrator
|
|
3
|
-
description: SDD 编排技能。将 controller.ts 的 implement→review→fix 循环转化为宿主 Agent 可执行的指令。当执行 specpow apply 或用户要求实现变更时使用。
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
trigger: on-demand
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# SDD 编排技能
|
|
9
|
-
|
|
10
|
-
当执行 `specpow apply` 或用户要求实现变更时,按以下流程执行。
|
|
11
|
-
|
|
12
|
-
## 前置条件
|
|
13
|
-
|
|
14
|
-
- 变更提案已完成:`.specpow/openspec/changes/{change}/` 存在
|
|
15
|
-
- 任务清单已生成:`.specpow/openspec/changes/{change}/task-manifest.json`(Host-Driven 模式由 `apply.ts` 生成)
|
|
16
|
-
- Ledger 位置:`.specpow/sdd/{change}/progress.md`
|
|
17
|
-
|
|
18
|
-
## 执行流程
|
|
19
|
-
|
|
20
|
-
### 步骤 1:初始化
|
|
21
|
-
|
|
22
|
-
1. 读取 Ledger(`progress.md`),检查是否有已完成的任务(断点续跑)
|
|
23
|
-
2. 读取任务清单:`.specpow/openspec/changes/{change}/task-manifest.json`(包含增强描述和 specConstraints)
|
|
24
|
-
3. 记录 BASE commit:`git rev-parse HEAD`
|
|
25
|
-
|
|
26
|
-
### 步骤 2:逐任务执行
|
|
27
|
-
|
|
28
|
-
对每个未完成任务:
|
|
29
|
-
|
|
30
|
-
#### 2a. 创建 Brief
|
|
31
|
-
|
|
32
|
-
读取任务信息,创建 brief 文件:
|
|
33
|
-
- **路径**:`.specpow/sdd/{change}/task-{N}-brief.md`
|
|
34
|
-
- **内容**:
|
|
35
|
-
```markdown
|
|
36
|
-
# Task {N}: {title}
|
|
37
|
-
|
|
38
|
-
## 描述
|
|
39
|
-
{description}
|
|
40
|
-
|
|
41
|
-
## 涉及文件
|
|
42
|
-
{files list}
|
|
43
|
-
|
|
44
|
-
## Spec 约束
|
|
45
|
-
{spec constraints from specs/ directory}
|
|
46
|
-
|
|
47
|
-
## 输出要求
|
|
48
|
-
完成后写 Report JSON 到:`.specpow/sdd/{change}/task-{N}-report.md`
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
#### 2b. 派发实现者子代理
|
|
52
|
-
|
|
53
|
-
使用宿主原生 subagent 工具派发:
|
|
54
|
-
- **Prompt**:读取 brief 文件 + TDD 指令 + spec 约束
|
|
55
|
-
- **模型选择**(参考,可根据实际情况调整):
|
|
56
|
-
- ≤2 文件 + 完整 spec → `cheap`(haiku)
|
|
57
|
-
- 多文件协调 → `standard`(sonnet)
|
|
58
|
-
- 需要架构判断 → `capable`(opus)
|
|
59
|
-
- **指令**:
|
|
60
|
-
1. 读取 brief 文件
|
|
61
|
-
2. TDD 流程:RED → GREEN → REFACTOR
|
|
62
|
-
3. 遵守 spec 约束
|
|
63
|
-
4. 完成后写 Report JSON 到 reportPath
|
|
64
|
-
|
|
65
|
-
#### 2c. 检查 Report
|
|
66
|
-
|
|
67
|
-
读取 `.specpow/sdd/{change}/task-{N}-report.md`,解析 JSON:
|
|
68
|
-
```json
|
|
69
|
-
{
|
|
70
|
-
"status": "done|blocked|in_progress|done_with_concerns|needs_context",
|
|
71
|
-
"commits": ["sha1", "sha2"],
|
|
72
|
-
"testSummary": "X tests passed",
|
|
73
|
-
"concerns": "any issues or null",
|
|
74
|
-
"fixReport": "修复说明(仅 fix 轮次)"
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
- `status === 'blocked'` → 记录到 Ledger:`Task {N}: BLOCKED — {concerns}`,跳过此任务
|
|
79
|
-
- `status === 'done'` → 继续审查
|
|
80
|
-
|
|
81
|
-
#### 2d. 生成审查包
|
|
82
|
-
|
|
83
|
-
运行 `git diff` 生成变更摘要:
|
|
84
|
-
```bash
|
|
85
|
-
BASE_COMMIT={recorded base commit}
|
|
86
|
-
HEAD_COMMIT=$(git rev-parse HEAD)
|
|
87
|
-
git diff ${BASE_COMMIT}..${HEAD_COMMIT} > .specpow/sdd/{change}/review-package.md
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
#### 2e. 派发审查者子代理
|
|
91
|
-
|
|
92
|
-
使用宿主原生 subagent 工具派发:
|
|
93
|
-
- **Prompt**:brief + review package + spec 约束
|
|
94
|
-
- **指令**:
|
|
95
|
-
1. 读取 brief 文件
|
|
96
|
-
2. 读取 review package(diff)
|
|
97
|
-
3. 两阶段审查:
|
|
98
|
-
- **阶段 A:Spec 合规性** — 实现是否满足 spec 要求
|
|
99
|
-
- **阶段 B:代码质量** — bug、安全问题、性能问题
|
|
100
|
-
- **阶段 C:TDD 合规** — 测试是否充分
|
|
101
|
-
4. 输出 Review JSON 到 `.specpow/sdd/{change}/review-result.json`:
|
|
102
|
-
```json
|
|
103
|
-
{
|
|
104
|
-
"specCompliant": true/false,
|
|
105
|
-
"qualityApproved": true/false,
|
|
106
|
-
"findings": [
|
|
107
|
-
{
|
|
108
|
-
"id": "F1",
|
|
109
|
-
"severity": "critical|important|minor",
|
|
110
|
-
"description": "...",
|
|
111
|
-
"file": "src/foo.ts",
|
|
112
|
-
"line": 42,
|
|
113
|
-
"isLoadBearing": false
|
|
114
|
-
}
|
|
115
|
-
],
|
|
116
|
-
"cannotVerify": ["..."]
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
**注意**:初始审查不输出 `addressed` 字段(由重审者在修复循环中填充)。
|
|
120
|
-
|
|
121
|
-
#### 2f. 运行测试
|
|
122
|
-
|
|
123
|
-
执行项目测试:
|
|
124
|
-
```bash
|
|
125
|
-
# 检测包管理器并运行测试
|
|
126
|
-
if [ -f pnpm-lock.yaml ]; then
|
|
127
|
-
pnpm test --silent
|
|
128
|
-
elif [ -f yarn.lock ]; then
|
|
129
|
-
yarn test --silent
|
|
130
|
-
else
|
|
131
|
-
npm test --silent
|
|
132
|
-
fi
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
记录测试结果:通过/失败。
|
|
136
|
-
|
|
137
|
-
#### 2g. 分析审查结果
|
|
138
|
-
|
|
139
|
-
读取 review JSON,判定:
|
|
140
|
-
- `specCompliant === true && qualityApproved === true && tests passed` → **PASS**
|
|
141
|
-
- 记录到 Ledger:`Task {N}: complete (commits {BASE}..{HEAD}, review clean)`
|
|
142
|
-
- 进入下一任务
|
|
143
|
-
- `findings.length > 0 || tests failed` → **需要修复**,进入修复循环
|
|
144
|
-
|
|
145
|
-
### 步骤 3:修复循环(最多 5 轮)
|
|
146
|
-
|
|
147
|
-
每轮:
|
|
148
|
-
|
|
149
|
-
1. **派发实现者修复(复用原始 brief)**
|
|
150
|
-
- Brief 路径不变:`.specpow/sdd/{change}/task-{N}-brief.md`(不修改 brief 文件)
|
|
151
|
-
- Open findings 通过指令传递给实现者,不写入 brief 文件
|
|
152
|
-
- **模型升级**:第 4-5 轮使用比当前高一级模型
|
|
153
|
-
- **指令**:修复 findings → 写 Report JSON 到 `task-{N}-report.md.fix-{R}`
|
|
154
|
-
|
|
155
|
-
2. **生成修复 diff**
|
|
156
|
-
```bash
|
|
157
|
-
FIX_BASE=$(git rev-parse HEAD)
|
|
158
|
-
# 实现者修复后...
|
|
159
|
-
FIX_HEAD=$(git rev-parse HEAD)
|
|
160
|
-
git diff ${FIX_BASE}..${FIX_HEAD} > .specpow/sdd/{change}/review-package.md
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
3. **派发重审者(范围限定)**
|
|
164
|
-
- **只审查修复部分**,不重新审查整个任务
|
|
165
|
-
- **指令**:对每个 finding 判定 `addressed: true/false`
|
|
166
|
-
- 输出更新后的 review JSON 到 `.specpow/sdd/{change}/re-review-result.json`
|
|
167
|
-
|
|
168
|
-
4. **运行测试**
|
|
169
|
-
|
|
170
|
-
5. **分析结果**
|
|
171
|
-
- 所有 findings addressed + tests passed → **PASS**
|
|
172
|
-
- 仍有 open findings → 继续下一轮
|
|
173
|
-
|
|
174
|
-
6. **记录到 Ledger**
|
|
175
|
-
```
|
|
176
|
-
Task {N}: fix round {R}/5 ({A} addressed, {O} open — {finding1_summary}; {finding2_summary}; commits {BASE}..{HEAD})
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
**断路器**:5 轮后仍未通过 → 对每个 finding 判定:
|
|
180
|
-
- `isLoadBearing === false` → **park**(延后,记录到 Ledger)
|
|
181
|
-
- `isLoadBearing === true` → **block**(阻塞,任务标记为 BLOCKED)
|
|
182
|
-
|
|
183
|
-
### 步骤 4:完成
|
|
184
|
-
|
|
185
|
-
所有任务完成后,输出总结:
|
|
186
|
-
```
|
|
187
|
-
✅ SDD 执行完成
|
|
188
|
-
- 完成任务:X/Y
|
|
189
|
-
- 阻塞任务:Z
|
|
190
|
-
- 停放发现:N(已记录到 Ledger)
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
## 并行执行模式
|
|
194
|
-
|
|
195
|
-
当用户指定 `--parallel` 或任务数量 ≥ 3 且无强依赖时,可启用并行执行。
|
|
196
|
-
|
|
197
|
-
### 前置条件
|
|
198
|
-
|
|
199
|
-
- 任务清单已读取
|
|
200
|
-
- 依赖分析完成(参考 `buildParallelLayers` 逻辑)
|
|
201
|
-
|
|
202
|
-
### 执行流程
|
|
203
|
-
|
|
204
|
-
#### 1. 依赖分析与分层
|
|
205
|
-
|
|
206
|
-
分析任务依赖关系,构建并行层:
|
|
207
|
-
- **文件级依赖**:多个任务修改同一文件 → 顺序执行
|
|
208
|
-
- **逻辑级依赖**:tasks.md 中显式声明的依赖
|
|
209
|
-
- **分层结果**:每层内的任务彼此独立,可并行执行
|
|
210
|
-
|
|
211
|
-
```
|
|
212
|
-
示例:
|
|
213
|
-
- 层 1: [T1, T2, T3] — 无依赖,可并行
|
|
214
|
-
- 层 2: [T4] — 依赖 T1 的输出
|
|
215
|
-
- 层 3: [T5, T6] — 无依赖,可并行
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
#### 2. 逐层并行执行
|
|
219
|
-
|
|
220
|
-
对每一层:
|
|
221
|
-
|
|
222
|
-
##### 2a. 为每个任务创建 Git Worktree
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
# 为每个任务创建独立 worktree
|
|
226
|
-
BASE_COMMIT=$(git rev-parse HEAD)
|
|
227
|
-
BRANCH_NAME="specpow-parallel-{TASK_NUM}-{TIMESTAMP}"
|
|
228
|
-
WORKTREE_PATH=".specpow/sdd/{change}/.worktrees/task-{TASK_NUM}"
|
|
229
|
-
|
|
230
|
-
git worktree add -b "$BRANCH_NAME" "$WORKTREE_PATH" "$BASE_COMMIT"
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
**关键**:
|
|
234
|
-
- 每个任务在独立的 worktree 中工作,消除并行竞态
|
|
235
|
-
- worktree 拥有独立的 HEAD 和工作目录
|
|
236
|
-
- 所有文件编辑和 git 操作必须在 worktree 中执行
|
|
237
|
-
|
|
238
|
-
##### 2b. 并行派发实现者子代理
|
|
239
|
-
|
|
240
|
-
使用宿主原生 subagent 工具**同时**派发多个实现者:
|
|
241
|
-
|
|
242
|
-
```
|
|
243
|
-
对层内的每个任务:
|
|
244
|
-
派发子代理(isolation: "worktree"):
|
|
245
|
-
- prompt: 读取 brief + TDD 指令 + spec 约束
|
|
246
|
-
- 指令:在 worktree 中工作,完成后写 report
|
|
247
|
-
- 模型选择:参考串行模式的模型选择表
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
**并行派发示例**(Claude Code):
|
|
251
|
-
```
|
|
252
|
-
同时发起多个 Agent 调用:
|
|
253
|
-
- Agent 1: "Task 1 in worktree .specpow/sdd/{change}/.worktrees/task-1"
|
|
254
|
-
- Agent 2: "Task 2 in worktree .specpow/sdd/{change}/.worktrees/task-2"
|
|
255
|
-
- Agent 3: "Task 3 in worktree .specpow/sdd/{change}/.worktrees/task-3"
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
##### 2c. 等待所有子代理完成
|
|
259
|
-
|
|
260
|
-
所有子代理完成后,检查各自的 report 文件。
|
|
261
|
-
|
|
262
|
-
##### 2d. 顺序合并分支
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
# 按任务编号顺序合并
|
|
266
|
-
for TASK_NUM in 1 2 3; do
|
|
267
|
-
BRANCH="specpow-parallel-${TASK_NUM}-xxx"
|
|
268
|
-
git merge "$BRANCH" --no-edit
|
|
269
|
-
|
|
270
|
-
# 检查冲突
|
|
271
|
-
if [ $? -ne 0 ]; then
|
|
272
|
-
echo "冲突:任务 $TASK_NUM 合并失败"
|
|
273
|
-
# 记录到 Ledger
|
|
274
|
-
fi
|
|
275
|
-
done
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
##### 2e. 冲突检测
|
|
279
|
-
|
|
280
|
-
检查哪些文件被多个任务修改:
|
|
281
|
-
```bash
|
|
282
|
-
# 对每个完成的任务,获取变更文件列表
|
|
283
|
-
for TASK_NUM in 1 2 3; do
|
|
284
|
-
git diff --name-only "$BASE_COMMIT".."$HEAD_COMMIT"
|
|
285
|
-
done
|
|
286
|
-
|
|
287
|
-
# 如果同一文件出现在多个任务的变更列表中 → 冲突
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
##### 2f. 清理 Worktree
|
|
291
|
-
|
|
292
|
-
```bash
|
|
293
|
-
# 删除 worktree 和分支
|
|
294
|
-
git worktree remove ".specpow/sdd/{change}/.worktrees/task-{TASK_NUM}" --force
|
|
295
|
-
git branch -D "specpow-parallel-{TASK_NUM}-xxx"
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
##### 2g. 运行集成测试
|
|
299
|
-
|
|
300
|
-
所有任务合并后,运行完整测试套件:
|
|
301
|
-
```bash
|
|
302
|
-
pnpm test --silent
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
##### 2h. 记录到 Ledger
|
|
306
|
-
|
|
307
|
-
```
|
|
308
|
-
Layer {L}: complete ({N} tasks merged, {C} conflicts detected)
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
#### 3. 层间串行
|
|
312
|
-
|
|
313
|
-
前一层合并完成后,才开始下一层。这确保了依赖关系的正确性。
|
|
314
|
-
|
|
315
|
-
### 并行执行的注意事项
|
|
316
|
-
|
|
317
|
-
1. **绝不并行修改同一文件** — 依赖分析必须准确
|
|
318
|
-
2. **合并后必须运行完整测试** — 并行执行可能引入集成问题
|
|
319
|
-
3. **冲突是并行代价** — 显式报告冲突,而非静默丢失
|
|
320
|
-
4. **Worktree 清理必须彻底** — 即使任务失败也要清理
|
|
321
|
-
5. **断路器保护** — 如果一层中有 ≥ 50% 任务失败,停止后续层
|
|
322
|
-
|
|
323
|
-
### 何时使用并行模式
|
|
324
|
-
|
|
325
|
-
| 场景 | 推荐模式 |
|
|
326
|
-
|------|----------|
|
|
327
|
-
| 3+ 个独立任务,无文件重叠 | 并行 |
|
|
328
|
-
| 任务间有强依赖 | 串行 |
|
|
329
|
-
| CI/CD 自动化 | 并行(节省时间) |
|
|
330
|
-
| 交互式开发,需要实时反馈 | 串行(更易调试) |
|
|
331
|
-
| 多文件非依赖变更 | 并行 |
|
|
332
|
-
|
|
333
|
-
## Ledger 记录格式
|
|
334
|
-
|
|
335
|
-
每完成一个操作,**追加一行**到 `.specpow/sdd/{change}/progress.md`。
|
|
336
|
-
格式为**扁平日志行**(不是结构化 markdown),ledger.ts 用正则解析这些行。
|
|
337
|
-
|
|
338
|
-
首行固定为:
|
|
339
|
-
```
|
|
340
|
-
# SDD ledger — plan: {planFile}
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
后续追加的日志行格式:
|
|
344
|
-
|
|
345
|
-
```
|
|
346
|
-
Task {N}: complete (commits {BASE}..{HEAD}, review clean)
|
|
347
|
-
Task {N}: complete (commits {BASE}..{HEAD}, review with parked)
|
|
348
|
-
Task {N}: fix round {R}/{MAX} ({A} addressed, {O} open — {summary1}; {summary2}; commits {RANGE})
|
|
349
|
-
Task {N}: BLOCKED — {reason}
|
|
350
|
-
Task {N}: parked — {description} — ruling: {ruling}
|
|
351
|
-
Task {N}: minor (deferred): {description}
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
**注意**:
|
|
355
|
-
- 每行独立,不分组、不嵌套
|
|
356
|
-
- `review clean` 表示审查通过无停放;`review with parked` 表示有停放发现
|
|
357
|
-
- fix round 行中的 summaries 用分号分隔,每个 summary 对应一个 open finding 的描述
|
|
358
|
-
- `{MAX}` 来自配置 `sdd.maxFixRounds`(默认 5)
|
|
359
|
-
|
|
360
|
-
## 关键原则
|
|
361
|
-
|
|
362
|
-
1. **文件即接口** — 所有产物通过文件传递,不占用上下文
|
|
363
|
-
2. **信任 Ledger** — 断点续跑时读取 Ledger,不信任记忆
|
|
364
|
-
3. **模型升级** — 修复轮次 4-5 升级模型,避免卡死
|
|
365
|
-
4. **范围限定重审** — 修复后只审查修复部分,提高效率
|
|
366
|
-
5. **断路器保护** — 5 轮后强制判定,避免无限循环
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: execution-subagent-dispatch
|
|
3
|
-
description: 子代理派发技能。将 ai-caller.ts 的三种 prompt 模板(实现者、审查者、重审者)转化为宿主 Agent 可执行的指令。当需要派发子代理执行具体任务时使用。
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
trigger: on-demand
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# 子代理派发技能
|
|
9
|
-
|
|
10
|
-
当需要派发子代理执行实现、审查或重审任务时,按以下模板构建指令。
|
|
11
|
-
|
|
12
|
-
## 核心原则
|
|
13
|
-
|
|
14
|
-
1. **文件即接口** — 告诉子代理去哪里读文件,不在 prompt 中粘贴大段内容
|
|
15
|
-
2. **新鲜上下文** — 每个子代理只获得它需要的文件路径,不继承历史对话
|
|
16
|
-
3. **输出到文件** — 所有结果写入指定文件,不通过对话返回
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 实现者子代理 Prompt 模板
|
|
21
|
-
|
|
22
|
-
派发实现者时,给子代理的指令应包含以下部分:
|
|
23
|
-
|
|
24
|
-
```markdown
|
|
25
|
-
# 任务实现
|
|
26
|
-
|
|
27
|
-
## 上下文
|
|
28
|
-
你正在项目 {projectContext} 中工作。
|
|
29
|
-
|
|
30
|
-
## 任务简报
|
|
31
|
-
请阅读完整的任务简报文件: {briefPath}
|
|
32
|
-
|
|
33
|
-
## 规范约束
|
|
34
|
-
{specConstraints}
|
|
35
|
-
(如无 spec,写"遵循项目现有代码风格和架构约定")
|
|
36
|
-
|
|
37
|
-
## 涉及文件
|
|
38
|
-
{filesList}
|
|
39
|
-
(如无指定文件,写"由你自行判断需要修改的文件")
|
|
40
|
-
|
|
41
|
-
## 铁律:测试驱动开发 (TDD)
|
|
42
|
-
|
|
43
|
-
没有失败测试就不写产品代码!
|
|
44
|
-
|
|
45
|
-
## 执行步骤 — RED-GREEN-REFACTOR
|
|
46
|
-
|
|
47
|
-
### RED — 先写一个失败的测试
|
|
48
|
-
1. 阅读任务简报,理解需求行为
|
|
49
|
-
2. 为下一个要实现的 _行为_ 写一个测试
|
|
50
|
-
3. 运行测试,确认它失败
|
|
51
|
-
4. 失败原因必须是"功能还不存在"
|
|
52
|
-
|
|
53
|
-
### GREEN — 写最少的代码让测试通过
|
|
54
|
-
1. 写刚好够让测试通过的代码
|
|
55
|
-
2. 不多写。YAGNI。
|
|
56
|
-
3. 运行测试,确认全部通过
|
|
57
|
-
|
|
58
|
-
### REFACTOR — 在测试保护下清理代码
|
|
59
|
-
1. 消除重复,改善命名
|
|
60
|
-
2. 运行测试,确认仍然全部通过
|
|
61
|
-
|
|
62
|
-
重复 RED-GREEN-REFACTOR 直到任务完成。
|
|
63
|
-
|
|
64
|
-
## 报告要求
|
|
65
|
-
将详细的实现报告写入: {reportPath}
|
|
66
|
-
|
|
67
|
-
报告格式(文本要点):
|
|
68
|
-
```
|
|
69
|
-
报告格式:
|
|
70
|
-
- 状态: DONE / DONE_WITH_CONCERNS / NEEDS_CONTEXT / BLOCKED
|
|
71
|
-
- 产生的 commit 列表(如果适用)
|
|
72
|
-
- 测试摘要(RED 阶段写了哪些测试,GREEN 阶段全部通过)
|
|
73
|
-
- 任何疑虑或未解决的问题
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
注意:`parseTaskReport` 同时接受上述文本格式和 JSON 格式。JSON 格式使用大写状态值:`"status": "DONE|DONE_WITH_CONCERNS|NEEDS_CONTEXT|BLOCKED"`。
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### 变量说明
|
|
80
|
-
|
|
81
|
-
| 变量 | 来源 | 示例 |
|
|
82
|
-
|------|------|------|
|
|
83
|
-
| `{projectContext}` | 项目根目录名 | `specpow` |
|
|
84
|
-
| `{briefPath}` | 任务简报路径 | `.specpow/sdd/{change}/task-{N}-brief.md` |
|
|
85
|
-
| `{specConstraints}` | specs/ 目录中的规范内容 | 从 `specs/*.md` 读取 |
|
|
86
|
-
| `{filesList}` | 任务涉及的文件列表 | 从任务描述中提取 |
|
|
87
|
-
| `{reportPath}` | 实现报告输出路径 | `.specpow/sdd/{change}/task-{N}-report.md` |
|
|
88
|
-
|
|
89
|
-
### Fix 轮次的实现者派发
|
|
90
|
-
|
|
91
|
-
修复轮次复用相同的 prompt 模板,但:
|
|
92
|
-
- **不修改 brief 文件** — 复用原始 brief,open findings 通过指令传递
|
|
93
|
-
- **追加 open findings 列表** — 在 prompt 中列出需要修复的 findings
|
|
94
|
-
- **reportPath 变更** — 写入 `task-{N}-report.md.fix-{R}`(不是覆盖原 report)
|
|
95
|
-
- **模型升级** — 第 4-5 轮使用比当前高一级模型
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## 审查者子代理 Prompt 模板
|
|
100
|
-
|
|
101
|
-
派发审查者时,给子代理的指令应包含以下部分:
|
|
102
|
-
|
|
103
|
-
```markdown
|
|
104
|
-
# 代码审查 — 三阶段裁决
|
|
105
|
-
|
|
106
|
-
## 任务上下文
|
|
107
|
-
- 任务: {taskTitle}
|
|
108
|
-
- 简报: {briefPath}
|
|
109
|
-
|
|
110
|
-
## 审查包
|
|
111
|
-
请阅读完整的审查包: {reviewPackagePath}
|
|
112
|
-
|
|
113
|
-
## 审查流程
|
|
114
|
-
|
|
115
|
-
### 第一阶段: 规格合规裁决
|
|
116
|
-
对照任务简报,逐项检查:
|
|
117
|
-
1. 所有需求项是否已实现
|
|
118
|
-
2. 是否有超出规范的实现(scope creep)
|
|
119
|
-
3. 接口签名是否与设计一致
|
|
120
|
-
|
|
121
|
-
### 第二阶段: 代码质量裁决
|
|
122
|
-
1. 命名和结构是否清晰
|
|
123
|
-
2. 错误处理是否完整
|
|
124
|
-
3. 是否有安全隐患
|
|
125
|
-
4. 是否有性能问题
|
|
126
|
-
|
|
127
|
-
### 第三阶段: TDD 合规裁决
|
|
128
|
-
1. 是否有测试覆盖新增/修改的代码
|
|
129
|
-
2. 测试是否断言行为而非实现细节
|
|
130
|
-
3. 测试是否在代码之前编写(检查 commit 顺序或测试结构)
|
|
131
|
-
4. 关键路径和边界条件是否有测试
|
|
132
|
-
|
|
133
|
-
## 输出格式
|
|
134
|
-
将审查结果写入文件: {reviewResultPath}
|
|
135
|
-
|
|
136
|
-
```json
|
|
137
|
-
{
|
|
138
|
-
"specCompliant": true/false,
|
|
139
|
-
"qualityApproved": true/false,
|
|
140
|
-
"findings": [
|
|
141
|
-
{
|
|
142
|
-
"id": "F-001",
|
|
143
|
-
"severity": "critical|important|minor",
|
|
144
|
-
"description": "...",
|
|
145
|
-
"file": "path/to/file",
|
|
146
|
-
"line": 42,
|
|
147
|
-
"isLoadBearing": true/false
|
|
148
|
-
}
|
|
149
|
-
],
|
|
150
|
-
"cannotVerify": ["从 diff 无法验证的项目"]
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### 变量说明
|
|
156
|
-
|
|
157
|
-
| 变量 | 来源 | 示例 |
|
|
158
|
-
|------|------|------|
|
|
159
|
-
| `{taskTitle}` | 任务标题 | 从 brief 中读取 |
|
|
160
|
-
| `{briefPath}` | 任务简报路径 | `.specpow/sdd/{change}/task-{N}-brief.md` |
|
|
161
|
-
| `{reviewPackagePath}` | 审查包路径(diff) | `.specpow/sdd/{change}/review-package.md` |
|
|
162
|
-
| `{reviewResultPath}` | 审查结果输出路径 | `.specpow/sdd/{change}/review-result.json` |
|
|
163
|
-
|
|
164
|
-
### 审查要点
|
|
165
|
-
|
|
166
|
-
- **不输出 `addressed` 字段** — 初始审查不判断 addressed,该字段由重审者填充
|
|
167
|
-
- **cannotVerify** — 无法从 diff 验证的项目(如运行时行为、外部依赖)放在此数组中
|
|
168
|
-
- **isLoadBearing** — 标记该 finding 是否为承重墙(阻塞性),非承重墙的 finding 可以 park
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## 重审者子代理 Prompt 模板
|
|
173
|
-
|
|
174
|
-
派发重审者时(修复循环中),给子代理的指令应包含以下部分:
|
|
175
|
-
|
|
176
|
-
```markdown
|
|
177
|
-
# 范围限定重新审查
|
|
178
|
-
|
|
179
|
-
只审查修复 diff: {fixDiffPath}
|
|
180
|
-
|
|
181
|
-
## 待验证的开放发现
|
|
182
|
-
{openFindingsList}
|
|
183
|
-
|
|
184
|
-
## 要求
|
|
185
|
-
对每个发现做出裁决: ADDRESSED / NOT ADDRESSED
|
|
186
|
-
新问题(仅限修复 diff 内的)标记为 NEW
|
|
187
|
-
超出修复范围的观察 → 忽略(不记录)
|
|
188
|
-
|
|
189
|
-
将结果写入: {reReviewResultPath}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### 变量说明
|
|
193
|
-
|
|
194
|
-
| 变量 | 来源 | 示例 |
|
|
195
|
-
|------|------|------|
|
|
196
|
-
| `{fixDiffPath}` | 修复 diff 路径 | `.specpow/sdd/{change}/review-package.md`(复用审查包命名) |
|
|
197
|
-
| `{openFindingsList}` | 开放 findings 列表 | 格式化后的 finding 列表(见下方) |
|
|
198
|
-
| `{reReviewResultPath}` | 重审结果输出路径 | `.specpow/sdd/{change}/re-review-result.json` |
|
|
199
|
-
|
|
200
|
-
### Open Findings 列表格式
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
1. [critical] Description of finding 1 (src/foo.ts:42)
|
|
204
|
-
2. [important] Description of finding 2 (src/bar.ts)
|
|
205
|
-
3. [minor] Description of finding 3
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
### 重审要点
|
|
209
|
-
|
|
210
|
-
- **只审查修复部分** — 不重新审查整个任务,只看 fix diff
|
|
211
|
-
- **对每个 finding 裁决** — ADDRESSED 或 NOT ADDRESSED
|
|
212
|
-
- **新问题限制范围** — 只有在 fix diff 内发现的新问题才标记为 NEW
|
|
213
|
-
- **超出范围忽略** — 不在 fix 范围内的观察不记录
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 派发流程(宿主 Agent 操作)
|
|
218
|
-
|
|
219
|
-
### 1. 实现者派发
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
# 1. 确保 brief 文件已写入
|
|
223
|
-
# (由编排技能在步骤 2a 完成)
|
|
224
|
-
|
|
225
|
-
# 2. 使用宿主原生 subagent 工具派发
|
|
226
|
-
# Claude Code: Agent tool
|
|
227
|
-
# Cursor: subagent tool
|
|
228
|
-
# 其他: 参考宿主工具文档
|
|
229
|
-
|
|
230
|
-
# 3. 子代理读取 brief → 实现 → 写 report
|
|
231
|
-
|
|
232
|
-
# 4. 读取 report 文件,解析 JSON
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### 2. 审查者派发
|
|
236
|
-
|
|
237
|
-
```bash
|
|
238
|
-
# 1. 生成审查包(diff)
|
|
239
|
-
BASE_COMMIT={recorded base commit}
|
|
240
|
-
HEAD_COMMIT=$(git rev-parse HEAD)
|
|
241
|
-
git diff ${BASE_COMMIT}..${HEAD_COMMIT} > .specpow/sdd/{change}/review-package.md
|
|
242
|
-
|
|
243
|
-
# 2. 使用宿主原生 subagent 工具派发审查者
|
|
244
|
-
# Prompt: 审查者模板(见上方)
|
|
245
|
-
|
|
246
|
-
# 3. 子代理读取 brief + review package → 审查 → 写 review-result.json
|
|
247
|
-
|
|
248
|
-
# 4. 读取 review-result.json,解析 JSON
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
### 3. 重审者派发(修复循环中)
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
# 1. 生成修复 diff(复用 generateReviewPackage 命名模式)
|
|
255
|
-
FIX_BASE=$(git rev-parse HEAD)
|
|
256
|
-
# 实现者修复后...
|
|
257
|
-
FIX_HEAD=$(git rev-parse HEAD)
|
|
258
|
-
git diff ${FIX_BASE}..${FIX_HEAD} > .specpow/sdd/{change}/review-package.md
|
|
259
|
-
|
|
260
|
-
# 2. 使用宿主原生 subagent 工具派发重审者
|
|
261
|
-
# Prompt: 重审者模板(见上方)+ open findings 列表
|
|
262
|
-
|
|
263
|
-
# 3. 子代理读取 fix diff → 对每个 finding 裁决 → 写 re-review-result.json
|
|
264
|
-
|
|
265
|
-
# 4. 读取 re-review-result.json,解析 JSON
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## 模型选择指导
|
|
271
|
-
|
|
272
|
-
根据任务复杂度选择子代理模型(如果宿主工具支持):
|
|
273
|
-
|
|
274
|
-
| 场景 | 条件 | 推荐级别 |
|
|
275
|
-
|------|------|----------|
|
|
276
|
-
| 机械实现 | ≤2 文件 + 完整 spec | cheap(默认 haiku) |
|
|
277
|
-
| 集成实现 | 多文件协调 | standard(默认 sonnet) |
|
|
278
|
-
| 架构设计 | 需要设计判断 | capable(默认 opus) |
|
|
279
|
-
| 简单审查 | <100 行 diff | cheap(默认 haiku) |
|
|
280
|
-
| 标准审查 | 一般变更 | standard(默认 sonnet) |
|
|
281
|
-
| 复杂审查 | 复杂变更 | capable(默认 opus) |
|
|
282
|
-
| 最终审查 | 全变更审查 | capable(默认 opus) |
|
|
283
|
-
| 修复轮次 4-5 | 升级模型 | 比当前高一级 |
|
|
284
|
-
|
|
285
|
-
**注意**:这只是指导。根据你实际可用的模型做出最佳选择。
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## 关键原则
|
|
290
|
-
|
|
291
|
-
1. **文件即接口** — 所有产物通过文件传递,不占用上下文
|
|
292
|
-
2. **范围限定** — 重审者只审查修复部分,提高效率
|
|
293
|
-
3. **铁律 TDD** — 实现者必须遵循 RED-GREEN-REFACTOR
|
|
294
|
-
4. **三阶段审查** — 规格合规 → 代码质量 → TDD 合规
|
|
295
|
-
5. **模型升级** — 修复轮次 4-5 升级模型,避免卡死
|