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,298 +1,298 @@
|
|
|
1
|
-
# 平台 Scan 产物协议
|
|
2
|
-
|
|
3
|
-
SillySpec 平台执行模式的核心设计:**SillySpec 写产物,SillyHub 读产物**。平台不看 stdout,只靠文件系统判断 scan 成功、失败原因和证据文件位置。
|
|
4
|
-
|
|
5
|
-
## 状态枚举(src/constants.js)
|
|
6
|
-
|
|
7
|
-
所有平台产物共享同一套枚举值,SillyHub 直接使用常量,不猜字符串。
|
|
8
|
-
|
|
9
|
-
### SCAN_STATUS
|
|
10
|
-
|
|
11
|
-
| 值 | 说明 |
|
|
12
|
-
---|---|
|
|
13
|
-
| `pending` | scan 未开始 |
|
|
14
|
-
| `in_progress` | scan 进行中 |
|
|
15
|
-
| `success` | scan 成功,所有检查通过 |
|
|
16
|
-
| `completed_with_warnings` | scan 成功但有警告 |
|
|
17
|
-
| `failed_post_check` | scan 失败,post-check 不通过 |
|
|
18
|
-
|
|
19
|
-
### POINTER_STATUS
|
|
20
|
-
|
|
21
|
-
| 值 | 说明 |
|
|
22
|
-
---|---|
|
|
23
|
-
| `active` | 指针活跃,任务进行中 |
|
|
24
|
-
| `scan_completed` | scan 已完成 |
|
|
25
|
-
| `stale` | 指针过时(完成超过 24h,建议清理) |
|
|
26
|
-
| `corrupted` | 指针损坏(缺少必要字段) |
|
|
27
|
-
|
|
28
|
-
### CHECK_SEVERITY
|
|
29
|
-
|
|
30
|
-
| 值 | 说明 |
|
|
31
|
-
---|---|
|
|
32
|
-
| `failed` | 严重:阻止成功 |
|
|
33
|
-
| `warning` | 警告:不阻止成功 |
|
|
34
|
-
| `passed` | 通过 |
|
|
35
|
-
|
|
36
|
-
## 目录结构
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
<spec_root>/
|
|
40
|
-
├── manifest.json # 扫描元数据 + 产物索引
|
|
41
|
-
├── docs/<project>/scan/ # 项目文档
|
|
42
|
-
│ ├── ARCHITECTURE.md
|
|
43
|
-
│ ├── CONVENTIONS.md
|
|
44
|
-
│ ├── PROJECT.md
|
|
45
|
-
│ ├── STACK.md
|
|
46
|
-
│ ├── STRUCTURE.md
|
|
47
|
-
│ └── ... (7 份必需文档)
|
|
48
|
-
├── projects/*.yaml # 子项目注册
|
|
49
|
-
├── changes/<change-name>/ # 变更目录
|
|
50
|
-
└── .runtime/
|
|
51
|
-
├── postcheck-result.json # post-check 结构化结果
|
|
52
|
-
└── platform-scan.json # 平台参数持久化(主文件)
|
|
53
|
-
|
|
54
|
-
<runtime_root>/
|
|
55
|
-
└── scan-runs/<scan_run_id>/
|
|
56
|
-
└── workflow-runs/
|
|
57
|
-
└── <timestamp>-<workflow>-<project>-<status>.json # workflow 检查结果
|
|
58
|
-
|
|
59
|
-
<source_root>/
|
|
60
|
-
├── .sillyspec-platform.json # 平台参数恢复指针(轻量,不在 .sillyspec 内)
|
|
61
|
-
└── (源码,禁止 .sillyspec/ 污染)
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## manifest.json
|
|
65
|
-
|
|
66
|
-
scan 完成后写入 `<spec_root>/manifest.json`,是 SillyHub 判断 scan 结果的入口文件。
|
|
67
|
-
|
|
68
|
-
### 结构
|
|
69
|
-
|
|
70
|
-
```json
|
|
71
|
-
{
|
|
72
|
-
"workspace_id": "ws-xxx",
|
|
73
|
-
"scan_run_id": "scan-2026-06-14-test-001",
|
|
74
|
-
"source_root": "/path/to/source",
|
|
75
|
-
"spec_root": "/path/to/spec",
|
|
76
|
-
"runtime_root": "/path/to/runtime",
|
|
77
|
-
"source_commit": "abc123...",
|
|
78
|
-
"source_commit_error": null,
|
|
79
|
-
"generated_at": "2026-06-14T01:50:00.000Z",
|
|
80
|
-
"schema_version": 1,
|
|
81
|
-
"postcheck_result_path": "<spec_root>/.runtime/postcheck-result.json",
|
|
82
|
-
"workflow_runs_dir": "<runtime_root>/scan-runs/<scan_run_id>/workflow-runs",
|
|
83
|
-
"platform_pointer_path": "<source_root>/.sillyspec-platform.json",
|
|
84
|
-
"platform_pointer_status": "active",
|
|
85
|
-
"scan_post_check": {
|
|
86
|
-
"status": "success | completed_with_warnings | failed_post_check",
|
|
87
|
-
"checks": [...]
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 字段说明
|
|
93
|
-
|
|
94
|
-
| 字段 | 类型 | 说明 |
|
|
95
|
-
|---|---|---|
|
|
96
|
-
| `workspace_id` | string \| null | SillyHub workspace 标识 |
|
|
97
|
-
| `scan_run_id` | string \| null | 本次 scan 唯一标识 |
|
|
98
|
-
| `source_root` | string | 源码目录绝对路径 |
|
|
99
|
-
| `spec_root` | string \| null | 规范目录(specDir) |
|
|
100
|
-
| `runtime_root` | string \| null | 运行时产物目录 |
|
|
101
|
-
| `source_commit` | string \| null | 源码 HEAD commit hash |
|
|
102
|
-
| `source_commit_error` | string \| undefined | commit 获取失败原因 |
|
|
103
|
-
| `generated_at` | string (ISO 8601) | manifest 生成时间 |
|
|
104
|
-
| `schema_version` | number | 产物协议版本,当前为 1 |
|
|
105
|
-
| `postcheck_result_path` | string \| null | post-check 结构化结果路径 |
|
|
106
|
-
| `workflow_runs_dir` | string \| null | workflow 检查结果目录 |
|
|
107
|
-
| `platform_pointer_path` | string | 平台指针文件路径 |
|
|
108
|
-
| `platform_pointer_status` | string | 初始 `active`,由指针文件独立更新 |
|
|
109
|
-
| `scan_post_check` | object \| undefined | post-check 结果(写入后追加) |
|
|
110
|
-
|
|
111
|
-
### 判断 scan 结果
|
|
112
|
-
|
|
113
|
-
SillyHub 消费 manifest 的方式:
|
|
114
|
-
|
|
115
|
-
1. 读取 `<spec_root>/manifest.json`
|
|
116
|
-
2. 检查 `scan_post_check.status`:
|
|
117
|
-
- `success` → scan 成功
|
|
118
|
-
- `completed_with_warnings` → scan 成功但有警告
|
|
119
|
-
- `failed_post_check` → scan 失败
|
|
120
|
-
3. 如果失败,读 `scan_post_check.checks` 获取具体失败项
|
|
121
|
-
4. 读 `postcheck_result_path` 获取完整结构化结果
|
|
122
|
-
5. 读 `workflow_runs_dir` 获取 workflow 检查证据
|
|
123
|
-
|
|
124
|
-
## .sillyspec-platform.json
|
|
125
|
-
|
|
126
|
-
跨 `--done` 生命周期的轻量指针文件,存储在 `<source_root>/.sillyspec-platform.json`(不在 `.sillyspec/` 内,不污染源码结构)。
|
|
127
|
-
|
|
128
|
-
### 生命周期
|
|
129
|
-
|
|
130
|
-
| 阶段 | 行为 |
|
|
131
|
-
|---|---|
|
|
132
|
-
| **创建** | `run scan --spec-root` 时,写入 cwd 根目录 |
|
|
133
|
-
| **读取** | 每次 `run`/`--done`/`--skip` 时,优先从 pointer 恢复平台参数 |
|
|
134
|
-
| **更新** | 每次 `run` 时刷新 `savedAt` |
|
|
135
|
-
| **完成标记** | scan post-check 后追加 `status=scan_completed` + `completedAt` + `scanStatus` |
|
|
136
|
-
| **异常检测** | pointer 存在但缺 `specRoot` 时报错退出 |
|
|
137
|
-
| **清理** | 无自动清理。`sillyspec platform pointer` 查看状态,`sillyspec platform pointer --cleanup` 手动清理 |
|
|
138
|
-
|
|
139
|
-
### CLI 检查命令
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
# 查看指针状态
|
|
143
|
-
sillyspec platform pointer
|
|
144
|
-
|
|
145
|
-
# 清理过时/损坏指针
|
|
146
|
-
sillyspec platform pointer --cleanup
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
输出示例:
|
|
150
|
-
```
|
|
151
|
-
📄 指针文件: /path/to/source/.sillyspec-platform.json
|
|
152
|
-
specRoot: /path/to/spec
|
|
153
|
-
runtimeRoot: /path/to/runtime
|
|
154
|
-
workspaceId: ws-xxx
|
|
155
|
-
scanRunId: scan-2026-06-14-test-001
|
|
156
|
-
savedAt: 2026-06-14T01:50:00.000Z
|
|
157
|
-
状态: stale ⚠️
|
|
158
|
-
completedAt: 2026-06-12T01:00:00.000Z
|
|
159
|
-
scanStatus: success
|
|
160
|
-
⚠️ 指针已过时(完成超过 24h),可以安全删除。
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
状态判定逻辑:
|
|
164
|
-
- 缺少 `specRoot` → `corrupted`
|
|
165
|
-
- `status=scan_completed` 且 `completedAt` 超过 24h → `stale`
|
|
166
|
-
- `status=scan_completed` 且未超时 → `scan_completed` ✅
|
|
167
|
-
- 无 `status` 字段 → `active` 🔄
|
|
168
|
-
|
|
169
|
-
### 结构
|
|
170
|
-
|
|
171
|
-
```json
|
|
172
|
-
{
|
|
173
|
-
"specRoot": "/path/to/spec",
|
|
174
|
-
"runtimeRoot": "/path/to/runtime",
|
|
175
|
-
"workspaceId": "ws-xxx",
|
|
176
|
-
"scanRunId": "scan-2026-06-14-test-001",
|
|
177
|
-
"savedAt": "2026-06-14T01:50:00.000Z"
|
|
178
|
-
}
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
scan 完成后追加:
|
|
182
|
-
|
|
183
|
-
```json
|
|
184
|
-
{
|
|
185
|
-
"status": "scan_completed",
|
|
186
|
-
"completedAt": "2026-06-14T01:52:00.000Z",
|
|
187
|
-
"scanStatus": "success"
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
## postcheck-result.json
|
|
192
|
-
|
|
193
|
-
写入 `<spec_root>/.runtime/postcheck-result.json`(平台模式)或 `<cwd>/.sillyspec/.runtime/postcheck-result.json`(本地模式)。
|
|
194
|
-
|
|
195
|
-
### 结构
|
|
196
|
-
|
|
197
|
-
```json
|
|
198
|
-
{
|
|
199
|
-
"workspace_id": "ws-xxx",
|
|
200
|
-
"scan_run_id": "scan-2026-06-14-test-001",
|
|
201
|
-
"status": "success | completed_with_warnings | failed_post_check",
|
|
202
|
-
"source_root": "/path/to/source",
|
|
203
|
-
"spec_root": "/path/to/spec",
|
|
204
|
-
"runtime_root": "/path/to/runtime",
|
|
205
|
-
"checks": [
|
|
206
|
-
{
|
|
207
|
-
"name": "source_root_docs_leak",
|
|
208
|
-
"severity": "failed | warning",
|
|
209
|
-
"detail": "..."
|
|
210
|
-
}
|
|
211
|
-
],
|
|
212
|
-
"source_root_leak": true,
|
|
213
|
-
"docs_missing": ["ARCHITECTURE.md"],
|
|
214
|
-
"profile": {
|
|
215
|
-
"mode": "quick | standard | deep",
|
|
216
|
-
"file_count": 10,
|
|
217
|
-
"source_bytes": 102400,
|
|
218
|
-
"project_count": 1,
|
|
219
|
-
"reason": "..."
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### check 类型
|
|
225
|
-
|
|
226
|
-
| check name | severity | 说明 |
|
|
227
|
-
|---|---|---|
|
|
228
|
-
| `source_root_docs_leak` | failed | docs 文档泄漏到 source_root |
|
|
229
|
-
| `source_root_leak` | failed | projects/workflows/knowledge/manifest/local 泄漏到 source_root |
|
|
230
|
-
| `all_docs_missing` | failed | 7 份必需文档全部缺失 |
|
|
231
|
-
| `partial_docs_missing` | failed | 部分文档缺失 |
|
|
232
|
-
| `docs_missing_header` | warning | 文档缺少 frontmatter |
|
|
233
|
-
| `local_config_invalid` | warning | local.yaml 中命令不存在 |
|
|
234
|
-
| `tool_use_error` | warning | AI 执行工具调用错误 |
|
|
235
|
-
| `api_error` | warning | API 错误(529/429/超时) |
|
|
236
|
-
|
|
237
|
-
## workflow-runs
|
|
238
|
-
|
|
239
|
-
写入 `<runtime_root>/scan-runs/<scan_run_id>/workflow-runs/`(平台模式)或 `<cwd>/.sillyspec/.runtime/workflow-runs/`(本地模式)。
|
|
240
|
-
|
|
241
|
-
每个文件命名:`<timestamp>-<workflow>-<project>-<status>.json`
|
|
242
|
-
|
|
243
|
-
### 结构
|
|
244
|
-
|
|
245
|
-
```json
|
|
246
|
-
{
|
|
247
|
-
"run_id": "20260614015000-scan-docs-test-project-pass",
|
|
248
|
-
"created_at": "2026-06-14T01:50:00.000Z",
|
|
249
|
-
"source": "run.js",
|
|
250
|
-
"stage": "scan",
|
|
251
|
-
"step": "深度扫描",
|
|
252
|
-
"workflow": "scan-docs",
|
|
253
|
-
"project": "test-project",
|
|
254
|
-
"status": "pass | fail",
|
|
255
|
-
"spec_version": 1,
|
|
256
|
-
"roles": [...],
|
|
257
|
-
"workflow_checks": [...],
|
|
258
|
-
"failures": [...],
|
|
259
|
-
"retry_prompts": [...]
|
|
260
|
-
}
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## source_root 零污染
|
|
264
|
-
|
|
265
|
-
平台模式的核心约束:source_root 下不产生 `.sillyspec/` 目录。
|
|
266
|
-
|
|
267
|
-
post-check 会检查以下路径是否存在泄漏:
|
|
268
|
-
- `<source_root>/.sillyspec/docs/` — 文档泄漏
|
|
269
|
-
- `<source_root>/.sillyspec/projects/` — 项目注册泄漏
|
|
270
|
-
- `<source_root>/.sillyspec/workflows/` — 工作流泄漏
|
|
271
|
-
- `<source_root>/.sillyspec/knowledge/` — 术语泄漏
|
|
272
|
-
- `<source_root>/.sillyspec/manifest.json` — manifest 泄漏
|
|
273
|
-
- `<source_root>/.sillyspec/local.yaml` — 配置泄漏
|
|
274
|
-
|
|
275
|
-
## 产物消费优先级
|
|
276
|
-
|
|
277
|
-
SillyHub 判断 scan 结果的推荐顺序:
|
|
278
|
-
|
|
279
|
-
1. `manifest.json` → `scan_post_check.overall_status` → 快速判断成功/失败
|
|
280
|
-
2. `postcheck-result.json` → 完整检查明细 + failure_categories
|
|
281
|
-
3. `workflow-runs/*.json` → workflow 检查证据
|
|
282
|
-
4. `docs/<project>/scan/*.md` → 实际文档内容
|
|
283
|
-
|
|
284
|
-
### failure_categories
|
|
285
|
-
|
|
286
|
-
`postcheck-result.json` 中的 `failure_categories` 提供分类视图:
|
|
287
|
-
|
|
288
|
-
| 类别 | 包含的 check |
|
|
289
|
-
---|---|
|
|
290
|
-
| `path_pollution` | source_root_leak, source_root_docs_leak |
|
|
291
|
-
| `missing_outputs` | all_docs_missing, partial_docs_missing, missing_docs |
|
|
292
|
-
| `bad_references` | local_config_invalid |
|
|
293
|
-
| `quality_warnings` | tool_use_error, api_error_529, rate_limit_exhausted, fallback_or_skip |
|
|
294
|
-
| `violations` | manifest_write_failed, project_list_parse_failed + 所有 path_pollution |
|
|
295
|
-
|
|
296
|
-
SillyHub 可以按类别快速定位问题域,而不需要遍历所有 checks。
|
|
297
|
-
|
|
298
|
-
不需要解析 stdout。
|
|
1
|
+
# 平台 Scan 产物协议
|
|
2
|
+
|
|
3
|
+
SillySpec 平台执行模式的核心设计:**SillySpec 写产物,SillyHub 读产物**。平台不看 stdout,只靠文件系统判断 scan 成功、失败原因和证据文件位置。
|
|
4
|
+
|
|
5
|
+
## 状态枚举(src/constants.js)
|
|
6
|
+
|
|
7
|
+
所有平台产物共享同一套枚举值,SillyHub 直接使用常量,不猜字符串。
|
|
8
|
+
|
|
9
|
+
### SCAN_STATUS
|
|
10
|
+
|
|
11
|
+
| 值 | 说明 |
|
|
12
|
+
---|---|
|
|
13
|
+
| `pending` | scan 未开始 |
|
|
14
|
+
| `in_progress` | scan 进行中 |
|
|
15
|
+
| `success` | scan 成功,所有检查通过 |
|
|
16
|
+
| `completed_with_warnings` | scan 成功但有警告 |
|
|
17
|
+
| `failed_post_check` | scan 失败,post-check 不通过 |
|
|
18
|
+
|
|
19
|
+
### POINTER_STATUS
|
|
20
|
+
|
|
21
|
+
| 值 | 说明 |
|
|
22
|
+
---|---|
|
|
23
|
+
| `active` | 指针活跃,任务进行中 |
|
|
24
|
+
| `scan_completed` | scan 已完成 |
|
|
25
|
+
| `stale` | 指针过时(完成超过 24h,建议清理) |
|
|
26
|
+
| `corrupted` | 指针损坏(缺少必要字段) |
|
|
27
|
+
|
|
28
|
+
### CHECK_SEVERITY
|
|
29
|
+
|
|
30
|
+
| 值 | 说明 |
|
|
31
|
+
---|---|
|
|
32
|
+
| `failed` | 严重:阻止成功 |
|
|
33
|
+
| `warning` | 警告:不阻止成功 |
|
|
34
|
+
| `passed` | 通过 |
|
|
35
|
+
|
|
36
|
+
## 目录结构
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
<spec_root>/
|
|
40
|
+
├── manifest.json # 扫描元数据 + 产物索引
|
|
41
|
+
├── docs/<project>/scan/ # 项目文档
|
|
42
|
+
│ ├── ARCHITECTURE.md
|
|
43
|
+
│ ├── CONVENTIONS.md
|
|
44
|
+
│ ├── PROJECT.md
|
|
45
|
+
│ ├── STACK.md
|
|
46
|
+
│ ├── STRUCTURE.md
|
|
47
|
+
│ └── ... (7 份必需文档)
|
|
48
|
+
├── projects/*.yaml # 子项目注册
|
|
49
|
+
├── changes/<change-name>/ # 变更目录
|
|
50
|
+
└── .runtime/
|
|
51
|
+
├── postcheck-result.json # post-check 结构化结果
|
|
52
|
+
└── platform-scan.json # 平台参数持久化(主文件)
|
|
53
|
+
|
|
54
|
+
<runtime_root>/
|
|
55
|
+
└── scan-runs/<scan_run_id>/
|
|
56
|
+
└── workflow-runs/
|
|
57
|
+
└── <timestamp>-<workflow>-<project>-<status>.json # workflow 检查结果
|
|
58
|
+
|
|
59
|
+
<source_root>/
|
|
60
|
+
├── .sillyspec-platform.json # 平台参数恢复指针(轻量,不在 .sillyspec 内)
|
|
61
|
+
└── (源码,禁止 .sillyspec/ 污染)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## manifest.json
|
|
65
|
+
|
|
66
|
+
scan 完成后写入 `<spec_root>/manifest.json`,是 SillyHub 判断 scan 结果的入口文件。
|
|
67
|
+
|
|
68
|
+
### 结构
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"workspace_id": "ws-xxx",
|
|
73
|
+
"scan_run_id": "scan-2026-06-14-test-001",
|
|
74
|
+
"source_root": "/path/to/source",
|
|
75
|
+
"spec_root": "/path/to/spec",
|
|
76
|
+
"runtime_root": "/path/to/runtime",
|
|
77
|
+
"source_commit": "abc123...",
|
|
78
|
+
"source_commit_error": null,
|
|
79
|
+
"generated_at": "2026-06-14T01:50:00.000Z",
|
|
80
|
+
"schema_version": 1,
|
|
81
|
+
"postcheck_result_path": "<spec_root>/.runtime/postcheck-result.json",
|
|
82
|
+
"workflow_runs_dir": "<runtime_root>/scan-runs/<scan_run_id>/workflow-runs",
|
|
83
|
+
"platform_pointer_path": "<source_root>/.sillyspec-platform.json",
|
|
84
|
+
"platform_pointer_status": "active",
|
|
85
|
+
"scan_post_check": {
|
|
86
|
+
"status": "success | completed_with_warnings | failed_post_check",
|
|
87
|
+
"checks": [...]
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 字段说明
|
|
93
|
+
|
|
94
|
+
| 字段 | 类型 | 说明 |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `workspace_id` | string \| null | SillyHub workspace 标识 |
|
|
97
|
+
| `scan_run_id` | string \| null | 本次 scan 唯一标识 |
|
|
98
|
+
| `source_root` | string | 源码目录绝对路径 |
|
|
99
|
+
| `spec_root` | string \| null | 规范目录(specDir) |
|
|
100
|
+
| `runtime_root` | string \| null | 运行时产物目录 |
|
|
101
|
+
| `source_commit` | string \| null | 源码 HEAD commit hash |
|
|
102
|
+
| `source_commit_error` | string \| undefined | commit 获取失败原因 |
|
|
103
|
+
| `generated_at` | string (ISO 8601) | manifest 生成时间 |
|
|
104
|
+
| `schema_version` | number | 产物协议版本,当前为 1 |
|
|
105
|
+
| `postcheck_result_path` | string \| null | post-check 结构化结果路径 |
|
|
106
|
+
| `workflow_runs_dir` | string \| null | workflow 检查结果目录 |
|
|
107
|
+
| `platform_pointer_path` | string | 平台指针文件路径 |
|
|
108
|
+
| `platform_pointer_status` | string | 初始 `active`,由指针文件独立更新 |
|
|
109
|
+
| `scan_post_check` | object \| undefined | post-check 结果(写入后追加) |
|
|
110
|
+
|
|
111
|
+
### 判断 scan 结果
|
|
112
|
+
|
|
113
|
+
SillyHub 消费 manifest 的方式:
|
|
114
|
+
|
|
115
|
+
1. 读取 `<spec_root>/manifest.json`
|
|
116
|
+
2. 检查 `scan_post_check.status`:
|
|
117
|
+
- `success` → scan 成功
|
|
118
|
+
- `completed_with_warnings` → scan 成功但有警告
|
|
119
|
+
- `failed_post_check` → scan 失败
|
|
120
|
+
3. 如果失败,读 `scan_post_check.checks` 获取具体失败项
|
|
121
|
+
4. 读 `postcheck_result_path` 获取完整结构化结果
|
|
122
|
+
5. 读 `workflow_runs_dir` 获取 workflow 检查证据
|
|
123
|
+
|
|
124
|
+
## .sillyspec-platform.json
|
|
125
|
+
|
|
126
|
+
跨 `--done` 生命周期的轻量指针文件,存储在 `<source_root>/.sillyspec-platform.json`(不在 `.sillyspec/` 内,不污染源码结构)。
|
|
127
|
+
|
|
128
|
+
### 生命周期
|
|
129
|
+
|
|
130
|
+
| 阶段 | 行为 |
|
|
131
|
+
|---|---|
|
|
132
|
+
| **创建** | `run scan --spec-root` 时,写入 cwd 根目录 |
|
|
133
|
+
| **读取** | 每次 `run`/`--done`/`--skip` 时,优先从 pointer 恢复平台参数 |
|
|
134
|
+
| **更新** | 每次 `run` 时刷新 `savedAt` |
|
|
135
|
+
| **完成标记** | scan post-check 后追加 `status=scan_completed` + `completedAt` + `scanStatus` |
|
|
136
|
+
| **异常检测** | pointer 存在但缺 `specRoot` 时报错退出 |
|
|
137
|
+
| **清理** | 无自动清理。`sillyspec platform pointer` 查看状态,`sillyspec platform pointer --cleanup` 手动清理 |
|
|
138
|
+
|
|
139
|
+
### CLI 检查命令
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# 查看指针状态
|
|
143
|
+
sillyspec platform pointer
|
|
144
|
+
|
|
145
|
+
# 清理过时/损坏指针
|
|
146
|
+
sillyspec platform pointer --cleanup
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
输出示例:
|
|
150
|
+
```
|
|
151
|
+
📄 指针文件: /path/to/source/.sillyspec-platform.json
|
|
152
|
+
specRoot: /path/to/spec
|
|
153
|
+
runtimeRoot: /path/to/runtime
|
|
154
|
+
workspaceId: ws-xxx
|
|
155
|
+
scanRunId: scan-2026-06-14-test-001
|
|
156
|
+
savedAt: 2026-06-14T01:50:00.000Z
|
|
157
|
+
状态: stale ⚠️
|
|
158
|
+
completedAt: 2026-06-12T01:00:00.000Z
|
|
159
|
+
scanStatus: success
|
|
160
|
+
⚠️ 指针已过时(完成超过 24h),可以安全删除。
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
状态判定逻辑:
|
|
164
|
+
- 缺少 `specRoot` → `corrupted`
|
|
165
|
+
- `status=scan_completed` 且 `completedAt` 超过 24h → `stale`
|
|
166
|
+
- `status=scan_completed` 且未超时 → `scan_completed` ✅
|
|
167
|
+
- 无 `status` 字段 → `active` 🔄
|
|
168
|
+
|
|
169
|
+
### 结构
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"specRoot": "/path/to/spec",
|
|
174
|
+
"runtimeRoot": "/path/to/runtime",
|
|
175
|
+
"workspaceId": "ws-xxx",
|
|
176
|
+
"scanRunId": "scan-2026-06-14-test-001",
|
|
177
|
+
"savedAt": "2026-06-14T01:50:00.000Z"
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
scan 完成后追加:
|
|
182
|
+
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"status": "scan_completed",
|
|
186
|
+
"completedAt": "2026-06-14T01:52:00.000Z",
|
|
187
|
+
"scanStatus": "success"
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## postcheck-result.json
|
|
192
|
+
|
|
193
|
+
写入 `<spec_root>/.runtime/postcheck-result.json`(平台模式)或 `<cwd>/.sillyspec/.runtime/postcheck-result.json`(本地模式)。
|
|
194
|
+
|
|
195
|
+
### 结构
|
|
196
|
+
|
|
197
|
+
```json
|
|
198
|
+
{
|
|
199
|
+
"workspace_id": "ws-xxx",
|
|
200
|
+
"scan_run_id": "scan-2026-06-14-test-001",
|
|
201
|
+
"status": "success | completed_with_warnings | failed_post_check",
|
|
202
|
+
"source_root": "/path/to/source",
|
|
203
|
+
"spec_root": "/path/to/spec",
|
|
204
|
+
"runtime_root": "/path/to/runtime",
|
|
205
|
+
"checks": [
|
|
206
|
+
{
|
|
207
|
+
"name": "source_root_docs_leak",
|
|
208
|
+
"severity": "failed | warning",
|
|
209
|
+
"detail": "..."
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
"source_root_leak": true,
|
|
213
|
+
"docs_missing": ["ARCHITECTURE.md"],
|
|
214
|
+
"profile": {
|
|
215
|
+
"mode": "quick | standard | deep",
|
|
216
|
+
"file_count": 10,
|
|
217
|
+
"source_bytes": 102400,
|
|
218
|
+
"project_count": 1,
|
|
219
|
+
"reason": "..."
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### check 类型
|
|
225
|
+
|
|
226
|
+
| check name | severity | 说明 |
|
|
227
|
+
|---|---|---|
|
|
228
|
+
| `source_root_docs_leak` | failed | docs 文档泄漏到 source_root |
|
|
229
|
+
| `source_root_leak` | failed | projects/workflows/knowledge/manifest/local 泄漏到 source_root |
|
|
230
|
+
| `all_docs_missing` | failed | 7 份必需文档全部缺失 |
|
|
231
|
+
| `partial_docs_missing` | failed | 部分文档缺失 |
|
|
232
|
+
| `docs_missing_header` | warning | 文档缺少 frontmatter |
|
|
233
|
+
| `local_config_invalid` | warning | local.yaml 中命令不存在 |
|
|
234
|
+
| `tool_use_error` | warning | AI 执行工具调用错误 |
|
|
235
|
+
| `api_error` | warning | API 错误(529/429/超时) |
|
|
236
|
+
|
|
237
|
+
## workflow-runs
|
|
238
|
+
|
|
239
|
+
写入 `<runtime_root>/scan-runs/<scan_run_id>/workflow-runs/`(平台模式)或 `<cwd>/.sillyspec/.runtime/workflow-runs/`(本地模式)。
|
|
240
|
+
|
|
241
|
+
每个文件命名:`<timestamp>-<workflow>-<project>-<status>.json`
|
|
242
|
+
|
|
243
|
+
### 结构
|
|
244
|
+
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"run_id": "20260614015000-scan-docs-test-project-pass",
|
|
248
|
+
"created_at": "2026-06-14T01:50:00.000Z",
|
|
249
|
+
"source": "run.js",
|
|
250
|
+
"stage": "scan",
|
|
251
|
+
"step": "深度扫描",
|
|
252
|
+
"workflow": "scan-docs",
|
|
253
|
+
"project": "test-project",
|
|
254
|
+
"status": "pass | fail",
|
|
255
|
+
"spec_version": 1,
|
|
256
|
+
"roles": [...],
|
|
257
|
+
"workflow_checks": [...],
|
|
258
|
+
"failures": [...],
|
|
259
|
+
"retry_prompts": [...]
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## source_root 零污染
|
|
264
|
+
|
|
265
|
+
平台模式的核心约束:source_root 下不产生 `.sillyspec/` 目录。
|
|
266
|
+
|
|
267
|
+
post-check 会检查以下路径是否存在泄漏:
|
|
268
|
+
- `<source_root>/.sillyspec/docs/` — 文档泄漏
|
|
269
|
+
- `<source_root>/.sillyspec/projects/` — 项目注册泄漏
|
|
270
|
+
- `<source_root>/.sillyspec/workflows/` — 工作流泄漏
|
|
271
|
+
- `<source_root>/.sillyspec/knowledge/` — 术语泄漏
|
|
272
|
+
- `<source_root>/.sillyspec/manifest.json` — manifest 泄漏
|
|
273
|
+
- `<source_root>/.sillyspec/local.yaml` — 配置泄漏
|
|
274
|
+
|
|
275
|
+
## 产物消费优先级
|
|
276
|
+
|
|
277
|
+
SillyHub 判断 scan 结果的推荐顺序:
|
|
278
|
+
|
|
279
|
+
1. `manifest.json` → `scan_post_check.overall_status` → 快速判断成功/失败
|
|
280
|
+
2. `postcheck-result.json` → 完整检查明细 + failure_categories
|
|
281
|
+
3. `workflow-runs/*.json` → workflow 检查证据
|
|
282
|
+
4. `docs/<project>/scan/*.md` → 实际文档内容
|
|
283
|
+
|
|
284
|
+
### failure_categories
|
|
285
|
+
|
|
286
|
+
`postcheck-result.json` 中的 `failure_categories` 提供分类视图:
|
|
287
|
+
|
|
288
|
+
| 类别 | 包含的 check |
|
|
289
|
+
---|---|
|
|
290
|
+
| `path_pollution` | source_root_leak, source_root_docs_leak |
|
|
291
|
+
| `missing_outputs` | all_docs_missing, partial_docs_missing, missing_docs |
|
|
292
|
+
| `bad_references` | local_config_invalid |
|
|
293
|
+
| `quality_warnings` | tool_use_error, api_error_529, rate_limit_exhausted, fallback_or_skip |
|
|
294
|
+
| `violations` | manifest_write_failed, project_list_parse_failed + 所有 path_pollution |
|
|
295
|
+
|
|
296
|
+
SillyHub 可以按类别快速定位问题域,而不需要遍历所有 checks。
|
|
297
|
+
|
|
298
|
+
不需要解析 stdout。
|