sillyspec 3.10.2 → 3.10.4
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/package.json +1 -1
- package/src/run.js +14 -4
- package/src/stages/brainstorm.js +87 -13
- package/src/stages/execute.js +1 -1
- package/src/stages/plan.js +129 -29
- package/src/stages/propose.js +35 -13
- package/src/stages/verify.js +34 -4
package/package.json
CHANGED
package/src/run.js
CHANGED
|
@@ -280,10 +280,20 @@ async function runStage(pm, progress, stageName, cwd) {
|
|
|
280
280
|
let currentIdx = steps.findIndex(s => s.status !== 'completed' && s.status !== 'skipped')
|
|
281
281
|
|
|
282
282
|
if (currentIdx === -1) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
283
|
+
// 已完成 → 自动重置,重新开始
|
|
284
|
+
const freshSteps = await getStageSteps(stageName, cwd, progress)
|
|
285
|
+
stageData.steps = freshSteps
|
|
286
|
+
? freshSteps.map(s => ({ name: s.name, status: 'pending' }))
|
|
287
|
+
: []
|
|
288
|
+
stageData.status = 'in-progress'
|
|
289
|
+
stageData.startedAt = new Date().toLocaleString('zh-CN', { hour12: false })
|
|
290
|
+
stageData.completedAt = null
|
|
291
|
+
pm._write(cwd, progress)
|
|
292
|
+
currentIdx = 0
|
|
293
|
+
console.log(`🔄 ${stageName} 阶段已自动重置,重新开始。\n`)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (currentIdx > 0) {
|
|
287
297
|
// 有进行中的步骤,提示用户
|
|
288
298
|
const completed = currentIdx
|
|
289
299
|
const total = steps.length
|
package/src/stages/brainstorm.js
CHANGED
|
@@ -211,6 +211,34 @@ HTML 原型文件路径(或"跳过"如果不适合)`,
|
|
|
211
211
|
name: '写设计文档并自审',
|
|
212
212
|
prompt: `撰写 design 文档并进行 AI 自审。
|
|
213
213
|
|
|
214
|
+
### design.md 必须包含的章节
|
|
215
|
+
1. **背景**:为什么做、解决什么问题
|
|
216
|
+
2. **设计目标**:要达成什么
|
|
217
|
+
3. **非目标**:明确不做的事(防止 scope creep)
|
|
218
|
+
4. **拆分判断**(如适用):为什么这样组织变更、为什么不走批量模式
|
|
219
|
+
5. **总体方案**:技术方案(分 Phase/Wave)
|
|
220
|
+
6. **文件变更清单**(必填):
|
|
221
|
+
|
|
222
|
+
| 操作 | 文件路径 | 说明 |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| 新增 | src/xxx/NewFile.java | ... |
|
|
225
|
+
| 修改 | src/xxx/ExistingFile.java | 新增 xx 方法 |
|
|
226
|
+
| 删除 | src/xxx/OldFile.java | 已被 xx 替代 |
|
|
227
|
+
|
|
228
|
+
7. **接口定义**:方法签名、数据结构(代码类任务必填)
|
|
229
|
+
8. **数据模型**(如涉及):表结构/字段变更
|
|
230
|
+
9. **兼容策略**(brownfield 必填):
|
|
231
|
+
- 未配置新功能时行为不变
|
|
232
|
+
- 新旧逻辑的回退路径
|
|
233
|
+
- 不改变的 API / 表结构
|
|
234
|
+
10. **风险登记**:
|
|
235
|
+
|
|
236
|
+
| 编号 | 风险 | 等级 | 应对策略 |
|
|
237
|
+
|---|---|---|---|
|
|
238
|
+
| R-01 | ... | P0/P1/P2 | ... |
|
|
239
|
+
|
|
240
|
+
11. **自审**(AI 对自身设计的校验)
|
|
241
|
+
|
|
214
242
|
### 操作
|
|
215
243
|
1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<变更名>\`(Windows 用 \`mkdir .sillyspec\\changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path .sillyspec/changes/<变更名>\`)
|
|
216
244
|
- 变更名格式必须为 \`YYYY-MM-DD-<简短描述>\`(如 \`2026-05-13-user-auth\`)
|
|
@@ -218,11 +246,14 @@ HTML 原型文件路径(或"跳过"如果不适合)`,
|
|
|
218
246
|
3. 自审检查:
|
|
219
247
|
- 需求覆盖:是否完整覆盖 Step 6 确认的需求
|
|
220
248
|
- 约束一致性:是否与 CONVENTIONS.md、ARCHITECTURE.md 一致
|
|
221
|
-
-
|
|
249
|
+
- 真实性:表名/字段名/类名/方法名来自真实代码或标注"新增"
|
|
222
250
|
- YAGNI:是否包含不必要功能
|
|
223
251
|
- 验收标准:是否具体可测试
|
|
224
|
-
|
|
225
|
-
|
|
252
|
+
- 非目标清晰:是否明确界定了不做的事
|
|
253
|
+
- 兼容策略(brownfield):是否说明了回退路径
|
|
254
|
+
- 风险识别:是否识别了关键技术风险和对策
|
|
255
|
+
4. 自审发现问题 → 修改后重新检查
|
|
256
|
+
5. 全部通过 → 进入下一步
|
|
226
257
|
|
|
227
258
|
### 输出
|
|
228
259
|
design.md 文件路径 + 自审结果
|
|
@@ -230,10 +261,7 @@ design.md 文件路径 + 自审结果
|
|
|
230
261
|
### 注意
|
|
231
262
|
- 自审不通过不要进入下一步
|
|
232
263
|
- 不确定的问题标注「⚠️ 自审存疑」`,
|
|
233
|
-
|
|
234
|
-
optional: false
|
|
235
|
-
},
|
|
236
|
-
{
|
|
264
|
+
|
|
237
265
|
name: '用户确认并生成规范文件',
|
|
238
266
|
prompt: `用户确认设计方案,生成规范文件。
|
|
239
267
|
|
|
@@ -241,12 +269,59 @@ design.md 文件路径 + 自审结果
|
|
|
241
269
|
1. 展示 design.md 摘要给用户
|
|
242
270
|
2. 请用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
|
|
243
271
|
3. 确认后,在 \`.sillyspec/changes/<变更名>/\` 下生成所有规范文件:
|
|
244
|
-
- **design.md**:架构决策、文件变更清单、数据模型、API
|
|
245
|
-
- **proposal.md
|
|
246
|
-
- **requirements.md
|
|
272
|
+
- **design.md**:架构决策、文件变更清单、数据模型、API 设计、兼容策略、风险登记、自审
|
|
273
|
+
- **proposal.md**:动机、关键问题(为什么现有方案不够)、变更范围、不在范围内(显式清单)、成功标准(可验证条件)
|
|
274
|
+
- **requirements.md**:角色表 + FR 编号需求 + Given/When/Then 行为规格 + 非功能需求
|
|
247
275
|
- **tasks.md**:任务列表(只列名称和对应文件路径,细节在 plan 阶段展开)
|
|
248
276
|
- \`git add .sillyspec/\` — 暂存规范文件(不要 commit)
|
|
249
277
|
|
|
278
|
+
### proposal.md 格式要求
|
|
279
|
+
\`\`\`markdown
|
|
280
|
+
# Proposal
|
|
281
|
+
|
|
282
|
+
## 动机
|
|
283
|
+
为什么做、解决什么核心问题
|
|
284
|
+
|
|
285
|
+
## 关键问题
|
|
286
|
+
为什么现有方案不够(展开 2-3 个具体痛点)
|
|
287
|
+
|
|
288
|
+
## 变更范围
|
|
289
|
+
本次做什么
|
|
290
|
+
|
|
291
|
+
## 不在范围内(显式清单)
|
|
292
|
+
- 不做 X
|
|
293
|
+
- 不做 Y
|
|
294
|
+
|
|
295
|
+
## 成功标准(可验证)
|
|
296
|
+
- 旧配置默认行为不变
|
|
297
|
+
- 新功能在配置后可用
|
|
298
|
+
- ...
|
|
299
|
+
\`\`\`
|
|
300
|
+
|
|
301
|
+
### requirements.md 格式要求
|
|
302
|
+
\`\`\`markdown
|
|
303
|
+
# Requirements
|
|
304
|
+
|
|
305
|
+
## 角色
|
|
306
|
+
| 角色 | 说明 |
|
|
307
|
+
|---|---|
|
|
308
|
+
| 开发者 | ... |
|
|
309
|
+
|
|
310
|
+
## 功能需求
|
|
311
|
+
|
|
312
|
+
### FR-01: 需求名称
|
|
313
|
+
Given 前提条件
|
|
314
|
+
When 触发动作
|
|
315
|
+
Then 期望结果
|
|
316
|
+
|
|
317
|
+
(每个边界条件独立 GWT 块)
|
|
318
|
+
|
|
319
|
+
## 非功能需求
|
|
320
|
+
- 兼容性:...
|
|
321
|
+
- 可回退:...
|
|
322
|
+
- 可测试:...
|
|
323
|
+
\`\`\`
|
|
324
|
+
|
|
250
325
|
### 输出
|
|
251
326
|
所有规范文件路径
|
|
252
327
|
|
|
@@ -255,10 +330,9 @@ design.md 文件路径 + 自审结果
|
|
|
255
330
|
- 禁止在确认前推进到后续阶段
|
|
256
331
|
- 禁止自动 commit
|
|
257
332
|
- 推翻重来回到 Step 6
|
|
258
|
-
-
|
|
333
|
+
- 表名/字段名/类名必须来自真实代码或标注"新增"
|
|
259
334
|
- tasks.md 只列任务名,细节在 plan 阶段展开`,
|
|
260
|
-
|
|
261
|
-
optional: false
|
|
335
|
+
|
|
262
336
|
}
|
|
263
337
|
]
|
|
264
338
|
}
|
package/src/stages/execute.js
CHANGED
package/src/stages/plan.js
CHANGED
|
@@ -54,10 +54,17 @@ export const fixedPrefix = [
|
|
|
54
54
|
name: '展开任务并分组',
|
|
55
55
|
prompt: `把 tasks.md 每个 checkbox 展开为任务描述,按 Wave 分组,产出 plan.md 总览。
|
|
56
56
|
|
|
57
|
-
### plan.md
|
|
57
|
+
### plan.md 格式(PM 视角 + 机器可解析)
|
|
58
58
|
\`\`\`markdown
|
|
59
59
|
# 实现计划
|
|
60
60
|
|
|
61
|
+
## Spike 前置验证(如需要)
|
|
62
|
+
| Spike | 验证内容 | 不通过后果 |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| spike-01 | ... | task-XX 推翻重设计 |
|
|
65
|
+
|
|
66
|
+
> 技术不确定性高时才需要 Spike。无不确定性则跳过此节。
|
|
67
|
+
|
|
61
68
|
## Wave 1(并行,无依赖)
|
|
62
69
|
- [ ] task-01: 添加用户创建接口
|
|
63
70
|
- [ ] task-02: 添加角色创建接口
|
|
@@ -65,14 +72,42 @@ export const fixedPrefix = [
|
|
|
65
72
|
## Wave 2(依赖 Wave 1)
|
|
66
73
|
- [ ] task-03: 用户创建接口联调
|
|
67
74
|
|
|
75
|
+
## 任务总表
|
|
76
|
+
| 编号 | 任务 | Wave | 优先级 | 估时 | 依赖 | 说明 |
|
|
77
|
+
|---|---|---|---|---|---|---|
|
|
78
|
+
| task-01 | 添加用户创建接口 | W1 | P0 | 4h | — | ... |
|
|
79
|
+
| task-02 | 添加角色创建接口 | W1 | P0 | 3h | — | ... |
|
|
80
|
+
| task-03 | 用户创建接口联调 | W2 | P0 | 4h | task-01,02 | ... |
|
|
81
|
+
|
|
82
|
+
## 依赖关系图
|
|
83
|
+
\`\`\`mermaid
|
|
84
|
+
graph LR
|
|
85
|
+
task-01 --> task-03
|
|
86
|
+
task-02 --> task-03
|
|
87
|
+
\`\`\`
|
|
88
|
+
|
|
89
|
+
## 关键路径
|
|
90
|
+
task-01 → task-03(最长路径,决定最短交付周期)
|
|
91
|
+
|
|
68
92
|
## 全局验收标准
|
|
69
93
|
- [ ] 所有单元测试通过
|
|
94
|
+
- [ ] (brownfield)未配置新功能时行为不变
|
|
70
95
|
\`\`\`
|
|
71
96
|
|
|
72
97
|
### 关键规则
|
|
73
|
-
- plan.md
|
|
98
|
+
- plan.md 包含:Wave 分组 + 任务总表 + 依赖图 + 关键路径 + 全局验收标准,**不放实现细节**
|
|
74
99
|
- 实现细节写到后续的 tasks/task-NN.md 中
|
|
75
100
|
- 每个任务编号格式:task-01、task-02 ...
|
|
101
|
+
- **Wave 下的 checkbox 行必须保留**(execute 阶段解析依赖 \`- [ ] task-XX:\` 格式)
|
|
102
|
+
- 任务总表的优先级:P0(必须)/ P1(重要)/ P2(可选)
|
|
103
|
+
- 估时参考:单个 task ≤ 8h,超过则拆分
|
|
104
|
+
|
|
105
|
+
### Spike 前置验证
|
|
106
|
+
当存在技术不确定性时,在 Wave 之前设计 Spike:
|
|
107
|
+
- 涉及新技术栈/未经验证的集成 → 需要 Spike
|
|
108
|
+
- 涉及安全隔离/性能瓶颈 → 需要 Spike
|
|
109
|
+
- 纯业务逻辑/确定的技术方案 → 不需要 Spike
|
|
110
|
+
- 每个 Spike 定义:验证内容 + 通过标准 + 不通过后果
|
|
76
111
|
|
|
77
112
|
### 批量模式指引
|
|
78
113
|
如果 design.md 或需求中包含批量特征(关键词:批量/模板/引擎/N个相似),按以下原则规划:
|
|
@@ -87,7 +122,11 @@ export const fixedPrefix = [
|
|
|
87
122
|
2. 读取 design.md 获取文件变更清单
|
|
88
123
|
3. 逐个展开为任务描述
|
|
89
124
|
4. 分析依赖关系,按 Wave 分组
|
|
90
|
-
5.
|
|
125
|
+
5. 生成任务总表(含优先级、估时、依赖)
|
|
126
|
+
6. 生成 Mermaid 依赖关系图
|
|
127
|
+
7. 标注关键路径
|
|
128
|
+
8. 评估是否需要 Spike 前置验证
|
|
129
|
+
9. 保存到 \`.sillyspec/changes/<变更名>/plan.md\`
|
|
91
130
|
|
|
92
131
|
### 输出
|
|
93
132
|
plan.md 总览内容`,
|
|
@@ -101,9 +140,13 @@ plan.md 总览内容`,
|
|
|
101
140
|
### 操作
|
|
102
141
|
检查以下各项:
|
|
103
142
|
- [ ] 每个 task 有编号(task-01、task-02 ...)
|
|
104
|
-
- [ ] 每个 task
|
|
143
|
+
- [ ] 每个 task 在 Wave 下有 checkbox(\`- [ ] task-XX:\` 格式,execute 解析依赖此格式)
|
|
105
144
|
- [ ] 已标注 Wave 分组和依赖关系
|
|
145
|
+
- [ ] 有任务总表(含优先级、估时、依赖列)
|
|
146
|
+
- [ ] 有 Mermaid 依赖关系图
|
|
147
|
+
- [ ] 有关键路径标注
|
|
106
148
|
- [ ] 有全局验收标准
|
|
149
|
+
- [ ] (brownfield)全局验收包含兼容性条款
|
|
107
150
|
- [ ] 没有实现细节(接口定义、代码示例等不应该在 plan.md 里)
|
|
108
151
|
- [ ] plan.md 与 design.md 的文件变更清单一致
|
|
109
152
|
|
|
@@ -161,57 +204,89 @@ function parseTaskCount(planContent) {
|
|
|
161
204
|
* 生成单个任务的蓝图写作 prompt
|
|
162
205
|
*/
|
|
163
206
|
function buildTaskPrompt(taskNum, taskName, changeDir) {
|
|
164
|
-
|
|
207
|
+
const num = String(taskNum).padStart(2, '0')
|
|
208
|
+
return `编写任务蓝图 tasks/task-${num}.md
|
|
165
209
|
|
|
166
210
|
### 任务
|
|
167
211
|
${taskName}
|
|
168
212
|
|
|
169
213
|
### 文件路径
|
|
170
|
-
\`.sillyspec/changes/<变更名>/tasks/task-${
|
|
214
|
+
\`.sillyspec/changes/<变更名>/tasks/task-${num}.md\`
|
|
171
215
|
|
|
172
216
|
### 格式要求(必须严格遵守)
|
|
173
217
|
\`\`\`markdown
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
218
|
+
---
|
|
219
|
+
id: task-${num}
|
|
220
|
+
title: ${taskName}
|
|
221
|
+
priority: P0
|
|
222
|
+
estimated_hours: N
|
|
223
|
+
depends_on: []
|
|
224
|
+
blocks: []
|
|
225
|
+
allowed_paths:
|
|
226
|
+
- 允许修改的路径范围
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
# task-${num}: ${taskName}
|
|
230
|
+
|
|
231
|
+
## 修改文件(必填)
|
|
232
|
+
- 精确到文件路径,列出所有需要新增或修改的文件
|
|
178
233
|
|
|
179
234
|
## 实现要求
|
|
180
235
|
1. 具体做什么,写清楚
|
|
181
236
|
2. ...
|
|
182
237
|
|
|
183
|
-
##
|
|
184
|
-
|
|
238
|
+
## 接口定义(代码类任务必填)
|
|
239
|
+
写方法签名、数据结构、控制流伪代码。AI executor 应能照着直接编码。
|
|
240
|
+
|
|
241
|
+
## 边界处理(必填)
|
|
242
|
+
- null/空值行为
|
|
243
|
+
- 兼容旧行为(brownfield:未配置新功能时行为不变)
|
|
244
|
+
- 异常不静默吞掉(明确返回值或抛出)
|
|
245
|
+
- 不修改传入参数
|
|
246
|
+
- 歧义/冲突场景的处理策略
|
|
185
247
|
|
|
186
|
-
##
|
|
187
|
-
-
|
|
248
|
+
## 非目标(本任务不做的事)
|
|
249
|
+
- 明确列出边界,防止 scope creep
|
|
188
250
|
|
|
189
251
|
## 参考
|
|
190
252
|
- 已有代码可参考的模式
|
|
191
253
|
- 相关的 CONVENTIONS.md 条目
|
|
192
254
|
|
|
193
255
|
## TDD 步骤
|
|
194
|
-
1.
|
|
195
|
-
2. 运行 <test-cmd>
|
|
196
|
-
3.
|
|
197
|
-
4. 运行 <test-cmd>
|
|
256
|
+
1. 写 XxxTest,覆盖场景 A/B/C
|
|
257
|
+
2. 运行 <test-cmd> 确认测试失败
|
|
258
|
+
3. 实现 Xxx
|
|
259
|
+
4. 运行 <test-cmd> 确认测试通过
|
|
260
|
+
5. 运行全量测试确认无回退
|
|
198
261
|
(纯配置/文档类任务简化为:1. 实现 2. 验证)
|
|
199
262
|
|
|
200
263
|
## 验收标准
|
|
201
|
-
|
|
264
|
+
| # | 验证步骤 | 通过标准 |
|
|
265
|
+
|---|---|---|
|
|
266
|
+
| AC-01 | 具体操作 | 期望结果 |
|
|
267
|
+
| AC-02 | ... | ... |
|
|
202
268
|
\`\`\`
|
|
203
269
|
|
|
270
|
+
### frontmatter 元数据说明
|
|
271
|
+
- \`priority\`: P0(必须)/ P1(重要)/ P2(可选)
|
|
272
|
+
- \`estimated_hours\`: 预估工时,单个 task ≤ 8h
|
|
273
|
+
- \`depends_on\`: 依赖的前序 task 编号列表
|
|
274
|
+
- \`blocks\`: 被本 task 阻塞的后续 task 编号列表
|
|
275
|
+
- \`allowed_paths\`: AI executor 可以修改的文件路径范围(安全边界)
|
|
276
|
+
|
|
204
277
|
### 关键规则
|
|
205
278
|
- task-N.md 必须独立完整,execute 子代理只读这一个文件就能干活
|
|
206
279
|
- 不要依赖其他 task-N.md 的内容
|
|
207
280
|
- 接口定义写到"搬砖工照着做"的程度
|
|
281
|
+
- 边界处理至少覆盖 5 条规则
|
|
282
|
+
- 验收标准用表格格式,每条可点击验证,禁止"功能可演示"类笼统表述
|
|
208
283
|
- 写完后保存到文件
|
|
209
284
|
|
|
210
285
|
### 操作
|
|
211
286
|
1. 读取 design.md 和 plan.md 了解上下文
|
|
212
287
|
2. 读取相关源文件了解现有代码
|
|
213
288
|
3. 编写任务蓝图
|
|
214
|
-
4. 保存到 tasks/task-${
|
|
289
|
+
4. 保存到 tasks/task-${num}.md
|
|
215
290
|
|
|
216
291
|
### 输出
|
|
217
292
|
任务蓝图内容摘要`
|
|
@@ -238,37 +313,60 @@ export function buildCoordinatorStep(changeDir, taskNames) {
|
|
|
238
313
|
2. 读取相关源文件了解现有代码
|
|
239
314
|
3. 按以下格式编写任务蓝图并保存到 ${changeDir}/tasks/task-${num}.md:
|
|
240
315
|
|
|
316
|
+
---
|
|
317
|
+
id: task-${num}
|
|
318
|
+
title: ${name}
|
|
319
|
+
priority: P0/P1/P2
|
|
320
|
+
estimated_hours: N
|
|
321
|
+
depends_on: [task-XX]
|
|
322
|
+
blocks: [task-XX]
|
|
323
|
+
allowed_paths:
|
|
324
|
+
- ...
|
|
325
|
+
---
|
|
326
|
+
|
|
241
327
|
# task-${num}: ${name}
|
|
242
328
|
|
|
243
|
-
##
|
|
244
|
-
-
|
|
329
|
+
## 修改文件(必填)
|
|
330
|
+
- 精确到文件路径
|
|
245
331
|
|
|
246
332
|
## 实现要求
|
|
247
333
|
1. 具体做什么
|
|
248
334
|
|
|
249
|
-
##
|
|
250
|
-
|
|
335
|
+
## 接口定义(代码类任务必填)
|
|
336
|
+
方法签名、数据结构、控制流伪代码
|
|
337
|
+
|
|
338
|
+
## 边界处理(必填)
|
|
339
|
+
- null/空值行为
|
|
340
|
+
- 兼容旧行为(brownfield:未配置新功能时行为不变)
|
|
341
|
+
- 异常不静默吞掉(明确返回值或抛出)
|
|
342
|
+
- 不修改传入参数
|
|
343
|
+
- 歧义/冲突场景的处理策略
|
|
251
344
|
|
|
252
|
-
##
|
|
253
|
-
-
|
|
345
|
+
## 非目标(本任务不做的事)
|
|
346
|
+
- 明确边界,防止 scope creep
|
|
254
347
|
|
|
255
348
|
## 参考
|
|
256
349
|
- 可参考的模式
|
|
257
350
|
|
|
258
351
|
## TDD 步骤
|
|
259
|
-
1. 写测试 → 2. 确认失败 → 3. 写代码 → 4. 确认通过
|
|
352
|
+
1. 写测试 → 2. 确认失败 → 3. 写代码 → 4. 确认通过 → 5. 回归
|
|
260
353
|
|
|
261
354
|
## 验收标准
|
|
262
|
-
|
|
355
|
+
| # | 验证步骤 | 通过标准 |
|
|
356
|
+
|---|---|---|
|
|
357
|
+
| AC-01 | ... | ... |
|
|
263
358
|
|
|
264
359
|
关键规则:
|
|
265
360
|
- 必须独立完整,execute 子代理只读这一个文件就能干活
|
|
266
361
|
- 不要依赖其他 task-N.md 的内容
|
|
267
362
|
- 接口定义写到"搬砖工照着做"的程度
|
|
363
|
+
- 边界处理至少 5 条
|
|
364
|
+
- 验收标准用表格,禁止笼统表述
|
|
268
365
|
- 写完后用 Write tool 保存到文件
|
|
269
366
|
\`\`\``
|
|
270
367
|
}).join('\n\n')
|
|
271
368
|
|
|
369
|
+
|
|
272
370
|
return {
|
|
273
371
|
name: '生成任务蓝图(子代理并行)',
|
|
274
372
|
prompt: `为 plan.md 中的每个任务生成独立蓝图文件。
|
|
@@ -293,7 +391,9 @@ ${subagentPrompts}
|
|
|
293
391
|
|
|
294
392
|
## 验收
|
|
295
393
|
- 每个 task-N.md 文件存在且非空
|
|
296
|
-
-
|
|
394
|
+
- 包含 YAML frontmatter(id、title、priority、depends_on、blocks、allowed_paths)
|
|
395
|
+
- 包含所有必要章节:修改文件、实现要求、接口定义、边界处理(≥5条)、非目标、TDD 步骤、验收标准(表格格式)
|
|
396
|
+
- 边界处理覆盖:null/空值、兼容性、异常处理、参数不可变、歧义场景`,
|
|
297
397
|
outputHint: '蓝图生成结果',
|
|
298
398
|
optional: false
|
|
299
399
|
}
|
package/src/stages/propose.js
CHANGED
|
@@ -65,39 +65,61 @@ export const definition = {
|
|
|
65
65
|
name: '生成规范文件',
|
|
66
66
|
prompt: `在 \`.sillyspec/changes/<变更名>/\` 下生成四个文件。
|
|
67
67
|
|
|
68
|
+
### proposal.md 格式要求
|
|
69
|
+
- **动机**:为什么做、解决什么核心问题
|
|
70
|
+
- **关键问题**:为什么现有方案不够(展开 2-3 个具体痛点)
|
|
71
|
+
- **变更范围**:本次做什么
|
|
72
|
+
- **不在范围内**(显式清单):不做 X、不做 Y
|
|
73
|
+
- **成功标准**(可验证条件):旧配置默认行为不变、新功能配置后可用
|
|
74
|
+
|
|
75
|
+
### requirements.md 格式要求
|
|
76
|
+
- **角色表**:涉及的角色和说明
|
|
77
|
+
- **FR 编号需求**:FR-01、FR-02 ... 每条需求用 Given/When/Then 格式
|
|
78
|
+
- **每个边界条件**独立 GWT 块
|
|
79
|
+
- **非功能需求**:兼容性、可回退、可测试、可扩展
|
|
80
|
+
|
|
81
|
+
### design.md 格式要求
|
|
82
|
+
- **架构决策** + **文件变更清单表格** + **接口定义**
|
|
83
|
+
- **兼容策略**(brownfield 必填):未配置新功能时行为不变、回退路径
|
|
84
|
+
- **风险登记**表格:编号/风险/等级/应对策略
|
|
85
|
+
- **自审**:需求覆盖、真实性、YAGNI、非目标
|
|
86
|
+
|
|
87
|
+
### tasks.md 格式要求
|
|
88
|
+
- 任务列表(只列名称,不展开步骤)
|
|
89
|
+
- 每个 task 附文件路径
|
|
90
|
+
|
|
68
91
|
### 操作
|
|
69
|
-
1. 生成 proposal.md
|
|
70
|
-
2. 生成 requirements.md
|
|
71
|
-
3. 生成 design.md
|
|
72
|
-
4. 生成 tasks.md
|
|
92
|
+
1. 生成 proposal.md
|
|
93
|
+
2. 生成 requirements.md
|
|
94
|
+
3. 生成 design.md
|
|
95
|
+
4. 生成 tasks.md
|
|
73
96
|
|
|
74
97
|
### 输出
|
|
75
98
|
四个文件路径
|
|
76
99
|
|
|
77
100
|
### 注意
|
|
78
|
-
-
|
|
101
|
+
- 表名/字段名/类名必须来自真实代码或标注"新增"
|
|
79
102
|
- 用户场景必须用 Given/When/Then 格式
|
|
80
103
|
- tasks.md 只列任务名,细节在 plan 阶段展开`,
|
|
81
|
-
|
|
82
|
-
optional: false
|
|
83
|
-
},
|
|
84
|
-
{
|
|
104
|
+
|
|
85
105
|
name: '自检门控',
|
|
86
106
|
prompt: `自检生成的规范文件。
|
|
87
107
|
|
|
88
108
|
### 操作
|
|
89
109
|
检查以下各项:
|
|
90
|
-
- [ ] proposal.md
|
|
110
|
+
- [ ] proposal.md 有动机、关键问题、变更范围、不在范围内、成功标准
|
|
91
111
|
- [ ] design.md 有文件变更清单表格
|
|
92
|
-
- [ ]
|
|
112
|
+
- [ ] design.md 有兼容策略(brownfield 时)
|
|
113
|
+
- [ ] design.md 有风险登记表格
|
|
114
|
+
- [ ] requirements.md 有角色表
|
|
115
|
+
- [ ] requirements.md 有 FR 编号和 Given/When/Then 用户场景
|
|
93
116
|
- [ ] tasks.md 每个 task 有文件路径
|
|
94
117
|
|
|
95
118
|
任何不通过 → 修正后重新检查。
|
|
96
119
|
|
|
97
120
|
### 输出
|
|
98
121
|
自检通过/不通过`,
|
|
99
|
-
|
|
100
|
-
optional: false
|
|
122
|
+
|
|
101
123
|
},
|
|
102
124
|
{
|
|
103
125
|
name: '展示并更新进度',
|
package/src/stages/verify.js
CHANGED
|
@@ -145,18 +145,48 @@ grep -rl "<关键词>" <源码目录>/ --include="*.java" --include="*.js" --inc
|
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
name: '输出验证报告',
|
|
148
|
-
prompt:
|
|
148
|
+
prompt: `生成完整验证报告,并写入 verification.md。
|
|
149
149
|
|
|
150
150
|
### 操作
|
|
151
151
|
1. 汇总以上所有检查结果
|
|
152
|
-
2.
|
|
152
|
+
2. 生成 verification.md 文件,保存到 \`.sillyspec/changes/<变更名>/verification.md\`
|
|
153
|
+
3. 给出结论:PASS / PASS WITH NOTES / FAIL
|
|
154
|
+
|
|
155
|
+
### verification.md 格式
|
|
156
|
+
\`\`\`markdown
|
|
157
|
+
# 验证报告
|
|
158
|
+
|
|
159
|
+
## 结论
|
|
160
|
+
PASS / PASS WITH NOTES / FAIL
|
|
161
|
+
|
|
162
|
+
## 任务完成度
|
|
163
|
+
(逐项检查任务的结果)
|
|
164
|
+
|
|
165
|
+
## 设计一致性
|
|
166
|
+
(对照 design.md 的检查结果)
|
|
167
|
+
|
|
168
|
+
## 探针结果
|
|
169
|
+
- 未实现标记扫描:...
|
|
170
|
+
- 关键词覆盖:...
|
|
171
|
+
- 测试覆盖:...
|
|
172
|
+
|
|
173
|
+
## 测试结果
|
|
174
|
+
(测试套件执行结果)
|
|
175
|
+
|
|
176
|
+
## 技术债务
|
|
177
|
+
(TODO/FIXME/HACK 统计)
|
|
178
|
+
|
|
179
|
+
## 代码审查
|
|
180
|
+
(问题列表 + 总体评价)
|
|
181
|
+
\`\`\`
|
|
153
182
|
|
|
154
183
|
### 输出
|
|
155
|
-
|
|
184
|
+
verification.md 路径 + 验证报告摘要 + 下一步命令
|
|
156
185
|
|
|
157
186
|
### 注意
|
|
158
187
|
- PASS → 运行 \`sillyspec run archive\` 归档
|
|
159
|
-
- FAIL → 修复后运行 \`sillyspec run verify\`
|
|
188
|
+
- FAIL → 修复后运行 \`sillyspec run verify\` 重新验证
|
|
189
|
+
- verification.md 是变更包的正式验收记录,归档后保留`,
|
|
160
190
|
outputHint: '验证报告',
|
|
161
191
|
optional: false
|
|
162
192
|
}
|