sillyspec 3.20.2 → 3.20.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +21 -21
  2. package/.claude/skills/sillyspec-auto/SKILL.md +83 -83
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -44
  4. package/.claude/skills/sillyspec-commit/SKILL.md +106 -106
  5. package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +31 -31
  7. package/.claude/skills/sillyspec-execute/SKILL.md +30 -30
  8. package/.claude/skills/sillyspec-explore/SKILL.md +109 -109
  9. package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
  10. package/.claude/skills/sillyspec-plan/SKILL.md +21 -21
  11. package/.claude/skills/sillyspec-propose/SKILL.md +21 -21
  12. package/.claude/skills/sillyspec-quick/SKILL.md +21 -21
  13. package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
  14. package/.claude/skills/sillyspec-scan/SKILL.md +21 -21
  15. package/.claude/skills/sillyspec-state/SKILL.md +54 -54
  16. package/.claude/skills/sillyspec-status/SKILL.md +21 -21
  17. package/.claude/skills/sillyspec-verify/SKILL.md +21 -21
  18. package/.claude/skills/sillyspec-workspace/SKILL.md +157 -157
  19. package/.husky/pre-push +13 -13
  20. package/CLAUDE.md +18 -18
  21. package/README.md +198 -188
  22. package/SKILL.md +90 -91
  23. package/bin/sillyspec.js +2 -2
  24. package/docs/brainstorm-plan-contract.md +64 -64
  25. package/docs/plan-execute-contract.md +123 -123
  26. package/docs/platform-scan-protocol.md +298 -298
  27. package/docs/revision-mode.md +115 -115
  28. package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -99
  29. package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -218
  30. package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -167
  31. package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -148
  32. package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -193
  33. package/docs/sillyspec/file-lifecycle.md +125 -125
  34. package/docs/workflow-contract-regression.md +106 -106
  35. package/docs/worktree-isolation.md +252 -252
  36. package/package.json +40 -40
  37. package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
  38. package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
  39. package/packages/dashboard/dist/index.html +16 -16
  40. package/packages/dashboard/index.html +15 -15
  41. package/packages/dashboard/package-lock.json +2384 -2384
  42. package/packages/dashboard/package.json +25 -25
  43. package/packages/dashboard/server/executor.js +86 -86
  44. package/packages/dashboard/server/index.js +588 -588
  45. package/packages/dashboard/server/parser.js +526 -526
  46. package/packages/dashboard/server/watcher.js +344 -344
  47. package/packages/dashboard/src/App.vue +558 -558
  48. package/packages/dashboard/src/components/ActionBar.vue +93 -93
  49. package/packages/dashboard/src/components/CommandPalette.vue +96 -96
  50. package/packages/dashboard/src/components/DetailPanel.vue +137 -137
  51. package/packages/dashboard/src/components/LogStream.vue +65 -65
  52. package/packages/dashboard/src/components/PipelineStage.vue +95 -95
  53. package/packages/dashboard/src/components/PipelineView.vue +156 -156
  54. package/packages/dashboard/src/components/ProjectList.vue +210 -210
  55. package/packages/dashboard/src/components/StageBadge.vue +67 -67
  56. package/packages/dashboard/src/components/StepCard.vue +94 -94
  57. package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -48
  58. package/packages/dashboard/src/components/detail/GitDetail.vue +61 -61
  59. package/packages/dashboard/src/components/detail/TechDetail.vue +43 -43
  60. package/packages/dashboard/src/composables/useDashboard.js +170 -170
  61. package/packages/dashboard/src/composables/useKeyboard.js +119 -119
  62. package/packages/dashboard/src/composables/useWebSocket.js +129 -129
  63. package/packages/dashboard/src/main.js +8 -8
  64. package/packages/dashboard/src/style.css +132 -132
  65. package/packages/dashboard/vite.config.js +18 -18
  66. package/src/brainstorm-postcheck.js +158 -158
  67. package/src/change-list.js +52 -52
  68. package/src/change-risk-profile.js +352 -352
  69. package/src/classify-change.js +73 -73
  70. package/src/constants.js +70 -70
  71. package/src/contract-matrix.js +278 -278
  72. package/src/db.js +201 -201
  73. package/src/endpoint-extractor.js +315 -315
  74. package/src/hooks/claude-pre-tool-use.cjs +125 -125
  75. package/src/hooks/worktree-guard.js +653 -653
  76. package/src/index.js +922 -900
  77. package/src/init.js +431 -431
  78. package/src/knowledge-match.js +130 -130
  79. package/src/migrate.js +117 -117
  80. package/src/modules.js +482 -482
  81. package/src/progress.js +1734 -1734
  82. package/src/run.js +3465 -3358
  83. package/src/scan-postcheck.js +387 -383
  84. package/src/setup.js +398 -398
  85. package/src/stage-contract.js +700 -700
  86. package/src/stages/archive.js +160 -160
  87. package/src/stages/brainstorm-auto.js +229 -229
  88. package/src/stages/brainstorm.js +645 -645
  89. package/src/stages/doctor.js +365 -365
  90. package/src/stages/execute.js +625 -625
  91. package/src/stages/explore.js +34 -34
  92. package/src/stages/index.js +29 -29
  93. package/src/stages/knowledge.js +498 -498
  94. package/src/stages/plan-postcheck.js +511 -513
  95. package/src/stages/plan.js +582 -582
  96. package/src/stages/propose.js +174 -174
  97. package/src/stages/quick.js +82 -82
  98. package/src/stages/scan.js +558 -558
  99. package/src/stages/status.js +65 -65
  100. package/src/stages/verify.js +322 -322
  101. package/src/sync.js +497 -497
  102. package/src/task-review.js +346 -346
  103. package/src/workflow.js +785 -785
  104. package/src/worktree-apply.js +549 -549
  105. package/src/worktree-deps.js +185 -0
  106. package/src/worktree.js +982 -932
  107. package/templates/workflows/archive-impact.yaml +79 -79
  108. package/templates/workflows/scan-docs.yaml +132 -132
  109. package/test/brainstorm-plan-contract.test.mjs +273 -273
  110. package/test/check-syntax.mjs +26 -26
  111. package/test/contract-artifacts.test.mjs +323 -323
  112. package/test/decision-supersede.test.mjs +277 -277
  113. package/test/knowledge-match.test.mjs +231 -231
  114. package/test/plan-execute-contract.test.mjs +330 -330
  115. package/test/plan-optimization.test.mjs +572 -572
  116. package/test/platform-artifacts.test.mjs +166 -166
  117. package/test/platform-failure-samples.test.mjs +199 -199
  118. package/test/platform-recovery-chain.test.mjs +167 -167
  119. package/test/platform-recovery.test.mjs +136 -136
  120. package/test/platform-scan-p0.test.mjs +168 -168
  121. package/test/revision-v1.test.mjs +1145 -1145
  122. package/test/run-scan-project-parse.test.mjs +200 -200
  123. package/test/run-tests.mjs +48 -48
  124. package/test/scan-knowledge.test.mjs +175 -175
  125. package/test/scan-paths.test.mjs +68 -68
  126. package/test/scan-postcheck.test.mjs +197 -197
  127. package/test/spec-dir.test.mjs +206 -206
  128. package/test/stage-contract.test.mjs +299 -299
  129. package/test/stage-definitions.test.mjs +39 -39
  130. package/test/wait-gates.test.mjs +496 -496
  131. package/test/worktree-deps-provision.test.mjs +148 -0
  132. package/test/worktree-guard.test.mjs +71 -71
  133. package/test/worktree-native-overlay.test.mjs +188 -188
@@ -1,218 +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,不阻断本地阶段推进。
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,不阻断本地阶段推进。