sillyspec 3.20.2 → 3.20.3

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.
Files changed (208) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +1 -5
  2. package/.claude/skills/sillyspec-auto/SKILL.md +2 -8
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +1 -28
  4. package/.claude/skills/sillyspec-commit/SKILL.md +3 -4
  5. package/.claude/skills/sillyspec-continue/SKILL.md +4 -5
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +3 -12
  7. package/.claude/skills/sillyspec-execute/SKILL.md +2 -15
  8. package/.claude/skills/sillyspec-explore/SKILL.md +1 -14
  9. package/.claude/skills/sillyspec-plan/SKILL.md +36 -5
  10. package/.claude/skills/sillyspec-propose/SKILL.md +0 -4
  11. package/.claude/skills/sillyspec-quick/SKILL.md +1 -5
  12. package/.claude/skills/sillyspec-resume/SKILL.md +66 -23
  13. package/.claude/skills/sillyspec-scan/SKILL.md +1 -5
  14. package/.claude/skills/sillyspec-state/SKILL.md +8 -8
  15. package/.claude/skills/sillyspec-status/SKILL.md +1 -5
  16. package/.claude/skills/sillyspec-verify/SKILL.md +1 -5
  17. package/.claude/skills/sillyspec-workspace/SKILL.md +3 -11
  18. package/.sillyspec/changes/archive/2026-04-08-derive-state/design.md +97 -0
  19. package/.sillyspec/changes/archive/2026-04-08-derive-state/plan.md +51 -0
  20. package/.sillyspec/changes/archive/2026-04-08-derive-state/proposal.md +29 -0
  21. package/.sillyspec/changes/archive/2026-04-08-derive-state/requirements.md +34 -0
  22. package/.sillyspec/changes/archive/2026-04-08-derive-state/tasks.md +13 -0
  23. package/.sillyspec/changes/archive/2026-04-08-derive-state/verify-result.md +43 -0
  24. package/.sillyspec/changes/auto-mode/design.md +50 -0
  25. package/.sillyspec/changes/auto-mode/proposal.md +19 -0
  26. package/.sillyspec/changes/auto-mode/requirements.md +21 -0
  27. package/.sillyspec/changes/auto-mode/tasks.md +7 -0
  28. package/.sillyspec/changes/brainstorm-archive/2026-04-05-dashboard-design.md +206 -0
  29. package/.sillyspec/changes/brainstorm-archive/2026-04-05-unified-docs-design.md +199 -0
  30. package/.sillyspec/changes/dashboard/design.md +219 -0
  31. package/.sillyspec/changes/dashboard/design.md.braindraft +206 -0
  32. package/.sillyspec/changes/run-command-design/design.md +1230 -0
  33. package/.sillyspec/changes/unified-docs-design/design.md +199 -0
  34. package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
  35. package/.sillyspec/knowledge/INDEX.md +8 -0
  36. package/.sillyspec/knowledge/uncategorized.md +3 -0
  37. package/.sillyspec/plans/2026-04-05-dashboard.md +737 -0
  38. package/.sillyspec/projects/sillyspec.yaml +3 -0
  39. package/README.md +11 -13
  40. package/SKILL.md +40 -44
  41. package/dist/steps/brainstorm/01-load-context.md +30 -0
  42. package/dist/steps/brainstorm/02-reuse-check.md +6 -0
  43. package/dist/steps/brainstorm/03-prototype-analysis.md +11 -0
  44. package/dist/steps/brainstorm/04-module-split.md +23 -0
  45. package/dist/steps/brainstorm/05-dialog-explore.md +8 -0
  46. package/dist/steps/brainstorm/06-propose-approaches.md +3 -0
  47. package/dist/steps/brainstorm/07-present-design.md +3 -0
  48. package/dist/steps/brainstorm/08-write-design.md +21 -0
  49. package/dist/steps/brainstorm/09-self-review.md +15 -0
  50. package/dist/steps/brainstorm/10-user-confirm.md +3 -0
  51. package/dist/steps/brainstorm/11-output-spec.md +7 -0
  52. package/dist/steps/brainstorm/manifest.yaml +26 -0
  53. package/dist/steps/execute/01-load-context.md +41 -0
  54. package/dist/steps/execute/02-scan-conventions.md +47 -0
  55. package/dist/steps/execute/03-skill-mcp.md +19 -0
  56. package/dist/steps/execute/04-assign-task.md +22 -0
  57. package/dist/steps/execute/04b-prompt-template.md +54 -0
  58. package/dist/steps/execute/05-write-test.md +7 -0
  59. package/dist/steps/execute/06-write-code.md +8 -0
  60. package/dist/steps/execute/07-run-test.md +26 -0
  61. package/dist/steps/execute/08-fix-issues.md +28 -0
  62. package/dist/steps/execute/09-next-task.md +33 -0
  63. package/dist/steps/execute/manifest.yaml +28 -0
  64. package/dist/steps/plan/01-load-context.md +22 -0
  65. package/dist/steps/plan/02-anchor-confirm.md +1 -0
  66. package/dist/steps/plan/03-expand-tasks.md +33 -0
  67. package/dist/steps/plan/04-mark-order.md +15 -0
  68. package/dist/steps/plan/05-e2e-planning.md +17 -0
  69. package/dist/steps/plan/06-self-check.md +16 -0
  70. package/dist/steps/plan/07-save.md +1 -0
  71. package/dist/steps/plan/manifest.yaml +18 -0
  72. package/dist/steps/scan/01-env-detect.md +51 -0
  73. package/dist/steps/scan/02-tech-stack.md +16 -0
  74. package/dist/steps/scan/03-conventions.md +16 -0
  75. package/dist/steps/scan/04-structure.md +19 -0
  76. package/dist/steps/scan/05-quality.md +18 -0
  77. package/dist/steps/scan/06-complete.md +49 -0
  78. package/dist/steps/scan/manifest.yaml +16 -0
  79. package/dist/steps/verify/01-load-specs.md +28 -0
  80. package/dist/steps/verify/02-check-tasks.md +1 -0
  81. package/dist/steps/verify/03-check-design.md +6 -0
  82. package/dist/steps/verify/04-run-tests.md +7 -0
  83. package/dist/steps/verify/05-e2e-tests.md +27 -0
  84. package/dist/steps/verify/05b-e2e-fix.md +33 -0
  85. package/dist/steps/verify/06-code-quality.md +25 -0
  86. package/dist/steps/verify/07-lint-check.md +27 -0
  87. package/dist/steps/verify/08-output-report.md +14 -0
  88. package/dist/steps/verify/manifest.yaml +22 -0
  89. package/package.json +1 -7
  90. package/packages/dashboard/dist/assets/{index-Bq_Z2hne.js → index-D1EVTLmc.js} +1264 -1264
  91. package/packages/dashboard/dist/assets/index-DGe8CqeP.css +1 -0
  92. package/packages/dashboard/dist/index.html +2 -2
  93. package/packages/dashboard/package-lock.json +6 -6
  94. package/packages/dashboard/server/executor.js +1 -1
  95. package/packages/dashboard/server/index.js +18 -98
  96. package/packages/dashboard/server/parser.js +71 -139
  97. package/packages/dashboard/server/watcher.js +6 -14
  98. package/packages/dashboard/src/App.vue +185 -418
  99. package/packages/dashboard/src/components/ActionBar.vue +1 -10
  100. package/packages/dashboard/src/components/CommandPalette.vue +1 -5
  101. package/packages/dashboard/src/components/DocPreview.vue +8 -105
  102. package/packages/dashboard/src/components/DocTree.vue +19 -75
  103. package/packages/dashboard/src/components/PipelineStage.vue +2 -22
  104. package/packages/dashboard/src/components/PipelineView.vue +5 -32
  105. package/packages/dashboard/src/components/ProjectOverview.vue +139 -113
  106. package/packages/dashboard/src/components/StageBadge.vue +3 -17
  107. package/packages/dashboard/src/components/StepCard.vue +2 -7
  108. package/packages/dashboard/src/composables/useDashboard.js +0 -28
  109. package/src/derive.js +147 -0
  110. package/src/index.js +40 -688
  111. package/src/init.js +63 -119
  112. package/src/migrate.js +7 -7
  113. package/src/progress.js +248 -1474
  114. package/src/run.js +302 -3008
  115. package/src/setup.js +64 -2
  116. package/src/stages/archive.js +17 -123
  117. package/src/stages/brainstorm.js +48 -454
  118. package/src/stages/doctor.js +46 -99
  119. package/src/stages/execute.js +59 -420
  120. package/src/stages/index.js +18 -12
  121. package/src/stages/plan.js +189 -492
  122. package/src/stages/propose.js +11 -70
  123. package/src/stages/quick.js +13 -52
  124. package/src/stages/scan.js +68 -485
  125. package/src/stages/status.js +1 -1
  126. package/src/stages/verify.js +16 -203
  127. package/src/step.js +543 -0
  128. package/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
  129. package/.husky/pre-push +0 -13
  130. package/CLAUDE.md +0 -18
  131. package/docs/brainstorm-plan-contract.md +0 -64
  132. package/docs/plan-execute-contract.md +0 -123
  133. package/docs/platform-scan-protocol.md +0 -298
  134. package/docs/revision-mode.md +0 -115
  135. package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +0 -99
  136. package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +0 -218
  137. package/docs/sillyspec/file-lifecycle/stage-artifacts.md +0 -167
  138. package/docs/sillyspec/file-lifecycle/storage-and-state.md +0 -148
  139. package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +0 -193
  140. package/docs/sillyspec/file-lifecycle.md +0 -125
  141. package/docs/workflow-contract-regression.md +0 -106
  142. package/docs/worktree-isolation.md +0 -252
  143. package/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
  144. package/packages/dashboard/dist/prototype-dashboard.html +0 -836
  145. package/packages/dashboard/dist/prototype-overview.html +0 -256
  146. package/packages/dashboard/public/prototype-dashboard.html +0 -836
  147. package/packages/dashboard/public/prototype-overview.html +0 -256
  148. package/packages/dashboard/src/components/HResizeHandle.vue +0 -48
  149. package/packages/dashboard/src/components/ProjectCard.vue +0 -187
  150. package/packages/dashboard/src/components/VResizeHandle.vue +0 -61
  151. package/packages/dashboard/src/composables/useLayout.js +0 -131
  152. package/src/brainstorm-postcheck.js +0 -158
  153. package/src/change-list.js +0 -52
  154. package/src/change-risk-profile.js +0 -352
  155. package/src/classify-change.js +0 -73
  156. package/src/constants.js +0 -70
  157. package/src/contract-matrix.js +0 -278
  158. package/src/db.js +0 -201
  159. package/src/endpoint-extractor.js +0 -315
  160. package/src/hooks/claude-pre-tool-use.cjs +0 -125
  161. package/src/hooks/worktree-guard.js +0 -761
  162. package/src/knowledge-match.js +0 -130
  163. package/src/modules.js +0 -482
  164. package/src/scan-postcheck.js +0 -383
  165. package/src/stage-contract.js +0 -700
  166. package/src/stages/brainstorm-auto.js +0 -229
  167. package/src/stages/explore.js +0 -34
  168. package/src/stages/knowledge.js +0 -498
  169. package/src/stages/plan-postcheck.js +0 -513
  170. package/src/sync.js +0 -497
  171. package/src/task-review.js +0 -346
  172. package/src/workflow.js +0 -785
  173. package/src/worktree-apply.js +0 -549
  174. package/src/worktree.js +0 -932
  175. package/templates/workflows/archive-impact.yaml +0 -79
  176. package/templates/workflows/scan-docs.yaml +0 -132
  177. package/test/brainstorm-plan-contract.test.mjs +0 -273
  178. package/test/check-syntax.mjs +0 -26
  179. package/test/cli-top-level-aliases.test.mjs +0 -174
  180. package/test/contract-artifacts.test.mjs +0 -323
  181. package/test/decision-supersede.test.mjs +0 -277
  182. package/test/knowledge-match.test.mjs +0 -231
  183. package/test/plan-execute-contract.test.mjs +0 -330
  184. package/test/plan-optimization.test.mjs +0 -572
  185. package/test/platform-artifacts.test.mjs +0 -190
  186. package/test/platform-failure-samples.test.mjs +0 -199
  187. package/test/platform-recovery-chain.test.mjs +0 -179
  188. package/test/platform-recovery.test.mjs +0 -167
  189. package/test/platform-scan-p0.test.mjs +0 -175
  190. package/test/revision-v1.test.mjs +0 -1145
  191. package/test/run-sanitize-project-name.test.mjs +0 -51
  192. package/test/run-scan-postcheck-fail.test.mjs +0 -64
  193. package/test/run-scan-project-parse.test.mjs +0 -200
  194. package/test/run-tests.mjs +0 -48
  195. package/test/scan-docs-yaml-placeholders.test.mjs +0 -84
  196. package/test/scan-knowledge.test.mjs +0 -175
  197. package/test/scan-paths.test.mjs +0 -68
  198. package/test/scan-postcheck-project-priority.test.mjs +0 -85
  199. package/test/scan-postcheck.test.mjs +0 -197
  200. package/test/scan-workflow-anyfailed-block.test.mjs +0 -52
  201. package/test/spec-dir.test.mjs +0 -206
  202. package/test/stage-contract-failed-post-check.test.mjs +0 -102
  203. package/test/stage-contract.test.mjs +0 -299
  204. package/test/stage-definitions.test.mjs +0 -39
  205. package/test/wait-gates.test.mjs +0 -501
  206. package/test/workflow-spec-base.test.mjs +0 -142
  207. package/test/worktree-guard.test.mjs +0 -136
  208. package/test/worktree-native-overlay.test.mjs +0 -188
@@ -1,218 +0,0 @@
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,不阻断本地阶段推进。
@@ -1,167 +0,0 @@
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 步“更新路线图和提交”只负责后续人工收尾,不再移动目录。
@@ -1,148 +0,0 @@
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 格式的 JS 对象。进度数据仅存储在 SQLite 数据库中,不再使用 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` 的兼容说明。