sillyspec 3.27.5 → 3.27.7

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 (1101) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +87 -87
  2. package/.claude/skills/sillyspec-auto/SKILL.md +93 -93
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -114
  4. package/.claude/skills/sillyspec-commit/SKILL.md +67 -67
  5. package/.claude/skills/sillyspec-continue/SKILL.md +47 -47
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +76 -76
  7. package/.claude/skills/sillyspec-execute/SKILL.md +214 -214
  8. package/.claude/skills/sillyspec-explore/SKILL.md +102 -102
  9. package/.claude/skills/sillyspec-export/SKILL.md +57 -57
  10. package/.claude/skills/sillyspec-init/SKILL.md +177 -177
  11. package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
  12. package/.claude/skills/sillyspec-plan/SKILL.md +156 -156
  13. package/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  14. package/.claude/skills/sillyspec-quick/SKILL.md +116 -116
  15. package/.claude/skills/sillyspec-resume/SKILL.md +70 -70
  16. package/.claude/skills/sillyspec-scan/SKILL.md +79 -79
  17. package/.claude/skills/sillyspec-state/SKILL.md +64 -64
  18. package/.claude/skills/sillyspec-status/SKILL.md +54 -54
  19. package/.claude/skills/sillyspec-verify/SKILL.md +87 -87
  20. package/.claude/skills/sillyspec-workspace/SKILL.md +175 -175
  21. package/.claude/skills/verify-per-user/SKILL.md +6 -0
  22. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  23. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  24. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  25. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  26. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  27. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  28. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  29. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  30. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-export/SKILL.md +57 -0
  31. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-init/SKILL.md +177 -0
  32. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  33. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  34. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  35. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  36. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  37. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  38. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-state/SKILL.md +64 -0
  39. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-status/SKILL.md +54 -0
  40. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  41. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  42. package/.worktrees/2c37b1d7/.claude/skills/verify-per-user/SKILL.md +6 -0
  43. package/.worktrees/2c37b1d7/.gitattributes +2 -0
  44. package/.worktrees/2c37b1d7/.husky/pre-push +20 -0
  45. package/.worktrees/2c37b1d7/README.md +203 -0
  46. package/.worktrees/2c37b1d7/SKILL.md +91 -0
  47. package/.worktrees/2c37b1d7/architecture-analysis.md +448 -0
  48. package/.worktrees/2c37b1d7/bin/sillyspec.js +2 -0
  49. package/.worktrees/2c37b1d7/eval/README.md +86 -0
  50. package/.worktrees/2c37b1d7/eval/eval.config.json +28 -0
  51. package/.worktrees/2c37b1d7/eval/lib/adapters/cli.mjs +63 -0
  52. package/.worktrees/2c37b1d7/eval/lib/adapters/dryrun.mjs +27 -0
  53. package/.worktrees/2c37b1d7/eval/lib/config.mjs +82 -0
  54. package/.worktrees/2c37b1d7/eval/lib/db.mjs +76 -0
  55. package/.worktrees/2c37b1d7/eval/lib/report.mjs +120 -0
  56. package/.worktrees/2c37b1d7/eval/lib/runner.mjs +157 -0
  57. package/.worktrees/2c37b1d7/eval/lib/tasks.mjs +73 -0
  58. package/.worktrees/2c37b1d7/eval/lib/util.mjs +107 -0
  59. package/.worktrees/2c37b1d7/eval/lib/workdir.mjs +30 -0
  60. package/.worktrees/2c37b1d7/eval/run.mjs +83 -0
  61. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/files/package.json +6 -0
  62. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  63. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/task.json +6 -0
  64. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/verify.mjs +28 -0
  65. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/package.json +6 -0
  66. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  67. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  68. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/task.json +6 -0
  69. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/verify.mjs +31 -0
  70. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  71. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/package.json +6 -0
  72. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  73. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/task.json +6 -0
  74. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/verify.mjs +38 -0
  75. package/.worktrees/2c37b1d7/logo.jpg +0 -0
  76. package/.worktrees/2c37b1d7/package-lock.json +977 -0
  77. package/.worktrees/2c37b1d7/package.json +41 -0
  78. package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  79. package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  80. package/.worktrees/2c37b1d7/packages/dashboard/dist/favicon.jpg +0 -0
  81. package/.worktrees/2c37b1d7/packages/dashboard/dist/index.html +16 -0
  82. package/.worktrees/2c37b1d7/packages/dashboard/dist/logo.jpg +0 -0
  83. package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-dashboard.html +836 -0
  84. package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-overview.html +256 -0
  85. package/.worktrees/2c37b1d7/packages/dashboard/package.json +25 -0
  86. package/.worktrees/2c37b1d7/packages/dashboard/server/executor.js +95 -0
  87. package/.worktrees/2c37b1d7/packages/dashboard/server/index.js +679 -0
  88. package/.worktrees/2c37b1d7/packages/dashboard/server/parser.js +526 -0
  89. package/.worktrees/2c37b1d7/packages/dashboard/server/watcher.js +357 -0
  90. package/.worktrees/2c37b1d7/src/agent-session-log.js +803 -0
  91. package/.worktrees/2c37b1d7/src/change-list.js +290 -0
  92. package/.worktrees/2c37b1d7/src/change-risk-profile.js +339 -0
  93. package/.worktrees/2c37b1d7/src/check-primitives.js +65 -0
  94. package/.worktrees/2c37b1d7/src/classify-change.js +109 -0
  95. package/.worktrees/2c37b1d7/src/commit-suggest.js +202 -0
  96. package/.worktrees/2c37b1d7/src/config-cat.js +88 -0
  97. package/.worktrees/2c37b1d7/src/config-schema.js +328 -0
  98. package/.worktrees/2c37b1d7/src/constants.js +97 -0
  99. package/.worktrees/2c37b1d7/src/contract-matrix.js +533 -0
  100. package/.worktrees/2c37b1d7/src/datetime.js +20 -0
  101. package/.worktrees/2c37b1d7/src/db-engine.js +55 -0
  102. package/.worktrees/2c37b1d7/src/db.js +381 -0
  103. package/.worktrees/2c37b1d7/src/decision-distill.js +517 -0
  104. package/.worktrees/2c37b1d7/src/dispatch/backends/local-agent.js +155 -0
  105. package/.worktrees/2c37b1d7/src/dispatch/backends/sillyhub-mcp.js +245 -0
  106. package/.worktrees/2c37b1d7/src/dispatch/probe.js +246 -0
  107. package/.worktrees/2c37b1d7/src/dispatch/strategy.js +121 -0
  108. package/.worktrees/2c37b1d7/src/docs-check.js +825 -0
  109. package/.worktrees/2c37b1d7/src/docs-debt.js +393 -0
  110. package/.worktrees/2c37b1d7/src/docs-gate.js +107 -0
  111. package/.worktrees/2c37b1d7/src/doctor-diagnostics.js +1099 -0
  112. package/.worktrees/2c37b1d7/src/endpoint-extractor.js +409 -0
  113. package/.worktrees/2c37b1d7/src/foreign-declared.js +155 -0
  114. package/.worktrees/2c37b1d7/src/fs-atomic.js +73 -0
  115. package/.worktrees/2c37b1d7/src/git-helper.js +150 -0
  116. package/.worktrees/2c37b1d7/src/hooks/claude-pre-tool-use.cjs +130 -0
  117. package/.worktrees/2c37b1d7/src/hooks/worktree-guard.js +892 -0
  118. package/.worktrees/2c37b1d7/src/index.js +2854 -0
  119. package/.worktrees/2c37b1d7/src/init.js +626 -0
  120. package/.worktrees/2c37b1d7/src/knowledge-match.js +231 -0
  121. package/.worktrees/2c37b1d7/src/local-detect.js +128 -0
  122. package/.worktrees/2c37b1d7/src/local-register.js +104 -0
  123. package/.worktrees/2c37b1d7/src/machine-interface.js +543 -0
  124. package/.worktrees/2c37b1d7/src/migrate.js +127 -0
  125. package/.worktrees/2c37b1d7/src/module-impact.js +166 -0
  126. package/.worktrees/2c37b1d7/src/module-resolve.js +222 -0
  127. package/.worktrees/2c37b1d7/src/modules.js +580 -0
  128. package/.worktrees/2c37b1d7/src/plan-adopt-waves.js +126 -0
  129. package/.worktrees/2c37b1d7/src/progress/change-registry.js +336 -0
  130. package/.worktrees/2c37b1d7/src/progress/consistency-doctor.js +355 -0
  131. package/.worktrees/2c37b1d7/src/progress/shared.js +36 -0
  132. package/.worktrees/2c37b1d7/src/progress/stage-machine.js +594 -0
  133. package/.worktrees/2c37b1d7/src/progress/step-store.js +265 -0
  134. package/.worktrees/2c37b1d7/src/progress.js +1304 -0
  135. package/.worktrees/2c37b1d7/src/quick-recommend.js +115 -0
  136. package/.worktrees/2c37b1d7/src/quicklog.js +883 -0
  137. package/.worktrees/2c37b1d7/src/review-tier.js +77 -0
  138. package/.worktrees/2c37b1d7/src/run/command.js +1641 -0
  139. package/.worktrees/2c37b1d7/src/run/complete-handlers.js +1552 -0
  140. package/.worktrees/2c37b1d7/src/run/complete.js +1259 -0
  141. package/.worktrees/2c37b1d7/src/run/concurrent-detect.js +156 -0
  142. package/.worktrees/2c37b1d7/src/run/gates.js +1111 -0
  143. package/.worktrees/2c37b1d7/src/run/multi-repo-context.js +208 -0
  144. package/.worktrees/2c37b1d7/src/run/next.js +128 -0
  145. package/.worktrees/2c37b1d7/src/run/prompt.js +843 -0
  146. package/.worktrees/2c37b1d7/src/run/quick-audit.js +186 -0
  147. package/.worktrees/2c37b1d7/src/run/scan-profile.js +269 -0
  148. package/.worktrees/2c37b1d7/src/run/shared.js +1562 -0
  149. package/.worktrees/2c37b1d7/src/run/stage.js +587 -0
  150. package/.worktrees/2c37b1d7/src/run.js +23 -0
  151. package/.worktrees/2c37b1d7/src/scan-diff.js +388 -0
  152. package/.worktrees/2c37b1d7/src/scan-postcheck.js +524 -0
  153. package/.worktrees/2c37b1d7/src/scan-staleness.js +95 -0
  154. package/.worktrees/2c37b1d7/src/setup.js +414 -0
  155. package/.worktrees/2c37b1d7/src/sillyhub-mcp/client.js +597 -0
  156. package/.worktrees/2c37b1d7/src/sillyhub-mcp/config.js +62 -0
  157. package/.worktrees/2c37b1d7/src/spec-dir-typo.js +50 -0
  158. package/.worktrees/2c37b1d7/src/spec-sync.js +358 -0
  159. package/.worktrees/2c37b1d7/src/stage-contract-engine.js +171 -0
  160. package/.worktrees/2c37b1d7/src/stage-contract-spec.js +551 -0
  161. package/.worktrees/2c37b1d7/src/stage-contract.js +948 -0
  162. package/.worktrees/2c37b1d7/src/stage-review.js +597 -0
  163. package/.worktrees/2c37b1d7/src/stages/archive.js +199 -0
  164. package/.worktrees/2c37b1d7/src/stages/brainstorm-auto.js +285 -0
  165. package/.worktrees/2c37b1d7/src/stages/brainstorm.js +624 -0
  166. package/.worktrees/2c37b1d7/src/stages/cmd-existence.js +145 -0
  167. package/.worktrees/2c37b1d7/src/stages/doctor.js +540 -0
  168. package/.worktrees/2c37b1d7/src/stages/execute.js +1277 -0
  169. package/.worktrees/2c37b1d7/src/stages/explore.js +43 -0
  170. package/.worktrees/2c37b1d7/src/stages/index.js +29 -0
  171. package/.worktrees/2c37b1d7/src/stages/knowledge.js +514 -0
  172. package/.worktrees/2c37b1d7/src/stages/plan-postcheck.js +1398 -0
  173. package/.worktrees/2c37b1d7/src/stages/plan.js +655 -0
  174. package/.worktrees/2c37b1d7/src/stages/quick.js +167 -0
  175. package/.worktrees/2c37b1d7/src/stages/scan.js +608 -0
  176. package/.worktrees/2c37b1d7/src/stages/status.js +64 -0
  177. package/.worktrees/2c37b1d7/src/stages/verify.js +246 -0
  178. package/.worktrees/2c37b1d7/src/sync.js +1470 -0
  179. package/.worktrees/2c37b1d7/src/task-review.js +1498 -0
  180. package/.worktrees/2c37b1d7/src/taskcard-placeholders.js +21 -0
  181. package/.worktrees/2c37b1d7/src/taskcard.js +250 -0
  182. package/.worktrees/2c37b1d7/src/verify-postcheck.js +1718 -0
  183. package/.worktrees/2c37b1d7/src/verify-probes.js +327 -0
  184. package/.worktrees/2c37b1d7/src/version.js +19 -0
  185. package/.worktrees/2c37b1d7/src/workflow.js +600 -0
  186. package/.worktrees/2c37b1d7/src/workspace.js +125 -0
  187. package/.worktrees/2c37b1d7/src/worktree-apply.js +1611 -0
  188. package/.worktrees/2c37b1d7/src/worktree-deps.js +668 -0
  189. package/.worktrees/2c37b1d7/src/worktree.js +1849 -0
  190. package/.worktrees/2c37b1d7/templates/claude-instruction.md +23 -0
  191. package/.worktrees/2c37b1d7/templates/prompts/taskcard-rules.md +29 -0
  192. package/.worktrees/2c37b1d7/templates/prompts/testcase-design.md +12 -0
  193. package/.worktrees/2c37b1d7/templates/prompts/verify-probes.md +32 -0
  194. package/.worktrees/2c37b1d7/templates/workflows/archive-impact.yaml +79 -0
  195. package/.worktrees/2c37b1d7/templates/workflows/scan-docs.yaml +132 -0
  196. package/.worktrees/542c4415/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  197. package/.worktrees/542c4415/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  198. package/.worktrees/542c4415/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  199. package/.worktrees/542c4415/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  200. package/.worktrees/542c4415/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  201. package/.worktrees/542c4415/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  202. package/.worktrees/542c4415/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  203. package/.worktrees/542c4415/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  204. package/.worktrees/542c4415/.claude/skills/sillyspec-export/SKILL.md +57 -0
  205. package/.worktrees/542c4415/.claude/skills/sillyspec-init/SKILL.md +177 -0
  206. package/.worktrees/542c4415/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  207. package/.worktrees/542c4415/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  208. package/.worktrees/542c4415/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  209. package/.worktrees/542c4415/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  210. package/.worktrees/542c4415/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  211. package/.worktrees/542c4415/.claude/skills/sillyspec-state/SKILL.md +64 -0
  212. package/.worktrees/542c4415/.claude/skills/sillyspec-status/SKILL.md +54 -0
  213. package/.worktrees/542c4415/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  214. package/.worktrees/542c4415/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  215. package/.worktrees/542c4415/.gitattributes +2 -0
  216. package/.worktrees/542c4415/.husky/pre-push +20 -0
  217. package/.worktrees/542c4415/README.md +203 -0
  218. package/.worktrees/542c4415/SKILL.md +91 -0
  219. package/.worktrees/542c4415/architecture-analysis.md +448 -0
  220. package/.worktrees/542c4415/bin/sillyspec.js +2 -0
  221. package/.worktrees/542c4415/eval/README.md +86 -0
  222. package/.worktrees/542c4415/eval/eval.config.json +28 -0
  223. package/.worktrees/542c4415/eval/lib/adapters/cli.mjs +63 -0
  224. package/.worktrees/542c4415/eval/lib/adapters/dryrun.mjs +27 -0
  225. package/.worktrees/542c4415/eval/lib/config.mjs +82 -0
  226. package/.worktrees/542c4415/eval/lib/db.mjs +76 -0
  227. package/.worktrees/542c4415/eval/lib/report.mjs +120 -0
  228. package/.worktrees/542c4415/eval/lib/runner.mjs +157 -0
  229. package/.worktrees/542c4415/eval/lib/tasks.mjs +73 -0
  230. package/.worktrees/542c4415/eval/lib/util.mjs +107 -0
  231. package/.worktrees/542c4415/eval/lib/workdir.mjs +30 -0
  232. package/.worktrees/542c4415/eval/run.mjs +83 -0
  233. package/.worktrees/542c4415/eval/tasks/001-slugify/files/package.json +6 -0
  234. package/.worktrees/542c4415/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  235. package/.worktrees/542c4415/eval/tasks/001-slugify/task.json +6 -0
  236. package/.worktrees/542c4415/eval/tasks/001-slugify/verify.mjs +28 -0
  237. package/.worktrees/542c4415/eval/tasks/002-each-day/files/package.json +6 -0
  238. package/.worktrees/542c4415/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  239. package/.worktrees/542c4415/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  240. package/.worktrees/542c4415/eval/tasks/002-each-day/task.json +6 -0
  241. package/.worktrees/542c4415/eval/tasks/002-each-day/verify.mjs +31 -0
  242. package/.worktrees/542c4415/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  243. package/.worktrees/542c4415/eval/tasks/003-word-report/files/package.json +6 -0
  244. package/.worktrees/542c4415/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  245. package/.worktrees/542c4415/eval/tasks/003-word-report/task.json +6 -0
  246. package/.worktrees/542c4415/eval/tasks/003-word-report/verify.mjs +38 -0
  247. package/.worktrees/542c4415/logo.jpg +0 -0
  248. package/.worktrees/542c4415/package-lock.json +977 -0
  249. package/.worktrees/542c4415/package.json +41 -0
  250. package/.worktrees/542c4415/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  251. package/.worktrees/542c4415/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  252. package/.worktrees/542c4415/packages/dashboard/dist/favicon.jpg +0 -0
  253. package/.worktrees/542c4415/packages/dashboard/dist/index.html +16 -0
  254. package/.worktrees/542c4415/packages/dashboard/dist/logo.jpg +0 -0
  255. package/.worktrees/542c4415/packages/dashboard/dist/prototype-dashboard.html +836 -0
  256. package/.worktrees/542c4415/packages/dashboard/dist/prototype-overview.html +256 -0
  257. package/.worktrees/542c4415/packages/dashboard/package.json +25 -0
  258. package/.worktrees/542c4415/packages/dashboard/server/executor.js +95 -0
  259. package/.worktrees/542c4415/packages/dashboard/server/index.js +679 -0
  260. package/.worktrees/542c4415/packages/dashboard/server/parser.js +526 -0
  261. package/.worktrees/542c4415/packages/dashboard/server/watcher.js +357 -0
  262. package/.worktrees/542c4415/src/agent-session-log.js +803 -0
  263. package/.worktrees/542c4415/src/change-list.js +290 -0
  264. package/.worktrees/542c4415/src/change-risk-profile.js +339 -0
  265. package/.worktrees/542c4415/src/check-primitives.js +65 -0
  266. package/.worktrees/542c4415/src/classify-change.js +109 -0
  267. package/.worktrees/542c4415/src/commit-suggest.js +202 -0
  268. package/.worktrees/542c4415/src/config-cat.js +88 -0
  269. package/.worktrees/542c4415/src/config-schema.js +328 -0
  270. package/.worktrees/542c4415/src/constants.js +97 -0
  271. package/.worktrees/542c4415/src/contract-matrix.js +533 -0
  272. package/.worktrees/542c4415/src/datetime.js +20 -0
  273. package/.worktrees/542c4415/src/db-engine.js +55 -0
  274. package/.worktrees/542c4415/src/db.js +381 -0
  275. package/.worktrees/542c4415/src/decision-distill.js +517 -0
  276. package/.worktrees/542c4415/src/dispatch/backends/local-agent.js +155 -0
  277. package/.worktrees/542c4415/src/dispatch/backends/sillyhub-mcp.js +245 -0
  278. package/.worktrees/542c4415/src/dispatch/probe.js +246 -0
  279. package/.worktrees/542c4415/src/dispatch/strategy.js +121 -0
  280. package/.worktrees/542c4415/src/docs-check.js +825 -0
  281. package/.worktrees/542c4415/src/docs-debt.js +393 -0
  282. package/.worktrees/542c4415/src/docs-gate.js +107 -0
  283. package/.worktrees/542c4415/src/doctor-diagnostics.js +1099 -0
  284. package/.worktrees/542c4415/src/endpoint-extractor.js +409 -0
  285. package/.worktrees/542c4415/src/foreign-declared.js +155 -0
  286. package/.worktrees/542c4415/src/fs-atomic.js +73 -0
  287. package/.worktrees/542c4415/src/git-helper.js +150 -0
  288. package/.worktrees/542c4415/src/hooks/claude-pre-tool-use.cjs +130 -0
  289. package/.worktrees/542c4415/src/hooks/worktree-guard.js +892 -0
  290. package/.worktrees/542c4415/src/index.js +2854 -0
  291. package/.worktrees/542c4415/src/init.js +626 -0
  292. package/.worktrees/542c4415/src/knowledge-match.js +231 -0
  293. package/.worktrees/542c4415/src/local-detect.js +128 -0
  294. package/.worktrees/542c4415/src/local-register.js +104 -0
  295. package/.worktrees/542c4415/src/machine-interface.js +543 -0
  296. package/.worktrees/542c4415/src/migrate.js +127 -0
  297. package/.worktrees/542c4415/src/module-impact.js +166 -0
  298. package/.worktrees/542c4415/src/module-resolve.js +222 -0
  299. package/.worktrees/542c4415/src/modules.js +580 -0
  300. package/.worktrees/542c4415/src/plan-adopt-waves.js +126 -0
  301. package/.worktrees/542c4415/src/progress/change-registry.js +336 -0
  302. package/.worktrees/542c4415/src/progress/consistency-doctor.js +355 -0
  303. package/.worktrees/542c4415/src/progress/shared.js +36 -0
  304. package/.worktrees/542c4415/src/progress/stage-machine.js +594 -0
  305. package/.worktrees/542c4415/src/progress/step-store.js +265 -0
  306. package/.worktrees/542c4415/src/progress.js +1304 -0
  307. package/.worktrees/542c4415/src/quick-recommend.js +115 -0
  308. package/.worktrees/542c4415/src/quicklog.js +883 -0
  309. package/.worktrees/542c4415/src/review-tier.js +77 -0
  310. package/.worktrees/542c4415/src/run/command.js +1641 -0
  311. package/.worktrees/542c4415/src/run/complete-handlers.js +1552 -0
  312. package/.worktrees/542c4415/src/run/complete.js +1259 -0
  313. package/.worktrees/542c4415/src/run/concurrent-detect.js +156 -0
  314. package/.worktrees/542c4415/src/run/gates.js +1111 -0
  315. package/.worktrees/542c4415/src/run/multi-repo-context.js +208 -0
  316. package/.worktrees/542c4415/src/run/next.js +128 -0
  317. package/.worktrees/542c4415/src/run/prompt.js +843 -0
  318. package/.worktrees/542c4415/src/run/quick-audit.js +186 -0
  319. package/.worktrees/542c4415/src/run/scan-profile.js +269 -0
  320. package/.worktrees/542c4415/src/run/shared.js +1562 -0
  321. package/.worktrees/542c4415/src/run/stage.js +587 -0
  322. package/.worktrees/542c4415/src/run.js +23 -0
  323. package/.worktrees/542c4415/src/scan-diff.js +388 -0
  324. package/.worktrees/542c4415/src/scan-postcheck.js +524 -0
  325. package/.worktrees/542c4415/src/scan-staleness.js +95 -0
  326. package/.worktrees/542c4415/src/setup.js +414 -0
  327. package/.worktrees/542c4415/src/sillyhub-mcp/client.js +597 -0
  328. package/.worktrees/542c4415/src/sillyhub-mcp/config.js +62 -0
  329. package/.worktrees/542c4415/src/spec-dir-typo.js +50 -0
  330. package/.worktrees/542c4415/src/spec-sync.js +358 -0
  331. package/.worktrees/542c4415/src/stage-contract-engine.js +171 -0
  332. package/.worktrees/542c4415/src/stage-contract-spec.js +551 -0
  333. package/.worktrees/542c4415/src/stage-contract.js +948 -0
  334. package/.worktrees/542c4415/src/stage-review.js +597 -0
  335. package/.worktrees/542c4415/src/stages/archive.js +199 -0
  336. package/.worktrees/542c4415/src/stages/brainstorm-auto.js +285 -0
  337. package/.worktrees/542c4415/src/stages/brainstorm.js +624 -0
  338. package/.worktrees/542c4415/src/stages/cmd-existence.js +145 -0
  339. package/.worktrees/542c4415/src/stages/doctor.js +540 -0
  340. package/.worktrees/542c4415/src/stages/execute.js +1277 -0
  341. package/.worktrees/542c4415/src/stages/explore.js +43 -0
  342. package/.worktrees/542c4415/src/stages/index.js +29 -0
  343. package/.worktrees/542c4415/src/stages/knowledge.js +514 -0
  344. package/.worktrees/542c4415/src/stages/plan-postcheck.js +1398 -0
  345. package/.worktrees/542c4415/src/stages/plan.js +655 -0
  346. package/.worktrees/542c4415/src/stages/quick.js +167 -0
  347. package/.worktrees/542c4415/src/stages/scan.js +608 -0
  348. package/.worktrees/542c4415/src/stages/status.js +64 -0
  349. package/.worktrees/542c4415/src/stages/verify.js +246 -0
  350. package/.worktrees/542c4415/src/sync.js +1470 -0
  351. package/.worktrees/542c4415/src/task-review.js +1498 -0
  352. package/.worktrees/542c4415/src/taskcard-placeholders.js +21 -0
  353. package/.worktrees/542c4415/src/taskcard.js +250 -0
  354. package/.worktrees/542c4415/src/verify-postcheck.js +1718 -0
  355. package/.worktrees/542c4415/src/verify-probes.js +327 -0
  356. package/.worktrees/542c4415/src/version.js +19 -0
  357. package/.worktrees/542c4415/src/workflow.js +600 -0
  358. package/.worktrees/542c4415/src/workspace.js +125 -0
  359. package/.worktrees/542c4415/src/worktree-apply.js +1611 -0
  360. package/.worktrees/542c4415/src/worktree-deps.js +668 -0
  361. package/.worktrees/542c4415/src/worktree.js +1849 -0
  362. package/.worktrees/542c4415/templates/claude-instruction.md +23 -0
  363. package/.worktrees/542c4415/templates/prompts/taskcard-rules.md +29 -0
  364. package/.worktrees/542c4415/templates/prompts/testcase-design.md +12 -0
  365. package/.worktrees/542c4415/templates/prompts/verify-probes.md +32 -0
  366. package/.worktrees/542c4415/templates/workflows/archive-impact.yaml +79 -0
  367. package/.worktrees/542c4415/templates/workflows/scan-docs.yaml +132 -0
  368. package/.worktrees/8d2d0392/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  369. package/.worktrees/8d2d0392/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  370. package/.worktrees/8d2d0392/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  371. package/.worktrees/8d2d0392/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  372. package/.worktrees/8d2d0392/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  373. package/.worktrees/8d2d0392/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  374. package/.worktrees/8d2d0392/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  375. package/.worktrees/8d2d0392/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  376. package/.worktrees/8d2d0392/.claude/skills/sillyspec-export/SKILL.md +57 -0
  377. package/.worktrees/8d2d0392/.claude/skills/sillyspec-init/SKILL.md +177 -0
  378. package/.worktrees/8d2d0392/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  379. package/.worktrees/8d2d0392/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  380. package/.worktrees/8d2d0392/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  381. package/.worktrees/8d2d0392/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  382. package/.worktrees/8d2d0392/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  383. package/.worktrees/8d2d0392/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  384. package/.worktrees/8d2d0392/.claude/skills/sillyspec-state/SKILL.md +64 -0
  385. package/.worktrees/8d2d0392/.claude/skills/sillyspec-status/SKILL.md +54 -0
  386. package/.worktrees/8d2d0392/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  387. package/.worktrees/8d2d0392/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  388. package/.worktrees/8d2d0392/.claude/skills/verify-per-user/SKILL.md +6 -0
  389. package/.worktrees/8d2d0392/.gitattributes +2 -0
  390. package/.worktrees/8d2d0392/.husky/pre-push +20 -0
  391. package/.worktrees/8d2d0392/README.md +203 -0
  392. package/.worktrees/8d2d0392/SKILL.md +91 -0
  393. package/.worktrees/8d2d0392/architecture-analysis.md +448 -0
  394. package/.worktrees/8d2d0392/bin/sillyspec.js +2 -0
  395. package/.worktrees/8d2d0392/eval/README.md +86 -0
  396. package/.worktrees/8d2d0392/eval/eval.config.json +28 -0
  397. package/.worktrees/8d2d0392/eval/lib/adapters/cli.mjs +63 -0
  398. package/.worktrees/8d2d0392/eval/lib/adapters/dryrun.mjs +27 -0
  399. package/.worktrees/8d2d0392/eval/lib/config.mjs +82 -0
  400. package/.worktrees/8d2d0392/eval/lib/db.mjs +76 -0
  401. package/.worktrees/8d2d0392/eval/lib/report.mjs +120 -0
  402. package/.worktrees/8d2d0392/eval/lib/runner.mjs +157 -0
  403. package/.worktrees/8d2d0392/eval/lib/tasks.mjs +73 -0
  404. package/.worktrees/8d2d0392/eval/lib/util.mjs +107 -0
  405. package/.worktrees/8d2d0392/eval/lib/workdir.mjs +30 -0
  406. package/.worktrees/8d2d0392/eval/run.mjs +83 -0
  407. package/.worktrees/8d2d0392/eval/tasks/001-slugify/files/package.json +6 -0
  408. package/.worktrees/8d2d0392/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  409. package/.worktrees/8d2d0392/eval/tasks/001-slugify/task.json +6 -0
  410. package/.worktrees/8d2d0392/eval/tasks/001-slugify/verify.mjs +28 -0
  411. package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/package.json +6 -0
  412. package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  413. package/.worktrees/8d2d0392/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  414. package/.worktrees/8d2d0392/eval/tasks/002-each-day/task.json +6 -0
  415. package/.worktrees/8d2d0392/eval/tasks/002-each-day/verify.mjs +31 -0
  416. package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  417. package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/package.json +6 -0
  418. package/.worktrees/8d2d0392/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  419. package/.worktrees/8d2d0392/eval/tasks/003-word-report/task.json +6 -0
  420. package/.worktrees/8d2d0392/eval/tasks/003-word-report/verify.mjs +38 -0
  421. package/.worktrees/8d2d0392/logo.jpg +0 -0
  422. package/.worktrees/8d2d0392/package-lock.json +977 -0
  423. package/.worktrees/8d2d0392/package.json +41 -0
  424. package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  425. package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  426. package/.worktrees/8d2d0392/packages/dashboard/dist/favicon.jpg +0 -0
  427. package/.worktrees/8d2d0392/packages/dashboard/dist/index.html +16 -0
  428. package/.worktrees/8d2d0392/packages/dashboard/dist/logo.jpg +0 -0
  429. package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-dashboard.html +836 -0
  430. package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-overview.html +256 -0
  431. package/.worktrees/8d2d0392/packages/dashboard/package.json +25 -0
  432. package/.worktrees/8d2d0392/packages/dashboard/server/executor.js +95 -0
  433. package/.worktrees/8d2d0392/packages/dashboard/server/index.js +679 -0
  434. package/.worktrees/8d2d0392/packages/dashboard/server/parser.js +526 -0
  435. package/.worktrees/8d2d0392/packages/dashboard/server/watcher.js +357 -0
  436. package/.worktrees/8d2d0392/src/agent-session-log.js +803 -0
  437. package/.worktrees/8d2d0392/src/change-list.js +290 -0
  438. package/.worktrees/8d2d0392/src/change-risk-profile.js +339 -0
  439. package/.worktrees/8d2d0392/src/check-primitives.js +65 -0
  440. package/.worktrees/8d2d0392/src/classify-change.js +109 -0
  441. package/.worktrees/8d2d0392/src/commit-suggest.js +202 -0
  442. package/.worktrees/8d2d0392/src/config-cat.js +88 -0
  443. package/.worktrees/8d2d0392/src/config-schema.js +328 -0
  444. package/.worktrees/8d2d0392/src/constants.js +97 -0
  445. package/.worktrees/8d2d0392/src/contract-matrix.js +533 -0
  446. package/.worktrees/8d2d0392/src/datetime.js +20 -0
  447. package/.worktrees/8d2d0392/src/db-engine.js +55 -0
  448. package/.worktrees/8d2d0392/src/db.js +381 -0
  449. package/.worktrees/8d2d0392/src/decision-distill.js +517 -0
  450. package/.worktrees/8d2d0392/src/dispatch/backends/local-agent.js +155 -0
  451. package/.worktrees/8d2d0392/src/dispatch/backends/sillyhub-mcp.js +245 -0
  452. package/.worktrees/8d2d0392/src/dispatch/probe.js +246 -0
  453. package/.worktrees/8d2d0392/src/dispatch/strategy.js +121 -0
  454. package/.worktrees/8d2d0392/src/docs-check.js +825 -0
  455. package/.worktrees/8d2d0392/src/docs-debt.js +393 -0
  456. package/.worktrees/8d2d0392/src/docs-gate.js +107 -0
  457. package/.worktrees/8d2d0392/src/doctor-diagnostics.js +1099 -0
  458. package/.worktrees/8d2d0392/src/endpoint-extractor.js +409 -0
  459. package/.worktrees/8d2d0392/src/foreign-declared.js +78 -0
  460. package/.worktrees/8d2d0392/src/fs-atomic.js +73 -0
  461. package/.worktrees/8d2d0392/src/git-helper.js +150 -0
  462. package/.worktrees/8d2d0392/src/hooks/claude-pre-tool-use.cjs +130 -0
  463. package/.worktrees/8d2d0392/src/hooks/worktree-guard.js +892 -0
  464. package/.worktrees/8d2d0392/src/index.js +2854 -0
  465. package/.worktrees/8d2d0392/src/init.js +626 -0
  466. package/.worktrees/8d2d0392/src/knowledge-match.js +231 -0
  467. package/.worktrees/8d2d0392/src/local-detect.js +128 -0
  468. package/.worktrees/8d2d0392/src/local-register.js +104 -0
  469. package/.worktrees/8d2d0392/src/machine-interface.js +543 -0
  470. package/.worktrees/8d2d0392/src/migrate.js +127 -0
  471. package/.worktrees/8d2d0392/src/module-impact.js +166 -0
  472. package/.worktrees/8d2d0392/src/module-resolve.js +222 -0
  473. package/.worktrees/8d2d0392/src/modules.js +580 -0
  474. package/.worktrees/8d2d0392/src/plan-adopt-waves.js +126 -0
  475. package/.worktrees/8d2d0392/src/progress/change-registry.js +336 -0
  476. package/.worktrees/8d2d0392/src/progress/consistency-doctor.js +355 -0
  477. package/.worktrees/8d2d0392/src/progress/shared.js +36 -0
  478. package/.worktrees/8d2d0392/src/progress/stage-machine.js +594 -0
  479. package/.worktrees/8d2d0392/src/progress/step-store.js +265 -0
  480. package/.worktrees/8d2d0392/src/progress.js +1304 -0
  481. package/.worktrees/8d2d0392/src/quick-recommend.js +115 -0
  482. package/.worktrees/8d2d0392/src/quicklog.js +883 -0
  483. package/.worktrees/8d2d0392/src/review-tier.js +77 -0
  484. package/.worktrees/8d2d0392/src/run/command.js +1641 -0
  485. package/.worktrees/8d2d0392/src/run/complete-handlers.js +1552 -0
  486. package/.worktrees/8d2d0392/src/run/complete.js +1259 -0
  487. package/.worktrees/8d2d0392/src/run/concurrent-detect.js +156 -0
  488. package/.worktrees/8d2d0392/src/run/gates.js +1094 -0
  489. package/.worktrees/8d2d0392/src/run/multi-repo-context.js +208 -0
  490. package/.worktrees/8d2d0392/src/run/next.js +128 -0
  491. package/.worktrees/8d2d0392/src/run/prompt.js +843 -0
  492. package/.worktrees/8d2d0392/src/run/quick-audit.js +186 -0
  493. package/.worktrees/8d2d0392/src/run/scan-profile.js +269 -0
  494. package/.worktrees/8d2d0392/src/run/shared.js +1562 -0
  495. package/.worktrees/8d2d0392/src/run/stage.js +587 -0
  496. package/.worktrees/8d2d0392/src/run.js +23 -0
  497. package/.worktrees/8d2d0392/src/scan-diff.js +388 -0
  498. package/.worktrees/8d2d0392/src/scan-postcheck.js +524 -0
  499. package/.worktrees/8d2d0392/src/scan-staleness.js +95 -0
  500. package/.worktrees/8d2d0392/src/setup.js +414 -0
  501. package/.worktrees/8d2d0392/src/sillyhub-mcp/client.js +597 -0
  502. package/.worktrees/8d2d0392/src/sillyhub-mcp/config.js +62 -0
  503. package/.worktrees/8d2d0392/src/spec-dir-typo.js +50 -0
  504. package/.worktrees/8d2d0392/src/spec-sync.js +358 -0
  505. package/.worktrees/8d2d0392/src/stage-contract-engine.js +171 -0
  506. package/.worktrees/8d2d0392/src/stage-contract-spec.js +551 -0
  507. package/.worktrees/8d2d0392/src/stage-contract.js +948 -0
  508. package/.worktrees/8d2d0392/src/stage-review.js +597 -0
  509. package/.worktrees/8d2d0392/src/stages/archive.js +199 -0
  510. package/.worktrees/8d2d0392/src/stages/brainstorm-auto.js +285 -0
  511. package/.worktrees/8d2d0392/src/stages/brainstorm.js +624 -0
  512. package/.worktrees/8d2d0392/src/stages/cmd-existence.js +145 -0
  513. package/.worktrees/8d2d0392/src/stages/doctor.js +540 -0
  514. package/.worktrees/8d2d0392/src/stages/execute.js +1277 -0
  515. package/.worktrees/8d2d0392/src/stages/explore.js +43 -0
  516. package/.worktrees/8d2d0392/src/stages/index.js +29 -0
  517. package/.worktrees/8d2d0392/src/stages/knowledge.js +514 -0
  518. package/.worktrees/8d2d0392/src/stages/plan-postcheck.js +1398 -0
  519. package/.worktrees/8d2d0392/src/stages/plan.js +651 -0
  520. package/.worktrees/8d2d0392/src/stages/quick.js +167 -0
  521. package/.worktrees/8d2d0392/src/stages/scan.js +608 -0
  522. package/.worktrees/8d2d0392/src/stages/status.js +64 -0
  523. package/.worktrees/8d2d0392/src/stages/verify.js +246 -0
  524. package/.worktrees/8d2d0392/src/sync.js +1470 -0
  525. package/.worktrees/8d2d0392/src/task-review.js +1498 -0
  526. package/.worktrees/8d2d0392/src/taskcard-placeholders.js +21 -0
  527. package/.worktrees/8d2d0392/src/taskcard.js +217 -0
  528. package/.worktrees/8d2d0392/src/verify-postcheck.js +1718 -0
  529. package/.worktrees/8d2d0392/src/verify-probes.js +327 -0
  530. package/.worktrees/8d2d0392/src/version.js +19 -0
  531. package/.worktrees/8d2d0392/src/workflow.js +600 -0
  532. package/.worktrees/8d2d0392/src/workspace.js +125 -0
  533. package/.worktrees/8d2d0392/src/worktree-apply.js +1611 -0
  534. package/.worktrees/8d2d0392/src/worktree-deps.js +576 -0
  535. package/.worktrees/8d2d0392/src/worktree.js +1838 -0
  536. package/.worktrees/8d2d0392/templates/claude-instruction.md +23 -0
  537. package/.worktrees/8d2d0392/templates/prompts/taskcard-rules.md +29 -0
  538. package/.worktrees/8d2d0392/templates/prompts/testcase-design.md +12 -0
  539. package/.worktrees/8d2d0392/templates/prompts/verify-probes.md +32 -0
  540. package/.worktrees/8d2d0392/templates/workflows/archive-impact.yaml +79 -0
  541. package/.worktrees/8d2d0392/templates/workflows/scan-docs.yaml +132 -0
  542. package/.worktrees/c1eae35e/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  543. package/.worktrees/c1eae35e/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  544. package/.worktrees/c1eae35e/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  545. package/.worktrees/c1eae35e/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  546. package/.worktrees/c1eae35e/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  547. package/.worktrees/c1eae35e/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  548. package/.worktrees/c1eae35e/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  549. package/.worktrees/c1eae35e/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  550. package/.worktrees/c1eae35e/.claude/skills/sillyspec-export/SKILL.md +57 -0
  551. package/.worktrees/c1eae35e/.claude/skills/sillyspec-init/SKILL.md +177 -0
  552. package/.worktrees/c1eae35e/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  553. package/.worktrees/c1eae35e/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  554. package/.worktrees/c1eae35e/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  555. package/.worktrees/c1eae35e/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  556. package/.worktrees/c1eae35e/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  557. package/.worktrees/c1eae35e/.claude/skills/sillyspec-state/SKILL.md +64 -0
  558. package/.worktrees/c1eae35e/.claude/skills/sillyspec-status/SKILL.md +54 -0
  559. package/.worktrees/c1eae35e/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  560. package/.worktrees/c1eae35e/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  561. package/.worktrees/c1eae35e/.gitattributes +2 -0
  562. package/.worktrees/c1eae35e/.husky/pre-push +20 -0
  563. package/.worktrees/c1eae35e/README.md +203 -0
  564. package/.worktrees/c1eae35e/SKILL.md +91 -0
  565. package/.worktrees/c1eae35e/architecture-analysis.md +448 -0
  566. package/.worktrees/c1eae35e/bin/sillyspec.js +2 -0
  567. package/.worktrees/c1eae35e/eval/README.md +86 -0
  568. package/.worktrees/c1eae35e/eval/eval.config.json +28 -0
  569. package/.worktrees/c1eae35e/eval/lib/adapters/cli.mjs +63 -0
  570. package/.worktrees/c1eae35e/eval/lib/adapters/dryrun.mjs +27 -0
  571. package/.worktrees/c1eae35e/eval/lib/config.mjs +82 -0
  572. package/.worktrees/c1eae35e/eval/lib/db.mjs +76 -0
  573. package/.worktrees/c1eae35e/eval/lib/report.mjs +120 -0
  574. package/.worktrees/c1eae35e/eval/lib/runner.mjs +157 -0
  575. package/.worktrees/c1eae35e/eval/lib/tasks.mjs +73 -0
  576. package/.worktrees/c1eae35e/eval/lib/util.mjs +107 -0
  577. package/.worktrees/c1eae35e/eval/lib/workdir.mjs +30 -0
  578. package/.worktrees/c1eae35e/eval/run.mjs +83 -0
  579. package/.worktrees/c1eae35e/eval/tasks/001-slugify/files/package.json +6 -0
  580. package/.worktrees/c1eae35e/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  581. package/.worktrees/c1eae35e/eval/tasks/001-slugify/task.json +6 -0
  582. package/.worktrees/c1eae35e/eval/tasks/001-slugify/verify.mjs +28 -0
  583. package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/package.json +6 -0
  584. package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  585. package/.worktrees/c1eae35e/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  586. package/.worktrees/c1eae35e/eval/tasks/002-each-day/task.json +6 -0
  587. package/.worktrees/c1eae35e/eval/tasks/002-each-day/verify.mjs +31 -0
  588. package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  589. package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/package.json +6 -0
  590. package/.worktrees/c1eae35e/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  591. package/.worktrees/c1eae35e/eval/tasks/003-word-report/task.json +6 -0
  592. package/.worktrees/c1eae35e/eval/tasks/003-word-report/verify.mjs +38 -0
  593. package/.worktrees/c1eae35e/logo.jpg +0 -0
  594. package/.worktrees/c1eae35e/package-lock.json +977 -0
  595. package/.worktrees/c1eae35e/package.json +41 -0
  596. package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  597. package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  598. package/.worktrees/c1eae35e/packages/dashboard/dist/favicon.jpg +0 -0
  599. package/.worktrees/c1eae35e/packages/dashboard/dist/index.html +16 -0
  600. package/.worktrees/c1eae35e/packages/dashboard/dist/logo.jpg +0 -0
  601. package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-dashboard.html +836 -0
  602. package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-overview.html +256 -0
  603. package/.worktrees/c1eae35e/packages/dashboard/package.json +25 -0
  604. package/.worktrees/c1eae35e/packages/dashboard/server/executor.js +95 -0
  605. package/.worktrees/c1eae35e/packages/dashboard/server/index.js +679 -0
  606. package/.worktrees/c1eae35e/packages/dashboard/server/parser.js +526 -0
  607. package/.worktrees/c1eae35e/packages/dashboard/server/watcher.js +357 -0
  608. package/.worktrees/c1eae35e/src/agent-session-log.js +803 -0
  609. package/.worktrees/c1eae35e/src/change-list.js +290 -0
  610. package/.worktrees/c1eae35e/src/change-risk-profile.js +339 -0
  611. package/.worktrees/c1eae35e/src/check-primitives.js +65 -0
  612. package/.worktrees/c1eae35e/src/classify-change.js +109 -0
  613. package/.worktrees/c1eae35e/src/commit-suggest.js +202 -0
  614. package/.worktrees/c1eae35e/src/config-cat.js +88 -0
  615. package/.worktrees/c1eae35e/src/config-schema.js +328 -0
  616. package/.worktrees/c1eae35e/src/constants.js +97 -0
  617. package/.worktrees/c1eae35e/src/contract-matrix.js +533 -0
  618. package/.worktrees/c1eae35e/src/datetime.js +20 -0
  619. package/.worktrees/c1eae35e/src/db-engine.js +55 -0
  620. package/.worktrees/c1eae35e/src/db.js +381 -0
  621. package/.worktrees/c1eae35e/src/decision-distill.js +517 -0
  622. package/.worktrees/c1eae35e/src/dispatch/backends/local-agent.js +155 -0
  623. package/.worktrees/c1eae35e/src/dispatch/backends/sillyhub-mcp.js +245 -0
  624. package/.worktrees/c1eae35e/src/dispatch/probe.js +246 -0
  625. package/.worktrees/c1eae35e/src/dispatch/strategy.js +121 -0
  626. package/.worktrees/c1eae35e/src/docs-check.js +825 -0
  627. package/.worktrees/c1eae35e/src/docs-debt.js +393 -0
  628. package/.worktrees/c1eae35e/src/docs-gate.js +107 -0
  629. package/.worktrees/c1eae35e/src/doctor-diagnostics.js +1099 -0
  630. package/.worktrees/c1eae35e/src/endpoint-extractor.js +409 -0
  631. package/.worktrees/c1eae35e/src/foreign-declared.js +155 -0
  632. package/.worktrees/c1eae35e/src/fs-atomic.js +73 -0
  633. package/.worktrees/c1eae35e/src/git-helper.js +150 -0
  634. package/.worktrees/c1eae35e/src/hooks/claude-pre-tool-use.cjs +130 -0
  635. package/.worktrees/c1eae35e/src/hooks/worktree-guard.js +892 -0
  636. package/.worktrees/c1eae35e/src/index.js +2854 -0
  637. package/.worktrees/c1eae35e/src/init.js +626 -0
  638. package/.worktrees/c1eae35e/src/knowledge-match.js +231 -0
  639. package/.worktrees/c1eae35e/src/local-detect.js +128 -0
  640. package/.worktrees/c1eae35e/src/local-register.js +104 -0
  641. package/.worktrees/c1eae35e/src/machine-interface.js +543 -0
  642. package/.worktrees/c1eae35e/src/migrate.js +127 -0
  643. package/.worktrees/c1eae35e/src/module-impact.js +166 -0
  644. package/.worktrees/c1eae35e/src/module-resolve.js +222 -0
  645. package/.worktrees/c1eae35e/src/modules.js +580 -0
  646. package/.worktrees/c1eae35e/src/plan-adopt-waves.js +126 -0
  647. package/.worktrees/c1eae35e/src/progress/change-registry.js +336 -0
  648. package/.worktrees/c1eae35e/src/progress/consistency-doctor.js +355 -0
  649. package/.worktrees/c1eae35e/src/progress/shared.js +36 -0
  650. package/.worktrees/c1eae35e/src/progress/stage-machine.js +594 -0
  651. package/.worktrees/c1eae35e/src/progress/step-store.js +265 -0
  652. package/.worktrees/c1eae35e/src/progress.js +1304 -0
  653. package/.worktrees/c1eae35e/src/quick-recommend.js +115 -0
  654. package/.worktrees/c1eae35e/src/quicklog.js +883 -0
  655. package/.worktrees/c1eae35e/src/review-tier.js +77 -0
  656. package/.worktrees/c1eae35e/src/run/command.js +1641 -0
  657. package/.worktrees/c1eae35e/src/run/complete-handlers.js +1552 -0
  658. package/.worktrees/c1eae35e/src/run/complete.js +1259 -0
  659. package/.worktrees/c1eae35e/src/run/concurrent-detect.js +156 -0
  660. package/.worktrees/c1eae35e/src/run/gates.js +1111 -0
  661. package/.worktrees/c1eae35e/src/run/multi-repo-context.js +208 -0
  662. package/.worktrees/c1eae35e/src/run/next.js +128 -0
  663. package/.worktrees/c1eae35e/src/run/prompt.js +843 -0
  664. package/.worktrees/c1eae35e/src/run/quick-audit.js +186 -0
  665. package/.worktrees/c1eae35e/src/run/scan-profile.js +269 -0
  666. package/.worktrees/c1eae35e/src/run/shared.js +1562 -0
  667. package/.worktrees/c1eae35e/src/run/stage.js +587 -0
  668. package/.worktrees/c1eae35e/src/run.js +23 -0
  669. package/.worktrees/c1eae35e/src/scan-diff.js +388 -0
  670. package/.worktrees/c1eae35e/src/scan-postcheck.js +524 -0
  671. package/.worktrees/c1eae35e/src/scan-staleness.js +95 -0
  672. package/.worktrees/c1eae35e/src/setup.js +414 -0
  673. package/.worktrees/c1eae35e/src/sillyhub-mcp/client.js +597 -0
  674. package/.worktrees/c1eae35e/src/sillyhub-mcp/config.js +62 -0
  675. package/.worktrees/c1eae35e/src/spec-dir-typo.js +50 -0
  676. package/.worktrees/c1eae35e/src/spec-sync.js +358 -0
  677. package/.worktrees/c1eae35e/src/stage-contract-engine.js +171 -0
  678. package/.worktrees/c1eae35e/src/stage-contract-spec.js +551 -0
  679. package/.worktrees/c1eae35e/src/stage-contract.js +948 -0
  680. package/.worktrees/c1eae35e/src/stage-review.js +597 -0
  681. package/.worktrees/c1eae35e/src/stages/archive.js +199 -0
  682. package/.worktrees/c1eae35e/src/stages/brainstorm-auto.js +285 -0
  683. package/.worktrees/c1eae35e/src/stages/brainstorm.js +624 -0
  684. package/.worktrees/c1eae35e/src/stages/cmd-existence.js +145 -0
  685. package/.worktrees/c1eae35e/src/stages/doctor.js +540 -0
  686. package/.worktrees/c1eae35e/src/stages/execute.js +1277 -0
  687. package/.worktrees/c1eae35e/src/stages/explore.js +43 -0
  688. package/.worktrees/c1eae35e/src/stages/index.js +29 -0
  689. package/.worktrees/c1eae35e/src/stages/knowledge.js +514 -0
  690. package/.worktrees/c1eae35e/src/stages/plan-postcheck.js +1398 -0
  691. package/.worktrees/c1eae35e/src/stages/plan.js +655 -0
  692. package/.worktrees/c1eae35e/src/stages/quick.js +167 -0
  693. package/.worktrees/c1eae35e/src/stages/scan.js +608 -0
  694. package/.worktrees/c1eae35e/src/stages/status.js +64 -0
  695. package/.worktrees/c1eae35e/src/stages/verify.js +246 -0
  696. package/.worktrees/c1eae35e/src/sync.js +1470 -0
  697. package/.worktrees/c1eae35e/src/task-review.js +1498 -0
  698. package/.worktrees/c1eae35e/src/taskcard-placeholders.js +21 -0
  699. package/.worktrees/c1eae35e/src/taskcard.js +250 -0
  700. package/.worktrees/c1eae35e/src/verify-postcheck.js +1718 -0
  701. package/.worktrees/c1eae35e/src/verify-probes.js +327 -0
  702. package/.worktrees/c1eae35e/src/version.js +19 -0
  703. package/.worktrees/c1eae35e/src/workflow.js +600 -0
  704. package/.worktrees/c1eae35e/src/workspace.js +125 -0
  705. package/.worktrees/c1eae35e/src/worktree-apply.js +1611 -0
  706. package/.worktrees/c1eae35e/src/worktree-deps.js +668 -0
  707. package/.worktrees/c1eae35e/src/worktree.js +1849 -0
  708. package/.worktrees/c1eae35e/templates/claude-instruction.md +23 -0
  709. package/.worktrees/c1eae35e/templates/prompts/taskcard-rules.md +29 -0
  710. package/.worktrees/c1eae35e/templates/prompts/testcase-design.md +12 -0
  711. package/.worktrees/c1eae35e/templates/prompts/verify-probes.md +32 -0
  712. package/.worktrees/c1eae35e/templates/workflows/archive-impact.yaml +79 -0
  713. package/.worktrees/c1eae35e/templates/workflows/scan-docs.yaml +132 -0
  714. package/.worktrees/dafc71ad/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  715. package/.worktrees/dafc71ad/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  716. package/.worktrees/dafc71ad/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  717. package/.worktrees/dafc71ad/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  718. package/.worktrees/dafc71ad/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  719. package/.worktrees/dafc71ad/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  720. package/.worktrees/dafc71ad/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  721. package/.worktrees/dafc71ad/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  722. package/.worktrees/dafc71ad/.claude/skills/sillyspec-export/SKILL.md +57 -0
  723. package/.worktrees/dafc71ad/.claude/skills/sillyspec-init/SKILL.md +177 -0
  724. package/.worktrees/dafc71ad/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  725. package/.worktrees/dafc71ad/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  726. package/.worktrees/dafc71ad/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  727. package/.worktrees/dafc71ad/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  728. package/.worktrees/dafc71ad/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  729. package/.worktrees/dafc71ad/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  730. package/.worktrees/dafc71ad/.claude/skills/sillyspec-state/SKILL.md +64 -0
  731. package/.worktrees/dafc71ad/.claude/skills/sillyspec-status/SKILL.md +54 -0
  732. package/.worktrees/dafc71ad/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  733. package/.worktrees/dafc71ad/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  734. package/.worktrees/dafc71ad/.gitattributes +2 -0
  735. package/.worktrees/dafc71ad/.husky/pre-push +20 -0
  736. package/.worktrees/dafc71ad/README.md +203 -0
  737. package/.worktrees/dafc71ad/SKILL.md +91 -0
  738. package/.worktrees/dafc71ad/analysis.md +366 -0
  739. package/.worktrees/dafc71ad/architecture-analysis.md +448 -0
  740. package/.worktrees/dafc71ad/bin/sillyspec.js +2 -0
  741. package/.worktrees/dafc71ad/eval/README.md +86 -0
  742. package/.worktrees/dafc71ad/eval/eval.config.json +28 -0
  743. package/.worktrees/dafc71ad/eval/lib/adapters/cli.mjs +63 -0
  744. package/.worktrees/dafc71ad/eval/lib/adapters/dryrun.mjs +27 -0
  745. package/.worktrees/dafc71ad/eval/lib/config.mjs +82 -0
  746. package/.worktrees/dafc71ad/eval/lib/db.mjs +76 -0
  747. package/.worktrees/dafc71ad/eval/lib/report.mjs +120 -0
  748. package/.worktrees/dafc71ad/eval/lib/runner.mjs +157 -0
  749. package/.worktrees/dafc71ad/eval/lib/tasks.mjs +73 -0
  750. package/.worktrees/dafc71ad/eval/lib/util.mjs +107 -0
  751. package/.worktrees/dafc71ad/eval/lib/workdir.mjs +30 -0
  752. package/.worktrees/dafc71ad/eval/run.mjs +83 -0
  753. package/.worktrees/dafc71ad/eval/tasks/001-slugify/files/package.json +6 -0
  754. package/.worktrees/dafc71ad/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  755. package/.worktrees/dafc71ad/eval/tasks/001-slugify/task.json +6 -0
  756. package/.worktrees/dafc71ad/eval/tasks/001-slugify/verify.mjs +28 -0
  757. package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/package.json +6 -0
  758. package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  759. package/.worktrees/dafc71ad/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  760. package/.worktrees/dafc71ad/eval/tasks/002-each-day/task.json +6 -0
  761. package/.worktrees/dafc71ad/eval/tasks/002-each-day/verify.mjs +31 -0
  762. package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  763. package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/package.json +6 -0
  764. package/.worktrees/dafc71ad/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  765. package/.worktrees/dafc71ad/eval/tasks/003-word-report/task.json +6 -0
  766. package/.worktrees/dafc71ad/eval/tasks/003-word-report/verify.mjs +38 -0
  767. package/.worktrees/dafc71ad/logo.jpg +0 -0
  768. package/.worktrees/dafc71ad/package-lock.json +977 -0
  769. package/.worktrees/dafc71ad/package.json +41 -0
  770. package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  771. package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  772. package/.worktrees/dafc71ad/packages/dashboard/dist/favicon.jpg +0 -0
  773. package/.worktrees/dafc71ad/packages/dashboard/dist/index.html +16 -0
  774. package/.worktrees/dafc71ad/packages/dashboard/dist/logo.jpg +0 -0
  775. package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-dashboard.html +836 -0
  776. package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-overview.html +256 -0
  777. package/.worktrees/dafc71ad/packages/dashboard/package.json +25 -0
  778. package/.worktrees/dafc71ad/packages/dashboard/server/executor.js +95 -0
  779. package/.worktrees/dafc71ad/packages/dashboard/server/index.js +679 -0
  780. package/.worktrees/dafc71ad/packages/dashboard/server/parser.js +526 -0
  781. package/.worktrees/dafc71ad/packages/dashboard/server/watcher.js +357 -0
  782. package/.worktrees/dafc71ad/src/agent-session-log.js +803 -0
  783. package/.worktrees/dafc71ad/src/change-list.js +290 -0
  784. package/.worktrees/dafc71ad/src/change-risk-profile.js +339 -0
  785. package/.worktrees/dafc71ad/src/check-primitives.js +65 -0
  786. package/.worktrees/dafc71ad/src/classify-change.js +109 -0
  787. package/.worktrees/dafc71ad/src/commit-suggest.js +202 -0
  788. package/.worktrees/dafc71ad/src/config-cat.js +88 -0
  789. package/.worktrees/dafc71ad/src/config-schema.js +328 -0
  790. package/.worktrees/dafc71ad/src/constants.js +97 -0
  791. package/.worktrees/dafc71ad/src/contract-matrix.js +533 -0
  792. package/.worktrees/dafc71ad/src/datetime.js +20 -0
  793. package/.worktrees/dafc71ad/src/db-engine.js +55 -0
  794. package/.worktrees/dafc71ad/src/db.js +381 -0
  795. package/.worktrees/dafc71ad/src/decision-distill.js +517 -0
  796. package/.worktrees/dafc71ad/src/dispatch/backends/local-agent.js +155 -0
  797. package/.worktrees/dafc71ad/src/dispatch/backends/sillyhub-mcp.js +245 -0
  798. package/.worktrees/dafc71ad/src/dispatch/probe.js +246 -0
  799. package/.worktrees/dafc71ad/src/dispatch/strategy.js +121 -0
  800. package/.worktrees/dafc71ad/src/docs-check.js +825 -0
  801. package/.worktrees/dafc71ad/src/docs-debt.js +393 -0
  802. package/.worktrees/dafc71ad/src/docs-gate.js +107 -0
  803. package/.worktrees/dafc71ad/src/doctor-diagnostics.js +1099 -0
  804. package/.worktrees/dafc71ad/src/endpoint-extractor.js +409 -0
  805. package/.worktrees/dafc71ad/src/foreign-declared.js +155 -0
  806. package/.worktrees/dafc71ad/src/fs-atomic.js +73 -0
  807. package/.worktrees/dafc71ad/src/git-helper.js +150 -0
  808. package/.worktrees/dafc71ad/src/hooks/claude-pre-tool-use.cjs +130 -0
  809. package/.worktrees/dafc71ad/src/hooks/worktree-guard.js +892 -0
  810. package/.worktrees/dafc71ad/src/index.js +2854 -0
  811. package/.worktrees/dafc71ad/src/init.js +626 -0
  812. package/.worktrees/dafc71ad/src/knowledge-match.js +231 -0
  813. package/.worktrees/dafc71ad/src/local-detect.js +128 -0
  814. package/.worktrees/dafc71ad/src/local-register.js +104 -0
  815. package/.worktrees/dafc71ad/src/machine-interface.js +543 -0
  816. package/.worktrees/dafc71ad/src/migrate.js +127 -0
  817. package/.worktrees/dafc71ad/src/module-impact.js +166 -0
  818. package/.worktrees/dafc71ad/src/module-resolve.js +222 -0
  819. package/.worktrees/dafc71ad/src/modules.js +580 -0
  820. package/.worktrees/dafc71ad/src/plan-adopt-waves.js +126 -0
  821. package/.worktrees/dafc71ad/src/progress/change-registry.js +336 -0
  822. package/.worktrees/dafc71ad/src/progress/consistency-doctor.js +355 -0
  823. package/.worktrees/dafc71ad/src/progress/shared.js +36 -0
  824. package/.worktrees/dafc71ad/src/progress/stage-machine.js +594 -0
  825. package/.worktrees/dafc71ad/src/progress/step-store.js +265 -0
  826. package/.worktrees/dafc71ad/src/progress.js +1304 -0
  827. package/.worktrees/dafc71ad/src/quick-recommend.js +115 -0
  828. package/.worktrees/dafc71ad/src/quicklog.js +883 -0
  829. package/.worktrees/dafc71ad/src/review-tier.js +77 -0
  830. package/.worktrees/dafc71ad/src/run/command.js +1641 -0
  831. package/.worktrees/dafc71ad/src/run/complete-handlers.js +1552 -0
  832. package/.worktrees/dafc71ad/src/run/complete.js +1259 -0
  833. package/.worktrees/dafc71ad/src/run/concurrent-detect.js +156 -0
  834. package/.worktrees/dafc71ad/src/run/gates.js +1111 -0
  835. package/.worktrees/dafc71ad/src/run/multi-repo-context.js +208 -0
  836. package/.worktrees/dafc71ad/src/run/next.js +128 -0
  837. package/.worktrees/dafc71ad/src/run/prompt.js +843 -0
  838. package/.worktrees/dafc71ad/src/run/quick-audit.js +186 -0
  839. package/.worktrees/dafc71ad/src/run/scan-profile.js +269 -0
  840. package/.worktrees/dafc71ad/src/run/shared.js +1562 -0
  841. package/.worktrees/dafc71ad/src/run/stage.js +587 -0
  842. package/.worktrees/dafc71ad/src/run.js +23 -0
  843. package/.worktrees/dafc71ad/src/scan-diff.js +388 -0
  844. package/.worktrees/dafc71ad/src/scan-postcheck.js +524 -0
  845. package/.worktrees/dafc71ad/src/scan-staleness.js +95 -0
  846. package/.worktrees/dafc71ad/src/setup.js +414 -0
  847. package/.worktrees/dafc71ad/src/sillyhub-mcp/client.js +597 -0
  848. package/.worktrees/dafc71ad/src/sillyhub-mcp/config.js +62 -0
  849. package/.worktrees/dafc71ad/src/spec-dir-typo.js +50 -0
  850. package/.worktrees/dafc71ad/src/spec-sync.js +358 -0
  851. package/.worktrees/dafc71ad/src/stage-contract-engine.js +171 -0
  852. package/.worktrees/dafc71ad/src/stage-contract-spec.js +551 -0
  853. package/.worktrees/dafc71ad/src/stage-contract.js +948 -0
  854. package/.worktrees/dafc71ad/src/stage-review.js +597 -0
  855. package/.worktrees/dafc71ad/src/stages/archive.js +199 -0
  856. package/.worktrees/dafc71ad/src/stages/brainstorm-auto.js +285 -0
  857. package/.worktrees/dafc71ad/src/stages/brainstorm.js +624 -0
  858. package/.worktrees/dafc71ad/src/stages/cmd-existence.js +145 -0
  859. package/.worktrees/dafc71ad/src/stages/doctor.js +540 -0
  860. package/.worktrees/dafc71ad/src/stages/execute.js +1277 -0
  861. package/.worktrees/dafc71ad/src/stages/explore.js +43 -0
  862. package/.worktrees/dafc71ad/src/stages/index.js +29 -0
  863. package/.worktrees/dafc71ad/src/stages/knowledge.js +514 -0
  864. package/.worktrees/dafc71ad/src/stages/plan-postcheck.js +1398 -0
  865. package/.worktrees/dafc71ad/src/stages/plan.js +655 -0
  866. package/.worktrees/dafc71ad/src/stages/quick.js +167 -0
  867. package/.worktrees/dafc71ad/src/stages/scan.js +608 -0
  868. package/.worktrees/dafc71ad/src/stages/status.js +64 -0
  869. package/.worktrees/dafc71ad/src/stages/verify.js +246 -0
  870. package/.worktrees/dafc71ad/src/sync.js +1470 -0
  871. package/.worktrees/dafc71ad/src/task-review.js +1498 -0
  872. package/.worktrees/dafc71ad/src/taskcard-placeholders.js +21 -0
  873. package/.worktrees/dafc71ad/src/taskcard.js +250 -0
  874. package/.worktrees/dafc71ad/src/verify-postcheck.js +1718 -0
  875. package/.worktrees/dafc71ad/src/verify-probes.js +327 -0
  876. package/.worktrees/dafc71ad/src/version.js +19 -0
  877. package/.worktrees/dafc71ad/src/workflow.js +600 -0
  878. package/.worktrees/dafc71ad/src/workspace.js +125 -0
  879. package/.worktrees/dafc71ad/src/worktree-apply.js +1611 -0
  880. package/.worktrees/dafc71ad/src/worktree-deps.js +668 -0
  881. package/.worktrees/dafc71ad/src/worktree.js +1849 -0
  882. package/.worktrees/dafc71ad/templates/claude-instruction.md +23 -0
  883. package/.worktrees/dafc71ad/templates/prompts/taskcard-rules.md +29 -0
  884. package/.worktrees/dafc71ad/templates/prompts/testcase-design.md +12 -0
  885. package/.worktrees/dafc71ad/templates/prompts/verify-probes.md +32 -0
  886. package/.worktrees/dafc71ad/templates/workflows/archive-impact.yaml +79 -0
  887. package/.worktrees/dafc71ad/templates/workflows/scan-docs.yaml +132 -0
  888. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  889. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  890. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  891. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  892. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  893. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  894. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  895. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  896. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-export/SKILL.md +57 -0
  897. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-init/SKILL.md +177 -0
  898. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  899. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  900. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  901. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  902. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  903. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  904. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-state/SKILL.md +64 -0
  905. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-status/SKILL.md +54 -0
  906. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  907. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  908. package/.worktrees/e58fcc4c/.gitattributes +2 -0
  909. package/.worktrees/e58fcc4c/.husky/pre-push +20 -0
  910. package/.worktrees/e58fcc4c/README.md +203 -0
  911. package/.worktrees/e58fcc4c/SKILL.md +91 -0
  912. package/.worktrees/e58fcc4c/architecture-analysis.md +503 -0
  913. package/.worktrees/e58fcc4c/bin/sillyspec.js +2 -0
  914. package/.worktrees/e58fcc4c/eval/README.md +86 -0
  915. package/.worktrees/e58fcc4c/eval/eval.config.json +28 -0
  916. package/.worktrees/e58fcc4c/eval/lib/adapters/cli.mjs +63 -0
  917. package/.worktrees/e58fcc4c/eval/lib/adapters/dryrun.mjs +27 -0
  918. package/.worktrees/e58fcc4c/eval/lib/config.mjs +82 -0
  919. package/.worktrees/e58fcc4c/eval/lib/db.mjs +76 -0
  920. package/.worktrees/e58fcc4c/eval/lib/report.mjs +120 -0
  921. package/.worktrees/e58fcc4c/eval/lib/runner.mjs +157 -0
  922. package/.worktrees/e58fcc4c/eval/lib/tasks.mjs +73 -0
  923. package/.worktrees/e58fcc4c/eval/lib/util.mjs +107 -0
  924. package/.worktrees/e58fcc4c/eval/lib/workdir.mjs +30 -0
  925. package/.worktrees/e58fcc4c/eval/run.mjs +83 -0
  926. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/files/package.json +6 -0
  927. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  928. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/task.json +6 -0
  929. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/verify.mjs +28 -0
  930. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/package.json +6 -0
  931. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  932. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  933. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/task.json +6 -0
  934. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/verify.mjs +31 -0
  935. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  936. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/package.json +6 -0
  937. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  938. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/task.json +6 -0
  939. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/verify.mjs +38 -0
  940. package/.worktrees/e58fcc4c/logo.jpg +0 -0
  941. package/.worktrees/e58fcc4c/package-lock.json +977 -0
  942. package/.worktrees/e58fcc4c/package.json +41 -0
  943. package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  944. package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  945. package/.worktrees/e58fcc4c/packages/dashboard/dist/favicon.jpg +0 -0
  946. package/.worktrees/e58fcc4c/packages/dashboard/dist/index.html +16 -0
  947. package/.worktrees/e58fcc4c/packages/dashboard/dist/logo.jpg +0 -0
  948. package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-dashboard.html +836 -0
  949. package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-overview.html +256 -0
  950. package/.worktrees/e58fcc4c/packages/dashboard/package.json +25 -0
  951. package/.worktrees/e58fcc4c/packages/dashboard/server/executor.js +95 -0
  952. package/.worktrees/e58fcc4c/packages/dashboard/server/index.js +679 -0
  953. package/.worktrees/e58fcc4c/packages/dashboard/server/parser.js +526 -0
  954. package/.worktrees/e58fcc4c/packages/dashboard/server/watcher.js +357 -0
  955. package/.worktrees/e58fcc4c/src/agent-session-log.js +803 -0
  956. package/.worktrees/e58fcc4c/src/change-list.js +290 -0
  957. package/.worktrees/e58fcc4c/src/change-risk-profile.js +339 -0
  958. package/.worktrees/e58fcc4c/src/check-primitives.js +65 -0
  959. package/.worktrees/e58fcc4c/src/classify-change.js +109 -0
  960. package/.worktrees/e58fcc4c/src/commit-suggest.js +202 -0
  961. package/.worktrees/e58fcc4c/src/config-cat.js +88 -0
  962. package/.worktrees/e58fcc4c/src/config-schema.js +328 -0
  963. package/.worktrees/e58fcc4c/src/constants.js +97 -0
  964. package/.worktrees/e58fcc4c/src/contract-matrix.js +533 -0
  965. package/.worktrees/e58fcc4c/src/datetime.js +20 -0
  966. package/.worktrees/e58fcc4c/src/db-engine.js +55 -0
  967. package/.worktrees/e58fcc4c/src/db.js +381 -0
  968. package/.worktrees/e58fcc4c/src/decision-distill.js +517 -0
  969. package/.worktrees/e58fcc4c/src/dispatch/backends/local-agent.js +155 -0
  970. package/.worktrees/e58fcc4c/src/dispatch/backends/sillyhub-mcp.js +245 -0
  971. package/.worktrees/e58fcc4c/src/dispatch/probe.js +246 -0
  972. package/.worktrees/e58fcc4c/src/dispatch/strategy.js +121 -0
  973. package/.worktrees/e58fcc4c/src/docs-check.js +825 -0
  974. package/.worktrees/e58fcc4c/src/docs-debt.js +393 -0
  975. package/.worktrees/e58fcc4c/src/docs-gate.js +107 -0
  976. package/.worktrees/e58fcc4c/src/doctor-diagnostics.js +1099 -0
  977. package/.worktrees/e58fcc4c/src/endpoint-extractor.js +409 -0
  978. package/.worktrees/e58fcc4c/src/foreign-declared.js +155 -0
  979. package/.worktrees/e58fcc4c/src/fs-atomic.js +73 -0
  980. package/.worktrees/e58fcc4c/src/git-helper.js +150 -0
  981. package/.worktrees/e58fcc4c/src/hooks/claude-pre-tool-use.cjs +130 -0
  982. package/.worktrees/e58fcc4c/src/hooks/worktree-guard.js +892 -0
  983. package/.worktrees/e58fcc4c/src/index.js +2854 -0
  984. package/.worktrees/e58fcc4c/src/init.js +626 -0
  985. package/.worktrees/e58fcc4c/src/knowledge-match.js +231 -0
  986. package/.worktrees/e58fcc4c/src/local-detect.js +128 -0
  987. package/.worktrees/e58fcc4c/src/local-register.js +104 -0
  988. package/.worktrees/e58fcc4c/src/machine-interface.js +543 -0
  989. package/.worktrees/e58fcc4c/src/migrate.js +127 -0
  990. package/.worktrees/e58fcc4c/src/module-impact.js +166 -0
  991. package/.worktrees/e58fcc4c/src/module-resolve.js +222 -0
  992. package/.worktrees/e58fcc4c/src/modules.js +580 -0
  993. package/.worktrees/e58fcc4c/src/plan-adopt-waves.js +126 -0
  994. package/.worktrees/e58fcc4c/src/progress/change-registry.js +336 -0
  995. package/.worktrees/e58fcc4c/src/progress/consistency-doctor.js +355 -0
  996. package/.worktrees/e58fcc4c/src/progress/shared.js +36 -0
  997. package/.worktrees/e58fcc4c/src/progress/stage-machine.js +594 -0
  998. package/.worktrees/e58fcc4c/src/progress/step-store.js +265 -0
  999. package/.worktrees/e58fcc4c/src/progress.js +1304 -0
  1000. package/.worktrees/e58fcc4c/src/quick-recommend.js +115 -0
  1001. package/.worktrees/e58fcc4c/src/quicklog.js +883 -0
  1002. package/.worktrees/e58fcc4c/src/review-tier.js +77 -0
  1003. package/.worktrees/e58fcc4c/src/run/command.js +1641 -0
  1004. package/.worktrees/e58fcc4c/src/run/complete-handlers.js +1552 -0
  1005. package/.worktrees/e58fcc4c/src/run/complete.js +1259 -0
  1006. package/.worktrees/e58fcc4c/src/run/concurrent-detect.js +156 -0
  1007. package/.worktrees/e58fcc4c/src/run/gates.js +1111 -0
  1008. package/.worktrees/e58fcc4c/src/run/multi-repo-context.js +208 -0
  1009. package/.worktrees/e58fcc4c/src/run/next.js +128 -0
  1010. package/.worktrees/e58fcc4c/src/run/prompt.js +843 -0
  1011. package/.worktrees/e58fcc4c/src/run/quick-audit.js +186 -0
  1012. package/.worktrees/e58fcc4c/src/run/scan-profile.js +269 -0
  1013. package/.worktrees/e58fcc4c/src/run/shared.js +1562 -0
  1014. package/.worktrees/e58fcc4c/src/run/stage.js +587 -0
  1015. package/.worktrees/e58fcc4c/src/run.js +23 -0
  1016. package/.worktrees/e58fcc4c/src/scan-diff.js +388 -0
  1017. package/.worktrees/e58fcc4c/src/scan-postcheck.js +524 -0
  1018. package/.worktrees/e58fcc4c/src/scan-staleness.js +95 -0
  1019. package/.worktrees/e58fcc4c/src/setup.js +414 -0
  1020. package/.worktrees/e58fcc4c/src/sillyhub-mcp/client.js +597 -0
  1021. package/.worktrees/e58fcc4c/src/sillyhub-mcp/config.js +62 -0
  1022. package/.worktrees/e58fcc4c/src/spec-dir-typo.js +50 -0
  1023. package/.worktrees/e58fcc4c/src/spec-sync.js +358 -0
  1024. package/.worktrees/e58fcc4c/src/stage-contract-engine.js +171 -0
  1025. package/.worktrees/e58fcc4c/src/stage-contract-spec.js +551 -0
  1026. package/.worktrees/e58fcc4c/src/stage-contract.js +948 -0
  1027. package/.worktrees/e58fcc4c/src/stage-review.js +597 -0
  1028. package/.worktrees/e58fcc4c/src/stages/archive.js +199 -0
  1029. package/.worktrees/e58fcc4c/src/stages/brainstorm-auto.js +285 -0
  1030. package/.worktrees/e58fcc4c/src/stages/brainstorm.js +624 -0
  1031. package/.worktrees/e58fcc4c/src/stages/cmd-existence.js +145 -0
  1032. package/.worktrees/e58fcc4c/src/stages/doctor.js +540 -0
  1033. package/.worktrees/e58fcc4c/src/stages/execute.js +1277 -0
  1034. package/.worktrees/e58fcc4c/src/stages/explore.js +43 -0
  1035. package/.worktrees/e58fcc4c/src/stages/index.js +29 -0
  1036. package/.worktrees/e58fcc4c/src/stages/knowledge.js +514 -0
  1037. package/.worktrees/e58fcc4c/src/stages/plan-postcheck.js +1398 -0
  1038. package/.worktrees/e58fcc4c/src/stages/plan.js +655 -0
  1039. package/.worktrees/e58fcc4c/src/stages/quick.js +167 -0
  1040. package/.worktrees/e58fcc4c/src/stages/scan.js +608 -0
  1041. package/.worktrees/e58fcc4c/src/stages/status.js +64 -0
  1042. package/.worktrees/e58fcc4c/src/stages/verify.js +246 -0
  1043. package/.worktrees/e58fcc4c/src/sync.js +1470 -0
  1044. package/.worktrees/e58fcc4c/src/task-review.js +1498 -0
  1045. package/.worktrees/e58fcc4c/src/taskcard-placeholders.js +21 -0
  1046. package/.worktrees/e58fcc4c/src/taskcard.js +250 -0
  1047. package/.worktrees/e58fcc4c/src/verify-postcheck.js +1718 -0
  1048. package/.worktrees/e58fcc4c/src/verify-probes.js +327 -0
  1049. package/.worktrees/e58fcc4c/src/version.js +19 -0
  1050. package/.worktrees/e58fcc4c/src/workflow.js +600 -0
  1051. package/.worktrees/e58fcc4c/src/workspace.js +125 -0
  1052. package/.worktrees/e58fcc4c/src/worktree-apply.js +1611 -0
  1053. package/.worktrees/e58fcc4c/src/worktree-deps.js +668 -0
  1054. package/.worktrees/e58fcc4c/src/worktree.js +1849 -0
  1055. package/.worktrees/e58fcc4c/templates/claude-instruction.md +23 -0
  1056. package/.worktrees/e58fcc4c/templates/prompts/taskcard-rules.md +29 -0
  1057. package/.worktrees/e58fcc4c/templates/prompts/testcase-design.md +12 -0
  1058. package/.worktrees/e58fcc4c/templates/prompts/verify-probes.md +32 -0
  1059. package/.worktrees/e58fcc4c/templates/workflows/archive-impact.yaml +79 -0
  1060. package/.worktrees/e58fcc4c/templates/workflows/scan-docs.yaml +132 -0
  1061. package/architecture-analysis.md +448 -0
  1062. package/package.json +1 -1
  1063. package/src/contract-matrix.js +7 -4
  1064. package/src/endpoint-extractor.js +41 -52
  1065. package/src/foreign-declared.js +88 -5
  1066. package/src/fs-atomic.js +20 -3
  1067. package/src/hooks/worktree-guard.js +9 -3
  1068. package/src/index.js +36 -19
  1069. package/src/module-impact.js +1 -1
  1070. package/src/modules.js +23 -21
  1071. package/src/progress/stage-machine.js +23 -0
  1072. package/src/progress.js +38 -2
  1073. package/src/quicklog.js +7 -5
  1074. package/src/run/command.js +7 -6
  1075. package/src/run/complete-handlers.js +6 -2
  1076. package/src/run/complete.js +33 -20
  1077. package/src/run/gates.js +31 -4
  1078. package/src/run/next.js +4 -3
  1079. package/src/run/prompt.js +66 -6
  1080. package/src/run/scan-profile.js +1 -0
  1081. package/src/run/shared.js +11 -5
  1082. package/src/run/stage.js +15 -12
  1083. package/src/scan-diff.js +4 -2
  1084. package/src/stage-contract-spec.js +1 -1
  1085. package/src/stage-contract.js +16 -8
  1086. package/src/stages/brainstorm-auto.js +43 -1
  1087. package/src/stages/brainstorm.js +24 -8
  1088. package/src/stages/execute.js +36 -9
  1089. package/src/stages/knowledge.js +18 -5
  1090. package/src/stages/plan-postcheck.js +63 -7
  1091. package/src/stages/plan.js +13 -6
  1092. package/src/stages/verify.js +1 -1
  1093. package/src/sync.js +27 -11
  1094. package/src/task-review.js +5 -3
  1095. package/src/taskcard.js +35 -0
  1096. package/src/verify-postcheck.js +24 -13
  1097. package/src/verify-probes.js +39 -13
  1098. package/src/worktree-apply.js +481 -292
  1099. package/src/worktree-deps.js +93 -1
  1100. package/src/worktree.js +91 -21
  1101. package/templates/prompts/taskcard-rules.md +1 -1
@@ -545,8 +545,11 @@ function validateVerifyOutputs(cwd, changeName, context = {}) {
545
545
  let receiptText = ''
546
546
  try {
547
547
  // 回执按变更分片(坑 verify-pids-cross-session-kill:原单份被并行会话后写覆盖),
548
- // 优先读本变更分片,兼容旧单份名(升级过渡期 receipt.change 过滤仍生效)
549
- const runtimeDir = join(cwd, '.sillyspec', '.runtime')
548
+ // 优先读本变更分片,兼容旧单份名(升级过渡期 receipt.change 过滤仍生效)。
549
+ // runtimeDir 与写入方 reapVerifyServices 同源解析(context.runtimeRoot > specRoot/.runtime
550
+ // > cwd/.sillyspec/.runtime)——平台/漂移模式下 cwd/.sillyspec 恒读不到回执
551
+ const runtimeDir = context.runtimeRoot
552
+ || join(context.specRoot || join(cwd, '.sillyspec'), '.runtime')
550
553
  const receiptPath = existsSync(join(runtimeDir, `verify-services-${changeName}.receipt.json`))
551
554
  ? join(runtimeDir, `verify-services-${changeName}.receipt.json`)
552
555
  : join(runtimeDir, 'verify-services.receipt.json')
@@ -602,9 +605,14 @@ export function archiveDestDirName(date, changeName) {
602
605
 
603
606
  /**
604
607
  * archive 完成校验:检查归档目录完整性
608
+ *
609
+ * context.specRoot(A4 同族):平台模式下归档目录在 specRoot/changes/archive(gates.js /
610
+ * machine-interface.js 调 runValidators 已透传 specRoot: platformOpts?.specRoot),此前硬编码
611
+ * cwd/.sillyspec 平台模式恒报「归档目录缺失」。
605
612
  */
606
- function validateArchiveOutputs(cwd, changeName) {
607
- const archiveDir = join(cwd, '.sillyspec', 'changes', 'archive')
613
+ function validateArchiveOutputs(cwd, changeName, context = {}) {
614
+ const specBase = context.specRoot || join(cwd, '.sillyspec')
615
+ const archiveDir = join(specBase, 'changes', 'archive')
608
616
  const destDir = join(archiveDir, changeName)
609
617
 
610
618
  // 归档目录不存在 early return(引擎在存在时才跑)
@@ -620,14 +628,14 @@ function validateArchiveOutputs(cwd, changeName) {
620
628
  /**
621
629
  * archive 前置校验:所有主流程阶段完成
622
630
  */
623
- function validateChangeClosed(cwd, changeName) {
631
+ function validateChangeClosed(cwd, changeName, context = {}) {
624
632
  const errors = []
625
633
  const warnings = []
626
634
 
627
- // 检查前置阶段状态
628
- const progressDir = join(cwd, '.sillyspec', '.runtime')
635
+ // context.specRoot:平台模式下变更目录在 specRoot/changes(同 validateArchiveOutputs)
636
+ const specBase = context.specRoot || join(cwd, '.sillyspec')
629
637
  // 这里只做文件层面的检查,DB 检查在 run.js 里做
630
- const changeDir = join(cwd, '.sillyspec', 'changes', changeName)
638
+ const changeDir = join(specBase, 'changes', changeName)
631
639
  if (!existsSync(changeDir)) {
632
640
  errors.push(`变更目录不存在: ${changeDir}`)
633
641
  return { ok: false, errors, warnings }
@@ -149,7 +149,49 @@ AC-011: 不涉及业务规则/产品范围/默认行为/用户可见行为变更
149
149
  ### 产物文件
150
150
 
151
151
  #### design.md(必填,写入变更根目录 \`design.md\`)
152
- 包含:背景、设计目标、非目标、总体方案、文件变更清单、接口定义、数据模型(如涉及)、兼容策略(brownfield)、风险登记、决策追踪。
152
+ 包含:背景、设计目标、非目标、总体方案、文件变更清单、接口定义、数据模型(如涉及)、兼容策略(brownfield)、风险登记、决策追踪、自审。
153
+ **章节骨架必须按下述字面格式写**(校验器按字面短语匹配,措辞偏离会连环卡门——坑 literal-template-trap,2026-08-24 用户反馈五期②):
154
+ \`\`\`markdown
155
+ # 设计文档(Design)— <变更简述>
156
+
157
+ ## 背景
158
+ <为什么做、解决什么问题>
159
+
160
+ ## 设计目标
161
+ <要达成什么>
162
+
163
+ ## 非目标
164
+ <明确不做的事——标题必须字面含「非目标」(Non-Goals 也认,但大小写须完全一致)>
165
+
166
+ ## 总体方案
167
+ <技术方案>
168
+
169
+ ## 文件变更清单
170
+ | 操作 | 文件路径 | 说明 |
171
+ |---|---|---|
172
+ | 新增 | src/xxx/NewFile.ts | ... |
173
+ | 修改 | src/xxx/ExistingFile.ts | ... |
174
+
175
+ ## 生命周期契约表
176
+ <仅当涉及 session/lease/agent_run/daemon/lifecycle/state_transition/claim/heartbeat 关键词时必填;
177
+ 若不涉及,删掉本节或在正文写紧邻豁免短语:「不涉及生命周期契约」或「生命周期契约:无/N/A」
178
+ ——「无需 lifecycle 事件」这类宽写法不被识别(否定词必须紧邻「生命周期契约/lifecycle contract」)>
179
+
180
+ | 事件 | 发起方 | 接收方 | 必需字段 | 状态变化 |
181
+ |---|---|---|---|---|
182
+ | <事件名> | <发起方> | <接收方> | <字段清单> | <初始态 → 终态> |
183
+
184
+ ## 风险登记
185
+ | 编号 | 风险 | 等级 | 应对策略 |
186
+ |---|---|---|---|
187
+ | R-01 | ... | P0/P1/P2 | ... |
188
+
189
+ ## 决策追踪
190
+ <列出 D-xxx@vN 决策 ID 及覆盖关系;无决策可写「无」>
191
+
192
+ ## 自审
193
+ <对自身设计的校验——标题必须字面含「自审」或「Self-Review」(自我审查等宽写法不识别)>
194
+ \`\`\`
153
195
 
154
196
  #### decisions.md(必填,写入变更根目录 \`decisions.md\`)
155
197
  记录所有决策:
@@ -162,11 +162,15 @@ export const definition = {
162
162
  5. **场景压力测试**:用具体 case 逼出边界(失败重试、部分成功、历史数据、权限不足、并发修改、兼容旧配置)
163
163
  6. **前提挑战优先**:如果现有设计或代码已有简单路径,先说明"可能不该新增"
164
164
 
165
- **决策记录草稿**:每解决一个有实现影响的问题,生成一个稳定 ID 的记录草稿(不要把闲聊都记录进去):
165
+ **决策记录(增量落盘,防会话中断丢失)**:每解决一个有实现影响的问题(不要把闲聊都记录进去),**当场追加**写入 \`{SPEC_ROOT}/changes/<change-name>/decisions.md\`——不要只在对话里留草稿等「写设计文档」步统一落盘:会话随时可能中断,未落盘的决策无法跨会话恢复。落盘规则:
166
+
167
+ - 文件不存在则先创建:变更目录缺失先 \`mkdir -p {SPEC_ROOT}/changes/<change-name>\`;文件头部写 YAML frontmatter(\`author: <git-user>\` / \`created_at: <now-datetime>\`)+ 标题 \`# 决策记录(Decisions)\`
168
+ - 每条记录追加到文件末尾,格式如下:
166
169
 
167
170
  \`\`\`markdown
168
171
  ## D-001@v1: <短标题>
169
172
  - type: term | boundary | premise | architecture | compatibility | risk
173
+ - priority: P0 | P1 | P2
170
174
  - status: accepted | rejected | superseded
171
175
  - source: user | code | docs
172
176
  - question: <被解决的问题>
@@ -176,6 +180,8 @@ export const definition = {
176
180
  - evidence: <文件路径/代码位置/用户回答轮次>
177
181
  \`\`\`
178
182
 
183
+ - 幂等:写入前按 D-xxx@vN 查重,已存在的不重复追加;后续修正走新版本 D-001@v2 + supersedes(见 Design Grill 版本规则)
184
+
179
185
  ### 铁律 — 不要自问自答 / 等待用户
180
186
  - 这是人机协作步骤:提出问题后必须暂停等用户回答,**不要在输出里模拟用户回答然后说"需求已明确"**(命令由 CLI 在下方注入)
181
187
  - 需要拆分或批量模式时:列出方案并暂停等用户确认
@@ -183,12 +189,12 @@ export const definition = {
183
189
  - 2-3 轮问答即进入方案讨论;达到 maxWaitRounds=8 后必须总结已确认内容与剩余风险,不要无限追问
184
190
 
185
191
  ### 输出
186
- 需求理解摘要(用户确认的需求点列表)+ 拆分/批量结论(如适用)+ D-xxx@vN 决策记录草稿 + 剩余风险(如有)
192
+ 需求理解摘要(用户确认的需求点列表)+ 拆分/批量结论(如适用)+ 本步新增落盘的 D-xxx@vN 清单 + 剩余风险(如有)
187
193
 
188
194
  ### 注意
189
195
  - 第一次进入此步骤时,按 A→D 顺序处理;有原型先分析,再探索,再判规模,再澄清
190
- - 用户通过 \`--continue --answer "回答"\` 回答后,本步骤会再次执行,此时检查是否需要追问或可以结束`,
191
- outputHint: '需求理解与决策记录草稿',
196
+ - 用户通过 \`--continue --answer "回答"\` 回答后,本步骤会再次执行,此时检查是否需要追问或可以结束;再次执行时输出只需增量汇报(新结论 + 新落盘决策),已落盘内容不要重复输出`,
197
+ outputHint: '需求理解与决策落盘清单',
192
198
  optional: false
193
199
  },
194
200
  {
@@ -202,6 +208,7 @@ export const definition = {
202
208
  1. 每种方案列出:核心思路、优势、劣势
203
209
  2. 如果上一步产生了 D-xxx@vN 决策记录,方案必须说明覆盖/违反哪些当前版本决策
204
210
  3. 给出推荐方案和理由
211
+ 4. 用户选定方案后,把选择结果**当场追加**到 \`{SPEC_ROOT}/changes/<change-name>/decisions.md\`(增量落盘规则同「对话式探索」步:目录/文件缺失先创建、按 D-xxx@vN 判重):type 用 architecture、source 用 user、question 记方案取舍问题、answer 记用户所选方案与理由要点、evidence 记方案选择轮次——方案选择是本变更最关键的用户决策,必须随答随落盘,不能只留在对话里
205
212
 
206
213
  ### 铁律 — 必须等待用户选择方案
207
214
  - 列出方案对比表和推荐后必须暂停等用户选择,**不要自己说"推荐方案 A"然后当用户选了**(命令由 CLI 在下方注入)
@@ -287,9 +294,15 @@ design.md 第一行标题必须用中文:# 设计文档(Design)— <变更
287
294
  | 删除 | src/xxx/OldFile.java | 已被 xx 替代 |
288
295
 
289
296
  **字段数据流标注**(避免新增字段到 execute 才发现没透传):当清单含「新增/修改对外字段、接口、DTO、响应体、事件 payload、配置键」时,对应行「说明」列必须交代 producer→consumer 数据流——产出方(producer)→ 每跳流转/归一化点(序列化/反序列化/字段映射/默认值兜底)→ 消费方(consumer)。漏标 = 字段在某跳 dormant(声明了却没透传),到 execute/verify 才暴露,属设计层缺口。
290
- - 示例:「修改 daemon.ts:新增 budget_tokens,producer=backend/api-types.ts → ws_hub envelope 透传 → daemon.ts normalizeUsage 归一化(snake→camel)→ consumer=runtime/lease.ts 写 lease」
297
+ - 示例:「修改 daemon.ts:新增 budget_tokens,producer=backend/api-types.ts → ws_hub envelope 透传 → daemon.ts normalizeUsage(snake→camel)→ consumer=runtime/lease.ts 写 lease」
291
298
  - 仅改内部实现、无对外字段变动时,说明列照常写「新增 xx 方法」即可,无需数据流。
292
299
 
300
+ **跨仓变更写法**(本次变更涉及 local.yaml repos: 注册的其他仓时必读;纯主仓变更跳过):
301
+ - 清单**按仓分段**:每个仓一个小节,标题格式固定 \`## <repo-key> 仓变更\`(如 \`## sub-grid-security 仓变更\`)。plan-postcheck 文件覆盖对账按此段头解析仓归属,写成「前端仓 / backend」等其他标题 → 对账不上
302
+ - 段内路径相对**该仓根**写(\`src/routes/x.js\`);❌ 禁止带仓库名前缀(\`sub-grid-security/src/routes/x.js\`)、❌ 禁止绝对路径/盘符路径(\`C:/repo/src/...\`)——后续 TaskCard 的 allowed_paths 与 review 对账(\`git -C <仓根> diff\` 产仓根相对路径)都用同一口径,前缀/绝对路径永不命中
303
+ - 主仓文件放在第一个段头之前(无段头区域 = main),或单独写 \`## main 仓变更\` 段
304
+ - repo-key 必须是 local.yaml repos: 段已注册的键(未注册先跑 \`sillyspec local register-repo <key> <仓根路径>\`,main 隐式不用注册)
305
+
293
306
  7. **接口定义**:方法签名、数据结构(代码类任务必填)
294
307
  7.5. **生命周期契约表**(涉及以下关键词时必填,否则可省略):
295
308
 
@@ -308,6 +321,8 @@ design.md 第一行标题必须用中文:# 设计文档(Design)— <变更
308
321
 
309
322
  判断规则:
310
323
  - design.md 或需求中出现上述关键词 → 必须生成此表
324
+ - 确实不涉及 → 写**紧邻豁免短语**(照抄其一):「不涉及生命周期契约」「不适用 lifecycle contract」「生命周期契约:无/N/A」
325
+ ——「本变更无需 lifecycle 事件」「lifecycle 状态无变化」这类宽写法**不被识别**(否定词必须紧邻「生命周期契约/lifecycle contract」)
311
326
  - 表中的每个事件 → 必须有对应代码任务、接口任务、测试任务
312
327
  - 表中的必需字段 → 必须出现在相关 DTO/interface 定义中
313
328
  - 缺少任一事件 → 在 design.md 风险登记中明确记录
@@ -334,10 +349,11 @@ design.md 第一行标题必须用中文:# 设计文档(Design)— <变更
334
349
  1. 确认变更目录存在:\`mkdir -p {SPEC_ROOT}/changes/<change-name>\`(Windows 用 \`mkdir {SPEC_ROOT}/changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path {SPEC_ROOT}/changes/<change-name>\`)
335
350
  - 变更名格式必须为 \`YYYY-MM-DD-<简短描述>\`(如 \`2026-05-13-user-auth\`)
336
351
  2. 将确认的设计写入 \`{SPEC_ROOT}/changes/<change-name>/design.md\`
337
- 3. 如果对话探索或方案讨论产生了实现相关决策,写入 \`{SPEC_ROOT}/changes/<change-name>/decisions.md\`:
352
+ 3. 对账整理 \`{SPEC_ROOT}/changes/<change-name>/decisions.md\`(「对话式探索」「提出方案」步已按增量规则随答落盘,本步做对账而非从零写入):
338
353
  - decisions.md 是本次变更的决策台账,不是长期术语表
339
354
  - 只记录有实现/验收影响的决策,闲聊和低风险偏好不记录
340
- - 每条记录必须有稳定版本 ID:D-001@v1、D-002@v1 ...
355
+ - 已落盘条目按 D-xxx@vN 判重,不重复追加;补全缺失的九字段与可选字段
356
+ - 前序遗漏未落盘、确有实现影响的决策(增量规则漏网的),此时补写;每条记录必须有稳定版本 ID:D-001@v1、D-002@v1 ...
341
357
  - 若后续 Design Grill 修正该决策,新记录使用 D-001@v2,并写明 supersedes: D-001@v1
342
358
  - 每条记录必须包含:type、status、source、question、answer、normalized_requirement、impacts、evidence、priority
343
359
  - 九字段之外可另加四个可选字段,按需填写、不强制全填(旧格式决策记录缺这些字段不受影响):
@@ -570,7 +586,7 @@ created_at: <now-datetime>
570
586
  \`\`\`
571
587
  > 骨架只列任务名。plan 阶段会把展开后的清单**写回本文件**(checkbox 行带一句话名,可附 [model:xxx]/(depends_on: …) 标注;保留 frontmatter/标题/ql-xxx 等非 task-XX 行);execute 勾选与 verify 对照都在本文件。
572
588
 
573
- ### decisions.md 格式要求(仅在有 Grill/重大决策时生成)
589
+ ### decisions.md 格式要求(前序步骤已增量创建时对账即可;无决策的变更不生成)
574
590
  \`\`\`markdown
575
591
  ---
576
592
  author: <git-user>
@@ -717,6 +717,8 @@ export async function stampCrossRepoHeadCommits({ changeName, cwd, specBase, pla
717
717
  }
718
718
  let stamped = 0
719
719
  let skipped = 0
720
+ // 同仓多 task 只 spawn 一次 rev-parse(Windows 单次 spawn 30-100ms,N task × 同仓纯浪费)
721
+ const headCache = new Map()
720
722
  for (const f of readdirSync(tasksDir).filter(n => /^task-\d+\.md$/.test(n)).sort()) {
721
723
  const taskFile = path.join(tasksDir, f)
722
724
  let content
@@ -735,7 +737,8 @@ export async function stampCrossRepoHeadCommits({ changeName, cwd, specBase, pla
735
737
  reasons.push(`${f}: repo "${repoKey}" 无法解析 gitDir(local.yaml repos 未注册?)`)
736
738
  continue
737
739
  }
738
- const head = gitQuiet(entry.gitDir, ['rev-parse', 'HEAD'])
740
+ if (!headCache.has(entry.gitDir)) headCache.set(entry.gitDir, gitQuiet(entry.gitDir, ['rev-parse', 'HEAD']))
741
+ const head = headCache.get(entry.gitDir)
739
742
  if (!head) {
740
743
  skipped++
741
744
  reasons.push(`${f}: git rev-parse HEAD 失败(${entry.gitDir})`)
@@ -760,6 +763,22 @@ export async function stampCrossRepoHeadCommits({ changeName, cwd, specBase, pla
760
763
  */
761
764
  export function buildWavePrompt(wave, waveIndex, changeDir, worktreePath, options = {}) {
762
765
  const ctx = options.ctx || null
766
+ // 跨 Wave 共享缓存(性能收敛 O(W×T) → O(T)):一次 buildExecuteSteps 期间 plan/契约矩阵/
767
+ // task 卡/模块卡表/design 行集不变,每 Wave 重读重解析是纯浪费(6-8 Wave × 15 task 的
768
+ // full 级变更 = 数百次冗余 fs + 契约矩阵全卡重扫)。缓存对象由 buildExecuteSteps 创建传入;
769
+ // 直接调用(tests / 单 Wave)不传 _execCache 时全部退化为即时计算,行为不变
770
+ const cache = options._execCache || null
771
+ const memo = (slot, compute) => {
772
+ if (!cache) return compute()
773
+ if (!(slot in cache)) cache[slot] = compute()
774
+ return cache[slot]
775
+ }
776
+ const memoMap = (slot, key, compute) => {
777
+ if (!cache) return compute()
778
+ if (!cache[slot]) cache[slot] = new Map()
779
+ if (!cache[slot].has(key)) cache[slot].set(key, compute())
780
+ return cache[slot].get(key)
781
+ }
763
782
  // ── Contract Matrix:检查是否有 provider/consumer 契约需要注入 ──
764
783
  let contractInjection = ''
765
784
  let prototypeInjection = ''
@@ -767,7 +786,7 @@ export function buildWavePrompt(wave, waveIndex, changeDir, worktreePath, option
767
786
  try {
768
787
  const planFile = path.join(changeDir, 'plan.md')
769
788
  if (existsSync(planFile)) {
770
- const planContent = readFileSync(planFile, 'utf8')
789
+ const planContent = memo('plan', () => readFileSync(planFile, 'utf8'))
771
790
  // 收集本 wave 所有 task(端点注入与字段注入共用)
772
791
  const waveTasks = wave.tasks.map((t, ti) => {
773
792
  const num = String(t.index || (ti + 1)).padStart(2, '0')
@@ -775,7 +794,7 @@ export function buildWavePrompt(wave, waveIndex, changeDir, worktreePath, option
775
794
  })
776
795
 
777
796
  // 1) 端点级契约(provider/consumer via buildContractMatrix)
778
- const contracts = buildContractMatrix(planContent, changeDir)
797
+ const contracts = memo('contracts', () => buildContractMatrix(planContent, changeDir))
779
798
  const relevantContracts = contracts.filter(c => waveTasks.includes(c.consumer))
780
799
  if (relevantContracts.length > 0) {
781
800
  contractInjection = `
@@ -802,7 +821,7 @@ ${injection}
802
821
  // 命中「provider 漏字段、consumer fallback 编造 → 运行时 403/500」这类 bug:
803
822
  // 把 consumer 期望字段 vs provider 承诺字段显式注入子代理 prompt
804
823
  for (const taskName of waveTasks) {
805
- const fi = buildContractFieldInjection(changeDir, taskName)
824
+ const fi = memoMap('fieldInjections', taskName, () => buildContractFieldInjection(changeDir, taskName))
806
825
  if (fi) {
807
826
  contractInjection += `
808
827
  ### 子代理 ${taskName} 的字段契约注入
@@ -848,11 +867,12 @@ ${prototypes.map(p => `- \`${path.join(protoRelDir, p)}\``).join('\n')}
848
867
  // 平台模式(specRoot 异位)回退 process.cwd()——子项目目录前缀判定用,误差只降级匹配粒度
849
868
  const repoRoot = path.basename(specBase) === '.sillyspec' ? path.dirname(specBase) : process.cwd()
850
869
  const waveTaskIds = new Set(wave.tasks.map((t, ti) => `task-${String(t.index || (ti + 1)).padStart(2, '0')}`))
851
- const { hasMaps, rows } = resolveChangeModuleCards({
870
+ // 模块卡表与 Wave 无关(按 change 全量解析后本 Wave 过滤):memo 跨 Wave 共享
871
+ const { hasMaps, rows } = memo('moduleCards', () => resolveChangeModuleCards({
852
872
  cwd: repoRoot,
853
873
  specBase,
854
874
  changeName: path.basename(changeDir),
855
- })
875
+ }))
856
876
  const hits = rows.filter(r => waveTaskIds.has(r.taskId) && r.moduleId)
857
877
  if (hasMaps && hits.length > 0) {
858
878
  const kb = n => (n > 0 ? `${(n / 1024).toFixed(1)}KB` : '?')
@@ -879,7 +899,7 @@ ${cardLines}
879
899
  const designPath = path.join(changeDir, 'design.md')
880
900
  if (existsSync(designPath)) {
881
901
  const SECTION_CHAR_LIMIT = 2400
882
- const dLines = readFileSync(designPath, 'utf8').replace(/\r\n/g, '\n').split('\n')
902
+ const dLines = memo('designLines', () => readFileSync(designPath, 'utf8').replace(/\r\n/g, '\n').split('\n'))
883
903
  const sections = []
884
904
  let cur = null
885
905
  dLines.forEach((l, i) => {
@@ -988,11 +1008,13 @@ ${indexLines}
988
1008
 
989
1009
  // D-010 跨仓 task base 锡点:派发前实时 git rev-parse HEAD 落 task 卡 base_commit
990
1010
  // 仅对跨仓 task(repo≠'main')落盘,主仓 task 锚 meta.baseHash(MultiRepoContext 已处理)
1011
+ const baseCommitCache = new Map() // 同仓多 task 只 spawn 一次
991
1012
  for (const item of perTaskWorkdirs) {
992
1013
  if (item.repo === 'main') continue
993
1014
  const entry = ctx.resolve(item.repo)
994
1015
  if (!entry) continue
995
- const baseCommit = gitQuiet(entry.gitDir, ['rev-parse', 'HEAD'])
1016
+ if (!baseCommitCache.has(entry.gitDir)) baseCommitCache.set(entry.gitDir, gitQuiet(entry.gitDir, ['rev-parse', 'HEAD']))
1017
+ const baseCommit = baseCommitCache.get(entry.gitDir)
996
1018
  if (!baseCommit) continue // git 不可达已由 MultiRepoContext 构造时 fail-closed 拦截,此处置防御
997
1019
  const taskFile = changeDir
998
1020
  ? path.join(changeDir, 'tasks', `task-${item.taskNum}.md`)
@@ -1022,6 +1044,7 @@ ${crossLines}
1022
1044
 
1023
1045
  **跨仓 task 子代理 prompt 必须注入:**
1024
1046
  > 该 task 改的是 \`<repo>\` 仓,workdir=\`<跨仓仓根>\`。**直接在该仓主干工作区改+commit(git add + git commit 到该仓主干),不经主仓 worktree、不建分支。** commit 到该仓主干即落盘,apply 阶段对跨仓 task 为 no-op(design §5.4 G1)。
1047
+ > task 卡 allowed_paths 是相对**该仓根**的路径(如 \`src/routes/x.js\`)——不带仓库名前缀(\`<repo>/src/...\` ❌)、不是绝对路径;在 workdir 下直接按相对路径定位文件。
1025
1048
  `
1026
1049
  }
1027
1050
 
@@ -1265,10 +1288,14 @@ export function buildExecuteSteps(planFilePath = null, options = {}) {
1265
1288
  // (D-013)。缺省=null → buildWavePrompt 退化为单仓单 worktreePath(零回归)。
1266
1289
  const ctx = options.ctx || null
1267
1290
 
1291
+ // 跨 Wave 共享缓存:plan/契约矩阵/task 卡字段注入/模块卡表/design 行集在一次步骤表
1292
+ // 构建期间不变,逐 Wave 重读重算是 O(W×T) 纯浪费(见 buildWavePrompt 内 memo 注释)
1293
+ const execCache = {}
1294
+
1268
1295
  const waveSteps = waves.map((wave, i) => ({
1269
1296
  name: `Wave ${i + 1} 执行`,
1270
1297
  mode: 'implementation',
1271
- prompt: buildWavePrompt(wave, i + 1, changeDir, worktreePath, { dispatchMode: options.dispatchMode, branch: options.branch, ctx }),
1298
+ prompt: buildWavePrompt(wave, i + 1, changeDir, worktreePath, { dispatchMode: options.dispatchMode, branch: options.branch, ctx, _execCache: execCache }),
1272
1299
  outputHint: `Wave ${i + 1} 执行结果`,
1273
1300
  optional: false
1274
1301
  }))
@@ -14,8 +14,9 @@
14
14
  * propose — 提议新知识(写入 proposed/)
15
15
  */
16
16
 
17
- import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync, statSync } from 'fs'
17
+ import { existsSync, readFileSync, readdirSync, mkdirSync, statSync } from 'fs'
18
18
  import { join, basename } from 'path'
19
+ import { writeAtomicSync } from '../fs-atomic.js'
19
20
  import { parseKnowledgeIndex, matchKnowledge } from '../knowledge-match.js'
20
21
 
21
22
  // ── 工具函数 ──
@@ -305,6 +306,11 @@ export async function cmdRefresh(dir, args, opts = {}) {
305
306
  const scanFiles = readdirSync(scanDir).filter(f => f.endsWith('.md'))
306
307
  const generated = []
307
308
  const overwritten = []
309
+ // 同 run 文件名去重(坑 knowledge-slug-collision):slug 只由章节标题生成,不同 scan 文件
310
+ // 的同名章节(如各自都有「## 概述」)后者 writeFileSync 静默覆盖前者,INDEX 却登记两条
311
+ // 指向同一路径的条目——知识条目无声丢失。碰撞时追加 -2/-3 后缀保双份(唯一命名零扰动,
312
+ // 每次 refresh 按相同文件顺序重跑,后缀分配稳定)
313
+ const usedNames = new Set()
308
314
 
309
315
  for (const scanFile of scanFiles) {
310
316
  const scanPath = join(scanDir, scanFile)
@@ -321,7 +327,13 @@ export async function cmdRefresh(dir, args, opts = {}) {
321
327
  .replace(/^-|-$/g, '')
322
328
  .slice(0, 60)
323
329
 
324
- const fileName = `${slug}.md`
330
+ let fileName = `${slug}.md`
331
+ if (usedNames.has(fileName)) {
332
+ let n = 2
333
+ while (usedNames.has(`${slug}-${n}.md`)) n++
334
+ fileName = `${slug}-${n}.md`
335
+ }
336
+ usedNames.add(fileName)
325
337
  const genPath = join(generatedDir, fileName)
326
338
  const isNew = !existsSync(genPath)
327
339
 
@@ -337,7 +349,8 @@ export async function cmdRefresh(dir, args, opts = {}) {
337
349
  section.body,
338
350
  ].join('\n')
339
351
 
340
- writeFileSync(genPath, entryContent)
352
+ // INDEX/generated 是 search/validate 的解析源(跨进程读),走原子写防半截
353
+ writeAtomicSync(genPath, entryContent)
341
354
  generated.push({ file: `generated/${fileName}`, title: `${title} — ${section.heading}`, new: isNew })
342
355
  if (!isNew) overwritten.push(`generated/${fileName}`)
343
356
  }
@@ -358,7 +371,7 @@ export async function cmdRefresh(dir, args, opts = {}) {
358
371
  for (const g of generated) {
359
372
  indexLines.push(`- ${g.title} → [${g.file}](${g.file})`)
360
373
  }
361
- writeFileSync(genIndexPath, indexLines.join('\n'))
374
+ writeAtomicSync(genIndexPath, indexLines.join('\n'))
362
375
 
363
376
  output(true, {
364
377
  generated_count: generated.length,
@@ -416,7 +429,7 @@ export async function cmdPropose(dir, args, opts = {}) {
416
429
  '> This is a proposed knowledge entry. Review and merge into manual/ or generated/.',
417
430
  ].join('\n')
418
431
 
419
- writeFileSync(propPath, content)
432
+ writeAtomicSync(propPath, content)
420
433
 
421
434
  output(true, {
422
435
  id: `proposed/${slug}`,
@@ -387,11 +387,17 @@ export function collectTaskDepMap(tasksDir) {
387
387
  /**
388
388
  * 本地一致性校验器
389
389
  * @param {string} changeDir - 变更目录
390
+ * @param {{ repoRegistry?: Map<string,string> }} [opts]
391
+ * repoRegistry:local.yaml repos: 段解析结果(executePlanPostcheck 传入)。提供时启用两类
392
+ * 跨仓口径校验:① task 卡 repo: 键未注册 → error(提前到 plan 期拦,不等 execute fail-closed);
393
+ * ② allowed_paths 带其他注册键前缀 → warning。缺省(plan-adopt-waves / 单仓旧调用)只做
394
+ * 无注册表依赖的形态校验(绝对路径 / 自仓前缀),零回归。
390
395
  * @returns {{ ok: boolean, errors: string[], warnings: string[] }}
391
396
  */
392
- export function validateBlueprintConsistency(changeDir) {
397
+ export function validateBlueprintConsistency(changeDir, opts = {}) {
393
398
  const errors = []
394
399
  const warnings = []
400
+ const repoRegistry = opts.repoRegistry instanceof Map ? opts.repoRegistry : null
395
401
 
396
402
  const tasksDir = pJoin(changeDir, 'tasks')
397
403
  if (!existsSync(tasksDir)) {
@@ -441,6 +447,48 @@ export function validateBlueprintConsistency(changeDir) {
441
447
  warnings.push(bsRule.data.messageTdd.replaceAll('${id}', `${taskId} (${file})`))
442
448
  }
443
449
 
450
+ // ── 跨仓路径口径校验(坑 cross-repo-allowed-path-base,2026-08-26 实证)──
451
+ // allowed_paths 的统一口径 = task 卡 repo: 声明仓的**仓根相对路径**(review 归属按
452
+ // `git -C <仓根> diff` 产出的仓根相对路径匹配、design 覆盖对账按「## <repo> 仓变更」
453
+ // 段内相对路径匹配)。agent 生成跨仓 task 卡时易把仓库名前缀 / 绝对盘符路径写进
454
+ // allowed_paths(如 sub-grid-security/src/...),两种对账都永不命中——task 改完却判
455
+ // 「无归属」、design 报「未被覆盖」,错误信号在下游且误导。此处前置拦根因:
456
+ // 绝对路径 / 自仓前缀(repo: X + 路径以 X/ 开头)→ error 硬拦(无合法布局);
457
+ // 其他注册键前缀 → warning(主仓内与 repo 同名目录的罕见合法布局不阻断)。
458
+ for (const p of allowedPaths) {
459
+ const isAbsoluteShape = p.startsWith('/') || p.startsWith('\\\\') || /^[A-Za-z]:[\\/]/.test(p)
460
+ if (isAbsoluteShape) {
461
+ errors.push(
462
+ `${taskId} (${file}): allowed_paths 含绝对路径「${p}」——必须写 repo 声明仓的仓根相对路径(如 src/routes/x.js)。` +
463
+ `绝对路径在 review 归属对账(git -C <仓根> diff 产仓根相对路径)与 design 覆盖对账中永不命中,task 改完会被判「无归属」。`
464
+ )
465
+ continue
466
+ }
467
+ const firstSeg = p.split(/[\\/]/)[0]
468
+ if (repo !== 'main' && firstSeg === repo) {
469
+ errors.push(
470
+ `${taskId} (${file}): allowed_paths「${p}」带了自仓前缀「${repo}/」——该 task 已声明 repo: ${repo},子代理 workdir 即该仓根,` +
471
+ `路径应为仓根相对(${p.slice(repo.length + 1)}),去掉前缀「${repo}/」。带前缀路径在两种对账中永不命中。`
472
+ )
473
+ } else if (repoRegistry && firstSeg !== 'main' && repoRegistry.has(firstSeg)) {
474
+ warnings.push(
475
+ `${taskId} (${file}): allowed_paths「${p}」首段「${firstSeg}」是 local.yaml repos: 注册键——` +
476
+ `若本 task 属于该跨仓仓:补 repo: ${firstSeg} 并去掉路径前缀(仓根相对);` +
477
+ `若主仓内确有同名目录(罕见合法布局):忽略本警告。`
478
+ )
479
+ }
480
+ }
481
+
482
+ // repo: 键注册校验(仅注册表可用时;execute 启动 MultiRepoContext 也会 fail-closed 拦,
483
+ // 此处提前到 plan --done,报错即给注册命令,不等 execute 才发现)
484
+ if (repoRegistry && repo !== 'main' && !repoRegistry.has(repo)) {
485
+ errors.push(
486
+ `${taskId} (${file}): repo: ${repo} 未在 local.yaml repos: 段注册——先跑 ` +
487
+ `\`sillyspec local register-repo ${repo} <${repo} 仓根路径>\` 注册(main 隐式不用注册),` +
488
+ `否则 execute 启动 fail-closed 阻断。`
489
+ )
490
+ }
491
+
444
492
  for (const p of allowedPaths) {
445
493
  const key = `${repo}|${p}`
446
494
  if (!pathOwners.has(key)) pathOwners.set(key, { repo, path: p, owners: [] })
@@ -1199,8 +1247,20 @@ export async function executePlanPostcheck(context) {
1199
1247
  }
1200
1248
  }
1201
1249
 
1250
+ // ── local.yaml 预读(跨仓 repos 注册表 + monorepo modules,一次读两用)──
1251
+ // repos 喂检查 1 的 allowed_paths 路径口径校验 + repo: 键注册校验;
1252
+ // modules 喂检查 1c-b 的命令存在性校验(monorepo 子包感知)。
1253
+ const localYamlPath = pJoin(specDir, 'local.yaml')
1254
+ let taskModules = null
1255
+ let repoRegistry = null
1256
+ if (existsSync(localYamlPath)) {
1257
+ const localYamlText = readFileSync(localYamlPath, 'utf8')
1258
+ taskModules = parseLocalYamlModules(localYamlText)
1259
+ repoRegistry = parseRepoRegistry(localYamlText)
1260
+ }
1261
+
1202
1262
  // ── 1. 一致性校验 ──
1203
- const consistency = validateBlueprintConsistency(changeDir)
1263
+ const consistency = validateBlueprintConsistency(changeDir, { repoRegistry })
1204
1264
  if (consistency.errors.length > 0) {
1205
1265
  failures.push({ name: '蓝图一致性校验', errors: consistency.errors, hint: '请修复上述问题后重新完成此步骤。' })
1206
1266
  }
@@ -1230,11 +1290,7 @@ export async function executePlanPostcheck(context) {
1230
1290
  // scripts 中存在(monorepo 子包感知——读 local.yaml modules 块定位)。
1231
1291
  // invalid → error 硬阻断,避免 execute 子代理跑死命令(design D-04 / 问题 3)。
1232
1292
  // modules 块可选:无块时仅查根 package.json(与 scan-postcheck 历史行为一致)。
1233
- const localYamlPath = pJoin(specDir, 'local.yaml')
1234
- let taskModules = null
1235
- if (existsSync(localYamlPath)) {
1236
- taskModules = parseLocalYamlModules(readFileSync(localYamlPath, 'utf8'))
1237
- }
1293
+ // local.yaml 已在检查 1 前预读(taskModules),此处直接消费。
1238
1294
  const taskCmds = validateTaskCommands(changeDir, context.cwd, taskModules)
1239
1295
  if (taskCmds.errors.length > 0) {
1240
1296
  failures.push({
@@ -329,7 +329,7 @@ tier: {REVIEW_TIER}({REVIEW_TIER_REASON})
329
329
  - [ ] task 编号与 Wave checkbox 格式正确,execute 依赖此格式解析任务
330
330
  - [ ] plan_level 档位与实际复杂度匹配(none/light/full 没选错)
331
331
  - [ ] 跨任务契约:task-A 的产出(接口/DTO/响应)被 task-B 消费时,consumer 是否在 TaskCard expects_from 声明所需字段、provider 是否在 provides 承诺、两边字段一致?(plan-postcheck 会硬校验,此处是独立视角复查)
332
- - [ ] 文件覆盖:design.md 文件变更清单中的每个源码文件,是否都被至少一个 task 的 allowed_paths 覆盖?(漏覆盖 = execute 必然漏改)
332
+ - [ ] 文件覆盖:design.md 文件变更清单中的每个源码文件,是否都被至少一个 task 的 allowed_paths 覆盖?(漏覆盖 = execute 必然漏改。跨仓变更对账口径:design 清单按「## <repo-key> 仓变更」分段、路径相对各仓根,task 卡 repo: + 同口径相对路径匹配——allowed_paths 带仓库名前缀或绝对路径 = 永不命中、对账不上)
333
333
  - [ ] 不存在 P0/P1 unresolved blocker 残留
334
334
  - [ ] 没有实现细节泄漏到 plan.md(接口签名/代码示例应在 tasks/task-NN.md)
335
335
  - [ ] 关键路径与 Wave 依赖合理(无循环依赖、无遗漏前置)
@@ -407,7 +407,8 @@ depends_on: []
407
407
  blocks: []
408
408
  requirement_ids: [FR-XX]
409
409
  decision_ids: [D-XXX@vN]
410
- allowed_paths:
410
+ repo: <repo-key> # 可选。仅跨仓 task 填:local.yaml repos: 注册的仓 key(缺省=main,主仓 task 省略此行)
411
+ allowed_paths: # ⚠️ 路径相对 repo 声明的仓根(跨仓=跨仓仓根,主仓=主仓根),禁止带仓库名前缀/绝对路径
411
412
  - frontend/src/lib/errors.ts
412
413
  provides: # 可选。仅当本 task 给其他 task 提供接口/DTO/响应时填
413
414
  - contract: <DTO或响应类型名> # 如 DaemonRuntimeRead
@@ -456,7 +457,12 @@ ${taskList}
456
457
 
457
458
  **你必须使用 Agent tool 启动子代理来写卡片,不要自己写。**
458
459
 
459
- 1. 确认 \`${changeDir}/tasks/\` 目录存在(不存在则创建)
460
+ 0. **先由你(主 agent)一次性预生成全部骨架**(2026-08-25 实证:并行子代理各自跑 taskcard CLI 撞进度库 SQLite 锁,主代理单进程预生成 + 子代理只 Edit 才稳):
461
+ \`\`\`
462
+ sillyspec taskcard ${changeName} --all
463
+ \`\`\`
464
+ 幂等,已存在的卡跳过不覆盖;骨架带 LF 行尾 + 闭合 frontmatter + 硬校验 9 字段 + depends_on 反填。**只有主 agent 跑这一次,子代理一律不再运行 taskcard CLI。**
465
+ 1. 确认 \`${changeDir}/tasks/\` 目录存在(上一步预生成会自动创建)
460
466
  2. **按 batch 分派子代理(减少总子代理数量,而不是一个 task 一个子代理):**
461
467
  - 把任务按「同一 Wave + 同一模块/相近能力 + 无跨 batch 强依赖」原则分组
462
468
  - **每个 batch 包含 2~4 个 task**;Wave 内任务数 ≤4 时整个 Wave 可作为一个 batch
@@ -474,7 +480,7 @@ ${taskList}
474
480
  你是一个专注的 TaskCard 生成器。你的任务是为指定 batch 生成全部 TaskCard。
475
481
 
476
482
  ## ⚠️ 格式形态(第一眼必读,坑 taskcard-body-section-rework)
477
- TaskCard 的契约字段全部在 **frontmatter**(首对 --- 包裹的 YAML 键值对:id/title/title_zh/allowed_paths/goal/...)——**不是 body 章节**(## 标题下的段落)。goal 是 frontmatter 的 \`goal: >\` 多行标量、implementation/acceptance/verify/constraints 是 frontmatter 的列表项;写成 body 章节(\`## goal\` / \`## Goal\` 等)会三组校验全挂返工。先跑骨架命令再 Edit 填充,骨架即正确形态。
483
+ TaskCard 的契约字段全部在 **frontmatter**(首对 --- 包裹的 YAML 键值对:id/title/title_zh/allowed_paths/goal/...)——**不是 body 章节**(## 标题下的段落)。goal 是 frontmatter 的 \`goal: >\` 多行标量、implementation/acceptance/verify/constraints 是 frontmatter 的列表项;写成 body 章节(\`## goal\` / \`## Goal\` 等)会三组校验全挂返工。骨架已由主 agent 预生成(正确形态),直接 Edit 填充即可。
478
484
 
479
485
  ## 输入
480
486
  - 变更目录:${changeDir}
@@ -486,8 +492,7 @@ TaskCard 的契约字段全部在 **frontmatter**(首对 --- 包裹的 YAML
486
492
  ## 操作
487
493
  1. 读取 ${changeDir}/design.md 和 ${changeDir}/plan.md 了解整体上下文
488
494
  2. 读取本 batch 涉及的相关源文件
489
- 3. 为 batch 中的**每一个 task** 先运行 CLI 生成 Windows 安全骨架(在项目根目录执行;编号/标题自动取自 plan.md,author/created_at 自动填写):
490
- sillyspec taskcard ${changeName} --task <本 batch 任务号,逗号分隔,如 task-01,task-02>
495
+ 3. **骨架已由主 agent 预生成**(\`${changeDir}/tasks/task-NN.md\` 已存在,LF 行尾 + 闭合 frontmatter + 硬校验 9 字段齐全)。**禁止再运行 \`sillyspec taskcard\` CLI**——并行子代理各起 CLI 进程会撞进度库 SQLite 锁(2026-08-25 实证);若发现本 batch 某卡骨架缺失,报告主 agent 补跑,不要自己跑
491
496
  4. 用 Edit tool 逐卡填充骨架占位符(allowed_paths/goal/implementation/acceptance/verify/constraints 等)。**禁止用 Write 整文件重写**——手写整卡是 CRLF 行尾/漏闭合 --- /漏硬校验字段三类 postcheck 拒绝的根源,骨架 + Edit 从源头消灭
492
497
  5. 骨架字段含义与可选字段(provides/expects_from/related_tests,按需插进 frontmatter)参考下述模板:
493
498
 
@@ -496,6 +501,7 @@ ${taskcardTemplate}
496
501
  ## 约束
497
502
  - 每个 task 20~40 行;禁止在 TaskCard 里写实现细节之外的冗长设计
498
503
  - 同 batch 内 task 的 allowed_paths 不要互相冲突
504
+ - **跨仓 task 路径口径(涉及 local.yaml repos: 注册仓的变更必读)**:跨仓 task frontmatter 必须填 \`repo: <repo-key>\`(local.yaml repos: 注册键,缺省=main 省略不填);allowed_paths 相对**该仓根**写(\`src/routes/x.js\`),从 design.md「\`## <repo-key> 仓变更\`」段内路径原样搬。❌ 禁止带仓库名前缀(\`sub-grid-security/src/...\`)、❌ 禁止绝对路径/盘符(\`C:/repo/src/...\`)——review 对账按 \`git -C <仓根> diff\` 的仓根相对路径匹配 allowed_paths,带前缀/绝对路径永不命中 → task 改完却判「无归属」对账不上
499
505
  - 若 task 之间有 provides/expects_from 契约,同 batch 生成时必须字段对齐
500
506
  - 只生成本 batch 声明的任务,不要多写或少写
501
507
  - 不要在 TaskCard 里泄露 plan.md 中未出现的实现假设
@@ -515,6 +521,7 @@ ${taskcardTemplate}
515
521
  - 每个 task 总长度 20~40 行
516
522
  - **一致性自查**:
517
523
  - allowed_paths 有无冲突
524
+ - 跨仓 task:repo: 键是 local.yaml repos: 已注册键;allowed_paths 全部为仓根相对路径(无仓库名前缀、无绝对路径/盘符);与 design.md 对应「仓变更」段路径同口径
518
525
  - depends_on 与 plan.md Wave 分组是否一致
519
526
  - provides/expects_from 契约自洽:每个 expects_from[provider].needs 字段都在该 provider task 的 provides.fields 里(plan-postcheck 会硬校验,这里提前自查)
520
527
  - related_tests 判据 = 是否有既有测试因本次改动而失败(非「源文件是否共享」;UI 文案/常量/签名变更等单文件场景也算);若填,测试路径必须都在本 task 或某 task 的 allowed_paths 内(否则子代理无权改 → execute 测试债、主代理事后兜底)
@@ -236,7 +236,7 @@ verify-result.md 路径 + 验证报告摘要 + 下一步命令
236
236
 
237
237
  ### 注意
238
238
  - PASS → 运行 \`sillyspec run archive\` 归档
239
- - FAIL → 修复后运行 \`sillyspec run verify\` 重新验证
239
+ - FAIL → 修复后运行 \`sillyspec run verify\` 重新验证——注意重验时 CLI 会重新执行 commands.test 全量对账(长套件数分钟、同步无输出属正常;可 local.yaml test_strategy: module 收窄)
240
240
  - verify-result.md 是变更包的正式验收记录,归档后保留
241
241
  - **CLI 对账机制**:本步骤 --done 时 CLI 会亲自执行 local.yaml 的 commands.test;结论写 PASS 但实测失败 → verify 完成被阻断`,
242
242
  outputHint: '验证报告',