sillyspec 3.27.6 → 3.27.9

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 (923) 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/c1eae35e/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  369. package/.worktrees/c1eae35e/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  370. package/.worktrees/c1eae35e/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  371. package/.worktrees/c1eae35e/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  372. package/.worktrees/c1eae35e/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  373. package/.worktrees/c1eae35e/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  374. package/.worktrees/c1eae35e/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  375. package/.worktrees/c1eae35e/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  376. package/.worktrees/c1eae35e/.claude/skills/sillyspec-export/SKILL.md +57 -0
  377. package/.worktrees/c1eae35e/.claude/skills/sillyspec-init/SKILL.md +177 -0
  378. package/.worktrees/c1eae35e/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  379. package/.worktrees/c1eae35e/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  380. package/.worktrees/c1eae35e/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  381. package/.worktrees/c1eae35e/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  382. package/.worktrees/c1eae35e/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  383. package/.worktrees/c1eae35e/.claude/skills/sillyspec-state/SKILL.md +64 -0
  384. package/.worktrees/c1eae35e/.claude/skills/sillyspec-status/SKILL.md +54 -0
  385. package/.worktrees/c1eae35e/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  386. package/.worktrees/c1eae35e/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  387. package/.worktrees/c1eae35e/.gitattributes +2 -0
  388. package/.worktrees/c1eae35e/.husky/pre-push +20 -0
  389. package/.worktrees/c1eae35e/README.md +203 -0
  390. package/.worktrees/c1eae35e/SKILL.md +91 -0
  391. package/.worktrees/c1eae35e/architecture-analysis.md +448 -0
  392. package/.worktrees/c1eae35e/bin/sillyspec.js +2 -0
  393. package/.worktrees/c1eae35e/eval/README.md +86 -0
  394. package/.worktrees/c1eae35e/eval/eval.config.json +28 -0
  395. package/.worktrees/c1eae35e/eval/lib/adapters/cli.mjs +63 -0
  396. package/.worktrees/c1eae35e/eval/lib/adapters/dryrun.mjs +27 -0
  397. package/.worktrees/c1eae35e/eval/lib/config.mjs +82 -0
  398. package/.worktrees/c1eae35e/eval/lib/db.mjs +76 -0
  399. package/.worktrees/c1eae35e/eval/lib/report.mjs +120 -0
  400. package/.worktrees/c1eae35e/eval/lib/runner.mjs +157 -0
  401. package/.worktrees/c1eae35e/eval/lib/tasks.mjs +73 -0
  402. package/.worktrees/c1eae35e/eval/lib/util.mjs +107 -0
  403. package/.worktrees/c1eae35e/eval/lib/workdir.mjs +30 -0
  404. package/.worktrees/c1eae35e/eval/run.mjs +83 -0
  405. package/.worktrees/c1eae35e/eval/tasks/001-slugify/files/package.json +6 -0
  406. package/.worktrees/c1eae35e/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  407. package/.worktrees/c1eae35e/eval/tasks/001-slugify/task.json +6 -0
  408. package/.worktrees/c1eae35e/eval/tasks/001-slugify/verify.mjs +28 -0
  409. package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/package.json +6 -0
  410. package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  411. package/.worktrees/c1eae35e/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  412. package/.worktrees/c1eae35e/eval/tasks/002-each-day/task.json +6 -0
  413. package/.worktrees/c1eae35e/eval/tasks/002-each-day/verify.mjs +31 -0
  414. package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  415. package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/package.json +6 -0
  416. package/.worktrees/c1eae35e/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  417. package/.worktrees/c1eae35e/eval/tasks/003-word-report/task.json +6 -0
  418. package/.worktrees/c1eae35e/eval/tasks/003-word-report/verify.mjs +38 -0
  419. package/.worktrees/c1eae35e/logo.jpg +0 -0
  420. package/.worktrees/c1eae35e/package-lock.json +977 -0
  421. package/.worktrees/c1eae35e/package.json +41 -0
  422. package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  423. package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  424. package/.worktrees/c1eae35e/packages/dashboard/dist/favicon.jpg +0 -0
  425. package/.worktrees/c1eae35e/packages/dashboard/dist/index.html +16 -0
  426. package/.worktrees/c1eae35e/packages/dashboard/dist/logo.jpg +0 -0
  427. package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-dashboard.html +836 -0
  428. package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-overview.html +256 -0
  429. package/.worktrees/c1eae35e/packages/dashboard/package.json +25 -0
  430. package/.worktrees/c1eae35e/packages/dashboard/server/executor.js +95 -0
  431. package/.worktrees/c1eae35e/packages/dashboard/server/index.js +679 -0
  432. package/.worktrees/c1eae35e/packages/dashboard/server/parser.js +526 -0
  433. package/.worktrees/c1eae35e/packages/dashboard/server/watcher.js +357 -0
  434. package/.worktrees/c1eae35e/src/agent-session-log.js +803 -0
  435. package/.worktrees/c1eae35e/src/change-list.js +290 -0
  436. package/.worktrees/c1eae35e/src/change-risk-profile.js +339 -0
  437. package/.worktrees/c1eae35e/src/check-primitives.js +65 -0
  438. package/.worktrees/c1eae35e/src/classify-change.js +109 -0
  439. package/.worktrees/c1eae35e/src/commit-suggest.js +202 -0
  440. package/.worktrees/c1eae35e/src/config-cat.js +88 -0
  441. package/.worktrees/c1eae35e/src/config-schema.js +328 -0
  442. package/.worktrees/c1eae35e/src/constants.js +97 -0
  443. package/.worktrees/c1eae35e/src/contract-matrix.js +533 -0
  444. package/.worktrees/c1eae35e/src/datetime.js +20 -0
  445. package/.worktrees/c1eae35e/src/db-engine.js +55 -0
  446. package/.worktrees/c1eae35e/src/db.js +381 -0
  447. package/.worktrees/c1eae35e/src/decision-distill.js +517 -0
  448. package/.worktrees/c1eae35e/src/dispatch/backends/local-agent.js +155 -0
  449. package/.worktrees/c1eae35e/src/dispatch/backends/sillyhub-mcp.js +245 -0
  450. package/.worktrees/c1eae35e/src/dispatch/probe.js +246 -0
  451. package/.worktrees/c1eae35e/src/dispatch/strategy.js +121 -0
  452. package/.worktrees/c1eae35e/src/docs-check.js +825 -0
  453. package/.worktrees/c1eae35e/src/docs-debt.js +393 -0
  454. package/.worktrees/c1eae35e/src/docs-gate.js +107 -0
  455. package/.worktrees/c1eae35e/src/doctor-diagnostics.js +1099 -0
  456. package/.worktrees/c1eae35e/src/endpoint-extractor.js +409 -0
  457. package/.worktrees/c1eae35e/src/foreign-declared.js +155 -0
  458. package/.worktrees/c1eae35e/src/fs-atomic.js +73 -0
  459. package/.worktrees/c1eae35e/src/git-helper.js +150 -0
  460. package/.worktrees/c1eae35e/src/hooks/claude-pre-tool-use.cjs +130 -0
  461. package/.worktrees/c1eae35e/src/hooks/worktree-guard.js +892 -0
  462. package/.worktrees/c1eae35e/src/index.js +2854 -0
  463. package/.worktrees/c1eae35e/src/init.js +626 -0
  464. package/.worktrees/c1eae35e/src/knowledge-match.js +231 -0
  465. package/.worktrees/c1eae35e/src/local-detect.js +128 -0
  466. package/.worktrees/c1eae35e/src/local-register.js +104 -0
  467. package/.worktrees/c1eae35e/src/machine-interface.js +543 -0
  468. package/.worktrees/c1eae35e/src/migrate.js +127 -0
  469. package/.worktrees/c1eae35e/src/module-impact.js +166 -0
  470. package/.worktrees/c1eae35e/src/module-resolve.js +222 -0
  471. package/.worktrees/c1eae35e/src/modules.js +580 -0
  472. package/.worktrees/c1eae35e/src/plan-adopt-waves.js +126 -0
  473. package/.worktrees/c1eae35e/src/progress/change-registry.js +336 -0
  474. package/.worktrees/c1eae35e/src/progress/consistency-doctor.js +355 -0
  475. package/.worktrees/c1eae35e/src/progress/shared.js +36 -0
  476. package/.worktrees/c1eae35e/src/progress/stage-machine.js +594 -0
  477. package/.worktrees/c1eae35e/src/progress/step-store.js +265 -0
  478. package/.worktrees/c1eae35e/src/progress.js +1304 -0
  479. package/.worktrees/c1eae35e/src/quick-recommend.js +115 -0
  480. package/.worktrees/c1eae35e/src/quicklog.js +883 -0
  481. package/.worktrees/c1eae35e/src/review-tier.js +77 -0
  482. package/.worktrees/c1eae35e/src/run/command.js +1641 -0
  483. package/.worktrees/c1eae35e/src/run/complete-handlers.js +1552 -0
  484. package/.worktrees/c1eae35e/src/run/complete.js +1259 -0
  485. package/.worktrees/c1eae35e/src/run/concurrent-detect.js +156 -0
  486. package/.worktrees/c1eae35e/src/run/gates.js +1111 -0
  487. package/.worktrees/c1eae35e/src/run/multi-repo-context.js +208 -0
  488. package/.worktrees/c1eae35e/src/run/next.js +128 -0
  489. package/.worktrees/c1eae35e/src/run/prompt.js +843 -0
  490. package/.worktrees/c1eae35e/src/run/quick-audit.js +186 -0
  491. package/.worktrees/c1eae35e/src/run/scan-profile.js +269 -0
  492. package/.worktrees/c1eae35e/src/run/shared.js +1562 -0
  493. package/.worktrees/c1eae35e/src/run/stage.js +587 -0
  494. package/.worktrees/c1eae35e/src/run.js +23 -0
  495. package/.worktrees/c1eae35e/src/scan-diff.js +388 -0
  496. package/.worktrees/c1eae35e/src/scan-postcheck.js +524 -0
  497. package/.worktrees/c1eae35e/src/scan-staleness.js +95 -0
  498. package/.worktrees/c1eae35e/src/setup.js +414 -0
  499. package/.worktrees/c1eae35e/src/sillyhub-mcp/client.js +597 -0
  500. package/.worktrees/c1eae35e/src/sillyhub-mcp/config.js +62 -0
  501. package/.worktrees/c1eae35e/src/spec-dir-typo.js +50 -0
  502. package/.worktrees/c1eae35e/src/spec-sync.js +358 -0
  503. package/.worktrees/c1eae35e/src/stage-contract-engine.js +171 -0
  504. package/.worktrees/c1eae35e/src/stage-contract-spec.js +551 -0
  505. package/.worktrees/c1eae35e/src/stage-contract.js +948 -0
  506. package/.worktrees/c1eae35e/src/stage-review.js +597 -0
  507. package/.worktrees/c1eae35e/src/stages/archive.js +199 -0
  508. package/.worktrees/c1eae35e/src/stages/brainstorm-auto.js +285 -0
  509. package/.worktrees/c1eae35e/src/stages/brainstorm.js +624 -0
  510. package/.worktrees/c1eae35e/src/stages/cmd-existence.js +145 -0
  511. package/.worktrees/c1eae35e/src/stages/doctor.js +540 -0
  512. package/.worktrees/c1eae35e/src/stages/execute.js +1277 -0
  513. package/.worktrees/c1eae35e/src/stages/explore.js +43 -0
  514. package/.worktrees/c1eae35e/src/stages/index.js +29 -0
  515. package/.worktrees/c1eae35e/src/stages/knowledge.js +514 -0
  516. package/.worktrees/c1eae35e/src/stages/plan-postcheck.js +1398 -0
  517. package/.worktrees/c1eae35e/src/stages/plan.js +655 -0
  518. package/.worktrees/c1eae35e/src/stages/quick.js +167 -0
  519. package/.worktrees/c1eae35e/src/stages/scan.js +608 -0
  520. package/.worktrees/c1eae35e/src/stages/status.js +64 -0
  521. package/.worktrees/c1eae35e/src/stages/verify.js +246 -0
  522. package/.worktrees/c1eae35e/src/sync.js +1470 -0
  523. package/.worktrees/c1eae35e/src/task-review.js +1498 -0
  524. package/.worktrees/c1eae35e/src/taskcard-placeholders.js +21 -0
  525. package/.worktrees/c1eae35e/src/taskcard.js +250 -0
  526. package/.worktrees/c1eae35e/src/verify-postcheck.js +1718 -0
  527. package/.worktrees/c1eae35e/src/verify-probes.js +327 -0
  528. package/.worktrees/c1eae35e/src/version.js +19 -0
  529. package/.worktrees/c1eae35e/src/workflow.js +600 -0
  530. package/.worktrees/c1eae35e/src/workspace.js +125 -0
  531. package/.worktrees/c1eae35e/src/worktree-apply.js +1611 -0
  532. package/.worktrees/c1eae35e/src/worktree-deps.js +668 -0
  533. package/.worktrees/c1eae35e/src/worktree.js +1849 -0
  534. package/.worktrees/c1eae35e/templates/claude-instruction.md +23 -0
  535. package/.worktrees/c1eae35e/templates/prompts/taskcard-rules.md +29 -0
  536. package/.worktrees/c1eae35e/templates/prompts/testcase-design.md +12 -0
  537. package/.worktrees/c1eae35e/templates/prompts/verify-probes.md +32 -0
  538. package/.worktrees/c1eae35e/templates/workflows/archive-impact.yaml +79 -0
  539. package/.worktrees/c1eae35e/templates/workflows/scan-docs.yaml +132 -0
  540. package/.worktrees/dafc71ad/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  541. package/.worktrees/dafc71ad/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  542. package/.worktrees/dafc71ad/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  543. package/.worktrees/dafc71ad/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  544. package/.worktrees/dafc71ad/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  545. package/.worktrees/dafc71ad/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  546. package/.worktrees/dafc71ad/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  547. package/.worktrees/dafc71ad/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  548. package/.worktrees/dafc71ad/.claude/skills/sillyspec-export/SKILL.md +57 -0
  549. package/.worktrees/dafc71ad/.claude/skills/sillyspec-init/SKILL.md +177 -0
  550. package/.worktrees/dafc71ad/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  551. package/.worktrees/dafc71ad/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  552. package/.worktrees/dafc71ad/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  553. package/.worktrees/dafc71ad/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  554. package/.worktrees/dafc71ad/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  555. package/.worktrees/dafc71ad/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  556. package/.worktrees/dafc71ad/.claude/skills/sillyspec-state/SKILL.md +64 -0
  557. package/.worktrees/dafc71ad/.claude/skills/sillyspec-status/SKILL.md +54 -0
  558. package/.worktrees/dafc71ad/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  559. package/.worktrees/dafc71ad/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  560. package/.worktrees/dafc71ad/.gitattributes +2 -0
  561. package/.worktrees/dafc71ad/.husky/pre-push +20 -0
  562. package/.worktrees/dafc71ad/README.md +203 -0
  563. package/.worktrees/dafc71ad/SKILL.md +91 -0
  564. package/.worktrees/dafc71ad/analysis.md +366 -0
  565. package/.worktrees/dafc71ad/architecture-analysis.md +448 -0
  566. package/.worktrees/dafc71ad/bin/sillyspec.js +2 -0
  567. package/.worktrees/dafc71ad/eval/README.md +86 -0
  568. package/.worktrees/dafc71ad/eval/eval.config.json +28 -0
  569. package/.worktrees/dafc71ad/eval/lib/adapters/cli.mjs +63 -0
  570. package/.worktrees/dafc71ad/eval/lib/adapters/dryrun.mjs +27 -0
  571. package/.worktrees/dafc71ad/eval/lib/config.mjs +82 -0
  572. package/.worktrees/dafc71ad/eval/lib/db.mjs +76 -0
  573. package/.worktrees/dafc71ad/eval/lib/report.mjs +120 -0
  574. package/.worktrees/dafc71ad/eval/lib/runner.mjs +157 -0
  575. package/.worktrees/dafc71ad/eval/lib/tasks.mjs +73 -0
  576. package/.worktrees/dafc71ad/eval/lib/util.mjs +107 -0
  577. package/.worktrees/dafc71ad/eval/lib/workdir.mjs +30 -0
  578. package/.worktrees/dafc71ad/eval/run.mjs +83 -0
  579. package/.worktrees/dafc71ad/eval/tasks/001-slugify/files/package.json +6 -0
  580. package/.worktrees/dafc71ad/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  581. package/.worktrees/dafc71ad/eval/tasks/001-slugify/task.json +6 -0
  582. package/.worktrees/dafc71ad/eval/tasks/001-slugify/verify.mjs +28 -0
  583. package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/package.json +6 -0
  584. package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  585. package/.worktrees/dafc71ad/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  586. package/.worktrees/dafc71ad/eval/tasks/002-each-day/task.json +6 -0
  587. package/.worktrees/dafc71ad/eval/tasks/002-each-day/verify.mjs +31 -0
  588. package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  589. package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/package.json +6 -0
  590. package/.worktrees/dafc71ad/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  591. package/.worktrees/dafc71ad/eval/tasks/003-word-report/task.json +6 -0
  592. package/.worktrees/dafc71ad/eval/tasks/003-word-report/verify.mjs +38 -0
  593. package/.worktrees/dafc71ad/logo.jpg +0 -0
  594. package/.worktrees/dafc71ad/package-lock.json +977 -0
  595. package/.worktrees/dafc71ad/package.json +41 -0
  596. package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  597. package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  598. package/.worktrees/dafc71ad/packages/dashboard/dist/favicon.jpg +0 -0
  599. package/.worktrees/dafc71ad/packages/dashboard/dist/index.html +16 -0
  600. package/.worktrees/dafc71ad/packages/dashboard/dist/logo.jpg +0 -0
  601. package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-dashboard.html +836 -0
  602. package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-overview.html +256 -0
  603. package/.worktrees/dafc71ad/packages/dashboard/package.json +25 -0
  604. package/.worktrees/dafc71ad/packages/dashboard/server/executor.js +95 -0
  605. package/.worktrees/dafc71ad/packages/dashboard/server/index.js +679 -0
  606. package/.worktrees/dafc71ad/packages/dashboard/server/parser.js +526 -0
  607. package/.worktrees/dafc71ad/packages/dashboard/server/watcher.js +357 -0
  608. package/.worktrees/dafc71ad/src/agent-session-log.js +803 -0
  609. package/.worktrees/dafc71ad/src/change-list.js +290 -0
  610. package/.worktrees/dafc71ad/src/change-risk-profile.js +339 -0
  611. package/.worktrees/dafc71ad/src/check-primitives.js +65 -0
  612. package/.worktrees/dafc71ad/src/classify-change.js +109 -0
  613. package/.worktrees/dafc71ad/src/commit-suggest.js +202 -0
  614. package/.worktrees/dafc71ad/src/config-cat.js +88 -0
  615. package/.worktrees/dafc71ad/src/config-schema.js +328 -0
  616. package/.worktrees/dafc71ad/src/constants.js +97 -0
  617. package/.worktrees/dafc71ad/src/contract-matrix.js +533 -0
  618. package/.worktrees/dafc71ad/src/datetime.js +20 -0
  619. package/.worktrees/dafc71ad/src/db-engine.js +55 -0
  620. package/.worktrees/dafc71ad/src/db.js +381 -0
  621. package/.worktrees/dafc71ad/src/decision-distill.js +517 -0
  622. package/.worktrees/dafc71ad/src/dispatch/backends/local-agent.js +155 -0
  623. package/.worktrees/dafc71ad/src/dispatch/backends/sillyhub-mcp.js +245 -0
  624. package/.worktrees/dafc71ad/src/dispatch/probe.js +246 -0
  625. package/.worktrees/dafc71ad/src/dispatch/strategy.js +121 -0
  626. package/.worktrees/dafc71ad/src/docs-check.js +825 -0
  627. package/.worktrees/dafc71ad/src/docs-debt.js +393 -0
  628. package/.worktrees/dafc71ad/src/docs-gate.js +107 -0
  629. package/.worktrees/dafc71ad/src/doctor-diagnostics.js +1099 -0
  630. package/.worktrees/dafc71ad/src/endpoint-extractor.js +409 -0
  631. package/.worktrees/dafc71ad/src/foreign-declared.js +155 -0
  632. package/.worktrees/dafc71ad/src/fs-atomic.js +73 -0
  633. package/.worktrees/dafc71ad/src/git-helper.js +150 -0
  634. package/.worktrees/dafc71ad/src/hooks/claude-pre-tool-use.cjs +130 -0
  635. package/.worktrees/dafc71ad/src/hooks/worktree-guard.js +892 -0
  636. package/.worktrees/dafc71ad/src/index.js +2854 -0
  637. package/.worktrees/dafc71ad/src/init.js +626 -0
  638. package/.worktrees/dafc71ad/src/knowledge-match.js +231 -0
  639. package/.worktrees/dafc71ad/src/local-detect.js +128 -0
  640. package/.worktrees/dafc71ad/src/local-register.js +104 -0
  641. package/.worktrees/dafc71ad/src/machine-interface.js +543 -0
  642. package/.worktrees/dafc71ad/src/migrate.js +127 -0
  643. package/.worktrees/dafc71ad/src/module-impact.js +166 -0
  644. package/.worktrees/dafc71ad/src/module-resolve.js +222 -0
  645. package/.worktrees/dafc71ad/src/modules.js +580 -0
  646. package/.worktrees/dafc71ad/src/plan-adopt-waves.js +126 -0
  647. package/.worktrees/dafc71ad/src/progress/change-registry.js +336 -0
  648. package/.worktrees/dafc71ad/src/progress/consistency-doctor.js +355 -0
  649. package/.worktrees/dafc71ad/src/progress/shared.js +36 -0
  650. package/.worktrees/dafc71ad/src/progress/stage-machine.js +594 -0
  651. package/.worktrees/dafc71ad/src/progress/step-store.js +265 -0
  652. package/.worktrees/dafc71ad/src/progress.js +1304 -0
  653. package/.worktrees/dafc71ad/src/quick-recommend.js +115 -0
  654. package/.worktrees/dafc71ad/src/quicklog.js +883 -0
  655. package/.worktrees/dafc71ad/src/review-tier.js +77 -0
  656. package/.worktrees/dafc71ad/src/run/command.js +1641 -0
  657. package/.worktrees/dafc71ad/src/run/complete-handlers.js +1552 -0
  658. package/.worktrees/dafc71ad/src/run/complete.js +1259 -0
  659. package/.worktrees/dafc71ad/src/run/concurrent-detect.js +156 -0
  660. package/.worktrees/dafc71ad/src/run/gates.js +1111 -0
  661. package/.worktrees/dafc71ad/src/run/multi-repo-context.js +208 -0
  662. package/.worktrees/dafc71ad/src/run/next.js +128 -0
  663. package/.worktrees/dafc71ad/src/run/prompt.js +843 -0
  664. package/.worktrees/dafc71ad/src/run/quick-audit.js +186 -0
  665. package/.worktrees/dafc71ad/src/run/scan-profile.js +269 -0
  666. package/.worktrees/dafc71ad/src/run/shared.js +1562 -0
  667. package/.worktrees/dafc71ad/src/run/stage.js +587 -0
  668. package/.worktrees/dafc71ad/src/run.js +23 -0
  669. package/.worktrees/dafc71ad/src/scan-diff.js +388 -0
  670. package/.worktrees/dafc71ad/src/scan-postcheck.js +524 -0
  671. package/.worktrees/dafc71ad/src/scan-staleness.js +95 -0
  672. package/.worktrees/dafc71ad/src/setup.js +414 -0
  673. package/.worktrees/dafc71ad/src/sillyhub-mcp/client.js +597 -0
  674. package/.worktrees/dafc71ad/src/sillyhub-mcp/config.js +62 -0
  675. package/.worktrees/dafc71ad/src/spec-dir-typo.js +50 -0
  676. package/.worktrees/dafc71ad/src/spec-sync.js +358 -0
  677. package/.worktrees/dafc71ad/src/stage-contract-engine.js +171 -0
  678. package/.worktrees/dafc71ad/src/stage-contract-spec.js +551 -0
  679. package/.worktrees/dafc71ad/src/stage-contract.js +948 -0
  680. package/.worktrees/dafc71ad/src/stage-review.js +597 -0
  681. package/.worktrees/dafc71ad/src/stages/archive.js +199 -0
  682. package/.worktrees/dafc71ad/src/stages/brainstorm-auto.js +285 -0
  683. package/.worktrees/dafc71ad/src/stages/brainstorm.js +624 -0
  684. package/.worktrees/dafc71ad/src/stages/cmd-existence.js +145 -0
  685. package/.worktrees/dafc71ad/src/stages/doctor.js +540 -0
  686. package/.worktrees/dafc71ad/src/stages/execute.js +1277 -0
  687. package/.worktrees/dafc71ad/src/stages/explore.js +43 -0
  688. package/.worktrees/dafc71ad/src/stages/index.js +29 -0
  689. package/.worktrees/dafc71ad/src/stages/knowledge.js +514 -0
  690. package/.worktrees/dafc71ad/src/stages/plan-postcheck.js +1398 -0
  691. package/.worktrees/dafc71ad/src/stages/plan.js +655 -0
  692. package/.worktrees/dafc71ad/src/stages/quick.js +167 -0
  693. package/.worktrees/dafc71ad/src/stages/scan.js +608 -0
  694. package/.worktrees/dafc71ad/src/stages/status.js +64 -0
  695. package/.worktrees/dafc71ad/src/stages/verify.js +246 -0
  696. package/.worktrees/dafc71ad/src/sync.js +1470 -0
  697. package/.worktrees/dafc71ad/src/task-review.js +1498 -0
  698. package/.worktrees/dafc71ad/src/taskcard-placeholders.js +21 -0
  699. package/.worktrees/dafc71ad/src/taskcard.js +250 -0
  700. package/.worktrees/dafc71ad/src/verify-postcheck.js +1718 -0
  701. package/.worktrees/dafc71ad/src/verify-probes.js +327 -0
  702. package/.worktrees/dafc71ad/src/version.js +19 -0
  703. package/.worktrees/dafc71ad/src/workflow.js +600 -0
  704. package/.worktrees/dafc71ad/src/workspace.js +125 -0
  705. package/.worktrees/dafc71ad/src/worktree-apply.js +1611 -0
  706. package/.worktrees/dafc71ad/src/worktree-deps.js +668 -0
  707. package/.worktrees/dafc71ad/src/worktree.js +1849 -0
  708. package/.worktrees/dafc71ad/templates/claude-instruction.md +23 -0
  709. package/.worktrees/dafc71ad/templates/prompts/taskcard-rules.md +29 -0
  710. package/.worktrees/dafc71ad/templates/prompts/testcase-design.md +12 -0
  711. package/.worktrees/dafc71ad/templates/prompts/verify-probes.md +32 -0
  712. package/.worktrees/dafc71ad/templates/workflows/archive-impact.yaml +79 -0
  713. package/.worktrees/dafc71ad/templates/workflows/scan-docs.yaml +132 -0
  714. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  715. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  716. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  717. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  718. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  719. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  720. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  721. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  722. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-export/SKILL.md +57 -0
  723. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-init/SKILL.md +177 -0
  724. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  725. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  726. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  727. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  728. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  729. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  730. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-state/SKILL.md +64 -0
  731. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-status/SKILL.md +54 -0
  732. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  733. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  734. package/.worktrees/e58fcc4c/.gitattributes +2 -0
  735. package/.worktrees/e58fcc4c/.husky/pre-push +20 -0
  736. package/.worktrees/e58fcc4c/README.md +203 -0
  737. package/.worktrees/e58fcc4c/SKILL.md +91 -0
  738. package/.worktrees/e58fcc4c/architecture-analysis.md +503 -0
  739. package/.worktrees/e58fcc4c/bin/sillyspec.js +2 -0
  740. package/.worktrees/e58fcc4c/eval/README.md +86 -0
  741. package/.worktrees/e58fcc4c/eval/eval.config.json +28 -0
  742. package/.worktrees/e58fcc4c/eval/lib/adapters/cli.mjs +63 -0
  743. package/.worktrees/e58fcc4c/eval/lib/adapters/dryrun.mjs +27 -0
  744. package/.worktrees/e58fcc4c/eval/lib/config.mjs +82 -0
  745. package/.worktrees/e58fcc4c/eval/lib/db.mjs +76 -0
  746. package/.worktrees/e58fcc4c/eval/lib/report.mjs +120 -0
  747. package/.worktrees/e58fcc4c/eval/lib/runner.mjs +157 -0
  748. package/.worktrees/e58fcc4c/eval/lib/tasks.mjs +73 -0
  749. package/.worktrees/e58fcc4c/eval/lib/util.mjs +107 -0
  750. package/.worktrees/e58fcc4c/eval/lib/workdir.mjs +30 -0
  751. package/.worktrees/e58fcc4c/eval/run.mjs +83 -0
  752. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/files/package.json +6 -0
  753. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  754. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/task.json +6 -0
  755. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/verify.mjs +28 -0
  756. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/package.json +6 -0
  757. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  758. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  759. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/task.json +6 -0
  760. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/verify.mjs +31 -0
  761. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  762. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/package.json +6 -0
  763. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  764. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/task.json +6 -0
  765. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/verify.mjs +38 -0
  766. package/.worktrees/e58fcc4c/logo.jpg +0 -0
  767. package/.worktrees/e58fcc4c/package-lock.json +977 -0
  768. package/.worktrees/e58fcc4c/package.json +41 -0
  769. package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  770. package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  771. package/.worktrees/e58fcc4c/packages/dashboard/dist/favicon.jpg +0 -0
  772. package/.worktrees/e58fcc4c/packages/dashboard/dist/index.html +16 -0
  773. package/.worktrees/e58fcc4c/packages/dashboard/dist/logo.jpg +0 -0
  774. package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-dashboard.html +836 -0
  775. package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-overview.html +256 -0
  776. package/.worktrees/e58fcc4c/packages/dashboard/package.json +25 -0
  777. package/.worktrees/e58fcc4c/packages/dashboard/server/executor.js +95 -0
  778. package/.worktrees/e58fcc4c/packages/dashboard/server/index.js +679 -0
  779. package/.worktrees/e58fcc4c/packages/dashboard/server/parser.js +526 -0
  780. package/.worktrees/e58fcc4c/packages/dashboard/server/watcher.js +357 -0
  781. package/.worktrees/e58fcc4c/src/agent-session-log.js +803 -0
  782. package/.worktrees/e58fcc4c/src/change-list.js +290 -0
  783. package/.worktrees/e58fcc4c/src/change-risk-profile.js +339 -0
  784. package/.worktrees/e58fcc4c/src/check-primitives.js +65 -0
  785. package/.worktrees/e58fcc4c/src/classify-change.js +109 -0
  786. package/.worktrees/e58fcc4c/src/commit-suggest.js +202 -0
  787. package/.worktrees/e58fcc4c/src/config-cat.js +88 -0
  788. package/.worktrees/e58fcc4c/src/config-schema.js +328 -0
  789. package/.worktrees/e58fcc4c/src/constants.js +97 -0
  790. package/.worktrees/e58fcc4c/src/contract-matrix.js +533 -0
  791. package/.worktrees/e58fcc4c/src/datetime.js +20 -0
  792. package/.worktrees/e58fcc4c/src/db-engine.js +55 -0
  793. package/.worktrees/e58fcc4c/src/db.js +381 -0
  794. package/.worktrees/e58fcc4c/src/decision-distill.js +517 -0
  795. package/.worktrees/e58fcc4c/src/dispatch/backends/local-agent.js +155 -0
  796. package/.worktrees/e58fcc4c/src/dispatch/backends/sillyhub-mcp.js +245 -0
  797. package/.worktrees/e58fcc4c/src/dispatch/probe.js +246 -0
  798. package/.worktrees/e58fcc4c/src/dispatch/strategy.js +121 -0
  799. package/.worktrees/e58fcc4c/src/docs-check.js +825 -0
  800. package/.worktrees/e58fcc4c/src/docs-debt.js +393 -0
  801. package/.worktrees/e58fcc4c/src/docs-gate.js +107 -0
  802. package/.worktrees/e58fcc4c/src/doctor-diagnostics.js +1099 -0
  803. package/.worktrees/e58fcc4c/src/endpoint-extractor.js +409 -0
  804. package/.worktrees/e58fcc4c/src/foreign-declared.js +155 -0
  805. package/.worktrees/e58fcc4c/src/fs-atomic.js +73 -0
  806. package/.worktrees/e58fcc4c/src/git-helper.js +150 -0
  807. package/.worktrees/e58fcc4c/src/hooks/claude-pre-tool-use.cjs +130 -0
  808. package/.worktrees/e58fcc4c/src/hooks/worktree-guard.js +892 -0
  809. package/.worktrees/e58fcc4c/src/index.js +2854 -0
  810. package/.worktrees/e58fcc4c/src/init.js +626 -0
  811. package/.worktrees/e58fcc4c/src/knowledge-match.js +231 -0
  812. package/.worktrees/e58fcc4c/src/local-detect.js +128 -0
  813. package/.worktrees/e58fcc4c/src/local-register.js +104 -0
  814. package/.worktrees/e58fcc4c/src/machine-interface.js +543 -0
  815. package/.worktrees/e58fcc4c/src/migrate.js +127 -0
  816. package/.worktrees/e58fcc4c/src/module-impact.js +166 -0
  817. package/.worktrees/e58fcc4c/src/module-resolve.js +222 -0
  818. package/.worktrees/e58fcc4c/src/modules.js +580 -0
  819. package/.worktrees/e58fcc4c/src/plan-adopt-waves.js +126 -0
  820. package/.worktrees/e58fcc4c/src/progress/change-registry.js +336 -0
  821. package/.worktrees/e58fcc4c/src/progress/consistency-doctor.js +355 -0
  822. package/.worktrees/e58fcc4c/src/progress/shared.js +36 -0
  823. package/.worktrees/e58fcc4c/src/progress/stage-machine.js +594 -0
  824. package/.worktrees/e58fcc4c/src/progress/step-store.js +265 -0
  825. package/.worktrees/e58fcc4c/src/progress.js +1304 -0
  826. package/.worktrees/e58fcc4c/src/quick-recommend.js +115 -0
  827. package/.worktrees/e58fcc4c/src/quicklog.js +883 -0
  828. package/.worktrees/e58fcc4c/src/review-tier.js +77 -0
  829. package/.worktrees/e58fcc4c/src/run/command.js +1641 -0
  830. package/.worktrees/e58fcc4c/src/run/complete-handlers.js +1552 -0
  831. package/.worktrees/e58fcc4c/src/run/complete.js +1259 -0
  832. package/.worktrees/e58fcc4c/src/run/concurrent-detect.js +156 -0
  833. package/.worktrees/e58fcc4c/src/run/gates.js +1111 -0
  834. package/.worktrees/e58fcc4c/src/run/multi-repo-context.js +208 -0
  835. package/.worktrees/e58fcc4c/src/run/next.js +128 -0
  836. package/.worktrees/e58fcc4c/src/run/prompt.js +843 -0
  837. package/.worktrees/e58fcc4c/src/run/quick-audit.js +186 -0
  838. package/.worktrees/e58fcc4c/src/run/scan-profile.js +269 -0
  839. package/.worktrees/e58fcc4c/src/run/shared.js +1562 -0
  840. package/.worktrees/e58fcc4c/src/run/stage.js +587 -0
  841. package/.worktrees/e58fcc4c/src/run.js +23 -0
  842. package/.worktrees/e58fcc4c/src/scan-diff.js +388 -0
  843. package/.worktrees/e58fcc4c/src/scan-postcheck.js +524 -0
  844. package/.worktrees/e58fcc4c/src/scan-staleness.js +95 -0
  845. package/.worktrees/e58fcc4c/src/setup.js +414 -0
  846. package/.worktrees/e58fcc4c/src/sillyhub-mcp/client.js +597 -0
  847. package/.worktrees/e58fcc4c/src/sillyhub-mcp/config.js +62 -0
  848. package/.worktrees/e58fcc4c/src/spec-dir-typo.js +50 -0
  849. package/.worktrees/e58fcc4c/src/spec-sync.js +358 -0
  850. package/.worktrees/e58fcc4c/src/stage-contract-engine.js +171 -0
  851. package/.worktrees/e58fcc4c/src/stage-contract-spec.js +551 -0
  852. package/.worktrees/e58fcc4c/src/stage-contract.js +948 -0
  853. package/.worktrees/e58fcc4c/src/stage-review.js +597 -0
  854. package/.worktrees/e58fcc4c/src/stages/archive.js +199 -0
  855. package/.worktrees/e58fcc4c/src/stages/brainstorm-auto.js +285 -0
  856. package/.worktrees/e58fcc4c/src/stages/brainstorm.js +624 -0
  857. package/.worktrees/e58fcc4c/src/stages/cmd-existence.js +145 -0
  858. package/.worktrees/e58fcc4c/src/stages/doctor.js +540 -0
  859. package/.worktrees/e58fcc4c/src/stages/execute.js +1277 -0
  860. package/.worktrees/e58fcc4c/src/stages/explore.js +43 -0
  861. package/.worktrees/e58fcc4c/src/stages/index.js +29 -0
  862. package/.worktrees/e58fcc4c/src/stages/knowledge.js +514 -0
  863. package/.worktrees/e58fcc4c/src/stages/plan-postcheck.js +1398 -0
  864. package/.worktrees/e58fcc4c/src/stages/plan.js +655 -0
  865. package/.worktrees/e58fcc4c/src/stages/quick.js +167 -0
  866. package/.worktrees/e58fcc4c/src/stages/scan.js +608 -0
  867. package/.worktrees/e58fcc4c/src/stages/status.js +64 -0
  868. package/.worktrees/e58fcc4c/src/stages/verify.js +246 -0
  869. package/.worktrees/e58fcc4c/src/sync.js +1470 -0
  870. package/.worktrees/e58fcc4c/src/task-review.js +1498 -0
  871. package/.worktrees/e58fcc4c/src/taskcard-placeholders.js +21 -0
  872. package/.worktrees/e58fcc4c/src/taskcard.js +250 -0
  873. package/.worktrees/e58fcc4c/src/verify-postcheck.js +1718 -0
  874. package/.worktrees/e58fcc4c/src/verify-probes.js +327 -0
  875. package/.worktrees/e58fcc4c/src/version.js +19 -0
  876. package/.worktrees/e58fcc4c/src/workflow.js +600 -0
  877. package/.worktrees/e58fcc4c/src/workspace.js +125 -0
  878. package/.worktrees/e58fcc4c/src/worktree-apply.js +1611 -0
  879. package/.worktrees/e58fcc4c/src/worktree-deps.js +668 -0
  880. package/.worktrees/e58fcc4c/src/worktree.js +1849 -0
  881. package/.worktrees/e58fcc4c/templates/claude-instruction.md +23 -0
  882. package/.worktrees/e58fcc4c/templates/prompts/taskcard-rules.md +29 -0
  883. package/.worktrees/e58fcc4c/templates/prompts/testcase-design.md +12 -0
  884. package/.worktrees/e58fcc4c/templates/prompts/verify-probes.md +32 -0
  885. package/.worktrees/e58fcc4c/templates/workflows/archive-impact.yaml +79 -0
  886. package/.worktrees/e58fcc4c/templates/workflows/scan-docs.yaml +132 -0
  887. package/package.json +1 -1
  888. package/src/contract-matrix.js +45 -14
  889. package/src/foreign-declared.js +11 -5
  890. package/src/fs-atomic.js +20 -3
  891. package/src/hooks/worktree-guard.js +9 -3
  892. package/src/index.js +52 -12
  893. package/src/module-impact.js +1 -1
  894. package/src/modules.js +23 -21
  895. package/src/progress/stage-machine.js +26 -1
  896. package/src/progress.js +38 -2
  897. package/src/quicklog.js +7 -5
  898. package/src/run/command.js +51 -20
  899. package/src/run/complete-handlers.js +26 -2
  900. package/src/run/complete.js +43 -21
  901. package/src/run/gates.js +52 -7
  902. package/src/run/multi-repo-context.js +42 -4
  903. package/src/run/next.js +4 -3
  904. package/src/run/prompt.js +66 -6
  905. package/src/run/scan-profile.js +1 -0
  906. package/src/run/shared.js +12 -6
  907. package/src/run/stage.js +35 -9
  908. package/src/scan-diff.js +4 -2
  909. package/src/stage-contract.js +36 -15
  910. package/src/stages/brainstorm.js +22 -8
  911. package/src/stages/execute.js +69 -22
  912. package/src/stages/knowledge.js +18 -5
  913. package/src/stages/plan-postcheck.js +63 -7
  914. package/src/stages/plan.js +13 -2
  915. package/src/sync.js +27 -11
  916. package/src/task-review.js +12 -3
  917. package/src/taskcard.js +2 -0
  918. package/src/verify-postcheck.js +24 -13
  919. package/src/verify-probes.js +12 -7
  920. package/src/worktree-apply.js +234 -18
  921. package/src/worktree-cross.js +294 -0
  922. package/src/worktree-deps.js +157 -59
  923. package/src/worktree.js +7 -2
@@ -16,6 +16,7 @@ import { existsSync, unlinkSync, writeFileSync, mkdtempSync, rmSync, readdirSync
16
16
  import { join, resolve } from 'path';
17
17
  import { tmpdir } from 'os';
18
18
  import { WorktreeManager } from './worktree.js';
19
+ import { getCrossWorktreeMeta, cleanupCrossWorktrees } from './worktree-cross.js';
19
20
  import { parseFileChangeList, parseFileChangeListDetailed, pathMatches } from './change-list.js';
20
21
  import { parseAllowedPaths, parseRepo } from './stages/plan-postcheck.js';
21
22
  import { git, gitQuiet } from './git-helper.js';
@@ -23,6 +24,22 @@ import { resolveLatestExecuteRunId, resolveLatestExecuteRunIdWithTasks, readRevi
23
24
 
24
25
  const CHANGES_REL = '.sillyspec/changes';
25
26
 
27
+ /**
28
+ * cleanup 返回值必须消费(坑 ghost-dir-junction-pierce,2026-08-23 实证:apply 后 partial
29
+ * 残留被静默丢弃,用户以为已干净、人工 rm -rf 时穿透 junction 删主仓 node_modules)。
30
+ * 模块级共享:applyWorktree 无变更早退 / skip-overlap / applyByMerge 成功路径三处统一走此消费。
31
+ */
32
+ function consumeCleanupResult(cr, result) {
33
+ if (cr && (cr.result === 'partial' || (Array.isArray(cr.residual) && cr.residual.length > 0))) {
34
+ result.warnings = result.warnings || [];
35
+ result.warnings.push(
36
+ `⚠️ worktree 部分清理残留(${cr.result}):${(cr.residual || []).join('; ') || 'worktree 目录'}` +
37
+ `——Windows 勿直接 rm -rf(会穿透 node_modules junction 删主仓依赖):先 cmd /c rmdir "<worktree>\\node_modules" 解链再删目录,或跑 sillyspec worktree doctor --fix`
38
+ );
39
+ }
40
+ return cr;
41
+ }
42
+
26
43
  /**
27
44
  * 过滤掉 worktree 基础设施文件(非交付物),让 apply 只关心真正的变更产出:
28
45
  * - meta.json:worktree 元数据,baseline commit 中被跟踪、working-tree 被 CLI 改写
@@ -424,6 +441,182 @@ export async function withMainRepoLock(projectRoot, changeName, purpose, fn, opt
424
441
  }
425
442
  }
426
443
 
444
+ /**
445
+ * 跨仓 worktree 真实 apply(坑 cross-repo-no-worktree-isolation,2026-08-27)。
446
+ *
447
+ * 对有 worktree meta 的跨仓仓(worktree-cross.js 创建)执行与主仓 A5 同构的 patch 回落:
448
+ * deliverables(diff baselineCommit||baseHash + untracked,filterDeliverableFiles 排除基础设施)
449
+ * → 清单校验(resolveApplyAllowSet 按 repo 切片 ∪ review 声明切片)
450
+ * → 跨仓主工作副本 dirty 重叠拦截
451
+ * → patch(tracked diff + untracked add/diff --cached/reset,Buffer 防二进制损坏)
452
+ * → git apply --3way 回跨仓主工作副本;成功后 cleanup 该跨仓 worktree(分支保留作锚)。
453
+ *
454
+ * 与主仓 apply 的顺序契约:本函数在主仓 patch 动作**之前**调用——任一跨仓失败即整体报错返回,
455
+ * 主仓工作区不动(不留半套状态)。legacy 直写模式的跨仓仓无 meta,不走本函数(原 no-op 校验)。
456
+ *
457
+ * @param {string} changeName
458
+ * @param {string} projectRoot 主仓根
459
+ * @param {object} ctx MultiRepoContext
460
+ * @param {{ checkOnly?: boolean }} opts
461
+ * @returns {{ repos: string[], applied: Array<{repoKey, changedFiles}>, errors: string[], warnings: string[], crossCleanups: string[] }}
462
+ */
463
+ function applyCrossRepoWorktrees(changeName, projectRoot, ctx, { checkOnly = false } = {}) {
464
+ const specBase = (ctx.platformOpts && ctx.platformOpts.specRoot) || join(projectRoot, '.sillyspec');
465
+ const out = { repos: [], applied: [], errors: [], warnings: [], crossCleanups: [] };
466
+ for (const [repoKey, entry] of ctx.repos) {
467
+ if (entry.isMain) continue;
468
+ const cm = getCrossWorktreeMeta(specBase, changeName, repoKey);
469
+ if (!cm || !cm.isCross || !cm.worktreePath || !existsSync(cm.worktreePath)) continue;
470
+ out.repos.push(repoKey);
471
+ const crossRoot = cm.crossRepoRoot || entry.projectRoot;
472
+ const deliverableBase = cm.baselineCommit || cm.baseHash;
473
+
474
+ // 交付集合(与主仓 step2 同口径:--name-status 捕 rename/delete + untracked,过滤基础设施文件)
475
+ let changedFiles = [];
476
+ const deletedFiles = [];
477
+ try {
478
+ const statusRaw = git(cm.worktreePath, ['diff', '--name-status', deliverableBase]);
479
+ const statusFiles = new Set();
480
+ if (statusRaw) {
481
+ for (const line of statusRaw.split('\n').filter(Boolean)) {
482
+ const parts = line.split('\t');
483
+ if (parts.length >= 2) statusFiles.add(parts[parts.length - 1]);
484
+ if (parts.length >= 3) statusFiles.add(parts[parts.length - 2]);
485
+ if (parts[0].startsWith('D')) deletedFiles.push(parts[parts.length - 1]);
486
+ }
487
+ }
488
+ const untrackedRaw = gitQuiet(cm.worktreePath, ['ls-files', '--others', '--exclude-standard']) || '';
489
+ changedFiles = filterDeliverableFiles([...new Set([...statusFiles, ...untrackedRaw.split('\n').filter(Boolean)])]);
490
+ } catch (e) {
491
+ out.errors.push(`跨仓 ${repoKey}:获取变更文件列表失败(${cm.worktreePath}): ${e.message}`);
492
+ continue;
493
+ }
494
+
495
+ if (changedFiles.length === 0) {
496
+ if (!checkOnly) {
497
+ const cr = cleanupCrossWorktrees({ cwd: crossRoot, changeName, specBase, force: true });
498
+ for (const r of cr.results) {
499
+ if (r.result === 'cleaned') out.crossCleanups.push(`${repoKey}(无变更,worktree 已清理)`);
500
+ else out.warnings.push(`跨仓 ${repoKey} 无变更但清理 partial:${(r.details || []).join('; ')}`);
501
+ }
502
+ }
503
+ out.applied.push({ repoKey, changedFiles: [] });
504
+ continue;
505
+ }
506
+
507
+ // 清单校验(per-repo 切片 + review 声明切片并入,与主仓 Gate1/3b 同语义)
508
+ const allowMap = resolveApplyAllowSet(projectRoot, changeName);
509
+ let allowSet = allowMap.get(repoKey) || new Set();
510
+ const reviewDeclared = collectReviewDeclaredFiles(projectRoot, changeName).get(repoKey);
511
+ if (reviewDeclared) {
512
+ const merged = new Set([...allowSet]);
513
+ for (const f of reviewDeclared) {
514
+ if (![...merged].some(ap => pathMatches(f, ap))) merged.add(f);
515
+ }
516
+ allowSet = merged;
517
+ }
518
+ if (allowSet.size > 0) {
519
+ const violations = classifyAllowListViolations(changedFiles, allowSet);
520
+ if (violations.length > 0) {
521
+ out.errors.push(
522
+ `跨仓 ${repoKey}:文件清单校验失败——以下变更文件不在 design.md 清单、也不在该仓 task review.json changedFiles 声明中:\n ${violations.join('\n ')}`
523
+ );
524
+ if (!checkOnly) continue;
525
+ }
526
+ }
527
+
528
+ if (checkOnly) {
529
+ out.applied.push({ repoKey, changedFiles });
530
+ continue;
531
+ }
532
+
533
+ // 跨仓主工作副本 dirty 重叠拦截(与主仓 step4.5 同语义:重叠 = git apply 无法安全应用)
534
+ try {
535
+ const dirtyFiles = [...new Set(
536
+ ((gitQuiet(crossRoot, ['diff', '--name-only', 'HEAD']) || '').split('\n').filter(Boolean))
537
+ .concat((gitQuiet(crossRoot, ['ls-files', '--others', '--exclude-standard']) || '').split('\n').filter(Boolean))
538
+ )].filter(f => !f.startsWith('.sillyspec/') && f !== 'meta.json');
539
+ const overlap = dirtyFiles.filter(f => changedFiles.includes(f));
540
+ if (overlap.length > 0) {
541
+ out.errors.push(
542
+ `跨仓 ${repoKey}(${crossRoot})主工作副本以下未提交文件与本次 apply 重叠,无法安全应用:\n ${overlap.join('\n ')}\n` +
543
+ `请先在跨仓仓提交或 stash 这些改动后重试 apply。`
544
+ );
545
+ continue;
546
+ }
547
+ } catch (e) {
548
+ out.errors.push(`跨仓 ${repoKey}:dirty 重叠检测失败(${crossRoot}): ${e.message}`);
549
+ continue;
550
+ }
551
+
552
+ // patch 生成 + apply --3way(tracked/untracked 分流与 Buffer 聚合,与主仓 step7 同款)
553
+ const patchFiles = allowSet.size > 0
554
+ ? resolvePatchFiles(changedFiles, allowSet, true)
555
+ : changedFiles;
556
+ const tmpDir = mkdtempSync(join(tmpdir(), 'sillyspec-cross-'));
557
+ const patchPath = join(tmpDir, 'apply.patch');
558
+ try {
559
+ const inTree = new Set(
560
+ (gitQuiet(cm.worktreePath, ['ls-tree', '-r', '--name-only', deliverableBase]) || '').split('\n').filter(Boolean)
561
+ );
562
+ const inIndexRaw = patchFiles.length > 0
563
+ ? (gitQuiet(cm.worktreePath, ['ls-files', '--', ...patchFiles]) || '')
564
+ : '';
565
+ const inIndex = new Set(inIndexRaw.split('\n').filter(Boolean));
566
+ const trackedFiles = patchFiles.filter(f => inTree.has(f) || inIndex.has(f));
567
+ const untrackedPatchFiles = patchFiles.filter(f => !trackedFiles.includes(f));
568
+ const patchParts = [];
569
+ if (trackedFiles.length > 0) {
570
+ patchParts.push(git(cm.worktreePath, ['diff', '--binary', deliverableBase, '--', ...trackedFiles], { encoding: 'buffer', timeout: 60000 }));
571
+ }
572
+ if (untrackedPatchFiles.length > 0) {
573
+ git(cm.worktreePath, ['add', '--', ...untrackedPatchFiles]);
574
+ try {
575
+ patchParts.push(git(cm.worktreePath, ['diff', '--binary', '--cached', '--', ...untrackedPatchFiles], { encoding: 'buffer', timeout: 60000 }));
576
+ } finally {
577
+ gitQuiet(cm.worktreePath, ['reset', 'HEAD', '--', ...untrackedPatchFiles]);
578
+ }
579
+ }
580
+ const patchContent = Buffer.concat(patchParts);
581
+ if (patchContent.length === 0) {
582
+ out.applied.push({ repoKey, changedFiles: [] });
583
+ continue;
584
+ }
585
+ writeFileSync(patchPath, patchContent);
586
+ try {
587
+ git(crossRoot, ['apply', '--3way', patchPath], { timeout: 30000 });
588
+ } catch (e) {
589
+ // 冲突回滚:tracked 文件还原 HEAD 版,--3way 新建的部分文件删除(与主仓 rollbackApply 同语义)
590
+ const rawStderr = e.message || '';
591
+ for (const f of patchFiles) {
592
+ try {
593
+ if (gitQuiet(crossRoot, ['cat-file', '-e', `HEAD:${f}`]) !== null) {
594
+ gitQuiet(crossRoot, ['checkout', 'HEAD', '--', f]);
595
+ } else {
596
+ try { rmSync(join(crossRoot, f), { force: true }) } catch { /* 新文件删除失败留残,rescue 提示 */ }
597
+ }
598
+ } catch { /* 回滚尽力而为 */ }
599
+ }
600
+ out.errors.push(
601
+ `跨仓 ${repoKey}:apply --3way 失败(已回滚跨仓主工作副本到 apply 前状态):${rawStderr}\n` +
602
+ `可选:进 ${crossRoot} 手工合并 worktree 分支 ${cm.branch}(git merge ${cm.branch}),完成后手动清理跨仓 worktree。`
603
+ );
604
+ continue;
605
+ }
606
+ out.applied.push({ repoKey, changedFiles: patchFiles });
607
+ // 成功 → 清理该跨仓 worktree(分支保留作 review 锚点)
608
+ const cr = cleanupCrossWorktrees({ cwd: crossRoot, changeName, specBase, force: true });
609
+ for (const r of cr.results) {
610
+ if (r.result === 'cleaned') out.crossCleanups.push(repoKey);
611
+ else out.warnings.push(`跨仓 ${repoKey} apply 成功但清理 partial:${(r.details || []).join('; ')}${(r.residual || []).length ? ';残留: ' + r.residual.join('; ') : ''}`);
612
+ }
613
+ } finally {
614
+ try { rmSync(tmpDir, { recursive: true, force: true }) } catch { /* 临时目录清理尽力而为 */ }
615
+ }
616
+ }
617
+ return out;
618
+ }
619
+
427
620
  export function applyWorktree(changeName, { cwd, checkOnly = false, merge = false, base = 'merge-base', ctx = null, skipOverlap = false, stashDirty = false } = {}) {
428
621
  const projectRoot = cwd || process.cwd();
429
622
  const wm = new WorktreeManager({ cwd: projectRoot });
@@ -442,11 +635,26 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
442
635
  skippedOverlapFiles: [],
443
636
  };
444
637
 
445
- // --- 0. 跨仓 task no-op 校验(task-05 / D-009) ---
446
- // 跨仓 task 的 commit 已落跨仓仓主干,apply = no-op(无 patch)。仅校验 review.head 是跨仓仓真实
447
- // commit + 不 cleanup(wm.cleanup 只作用主仓 worktree)。校验失败 → 推 errors 阻断 apply(R-05)。
448
- // 单仓 ctx 缺省 / 无跨仓 entry → validateCrossRepoNoOp 直接返回空(零回归)。
638
+ // --- 0. 跨仓处理(task-05 / D-009 + 坑 cross-repo-no-worktree-isolation) ---
639
+ // 0a. worktree 模式的跨仓仓:真实 apply(patch 回跨仓主工作副本 + 成功后 cleanup worktree)。
640
+ // 在主仓任何动作之前跑——任一跨仓失败即整体返回,主仓工作区不动(不留半套状态)。
641
+ // 0b. legacy 直写模式的跨仓仓:no-op 校验(review.head 是跨仓真实 commit + 不 cleanup)。
642
+ // 单仓 ctx 缺省 / 无跨仓 entry → 两步都空转(零回归)。
449
643
  if (ctx) {
644
+ const crossApplied = applyCrossRepoWorktrees(changeName, projectRoot, ctx, { checkOnly });
645
+ if (crossApplied.repos.length > 0) {
646
+ result.crossRepoApplied = crossApplied.applied;
647
+ for (const w of crossApplied.warnings) result.warnings = (result.warnings || []).concat([w]);
648
+ if (crossApplied.crossCleanups.length > 0) {
649
+ result.warnings = (result.warnings || []).concat([
650
+ `跨仓 worktree 已 apply 并清理:${crossApplied.crossCleanups.join(', ')}(分支保留作 review 锚点)`
651
+ ]);
652
+ }
653
+ if (crossApplied.errors.length > 0) {
654
+ result.errors.push(...crossApplied.errors);
655
+ return result; // 跨仓未落地 = 该仓 task 实际未完成,主仓 apply 不可继续
656
+ }
657
+ }
450
658
  const cross = validateCrossRepoNoOp(ctx, projectRoot, changeName);
451
659
  for (const e of cross.errors) result.errors.push(e);
452
660
  if (cross.warnings.length > 0) result.warnings = (result.warnings || []).concat(cross.warnings);
@@ -496,6 +704,10 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
496
704
  // 同时检测 untracked 新文件(git diff 不包含 untracked)
497
705
  let changedFiles;
498
706
  const deletedFiles = [];
707
+ // merge 后应「不存在于 main HEAD」的文件(D 删除 + R/C rename/copy 源路径):
708
+ // applyByMerge 落地校验按此分流——原实现一律要求 cat-file 存在,含删除文件的变更
709
+ // merge 成功也恒报「未落地」失败、worktree 永不清理(坑 apply-merge-deleted-misjudged)
710
+ const absentAfterMerge = [];
499
711
  try {
500
712
  // 用 --name-status 捕获 rename/delete(--name-only 会丢失 rename 源文件)
501
713
  // 交付集合判定:用 deliverableBase(baselineCommit||baseHash),保「只合子代理改动」语义
@@ -509,8 +721,11 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
509
721
  if (parts.length >= 3) statusFiles.add(parts[parts.length - 2]);
510
722
  // 删除文件(status D / D100)→ 收集到 deletedFiles(rescue DELETE 分类用,design §逐文件分类)
511
723
  if (parts[0].startsWith('D')) deletedFiles.push(parts[parts.length - 1]);
724
+ // rename/copy 源路径(R100/C99 old new 三段式)→ 同删除语义:merge 后 HEAD 中不应存在
725
+ if (parts.length >= 3 && !parts[0].startsWith('D')) absentAfterMerge.push(parts[parts.length - 2]);
512
726
  }
513
727
  }
728
+ for (const f of deletedFiles) absentAfterMerge.push(f);
514
729
 
515
730
  // untracked 新文件(deliverableBase 中不存在的文件)
516
731
  const untrackedRaw = gitQuiet(worktreePath, ['ls-files', '--others', '--exclude-standard']);
@@ -527,11 +742,12 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
527
742
 
528
743
  result.changedFiles = changedFiles;
529
744
  result.deletedFiles = deletedFiles;
745
+ result.absentAfterMerge = absentAfterMerge;
530
746
 
531
747
  if (changedFiles.length === 0) {
532
748
  // 没有变更
533
749
  if (!checkOnly) {
534
- wm.cleanup(changeName, { force: true });
750
+ consumeCleanupResult(wm.cleanup(changeName, { force: true }), result);
535
751
  }
536
752
  result.ok = true;
537
753
  return result;
@@ -936,15 +1152,9 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
936
1152
  // cleanup 的拦截横幅吓人,主动判断 + 温和提示);全部已落地(无跳过残留)才照常清理。
937
1153
  // cleanup 返回值必须消费(坑 ghost-dir-junction-pierce,2026-08-23 实证:apply 后 partial
938
1154
  // 残留被静默丢弃,用户以为已干净、人工 rm -rf 时穿透 junction 删主仓 node_modules)。
939
- const consumeCleanup = (cr) => {
940
- if (cr && (cr.result === 'partial' || (Array.isArray(cr.residual) && cr.residual.length > 0))) {
941
- result.warnings.push(
942
- `⚠️ worktree 部分清理残留(${cr.result}):${(cr.residual || []).join('; ') || 'worktree 目录'}` +
943
- `——Windows 勿直接 rm -rf(会穿透 node_modules junction 删主仓依赖):先 cmd /c rmdir "<worktree>\\node_modules" 解链再删目录,或跑 sillyspec worktree doctor --fix`
944
- )
945
- }
946
- return cr
947
- }
1155
+ // cleanup 返回值必须消费(坑 ghost-dir-junction-pierce)——实现提升为模块级 consumeCleanupResult,
1156
+ // 与无变更早退 / applyByMerge 成功路径三处共用
1157
+ const consumeCleanup = (cr) => consumeCleanupResult(cr, result)
948
1158
  try {
949
1159
  if (skipOverlap) {
950
1160
  const unapplied = wm.hasUnappliedChanges(changeName);
@@ -1329,13 +1539,19 @@ export function applyByMerge(result, changeName, projectRoot, wm, opts = {}) {
1329
1539
 
1330
1540
  // 落地校验:merge 报成功(exit 0)不代表交付物真进 main——
1331
1541
  // 分支可能只含 baseline checkpoint(子代理改动未 commit),merge 产生空内容合并,文件零落地。
1332
- // 逐个确认 changedFiles 在 main HEAD 存在。任一缺失 → 不 cleanup(fail-open:保留 worktree 唯一副本)。
1542
+ // 落地语义按文件类型分流:普通交付文件应存在于 main HEAD;删除/rename 源文件(absentAfterMerge)
1543
+ // 应「不存在」——原实现一律要求存在,含删除文件的变更 merge 成功也恒报失败(坑 apply-merge-deleted-misjudged)。
1544
+ // 任一未按预期落地 → 不 cleanup(fail-open:保留 worktree 唯一副本)。
1333
1545
  result.merged = true;
1334
- const notLanded = changedFiles.filter(f => gitQuiet(projectRoot, ['cat-file', '-e', `HEAD:${f}`]) === null);
1546
+ const absentExpected = new Set(result.absentAfterMerge || []);
1547
+ const notLanded = changedFiles.filter(f => {
1548
+ const inHead = gitQuiet(projectRoot, ['cat-file', '-e', `HEAD:${f}`]) !== null;
1549
+ return absentExpected.has(f) ? inHead : !inHead;
1550
+ });
1335
1551
  if (notLanded.length > 0) {
1336
1552
  result.ok = false;
1337
1553
  result.errors.push(
1338
- `git merge ${branch} 报成功,但 ${notLanded.length}/${changedFiles.length} 个交付文件未出现在 main HEAD` +
1554
+ `git merge ${branch} 报成功,但 ${notLanded.length}/${changedFiles.length} 个交付文件未按预期落地 main HEAD` +
1339
1555
  `(分支可能只含 baseline checkpoint,子代理改动未 commit)。worktree 已保留(未 cleanup),` +
1340
1556
  `请用 git cherry-pick 或手动 cp 落地:\n ${notLanded.join('\n ')}`
1341
1557
  );
@@ -1345,7 +1561,7 @@ export function applyByMerge(result, changeName, projectRoot, wm, opts = {}) {
1345
1561
  result.ok = true;
1346
1562
  try { result.mergeSummary = git(projectRoot, ['log', '--oneline', '-1']); } catch {}
1347
1563
  try {
1348
- wm.cleanup(changeName, { force: true });
1564
+ consumeCleanupResult(wm.cleanup(changeName, { force: true }), result);
1349
1565
  } catch (cleanupErr) {
1350
1566
  result.warnings = result.warnings || [];
1351
1567
  result.warnings.push(`cleanup 失败(不影响 merge 结果): ${cleanupErr.message}`);
@@ -0,0 +1,294 @@
1
+ /**
2
+ * worktree-cross.js — 跨仓仓 worktree 隔离(坑 cross-repo-no-worktree-isolation,2026-08-27 用户实证)。
3
+ *
4
+ * 背景:跨仓 task 的原设计(multi-repo W1 D-005/D-006/D-009)是子代理直写跨仓仓主工作副本、
5
+ * commit 直落该仓主干,apply 对跨仓 no-op。实战暴露三类事故面:
6
+ * 1. 并行混流:跨仓主工作副本常有用户/其他变更的在途改动,子代理产物与之混在同一工作区,
7
+ * 无法区分归属、无法整体回滚(实证:sub-grid-security 主工作副本 task-05 产物与
8
+ * .gitignore/.webpackrc.js/yarn.lock 并行改动混流,无法核对);
9
+ * 2. 无 base 锚:跨仓仓无 meta/baseHash,base 只能靠 task 卡 base_commit 锡点;
10
+ * 3. 误伤面大:子代理在主工作副本可误改/误删用户未提交文件,无护栏。
11
+ *
12
+ * 本模块把跨仓仓纳入与主仓同构的 worktree 隔离(D-009 就地翻新,向后兼容):
13
+ * - worktree 落位 <主仓 specBase>/.runtime/worktrees/<change>--<repoKey>:主仓侧该目录已被
14
+ * .gitignore 覆盖(主仓 create 已强制检查),不要求跨仓仓自配 .gitignore;git worktree
15
+ * 的注册信息在跨仓 .git/worktrees/,目录本身可在仓外任意路径;
16
+ * - meta.json 与主仓同 schema + repoKey/crossRepoRoot/isCross 标识(唯一写入方 = 本模块,
17
+ * multi-repo-context.js 只读且路径公式与此处 crossWorktreePath 保持同步);
18
+ * - base 锚 meta.baseHash(跨仓仓 HEAD 快照);dirty baseline overlay 沿用主仓同款
19
+ * (跨仓主工作副本的在途改动进 baseline,不算交付 diff,apply 不覆盖它们);
20
+ * - deps 供给 provisionDeps(worktree, 跨仓根, {specBase:null})——sniff worktree 自身项目
21
+ * 类型(package.json→nodejs 链主工作副本 node_modules;不沿用主仓 local.yaml 的
22
+ * project.type,主仓与跨仓类型常不同,如实测 maven 主仓 + nodejs 前端仓);
23
+ * - cleanup:解链 node_modules junction → git worktree remove --force → 保留分支
24
+ * sillyspec/<change> 作 review 锚点(对齐主仓 cleanup 的分支保护哲学)。
25
+ *
26
+ * 兼容:无跨仓 worktree meta 的旧变更(legacy 直写主干模式)各链路继续走原路径,零回归。
27
+ */
28
+
29
+ import { existsSync, readFileSync, readdirSync, mkdirSync } from 'fs';
30
+ import { join } from 'path';
31
+ import { git, gitQuiet } from './git-helper.js';
32
+ import { writeAtomicSync } from './fs-atomic.js';
33
+ import { WorktreeManager, unlinkNodeModulesLinks, safeRemoveWorktreeDir } from './worktree.js';
34
+ import { provisionDeps } from './worktree-deps.js';
35
+ import { aggregateDeclaredRepos } from './run/shared.js';
36
+ import { parseRepoRegistry } from './stages/plan-postcheck.js';
37
+
38
+ const META_FILE = 'meta.json';
39
+ const BRANCH_PREFIX = 'sillyspec/';
40
+
41
+ /**
42
+ * 跨仓 worktree 路径(唯一路径公式;multi-repo-context.js 的 meta 只读逻辑与此同步)。
43
+ * @param {string} specBase 主仓 spec 根(<主仓>/.sillyspec)
44
+ * @param {string} changeName 变更名
45
+ * @param {string} repoKey 跨仓 repo 键(local.yaml repos: 段的 key)
46
+ */
47
+ export function crossWorktreePath(specBase, changeName, repoKey) {
48
+ return join(specBase, '.runtime', 'worktrees', `${changeName}--${repoKey}`);
49
+ }
50
+
51
+ /**
52
+ * 读跨仓 worktree meta(不存在/损坏返 null = legacy 直写模式)。
53
+ * @returns {object|null}
54
+ */
55
+ export function getCrossWorktreeMeta(specBase, changeName, repoKey) {
56
+ const metaPath = join(crossWorktreePath(specBase, changeName, repoKey), META_FILE);
57
+ if (!existsSync(metaPath)) return null;
58
+ try {
59
+ return JSON.parse(readFileSync(metaPath, 'utf8'));
60
+ } catch {
61
+ return null;
62
+ }
63
+ }
64
+
65
+ /**
66
+ * 列出某变更已建的全部跨仓 worktree meta(扫描 worktrees 目录下 `<change>--*` 且 isCross 的 meta)。
67
+ * @returns {Array<{repoKey: string, meta: object}>}
68
+ */
69
+ export function listCrossWorktreeMetas(specBase, changeName) {
70
+ const base = join(specBase, '.runtime', 'worktrees');
71
+ if (!existsSync(base)) return [];
72
+ const out = [];
73
+ for (const name of readdirSync(base)) {
74
+ if (!name.startsWith(`${changeName}--`)) continue;
75
+ const metaPath = join(base, name, META_FILE);
76
+ if (!existsSync(metaPath)) continue;
77
+ try {
78
+ const meta = JSON.parse(readFileSync(metaPath, 'utf8'));
79
+ if (meta && meta.isCross && meta.repoKey) out.push({ repoKey: meta.repoKey, meta });
80
+ } catch { /* 损坏 meta 跳过(cleanup 阶段仍按目录处理) */ }
81
+ }
82
+ return out;
83
+ }
84
+
85
+ /**
86
+ * 聚合声明跨仓 key(plan.md 内联卡片 + tasks/ 独立卡片双源,与 shared.js getOrCreateMultiRepoContext 同口径)。
87
+ * @param {string} specBase
88
+ * @param {string} changeName
89
+ * @returns {string[]} 除 'main' 外的跨仓 key(未注册/配置错由 MultiRepoContext fail-closed,此处只聚合)
90
+ */
91
+ function aggregateCrossRepoKeys(specBase, changeName) {
92
+ const planFile = join(specBase, 'changes', changeName, 'plan.md');
93
+ let planContent = '';
94
+ if (existsSync(planFile)) {
95
+ try { planContent = readFileSync(planFile, 'utf8') } catch { planContent = '' }
96
+ }
97
+ // tasks/ 独立卡片兜底(与 run/shared.js collectTaskCardReposFallback 同口径,该函数未导出)
98
+ const tasksDir = join(specBase, 'changes', changeName, 'tasks');
99
+ if (existsSync(tasksDir)) {
100
+ for (const f of readdirSync(tasksDir)) {
101
+ if (!/^task-\d+\.md$/i.test(f)) continue;
102
+ try { planContent += '\n' + readFileSync(join(tasksDir, f), 'utf8') + '\n' } catch { /* 兜底源不阻断 */ }
103
+ }
104
+ }
105
+ return aggregateDeclaredRepos(planContent).filter(k => k !== 'main');
106
+ }
107
+
108
+ /**
109
+ * 读主仓 local.yaml 的 repos: 段(路径口径与 run/shared.js readLocalYamlRaw 一致:cwd/.sillyspec/local.yaml)。
110
+ * @returns {Map<string,string>}
111
+ */
112
+ function readRepoRegistry(cwd) {
113
+ const p = join(cwd, '.sillyspec', 'local.yaml');
114
+ let text = '';
115
+ if (existsSync(p)) {
116
+ try { text = readFileSync(p, 'utf8') } catch { text = '' }
117
+ }
118
+ return parseRepoRegistry(text);
119
+ }
120
+
121
+ /**
122
+ * execute 启动时为每个声明的跨仓仓建 worktree(幂等:meta 在即复用)。
123
+ *
124
+ * 失败语义 fail-closed(对齐主仓 create:隔离建不起来就不该开工):任何仓创建失败 → 抛错,
125
+ * 由调用方(run/stage.js execute 启动)exit(1) 并给修复指引。已建成功的仓保留(重跑幂等复用)。
126
+ *
127
+ * @param {{ cwd: string, changeName: string, specBase?: string }} opts
128
+ * @returns {{ created: Array<{repoKey,worktreePath}>, reused: Array<{repoKey,worktreePath}>, skippedLegacy: string[] }}
129
+ * @throws {Error} 跨仓仓未注册 / git 不可达 / worktree add 失败 / 分支冲突
130
+ */
131
+ export function ensureCrossWorktrees({ cwd, changeName, specBase }) {
132
+ const base = specBase || join(cwd, '.sillyspec');
133
+ const keys = aggregateCrossRepoKeys(base, changeName);
134
+ const registry = readRepoRegistry(cwd);
135
+ const created = [];
136
+ const reused = [];
137
+ const skippedLegacy = [];
138
+
139
+ for (const key of keys) {
140
+ const repoRoot = registry.get(key);
141
+ if (!repoRoot) {
142
+ // 与 MultiRepoContext 约束②同语义:声明的 repo 必须已注册,配置错不降级
143
+ throw new Error(
144
+ `跨仓 repo "${key}" 未在 local.yaml repos: 段注册。` +
145
+ `一键注册:sillyspec local register-repo ${key} <${key} 仓根路径>(勿手编 YAML),补注册后重跑 execute。`
146
+ );
147
+ }
148
+ const existing = getCrossWorktreeMeta(base, changeName, key);
149
+ if (existing && existing.worktreePath && existsSync(existing.worktreePath)) {
150
+ reused.push({ repoKey: key, worktreePath: existing.worktreePath });
151
+ continue;
152
+ }
153
+ // meta 在但目录没了(外部误删):走重建(下方 git worktree add 会因注册残留失败,
154
+ // 先 prune 掉悬空注册再建——目录不在则 prune 无损)
155
+ if (existing) {
156
+ try { gitQuiet(repoRoot, ['worktree', 'prune'], { timeout: 30000 }) } catch {}
157
+ }
158
+
159
+ const worktreePath = crossWorktreePath(base, changeName, key);
160
+ const branch = BRANCH_PREFIX + changeName;
161
+
162
+ // base 快照:跨仓仓当前 HEAD(与主仓 create 的默认 base 语义一致)
163
+ let baseHash;
164
+ try {
165
+ baseHash = git(repoRoot, ['rev-parse', 'HEAD']);
166
+ } catch (e) {
167
+ throw new Error(`跨仓 repo "${key}"(${repoRoot})git 不可达(rev-parse HEAD 失败:${e.message})。请检查 local.yaml repos: 段路径。`);
168
+ }
169
+ const branchExists = !!gitQuiet(repoRoot, ['rev-parse', '--verify', `refs/heads/${branch}`]);
170
+ if (branchExists) {
171
+ throw new Error(
172
+ `跨仓仓 ${key} 已有分支 ${branch}(疑似上次 execute 残留)。三选一:\n` +
173
+ ` ① 确认残留作废:git -C ${repoRoot} branch -D ${branch} 后重跑;\n` +
174
+ ` ② 分支内容已 apply 落地或不再需要:sillyspec worktree cleanup ${changeName} --force(跨仓 worktree 一并清理后重跑);\n` +
175
+ ` ③ 换变更名重跑。`
176
+ );
177
+ }
178
+ mkdirSync(join(base, '.runtime', 'worktrees'), { recursive: true });
179
+ try {
180
+ git(repoRoot, ['worktree', 'add', worktreePath, '-b', branch, baseHash], { timeout: 120000 });
181
+ } catch (e) {
182
+ throw new Error(`跨仓仓 ${key} worktree 创建失败(${worktreePath}):${e.stderr || e.message}`);
183
+ }
184
+
185
+ const meta = {
186
+ name_zh: 'worktree 元数据',
187
+ changeName,
188
+ repoKey: key,
189
+ crossRepoRoot: repoRoot,
190
+ isCross: true,
191
+ branch,
192
+ baseBranch: gitQuiet(repoRoot, ['symbolic-ref', '--short', 'HEAD']) || 'HEAD',
193
+ baseHash,
194
+ actualBaseHash: gitQuiet(worktreePath, ['rev-parse', 'HEAD']) || baseHash,
195
+ createdAt: new Date().toISOString(),
196
+ worktreePath,
197
+ mode: 'worktree',
198
+ };
199
+ writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
200
+
201
+ // dirty baseline overlay:跨仓主工作副本在途改动 → worktree baseline(借主仓同款实现,
202
+ // 只用其参数化逻辑,不用实例路径状态)
203
+ try {
204
+ const wmHelper = new WorktreeManager({ cwd: repoRoot });
205
+ const baselineResult = wmHelper._overlayBaseline(repoRoot, worktreePath);
206
+ meta.baselineFiles = baselineResult.files;
207
+ meta.baselineHash = baselineResult.baselineHash;
208
+ if (baselineResult.files.length > 0) {
209
+ meta.baselineCommit = wmHelper._createBaselineCheckpoint(worktreePath, `${changeName}--${key}`, baselineResult.files);
210
+ }
211
+ if (baselineResult.errors && baselineResult.errors.length > 0) {
212
+ console.warn(`⚠️ 跨仓 ${key} baseline overlay 部分失败(${baselineResult.errors.join('; ')})——在途改动未全量进 baseline,apply 前请人工核对跨仓主工作副本`);
213
+ }
214
+ writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
215
+ } catch (e) {
216
+ console.warn(`⚠️ 跨仓 ${key} baseline overlay 失败(${e.message})——跨仓主工作副本如有在途改动,worktree 不含它们`);
217
+ }
218
+
219
+ // deps 供给:specBase 传 null —— sniff worktree 自身(主仓 local.yaml 的 project.type/install
220
+ // 描述的是主仓,跨仓仓类型常不同,如实测 maven 主仓 + nodejs 前端仓,沿用会把 mvn 命令
221
+ // 打到前端仓上)。失败不阻断(与主仓 create 同语义,doctor --fix 可修)
222
+ try {
223
+ const deps = provisionDeps(worktreePath, repoRoot, { specBase: null }) || {};
224
+ Object.assign(meta, {
225
+ depsStatus: deps.depsStatus,
226
+ depsMethod: deps.depsMethod || null,
227
+ depsSource: deps.depsSource || null,
228
+ depsLockHash: deps.depsLockHash || null,
229
+ depsCheckedAt: deps.depsCheckedAt || null,
230
+ ...(deps.depsError ? { depsError: deps.depsError } : {}),
231
+ });
232
+ writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
233
+ } catch (e) {
234
+ meta.depsStatus = 'failed';
235
+ meta.depsError = `provisionDeps crashed: ${e.message}`;
236
+ writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
237
+ }
238
+
239
+ created.push({ repoKey: key, worktreePath });
240
+ }
241
+ return { created, reused, skippedLegacy };
242
+ }
243
+
244
+ /**
245
+ * 清理某变更的全部跨仓 worktree(幂等)。
246
+ *
247
+ * 顺序对齐主仓 cleanup 的 Windows 防护:先解 node_modules junction(裸删会穿透删跨仓主工作
248
+ * 副本的 node_modules),再 git worktree remove --force,最后**保留分支** sillyspec/<change>
249
+ * 作 review 锚点(分支删除在主仓侧有 review 锚点 + 双保护,跨仓侧 v1 保守不删,残 branch
250
+ * 可人工清理)。目录残留(remove 失败)走 safeRemoveWorktreeDir 兜底 + residual 上报。
251
+ *
252
+ * @param {{ cwd: string, changeName: string, specBase?: string, force?: boolean }} opts
253
+ * @returns {{ results: Array<{repoKey, result: 'cleaned'|'skipped'|'partial', details: string[], residual: string[]}> }}
254
+ */
255
+ export function cleanupCrossWorktrees({ cwd, changeName, specBase, force = false }) {
256
+ const base = specBase || join(cwd, '.sillyspec');
257
+ const results = [];
258
+ for (const { repoKey, meta } of listCrossWorktreeMetas(base, changeName)) {
259
+ const details = [];
260
+ const residual = [];
261
+ const repoRoot = meta.crossRepoRoot;
262
+ const wtPath = meta.worktreePath || crossWorktreePath(base, changeName, repoKey);
263
+ if (!existsSync(wtPath)) {
264
+ try { if (repoRoot) gitQuiet(repoRoot, ['worktree', 'prune'], { timeout: 30000 }) } catch {}
265
+ results.push({ repoKey, result: 'skipped', details: ['目录不存在(已清理)'], residual });
266
+ continue;
267
+ }
268
+ if (!force) {
269
+ // fail-closed:worktree 内还有未落地交付(相对 baseHash 有 diff)时拒绝清理(对齐主仓
270
+ // hasUnappliedChanges 哲学;跨仓侧以「分支上有交付 diff 且未 apply」近似)
271
+ try {
272
+ const diff = gitQuiet(wtPath, ['diff', '--name-only', meta.baseHash]) || '';
273
+ const untracked = gitQuiet(wtPath, ['ls-files', '--others', '--exclude-standard']) || '';
274
+ if (diff.trim() || untracked.trim()) {
275
+ results.push({ repoKey, result: 'partial', details: [`blocked: 跨仓 worktree 有未 apply 的交付改动(git diff ${String(meta.baseHash).slice(0, 8)} 非空)——先 apply 或显式 --force`], residual: [wtPath] });
276
+ continue;
277
+ }
278
+ } catch (e) {
279
+ details.push(`未落地检测失败(${e.message}),按 force 处理`);
280
+ }
281
+ }
282
+ try { unlinkNodeModulesLinks(wtPath, meta, details) } catch (e) { details.push(`junction 解链失败: ${e.message}`) }
283
+ try {
284
+ git(repoRoot, ['worktree', 'remove', '--force', wtPath], { timeout: 60000 });
285
+ } catch {
286
+ // remove 失败(脏文件/锁):解链后安全删目录 + prune 注册
287
+ try { safeRemoveWorktreeDir(wtPath, meta) } catch (e) { residual.push(`目录残留 ${wtPath}: ${e.message}`) }
288
+ try { gitQuiet(repoRoot, ['worktree', 'prune'], { timeout: 30000 }) } catch { residual.push(`git worktree prune 失败(${repoRoot})`) }
289
+ }
290
+ details.push(`分支 ${meta.branch} 保留作 review 锚点(确认无需回溯后可 git -C ${repoRoot} branch -D ${meta.branch})`);
291
+ results.push({ repoKey, result: residual.length > 0 ? 'partial' : 'cleaned', details, residual });
292
+ }
293
+ return { results };
294
+ }