sillyspec 3.20.2 → 3.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +1 -5
  2. package/.claude/skills/sillyspec-auto/SKILL.md +2 -8
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +1 -28
  4. package/.claude/skills/sillyspec-commit/SKILL.md +3 -4
  5. package/.claude/skills/sillyspec-continue/SKILL.md +4 -5
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +3 -12
  7. package/.claude/skills/sillyspec-execute/SKILL.md +2 -15
  8. package/.claude/skills/sillyspec-explore/SKILL.md +1 -14
  9. package/.claude/skills/sillyspec-plan/SKILL.md +36 -5
  10. package/.claude/skills/sillyspec-propose/SKILL.md +0 -4
  11. package/.claude/skills/sillyspec-quick/SKILL.md +1 -5
  12. package/.claude/skills/sillyspec-resume/SKILL.md +66 -23
  13. package/.claude/skills/sillyspec-scan/SKILL.md +1 -5
  14. package/.claude/skills/sillyspec-state/SKILL.md +8 -8
  15. package/.claude/skills/sillyspec-status/SKILL.md +1 -5
  16. package/.claude/skills/sillyspec-verify/SKILL.md +1 -5
  17. package/.claude/skills/sillyspec-workspace/SKILL.md +3 -11
  18. package/.sillyspec/changes/archive/2026-04-08-derive-state/design.md +97 -0
  19. package/.sillyspec/changes/archive/2026-04-08-derive-state/plan.md +51 -0
  20. package/.sillyspec/changes/archive/2026-04-08-derive-state/proposal.md +29 -0
  21. package/.sillyspec/changes/archive/2026-04-08-derive-state/requirements.md +34 -0
  22. package/.sillyspec/changes/archive/2026-04-08-derive-state/tasks.md +13 -0
  23. package/.sillyspec/changes/archive/2026-04-08-derive-state/verify-result.md +43 -0
  24. package/.sillyspec/changes/auto-mode/design.md +50 -0
  25. package/.sillyspec/changes/auto-mode/proposal.md +19 -0
  26. package/.sillyspec/changes/auto-mode/requirements.md +21 -0
  27. package/.sillyspec/changes/auto-mode/tasks.md +7 -0
  28. package/.sillyspec/changes/brainstorm-archive/2026-04-05-dashboard-design.md +206 -0
  29. package/.sillyspec/changes/brainstorm-archive/2026-04-05-unified-docs-design.md +199 -0
  30. package/.sillyspec/changes/dashboard/design.md +219 -0
  31. package/.sillyspec/changes/dashboard/design.md.braindraft +206 -0
  32. package/.sillyspec/changes/run-command-design/design.md +1230 -0
  33. package/.sillyspec/changes/unified-docs-design/design.md +199 -0
  34. package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
  35. package/.sillyspec/knowledge/INDEX.md +8 -0
  36. package/.sillyspec/knowledge/uncategorized.md +3 -0
  37. package/.sillyspec/plans/2026-04-05-dashboard.md +737 -0
  38. package/.sillyspec/projects/sillyspec.yaml +3 -0
  39. package/README.md +11 -13
  40. package/SKILL.md +40 -44
  41. package/dist/steps/brainstorm/01-load-context.md +30 -0
  42. package/dist/steps/brainstorm/02-reuse-check.md +6 -0
  43. package/dist/steps/brainstorm/03-prototype-analysis.md +11 -0
  44. package/dist/steps/brainstorm/04-module-split.md +23 -0
  45. package/dist/steps/brainstorm/05-dialog-explore.md +8 -0
  46. package/dist/steps/brainstorm/06-propose-approaches.md +3 -0
  47. package/dist/steps/brainstorm/07-present-design.md +3 -0
  48. package/dist/steps/brainstorm/08-write-design.md +21 -0
  49. package/dist/steps/brainstorm/09-self-review.md +15 -0
  50. package/dist/steps/brainstorm/10-user-confirm.md +3 -0
  51. package/dist/steps/brainstorm/11-output-spec.md +7 -0
  52. package/dist/steps/brainstorm/manifest.yaml +26 -0
  53. package/dist/steps/execute/01-load-context.md +41 -0
  54. package/dist/steps/execute/02-scan-conventions.md +47 -0
  55. package/dist/steps/execute/03-skill-mcp.md +19 -0
  56. package/dist/steps/execute/04-assign-task.md +22 -0
  57. package/dist/steps/execute/04b-prompt-template.md +54 -0
  58. package/dist/steps/execute/05-write-test.md +7 -0
  59. package/dist/steps/execute/06-write-code.md +8 -0
  60. package/dist/steps/execute/07-run-test.md +26 -0
  61. package/dist/steps/execute/08-fix-issues.md +28 -0
  62. package/dist/steps/execute/09-next-task.md +33 -0
  63. package/dist/steps/execute/manifest.yaml +28 -0
  64. package/dist/steps/plan/01-load-context.md +22 -0
  65. package/dist/steps/plan/02-anchor-confirm.md +1 -0
  66. package/dist/steps/plan/03-expand-tasks.md +33 -0
  67. package/dist/steps/plan/04-mark-order.md +15 -0
  68. package/dist/steps/plan/05-e2e-planning.md +17 -0
  69. package/dist/steps/plan/06-self-check.md +16 -0
  70. package/dist/steps/plan/07-save.md +1 -0
  71. package/dist/steps/plan/manifest.yaml +18 -0
  72. package/dist/steps/scan/01-env-detect.md +51 -0
  73. package/dist/steps/scan/02-tech-stack.md +16 -0
  74. package/dist/steps/scan/03-conventions.md +16 -0
  75. package/dist/steps/scan/04-structure.md +19 -0
  76. package/dist/steps/scan/05-quality.md +18 -0
  77. package/dist/steps/scan/06-complete.md +49 -0
  78. package/dist/steps/scan/manifest.yaml +16 -0
  79. package/dist/steps/verify/01-load-specs.md +28 -0
  80. package/dist/steps/verify/02-check-tasks.md +1 -0
  81. package/dist/steps/verify/03-check-design.md +6 -0
  82. package/dist/steps/verify/04-run-tests.md +7 -0
  83. package/dist/steps/verify/05-e2e-tests.md +27 -0
  84. package/dist/steps/verify/05b-e2e-fix.md +33 -0
  85. package/dist/steps/verify/06-code-quality.md +25 -0
  86. package/dist/steps/verify/07-lint-check.md +27 -0
  87. package/dist/steps/verify/08-output-report.md +14 -0
  88. package/dist/steps/verify/manifest.yaml +22 -0
  89. package/package.json +1 -7
  90. package/packages/dashboard/dist/assets/{index-Bq_Z2hne.js → index-D1EVTLmc.js} +1264 -1264
  91. package/packages/dashboard/dist/assets/index-DGe8CqeP.css +1 -0
  92. package/packages/dashboard/dist/index.html +2 -2
  93. package/packages/dashboard/package-lock.json +6 -6
  94. package/packages/dashboard/server/executor.js +1 -1
  95. package/packages/dashboard/server/index.js +18 -98
  96. package/packages/dashboard/server/parser.js +71 -139
  97. package/packages/dashboard/server/watcher.js +6 -14
  98. package/packages/dashboard/src/App.vue +185 -418
  99. package/packages/dashboard/src/components/ActionBar.vue +1 -10
  100. package/packages/dashboard/src/components/CommandPalette.vue +1 -5
  101. package/packages/dashboard/src/components/DocPreview.vue +8 -105
  102. package/packages/dashboard/src/components/DocTree.vue +19 -75
  103. package/packages/dashboard/src/components/PipelineStage.vue +2 -22
  104. package/packages/dashboard/src/components/PipelineView.vue +5 -32
  105. package/packages/dashboard/src/components/ProjectOverview.vue +139 -113
  106. package/packages/dashboard/src/components/StageBadge.vue +3 -17
  107. package/packages/dashboard/src/components/StepCard.vue +2 -7
  108. package/packages/dashboard/src/composables/useDashboard.js +0 -28
  109. package/src/derive.js +147 -0
  110. package/src/index.js +40 -688
  111. package/src/init.js +63 -119
  112. package/src/migrate.js +7 -7
  113. package/src/progress.js +248 -1474
  114. package/src/run.js +302 -3008
  115. package/src/setup.js +64 -2
  116. package/src/stages/archive.js +17 -123
  117. package/src/stages/brainstorm.js +48 -454
  118. package/src/stages/doctor.js +46 -99
  119. package/src/stages/execute.js +59 -420
  120. package/src/stages/index.js +18 -12
  121. package/src/stages/plan.js +189 -492
  122. package/src/stages/propose.js +11 -70
  123. package/src/stages/quick.js +13 -52
  124. package/src/stages/scan.js +68 -485
  125. package/src/stages/status.js +1 -1
  126. package/src/stages/verify.js +16 -203
  127. package/src/step.js +543 -0
  128. package/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
  129. package/.husky/pre-push +0 -13
  130. package/CLAUDE.md +0 -18
  131. package/docs/brainstorm-plan-contract.md +0 -64
  132. package/docs/plan-execute-contract.md +0 -123
  133. package/docs/platform-scan-protocol.md +0 -298
  134. package/docs/revision-mode.md +0 -115
  135. package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +0 -99
  136. package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +0 -218
  137. package/docs/sillyspec/file-lifecycle/stage-artifacts.md +0 -167
  138. package/docs/sillyspec/file-lifecycle/storage-and-state.md +0 -148
  139. package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +0 -193
  140. package/docs/sillyspec/file-lifecycle.md +0 -125
  141. package/docs/workflow-contract-regression.md +0 -106
  142. package/docs/worktree-isolation.md +0 -252
  143. package/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
  144. package/packages/dashboard/dist/prototype-dashboard.html +0 -836
  145. package/packages/dashboard/dist/prototype-overview.html +0 -256
  146. package/packages/dashboard/public/prototype-dashboard.html +0 -836
  147. package/packages/dashboard/public/prototype-overview.html +0 -256
  148. package/packages/dashboard/src/components/HResizeHandle.vue +0 -48
  149. package/packages/dashboard/src/components/ProjectCard.vue +0 -187
  150. package/packages/dashboard/src/components/VResizeHandle.vue +0 -61
  151. package/packages/dashboard/src/composables/useLayout.js +0 -131
  152. package/src/brainstorm-postcheck.js +0 -158
  153. package/src/change-list.js +0 -52
  154. package/src/change-risk-profile.js +0 -352
  155. package/src/classify-change.js +0 -73
  156. package/src/constants.js +0 -70
  157. package/src/contract-matrix.js +0 -278
  158. package/src/db.js +0 -201
  159. package/src/endpoint-extractor.js +0 -315
  160. package/src/hooks/claude-pre-tool-use.cjs +0 -125
  161. package/src/hooks/worktree-guard.js +0 -761
  162. package/src/knowledge-match.js +0 -130
  163. package/src/modules.js +0 -482
  164. package/src/scan-postcheck.js +0 -383
  165. package/src/stage-contract.js +0 -700
  166. package/src/stages/brainstorm-auto.js +0 -229
  167. package/src/stages/explore.js +0 -34
  168. package/src/stages/knowledge.js +0 -498
  169. package/src/stages/plan-postcheck.js +0 -513
  170. package/src/sync.js +0 -497
  171. package/src/task-review.js +0 -346
  172. package/src/workflow.js +0 -785
  173. package/src/worktree-apply.js +0 -549
  174. package/src/worktree.js +0 -932
  175. package/templates/workflows/archive-impact.yaml +0 -79
  176. package/templates/workflows/scan-docs.yaml +0 -132
  177. package/test/brainstorm-plan-contract.test.mjs +0 -273
  178. package/test/check-syntax.mjs +0 -26
  179. package/test/cli-top-level-aliases.test.mjs +0 -174
  180. package/test/contract-artifacts.test.mjs +0 -323
  181. package/test/decision-supersede.test.mjs +0 -277
  182. package/test/knowledge-match.test.mjs +0 -231
  183. package/test/plan-execute-contract.test.mjs +0 -330
  184. package/test/plan-optimization.test.mjs +0 -572
  185. package/test/platform-artifacts.test.mjs +0 -190
  186. package/test/platform-failure-samples.test.mjs +0 -199
  187. package/test/platform-recovery-chain.test.mjs +0 -179
  188. package/test/platform-recovery.test.mjs +0 -167
  189. package/test/platform-scan-p0.test.mjs +0 -175
  190. package/test/revision-v1.test.mjs +0 -1145
  191. package/test/run-sanitize-project-name.test.mjs +0 -51
  192. package/test/run-scan-postcheck-fail.test.mjs +0 -64
  193. package/test/run-scan-project-parse.test.mjs +0 -200
  194. package/test/run-tests.mjs +0 -48
  195. package/test/scan-docs-yaml-placeholders.test.mjs +0 -84
  196. package/test/scan-knowledge.test.mjs +0 -175
  197. package/test/scan-paths.test.mjs +0 -68
  198. package/test/scan-postcheck-project-priority.test.mjs +0 -85
  199. package/test/scan-postcheck.test.mjs +0 -197
  200. package/test/scan-workflow-anyfailed-block.test.mjs +0 -52
  201. package/test/spec-dir.test.mjs +0 -206
  202. package/test/stage-contract-failed-post-check.test.mjs +0 -102
  203. package/test/stage-contract.test.mjs +0 -299
  204. package/test/stage-definitions.test.mjs +0 -39
  205. package/test/wait-gates.test.mjs +0 -501
  206. package/test/workflow-spec-base.test.mjs +0 -142
  207. package/test/worktree-guard.test.mjs +0 -136
  208. package/test/worktree-native-overlay.test.mjs +0 -188
@@ -5,549 +5,132 @@ export const definition = {
5
5
  auxiliary: true,
6
6
  steps: [
7
7
  {
8
- name: '探测项目结构并建议子项目',
9
- prompt: `扫描项目顶层目录结构,自动发现可能的子项目,**需用户确认后才创建 projects 配置**。
8
+ name: '检查已有扫描文档和子项目列表',
9
+ prompt: `检查已有扫描文档和子项目列表。
10
10
 
11
11
  ### 操作
12
- 1. 列出项目顶层目录:\`ls -d */ 2>/dev/null | grep -v node_modules | grep -v '.git' | grep -v '.sillyspec'\`
13
- 2. 对每个顶层目录,快速判断是否为独立项目(检查 package.json / pom.xml / build.gradle / pyproject.toml / go.mod 等构建文件)
14
- 3. 对每个疑似独立项目,检测技术栈:\`cat <dir>/package.json 2>/dev/null | head -5\` 或类似
15
- 4. 对比 \`{PROJECTS_ROOT}/\` 已有配置,找出未注册的子项目
16
-
17
- ### 判断标准(满足任一即为子项目)
18
- - 有独立的构建文件(package.json, pom.xml, build.gradle, pyproject.toml 等)
19
- - 有独立的源码目录结构(src/, app/, lib/ 等)
20
- - 有独立的测试目录(test/, tests/, __tests__/ 等)
21
- - 不是 .git / node_modules / .sillyspec / dist / build 等工具目录
22
-
23
- ### 输出格式
24
- 列出发现的可能子项目列表,每个含:
25
- - 目录名
26
- - 技术栈(如 Next.js + TypeScript、FastAPI + Python)
27
- - 是否已注册到 projects/
28
- - 建议:注册 / 跳过
29
-
30
- ### ⛔ 红线
31
- - **不要自动创建 projects 配置文件**,只列出建议供用户确认
32
- - **不要修改任何文件**,只做探测和报告
12
+ 1. \`ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .\` 检查已有文档
13
+ 1. \`ls docs/*/scan/ 2>/dev/null\` 检查已有文档
14
+ 2. \`wc -l docs/*/scan/*.md 2>/dev/null\` 文档行数
15
+ 3. 已有 3 份 → 建议升级深度扫描;已有 7 份 → 建议刷新或跳过
16
+ 5. 显示子项目列表供选择扫描范围
33
17
 
34
18
  ### 输出
35
- 子项目建议列表(含技术栈和注册状态)`,
36
- outputHint: '子项目建议列表',
37
- optional: false
38
- },
39
- {
40
- name: '构建扫描项目列表',
41
- prompt: `确定本次要扫描的项目列表。
42
-
43
- ### 操作
44
- 1. \`ls {PROJECTS_ROOT}/*.yaml 2>/dev/null\` — 列出所有已注册项目
45
- 2. 对每个项目,检查已有的 scan 文档状态:\`ls {DOCS_ROOT}/scan/*.md 2>/dev/null\`
46
- 3. 按以下格式展示:
47
-
48
- \`\`\`
49
- 扫描项目列表:
50
- 1. sillyspec(主项目)— scan 文档:0/7 已存在
51
- 2. dashboard(子项目)— scan 文档:0/7 已存在
52
- \`\`\`
53
-
54
- 4. **如果存在歧义(多项目且无法自动判定),必须暂停等待用户**:
55
- - 选择要扫描的项目(默认全部)
56
- - 每个项目的扫描策略:**重新扫描(全部覆盖)** / **只补扫描缺失的文档** / **跳过**
57
- - 调用:\`sillyspec run scan --wait --reason "等待用户确认扫描项目列表" --options "全部重新扫描,只补缺失,跳过" --output "项目列表和策略建议"\`
58
- 5. **如果只有单一项目且已明确,正常完成即可,不需要等待。**
59
-
60
- ### ⛔ 重要
61
- - **不要自行决定跳过**,有歧义时暂停等用户选择后再继续
62
- - 最终确定的项目列表将用于后续所有步骤
63
- - **后续每个需要生成文档的步骤,都必须对列表中的每个项目分别执行**
64
-
65
- ### 输出格式规范
66
- --output 必须使用以下结构化格式之一(CLI 只解析这些格式,**不要输出自由文本列表**):
67
-
68
- **格式 A:scan_projects YAML block**
69
- 在 --output 中输出:
70
- scan_projects:
71
- - id: backend
72
- - id: frontend
73
- - id: daemon
74
-
75
- **格式 B:BEGIN_PROJECT_LIST 标记块**
76
- 在 --output 中输出:
77
- BEGIN_PROJECT_LIST
78
- - backend
79
- - frontend
80
- - daemon
81
- END_PROJECT_LIST
82
-
83
- 如果不需要解析项目列表(如单项目已明确),--output 写普通摘要即可。`,
84
- outputHint: '结构化项目列表(YAML block 或 BEGIN_PROJECT_LIST)',
19
+ 已有文档状态 + 扫描建议`,
20
+ outputHint: '工作区和文档状态',
85
21
  optional: false
86
22
  },
87
23
  {
88
24
  name: '构建环境探测',
89
- perProject: true,
90
- prompt: `探测当前项目的构建环境和依赖。
25
+ prompt: `探测项目的构建环境和依赖。
91
26
 
92
27
  ### 操作
93
- 对扫描列表中的每个项目重复以下操作:
94
- 1. 进入项目目录(子项目用其 path,如 \`packages/dashboard/\`)
95
- 2. \`cat package.json pom.xml build.gradle go.mod Cargo.toml requirements.txt pyproject.toml Gemfile composer.json 2>/dev/null\`
96
- 3. \`find <project-dir> -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null\`
97
- 4. 结果保存到 \`{DOCS_ROOT}/scan/_env-detect.md\`(临时文件,扫描完删除)
28
+ 1. \`cat package.json pom.xml build.gradle go.mod Cargo.toml requirements.txt pyproject.toml Gemfile composer.json 2>/dev/null\`
29
+ 2. \`find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null\`
30
+ 3. 结果保存到 \`docs/<project>/scan/_env-detect.md\`(临时文件,扫描完删除)
98
31
 
99
32
  ### 输出
100
- 每个项目的环境探测结果摘要`,
33
+ 环境探测结果摘要`,
101
34
  outputHint: '环境探测摘要',
102
35
  optional: false
103
36
  },
104
37
  {
105
38
  name: '断点续扫检测',
106
- perProject: true,
107
- prompt: `检测当前项目已有扫描文档,列出缺失的。
39
+ prompt: `检测已有扫描文档,只生成缺失的。
108
40
 
109
41
  ### 操作
110
- 对扫描列表中的每个项目分别执行:
111
- 1. 检查 7 份文档是否存在:ARCHITECTURE、STRUCTURE、CONVENTIONS、INTEGRATIONS、TESTING、CONCERNS、PROJECT
112
- 路径:\`{DOCS_ROOT}/scan/<DOC>.md\`
113
- 2. 列出已有 ✅ 和缺失 ⬜
42
+ 1. \`PROJECT=$(python3 -c "import sys,json; print(json.load(open('.sillyspec/.runtime/progress.json')).get('project',''))" 2>/dev/null || basename "$(pwd)")\`
43
+ 2. 检查 7 份文档是否存在:ARCHITECTURE、STRUCTURE、CONVENTIONS、INTEGRATIONS、TESTING、CONCERNS、PROJECT
44
+ 3. 列出已有 ✅ 和缺失 ⬜
45
+ 4. 只生成缺失的文档
114
46
 
115
47
  ### 输出
116
- 每个项目的已有/缺失文档列表`,
48
+ 已有/缺失文档列表`,
117
49
  outputHint: '断点续扫状态',
118
50
  optional: false
119
51
  },
120
52
  {
121
- name: '深度扫描 — 7 份文档(子代理并行)',
122
- perProject: true,
123
- prompt: `按照 \`{WORKFLOWS_ROOT}/scan-docs.yaml\` 中定义的角色和检查规则,使用子代理并行生成当前项目的 7 份扫描文档。
124
-
125
- **你必须使用子代理执行,不要自己写文档。**
126
- **对扫描列表中的每个项目分别执行以下流程。**
53
+ name: '深度扫描 — 技术架构',
54
+ prompt: `扫描技术栈 + 数据库 Schema + 架构模式。参考 _env-detect.md。
127
55
 
128
56
  ### 操作
129
- 1. 读取 \`{WORKFLOWS_ROOT}/scan-docs.yaml\`,了解角色定义、输出要求和检查规则
130
- 2. 对每个项目(扫描列表中标记为需生成/覆盖的项目):
131
- a. \`<project>\` 替换为实际项目名,得到该项目的目标文件路径
132
- b. 为每个角色启动独立子代理(可并行),每个子代理负责 1-2 份文档
133
- c. 子代理的搜索范围限定在该项目目录内(子项目如 \`packages/dashboard/\`,不要搜索主项目源码)
134
- d. 子代理直接用 grep/rg 搜索源码并写入文件,结果不回传到你的上下文
135
- e. 等待该项目所有子代理完成后,验证文件是否生成且非空
136
- f. 该项目完成后,继续下一个项目
137
- 3. 所有项目完成后,运行以下命令检查产物:
138
- \`node -e "import('./src/workflow.js').then(w => { const r = w.runPostCheck(w.loadWorkflow('.', 'scan-docs'), '.', '<project>'); console.log(w.formatCheckReport(r)) })\`
139
- 对每个项目分别执行(将 \`<project>\` 替换为实际项目名)
140
- 4. 如果检查报告有失败项,按报告中的角色和文件重试失败的部分
141
-
142
- ### 覆盖保护
143
- - 生成每份 scan 文档时,frontmatter 必须包含:
144
- \`\`\`yaml
145
- ---
146
- source_commit: <git-head-short>
147
- updated_at: <now-iso-datetime>
148
- generator: sillyspec-scan
149
- ---
150
- \`\`\`
151
- - 覆盖已有 scan 文档前先读取旧 frontmatter;如果旧文档的 \`source_commit\` 与当前 HEAD 不一致,或旧文档 \`updated_at\` 晚于本次 scan 开始时间,不要覆盖。
152
- - 如果用户明确传入 \`--force-rescan\`,允许覆盖,但仍需写入新的 \`source_commit\` 和 \`updated_at\`。
57
+ 1. grep/rg 搜索(\`@Entity\`、\`schema.prisma\`、\`models.py\` 等),**禁止读源码全文**
58
+ 2. Schema 只记表名+说明+字段数
59
+ 3. 写入 \`docs/<project>/scan/ARCHITECTURE.md\`
60
+ 4. 包含 \`## 技术栈\` \`## 架构概览\` \`## 数据模型(摘要)\`
153
61
 
154
- ### 子代理上下文注入
155
- 启动每个子代理前,将以下信息拼入子代理 prompt:
156
- - 项目名(直接用实际项目名)
157
- - 目标文件路径(从 workflow YAML 中 \`<project>\` 替换后的路径)
158
- - 检查要求(从 workflow YAML 中该角色的 checks)
159
- - 断点续扫步骤列出的缺失文档列表
160
- - 环境探测结果摘要(如有 _env-detect.md,直接贴入)
161
- - **⚠️ 必须强调:子代理必须用 write 工具将文件写入磁盘**
62
+ ### 输出
63
+ ARCHITECTURE.md 路径
162
64
 
163
- ### 完成后
164
- 列出每个项目的 7 份文档状态:
165
- - ARCHITECTURE.md / ❌ 缺失
166
- - ✅ CONVENTIONS.md / ❌ 缺失
167
- - ...`,
168
- outputHint: '7 份文档生成状态(含 workflow 检查报告)',
65
+ ### 注意
66
+ - 路径用反引号,不编造`,
67
+ outputHint: 'ARCHITECTURE.md 路径',
169
68
  optional: false
170
69
  },
171
70
  {
172
- name: '生成本地配置',
173
- prompt: `自动生成 local.yaml 本地配置文件。
71
+ name: '深度扫描 — 代码约定',
72
+ prompt: `扫描框架隐形规则 + 实体继承 + 代码风格。参考 _env-detect.md。
174
73
 
175
74
  ### 操作
176
- 1. 检查 {SPEC_ROOT}/local.yaml 是否已存在,已存在则跳过(提示"local.yaml 已存在,跳过生成")
177
- 2. 根据项目类型生成默认配置:
178
- - **Node.js**(有 package.json):build: "npm run build", test: "npm test", lint: "npm run lint", type: nodejs
179
- - **Maven**(有 pom.xml):build: "mvn compile", test: "mvn test", lint: "mvn checkstyle:check", type: maven
180
- - **Gradle**(有 build.gradle):build: "./gradlew build", test: "./gradlew test", type: gradle
181
- - **通用项目**:只写注释模板, type: generic
182
- 3. 确保目录存在:mkdir -p {SPEC_ROOT}
183
- 4. 原子写入(先写 tmp 文件再 rename)
184
-
185
- ### 文件格式
186
- \`\`\`yaml
187
- # SillySpec 本地配置(自动生成,可手动修改)
188
- project:
189
- type: nodejs # nodejs/maven/gradle/generic
190
-
191
- commands:
192
- build: "npm run build"
193
- test: "npm test"
194
- lint: "npm run lint"
195
-
196
- # 测试策略:full=全量测试, module=只测变更模块, skip=跳过测试
197
- test_strategy: module
198
-
199
- # 模块测试路径映射(可选)
200
- # module_paths:
201
- # user-service: "user/"
202
- # order-service: "order/"
203
- \`\`\`
75
+ 1. grep 搜索拦截器/插件/逻辑删除/基类/审计字段,**禁止读源码全文**
76
+ 2. 根据检测到的语言/框架自行决定搜索什么模式
77
+ 3. 提取 3-5 个典型示例
78
+ 4. 写入 \`docs/<project>/scan/CONVENTIONS.md\`
79
+ 5. 包含 \`## 框架隐形规则\` \`## 实体继承规范\` \`## 代码风格\`
204
80
 
205
81
  ### 输出
206
- local.yaml 生成结果(已存在/已生成)`,
207
- outputHint: 'local.yaml 生成状态',
82
+ CONVENTIONS.md 路径
83
+
84
+ ### 注意
85
+ - 路径用反引号,不编造`,
86
+ outputHint: 'CONVENTIONS.md 路径',
208
87
  optional: false
209
88
  },
210
89
  {
211
- name: '生成模块映射',
212
- perProject: true,
213
- prompt: `生成当前项目的模块索引文件 \`_module-map.yaml\`。
214
-
215
- ### ⚠️ 重要:这个文件是唯一的结构化索引源
216
- 所有结构化事实(paths/tags/entrypoints/depends_on/used_by)只维护在这个文件里。
217
- 模块卡片(modules/*.md)只负责人类语义说明,不重复索引信息。
90
+ name: '深度扫描 — 目录结构和集成',
91
+ prompt: `扫描目录结构 + 外部集成。参考 _env-detect.md。
218
92
 
219
93
  ### 操作
220
- 对扫描列表中的每个项目分别执行:
221
- 1. 检查 \`{DOCS_ROOT}/modules/_module-map.yaml\` 是否已存在,已存在则跳过
222
- 2. 分析项目源码目录结构,识别模块划分:
223
- - \`find . -maxdepth 3 -type d -not -path "*/node_modules/*" -not -path "*/.git/*"\` 查看目录结构
224
- - 每个有明确职责的独立目录识别为一个模块
225
- - 路径用 glob 模式
226
- 3. 用 grep/rg 分析每个模块:
227
- - \`main_symbols\`:模块导出的主要函数/类/常量(grep export / module.exports / def / class)
228
- - \`entrypoints\`:对外 API 端点或命令入口(grep route / router / @Controller / @GetMapping 等)
229
- - \`tags\`:模块相关关键词标签
230
- - \`aliases\`:模块的别名(其他开发者可能怎么称呼这个模块)
231
- 4. 分析跨模块依赖关系:
232
- - 用 grep import/require 分析模块间的引用链
233
- - 填充 depends_on(本模块依赖谁)和 used_by(谁依赖本模块)
234
- 5. 生成 \`{DOCS_ROOT}/modules/_module-map.yaml\`
235
- 6. 如果 modules/ 目录不存在,先创建
236
- 7. 原子写入(先写 tmp 文件再 rename)
237
-
238
- ### YAML 格式
239
- \`\`\`yaml
240
- schema_version: 1
241
- project: <project-name>
242
- source_commit: <git-head-short>
243
- generated_at: <now-datetime>
244
- generator: sillyspec-scan
245
-
246
- modules:
247
- <module-id>:
248
- status: active
249
- doc: modules/<module-id>.md
250
- paths:
251
- - <glob-pattern>
252
- tags:
253
- - <tag1>
254
- - <tag2>
255
- aliases:
256
- - <alias1>
257
- entrypoints:
258
- - <exported-symbol-or-api-endpoint>
259
- main_symbols:
260
- - <exported-class-or-function>
261
- depends_on:
262
- - <other-module-id>
263
- used_by:
264
- - <other-module-id>
265
- needs_review: false
266
- concerns: []
267
- review_reasons: []
268
- \`\`\`
269
-
270
- ### 示例
271
- \`\`\`yaml
272
- schema_version: 1
273
- project: multi-agent-platform
274
- source_commit: abc1234
275
- generated_at: 2026-06-02 22:00:00
276
- generator: sillyspec-scan
277
-
278
- modules:
279
- auth-service:
280
- status: active
281
- doc: modules/auth-service.md
282
- paths:
283
- - src/modules/auth/**
284
- - src/middleware/auth.js
285
- tags:
286
- - auth
287
- - jwt
288
- - rbac
289
- - middleware
290
- aliases:
291
- - login
292
- - token
293
- - authentication
294
- entrypoints:
295
- - authenticate
296
- - authorize
297
- - signToken
298
- - refreshToken
299
- main_symbols:
300
- - AuthService
301
- - AuthController
302
- - hashPassword
303
- - verifyPassword
304
- depends_on:
305
- - users
306
- - redis
307
- used_by:
308
- - api-routes
309
- - admin-routes
310
- needs_review: false
311
- concerns: []
312
- review_reasons: []
313
- \`\`\`
314
-
315
- ### 关键规则
316
- - module-id 用 kebab-case(如 auth-service)
317
- - depends_on / used_by 引用其他模块的 module-id
318
- - tags 和 aliases 用于 brainstorm 阶段的需求→模块匹配,尽量覆盖开发者可能用的词
319
- - entrypoints 和 main_symbols 用于 execute 阶段快速定位源码
320
- - 不要编造无法从源码 grep 到的符号
321
- - 如果无法确定依赖关系,depends_on/used_by 留空列表,不要猜
94
+ 1. 用 find/ls/tree 和 grep,**禁止读源码全文**
95
+ 2. 搜索 API 调用、MQ 配置、缓存、第三方 SDK
96
+ 3. 写入 \`docs/<project>/scan/STRUCTURE.md\`(目录树+模块说明)
97
+ 4. 写入 \`docs/<project>/scan/INTEGRATIONS.md\`(按类型分组)
322
98
 
323
99
  ### 输出
324
- _module-map.yaml 生成结果(已存在/已生成/模块列表)`,
325
- outputHint: '_module-map.yaml 生成状态',
326
- optional: true
327
- },
328
- {
329
- name: '生成模块卡片文档',
330
- perProject: true,
331
- prompt: `根据当前项目的 \`_module-map.yaml\` 生成模块卡片文档。
332
-
333
- ### ⚠️ 重要:模块卡片只负责人类语义说明
334
- 结构化索引(paths/tags/entrypoints/depends_on/used_by)已经在 _module-map.yaml 里维护。
335
- 卡片里不要重复这些信息,只写 _module-map.yaml 无法表达的语义内容。
336
-
337
- ### 操作
338
- 对扫描列表中的每个项目分别执行:
339
- 1. 读取 \`{DOCS_ROOT}/modules/_module-map.yaml\`,获取模块列表和路径
340
- 2. 检查 \`{DOCS_ROOT}/modules/\` 下已有的模块文档(<module>.md)
341
- 3. 列出每个模块的状态:已有文档 / 缺失
342
- 4. **如果有覆盖风险(已有模块文档会被覆盖),必须暂停等待用户**:
343
- - 展示模块列表及现有文档状态
344
- - 明确提供选项:**为缺失模块生成初始文档** / **全部重新生成(覆盖已有)** / **跳过**
345
- - 调用:\`sillyspec run scan --wait --reason "检测到已有模块文档覆盖风险" --options "只生成缺失,全部重新生成,跳过" --output "受影响模块列表"\`
346
- 5. **如果没有覆盖风险(全部都是缺失模块),正常完成即可,不需要等待。**
347
-
348
- ### 生成方法(子代理并行,只针对用户选中的模块)
349
- **你必须为每个模块启动独立子代理执行,不要自己写文档。**
350
-
351
- 每个子代理的 prompt(**主 agent 启动前必须拼入**:
352
- - 模块名和路径(从 _module-map.yaml 读取)
353
- - 环境探测结果摘要(构建工具、语言框架)
354
- - scan 文档关键信息摘要(ARCHITECTURE.md 的技术栈、CONVENTIONS.md 的代码风格要点,如已生成)
355
- \`\`\`
356
- 模块名:<module-id>
357
- 模块路径:<glob patterns>
358
- 目标文件:{DOCS_ROOT}/modules/<module-id>.md
359
-
360
- 操作:
361
- 1. 用 grep/rg 搜索模块路径范围内的源码(禁止读源码全文)
362
- 2. 提取:模块职责、对外接口、关键逻辑、注意事项
363
- 3. 按以下模板写入目标文件:
364
-
365
- ---
366
- schema_version: 1
367
- doc_type: module-card
368
- module_id: <module-id>
369
- ---
100
+ STRUCTURE.md 和 INTEGRATIONS.md 路径
370
101
 
371
- # <module-id>
372
-
373
- ## 定位
374
- (负责什么,不负责什么 — 明确边界)
375
-
376
- ## 契约摘要
377
- (核心能力列表,具体导出符号以 _module-map.yaml 的 entrypoints/main_symbols 为准)
378
-
379
- ## 关键逻辑
380
- (最核心的流程摘要,用 text 伪代码,不超过 3-5 行)
381
-
382
- ## 注意事项
383
- (维护提醒、已知限制、修改时需同步检查的模块)
384
-
385
- ## 人工备注
386
-
387
- <!-- MANUAL_NOTES_START -->
388
-
389
- <!-- MANUAL_NOTES_END -->
390
-
391
- 规则:
392
- - 不要编造接口或依赖,只写 grep/rg 能搜到的
393
- - 目标长度:500-1000 字 / 80-150 行
394
- - 如果模块特别复杂(状态机、多角色交互、复杂领域规则),可以在 modules/details/ 下生成扩展文档(如 details/<module-id>-flow.md),agent 默认不读
395
- - 不要重复 _module-map.yaml 中的索引信息
396
- - 不要写设计决策表、完整依赖表、变更索引长表
397
- - 人工备注区域保持空标记,留给用户填写
398
- \`\`\`
399
-
400
- 等待所有子代理完成,验证文件是否生成且非空。
401
-
402
- ### 输出
403
- 已生成的模块文档路径列表`,
404
- outputHint: '模块文档生成状态',
405
- optional: true
406
- },
407
- {
408
- name: '生成业务流程和术语表(可选)',
409
- perProject: true,
410
- prompt: `根据当前项目的模块依赖关系和源码,生成跨模块业务流程文档和术语表。
411
-
412
- ⚠️ 这一步是可选的。如果项目模块简单、流程不明显,可以跳过。
413
-
414
- ### flows/ 目录
415
- 目标目录:\`{DOCS_ROOT}/flows/\`
416
-
417
- 根据 _module-map.yaml 中的模块依赖关系,识别跨模块业务流程:
418
- 1. 读取 \`_module-map.yaml\`,分析 used_by 链条
419
- 2. 用 grep/rg 搜索路由定义、API 端点、事件处理
420
- 3. 识别跨模块的完整业务流程(如登录→下单→支付)
421
- 4. 每个流程生成一个文件:\`flows/<flow-name>.md\`
422
-
423
- 文件格式:
424
- \`\`\`markdown
425
- # <flow-name>
426
-
427
- ## 目标
428
- (一句话描述这个流程的业务目的)
429
-
430
- ## 参与模块
431
- - module-a:做什么
432
- - module-b:做什么
433
-
434
- ## 流程摘要
435
- \`\`\`text
436
- step1 → step2 → step3
437
- \`\`\`
438
-
439
- ## 失败回滚
440
- | 失败点 | 处理 |
441
- |---|---|
442
- \`\`\`
443
-
444
- ### glossary.md
445
- 目标文件:\`{DOCS_ROOT}/glossary.md\`
446
-
447
- 提取项目专有术语:
448
- 1. 用 grep 搜索 TODO/FIXME 注释中的术语定义
449
- 2. 从数据库表注释提取
450
- 3. 从 README 和文档中提取定义段落
451
-
452
- 文件格式:
453
- \`\`\`markdown
454
- # Glossary
455
-
456
- ## Session
457
- 在本项目中,session 指...(项目内特殊含义)
458
-
459
- ## Order
460
- 订单主实体,代表...(业务定义)
461
- \`\`\`
462
-
463
- ### 操作
464
- 1. 分析模块依赖关系,识别可能的业务流程
465
- 2. 如果发现 2+ 个跨模块流程,生成 flows/ 文档
466
- 3. 提取术语生成 glossary.md
467
- 4. 如果没有明显的流程或术语,跳过此步
468
-
469
- ### 输出
470
- 生成的文件路径列表(或"已跳过")`,
471
- outputHint: '流程和术语表生成状态',
472
- optional: true
102
+ ### 注意
103
+ - 路径用反引号,不编造`,
104
+ outputHint: 'STRUCTURE.md + INTEGRATIONS.md 路径',
105
+ optional: false
473
106
  },
474
107
  {
475
- name: 'Extract Project Knowledge',
476
- perProject: true,
477
- prompt: `从本次 scan 产物中提取长期有效、跨变更复用的项目知识,写入知识库。
478
-
479
- ### 知识分类
480
- | 文件 | 内容 |
481
- |------|------|
482
- | conventions.md | 项目约定:目录规范、命名规范、提交规范、测试规范 |
483
- | patterns.md | 可复用模式:鉴权方式、错误处理方式、模块组织方式 |
484
- | known-issues.md | 已知坑:不可直接改的模块、历史兼容问题、代理限制 |
485
- | uncategorized.md | 不确定分类、需要人工确认的知识 |
486
-
487
- INDEX.md 维护索引,格式(每行:关键词1|关键词2 → [条目名](文件#锚点);关键词用于 execute 阶段命中匹配,必须给出能区分该知识的词):
488
- \`\`\`markdown
489
- # Knowledge Index
490
-
491
- ## Conventions
492
- - ESM|module|import → [ESM Only](conventions.md#esm-only)
493
- \`\`\`
494
-
495
- ### ⛔ 硬规则(必须遵守)
496
- 1. **只写未来变更会反复用到的知识** — 不要把 scan 报告摘要塞进知识库
497
- 2. **不要重复 knowledge 文件中已有的内容** — 读取现有文件,追加新条目,不覆盖
498
- 3. **不确定分类或不确定长期有效 → uncategorized.md** — 宁可不确定也不要放错
499
- 4. **每个正式分类条目必须更新 INDEX.md** — 添加对应分类下的链接
500
- 5. **每个条目用 markdown 锚点格式** — 文件内用 \`## 标题\`,INDEX 用 \`[#标题]\` 或 \`(文件名#标题)\`
108
+ name: '深度扫描 测试和债务',
109
+ prompt: `扫描测试现状 + 技术债务 + 项目概览。参考 _env-detect.md。
501
110
 
502
111
  ### 操作
503
- 1. 读取现有 knowledge 文件:\`{KNOWLEDGE_ROOT}/INDEX.md\`、\`{KNOWLEDGE_ROOT}/conventions.md\` 等
504
- 2. 遍历 scan 产物(\`{DOCS_ROOT}/scan/*.md\`、\`{DOCS_ROOT}/modules/*.md\`),识别可复用知识
505
- 3. 将新知识按分类写入对应文件(追加模式,不覆盖已有内容)
506
- 4. 更新 INDEX.md 索引
507
- 5. 如果确实没有新知识可提取(已有文件已覆盖),输出"无新知识"而非创建空条目
112
+ 1. grep 搜索测试文件、TODO/FIXME、过时依赖,**禁止读源码全文**
113
+ 2. 写入 \`docs/<project>/scan/TESTING.md\`(测试结构)
114
+ 3. 写入 \`docs/<project>/scan/CONCERNS.md\`(按严重程度分组)
115
+ 4. 写入 \`docs/<project>/scan/PROJECT.md\`(项目信息)
508
116
 
509
117
  ### 输出
510
- 新增知识条目数量 + 分类分布(或"无新知识")`,
511
- outputHint: '知识条目数量',
118
+ TESTING.md、CONCERNS.md、PROJECT.md 路径`,
119
+ outputHint: '三份文档路径',
512
120
  optional: false
513
121
  },
514
122
  {
515
123
  name: '自检和提交',
516
- perProject: true,
517
- prompt: `验证当前项目的扫描完整性,清理并提交。
124
+ prompt: `验证扫描完整性,清理并提交。
518
125
 
519
126
  ### 操作
520
- 对扫描列表中的每个项目分别执行:
521
- 1. 检查 7 份 scan 文档是否全部生成(\`{DOCS_ROOT}/scan/\`)
522
- 2. 检查模块文档状态(\`{DOCS_ROOT}/modules/\`)
523
- 3. 自检门控:ARCHITECTURE(技术栈+Schema摘要)、CONVENTIONS(隐形规则+代码风格)、STRUCTURE(目录结构)、INTEGRATIONS(外部依赖)、TESTING(测试现状)、CONCERNS(技术债务)、PROJECT(项目概览)
524
- 4. 检查 flows/ 和 glossary.md 是否已生成(如有)
525
- 5. 清理:\`rm -f {DOCS_ROOT}/scan/_env-detect.md\`
526
- 6. 如果非平台模式:\`git add .sillyspec/\` — 暂存扫描结果(不要 commit,由用户通过统一提交工具处理)。如果平台模式:跳过 git add(specRoot 不在 sourceRoot 的 git repo 内)。
527
-
528
- ### ⛔ 路径合规检查(平台模式下必须执行)
529
- 7. 确认所有文档都写入 \`{DOCS_ROOT}/\`(spec-root 下),**而非源码目录下的 .sillyspec/**
530
- 8. 检查是否出现 tool_use_error 或 API Error 未恢复
531
- 9. 检查 7 份文档 header 是否包含 author 和 created_at
532
- 10. 检查 local.yaml 中 commands 是否在 package.json scripts 中真实存在,不存在的必须标记 unavailable
533
-
534
- ### ⛔ API 错误处理
535
- - 遇到 API Error 529(服务过载)或 rate_limit 时,**停止当前操作并报告**,不要自动重试
536
- - 遇到 tool_use_error 时,记录错误信息并跳过该文件/操作,继续处理下一项
537
- - 如果连续 3 次操作失败,输出失败摘要并停止
538
-
539
- ### ⛔ 最终状态判定
540
- 如果出现以下**任意**情况,最终状态**不能**写"全部通过",只能写 \`completed_with_warnings\` 或 \`failed_post_check\`:
541
- - 源码目录下存在 docs(路径合规检查失败)
542
- - source_commit 为 null
543
- - Write 工具出现过失败
544
- - API Error 529 或 rate_limit
545
- - fallback / retry / skipped validation
546
- - 文档引用不存在的文件或模块
547
- - 文档内容包含 .sillyspec/ 等工具目录的扫描结果
127
+ 1. 检查 7 份文档是否全部生成
128
+ 2. 自检门控:ARCHITECTURE(技术栈+Schema摘要)、CONVENTIONS(隐形规则+代码风格)、STRUCTURE(目录结构)、INTEGRATIONS(外部依赖)、TESTING(测试现状)、CONCERNS(技术债务)、PROJECT(项目概览)
129
+ 3. 清理:\`rm -f docs/<project>/scan/_env-detect.md\`
130
+ 4. \`git add .\` — **不要 commit**,由用户通过统一提交工具处理
548
131
 
549
132
  ### 输出
550
- 每个项目的扫描完整性报告(必须包含路径合规检查结果和最终状态)
133
+ 扫描完整性报告
551
134
 
552
135
  ### 注意
553
136
  - ❌ 修改代码 / 编造路径 / 读源码全文`,
@@ -11,7 +11,7 @@ export const definition = {
11
11
  ### 操作
12
12
  1. \`cat .sillyspec/PROJECT.md 2>/dev/null || echo "未初始化"\`
13
13
  2. 获取 project 名
14
- 3. \`ls .sillyspec/docs/<project>/scan/ 2>/dev/null | head -10\`
14
+ 3. \`ls docs/<project>/scan/ 2>/dev/null | head -10\`
15
15
  4. \`cat .sillyspec/REQUIREMENTS.md 2>/dev/null | head -20\`
16
16
  5. \`cat .sillyspec/ROADMAP.md 2>/dev/null\`
17
17