sillyspec 3.11.11 → 3.12.0
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-brainstorm/SKILL.md +7 -5
- package/.claude/skills/sillyspec-resume/SKILL.md +21 -64
- package/.claude/skills/sillyspec-workspace/SKILL.md +10 -2
- package/docs/sillyspec/file-lifecycle.md +1110 -0
- package/package.json +2 -1
- package/src/db.js +168 -0
- package/src/index.js +98 -2
- package/src/init.js +2 -8
- package/src/progress.js +652 -325
- package/src/run.js +123 -24
- package/src/stages/archive.js +7 -11
- package/src/stages/verify.js +6 -6
- package/src/sync.js +497 -0
|
@@ -0,0 +1,1110 @@
|
|
|
1
|
+
---
|
|
2
|
+
author: qinyi
|
|
3
|
+
created_at: 2026-05-31 11:00:00
|
|
4
|
+
updated_at: 2026-05-31 11:00:00
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# SillySpec 文件生命周期描述
|
|
8
|
+
|
|
9
|
+
> 基于 SillySpec v4(SQLite 迁移后)实际代码,描述 `.sillyspec/` 目录下各类文件的完整生命周期。
|
|
10
|
+
|
|
11
|
+
## 1. 目录结构总览
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
.sillyspec/
|
|
15
|
+
├── .runtime/ ← 运行时目录(gitignore)
|
|
16
|
+
│ ├── sillyspec.db ← SQLite 数据库(替代 global.json + progress.json)
|
|
17
|
+
│ ├── gate-status.json ← execute 阶段门控状态(动态)
|
|
18
|
+
│ ├── user-inputs.md ← 用户输入记录(持续追加)
|
|
19
|
+
│ ├── artifacts/ ← 步骤输出 artifact(超长 output 截断存储)
|
|
20
|
+
│ ├── history/ ← 已完成阶段的历史快照
|
|
21
|
+
│ ├── logs/ ← 日志
|
|
22
|
+
│ ├── templates/ ← 模板
|
|
23
|
+
│ └── worktrees/ ← git worktree 隔离环境
|
|
24
|
+
│ └── <change-name>/
|
|
25
|
+
│ └── meta.json ← worktree 元数据
|
|
26
|
+
├── changes/ ← 变更工作区(git tracked)
|
|
27
|
+
│ ├── <change-name>/ ← 活跃变更目录
|
|
28
|
+
│ │ ├── proposal.md ← 动机与变更范围
|
|
29
|
+
│ │ ├── design.md ← 技术方案与文件变更清单
|
|
30
|
+
│ │ ├── requirements.md ← 角色表 + GWT 行为规格
|
|
31
|
+
│ │ ├── tasks.md ← 任务列表
|
|
32
|
+
│ │ ├── plan.md ← Wave 分组 + 依赖图 + 验收标准
|
|
33
|
+
│ │ ├── tasks/ ← 单任务实现文档目录(plan 阶段创建)
|
|
34
|
+
│ │ │ └── task-NN.md
|
|
35
|
+
│ │ ├── module-impact.md ← 模块影响分析矩阵
|
|
36
|
+
│ │ ├── verification.md ← 验证报告(⚠️ prompt 写 verification.md,validateFileLocations 期望 verify-result.md)
|
|
37
|
+
│ │ ├── prototype-*.html ← HTML 原型(可选,brainstorm 判断)
|
|
38
|
+
│ │ └── MASTER.md ← 大需求拆分主控(可选,brainstorm 判断拆分时)
|
|
39
|
+
│ └── archive/ ← 已归档变更
|
|
40
|
+
│ └── YYYY-MM-DD-<name>/ ← 归档后的变更目录
|
|
41
|
+
├── quicklog/ ← quick 阶段日志(git tracked)
|
|
42
|
+
│ └── QUICKLOG-<user>.md ← 持续追加的任务日志
|
|
43
|
+
├── projects/ ← 项目注册表
|
|
44
|
+
│ └── <project-name>.yaml ← 子项目配置
|
|
45
|
+
├── docs/ ← 统一文档中心
|
|
46
|
+
│ └── <project-name>/
|
|
47
|
+
│ ├── scan/ ← 代码扫描结果(7 份文档)
|
|
48
|
+
│ │ ├── ARCHITECTURE.md ← 技术架构 + 数据模型
|
|
49
|
+
│ │ ├── CONVENTIONS.md ← 代码约定 + 框架隐形规则
|
|
50
|
+
│ │ ├── STRUCTURE.md ← 目录结构
|
|
51
|
+
│ │ ├── INTEGRATIONS.md ← 外部集成
|
|
52
|
+
│ │ ├── TESTING.md ← 测试现状
|
|
53
|
+
│ │ ├── CONCERNS.md ← 技术债务
|
|
54
|
+
│ │ └── PROJECT.md ← 项目概览
|
|
55
|
+
│ ├── modules/ ← 模块设计文档
|
|
56
|
+
│ │ ├── _module-map.yaml ← 文件→模块映射
|
|
57
|
+
│ │ └── <module>.md ← 各模块当前状态描述
|
|
58
|
+
│ └── archive/ ← 归档的扫描/知识文件
|
|
59
|
+
├── knowledge/ ← 跨项目共享知识库
|
|
60
|
+
│ ├── INDEX.md ← 知识索引(关键词匹配)
|
|
61
|
+
│ └── uncategorized.md ← 待分类知识
|
|
62
|
+
├── shared/ ← 共享目录
|
|
63
|
+
├── workspace/ ← 工作区
|
|
64
|
+
├── ROADMAP.md ← 路线图(可选)
|
|
65
|
+
├── PROJECT.md ← 项目概览(可选,status/doctor 引用)
|
|
66
|
+
├── REQUIREMENTS.md ← 全局需求(可选,status 引用)
|
|
67
|
+
├── HANDOFF.json ← 交接信息(可选,status 引用)
|
|
68
|
+
├── STACK.md ← 技术栈描述(可选,plan/doctor 引用)
|
|
69
|
+
├── local.yaml ← 本地配置(构建/测试命令,gitignore)
|
|
70
|
+
└── codebase/SCAN-RAW.md ← 原始扫描数据(gitignore)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 2. 全局状态文件
|
|
74
|
+
|
|
75
|
+
### `sillyspec.db` — SQLite 数据库(全局状态与变更进度)
|
|
76
|
+
|
|
77
|
+
**创建时机:** `sillyspec init` 时由 `DB.init()` 创建
|
|
78
|
+
|
|
79
|
+
**存储位置:** `.sillyspec/.runtime/sillyspec.db`
|
|
80
|
+
|
|
81
|
+
**写入方:**
|
|
82
|
+
- `ProgressManager` 各方法通过 SQL 写入(替代旧版 `writeGlobal()` / `_write()` 等文件操作)
|
|
83
|
+
- `DB.query()` / `DB.run()` — 所有状态变更通过 SQL 语句执行
|
|
84
|
+
|
|
85
|
+
**读取方:**
|
|
86
|
+
- `ProgressManager` 各方法通过 SQL 查询(替代旧版 `readGlobal()` / `read()` 等文件读取)
|
|
87
|
+
- `DB.all()` / `DB.get()` — 所有状态查询通过 SQL 语句执行
|
|
88
|
+
|
|
89
|
+
**Schema 概览:**
|
|
90
|
+
|
|
91
|
+
| 表 | 用途 | 对应旧版 |
|
|
92
|
+
|------|------|------|
|
|
93
|
+
| `project` | 项目名、schema 版本 | `global.json` 的 `_version` + `project` |
|
|
94
|
+
| `changes` | 变更注册表(名称、当前阶段、状态) | `global.json` 的 `activeChanges` + `progress.json` 的顶层字段 |
|
|
95
|
+
| `stages` | 阶段状态(status / startedAt / completedAt) | `progress.json` 的 `stages.*` |
|
|
96
|
+
| `steps` | 步骤状态(name / status / output) | `progress.json` 的 `stages.*.steps[]` |
|
|
97
|
+
| `batch_progress` | 批量进度统计 | `progress.json` 的 `batchProgress` |
|
|
98
|
+
| `approvals` | 审批状态 | 新增 |
|
|
99
|
+
|
|
100
|
+
> 完整 DDL 见 `design.md` 中的 Schema 章节。
|
|
101
|
+
|
|
102
|
+
**生命周期:** 项目初始化后持续存在,随状态变更实时更新。不兼容旧版 `global.json` / `progress.json` 数据(不做迁移)。
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
### `gate-status.json` — execute 阶段门控
|
|
107
|
+
|
|
108
|
+
**创建时机:** 当任意活跃变更进入 `execute` 或 `quick` 阶段时,由 `ProgressManager._updateGateStatus()` 自动创建
|
|
109
|
+
|
|
110
|
+
**删除时机:** 当所有活跃变更都不在 `execute`/`quick` 阶段时自动删除
|
|
111
|
+
|
|
112
|
+
**写入方:** `_updateGateStatus()` — 每次 `_write()` 写入 progress 时都会触发调用
|
|
113
|
+
|
|
114
|
+
**读取方:** `worktree-guard.js` hook — 在 `claude-pre-tool-use` 钩子中检查是否允许编辑
|
|
115
|
+
|
|
116
|
+
**数据结构:**
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"stage": "execute",
|
|
120
|
+
"changes": ["2026-05-28-agent-log-streaming"],
|
|
121
|
+
"updatedAt": "2026-05-28T14:30:00.000Z",
|
|
122
|
+
"noWorktree": false
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**字段说明:**
|
|
127
|
+
| 字段 | 类型 | 说明 |
|
|
128
|
+
|------|------|------|
|
|
129
|
+
| `stage` | string | 当前门控阶段,值为 `"execute"` 或 `"quick"` |
|
|
130
|
+
| `changes` | string[] | 处于 execute/quick 阶段的变更名列表 |
|
|
131
|
+
| `updatedAt` | string | ISO 时间戳 |
|
|
132
|
+
| `noWorktree` | boolean? | 仅当 progress 中有 `noWorktree` 标记时出现 |
|
|
133
|
+
|
|
134
|
+
**生命周期:** 短暂存在,活跃变更不在 execute/quick 阶段时自动删除。
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 3. 变更级文件
|
|
139
|
+
|
|
140
|
+
### 变更级状态 — SQLite 表(`changes` / `stages` / `steps`)
|
|
141
|
+
|
|
142
|
+
**创建时机:** `ProgressManager.initChange()` 时通过 SQL INSERT 写入 `changes` 表,同时为该变更创建 `stages` 记录
|
|
143
|
+
|
|
144
|
+
**写入方:**
|
|
145
|
+
- `ProgressManager` 各方法通过 SQL 更新(如 `setStage()` 更新 `changes.current_stage`,`completeStage()` 更新 `stages.status` / `stages.completed_at`)
|
|
146
|
+
- `DB.run()` — 所有变更级状态变更通过 SQL 语句执行
|
|
147
|
+
|
|
148
|
+
**读取方:**
|
|
149
|
+
- `ProgressManager` 各方法通过 SQL 查询(如 `getCurrentChange()` 查询 `changes` 表,`getStage()` 关联查询 `stages` + `steps`)
|
|
150
|
+
- `DB.all()` / `DB.get()` — 所有变更级状态查询通过 SQL 语句执行
|
|
151
|
+
|
|
152
|
+
**数据模型说明:**
|
|
153
|
+
|
|
154
|
+
旧版 `progress.json` 的嵌套结构被拆解为关系型表:
|
|
155
|
+
|
|
156
|
+
| 旧版 progress.json 字段 | SQLite 表.列 | 说明 |
|
|
157
|
+
|------|------|------|
|
|
158
|
+
| `project` | `project.name` | 项目名 |
|
|
159
|
+
| `currentStage` | `changes.current_stage` | 当前活跃阶段 |
|
|
160
|
+
| `currentChange` | `changes.name` | 当前变更名 |
|
|
161
|
+
| `lastActive` | `changes.last_active` | 最后活跃时间 |
|
|
162
|
+
| `noWorktree` | `changes.no_worktree` | 跳过 worktree 标记 |
|
|
163
|
+
| `stages.<name>.status` | `stages.status` | 阶段状态 |
|
|
164
|
+
| `stages.<name>.startedAt` | `stages.started_at` | 阶段开始时间 |
|
|
165
|
+
| `stages.<name>.completedAt` | `stages.completed_at` | 阶段完成时间 |
|
|
166
|
+
| `stages.<name>.steps[]` | `steps` 表(关联 `stages.id`) | 步骤列表 |
|
|
167
|
+
| `stages.<name>.steps[].name` | `steps.name` | 步骤名 |
|
|
168
|
+
| `stages.<name>.steps[].status` | `steps.status` | 步骤状态 |
|
|
169
|
+
| `stages.<name>.steps[].output` | `steps.output` | 步骤输出 |
|
|
170
|
+
| `batchProgress` | `batch_progress` 表(关联 `changes.id`) | 批量进度统计 |
|
|
171
|
+
|
|
172
|
+
> 完整 DDL 见 `design.md` 中的 Schema 章节。
|
|
173
|
+
|
|
174
|
+
**生命周期:** 变更目录下不再生成 `progress.json` 文件,所有变更级状态存储在 `sillyspec.db` 中。`artifacts/`、`history/`、`user-inputs.md` 保持文件系统不变。
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
### `proposal.md` — 动机与变更范围
|
|
179
|
+
|
|
180
|
+
**创建时机:**
|
|
181
|
+
- brainstorm 阶段最后一步"用户确认并生成规范文件"(完整流程)
|
|
182
|
+
- propose 阶段"生成规范文件"步骤(跳过对话,直接生成四件套)
|
|
183
|
+
|
|
184
|
+
**大体结构:**
|
|
185
|
+
```markdown
|
|
186
|
+
# Proposal
|
|
187
|
+
|
|
188
|
+
## 动机
|
|
189
|
+
为什么做、解决什么核心问题
|
|
190
|
+
|
|
191
|
+
## 关键问题
|
|
192
|
+
为什么现有方案不够(展开 2-3 个具体痛点)
|
|
193
|
+
|
|
194
|
+
## 变更范围
|
|
195
|
+
本次做什么
|
|
196
|
+
|
|
197
|
+
## 不在范围内(显式清单)
|
|
198
|
+
- 不做 X
|
|
199
|
+
- 不做 Y
|
|
200
|
+
|
|
201
|
+
## 成功标准(可验证)
|
|
202
|
+
- 旧配置默认行为不变
|
|
203
|
+
- 新功能在配置后可用
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**写入方:**
|
|
207
|
+
- brainstorm 阶段最后一步"用户确认并生成规范文件"
|
|
208
|
+
- propose 阶段"生成规范文件"步骤
|
|
209
|
+
|
|
210
|
+
**元数据要求:** 头部必须包含 `author`(git 用户名)和 `created_at`(精确到秒)。`validateMetadata()` 在每个阶段完成后检查 10 分钟内修改的 `.md/.yaml/.yml` 文件是否包含这两个字段,缺失时打印警告。
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### `design.md` — 技术方案与文件变更清单
|
|
215
|
+
|
|
216
|
+
**创建时机:**
|
|
217
|
+
- brainstorm 阶段"写设计文档并自审"步骤(初版,含 AI 自审)
|
|
218
|
+
- brainstorm 阶段"用户确认并生成规范文件"步骤(终版,覆盖 Step 8 的初版)
|
|
219
|
+
- propose 阶段"生成规范文件"步骤(跳过自审,含自检门控)
|
|
220
|
+
|
|
221
|
+
> ⚠️ brainstorm 中 design.md 会被写入两次:Step 8 的自审版和最后一步的确认版。确认版会覆盖自审版,因此最终文件以用户确认后的版本为准。
|
|
222
|
+
|
|
223
|
+
**大体结构:**
|
|
224
|
+
```markdown
|
|
225
|
+
# <设计标题>
|
|
226
|
+
|
|
227
|
+
author: <git用户名>
|
|
228
|
+
created_at: <YYYY-MM-DD HH:mm:ss>
|
|
229
|
+
|
|
230
|
+
## 背景
|
|
231
|
+
为什么做、解决什么问题
|
|
232
|
+
|
|
233
|
+
## 设计目标
|
|
234
|
+
要达成什么
|
|
235
|
+
|
|
236
|
+
## 非目标
|
|
237
|
+
明确不做的事(防止 scope creep)
|
|
238
|
+
|
|
239
|
+
## 拆分判断(如适用)
|
|
240
|
+
为什么这样组织变更、为什么不走批量模式
|
|
241
|
+
|
|
242
|
+
## 总体方案
|
|
243
|
+
技术方案(分 Phase/Wave)
|
|
244
|
+
|
|
245
|
+
## 文件变更清单(必填)
|
|
246
|
+
| 操作 | 文件路径 | 说明 |
|
|
247
|
+
|---|---|---|
|
|
248
|
+
| 新增 | src/xxx/NewFile.java | ... |
|
|
249
|
+
| 修改 | src/xxx/ExistingFile.java | 新增 xx 方法 |
|
|
250
|
+
| 删除 | src/xxx/OldFile.java | 已被 xx 替代 |
|
|
251
|
+
|
|
252
|
+
## 接口定义(代码类任务必填)
|
|
253
|
+
方法签名、数据结构
|
|
254
|
+
|
|
255
|
+
## 数据模型(如涉及)
|
|
256
|
+
表结构/字段变更
|
|
257
|
+
|
|
258
|
+
## 兼容策略(brownfield 必填)
|
|
259
|
+
- 未配置新功能时行为不变
|
|
260
|
+
- 新旧逻辑的回退路径
|
|
261
|
+
- 不改变的 API / 表结构
|
|
262
|
+
|
|
263
|
+
## 风险登记
|
|
264
|
+
| 编号 | 风险 | 等级 | 应对策略 |
|
|
265
|
+
|---|---|---|---|
|
|
266
|
+
| R-01 | ... | P0/P1/P2 | ... |
|
|
267
|
+
|
|
268
|
+
## 自审
|
|
269
|
+
AI 对自身设计的校验结果
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**特殊作用:** 包含"文件变更清单"表格,被 `change-list.js` 的 `parseFileChangeList()` 解析。
|
|
273
|
+
解析规则:定位 `## 文件变更清单` 标题 → 截取到下一个 `##` 标题 → 解析 markdown 表格行 → 提取第二列文件路径 → 排除空值/"—"/"-"/`.sillyspec/` 开头的路径。
|
|
274
|
+
|
|
275
|
+
**消费者:** verify 阶段逐项检查、archive 阶段模块影响分析、execute 阶段确认执行范围
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
### `requirements.md` — 行为规格
|
|
280
|
+
|
|
281
|
+
**创建时机:**
|
|
282
|
+
- brainstorm 阶段最后一步"用户确认并生成规范文件"
|
|
283
|
+
- propose 阶段"生成规范文件"步骤
|
|
284
|
+
|
|
285
|
+
**大体结构:**
|
|
286
|
+
```markdown
|
|
287
|
+
# Requirements
|
|
288
|
+
|
|
289
|
+
author: <git用户名>
|
|
290
|
+
created_at: <YYYY-MM-DD HH:mm:ss>
|
|
291
|
+
|
|
292
|
+
## 角色
|
|
293
|
+
| 角色 | 说明 |
|
|
294
|
+
|---|---|
|
|
295
|
+
| 开发者 | ... |
|
|
296
|
+
|
|
297
|
+
## 功能需求
|
|
298
|
+
|
|
299
|
+
### FR-01: 需求名称
|
|
300
|
+
Given 前提条件
|
|
301
|
+
When 触发动作
|
|
302
|
+
Then 期望结果
|
|
303
|
+
|
|
304
|
+
(每个边界条件独立 GWT 块)
|
|
305
|
+
|
|
306
|
+
## 非功能需求
|
|
307
|
+
- 兼容性:...
|
|
308
|
+
- 可回退:...
|
|
309
|
+
- 可测试:...
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
### `tasks.md` — 任务列表
|
|
315
|
+
|
|
316
|
+
**创建时机:**
|
|
317
|
+
- brainstorm 阶段最后一步"用户确认并生成规范文件"
|
|
318
|
+
- propose 阶段"生成规范文件"步骤
|
|
319
|
+
|
|
320
|
+
**大体结构:**
|
|
321
|
+
```markdown
|
|
322
|
+
# Tasks
|
|
323
|
+
|
|
324
|
+
author: <git用户名>
|
|
325
|
+
created_at: <YYYY-MM-DD HH:mm:ss>
|
|
326
|
+
|
|
327
|
+
- [ ] task-01: 添加用户创建接口
|
|
328
|
+
- [ ] task-02: 添加角色创建接口 [model: strongest]
|
|
329
|
+
- [ ] task-03: 用户创建接口联调 [model: fast]
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
> tasks.md 只列任务名和编号,细节在 plan 阶段的 `plan.md` 和 `tasks/task-NN.md` 中展开。
|
|
333
|
+
> 支持 `[model:xxx]` 标签指定执行模型(execute 阶段"确认执行范围"步骤读取,优先级高于 AI 自动推断)。可选值:strongest(最强模型)/ fast(快速模型)等,具体映射由用户配置决定。
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
### 规范四件套的共同生命周期
|
|
338
|
+
|
|
339
|
+
1. brainstorm 末尾或 propose 阶段创建(用户确认后一次性生成)
|
|
340
|
+
2. plan 阶段读取作为上下文
|
|
341
|
+
3. execute 阶段读取作为执行依据
|
|
342
|
+
4. verify 阶段读取作为验证标准
|
|
343
|
+
5. archive 阶段检查(`module-impact.md` 三重交叉验证:proposal/design + tasks + git diff)
|
|
344
|
+
6. 随变更目录一起归档到 `archive/YYYY-MM-DD-<name>/`
|
|
345
|
+
|
|
346
|
+
> **注意:** `validateFileLocations()` 在阶段完成时会检查预期文件是否存在于变更目录。propose 阶段完成后预期:`proposal.md` + `design.md` + `requirements.md` + `tasks.md`。brainstorm 阶段不在此检查列表中(四件套由 propose 或 brainstorm 末步生成,brainstorm 本身没有预期产出文件)。
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
### `plan.md` — 实现计划
|
|
351
|
+
|
|
352
|
+
**创建时机:** plan 阶段"展开任务并分组"步骤
|
|
353
|
+
|
|
354
|
+
**大体结构:**
|
|
355
|
+
```markdown
|
|
356
|
+
# 实现计划
|
|
357
|
+
|
|
358
|
+
## Spike 前置验证(如需要)
|
|
359
|
+
| Spike | 验证内容 | 不通过后果 |
|
|
360
|
+
|---|---|---|
|
|
361
|
+
| spike-01 | ... | task-XX 推翻重设计 |
|
|
362
|
+
|
|
363
|
+
## Wave 1(并行,无依赖)
|
|
364
|
+
- [ ] task-01: 添加用户创建接口
|
|
365
|
+
- [ ] task-02: 添加角色创建接口
|
|
366
|
+
|
|
367
|
+
## Wave 2(依赖 Wave 1)
|
|
368
|
+
- [ ] task-03: 用户创建接口联调
|
|
369
|
+
|
|
370
|
+
## 任务总表
|
|
371
|
+
| 编号 | 任务 | Wave | 优先级 | 估时 | 依赖 | 说明 |
|
|
372
|
+
|---|---|---|---|---|---|---|
|
|
373
|
+
| task-01 | 添加用户创建接口 | W1 | P0 | 4h | — | ... |
|
|
374
|
+
| task-02 | 添加角色创建接口 | W1 | P0 | 3h | — | ... |
|
|
375
|
+
| task-03 | 用户创建接口联调 | W2 | P0 | 4h | task-01,02 | ... |
|
|
376
|
+
|
|
377
|
+
## 依赖关系图
|
|
378
|
+
```mermaid
|
|
379
|
+
graph LR
|
|
380
|
+
task-01 --> task-03
|
|
381
|
+
task-02 --> task-03
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## 关键路径
|
|
385
|
+
task-01 → task-03(最长路径,决定最短交付周期)
|
|
386
|
+
|
|
387
|
+
## 全局验收标准
|
|
388
|
+
- [ ] 所有单元测试通过
|
|
389
|
+
- [ ] (brownfield)未配置新功能时行为不变
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
**写入方:** AI 在 plan 阶段生成
|
|
393
|
+
|
|
394
|
+
**解析方:**
|
|
395
|
+
- `execute.js` 的 `buildExecuteSteps()` — 解析 `- [ ] task-XX:` 格式的 checkbox 生成执行步骤
|
|
396
|
+
- `plan.js` 的 `buildPlanSteps()` — 在"展开任务并分组"完成后动态插入任务蓝图协调器步骤
|
|
397
|
+
- `run.js` 的 `completeStep()` — plan 阶段"展开任务"完成后检测 plan.md 存在,触发动态步骤插入
|
|
398
|
+
|
|
399
|
+
**生命周期:** plan 阶段创建 → execute 阶段消费 → archive 阶段检查所有 checkbox 是否已勾选
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
### `tasks/task-NN.md` — 单任务实现文档
|
|
404
|
+
|
|
405
|
+
**创建时机:** plan 阶段的动态任务蓝图步骤(在"展开任务并分组"完成后由 `run.js` 插入)
|
|
406
|
+
|
|
407
|
+
**大体结构:**
|
|
408
|
+
```markdown
|
|
409
|
+
# task-01: 添加用户创建接口
|
|
410
|
+
|
|
411
|
+
author: <git用户名>
|
|
412
|
+
created_at: <YYYY-MM-DD HH:mm:ss>
|
|
413
|
+
|
|
414
|
+
## 任务描述
|
|
415
|
+
(从 plan.md 展开的任务详情)
|
|
416
|
+
|
|
417
|
+
## 实现要点
|
|
418
|
+
- 关键逻辑说明
|
|
419
|
+
- 注意事项
|
|
420
|
+
|
|
421
|
+
## 涉及文件
|
|
422
|
+
- src/xxx/NewFile.java
|
|
423
|
+
|
|
424
|
+
## 验收标准
|
|
425
|
+
- [ ] 接口可正常调用
|
|
426
|
+
- [ ] 单元测试通过
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**写入方:** AI 在 plan 阶段逐个生成
|
|
430
|
+
|
|
431
|
+
**生命周期:** plan 阶段创建 → execute 阶段对应子代理读取执行
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
### `module-impact.md` — 模块影响分析
|
|
436
|
+
|
|
437
|
+
**创建时机:** archive 阶段"extract-module-impact"步骤
|
|
438
|
+
|
|
439
|
+
**大体结构:**
|
|
440
|
+
```markdown
|
|
441
|
+
# 模块影响分析
|
|
442
|
+
|
|
443
|
+
author: <git用户名>
|
|
444
|
+
created_at: <YYYY-MM-DD HH:mm:ss>
|
|
445
|
+
|
|
446
|
+
## 变更:<change-name>
|
|
447
|
+
|
|
448
|
+
## 模块影响矩阵
|
|
449
|
+
| 模块 | 影响类型 | 相关文件 | 更新内容摘要 |
|
|
450
|
+
|------|----------|----------|-------------|
|
|
451
|
+
| core | 接口变更 | src/core/api.js | 新增用户创建接口 |
|
|
452
|
+
|
|
453
|
+
## 未匹配文件
|
|
454
|
+
| 文件路径 | 说明 |
|
|
455
|
+
|----------|------|
|
|
456
|
+
| config.yaml | 配置文件 |
|
|
457
|
+
|
|
458
|
+
## 更新结果
|
|
459
|
+
| 模块文档 | 操作 | 状态 |
|
|
460
|
+
|----------|------|------|
|
|
461
|
+
| core.md | 更新 | ✅ |
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**数据来源:** 三重交叉验证
|
|
465
|
+
1. `proposal.md` / `design.md` 的变更范围声明
|
|
466
|
+
2. `tasks.md` / `plan.md` 的任务文件路径
|
|
467
|
+
3. `git diff --name-only` 真实变更(**以 git diff 为准**)
|
|
468
|
+
|
|
469
|
+
**模块匹配:** 使用 `_module-map.yaml` 的 glob 路径匹配 git diff 文件到模块
|
|
470
|
+
|
|
471
|
+
**下游消费:** `sync-module-docs` 步骤读取此文件,更新 `.sillyspec/docs/<project>/modules/<module>.md`
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
### `verify-result.md` / `verification.md` — 验证报告
|
|
476
|
+
|
|
477
|
+
> ⚠️ **代码存在命名不一致**:verify 阶段 prompt 中输出文件名为 `verification.md`,但 `validateFileLocations()` 期望的文件名是 `verify-result.md`。实际运行时 AI 按照 prompt 写入 `verification.md`,但位置校验会报 `verify-result.md` 缺失。这是已知的不一致。
|
|
478
|
+
|
|
479
|
+
**创建时机:** verify 阶段"输出验证报告"步骤
|
|
480
|
+
|
|
481
|
+
**大体结构:**
|
|
482
|
+
```markdown
|
|
483
|
+
# 验证报告
|
|
484
|
+
|
|
485
|
+
## 结论
|
|
486
|
+
PASS / PASS WITH NOTES / FAIL
|
|
487
|
+
|
|
488
|
+
## 任务完成度
|
|
489
|
+
(逐项检查任务的结果)
|
|
490
|
+
|
|
491
|
+
## 设计一致性
|
|
492
|
+
(对照 design.md 的检查结果)
|
|
493
|
+
|
|
494
|
+
## 探针结果
|
|
495
|
+
- 未实现标记扫描:...
|
|
496
|
+
- 关键词覆盖:...
|
|
497
|
+
- 测试覆盖:...
|
|
498
|
+
|
|
499
|
+
## 测试结果
|
|
500
|
+
(测试套件执行结果)
|
|
501
|
+
|
|
502
|
+
## 技术债务
|
|
503
|
+
(TODO/FIXME/HACK 统计)
|
|
504
|
+
|
|
505
|
+
## 代码审查
|
|
506
|
+
(问题列表 + 总体评价)
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
**位置验证:** `run.js` 的 `validateFileLocations()` 在 verify 阶段完成后检查此文件是否存在于正确的变更目录下。
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## 4. 扫描文档(scan 阶段产物)
|
|
514
|
+
|
|
515
|
+
**创建时机:** scan 阶段的深度扫描步骤
|
|
516
|
+
|
|
517
|
+
**存储位置:** `.sillyspec/docs/<project>/scan/`
|
|
518
|
+
|
|
519
|
+
**七份文档:**
|
|
520
|
+
| 文件 | 生成步骤 | 内容 |
|
|
521
|
+
|------|---------|------|
|
|
522
|
+
| ARCHITECTURE.md | 深度扫描 — 技术架构 | 技术栈 + 数据库 Schema + 架构模式 |
|
|
523
|
+
| CONVENTIONS.md | 深度扫描 — 代码约定 | 框架隐形规则 + 实体继承 + 代码风格 |
|
|
524
|
+
| STRUCTURE.md | 深度扫描 — 目录结构和集成 | 目录树 + 模块说明 |
|
|
525
|
+
| INTEGRATIONS.md | 深度扫描 — 目录结构和集成 | 外部集成(API/MQ/缓存/SDK) |
|
|
526
|
+
| TESTING.md | 深度扫描 — 测试和债务 | 测试结构 |
|
|
527
|
+
| CONCERNS.md | 深度扫描 — 测试和债务 | 技术债务(按严重程度分组) |
|
|
528
|
+
| PROJECT.md | 深度扫描 — 测试和债务 | 项目概览 |
|
|
529
|
+
|
|
530
|
+
**临时文件:** `_env-detect.md`(环境探测中间产物,扫描完成后删除)
|
|
531
|
+
|
|
532
|
+
**断点续扫:** "断点续扫检测"步骤检查已有文档,只生成缺失的
|
|
533
|
+
|
|
534
|
+
**生命周期:** scan 阶段生成 → 被后续所有阶段(brainstorm/propose/plan/execute/verify)作为上下文读取
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
## 5. 模块文档
|
|
539
|
+
|
|
540
|
+
### `_module-map.yaml` — 文件到模块的映射
|
|
541
|
+
|
|
542
|
+
**创建时机:** scan 阶段"生成模块映射"步骤(可选步骤)
|
|
543
|
+
|
|
544
|
+
**大体结构:**
|
|
545
|
+
```yaml
|
|
546
|
+
# 模块映射(自动生成,可手动修改)
|
|
547
|
+
# 用于 archive 阶段识别变更影响的模块
|
|
548
|
+
modules:
|
|
549
|
+
core:
|
|
550
|
+
paths:
|
|
551
|
+
- src/core/**
|
|
552
|
+
- src/utils/**
|
|
553
|
+
description: 核心工具和公共逻辑
|
|
554
|
+
|
|
555
|
+
stages:
|
|
556
|
+
paths:
|
|
557
|
+
- src/stages/**
|
|
558
|
+
description: 阶段定义(brainstorm/plan/execute/verify/archive等)
|
|
559
|
+
|
|
560
|
+
cli:
|
|
561
|
+
paths:
|
|
562
|
+
- bin/**
|
|
563
|
+
- src/index.js
|
|
564
|
+
- src/run.js
|
|
565
|
+
description: CLI 入口和命令路由
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
**字段说明:**
|
|
569
|
+
| 字段 | 类型 | 说明 |
|
|
570
|
+
|------|------|------|
|
|
571
|
+
| `modules` | object | 模块映射表 |
|
|
572
|
+
| `modules.<name>.paths` | string[] | glob 模式数组,匹配文件路径到模块 |
|
|
573
|
+
| `modules.<name>.description` | string | 模块一句话描述 |
|
|
574
|
+
|
|
575
|
+
**消费者:**
|
|
576
|
+
- archive 阶段 `extract-module-impact` — 将 git diff 文件匹配到模块
|
|
577
|
+
- plan/execute 阶段加载上下文时匹配受影响模块的文档
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
### `<module>.md` — 模块当前状态描述
|
|
582
|
+
|
|
583
|
+
**创建时机:** archive 阶段 `sync-module-docs` 步骤(首次受影响时创建,后续更新)
|
|
584
|
+
|
|
585
|
+
**大体结构:**
|
|
586
|
+
```markdown
|
|
587
|
+
# <module-name>
|
|
588
|
+
|
|
589
|
+
> 最后更新:YYYY-MM-DD
|
|
590
|
+
> 最近变更:<change-name>
|
|
591
|
+
> 模块路径:<glob patterns>
|
|
592
|
+
|
|
593
|
+
## 职责
|
|
594
|
+
(一句话说清这个模块做什么)
|
|
595
|
+
|
|
596
|
+
## 当前设计
|
|
597
|
+
(架构、数据流、关键逻辑 — 描述当前状态,不是历史)
|
|
598
|
+
|
|
599
|
+
## 对外接口
|
|
600
|
+
| 接口 | 说明 | 调用方 |
|
|
601
|
+
|------|------|--------|
|
|
602
|
+
|
|
603
|
+
## 关键数据流
|
|
604
|
+
```
|
|
605
|
+
调用方 → 模块.方法() → 依赖模块.方法() → 返回结果
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
## 设计决策
|
|
609
|
+
| 决策 | 理由 | 来源 |
|
|
610
|
+
|------|------|------|
|
|
611
|
+
|
|
612
|
+
## 依赖关系
|
|
613
|
+
### 依赖本模块
|
|
614
|
+
### 本模块依赖
|
|
615
|
+
|
|
616
|
+
## 注意事项
|
|
617
|
+
(维护提醒、已知限制、修改时需同步检查的模块)
|
|
618
|
+
|
|
619
|
+
## 变更索引
|
|
620
|
+
| 日期 | 变更 | 摘要 |
|
|
621
|
+
|------|------|------|
|
|
622
|
+
| 2026-05-28 | agent-log-streaming | 新增日志流式传输 |
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
**更新规则:**
|
|
626
|
+
- 正文描述当前状态(快照模式),不追加历史
|
|
627
|
+
- 底部"变更索引"追加变更记录
|
|
628
|
+
- 根据变更的"更新内容摘要"更新相关章节(archive 阶段读 module-impact.md,quick 阶段直接基于 git diff 判断)
|
|
629
|
+
- 更新头部元数据:`> 最后更新:YYYY-MM-DD` 和 `> 最近变更:<change-name>`
|
|
630
|
+
|
|
631
|
+
**更新时机:**
|
|
632
|
+
- archive 阶段 `sync-module-docs` 步骤(通过 module-impact.md 驱动)
|
|
633
|
+
- quick 阶段"暂存和更新记录"步骤(直接匹配 git diff 文件到模块,同步更新)
|
|
634
|
+
|
|
635
|
+
**消费方:** brainstorm/propose/plan/execute 阶段"加载上下文"时读取,作为开发参考
|
|
636
|
+
|
|
637
|
+
---
|
|
638
|
+
|
|
639
|
+
## 6. Worktree 文件
|
|
640
|
+
|
|
641
|
+
### `meta.json` — worktree 元数据
|
|
642
|
+
|
|
643
|
+
**创建时机:** `WorktreeManager.create()` 调用 `git worktree add` 后写入
|
|
644
|
+
|
|
645
|
+
**存储位置:** `.sillyspec/.runtime/worktrees/<change-name>/meta.json`
|
|
646
|
+
|
|
647
|
+
**数据结构:**
|
|
648
|
+
```json
|
|
649
|
+
{
|
|
650
|
+
"changeName": "2026-05-28-agent-log-streaming",
|
|
651
|
+
"branch": "sillyspec/2026-05-28-agent-log-streaming",
|
|
652
|
+
"baseBranch": "main",
|
|
653
|
+
"baseHash": "abc123...",
|
|
654
|
+
"actualBaseHash": "def456...",
|
|
655
|
+
"createdAt": "2026-05-28T14:00:00.000Z",
|
|
656
|
+
"worktreePath": "/path/to/.sillyspec/.runtime/worktrees/..."
|
|
657
|
+
}
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
**字段说明:**
|
|
661
|
+
| 字段 | 类型 | 说明 |
|
|
662
|
+
|------|------|------|
|
|
663
|
+
| `changeName` | string | 变更名(禁止包含 `..`、`/`、`\`,创建时校验) |
|
|
664
|
+
| `branch` | string | worktree 分支名,格式 `sillyspec/<change-name>` |
|
|
665
|
+
| `baseBranch` | string | 基础分支,默认当前 HEAD |
|
|
666
|
+
| `baseHash` | string | 基础 commit hash(worktree add 时的) |
|
|
667
|
+
| `actualBaseHash` | string | fetch+merge 后的实际 HEAD(可能与 baseHash 不同) |
|
|
668
|
+
| `createdAt` | string | ISO 时间戳 |
|
|
669
|
+
| `worktreePath` | string | worktree 目录绝对路径 |
|
|
670
|
+
|
|
671
|
+
**特殊行为:** 创建后自动 `fetch origin` + `merge origin/main --ff-only` 同步远程最新代码,`actualBaseHash` 记录 merge 后的实际 HEAD。如果本地和远程没有共同祖先则跳过 merge。
|
|
672
|
+
|
|
673
|
+
**生命周期:** execute 阶段创建 → `WorktreeManager.cleanup()` 清理(git worktree remove → branch -D → rm 目录)
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
## 7. 临时 / 运行时文件
|
|
678
|
+
|
|
679
|
+
### `user-inputs.md`
|
|
680
|
+
|
|
681
|
+
**创建时机:** init 阶段创建初始骨架
|
|
682
|
+
|
|
683
|
+
**大体结构:**
|
|
684
|
+
```markdown
|
|
685
|
+
# 用户输入记录
|
|
686
|
+
|
|
687
|
+
> 每步完成时由 AI 自动追加,记录用户所有原话。
|
|
688
|
+
|
|
689
|
+
## 2026/5/28 14:30:00 | 2026-05-28-agent-log-streaming | execute: 状态检查
|
|
690
|
+
- 输入:用户原始需求/反馈
|
|
691
|
+
- 输出:AI 的输出摘要
|
|
692
|
+
|
|
693
|
+
## 2026/5/28 15:00:00 | 2026-05-28-agent-log-streaming | execute: 加载上下文
|
|
694
|
+
- 输出:上下文加载完成
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
**追加时机:** `run.js` 的 `completeStep()` 每次步骤完成时,如果有 `outputText`,追加一条记录。条目格式:`## <时间> | <变更名> | <阶段>: <步骤名>` + 输入/输出。
|
|
698
|
+
|
|
699
|
+
---
|
|
700
|
+
|
|
701
|
+
### `artifacts/` 下的文件
|
|
702
|
+
|
|
703
|
+
**创建时机:** `completeStep()` 中当 output 文本超过 200 字符时,截断存入 progress,完整内容写入 artifact 文件
|
|
704
|
+
|
|
705
|
+
**命名格式:** `<changeName>-<stageName>-step<当前步骤序号>-<YYYYMMDDHHmmss>.txt`
|
|
706
|
+
|
|
707
|
+
**内容:** 步骤输出的完整文本(未截断版本)
|
|
708
|
+
|
|
709
|
+
---
|
|
710
|
+
|
|
711
|
+
### `history/` 下的文件
|
|
712
|
+
|
|
713
|
+
**创建时机:** `ProgressManager.completeStage()` 阶段完成时写入
|
|
714
|
+
|
|
715
|
+
**命名格式:** `<changeName>-<stage>-<YYYYMMDDHHmmss>.json`
|
|
716
|
+
|
|
717
|
+
**内容结构:**
|
|
718
|
+
```json
|
|
719
|
+
{
|
|
720
|
+
"change": "2026-05-28-agent-log-streaming",
|
|
721
|
+
"stage": "brainstorm",
|
|
722
|
+
"data": { /* 阶段完整数据快照 */ },
|
|
723
|
+
"completedAt": "2026/5/28 12:00:00"
|
|
724
|
+
}
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
---
|
|
728
|
+
|
|
729
|
+
### `local.yaml`
|
|
730
|
+
|
|
731
|
+
**创建时机:** scan 阶段"生成本地配置"步骤
|
|
732
|
+
|
|
733
|
+
**大体结构:**
|
|
734
|
+
```yaml
|
|
735
|
+
# SillySpec 本地配置(自动生成,可手动修改)
|
|
736
|
+
project:
|
|
737
|
+
type: nodejs # nodejs/maven/gradle/generic
|
|
738
|
+
|
|
739
|
+
commands:
|
|
740
|
+
build: "npm run build"
|
|
741
|
+
test: "npm test"
|
|
742
|
+
lint: "npm run lint"
|
|
743
|
+
|
|
744
|
+
# 测试策略:full=全量测试, module=只测变更模块, skip=跳过测试
|
|
745
|
+
test_strategy: module
|
|
746
|
+
|
|
747
|
+
# 模块测试路径映射(可选)
|
|
748
|
+
# module_paths:
|
|
749
|
+
# user-service: "user/"
|
|
750
|
+
# order-service: "order/"
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
**作用:** 存储项目构建/测试/lint 命令,execute 阶段执行前读取。根据项目类型(package.json/pom.xml/build.gradle)自动识别并生成默认值。
|
|
754
|
+
|
|
755
|
+
---
|
|
756
|
+
|
|
757
|
+
## 8. 文件销毁与归档
|
|
758
|
+
|
|
759
|
+
### 变更归档流程
|
|
760
|
+
|
|
761
|
+
**触发:** archive 阶段"确认归档"步骤 + `--confirm` 标志
|
|
762
|
+
|
|
763
|
+
**操作:**
|
|
764
|
+
1. `mkdirSync` 创建 `archive/` 目录
|
|
765
|
+
2. `renameSync` 将 `changes/<name>/` 移动到 `changes/archive/YYYY-MM-DD-<name>/`
|
|
766
|
+
3. 校验:源目录不存在 + 目标目录存在
|
|
767
|
+
4. `unregisterChange()` 将 `changes.status` 更新为 `archived`(SQL UPDATE)
|
|
768
|
+
|
|
769
|
+
### Worktree 清理流程
|
|
770
|
+
|
|
771
|
+
**触发:** `WorktreeManager.cleanup()`
|
|
772
|
+
|
|
773
|
+
**操作:**
|
|
774
|
+
1. `git worktree remove <path> --force`
|
|
775
|
+
2. `git branch -D <branch>`(忽略分支不存在错误)
|
|
776
|
+
3. 确保目录已删除
|
|
777
|
+
|
|
778
|
+
### 数据存储迁移
|
|
779
|
+
|
|
780
|
+
**变更背景:** v4 版本将状态存储从 JSON 文件迁移到 SQLite 数据库。
|
|
781
|
+
|
|
782
|
+
| 方面 | 旧版(v3 JSON) | 新版(v4 SQLite) |
|
|
783
|
+
|------|------|------|
|
|
784
|
+
| 全局状态文件 | `global.json` | `sillyspec.db`(`project` 表) |
|
|
785
|
+
| 变更级状态文件 | `changes/<name>/progress.json` | `sillyspec.db`(`changes`/`stages`/`steps` 表) |
|
|
786
|
+
| 备份机制 | `.bak` 文件 + 原子写入 | SQLite 事务 + WAL 模式 |
|
|
787
|
+
| 进度备份 | `progress.json.bak` | 不再需要(SQLite 内置 ACID) |
|
|
788
|
+
| 运行时缓存 | `_migrateIfNeeded()` 迁移检测 | 不再需要 |
|
|
789
|
+
| 兼容性 | — | **不兼容旧版数据,不提供迁移路径** |
|
|
790
|
+
|
|
791
|
+
**保持不变的文件系统存储:**
|
|
792
|
+
- `artifacts/` — 步骤输出 artifact(超长 output 截断存储),保持文件系统不变
|
|
793
|
+
- `history/` — 已完成阶段的历史快照,保持文件系统不变
|
|
794
|
+
- `user-inputs.md` — 用户输入记录(持续追加),保持文件系统不变
|
|
795
|
+
- `gate-status.json` — 仍由 `_updateGateStatus()` 生成,保持文件系统不变
|
|
796
|
+
|
|
797
|
+
### 旧版迁移
|
|
798
|
+
|
|
799
|
+
> ⚠️ SQLite 迁移后,不再支持从旧版 JSON 文件迁移。v4(SQLite 版本)与 v3(JSON 版本)数据格式不兼容。如需从旧版升级,需重新执行 `sillyspec init`。
|
|
800
|
+
|
|
801
|
+
**历史说明(仅参考,不再生效):**
|
|
802
|
+
1. 旧版 `progress.json` → 复制到 `changes/<name>/progress.json`
|
|
803
|
+
2. 创建 `global.json`
|
|
804
|
+
3. 备份旧文件为 `.bak`
|
|
805
|
+
4. 删除旧文件
|
|
806
|
+
|
|
807
|
+
---
|
|
808
|
+
|
|
809
|
+
## 9. 可选 / 条件生成文件
|
|
810
|
+
|
|
811
|
+
以下文件不一定存在,在特定条件下才会生成。
|
|
812
|
+
|
|
813
|
+
### `MASTER.md` — 大需求拆分主控文档
|
|
814
|
+
|
|
815
|
+
**生成条件:** brainstorm 阶段"需求范围评估"步骤判断需要拆分(满足 2 条以上:3+ 独立模块、3+ 角色、跨页面流转、低耦合)
|
|
816
|
+
|
|
817
|
+
**存储位置:** `.sillyspec/changes/<主变更名>/MASTER.md`(在主变更目录下)
|
|
818
|
+
|
|
819
|
+
**大体结构:**
|
|
820
|
+
```markdown
|
|
821
|
+
# <大需求标题>
|
|
822
|
+
|
|
823
|
+
## 总体概述
|
|
824
|
+
(整体目标和范围)
|
|
825
|
+
|
|
826
|
+
## 拆分方案
|
|
827
|
+
| 变更包 | 名称 | 边界描述 | 依赖 |
|
|
828
|
+
|--------|------|----------|------|
|
|
829
|
+
| 2026-05-28-user-auth | 用户认证 | 登录/注册/JWT | — |
|
|
830
|
+
| 2026-05-29-permission | 权限管理 | RBAC 权限体系 | user-auth |
|
|
831
|
+
| 2026-05-30-audit-log | 审计日志 | 操作日志记录 | permission |
|
|
832
|
+
|
|
833
|
+
## 依赖关系
|
|
834
|
+
```mermaid
|
|
835
|
+
graph LR
|
|
836
|
+
user-auth --> permission
|
|
837
|
+
permission --> audit-log
|
|
838
|
+
```
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
**下游影响:** brainstorm 最后一步"用户确认并生成规范文件"中,读取 MASTER.md 变更包列表,为每个后续包创建独立变更目录及骨架文件(proposal.md/design.md/requirements.md/tasks.md),后续包的 design.md 标记为「待设计」。
|
|
842
|
+
|
|
843
|
+
**归档时:** archive 步骤检查主变更是否有 MASTER.md,如有则标记所有阶段为 ✅ 后清除。
|
|
844
|
+
|
|
845
|
+
---
|
|
846
|
+
|
|
847
|
+
### `prototype-<名称>.html` — HTML 原型
|
|
848
|
+
|
|
849
|
+
**生成条件:** brainstorm 阶段"HTML 原型生成"步骤,AI 判断设计适合可视化(有 UI 组件/布局/交互流程)。纯后端/配置修改类需求跳过。
|
|
850
|
+
|
|
851
|
+
**存储位置:** `.sillyspec/changes/<change-name>/prototype-<名称>.html`
|
|
852
|
+
|
|
853
|
+
**特点:** 单文件(内联 CSS + JS),浏览器直接打开,ASCII/线框风格,用于设计方向确认。
|
|
854
|
+
|
|
855
|
+
---
|
|
856
|
+
|
|
857
|
+
### ~~`progress.json.bak`~~ — 已废弃
|
|
858
|
+
|
|
859
|
+
> ⚠️ 此文件在 SQLite 迁移后不再生成。旧版用于 progress.json 的备份恢复机制已被 SQLite 事务替代。历史遗留的 `.bak` 文件可以安全删除。
|
|
860
|
+
|
|
861
|
+
---
|
|
862
|
+
|
|
863
|
+
### `_env-detect.md` — 环境探测临时文件
|
|
864
|
+
|
|
865
|
+
**生成条件:** scan 阶段"构建环境探测"步骤,探测构建环境和依赖后暂存。
|
|
866
|
+
|
|
867
|
+
**存储位置:** `.sillyspec/docs/<project>/scan/_env-detect.md`
|
|
868
|
+
|
|
869
|
+
**生命周期:** 探测步骤创建 → 后续深度扫描步骤读取参考 → "自检和提交"步骤删除(`rm -f`)
|
|
870
|
+
|
|
871
|
+
---
|
|
872
|
+
|
|
873
|
+
### `ROADMAP.md` — 项目路线图
|
|
874
|
+
|
|
875
|
+
**生成条件:** 用户自行创建,非 SillySpec 自动生成
|
|
876
|
+
|
|
877
|
+
**存储位置:** `.sillyspec/ROADMAP.md`
|
|
878
|
+
|
|
879
|
+
**作用:** archive 阶段"更新路线图和提交"步骤检查是否存在,如存在则标记对应 Phase 为已完成。
|
|
880
|
+
|
|
881
|
+
---
|
|
882
|
+
|
|
883
|
+
### `CODEBASE-OVERVIEW.md` — 代码库总览
|
|
884
|
+
|
|
885
|
+
**生成条件:** 用户自行创建或由其他工具生成,非 SillySpec 自动生成
|
|
886
|
+
|
|
887
|
+
**存储位置:** 项目根目录或 `.sillyspec/` 下
|
|
888
|
+
|
|
889
|
+
**消费者:** brainstorm/plan/execute 阶段的"加载上下文"步骤都会尝试读取。
|
|
890
|
+
|
|
891
|
+
---
|
|
892
|
+
|
|
893
|
+
### `STACK.md` — 技术栈描述
|
|
894
|
+
|
|
895
|
+
**生成条件:** 用户自行创建,非 SillySpec 自动生成
|
|
896
|
+
|
|
897
|
+
**消费者:** plan 阶段"加载上下文"步骤读取,作为上下文参考。
|
|
898
|
+
|
|
899
|
+
---
|
|
900
|
+
|
|
901
|
+
### `knowledge/INDEX.md` — 知识库索引
|
|
902
|
+
|
|
903
|
+
**生成条件:** `sillyspec init` 时自动创建骨架
|
|
904
|
+
|
|
905
|
+
**大体结构:**
|
|
906
|
+
```markdown
|
|
907
|
+
# Knowledge Index
|
|
908
|
+
|
|
909
|
+
> 子代理任务开始前查询此文件,按关键词匹配,只读命中的知识文件。
|
|
910
|
+
> execute/quick 执行中发现的坑自动追加到 uncategorized.md,经用户确认后归类到对应文件。
|
|
911
|
+
|
|
912
|
+
<!-- 格式:关键词1|关键词2|关键词3 → 文件路径 -->
|
|
913
|
+
<!-- 示例:mybatis-plus|分页|Page → pagination.md -->
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
**消费者:**
|
|
917
|
+
- execute 阶段"确认执行范围"步骤查询,匹配 Task 关键词到知识文件
|
|
918
|
+
- quick 阶段"理解任务"步骤查询
|
|
919
|
+
|
|
920
|
+
---
|
|
921
|
+
|
|
922
|
+
### `knowledge/uncategorized.md` — 未分类知识
|
|
923
|
+
|
|
924
|
+
**生成条件:** `sillyspec init` 时自动创建骨架
|
|
925
|
+
|
|
926
|
+
**大体结构:**
|
|
927
|
+
```markdown
|
|
928
|
+
# 未分类知识
|
|
929
|
+
|
|
930
|
+
> execute/quick 执行中发现的坑暂存于此,用户审阅后归类到对应文件并更新 INDEX.md。
|
|
931
|
+
```
|
|
932
|
+
|
|
933
|
+
**写入方:**
|
|
934
|
+
- execute 阶段 AI 发现技术坑时追加
|
|
935
|
+
- quick 阶段"暂存和更新记录"步骤,如果发现项目特有的坑也追加
|
|
936
|
+
|
|
937
|
+
**下游流程:** 用户审阅后归类到 `knowledge/<topic>.md` 并更新 `INDEX.md` 索引。
|
|
938
|
+
|
|
939
|
+
---
|
|
940
|
+
|
|
941
|
+
### 后续变更包目录(骨架)
|
|
942
|
+
|
|
943
|
+
**生成条件:** brainstorm 阶段生成了 MASTER.md 且规划了多个变更包
|
|
944
|
+
|
|
945
|
+
**创建时机:** brainstorm 阶段最后一步,一次性为所有后续包创建目录和骨架
|
|
946
|
+
|
|
947
|
+
**目录结构:**
|
|
948
|
+
```.sillyspec/changes/<后续包名>/
|
|
949
|
+
├── proposal.md ← 从 MASTER.md 提取动机和边界
|
|
950
|
+
├── design.md ← 标记「待设计 - 本包 design 在该包进入 brainstorm 时完善」
|
|
951
|
+
├── requirements.md ← 标记「待完善」
|
|
952
|
+
└── tasks.md ← 空任务列表,标记「待 plan 阶段展开」
|
|
953
|
+
```
|
|
954
|
+
|
|
955
|
+
**与主变更的区别:** 主变更的四件套是完整的;后续包的 design.md 和 requirements.md 是占位符,需要在该包独立进入 brainstorm 时完善。
|
|
956
|
+
|
|
957
|
+
---
|
|
958
|
+
|
|
959
|
+
### `AGENTS.md` / `GEMINI.md` / `INSTRUCTIONS.md` — AI 工具指令注入
|
|
960
|
+
|
|
961
|
+
**生成条件:** `sillyspec init --tool codex` / `--tool gemini` / `--tool opencode`,或交互模式选中这些工具时
|
|
962
|
+
|
|
963
|
+
**注入规则:**
|
|
964
|
+
- 文件不存在 → 直接创建
|
|
965
|
+
- 已存在且无 SillySpec 标记 → 追加到末尾
|
|
966
|
+
- 已存在且已有 SillySpec 内容 → 跳过
|
|
967
|
+
|
|
968
|
+
**注入内容:** 代码规范(读 CONVENTIONS.md/ARCHITECTURE.md)+ 工作流程(读 sillyspec.db 确认阶段)+ 产出路径说明
|
|
969
|
+
|
|
970
|
+
---
|
|
971
|
+
|
|
972
|
+
### `QUICKLOG-<user>.md` — quick 阶段任务日志
|
|
973
|
+
|
|
974
|
+
**生成条件:** quick 阶段"理解任务"步骤(无 `--change` 时创建)
|
|
975
|
+
|
|
976
|
+
**存储位置:** `.sillyspec/quicklog/QUICKLOG-<git用户名>.md`
|
|
977
|
+
|
|
978
|
+
**大体结构:**
|
|
979
|
+
```markdown
|
|
980
|
+
## 2026-05-28 14:30:00 — 修复用户登录超时问题
|
|
981
|
+
状态:进行中
|
|
982
|
+
文件:src/auth/login.js, src/config/timeout.yaml
|
|
983
|
+
|
|
984
|
+
## 2026-05-28 15:00:00 — 修复用户登录超时问题
|
|
985
|
+
状态:已完成
|
|
986
|
+
文件:src/auth/login.js
|
|
987
|
+
结果:调整超时配置为 30s,新增重试逻辑
|
|
988
|
+
```
|
|
989
|
+
|
|
990
|
+
**生命周期:** quick 步骤 1 创建("进行中")→ 步骤 5 更新为"已完成"并补充实际改动。超过 500 行轮转重命名为 `QUICKLOG-<USER>-YYYY-MM-DD.md`。
|
|
991
|
+
|
|
992
|
+
---
|
|
993
|
+
|
|
994
|
+
### `propose` 阶段 — 快速生成规范
|
|
995
|
+
|
|
996
|
+
> **说明:** propose 是独立的阶段,与 brainstorm 并列。brainstorm 通过多轮对话探索需求后生成四件套;propose 跳过对话,基于已有设计直接生成四件套。两者产出相同(proposal.md + design.md + requirements.md + tasks.md),但路径不同。
|
|
997
|
+
|
|
998
|
+
**阶段步骤:**
|
|
999
|
+
1. 状态检查 → 2. 加载上下文(含模块文档加载 + 冲突检测)→ 3. 锚定确认 → 4. 探索现有代码 → 5. 生成规范文件 → 6. 自检门控 → 7. 展示并更新进度
|
|
1000
|
+
|
|
1001
|
+
**与 brainstorm 的区别:**
|
|
1002
|
+
- brainstorm:对话式探索(10+ 步骤),适合新需求
|
|
1003
|
+
- propose:快速生成(7 步),适合已有明确设计的场景
|
|
1004
|
+
- propose 的自检门控独立于 brainstorm 的自审,检查项更聚焦
|
|
1005
|
+
|
|
1006
|
+
---
|
|
1007
|
+
|
|
1008
|
+
### `PROJECT.md` / `REQUIREMENTS.md` / `HANDOFF.json` — 项目级信息文件
|
|
1009
|
+
|
|
1010
|
+
**生成条件:** 用户自行创建,非 SillySpec 自动生成
|
|
1011
|
+
|
|
1012
|
+
**存储位置:** `.sillyspec/PROJECT.md`、`.sillyspec/REQUIREMENTS.md`、`.sillyspec/HANDOFF.json`
|
|
1013
|
+
|
|
1014
|
+
**消费者:** status 阶段读取展示项目基础信息和变更状态
|
|
1015
|
+
|
|
1016
|
+
---
|
|
1017
|
+
|
|
1018
|
+
### 可选文件汇总表
|
|
1019
|
+
|
|
1020
|
+
| 文件 | 生成条件 | 生成者 | 消费者 |
|
|
1021
|
+
|------|---------|--------|--------|
|
|
1022
|
+
| `MASTER.md` | 大需求需要拆分(brainstorm 判断) | brainstorm | 后续变更包骨架生成、archive 归档 |
|
|
1023
|
+
| `prototype-*.html` | 需要可视化确认设计(brainstorm 判断) | brainstorm | 用户确认 |
|
|
1024
|
+
| `QUICKLOG-<user>.md` | quick 阶段(无 --change 时) | quick | 任务记录 + 轮转归档 |
|
|
1025
|
+
| ~~`progress.json.bak`~~ | ~~已废弃~~ | ~~ProgressManager._backup()~~ | ~~损坏恢复~~ |
|
|
1026
|
+
| `_env-detect.md` | scan 环境探测步骤 | scan | 深度扫描步骤参考后删除 |
|
|
1027
|
+
| `ROADMAP.md` | 用户自行创建 | 用户 | archive 标记 Phase 完成 |
|
|
1028
|
+
| `PROJECT.md` | 用户自行创建 | 用户 | status 展示项目信息 |
|
|
1029
|
+
| `REQUIREMENTS.md` | 用户自行创建 | 用户 | status 展示需求 |
|
|
1030
|
+
| `HANDOFF.json` | 用户自行创建 | 用户 | status 展示交接 |
|
|
1031
|
+
| `CODEBASE-OVERVIEW.md` | 用户/工具创建 | 用户 | brainstorm/plan/execute 加载 |
|
|
1032
|
+
| `STACK.md` | 用户自行创建 | 用户 | plan/doctor 加载 |
|
|
1033
|
+
| `knowledge/INDEX.md` | init 自动创建 | init | execute/quick 关键词匹配 |
|
|
1034
|
+
| `knowledge/uncategorized.md` | init 创建 + execute/quick 追加 | init/execute/quick | 用户审阅后归类 |
|
|
1035
|
+
| 后续包骨架目录 | MASTER.md 存在时 | brainstorm 末步 | 后续包独立 brainstorm |
|
|
1036
|
+
| `AGENTS.md` 等 | 选了 codex/gemini/opencode 工具 | init | AI 工具读取 |
|
|
1037
|
+
| `projects/*.yaml` | init 自动创建 | init | 子项目上下文加载 |
|
|
1038
|
+
| `modules/_module-map.yaml` | scan 可选步骤 | scan | archive/plan/execute |
|
|
1039
|
+
| `verification.md` | verify 阶段输出 | verify | 验证报告存档 |
|
|
1040
|
+
|
|
1041
|
+
|
|
1042
|
+
```
|
|
1043
|
+
sillyspec init
|
|
1044
|
+
│
|
|
1045
|
+
├─→ .sillyspec/.runtime/sillyspec.db
|
|
1046
|
+
├─→ .sillyspec/.runtime/user-inputs.md
|
|
1047
|
+
├─→ .sillyspec/projects/<name>.yaml
|
|
1048
|
+
├─→ .sillyspec/docs/<name>/scan/ (骨架)
|
|
1049
|
+
├─→ .sillyspec/knowledge/
|
|
1050
|
+
└─→ .gitignore (追加 .sillyspec/.runtime/)
|
|
1051
|
+
|
|
1052
|
+
scan 阶段
|
|
1053
|
+
│
|
|
1054
|
+
├─→ docs/<name>/scan/ARCHITECTURE.md
|
|
1055
|
+
├─→ docs/<name>/scan/CONVENTIONS.md
|
|
1056
|
+
├─→ docs/<name>/scan/STRUCTURE.md
|
|
1057
|
+
├─→ docs/<name>/scan/INTEGRATIONS.md
|
|
1058
|
+
├─→ docs/<name>/scan/TESTING.md
|
|
1059
|
+
├─→ docs/<name>/scan/CONCERNS.md
|
|
1060
|
+
├─→ docs/<name>/scan/PROJECT.md
|
|
1061
|
+
├─→ docs/<name>/modules/_module-map.yaml (可选)
|
|
1062
|
+
└─→ .sillyspec/local.yaml
|
|
1063
|
+
|
|
1064
|
+
brainstorm 阶段
|
|
1065
|
+
│
|
|
1066
|
+
├─→ sillyspec.db: changes/stages 记录自动创建
|
|
1067
|
+
├─→ changes/<name>/design.md (自审步骤初版 + 确认步骤终版)
|
|
1068
|
+
├─→ changes/<name>/proposal.md (确认步骤)
|
|
1069
|
+
├─→ changes/<name>/requirements.md (确认步骤)
|
|
1070
|
+
├─→ changes/<name>/tasks.md (确认步骤)
|
|
1071
|
+
├─→ changes/<name>/MASTER.md (可选,需拆分时)
|
|
1072
|
+
├─→ changes/<后续包名>/ (可选,骨架目录)
|
|
1073
|
+
└─→ changes/<name>/prototype-*.html (可选)
|
|
1074
|
+
|
|
1075
|
+
propose 阶段(替代 brainstorm 的快速路径)
|
|
1076
|
+
│
|
|
1077
|
+
├─→ sillyspec.db: changes/stages 记录自动创建
|
|
1078
|
+
├─→ changes/<name>/proposal.md
|
|
1079
|
+
├─→ changes/<name>/design.md
|
|
1080
|
+
├─→ changes/<name>/requirements.md
|
|
1081
|
+
└─→ changes/<name>/tasks.md
|
|
1082
|
+
|
|
1083
|
+
plan 阶段
|
|
1084
|
+
│
|
|
1085
|
+
├─→ changes/<name>/plan.md
|
|
1086
|
+
└─→ changes/<name>/tasks/task-NN.md
|
|
1087
|
+
|
|
1088
|
+
execute 阶段
|
|
1089
|
+
│
|
|
1090
|
+
├─→ .sillyspec/.runtime/worktrees/<name>/meta.json
|
|
1091
|
+
├─→ .sillyspec/.runtime/gate-status.json
|
|
1092
|
+
└─→ (代码变更在 worktree 中,不在 .sillyspec/ 下)
|
|
1093
|
+
|
|
1094
|
+
verify 阶段
|
|
1095
|
+
│
|
|
1096
|
+
└─→ changes/<name>/verification.md (⚠️ prompt 输出 verification.md,validateFileLocations 期望 verify-result.md)
|
|
1097
|
+
|
|
1098
|
+
quick 阶段(辅助阶段,不走完整流程)
|
|
1099
|
+
│
|
|
1100
|
+
├─→ .sillyspec/quicklog/QUICKLOG-<user>.md (无 --change 时)
|
|
1101
|
+
├─→ .sillyspec/.runtime/worktrees/<name>/meta.json
|
|
1102
|
+
├─→ .sillyspec/.runtime/gate-status.json
|
|
1103
|
+
└─→ docs/<name>/modules/<module>.md (直接同步,不经过 module-impact.md)
|
|
1104
|
+
|
|
1105
|
+
archive 阶段
|
|
1106
|
+
│
|
|
1107
|
+
├─→ changes/<name>/module-impact.md
|
|
1108
|
+
├─→ docs/<name>/modules/<module>.md (通过 module-impact.md 同步)
|
|
1109
|
+
└─→ changes/<name>/ → changes/archive/YYYY-MM-DD-<name>/
|
|
1110
|
+
```
|