sillyspec 3.17.15 → 3.18.1
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/docs/platform-scan-protocol.md +298 -0
- package/package.json +1 -1
- package/src/constants.js +70 -0
- package/src/db.js +4 -0
- package/src/hooks/worktree-guard.js +97 -4
- package/src/index.js +56 -1
- package/src/progress.js +41 -14
- package/src/run.js +315 -83
- package/src/scan-postcheck.js +17 -16
- package/src/stage-contract.js +244 -12
- package/src/stages/brainstorm.js +228 -8
- package/src/stages/index.js +0 -2
- package/src/stages/plan.js +237 -52
- package/src/stages/propose.js +30 -4
- package/src/stages/quick.js +13 -10
- package/src/stages/scan.js +12 -0
- package/src/stages/verify.js +31 -13
- package/src/workflow.js +1 -0
- package/test/platform-artifacts.test.mjs +190 -0
- package/test/platform-failure-samples.test.mjs +195 -0
- package/test/platform-recovery-chain.test.mjs +179 -0
- package/test/platform-recovery.test.mjs +14 -6
- package/test/platform-scan-p0.test.mjs +5 -2
- package/test/run-tests.mjs +31 -3
- package/test/scan-paths.test.mjs +1 -1
- package/test/scan-postcheck.test.mjs +4 -3
- package/test/spec-dir.test.mjs +3 -2
- package/test/stage-contract.test.mjs +120 -7
- package/test/stage-definitions.test.mjs +2 -6
- package/test/wait-gates.test.mjs +501 -0
- package/test/worktree-guard.test.mjs +58 -0
package/src/stages/plan.js
CHANGED
|
@@ -10,6 +10,60 @@ export const definition = {
|
|
|
10
10
|
|
|
11
11
|
// 固定前缀步骤
|
|
12
12
|
export const fixedPrefix = [
|
|
13
|
+
{
|
|
14
|
+
name: '复杂度分类',
|
|
15
|
+
prompt: `在生成计划之前,先判定本次需求的复杂度等级(plan_level)。
|
|
16
|
+
|
|
17
|
+
### 操作
|
|
18
|
+
1. 读取 tasks.md 和 design.md,了解需求范围
|
|
19
|
+
2. 按「分级规则」判定 plan_level
|
|
20
|
+
|
|
21
|
+
### 分级规则
|
|
22
|
+
判定 plan_level 为 none 时,需**同时满足**以下所有条件:
|
|
23
|
+
- 涉及文件 ≤ 2 个
|
|
24
|
+
- 不跨模块(改动集中在单个模块内)
|
|
25
|
+
- 无 schema / DB / manifest / local.yaml 变更
|
|
26
|
+
- 无状态机 / workflow 状态流转变更
|
|
27
|
+
- 无 source_root / spec_root / runtime_root 路径隔离规则变更
|
|
28
|
+
- 无 validator / postcheck / agent 调度行为变更
|
|
29
|
+
- 需求明确,无设计歧义
|
|
30
|
+
|
|
31
|
+
判定为 light(满足任一即升为 light):
|
|
32
|
+
- 涉及 3-5 个文件
|
|
33
|
+
- 涉及 prompt 行为变更
|
|
34
|
+
- 涉及 validator / postcheck 逻辑
|
|
35
|
+
- 涉及路径规则变更(但范围可控)
|
|
36
|
+
- 涉及 schema/DB/状态机变更,但影响面可控
|
|
37
|
+
- 需要明确验收标准来防止范围漂移
|
|
38
|
+
|
|
39
|
+
判定为 full(满足任一即升为 full):
|
|
40
|
+
- 预计 8 个以上 task
|
|
41
|
+
- 跨 3 个以上模块
|
|
42
|
+
- 涉及 CLI + 平台 + DB 联动
|
|
43
|
+
- 涉及 agent 调度 / worktree / isolation 逻辑
|
|
44
|
+
- 涉及复杂状态恢复(checkpoint / resume)
|
|
45
|
+
- 需要并行 sub-agent 执行
|
|
46
|
+
- 需要人工审查设计方向
|
|
47
|
+
- 涉及 worktree / baseline / sandbox 等基础设施
|
|
48
|
+
|
|
49
|
+
### 输出格式
|
|
50
|
+
在输出开头,以如下格式输出分类结果:
|
|
51
|
+
|
|
52
|
+
\`\`\`
|
|
53
|
+
plan_level: none | light | full
|
|
54
|
+
reason: <一句话说明判定理由>
|
|
55
|
+
estimated_files: <N>
|
|
56
|
+
cross_module: true | false
|
|
57
|
+
has_schema_change: true | false
|
|
58
|
+
has_state_machine_change: true | false
|
|
59
|
+
needs_parallel_execution: true | false
|
|
60
|
+
needs_human_review: true | false
|
|
61
|
+
\`\`\`
|
|
62
|
+
|
|
63
|
+
分类完成后,继续进入下一步。`,
|
|
64
|
+
outputHint: '复杂度分类结果',
|
|
65
|
+
optional: false
|
|
66
|
+
},
|
|
13
67
|
{
|
|
14
68
|
name: '状态检查',
|
|
15
69
|
prompt: `检查当前状态,确认可以执行 plan。
|
|
@@ -30,22 +84,25 @@ export const fixedPrefix = [
|
|
|
30
84
|
### 操作
|
|
31
85
|
1. 读取 CODEBASE-OVERVIEW.md + 各子项目上下文
|
|
32
86
|
2. 读取 proposal.md、design.md、requirements.md、tasks.md
|
|
33
|
-
3.
|
|
34
|
-
|
|
87
|
+
3. 如果存在 decisions.md,必须读取并提取所有当前版本 D-xxx@vN 决策 ID
|
|
88
|
+
- 如果发现 priority=P0/P1 且 status=unresolved/blocking 的决策,停止生成计划,要求先回到 brainstorm 的 Design Grill 修正
|
|
89
|
+
- 如果发现 superseded 决策,只引用最新版本,不引用旧版本
|
|
90
|
+
4. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
|
|
91
|
+
5. 读取 local.yaml 获取构建/测试命令
|
|
35
92
|
|
|
36
93
|
### 模块文档加载
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
94
|
+
6. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
95
|
+
7. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
|
|
96
|
+
8. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
|
|
97
|
+
9. 将模块文档作为制定计划的上下文,确保计划符合模块当前设计
|
|
98
|
+
10. **利用模块依赖关系辅助分析**:
|
|
42
99
|
- 用 depends_on 判断哪些模块会被间接影响
|
|
43
100
|
- 用 used_by 判断变更会不会影响下游模块
|
|
44
101
|
- 将依赖关系纳入 Wave 分组决策(依赖同一模块的任务尽量同 Wave)
|
|
45
102
|
- 如果变更涉及多个有依赖关系的模块,在 plan.md 的任务总表中标注模块依赖
|
|
46
103
|
|
|
47
104
|
### 输出
|
|
48
|
-
|
|
105
|
+
已加载的文件清单(含 decisions.md 当前版本/未决项状态、模块文档 + 模块依赖关系摘要)`,
|
|
49
106
|
outputHint: '文件清单',
|
|
50
107
|
optional: false
|
|
51
108
|
},
|
|
@@ -62,11 +119,94 @@ export const fixedPrefix = [
|
|
|
62
119
|
optional: false
|
|
63
120
|
},
|
|
64
121
|
{
|
|
65
|
-
name: '
|
|
66
|
-
prompt:
|
|
122
|
+
name: '按复杂度生成分级计划',
|
|
123
|
+
prompt: `根据「复杂度分类」步骤的 plan_level 结果,按对应级别生成计划。
|
|
124
|
+
|
|
125
|
+
### 操作
|
|
126
|
+
1. 读取上一步输出的 plan_level 分类结果
|
|
127
|
+
2. 读取 tasks.md 和 design.md 了解需求范围
|
|
128
|
+
3. 按 plan_level 选择对应模板输出
|
|
129
|
+
|
|
130
|
+
---
|
|
67
131
|
|
|
68
|
-
|
|
132
|
+
#### plan_level = none
|
|
133
|
+
生成最小 plan.md(占位文件,保持流程兼容),不生成完整蓝图。格式:
|
|
69
134
|
\`\`\`markdown
|
|
135
|
+
---
|
|
136
|
+
plan_level: none
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
# 计划跳过
|
|
140
|
+
|
|
141
|
+
## 原因
|
|
142
|
+
<一句话说明判定理由>
|
|
143
|
+
|
|
144
|
+
## 建议直接 execute
|
|
145
|
+
直接进入 execute 阶段完成下列最小任务。
|
|
146
|
+
|
|
147
|
+
## Tasks
|
|
148
|
+
- [ ] task-01: 按用户需求完成小范围明确修改
|
|
149
|
+
|
|
150
|
+
## 验收
|
|
151
|
+
- 修改范围符合用户需求
|
|
152
|
+
- 不引入额外无关变更
|
|
153
|
+
- 必要测试或检查通过
|
|
154
|
+
\`\`\`
|
|
155
|
+
**注意:** 所有 plan_level 都必须包含 \`- [ ] task-XX:\` 格式的 checkbox 任务,execute 阶段依赖此格式解析任务。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
#### plan_level = light
|
|
160
|
+
生成轻量 plan.md,保存到变更目录。只包含以下四部分:
|
|
161
|
+
|
|
162
|
+
\`\`\`markdown
|
|
163
|
+
---
|
|
164
|
+
plan_level: light
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
# 轻量计划:<需求简述>
|
|
168
|
+
|
|
169
|
+
## 来源
|
|
170
|
+
直接引用 brainstorm 结论或用户原始需求,不重新扩写。
|
|
171
|
+
|
|
172
|
+
## 范围
|
|
173
|
+
- 涉及的文件/模块清单
|
|
174
|
+
|
|
175
|
+
## Tasks
|
|
176
|
+
- [ ] task-01: ...(覆盖:FR-01, D-001@v1)
|
|
177
|
+
- [ ] task-02: ...
|
|
178
|
+
- [ ] task-03: ...
|
|
179
|
+
|
|
180
|
+
## 验收
|
|
181
|
+
- 具体可验证的验收条目
|
|
182
|
+
|
|
183
|
+
## 覆盖矩阵(如存在 decisions.md)
|
|
184
|
+
| ID | 覆盖任务 | 验收证据 |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| D-001@v1 | task-01 | AC-01 |
|
|
187
|
+
\`\`\`
|
|
188
|
+
|
|
189
|
+
light 计划的约束:
|
|
190
|
+
- **禁止**生成 Mermaid 图
|
|
191
|
+
- **禁止**估时
|
|
192
|
+
- **禁止**泛泛风险 分析(如"需要充分测试")
|
|
193
|
+
- **禁止**放实现细节(函数签名、代码示例)
|
|
194
|
+
- 来源/目标直接引用已有文档,不重新生成
|
|
195
|
+
- 如果存在 decisions.md,所有当前版本 D-xxx@vN 必须在 Tasks 或覆盖矩阵中出现
|
|
196
|
+
- 如果存在 P0/P1 unresolved blocker,不生成 plan.md
|
|
197
|
+
- 任务列表控制在 10 条以内
|
|
198
|
+
- **任务必须使用 checkbox 格式**(\`- [ ] task-XX:\`),不要用纯编号列表(\`1. 2.\`),execute 阶段依赖此格式解析任务
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
#### plan_level = full
|
|
203
|
+
生成完整 plan.md,保存到变更目录。格式如下:
|
|
204
|
+
|
|
205
|
+
\`\`\`markdown
|
|
206
|
+
---
|
|
207
|
+
plan_level: full
|
|
208
|
+
---
|
|
209
|
+
|
|
70
210
|
# 实现计划
|
|
71
211
|
|
|
72
212
|
## Spike 前置验证(如需要)
|
|
@@ -77,25 +217,18 @@ export const fixedPrefix = [
|
|
|
77
217
|
> 技术不确定性高时才需要 Spike。无不确定性则跳过此节。
|
|
78
218
|
|
|
79
219
|
## Wave 1(并行,无依赖)
|
|
80
|
-
- [ ] task-01:
|
|
81
|
-
- [ ] task-02:
|
|
220
|
+
- [ ] task-01: 添加用户创建接口(覆盖:FR-01, D-001@v1)
|
|
221
|
+
- [ ] task-02: 添加角色创建接口(覆盖:FR-02)
|
|
82
222
|
|
|
83
223
|
## Wave 2(依赖 Wave 1)
|
|
84
224
|
- [ ] task-03: 用户创建接口联调
|
|
85
225
|
|
|
86
226
|
## 任务总表
|
|
87
|
-
| 编号 | 任务 | Wave | 优先级 |
|
|
227
|
+
| 编号 | 任务 | Wave | 优先级 | 依赖 | 覆盖 FR/D | 说明 |
|
|
88
228
|
|---|---|---|---|---|---|---|
|
|
89
|
-
| task-01 | 添加用户创建接口 | W1 | P0 |
|
|
90
|
-
| task-02 | 添加角色创建接口 | W1 | P0 |
|
|
91
|
-
| task-03 | 用户创建接口联调 | W2 | P0 |
|
|
92
|
-
|
|
93
|
-
## 依赖关系图
|
|
94
|
-
\`\`\`mermaid
|
|
95
|
-
graph LR
|
|
96
|
-
task-01 --> task-03
|
|
97
|
-
task-02 --> task-03
|
|
98
|
-
\`\`\`
|
|
229
|
+
| task-01 | 添加用户创建接口 | W1 | P0 | — | FR-01, D-001@v1 | ... |
|
|
230
|
+
| task-02 | 添加角色创建接口 | W1 | P0 | — | FR-02 | ... |
|
|
231
|
+
| task-03 | 用户创建接口联调 | W2 | P0 | task-01,02 | FR-03 | ... |
|
|
99
232
|
|
|
100
233
|
## 关键路径
|
|
101
234
|
task-01 → task-03(最长路径,决定最短交付周期)
|
|
@@ -103,66 +236,102 @@ task-01 → task-03(最长路径,决定最短交付周期)
|
|
|
103
236
|
## 全局验收标准
|
|
104
237
|
- [ ] 所有单元测试通过
|
|
105
238
|
- [ ] (brownfield)未配置新功能时行为不变
|
|
239
|
+
|
|
240
|
+
## 覆盖矩阵(如存在 decisions.md)
|
|
241
|
+
| ID | 覆盖任务 | 验收证据 |
|
|
242
|
+
|---|---|---|
|
|
243
|
+
| D-001@v1 | task-01 | AC-01 |
|
|
106
244
|
\`\`\`
|
|
107
245
|
|
|
108
|
-
|
|
109
|
-
-
|
|
246
|
+
full 计划的约束:
|
|
247
|
+
- **禁止**估时(任务总表不含估时列)
|
|
248
|
+
- **禁止**泛泛风险分析("需要充分测试"类废话转为具体验收条目)
|
|
249
|
+
- Mermaid 依赖关系图**仅当依赖关系非平凡时生成**(线性依赖或全并行时不生成)
|
|
250
|
+
- **Wave 下的 checkbox 行必须保留**(execute 阶段解析依赖 \`- [ ] task-XX:\` 格式)
|
|
251
|
+
- plan.md 包含 Wave 分组 + 任务总表 + 关键路径 + 全局验收标准,**不放实现细节**
|
|
252
|
+
- 如果存在 decisions.md,plan.md 必须包含当前版本 D-xxx@vN/FR-xxx 覆盖矩阵
|
|
253
|
+
- 如果存在 P0/P1 unresolved blocker,不生成 plan.md,输出阻塞清单
|
|
110
254
|
- 实现细节写到后续的 tasks/task-NN.md 中
|
|
111
255
|
- 每个任务编号格式:task-01、task-02 ...
|
|
112
|
-
- **Wave 下的 checkbox 行必须保留**(execute 阶段解析依赖 \`- [ ] task-XX:\` 格式)
|
|
113
256
|
- 任务总表的优先级:P0(必须)/ P1(重要)/ P2(可选)
|
|
114
|
-
-
|
|
257
|
+
- 总任务数控制在 15 个以内
|
|
115
258
|
|
|
116
|
-
### Spike
|
|
259
|
+
### Spike 前置验证(仅 full)
|
|
117
260
|
当存在技术不确定性时,在 Wave 之前设计 Spike:
|
|
118
261
|
- 涉及新技术栈/未经验证的集成 → 需要 Spike
|
|
119
262
|
- 涉及安全隔离/性能瓶颈 → 需要 Spike
|
|
120
263
|
- 纯业务逻辑/确定的技术方案 → 不需要 Spike
|
|
121
264
|
- 每个 Spike 定义:验证内容 + 通过标准 + 不通过后果
|
|
122
265
|
|
|
123
|
-
###
|
|
266
|
+
### 批量模式指引(仅 full)
|
|
124
267
|
如果 design.md 或需求中包含批量特征(关键词:批量/模板/引擎/N个相似),按以下原则规划:
|
|
125
|
-
❌ 不要列出每个实例作为独立任务
|
|
126
|
-
❌ 不要在文档中嵌入数据
|
|
127
|
-
✅ 设计通用架构,Wave 1 聚焦架构
|
|
128
|
-
✅ 数据转换用脚本完成,单独一个 Wave
|
|
129
|
-
✅ 总任务数控制在 10 个以内
|
|
268
|
+
- ❌ 不要列出每个实例作为独立任务
|
|
269
|
+
- ❌ 不要在文档中嵌入数据
|
|
270
|
+
- ✅ 设计通用架构,Wave 1 聚焦架构
|
|
271
|
+
- ✅ 数据转换用脚本完成,单独一个 Wave
|
|
272
|
+
- ✅ 总任务数控制在 10 个以内
|
|
130
273
|
|
|
131
|
-
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### 通用操作(所有级别)
|
|
132
277
|
1. 读取 tasks.md 获取任务列表
|
|
133
278
|
2. 读取 design.md 获取文件变更清单
|
|
134
|
-
3.
|
|
135
|
-
4.
|
|
136
|
-
5.
|
|
137
|
-
|
|
138
|
-
7. 标注关键路径
|
|
139
|
-
8. 评估是否需要 Spike 前置验证
|
|
140
|
-
9. 保存到变更目录下的 plan.md(路径格式:\`.sillyspec/changes/<change-name>/plan.md\`,其中 <change-name> 是变更目录名,直接使用,不加子目录。正确路径示例:\`.sillyspec/changes/2026-05-28-agent-log-streaming/plan.md\`)
|
|
279
|
+
3. 读取上一步的 plan_level 分类结果
|
|
280
|
+
4. 按对应级别模板生成内容
|
|
281
|
+
5. 保存到变更目录下的 plan.md(路径格式:\`.sillyspec/changes/<change-name>/plan.md\`,其中 <change-name> 是变更目录名,直接使用,不加子目录。正确路径示例:\`.sillyspec/changes/2026-05-28-agent-log-streaming/plan.md\`)
|
|
282
|
+
**plan_level 为 none 时生成最小 plan.md(占位),不生成完整蓝图。**
|
|
141
283
|
|
|
142
284
|
### 输出
|
|
143
|
-
|
|
144
|
-
outputHint: '
|
|
285
|
+
plan_level + 计划内容(none 级别输出建议操作)`,
|
|
286
|
+
outputHint: '计划内容',
|
|
145
287
|
optional: false
|
|
146
288
|
},
|
|
147
289
|
{
|
|
148
290
|
name: '自检总览',
|
|
149
|
-
prompt:
|
|
291
|
+
prompt: `根据 plan_level 检查对应的计划质量。
|
|
150
292
|
|
|
151
293
|
### 操作
|
|
152
|
-
|
|
294
|
+
读取上一步的 plan_level 分类结果,按级别执行对应的自检:
|
|
295
|
+
|
|
296
|
+
#### plan_level = none
|
|
297
|
+
- [ ] plan.md 文件存在且包含 plan_level: none
|
|
298
|
+
- [ ] 给出了可操作的修改建议(2-5 条)
|
|
299
|
+
- [ ] 不含 Wave、Mermaid、估时、任务总表、依赖关系等完整蓝图内容
|
|
300
|
+
- [ ] 建议了直接 execute
|
|
301
|
+
- [ ] 包含至少一个 \`- [ ] task-XX:\` 格式的 checkbox 任务(execute 解析依赖此格式)
|
|
302
|
+
|
|
303
|
+
#### plan_level = light
|
|
304
|
+
- [ ] 输出明确标注 plan_level: light
|
|
305
|
+
- [ ] 有来源、范围、任务列表、验收标准四个部分
|
|
306
|
+
- [ ] 来源直接引用已有文档,未重新扩写
|
|
307
|
+
- [ ] 任务列表清晰且无实现细节
|
|
308
|
+
- [ ] 任务使用 checkbox 格式(\`- [ ] task-XX:\`),不是纯编号列表
|
|
309
|
+
- [ ] 验收标准具体可验证(非笼统表述)
|
|
310
|
+
- [ ] 如果存在 decisions.md,所有当前版本 D-xxx@vN 在 plan.md 中可追踪
|
|
311
|
+
- [ ] 不存在 P0/P1 unresolved blocker
|
|
312
|
+
- [ ] 没有 Mermaid 图、估时、风险分析
|
|
313
|
+
- [ ] 没有函数签名、代码示例等实现细节
|
|
314
|
+
- [ ] plan.md 与 design.md 的文件变更清单一致
|
|
315
|
+
- [ ] 包含至少一个 \`- [ ] task-XX:\` 格式的 checkbox 任务(execute 解析依赖此格式)
|
|
316
|
+
|
|
317
|
+
#### plan_level = full
|
|
153
318
|
- [ ] 每个 task 有编号(task-01、task-02 ...)
|
|
154
319
|
- [ ] 每个 task 在 Wave 下有 checkbox(\`- [ ] task-XX:\` 格式,execute 解析依赖此格式)
|
|
155
320
|
- [ ] 已标注 Wave 分组和依赖关系
|
|
156
|
-
- [ ]
|
|
157
|
-
- [ ] 有 Mermaid 依赖关系图
|
|
321
|
+
- [ ] 有任务总表(含优先级、依赖列,**无估时列**)
|
|
158
322
|
- [ ] 有关键路径标注
|
|
159
323
|
- [ ] 有全局验收标准
|
|
324
|
+
- [ ] 如果存在 decisions.md,任务总表或覆盖矩阵覆盖全部当前版本 D-xxx@vN
|
|
325
|
+
- [ ] 不存在 P0/P1 unresolved blocker
|
|
160
326
|
- [ ] (brownfield)全局验收包含兼容性条款
|
|
161
327
|
- [ ] 没有实现细节(接口定义、代码示例等不应该在 plan.md 里)
|
|
162
328
|
- [ ] plan.md 与 design.md 的文件变更清单一致
|
|
329
|
+
- [ ] 如果有 Mermaid 图,依赖关系确实非平凡(非线性/非全并行)
|
|
330
|
+
- [ ] 没有泛泛风险分析(如"需要充分测试")
|
|
163
331
|
|
|
164
332
|
### 输出
|
|
165
|
-
|
|
333
|
+
自检通过/不通过(附 plan_level)`,
|
|
334
|
+
outputHint: '自检结果',
|
|
166
335
|
outputHint: '自检结果',
|
|
167
336
|
optional: false
|
|
168
337
|
}
|
|
@@ -265,6 +434,8 @@ priority: P0
|
|
|
265
434
|
estimated_hours: N
|
|
266
435
|
depends_on: []
|
|
267
436
|
blocks: []
|
|
437
|
+
requirement_ids: [FR-01]
|
|
438
|
+
decision_ids: [D-001@v1]
|
|
268
439
|
allowed_paths:
|
|
269
440
|
- 允许修改的路径范围
|
|
270
441
|
---
|
|
@@ -274,6 +445,10 @@ allowed_paths:
|
|
|
274
445
|
## 修改文件(必填)
|
|
275
446
|
- 精确到文件路径,列出所有需要新增或修改的文件
|
|
276
447
|
|
|
448
|
+
## 覆盖来源
|
|
449
|
+
- Requirements: FR-xx(来自 requirements.md)
|
|
450
|
+
- Decisions: D-xxx@vN(如存在 decisions.md)
|
|
451
|
+
|
|
277
452
|
## 实现要求
|
|
278
453
|
1. 具体做什么,写清楚
|
|
279
454
|
2. ...
|
|
@@ -315,6 +490,8 @@ allowed_paths:
|
|
|
315
490
|
- \`estimated_hours\`: 预估工时,单个 task ≤ 8h
|
|
316
491
|
- \`depends_on\`: 依赖的前序 task 编号列表
|
|
317
492
|
- \`blocks\`: 被本 task 阻塞的后续 task 编号列表
|
|
493
|
+
- \`requirement_ids\`: 本任务覆盖的 FR-xxx 列表
|
|
494
|
+
- \`decision_ids\`: 本任务覆盖的当前版本 D-xxx@vN 列表;无 decisions.md 时可为空数组
|
|
318
495
|
- \`allowed_paths\`: AI executor 可以修改的文件路径范围(安全边界)
|
|
319
496
|
|
|
320
497
|
### 关键规则
|
|
@@ -323,6 +500,7 @@ allowed_paths:
|
|
|
323
500
|
- 接口定义写到"搬砖工照着做"的程度
|
|
324
501
|
- 边界处理至少覆盖 5 条规则
|
|
325
502
|
- 验收标准用表格格式,每条可点击验证,禁止"功能可演示"类笼统表述
|
|
503
|
+
- 如果存在 decisions.md,不允许丢失当前版本 D-xxx@vN;无法覆盖的 D-xxx@vN 必须写入非目标或剩余风险
|
|
326
504
|
- 写完后保存到文件
|
|
327
505
|
|
|
328
506
|
### 操作
|
|
@@ -370,6 +548,8 @@ priority: P0/P1/P2
|
|
|
370
548
|
estimated_hours: N
|
|
371
549
|
depends_on: [task-XX]
|
|
372
550
|
blocks: [task-XX]
|
|
551
|
+
requirement_ids: [FR-XX]
|
|
552
|
+
decision_ids: [D-XXX@vN]
|
|
373
553
|
allowed_paths:
|
|
374
554
|
- ...
|
|
375
555
|
---
|
|
@@ -379,6 +559,10 @@ allowed_paths:
|
|
|
379
559
|
## 修改文件(必填)
|
|
380
560
|
- 精确到文件路径
|
|
381
561
|
|
|
562
|
+
## 覆盖来源
|
|
563
|
+
- Requirements: FR-xx
|
|
564
|
+
- Decisions: D-xxx@vN(如存在)
|
|
565
|
+
|
|
382
566
|
## 实现要求
|
|
383
567
|
1. 具体做什么
|
|
384
568
|
|
|
@@ -412,6 +596,7 @@ allowed_paths:
|
|
|
412
596
|
- 接口定义写到"搬砖工照着做"的程度
|
|
413
597
|
- 边界处理至少 5 条
|
|
414
598
|
- 验收标准用表格,禁止笼统表述
|
|
599
|
+
- 如果存在 decisions.md,不允许丢失当前版本 D-xxx@vN;无法覆盖的 D-xxx@vN 必须写入非目标或剩余风险
|
|
415
600
|
- 写完后用 Write tool 保存到文件
|
|
416
601
|
\`\`\``
|
|
417
602
|
}).join('\n\n')
|
|
@@ -443,8 +628,8 @@ ${subagentPrompts}
|
|
|
443
628
|
|
|
444
629
|
## 验收
|
|
445
630
|
- 每个 task-N.md 文件存在且非空
|
|
446
|
-
- 包含 YAML frontmatter(id、title、priority、depends_on、blocks、allowed_paths)
|
|
447
|
-
-
|
|
631
|
+
- 包含 YAML frontmatter(id、title、priority、depends_on、blocks、requirement_ids、decision_ids、allowed_paths)
|
|
632
|
+
- 包含所有必要章节:修改文件、覆盖来源、实现要求、接口定义、边界处理(≥5条)、非目标、TDD 步骤、验收标准(表格格式)
|
|
448
633
|
- 边界处理覆盖:null/空值、兼容性、异常处理、参数不可变、歧义场景`
|
|
449
634
|
|
|
450
635
|
return {
|
package/src/stages/propose.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated propose 阶段已移除入口(2026-06-14)。
|
|
3
|
+
* brainstorm 现在拥有四件套(design/proposal/requirements/tasks)的生成职责。
|
|
4
|
+
* 本文件保留以备未来需要恢复,但未注册到 stageRegistry。
|
|
5
|
+
*/
|
|
1
6
|
export const definition = {
|
|
2
7
|
name: 'propose',
|
|
3
8
|
title: '方案设计',
|
|
@@ -87,10 +92,29 @@ export const definition = {
|
|
|
87
92
|
- **非功能需求**:兼容性、可回退、可测试、可扩展
|
|
88
93
|
|
|
89
94
|
### design.md 格式要求
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
|
|
96
|
+
**必须包含的章节:**
|
|
97
|
+
1. **背景**:为什么做、解决什么问题
|
|
98
|
+
2. **设计目标**:要达成什么
|
|
99
|
+
3. **非目标**:明确不做的事(防止 scope creep)
|
|
100
|
+
4. **总体方案**:技术方案(分 Phase/Wave)
|
|
101
|
+
5. **文件变更清单**(必填):
|
|
102
|
+
|
|
103
|
+
| 操作 | 文件路径 | 说明 |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| 新增 | src/xxx/NewFile.java | ... |
|
|
106
|
+
| 修改 | src/xxx/ExistingFile.java | 新增 xx 方法 |
|
|
107
|
+
|
|
108
|
+
6. **接口定义**:方法签名、数据结构(代码类任务必填)
|
|
109
|
+
7. **数据模型**(如涉及):表结构/字段变更
|
|
110
|
+
8. **兼容策略**(brownfield 必填):未配置新功能时行为不变、新旧逻辑的回退路径
|
|
111
|
+
9. **风险登记**:
|
|
112
|
+
|
|
113
|
+
| 编号 | 风险 | 等级 | 应对策略 |
|
|
114
|
+
|---|---|---|---|
|
|
115
|
+
| R-01 | ... | P0/P1/P2 | ... |
|
|
116
|
+
|
|
117
|
+
10. **自审**:需求覆盖、约束一致性、真实性、YAGNI、验收标准、非目标清晰、兼容策略、风险识别
|
|
94
118
|
|
|
95
119
|
### tasks.md 格式要求
|
|
96
120
|
- 任务列表(只列名称,不展开步骤)
|
|
@@ -119,9 +143,11 @@ export const definition = {
|
|
|
119
143
|
### 操作
|
|
120
144
|
检查以下各项:
|
|
121
145
|
- [ ] proposal.md 有动机、关键问题、变更范围、不在范围内、成功标准
|
|
146
|
+
- [ ] design.md 有背景、设计目标、非目标
|
|
122
147
|
- [ ] design.md 有文件变更清单表格
|
|
123
148
|
- [ ] design.md 有兼容策略(brownfield 时)
|
|
124
149
|
- [ ] design.md 有风险登记表格
|
|
150
|
+
- [ ] design.md 有自审
|
|
125
151
|
- [ ] requirements.md 有角色表
|
|
126
152
|
- [ ] requirements.md 有 FR 编号和 Given/When/Then 用户场景
|
|
127
153
|
- [ ] tasks.md 每个 task 有文件路径
|
package/src/stages/quick.js
CHANGED
|
@@ -72,24 +72,27 @@ quicklog 已创建(必须放在输出的第一行确认)+ 任务理解 + 上
|
|
|
72
72
|
prompt: `Git 暂存并更新任务记录。
|
|
73
73
|
|
|
74
74
|
### 操作
|
|
75
|
-
1. \`git
|
|
76
|
-
2.
|
|
75
|
+
1. 查看 \`git status --porcelain\`,确认只包含本次 quick 相关文件
|
|
76
|
+
2. 使用 \`git add -- <file...>\` 暂存本次 quick 实际修改的文件(不要 commit,由用户通过统一提交工具处理)
|
|
77
|
+
- 禁止使用 \`git add -A\`
|
|
78
|
+
- 不要暂存 quick 开始前就已存在的无关改动
|
|
79
|
+
3. 更新 Step 1 创建的记录:
|
|
77
80
|
- 无 \`--change\`:找到对应 ql-ID 的条目,将「状态:进行中」改为「状态:已完成」,补充实际改动文件和结果摘要
|
|
78
81
|
- 有 \`--change\`:勾选 tasks.md 中对应的 task checkbox
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
4. QUICKLOG 轮转:超过 500 行则重命名为 \`QUICKLOG-<USER>-YYYY-MM-DD.md\`(日期取最后一条记录的日期)。新文件从空开始,ql-ID 需扫描同目录所有 QUICKLOG 文件中当天最大序号 +1
|
|
83
|
+
5. 如果发现项目特有的坑,追加到 \`.sillyspec/knowledge/uncategorized.md\`
|
|
84
|
+
6. 任务比预期复杂 → 建议用完整流程
|
|
82
85
|
|
|
83
86
|
### 模块文档同步
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
7. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
88
|
+
8. 对比本次修改的文件(\`git diff --name-only HEAD\`)与模块映射
|
|
89
|
+
9. 如果命中模块 → 直接同步模块文档:
|
|
87
90
|
- 读取对应的 \`.sillyspec/docs/<project>/modules/<module>.md\`(如不存在则新建)
|
|
88
91
|
- 根据本次改动内容更新模块文档(正文描述当前状态,底部变更索引追加本次 ql-ID)
|
|
89
92
|
- 变更索引格式:\`- ql-YYYYMMDD-NNN-XXXX | <一句话描述>\`
|
|
90
93
|
- 写入模块文档
|
|
91
|
-
-
|
|
92
|
-
|
|
94
|
+
- 使用 \`git add -- <module-doc>\` 暂存更新的模块文件
|
|
95
|
+
10. 未命中任何模块 → 跳过,不做额外操作
|
|
93
96
|
|
|
94
97
|
### 输出
|
|
95
98
|
暂存确认 + 记录路径 + 模块文档同步结果(如有)`,
|
package/src/stages/scan.js
CHANGED
|
@@ -122,6 +122,18 @@ export const definition = {
|
|
|
122
122
|
对每个项目分别执行(将 \`<project>\` 替换为实际项目名)
|
|
123
123
|
4. 如果检查报告有失败项,按报告中的角色和文件重试失败的部分
|
|
124
124
|
|
|
125
|
+
### 覆盖保护
|
|
126
|
+
- 生成每份 scan 文档时,frontmatter 必须包含:
|
|
127
|
+
\`\`\`yaml
|
|
128
|
+
---
|
|
129
|
+
source_commit: <git-head-short>
|
|
130
|
+
updated_at: <now-iso-datetime>
|
|
131
|
+
generator: sillyspec-scan
|
|
132
|
+
---
|
|
133
|
+
\`\`\`
|
|
134
|
+
- 覆盖已有 scan 文档前先读取旧 frontmatter;如果旧文档的 \`source_commit\` 与当前 HEAD 不一致,或旧文档 \`updated_at\` 晚于本次 scan 开始时间,不要覆盖。
|
|
135
|
+
- 如果用户明确传入 \`--force-rescan\`,允许覆盖,但仍需写入新的 \`source_commit\` 和 \`updated_at\`。
|
|
136
|
+
|
|
125
137
|
### 子代理上下文注入
|
|
126
138
|
启动每个子代理前,将以下信息拼入子代理 prompt:
|
|
127
139
|
- 项目名(直接用实际项目名)
|
package/src/stages/verify.js
CHANGED
|
@@ -53,20 +53,23 @@ export const definition = {
|
|
|
53
53
|
prompt: `加载规范文件并确认。
|
|
54
54
|
|
|
55
55
|
### 操作
|
|
56
|
-
1. 读取 proposal.md、design.md、tasks.md、requirements.md
|
|
57
|
-
2.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
1. 读取 proposal.md、design.md、tasks.md、requirements.md、plan.md
|
|
57
|
+
2. 如果存在 decisions.md,必须读取并提取所有当前版本 D-xxx@vN 决策 ID
|
|
58
|
+
- 如果存在 P0/P1 unresolved/blocking 决策,验证结论不能为 PASS
|
|
59
|
+
- 如果发现 superseded 决策被下游引用,标记为 ⚠️ stale decision reference
|
|
60
|
+
3. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
|
|
61
|
+
4. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`(构建命令、测试命令、lint 命令等)
|
|
62
|
+
5. 加载代码规范:\`cat .sillyspec/docs/<project>/scan/CONVENTIONS.md 2>/dev/null\`
|
|
63
|
+
6. 标注每个文件的存在/不存在状态
|
|
61
64
|
|
|
62
65
|
### 模块文档加载
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
7. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
67
|
+
8. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
|
|
68
|
+
9. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
|
|
69
|
+
10. **检查模块索引可信度**:如果相关模块的 needs_review 为 true,提示"该模块索引可能不可信,需要回看模块卡片或源码"
|
|
67
70
|
|
|
68
71
|
### 输出
|
|
69
|
-
|
|
72
|
+
文件加载确认清单(含 decisions.md 当前版本/未决项状态、模块文档 + 索引可信度)`,
|
|
70
73
|
outputHint: '文件确认清单',
|
|
71
74
|
optional: false
|
|
72
75
|
},
|
|
@@ -123,9 +126,17 @@ grep -rl "<关键词>" <源码目录>/ --include="*.java" --include="*.js" --inc
|
|
|
123
126
|
2. 对每个 task,检查对应模块目录下是否存在测试文件(*test*、*spec*、*Test*、*Spec*)
|
|
124
127
|
3. 没有测试文件的 task 标记为 ⚠️ 缺少测试
|
|
125
128
|
|
|
129
|
+
**探针 4:决策追踪覆盖探针(如存在 decisions.md)**
|
|
130
|
+
1. 从 decisions.md 提取所有当前版本 D-xxx@vN
|
|
131
|
+
2. 检查 requirements.md 是否引用每个 D-xxx@vN,并映射到 FR-xxx
|
|
132
|
+
3. 检查 plan.md 或 tasks/task-NN.md 是否引用每个 FR-xxx/D-xxx@vN
|
|
133
|
+
4. 检查本步骤收集的实现证据是否能回指到对应 D-xxx@vN/FR-xxx
|
|
134
|
+
5. 任意 D-xxx@vN 无下游覆盖时标记为 ⚠️ 决策未闭环
|
|
135
|
+
6. 任意 P0/P1 unresolved/blocking 决策标记为 FAIL blocker
|
|
136
|
+
|
|
126
137
|
### 探针结果处理
|
|
127
|
-
-
|
|
128
|
-
-
|
|
138
|
+
- 将四个探针的结果汇总为「探针报告」
|
|
139
|
+
- 如果探针发现问题(未实现标记、关键词缺失、测试缺失、决策未闭环),在最终验证报告中明确标注
|
|
129
140
|
- 探针发现的问题不等同于验证失败,但必须在报告中列出
|
|
130
141
|
|
|
131
142
|
### 设计一致性检查
|
|
@@ -136,9 +147,10 @@ grep -rl "<关键词>" <源码目录>/ --include="*.java" --include="*.js" --inc
|
|
|
136
147
|
4. API 设计是否符合
|
|
137
148
|
5. **Reverse Sync 检查**:如果发现实现合理但 design.md 未覆盖,先更新 design.md 补充遗漏
|
|
138
149
|
6. **模块文档一致性检查**:如果在"加载规范并锚定"步骤中加载了模块文档,检查实现是否符合模块文档描述的当前设计(特别关注接口签名、数据流、依赖关系)。不符合时标记 ⚠️(不阻断,模块文档可能未及时更新)
|
|
150
|
+
7. **决策链路检查**:如果存在 decisions.md,输出 D-xxx@vN → FR-xxx → task-xx → evidence 的追踪矩阵;缺失项必须列为风险
|
|
139
151
|
|
|
140
152
|
### 输出
|
|
141
|
-
探针报告 + 设计一致性检查结果 +
|
|
153
|
+
探针报告 + 设计一致性检查结果 + 模块文档一致性检查结果 + 决策追踪矩阵(如有)`,
|
|
142
154
|
outputHint: '设计一致性报告',
|
|
143
155
|
optional: false
|
|
144
156
|
},
|
|
@@ -210,6 +222,12 @@ PASS / PASS WITH NOTES / FAIL
|
|
|
210
222
|
- 未实现标记扫描:...
|
|
211
223
|
- 关键词覆盖:...
|
|
212
224
|
- 测试覆盖:...
|
|
225
|
+
- 决策追踪覆盖:...
|
|
226
|
+
|
|
227
|
+
## 决策追踪矩阵(如存在 decisions.md)
|
|
228
|
+
| 决策 ID | FR | Task | Evidence | 状态 |
|
|
229
|
+
|---|---|---|---|---|
|
|
230
|
+
| D-001@v1 | FR-01 | task-01 | test/file/path | PASS/PARTIAL/MISSING |
|
|
213
231
|
|
|
214
232
|
## 测试结果
|
|
215
233
|
(测试套件执行结果)
|
package/src/workflow.js
CHANGED