sillyspec 3.20.7 → 3.22.0
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/package.json +1 -1
- package/src/change-list.js +163 -52
- package/src/contract-matrix.js +67 -0
- package/src/quick-recommend.js +5 -5
- package/src/stages/execute.js +37 -18
- package/src/stages/plan-postcheck.js +214 -0
- package/src/stages/plan.js +13 -0
- package/docs/brainstorm-plan-contract.md +0 -64
- package/docs/plan-execute-contract.md +0 -123
- package/docs/platform-scan-protocol.md +0 -298
- package/docs/revision-mode.md +0 -115
- package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +0 -99
- package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +0 -223
- package/docs/sillyspec/file-lifecycle/stage-artifacts.md +0 -167
- package/docs/sillyspec/file-lifecycle/storage-and-state.md +0 -148
- package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +0 -211
- package/docs/sillyspec/file-lifecycle.md +0 -143
- package/docs/workflow-contract-regression.md +0 -106
- package/docs/worktree-isolation.md +0 -252
- package/test/brainstorm-plan-contract.test.mjs +0 -273
- package/test/check-syntax.mjs +0 -26
- package/test/cli-top-level-aliases.test.mjs +0 -174
- package/test/contract-artifacts.test.mjs +0 -323
- package/test/decision-ref-version.mjs +0 -85
- package/test/decision-supersede.test.mjs +0 -277
- package/test/knowledge-match.test.mjs +0 -231
- package/test/plan-execute-contract.test.mjs +0 -357
- package/test/plan-optimization.test.mjs +0 -572
- package/test/platform-artifacts.test.mjs +0 -190
- package/test/platform-failure-samples.test.mjs +0 -199
- package/test/platform-recovery-chain.test.mjs +0 -179
- package/test/platform-recovery.test.mjs +0 -167
- package/test/platform-scan-p0.test.mjs +0 -186
- package/test/quick-recommend.test.mjs +0 -146
- package/test/revision-v1.test.mjs +0 -1145
- package/test/run-sanitize-project-name.test.mjs +0 -51
- package/test/run-scan-postcheck-fail.test.mjs +0 -64
- package/test/run-scan-project-parse.test.mjs +0 -200
- package/test/run-tests.mjs +0 -48
- package/test/runtime-cleanup-keeps-worktree.test.mjs +0 -107
- package/test/scan-docs-yaml-placeholders.test.mjs +0 -84
- package/test/scan-knowledge.test.mjs +0 -175
- package/test/scan-paths.test.mjs +0 -68
- package/test/scan-postcheck-project-priority.test.mjs +0 -85
- package/test/scan-postcheck.test.mjs +0 -197
- package/test/scan-workflow-anyfailed-block.test.mjs +0 -52
- package/test/spec-dir.test.mjs +0 -206
- package/test/stage-contract-failed-post-check.test.mjs +0 -102
- package/test/stage-contract.test.mjs +0 -301
- package/test/stage-definitions.test.mjs +0 -39
- package/test/wait-gates.test.mjs +0 -501
- package/test/workflow-spec-base.test.mjs +0 -142
- package/test/worktree-deps-provision.test.mjs +0 -148
- package/test/worktree-guard.test.mjs +0 -136
- package/test/worktree-native-overlay.test.mjs +0 -188
package/src/stages/plan.js
CHANGED
|
@@ -358,6 +358,8 @@ full 计划的约束:
|
|
|
358
358
|
- [ ] plan.md 与 design.md 的文件变更清单一致
|
|
359
359
|
- [ ] 如果涉及构造函数/接口/DTO/client 方法变更,是否搜索了所有调用点并纳入任务范围?
|
|
360
360
|
- [ ] 调用点搜索命令的输出是否记录在 plan.md 或 task-NN.md 中?
|
|
361
|
+
- [ ] 跨任务契约自检:若 task-A 的产出(接口/DTO/响应)被 task-B 消费,consumer 是否在 TaskCard expects_from 里声明所需字段、provider 是否在 provides 里承诺这些字段、两边字段是否一致?(plan-postcheck 会硬校验,此处先自查)
|
|
362
|
+
- [ ] 文件覆盖自检:design.md「文件变更清单」中的每个源码文件,是否都被至少一个 task 的 allowed_paths 覆盖?(plan-postcheck 会硬校验,漏覆盖 = execute 必然漏改,此处先自查)
|
|
361
363
|
- [ ] 如果有 Mermaid 图,依赖关系确实非平凡(非线性/非全并行)
|
|
362
364
|
- [ ] 没有泛泛风险分析(如"需要充分测试")
|
|
363
365
|
|
|
@@ -407,6 +409,13 @@ requirement_ids: [FR-XX]
|
|
|
407
409
|
decision_ids: [D-XXX@vN]
|
|
408
410
|
allowed_paths:
|
|
409
411
|
- frontend/src/lib/errors.ts
|
|
412
|
+
provides: # 可选。仅当本 task 给其他 task 提供接口/DTO/响应时填
|
|
413
|
+
- contract: <DTO或响应类型名> # 如 DaemonRuntimeRead
|
|
414
|
+
fields: [field_a, field_b]
|
|
415
|
+
expects_from: # 可选。仅当本 task 消费其他 task 的契约时填
|
|
416
|
+
<provider-task-id>: # 如 task-05(占位符,不要照抄)
|
|
417
|
+
- contract: <DTO或响应类型名>
|
|
418
|
+
needs: [field_a] # 必须从该 provider 拿到的字段
|
|
410
419
|
goal: >
|
|
411
420
|
一句话说明这个 task 要做什么、为什么。
|
|
412
421
|
implementation:
|
|
@@ -433,6 +442,9 @@ TaskCard 格式规则(必须严格遵守):
|
|
|
433
442
|
- verify: 列表,实际可执行的命令
|
|
434
443
|
- constraints: 列表,明确边界(含 brownfield 兼容、异常处理)
|
|
435
444
|
- 不需要:修改文件章节、覆盖来源章节、接口定义章节、TDD 步骤章节、参考章节
|
|
445
|
+
- provides / expects_from 是可选字段:仅当跨 task 契约(一个 task 的接口/DTO/响应被另一个 task 消费)时才填,单 task 或无对外接口场景留空即可
|
|
446
|
+
- 填写后 plan-postcheck 会做硬对账:consumer 的每个 expects_from[provider].needs 字段必须在对应 provider 的 provides.fields 里,否则 plan 阶段阻断(不进入 execute)
|
|
447
|
+
- 不要把内部实现字段塞进 provides;只暴露给其他 task 的对外契约形状
|
|
436
448
|
- 如果存在 decisions.md,无法覆盖的 D-xxx@vN 在 constraints 中标注
|
|
437
449
|
- 写完后用 Write tool 保存到文件
|
|
438
450
|
\`\`\``
|
|
@@ -471,6 +483,7 @@ ${subagentPrompts}
|
|
|
471
483
|
- **一致性自查**:
|
|
472
484
|
- allowed_paths 有无冲突
|
|
473
485
|
- depends_on 与 plan.md Wave 分组是否一致
|
|
486
|
+
- provides/expects_from 契约自洽:每个 expects_from[provider].needs 字段都在该 provider task 的 provides.fields 里(plan-postcheck 会硬校验,这里提前自查)
|
|
474
487
|
- 如发现矛盾,列出问题清单,不要自动修复`
|
|
475
488
|
|
|
476
489
|
return {
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
author: qinyi
|
|
3
|
-
created_at: 2026-06-19 00:45:00
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Brainstorm → Plan Contract
|
|
7
|
-
|
|
8
|
-
## 核心契约
|
|
9
|
-
|
|
10
|
-
`design.md` 是 plan 阶段的**主要设计输入**。plan 不应该在空的或缺少关键决策的 design.md 上生成任务。
|
|
11
|
-
|
|
12
|
-
## design.md 结构要求
|
|
13
|
-
|
|
14
|
-
### 必须包含(error — 阻断 plan)
|
|
15
|
-
|
|
16
|
-
| # | 章节 | 匹配关键词 |
|
|
17
|
-
|---|------|-----------|
|
|
18
|
-
| 1 | 目标/背景/问题描述 | 目标、goal、objective、背景、background、问题、problem、purpose、目的 |
|
|
19
|
-
| 2 | 范围/总体方案/设计 | 范围、scope、总体方案、方案、approach、solution、设计、design |
|
|
20
|
-
| 3 | 决策/方案选择 | 决策、decision、选择、choice、方案选择、D-xxx@vN(decisions.md 引用) |
|
|
21
|
-
|
|
22
|
-
### 建议包含(warning — 不阻断 plan)
|
|
23
|
-
|
|
24
|
-
| # | 章节 | 匹配关键词 |
|
|
25
|
-
|---|------|-----------|
|
|
26
|
-
| 4 | 非目标/Non-goals | 非目标、non-goals、不做、out of scope |
|
|
27
|
-
| 5 | 约束/风险/Trade-off | 约束、constraint、风险、risk、trade-off |
|
|
28
|
-
| 6 | 文件变更清单 | 文件变更、变更清单、changed files |
|
|
29
|
-
|
|
30
|
-
## 校验规则
|
|
31
|
-
|
|
32
|
-
plan 启动时(第一个步骤执行前)调用 `validateDesignForPlan(designContent)`:
|
|
33
|
-
|
|
34
|
-
| 结果 | 行为 |
|
|
35
|
-
|------|------|
|
|
36
|
-
| 全部通过 | 正常进入 plan |
|
|
37
|
-
| 有 warning | 继续执行,展示警告 |
|
|
38
|
-
| 有 error | fail-fast,提示修复 design.md |
|
|
39
|
-
|
|
40
|
-
## 第一版设计原则
|
|
41
|
-
|
|
42
|
-
- **轻量 markdown 契约**:检查标题和关键词,不强 schema
|
|
43
|
-
- **关键词宽泛**:中英文都支持
|
|
44
|
-
- **decisions.md 引用也算决策**:`D-xxx@vN` 或 `decisions.md` 引用即满足决策检查
|
|
45
|
-
- **不做 brainstorm postcheck 阻断**:brainstorm 完成时不校验此契约(brainstorm 可以产出不完整的 design.md),只在 plan 启动时校验
|
|
46
|
-
|
|
47
|
-
## 错误处理
|
|
48
|
-
|
|
49
|
-
| 场景 | 行为 |
|
|
50
|
-
|------|------|
|
|
51
|
-
| design.md 不存在 | 不校验(向后兼容,plan 可以独立运行) |
|
|
52
|
-
| design.md 空 | fail-fast |
|
|
53
|
-
| 缺目标/背景 | fail-fast |
|
|
54
|
-
| 缺范围/方案 | fail-fast |
|
|
55
|
-
| 缺决策 | fail-fast |
|
|
56
|
-
| 缺非目标/约束/文件清单 | warning,继续执行 |
|
|
57
|
-
|
|
58
|
-
## 完整契约链
|
|
59
|
-
|
|
60
|
-
```
|
|
61
|
-
brainstorm → design.md → [Plan Contract 校验] → plan → plan.md → [Execute Contract 校验] → execute
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
每个阶段启动前都校验上游产物,形成双重保险。
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
author: qinyi
|
|
3
|
-
created_at: 2026-06-19 00:25:00
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Plan → Execute Contract
|
|
7
|
-
|
|
8
|
-
## 核心契约
|
|
9
|
-
|
|
10
|
-
`plan.md` 是 execute 阶段的**唯一任务蓝图输入**。execute 不从其他来源(brainstorm、tasks.md、agent 记忆)获取任务列表。
|
|
11
|
-
|
|
12
|
-
## plan.md 格式要求
|
|
13
|
-
|
|
14
|
-
### Checkbox Task(必须)
|
|
15
|
-
|
|
16
|
-
execute 通过 checkbox 解析任务,格式:
|
|
17
|
-
|
|
18
|
-
```markdown
|
|
19
|
-
- [ ] task-01: 实现用户认证模块
|
|
20
|
-
- [ ] task-02: 添加权限校验中间件
|
|
21
|
-
- [ ] task-03: 编写集成测试
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Task ID 规则
|
|
25
|
-
|
|
26
|
-
- 格式:`task-XX`(XX 为数字,建议两位补零)
|
|
27
|
-
- 必须唯一:同一 plan.md 内不能有两个相同 task id
|
|
28
|
-
- 建议连续:从 task-01 开始递增
|
|
29
|
-
- 不能为空:每个 checkbox task 必须有 id
|
|
30
|
-
|
|
31
|
-
### Task Name 规则
|
|
32
|
-
|
|
33
|
-
- 必须非空
|
|
34
|
-
- 清晰描述任务内容
|
|
35
|
-
|
|
36
|
-
### Wave 分组
|
|
37
|
-
|
|
38
|
-
```markdown
|
|
39
|
-
## Wave 1
|
|
40
|
-
- [ ] task-01: 搭建项目骨架
|
|
41
|
-
- [ ] task-02: 配置 CI/CD
|
|
42
|
-
|
|
43
|
-
## Wave 2
|
|
44
|
-
- [ ] task-03: 实现业务逻辑
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
- Wave 内任务无依赖(可并行)
|
|
48
|
-
- Wave 间有依赖(按序执行)
|
|
49
|
-
- Wave 只能引用已存在的 task
|
|
50
|
-
|
|
51
|
-
## 校验规则
|
|
52
|
-
|
|
53
|
-
execute 进入前调用 `validatePlanForExecute(planContent)`:
|
|
54
|
-
|
|
55
|
-
| # | 规则 | 级别 |
|
|
56
|
-
|---|------|------|
|
|
57
|
-
| 1 | plan.md 非空 | error |
|
|
58
|
-
| 2 | 至少有一个 checkbox task | error |
|
|
59
|
-
| 3 | task id 唯一 | error |
|
|
60
|
-
| 4 | task id 连续(task-01 起) | error |
|
|
61
|
-
| 5 | task name 非空 | error |
|
|
62
|
-
| 6 | task 有 id(无 id 只 warning) | warning |
|
|
63
|
-
|
|
64
|
-
校验失败 → fail-fast,不进入 execute。
|
|
65
|
-
校验通过但有 warning → 继续执行,提示警告。
|
|
66
|
-
|
|
67
|
-
## 复杂度场景
|
|
68
|
-
|
|
69
|
-
### none(最小变更)
|
|
70
|
-
```markdown
|
|
71
|
-
## Wave 1
|
|
72
|
-
- [ ] task-01: 修复 bug
|
|
73
|
-
```
|
|
74
|
-
至少 1 个 checkbox task。
|
|
75
|
-
|
|
76
|
-
### light(轻量变更)
|
|
77
|
-
```markdown
|
|
78
|
-
## Wave 1
|
|
79
|
-
- [ ] task-01: 添加 API 端点
|
|
80
|
-
- [ ] task-02: 添加前端调用
|
|
81
|
-
```
|
|
82
|
-
1 个 Wave,2-3 个 task。
|
|
83
|
-
|
|
84
|
-
### full(完整变更)
|
|
85
|
-
```markdown
|
|
86
|
-
## Wave 1: 基础设施
|
|
87
|
-
- [ ] task-01: 数据库 schema
|
|
88
|
-
- [ ] task-02: 模型定义
|
|
89
|
-
|
|
90
|
-
## Wave 2: 业务逻辑
|
|
91
|
-
- [ ] task-03: API 实现
|
|
92
|
-
- [ ] task-04: 业务规则
|
|
93
|
-
|
|
94
|
-
## Wave 3: 测试
|
|
95
|
-
- [ ] task-05: 集成测试
|
|
96
|
-
```
|
|
97
|
-
多个 Wave,每个 Wave 1-N 个 task。
|
|
98
|
-
|
|
99
|
-
## execute reopen 契约
|
|
100
|
-
|
|
101
|
-
当 execute 被 `--reopen` 时:
|
|
102
|
-
1. **必须从最新 plan.md 重新解析 steps**(不复用旧 task/wave)
|
|
103
|
-
2. 如果 plan.md 已变更(wave 数量变了),execute steps 会反映最新状态
|
|
104
|
-
3. 旧 completed steps 不保留(全部回到 pending/stale)
|
|
105
|
-
|
|
106
|
-
## 错误处理
|
|
107
|
-
|
|
108
|
-
| 场景 | 行为 |
|
|
109
|
-
|------|------|
|
|
110
|
-
| plan.md 不存在 | 生成默认 3 Wave(向后兼容) |
|
|
111
|
-
| plan.md 存在但无 checkbox | fail-fast |
|
|
112
|
-
| task id 重复 | fail-fast |
|
|
113
|
-
| task id 不连续 | fail-fast |
|
|
114
|
-
| plan.md 被修改后 execute reopen | 重新解析,使用最新 wave/task |
|
|
115
|
-
|
|
116
|
-
## 双重校验
|
|
117
|
-
|
|
118
|
-
契约在两个时点执行:
|
|
119
|
-
|
|
120
|
-
1. **plan 完成时**(plan postcheck):plan.md 不合法 → 阻断 completed,plan 阶段无法完成
|
|
121
|
-
2. **execute 启动时**(execute entry):plan.md 不合法 → fail-fast,不进入 execute
|
|
122
|
-
|
|
123
|
-
这确保 plan.md 在进入 execute 之前就是合法的,execute 启动时的校验是二次保险。
|
|
@@ -1,298 +0,0 @@
|
|
|
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。
|
package/docs/revision-mode.md
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
author: qinyi
|
|
3
|
-
created_at: 2026-06-18 22:48:00
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Revision Mode — 阶段修订
|
|
7
|
-
|
|
8
|
-
## 核心语义
|
|
9
|
-
|
|
10
|
-
已完成(completed)的阶段不能直接重跑。必须通过 `--reopen` 进入受控修订模式。
|
|
11
|
-
|
|
12
|
-
修订模式确保:
|
|
13
|
-
- 阶段状态机闭环:completed → revising → completed
|
|
14
|
-
- 因果链不断:上游修订时,下游阶段自动标记 stale
|
|
15
|
-
- 产物安全:reopen 不删除、不备份、不回滚文件,只改 progress 状态
|
|
16
|
-
|
|
17
|
-
## 命令
|
|
18
|
-
|
|
19
|
-
### `--reopen` — 重新打开已完成阶段
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
sillyspec run brainstorm --reopen
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
把阶段从 completed 变为 revising。不删除步骤历史,不清空产物文件。
|
|
26
|
-
|
|
27
|
-
**不带 `--from-step` 时:** 只在阶段存在 pending/stale/waiting/failed 步骤时允许继续。如果所有步骤都是 completed,会拒绝并要求指定 `--from-step`。
|
|
28
|
-
|
|
29
|
-
### `--reopen --from-step <index|name>` — 从指定步骤开始修订
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# 按序号(1-based)
|
|
33
|
-
sillyspec run brainstorm --reopen --from-step 3
|
|
34
|
-
|
|
35
|
-
# 按名称
|
|
36
|
-
sillyspec run brainstorm --reopen --from-step "方案选择"
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
效果:
|
|
40
|
-
- from-step 之前的步骤:保持 completed
|
|
41
|
-
- from-step 本身:变为 pending
|
|
42
|
-
- from-step 之后的步骤:标记为 stale(曾经完成,但因上游修订失效)
|
|
43
|
-
- 当前阶段状态:变为 revising
|
|
44
|
-
- 所有下游阶段:自动 cascade stale
|
|
45
|
-
|
|
46
|
-
### `--reset` — 彻底重置(核弹)
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
sillyspec run brainstorm --reset
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
清空所有步骤状态,从头开始。不保留任何历史。只在确实需要完全重来时使用。
|
|
53
|
-
|
|
54
|
-
## 下游 cascade 规则
|
|
55
|
-
|
|
56
|
-
阶段顺序:`scan → brainstorm → plan → execute → verify → archive`
|
|
57
|
-
|
|
58
|
-
reopen 任意阶段,其下游所有已 completed 的阶段自动变为 stale,并记录 staleReason。
|
|
59
|
-
|
|
60
|
-
示例:
|
|
61
|
-
```
|
|
62
|
-
reopen brainstorm --from-step 2
|
|
63
|
-
→ brainstorm: revising
|
|
64
|
-
→ plan: stale (上游 brainstorm 已修订)
|
|
65
|
-
→ execute: stale
|
|
66
|
-
→ verify: stale
|
|
67
|
-
→ archive: stale (已有归档文件保留但不再可信)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
stale 阶段不能直接 `run`,必须 `--reopen --from-step` 或 `--reset`。
|
|
71
|
-
|
|
72
|
-
## --reopen / --from-step / --reset 对比
|
|
73
|
-
|
|
74
|
-
| 维度 | --reopen --from-step | --reopen | --reset |
|
|
75
|
-
|------|---------------------|----------|---------|
|
|
76
|
-
| 步骤历史 | 保留之前的,后面失效 | 保留 | 全部清空 |
|
|
77
|
-
| 产物文件 | 不动 | 不动 | 不动 |
|
|
78
|
-
| 阶段状态 | revising | revising | pending |
|
|
79
|
-
| revision 计数 | +1 | +1 | 不变 |
|
|
80
|
-
| 下游 cascade | stale | stale | 不 cascade |
|
|
81
|
-
| 适用场景 | 局部返工 | 继续中断 | 彻底重来 |
|
|
82
|
-
|
|
83
|
-
## 文件策略
|
|
84
|
-
|
|
85
|
-
- reopen **不触碰**任何产物文件(design.md、plan.md、task docs 等)
|
|
86
|
-
- agent 在 revision context 下审视并更新已有产物
|
|
87
|
-
- 如需备份/快照功能,后续版本再加
|
|
88
|
-
|
|
89
|
-
## Revision Context 注入
|
|
90
|
-
|
|
91
|
-
修订模式下执行步骤时,prompt 前会注入:
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
🔄 Revision Context
|
|
95
|
-
本阶段处于修订模式(revision N),不是首次执行。
|
|
96
|
-
- 修订起始步骤:index: name
|
|
97
|
-
- 当前步骤之前已完成的步骤仍然有效,不需要重做。
|
|
98
|
-
- 当前步骤及之后的步骤需要重新生成或调整已有产物。
|
|
99
|
-
- 已有产物文件被保留,审视并更新它们,而不是从零创建。
|
|
100
|
-
- 不要绕过 CLI 进度追踪。
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## progress 展示示例
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
🔧 🧠 需求探索
|
|
107
|
-
📋 revision: 2, from step: 2: 加载项目上下文
|
|
108
|
-
✅ 状态检查 (保持 completed)
|
|
109
|
-
⬜ 加载项目上下文 (pending — 从这里重做)
|
|
110
|
-
⚠️ 协作与复用检查 (stale)
|
|
111
|
-
⚠️ 原型/设计图分析 (stale)
|
|
112
|
-
...
|
|
113
|
-
⚠️ 📐 实现计划
|
|
114
|
-
⚠️ stale: 上游阶段 brainstorm 已修订 (revision 2)
|
|
115
|
-
```
|