sillyspec 3.7.13 → 3.7.15
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/skills/sillyspec-archive/SKILL.md +77 -0
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +591 -0
- package/.claude/skills/sillyspec-continue/SKILL.md +44 -0
- package/.claude/skills/sillyspec-execute/SKILL.md +233 -0
- package/.claude/skills/sillyspec-explore/SKILL.md +96 -0
- package/.claude/skills/sillyspec-export/SKILL.md +53 -0
- package/.claude/skills/sillyspec-init/SKILL.md +171 -0
- package/.claude/skills/sillyspec-plan/SKILL.md +263 -0
- package/.claude/skills/sillyspec-propose/SKILL.md +248 -0
- package/.claude/skills/sillyspec-quick/SKILL.md +102 -0
- package/.claude/skills/sillyspec-resume/SKILL.md +111 -0
- package/{templates/scan.md → .claude/skills/sillyspec-scan/SKILL.md} +22 -60
- package/.claude/skills/sillyspec-state/SKILL.md +54 -0
- package/.claude/skills/sillyspec-status/SKILL.md +131 -0
- package/.claude/skills/sillyspec-verify/SKILL.md +146 -0
- package/.claude/skills/sillyspec-workspace/SKILL.md +149 -0
- package/.sillyspec/changes/run-command-design/design.md +1230 -0
- package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
- package/.sillyspec/knowledge/INDEX.md +8 -0
- package/.sillyspec/knowledge/uncategorized.md +3 -0
- package/.sillyspec/projects/sillyspec.yaml +3 -0
- package/README.md +4 -0
- package/logo.jpg +0 -0
- package/package.json +7 -1
- package/packages/dashboard/dist/assets/index-Bx0cgoK_.js +7446 -0
- package/packages/dashboard/dist/assets/index-DbkUSsNO.css +1 -0
- package/packages/dashboard/dist/favicon.jpg +0 -0
- package/packages/dashboard/dist/index.html +2 -2
- package/packages/dashboard/dist/logo.jpg +0 -0
- package/packages/dashboard/package-lock.json +220 -0
- package/packages/dashboard/package.json +8 -5
- package/packages/dashboard/public/favicon.jpg +0 -0
- package/packages/dashboard/public/logo.jpg +0 -0
- package/packages/dashboard/server/index.js +92 -4
- package/packages/dashboard/server/parser.js +252 -28
- package/packages/dashboard/src/App.vue +139 -9
- package/packages/dashboard/src/components/ActionBar.vue +23 -39
- package/packages/dashboard/src/components/CommandPalette.vue +40 -65
- package/packages/dashboard/src/components/DetailPanel.vue +68 -53
- package/packages/dashboard/src/components/DocPreview.vue +137 -20
- package/packages/dashboard/src/components/DocTree.vue +48 -26
- package/packages/dashboard/src/components/LogStream.vue +12 -32
- package/packages/dashboard/src/components/PipelineStage.vue +8 -8
- package/packages/dashboard/src/components/PipelineView.vue +35 -43
- package/packages/dashboard/src/components/ProjectList.vue +52 -77
- package/packages/dashboard/src/components/ProjectOverview.vue +178 -0
- package/packages/dashboard/src/components/StageBadge.vue +13 -13
- package/packages/dashboard/src/components/StepCard.vue +11 -11
- package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -0
- package/packages/dashboard/src/components/detail/GitDetail.vue +61 -0
- package/packages/dashboard/src/components/detail/TechDetail.vue +43 -0
- package/packages/dashboard/src/main.js +4 -1
- package/packages/dashboard/src/style.css +13 -13
- package/src/index.js +55 -8
- package/src/init.js +66 -196
- package/src/migrate.js +1 -18
- package/src/progress.js +279 -281
- package/src/run.js +320 -0
- package/src/setup.js +1 -9
- package/src/stages/brainstorm.js +210 -0
- package/src/stages/execute.js +190 -0
- package/src/stages/index.js +22 -0
- package/src/stages/plan.js +118 -0
- package/src/stages/propose.js +115 -0
- package/src/stages/verify.js +98 -0
- package/packages/dashboard/dist/assets/index-5Rrvs0Rl.css +0 -1
- package/packages/dashboard/dist/assets/index-ZNToqi9V.js +0 -17
- package/templates/archive.md +0 -121
- package/templates/brainstorm.md +0 -246
- package/templates/commit.md +0 -123
- package/templates/continue.md +0 -32
- package/templates/execute.md +0 -314
- package/templates/explore.md +0 -60
- package/templates/export.md +0 -21
- package/templates/init.md +0 -61
- package/templates/plan.md +0 -157
- package/templates/progress-format.md +0 -90
- package/templates/propose.md +0 -73
- package/templates/quick.md +0 -135
- package/templates/resume-dialog.md +0 -55
- package/templates/resume.md +0 -53
- package/templates/scan-quick.md +0 -49
- package/templates/skills/playwright-e2e/SKILL.md +0 -340
- package/templates/status.md +0 -72
- package/templates/verify.md +0 -253
- package/templates/workspace-sync.md +0 -89
- package/templates/workspace.md +0 -67
- /package/.sillyspec/{docs/sillyspec/brainstorm → changes/brainstorm-archive}/2026-04-05-dashboard-design.md +0 -0
- /package/.sillyspec/{docs/sillyspec/brainstorm → changes/brainstorm-archive}/2026-04-05-unified-docs-design.md +0 -0
- /package/.sillyspec/{specs/2026-04-05-dashboard-design.md → changes/dashboard/design.md.braindraft} +0 -0
- /package/.sillyspec/{specs/2026-04-05-unified-docs-design.md → changes/unified-docs-design/design.md} +0 -0
|
@@ -0,0 +1,1230 @@
|
|
|
1
|
+
# `sillyspec run` 命令设计方案
|
|
2
|
+
|
|
3
|
+
> 日期:2026-04-06
|
|
4
|
+
> 状态:设计阶段
|
|
5
|
+
|
|
6
|
+
## 1. 核心理念
|
|
7
|
+
|
|
8
|
+
**现状:** AI 读取整个 SKILL.md(200-600 行),全部塞进上下文,AI 自己决定流程步骤。
|
|
9
|
+
|
|
10
|
+
**目标:** CLI 成为流程引擎,AI 变成步骤执行器,每次只收到当前步骤的精简 prompt(10-30 行)。
|
|
11
|
+
|
|
12
|
+
**效果:** 上下文节省 80%+,流程标准化,进度可追踪。
|
|
13
|
+
|
|
14
|
+
## 2. 命令设计
|
|
15
|
+
|
|
16
|
+
### 用法
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
sillyspec run <stage> # 输出当前步骤 prompt
|
|
20
|
+
sillyspec run <stage> --done # 标记当前步骤完成,输出下一步 prompt
|
|
21
|
+
sillyspec run <stage> --done --output "摘要" # 标记完成 + 记录输出摘要
|
|
22
|
+
sillyspec run <stage> --skip # 跳过当前步骤
|
|
23
|
+
sillyspec run <stage> --status # 查看阶段状态(进度条)
|
|
24
|
+
sillyspec run <stage> --reset # 重置阶段(所有步骤回到 pending)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 参数
|
|
28
|
+
|
|
29
|
+
| 参数 | 说明 |
|
|
30
|
+
|---|---|
|
|
31
|
+
| `<stage>` | 阶段名:`brainstorm` / `propose` / `plan` / `execute` / `verify` |
|
|
32
|
+
| `--done` | 标记当前步骤完成,自动输出下一步 |
|
|
33
|
+
| `--output` | 配合 `--done`,记录步骤输出摘要 |
|
|
34
|
+
| `--skip` | 跳过当前步骤(标记 skipped) |
|
|
35
|
+
| `--status` | 显示阶段进度,不执行任何操作 |
|
|
36
|
+
| `--reset` | 重置阶段所有步骤为 pending |
|
|
37
|
+
|
|
38
|
+
### 退出码
|
|
39
|
+
|
|
40
|
+
- `0`:成功输出步骤 / 标记完成
|
|
41
|
+
- `1`:错误(阶段不存在、progress.json 格式错误等)
|
|
42
|
+
- `2`:阶段已完成(无待执行步骤)
|
|
43
|
+
|
|
44
|
+
## 3. 步骤定义格式
|
|
45
|
+
|
|
46
|
+
每个阶段一个 JS 文件,导出 `definition` 对象:
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
// src/stages/brainstorm.js
|
|
50
|
+
export const definition = {
|
|
51
|
+
name: 'brainstorm',
|
|
52
|
+
title: '头脑风暴',
|
|
53
|
+
description: '探索需求、分析技术方案、识别风险',
|
|
54
|
+
steps: [
|
|
55
|
+
{
|
|
56
|
+
name: '状态检查',
|
|
57
|
+
prompt: `...`, // 10-30 行精简 prompt
|
|
58
|
+
outputHint: '状态摘要', // 提示 AI 应输出什么
|
|
59
|
+
optional: false // 是否可跳过
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**步骤定义原则:**
|
|
66
|
+
- 每个 prompt 10-30 行,只包含当前步骤必需的信息
|
|
67
|
+
- 不重复阶段级信息(如"禁止写代码"只写一次,不每步重复)
|
|
68
|
+
- 不包含交互式流程图(CLI 已控制流程)
|
|
69
|
+
- 文件路径使用相对路径,由 CLI 在运行时解析
|
|
70
|
+
- 生成的每个文件头部必须包含 author(git 用户名)和 created_at(精确到秒),方便追溯
|
|
71
|
+
|
|
72
|
+
## 4. 五个阶段的完整步骤列表
|
|
73
|
+
|
|
74
|
+
### 4.1 brainstorm(10 步)
|
|
75
|
+
|
|
76
|
+
| # | 名称 | 可跳过 | 输出 |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| 1 | 状态检查 | 否 | 当前状态摘要 |
|
|
79
|
+
| 2 | 加载项目上下文 | 否 | 项目现状理解 |
|
|
80
|
+
| 3 | 协作与复用检查 | 是 | 已有变更和可用模板 |
|
|
81
|
+
| 4 | 原型/设计图分析 | 是 | 页面结构、字段、交互流程 |
|
|
82
|
+
| 5 | 需求范围评估 | 是 | 拆分方案(如需要)+ MASTER.md |
|
|
83
|
+
| 6 | 对话式探索 | 否 | 需求理解确认 |
|
|
84
|
+
| 7 | 提出 2-3 种方案 | 否 | 方案对比 + 推荐 |
|
|
85
|
+
| 8 | 分段展示设计 | 否 | 设计方案逐段确认 |
|
|
86
|
+
| 9 | 写设计文档并自审 | 否 | design.md 文件 |
|
|
87
|
+
| 10 | 用户确认并输出技术方案 | 否 | design.md 最终版 + Git 提交 |
|
|
88
|
+
|
|
89
|
+
#### 步骤 Prompt 定义
|
|
90
|
+
|
|
91
|
+
**Step 1/10: 状态检查**
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
检查 .sillyspec/.runtime/progress.json 确认当前状态。
|
|
95
|
+
|
|
96
|
+
### 操作
|
|
97
|
+
1. 运行 `sillyspec progress show`
|
|
98
|
+
2. 确认 currentStage 为 "brainstorm"
|
|
99
|
+
3. 如果有进行中的 brainstorm,提示选择继续或重新开始
|
|
100
|
+
4. 如果未初始化,提示先运行 sillyspec init
|
|
101
|
+
|
|
102
|
+
### 输出
|
|
103
|
+
当前状态摘要(1-2 句话)
|
|
104
|
+
|
|
105
|
+
### 注意
|
|
106
|
+
- 以 CLI 返回为准,不要自行推断阶段
|
|
107
|
+
- 如果阶段不对,输出正确提示并停止
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Step 2/10: 加载项目上下文**
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
加载项目现有上下文,理解代码结构和约定。
|
|
114
|
+
|
|
115
|
+
### 操作
|
|
116
|
+
1. 检查是否工作区模式:`ls .sillyspec/projects/*.yaml`
|
|
117
|
+
2. 工作区模式:加载 CODEBASE-OVERVIEW.md + 共享规范 + 子项目上下文
|
|
118
|
+
3. 单项目模式:加载 PROJECT.md、REQUIREMENTS.md、ROADMAP.md
|
|
119
|
+
4. 棕地项目:读取 docs/<project>/scan/ 下的 STRUCTURE.md、CONVENTIONS.md、ARCHITECTURE.md
|
|
120
|
+
5. 查看进行中的变更:`ls .sillyspec/changes/ | grep -v archive`
|
|
121
|
+
|
|
122
|
+
### 输出
|
|
123
|
+
项目现状理解摘要(3-5 句话,关键约定和架构决策)
|
|
124
|
+
|
|
125
|
+
### 注意
|
|
126
|
+
- 工作区模式下需要询问本次需求属于哪个子项目
|
|
127
|
+
- 棕地项目必须读取数据模型章节
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Step 3/10: 协作与复用检查**
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
检查是否有同名变更或可复用模板。
|
|
134
|
+
|
|
135
|
+
### 操作
|
|
136
|
+
1. 检查已有变更:`ls .sillyspec/changes/ | grep -v archive`
|
|
137
|
+
- 有相关变更 → 提示用户,避免重复
|
|
138
|
+
2. 检查全局模板:`ls ~/.sillyspec/templates/`
|
|
139
|
+
- 有匹配模板 → 询问是否基于模板
|
|
140
|
+
3. 无相关内容 → 跳过,不输出
|
|
141
|
+
|
|
142
|
+
### 输出
|
|
143
|
+
检测到的相关变更和可用模板(无则输出"无冲突,继续")
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Step 4/10: 原型/设计图分析**
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
如果用户提供了截图、图片或 HTML 原型,分析提取结构。
|
|
150
|
+
|
|
151
|
+
### 操作
|
|
152
|
+
1. 识别图片中的页面结构(区域、组件、布局)
|
|
153
|
+
2. 提取表单字段(名称、类型、必填、选项)
|
|
154
|
+
3. 提取交互流程(页面跳转、按钮行为)
|
|
155
|
+
4. 提取标注和备注(业务规则、权限说明)
|
|
156
|
+
5. 展示分析结果,请用户确认遗漏
|
|
157
|
+
|
|
158
|
+
### 输出
|
|
159
|
+
页面结构树 + 字段列表 + 交互流程图
|
|
160
|
+
|
|
161
|
+
### 注意
|
|
162
|
+
- 没有原型则跳过此步骤
|
|
163
|
+
- 多页面时逐页分析,不要一次全部输出
|
|
164
|
+
- 图片信息 > 文字描述,不要忽略视觉信息
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Step 5/10: 需求范围评估**
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
评估需求复杂度,判断是否需要拆分。
|
|
171
|
+
|
|
172
|
+
### 操作
|
|
173
|
+
1. 根据分析结果判断复杂度
|
|
174
|
+
2. 满足以下任意 2 条建议拆分:
|
|
175
|
+
- 3+ 个可独立交付的功能模块
|
|
176
|
+
- 3+ 种角色有不同权限和视图
|
|
177
|
+
- 跨页面状态流转(审批流、多步表单)
|
|
178
|
+
- 模块间耦合度低可独立开发
|
|
179
|
+
3. 需要拆分 → 生成 MASTER.md,规划子阶段
|
|
180
|
+
4. 不需要拆分 → 继续
|
|
181
|
+
|
|
182
|
+
### 输出
|
|
183
|
+
拆分方案(如需要)或"无需拆分"确认
|
|
184
|
+
|
|
185
|
+
### 注意
|
|
186
|
+
- 简单 CRUD 不拆
|
|
187
|
+
- 拆分方案需用户确认
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Step 6/10: 对话式探索**
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
通过对话探索需求细节。
|
|
194
|
+
|
|
195
|
+
### 操作
|
|
196
|
+
1. 从最核心的一个问题开始(用户到底想要什么?)
|
|
197
|
+
2. 等待用户回答后再问下一个
|
|
198
|
+
3. 根据回答判断:信息够了 → 进入方案 / 需要追问 → 只问一个
|
|
199
|
+
4. 探索顺序(按需):目的 → 约束 → 边界 → 成功标准
|
|
200
|
+
|
|
201
|
+
### 输出
|
|
202
|
+
需求理解摘要(用户确认的需求点列表)
|
|
203
|
+
|
|
204
|
+
### 铁律
|
|
205
|
+
- 一次只问一个问题
|
|
206
|
+
- 2-3 轮问答就应进入方案讨论
|
|
207
|
+
- 多选题优于开放式问题
|
|
208
|
+
- YAGNI — 砍掉不需要的功能
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Step 7/10: 提出 2-3 种方案**
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
基于需求理解,提出 2-3 种实现方案。
|
|
215
|
+
|
|
216
|
+
### 操作
|
|
217
|
+
1. 每种方案列出:核心思路、优势、劣势
|
|
218
|
+
2. 给出推荐方案和理由
|
|
219
|
+
3. 等待用户选择或调整
|
|
220
|
+
|
|
221
|
+
### 输出
|
|
222
|
+
方案对比表 + 推荐方案
|
|
223
|
+
|
|
224
|
+
### 注意
|
|
225
|
+
- 方案差异要实质性的,不要为了凑数
|
|
226
|
+
- 推荐理由要具体
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Step 8/10: 分段展示设计**
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
按复杂度分段展示设计方案,逐段确认。
|
|
233
|
+
|
|
234
|
+
### 操作
|
|
235
|
+
1. 简单项目:几句话整体描述
|
|
236
|
+
2. 复杂项目:每段 200-300 字,逐段展示
|
|
237
|
+
3. 每段展示后等待用户确认
|
|
238
|
+
4. 收集修改意见,调整设计
|
|
239
|
+
|
|
240
|
+
### 输出
|
|
241
|
+
用户确认的完整设计方案
|
|
242
|
+
|
|
243
|
+
### 注意
|
|
244
|
+
- 不要一次输出大段文字
|
|
245
|
+
- 逐段确认,确保用户跟上
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Step 9/10: 写设计文档并自审**
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
撰写 design 文档并进行 AI 自审。
|
|
252
|
+
|
|
253
|
+
### 操作
|
|
254
|
+
1. 将确认的设计写入 `.sillyspec/specs/YYYY-MM-DD-<topic>-design.md`
|
|
255
|
+
2. 自审检查:
|
|
256
|
+
- 需求覆盖:是否完整覆盖 Step 6 确认的需求
|
|
257
|
+
- 约束一致性:是否与 CONVENTIONS.md、ARCHITECTURE.md 一致
|
|
258
|
+
- 真实性:表名/字段名来自真实 schema 或标注"新增"
|
|
259
|
+
- YAGNI:是否包含不必要功能
|
|
260
|
+
- 验收标准:是否具体可测试
|
|
261
|
+
3. 自审发现问题 → 修改后重新检查
|
|
262
|
+
4. 全部通过 → 进入下一步
|
|
263
|
+
|
|
264
|
+
### 输出
|
|
265
|
+
design.md 文件路径 + 自审结果
|
|
266
|
+
|
|
267
|
+
### 注意
|
|
268
|
+
- 自审不通过不要进入下一步
|
|
269
|
+
- 不确定的问题标注「⚠️ 自审存疑」
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Step 10/10: 用户确认并输出技术方案**
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
用户确认设计方案,生成最终技术方案。
|
|
276
|
+
|
|
277
|
+
### 操作
|
|
278
|
+
1. 展示 design.md 摘要给用户
|
|
279
|
+
2. 请用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
|
|
280
|
+
3. 确认后:
|
|
281
|
+
- 将技术方案写入 `.sillyspec/changes/<变更名>/design.md`
|
|
282
|
+
- 包含:架构决策、文件变更清单、数据模型、API 设计、代码风格参照
|
|
283
|
+
- Git 提交
|
|
284
|
+
|
|
285
|
+
### 输出
|
|
286
|
+
最终 design.md 路径 + Git commit hash
|
|
287
|
+
|
|
288
|
+
### 注意
|
|
289
|
+
- 必须等待用户明确确认
|
|
290
|
+
- 禁止在确认前推进到后续阶段
|
|
291
|
+
- 推翻重来回到 Step 6
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
### 4.2 propose(7 步)
|
|
297
|
+
|
|
298
|
+
| # | 名称 | 可跳过 | 输出 |
|
|
299
|
+
|---|---|---|---|
|
|
300
|
+
| 1 | 状态检查 | 否 | 当前状态摘要 |
|
|
301
|
+
| 2 | 加载上下文 | 否 | 规范文件列表 |
|
|
302
|
+
| 3 | 锚定确认 | 否 | 已加载文件确认 |
|
|
303
|
+
| 4 | 探索现有代码 | 否 | 影响范围分析 |
|
|
304
|
+
| 5 | 生成规范文件 | 否 | proposal.md + design.md + tasks.md + requirements.md |
|
|
305
|
+
| 6 | 自检门控 | 否 | 自检通过确认 |
|
|
306
|
+
| 7 | 展示并更新进度 | 否 | 用户审阅 + CLI 更新 |
|
|
307
|
+
|
|
308
|
+
#### 步骤 Prompt 定义
|
|
309
|
+
|
|
310
|
+
**Step 1/7: 状态检查**
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
检查当前状态,确认可以执行 propose。
|
|
314
|
+
|
|
315
|
+
### 操作
|
|
316
|
+
1. 运行 `sillyspec progress show`
|
|
317
|
+
2. 确认 currentStage 为 "propose"
|
|
318
|
+
3. 如果没有设计文档 → 提示先运行 brainstorm
|
|
319
|
+
|
|
320
|
+
### 输出
|
|
321
|
+
当前状态摘要
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Step 2/7: 加载上下文**
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
加载所有相关规范和代码库上下文。
|
|
328
|
+
|
|
329
|
+
### 操作
|
|
330
|
+
1. 检测工作区模式
|
|
331
|
+
2. 读取最新设计文档、需求文档、代码库约定
|
|
332
|
+
3. 如果是子阶段变更,读取 MASTER.md 和前序阶段设计
|
|
333
|
+
|
|
334
|
+
### 输出
|
|
335
|
+
已加载的文件列表
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Step 3/7: 锚定确认**
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
确认已读取的文件。
|
|
342
|
+
|
|
343
|
+
### 操作
|
|
344
|
+
1. 列出已读取的文件,标注存在/不存在
|
|
345
|
+
2. 格式:`[x] 文件名 — 说明` 或 `[ ] 文件名 — 不存在(正常)`
|
|
346
|
+
|
|
347
|
+
### 输出
|
|
348
|
+
文件加载确认清单
|
|
349
|
+
|
|
350
|
+
### 注意
|
|
351
|
+
- 文件不存在不是错误,正常标注即可
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Step 4/7: 探索现有代码**
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
理解相关模块的当前实现,识别影响范围。
|
|
358
|
+
|
|
359
|
+
### 操作
|
|
360
|
+
1. 根据设计文档中的文件变更清单,读取相关源码
|
|
361
|
+
2. 识别现有接口、方法签名、数据结构
|
|
362
|
+
3. 记录可能受影响的模块
|
|
363
|
+
|
|
364
|
+
### 输出
|
|
365
|
+
影响范围分析(涉及模块、需修改的文件、风险点)
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Step 5/7: 生成规范文件**
|
|
369
|
+
|
|
370
|
+
```
|
|
371
|
+
在 `.sillyspec/changes/<变更名>/` 下生成四个文件。
|
|
372
|
+
|
|
373
|
+
### 操作
|
|
374
|
+
1. 生成 proposal.md:动机、变更范围、不在范围内、成功标准
|
|
375
|
+
2. 生成 specs/requirements.md:功能需求、用户场景(Given/When/Then)、非功能需求
|
|
376
|
+
3. 生成 design.md:架构决策、文件变更清单、数据模型、API 设计、代码风格参照
|
|
377
|
+
4. 生成 tasks.md:任务列表(只列名称,不展开步骤)
|
|
378
|
+
|
|
379
|
+
### 输出
|
|
380
|
+
四个文件路径
|
|
381
|
+
|
|
382
|
+
### 注意
|
|
383
|
+
- 表名/字段名必须来自真实 schema 或标注"新增"
|
|
384
|
+
- 用户场景必须用 Given/When/Then 格式
|
|
385
|
+
- tasks.md 只列任务名,细节在 plan 阶段展开
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Step 6/7: 自检门控**
|
|
389
|
+
|
|
390
|
+
```
|
|
391
|
+
自检生成的规范文件。
|
|
392
|
+
|
|
393
|
+
### 操作
|
|
394
|
+
检查以下各项:
|
|
395
|
+
- [ ] proposal.md 有动机、变更范围、不在范围内、成功标准
|
|
396
|
+
- [ ] design.md 有文件变更清单表格
|
|
397
|
+
- [ ] requirements.md 有 Given/When/Then 用户场景
|
|
398
|
+
- [ ] tasks.md 每个 task 有文件路径
|
|
399
|
+
|
|
400
|
+
任何不通过 → 修正后重新检查。
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
### 输出
|
|
404
|
+
自检通过/不通过
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Step 7/7: 展示并更新进度**
|
|
408
|
+
|
|
409
|
+
```
|
|
410
|
+
展示规范给用户,更新进度。
|
|
411
|
+
|
|
412
|
+
### 操作
|
|
413
|
+
1. 展示 proposal.md 和 design.md 摘要
|
|
414
|
+
|
|
415
|
+
### 输出
|
|
416
|
+
展示结果 + 下一步命令
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
### 4.3 plan(7 步)
|
|
422
|
+
|
|
423
|
+
| # | 名称 | 可跳过 | 输出 |
|
|
424
|
+
|---|---|---|---|
|
|
425
|
+
| 1 | 状态检查 | 否 | 当前状态摘要 |
|
|
426
|
+
| 2 | 加载上下文 | 否 | 规范文件 + 代码库约定 |
|
|
427
|
+
| 3 | 锚定确认 | 否 | 已加载文件确认 |
|
|
428
|
+
| 4 | 逐任务展开 | 否 | 详细步骤(2-5 分钟粒度) |
|
|
429
|
+
| 5 | 标注执行顺序 | 否 | Wave 分组 + 依赖关系 |
|
|
430
|
+
| 6 | 自检门控 | 否 | 自检通过确认 |
|
|
431
|
+
| 7 | 保存并更新进度 | 否 | 计划文件 + CLI 更新 |
|
|
432
|
+
|
|
433
|
+
#### 步骤 Prompt 定义
|
|
434
|
+
|
|
435
|
+
**Step 1/7: 状态检查**
|
|
436
|
+
|
|
437
|
+
```
|
|
438
|
+
检查当前状态,确认可以执行 plan。
|
|
439
|
+
|
|
440
|
+
### 操作
|
|
441
|
+
1. 运行 `sillyspec progress show`
|
|
442
|
+
2. 确认 currentStage 为 "plan"
|
|
443
|
+
|
|
444
|
+
### 输出
|
|
445
|
+
当前状态摘要
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
**Step 2/7: 加载上下文**
|
|
449
|
+
|
|
450
|
+
```
|
|
451
|
+
加载所有规范文件和代码库上下文。
|
|
452
|
+
|
|
453
|
+
### 操作
|
|
454
|
+
1. 检测工作区模式
|
|
455
|
+
2. 读取 proposal.md、design.md、tasks.md、requirements.md
|
|
456
|
+
3. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
|
|
457
|
+
4. 工作区模式:额外加载 CODEBASE-OVERVIEW.md + 各子项目上下文
|
|
458
|
+
|
|
459
|
+
### 输出
|
|
460
|
+
已加载的文件清单
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
**Step 3/7: 锚定确认**
|
|
464
|
+
|
|
465
|
+
```
|
|
466
|
+
确认已读取的文件。
|
|
467
|
+
|
|
468
|
+
### 操作
|
|
469
|
+
列出已读取的文件,标注存在/不存在。
|
|
470
|
+
|
|
471
|
+
### 输出
|
|
472
|
+
文件加载确认清单
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**Step 4/7: 逐任务展开**
|
|
476
|
+
|
|
477
|
+
```
|
|
478
|
+
把 tasks.md 中每个 checkbox 展开为详细步骤。
|
|
479
|
+
|
|
480
|
+
### 操作
|
|
481
|
+
对每个 Task:
|
|
482
|
+
1. 标注精确文件路径(新建/修改/测试)
|
|
483
|
+
2. 每个步骤 2-5 分钟可完成
|
|
484
|
+
3. 包含完整可运行的代码示例
|
|
485
|
+
4. 包含验证命令和预期输出
|
|
486
|
+
5. 频繁 commit,每个任务独立提交
|
|
487
|
+
6. 引用已有代码的方法签名(从 CONVENTIONS.md 或源码获取)
|
|
488
|
+
|
|
489
|
+
### 输出
|
|
490
|
+
展开后的详细计划
|
|
491
|
+
|
|
492
|
+
### 注意
|
|
493
|
+
- 假设执行者是熟练开发者但对你项目零上下文
|
|
494
|
+
- 不要写"添加验证逻辑"这种模糊描述
|
|
495
|
+
- 要写"在 UserController.java 添加方法:public Result<UserVO> createUser(...)"
|
|
496
|
+
- 调用已有方法前必须 grep 确认存在
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
**Step 5/7: 标注执行顺序**
|
|
500
|
+
|
|
501
|
+
```
|
|
502
|
+
按依赖关系分组,标注执行顺序。
|
|
503
|
+
|
|
504
|
+
### 操作
|
|
505
|
+
1. 分析 Task 间依赖
|
|
506
|
+
2. 无依赖的 Task 归入同一 Wave(可并行)
|
|
507
|
+
3. 有依赖的 Task 按顺序排列
|
|
508
|
+
|
|
509
|
+
### 输出
|
|
510
|
+
Wave 分组列表 + 依赖说明
|
|
511
|
+
|
|
512
|
+
### 示例
|
|
513
|
+
Wave 1(并行):Task 1 + Task 2
|
|
514
|
+
Wave 2(依赖 Wave 1):Task 3
|
|
515
|
+
Wave 3(依赖 Wave 2):Task 4
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**Step 6/7: 自检门控**
|
|
519
|
+
|
|
520
|
+
```
|
|
521
|
+
自检计划质量。
|
|
522
|
+
|
|
523
|
+
### 操作
|
|
524
|
+
检查以下各项:
|
|
525
|
+
- [ ] 每个 task 有具体文件路径
|
|
526
|
+
- [ ] 每个 task 有验证命令和预期输出
|
|
527
|
+
- [ ] 已标注 Wave 和执行顺序
|
|
528
|
+
- [ ] plan 与 design.md 的文件变更清单一致
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
### 输出
|
|
533
|
+
自检通过/不通过
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
**Step 7/7: 保存并更新进度**
|
|
537
|
+
|
|
538
|
+
```
|
|
539
|
+
保存计划文件,更新进度。
|
|
540
|
+
|
|
541
|
+
### 操作
|
|
542
|
+
1. 保存到 `.sillyspec/plans/YYYY-MM-DD-<change-name>.md`
|
|
543
|
+
|
|
544
|
+
### 输出
|
|
545
|
+
计划文件路径 + 下一步命令
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
### 4.4 execute(动态步骤)
|
|
551
|
+
|
|
552
|
+
execute 阶段的步骤数量是**动态的**,取决于 plan 阶段生成的 Wave 数量。
|
|
553
|
+
|
|
554
|
+
**固定步骤(5 个):**
|
|
555
|
+
|
|
556
|
+
| # | 名称 | 可跳过 | 输出 |
|
|
557
|
+
|---|---|---|---|
|
|
558
|
+
| 1 | 状态检查 | 否 | 当前状态 + 执行范围 |
|
|
559
|
+
| 2 | 加载上下文 | 否 | 计划 + 设计 + 代码库约定 |
|
|
560
|
+
| 3 | 确认执行范围 | 否 | Wave 分组 + 模型分配 + 确认模式 |
|
|
561
|
+
| 倒数第 2 | 知识库审阅 | 是 | 新知识条目 |
|
|
562
|
+
| 最后 1 | 完成确认 | 否 | 用户选择下一步 |
|
|
563
|
+
|
|
564
|
+
**动态步骤(N 个):** 每个步骤对应一个 Wave,CLI 从 plan 文件中解析 Wave 数量动态生成。例如 plan 有 3 个 Wave,则 execute 有 5 + 3 = 8 步。
|
|
565
|
+
|
|
566
|
+
**CLI 动态构建 execute 步骤的逻辑:**
|
|
567
|
+
|
|
568
|
+
```js
|
|
569
|
+
function buildExecuteSteps(planFilePath) {
|
|
570
|
+
const plan = readPlan(planFilePath)
|
|
571
|
+
const waves = parseWaves(plan) // 从 plan 中解析 Wave 分组
|
|
572
|
+
|
|
573
|
+
const fixedPrefix = [
|
|
574
|
+
{ name: '状态检查', ... },
|
|
575
|
+
{ name: '加载上下文', ... },
|
|
576
|
+
{ name: '确认执行范围', ... }
|
|
577
|
+
]
|
|
578
|
+
|
|
579
|
+
const waveSteps = waves.map((wave, i) => ({
|
|
580
|
+
name: `Wave ${i + 1} 执行`,
|
|
581
|
+
prompt: buildWavePrompt(wave, i + 1),
|
|
582
|
+
outputHint: `Wave ${i + 1} 执行结果`,
|
|
583
|
+
optional: false
|
|
584
|
+
}))
|
|
585
|
+
|
|
586
|
+
const fixedSuffix = [
|
|
587
|
+
{ name: '知识库审阅', ... },
|
|
588
|
+
{ name: '完成确认', ... }
|
|
589
|
+
]
|
|
590
|
+
|
|
591
|
+
return [...fixedPrefix, ...waveSteps, ...fixedSuffix]
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
#### 固定步骤 Prompt 定义
|
|
596
|
+
|
|
597
|
+
**Step 1: 状态检查**
|
|
598
|
+
|
|
599
|
+
```
|
|
600
|
+
检查当前状态,确认可以执行 execute。
|
|
601
|
+
|
|
602
|
+
### 操作
|
|
603
|
+
1. 运行 `sillyspec progress show`
|
|
604
|
+
2. 确认 currentStage 为 execute
|
|
605
|
+
3. 如果不是 → 检查是否有未完成的 tasks.md
|
|
606
|
+
4. 确认执行范围($ARGUMENTS 指定 wave/task 或全部)
|
|
607
|
+
|
|
608
|
+
### 输出
|
|
609
|
+
当前状态 + 执行范围确认
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
**Step 2: 加载上下文**
|
|
613
|
+
|
|
614
|
+
```
|
|
615
|
+
加载计划、设计和代码库上下文。
|
|
616
|
+
|
|
617
|
+
### 操作
|
|
618
|
+
1. 读取 tasks.md(执行计划)
|
|
619
|
+
2. 读取 design.md(技术方案)
|
|
620
|
+
3. 读取 CONVENTIONS.md、ARCHITECTURE.md
|
|
621
|
+
4. 读取 local.yaml(构建命令)
|
|
622
|
+
5. 工作区模式:额外加载 CODEBASE-OVERVIEW.md
|
|
623
|
+
|
|
624
|
+
### 输出
|
|
625
|
+
已加载的上下文摘要
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
**Step 3: 确认执行范围**
|
|
629
|
+
|
|
630
|
+
```
|
|
631
|
+
解析任务,确认执行范围和确认模式。
|
|
632
|
+
|
|
633
|
+
### 操作
|
|
634
|
+
1. 从 plan 中解析 Wave 分组和任务列表
|
|
635
|
+
2. 根据任务描述关键词为每个 Task 建议模型:
|
|
636
|
+
- 架构/复杂推理 → 最强模型
|
|
637
|
+
- 常规实现 → 中等模型
|
|
638
|
+
- 简单修改 → 快速模型
|
|
639
|
+
- 文档/写作 → 写作模型
|
|
640
|
+
3. 用户在 tasks.md 中的 [model:xxx] 标签优先
|
|
641
|
+
4. 询问用户执行确认频率:
|
|
642
|
+
- 每个 Wave 确认 — 每个 Wave 完成后展示结果
|
|
643
|
+
- AI 自主判断 — BLOCKED 或计划外变更时才询问
|
|
644
|
+
- 全自动 — 全部自动执行
|
|
645
|
+
5. 查询知识库:读取 `.sillyspec/knowledge/INDEX.md`,根据 Task 关键词匹配
|
|
646
|
+
|
|
647
|
+
### 输出
|
|
648
|
+
Wave 分组 + 模型分配 + 确认模式 + 知识库匹配结果
|
|
649
|
+
|
|
650
|
+
### 注意
|
|
651
|
+
- 默认推荐"每个 Wave 确认"
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
#### 动态步骤 Prompt 定义(每个 Wave 一个步骤)
|
|
655
|
+
|
|
656
|
+
**Wave N 执行步骤的 Prompt 模板:**
|
|
657
|
+
|
|
658
|
+
```js
|
|
659
|
+
function buildWavePrompt(wave, waveIndex) {
|
|
660
|
+
return `## Wave ${waveIndex}: 执行以下任务
|
|
661
|
+
|
|
662
|
+
### 本 Wave 任务
|
|
663
|
+
${wave.tasks.map(t => `- [ ] ${t.name} (${t.file})`).join('\n')}
|
|
664
|
+
|
|
665
|
+
### 执行要求
|
|
666
|
+
1. 按任务顺序执行,同一 Wave 内任务可并行
|
|
667
|
+
2. 铁律:先读后写、grep 确认方法存在、不编造、TDD
|
|
668
|
+
3. 每个任务完成后:
|
|
669
|
+
- 勾选 tasks.md 中对应 checkbox
|
|
670
|
+
- 记录改动文件和测试结果
|
|
671
|
+
4. 遇到 BLOCKED → 记录原因,选择:重试/跳过/停止
|
|
672
|
+
|
|
673
|
+
### 完成后
|
|
674
|
+
运行 sillyspec run execute --done --output "Wave ${waveIndex} 结果摘要"`
|
|
675
|
+
}
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
AI 收到当前 Wave 的 prompt 后,直接执行该 Wave 的所有任务。执行完成后运行 `sillyspec run execute --done`,CLI 自动输出下一个 Wave 的 prompt(或知识库审阅步骤)。
|
|
679
|
+
|
|
680
|
+
#### 固定尾部步骤 Prompt 定义
|
|
681
|
+
|
|
682
|
+
**倒数第 2 步: 知识库审阅**
|
|
683
|
+
|
|
684
|
+
```
|
|
685
|
+
检查本轮执行产生的新知识。
|
|
686
|
+
|
|
687
|
+
### 操作
|
|
688
|
+
1. 检查 `.sillyspec/knowledge/uncategorized.md` 中待确认条目
|
|
689
|
+
2. 如有 → 提示用户审阅
|
|
690
|
+
3. 用户确认后改为 [已确认],可归类到专题文件
|
|
691
|
+
|
|
692
|
+
### 输出
|
|
693
|
+
新知识条目数量 + 审阅提示(或"无新知识")
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
**最后 1 步: 完成确认**
|
|
697
|
+
|
|
698
|
+
```
|
|
699
|
+
所有任务完成后的收尾。
|
|
700
|
+
|
|
701
|
+
### 操作
|
|
702
|
+
1. 询问用户下一步:
|
|
703
|
+
- 验证 → sillyspec run verify
|
|
704
|
+
- 归档 → /sillyspec:archive
|
|
705
|
+
- 继续开发
|
|
706
|
+
2. 提示 git 提交
|
|
707
|
+
|
|
708
|
+
### 输出
|
|
709
|
+
用户选择 + 下一步命令
|
|
710
|
+
|
|
711
|
+
### 注意
|
|
712
|
+
- 完成后运行 `sillyspec run execute --done` 即可自动推进阶段
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
---
|
|
716
|
+
|
|
717
|
+
### 4.5 verify(6 步)
|
|
718
|
+
|
|
719
|
+
| # | 名称 | 可跳过 | 输出 |
|
|
720
|
+
|---|---|---|---|
|
|
721
|
+
| 1 | 状态检查 | 否 | 当前状态摘要 |
|
|
722
|
+
| 2 | 加载规范并锚定 | 否 | 文件加载确认 |
|
|
723
|
+
| 3 | 逐项检查任务 | 否 | 任务完成度报告 |
|
|
724
|
+
| 4 | 对照设计检查 | 否 | 设计一致性报告 |
|
|
725
|
+
| 5 | 运行测试和质量扫描 | 否 | 测试结果 + 技术债务 |
|
|
726
|
+
| 6 | 输出验证报告 | 否 | 完整验证报告 + 下一步 |
|
|
727
|
+
|
|
728
|
+
#### 步骤 Prompt 定义
|
|
729
|
+
|
|
730
|
+
**Step 1/6: 状态检查**
|
|
731
|
+
|
|
732
|
+
```
|
|
733
|
+
检查当前状态,确认可以执行 verify。
|
|
734
|
+
|
|
735
|
+
### 操作
|
|
736
|
+
1. 运行 `sillyspec progress show`
|
|
737
|
+
2. 确认 currentStage 为 "verify"
|
|
738
|
+
|
|
739
|
+
### 输出
|
|
740
|
+
当前状态摘要
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
**Step 2/6: 加载规范并锚定**
|
|
744
|
+
|
|
745
|
+
```
|
|
746
|
+
加载规范文件并确认。
|
|
747
|
+
|
|
748
|
+
### 操作
|
|
749
|
+
1. 读取 proposal.md、design.md、tasks.md、requirements.md
|
|
750
|
+
2. 标注每个文件的存在/不存在状态
|
|
751
|
+
|
|
752
|
+
### 输出
|
|
753
|
+
文件加载确认清单
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
**Step 3/6: 逐项检查任务**
|
|
757
|
+
|
|
758
|
+
```
|
|
759
|
+
对照 tasks.md 检查每个任务完成状态。
|
|
760
|
+
|
|
761
|
+
### 操作
|
|
762
|
+
对每个 checkbox:
|
|
763
|
+
1. 检查相关文件是否存在
|
|
764
|
+
2. 检查代码是否实现了描述的功能
|
|
765
|
+
3. 标记:✅ 已完成 / ❌ 未完成 / ⚠️ 部分完成
|
|
766
|
+
|
|
767
|
+
### 输出
|
|
768
|
+
任务完成度列表 + 完成率
|
|
769
|
+
|
|
770
|
+
### 注意
|
|
771
|
+
- 不修改任何代码,只做检查和报告
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
**Step 4/6: 对照设计检查**
|
|
775
|
+
|
|
776
|
+
```
|
|
777
|
+
对照 design.md 检查实现一致性。
|
|
778
|
+
|
|
779
|
+
### 操作
|
|
780
|
+
1. 架构决策是否遵循
|
|
781
|
+
2. 文件变更清单是否一致
|
|
782
|
+
3. 数据模型是否符合
|
|
783
|
+
4. API 设计是否符合
|
|
784
|
+
|
|
785
|
+
### 输出
|
|
786
|
+
一致性检查结果
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
**Step 5/6: 运行测试和质量扫描**
|
|
790
|
+
|
|
791
|
+
```
|
|
792
|
+
运行完整测试套件和代码质量扫描。
|
|
793
|
+
|
|
794
|
+
### 操作
|
|
795
|
+
1. 运行测试:`pnpm test` 或 `npm test` 或 `pytest`
|
|
796
|
+
2. 记录通过/失败数量,分析失败原因
|
|
797
|
+
3. 搜索技术债务:grep TODO/FIXME/HACK/XXX
|
|
798
|
+
4. 运行综合校验(lint、测试等)
|
|
799
|
+
|
|
800
|
+
### 输出
|
|
801
|
+
测试结果 + 技术债务标记
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
**Step 6/6: 输出验证报告**
|
|
805
|
+
|
|
806
|
+
```
|
|
807
|
+
生成完整验证报告。
|
|
808
|
+
|
|
809
|
+
### 操作
|
|
810
|
+
1. 汇总以上所有检查结果
|
|
811
|
+
2. 给出结论:PASS / PASS WITH NOTES / FAIL
|
|
812
|
+
|
|
813
|
+
### 输出
|
|
814
|
+
验证报告 markdown + 下一步命令
|
|
815
|
+
|
|
816
|
+
### 注意
|
|
817
|
+
- PASS → 下一步 archive
|
|
818
|
+
- FAIL → 修复后重新 verify
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
## 5. 输出格式示例
|
|
822
|
+
|
|
823
|
+
### 当前步骤输出
|
|
824
|
+
|
|
825
|
+
```
|
|
826
|
+
---
|
|
827
|
+
stage: brainstorm
|
|
828
|
+
step: 1/10
|
|
829
|
+
stepName: 状态检查
|
|
830
|
+
project: my-app
|
|
831
|
+
---
|
|
832
|
+
|
|
833
|
+
## Step 1/10: 状态检查
|
|
834
|
+
|
|
835
|
+
检查 .sillyspec/.runtime/progress.json 确认当前状态。
|
|
836
|
+
|
|
837
|
+
### 操作
|
|
838
|
+
1. 运行 `sillyspec progress show`
|
|
839
|
+
2. 确认 currentStage 为 "brainstorm"
|
|
840
|
+
3. 如果有进行中的 brainstorm,提示选择继续或重新开始
|
|
841
|
+
4. 如果未初始化,提示先运行 sillyspec init
|
|
842
|
+
|
|
843
|
+
### 输出
|
|
844
|
+
当前状态摘要(1-2 句话)
|
|
845
|
+
|
|
846
|
+
### 注意
|
|
847
|
+
- 以 CLI 返回为准,不要自行推断阶段
|
|
848
|
+
- 如果阶段不对,输出正确提示并停止
|
|
849
|
+
|
|
850
|
+
### 完成后执行
|
|
851
|
+
sillyspec run brainstorm --done --output "你的状态摘要"
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
### 步骤完成 → 自动输出下一步
|
|
855
|
+
|
|
856
|
+
```
|
|
857
|
+
✅ Step 1/10 完成:状态检查
|
|
858
|
+
|
|
859
|
+
---
|
|
860
|
+
stage: brainstorm
|
|
861
|
+
step: 2/10
|
|
862
|
+
stepName: 加载项目上下文
|
|
863
|
+
project: my-app
|
|
864
|
+
---
|
|
865
|
+
|
|
866
|
+
## Step 2/10: 加载项目上下文
|
|
867
|
+
|
|
868
|
+
...
|
|
869
|
+
|
|
870
|
+
### 完成后执行
|
|
871
|
+
sillyspec run brainstorm --done --output "你的摘要"
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
### 阶段完成输出
|
|
875
|
+
|
|
876
|
+
```
|
|
877
|
+
✅ brainstorm 阶段已完成(10/10 步)
|
|
878
|
+
|
|
879
|
+
下一步:sillyspec run propose
|
|
880
|
+
或:/sillyspec:propose
|
|
881
|
+
```
|
|
882
|
+
|
|
883
|
+
### 状态查看输出
|
|
884
|
+
|
|
885
|
+
```
|
|
886
|
+
阶段:brainstorm(头脑风暴)
|
|
887
|
+
进度:[████████░░] 8/10
|
|
888
|
+
|
|
889
|
+
✅ Step 1: 状态检查
|
|
890
|
+
✅ Step 2: 加载项目上下文
|
|
891
|
+
✅ Step 3: 协作与复用检查
|
|
892
|
+
✅ Step 4: 原型/设计图分析
|
|
893
|
+
✅ Step 5: 需求范围评估
|
|
894
|
+
✅ Step 6: 对话式探索
|
|
895
|
+
✅ Step 7: 提出 2-3 种方案
|
|
896
|
+
✅ Step 8: 分段展示设计
|
|
897
|
+
⏳ Step 9: 写设计文档并自审 ← 当前
|
|
898
|
+
⬜ Step 10: 用户确认并输出技术方案
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
## 6. CLI 内部流程(伪代码)
|
|
902
|
+
|
|
903
|
+
### `sillyspec run <stage>`
|
|
904
|
+
|
|
905
|
+
```js
|
|
906
|
+
function runStage(stageName) {
|
|
907
|
+
// 1. 读取 progress.json
|
|
908
|
+
const progress = readJSON('.sillyspec/.runtime/progress.json')
|
|
909
|
+
|
|
910
|
+
// 2. 检查阶段是否存在
|
|
911
|
+
const stageDef = loadStageDefinition(stageName) // 从 src/stages/<stage>.js
|
|
912
|
+
if (!stageDef) {
|
|
913
|
+
console.error(`未知阶段: ${stageName}`)
|
|
914
|
+
process.exit(1)
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
// 3. 找到当前步骤
|
|
918
|
+
const stageProgress = progress.stages?.[stageName]
|
|
919
|
+
if (!stageProgress) {
|
|
920
|
+
// 首次进入此阶段,初始化步骤
|
|
921
|
+
initStage(progress, stageName, stageDef.steps)
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
// 4. 找到第一个未完成的步骤
|
|
925
|
+
const steps = progress.stages[stageName].steps
|
|
926
|
+
const currentStepIndex = steps.findIndex(s => s.status !== 'completed' && s.status !== 'skipped')
|
|
927
|
+
|
|
928
|
+
if (currentStepIndex === -1) {
|
|
929
|
+
// 全部完成
|
|
930
|
+
console.log(`✅ ${stageName} 阶段已完成(${steps.length}/${steps.length} 步)`)
|
|
931
|
+
console.log(`\n下一步:sillyspec run ${getNextStage(stageName)}`)
|
|
932
|
+
process.exit(2)
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
// 5. 输出当前步骤的 prompt
|
|
936
|
+
const step = stageDef.steps[currentStepIndex]
|
|
937
|
+
const totalSteps = stageDef.steps.length
|
|
938
|
+
|
|
939
|
+
console.log(`---
|
|
940
|
+
stage: ${stageName}
|
|
941
|
+
step: ${currentStepIndex + 1}/${totalSteps}
|
|
942
|
+
stepName: ${step.name}
|
|
943
|
+
project: ${progress.project || basename(cwd())}
|
|
944
|
+
---\n`)
|
|
945
|
+
console.log(`## Step ${currentStepIndex + 1}/${totalSteps}: ${step.name}\n`)
|
|
946
|
+
console.log(step.prompt)
|
|
947
|
+
console.log(`\n### 完成后执行\nsillyspec run ${stageName} --done --output "你的摘要"`)
|
|
948
|
+
}
|
|
949
|
+
```
|
|
950
|
+
|
|
951
|
+
### `sillyspec run <stage> --done`
|
|
952
|
+
|
|
953
|
+
```js
|
|
954
|
+
function completeStep(stageName, outputText) {
|
|
955
|
+
// 1. 读取 progress.json
|
|
956
|
+
const progress = readJSON('.sillyspec/.runtime/progress.json')
|
|
957
|
+
|
|
958
|
+
// 2. 找到当前步骤
|
|
959
|
+
const steps = progress.stages[stageName].steps
|
|
960
|
+
const currentStepIndex = steps.findIndex(s => s.status === 'pending')
|
|
961
|
+
|
|
962
|
+
if (currentStepIndex === -1) {
|
|
963
|
+
console.error('没有待完成的步骤')
|
|
964
|
+
process.exit(1)
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
// 3. 标记完成
|
|
968
|
+
steps[currentStepIndex].status = 'completed'
|
|
969
|
+
steps[currentStepIndex].completedAt = new Date().toISOString()
|
|
970
|
+
if (outputText) {
|
|
971
|
+
steps[currentStepIndex].output = outputText
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
// 4. 检查是否还有下一步
|
|
975
|
+
const nextStepIndex = steps.findIndex(s => s.status === 'pending')
|
|
976
|
+
|
|
977
|
+
if (nextStepIndex === -1) {
|
|
978
|
+
// 5a. 全部完成
|
|
979
|
+
progress.stages[stageName].status = 'completed'
|
|
980
|
+
progress.stages[stageName].completedAt = new Date().toISOString()
|
|
981
|
+
progress.currentStage = getNextStage(stageName)
|
|
982
|
+
writeJSON('.sillyspec/.runtime/progress.json', progress)
|
|
983
|
+
|
|
984
|
+
console.log(`✅ ${stageName} 阶段已完成(${steps.length}/${steps.length} 步)`)
|
|
985
|
+
console.log(`\n下一步:sillyspec run ${getNextStage(stageName)}`)
|
|
986
|
+
} else {
|
|
987
|
+
// 5b. 还有下一步,自动输出
|
|
988
|
+
writeJSON('.sillyspec/.runtime/progress.json', progress)
|
|
989
|
+
console.log(`✅ Step ${currentStepIndex + 1}/${steps.length} 完成:${steps[currentStepIndex].name}\n`)
|
|
990
|
+
|
|
991
|
+
// 输出下一步的 prompt
|
|
992
|
+
runStage(stageName)
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
```
|
|
996
|
+
|
|
997
|
+
### `sillyspec run <stage> --skip`
|
|
998
|
+
|
|
999
|
+
```js
|
|
1000
|
+
function skipStep(stageName) {
|
|
1001
|
+
const progress = readJSON('.sillyspec/.runtime/progress.json')
|
|
1002
|
+
const steps = progress.stages[stageName].steps
|
|
1003
|
+
const stageDef = loadStageDefinition(stageName)
|
|
1004
|
+
|
|
1005
|
+
const currentStepIndex = steps.findIndex(s => s.status === 'pending')
|
|
1006
|
+
const step = stageDef.steps[currentStepIndex]
|
|
1007
|
+
|
|
1008
|
+
if (!step.optional) {
|
|
1009
|
+
console.error(`步骤 "${step.name}" 不可跳过`)
|
|
1010
|
+
process.exit(1)
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
steps[currentStepIndex].status = 'skipped'
|
|
1014
|
+
steps[currentStepIndex].skippedAt = new Date().toISOString()
|
|
1015
|
+
writeJSON('.sillyspec/.runtime/progress.json', progress)
|
|
1016
|
+
|
|
1017
|
+
console.log(`⏭️ Step ${currentStepIndex + 1}/${steps.length} 已跳过:${step.name}`)
|
|
1018
|
+
|
|
1019
|
+
// 输出下一步
|
|
1020
|
+
runStage(stageName)
|
|
1021
|
+
}
|
|
1022
|
+
```
|
|
1023
|
+
|
|
1024
|
+
### `sillyspec run <stage> --status`
|
|
1025
|
+
|
|
1026
|
+
```js
|
|
1027
|
+
function showStatus(stageName) {
|
|
1028
|
+
const progress = readJSON('.sillyspec/.runtime/progress.json')
|
|
1029
|
+
const stageDef = loadStageDefinition(stageName)
|
|
1030
|
+
const steps = progress.stages[stageName].steps
|
|
1031
|
+
|
|
1032
|
+
const completed = steps.filter(s => s.status === 'completed').length
|
|
1033
|
+
const bar = '█'.repeat(completed) + '░'.repeat(steps.length - completed)
|
|
1034
|
+
|
|
1035
|
+
console.log(`阶段:${stageName}(${stageDef.title})`)
|
|
1036
|
+
console.log(`进度:[${bar}] ${completed}/${steps.length}\n`)
|
|
1037
|
+
|
|
1038
|
+
steps.forEach((step, i) => {
|
|
1039
|
+
const def = stageDef.steps[i]
|
|
1040
|
+
const icon = step.status === 'completed' ? '✅' : step.status === 'skipped' ? '⏭️' : step.status === 'pending' ? '⬜' : '⏳'
|
|
1041
|
+
const isCurrent = step.status === 'pending' && i === steps.findIndex(s => s.status === 'pending')
|
|
1042
|
+
console.log(`${icon} Step ${i + 1}: ${def.name}${isCurrent ? ' ← 当前' : ''}`)
|
|
1043
|
+
})
|
|
1044
|
+
}
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
### `sillyspec run <stage> --reset`
|
|
1048
|
+
|
|
1049
|
+
```js
|
|
1050
|
+
function resetStage(stageName) {
|
|
1051
|
+
const progress = readJSON('.sillyspec/.runtime/progress.json')
|
|
1052
|
+
const stageDef = loadStageDefinition(stageName)
|
|
1053
|
+
|
|
1054
|
+
progress.stages[stageName] = {
|
|
1055
|
+
status: 'in_progress',
|
|
1056
|
+
steps: stageDef.steps.map(step => ({
|
|
1057
|
+
name: step.name,
|
|
1058
|
+
status: 'pending'
|
|
1059
|
+
}))
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
writeJSON('.sillyspec/.runtime/progress.json', progress)
|
|
1063
|
+
console.log(`🔄 ${stageName} 阶段已重置`)
|
|
1064
|
+
}
|
|
1065
|
+
```
|
|
1066
|
+
|
|
1067
|
+
## 7. Skills 精简方案
|
|
1068
|
+
|
|
1069
|
+
改造后每个 skill 的 SKILL.md 只需要几行模板:
|
|
1070
|
+
|
|
1071
|
+
```markdown
|
|
1072
|
+
---
|
|
1073
|
+
name: sillyspec:brainstorm
|
|
1074
|
+
description: 需求探索 — 结构化头脑风暴,含技术方案输出(创建性工作前必用)
|
|
1075
|
+
---
|
|
1076
|
+
|
|
1077
|
+
## 执行
|
|
1078
|
+
|
|
1079
|
+
运行 `sillyspec run brainstorm`,按提示逐步执行。
|
|
1080
|
+
每步完成后运行 `sillyspec run brainstorm --done --output "摘要"`。
|
|
1081
|
+
阶段完成后自动提示下一步。
|
|
1082
|
+
|
|
1083
|
+
## 用户指令
|
|
1084
|
+
$ARGUMENTS
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
所有阶段的 skill 都遵循同样模式,只是替换阶段名。
|
|
1088
|
+
|
|
1089
|
+
**效果:**
|
|
1090
|
+
- 原来 brainstorm SKILL.md 591 行 → 精简后 ~10 行
|
|
1091
|
+
- 原来 plan SKILL.md ~200 行 → ~10 行
|
|
1092
|
+
- 原来 execute SKILL.md ~300 行 → ~10 行
|
|
1093
|
+
- 原来 verify SKILL.md ~120 行 → ~10 行
|
|
1094
|
+
- 原来 propose SKILL.md ~200 行 → ~10 行
|
|
1095
|
+
|
|
1096
|
+
## 8. 文件结构
|
|
1097
|
+
|
|
1098
|
+
```
|
|
1099
|
+
src/
|
|
1100
|
+
stages/
|
|
1101
|
+
brainstorm.js ← brainstorm 阶段定义(10 步)
|
|
1102
|
+
propose.js ← propose 阶段定义(7 步)
|
|
1103
|
+
plan.js ← plan 阶段定义(7 步)
|
|
1104
|
+
execute.js ← execute 阶段定义(动态步骤:5 固定 + N Wave)
|
|
1105
|
+
verify.js ← verify 阶段定义(6 步)
|
|
1106
|
+
index.js ← 加载所有阶段定义,导出 stageRegistry
|
|
1107
|
+
commands/
|
|
1108
|
+
run.js ← sillyspec run 命令的 CLI 实现
|
|
1109
|
+
progress.js ← 已有,保持(读写 progress.json)
|
|
1110
|
+
index.js ← 注册 run 命令
|
|
1111
|
+
```
|
|
1112
|
+
|
|
1113
|
+
**`src/stages/index.js` 示例:**
|
|
1114
|
+
|
|
1115
|
+
```js
|
|
1116
|
+
import { definition as brainstorm } from './brainstorm.js'
|
|
1117
|
+
import { definition as propose } from './propose.js'
|
|
1118
|
+
import { definition as plan } from './plan.js'
|
|
1119
|
+
import { definition as execute } from './execute.js'
|
|
1120
|
+
import { definition as verify } from './verify.js'
|
|
1121
|
+
|
|
1122
|
+
export const stageRegistry = {
|
|
1123
|
+
brainstorm,
|
|
1124
|
+
propose,
|
|
1125
|
+
plan,
|
|
1126
|
+
execute,
|
|
1127
|
+
verify
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
// 阶段顺序,用于 getNextStage
|
|
1131
|
+
const stageOrder = ['brainstorm', 'propose', 'plan', 'execute', 'verify']
|
|
1132
|
+
|
|
1133
|
+
export function getNextStage(currentStage) {
|
|
1134
|
+
const index = stageOrder.indexOf(currentStage)
|
|
1135
|
+
return stageOrder[index + 1] || null
|
|
1136
|
+
}
|
|
1137
|
+
```
|
|
1138
|
+
|
|
1139
|
+
## 9. Dashboard 集成方案
|
|
1140
|
+
|
|
1141
|
+
### 进度同步
|
|
1142
|
+
|
|
1143
|
+
- `sillyspec run` 每次执行都会更新 `progress.json`
|
|
1144
|
+
- Dashboard 已有的 fs.watch / 轮询机制继续工作
|
|
1145
|
+
- 不需要额外的 WebSocket 通知
|
|
1146
|
+
|
|
1147
|
+
### 新增信息
|
|
1148
|
+
|
|
1149
|
+
`progress.json` 中的阶段数据结构扩展:
|
|
1150
|
+
|
|
1151
|
+
```json
|
|
1152
|
+
{
|
|
1153
|
+
"stages": {
|
|
1154
|
+
"brainstorm": {
|
|
1155
|
+
"status": "in_progress",
|
|
1156
|
+
"steps": [
|
|
1157
|
+
{ "name": "状态检查", "status": "completed", "completedAt": "...", "output": "..." },
|
|
1158
|
+
{ "name": "加载项目上下文", "status": "completed", "completedAt": "..." },
|
|
1159
|
+
{ "name": "协作与复用检查", "status": "skipped", "skippedAt": "..." },
|
|
1160
|
+
{ "name": "原型/设计图分析", "status": "pending" },
|
|
1161
|
+
{ "name": "需求范围评估", "status": "pending" }
|
|
1162
|
+
]
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
```
|
|
1167
|
+
|
|
1168
|
+
Dashboard 可以渲染:
|
|
1169
|
+
- 进度条(已完成/总数)
|
|
1170
|
+
- 每个步骤的状态和时间
|
|
1171
|
+
- 当前步骤高亮
|
|
1172
|
+
- 步骤输出摘要
|
|
1173
|
+
|
|
1174
|
+
## 10. 向后兼容考虑
|
|
1175
|
+
|
|
1176
|
+
### 旧 progress.json 格式
|
|
1177
|
+
|
|
1178
|
+
旧格式只有 `currentStage` 字段,没有 `stages` 详细步骤信息。兼容方案:
|
|
1179
|
+
|
|
1180
|
+
```js
|
|
1181
|
+
function migrateProgress(progress) {
|
|
1182
|
+
if (!progress.stages) {
|
|
1183
|
+
// 旧格式,初始化 stages 结构
|
|
1184
|
+
progress.stages = {}
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
// 如果当前阶段没有 steps,自动初始化
|
|
1188
|
+
const currentStage = progress.currentStage
|
|
1189
|
+
if (currentStage && !progress.stages[currentStage]?.steps) {
|
|
1190
|
+
const stageDef = stageRegistry[currentStage]
|
|
1191
|
+
if (stageDef) {
|
|
1192
|
+
progress.stages[currentStage] = {
|
|
1193
|
+
status: 'in_progress',
|
|
1194
|
+
steps: stageDef.steps.map(step => ({
|
|
1195
|
+
name: step.name,
|
|
1196
|
+
status: 'pending'
|
|
1197
|
+
}))
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
return progress
|
|
1203
|
+
}
|
|
1204
|
+
```
|
|
1205
|
+
|
|
1206
|
+
### 已完成阶段
|
|
1207
|
+
|
|
1208
|
+
如果某个阶段在旧格式中已经标记完成(如 `brainstorm ✅`),迁移时跳过初始化步骤:
|
|
1209
|
+
|
|
1210
|
+
```js
|
|
1211
|
+
// 已完成的阶段直接标记
|
|
1212
|
+
if (progress.stages[stageName]?.status === 'completed') {
|
|
1213
|
+
// 不重新初始化
|
|
1214
|
+
continue
|
|
1215
|
+
}
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
### 命令兼容
|
|
1219
|
+
|
|
1220
|
+
- `sillyspec progress show` 继续保留,用于查看当前进度
|
|
1221
|
+
- `sillyspec progress complete-stage` 内部由 `sillyspec run --done` 自动调用,也可手动使用
|
|
1222
|
+
- 新增 `sillyspec run` 不影响已有命令
|
|
1223
|
+
|
|
1224
|
+
### 渐进式迁移
|
|
1225
|
+
|
|
1226
|
+
1. 先实现 `sillyspec run` 命令和步骤定义
|
|
1227
|
+
2. Skills 可以逐步精简,不需要一次性改完
|
|
1228
|
+
3. 旧 Skill 仍然可以正常工作(读取完整 SKILL.md)
|
|
1229
|
+
4. 新 Skill 精简后自动使用 `sillyspec run` 流程
|
|
1230
|
+
5. 两种模式可以共存,用户选择何时迁移
|