peaks-loop 4.1.3 → 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 (402) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +56 -0
  3. package/README-en.md +1 -1
  4. package/README.md +1 -1
  5. package/dist/cli/commands/asset-command-shared.d.ts +12 -0
  6. package/dist/cli/commands/asset-command-shared.js +45 -0
  7. package/dist/cli/commands/asset-commands.d.ts +6 -1
  8. package/dist/cli/commands/asset-commands.js +11 -372
  9. package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
  10. package/dist/cli/commands/asset-crystallize-command.js +60 -0
  11. package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
  12. package/dist/cli/commands/asset-crystallize-payload.js +85 -0
  13. package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
  14. package/dist/cli/commands/asset-crystallize-runner.js +133 -0
  15. package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
  16. package/dist/cli/commands/asset-dispose-command.js +99 -0
  17. package/dist/cli/commands/asset-status-command.d.ts +3 -0
  18. package/dist/cli/commands/asset-status-command.js +100 -0
  19. package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
  20. package/dist/cli/commands/baseline-audit-command.js +64 -0
  21. package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
  22. package/dist/cli/commands/baseline-command-shared.js +39 -0
  23. package/dist/cli/commands/baseline-commands.js +33 -313
  24. package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
  25. package/dist/cli/commands/baseline-freeze-commands.js +81 -0
  26. package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
  27. package/dist/cli/commands/baseline-guard-command.js +52 -0
  28. package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
  29. package/dist/cli/commands/baseline-read-commands.js +72 -0
  30. package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
  31. package/dist/cli/commands/baseline-rollback-commands.js +88 -0
  32. package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
  33. package/dist/cli/commands/classify-downgrade-command.js +21 -0
  34. package/dist/cli/commands/classify-run-command.d.ts +9 -0
  35. package/dist/cli/commands/classify-run-command.js +73 -0
  36. package/dist/cli/commands/classify-signals.d.ts +5 -0
  37. package/dist/cli/commands/classify-signals.js +104 -0
  38. package/dist/cli/commands/code-emit-handoff-command.js +40 -3
  39. package/dist/cli/commands/code-gate-step-08-command.js +25 -9
  40. package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
  41. package/dist/cli/commands/codegraph-command-options.js +22 -0
  42. package/dist/cli/commands/codegraph-commands.d.ts +2 -2
  43. package/dist/cli/commands/codegraph-commands.js +14 -397
  44. package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
  45. package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
  46. package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
  47. package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
  48. package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
  49. package/dist/cli/commands/codegraph-repair-commands.js +94 -0
  50. package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
  51. package/dist/cli/commands/codegraph-status-command.js +27 -214
  52. package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
  53. package/dist/cli/commands/codegraph-status-integrity.js +121 -0
  54. package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
  55. package/dist/cli/commands/codegraph-status-json.js +127 -0
  56. package/dist/cli/commands/container-command-shared.d.ts +60 -0
  57. package/dist/cli/commands/container-command-shared.js +52 -0
  58. package/dist/cli/commands/container-commands.d.ts +1 -1
  59. package/dist/cli/commands/container-commands.js +4 -216
  60. package/dist/cli/commands/container-release-command.d.ts +3 -0
  61. package/dist/cli/commands/container-release-command.js +105 -0
  62. package/dist/cli/commands/container-spawn-command.d.ts +3 -0
  63. package/dist/cli/commands/container-spawn-command.js +148 -0
  64. package/dist/cli/commands/context-check-command.d.ts +3 -0
  65. package/dist/cli/commands/context-check-command.js +81 -0
  66. package/dist/cli/commands/context-commands.d.ts +2 -7
  67. package/dist/cli/commands/context-commands.js +6 -276
  68. package/dist/cli/commands/context-layer-command.d.ts +3 -0
  69. package/dist/cli/commands/context-layer-command.js +34 -0
  70. package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
  71. package/dist/cli/commands/context-layer-fetchers.js +162 -0
  72. package/dist/cli/commands/context-status-command.d.ts +17 -0
  73. package/dist/cli/commands/context-status-command.js +41 -0
  74. package/dist/cli/commands/contract-write-command.d.ts +3 -0
  75. package/dist/cli/commands/contract-write-command.js +144 -0
  76. package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
  77. package/dist/cli/commands/core/doctor-bindings.js +30 -0
  78. package/dist/cli/commands/core/doctor-command.d.ts +4 -18
  79. package/dist/cli/commands/core/doctor-command.js +2 -323
  80. package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
  81. package/dist/cli/commands/core/doctor-logs.js +32 -0
  82. package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
  83. package/dist/cli/commands/core/doctor-probes.js +55 -0
  84. package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
  85. package/dist/cli/commands/core/doctor-run-command.js +172 -0
  86. package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
  87. package/dist/cli/commands/core/doctor-summary.js +39 -0
  88. package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
  89. package/dist/cli/commands/core/memory-command-shared.js +20 -0
  90. package/dist/cli/commands/core/memory-command.d.ts +1 -1
  91. package/dist/cli/commands/core/memory-command.js +6 -227
  92. package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
  93. package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
  94. package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
  95. package/dist/cli/commands/core/memory-extract-command.js +90 -0
  96. package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
  97. package/dist/cli/commands/core/memory-sync-command.js +38 -0
  98. package/dist/cli/commands/core/session-command.d.ts +1 -1
  99. package/dist/cli/commands/core/session-command.js +12 -206
  100. package/dist/cli/commands/core/session-info-command.d.ts +3 -0
  101. package/dist/cli/commands/core/session-info-command.js +142 -0
  102. package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
  103. package/dist/cli/commands/core/session-verb-commands.js +58 -0
  104. package/dist/cli/commands/core/standards-command.d.ts +1 -24
  105. package/dist/cli/commands/core/standards-command.js +33 -201
  106. package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
  107. package/dist/cli/commands/core/standards-init-command.js +87 -0
  108. package/dist/cli/commands/core/standards-lint.d.ts +24 -0
  109. package/dist/cli/commands/core/standards-lint.js +57 -0
  110. package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
  111. package/dist/cli/commands/core/standards-migrate-command.js +57 -0
  112. package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
  113. package/dist/cli/commands/cron-scheduler-commands.js +36 -206
  114. package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
  115. package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
  116. package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
  117. package/dist/cli/commands/cron-scheduler-shared.js +48 -0
  118. package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
  119. package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
  120. package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
  121. package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
  122. package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
  123. package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
  124. package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
  125. package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
  126. package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
  127. package/dist/cli/commands/dispatch-dag-failure.js +16 -0
  128. package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
  129. package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
  130. package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
  131. package/dist/cli/commands/dispatch-dag-runners.js +73 -0
  132. package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
  133. package/dist/cli/commands/dispatch-from-dag.js +87 -257
  134. package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
  135. package/dist/cli/commands/final-review-command-envelopes.js +100 -0
  136. package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
  137. package/dist/cli/commands/final-review-command-shared.js +35 -0
  138. package/dist/cli/commands/final-review-commands.d.ts +7 -27
  139. package/dist/cli/commands/final-review-commands.js +13 -240
  140. package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
  141. package/dist/cli/commands/final-review-prepare-command.js +200 -0
  142. package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
  143. package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
  144. package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
  145. package/dist/cli/commands/hooks-command-shared.js +32 -0
  146. package/dist/cli/commands/hooks-commands.d.ts +20 -0
  147. package/dist/cli/commands/hooks-commands.js +75 -309
  148. package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
  149. package/dist/cli/commands/hooks-install-envelopes.js +144 -0
  150. package/dist/cli/commands/hooks-status-command.d.ts +3 -0
  151. package/dist/cli/commands/hooks-status-command.js +93 -0
  152. package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
  153. package/dist/cli/commands/hooks-uninstall-command.js +43 -0
  154. package/dist/cli/commands/loop-command-shared.d.ts +31 -0
  155. package/dist/cli/commands/loop-command-shared.js +15 -0
  156. package/dist/cli/commands/loop-commands.d.ts +12 -17
  157. package/dist/cli/commands/loop-commands.js +56 -238
  158. package/dist/cli/commands/loop-export-command.d.ts +3 -0
  159. package/dist/cli/commands/loop-export-command.js +73 -0
  160. package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
  161. package/dist/cli/commands/loop-goal-compose-command.js +36 -0
  162. package/dist/cli/commands/loop-import-command.d.ts +3 -0
  163. package/dist/cli/commands/loop-import-command.js +86 -0
  164. package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
  165. package/dist/cli/commands/loop-placeholder-commands.js +52 -0
  166. package/dist/cli/commands/memory-command-shared.d.ts +59 -0
  167. package/dist/cli/commands/memory-command-shared.js +39 -0
  168. package/dist/cli/commands/memory-commands.d.ts +6 -79
  169. package/dist/cli/commands/memory-commands.js +19 -309
  170. package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
  171. package/dist/cli/commands/memory-ingest-command.js +50 -0
  172. package/dist/cli/commands/memory-list-command.d.ts +16 -0
  173. package/dist/cli/commands/memory-list-command.js +129 -0
  174. package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
  175. package/dist/cli/commands/memory-reindex-command.js +78 -0
  176. package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
  177. package/dist/cli/commands/memory-rotate-command.js +55 -0
  178. package/dist/cli/commands/memory-search-command.d.ts +7 -0
  179. package/dist/cli/commands/memory-search-command.js +46 -0
  180. package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
  181. package/dist/cli/commands/openspec-archive-command.js +55 -0
  182. package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
  183. package/dist/cli/commands/openspec-command-shared.js +135 -0
  184. package/dist/cli/commands/openspec-commands.d.ts +1 -1
  185. package/dist/cli/commands/openspec-commands.js +33 -306
  186. package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
  187. package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
  188. package/dist/cli/commands/openspec-init-command.d.ts +3 -0
  189. package/dist/cli/commands/openspec-init-command.js +49 -0
  190. package/dist/cli/commands/openspec-list-command.d.ts +3 -0
  191. package/dist/cli/commands/openspec-list-command.js +27 -0
  192. package/dist/cli/commands/openspec-render-command.d.ts +3 -0
  193. package/dist/cli/commands/openspec-render-command.js +33 -0
  194. package/dist/cli/commands/openspec-show-command.d.ts +3 -0
  195. package/dist/cli/commands/openspec-show-command.js +33 -0
  196. package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
  197. package/dist/cli/commands/openspec-to-rd-command.js +33 -0
  198. package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
  199. package/dist/cli/commands/openspec-validate-command.js +45 -0
  200. package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
  201. package/dist/cli/commands/playwright-browser-command.js +61 -0
  202. package/dist/cli/commands/playwright-commands.d.ts +10 -62
  203. package/dist/cli/commands/playwright-commands.js +77 -400
  204. package/dist/cli/commands/playwright-envelope.d.ts +8 -0
  205. package/dist/cli/commands/playwright-envelope.js +29 -0
  206. package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
  207. package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
  208. package/dist/cli/commands/playwright-session-store.d.ts +65 -0
  209. package/dist/cli/commands/playwright-session-store.js +189 -0
  210. package/dist/cli/commands/project-commands.d.ts +19 -0
  211. package/dist/cli/commands/project-commands.js +98 -259
  212. package/dist/cli/commands/project-context-command.d.ts +3 -0
  213. package/dist/cli/commands/project-context-command.js +44 -0
  214. package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
  215. package/dist/cli/commands/project-dashboard-command.js +74 -0
  216. package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
  217. package/dist/cli/commands/project-knowledge-command.js +48 -0
  218. package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
  219. package/dist/cli/commands/project-memories-show-command.js +87 -0
  220. package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
  221. package/dist/cli/commands/project-memory-index-command.js +31 -0
  222. package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
  223. package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
  224. package/dist/cli/commands/qa-commands.d.ts +14 -87
  225. package/dist/cli/commands/qa-commands.js +17 -315
  226. package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
  227. package/dist/cli/commands/qa-context-prestep.js +34 -0
  228. package/dist/cli/commands/qa-run-command.d.ts +3 -0
  229. package/dist/cli/commands/qa-run-command.js +105 -0
  230. package/dist/cli/commands/qa-run-options.d.ts +23 -0
  231. package/dist/cli/commands/qa-run-options.js +31 -0
  232. package/dist/cli/commands/qa-run-slice.d.ts +41 -0
  233. package/dist/cli/commands/qa-run-slice.js +145 -0
  234. package/dist/cli/commands/release-canary-command.d.ts +28 -0
  235. package/dist/cli/commands/release-canary-command.js +129 -0
  236. package/dist/cli/commands/release-command-shared.d.ts +13 -0
  237. package/dist/cli/commands/release-command-shared.js +18 -0
  238. package/dist/cli/commands/release-commands.d.ts +10 -18
  239. package/dist/cli/commands/release-commands.js +25 -298
  240. package/dist/cli/commands/release-done-command.d.ts +3 -0
  241. package/dist/cli/commands/release-done-command.js +64 -0
  242. package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
  243. package/dist/cli/commands/release-hotfix-command.js +50 -0
  244. package/dist/cli/commands/release-plan-command.d.ts +3 -0
  245. package/dist/cli/commands/release-plan-command.js +33 -0
  246. package/dist/cli/commands/release-precheck-command.d.ts +3 -0
  247. package/dist/cli/commands/release-precheck-command.js +28 -0
  248. package/dist/cli/commands/release-promote-command.d.ts +3 -0
  249. package/dist/cli/commands/release-promote-command.js +34 -0
  250. package/dist/cli/commands/release-rollback-command.d.ts +3 -0
  251. package/dist/cli/commands/release-rollback-command.js +33 -0
  252. package/dist/cli/commands/release-watch-command.d.ts +3 -0
  253. package/dist/cli/commands/release-watch-command.js +44 -0
  254. package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
  255. package/dist/cli/commands/sediment-argv-flags.js +116 -0
  256. package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
  257. package/dist/cli/commands/sediment-command-shared.js +5 -0
  258. package/dist/cli/commands/sediment-commands.d.ts +35 -59
  259. package/dist/cli/commands/sediment-commands.js +36 -590
  260. package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
  261. package/dist/cli/commands/sediment-pool-commands.js +185 -0
  262. package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
  263. package/dist/cli/commands/sediment-query-commands.js +94 -0
  264. package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
  265. package/dist/cli/commands/sediment-release-commands.js +232 -0
  266. package/dist/cli/commands/sop-advance-command.d.ts +3 -0
  267. package/dist/cli/commands/sop-advance-command.js +160 -0
  268. package/dist/cli/commands/sop-check-command.d.ts +3 -0
  269. package/dist/cli/commands/sop-check-command.js +44 -0
  270. package/dist/cli/commands/sop-command-shared.d.ts +23 -0
  271. package/dist/cli/commands/sop-command-shared.js +18 -0
  272. package/dist/cli/commands/sop-commands.d.ts +15 -1
  273. package/dist/cli/commands/sop-commands.js +26 -240
  274. package/dist/cli/commands/sop-init-command.d.ts +3 -0
  275. package/dist/cli/commands/sop-init-command.js +51 -0
  276. package/dist/cli/commands/sop-lint-command.d.ts +3 -0
  277. package/dist/cli/commands/sop-lint-command.js +64 -0
  278. package/dist/cli/commands/sop-register-command.d.ts +3 -0
  279. package/dist/cli/commands/sop-register-command.js +48 -0
  280. package/dist/cli/commands/sop-registry-command.d.ts +3 -0
  281. package/dist/cli/commands/sop-registry-command.js +30 -0
  282. package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
  283. package/dist/cli/commands/statusline-command-shared.js +90 -0
  284. package/dist/cli/commands/statusline-commands.d.ts +1 -19
  285. package/dist/cli/commands/statusline-commands.js +48 -287
  286. package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
  287. package/dist/cli/commands/statusline-compact-command.js +54 -0
  288. package/dist/cli/commands/statusline-install-command.d.ts +3 -0
  289. package/dist/cli/commands/statusline-install-command.js +48 -0
  290. package/dist/cli/commands/statusline-render-command.d.ts +9 -0
  291. package/dist/cli/commands/statusline-render-command.js +55 -0
  292. package/dist/cli/commands/statusline-status-command.d.ts +3 -0
  293. package/dist/cli/commands/statusline-status-command.js +23 -0
  294. package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
  295. package/dist/cli/commands/statusline-uninstall-command.js +23 -0
  296. package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
  297. package/dist/cli/commands/test-command-run-helpers.js +73 -0
  298. package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
  299. package/dist/cli/commands/test-command-runner-resolution.js +183 -0
  300. package/dist/cli/commands/test-commands.d.ts +8 -56
  301. package/dist/cli/commands/test-commands.js +26 -249
  302. package/dist/cli/commands/vm-command-shared.d.ts +23 -0
  303. package/dist/cli/commands/vm-command-shared.js +23 -0
  304. package/dist/cli/commands/vm-commands.d.ts +1 -28
  305. package/dist/cli/commands/vm-commands.js +36 -270
  306. package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
  307. package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
  308. package/dist/cli/commands/vm-release-command.d.ts +5 -0
  309. package/dist/cli/commands/vm-release-command.js +101 -0
  310. package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
  311. package/dist/cli/commands/vm-spawn-command.js +177 -0
  312. package/dist/cli/commands/web-command-shared.d.ts +12 -0
  313. package/dist/cli/commands/web-command-shared.js +30 -0
  314. package/dist/cli/commands/web-commands.d.ts +7 -14
  315. package/dist/cli/commands/web-commands.js +6 -314
  316. package/dist/cli/commands/web-install-command.d.ts +10 -0
  317. package/dist/cli/commands/web-install-command.js +116 -0
  318. package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
  319. package/dist/cli/commands/web-lifecycle-commands.js +14 -322
  320. package/dist/cli/commands/web-login-command.d.ts +14 -0
  321. package/dist/cli/commands/web-login-command.js +189 -0
  322. package/dist/cli/commands/web-op-payload.d.ts +22 -0
  323. package/dist/cli/commands/web-op-payload.js +89 -0
  324. package/dist/cli/commands/web-op-refusals.d.ts +37 -0
  325. package/dist/cli/commands/web-op-refusals.js +73 -0
  326. package/dist/cli/commands/web-op-runner.d.ts +14 -0
  327. package/dist/cli/commands/web-op-runner.js +166 -0
  328. package/dist/cli/commands/web-status-command.d.ts +4 -0
  329. package/dist/cli/commands/web-status-command.js +32 -0
  330. package/dist/cli/commands/web-stop-command.d.ts +10 -0
  331. package/dist/cli/commands/web-stop-command.js +59 -0
  332. package/dist/cli/commands/web-verb-specs.d.ts +18 -0
  333. package/dist/cli/commands/web-verb-specs.js +66 -0
  334. package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
  335. package/dist/cli/commands/workflow-command-shared.js +74 -0
  336. package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
  337. package/dist/cli/commands/workflow-graph-commands.js +73 -0
  338. package/dist/cli/commands/workflow-init-command.d.ts +3 -0
  339. package/dist/cli/commands/workflow-init-command.js +68 -0
  340. package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
  341. package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
  342. package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
  343. package/dist/cli/commands/workflow-node-commands.js +154 -0
  344. package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
  345. package/dist/cli/commands/workflow-terminalize-command.js +56 -0
  346. package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
  347. package/dist/services/code/auto-compact-artifacts.js +135 -0
  348. package/dist/services/code/auto-compact-attempt.d.ts +46 -0
  349. package/dist/services/code/auto-compact-attempt.js +88 -0
  350. package/dist/services/code/auto-compact-decision.d.ts +74 -0
  351. package/dist/services/code/auto-compact-decision.js +149 -0
  352. package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
  353. package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
  354. package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
  355. package/dist/services/code/auto-compact-envelopes.js +134 -0
  356. package/dist/services/code/auto-compact-history.d.ts +46 -0
  357. package/dist/services/code/auto-compact-history.js +17 -0
  358. package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
  359. package/dist/services/code/auto-compact-orchestrator.js +165 -686
  360. package/dist/services/code/auto-compact-run-types.d.ts +123 -0
  361. package/dist/services/code/auto-compact-run-types.js +1 -0
  362. package/dist/services/code/emit-handoff.d.ts +35 -1
  363. package/dist/services/code/emit-handoff.js +128 -7
  364. package/dist/services/code/step-08-gate.d.ts +28 -19
  365. package/dist/services/code/step-08-gate.js +92 -35
  366. package/dist/services/config/config-coercion.d.ts +7 -0
  367. package/dist/services/config/config-coercion.js +156 -0
  368. package/dist/services/config/config-file-io.d.ts +11 -0
  369. package/dist/services/config/config-file-io.js +61 -0
  370. package/dist/services/config/config-get.d.ts +2 -0
  371. package/dist/services/config/config-get.js +36 -0
  372. package/dist/services/config/config-global-loader.d.ts +15 -0
  373. package/dist/services/config/config-global-loader.js +111 -0
  374. package/dist/services/config/config-nested-path.d.ts +3 -0
  375. package/dist/services/config/config-nested-path.js +53 -0
  376. package/dist/services/config/config-primitives.d.ts +16 -0
  377. package/dist/services/config/config-primitives.js +24 -0
  378. package/dist/services/config/config-service.d.ts +9 -33
  379. package/dist/services/config/config-service.js +16 -665
  380. package/dist/services/config/config-validation.d.ts +19 -0
  381. package/dist/services/config/config-validation.js +152 -0
  382. package/dist/services/config/config-workspace.d.ts +10 -0
  383. package/dist/services/config/config-workspace.js +158 -0
  384. package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
  385. package/dist/services/skills/hooks-settings-deny-list.js +173 -0
  386. package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
  387. package/dist/services/skills/hooks-settings-envelopes.js +79 -0
  388. package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
  389. package/dist/services/skills/hooks-settings-file-shape.js +207 -0
  390. package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
  391. package/dist/services/skills/hooks-settings-paths.js +75 -0
  392. package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
  393. package/dist/services/skills/hooks-settings-read-installed.js +60 -0
  394. package/dist/services/skills/hooks-settings-service.d.ts +12 -212
  395. package/dist/services/skills/hooks-settings-service.js +71 -657
  396. package/dist/services/skills/hooks-settings-types.d.ts +139 -0
  397. package/dist/services/skills/hooks-settings-types.js +1 -0
  398. package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
  399. package/dist/services/workspace/claude-settings-template-merge.js +243 -0
  400. package/dist/services/workspace/claude-settings-template.d.ts +29 -87
  401. package/dist/services/workspace/claude-settings-template.js +81 -236
  402. package/package.json +5 -5
@@ -4,7 +4,8 @@
4
4
  *
5
5
  * Exposes the `prepareFinalReview()` service (W2 T9 on
6
6
  * `feature/slice-topology-multipass`) via the CLI surface. The service
7
- * depends on an injected `LlmRunner`; this file owns the binding:
7
+ * depends on an injected `LlmRunner`; the binding lives in
8
+ * `final-review-prepare-command.ts`:
8
9
  * - `--llm-provider stub` (default) returns a structured "scaffold ready"
9
10
  * envelope WITHOUT calling the service, so CI can verify the route
10
11
  * offline. It performs no review, and says so in every hint it emits.
@@ -23,33 +24,12 @@
23
24
  * - `peaks audit goal` — propose a 6-dim goal from a human need
24
25
  * - `peaks prepare-final-review` — produce a 4-dim review evidence
25
26
  * pack for human acceptance
27
+ *
28
+ * This file is the registration module only; the run body it dispatches to
29
+ * lives in `final-review-prepare-command.ts` and the envelope vocabulary in
30
+ * `final-review-command-shared.ts`.
26
31
  */
27
32
  import type { Command } from 'commander';
28
33
  import { type ProgramIO } from '../cli-helpers.js';
29
- import type { FinalReviewOutput } from '../../services/final-review/final-review-types.js';
30
- export type FinalReviewStatus = 'scaffold-only' | 'review-complete' | 'not-applicable';
31
- /**
32
- * Which LLM produced this envelope. `unknown` is reserved for failure
33
- * envelopes, where no binding was ever established.
34
- */
35
- export type FinalReviewProviderBinding = 'stub' | 'anthropic-messages-api' | 'unknown';
36
- export interface FinalReviewData {
37
- readonly status: FinalReviewStatus;
38
- readonly rid: string;
39
- readonly sessionId: string;
40
- readonly auditGoalPath: string;
41
- readonly serviceWired: boolean;
42
- readonly providerBinding: FinalReviewProviderBinding;
43
- /** Model id the bound provider answered with (real-provider runs only). */
44
- readonly model?: string;
45
- /** The 4-dim review the service produced (real-provider runs only). */
46
- readonly review?: FinalReviewOutput;
47
- /**
48
- * Environment variables that were absent when binding failed. Surfaced on
49
- * `data` because `fail()` redacts `message` through
50
- * `redactSensitiveErrorMessage`, whose catch-all pattern matches the words
51
- * `token` / `api_key` and would blank out the very names an operator needs.
52
- */
53
- readonly missingEnv?: readonly string[];
54
- }
55
34
  export declare function registerFinalReviewCommands(program: Command, io: ProgramIO): void;
35
+ export { emptyFinalReviewData, isSupportedLlmProvider, type FinalReviewData, type FinalReviewProviderBinding, type FinalReviewStatus, type PrepareFinalReviewOptions } from './final-review-command-shared.js';
@@ -4,7 +4,8 @@
4
4
  *
5
5
  * Exposes the `prepareFinalReview()` service (W2 T9 on
6
6
  * `feature/slice-topology-multipass`) via the CLI surface. The service
7
- * depends on an injected `LlmRunner`; this file owns the binding:
7
+ * depends on an injected `LlmRunner`; the binding lives in
8
+ * `final-review-prepare-command.ts`:
8
9
  * - `--llm-provider stub` (default) returns a structured "scaffold ready"
9
10
  * envelope WITHOUT calling the service, so CI can verify the route
10
11
  * offline. It performs no review, and says so in every hint it emits.
@@ -23,91 +24,14 @@
23
24
  * - `peaks audit goal` — propose a 6-dim goal from a human need
24
25
  * - `peaks prepare-final-review` — produce a 4-dim review evidence
25
26
  * pack for human acceptance
27
+ *
28
+ * This file is the registration module only; the run body it dispatches to
29
+ * lives in `final-review-prepare-command.ts` and the envelope vocabulary in
30
+ * `final-review-command-shared.ts`.
26
31
  */
27
- import { existsSync, statSync } from 'node:fs';
28
- import { join, resolve } from 'node:path';
29
- import { REQUEST_ID_PATTERN } from '../../services/artifacts/request-artifact-service.js';
30
- import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
31
- import { fail, ok } from 'peaks-loop-shared/result';
32
- import { createAnthropicRunner, LlmBindingError, LlmRequestError, resolveAnthropicConfig } from '../../services/llm/anthropic-runner.js';
33
- import { IncompleteFinalReviewError, prepareFinalReview } from '../../services/final-review/final-review-service.js';
34
- /** Whitelist of supported `--llm-provider` values for `peaks prepare-final-review`. */
35
- const SUPPORTED_LLM_PROVIDERS = ['anthropic', 'stub'];
36
- /**
37
- * Default stays `stub` (unlike `peaks audit goal`, whose default is the real
38
- * provider): the scaffold route is what CI and the registered e2e contract
39
- * exercise without credentials, and the stub envelope is labelled
40
- * `status: 'scaffold-only'` / `providerBinding: 'stub'` so it can never be
41
- * read as a review.
42
- */
43
- const DEFAULT_LLM_PROVIDER = 'stub';
44
- function isSupportedLlmProvider(value) {
45
- return SUPPORTED_LLM_PROVIDERS.includes(value);
46
- }
47
- /**
48
- * Empty placeholder used by `fail()` envelopes. `status` is
49
- * `'not-applicable'` on the error path so consumers can tell
50
- * "this is a placeholder on a failure" apart from "this is a real
51
- * scaffold-only success".
52
- */
53
- function emptyFinalReviewData(rid, sessionId, auditGoalPath, missingEnv) {
54
- return {
55
- status: 'not-applicable',
56
- rid,
57
- sessionId,
58
- auditGoalPath,
59
- serviceWired: false,
60
- providerBinding: 'unknown',
61
- ...(missingEnv === undefined ? {} : { missingEnv })
62
- };
63
- }
64
- function validateProjectRoot(projectArg) {
65
- const projectRoot = resolve(projectArg);
66
- if (!existsSync(projectRoot)) {
67
- return {
68
- ok: false,
69
- code: 'PROJECT_NOT_FOUND',
70
- message: `project path does not exist: ${projectArg}`
71
- };
72
- }
73
- let stat;
74
- try {
75
- stat = statSync(projectRoot);
76
- }
77
- catch (error) {
78
- return { ok: false, code: 'INVALID_PROJECT', message: getErrorMessage(error) };
79
- }
80
- if (!stat.isDirectory()) {
81
- return {
82
- ok: false,
83
- code: 'INVALID_PROJECT',
84
- message: `project path is not a directory: ${projectArg}`
85
- };
86
- }
87
- return { ok: true, projectRoot };
88
- }
89
- /**
90
- * Validate the session id. Rejects empty, path-traversal (`..`), and
91
- * any segment separator (`/`, `\`) so the caller cannot escape
92
- * `.peaks/_runtime/<sessionId>/audit-goal/` via CLI flags.
93
- */
94
- function validateSessionId(sessionId) {
95
- if (sessionId.length === 0) {
96
- return {
97
- ok: false,
98
- code: 'MISSING_REQUIRED_FLAG',
99
- message: '`--session-id` is required and must be a non-empty string'
100
- };
101
- }
102
- if (sessionId.includes('..') || sessionId.includes('/') || sessionId.includes('\\')) {
103
- return {
104
- ok: false,
105
- code: 'INVALID_SESSION_ID',
106
- message: '`--session-id` must not contain path-traversal or path-separator characters (rejected: "..", "/", "\\")'
107
- };
108
- }
109
- return { ok: true, sessionId };
110
- }
32
+ import { addJsonOption } from '../cli-helpers.js';
33
+ import { DEFAULT_LLM_PROVIDER, SUPPORTED_LLM_PROVIDERS } from './final-review-command-shared.js';
34
+ import { runPrepareFinalReview } from './final-review-prepare-command.js';
111
35
  export function registerFinalReviewCommands(program, io) {
112
36
  addJsonOption(program
113
37
  .command('prepare-final-review <rid>')
@@ -115,159 +39,8 @@ export function registerFinalReviewCommands(program, io) {
115
39
  .requiredOption('--project <path>', 'target project root')
116
40
  .requiredOption('--session-id <sid>', 'session id whose .peaks/_runtime/<sid>/audit-goal/<rid>.json is the approved goal source')
117
41
  .option('--llm-provider <name>', `LLM provider name: ${SUPPORTED_LLM_PROVIDERS.join(' | ')} (default: ${DEFAULT_LLM_PROVIDER} — performs no review)`, DEFAULT_LLM_PROVIDER)
118
- .option('--base <ref>', 'base ref for the pre/post baseline diff (`existing-functionality-intact`); default: merge-base with origin/HEAD, then origin/main, then origin/master, then HEAD~1 — pass this explicitly when none of those resolve')).action(async (rid, options) => {
119
- // 1. Project root must exist and be a directory.
120
- const projectValidation = validateProjectRoot(options.project);
121
- if (!projectValidation.ok) {
122
- printResult(io, fail('final-review.prepare', projectValidation.code, projectValidation.message, emptyFinalReviewData(rid, options.sessionId, ''), ['Verify the project path exists and is a directory']), options.json);
123
- process.exitCode = 1;
124
- return;
125
- }
126
- // 2. Session id must be a safe single-segment string.
127
- const sessionValidation = validateSessionId(options.sessionId);
128
- if (!sessionValidation.ok) {
129
- printResult(io, fail('final-review.prepare', sessionValidation.code, sessionValidation.message, emptyFinalReviewData(rid, options.sessionId, ''), [
130
- 'Pass a non-empty `--session-id` whose value is a single segment (no "..", "/", or "\\")'
131
- ]), options.json);
132
- process.exitCode = 1;
133
- return;
134
- }
135
- // 3. Compute the audit-goal path the service WOULD read. We do this
136
- // in two places: the pre-flight existence check (here) and the
137
- // stub-path envelope (below). The service computes it identically
138
- // at `src/services/final-review/final-review-service.ts:45-52`.
139
- //
140
- // Rid axis. The rid is the CLI positional and it is the FILENAME
141
- // segment below, so it is checked here, at the join. Added 2026-09-14
142
- // (repair R1): this join was a second-slot hole — the `--session-id`
143
- // validation above passed and the rid slot escaped. Found by the
144
- // widened rule D, not by a human reading the file.
145
- if (!REQUEST_ID_PATTERN.test(rid)) {
146
- printResult(io, fail('final-review.prepare', 'RID_INVALID', `Invalid request id: ${rid} (expected letters, digits, dots, underscores, or dashes)`, emptyFinalReviewData(rid, options.sessionId, ''), ['Pass the rid of the slice, e.g. 2026-09-14-some-slug']), options.json);
147
- process.exitCode = 1;
148
- return;
149
- }
150
- const auditGoalPath = join(projectValidation.projectRoot, '.peaks', '_runtime', sessionValidation.sessionId, 'audit-goal', `${rid}.json`);
151
- // 4. Pre-flight: if the audit-goal file is missing, surface a 404
152
- // BEFORE the stub/provider check so the caller learns the real
153
- // reason their request can't proceed.
154
- if (!existsSync(auditGoalPath)) {
155
- printResult(io, fail('final-review.prepare', 'AUDIT_GOAL_NOT_FOUND', `audit-goal file not found at expected path: ${auditGoalPath}`, emptyFinalReviewData(rid, sessionValidation.sessionId, auditGoalPath), [
156
- 'Run `peaks audit goal --project <path> --need <text>` first to produce the approved goal JSON.',
157
- 'Confirm `--session-id` matches the session that wrote the goal.'
158
- ]), options.json);
159
- process.exitCode = 1;
160
- return;
161
- }
162
- // 5. Provider check: unknown names fail loudly — a silent fallback to
163
- // `stub` would hand the caller a scaffold envelope that reads as a
164
- // review route, which is the defect class this gate exists to stop.
165
- const provider = options.llmProvider ?? DEFAULT_LLM_PROVIDER;
166
- if (!isSupportedLlmProvider(provider)) {
167
- printResult(io, fail('final-review.prepare', 'LLM_PROVIDER_NOT_IMPLEMENTED', `LLM provider "${provider}" is not implemented. Supported providers: ${SUPPORTED_LLM_PROVIDERS.join(', ')}.`, emptyFinalReviewData(rid, sessionValidation.sessionId, auditGoalPath), [
168
- `Re-run with \`--llm-provider anthropic\` for a real 4-dim review, or \`--llm-provider ${DEFAULT_LLM_PROVIDER}\` for an offline scaffold.`
169
- ]), options.json);
170
- process.exitCode = 1;
171
- return;
172
- }
173
- // 6. Stub path: surface a structured "scaffold ready" envelope.
174
- // We DO NOT call the service here — the stub runner answers the
175
- // audit-goal shape, not the 4-dim review shape, so running it through
176
- // `prepareFinalReview()` would only manufacture a malformed review.
177
- // The envelope confirms the route is wired end-to-end and reports the
178
- // audit-goal path the service WOULD read.
179
- if (provider === 'stub') {
180
- const data = {
181
- status: 'scaffold-only',
182
- rid,
183
- sessionId: sessionValidation.sessionId,
184
- auditGoalPath,
185
- serviceWired: true,
186
- providerBinding: 'stub'
187
- };
188
- const envelope = ok('final-review.prepare', data, [], [
189
- 'Stub provider: no 4-dim review was performed. This envelope only proves the route is wired and reachable.',
190
- `Audit-goal file is present at: ${auditGoalPath}`,
191
- 'Re-run with `--llm-provider anthropic` to produce a real review.'
192
- ]);
193
- printResult(io, envelope, options.json);
194
- return;
195
- }
196
- // 7. Real provider path: bind a real `LlmRunner` and run the service.
197
- // Binding happens INSIDE the try so an absent credential surfaces as
198
- // `LlmBindingError`'s own code instead of escaping as a crash. No
199
- // envelope is emitted on that path — a "successful" empty review would
200
- // be worse than an error.
201
- try {
202
- const config = resolveAnthropicConfig();
203
- const llmRunner = createAnthropicRunner(config);
204
- const review = await prepareFinalReview(rid, {
205
- projectRoot: projectValidation.projectRoot,
206
- sessionId: sessionValidation.sessionId,
207
- llmRunner,
208
- ...(options.base === undefined ? {} : { baseRef: options.base })
209
- });
210
- const data = {
211
- status: 'review-complete',
212
- rid,
213
- sessionId: sessionValidation.sessionId,
214
- auditGoalPath,
215
- serviceWired: true,
216
- providerBinding: 'anthropic-messages-api',
217
- model: config.model,
218
- review
219
- };
220
- const envelope = ok('final-review.prepare', data, review.allPass
221
- ? []
222
- : [
223
- `Dimensions needing human attention: ${review.needsAttention.join(', ') || 'none flagged'}.`
224
- ], [
225
- `4-dim review produced by anthropic-messages-api (model: ${config.model}).`,
226
- `allPass: ${String(review.allPass)}.`
227
- ]);
228
- printResult(io, envelope, options.json);
229
- }
230
- catch (error) {
231
- const code = finalReviewErrorCode(error);
232
- printResult(io, fail('final-review.prepare', code, getErrorMessage(error), emptyFinalReviewData(rid, sessionValidation.sessionId, auditGoalPath, error instanceof LlmBindingError ? error.missingEnv : undefined), finalReviewNextActions(code)), options.json);
233
- process.exitCode = 1;
234
- }
235
- });
236
- }
237
- /**
238
- * Map a thrown error to the CLI's error code. The LLM-layer errors already
239
- * carry codes precise enough to act on (`LLM_CREDENTIAL_MISSING`,
240
- * `LLM_REQUEST_FAILED`, …), so they are passed through rather than flattened
241
- * into one opaque failure.
242
- */
243
- function finalReviewErrorCode(error) {
244
- if (error instanceof LlmBindingError ||
245
- error instanceof LlmRequestError ||
246
- error instanceof IncompleteFinalReviewError) {
247
- return error.code;
248
- }
249
- return 'FINAL_REVIEW_FAILED';
250
- }
251
- function finalReviewNextActions(code) {
252
- switch (code) {
253
- case 'LLM_CREDENTIAL_MISSING':
254
- return [
255
- 'Export ANTHROPIC_AUTH_TOKEN (or ANTHROPIC_API_KEY) in the environment that launches peaks, then re-run.',
256
- 'For an offline scaffold instead of a review, re-run with `--llm-provider stub` — it performs NO review.'
257
- ];
258
- case 'LLM_MODEL_MISSING':
259
- return [
260
- 'Export ANTHROPIC_MODEL (or CLAUDE_CODE_SUBAGENT_MODEL) in the environment that launches peaks, then re-run.'
261
- ];
262
- case 'LLM_REQUEST_FAILED':
263
- return [
264
- 'Check ANTHROPIC_BASE_URL and network reachability, then re-run — a transport failure produces no review.'
265
- ];
266
- case 'INCOMPLETE_FINAL_REVIEW':
267
- return [
268
- 'The LLM reply was not valid JSON or omitted a required dimension; re-run so the gate is never read as complete.'
269
- ];
270
- default:
271
- return ['Re-run with `--llm-provider stub` to validate the CLI route without a real LLM.'];
272
- }
42
+ .option('--base <ref>', 'base ref for the pre/post baseline diff (`existing-functionality-intact`); default: merge-base with origin/HEAD, then origin/main, then origin/master, then HEAD~1 — pass this explicitly when none of those resolve')).action((rid, options) => runPrepareFinalReview(rid, options, io));
273
43
  }
44
+ // Re-export for tests / external consumers: the envelope vocabulary and the
45
+ // types this command's surface is documented with.
46
+ export { emptyFinalReviewData, isSupportedLlmProvider } from './final-review-command-shared.js';
@@ -0,0 +1,3 @@
1
+ import { type ProgramIO } from '../cli-helpers.js';
2
+ import { type PrepareFinalReviewOptions } from './final-review-command-shared.js';
3
+ export declare function runPrepareFinalReview(rid: string, options: PrepareFinalReviewOptions, io: ProgramIO): Promise<void>;
@@ -0,0 +1,200 @@
1
+ // src/cli/commands/final-review-prepare-command.ts
2
+ //
3
+ // The body of `peaks prepare-final-review`: the two input validations, the
4
+ // audit-goal path resolution, the provider check, the stub scaffold route and
5
+ // the real-provider route. Split out of `final-review-commands.ts`; every
6
+ // envelope code, message, `data` field and next-action string is unchanged.
7
+ //
8
+ // The input validations and the `_runtime` join below live in ONE module on
9
+ // purpose: rule D is file-scoped, so a join whose id slot is checked two
10
+ // modules away is a join the guard cannot see.
11
+ import { existsSync, statSync } from 'node:fs';
12
+ import { join, resolve } from 'node:path';
13
+ import { REQUEST_ID_PATTERN } from '../../services/artifacts/request-artifact-service.js';
14
+ import { createAnthropicRunner, LlmBindingError, resolveAnthropicConfig } from '../../services/llm/anthropic-runner.js';
15
+ import { prepareFinalReview } from '../../services/final-review/final-review-service.js';
16
+ import { getErrorMessage } from '../cli-helpers.js';
17
+ import { DEFAULT_LLM_PROVIDER, isSupportedLlmProvider, SUPPORTED_LLM_PROVIDERS } from './final-review-command-shared.js';
18
+ import { emitPrepareFailure, emitReviewEnvelope, emitStubEnvelope, finalReviewErrorCode, finalReviewNextActions } from './final-review-command-envelopes.js';
19
+ function validateProjectRoot(projectArg) {
20
+ const projectRoot = resolve(projectArg);
21
+ if (!existsSync(projectRoot)) {
22
+ return {
23
+ ok: false,
24
+ code: 'PROJECT_NOT_FOUND',
25
+ message: `project path does not exist: ${projectArg}`
26
+ };
27
+ }
28
+ let stat;
29
+ try {
30
+ stat = statSync(projectRoot);
31
+ }
32
+ catch (error) {
33
+ return { ok: false, code: 'INVALID_PROJECT', message: getErrorMessage(error) };
34
+ }
35
+ if (!stat.isDirectory()) {
36
+ return {
37
+ ok: false,
38
+ code: 'INVALID_PROJECT',
39
+ message: `project path is not a directory: ${projectArg}`
40
+ };
41
+ }
42
+ return { ok: true, projectRoot };
43
+ }
44
+ /**
45
+ * Validate the session id. Rejects empty, path-traversal (`..`), and
46
+ * any segment separator (`/`, `\`) so the caller cannot escape
47
+ * `.peaks/_runtime/<sessionId>/audit-goal/` via CLI flags.
48
+ */
49
+ function validateSessionId(sessionId) {
50
+ if (sessionId.length === 0) {
51
+ return {
52
+ ok: false,
53
+ code: 'MISSING_REQUIRED_FLAG',
54
+ message: '`--session-id` is required and must be a non-empty string'
55
+ };
56
+ }
57
+ if (sessionId.includes('..') || sessionId.includes('/') || sessionId.includes('\\')) {
58
+ return {
59
+ ok: false,
60
+ code: 'INVALID_SESSION_ID',
61
+ message: '`--session-id` must not contain path-traversal or path-separator characters (rejected: "..", "/", "\\")'
62
+ };
63
+ }
64
+ return { ok: true, sessionId };
65
+ }
66
+ /** The refusal for an audit goal the pre-flight did not find on disk. */
67
+ function auditGoalMissingRefusal(rid, sessionId, auditGoalPath) {
68
+ return {
69
+ rid,
70
+ code: 'AUDIT_GOAL_NOT_FOUND',
71
+ message: `audit-goal file not found at expected path: ${auditGoalPath}`,
72
+ sessionId,
73
+ auditGoalPath,
74
+ nextActions: [
75
+ 'Run `peaks audit goal --project <path> --need <text>` first to produce the approved goal JSON.',
76
+ 'Confirm `--session-id` matches the session that wrote the goal.'
77
+ ]
78
+ };
79
+ }
80
+ /**
81
+ * Resolve the audit-goal path, or the refusal that replaces it.
82
+ *
83
+ * The `rid` axis is checked HERE, at the join: the rid is the CLI positional
84
+ * and it is the FILENAME segment, so the `--session-id` validation does not
85
+ * cover it (added 2026-09-14, repair R1 — a second-slot hole, found by the
86
+ * widened rule D rather than by a human reading the file).
87
+ *
88
+ * The audit-goal existence pre-flight sits here too, so the caller learns the
89
+ * real reason its request cannot proceed BEFORE the provider check.
90
+ */
91
+ function resolveAuditGoalPath(rid, options, projectRoot) {
92
+ const sessionValidation = validateSessionId(options.sessionId);
93
+ if (!sessionValidation.ok) {
94
+ return {
95
+ rid,
96
+ code: sessionValidation.code,
97
+ message: sessionValidation.message,
98
+ sessionId: options.sessionId,
99
+ auditGoalPath: '',
100
+ nextActions: [
101
+ 'Pass a non-empty `--session-id` whose value is a single segment (no "..", "/", or "\\")'
102
+ ]
103
+ };
104
+ }
105
+ if (!REQUEST_ID_PATTERN.test(rid)) {
106
+ return {
107
+ rid,
108
+ code: 'RID_INVALID',
109
+ message: `Invalid request id: ${rid} (expected letters, digits, dots, underscores, or dashes)`,
110
+ sessionId: sessionValidation.sessionId,
111
+ auditGoalPath: '',
112
+ nextActions: ['Pass the rid of the slice, e.g. 2026-09-14-some-slug']
113
+ };
114
+ }
115
+ const auditGoalPath = join(projectRoot, '.peaks', '_runtime', sessionValidation.sessionId, 'audit-goal', `${rid}.json`);
116
+ if (!existsSync(auditGoalPath)) {
117
+ return auditGoalMissingRefusal(rid, sessionValidation.sessionId, auditGoalPath);
118
+ }
119
+ return { projectRoot, sessionId: sessionValidation.sessionId, auditGoalPath };
120
+ }
121
+ /** Resolve the three inputs the run needs, or the refusal that replaces them. */
122
+ function resolvePrepareInputs(rid, options) {
123
+ const projectValidation = validateProjectRoot(options.project);
124
+ if (!projectValidation.ok) {
125
+ return {
126
+ rid,
127
+ code: projectValidation.code,
128
+ message: projectValidation.message,
129
+ sessionId: options.sessionId,
130
+ auditGoalPath: '',
131
+ nextActions: ['Verify the project path exists and is a directory']
132
+ };
133
+ }
134
+ return resolveAuditGoalPath(rid, options, projectValidation.projectRoot);
135
+ }
136
+ function isRefusal(value) {
137
+ return !('projectRoot' in value);
138
+ }
139
+ /**
140
+ * Real provider path: bind a real `LlmRunner` and run the service.
141
+ *
142
+ * Binding happens INSIDE the try so an absent credential surfaces as
143
+ * `LlmBindingError`'s own code instead of escaping as a crash. No envelope is
144
+ * emitted on that path — a "successful" empty review would be worse than an
145
+ * error.
146
+ */
147
+ async function runRealReview(io, rid, inputs, options) {
148
+ const { json } = options;
149
+ try {
150
+ const config = resolveAnthropicConfig();
151
+ const llmRunner = createAnthropicRunner(config);
152
+ const review = await prepareFinalReview(rid, {
153
+ projectRoot: inputs.projectRoot,
154
+ sessionId: inputs.sessionId,
155
+ llmRunner,
156
+ ...(options.base === undefined ? {} : { baseRef: options.base })
157
+ });
158
+ emitReviewEnvelope(io, { rid, goal: inputs, model: config.model, review, json });
159
+ }
160
+ catch (error) {
161
+ const code = finalReviewErrorCode(error);
162
+ emitPrepareFailure(io, json, {
163
+ rid,
164
+ code,
165
+ message: getErrorMessage(error),
166
+ sessionId: inputs.sessionId,
167
+ auditGoalPath: inputs.auditGoalPath,
168
+ nextActions: finalReviewNextActions(code)
169
+ }, error instanceof LlmBindingError ? error.missingEnv : undefined);
170
+ }
171
+ }
172
+ export async function runPrepareFinalReview(rid, options, io) {
173
+ const inputs = resolvePrepareInputs(rid, options);
174
+ if (isRefusal(inputs)) {
175
+ emitPrepareFailure(io, options.json, inputs);
176
+ return;
177
+ }
178
+ // Unknown provider names fail loudly — a silent fallback to `stub` would hand
179
+ // the caller a scaffold envelope that reads as a review route, which is the
180
+ // defect class this gate exists to stop.
181
+ const provider = options.llmProvider ?? DEFAULT_LLM_PROVIDER;
182
+ if (!isSupportedLlmProvider(provider)) {
183
+ emitPrepareFailure(io, options.json, {
184
+ rid,
185
+ code: 'LLM_PROVIDER_NOT_IMPLEMENTED',
186
+ message: `LLM provider "${provider}" is not implemented. Supported providers: ${SUPPORTED_LLM_PROVIDERS.join(', ')}.`,
187
+ sessionId: inputs.sessionId,
188
+ auditGoalPath: inputs.auditGoalPath,
189
+ nextActions: [
190
+ `Re-run with \`--llm-provider anthropic\` for a real 4-dim review, or \`--llm-provider ${DEFAULT_LLM_PROVIDER}\` for an offline scaffold.`
191
+ ]
192
+ });
193
+ return;
194
+ }
195
+ if (provider === 'stub') {
196
+ emitStubEnvelope(io, rid, inputs, options.json);
197
+ return;
198
+ }
199
+ await runRealReview(io, rid, inputs, options);
200
+ }
@@ -1,18 +1,32 @@
1
1
  /**
2
+ * The `peaks contract` / `peaks classify` entry point.
2
3
  *
3
4
  * Pre-merge originals (now deleted):
4
- * - src/cli/commands/contract-commands.ts (167 lines)
5
+ * - src/cli/commands/contract-commands.ts (167 lines)
5
6
  * - src/cli/commands/classify-classify-commands.ts (190 lines)
6
7
  *
7
- * Both exported `register*Commands` functions are preserved **verbatim**
8
- * (function name, signature, body). The merge is a structural refactor
9
- * only — no behavior change. `autoRegisterAllCommands` discovers both
10
- * exports from this single file.
8
+ * Both `register*Commands` functions are preserved **verbatim** (function name,
9
+ * signature, body). The merge was a structural refactor only — no behavior
10
+ * change — and `autoRegisterAllCommands` discovers both exports from this single
11
+ * file. This module is now the entry point and no longer holds the verbs:
11
12
  *
12
- * minimum; Family 1 is the cleanest demonstration because both inputs
13
- * sit under 200 lines and the merged file lands at ~360 lines — well
13
+ * `contract-write-command.ts` `peaks contract write`
14
+ * `classify-run-command.ts` `peaks classify run`
15
+ * `classify-downgrade-command.ts` `peaks classify downgrade` (always refused)
16
+ * `classify-signals.ts` the diff signals + the audit log
14
17
  */
15
18
  import type { Command } from 'commander';
16
- import { type ProgramIO } from '../cli-helpers.js';
17
- export declare function registerContractCommands(program: Command, io: ProgramIO): void;
19
+ import type { ProgramIO } from '../cli-helpers.js';
20
+ export { registerContractCommands } from './contract-write-command.js';
21
+ /**
22
+ * peaks classify CLI (Slice L1a + L1b).
23
+ *
24
+ * Subcommands:
25
+ * - peaks classify run --project <path> [--override <level> --reason "<text>"]
26
+ * Classify the current diff via the heuristic + return a JSON envelope
27
+ * with the chosen level, gate set, and audit log.
28
+ * - peaks classify downgrade --level <level> --reason "<text>" --project <path>
29
+ * Always refused (per spec §4: "peaks classify downgrade" always errors
30
+ * out). LLM may ask; the CLI never grants.
31
+ */
18
32
  export declare function registerClassifyCommands(program: Command, io: ProgramIO): void;