sillyspec 3.16.0 → 3.16.2

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  <img src="logo.jpg" width="80" />
3
3
  </p>
4
4
 
5
- # SillySpec v3.9 — 规范驱动开发工具包
5
+ # SillySpec v3.16 — 规范驱动开发工具包
6
6
 
7
7
  > 融合 Superpowers + OpenSpec + GSD,从"你说要啥"到"代码能跑"的完整流程。
8
8
  > Claude Code / Cursor / Codex / OpenCode / OpenClaw 都能用。
@@ -0,0 +1,99 @@
1
+ ---
2
+ author: qinyi
3
+ created_at: 2026-06-04 16:25:42
4
+ updated_at: 2026-06-04 16:55:00
5
+ ---
6
+
7
+ # 剩余实现差异清单
8
+
9
+ 本页只记录当前代码仍存在的实现差异。已修复的条目不再保留为缺口,包括:
10
+
11
+ - `brainstorm` / `propose` 重复 object key 导致步骤丢失。
12
+ - scan prompt 写 `.sillyspec/.runtime/local.yaml`。
13
+ - hook 只读根目录 `local.yaml`。
14
+ - archive 第 4 步正常流程不触发自动归档。
15
+ - 自动 sync / approval 参数顺序不匹配。
16
+ - `ProgressManager._updatePlatformLastSync()` / `_updateApprovalStatus()` 缺失。
17
+
18
+ ## workflow-runs 平台路径支持未从 run.js 接通
19
+
20
+ 代码位置:`src/workflow.js`、`src/run.js`
21
+
22
+ 现象:
23
+
24
+ - `saveWorkflowRun()` 支持传 `runtimeRoot`。
25
+ - `run.js` scan/archive post-check 调用时没有传 `runtimeRoot` / `scanRunId`。
26
+
27
+ 影响:
28
+
29
+ - 自动 post-check 的 workflow run 当前写本地 `.sillyspec/.runtime/workflow-runs/`。
30
+ - 平台模式下不能按旧文档断言它会写入 `<runtime-root>/scan-runs/<scan-run-id>/workflow-runs/`。
31
+
32
+ ## `--no-worktree` 未作为 run flag 接通
33
+
34
+ 代码位置:`src/run.js`、`src/stages/execute.js`、`src/worktree.js`、`src/hooks/worktree-guard.js`
35
+
36
+ 现象:
37
+
38
+ - execute prompt 和 worktree 错误信息提到 `--no-worktree`。
39
+ - `buildExecuteSteps()` 也有 `noWorktree` option。
40
+ - `runCommand()` 的 known flags 不包含 `--no-worktree`。
41
+ - CLI usage 也没有列出 `--no-worktree`。
42
+
43
+ 影响:
44
+
45
+ - 文档不能把 `--no-worktree` 描述成已可用的公开 run 参数。
46
+ - `changes.no_worktree` / gate `noWorktree` 字段存在,但当前没有清晰 CLI 生命周期入口。
47
+
48
+ ## DB schema version 口径不统一
49
+
50
+ 代码位置:`src/db.js`、`src/progress.js`
51
+
52
+ 现象:
53
+
54
+ - `db.js` 的 `project.schema_version` 默认值是 4。
55
+ - `progress.js` 的 `CURRENT_VERSION` 是 3。
56
+ - `ProgressManager.init()` 写 project 行时使用 `CURRENT_VERSION`。
57
+
58
+ 影响:
59
+
60
+ - 文档只描述表结构,不把当前状态存储称为明确 v4 schema。
61
+
62
+ ## `global.json` 是遗留口径
63
+
64
+ 代码位置:`src/progress.js`
65
+
66
+ 现象:
67
+
68
+ - 注释和常量还提到 `.sillyspec/.runtime/global.json`。
69
+ - 实际 `readGlobal()` / `writeGlobal()` 已经走 SQL。
70
+
71
+ 影响:
72
+
73
+ - 文档应写成“当前没有实际 global.json 生命周期”。
74
+
75
+ ## workflow archive 固定 project 为 `sillyspec`
76
+
77
+ 代码位置:`src/run.js`
78
+
79
+ 现象:
80
+
81
+ - archive `extract-module-impact` post-check 调用 `runPostCheck(resolved, cwd, 'sillyspec')`。
82
+ - 不按当前项目注册表动态选择 project。
83
+
84
+ 影响:
85
+
86
+ - 文档不能写成 archive impact workflow 对所有项目自动按 project 维度检查。
87
+
88
+ ## platform approve / reject 尚未实现
89
+
90
+ 代码位置:`src/sync.js`
91
+
92
+ 现象:
93
+
94
+ - `sillyspec platform approve <change-name>` 和 `reject <change-name>` 有 CLI 分支。
95
+ - 当前实现只打印 “尚未实现” warning。
96
+
97
+ 影响:
98
+
99
+ - 本地 `checkApproval()` 能读取并记录平台审批状态,但 CLI 端还不能主动向平台发起 approve/reject。
@@ -0,0 +1,218 @@
1
+ ---
2
+ author: qinyi
3
+ created_at: 2026-06-04 16:25:42
4
+ ---
5
+
6
+ # 平台模式、Workflow 与 Sync
7
+
8
+ ## 平台 scan 参数
9
+
10
+ `sillyspec run scan` 支持:
11
+
12
+ ```text
13
+ --spec-root <path>
14
+ --runtime-root <path>
15
+ --workspace-id <id>
16
+ --scan-run-id <id>
17
+ ```
18
+
19
+ `run.js` 会在首次 scan 时把这些参数暂存到:
20
+
21
+ ```text
22
+ .sillyspec/.runtime/platform-scan.json
23
+ ```
24
+
25
+ 后续 `--done` / `--skip` 会从该文件恢复参数。
26
+
27
+ ## 路径替换
28
+
29
+ `run.js outputStep()` 在 scan 阶段替换:
30
+
31
+ | 占位符 | 本地模式 | 平台模式 |
32
+ |---|---|---|
33
+ | `{DOCS_ROOT}` | `<cwd>/.sillyspec/docs/<project>` | `<spec-root>/.sillyspec/docs/<project>` |
34
+ | `{PROJECTS_ROOT}` | `<cwd>/.sillyspec/projects` | `<spec-root>/.sillyspec/projects` |
35
+
36
+ 传入 `--runtime-root` 时,输出 prompt 会附加运行时产物路径:
37
+
38
+ ```text
39
+ <runtime-root>/scan-runs/<scan-run-id>/
40
+ ```
41
+
42
+ ## long output artifact
43
+
44
+ 当 step output 超过 200 字:
45
+
46
+ - 本地模式写 `.sillyspec/.runtime/artifacts/`
47
+ - 平台模式且有 `runtimeRoot` 时写 `<runtime-root>/scan-runs/<scan-run-id>/`
48
+
49
+ 这是 `run.js completeStep()` 的真实行为。
50
+
51
+ ## `manifest.json`
52
+
53
+ 触发条件:scan 阶段完成,且 `platformOpts.specRoot` 存在。
54
+
55
+ 写入位置:
56
+
57
+ ```text
58
+ <spec-root>/.sillyspec/manifest.json
59
+ ```
60
+
61
+ 字段:
62
+
63
+ ```json
64
+ {
65
+ "workspace_id": "optional",
66
+ "scan_run_id": "optional",
67
+ "source_commit": "git HEAD or null",
68
+ "generated_at": "ISO timestamp",
69
+ "schema_version": 1
70
+ }
71
+ ```
72
+
73
+ 写入后,`run.js` 会尝试删除 `.sillyspec/.runtime/platform-scan.json`,并检查本地 source root 的 `.sillyspec/docs/` 是否有文档污染;发现 `.md` 文件时只输出 warning。
74
+
75
+ ## Workflow 定义
76
+
77
+ 目录:
78
+
79
+ ```text
80
+ .sillyspec/workflows/
81
+ ```
82
+
83
+ 创建方:`init.js` 从 `templates/workflows/*.yaml` 复制。
84
+
85
+ 当前核心模板:
86
+
87
+ - `scan-docs.yaml`
88
+ - `archive-impact.yaml`
89
+
90
+ 加载方:`workflow.js loadWorkflow(cwd, name)`。
91
+
92
+ CLI:
93
+
94
+ ```text
95
+ sillyspec workflow list
96
+ sillyspec workflow check <name> --project <project> [--json] [--save]
97
+ ```
98
+
99
+ ## Workflow run 归档
100
+
101
+ `workflow.js saveWorkflowRun()` 支持两种路径:
102
+
103
+ - 默认:`<cwd>/.sillyspec/.runtime/workflow-runs/`
104
+ - 如果调用方传 `runtimeRoot`:`<runtimeRoot>/scan-runs/<scanRunId>/workflow-runs/`
105
+
106
+ 文件名:
107
+
108
+ ```text
109
+ <YYYYMMDDHHMMSS>-<workflow>-<project>-<status>.json
110
+ ```
111
+
112
+ 记录包含:
113
+
114
+ - `run_id`
115
+ - `created_at`
116
+ - `source`
117
+ - `stage`
118
+ - `step`
119
+ - `workflow`
120
+ - `project`
121
+ - `status`
122
+ - `spec_version`
123
+ - `roles`
124
+ - `workflow_checks`
125
+ - `failures`
126
+ - `retry_prompts`
127
+
128
+ 当前接线限制:`run.js` 在 scan/archive post-check 中调用 `saveWorkflowRun(result, { cwd, source, stage, step })`,没有传 `runtimeRoot` 和 `scanRunId`。所以即使平台 scan 有 runtimeRoot,当前 run.js 自动 workflow 归档仍会落在本地 `.sillyspec/.runtime/workflow-runs/`。
129
+
130
+ ## scan post-check
131
+
132
+ 触发点:`run.js completeStep()` 中,scan step 名包含“深度扫描”时。
133
+
134
+ 行为:
135
+
136
+ 1. 加载 `scan-docs` workflow。
137
+ 2. 根据当前 step 的 `project` 字段或步骤名中的 `[project]` 判断检查项目。
138
+ 3. 对项目运行 `runPostCheck()`。
139
+ 4. 打印报告。
140
+ 5. 保存 workflow run。
141
+ 6. 失败时打印 retry prompt。
142
+
143
+ 保存时 `stage` 字段当前传的是 `verify`,这是代码中的实际参数。
144
+
145
+ ## archive post-check
146
+
147
+ 触发点:archive step 名包含 `extract-module-impact` 时。
148
+
149
+ 行为:
150
+
151
+ 1. 加载 `archive-impact` workflow。
152
+ 2. 替换 `<change-name>`。
153
+ 3. 固定用 project `sillyspec` 运行 `runPostCheck()`。
154
+ 4. 只摘出 `impact-analyzer` 角色结果打印。
155
+ 5. 保存 workflow run。
156
+
157
+ ## SillyHub sync
158
+
159
+ 平台同步实现位于 `src/sync.js`。
160
+
161
+ 配置文件:
162
+
163
+ ```text
164
+ .sillyspec/local.yaml
165
+ ```
166
+
167
+ `platform connect` 会写入:
168
+
169
+ ```yaml
170
+ platform:
171
+ url: <url>
172
+ token: <token>
173
+ last_connected: <iso-time>
174
+ ```
175
+
176
+ 命令:
177
+
178
+ ```text
179
+ sillyspec platform connect <url> [--token <token>]
180
+ sillyspec platform disconnect
181
+ sillyspec platform sync [--change <name>]
182
+ sillyspec platform sync-docs [--change <name>]
183
+ sillyspec platform status
184
+ sillyspec platform approve <change-name>
185
+ sillyspec platform reject <change-name> [--reason <reason>]
186
+ ```
187
+
188
+ 当前真实情况:
189
+
190
+ - `connect`、`disconnect`、`sync`、`sync-docs`、`status` 有实现。
191
+ - `approve` / `reject` 目前只打印 “尚未实现” warning。
192
+ - `sync()` 和 `syncDocuments()` 网络失败只 warning,不抛错。
193
+ - `sync()` 成功后会调用 `ProgressManager._updatePlatformLastSync()`,更新 `changes.platform_last_sync` 并打开 `platform_sync_enabled`。
194
+ - `checkApproval()` 成功后会调用 `ProgressManager._updateApprovalStatus()`,把平台审批状态写入 `approvals` 表。
195
+
196
+ ## 自动 sync 接线
197
+
198
+ `run.js` 在 `_write()` 后会 best-effort 调用 `triggerSync()`。
199
+
200
+ 当前实现中 `triggerSync(cwd, changeName)` 会先确认 `.sillyspec/changes/<changeName>/` 仍存在,然后调用:
201
+
202
+ ```js
203
+ syncMod.sync(changeName, cwd)
204
+ ```
205
+
206
+ 这与 `sync.js` 导出的签名一致:
207
+
208
+ ```js
209
+ sync(changeName, cwd)
210
+ ```
211
+
212
+ `execute` 启动前的审批检查也按同一顺序调用:
213
+
214
+ ```js
215
+ syncMod.checkApproval(changeName, cwd)
216
+ ```
217
+
218
+ 自动 sync 和审批检查都是 best-effort:未连接平台、网络失败或本地更新失败时只 warning,不阻断本地阶段推进。
@@ -0,0 +1,167 @@
1
+ ---
2
+ author: qinyi
3
+ created_at: 2026-06-04 16:25:42
4
+ ---
5
+
6
+ # 阶段与变更产物
7
+
8
+ ## 变更注册
9
+
10
+ 变更状态由 `ProgressManager.initChange()` 写入 SQLite:
11
+
12
+ - 确保 `.sillyspec/changes/<change>/` 存在
13
+ - `changes` 表插入或激活 change
14
+ - 为所有有效阶段写入 `stages` 行
15
+ - 默认 `current_stage = 'brainstorm'`
16
+
17
+ `run.js` 在执行阶段时会调用 `pm.registerChange()`,确保 effective change 是 active。
18
+
19
+ ## 阶段步骤来源
20
+
21
+ 阶段定义来自 `src/stages/*.js`,由 `src/stages/index.js` 注册。`scan`、`quick`、`explore`、`archive`、`status`、`doctor` 被标记为辅助阶段;辅助阶段完成后,`run.js` 会把该阶段步骤重置为 pending,并清空当前辅助阶段的 gate 状态。
22
+
23
+ 当前运行时步骤数:
24
+
25
+ | 阶段 | 步骤数 | 产物口径 |
26
+ |---|---:|---|
27
+ | scan | 10 | 生成 `.sillyspec/docs/<project>/...`,step 2 后动态展开项目级步骤 |
28
+ | brainstorm | 11 | 第 10 步写 `design.md` 并自审,第 11 步确认后生成四件套,可选生成 `MASTER.md`、prototype、后续包骨架 |
29
+ | propose | 7 | 第 5 步生成四件套,第 6 步自检门控 |
30
+ | plan | 8+ | 生成 `plan.md`;如解析到任务,会动态插入任务蓝图协调器 |
31
+ | execute | 12+ | 生成/使用 worktree,按 Wave 执行;最终 apply/cleanup |
32
+ | verify | 7 | 写 `verify-result.md` |
33
+ | archive | 5 | 写 `module-impact.md`,同步模块文档,归档目录 |
34
+ | quick | 3 | 写 quicklog 或追加 change tasks;直接改主工作区 |
35
+
36
+ ## 变更四件套
37
+
38
+ 目标路径:`.sillyspec/changes/<change>/`
39
+
40
+ | 文件 | 当前创建方式 | 后续消费者 |
41
+ |---|---|---|
42
+ | `proposal.md` | brainstorm 第 11 步;propose 第 5 步 | propose/plan/verify/archive prompt |
43
+ | `design.md` | brainstorm 第 10/11 步;propose 第 5 步 | plan、execute、verify、worktree apply 的文件清单 |
44
+ | `requirements.md` | brainstorm 第 11 步;propose 第 5 步 | plan、verify |
45
+ | `tasks.md` | brainstorm 第 11 步;propose 第 5 步;quick `--change` 可追加 task | plan、execute、verify、archive |
46
+
47
+ `run.js validateFileLocations()` 在阶段完成时会检查:
48
+
49
+ | 阶段 | 预期文件 |
50
+ |---|---|
51
+ | propose | `proposal.md`、`design.md`、`requirements.md`、`tasks.md` |
52
+ | plan | `plan.md` |
53
+ | verify | `verify-result.md` |
54
+ | archive | `module-impact.md` |
55
+
56
+ 这个检查只打印警告,不会阻止流程。
57
+
58
+ ## `design.md` 文件变更清单
59
+
60
+ 解析方:`src/change-list.js`
61
+
62
+ 规则:
63
+
64
+ - 查找 `## 文件变更清单` 或 `### 文件变更清单`
65
+ - 截取到下一个 `##` 标题
66
+ - 解析 Markdown 表格
67
+ - 取第二列作为文件路径
68
+ - 忽略空路径、`—`、`-`、`.sillyspec/` 开头路径
69
+
70
+ 消费者:
71
+
72
+ - `worktree-apply.js` 用它作为 allow list
73
+ - verify/archive prompt 要求人工对照
74
+
75
+ 如果清单为空,`applyWorktree()` 不做 allow list 限制。
76
+
77
+ ## `plan.md` 和 `tasks/task-NN.md`
78
+
79
+ `plan.md` 创建方式:plan 阶段“展开任务并分组”prompt 写入。
80
+
81
+ `run.js completeStep()` 在该步骤完成后读取 `plan.md`。如果能解析到 `- [ ] task-XX:` 格式的任务,会通过 `buildPlanSteps(changeDir, planContent)` 动态插入“生成任务蓝图(子代理并行)”步骤。
82
+
83
+ `tasks/task-NN.md` 创建方式:动态任务蓝图协调器 prompt 要求子代理写入。
84
+
85
+ 当前 `tasks/task-NN.md` frontmatter 模板包含:
86
+
87
+ - `id`
88
+ - `title`
89
+ - `priority`
90
+ - `estimated_hours`
91
+ - `depends_on`
92
+ - `blocks`
93
+ - `allowed_paths`
94
+
95
+ ## `verify-result.md`
96
+
97
+ 路径:`.sillyspec/changes/<change>/verify-result.md`
98
+
99
+ 创建方式:verify 阶段最后一步 prompt。
100
+
101
+ `run.js` 不生成报告正文,只在 verify 阶段完成后检查文件是否存在,并提示下一步 `sillyspec run archive`。
102
+
103
+ ## `module-impact.md`
104
+
105
+ 路径:`.sillyspec/changes/<change>/module-impact.md`
106
+
107
+ 创建方式:archive 阶段 `extract-module-impact` prompt。
108
+
109
+ `run.js` 在该步骤完成后会尝试加载 `.sillyspec/workflows/archive-impact.yaml` 并执行 workflow post-check,然后把检查结果保存到 `.sillyspec/.runtime/workflow-runs/`。
110
+
111
+ ## scan 文档
112
+
113
+ 目标目录:`.sillyspec/docs/<project>/scan/`
114
+
115
+ 当前 scan 定义要求 7 份核心扫描文档:
116
+
117
+ - `ARCHITECTURE.md`
118
+ - `CONVENTIONS.md`
119
+ - `STRUCTURE.md`
120
+ - `INTEGRATIONS.md`
121
+ - `TESTING.md`
122
+ - `CONCERNS.md`
123
+ - `PROJECT.md`
124
+
125
+ `scan` step 2 之后,`run.js` 会把所有带 `perProject: true` 的步骤按项目展开,并在 `.sillyspec/.runtime/scan-projects.json` 记录已展开状态。
126
+
127
+ ## 模块文档
128
+
129
+ 目标目录:`.sillyspec/docs/<project>/modules/`
130
+
131
+ | 文件 | 当前创建/维护方 |
132
+ |---|---|
133
+ | `_module-map.yaml` | scan 可选步骤;`sillyspec modules rebuild` 会按模块卡片重建骨架 |
134
+ | `<module>.md` | scan 可选步骤;archive `sync-module-docs` prompt;quick prompt |
135
+ | `dependencies.md` | `generateDependenciesMd()` 可生成,但当前 CLI 没有直接暴露该函数 |
136
+
137
+ `sillyspec modules rebuild` 不是全量源码重扫。它会保留/合并模块卡片并生成骨架,输出也明确提示 tags、entrypoints、main_symbols、depends_on、used_by 需要重新 scan 或手动补充。
138
+
139
+ ## quicklog
140
+
141
+ 路径:`.sillyspec/quicklog/QUICKLOG-<git-user>.md`
142
+
143
+ 创建方式:quick 阶段“理解任务”prompt,且没有 `--change` 时创建/追加。
144
+
145
+ 格式规则来自 prompt:
146
+
147
+ - ID 为 `ql-YYYYMMDD-NNN-XXXX`
148
+ - `NNN` 每天从 001 递增
149
+ - `XXXX` 是 4 位随机十六进制字符
150
+ - 第一步写“进行中”
151
+ - 第三步改为“已完成”
152
+ - 超过 500 行时 prompt 要求轮转为 `QUICKLOG-<USER>-YYYY-MM-DD.md`
153
+
154
+ 这些写入和轮转由 AI 按 prompt 执行,当前没有独立 JS 函数自动完成。
155
+
156
+ ## 归档目录
157
+
158
+ 目标目录:`.sillyspec/changes/archive/<date>-<change>/`
159
+
160
+ 当前移动目录由 `run.js` 执行:
161
+
162
+ - archive 第 4 步是“确认归档”。
163
+ - 执行 `sillyspec run archive --done --confirm --output "确认归档"` 时,`run.js` 会把 `.sillyspec/changes/<change>/` 移动到 `.sillyspec/changes/archive/<date>-<change>/`。
164
+ - 移动后会调用 `ProgressManager.unregisterChange()`,注销 active change。
165
+ - 如果没有带 `--confirm`,`run.js` 会把第 4 步回退为 pending,清除该步输出,并提示补上 `--confirm`。
166
+
167
+ 第 5 步“更新路线图和提交”只负责后续人工收尾,不再移动目录。
@@ -0,0 +1,148 @@
1
+ ---
2
+ author: qinyi
3
+ created_at: 2026-06-04 16:25:42
4
+ ---
5
+
6
+ # 存储与状态
7
+
8
+ ## Runtime 目录
9
+
10
+ `.sillyspec/.runtime/` 是当前实现的运行时目录,`init.js` 和 `ProgressManager._ensureRuntimeDir()` 会创建:
11
+
12
+ ```text
13
+ .sillyspec/.runtime/
14
+ ├── sillyspec.db
15
+ ├── user-inputs.md
16
+ ├── gate-status.json (按阶段动态生成/删除)
17
+ ├── platform-scan.json (平台 scan 参数暂存)
18
+ ├── scan-projects.json (scan step 2 后的项目展开状态)
19
+ ├── artifacts/
20
+ ├── history/
21
+ ├── logs/
22
+ ├── templates/
23
+ ├── workflow-runs/
24
+ └── worktrees/
25
+ ```
26
+
27
+ `.runtime/` 在 `.gitignore` 中,默认不进入版本控制。
28
+
29
+ ## `sillyspec.db`
30
+
31
+ 位置:`.sillyspec/.runtime/sillyspec.db`
32
+
33
+ 创建方:`ProgressManager._ensureDB()` 使用 `src/db.js` 的 `DB.init()`。底层是 `sql.js`,每次事务后通过 `db.export()` 写回磁盘。
34
+
35
+ 当前 DDL 包含:
36
+
37
+ | 表 | 用途 |
38
+ |---|---|
39
+ | `project` | 项目名、schema version、创建/更新时间 |
40
+ | `changes` | 变更名、当前阶段、活跃/归档状态、`no_worktree`、平台同步字段、隔离状态字段 |
41
+ | `stages` | 每个 change 的阶段状态 |
42
+ | `steps` | 每个 stage 的步骤状态和输出摘要 |
43
+ | `batch_progress` | 批量任务统计 |
44
+ | `approvals` | 平台审批状态 |
45
+
46
+ `progress.js` 通过 SQL 读写这些表,并组装成兼容旧 progress JSON 的 JS 对象。当前没有看到 `progress.json` 被作为权威状态写入。
47
+
48
+ 注意:`db.js` 的 `project.schema_version` DDL 默认值是 `4`,但 `progress.js` 的 `CURRENT_VERSION` 是 `3`,并在初始化/写入时使用 `3`。文档不要把这里写成稳定的 v4 schema 事实。
49
+
50
+ ## `global.json`
51
+
52
+ `progress.js` 仍保留 `GLOBAL_FILE = 'global.json'` 常量和注释,但 `readGlobal()` / `writeGlobal()` 已经改为 SQL 查询/写入 `project` 与 `changes` 表。
53
+
54
+ 当前代码没有创建或维护 `.sillyspec/.runtime/global.json` 的实际生命周期。
55
+
56
+ ## `gate-status.json`
57
+
58
+ 位置:`.sillyspec/.runtime/gate-status.json`
59
+
60
+ 写入/删除方:`ProgressManager._updateGateStatus()`。每次 `ProgressManager._write()` 后调用。
61
+
62
+ 生成条件:
63
+
64
+ - 查询 `changes` 表中 `status = 'active'`
65
+ - 且 `current_stage IN ('execute', 'quick')`
66
+ - 有匹配行时写入,没有匹配行时删除
67
+
68
+ 结构:
69
+
70
+ ```json
71
+ {
72
+ "stage": "execute",
73
+ "changes": ["change-name"],
74
+ "updatedAt": "2026-06-04T08:00:00.000Z",
75
+ "noWorktree": true
76
+ }
77
+ ```
78
+
79
+ `stage` 优先取 `execute`;同时存在 execute/quick 时,execute 会覆盖 quick。`noWorktree` 只要任一匹配 change 的 `no_worktree = 1` 就出现。
80
+
81
+ 消费者:`src/hooks/worktree-guard.js`。hook 会先读 gate 文件,再 fallback 到 sqlite3 CLI 查询 `sillyspec.db`。
82
+
83
+ ## `user-inputs.md`
84
+
85
+ 位置:`.sillyspec/.runtime/user-inputs.md`
86
+
87
+ 创建方:`ProgressManager.init()`。
88
+
89
+ 追加方:`run.js` 的 `completeStep()`。当 `sillyspec run <stage> --done --output ...` 携带 output 时,按当前 change/stage/step 追加记录。
90
+
91
+ 每条记录形态:
92
+
93
+ ```markdown
94
+ ## <时间> | <change> | <stage>: <step-name>
95
+ - 输入:<inputText>
96
+ - 输出:<outputText>
97
+ ```
98
+
99
+ 如果 output 超过 200 字,step 表中只保存截断摘要,但 `user-inputs.md` 保存完整 output。
100
+
101
+ ## `artifacts/`
102
+
103
+ 位置:
104
+
105
+ - 本地模式:`.sillyspec/.runtime/artifacts/`
106
+ - 平台 scan 且传入 `--runtime-root`:`<runtime-root>/scan-runs/<scan-run-id>/`
107
+
108
+ 写入方:`run.js completeStep()`。
109
+
110
+ 触发条件:`--output` 长度超过 200 字。
111
+
112
+ 文件名:
113
+
114
+ ```text
115
+ <change>-<stage>-step<N>-<YYYYMMDDHHMMSS>.txt
116
+ ```
117
+
118
+ 注意:artifact 路径由 `completeStep()` 处理;这不等同于 workflow run 归档路径。
119
+
120
+ ## `history/`
121
+
122
+ 位置:`.sillyspec/.runtime/history/`
123
+
124
+ 写入方:`ProgressManager.completeStage()`。
125
+
126
+ 文件名:
127
+
128
+ ```text
129
+ <change>-<stage>-<timestamp>.json
130
+ ```
131
+
132
+ `sillyspec run <stage> --done` 的普通流程不直接调用 `completeStage()`;它通过 `_write()` 更新 DB。只有使用 `sillyspec progress complete-stage <stage>` 这类 progress 子命令时会写 history 文件。
133
+
134
+ ## `local.yaml` 路径口径
135
+
136
+ 当前主配置口径已经统一到:
137
+
138
+ ```text
139
+ .sillyspec/local.yaml
140
+ ```
141
+
142
+ | 位置 | 代码/提示 | 当前行为 |
143
+ |---|---|---|
144
+ | `.sillyspec/local.yaml` | `init.js` gitignore、`scan.js` prompt、`sync.js`、多个阶段 prompt | 平台配置、本地命令配置、hook 扩展白名单的主入口 |
145
+ | `.sillyspec/local.yml` | `worktree-guard.js loadLocalConfig()` | hook 兼容读取 |
146
+ | `local.yaml` / `local.yml`(项目根) | `worktree-guard.js loadLocalConfig()` | hook fallback 兼容旧配置 |
147
+
148
+ 因此,文档可以把 `.sillyspec/local.yaml` 写成当前稳定主入口,但不能删除根目录 `local.yaml` / `local.yml` 的兼容说明。