peaks-loop 4.1.2 → 4.1.4

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 (717) hide show
  1. package/.claude-plugin/marketplace.json +136 -47
  2. package/CHANGELOG.md +112 -0
  3. package/README-en.md +1 -1
  4. package/README.md +1 -1
  5. package/contracts/readonly-argv-whitelist.json +211 -0
  6. package/dist/cli/commands/asset-command-shared.d.ts +12 -0
  7. package/dist/cli/commands/asset-command-shared.js +45 -0
  8. package/dist/cli/commands/asset-commands.d.ts +6 -1
  9. package/dist/cli/commands/asset-commands.js +11 -372
  10. package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
  11. package/dist/cli/commands/asset-crystallize-command.js +60 -0
  12. package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
  13. package/dist/cli/commands/asset-crystallize-payload.js +85 -0
  14. package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
  15. package/dist/cli/commands/asset-crystallize-runner.js +133 -0
  16. package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
  17. package/dist/cli/commands/asset-dispose-command.js +99 -0
  18. package/dist/cli/commands/asset-status-command.d.ts +3 -0
  19. package/dist/cli/commands/asset-status-command.js +100 -0
  20. package/dist/cli/commands/audit-artifact-runners.d.ts +16 -0
  21. package/dist/cli/commands/audit-artifact-runners.js +170 -0
  22. package/dist/cli/commands/audit-command-shared.d.ts +97 -0
  23. package/dist/cli/commands/audit-command-shared.js +60 -0
  24. package/dist/cli/commands/audit-commands.d.ts +7 -31
  25. package/dist/cli/commands/audit-commands.js +64 -473
  26. package/dist/cli/commands/audit-goal-runners.d.ts +17 -0
  27. package/dist/cli/commands/audit-goal-runners.js +114 -0
  28. package/dist/cli/commands/audit-red-lines-runners.d.ts +11 -0
  29. package/dist/cli/commands/audit-red-lines-runners.js +43 -0
  30. package/dist/cli/commands/audit-refusal-data.d.ts +23 -0
  31. package/dist/cli/commands/audit-refusal-data.js +69 -0
  32. package/dist/cli/commands/audit-static-runners.d.ts +13 -0
  33. package/dist/cli/commands/audit-static-runners.js +139 -0
  34. package/dist/cli/commands/await-runners.d.ts +11 -0
  35. package/dist/cli/commands/await-runners.js +148 -0
  36. package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
  37. package/dist/cli/commands/baseline-audit-command.js +64 -0
  38. package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
  39. package/dist/cli/commands/baseline-command-shared.js +39 -0
  40. package/dist/cli/commands/baseline-commands.js +33 -313
  41. package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
  42. package/dist/cli/commands/baseline-freeze-commands.js +81 -0
  43. package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
  44. package/dist/cli/commands/baseline-guard-command.js +52 -0
  45. package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
  46. package/dist/cli/commands/baseline-read-commands.js +72 -0
  47. package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
  48. package/dist/cli/commands/baseline-rollback-commands.js +88 -0
  49. package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
  50. package/dist/cli/commands/classify-downgrade-command.js +21 -0
  51. package/dist/cli/commands/classify-run-command.d.ts +9 -0
  52. package/dist/cli/commands/classify-run-command.js +73 -0
  53. package/dist/cli/commands/classify-signals.d.ts +5 -0
  54. package/dist/cli/commands/classify-signals.js +104 -0
  55. package/dist/cli/commands/code-auto-compact-command.d.ts +3 -0
  56. package/dist/cli/commands/code-auto-compact-command.js +124 -0
  57. package/dist/cli/commands/code-auto-compact-envelope.d.ts +22 -0
  58. package/dist/cli/commands/code-auto-compact-envelope.js +39 -0
  59. package/dist/cli/commands/code-context-audit-command.d.ts +3 -0
  60. package/dist/cli/commands/code-context-audit-command.js +68 -0
  61. package/dist/cli/commands/code-context-now-command.d.ts +3 -0
  62. package/dist/cli/commands/code-context-now-command.js +124 -0
  63. package/dist/cli/commands/code-context-now-envelope.d.ts +66 -0
  64. package/dist/cli/commands/code-context-now-envelope.js +136 -0
  65. package/dist/cli/commands/code-context-now-mapping.d.ts +27 -0
  66. package/dist/cli/commands/code-context-now-mapping.js +43 -0
  67. package/dist/cli/commands/code-emit-handoff-command.d.ts +3 -0
  68. package/dist/cli/commands/code-emit-handoff-command.js +136 -0
  69. package/dist/cli/commands/code-gate-step-08-command.d.ts +3 -0
  70. package/dist/cli/commands/code-gate-step-08-command.js +155 -0
  71. package/dist/cli/commands/code-post-compact-detect-command.d.ts +3 -0
  72. package/dist/cli/commands/code-post-compact-detect-command.js +50 -0
  73. package/dist/cli/commands/code-runtime-commands.d.ts +9 -43
  74. package/dist/cli/commands/code-runtime-commands.js +20 -672
  75. package/dist/cli/commands/code-runtime-session.d.ts +1 -0
  76. package/dist/cli/commands/code-runtime-session.js +15 -0
  77. package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
  78. package/dist/cli/commands/codegraph-command-options.js +22 -0
  79. package/dist/cli/commands/codegraph-commands.d.ts +2 -2
  80. package/dist/cli/commands/codegraph-commands.js +14 -397
  81. package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
  82. package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
  83. package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
  84. package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
  85. package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
  86. package/dist/cli/commands/codegraph-repair-commands.js +94 -0
  87. package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
  88. package/dist/cli/commands/codegraph-status-command.js +27 -214
  89. package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
  90. package/dist/cli/commands/codegraph-status-integrity.js +121 -0
  91. package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
  92. package/dist/cli/commands/codegraph-status-json.js +127 -0
  93. package/dist/cli/commands/compact-command.d.ts +6 -2
  94. package/dist/cli/commands/compact-command.js +12 -559
  95. package/dist/cli/commands/compact-dry-run-command.d.ts +3 -0
  96. package/dist/cli/commands/compact-dry-run-command.js +87 -0
  97. package/dist/cli/commands/compact-force-command.d.ts +3 -0
  98. package/dist/cli/commands/compact-force-command.js +98 -0
  99. package/dist/cli/commands/compact-harness-window-command.d.ts +3 -0
  100. package/dist/cli/commands/compact-harness-window-command.js +174 -0
  101. package/dist/cli/commands/compact-history-command.d.ts +3 -0
  102. package/dist/cli/commands/compact-history-command.js +89 -0
  103. package/dist/cli/commands/compact-read-commands.d.ts +3 -0
  104. package/dist/cli/commands/compact-read-commands.js +123 -0
  105. package/dist/cli/commands/compact-settle-command.d.ts +3 -0
  106. package/dist/cli/commands/compact-settle-command.js +130 -0
  107. package/dist/cli/commands/compact-shared.d.ts +9 -0
  108. package/dist/cli/commands/compact-shared.js +26 -0
  109. package/dist/cli/commands/container-command-shared.d.ts +60 -0
  110. package/dist/cli/commands/container-command-shared.js +52 -0
  111. package/dist/cli/commands/container-commands.d.ts +1 -1
  112. package/dist/cli/commands/container-commands.js +4 -216
  113. package/dist/cli/commands/container-release-command.d.ts +3 -0
  114. package/dist/cli/commands/container-release-command.js +105 -0
  115. package/dist/cli/commands/container-spawn-command.d.ts +3 -0
  116. package/dist/cli/commands/container-spawn-command.js +148 -0
  117. package/dist/cli/commands/context-check-command.d.ts +3 -0
  118. package/dist/cli/commands/context-check-command.js +81 -0
  119. package/dist/cli/commands/context-commands.d.ts +2 -7
  120. package/dist/cli/commands/context-commands.js +6 -276
  121. package/dist/cli/commands/context-layer-command.d.ts +3 -0
  122. package/dist/cli/commands/context-layer-command.js +34 -0
  123. package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
  124. package/dist/cli/commands/context-layer-fetchers.js +162 -0
  125. package/dist/cli/commands/context-status-command.d.ts +17 -0
  126. package/dist/cli/commands/context-status-command.js +41 -0
  127. package/dist/cli/commands/contract-write-command.d.ts +3 -0
  128. package/dist/cli/commands/contract-write-command.js +144 -0
  129. package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
  130. package/dist/cli/commands/core/doctor-bindings.js +30 -0
  131. package/dist/cli/commands/core/doctor-command.d.ts +4 -18
  132. package/dist/cli/commands/core/doctor-command.js +2 -323
  133. package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
  134. package/dist/cli/commands/core/doctor-logs.js +32 -0
  135. package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
  136. package/dist/cli/commands/core/doctor-probes.js +55 -0
  137. package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
  138. package/dist/cli/commands/core/doctor-run-command.js +172 -0
  139. package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
  140. package/dist/cli/commands/core/doctor-summary.js +39 -0
  141. package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
  142. package/dist/cli/commands/core/memory-command-shared.js +20 -0
  143. package/dist/cli/commands/core/memory-command.d.ts +1 -1
  144. package/dist/cli/commands/core/memory-command.js +6 -227
  145. package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
  146. package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
  147. package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
  148. package/dist/cli/commands/core/memory-extract-command.js +90 -0
  149. package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
  150. package/dist/cli/commands/core/memory-sync-command.js +38 -0
  151. package/dist/cli/commands/core/session-command.d.ts +1 -1
  152. package/dist/cli/commands/core/session-command.js +12 -206
  153. package/dist/cli/commands/core/session-info-command.d.ts +3 -0
  154. package/dist/cli/commands/core/session-info-command.js +142 -0
  155. package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
  156. package/dist/cli/commands/core/session-verb-commands.js +58 -0
  157. package/dist/cli/commands/core/skill-command.d.ts +1 -44
  158. package/dist/cli/commands/core/skill-command.js +13 -541
  159. package/dist/cli/commands/core/skill-context-verdict.d.ts +38 -0
  160. package/dist/cli/commands/core/skill-context-verdict.js +63 -0
  161. package/dist/cli/commands/core/skill-generated-config-notice.d.ts +41 -0
  162. package/dist/cli/commands/core/skill-generated-config-notice.js +75 -0
  163. package/dist/cli/commands/core/skill-heartbeat-commands.d.ts +3 -0
  164. package/dist/cli/commands/core/skill-heartbeat-commands.js +50 -0
  165. package/dist/cli/commands/core/skill-presence-commands.d.ts +3 -0
  166. package/dist/cli/commands/core/skill-presence-commands.js +123 -0
  167. package/dist/cli/commands/core/skill-presence-housekeeping-commands.d.ts +3 -0
  168. package/dist/cli/commands/core/skill-presence-housekeeping-commands.js +165 -0
  169. package/dist/cli/commands/core/skill-registry-commands.d.ts +3 -0
  170. package/dist/cli/commands/core/skill-registry-commands.js +117 -0
  171. package/dist/cli/commands/core/skill-runbook-command.d.ts +3 -0
  172. package/dist/cli/commands/core/skill-runbook-command.js +29 -0
  173. package/dist/cli/commands/core/standards-command.d.ts +1 -24
  174. package/dist/cli/commands/core/standards-command.js +33 -201
  175. package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
  176. package/dist/cli/commands/core/standards-init-command.js +87 -0
  177. package/dist/cli/commands/core/standards-lint.d.ts +24 -0
  178. package/dist/cli/commands/core/standards-lint.js +57 -0
  179. package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
  180. package/dist/cli/commands/core/standards-migrate-command.js +57 -0
  181. package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
  182. package/dist/cli/commands/cron-scheduler-commands.js +36 -206
  183. package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
  184. package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
  185. package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
  186. package/dist/cli/commands/cron-scheduler-shared.js +48 -0
  187. package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
  188. package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
  189. package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
  190. package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
  191. package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
  192. package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
  193. package/dist/cli/commands/dispatch-command-spec.d.ts +2 -0
  194. package/dist/cli/commands/dispatch-command-spec.js +62 -0
  195. package/dist/cli/commands/dispatch-commands.js +159 -775
  196. package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
  197. package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
  198. package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
  199. package/dist/cli/commands/dispatch-dag-failure.js +16 -0
  200. package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
  201. package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
  202. package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
  203. package/dist/cli/commands/dispatch-dag-runners.js +73 -0
  204. package/dist/cli/commands/dispatch-detached-branch.d.ts +3 -0
  205. package/dist/cli/commands/dispatch-detached-branch.js +58 -0
  206. package/dist/cli/commands/dispatch-envelope.d.ts +36 -0
  207. package/dist/cli/commands/dispatch-envelope.js +104 -0
  208. package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
  209. package/dist/cli/commands/dispatch-from-dag.js +87 -257
  210. package/dist/cli/commands/dispatch-isolation-lease.d.ts +17 -0
  211. package/dist/cli/commands/dispatch-isolation-lease.js +149 -0
  212. package/dist/cli/commands/dispatch-preflight.d.ts +7 -0
  213. package/dist/cli/commands/dispatch-preflight.js +105 -0
  214. package/dist/cli/commands/dispatch-prompt-blocks.d.ts +10 -0
  215. package/dist/cli/commands/dispatch-prompt-blocks.js +56 -0
  216. package/dist/cli/commands/dispatch-prompt-composition.d.ts +30 -0
  217. package/dist/cli/commands/dispatch-prompt-composition.js +171 -0
  218. package/dist/cli/commands/dispatch-record-write.d.ts +24 -0
  219. package/dist/cli/commands/dispatch-record-write.js +96 -0
  220. package/dist/cli/commands/dispatch-tool-call.d.ts +15 -0
  221. package/dist/cli/commands/dispatch-tool-call.js +128 -0
  222. package/dist/cli/commands/evolution-command-shared.d.ts +78 -0
  223. package/dist/cli/commands/evolution-command-shared.js +107 -0
  224. package/dist/cli/commands/evolution-commands.d.ts +11 -1
  225. package/dist/cli/commands/evolution-commands.js +19 -350
  226. package/dist/cli/commands/evolution-evaluate-command.d.ts +24 -0
  227. package/dist/cli/commands/evolution-evaluate-command.js +138 -0
  228. package/dist/cli/commands/evolution-propose-command.d.ts +23 -0
  229. package/dist/cli/commands/evolution-propose-command.js +145 -0
  230. package/dist/cli/commands/evolution-status-command.d.ts +17 -0
  231. package/dist/cli/commands/evolution-status-command.js +41 -0
  232. package/dist/cli/commands/evolution-verdict-commands.d.ts +30 -0
  233. package/dist/cli/commands/evolution-verdict-commands.js +100 -0
  234. package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
  235. package/dist/cli/commands/final-review-command-envelopes.js +100 -0
  236. package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
  237. package/dist/cli/commands/final-review-command-shared.js +35 -0
  238. package/dist/cli/commands/final-review-commands.d.ts +7 -27
  239. package/dist/cli/commands/final-review-commands.js +13 -240
  240. package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
  241. package/dist/cli/commands/final-review-prepare-command.js +200 -0
  242. package/dist/cli/commands/finalize-accumulator.d.ts +44 -0
  243. package/dist/cli/commands/finalize-accumulator.js +55 -0
  244. package/dist/cli/commands/finalize-branches.d.ts +34 -0
  245. package/dist/cli/commands/finalize-branches.js +119 -0
  246. package/dist/cli/commands/finalize-runners.d.ts +3 -0
  247. package/dist/cli/commands/finalize-runners.js +92 -0
  248. package/dist/cli/commands/finalize-selection.d.ts +65 -0
  249. package/dist/cli/commands/finalize-selection.js +35 -0
  250. package/dist/cli/commands/gate-commands.js +26 -8
  251. package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
  252. package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
  253. package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
  254. package/dist/cli/commands/hooks-command-shared.js +32 -0
  255. package/dist/cli/commands/hooks-commands.d.ts +20 -0
  256. package/dist/cli/commands/hooks-commands.js +75 -309
  257. package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
  258. package/dist/cli/commands/hooks-install-envelopes.js +144 -0
  259. package/dist/cli/commands/hooks-status-command.d.ts +3 -0
  260. package/dist/cli/commands/hooks-status-command.js +93 -0
  261. package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
  262. package/dist/cli/commands/hooks-uninstall-command.js +43 -0
  263. package/dist/cli/commands/job-checkpoint-commands.d.ts +3 -0
  264. package/dist/cli/commands/job-checkpoint-commands.js +157 -0
  265. package/dist/cli/commands/job-command-shared.d.ts +109 -0
  266. package/dist/cli/commands/job-command-shared.js +72 -0
  267. package/dist/cli/commands/job-commands.d.ts +4 -64
  268. package/dist/cli/commands/job-commands.js +42 -552
  269. package/dist/cli/commands/job-cost-check-command.d.ts +3 -0
  270. package/dist/cli/commands/job-cost-check-command.js +41 -0
  271. package/dist/cli/commands/job-init-status-commands.d.ts +3 -0
  272. package/dist/cli/commands/job-init-status-commands.js +149 -0
  273. package/dist/cli/commands/job-run-commands.d.ts +3 -0
  274. package/dist/cli/commands/job-run-commands.js +97 -0
  275. package/dist/cli/commands/job-state-root.d.ts +35 -0
  276. package/dist/cli/commands/job-state-root.js +76 -0
  277. package/dist/cli/commands/loop-command-shared.d.ts +31 -0
  278. package/dist/cli/commands/loop-command-shared.js +15 -0
  279. package/dist/cli/commands/loop-commands.d.ts +12 -17
  280. package/dist/cli/commands/loop-commands.js +56 -238
  281. package/dist/cli/commands/loop-eval-capture-index.d.ts +4 -0
  282. package/dist/cli/commands/loop-eval-capture-index.js +44 -0
  283. package/dist/cli/commands/loop-eval-commands.d.ts +8 -5
  284. package/dist/cli/commands/loop-eval-commands.js +12 -626
  285. package/dist/cli/commands/loop-eval-eval-command.d.ts +3 -0
  286. package/dist/cli/commands/loop-eval-eval-command.js +168 -0
  287. package/dist/cli/commands/loop-eval-monotonic-command.d.ts +3 -0
  288. package/dist/cli/commands/loop-eval-monotonic-command.js +90 -0
  289. package/dist/cli/commands/loop-eval-parents.d.ts +7 -0
  290. package/dist/cli/commands/loop-eval-parents.js +20 -0
  291. package/dist/cli/commands/loop-eval-run-code.d.ts +7 -0
  292. package/dist/cli/commands/loop-eval-run-code.js +40 -0
  293. package/dist/cli/commands/loop-eval-run-command.d.ts +3 -0
  294. package/dist/cli/commands/loop-eval-run-command.js +113 -0
  295. package/dist/cli/commands/loop-eval-spec-commands.d.ts +3 -0
  296. package/dist/cli/commands/loop-eval-spec-commands.js +165 -0
  297. package/dist/cli/commands/loop-eval-spec-lint-command.d.ts +3 -0
  298. package/dist/cli/commands/loop-eval-spec-lint-command.js +42 -0
  299. package/dist/cli/commands/loop-eval-workflow-commands.d.ts +3 -0
  300. package/dist/cli/commands/loop-eval-workflow-commands.js +141 -0
  301. package/dist/cli/commands/loop-export-command.d.ts +3 -0
  302. package/dist/cli/commands/loop-export-command.js +73 -0
  303. package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
  304. package/dist/cli/commands/loop-goal-compose-command.js +36 -0
  305. package/dist/cli/commands/loop-import-command.d.ts +3 -0
  306. package/dist/cli/commands/loop-import-command.js +86 -0
  307. package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
  308. package/dist/cli/commands/loop-placeholder-commands.js +52 -0
  309. package/dist/cli/commands/mcp-commands.d.ts +10 -0
  310. package/dist/cli/commands/mcp-commands.js +157 -0
  311. package/dist/cli/commands/memory-command-shared.d.ts +59 -0
  312. package/dist/cli/commands/memory-command-shared.js +39 -0
  313. package/dist/cli/commands/memory-commands.d.ts +6 -79
  314. package/dist/cli/commands/memory-commands.js +19 -309
  315. package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
  316. package/dist/cli/commands/memory-ingest-command.js +50 -0
  317. package/dist/cli/commands/memory-list-command.d.ts +16 -0
  318. package/dist/cli/commands/memory-list-command.js +129 -0
  319. package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
  320. package/dist/cli/commands/memory-reindex-command.js +78 -0
  321. package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
  322. package/dist/cli/commands/memory-rotate-command.js +55 -0
  323. package/dist/cli/commands/memory-search-command.d.ts +7 -0
  324. package/dist/cli/commands/memory-search-command.js +46 -0
  325. package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
  326. package/dist/cli/commands/openspec-archive-command.js +55 -0
  327. package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
  328. package/dist/cli/commands/openspec-command-shared.js +135 -0
  329. package/dist/cli/commands/openspec-commands.d.ts +1 -1
  330. package/dist/cli/commands/openspec-commands.js +33 -306
  331. package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
  332. package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
  333. package/dist/cli/commands/openspec-init-command.d.ts +3 -0
  334. package/dist/cli/commands/openspec-init-command.js +49 -0
  335. package/dist/cli/commands/openspec-list-command.d.ts +3 -0
  336. package/dist/cli/commands/openspec-list-command.js +27 -0
  337. package/dist/cli/commands/openspec-render-command.d.ts +3 -0
  338. package/dist/cli/commands/openspec-render-command.js +33 -0
  339. package/dist/cli/commands/openspec-show-command.d.ts +3 -0
  340. package/dist/cli/commands/openspec-show-command.js +33 -0
  341. package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
  342. package/dist/cli/commands/openspec-to-rd-command.js +33 -0
  343. package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
  344. package/dist/cli/commands/openspec-validate-command.js +45 -0
  345. package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
  346. package/dist/cli/commands/playwright-browser-command.js +61 -0
  347. package/dist/cli/commands/playwright-commands.d.ts +10 -62
  348. package/dist/cli/commands/playwright-commands.js +77 -400
  349. package/dist/cli/commands/playwright-envelope.d.ts +8 -0
  350. package/dist/cli/commands/playwright-envelope.js +29 -0
  351. package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
  352. package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
  353. package/dist/cli/commands/playwright-session-store.d.ts +65 -0
  354. package/dist/cli/commands/playwright-session-store.js +189 -0
  355. package/dist/cli/commands/project-commands.d.ts +19 -0
  356. package/dist/cli/commands/project-commands.js +98 -259
  357. package/dist/cli/commands/project-context-command.d.ts +3 -0
  358. package/dist/cli/commands/project-context-command.js +44 -0
  359. package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
  360. package/dist/cli/commands/project-dashboard-command.js +74 -0
  361. package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
  362. package/dist/cli/commands/project-knowledge-command.js +48 -0
  363. package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
  364. package/dist/cli/commands/project-memories-show-command.js +87 -0
  365. package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
  366. package/dist/cli/commands/project-memory-index-command.js +31 -0
  367. package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
  368. package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
  369. package/dist/cli/commands/qa-commands.d.ts +14 -87
  370. package/dist/cli/commands/qa-commands.js +17 -315
  371. package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
  372. package/dist/cli/commands/qa-context-prestep.js +34 -0
  373. package/dist/cli/commands/qa-run-command.d.ts +3 -0
  374. package/dist/cli/commands/qa-run-command.js +105 -0
  375. package/dist/cli/commands/qa-run-options.d.ts +23 -0
  376. package/dist/cli/commands/qa-run-options.js +31 -0
  377. package/dist/cli/commands/qa-run-slice.d.ts +41 -0
  378. package/dist/cli/commands/qa-run-slice.js +145 -0
  379. package/dist/cli/commands/release-canary-command.d.ts +28 -0
  380. package/dist/cli/commands/release-canary-command.js +129 -0
  381. package/dist/cli/commands/release-command-shared.d.ts +13 -0
  382. package/dist/cli/commands/release-command-shared.js +18 -0
  383. package/dist/cli/commands/release-commands.d.ts +10 -18
  384. package/dist/cli/commands/release-commands.js +25 -298
  385. package/dist/cli/commands/release-done-command.d.ts +3 -0
  386. package/dist/cli/commands/release-done-command.js +64 -0
  387. package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
  388. package/dist/cli/commands/release-hotfix-command.js +50 -0
  389. package/dist/cli/commands/release-plan-command.d.ts +3 -0
  390. package/dist/cli/commands/release-plan-command.js +33 -0
  391. package/dist/cli/commands/release-precheck-command.d.ts +3 -0
  392. package/dist/cli/commands/release-precheck-command.js +28 -0
  393. package/dist/cli/commands/release-promote-command.d.ts +3 -0
  394. package/dist/cli/commands/release-promote-command.js +34 -0
  395. package/dist/cli/commands/release-rollback-command.d.ts +3 -0
  396. package/dist/cli/commands/release-rollback-command.js +33 -0
  397. package/dist/cli/commands/release-watch-command.d.ts +3 -0
  398. package/dist/cli/commands/release-watch-command.js +44 -0
  399. package/dist/cli/commands/request-command-options.d.ts +49 -0
  400. package/dist/cli/commands/request-command-options.js +1 -0
  401. package/dist/cli/commands/request-commands.d.ts +3 -9
  402. package/dist/cli/commands/request-commands.js +17 -522
  403. package/dist/cli/commands/request-init-command.d.ts +3 -0
  404. package/dist/cli/commands/request-init-command.js +100 -0
  405. package/dist/cli/commands/request-lint-command.d.ts +3 -0
  406. package/dist/cli/commands/request-lint-command.js +50 -0
  407. package/dist/cli/commands/request-list-command.d.ts +10 -0
  408. package/dist/cli/commands/request-list-command.js +53 -0
  409. package/dist/cli/commands/request-repair-status-command.d.ts +3 -0
  410. package/dist/cli/commands/request-repair-status-command.js +61 -0
  411. package/dist/cli/commands/request-show-command.d.ts +3 -0
  412. package/dist/cli/commands/request-show-command.js +56 -0
  413. package/dist/cli/commands/request-transition-command.d.ts +3 -0
  414. package/dist/cli/commands/request-transition-command.js +122 -0
  415. package/dist/cli/commands/request-transition-failures.d.ts +8 -0
  416. package/dist/cli/commands/request-transition-failures.js +90 -0
  417. package/dist/cli/commands/request-transition-hooks.d.ts +50 -0
  418. package/dist/cli/commands/request-transition-hooks.js +115 -0
  419. package/dist/cli/commands/request-transition-preflight.d.ts +10 -0
  420. package/dist/cli/commands/request-transition-preflight.js +107 -0
  421. package/dist/cli/commands/scan-command-shared.d.ts +96 -0
  422. package/dist/cli/commands/scan-command-shared.js +83 -0
  423. package/dist/cli/commands/scan-commands.d.ts +3 -2
  424. package/dist/cli/commands/scan-commands.js +23 -463
  425. package/dist/cli/commands/scan-inventory-commands.d.ts +3 -0
  426. package/dist/cli/commands/scan-inventory-commands.js +96 -0
  427. package/dist/cli/commands/scan-project-commands.d.ts +3 -0
  428. package/dist/cli/commands/scan-project-commands.js +65 -0
  429. package/dist/cli/commands/scan-scope-commands.d.ts +3 -0
  430. package/dist/cli/commands/scan-scope-commands.js +149 -0
  431. package/dist/cli/commands/scan-scope-helpers.d.ts +8 -0
  432. package/dist/cli/commands/scan-scope-helpers.js +54 -0
  433. package/dist/cli/commands/scan-structural-commands.d.ts +3 -0
  434. package/dist/cli/commands/scan-structural-commands.js +113 -0
  435. package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
  436. package/dist/cli/commands/sediment-argv-flags.js +116 -0
  437. package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
  438. package/dist/cli/commands/sediment-command-shared.js +5 -0
  439. package/dist/cli/commands/sediment-commands.d.ts +35 -59
  440. package/dist/cli/commands/sediment-commands.js +36 -590
  441. package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
  442. package/dist/cli/commands/sediment-pool-commands.js +185 -0
  443. package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
  444. package/dist/cli/commands/sediment-query-commands.js +94 -0
  445. package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
  446. package/dist/cli/commands/sediment-release-commands.js +232 -0
  447. package/dist/cli/commands/share-commands.d.ts +12 -68
  448. package/dist/cli/commands/share-commands.js +47 -556
  449. package/dist/cli/commands/share-error-hints.d.ts +14 -0
  450. package/dist/cli/commands/share-error-hints.js +38 -0
  451. package/dist/cli/commands/share-identity.d.ts +13 -0
  452. package/dist/cli/commands/share-identity.js +22 -0
  453. package/dist/cli/commands/share-record-paths.d.ts +37 -0
  454. package/dist/cli/commands/share-record-paths.js +68 -0
  455. package/dist/cli/commands/share-runners.d.ts +3 -0
  456. package/dist/cli/commands/share-runners.js +158 -0
  457. package/dist/cli/commands/shared-read-runners.d.ts +3 -0
  458. package/dist/cli/commands/shared-read-runners.js +51 -0
  459. package/dist/cli/commands/slice-check-command.d.ts +3 -0
  460. package/dist/cli/commands/slice-check-command.js +54 -0
  461. package/dist/cli/commands/slice-commands.d.ts +2 -22
  462. package/dist/cli/commands/slice-commands.js +18 -517
  463. package/dist/cli/commands/slice-decompose-artifacts.d.ts +18 -0
  464. package/dist/cli/commands/slice-decompose-artifacts.js +79 -0
  465. package/dist/cli/commands/slice-decompose-command.d.ts +3 -0
  466. package/dist/cli/commands/slice-decompose-command.js +123 -0
  467. package/dist/cli/commands/slice-list-commands.d.ts +3 -0
  468. package/dist/cli/commands/slice-list-commands.js +182 -0
  469. package/dist/cli/commands/slice-pick-command.d.ts +3 -0
  470. package/dist/cli/commands/slice-pick-command.js +60 -0
  471. package/dist/cli/commands/slice-plan-command.d.ts +24 -0
  472. package/dist/cli/commands/slice-plan-command.js +111 -0
  473. package/dist/cli/commands/sop-advance-command.d.ts +3 -0
  474. package/dist/cli/commands/sop-advance-command.js +160 -0
  475. package/dist/cli/commands/sop-check-command.d.ts +3 -0
  476. package/dist/cli/commands/sop-check-command.js +44 -0
  477. package/dist/cli/commands/sop-command-shared.d.ts +23 -0
  478. package/dist/cli/commands/sop-command-shared.js +18 -0
  479. package/dist/cli/commands/sop-commands.d.ts +15 -1
  480. package/dist/cli/commands/sop-commands.js +26 -240
  481. package/dist/cli/commands/sop-init-command.d.ts +3 -0
  482. package/dist/cli/commands/sop-init-command.js +51 -0
  483. package/dist/cli/commands/sop-lint-command.d.ts +3 -0
  484. package/dist/cli/commands/sop-lint-command.js +64 -0
  485. package/dist/cli/commands/sop-register-command.d.ts +3 -0
  486. package/dist/cli/commands/sop-register-command.js +48 -0
  487. package/dist/cli/commands/sop-registry-command.d.ts +3 -0
  488. package/dist/cli/commands/sop-registry-command.js +30 -0
  489. package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
  490. package/dist/cli/commands/statusline-command-shared.js +90 -0
  491. package/dist/cli/commands/statusline-commands.d.ts +1 -19
  492. package/dist/cli/commands/statusline-commands.js +48 -287
  493. package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
  494. package/dist/cli/commands/statusline-compact-command.js +54 -0
  495. package/dist/cli/commands/statusline-install-command.d.ts +3 -0
  496. package/dist/cli/commands/statusline-install-command.js +48 -0
  497. package/dist/cli/commands/statusline-render-command.d.ts +9 -0
  498. package/dist/cli/commands/statusline-render-command.js +55 -0
  499. package/dist/cli/commands/statusline-status-command.d.ts +3 -0
  500. package/dist/cli/commands/statusline-status-command.js +23 -0
  501. package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
  502. package/dist/cli/commands/statusline-uninstall-command.js +23 -0
  503. package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
  504. package/dist/cli/commands/test-command-run-helpers.js +73 -0
  505. package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
  506. package/dist/cli/commands/test-command-runner-resolution.js +183 -0
  507. package/dist/cli/commands/test-commands.d.ts +8 -56
  508. package/dist/cli/commands/test-commands.js +26 -249
  509. package/dist/cli/commands/vm-command-shared.d.ts +23 -0
  510. package/dist/cli/commands/vm-command-shared.js +23 -0
  511. package/dist/cli/commands/vm-commands.d.ts +1 -28
  512. package/dist/cli/commands/vm-commands.js +36 -270
  513. package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
  514. package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
  515. package/dist/cli/commands/vm-release-command.d.ts +5 -0
  516. package/dist/cli/commands/vm-release-command.js +101 -0
  517. package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
  518. package/dist/cli/commands/vm-spawn-command.js +177 -0
  519. package/dist/cli/commands/web-command-shared.d.ts +12 -0
  520. package/dist/cli/commands/web-command-shared.js +30 -0
  521. package/dist/cli/commands/web-commands.d.ts +7 -14
  522. package/dist/cli/commands/web-commands.js +6 -314
  523. package/dist/cli/commands/web-install-command.d.ts +10 -0
  524. package/dist/cli/commands/web-install-command.js +116 -0
  525. package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
  526. package/dist/cli/commands/web-lifecycle-commands.js +14 -322
  527. package/dist/cli/commands/web-login-command.d.ts +14 -0
  528. package/dist/cli/commands/web-login-command.js +189 -0
  529. package/dist/cli/commands/web-op-payload.d.ts +22 -0
  530. package/dist/cli/commands/web-op-payload.js +89 -0
  531. package/dist/cli/commands/web-op-refusals.d.ts +37 -0
  532. package/dist/cli/commands/web-op-refusals.js +73 -0
  533. package/dist/cli/commands/web-op-runner.d.ts +14 -0
  534. package/dist/cli/commands/web-op-runner.js +166 -0
  535. package/dist/cli/commands/web-status-command.d.ts +4 -0
  536. package/dist/cli/commands/web-status-command.js +32 -0
  537. package/dist/cli/commands/web-stop-command.d.ts +10 -0
  538. package/dist/cli/commands/web-stop-command.js +59 -0
  539. package/dist/cli/commands/web-verb-specs.d.ts +18 -0
  540. package/dist/cli/commands/web-verb-specs.js +66 -0
  541. package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
  542. package/dist/cli/commands/workflow-command-shared.js +74 -0
  543. package/dist/cli/commands/workflow-commands.d.ts +10 -1
  544. package/dist/cli/commands/workflow-commands.js +6 -594
  545. package/dist/cli/commands/workflow-gate-commands.d.ts +3 -0
  546. package/dist/cli/commands/workflow-gate-commands.js +116 -0
  547. package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
  548. package/dist/cli/commands/workflow-graph-commands.js +73 -0
  549. package/dist/cli/commands/workflow-init-command.d.ts +3 -0
  550. package/dist/cli/commands/workflow-init-command.js +68 -0
  551. package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
  552. package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
  553. package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
  554. package/dist/cli/commands/workflow-node-commands.js +154 -0
  555. package/dist/cli/commands/workflow-plan-helpers.d.ts +48 -0
  556. package/dist/cli/commands/workflow-plan-helpers.js +103 -0
  557. package/dist/cli/commands/workflow-planning-commands.d.ts +3 -0
  558. package/dist/cli/commands/workflow-planning-commands.js +56 -0
  559. package/dist/cli/commands/workflow-swarm-actions.d.ts +7 -0
  560. package/dist/cli/commands/workflow-swarm-actions.js +109 -0
  561. package/dist/cli/commands/workflow-swarm-commands.d.ts +3 -0
  562. package/dist/cli/commands/workflow-swarm-commands.js +138 -0
  563. package/dist/cli/commands/workflow-tech-actions.d.ts +10 -0
  564. package/dist/cli/commands/workflow-tech-actions.js +150 -0
  565. package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
  566. package/dist/cli/commands/workflow-terminalize-command.js +56 -0
  567. package/dist/cli/commands/workspace/init-actions.d.ts +10 -0
  568. package/dist/cli/commands/workspace/init-actions.js +199 -0
  569. package/dist/cli/commands/workspace/init-codegraph-stake.d.ts +10 -0
  570. package/dist/cli/commands/workspace/init-codegraph-stake.js +54 -0
  571. package/dist/cli/commands/workspace/init-command.d.ts +8 -124
  572. package/dist/cli/commands/workspace/init-command.js +59 -623
  573. package/dist/cli/commands/workspace/init-context.d.ts +58 -0
  574. package/dist/cli/commands/workspace/init-context.js +121 -0
  575. package/dist/cli/commands/workspace/init-envelope.d.ts +3 -0
  576. package/dist/cli/commands/workspace/init-envelope.js +34 -0
  577. package/dist/cli/commands/workspace/init-failures.d.ts +3 -0
  578. package/dist/cli/commands/workspace/init-failures.js +84 -0
  579. package/dist/cli/commands/workspace/init-hooks-decision.d.ts +24 -0
  580. package/dist/cli/commands/workspace/init-hooks-decision.js +189 -0
  581. package/dist/cli/commands/workspace/init-options.d.ts +102 -0
  582. package/dist/cli/commands/workspace/init-options.js +1 -0
  583. package/dist/cli/commands/worktree-lease-commands.d.ts +10 -6
  584. package/dist/cli/commands/worktree-lease-commands.js +42 -512
  585. package/dist/cli/commands/worktree-lease-gc-command.d.ts +12 -0
  586. package/dist/cli/commands/worktree-lease-gc-command.js +117 -0
  587. package/dist/cli/commands/worktree-lease-git.d.ts +22 -0
  588. package/dist/cli/commands/worktree-lease-git.js +48 -0
  589. package/dist/cli/commands/worktree-lease-list-command.d.ts +12 -0
  590. package/dist/cli/commands/worktree-lease-list-command.js +100 -0
  591. package/dist/cli/commands/worktree-lease-load.d.ts +37 -0
  592. package/dist/cli/commands/worktree-lease-load.js +28 -0
  593. package/dist/cli/commands/worktree-lease-release-command.d.ts +13 -0
  594. package/dist/cli/commands/worktree-lease-release-command.js +105 -0
  595. package/dist/cli/commands/worktree-lease-renew-command.d.ts +11 -0
  596. package/dist/cli/commands/worktree-lease-renew-command.js +99 -0
  597. package/dist/cli/commands/worktree-lease-session.d.ts +22 -0
  598. package/dist/cli/commands/worktree-lease-session.js +29 -0
  599. package/dist/cli/commands/worktree-lease-spawn-command.d.ts +11 -0
  600. package/dist/cli/commands/worktree-lease-spawn-command.js +119 -0
  601. package/dist/cli/commands/worktree-lease-status-command.d.ts +11 -0
  602. package/dist/cli/commands/worktree-lease-status-command.js +86 -0
  603. package/dist/cli/commands/worktree-lease-store.d.ts +19 -0
  604. package/dist/cli/commands/worktree-lease-store.js +24 -0
  605. package/dist/cli/program.js +5 -0
  606. package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
  607. package/dist/services/code/auto-compact-artifacts.js +135 -0
  608. package/dist/services/code/auto-compact-attempt.d.ts +46 -0
  609. package/dist/services/code/auto-compact-attempt.js +88 -0
  610. package/dist/services/code/auto-compact-decision.d.ts +74 -0
  611. package/dist/services/code/auto-compact-decision.js +149 -0
  612. package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
  613. package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
  614. package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
  615. package/dist/services/code/auto-compact-envelopes.js +134 -0
  616. package/dist/services/code/auto-compact-history.d.ts +46 -0
  617. package/dist/services/code/auto-compact-history.js +17 -0
  618. package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
  619. package/dist/services/code/auto-compact-orchestrator.js +165 -686
  620. package/dist/services/code/auto-compact-run-types.d.ts +123 -0
  621. package/dist/services/code/auto-compact-run-types.js +1 -0
  622. package/dist/services/code/emit-handoff.d.ts +35 -1
  623. package/dist/services/code/emit-handoff.js +128 -7
  624. package/dist/services/code/step-08-gate.d.ts +28 -19
  625. package/dist/services/code/step-08-gate.js +92 -35
  626. package/dist/services/config/config-coercion.d.ts +7 -0
  627. package/dist/services/config/config-coercion.js +156 -0
  628. package/dist/services/config/config-file-io.d.ts +11 -0
  629. package/dist/services/config/config-file-io.js +61 -0
  630. package/dist/services/config/config-get.d.ts +2 -0
  631. package/dist/services/config/config-get.js +36 -0
  632. package/dist/services/config/config-global-loader.d.ts +15 -0
  633. package/dist/services/config/config-global-loader.js +111 -0
  634. package/dist/services/config/config-nested-path.d.ts +3 -0
  635. package/dist/services/config/config-nested-path.js +53 -0
  636. package/dist/services/config/config-primitives.d.ts +16 -0
  637. package/dist/services/config/config-primitives.js +24 -0
  638. package/dist/services/config/config-service.d.ts +9 -33
  639. package/dist/services/config/config-service.js +16 -665
  640. package/dist/services/config/config-validation.d.ts +19 -0
  641. package/dist/services/config/config-validation.js +152 -0
  642. package/dist/services/config/config-workspace.d.ts +10 -0
  643. package/dist/services/config/config-workspace.js +158 -0
  644. package/dist/services/distribution/mcp-install-runner.d.ts +21 -0
  645. package/dist/services/distribution/mcp-install-runner.js +59 -0
  646. package/dist/services/distribution/mcp-install.d.ts +95 -0
  647. package/dist/services/distribution/mcp-install.js +179 -0
  648. package/dist/services/distribution/plugin-manifest.d.ts +97 -0
  649. package/dist/services/distribution/plugin-manifest.js +126 -0
  650. package/dist/services/hooks/mcp-surface-gate.d.ts +19 -0
  651. package/dist/services/hooks/mcp-surface-gate.js +87 -0
  652. package/dist/services/ide/adapters/claude-code-adapter.d.ts +4 -35
  653. package/dist/services/ide/adapters/claude-code-adapter.js +48 -171
  654. package/dist/services/ide/adapters/claude-code-local-state.d.ts +28 -0
  655. package/dist/services/ide/adapters/claude-code-local-state.js +112 -0
  656. package/dist/services/ide/adapters/claude-code-model-window.d.ts +37 -0
  657. package/dist/services/ide/adapters/claude-code-model-window.js +113 -0
  658. package/dist/services/ide/ide-mcp-install-types.d.ts +78 -0
  659. package/dist/services/ide/ide-mcp-install-types.js +104 -0
  660. package/dist/services/ide/ide-types.d.ts +45 -1
  661. package/dist/services/ide/mcp-tool-matcher.d.ts +34 -0
  662. package/dist/services/ide/mcp-tool-matcher.js +84 -0
  663. package/dist/services/lint/npx-resolver.js +7 -0
  664. package/dist/services/mcp/cli-executor.d.ts +36 -0
  665. package/dist/services/mcp/cli-executor.js +97 -0
  666. package/dist/services/mcp/json-rpc.d.ts +81 -0
  667. package/dist/services/mcp/json-rpc.js +116 -0
  668. package/dist/services/mcp/memory-tool.d.ts +3 -0
  669. package/dist/services/mcp/memory-tool.js +62 -0
  670. package/dist/services/mcp/server-main.d.ts +1 -0
  671. package/dist/services/mcp/server-main.js +66 -0
  672. package/dist/services/mcp/server.d.ts +22 -0
  673. package/dist/services/mcp/server.js +152 -0
  674. package/dist/services/mcp/surface.d.ts +62 -0
  675. package/dist/services/mcp/surface.js +198 -0
  676. package/dist/services/mcp/tool-core.d.ts +42 -0
  677. package/dist/services/mcp/tool-core.js +137 -0
  678. package/dist/services/mcp/tools.d.ts +13 -0
  679. package/dist/services/mcp/tools.js +58 -0
  680. package/dist/services/readonly-surface/argv-guard.d.ts +32 -0
  681. package/dist/services/readonly-surface/argv-guard.js +164 -0
  682. package/dist/services/readonly-surface/readonly-whitelist.d.ts +147 -0
  683. package/dist/services/readonly-surface/readonly-whitelist.js +107 -0
  684. package/dist/services/readonly-surface/whitelist-generator.d.ts +64 -0
  685. package/dist/services/readonly-surface/whitelist-generator.js +212 -0
  686. package/dist/services/skills/hooks-codegate-superpowers.d.ts +1 -0
  687. package/dist/services/skills/hooks-codegate-superpowers.js +26 -0
  688. package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
  689. package/dist/services/skills/hooks-settings-deny-list.js +173 -0
  690. package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
  691. package/dist/services/skills/hooks-settings-envelopes.js +79 -0
  692. package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
  693. package/dist/services/skills/hooks-settings-file-shape.js +207 -0
  694. package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
  695. package/dist/services/skills/hooks-settings-paths.js +75 -0
  696. package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
  697. package/dist/services/skills/hooks-settings-read-installed.js +60 -0
  698. package/dist/services/skills/hooks-settings-service.d.ts +12 -212
  699. package/dist/services/skills/hooks-settings-service.js +71 -649
  700. package/dist/services/skills/hooks-settings-types.d.ts +139 -0
  701. package/dist/services/skills/hooks-settings-types.js +1 -0
  702. package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
  703. package/dist/services/workspace/claude-settings-template-merge.js +243 -0
  704. package/dist/services/workspace/claude-settings-template.d.ts +29 -87
  705. package/dist/services/workspace/claude-settings-template.js +81 -236
  706. package/package.json +17 -6
  707. package/scripts/install-skills-bundles.mjs +233 -0
  708. package/scripts/install-skills-fs.mjs +148 -0
  709. package/scripts/install-skills-ide.mjs +279 -0
  710. package/scripts/install-skills-output-style-default.mjs +196 -0
  711. package/scripts/install-skills-output-styles.mjs +121 -0
  712. package/scripts/install-skills-report.mjs +42 -0
  713. package/scripts/install-skills-user-config.mjs +198 -0
  714. package/scripts/install-skills.mjs +36 -1066
  715. package/scripts/watch-tree.mjs +140 -0
  716. package/scripts/watch.mjs +4 -126
  717. package/skills/peaks-status/SKILL.md +31 -13
@@ -1,636 +1,72 @@
1
1
  /**
2
+ * `peaks workspace init` — the registrar.
2
3
  *
3
4
  * Extracted from `src/cli/commands/workspace-commands.ts` (slice
4
- * 800-line Karpathy cap. Owns:
5
- * - commander option wiring (`--project`, `--session-id`, `--change-id`, etc.)
6
- * - canonical project-root resolution
7
- * - session id resolution (with slice-018 rotation)
8
- * - first-time hooks install prompt + sticky marker
9
- * - missing-standards diagnostic surface (AC1-AC7) and `--init-standards` apply
5
+ * 800-line Karpathy cap). Split further by responsibility.
6
+ * The option/outcome shapes, the first-time hooks
7
+ * decision, project-root + session resolution, the nextAction/warning
8
+ * collectors, the codegraph stake, the envelope builder and the typed failure
9
+ * arms each live in their own module under `./`. This file wires them up.
10
10
  *
11
11
  * Imports the shared hooks-decision marker helpers from `./helpers.ts`.
12
12
  */
13
- import { initWorkspace, InvalidSessionIdError, ConflictingSessionError, LegacyChangeIdSiblingError } from '../../../services/workspace/workspace-service.js';
14
- // was removed with the change-id axis. The legacy symlink-detection
15
- // branch below no longer fires — the binding file at
16
- // `.peaks/_runtime/current-change` is no longer written by init
17
- // either. The sibling-dir guard (`LegacyChangeIdSiblingError`) is
18
- // preserved because the 2.8.3 hard-ban still applies to date-stamped
19
- // session-id-shaped directories at the `.peaks/_runtime/` sibling
20
- // level.
21
- import { ensureSessionWithRotation } from '../../../services/session/session-manager.js';
22
- import { resolveWritableProjectRoot, UnsafeProjectRootError } from '../../../services/config/config-safety.js';
23
- import { applyHookInstall, readHookStatus } from '../../../services/skills/hooks-settings-service.js';
24
- import { clearStalePresenceOnRotation } from '../../../services/skills/skill-presence-service.js';
25
- import { gcStalePresenceLeases } from '../../../services/skills/presence-lease-service.js';
26
- import { createCodegraphInvocation, defaultCodegraphInitGuard, executeCodegraphInvocation, writeCodegraphMarker } from '../../../services/codegraph/codegraph-service.js';
27
- import { mkdirSync } from 'node:fs';
28
- import { fail, ok } from 'peaks-loop-shared/result';
29
- import { addJsonOption, getErrorMessage, printResult } from '../../cli-helpers.js';
30
- import { hasStandardsCheckedMarker, markStandardsChecked } from '../../../services/standards/missing-standards-detector.js';
31
- import { bootstrapProjectScan } from '../../../services/prd/project-scan-bootstrap-service.js';
32
- import { readDecisionMarker, writeDecisionMarker, promptYesNo } from './helpers.js';
33
- export function registerWorkspaceInitCommand(workspace, io) {
34
- addJsonOption(workspace
35
- .command('init')
36
- .description('Create the .peaks/_runtime/<session-id>/ directory with ONLY the session.json metadata file (slice 006: role subdirs prd/ui/rd/qa/sc/txt and the system/ subdir are created lazily by writers, not pre-created at init). Pass --session-id to use a specific id, or omit it to auto-generate one (and adopt an existing binding if present). On the first call for a project, also handles the one-time "install peaks hooks" decision (sticky-marker stored in .peaks/.peaks-init-hooks-decision.json).')
37
- .requiredOption('--project <path>', 'target project root')
38
- .option('--session-id <id>', 'optional session id in YYYY-MM-DD-<kebab-slug> format. When omitted, the CLI is the single source of truth: an existing binding is reused, otherwise a fresh id is auto-generated.')
39
- .option('--allow-session-rebind', 'overwrite an existing session binding when the requested session id differs from the project current one', false)
40
- .option('--no-rotate-on-outer-mismatch', 'suppress the auto-rotation of the project session binding when the outer (Claude / harness) session id has changed. Default rotates on mismatch.')
41
- .option('--install-hooks <mode>', 'first-time hooks install behaviour: ask (default in TTY, prompt once + sticky-marker), auto (default in --json / non-TTY, install silently + sticky-marker), skip (sticky-marker skipped, do not install)', (value) => {
42
- if (value !== 'ask' && value !== 'auto' && value !== 'skip') {
43
- throw new Error(`--install-hooks must be one of: ask, auto, skip (got "${value}")`);
44
- }
45
- return value;
46
- })
47
- .option('--no-claude-hooks', 'do NOT materialize .claude/settings.local.json (slice 2.0.1-bug3 fact-forcing bypass). Default: hooks installed so tool calls inside .peaks/** are not blocked by the [Fact-Forcing Gate].')
48
- .option('--init-standards', "slice 2026-06-16-peaks-code-auto-scaffold: when the consumer project's .claude/rules/ is missing or empty, auto-apply `peaks standards init --project <path> --apply` after emitting the diagnostic. Default: diagnostic only (no write).")
49
- .option('--no-project-scan-bootstrap', 'slice 2026-07-15-project-scan-bootstrap: skip the bootstrap of .peaks/project-scan/{project-scan.md + 4 audit/business templates} that runs after init succeeds. Default: bootstrap runs (idempotent: existing files are kept unless --force-project-scan-templates is also passed).')
50
- .option('--force-project-scan-templates', 'slice 2026-07-15-project-scan-bootstrap (AC10): overwrite the 4 audit/business templates under .peaks/project-scan/ (business-knowledge.md, security-template.md, perf-template.md, audit-output-schema.md) even when they already exist. Default: skip existing files (sediment-preserved).', false)).action(async (options) => {
51
- try {
52
- // Resolve the session id. Two paths:
53
- // - explicit --session-id: use it as the requested binding target
54
- // (ConflictingSessionError fires if it conflicts with an in-flight
55
- // session, unless --allow-session-rebind is set)
56
- // - omitted: defer to ensureSession(), which reuses an existing
57
- // binding or auto-generates a fresh one. The init then writes
58
- // .peaks/_runtime/session.json so the binding sticks.
59
- //
60
- // Before that: canonicalise the project root. If the user (or the
61
- // LLM via "$(pwd)") passed a sub-directory of a real git repo
62
- // (e.g. prompt-project/prompt-project/ inside the outer
63
- // prompt-project/.git), promote the path to the git root. Without
64
- // this, peaks would build a parallel .peaks/ tree under the
65
- // nested sub-folder and silently break the project-binding model
66
- // (the same regression that produced prompt-project/.peaks/ in
67
- // the 5/27-5/29 sessions). When startPath is not inside any
68
- // git repo, the helper falls through to the cwd verbatim.
69
- // `resolveWritableProjectRoot` = `resolveCanonicalProjectRoot` plus the
70
- // home-directory refusal. It has to be this one, and it has to run here:
71
- // `ensureSessionWithRotation` below WRITES (it mints/binds a session), so
72
- // a guard placed after it would leave a `.peaks/_runtime/` tree in the
73
- // user's home even though the init was refused.
74
- const projectRoot = resolveWritableProjectRoot(options.project);
75
- // user did NOT pass --session-id explicitly, run
76
- // `ensureSessionWithRotation` so the binding is rotated on
77
- // outer-mismatch before `initWorkspace` is called. The
78
- // rotation result is surfaced in the JSON envelope via
79
- // `data.rotation`. When --session-id IS passed, the user has
80
- // explicitly told us which session to bind — we honor that
81
- // verbatim and do NOT rotate (rotation only fires for the
82
- // auto-detect path).
83
- let sessionId;
84
- let rotation = {
85
- previousSessionId: null,
86
- reason: null
87
- };
88
- if (options.sessionId !== undefined && options.sessionId.length > 0) {
89
- sessionId = options.sessionId;
90
- }
91
- else {
92
- const result = await ensureSessionWithRotation(projectRoot, {
93
- // Commander translates `--no-rotate-on-outer-mismatch` into
94
- // `options.rotateOnOuterMismatch = false` (the `--no-` prefix
95
- // is consumed and the remainder becomes the JS property name,
96
- // with the boolean value flipped). The pre-slice-014 anti-
97
- // pattern (reading `options.<flag-with-no-prefix> === true`)
98
- // is NOT used here. The default (no flag) leaves
99
- // `options.rotateOnOuterMismatch` undefined, which is not
100
- // equal to `false`, so the default is "rotate on mismatch"
101
- // (the new auto-roll).
102
- skipRotateOnOuterMismatch: options.rotateOnOuterMismatch === false
103
- });
104
- sessionId = result.sessionId;
105
- rotation = {
106
- previousSessionId: result.previousSessionId,
107
- reason: result.rotationReason
108
- };
109
- }
110
- const report = await initWorkspace({
111
- projectRoot,
112
- sessionId,
113
- allowSessionRebind: options.allowSessionRebind === true,
114
- // Commander translates `--no-claude-hooks` into
115
- // `options.claudeHooks = false`. The default (no flag) leaves
116
- // `options.claudeHooks` undefined, which is not equal to
117
- // `false`, so the default is "install hooks" (the bypass is
118
- // on). Pass `--no-claude-hooks` to opt out.
119
- noClaudeHooks: options.claudeHooks === false,
120
- // auto-apply for the missing-standards scaffold. Default false
121
- // — only the diagnostic is emitted. Pass --init-standards to
122
- // also run `executeProjectStandardsInit({ apply: true })`.
123
- initStandards: options.initStandards === true
124
- });
125
- // After the workspace dir is initialized, also bootstrap the
126
- // `.peaks/project-scan/` artifact tree (project-scan.md + 4
127
- // bundled audit/business templates). Idempotent — when the user
128
- // re-runs `workspace init`, the existing files are kept (their
129
- // sediment is user-authored). Pass `--no-project-scan-bootstrap`
130
- // to skip, or `--force-project-scan-templates` to overwrite the
131
- // 4 bundled templates anyway.
132
- let projectScanEnvelope = null;
133
- let projectScanError = null;
134
- if (options.projectScanBootstrap === false) {
135
- // Explicit opt-out. The envelope stays null; the JSON
136
- // response carries `projectScan: { skipped: true, ... }` so
137
- // callers can distinguish "skipped by flag" from "skipped by
138
- // idempotency".
139
- projectScanEnvelope = {
140
- created: false,
141
- skipped: true,
142
- templatesBooted: 0,
143
- templatesSkipped: 0,
144
- projectScanPath: `${projectRoot}/.peaks/project-scan/project-scan.md`,
145
- durationMs: 0
146
- };
147
- }
148
- else {
149
- try {
150
- projectScanEnvelope = await bootstrapProjectScan({
151
- projectRoot,
152
- ...(options.forceProjectScanTemplates === true ? { forceTemplates: true } : {})
153
- });
154
- }
155
- catch (error) {
156
- // Don't fail init over a project-scan issue — the workspace
157
- // is already initialized and the user has the JSON envelope.
158
- // Surface the failure as a warning so the LLM can decide.
159
- projectScanError = getErrorMessage(error);
160
- }
161
- }
162
- const nextActions = [];
163
- if (report.previousSessionId !== null && report.bound) {
164
- nextActions.push(`Replaced prior session binding "${report.previousSessionId}" with "${report.sessionId}".`);
165
- }
166
- if (rotation.previousSessionId !== null && rotation.reason === 'outer-session-mismatch') {
167
- // Outer-session-mismatch rotation: the previous Claude / harness
168
- // session is no longer the LLM driver. The new binding is fresh,
169
- // the old session dir is preserved on disk.
170
- nextActions.push(`Auto-rotated session binding: outer session id changed (was "${rotation.previousSessionId}"). ` +
171
- `New binding is "${sessionId}". The previous session dir is preserved at .peaks/_runtime/${rotation.previousSessionId}/. ` +
172
- `Re-run with --no-rotate-on-outer-mismatch to suppress this rotation.`);
173
- // OLD outer session is now stale (defect A from the PRD).
174
- // peaks-code Step 1 would otherwise pick up the old `mode`
175
- // field and silently lock the new session into a mode the
176
- // user never explicitly chose. Clear it here so Step 1's
177
- // presence:check-stale reports `reason: 'no-presence'` and
178
- // the re-ask fires.
179
- const presenceClearOutcome = clearStalePresenceOnRotation({
180
- projectRootOverride: projectRoot,
181
- currentOuterSessionId: process.env.PEAKS_OUTER_SESSION_ID ?? process.env.CLAUDE_CODE_SESSION_ID,
182
- rotatedOutSessionId: rotation.previousSessionId
183
- });
184
- if (presenceClearOutcome.cleared) {
185
- nextActions.push(`Auto-cleared stale skill presence (recorded outer id "${presenceClearOutcome.recordedOuter ?? '?'}" did not match the new outer session). ` +
186
- 'peaks-code Step 1 will now AskUserQuestion to confirm the mode.');
187
- }
188
- else if (presenceClearOutcome.reason === 'recorded-by-different-outer') {
189
- nextActions.push(`Kept skill presence: it was recorded by a different live outer session (id "${presenceClearOutcome.recordedOuter ?? '?'}"). ` +
190
- 'The new outer session will not auto-clear it.');
191
- }
192
- else if (presenceClearOutcome.reason === 'not-stale') {
193
- nextActions.push('Kept skill presence: it was re-stamped by the new outer session during the rotation window (not stale).');
194
- }
195
- }
196
- if (report.created.length === 0) {
197
- nextActions.push('Workspace already initialized — proceed to project scan.');
198
- }
199
- else {
200
- nextActions.push('Run `peaks scan archetype --project <path> --json` next to populate rd/project-scan.md.');
201
- }
202
- // Slice 2.0.1-bug3-fact-forcing-bypass: surface the consumer-
203
- // project .claude/settings.local.json materialization outcome.
204
- // When the bypass is in effect, the LLM knows subsequent Writes
205
- // and Bash calls targeting .peaks/** will not be blocked by the
206
- // [Fact-Forcing Gate]. When the user opted out, we surface a
207
- // nextAction so the manual recovery is documented.
208
- if (report.claudeSettings.action === 'written' ||
209
- report.claudeSettings.action === 'refreshed') {
210
- nextActions.push(`Materialized .claude/settings.local.json (action: ${report.claudeSettings.action}) — ` +
211
- `the [Fact-Forcing Gate] is bypassed for tool calls inside .peaks/**. ` +
212
- 'Restart Claude Code so the hooks take effect.');
213
- }
214
- else if (report.claudeSettings.action === 'already-current') {
215
- // No-op: the bypass is already in effect and matches the
216
- // current release. Do not spam the nextAction list on every
217
- // init.
218
- }
219
- else if (report.claudeSettings.action === 'skipped') {
220
- nextActions.push('Skipped .claude/settings.local.json materialization (--no-claude-hooks). ' +
221
- 'If the [Fact-Forcing Gate] blocks subsequent Writes, run `peaks workspace init` ' +
222
- 'again without --no-claude-hooks, or drop the contents of ' +
223
- '`.peaks/.claude-settings-template.json` into `.claude/settings.local.json` manually.');
224
- }
225
- // the self-heal outcome for the offline
226
- // `.peaks/.claude-settings-template.json` copy. When the offline
227
- // file was refreshed (i.e. the previous peaks-loop release left
228
- // a stale version without the `node -e "..."` wrapper), the user
229
- // benefits from seeing that the manual-recovery anchor now
230
- // points at the corrected template. We surface `written` and
231
- // `refreshed` as the actionable events; `already-current` is
232
- // silent (same rationale as the consumer-project no-op above).
233
- //
234
- // The `refreshed` nextAction also carries a loud warning that any
235
- // MANUAL EDITS the user made to the offline template have been
236
- // overwritten — drift detection cannot tell stale-from-prior-release
237
- // apart from user-customised, so we surface the warning unconditionally
238
- // to make sure anyone who customised sees the prompt.
239
- if (report.claudeSettings.offlineTemplate.action === 'refreshed') {
240
- nextActions.push(`Self-healed .peaks/.claude-settings-template.json (action: refreshed) — ` +
241
- 'the offline recovery anchor now matches the current peaks-loop template. ' +
242
- 'No action required; future manual recoveries will copy the corrected wrapper.');
243
- nextActions.push('⚠️ If you had manually edited .peaks/.claude-settings-template.json, ' +
244
- 'those edits have been overwritten by the self-heal. ' +
245
- 'Re-apply your custom matchers / commands on top of the freshly-written template, ' +
246
- 'or open an issue if your customisation is a recurring need (the team may promote it to the canonical template).');
247
- }
248
- else if (report.claudeSettings.offlineTemplate.action === 'written') {
249
- nextActions.push(`Wrote .peaks/.claude-settings-template.json (action: written) — ` +
250
- 'the offline recovery anchor is now in place for future manual recoveries.');
251
- }
252
- // bootstrap outcome. The envelope carries the write counts and
253
- // duration so the LLM (and the human) see what landed. The
254
- // nextAction only fires when the project-scan tree is fresh —
255
- // idempotent re-runs are silent to keep the nextAction list
256
- // scannable.
257
- // (deferred until after warningsForEnvelope is declared below)
258
- // First-time hooks install decision. Sticky-marker at
259
- // .peaks/.peaks-init-hooks-decision.json records the user's answer
260
- // (or the auto-decision) so subsequent inits for new sessions in the
261
- // same project do not re-prompt. The marker is the only state that
262
- // survives across sessions — without it, every new session would
263
- // re-trigger the question.
264
- const hooksOutcome = await resolveFirstTimeHooksInstall({
265
- projectRoot,
266
- ...(options.installHooks !== undefined ? { explicitMode: options.installHooks } : {}),
267
- jsonMode: options.json === true
268
- });
269
- if (hooksOutcome.decision === 'installed') {
270
- nextActions.push(hooksOutcome.action === 'reinstalled'
271
- ? 'Re-installed the peaks-managed PreToolUse hooks (Bash→gate enforce, Task→progress start) — the marker said installed but the hooks were missing.'
272
- : 'Installed the peaks-managed PreToolUse hooks (Bash→gate enforce, Task→progress start). Restart Claude Code so the hooks take effect.');
273
- }
274
- else if (hooksOutcome.action === 'first-decision' && hooksOutcome.decision === 'skipped') {
275
- nextActions.push('Skipped peaks-managed hook install for this project. Re-run with --install-hooks=auto (or peaks hooks install) to install later.');
276
- }
277
- // - When the consumer project's `.claude/rules/` is missing or
278
- // empty, emit the copy-pasteable diagnostic to stderr (via
279
- // the JSON envelope `warnings` array) AND surface the
280
- // structured descriptor in `data.standardsMissing`.
281
- // - AC7: skip the diagnostic banner on subsequent invocations
282
- // within the same session — the once-per-session marker
283
- // `.peaks/_runtime/<sid>/.standards-checked` is written after
284
- // the FIRST diagnostic emit.
285
- // - AC3: when --init-standards was passed and the detector
286
- // reported missing, `report.standardsApplied` already lists the
287
- // freshly-written files. Surface that as a nextAction so the
288
- // human sees what was written.
289
- const warningsForEnvelope = [];
290
- // Slice 4.0.8 (D3): after session binding, run the same
291
- // canonical GC sweep `peaks skill presence:set` would
292
- // perform. A `peaks workspace init` is a natural sweep
293
- // trigger (the session id was just minted, all prior leases
294
- // for the project are by definition same-project). Failures
295
- // surface as warnings; the GC never blocks init.
296
- try {
297
- const gcResult = await gcStalePresenceLeases({
298
- projectRoot,
299
- trigger: 'workspace-init'
300
- });
301
- if (gcResult.removed > 0) {
302
- warningsForEnvelope.push(`Stale lease sweep removed ${gcResult.removed} lease(s) for the canonical project (retained ${gcResult.retained}).`);
303
- }
304
- }
305
- catch (err) {
306
- warningsForEnvelope.push(`lease sweep failed: ${getErrorMessage(err)}`);
307
- }
308
- if (report.standardsMissing.missing && !hasStandardsCheckedMarker(projectRoot, sessionId)) {
309
- warningsForEnvelope.push(report.standardsMissing.remediation);
310
- nextActions.push(`Run \`peaks workspace init --init-standards --project ${projectRoot}\` to auto-apply the scaffold, or \`peaks standards init --project ${projectRoot} --apply\` manually.`);
311
- }
312
- if (report.standardsApplied !== undefined) {
313
- nextActions.push(`Auto-applied .claude/rules/${report.standardsApplied.language}/ scaffold (slice 2026-06-16-peaks-code-auto-scaffold): ` +
314
- `wrote ${report.standardsApplied.writtenFiles.length} file(s), ` +
315
- `kept ${report.standardsApplied.skippedFiles.length} existing file(s).`);
316
- }
317
- // bootstrap outcome. The envelope carries the write counts and
318
- // duration so the LLM (and the human) see what landed. The
319
- // nextAction only fires when the project-scan tree is fresh —
320
- // idempotent re-runs are silent to keep the nextAction list
321
- // scannable.
322
- if (projectScanError !== null) {
323
- warningsForEnvelope.push(`project-scan bootstrap failed: ${projectScanError}`);
324
- }
325
- else if (projectScanEnvelope !== null && projectScanEnvelope.created) {
326
- nextActions.push(`Bootstrapped .peaks/project-scan/ (project-scan.md + 4 audit/business templates) — ` +
327
- `${projectScanEnvelope.templatesBooted} file(s) written, ${projectScanEnvelope.templatesSkipped} preserved. ` +
328
- `Run \`peaks scan archetype --project ${projectRoot}\` and \`peaks scan libraries --project ${projectRoot}\` next to refresh the scan.`);
329
- }
330
- // Write the once-per-session marker AFTER the envelope is built
331
- // (so subsequent inits skip the warning even on rapid back-to-back
332
- // calls).
333
- if (report.standardsMissing.missing) {
334
- markStandardsChecked(projectRoot, sessionId);
335
- }
336
- // directory after a successful workspace init. Calls the conflict
337
- // silently overwritten. We now run a REAL upstream `codegraph init`
338
- // (not just mkdir + marker) so the schema actually has a
339
- // `codegraph.db`, which is what post-slice auto-refresh and the
340
- // pre-dispatch preflight gate on. `codegraph init` (WITHOUT
341
- // `--index`) is fast (~1 s) and offline-safe — it only `Parser.init()`s
342
- // WASM grammars that resolve from node_modules; the slow/offline
343
- // concern applies to `index` (full build), not `init`.
344
- let codegraphAutoOutcome = null;
345
- try {
346
- const guard = defaultCodegraphInitGuard(projectRoot);
347
- if (guard.status === 'fresh') {
348
- // 'fresh' here also covers the dangling state (marker present but
349
- // no codegraph.db) — running init self-heals both.
350
- const initResult = await executeCodegraphInvocation(createCodegraphInvocation({ subcommand: 'init', project: projectRoot }));
351
- if (initResult.exitCode !== 0) {
352
- warningsForEnvelope.push(`codegraph auto-stake init failed (exit ${String(initResult.exitCode)}). ` +
353
- 'Run `peaks codegraph init --project <path>` manually to enable codegraph.');
354
- }
355
- else {
356
- // Upstream init creates `.codegraph/`; mkdir is a no-op in the
357
- // real path and lets the marker write succeed. Best-effort.
358
- mkdirSync(guard.codegraphDir, { recursive: true });
359
- writeCodegraphMarker(guard.codegraphDir);
360
- codegraphAutoOutcome = { status: 'fresh' };
361
- nextActions.push(`Auto-staked a peaks-loop-managed ${guard.codegraphDir}/ (upstream init + marker). ` +
362
- 'Run `peaks codegraph index --project <path>` next to build the SQLite-backed index.');
363
- }
364
- }
365
- else if (guard.status === 'noop-already-peaks-loop') {
366
- codegraphAutoOutcome = { status: 'noop' };
367
- }
368
- else {
369
- codegraphAutoOutcome = { status: 'conflict' };
370
- warningsForEnvelope.push(`${guard.codegraphDir} already exists with a non-peaks-loop schema; ` +
371
- 'refusing to auto-init codegraph. Run `peaks codegraph init --project <path>` after moving the foreign directory.');
372
- }
373
- }
374
- catch (err) {
375
- warningsForEnvelope.push(`codegraph auto-stake failed: ${getErrorMessage(err)}`);
376
- }
377
- printResult(io, ok('workspace.init', {
378
- ...report,
379
- // JSON envelope so the LLM and the human both see the swap.
380
- // Field is omitted (not null) when no rotation fired.
381
- ...(rotation.previousSessionId !== null && rotation.reason !== null
382
- ? {
383
- rotation: {
384
- previousSessionId: rotation.previousSessionId,
385
- reason: rotation.reason
386
- }
387
- }
388
- : {}),
389
- hooksInstall: {
390
- decision: hooksOutcome.decision,
391
- action: hooksOutcome.action,
392
- scope: hooksOutcome.scope,
393
- ...(hooksOutcome.reason !== undefined ? { reason: hooksOutcome.reason } : {})
394
- },
395
- ...(codegraphAutoOutcome !== null ? { codegraphAutoStake: codegraphAutoOutcome } : {}),
396
- // for the .peaks/project-scan/ bootstrap. Always present
397
- // (even when skipped / errored) so downstream readers can
398
- // rely on the shape.
399
- ...(projectScanEnvelope !== null
400
- ? {
401
- projectScan: {
402
- ...projectScanEnvelope,
403
- ...(projectScanError !== null ? { error: projectScanError } : {})
404
- }
405
- }
406
- : {})
407
- }, warningsForEnvelope, nextActions), options.json);
408
- }
409
- catch (error) {
410
- if (error instanceof UnsafeProjectRootError) {
411
- // A typed refusal, not a crash: "you are standing in your home
412
- // directory, which is not a project" is a thing the caller can fix in
413
- // one step, and the envelope has to say which directory was refused and
414
- // what to pass instead. `WORKSPACE_INIT_FAILED` below would have buried
415
- // it as an unexplained failure.
416
- printResult(io, fail('workspace.init', 'UNSAFE_PROJECT_ROOT', error.message, {
417
- resolvedProjectRoot: error.projectRoot,
418
- projectOption: options.project ?? null
419
- }, [
420
- 'Pass --project <path-to-your-project> instead of a path that resolves to your home directory.',
421
- 'This command creates .peaks/, .gitignore, .claude/settings.local.json and a codegraph index; none of those belong in $HOME.',
422
- 'If you meant to initialize the current directory, cd into a project directory first — peaks will not write into the home directory itself.'
423
- ]), options.json);
424
- process.exitCode = 1;
425
- return;
426
- }
427
- if (error instanceof InvalidSessionIdError) {
428
- printResult(io, fail('workspace.init', error.code, error.message, { sessionId: options.sessionId }, [
429
- 'Use a date-prefixed kebab slug like 2026-05-25-add-user-auth'
430
- ]), options.json);
431
- process.exitCode = 1;
432
- return;
433
- }
434
- if (error instanceof ConflictingSessionError) {
435
- printResult(io, fail('workspace.init', error.code, error.message, {
436
- existingSessionId: error.existingSessionId,
437
- requestedSessionId: error.requestedSessionId
438
- }, [
439
- `Finish or abandon session "${error.existingSessionId}" first, then re-run workspace init.`,
440
- 'Or pass --allow-session-rebind to override the binding (overwrites the prior binding).'
441
- ]), options.json);
442
- process.exitCode = 1;
443
- return;
444
- }
445
- if (error instanceof LegacyChangeIdSiblingError) {
446
- // Slice 2.8.3: a 2.8.0-era orphan `.peaks/_runtime/<change-id>/` was
447
- // found at top level. The CLI surfaces the migration steps
448
- // verbatim from the error message plus three concrete
449
- // nextActions so the user (or LLM driver) has an unambiguous
450
- // recovery path. We do NOT auto-migrate because the legacy
451
- // sibling dir may contain user-authored content.
452
- printResult(io, fail('workspace.init', error.code, error.message, {
453
- sessionId: error.sessionId,
454
- legacyPath: error.legacyPath
455
- }, [
456
- `Inspect ${error.legacyPath} for any user-authored content you want to keep.`,
457
- `Move any desired files into .peaks/_runtime/<sessionId>/<role>/ (gitignored), then delete ${error.legacyPath}.`,
458
- `Re-run \`peaks workspace init --project <path>\` to bind a fresh session.`
459
- ]), options.json);
460
- process.exitCode = 1;
461
- return;
462
- }
463
- // `LegacyChangeIdBindingError` catch branch is gone — the change-id
464
- // binding file at `.peaks/_runtime/current-change` is no longer
465
- // written by init, so there is no legacy binding to detect.
466
- printResult(io, fail('workspace.init', 'WORKSPACE_INIT_FAILED', getErrorMessage(error), { projectRoot: options.project, sessionId: options.sessionId }, ['Verify the project path exists and is writable']), options.json);
467
- process.exitCode = 1;
468
- }
469
- });
470
- }
471
- /**
472
- * Resolve the first-time "install peaks hooks" decision for this project.
473
- * Decision tree:
474
- *
475
- * 1. Read the sticky marker.
476
- * - Marker present:
477
- * - marker.decision === 'installed' AND hooks are present → action: marker-honored, no side effects
478
- * - marker.decision === 'installed' AND hooks are MISSING → re-install, action: reinstalled
479
- * - marker.decision === 'skipped' → action: marker-honored, no install
480
- * - Marker absent:
481
- * - hooks already present → write a fresh 'installed' marker, action: already-installed
482
- * - otherwise:
483
- * - explicit --install-hooks=auto → install + marker, action: first-decision
484
- * - explicit --install-hooks=skip → marker only, action: first-decision
485
- * - explicit --install-hooks=ask OR default in TTY:
486
- * - jsonMode → silently auto-install (LLM cannot answer), action: first-decision
487
- * - TTY → prompt; on yes install + marker, on no marker-only
488
- * - default in non-TTY → auto-install, action: first-decision
489
- *
490
- * Project scope is the only supported scope here; global scope is reserved
491
- * for explicit `peaks hooks install --global` invocations.
492
- */
493
- export async function resolveFirstTimeHooksInstall(options) {
494
- const { projectRoot, jsonMode } = options;
495
- const existingMarker = readDecisionMarker(projectRoot);
496
- // readHookStatus can throw (e.g. .claude is a symlink → safety check rejects).
497
- // Treat any throw as "hooks status unknown → treat as not-installed" so the
498
- // function still reaches the install path; the install will surface the same
499
- // error in a more specific reason field.
500
- let hookStatus;
501
- try {
502
- hookStatus = readHookStatus('project', projectRoot);
503
- }
504
- catch (error) {
505
- hookStatus = { installed: false };
506
- // Fall through to the install path; the failure will be captured below.
507
- void error;
508
- }
509
- if (existingMarker !== null) {
510
- if (existingMarker.decision === 'installed' && !hookStatus.installed) {
511
- try {
512
- applyHookInstall('project', projectRoot);
513
- return {
514
- decision: 'installed',
515
- action: 'reinstalled',
516
- scope: 'project',
517
- reason: 'marker-said-installed-hooks-missing'
518
- };
519
- }
520
- catch (error) {
521
- return {
522
- decision: existingMarker.decision,
523
- action: 'marker-honored',
524
- scope: 'project',
525
- reason: `reinstall-failed: ${getErrorMessage(error)}`
526
- };
527
- }
528
- }
529
- return {
530
- decision: existingMarker.decision,
531
- action: 'marker-honored',
532
- scope: existingMarker.scope
533
- };
534
- }
535
- // No marker yet — first decision.
536
- if (hookStatus.installed) {
537
- writeDecisionMarker(projectRoot, 'installed');
538
- return { decision: 'installed', action: 'already-installed', scope: 'project' };
539
- }
540
- // Determine effective mode (explicit flag wins; default depends on TTY + jsonMode).
541
- const explicitMode = options.explicitMode;
542
- const effectiveMode = explicitMode ?? (jsonMode ? 'auto' : process.stdin.isTTY === true ? 'ask' : 'auto');
543
- if (effectiveMode === 'skip') {
544
- writeDecisionMarker(projectRoot, 'skipped');
545
- return {
546
- decision: 'skipped',
547
- action: 'first-decision',
548
- scope: 'project',
549
- reason: 'explicit-skip'
550
- };
551
- }
552
- if (effectiveMode === 'auto' || jsonMode) {
553
- // The reason code distinguishes the path the user took to reach auto-install:
554
- // - explicit-auto: user passed --install-hooks=auto
555
- // - json-mode: no --install-hooks flag, but --json was set
556
- // - non-tty-default: no flag, no --json, stdin is not a TTY
557
- let autoReason;
558
- if (explicitMode === 'auto') {
559
- autoReason = 'explicit-auto';
560
- }
561
- else if (jsonMode) {
562
- autoReason = 'json-mode';
563
- }
564
- else {
565
- autoReason = 'non-tty-default';
566
- }
567
- try {
568
- applyHookInstall('project', projectRoot);
569
- writeDecisionMarker(projectRoot, 'installed');
570
- return {
571
- decision: 'installed',
572
- action: 'first-decision',
573
- scope: 'project',
574
- reason: autoReason
575
- };
576
- }
577
- catch (error) {
578
- // Auto-install failed: still record the decision so we do not keep retrying
579
- // every workspace init. The user can fix the underlying problem and run
580
- // `peaks hooks install` manually.
581
- writeDecisionMarker(projectRoot, 'installed');
582
- return {
583
- decision: 'installed',
584
- action: 'first-decision',
585
- scope: 'project',
586
- reason: `install-failed: ${getErrorMessage(error)}`
587
- };
588
- }
589
- }
590
- // effectiveMode === 'ask' AND TTY: prompt once.
591
- process.stderr.write('\nPeaks-Cli: install the PreToolUse hooks for this project now?\n' +
592
- ' → Bash matcher: `peaks gate enforce` (SOP gate enforcement)\n' +
593
- 'The gate-enforce hook runs on every Claude Code tool call without further prompting. The decision is sticky\n' +
594
- '(recorded in .peaks/.peaks-init-hooks-decision.json) and re-runs of `workspace init` will\n' +
595
- 'honour it. Re-run with --install-hooks=skip or --install-hooks=auto to override.\n\n' +
596
- 'Install now? [Y/n]: ');
597
- const answer = await promptYesNo('');
598
- if (answer === null) {
599
- // TTY disappeared mid-prompt (rare): treat as skip + write marker.
600
- writeDecisionMarker(projectRoot, 'skipped');
601
- return {
602
- decision: 'skipped',
603
- action: 'first-decision',
604
- scope: 'project',
605
- reason: 'tty-prompt-aborted'
606
- };
607
- }
608
- if (!answer) {
609
- writeDecisionMarker(projectRoot, 'skipped');
610
- return {
611
- decision: 'skipped',
612
- action: 'first-decision',
613
- scope: 'project',
614
- reason: 'user-answered-no'
615
- };
13
+ import { ok } from 'peaks-loop-shared/result';
14
+ import { addJsonOption, printResult } from '../../cli-helpers.js';
15
+ import { bootstrapProjectScanForInit, resolveInitTarget, runInitWorkspace } from './init-context.js';
16
+ import { collectInitEnvelope } from './init-actions.js';
17
+ import { buildInitEnvelopeData } from './init-envelope.js';
18
+ import { reportWorkspaceInitFailure } from './init-failures.js';
19
+ // Published import paths preserved: `workspace-commands.ts` (and tests) import
20
+ // the hooks-decision primitive and its two types from this module.
21
+ export { resolveFirstTimeHooksInstall } from './init-hooks-decision.js';
22
+ const INIT_DESCRIPTION = 'Create the .peaks/_runtime/<session-id>/ directory with ONLY the session.json metadata file (slice 006: role subdirs prd/ui/rd/qa/sc/txt and the system/ subdir are created lazily by writers, not pre-created at init). Pass --session-id to use a specific id, or omit it to auto-generate one (and adopt an existing binding if present). On the first call for a project, also handles the one-time "install peaks hooks" decision (sticky-marker stored in .peaks/.peaks-init-hooks-decision.json).';
23
+ const INIT_PROJECT_HELP = 'target project root';
24
+ const INIT_SESSION_HELP = 'optional session id in YYYY-MM-DD-<kebab-slug> format. When omitted, the CLI is the single source of truth: an existing binding is reused, otherwise a fresh id is auto-generated.';
25
+ const INIT_REBIND_HELP = 'overwrite an existing session binding when the requested session id differs from the project current one';
26
+ const INIT_NO_ROTATE_HELP = 'suppress the auto-rotation of the project session binding when the outer (Claude / harness) session id has changed. Default rotates on mismatch.';
27
+ const INIT_INSTALL_HOOKS_HELP = 'first-time hooks install behaviour: ask (default in TTY, prompt once + sticky-marker), auto (default in --json / non-TTY, install silently + sticky-marker), skip (sticky-marker skipped, do not install)';
28
+ const INIT_NO_CLAUDE_HOOKS_HELP = 'do NOT materialize .claude/settings.local.json (slice 2.0.1-bug3 fact-forcing bypass). Default: hooks installed so tool calls inside .peaks/** are not blocked by the [Fact-Forcing Gate].';
29
+ const INIT_INIT_STANDARDS_HELP = "slice 2026-06-16-peaks-code-auto-scaffold: when the consumer project's .claude/rules/ is missing or empty, auto-apply `peaks standards init --project <path> --apply` after emitting the diagnostic. Default: diagnostic only (no write).";
30
+ const INIT_NO_PROJECT_SCAN_HELP = 'slice 2026-07-15-project-scan-bootstrap: skip the bootstrap of .peaks/project-scan/{project-scan.md + 4 audit/business templates} that runs after init succeeds. Default: bootstrap runs (idempotent: existing files are kept unless --force-project-scan-templates is also passed).';
31
+ const INIT_FORCE_TEMPLATES_HELP = 'slice 2026-07-15-project-scan-bootstrap (AC10): overwrite the 4 audit/business templates under .peaks/project-scan/ (business-knowledge.md, security-template.md, perf-template.md, audit-output-schema.md) even when they already exist. Default: skip existing files (sediment-preserved).';
32
+ function parseInstallHooks(value) {
33
+ if (value !== 'ask' && value !== 'auto' && value !== 'skip') {
34
+ throw new Error(`--install-hooks must be one of: ask, auto, skip (got "${value}")`);
616
35
  }
36
+ return value;
37
+ }
38
+ async function runWorkspaceInit(options, io) {
617
39
  try {
618
- applyHookInstall('project', projectRoot);
619
- writeDecisionMarker(projectRoot, 'installed');
620
- return {
621
- decision: 'installed',
622
- action: 'first-decision',
623
- scope: 'project',
624
- reason: 'user-answered-yes'
40
+ const { projectRoot, sessionId, rotation } = await resolveInitTarget(options);
41
+ const report = await runInitWorkspace(options, projectRoot, sessionId);
42
+ const scan = await bootstrapProjectScanForInit(options, projectRoot);
43
+ const ctx = {
44
+ options,
45
+ projectRoot,
46
+ sessionId,
47
+ rotation,
48
+ report,
49
+ projectScanEnvelope: scan.envelope,
50
+ projectScanError: scan.error
625
51
  };
52
+ const parts = await collectInitEnvelope(ctx);
53
+ printResult(io, ok('workspace.init', buildInitEnvelopeData(ctx, parts.hooksOutcome, parts.codegraphAutoOutcome), parts.warnings, parts.nextActions), options.json);
626
54
  }
627
55
  catch (error) {
628
- writeDecisionMarker(projectRoot, 'installed');
629
- return {
630
- decision: 'installed',
631
- action: 'first-decision',
632
- scope: 'project',
633
- reason: `install-failed: ${getErrorMessage(error)}`
634
- };
56
+ reportWorkspaceInitFailure(io, error, options);
635
57
  }
636
58
  }
59
+ export function registerWorkspaceInitCommand(workspace, io) {
60
+ addJsonOption(workspace
61
+ .command('init')
62
+ .description(INIT_DESCRIPTION)
63
+ .requiredOption('--project <path>', INIT_PROJECT_HELP)
64
+ .option('--session-id <id>', INIT_SESSION_HELP)
65
+ .option('--allow-session-rebind', INIT_REBIND_HELP, false)
66
+ .option('--no-rotate-on-outer-mismatch', INIT_NO_ROTATE_HELP)
67
+ .option('--install-hooks <mode>', INIT_INSTALL_HOOKS_HELP, parseInstallHooks)
68
+ .option('--no-claude-hooks', INIT_NO_CLAUDE_HOOKS_HELP)
69
+ .option('--init-standards', INIT_INIT_STANDARDS_HELP)
70
+ .option('--no-project-scan-bootstrap', INIT_NO_PROJECT_SCAN_HELP)
71
+ .option('--force-project-scan-templates', INIT_FORCE_TEMPLATES_HELP, false)).action((options) => runWorkspaceInit(options, io));
72
+ }