sillyspec 3.27.6 → 3.27.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (921) 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 +6 -3
  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 +27 -12
  893. package/src/module-impact.js +1 -1
  894. package/src/modules.js +23 -21
  895. package/src/progress/stage-machine.js +23 -0
  896. package/src/progress.js +38 -2
  897. package/src/quicklog.js +7 -5
  898. package/src/run/command.js +5 -5
  899. package/src/run/complete-handlers.js +6 -2
  900. package/src/run/complete.js +33 -20
  901. package/src/run/gates.js +14 -4
  902. package/src/run/next.js +4 -3
  903. package/src/run/prompt.js +66 -6
  904. package/src/run/scan-profile.js +1 -0
  905. package/src/run/shared.js +11 -5
  906. package/src/run/stage.js +7 -7
  907. package/src/scan-diff.js +4 -2
  908. package/src/stage-contract.js +16 -8
  909. package/src/stages/brainstorm.js +22 -8
  910. package/src/stages/execute.js +36 -9
  911. package/src/stages/knowledge.js +18 -5
  912. package/src/stages/plan-postcheck.js +63 -7
  913. package/src/stages/plan.js +5 -2
  914. package/src/sync.js +27 -11
  915. package/src/task-review.js +5 -3
  916. package/src/taskcard.js +2 -0
  917. package/src/verify-postcheck.js +24 -13
  918. package/src/verify-probes.js +12 -7
  919. package/src/worktree-apply.js +38 -14
  920. package/src/worktree-deps.js +1 -1
  921. package/src/worktree.js +7 -2
package/src/sync.js CHANGED
@@ -28,7 +28,6 @@ function safePlatformSpecDir(cwd) {
28
28
  }
29
29
 
30
30
  const LOCAL_YAML = '.sillyspec/local.yaml';
31
- const CHANGES_DIR = '.sillyspec/changes';
32
31
  const REQUEST_TIMEOUT_MS = 10_000;
33
32
 
34
33
  // 未连接平台是本地独立用户的合法默认状态。sync / checkApproval 由 run 流程在后台 best-effort
@@ -429,13 +428,17 @@ export class SyncManager {
429
428
  }
430
429
 
431
430
  // 检查变更目录是否存在(归档后目录已移走但 DB 仍有最终状态需推平台,serializeForSync 从
432
- // DB 读不依赖文件系统目录)。归档终态探测(坑 post-archive-sync-noise,2026-08-21 实证:
433
- // 归档尾声连打「目录不存在/变更不存在」warn,观感像出错):确认已归档(changes/archive/
434
- // 有实体 或 DB status='archived')时降为一行 info 措辞——正常时序不是告警。
435
- const changeDir = join(this.cwd, CHANGES_DIR, changeName);
431
+ // DB 读不依赖文件系统目录)。树根与 syncDocuments/spec 树同源(safePlatformSpecDir,
432
+ // BUG-01 同族):此前硬编码 cwd/.sillyspec/changes,平台模式(specRoot 指向外部)目录
433
+ // 恒不存在 → 每次同步打「变更目录不存在」warn 噪音。归档终态探测(坑 post-archive-
434
+ // sync-noise,2026-08-21 实证:归档尾声连打「目录不存在/变更不存在」warn,观感像出错):
435
+ // 确认已归档(changes/archive/ 有实体 或 DB status='archived')时降为一行 info 措辞——
436
+ // 正常时序不是告警。
437
+ const specBase = safePlatformSpecDir(this.cwd) || join(this.cwd, '.sillyspec');
438
+ const changeDir = join(specBase, 'changes', changeName);
436
439
  let archivedQuietly = false;
437
440
  if (!existsSync(changeDir)) {
438
- archivedQuietly = existsSync(join(this.cwd, CHANGES_DIR, 'archive', changeName))
441
+ archivedQuietly = existsSync(join(specBase, 'changes', 'archive', changeName))
439
442
  || this._isChangeArchivedInDb(changeName);
440
443
  if (archivedQuietly) {
441
444
  console.log(`[sync] 变更已归档(目录在 archive/),继续从 DB 推送最终状态: ${changeName}`);
@@ -768,23 +771,36 @@ export class SyncManager {
768
771
 
769
772
  /**
770
773
  * 查看同步状态。
771
- * 读取 local.yaml 中的 platform 配置,返回连接信息。
774
+ * 基于本实例解析出的平台配置(env 优先,见 _getPlatform)返回连接信息;
775
+ * env 通道无 last_connected 可读,返回 null。
772
776
  */
773
777
  status() {
774
- const config = readLocalYaml(this.cwd);
775
- const platform = config.platform;
778
+ const platform = this._getPlatform();
776
779
  if (!platform) {
777
780
  return { connected: false };
778
781
  }
779
782
  return {
780
783
  connected: true,
781
784
  url: platform.url,
782
- lastSync: platform.last_connected || null,
785
+ lastSync: readLocalYaml(this.cwd).platform?.last_connected || null,
783
786
  };
784
787
  }
785
788
 
786
- /** 获取当前平台配置,未连接返回 null */
789
+ /**
790
+ * 获取当前平台配置,未连接返回 null。
791
+ * 优先级:env SILLYHUB_PLATFORM_URL + SILLYHUB_PLATFORM_TOKEN(两键齐全才生效——
792
+ * daemon 注入通道,平台模式 specRoot/local.yaml 常无 platform 段,与链路 D
793
+ * readPlatformPushConfig 同款先例)> local.yaml platform 段。
794
+ * env 由 daemon 注入、CLI 不管其生命周期(disconnect 仍只清 local.yaml——daemon
795
+ * 停止注入即失效);triggerSync 平台模式放行(2026-08-26)后这是回传走通的关键通道。
796
+ */
787
797
  _getPlatform() {
798
+ if (process.env.SILLYHUB_PLATFORM_URL && process.env.SILLYHUB_PLATFORM_TOKEN) {
799
+ return {
800
+ url: process.env.SILLYHUB_PLATFORM_URL,
801
+ token: process.env.SILLYHUB_PLATFORM_TOKEN,
802
+ };
803
+ }
788
804
  const config = readLocalYaml(this.cwd);
789
805
  return config.platform || null;
790
806
  }
@@ -370,7 +370,9 @@ function isTaskLowRisk(changeDir, taskId) {
370
370
  if (!existsSync(taskFile)) return false
371
371
  try {
372
372
  const content = readFileSync(taskFile, 'utf8')
373
- const fm = content.match(/^---\n([\s\S]*?)\n---/)
373
+ // \r? 容错(Windows 卡片 CRLF):与下方 isTaskVerification 同款——硬锚 ^---\n 在 CRLF
374
+ // 文件上失配 → low_risk 豁免静默失效,缺 review.json 会被误判 error
375
+ const fm = content.match(/^---\r?\n([\s\S]*?)\r?\n---/)
374
376
  if (!fm) return false
375
377
  return /^low_risk:\s*true\s*$/im.test(fm[1])
376
378
  } catch {
@@ -1033,7 +1035,7 @@ export async function generateTaskReviewDrafts({ changeName, cwd, platformOpts =
1033
1035
  }
1034
1036
 
1035
1037
  // base..head diff 文件集(worktree-aware;null=git 不可用,[]=无 commit diff)
1036
- let diffFiles = resolveVerifyChangedFiles(cwd, changeName)
1038
+ let diffFiles = resolveVerifyChangedFiles(cwd, changeName, null, { specBase })
1037
1039
  // ⚠️ 并入 worktree 未提交改动(坑 draft-attribution-uncommitted-worktree,2026-08-21 实证):
1038
1040
  // 子代理默认不 commit(execute 复盘 a 同源事实),真实改动全在 worktree working-tree——只看
1039
1041
  // base..HEAD commit diff 时归属恒空,9/9 草稿全成「无归属」靠主代理手写升级。与
@@ -1275,7 +1277,7 @@ export async function adoptTaskReviewMechanics({ changeName, cwd, platformOpts =
1275
1277
 
1276
1278
  // base/head + diff:与 generateTaskReviewDrafts 同源口径(meta 锡点 + worktree rev-parse +
1277
1279
  // resolveVerifyChangedFiles),保证 adopt 产物与 gate 校验输入一致。
1278
- const diffFiles = resolveVerifyChangedFiles(cwd, changeName)
1280
+ const diffFiles = resolveVerifyChangedFiles(cwd, changeName, null, { specBase })
1279
1281
  let base = null
1280
1282
  let head = null
1281
1283
  let reviewGitDir = cwd
package/src/taskcard.js CHANGED
@@ -120,6 +120,8 @@ constraints:
120
120
  ⚠️ plan --done 硬校验会拦截未替换的占位符(FR-XX / D-XXX / src/example/file.ts /
121
121
  一句话说明这个 task / 具体步骤 1 / 可验证的验收条件 1 / 边界约束 1)——占位符视同缺字段。
122
122
  可选字段按需插进上方 frontmatter(规则见 taskcard-rules):
123
+ repo: 仅跨仓 task 填(local.yaml repos: 注册的仓 key;缺省=main。allowed_paths 相对该仓根写,
124
+ 禁止带仓库名前缀/绝对路径——review 对账按仓根相对路径匹配,带前缀永不命中)
123
125
  provides: 仅当本 task 给其他 task 提供接口/DTO/响应时填
124
126
  expects_from: 仅当本 task 消费其他 task 的契约时填
125
127
  related_tests: 仅当本 task 改动导致既有测试断言失效时填(测试路径须同时进 allowed_paths) -->
@@ -22,7 +22,7 @@
22
22
  * task-12 经 run/prompt.js 注入 prompt 供用户否决)。
23
23
  */
24
24
 
25
- import { execSync } from 'child_process'
25
+ import { execSync, spawnSync } from 'child_process'
26
26
  import { gitQuiet } from './git-helper.js'
27
27
  import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from 'fs'
28
28
  import { join } from 'path'
@@ -457,15 +457,17 @@ export function extractModules(yamlText) {
457
457
  const modules = {}
458
458
  for (let i = startIdx + 1; i < lines.length; i++) {
459
459
  const line = lines[i]
460
- // 子条目:以 2 空格缩进 + key + ':' 开头
461
- const entry = line.match(/^ ([A-Za-z0-9_.\-]+):\s*(.*)$/)
460
+ // 条目缩进放宽为「任意非零空白」(坑 modules-indent-hardcoded,plan-postcheck parseLocalYamlModules
461
+ // 同款修复):此前硬编码恰 2 空格——4 空格缩进条目被静默跳过、Tab 缩进直接截断整个块 →
462
+ // modules 丢失 → modulesPresent=false 回退全量实测(600s 超时必炸)或 0 命中误跳过。
463
+ const entry = line.match(/^([ \t]+)([A-Za-z0-9_.\-]+):\s*(.*)$/)
462
464
  if (!entry) {
463
465
  // 遇到新的顶层 key(行首非空格且非注释)→ modules 块结束
464
466
  if (line.length > 0 && !line.startsWith(' ') && !line.startsWith('#') && line.trim() !== '') break
465
467
  continue
466
468
  }
467
- const name = entry[1]
468
- const rest = entry[2].trim()
469
+ const name = entry[2]
470
+ const rest = (entry[3] || '').trim()
469
471
  if (rest === '' || rest.startsWith('#')) continue // 子块展开式(本实现只支持 inline flow)
470
472
  // 解析 inline flow mapping: { path: "...", test: "..." }
471
473
  const pathVal = parseFlowValue(rest, 'path')
@@ -810,12 +812,15 @@ import { splitOwnVsForeignDiffFiles } from './foreign-declared.js'
810
812
  * @param {string} cwd - 项目根目录(主仓)
811
813
  * @param {string|null} changeName
812
814
  * @param {object|null} [ctx] - MultiRepoContext 实例(可选,缺省/null 走单仓原逻辑)
815
+ * @param {object} [opts]
816
+ * @param {boolean} [opts.includeWorkingTree=false]
817
+ * @param {string|null} [opts.specBase] spec 根(平台模式=specRoot,透传 resolveMainChangedFiles)
813
818
  * @returns {string[]|null} 变更文件列表;git 不可用返回 null(调用方按 hitCount=-1 处理)
814
819
  */
815
820
  export function resolveVerifyChangedFiles(cwd, changeName, ctx = null, opts = {}) {
816
821
  const { includeWorkingTree = false } = opts
817
822
  // 主仓 diff(原逻辑不动,单仓零回归)
818
- let mainFiles = resolveMainChangedFiles(cwd, changeName)
823
+ let mainFiles = resolveMainChangedFiles(cwd, changeName, opts.specBase)
819
824
 
820
825
  // 并入 worktree 未提交改动(坑 module-subset-zero-hit-uncommitted,2026-08-21 实证:
821
826
  // 子代理默认不 commit,真实改动全在 worktree working-tree——只看 base..HEAD commit diff
@@ -857,6 +862,7 @@ export function resolveVerifyChangedFiles(cwd, changeName, ctx = null, opts = {}
857
862
  // 那是 task-04 的 scope,本函数不消费锡点——跨仓合并 diff 在 verify-postcheck 内仅供
858
863
  // 「per-repo diff 合并」语义契约 + 未来 consumer,module 子集只用主仓 diff)。
859
864
  const merged = mainFiles ? mainFiles.slice() : []
865
+ const seen = new Set(merged) // Set 去重:merged.includes 线性扫在大 diff × 多仓合并时是 O(n²)
860
866
  let anyAvailable = mainFiles !== null
861
867
  for (const entry of crossEntries) {
862
868
  // 跨仓仓 gitDir = 跨仓仓根(MultiRepoContext._buildCrossRepoEntry 已 fail-closed 保证可达)
@@ -864,7 +870,10 @@ export function resolveVerifyChangedFiles(cwd, changeName, ctx = null, opts = {}
864
870
  if (files !== null) {
865
871
  anyAvailable = true
866
872
  for (const f of files) {
867
- if (!merged.includes(f)) merged.push(f)
873
+ if (!seen.has(f)) {
874
+ seen.add(f)
875
+ merged.push(f)
876
+ }
868
877
  }
869
878
  }
870
879
  }
@@ -877,11 +886,14 @@ export function resolveVerifyChangedFiles(cwd, changeName, ctx = null, opts = {}
877
886
  *
878
887
  * @param {string} cwd - 主仓根
879
888
  * @param {string|null} changeName
889
+ * @param {string|null} [specBase] spec 根(平台模式=specRoot;缺省 join(cwd,'.sillyspec'),
890
+ * meta.json 查找与他者声明过滤同用此根——A4 同族修复)
880
891
  * @returns {string[]|null}
881
892
  */
882
- function resolveMainChangedFiles(cwd, changeName) {
893
+ function resolveMainChangedFiles(cwd, changeName, specBase = null) {
894
+ const sb = specBase || join(cwd, '.sillyspec')
883
895
  if (changeName) {
884
- const metaPath = join(cwd, '.sillyspec', '.runtime', 'worktrees', changeName, 'meta.json')
896
+ const metaPath = join(sb, '.runtime', 'worktrees', changeName, 'meta.json')
885
897
  if (existsSync(metaPath)) {
886
898
  let meta = null
887
899
  try { meta = JSON.parse(readFileSync(metaPath, 'utf8')) } catch {}
@@ -902,7 +914,7 @@ function resolveMainChangedFiles(cwd, changeName) {
902
914
  // verify-reconcile-foreign-wip):他者显式声明(quick --files / 他者 design 清单)的
903
915
  // 文件剔除归他者——不混入本变更 module 命中。无主文件保留(fail-closed)。
904
916
  if (fallback !== null && changeName && fallback.length > 0) {
905
- const { own, foreign } = splitOwnVsForeignDiffFiles(cwd, changeName, fallback)
917
+ const { own, foreign } = splitOwnVsForeignDiffFiles(cwd, changeName, fallback, { specBase: sb })
906
918
  if (foreign.length > 0) {
907
919
  console.warn(`⚠️ verify 对账已排除 ${foreign.length} 个并行会话声明的文件(不参与本变更判定):${foreign.slice(0, 5).map(x => `${x.file}←${x.owners[0]}`).join(', ')}${foreign.length > 5 ? ' 等' : ''}`)
908
920
  return own
@@ -977,7 +989,7 @@ export function runVerifyTestCheck({ cwd, specBase, changeName = null, ctx = nul
977
989
  modulesPresent = true
978
990
  // includeWorkingTree(坑 module-subset-zero-hit-uncommitted):子代理不 commit 的改动
979
991
  // 也参与 module 命中判定,0 命中跳过不再误伤 worktree 未提交的真实变更
980
- const changedFiles = resolveVerifyChangedFiles(cwd, changeName, null, { includeWorkingTree: true })
992
+ const changedFiles = resolveVerifyChangedFiles(cwd, changeName, null, { includeWorkingTree: true, specBase })
981
993
  lastChangedFiles = Array.isArray(changedFiles) ? changedFiles : []
982
994
  if (changedFiles === null) {
983
995
  hitCount = -1 // git 不可用 / 非仓库
@@ -1259,7 +1271,6 @@ function extractPortsFromCommand(cmd) {
1259
1271
  */
1260
1272
  function isPortOccupiedSync(port) {
1261
1273
  try {
1262
- const { spawnSync } = require('node:child_process')
1263
1274
  const r = spawnSync(process.execPath, ['-e',
1264
1275
  `const n=require('node:net');const s=n.connect(${port},'127.0.0.1',()=>{console.log('Y');s.end()});s.on('error',()=>console.log('N'));setTimeout(()=>{console.log('N');process.exit(0)},1500)`],
1265
1276
  { encoding: 'utf8', timeout: 4000 })
@@ -1576,7 +1587,7 @@ export function runVerifyDeletionCheck({ cwd, specBase, changeName = null }) {
1576
1587
  // WIP 时,他者显式声明(quick --files / 他者 design 清单)的删除不参与本变更删除对账
1577
1588
  // (否则「他者删的文件 × 本变更 design 三态」产出未声明删除误报)。无主删除保留(fail-closed)。
1578
1589
  if (changeName && deliverable.length > 0) {
1579
- const { own, foreign } = splitOwnVsForeignDiffFiles(cwd, changeName, deliverable.map(d => d.path))
1590
+ const { own, foreign } = splitOwnVsForeignDiffFiles(cwd, changeName, deliverable.map(d => d.path), { specBase })
1580
1591
  if (foreign.length > 0) {
1581
1592
  console.warn(`⚠️ 删除对账已排除 ${foreign.length} 个并行会话声明的删除(${foreign.slice(0, 5).map(x => `${x.file}←${x.owners[0]}`).join(', ')}${foreign.length > 5 ? ' 等' : ''})`)
1582
1593
  const keep = new Set(own)
@@ -173,14 +173,17 @@ export function runVerifyProbes({ cwd, changeName, specDir = null }) {
173
173
  const probe5 = verifyApiParity(specBase, cwd, runtimeRoot, changeName)
174
174
 
175
175
  // ── 探针 6:代码删除对账(git diff --name-status HEAD 的 D/R × design 声明三态)──
176
- const probe6 = { deletions: [], note: '以 git 事实为准(真实 > 声明);是否 FAIL blocker 由 agent 诚实判定' }
176
+ const probe6 = { deletions: [], unavailable: false, note: '以 git 事实为准(真实 > 声明);是否 FAIL blocker 由 agent 诚实判定' }
177
177
  // 他者声明归属过滤(坑 verify-reconcile-foreign-wip):并行会话在途删除/改动不进本变更对账
178
- const nsOut = gitQuiet(cwd, ['diff', '--name-status', 'HEAD']) || ''
179
- let nsRows = nsOut.split('\n').filter(Boolean)
178
+ // gitQuiet 失败(非仓库/git 缺失/报错)返回 null ≠ 空结果:null 必须显式标记不可用,
179
+ // 否则半截对账被渲染成「✅ 无删除」的错误全清信号(对照 verify-postcheck runVerifyDeletionCheck 的 skipped 口径)
180
+ const nsOut = gitQuiet(cwd, ['diff', '--name-status', 'HEAD'])
181
+ if (nsOut === null) probe6.unavailable = true
182
+ let nsRows = (nsOut || '').split('\n').filter(Boolean)
180
183
  {
181
184
  const rawTargets = nsRows.map(row => ((row.split('\t')[1]) || ''))
182
185
  .filter(Boolean).map(t => t.split('\\').join('/'))
183
- const { foreign } = splitOwnVsForeignDiffFiles(cwd, changeName, rawTargets)
186
+ const { foreign } = splitOwnVsForeignDiffFiles(cwd, changeName, rawTargets, { specBase, runtimeRoot })
184
187
  if (foreign.length > 0) {
185
188
  const foreignSet = new Set(foreign.map(x => x.file))
186
189
  nsRows = nsRows.filter(row => !foreignSet.has((row.split('\t')[1] || '').split('\\').join('/')))
@@ -191,8 +194,8 @@ export function runVerifyProbes({ cwd, changeName, specDir = null }) {
191
194
  const [status, ...paths] = row.split('\t')
192
195
  const st = (status || '').trim().toUpperCase()
193
196
  if (!/^[DRC]/.test(st)) continue
194
- // R/C 的旧路径等价删除(paths[0]);D 的唯一路径
195
- const target = (st.startsWith('D') ? paths[0] : paths[0]) || ''
197
+ // R/C 的旧路径等价删除(paths[0]);D 的唯一路径——两者都取 paths[0]
198
+ const target = paths[0] || ''
196
199
  const posix = target.split('\\').join('/')
197
200
  if (!posix || posix.startsWith('.sillyspec/') || posix === 'meta.json' || basename(posix) === 'meta.json') continue
198
201
  const op = designOps.get(posix)
@@ -270,7 +273,9 @@ export function renderVerifyProbesReport(result) {
270
273
  L.push('')
271
274
 
272
275
  L.push('#### 探针 6:代码删除对账')
273
- if (probe6.deletions.length === 0) {
276
+ if (probe6.unavailable) {
277
+ L.push('- ⚠️ git 不可用或非仓库,删除对账无法执行(不能视为「无删除」,agent 需人工核对)')
278
+ } else if (probe6.deletions.length === 0) {
274
279
  L.push('- ✅ git diff 无整文件删除(D/R/C)记录')
275
280
  } else {
276
281
  for (const d of probe6.deletions) {
@@ -23,6 +23,22 @@ import { resolveLatestExecuteRunId, resolveLatestExecuteRunIdWithTasks, readRevi
23
23
 
24
24
  const CHANGES_REL = '.sillyspec/changes';
25
25
 
26
+ /**
27
+ * cleanup 返回值必须消费(坑 ghost-dir-junction-pierce,2026-08-23 实证:apply 后 partial
28
+ * 残留被静默丢弃,用户以为已干净、人工 rm -rf 时穿透 junction 删主仓 node_modules)。
29
+ * 模块级共享:applyWorktree 无变更早退 / skip-overlap / applyByMerge 成功路径三处统一走此消费。
30
+ */
31
+ function consumeCleanupResult(cr, result) {
32
+ if (cr && (cr.result === 'partial' || (Array.isArray(cr.residual) && cr.residual.length > 0))) {
33
+ result.warnings = result.warnings || [];
34
+ result.warnings.push(
35
+ `⚠️ worktree 部分清理残留(${cr.result}):${(cr.residual || []).join('; ') || 'worktree 目录'}` +
36
+ `——Windows 勿直接 rm -rf(会穿透 node_modules junction 删主仓依赖):先 cmd /c rmdir "<worktree>\\node_modules" 解链再删目录,或跑 sillyspec worktree doctor --fix`
37
+ );
38
+ }
39
+ return cr;
40
+ }
41
+
26
42
  /**
27
43
  * 过滤掉 worktree 基础设施文件(非交付物),让 apply 只关心真正的变更产出:
28
44
  * - meta.json:worktree 元数据,baseline commit 中被跟踪、working-tree 被 CLI 改写
@@ -496,6 +512,10 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
496
512
  // 同时检测 untracked 新文件(git diff 不包含 untracked)
497
513
  let changedFiles;
498
514
  const deletedFiles = [];
515
+ // merge 后应「不存在于 main HEAD」的文件(D 删除 + R/C rename/copy 源路径):
516
+ // applyByMerge 落地校验按此分流——原实现一律要求 cat-file 存在,含删除文件的变更
517
+ // merge 成功也恒报「未落地」失败、worktree 永不清理(坑 apply-merge-deleted-misjudged)
518
+ const absentAfterMerge = [];
499
519
  try {
500
520
  // 用 --name-status 捕获 rename/delete(--name-only 会丢失 rename 源文件)
501
521
  // 交付集合判定:用 deliverableBase(baselineCommit||baseHash),保「只合子代理改动」语义
@@ -509,8 +529,11 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
509
529
  if (parts.length >= 3) statusFiles.add(parts[parts.length - 2]);
510
530
  // 删除文件(status D / D100)→ 收集到 deletedFiles(rescue DELETE 分类用,design §逐文件分类)
511
531
  if (parts[0].startsWith('D')) deletedFiles.push(parts[parts.length - 1]);
532
+ // rename/copy 源路径(R100/C99 old new 三段式)→ 同删除语义:merge 后 HEAD 中不应存在
533
+ if (parts.length >= 3 && !parts[0].startsWith('D')) absentAfterMerge.push(parts[parts.length - 2]);
512
534
  }
513
535
  }
536
+ for (const f of deletedFiles) absentAfterMerge.push(f);
514
537
 
515
538
  // untracked 新文件(deliverableBase 中不存在的文件)
516
539
  const untrackedRaw = gitQuiet(worktreePath, ['ls-files', '--others', '--exclude-standard']);
@@ -527,11 +550,12 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
527
550
 
528
551
  result.changedFiles = changedFiles;
529
552
  result.deletedFiles = deletedFiles;
553
+ result.absentAfterMerge = absentAfterMerge;
530
554
 
531
555
  if (changedFiles.length === 0) {
532
556
  // 没有变更
533
557
  if (!checkOnly) {
534
- wm.cleanup(changeName, { force: true });
558
+ consumeCleanupResult(wm.cleanup(changeName, { force: true }), result);
535
559
  }
536
560
  result.ok = true;
537
561
  return result;
@@ -936,15 +960,9 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
936
960
  // cleanup 的拦截横幅吓人,主动判断 + 温和提示);全部已落地(无跳过残留)才照常清理。
937
961
  // cleanup 返回值必须消费(坑 ghost-dir-junction-pierce,2026-08-23 实证:apply 后 partial
938
962
  // 残留被静默丢弃,用户以为已干净、人工 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
- }
963
+ // cleanup 返回值必须消费(坑 ghost-dir-junction-pierce)——实现提升为模块级 consumeCleanupResult,
964
+ // 与无变更早退 / applyByMerge 成功路径三处共用
965
+ const consumeCleanup = (cr) => consumeCleanupResult(cr, result)
948
966
  try {
949
967
  if (skipOverlap) {
950
968
  const unapplied = wm.hasUnappliedChanges(changeName);
@@ -1329,13 +1347,19 @@ export function applyByMerge(result, changeName, projectRoot, wm, opts = {}) {
1329
1347
 
1330
1348
  // 落地校验:merge 报成功(exit 0)不代表交付物真进 main——
1331
1349
  // 分支可能只含 baseline checkpoint(子代理改动未 commit),merge 产生空内容合并,文件零落地。
1332
- // 逐个确认 changedFiles 在 main HEAD 存在。任一缺失 → 不 cleanup(fail-open:保留 worktree 唯一副本)。
1350
+ // 落地语义按文件类型分流:普通交付文件应存在于 main HEAD;删除/rename 源文件(absentAfterMerge)
1351
+ // 应「不存在」——原实现一律要求存在,含删除文件的变更 merge 成功也恒报失败(坑 apply-merge-deleted-misjudged)。
1352
+ // 任一未按预期落地 → 不 cleanup(fail-open:保留 worktree 唯一副本)。
1333
1353
  result.merged = true;
1334
- const notLanded = changedFiles.filter(f => gitQuiet(projectRoot, ['cat-file', '-e', `HEAD:${f}`]) === null);
1354
+ const absentExpected = new Set(result.absentAfterMerge || []);
1355
+ const notLanded = changedFiles.filter(f => {
1356
+ const inHead = gitQuiet(projectRoot, ['cat-file', '-e', `HEAD:${f}`]) !== null;
1357
+ return absentExpected.has(f) ? inHead : !inHead;
1358
+ });
1335
1359
  if (notLanded.length > 0) {
1336
1360
  result.ok = false;
1337
1361
  result.errors.push(
1338
- `git merge ${branch} 报成功,但 ${notLanded.length}/${changedFiles.length} 个交付文件未出现在 main HEAD` +
1362
+ `git merge ${branch} 报成功,但 ${notLanded.length}/${changedFiles.length} 个交付文件未按预期落地 main HEAD` +
1339
1363
  `(分支可能只含 baseline checkpoint,子代理改动未 commit)。worktree 已保留(未 cleanup),` +
1340
1364
  `请用 git cherry-pick 或手动 cp 落地:\n ${notLanded.join('\n ')}`
1341
1365
  );
@@ -1345,7 +1369,7 @@ export function applyByMerge(result, changeName, projectRoot, wm, opts = {}) {
1345
1369
  result.ok = true;
1346
1370
  try { result.mergeSummary = git(projectRoot, ['log', '--oneline', '-1']); } catch {}
1347
1371
  try {
1348
- wm.cleanup(changeName, { force: true });
1372
+ consumeCleanupResult(wm.cleanup(changeName, { force: true }), result);
1349
1373
  } catch (cleanupErr) {
1350
1374
  result.warnings = result.warnings || [];
1351
1375
  result.warnings.push(`cleanup 失败(不影响 merge 结果): ${cleanupErr.message}`);
@@ -8,7 +8,7 @@
8
8
  * 见 change 2026-06-28-worktree-deps-provision / D-005@v1, D-007@v1。
9
9
  */
10
10
 
11
- import { existsSync, readFileSync, realpathSync, lstatSync, readdirSync } from 'fs';
11
+ import { existsSync, readFileSync, realpathSync, lstatSync, readdirSync, unlinkSync } from 'fs';
12
12
  import { join, isAbsolute, relative, resolve as resolvePath, sep as pathSep } from 'path';
13
13
  import { fileURLToPath } from 'url';
14
14
  import { execFileSync } from 'child_process';
package/src/worktree.js CHANGED
@@ -14,6 +14,7 @@ import { join, resolve, dirname, relative, isAbsolute } from 'path';
14
14
  import { createHash } from 'crypto';
15
15
  import { provisionDeps, checkDepsFreshness, detectEditableInstallEscape } from './worktree-deps.js';
16
16
  import { writeAtomicSync } from './fs-atomic.js';
17
+ import { openDatabase } from './db-engine.js';
17
18
  import { git, gitQuiet } from './git-helper.js';
18
19
 
19
20
  // meta.json 会被 hook 进程与其它 CLI 进程并发读取(worktree-guard / getMeta / create 幽灵判定),
@@ -551,7 +552,12 @@ export class WorktreeManager {
551
552
  // 体检 BUG-16 并发竞态防御:多 agent 同时首建同名 change 时,败者的 add 失败可能只是
552
553
  // 「赢家刚建成目录/分支」。此时降级 in-place 会造成一个 worktree + 一个 in-place 的
553
554
  // 分裂状态(两 agent 各写各的基线)——先重查,并发赢家已建成则按 already exists 抛错。
554
- if (existsSync(worktreePath) || gitQuiet(this.cwd, ['rev-parse', '--verify', `refs/heads/${branch}`])) {
555
+ // adopt 路径排除「分支存在性」判据(坑 adopt-branch-misreport-race):分支既存是 adopt 的
556
+ // 前置条件(498 行已验证),此处 rev-parse 恒真——不排除时「分支已被其他 worktree 检出 /
557
+ // checkout 冲突 / 超时」等任何失败都被误报成「并发创建,另一进程已抢先建成」,
558
+ // 把用户指向完全错误的处置方向(Run cleanup first)。adopt 下仅目录存在性可作竞态判据。
559
+ const isAdoptPath = branchExists && adoptBranch;
560
+ if (existsSync(worktreePath) || (!isAdoptPath && gitQuiet(this.cwd, ['rev-parse', '--verify', `refs/heads/${branch}`]))) {
555
561
  throw new Error(`worktree already exists: ${name}(并发创建,另一进程已抢先建成,本进程不降级 in-place). Run cleanup first.`);
556
562
  }
557
563
  // sandbox/permission fallback: 降级为 in-place + baseline protection
@@ -1636,7 +1642,6 @@ export class WorktreeManager {
1636
1642
  try {
1637
1643
  const dbPath = join(this.cwd, '.sillyspec', '.runtime', 'sillyspec.db');
1638
1644
  if (!existsSync(dbPath)) return false;
1639
- const { openDatabase } = require('./db-engine.js');
1640
1645
  const db = openDatabase(dbPath, { readOnly: true });
1641
1646
  try {
1642
1647
  const row = db.prepare('SELECT status FROM changes WHERE name = ?').get(name);