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,47 @@
1
+ import type { CrystallizationService, CrystallizationTrigger, EvidenceBrief } from '../../services/crystallization/index.js';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export type CrystallizeOptions = {
4
+ fromTask: string;
5
+ loopId: string;
6
+ loopName: string;
7
+ loopScenario: string;
8
+ loopTriggerPolicy: string;
9
+ loopInteractionPolicy: string;
10
+ loopFeedbackPolicy: string;
11
+ loopEvolutionPolicy: string;
12
+ loopSuccessCriterion: string[];
13
+ loopEvaluatorPolicy: string[];
14
+ loopVersion: string;
15
+ beeName: string;
16
+ beeVersion: string;
17
+ beeDescription: string;
18
+ beeRelationReason: string;
19
+ briefWhatHappened: string;
20
+ briefWhyItMatters: string;
21
+ briefWhatLearned: string;
22
+ briefWhatAction: string;
23
+ briefBullet: string[];
24
+ sourceTrace: string[];
25
+ evaluatorSummary?: string;
26
+ userDecisionSummary?: string;
27
+ beeIntentRaw?: string;
28
+ beeParentVersion?: string;
29
+ beeChangelog?: string;
30
+ trigger: string;
31
+ project?: string;
32
+ json?: boolean;
33
+ };
34
+ /** The four brief sections as the caller supplied them. */
35
+ export declare function briefFromOptions(options: CrystallizeOptions): Record<string, string>;
36
+ export declare function buildCrystallizePayload(options: CrystallizeOptions, brief: EvidenceBrief, trigger: CrystallizationTrigger): Parameters<CrystallizationService['crystallize']>[0];
37
+ export declare function printCrystallizeResult(io: ProgramIO, recommendation: {
38
+ payload: {
39
+ brief: unknown;
40
+ bullets: unknown;
41
+ source_trace_pointers: unknown;
42
+ evaluator_summary: unknown;
43
+ };
44
+ }, result: {
45
+ loop_release_id: string;
46
+ crystallization_event_id: string;
47
+ }, json: boolean | undefined): void;
@@ -0,0 +1,85 @@
1
+ // src/cli/commands/asset-crystallize-payload.ts
2
+ //
3
+ // The `asset.crystallize` payload and success envelope: the options shape the
4
+ // verb's registration fills in, the three builders that turn it into the
5
+ // service argument, and the printer for a completed crystallization. Split out
6
+ // of `asset-crystallize-command.ts` so no single module carries both halves.
7
+ import { printResult } from '../cli-helpers.js';
8
+ import { ok } from 'peaks-loop-shared/result';
9
+ /** The four brief sections as the caller supplied them. */
10
+ export function briefFromOptions(options) {
11
+ return {
12
+ what_happened: options.briefWhatHappened,
13
+ why_it_matters: options.briefWhyItMatters,
14
+ what_learned: options.briefWhatLearned,
15
+ what_action: options.briefWhatAction
16
+ };
17
+ }
18
+ function buildLoopInput(options) {
19
+ return {
20
+ id: options.loopId,
21
+ name: options.loopName,
22
+ scenario: options.loopScenario,
23
+ trigger_policy: options.loopTriggerPolicy,
24
+ success_criteria: options.loopSuccessCriterion,
25
+ interaction_policy: options.loopInteractionPolicy,
26
+ feedback_policy: options.loopFeedbackPolicy,
27
+ evolution_policy: options.loopEvolutionPolicy,
28
+ evaluator_policy: options.loopEvaluatorPolicy,
29
+ linked_bees: [],
30
+ run_history: [],
31
+ crystallization_evidence: [],
32
+ lifecycle_status: 'candidate',
33
+ version: options.loopVersion
34
+ };
35
+ }
36
+ function buildBeeInput(options) {
37
+ return {
38
+ bee_name: options.beeName,
39
+ version: options.beeVersion,
40
+ description: options.beeDescription,
41
+ ...(options.beeIntentRaw !== undefined ? { user_intent_raw: options.beeIntentRaw } : {}),
42
+ ...(options.beeParentVersion !== undefined ? { parent_version: options.beeParentVersion } : {}),
43
+ ...(options.beeChangelog !== undefined ? { changelog: options.beeChangelog } : {})
44
+ };
45
+ }
46
+ export function buildCrystallizePayload(options, brief, trigger) {
47
+ return {
48
+ task: {
49
+ task_id: options.fromTask,
50
+ task_status: 'completed',
51
+ gates_passed: true,
52
+ evidence_collected: true
53
+ },
54
+ loop_input: buildLoopInput(options),
55
+ bee_input: buildBeeInput(options),
56
+ bee_relation_reason: options.beeRelationReason,
57
+ evidence_brief: brief,
58
+ evidence_bullets: options.briefBullet ?? [],
59
+ source_trace_pointers: options.sourceTrace ?? [],
60
+ ...(options.evaluatorSummary !== undefined
61
+ ? { evaluator_summary: options.evaluatorSummary }
62
+ : {}),
63
+ ...(options.userDecisionSummary !== undefined
64
+ ? { user_decision_summary: options.userDecisionSummary }
65
+ : {}),
66
+ trigger
67
+ };
68
+ }
69
+ export function printCrystallizeResult(io, recommendation, result, json) {
70
+ printResult(io, ok('asset.crystallize', {
71
+ recommendation: {
72
+ brief: recommendation.payload.brief,
73
+ bullets: recommendation.payload.bullets,
74
+ source_trace_pointers: recommendation.payload.source_trace_pointers,
75
+ evaluator_summary: recommendation.payload.evaluator_summary
76
+ },
77
+ result,
78
+ nextActions: [
79
+ `Run \`peaks loop show --loop ${result.loop_release_id}\` to inspect the new loop_release.`,
80
+ `Run \`peaks asset dispose --crystallization-event ${result.crystallization_event_id} --mode trace_only\` to retire the event without touching the asset.`
81
+ ]
82
+ }, [], [
83
+ 'The CLI has surfaced a complete 4-section brief; the LLM should now drive the user through AskUserQuestion picks (spec §5.3).'
84
+ ]), json);
85
+ }
@@ -0,0 +1,3 @@
1
+ import { type ProgramIO } from '../cli-helpers.js';
2
+ import { type CrystallizeOptions } from './asset-crystallize-payload.js';
3
+ export declare function runAssetCrystallize(io: ProgramIO, options: CrystallizeOptions): Promise<void>;
@@ -0,0 +1,133 @@
1
+ // src/cli/commands/asset-crystallize-runner.ts
2
+ //
3
+ // The `asset.crystallize` action body and its failure envelopes. Split out of
4
+ // `asset-crystallize-command.ts`; every error code, message and next-action
5
+ // list is unchanged, including the rethrow of an error class the verb does not
6
+ // handle itself.
7
+ import { CrystallizationIntegrityError, BriefSectionError, safeRenderRecommendationPayload, CRYSTALLIZATION_TRIGGERS, parseEvidenceBrief } from '../../services/crystallization/index.js';
8
+ import { printResult } from '../cli-helpers.js';
9
+ import { fail } from 'peaks-loop-shared/result';
10
+ import { createCrystallizationService, openAssetDb, parseTriggerFlag, resolveAssetProjectRoot } from './asset-command-shared.js';
11
+ import { briefFromOptions, buildCrystallizePayload, printCrystallizeResult } from './asset-crystallize-payload.js';
12
+ function failCrystallize(io, failure) {
13
+ printResult(io, fail('asset.crystallize', failure.code, failure.message, failure.data, failure.nextActions), failure.json);
14
+ process.exitCode = 1;
15
+ }
16
+ function printInvalidTrigger(io, options) {
17
+ failCrystallize(io, {
18
+ code: 'ASSET_INVALID_TRIGGER',
19
+ message: `--trigger must be one of: ${CRYSTALLIZATION_TRIGGERS.join('|')}`,
20
+ data: { trigger: options.trigger },
21
+ nextActions: ['Pass a valid --trigger value.'],
22
+ json: options.json
23
+ });
24
+ }
25
+ function printMissingBrief(io, err, candidateBrief, json) {
26
+ const briefErr = err;
27
+ failCrystallize(io, {
28
+ code: 'MISSING_BRIEF_SECTION',
29
+ message: briefErr.message,
30
+ data: { findings: [...briefErr.findings], flagsProvided: Object.keys(candidateBrief) },
31
+ nextActions: [
32
+ 'Pass ALL FOUR brief sections via --brief-what-happened / --brief-why-it-matters / --brief-what-learned / --brief-what-action.',
33
+ 'The CLI refuses to render a recommendation without a complete 4-section brief (spec §4.7 / RL-7).'
34
+ ],
35
+ json
36
+ });
37
+ }
38
+ function printRecommendationRejected(io, recommendation, candidateBrief, json) {
39
+ failCrystallize(io, {
40
+ code: recommendation.code ?? 'MISSING_BRIEF_SECTION',
41
+ message: 'recommendation envelope rejected — brief is missing one of its 4 sections',
42
+ data: { findings: recommendation.findings, briefProvided: candidateBrief },
43
+ nextActions: [
44
+ 'Pass ALL FOUR brief sections via the matching CLI flags.',
45
+ 'Counts in --brief-bullet may support the brief; they do NOT replace it (spec §4.7 / RL-7).'
46
+ ],
47
+ json
48
+ });
49
+ }
50
+ /** Terminal failures from the service. Anything else is rethrown, as before. */
51
+ function handleCrystallizeError(io, err, json) {
52
+ if (err instanceof CrystallizationIntegrityError) {
53
+ const integrityErr = err;
54
+ failCrystallize(io, {
55
+ code: integrityErr.code,
56
+ message: integrityErr.message,
57
+ data: { findings: [...integrityErr.findings] },
58
+ nextActions: [
59
+ integrityErr.code === 'CRYSTALLIZATION_PRE_RUN'
60
+ ? 'Re-shape the candidate task so task_status=completed AND gates_passed=true AND evidence_collected=true (spec §5 / RL-2).'
61
+ : integrityErr.code === 'MISSING_BRIEF_SECTION'
62
+ ? 'Pass ALL FOUR brief sections (RL-7); the CLI refuses to render a recommendation without them.'
63
+ : 'Inspect the failure findings and re-shape the payload.'
64
+ ],
65
+ json
66
+ });
67
+ return;
68
+ }
69
+ if (err instanceof BriefSectionError) {
70
+ const briefErr = err;
71
+ failCrystallize(io, {
72
+ code: 'MISSING_BRIEF_SECTION',
73
+ message: briefErr.message,
74
+ data: { findings: [...briefErr.findings] },
75
+ nextActions: ['Pass all 4 brief sections (RL-7).'],
76
+ json
77
+ });
78
+ return;
79
+ }
80
+ throw err;
81
+ }
82
+ export async function runAssetCrystallize(io, options) {
83
+ try {
84
+ const trigger = parseTriggerFlag(options.trigger);
85
+ if (!trigger) {
86
+ printInvalidTrigger(io, options);
87
+ return;
88
+ }
89
+ // Build the brief from CLI flags and re-validate it through
90
+ // the canonical schema (so a partial brief is caught BEFORE
91
+ // any DB side effects fire).
92
+ const candidateBrief = briefFromOptions(options);
93
+ let brief;
94
+ try {
95
+ brief = parseEvidenceBrief(candidateBrief);
96
+ }
97
+ catch (err) {
98
+ if (err instanceof BriefSectionError) {
99
+ printMissingBrief(io, err, candidateBrief, options.json);
100
+ return;
101
+ }
102
+ throw err;
103
+ }
104
+ // Render the recommendation envelope up-front so the CLI can
105
+ // refuse to write if any brief section is missing. This is
106
+ // the same code path the crystallization service uses.
107
+ const recommendation = safeRenderRecommendationPayload({
108
+ brief,
109
+ bullets: options.briefBullet ?? [],
110
+ source_trace_pointers: options.sourceTrace ?? [],
111
+ evaluator_summary: {
112
+ one_liner: options.evaluatorSummary ?? '',
113
+ risk_tags: []
114
+ }
115
+ });
116
+ if (!recommendation.ok) {
117
+ printRecommendationRejected(io, recommendation, candidateBrief, options.json);
118
+ return;
119
+ }
120
+ const db = openAssetDb(resolveAssetProjectRoot(options.project));
121
+ try {
122
+ const svc = createCrystallizationService(db);
123
+ const result = svc.crystallize(buildCrystallizePayload(options, brief, trigger));
124
+ printCrystallizeResult(io, recommendation, result, options.json);
125
+ }
126
+ finally {
127
+ db.close();
128
+ }
129
+ }
130
+ catch (err) {
131
+ handleCrystallizeError(io, err, options.json);
132
+ }
133
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerAssetDisposeCommand(asset: Command, io: ProgramIO): void;
@@ -0,0 +1,99 @@
1
+ // src/cli/commands/asset-dispose-command.ts
2
+ //
3
+ // `peaks asset dispose` — trace-only / retain / destroy. Split out of
4
+ // `asset-commands.ts`; the verb name, its options, the envelope shape and
5
+ // every error code are unchanged.
6
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
7
+ import { fail, ok } from 'peaks-loop-shared/result';
8
+ import { DISPOSE_MODES, createCrystallizationService, openAssetDb, resolveAssetProjectRoot } from './asset-command-shared.js';
9
+ function printInvalidDisposeMode(io, options) {
10
+ printResult(io, fail('asset.dispose', 'ASSET_INVALID_MODE', `--mode must be one of: ${DISPOSE_MODES.join('|')}`, { mode: options.mode }, ['Pass --mode trace_only / retain / destroy.']), options.json);
11
+ process.exitCode = 1;
12
+ }
13
+ function printDisposeEventNotFound(io, options) {
14
+ printResult(io, fail('asset.dispose', 'ASSET_EVENT_NOT_FOUND', `crystallization event '${options.crystallizationEvent}' not found`, { eventId: options.crystallizationEvent }, ['Verify the event id.']), options.json);
15
+ process.exitCode = 1;
16
+ }
17
+ /** `retain` → no DB change; the user wants to keep the event as evidence. */
18
+ function printDisposeRetained(io, existing, mode, json) {
19
+ printResult(io, ok('asset.dispose', {
20
+ crystallization_event_id: existing.id,
21
+ mode,
22
+ lifecycle_status: existing.lifecycle_status,
23
+ note: 'no DB change; event retained as-is'
24
+ }, [], ['Run `peaks asset status --loop <id>` to inspect the lifecycle state of the linked assets.']), json);
25
+ }
26
+ /**
27
+ * `destroy` → retire the created/updated loop_release rows as well. We do NOT
28
+ * delete rows — retirement is a status flip (spec §5.6).
29
+ */
30
+ function retireLinkedLoops(db, updated) {
31
+ const retireLoop = db.prepare("UPDATE loop_release SET lifecycle_status = 'retired' WHERE id IN (?, ?)");
32
+ const ids = [
33
+ updated.created_loop_release_id ?? null,
34
+ updated.updated_loop_release_id ?? null
35
+ ].filter((x) => x !== null);
36
+ for (const id of ids) {
37
+ retireLoop.run(id, id);
38
+ }
39
+ }
40
+ function printDisposeResult(io, outcome, json) {
41
+ printResult(io, ok('asset.dispose', {
42
+ crystallization_event_id: outcome.existing.id,
43
+ mode: outcome.mode,
44
+ lifecycle_status: outcome.updated?.lifecycle_status ?? 'retired',
45
+ retired_assets: outcome.mode === 'destroy' ? 'loop_release retired (no rows deleted)' : 'none',
46
+ nextActions: ['Run `peaks asset status` to confirm the lifecycle transition.']
47
+ }, [], []), json);
48
+ }
49
+ function printDisposeFailure(io, err, options) {
50
+ printResult(io, fail('asset.dispose', 'ASSET_DISPOSE_FAILED', getErrorMessage(err), { eventId: options.crystallizationEvent }, ['Verify the event id and --mode flag.']), options.json);
51
+ process.exitCode = 1;
52
+ }
53
+ async function runAssetDispose(io, options) {
54
+ try {
55
+ if (!DISPOSE_MODES.includes(options.mode)) {
56
+ printInvalidDisposeMode(io, options);
57
+ return;
58
+ }
59
+ const mode = options.mode;
60
+ const db = openAssetDb(resolveAssetProjectRoot(options.project));
61
+ try {
62
+ const svc = createCrystallizationService(db);
63
+ const existing = svc.read(options.crystallizationEvent);
64
+ if (!existing) {
65
+ printDisposeEventNotFound(io, options);
66
+ return;
67
+ }
68
+ // trace_only → retire the event row; the source traces are
69
+ // untouched (workflow traces are immutable per spec §4.3).
70
+ // retain → no DB change; the user wants to keep the event
71
+ // as historical evidence.
72
+ // destroy → retire the event + retire the created/updated
73
+ // assets (no asset delete; retirement only).
74
+ if (mode === 'retain') {
75
+ printDisposeRetained(io, existing, mode, options.json);
76
+ return;
77
+ }
78
+ const updated = svc.updateStatus(existing.id, 'retired');
79
+ if (mode === 'destroy' && updated) {
80
+ retireLinkedLoops(db, updated);
81
+ }
82
+ printDisposeResult(io, { existing, mode, updated }, options.json);
83
+ }
84
+ finally {
85
+ db.close();
86
+ }
87
+ }
88
+ catch (err) {
89
+ printDisposeFailure(io, err, options);
90
+ }
91
+ }
92
+ export function registerAssetDisposeCommand(asset, io) {
93
+ addJsonOption(asset
94
+ .command('dispose')
95
+ .description('M5: dispose a crystallization event. mode=trace_only retires the event but keeps the trace; mode=retain keeps both; mode=destroy retires the event and marks the created/updated assets retired.')
96
+ .requiredOption('--crystallization-event <id>', 'the crystallization event id (returned by `peaks asset crystallize`)')
97
+ .requiredOption('--mode <mode>', `dispose mode (one of: ${DISPOSE_MODES.join('|')}; default: trace_only)`, 'trace_only')
98
+ .option('--project <path>', 'project root (default: cwd)')).action((options) => runAssetDispose(io, options));
99
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerAssetStatusCommand(asset: Command, io: ProgramIO): void;
@@ -0,0 +1,100 @@
1
+ // src/cli/commands/asset-status-command.ts
2
+ //
3
+ // `peaks asset status` — loop + bee lifecycle state plus the crystallization
4
+ // events that reference them. Split out of `asset-commands.ts`; the verb name,
5
+ // its options and the envelope shape are unchanged.
6
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
7
+ import { fail, ok } from 'peaks-loop-shared/result';
8
+ import { createCrystallizationService, openAssetDb, resolveAssetProjectRoot } from './asset-command-shared.js';
9
+ /** The events a `--loop` filter selects, deduplicated by id; all of them otherwise. */
10
+ function collectEvents(svc, loop) {
11
+ if (!loop) {
12
+ return svc.list();
13
+ }
14
+ const events = [
15
+ ...svc.list({ created_loop_release_id: loop }),
16
+ ...svc.list({ updated_loop_release_id: loop })
17
+ ];
18
+ // Deduplicate by id.
19
+ const seen = new Set();
20
+ return events.filter((e) => {
21
+ const key = e?.id ?? '';
22
+ if (!key || seen.has(key))
23
+ return false;
24
+ seen.add(key);
25
+ return true;
26
+ });
27
+ }
28
+ /**
29
+ * Companion query: loop lifecycle counts. We compute from the DB so the CLI is
30
+ * the single source of truth.
31
+ */
32
+ function collectLoopCounts(db) {
33
+ const rows = db
34
+ .prepare('SELECT lifecycle_status, COUNT(*) AS n FROM loop_release GROUP BY lifecycle_status')
35
+ .all();
36
+ return rows.reduce((acc, r) => {
37
+ acc[r.lifecycle_status] = r.n;
38
+ return acc;
39
+ }, {});
40
+ }
41
+ /** Companion query: bee lifecycle counts, narrowed by `--bee` when given. */
42
+ function collectBeeCounts(db, bee) {
43
+ const rows = db
44
+ .prepare('SELECT bee_name, COUNT(*) AS n FROM bee_release GROUP BY bee_name ORDER BY bee_name ASC')
45
+ .all();
46
+ return rows.filter((r) => bee === undefined || r.bee_name === bee);
47
+ }
48
+ function statusData(options, events, loopCounts, beeCounts) {
49
+ return {
50
+ filters: {
51
+ ...(options.loop !== undefined ? { loop: options.loop } : {}),
52
+ ...(options.bee !== undefined ? { bee: options.bee } : {})
53
+ },
54
+ crystallization_events: events.length,
55
+ events: events.map((e) => ({
56
+ id: e?.id,
57
+ trigger: e?.trigger,
58
+ lifecycle_status: e?.lifecycle_status,
59
+ created_loop_release_id: e?.created_loop_release_id,
60
+ created_bee_release_id: e?.created_bee_release_id,
61
+ updated_loop_release_id: e?.updated_loop_release_id,
62
+ updated_bee_release_id: e?.updated_bee_release_id,
63
+ created_at: e?.created_at
64
+ })),
65
+ loop_release_counts_by_lifecycle: loopCounts,
66
+ bee_release_counts_by_name: beeCounts,
67
+ nextActions: [
68
+ options.loop
69
+ ? `Run \`peaks loop show --loop ${options.loop}\` for the loop detail view.`
70
+ : "Pass --loop <id> to drill into a specific loop's crystallization history."
71
+ ]
72
+ };
73
+ }
74
+ async function runAssetStatus(io, options) {
75
+ try {
76
+ const db = openAssetDb(resolveAssetProjectRoot(options.project));
77
+ try {
78
+ const svc = createCrystallizationService(db);
79
+ const events = collectEvents(svc, options.loop);
80
+ const loopCounts = collectLoopCounts(db);
81
+ const beeCounts = collectBeeCounts(db, options.bee);
82
+ printResult(io, ok('asset.status', statusData(options, events, loopCounts, beeCounts), [], []), options.json);
83
+ }
84
+ finally {
85
+ db.close();
86
+ }
87
+ }
88
+ catch (err) {
89
+ printResult(io, fail('asset.status', 'ASSET_STATUS_FAILED', getErrorMessage(err), { loop: options.loop, bee: options.bee }, ['Verify the loop / bee identifiers.']), options.json);
90
+ process.exitCode = 1;
91
+ }
92
+ }
93
+ export function registerAssetStatusCommand(asset, io) {
94
+ addJsonOption(asset
95
+ .command('status')
96
+ .description('M5: list loop + bee lifecycle state. With --loop, returns the loop + all linked bee_releases + all crystallization events referencing them.')
97
+ .option('--loop <id>', 'filter by loop_release id')
98
+ .option('--bee <name>', 'filter by bee_name')
99
+ .option('--project <path>', 'project root (default: cwd)')).action((options) => runAssetStatus(io, options));
100
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import type { ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerBaselineAuditCommand(baseline: Command, io: ProgramIO): void;
@@ -0,0 +1,64 @@
1
+ // src/cli/commands/baseline-audit-command.ts
2
+ //
3
+ // `peaks baseline audit` — the independent-context capability scorer. Split
4
+ // out of `baseline-commands.ts`; the scorer vocabulary, the guard summary the
5
+ // audit is handed, the sessionless scope and the verdict rule are unchanged.
6
+ import { readBaselineFile } from '../../services/capability-baseline/store.js';
7
+ import { GUARD_CONTRACTS } from '../../services/capability-guard-runner/registry.js';
8
+ import { runAllGuards } from '../../services/capability-guard-runner/runner.js';
9
+ import { RUNTIME_SESSIONLESS_SCOPE } from '../../services/workspace/runtime-layout.js';
10
+ import { DEFAULT_SCORER_MODE, fail, guardContext, isScorerMode, ok, SCORER_MODES } from './baseline-command-shared.js';
11
+ async function runAudit(io, opts) {
12
+ const projectRoot = opts.project ?? '.';
13
+ if (!isScorerMode(opts.scorer)) {
14
+ fail(io, 'UNKNOWN_SCORER', `unknown scorer "${String(opts.scorer)}"; expected one of ${SCORER_MODES.join(', ')}`);
15
+ return;
16
+ }
17
+ const r = readBaselineFile(projectRoot);
18
+ if (!r.ok) {
19
+ fail(io, r.error.code, r.error.message);
20
+ return;
21
+ }
22
+ // The guard summary is the REAL aggregate of the 15 contracts. It used to
23
+ // be a literal `{pass:15,fail:0,skipped:0,total:15}` that no run produced.
24
+ const guardSummary = await runAllGuards(GUARD_CONTRACTS, guardContext(projectRoot));
25
+ // `live` is the deterministic independent checker: a real
26
+ // separate-context evaluation that needs no credentials, which is why it
27
+ // is the only kind that can run inside the secretless OIDC publish gate.
28
+ // It is handed the frozen rows and the registry, not just the guard
29
+ // summary — a scorer that only sees the guard result is a restatement.
30
+ //
31
+ // `sessionId` is the on-disk scope for the audit artifacts. This command
32
+ // has NO session — it is the credential-free scorer that runs inside the
33
+ // secretless OIDC publish gate — and it used to pass the literal `'cli'`,
34
+ // so every run wrote `.peaks/_runtime/cli/capability-audit/*.json` into
35
+ // the operator's real workspace. That directory is indistinguishable from
36
+ // a session dir whose id failed validation, so `peaks doctor`'s
37
+ // orphan-session check failed on it permanently. The reserved
38
+ // underscore-prefixed scope says "machinery, not a session" in the name.
39
+ const { runAudit: runIndependentAudit } = await import('../../services/capability-audit-service/runner.js');
40
+ const audit = await runIndependentAudit({
41
+ projectRoot,
42
+ sessionId: RUNTIME_SESSIONLESS_SCOPE,
43
+ journeyId: 'J01',
44
+ scorerMode: opts.scorer,
45
+ baselineRows: r.file.rows,
46
+ contracts: GUARD_CONTRACTS,
47
+ guardSummary
48
+ });
49
+ const data = audit;
50
+ if (audit.verdict === 'consistent' && !audit.degraded) {
51
+ ok(io, 'baseline.audit', data);
52
+ return;
53
+ }
54
+ fail(io, 'AUDIT_NOT_CONSISTENT', `capability audit verdict is "${audit.verdict}"${audit.degraded ? ' (degraded: stub scorer)' : ''}`, data);
55
+ }
56
+ export function registerBaselineAuditCommand(baseline, io) {
57
+ baseline
58
+ .command('audit')
59
+ .description('Run the capability audit (independent-context scorer). Exits non-zero unless the verdict is consistent.')
60
+ .option('--scorer <mode>', `Scorer to run: ${SCORER_MODES.join('|')}. 'live' (default) runs the deterministic independent checker, which needs no credentials; 'stub' performs no evaluation and can never be consistent.`, DEFAULT_SCORER_MODE)
61
+ .option('--project <path>', 'Project root', '.')
62
+ .option('--json', 'Emit JSON envelope')
63
+ .action((opts) => runAudit(io, opts));
64
+ }
@@ -0,0 +1,23 @@
1
+ import type { ProgramIO } from '../cli-helpers.js';
2
+ import type { GuardContext } from '../../services/capability-guard-runner/types.js';
3
+ /** The `--project` / `--json` pair every verb in this family declares. */
4
+ export type BaselineOptions = {
5
+ project?: string;
6
+ json?: boolean;
7
+ };
8
+ export declare function fail(io: ProgramIO, code: string, message: string, data?: Record<string, unknown>): void;
9
+ export declare function ok(io: ProgramIO, command: string, data: Record<string, unknown>, nextActions?: ReadonlyArray<string>): void;
10
+ export declare const CURRENT_DIR: (root: string) => string;
11
+ export declare const HISTORY_DIR: (root: string, version: string) => string;
12
+ /** Whitelist of supported `--scorer` values for `peaks baseline audit`. */
13
+ export declare const SCORER_MODES: readonly ["live", "stub"];
14
+ export type ScorerMode = (typeof SCORER_MODES)[number];
15
+ /**
16
+ * `live` is the default because it is the credential-free one. Defaulting to
17
+ * `stub` would leave the publish gate permanently inconclusive; defaulting to a
18
+ * scorer that needs a key would leave it unrunnable in CI.
19
+ */
20
+ export declare const DEFAULT_SCORER_MODE: ScorerMode;
21
+ export declare function isScorerMode(v: string | undefined): v is ScorerMode;
22
+ /** The guard `run-guard` / `audit` execute against. */
23
+ export declare function guardContext(projectRoot: string): GuardContext;
@@ -0,0 +1,39 @@
1
+ // src/cli/commands/baseline-command-shared.ts
2
+ //
3
+ // What every `peaks baseline *` verb shares: its two envelope writers, the
4
+ // on-disk layout helpers, the guard context and the `--scorer` vocabulary.
5
+ // Split out of `baseline-commands.ts`; every path, envelope field and exit
6
+ // code is unchanged.
7
+ import { join } from 'node:path';
8
+ export function fail(io, code, message, data = {}) {
9
+ io.stdout(JSON.stringify({
10
+ ok: false,
11
+ command: `baseline`,
12
+ code,
13
+ message,
14
+ data,
15
+ warnings: [],
16
+ nextActions: []
17
+ }));
18
+ process.exitCode = 1;
19
+ }
20
+ export function ok(io, command, data, nextActions = []) {
21
+ io.stdout(JSON.stringify({ ok: true, command, data, warnings: [], nextActions }));
22
+ }
23
+ export const CURRENT_DIR = (root) => join(root, 'openspec', 'baselines', 'current');
24
+ export const HISTORY_DIR = (root, version) => join(root, 'openspec', 'baselines', 'history', version);
25
+ /** Whitelist of supported `--scorer` values for `peaks baseline audit`. */
26
+ export const SCORER_MODES = ['live', 'stub'];
27
+ /**
28
+ * `live` is the default because it is the credential-free one. Defaulting to
29
+ * `stub` would leave the publish gate permanently inconclusive; defaulting to a
30
+ * scorer that needs a key would leave it unrunnable in CI.
31
+ */
32
+ export const DEFAULT_SCORER_MODE = 'live';
33
+ export function isScorerMode(v) {
34
+ return v !== undefined && SCORER_MODES.includes(v);
35
+ }
36
+ /** The guard `run-guard` / `audit` execute against. */
37
+ export function guardContext(projectRoot) {
38
+ return { projectRoot, sessionId: 'cli', contract: {}, baselineInvariant: 'auto' };
39
+ }