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.
- package/.claude/skills/sillyspec-archive/SKILL.md +21 -21
- package/.claude/skills/sillyspec-auto/SKILL.md +83 -83
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -44
- package/.claude/skills/sillyspec-commit/SKILL.md +106 -106
- package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
- package/.claude/skills/sillyspec-doctor/SKILL.md +31 -31
- package/.claude/skills/sillyspec-execute/SKILL.md +30 -30
- package/.claude/skills/sillyspec-explore/SKILL.md +109 -109
- package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
- package/.claude/skills/sillyspec-plan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-propose/SKILL.md +21 -21
- package/.claude/skills/sillyspec-quick/SKILL.md +21 -21
- package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
- package/.claude/skills/sillyspec-scan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-state/SKILL.md +54 -54
- package/.claude/skills/sillyspec-status/SKILL.md +21 -21
- package/.claude/skills/sillyspec-verify/SKILL.md +21 -21
- package/.claude/skills/sillyspec-workspace/SKILL.md +157 -157
- package/.husky/pre-push +13 -13
- package/CLAUDE.md +18 -18
- package/README.md +198 -188
- package/SKILL.md +90 -91
- package/bin/sillyspec.js +2 -2
- package/docs/brainstorm-plan-contract.md +64 -64
- package/docs/plan-execute-contract.md +123 -123
- package/docs/platform-scan-protocol.md +298 -298
- package/docs/revision-mode.md +115 -115
- package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -99
- package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -218
- package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -167
- package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -148
- package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -193
- package/docs/sillyspec/file-lifecycle.md +125 -125
- package/docs/workflow-contract-regression.md +106 -106
- package/docs/worktree-isolation.md +252 -252
- package/package.json +40 -40
- package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
- package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
- package/packages/dashboard/dist/index.html +16 -16
- package/packages/dashboard/index.html +15 -15
- package/packages/dashboard/package-lock.json +2384 -2384
- package/packages/dashboard/package.json +25 -25
- package/packages/dashboard/server/executor.js +86 -86
- package/packages/dashboard/server/index.js +588 -588
- package/packages/dashboard/server/parser.js +526 -526
- package/packages/dashboard/server/watcher.js +344 -344
- package/packages/dashboard/src/App.vue +558 -558
- package/packages/dashboard/src/components/ActionBar.vue +93 -93
- package/packages/dashboard/src/components/CommandPalette.vue +96 -96
- package/packages/dashboard/src/components/DetailPanel.vue +137 -137
- package/packages/dashboard/src/components/LogStream.vue +65 -65
- package/packages/dashboard/src/components/PipelineStage.vue +95 -95
- package/packages/dashboard/src/components/PipelineView.vue +156 -156
- package/packages/dashboard/src/components/ProjectList.vue +210 -210
- package/packages/dashboard/src/components/StageBadge.vue +67 -67
- package/packages/dashboard/src/components/StepCard.vue +94 -94
- package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -48
- package/packages/dashboard/src/components/detail/GitDetail.vue +61 -61
- package/packages/dashboard/src/components/detail/TechDetail.vue +43 -43
- package/packages/dashboard/src/composables/useDashboard.js +170 -170
- package/packages/dashboard/src/composables/useKeyboard.js +119 -119
- package/packages/dashboard/src/composables/useWebSocket.js +129 -129
- package/packages/dashboard/src/main.js +8 -8
- package/packages/dashboard/src/style.css +132 -132
- package/packages/dashboard/vite.config.js +18 -18
- package/src/brainstorm-postcheck.js +158 -158
- package/src/change-list.js +52 -52
- package/src/change-risk-profile.js +352 -352
- package/src/classify-change.js +73 -73
- package/src/constants.js +70 -70
- package/src/contract-matrix.js +278 -278
- package/src/db.js +201 -201
- package/src/endpoint-extractor.js +315 -315
- package/src/hooks/claude-pre-tool-use.cjs +125 -125
- package/src/hooks/worktree-guard.js +653 -653
- package/src/index.js +922 -900
- package/src/init.js +431 -431
- package/src/knowledge-match.js +130 -130
- package/src/migrate.js +117 -117
- package/src/modules.js +482 -482
- package/src/progress.js +1734 -1734
- package/src/run.js +3465 -3358
- package/src/scan-postcheck.js +387 -383
- package/src/setup.js +398 -398
- package/src/stage-contract.js +700 -700
- package/src/stages/archive.js +160 -160
- package/src/stages/brainstorm-auto.js +229 -229
- package/src/stages/brainstorm.js +645 -645
- package/src/stages/doctor.js +365 -365
- package/src/stages/execute.js +625 -625
- package/src/stages/explore.js +34 -34
- package/src/stages/index.js +29 -29
- package/src/stages/knowledge.js +498 -498
- package/src/stages/plan-postcheck.js +511 -513
- package/src/stages/plan.js +582 -582
- package/src/stages/propose.js +174 -174
- package/src/stages/quick.js +82 -82
- package/src/stages/scan.js +558 -558
- package/src/stages/status.js +65 -65
- package/src/stages/verify.js +322 -322
- package/src/sync.js +497 -497
- package/src/task-review.js +346 -346
- package/src/workflow.js +785 -785
- package/src/worktree-apply.js +549 -549
- package/src/worktree-deps.js +185 -0
- package/src/worktree.js +982 -932
- package/templates/workflows/archive-impact.yaml +79 -79
- package/templates/workflows/scan-docs.yaml +132 -132
- package/test/brainstorm-plan-contract.test.mjs +273 -273
- package/test/check-syntax.mjs +26 -26
- package/test/contract-artifacts.test.mjs +323 -323
- package/test/decision-supersede.test.mjs +277 -277
- package/test/knowledge-match.test.mjs +231 -231
- package/test/plan-execute-contract.test.mjs +330 -330
- package/test/plan-optimization.test.mjs +572 -572
- package/test/platform-artifacts.test.mjs +166 -166
- package/test/platform-failure-samples.test.mjs +199 -199
- package/test/platform-recovery-chain.test.mjs +167 -167
- package/test/platform-recovery.test.mjs +136 -136
- package/test/platform-scan-p0.test.mjs +168 -168
- package/test/revision-v1.test.mjs +1145 -1145
- package/test/run-scan-project-parse.test.mjs +200 -200
- package/test/run-tests.mjs +48 -48
- package/test/scan-knowledge.test.mjs +175 -175
- package/test/scan-paths.test.mjs +68 -68
- package/test/scan-postcheck.test.mjs +197 -197
- package/test/spec-dir.test.mjs +206 -206
- package/test/stage-contract.test.mjs +299 -299
- package/test/stage-definitions.test.mjs +39 -39
- package/test/wait-gates.test.mjs +496 -496
- package/test/worktree-deps-provision.test.mjs +148 -0
- package/test/worktree-guard.test.mjs +71 -71
- 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,不阻断本地阶段推进。
|