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
@@ -18,10 +18,9 @@ export const definition = {
18
18
  for d in .sillyspec .sillyspec/projects .sillyspec/docs .sillyspec/changes .sillyspec/.runtime; do
19
19
  [ -d "$d" ] && echo "✅ $d" || echo "❌ $d"
20
20
  done
21
- # 检查 sillyspec.db(SQLite 权威状态源)
22
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
23
- [ -f "$DB_FILE" ] && echo "sillyspec.db 存在" || echo " sillyspec.db 不存在"
24
- sqlite3 "$DB_FILE" "SELECT count(*) FROM project" 2>/dev/null && echo "✅ sillyspec.db 可查询" || echo "⚠️ sillyspec.db 不可查询"
21
+ # 检查 progress.json
22
+ [ -f .sillyspec/.runtime/progress.json ] && echo "✅ progress.json 存在" || echo "❌ progress.json 不存在"
23
+ node -e "JSON.parse(require('fs').readFileSync('.sillyspec/.runtime/progress.json','utf8')); console.log('progress.json 可解析')" 2>/dev/null || echo "⚠️ progress.json 不可解析"
25
24
  \`\`\`
26
25
 
27
26
  ### 2. 项目配置检查
@@ -41,31 +40,40 @@ done
41
40
 
42
41
  ### 3. 进度数据一致性
43
42
  \`\`\`bash
44
- # sillyspec.db 读取活跃变更并检查目录存在性
45
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
46
- if [ ! -f "$DB_FILE" ]; then echo "⚠️ sillyspec.db 不存在"; exit 0; fi
47
- ACTIVE_CHANGE=$(sqlite3 "$DB_FILE" "SELECT name FROM changes WHERE status='active' ORDER BY last_active DESC LIMIT 1" 2>/dev/null)
48
- if [ -z "$ACTIVE_CHANGE" ]; then echo "ℹ️ 无当前变更"; exit 0; fi
49
- echo "当前变更: $ACTIVE_CHANGE"
50
- DIR=".sillyspec/changes/$ACTIVE_CHANGE"
51
- [ -d "$DIR" ] && echo "✅ 变更目录存在: $ACTIVE_CHANGE" || echo "❌ 变更目录不存在: $ACTIVE_CHANGE"
52
- # 检查各阶段状态
53
- sqlite3 -header -column "$DB_FILE" "SELECT stage, status FROM stages s JOIN changes c ON s.change_id=c.id WHERE c.name='$ACTIVE_CHANGE' ORDER BY s.stage" 2>/dev/null || echo "⚠️ 无法查询阶段数据"
43
+ # 读取 currentChange 并检查目录存在性
44
+ node -e "
45
+ const p = JSON.parse(require('fs').readFileSync('.sillyspec/.runtime/progress.json','utf8'));
46
+ const cc = p.currentChange;
47
+ if (!cc) { console.log('ℹ️ 无当前变更'); process.exit(0); }
48
+ const dir = '.sillyspec/changes/' + cc;
49
+ const exists = require('fs').existsSync(dir);
50
+ console.log(exists ? '✅ currentChange 目录存在: ' + cc : '❌ currentChange 目录不存在: ' + cc);
51
+ // 检查各阶段产出
52
+ const stages = p.stages || {};
53
+ for (const [name, sd] of Object.entries(stages)) {
54
+ if (sd.status === 'completed' && sd.steps.length > 0) {
55
+ const hasOutput = sd.steps.some(s => s.output && s.output.trim());
56
+ console.log(' ' + name + ': ' + (hasOutput ? '✅ 有产出' : '⚠️ 已完成但无产出记录'));
57
+ }
58
+ }
59
+ " 2>/dev/null || echo "⚠️ 无法读取 progress.json"
54
60
  \`\`\`
55
61
 
56
62
  ### 4. 孤儿文件检查
57
63
  \`\`\`bash
58
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
59
- if [ ! -f "$DB_FILE" ]; then echo "⚠️ sillyspec.db 不存在"; exit 0; fi
60
64
  node -e "
61
65
  const fs = require('fs');
62
66
  const dir = '.sillyspec/changes';
63
67
  if (!fs.existsSync(dir)) { console.log('ℹ️ changes/ 目录不存在'); process.exit(0); }
64
68
  const subs = fs.readdirSync(dir).filter(f => fs.statSync(dir+'/'+f).isDirectory());
65
69
  if (subs.length === 0) { console.log('ℹ️ 无变更目录'); process.exit(0); }
66
- const { execSync } = require('child_process');
67
- let known;
68
- try { const rows = execSync('sqlite3 -json \".sillyspec/.runtime/sillyspec.db\" \"SELECT name FROM changes WHERE status=\\\"active\\\"\"', {encoding:'utf8'}).trim(); known = new Set(JSON.parse(rows).map(r => r.name)); } catch { known = new Set(); }
70
+ let progress;
71
+ try { progress = JSON.parse(fs.readFileSync('.sillyspec/.runtime/progress.json','utf8')); } catch { console.log('⚠️ 无法读取 progress.json'); subs.forEach(s => console.log('❓ ' + s)); process.exit(0); }
72
+ const known = new Set();
73
+ if (progress.currentChange) known.add(progress.currentChange);
74
+ for (const sd of Object.values(progress.stages || {})) {
75
+ (sd.steps || []).forEach(s => { if (s.output) known.add(s.output); });
76
+ }
69
77
  subs.forEach(s => {
70
78
  console.log(known.has(s) ? '✅ ' + s + ' — 已关联' : '⚠️ ' + s + ' — 孤儿目录(可清理)');
71
79
  });
@@ -84,54 +92,13 @@ for f in .sillyspec/projects/*.yaml; do
84
92
  stack_md="$p/.sillyspec/STACK.md"
85
93
  [ -f "$local_yaml" ] && echo "✅ local.yaml ($name)" || echo "⚠️ local.yaml ($name) — 不存在"
86
94
  if [ -f "$local_yaml" ]; then
95
+ grep -q 'build:' "$local_yaml" && echo " ✅ build 命令已配置" || echo " ⚠️ 缺少 build 命令"
87
96
  grep -q 'test:' "$local_yaml" && echo " ✅ test 命令已配置" || echo " ⚠️ 缺少 test 命令"
88
97
  fi
89
98
  [ -f "$stack_md" ] && echo "✅ STACK.md ($name)" || echo "⚠️ STACK.md ($name) — 不存在"
90
99
  done
91
100
  \`\`\`
92
101
 
93
- ### 6. Worktree 隔离环境检查
94
- \`\`\`bash
95
- # 检测当前目录是否在 submodule 中
96
- SUPERPROJECT=$(git rev-parse --show-superproject-working-tree 2>/dev/null)
97
- if [ -n "$SUPERPROJECT" ]; then
98
- echo "⚠️ 当前目录在 git submodule 内,worktree 隔离不可用"
99
- else
100
- echo "✅ 不在 submodule 中"
101
- fi
102
-
103
- # 检测是否已在 linked worktree 中
104
- GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
105
- GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
106
- if [ "$GIT_DIR" != "$GIT_COMMON" ] && [ -z "$SUPERPROJECT" ]; then
107
- echo "✅ 已在 linked worktree 中"
108
- else
109
- echo "ℹ️ 在主仓库中(非 worktree)"
110
- fi
111
-
112
- # 检查 worktree 存储目录是否被 .gitignore 忽略
113
- WT_DIR='.sillyspec/.runtime/worktrees'
114
- if git check-ignore -q "$WT_DIR" 2>/dev/null; then
115
- echo "✅ worktree 目录已被 .gitignore 忽略 ($WT_DIR)"
116
- else
117
- echo "❌ worktree 目录未被 .gitignore 忽略 ($WT_DIR) — worktree 创建将被阻断"
118
- echo " 修复: 在 .gitignore 中添加 $WT_DIR/"
119
- fi
120
-
121
- # 检查 DB 中的 isolation 状态
122
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
123
- if [ -f "$DB_FILE" ]; then
124
- echo ""
125
- echo "isolation 状态(来自 sillyspec.db):"
126
- sqlite3 -header -column "$DB_FILE" "SELECT name, isolation_status AS status, isolation_mode AS mode, isolation_reason AS reason FROM changes WHERE status='active'" 2>/dev/null || echo "⚠️ 查询 isolation 失败"
127
- else
128
- echo ""
129
- echo "ℹ️ sillyspec.db 不存在(尚未初始化)"
130
- fi
131
- else
132
- echo "ℹ️ gate-status.json 不存在(尚未进入 execute 阶段)"
133
- fi
134
- \`\`\`\n
135
102
  ### 输出
136
103
  汇总所有检查结果,按以下格式:
137
104
  \`\`\`
@@ -141,7 +108,16 @@ fi
141
108
 
142
109
  ### 注意
143
110
  - 不要编造路径或结果,严格基于命令输出
144
- - 如果 .sillyspec/ 不存在,直接输出 ❌ 并跳过后续检查`,
111
+ - 如果 .sillyspec/ 不存在,直接输出 ❌ 并跳过后续检查
112
+ - 额外运行 deriveState 全量校验:
113
+ \
114
+ \
115
+ \
116
+ node -e "import('./src/derive.js').then(m => { const pm = require('./progress.js'); const r = m.deriveState('.', {mode:'full',fix:false,progress:pm.read('.')}); console.log(JSON.stringify(r, null, 2)); })" 2>/dev/null || echo "deriveState 不可用"
117
+ \
118
+ \
119
+ \
120
+ 将 deriveState 的 issues 列表纳入 SillySpec 内部检查结果中`,
145
121
  outputHint: 'SillySpec 内部检查结果',
146
122
  optional: false
147
123
  },
@@ -151,12 +127,12 @@ fi
151
127
 
152
128
  ### 1. 探测构建工具
153
129
  \`\`\`bash
154
- # 确定项目路径(使用 sillyspec.db 中的项目路径或当前目录)
155
- PROJECT_DIR=$(sqlite3 -json '.sillyspec/.runtime/sillyspec.db' "SELECT name FROM project WHERE id=1" 2>/dev/null | node -e "const r=JSON.parse(require('fs').readFileSync(0,'utf8'));console.log(r.length>0&&r[0].name?r[0].name:'.')" 2>/dev/null || node -e "
130
+ # 确定项目路径(使用 progress.json 中的项目或当前目录)
131
+ PROJECT_DIR=$(node -e "
156
132
  const fs=require('fs');
157
- try{const files=fs.readdirSync('.sillyspec/projects').filter(f=>f.endsWith('.yaml'));
133
+ try{const p=JSON.parse(fs.readFileSync('.sillyspec/.runtime/progress.json','utf8'));if(p.project){console.log(p.project);process.exit(0)}}catch{}
134
+ const files=fs.readdirSync('.sillyspec/projects').filter(f=>f.endsWith('.yaml'));
158
135
  if(files.length>0){const c=fs.readFileSync('.sillyspec/projects/'+files[0],'utf8');const m=c.match(/^path:\\s*(.+)/m);console.log(m?m[1].trim():'.')}else console.log('.')
159
- }catch{console.log('.')}
160
136
  " 2>/dev/null)
161
137
  echo "项目目录: $PROJECT_DIR"
162
138
 
@@ -279,38 +255,9 @@ timeout 5 which docker 2>/dev/null && echo "✅ Docker 可用" || echo "ℹ️ D
279
255
  outputHint: '外部依赖检查结果',
280
256
  optional: false
281
257
  },
282
- {
283
- name: '模块文档健康检查',
284
- prompt: `检查模块索引和卡片文档的健康状态。
285
-
286
- ### 操作
287
- 1. 运行 \`sillyspec modules status\` 查看模块索引概览
288
- 2. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
289
- 3. 对每个模块,检查:
290
- - module_id 是否有对应的卡片文件(modules/<module-id>.md)
291
- - 卡片文件是否有有效的 frontmatter(schema_version, doc_type, module_id)
292
- - 人工备注标记是否配对(MANUAL_NOTES_START 和 MANUAL_NOTES_END 必须成对出现)
293
- - needs_review 为 true 的模块列表
294
- 4. 汇总结果
295
-
296
- ### 输出格式
297
- \`\`\`
298
- 📋 模块文档健康检查
299
- ✅ _module-map.yaml — 存在,N 个模块
300
- ⚠️ auth-service — needs_review=true,原因:...
301
- ❌ payment-service — 卡片文件缺失
302
- ✅ 所有模块人工备注标记配对正常
303
- \`\`\`
304
-
305
- ### 注意
306
- - 如果 _module-map.yaml 不存在,输出"模块索引未生成,建议运行 scan"
307
- `,
308
- outputHint: '模块文档健康状态',
309
- optional: false
310
- },
311
258
  {
312
259
  name: '汇总报告',
313
- prompt: `汇总前四步的所有检查结果,生成最终的自检报告。
260
+ prompt: `汇总前三步的所有检查结果,生成最终的自检报告。
314
261
 
315
262
  ### 输出格式
316
263
  \`\`\`
@@ -320,7 +267,7 @@ timeout 5 which docker 2>/dev/null && echo "✅ Docker 可用" || echo "ℹ️ D
320
267
  ✅ .sillyspec/ 目录结构 — 正常
321
268
  ✅ projects/*.yaml — N 个项目已注册
322
269
  ⚠️ local.yaml (xxx) — 缺少 test 命令
323
- sillyspec.db 阶段状态 — brainstorm 标记完成但 design.md 不存在
270
+ progress.json — brainstorm 标记完成但 design.md 不存在
324
271
 
325
272
  ## 构建环境
326
273
  ✅ Node.js v23.4.0 — 可用
@@ -345,9 +292,9 @@ timeout 5 which docker 2>/dev/null && echo "✅ Docker 可用" || echo "ℹ️ D
345
292
  **常见问题及修复:**
346
293
  - CLI 未安装 → \`npm install -g sillyspec\`
347
294
  - 缺少 local.yaml → \`sillyspec init\` 重新生成,或手动创建
348
- - local.yaml 缺少 test 命令 → 补充对应命令
295
+ - local.yaml 缺少 build/test → 补充对应命令
349
296
  - 缺少 STACK.md → \`sillyspec run scan\` 重新扫描
350
- - sillyspec.db 状态不一致 → \`sillyspec run <阶段> --reset\` 重置对应阶段
297
+ - progress.json 不一致 → \`sillyspec run <阶段> --reset\` 重置对应阶段
351
298
  - 孤儿目录 → 确认后 \`rm -rf .sillyspec/changes/<目录名>\`
352
299
  - Maven 私服不可达 → 检查 VPN、settings.xml 配置、私服状态
353
300
  - Git remote 不可达 → 检查网络、SSH key 或凭证