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
@@ -0,0 +1,88 @@
1
+ // src/cli/commands/baseline-rollback-commands.ts
2
+ //
3
+ // `peaks baseline rollback` and `peaks baseline reset` — the two destructive
4
+ // baseline operations, both gated behind `--confirm`. Split out of
5
+ // `baseline-commands.ts`; every refusal code, message and data field is
6
+ // unchanged.
7
+ import { copyFileSync, existsSync, mkdirSync, rmSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { readBaselineFile } from '../../services/capability-baseline/store.js';
10
+ import { CURRENT_DIR, fail, HISTORY_DIR, ok } from './baseline-command-shared.js';
11
+ function runRollback(io, opts) {
12
+ const projectRoot = opts.project ?? '.';
13
+ if (opts.confirm !== true) {
14
+ fail(io, 'HUMAN_NL_DECISION_REQUIRED', 'rollback requires the user to approve via AskUserQuestion. The LLM must surface a multi-choice prompt, then re-run with --confirm.');
15
+ return;
16
+ }
17
+ if (!opts.to) {
18
+ fail(io, 'MISSING_ARG', '--to is required');
19
+ return;
20
+ }
21
+ const source = HISTORY_DIR(projectRoot, opts.to);
22
+ const from = join(source, 'capability-baseline.json');
23
+ const fromLock = join(source, 'capability-baseline.lock');
24
+ if (!existsSync(from) || !existsSync(fromLock)) {
25
+ fail(io, 'BASELINE_HISTORY_GAP', `no frozen baseline recorded for version ${opts.to}`);
26
+ return;
27
+ }
28
+ const r = readBaselineFile(projectRoot);
29
+ if (!r.ok) {
30
+ fail(io, r.error.code, r.error.message);
31
+ return;
32
+ }
33
+ mkdirSync(CURRENT_DIR(projectRoot), { recursive: true });
34
+ copyFileSync(from, join(CURRENT_DIR(projectRoot), 'capability-baseline.json'));
35
+ copyFileSync(fromLock, join(CURRENT_DIR(projectRoot), 'capability-baseline.lock'));
36
+ // Re-read through the locked store so a tampered history entry cannot be
37
+ // installed: the copy is only reported successful if it verifies.
38
+ const after = readBaselineFile(projectRoot);
39
+ if (!after.ok) {
40
+ fail(io, after.error.code, after.error.message);
41
+ return;
42
+ }
43
+ ok(io, 'baseline.rollback', {
44
+ fromVersion: r.file.version,
45
+ toVersion: after.file.version,
46
+ historyPath: source
47
+ });
48
+ }
49
+ function runReset(io, opts) {
50
+ const projectRoot = opts.project ?? '.';
51
+ if (opts.confirm !== true) {
52
+ fail(io, 'HUMAN_NL_DECISION_REQUIRED', 'reset requires the user to approve via AskUserQuestion. The LLM must surface a multi-choice prompt, then re-run with --confirm.');
53
+ return;
54
+ }
55
+ const r = readBaselineFile(projectRoot);
56
+ // A missing baseline is already "wiped" — but an unreadable one (hash
57
+ // mismatch / unsigned lock) must not be silently discarded.
58
+ if (!r.ok && r.error.code !== 'BASELINE_NOT_FOUND') {
59
+ fail(io, r.error.code, r.error.message);
60
+ return;
61
+ }
62
+ const wipedVersion = r.ok ? r.file.version : null;
63
+ rmSync(join(CURRENT_DIR(projectRoot), 'capability-baseline.json'), { force: true });
64
+ rmSync(join(CURRENT_DIR(projectRoot), 'capability-baseline.lock'), { force: true });
65
+ ok(io, 'baseline.reset', {
66
+ wipedVersion,
67
+ nextAction: 're-freeze with `baseline freeze --from <path>`'
68
+ });
69
+ }
70
+ export function registerBaselineRollbackCommand(baseline, io) {
71
+ baseline
72
+ .command('rollback')
73
+ .description("Roll the baseline back to a historical version. --confirm records the user's approval.")
74
+ .option('--to <version>', 'Historical version to roll back to')
75
+ .option('--confirm', "Record the user's approval (collected via AskUserQuestion) for this rollback")
76
+ .option('--project <path>', 'Project root', '.')
77
+ .option('--json', 'Emit JSON envelope')
78
+ .action((opts) => runRollback(io, opts));
79
+ }
80
+ export function registerBaselineResetCommand(baseline, io) {
81
+ baseline
82
+ .command('reset')
83
+ .description("Wipe the current baseline and require a re-freeze. --confirm records the user's approval.")
84
+ .option('--confirm', "Record the user's approval (collected via AskUserQuestion) for the wipe")
85
+ .option('--project <path>', 'Project root', '.')
86
+ .option('--json', 'Emit JSON envelope')
87
+ .action((opts) => runReset(io, opts));
88
+ }
@@ -0,0 +1,9 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export type ClassifyDowngradeOptions = {
4
+ project: string;
5
+ level: string;
6
+ reason: string;
7
+ json?: boolean;
8
+ };
9
+ export declare function registerClassifyDowngradeCommand(classify: Command, io: ProgramIO): void;
@@ -0,0 +1,21 @@
1
+ // src/cli/commands/classify-downgrade-command.ts
2
+ //
3
+ // `peaks classify downgrade` — REFUSED per spec §4: the CLI never downgrades a
4
+ // classification unilaterally. Extracted from
5
+ // `governance-classify-contract-commands.ts`; the registered name, description,
6
+ // options, refusal code and exit code (2) are unchanged.
7
+ import { fail } from 'peaks-loop-shared/result';
8
+ import { printResult } from '../cli-helpers.js';
9
+ export function registerClassifyDowngradeCommand(classify, io) {
10
+ classify
11
+ .command('downgrade')
12
+ .description('REFUSED per spec §4 — peaks-loop never downgrades a classification; ask the user to override explicitly')
13
+ .requiredOption('--level <level>', 'attempted level')
14
+ .requiredOption('--reason <text>', 'reason for the attempt (always rejected)')
15
+ .requiredOption('--project <path>', 'target project root')
16
+ .option('--json', 'print machine-readable JSON envelope')
17
+ .action((options) => {
18
+ printResult(io, fail('classify.downgrade', 'DOWNGRADE_REFUSED', 'peaks classify downgrade is refused per spec §4. Use --override (with reason) on `classify run` to force a level; the CLI never downgrades a classification unilaterally.', { attemptedLevel: options.level, reason: options.reason }, ['Use `peaks classify run --override <level> --reason "<text>"` instead']), options.json);
19
+ process.exitCode = 2;
20
+ });
21
+ }
@@ -0,0 +1,9 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export type ClassifyRunOptions = {
4
+ project: string;
5
+ override?: string;
6
+ reason?: string;
7
+ json?: boolean;
8
+ };
9
+ export declare function registerClassifyRunCommand(classify: Command, io: ProgramIO): void;
@@ -0,0 +1,73 @@
1
+ // src/cli/commands/classify-run-command.ts
2
+ //
3
+ // `peaks classify run` — classify the current diff (git diff HEAD) into one of
4
+ // the 5 task levels, with an optional `--override` + `--reason`. Extracted from
5
+ // `governance-classify-contract-commands.ts`; the registered name, description,
6
+ // options, refusal codes, audit write and envelope are unchanged.
7
+ //
8
+ // `loadPreferences` is synchronous, so the action is too — the merged file said
9
+ // `await loadPreferences(...)`, which `@typescript-eslint/await-thenable`
10
+ // flagged as an await of a non-Promise. Dropping the keyword pair changes no
11
+ // byte of the envelope (the equivalence harness re-measured it).
12
+ import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
13
+ import { classifyTask } from '../../services/classify/classify-service.js';
14
+ import { TASK_LEVELS } from '../../services/classify/classify-types.js';
15
+ import { loadPreferences } from '../../services/preferences/preferences-service.js';
16
+ import { addJsonOption, printResult } from '../cli-helpers.js';
17
+ import { appendAuditEntry, CLASSIFY_AUDIT_FILE, getSignalsFromGitDiff, isTaskLevel } from './classify-signals.js';
18
+ export function registerClassifyRunCommand(classify, io) {
19
+ addJsonOption(classify
20
+ .command('run')
21
+ .description('Classify the current diff (git diff HEAD) into one of 5 task levels')
22
+ .requiredOption('--project <path>', 'target project root')
23
+ .option('--override <level>', 'force a level (one of typo|bug|feature|refactor|migration); requires --reason')
24
+ .option('--reason <text>', 'reason for the override (mandatory when --override is set)')).action((options) => {
25
+ const envelope = classifyRunEnvelope(options);
26
+ printResult(io, envelope, options.json);
27
+ if (!envelope.ok)
28
+ process.exitCode = 1;
29
+ });
30
+ }
31
+ function classifyRunEnvelope(options) {
32
+ try {
33
+ const prefs = loadPreferences(options.project);
34
+ const signals = getSignalsFromGitDiff(options.project);
35
+ const override = readOverride(options);
36
+ if (override.envelope !== null)
37
+ return override.envelope;
38
+ const result = classifyTask(override.level === undefined
39
+ ? { signals, conservatism: prefs.classifyConservatism }
40
+ : {
41
+ signals,
42
+ conservatism: prefs.classifyConservatism,
43
+ override: { level: override.level, reason: override.reason }
44
+ }, prefs.classifyRules.feature_threshold_files, prefs.classifyRules.feature_threshold_lines);
45
+ appendAuditEntry(options.project, result.audit);
46
+ return ok('classify.run', result, [], [
47
+ `gate set for level "${result.level}": ${result.gateSet.stages.join(', ')}`,
48
+ `audit log: .peaks/_runtime/${CLASSIFY_AUDIT_FILE}`
49
+ ]);
50
+ }
51
+ catch (error) {
52
+ return fail('classify.run', 'CLASSIFY_RUN_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Run peaks classify --help for usage']);
53
+ }
54
+ }
55
+ /** The two refusals `--override` / `--reason` can earn, in the order they fire. */
56
+ function readOverride(options) {
57
+ const empty = { level: undefined, reason: '', envelope: null };
58
+ if (options.override === undefined)
59
+ return empty;
60
+ if (!isTaskLevel(options.override)) {
61
+ return {
62
+ ...empty,
63
+ envelope: fail('classify.run', 'INVALID_LEVEL', `level must be one of: ${TASK_LEVELS.join(', ')}`, { provided: options.override }, ['Pass one of typo, bug, feature, refactor, migration'])
64
+ };
65
+ }
66
+ if (options.reason === undefined || options.reason.length === 0) {
67
+ return {
68
+ ...empty,
69
+ envelope: fail('classify.run', 'REASON_REQUIRED', '--reason is required when --override is set', {}, ['Provide a non-empty reason for the override'])
70
+ };
71
+ }
72
+ return { level: options.override, reason: options.reason, envelope: null };
73
+ }
@@ -0,0 +1,5 @@
1
+ import { type ClassifySignals, type TaskLevel } from '../../services/classify/classify-types.js';
2
+ export declare const CLASSIFY_AUDIT_FILE = "classify-audit.jsonl";
3
+ export declare function getSignalsFromGitDiff(projectRoot: string): ClassifySignals;
4
+ export declare function appendAuditEntry(projectRoot: string, entry: unknown): void;
5
+ export declare function isTaskLevel(value: string): value is TaskLevel;
@@ -0,0 +1,104 @@
1
+ // src/cli/commands/classify-signals.ts
2
+ //
3
+ // What `peaks classify` reads and writes outside its own envelope: the diff
4
+ // signals the heuristic classifies, the audit-log append, and the task-level
5
+ // guard. Extracted from `governance-classify-contract-commands.ts` (which had
6
+ // merged `classify-classify-commands.ts` verbatim); the parsing, the audit file
7
+ // name and the level guard are unchanged.
8
+ //
9
+ // `child_process` is a static import here rather than the CJS `require` the
10
+ // merged file used inside `getSignalsFromGitDiff`: the module specifier is a
11
+ // Node builtin, so a top-level import cannot fail where the `require` could, and
12
+ // the call itself — arguments, `windowsHide`, and the zeros fallback when git is
13
+ // unavailable — is byte-for-byte the same.
14
+ import { execFileSync } from 'node:child_process';
15
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
16
+ import { join } from 'node:path';
17
+ import { TASK_LEVELS } from '../../services/classify/classify-types.js';
18
+ export const CLASSIFY_AUDIT_FILE = 'classify-audit.jsonl';
19
+ export function getSignalsFromGitDiff(projectRoot) {
20
+ // Use git diff --stat to extract file count + line count. Fall back to
21
+ // zeros if git is unavailable (e.g. fresh repo with no commits).
22
+ let stdout;
23
+ try {
24
+ stdout = execFileSync('git', ['diff', '--shortstat', 'HEAD'], {
25
+ cwd: projectRoot,
26
+ stdio: ['ignore', 'pipe', 'ignore'],
27
+ maxBuffer: 32 * 1024 * 1024,
28
+ windowsHide: true
29
+ }).toString('utf8');
30
+ }
31
+ catch {
32
+ return {
33
+ filesChanged: 0,
34
+ linesChanged: 0,
35
+ touchesDependencies: false,
36
+ touchesMigrationScripts: false,
37
+ isPureRefactor: true,
38
+ keywords: []
39
+ };
40
+ }
41
+ const lines = stdout.split('\n').filter((l) => l.trim().length > 0);
42
+ const filesChanged = lines.length;
43
+ let added = 0;
44
+ let removed = 0;
45
+ let touchesDependencies = false;
46
+ let touchesMigrationScripts = false;
47
+ for (const line of lines) {
48
+ const match = /(\d+)\s+insertion.*?(\d+)\s+deletion/.exec(line);
49
+ if (match) {
50
+ added += Number(match[1]);
51
+ removed += Number(match[2]);
52
+ }
53
+ if (/(package\.json|pnpm-lock\.yaml|yarn\.lock|requirements\.txt|go\.mod)/.test(line)) {
54
+ touchesDependencies = true;
55
+ }
56
+ if (/(migrate|codemod|backfill|schema)/.test(line)) {
57
+ touchesMigrationScripts = true;
58
+ }
59
+ }
60
+ // isPureRefactor: heuristic — if added lines / removed lines < 0.1 OR
61
+ // no new exports were added, treat as refactor. For L2.2 the signal is
62
+ // binary (true/false). Default: true (no behavior change is the safe
63
+ // assumption; flip to false when keyword 'add' / 'new' / 'feature' present).
64
+ const isPureRefactor = true;
65
+ return {
66
+ filesChanged,
67
+ linesChanged: added + removed,
68
+ touchesDependencies,
69
+ touchesMigrationScripts,
70
+ isPureRefactor,
71
+ keywords: []
72
+ };
73
+ }
74
+ export function appendAuditEntry(projectRoot, entry) {
75
+ const auditDir = join(projectRoot, '.peaks/_runtime');
76
+ if (!existsSync(auditDir)) {
77
+ try {
78
+ mkdirSync(auditDir, { recursive: true });
79
+ }
80
+ catch {
81
+ /* ignore */
82
+ } // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
83
+ }
84
+ const auditPath = join(auditDir, CLASSIFY_AUDIT_FILE);
85
+ let body = '';
86
+ try {
87
+ if (existsSync(auditPath)) {
88
+ body = readFileSync(auditPath, 'utf8');
89
+ }
90
+ }
91
+ catch {
92
+ /* ignore */
93
+ } // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
94
+ body += JSON.stringify(entry) + '\n';
95
+ try {
96
+ writeFileSync(auditPath, body);
97
+ }
98
+ catch {
99
+ /* best-effort */
100
+ } // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
101
+ }
102
+ export function isTaskLevel(value) {
103
+ return TASK_LEVELS.includes(value);
104
+ }
@@ -1,6 +1,6 @@
1
1
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
2
2
  import { fail, ok } from 'peaks-loop-shared/result';
3
- import { evaluateEmitHandoff, JOB_NOT_INITIALIZED, JOB_REMAINING_BLOCKED } from '../../services/code/emit-handoff.js';
3
+ import { evaluateEmitHandoff, JOB_COMPLETED_NO_SEDIMENT, JOB_NOT_INITIALIZED, JOB_REMAINING_BLOCKED } from '../../services/code/emit-handoff.js';
4
4
  import { readActiveSid } from './code-runtime-session.js';
5
5
  export function registerCodeEmitHandoffCommand(code, io) {
6
6
  // v3.1.2 Step 11 / final handoff — Size-fear ban.
@@ -13,7 +13,9 @@ export function registerCodeEmitHandoffCommand(code, io) {
13
13
  .requiredOption('--project <path>', 'target project root')
14
14
  .option('--session-id <sid>', 'override session id (default: read from active presence)')
15
15
  .option('--job-id <jid>', 'override job id (default: read from job-shape.json decision.suggestedJobId)')
16
- .option('--force-under-job', 'override the remaining>0 block (explicit user approval required)')).action((opts) => runEmitHandoff(opts, io));
16
+ .option('--force-under-job', 'override the remaining>0 block (explicit user approval required)')
17
+ .option('--force-no-sediment <reason>', 'override the no-sediment block on a COMPLETED Job: supply the reason the ' +
18
+ 'user approved a no-sediment outcome. A blank reason does not override.')).action((opts) => runEmitHandoff(opts, io));
17
19
  }
18
20
  function runEmitHandoff(opts, io) {
19
21
  try {
@@ -30,6 +32,8 @@ function runEmitHandoff(opts, io) {
30
32
  evalInput.jobId = opts.jobId;
31
33
  if (opts.forceUnderJob === true)
32
34
  evalInput.forceUnderJob = true;
35
+ if (opts.forceNoSediment !== undefined)
36
+ evalInput.forceNoSedimentReason = opts.forceNoSediment;
33
37
  const verdict = evaluateEmitHandoff(evalInput);
34
38
  reportEmitHandoffVerdict(verdict, io, opts.json);
35
39
  }
@@ -54,7 +58,15 @@ function reportEmitHandoffVerdict(verdict, io, json) {
54
58
  printEmitHandoffBlockNotInitialized(verdict, io, json);
55
59
  return;
56
60
  }
57
- printEmitHandoffBlockRemaining(verdict, io, json);
61
+ if (verdict.kind === 'block-remaining') {
62
+ printEmitHandoffBlockRemaining(verdict, io, json);
63
+ return;
64
+ }
65
+ if (verdict.kind === 'allow-forced-no-sediment') {
66
+ printEmitHandoffAllowForcedNoSediment(verdict, io, json);
67
+ return;
68
+ }
69
+ printEmitHandoffBlockNoSediment(verdict, io, json);
58
70
  }
59
71
  function printEmitHandoffNoSession(io, json) {
60
72
  const envelope = ok('code.emit-handoff', { allow: true, mode: 'no-session' }, [], ['No active session id; gate passes through (single-rid mode).']);
@@ -91,6 +103,31 @@ function printEmitHandoffBlockRemaining(verdict, io, json) {
91
103
  printResult(io, envelope, json);
92
104
  process.exitCode = 1;
93
105
  }
106
+ function printEmitHandoffAllowForcedNoSediment(verdict, io, json) {
107
+ const envelope = ok('code.emit-handoff', {
108
+ allow: true,
109
+ mode: 'job-forced-no-sediment',
110
+ remaining: verdict.remaining,
111
+ sedimentState: verdict.sedimentState,
112
+ approvedNoSedimentReason: verdict.reason
113
+ }, [], [
114
+ `Job is complete (remaining=0) and the session sedimented no memory (${verdict.sedimentState}); the user explicitly approved a no-sediment outcome — "${verdict.reason}". Handoff allowed.`
115
+ ]);
116
+ printResult(io, envelope, json);
117
+ }
118
+ function printEmitHandoffBlockNoSediment(verdict, io, json) {
119
+ const why = verdict.sedimentState === 'none'
120
+ ? 'the session sedimented no memory'
121
+ : 'the memory index could not be read, so it cannot be shown that the session sedimented any memory';
122
+ const blockMessage = `BLOCKED: Job ${verdict.jobId} is complete (remaining=0) but ${why}. Step 11 requires at least one memory in the project memory store, or an explicit user-approved no-sediment outcome. Run \`peaks memory extract --apply\` (or record a non-handoff memory with the user's help), then re-run.`;
123
+ const envelope = fail('code.emit-handoff', JOB_COMPLETED_NO_SEDIMENT, blockMessage, { jobId: verdict.jobId, sedimentState: verdict.sedimentState }, [
124
+ 'Sediment the session: run `peaks memory extract --project <root> --artifact .peaks/_runtime/<sessionId>/txt/handoff.md --apply --json`, then `peaks memory reindex --project <root> --apply --json`.',
125
+ 'Ask the user whether a no-sediment outcome is acceptable; only then re-run with `--force-no-sediment "<the reason the user gave>"`.'
126
+ ]);
127
+ io.stderr(`${blockMessage}\n`);
128
+ printResult(io, envelope, json);
129
+ process.exitCode = 1;
130
+ }
94
131
  function reportEmitHandoffFailure(io, err, json) {
95
132
  printResult(io, fail('code.emit-handoff', 'EMIT_HANDOFF_FAILED', getErrorMessage(err), null, [
96
133
  'Verify the project path and try again'
@@ -41,14 +41,19 @@ function runGateStep08(opts, io) {
41
41
  printGateStep08AllowSingle(context, io, opts.json);
42
42
  return;
43
43
  }
44
- // block-missing-decision
45
- if (verdict.promptHit) {
46
- // Block: backup regex hit. Exit code 2 is the load-bearing
47
- // signal for the PreToolUse hook.
44
+ if (verdict.kind === 'block-missing-decision') {
45
+ // Block: the prompt matched the backup regex, so the LLM is treated as
46
+ // having skipped `peaks code detect-job` on a Job-shaped request.
47
+ // Exit code 2 is the load-bearing signal for the PreToolUse hook.
48
48
  printGateStep08Blocked(verdict, context, io, opts.json);
49
49
  return;
50
50
  }
51
- // No decision + no regex hit → allow.
51
+ if (verdict.kind === 'block-no-decision-with-ledger') {
52
+ printGateStep08BlockedWithLedger(verdict, context, io, opts.json);
53
+ return;
54
+ }
55
+ // allow-no-decision-recorded — no decision and no ledger. This is a
56
+ // normal non-Job session and the gate must let it through.
52
57
  printGateStep08Undecided(verdict, context, io, opts.json);
53
58
  }
54
59
  catch (err) {
@@ -118,6 +123,20 @@ function printGateStep08Blocked(verdict, context, io, json) {
118
123
  printResult(io, envelope, json);
119
124
  process.exitCode = 2;
120
125
  }
126
+ function printGateStep08BlockedWithLedger(verdict, context, io, json) {
127
+ const blockMessage = `BLOCKED: ${verdict.reason}`;
128
+ const envelope = fail('code.gate-step-08', 'STEP_08_BLOCKED_WITH_LEDGER', blockMessage, {
129
+ ledgerJobIds: verdict.ledgerJobIds,
130
+ backupRegex: STEP_08_BACKUP_REGEX.toString()
131
+ }, [
132
+ 'Run `peaks code detect-job --is-job true --rationale <text> --suggested-job-id <slug>` (or `--is-job false`) to record the Job-shape verdict the Job ledger presumes.',
133
+ 'Then re-run the Bash tool call.',
134
+ ...context.hintActions
135
+ ]);
136
+ io.stderr(`${blockMessage}\n`);
137
+ printResult(io, envelope, json);
138
+ process.exitCode = 2;
139
+ }
121
140
  function printGateStep08Undecided(verdict, context, io, json) {
122
141
  const envelope = ok('code.gate-step-08', {
123
142
  allow: true,
@@ -125,10 +144,7 @@ function printGateStep08Undecided(verdict, context, io, json) {
125
144
  decision: null,
126
145
  nextSlice: null,
127
146
  promptSource: verdict.promptSource
128
- }, [], [
129
- 'No job-shape.json AND no backup-regex match on prompt → allow (most prompts are not Job-shaped).',
130
- ...context.hintActions
131
- ]);
147
+ }, [], [verdict.reason, ...context.hintActions]);
132
148
  printResult(io, envelope, json);
133
149
  }
134
150
  function reportGateStep08Failure(io, err, json) {
@@ -0,0 +1,22 @@
1
+ import { type Command } from 'commander';
2
+ import type { CommonCodegraphOptions } from './codegraph-command-runtime.js';
3
+ export interface CodegraphIndexOptions extends CommonCodegraphOptions {
4
+ force?: boolean;
5
+ quiet?: boolean;
6
+ }
7
+ export interface CodegraphQueryOptions extends CommonCodegraphOptions {
8
+ json?: boolean;
9
+ limit?: number;
10
+ }
11
+ export interface CodegraphFilesOptions extends CommonCodegraphOptions {
12
+ json?: boolean;
13
+ maxDepth?: number;
14
+ }
15
+ export interface CodegraphAffectedOptions extends CommonCodegraphOptions {
16
+ json?: boolean;
17
+ rid?: string;
18
+ writeEnvelope?: boolean;
19
+ }
20
+ export declare function addPeaksJsonOption(command: Command): Command;
21
+ export declare function addProjectOption(command: Command): Command;
22
+ export declare function parsePositiveInteger(value: string): number;
@@ -0,0 +1,22 @@
1
+ // src/cli/commands/codegraph-command-options.ts
2
+ //
3
+ // The option shapes every `peaks codegraph <verb>` shares, plus the three
4
+ // option-attaching helpers. Split out of `codegraph-commands.ts` so each verb
5
+ // group can live in its own module without re-declaring them.
6
+ import { InvalidArgumentError } from 'commander';
7
+ export function addPeaksJsonOption(command) {
8
+ return command.option('--peaks-json', 'print Peaks error envelope as machine-readable JSON');
9
+ }
10
+ export function addProjectOption(command) {
11
+ return addPeaksJsonOption(command.requiredOption('--project <path>', 'target project root'));
12
+ }
13
+ export function parsePositiveInteger(value) {
14
+ if (!/^\d+$/.test(value)) {
15
+ throw new InvalidArgumentError('must be a positive integer');
16
+ }
17
+ const parsed = Number(value);
18
+ if (!Number.isSafeInteger(parsed) || parsed < 1) {
19
+ throw new InvalidArgumentError('must be a positive integer');
20
+ }
21
+ return parsed;
22
+ }
@@ -1,5 +1,5 @@
1
- import { Command } from 'commander';
2
- import { type ProgramIO } from '../cli-helpers.js';
1
+ import type { Command } from 'commander';
2
+ import type { ProgramIO } from '../cli-helpers.js';
3
3
  export { rewriteBareCodegraphHints } from './codegraph-command-runtime.js';
4
4
  export { attributeUpstreamUpToDateLine } from './codegraph-status-command.js';
5
5
  export declare function registerCodegraphCommands(program: Command, io: ProgramIO): void;