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,93 @@
1
+ // src/cli/commands/hooks-status-command.ts
2
+ //
3
+ // `peaks hooks status` — report which peaks-managed hook entries are installed.
4
+ // Split out of `hooks-commands.ts`; the verb name, its options, the
5
+ // "read the ACTUAL on-disk entries, not the expected list" ruling and the
6
+ // envelope shape are unchanged.
7
+ import { existsSync } from 'node:fs';
8
+ import { listSuperpowersDenyEntries, readHookStatus, readInstalledEntriesFromSettings } from '../../services/skills/hooks-settings-service.js';
9
+ import { readJsonObjectFile } from '../../services/ide/shared/atomic-json.js';
10
+ import { resolveIdeOptionHelp } from '../../services/ide/ide-registry.js';
11
+ import { fail, ok } from 'peaks-loop-shared/result';
12
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
13
+ import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './hooks-command-shared.js';
14
+ /**
15
+ * `permissions.deny` block from a settings.json object and return
16
+ * every peaks-managed entry currently present. Used by `hooks status`
17
+ * to surface Layer 3 governance state without forcing the caller to
18
+ * re-read the file. Tolerant of missing / malformed `permissions` —
19
+ * a missing field returns an empty array, never throws.
20
+ */
21
+ function readOnDiskDenyEntries(settings) {
22
+ const permissions = settings.permissions;
23
+ if (!permissions || typeof permissions !== 'object' || Array.isArray(permissions))
24
+ return [];
25
+ const deny = permissions.deny;
26
+ if (!Array.isArray(deny))
27
+ return [];
28
+ return deny.filter((d) => typeof d === 'string');
29
+ }
30
+ function runHooksStatus(io, options) {
31
+ const scope = resolveScope(options);
32
+ const projectRoot = resolveProjectRoot(scope, options.project);
33
+ const ide = resolveIdeForCommand(options, projectRoot);
34
+ try {
35
+ const status = readHookStatus(scope, projectRoot, { ide });
36
+ // Slice #014: read the ACTUAL on-disk entries (post-install shape),
37
+ // not the IDE-EXPECTED list. Pre-#014 `listInstalledEntriesForIde`
38
+ // returned the expected list and reported `entries: [Bash, Task]`
39
+ // even when the file only had `Bash`. The new helper reads the
40
+ // file and reports whatever peaks-managed entries are present,
41
+ // including any legacy progress-start entry that a pre-#014
42
+ // install left behind.
43
+ const settingsPath = status.settingsPath;
44
+ const settings = existsSync(settingsPath) ? readJsonObjectFile(settingsPath) : {};
45
+ // The gate-enforce entry is materialized into the machine-local
46
+ // settings file (see `resolveHookTargets`), so the on-disk entry list
47
+ // must be read from both files or `status` would report it missing.
48
+ const localSettings = status.localSettingsPath !== undefined && existsSync(status.localSettingsPath)
49
+ ? readJsonObjectFile(status.localSettingsPath)
50
+ : {};
51
+ // entries actually on disk. We read the existing settings.json
52
+ // (above) and surface its `permissions.deny` block. Any entry
53
+ // that matches the current `SUPERPOWERS_DENIED_SKILLS` set is
54
+ // considered "peaks-managed"; user-written entries are passed
55
+ // through verbatim so the envelope reflects reality. The desired
56
+ // list is also included for parity with install / uninstall.
57
+ const onDiskDeny = readOnDiskDenyEntries(settings);
58
+ // `status` reports the state of the world; for an IDE that cannot host a
59
+ // hook the state of the world is "none, and none is possible". The exit
60
+ // code stays 0 (the query succeeded) and the payload carries the finding
61
+ // — `supportsHooks: false` on the data, plus a warning naming the IDE, so
62
+ // the negative fact is not confused with "supported IDE, nothing
63
+ // installed yet".
64
+ const warnings = status.supportsHooks
65
+ ? []
66
+ : [
67
+ `IDE '${ide}' cannot host peaks hooks (no HOOK_COMMAND_BY_IDE entry); nothing can be installed for it, which is why none is.`
68
+ ];
69
+ printResult(io, ok('hooks.status', {
70
+ ...status,
71
+ ide,
72
+ entries: [
73
+ ...readInstalledEntriesFromSettings(settings, ide),
74
+ ...readInstalledEntriesFromSettings(localSettings, ide)
75
+ ],
76
+ permissionsDenyEntries: listSuperpowersDenyEntries(),
77
+ permissionsDenyOnDisk: onDiskDeny
78
+ }, warnings), options.json);
79
+ }
80
+ catch (error) {
81
+ const message = getErrorMessage(error);
82
+ printResult(io, fail('hooks.status', 'HOOKS_STATUS_FAILED', message, { scope, ide }, [message]), options.json);
83
+ process.exitCode = 1;
84
+ }
85
+ }
86
+ export function registerHooksStatusCommand(hooks, io) {
87
+ addJsonOption(hooks
88
+ .command('status')
89
+ .description('Report which peaks-managed hook entries are installed.')
90
+ .option('--global', 'inspect the user-level ~/.claude/settings.json instead of the project')
91
+ .option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
92
+ .option('--ide <id>', resolveIdeOptionHelp())).action((options) => runHooksStatus(io, options));
93
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerHooksUninstallCommand(hooks: Command, io: ProgramIO): void;
@@ -0,0 +1,43 @@
1
+ // src/cli/commands/hooks-uninstall-command.ts
2
+ //
3
+ // `peaks hooks uninstall` — remove the peaks-managed gate-enforce hook entry
4
+ // (and any legacy progress-start entry a pre-#014 install left behind). Split
5
+ // out of `hooks-commands.ts`; the verb name, its options and the envelope shape
6
+ // are unchanged.
7
+ import { listSuperpowersDenyEntries, removeHookInstall } from '../../services/skills/hooks-settings-service.js';
8
+ import { resolveIdeOptionHelp } from '../../services/ide/ide-registry.js';
9
+ import { fail, ok } from 'peaks-loop-shared/result';
10
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
11
+ import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './hooks-command-shared.js';
12
+ function runHooksUninstall(io, options) {
13
+ const scope = resolveScope(options);
14
+ const projectRoot = resolveProjectRoot(scope, options.project);
15
+ const ide = resolveIdeForCommand(options, projectRoot);
16
+ try {
17
+ const result = removeHookInstall(scope, projectRoot, { ide });
18
+ // bookkeeping. `permissionsDenyRemoved` mirrors `removed` (the
19
+ // service strips deny entries on the same atomic write that
20
+ // strips the hook entries; they share the same boolean).
21
+ printResult(io, ok('hooks.uninstall', {
22
+ ...result,
23
+ ide,
24
+ permissionsDenyRemoved: result.removed,
25
+ permissionsDenyEntries: listSuperpowersDenyEntries()
26
+ }), options.json);
27
+ }
28
+ catch (error) {
29
+ const message = getErrorMessage(error);
30
+ printResult(io, fail('hooks.uninstall', 'HOOKS_UNINSTALL_FAILED', message, { scope, ide, removed: false }, [
31
+ message
32
+ ]), options.json);
33
+ process.exitCode = 1;
34
+ }
35
+ }
36
+ export function registerHooksUninstallCommand(hooks, io) {
37
+ addJsonOption(hooks
38
+ .command('uninstall')
39
+ .description('Remove the peaks-managed gate-enforce hook entry from the target settings.json. Any legacy progress-start entry that a pre-#014 install left behind is also removed (sentinel-based scan). Third-party hooks are preserved.')
40
+ .option('--global', 'remove from the user-level ~/.claude/settings.json instead of the project')
41
+ .option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
42
+ .option('--ide <id>', resolveIdeOptionHelp())).action((options) => runHooksUninstall(io, options));
43
+ }
@@ -0,0 +1,31 @@
1
+ import type { Command } from 'commander';
2
+ export type GoalComposeOptions = {
3
+ project: string;
4
+ goal: string;
5
+ json?: boolean;
6
+ };
7
+ export type LoopDistillOptions = {
8
+ project: string;
9
+ apply: boolean;
10
+ json?: boolean;
11
+ };
12
+ export type LoopPlaceholderOptions = {
13
+ project: string;
14
+ json?: boolean;
15
+ };
16
+ export type LoopExportOptions = {
17
+ loop: string;
18
+ out: string;
19
+ project?: string;
20
+ json?: boolean;
21
+ };
22
+ export type LoopImportOptions = {
23
+ in: string;
24
+ as?: string;
25
+ project?: string;
26
+ json?: boolean;
27
+ };
28
+ /** `--project`, else the nearest project root above cwd, else cwd. */
29
+ export declare function resolveLoopProjectRoot(project: string | undefined): string;
30
+ /** `--project` + `--json`, the option chain `loop export` and `loop import` share. */
31
+ export declare const LOOP_EXPORT_IMPORT_OPTS: (cmd: Command) => Command;
@@ -0,0 +1,15 @@
1
+ // src/cli/commands/loop-command-shared.ts
2
+ //
3
+ // What the `peaks loop` verbs share: the option types, the `--project` /
4
+ // `--json` chain `export` and `import` both declare, and the project-root
5
+ // resolution. Split out of `loop-commands.ts` so the bundle verbs can live in
6
+ // their own modules without repeating the same eight-line construction.
7
+ import { findProjectRoot } from '../../services/config/config-safety.js';
8
+ /** `--project`, else the nearest project root above cwd, else cwd. */
9
+ export function resolveLoopProjectRoot(project) {
10
+ return project ?? findProjectRoot(process.cwd()) ?? process.cwd();
11
+ }
12
+ /** `--project` + `--json`, the option chain `loop export` and `loop import` share. */
13
+ export const LOOP_EXPORT_IMPORT_OPTS = (cmd) => cmd
14
+ .option('--project <path>', 'target project root (defaults to cwd)')
15
+ .option('--json', 'print machine-readable JSON envelope');
@@ -1,26 +1,21 @@
1
1
  /**
2
2
  * peaks loop * CLI (Slice #14 + M7 add).
3
3
  *
4
- * Slices:
5
4
  * #14 sub-features (L4 Agent Loop integration): distill / preflight /
6
- * detect-pattern / check-consistency / peaks goal compose.
5
+ * detect-pattern / check-consistency, plus `peaks goal compose`.
7
6
  *
8
- * M7 (2026-07-07 spec §7A.2):
9
- * peaks loop export --loop <id> --out <path.tar.gz>
10
- * peaks loop import --in <path.tar.gz> [--as <loop-id>]
7
+ * M7 (2026-07-07 spec §7A.2): `peaks loop export --loop <id> --out <p.tar.gz>`
8
+ * and `peaks loop import --in <p.tar.gz> [--as <loop-id>]`. `export` reads
9
+ * the loop_release + relations + bees + evidence briefs and hard-blocks on
10
+ * `shareable=false`; `import` validates `format_version_major=1` and lands
11
+ * the release as `candidate` (spec §7A.2) — the receiver must run an
12
+ * independent evaluation before promoting to `stable`. M7 only ADDs these
13
+ * two verbs; the existing 14.x surface is not modified.
11
14
  *
12
- * `peaks loop export` reads the source loop_release + relations +
13
- * related bees + evidence briefs and emits a `peaks.bundle/1`
14
- * tar.gz. Hard-blocks when the source has `shareable=false`.
15
- *
16
- * `peaks loop import` extracts a bundle, validates
17
- * format_version_major=1, and lands the release as `candidate`
18
- * (mandatory landing status per spec §7A.2). The receiver must run
19
- * an independent evaluation before promoting to `stable`.
20
- *
21
- * The existing 14.x commands are kept under the same `loop` parent;
22
- * M7 only ADDs export / import — it does not modify the existing
23
- * surface.
15
+ * This module owns the `loop` parent, the registrar order, and `distill` — the
16
+ * one verb that spawns a child process, kept here so the `node:child_process`
17
+ * import stays on the module `tests/unit/spawn-windows-hide-guard.test.ts`
18
+ * pins it to. Every other verb lives beside this file, one module per verb.
24
19
  */
25
20
  import type { Command } from 'commander';
26
21
  import { type ProgramIO } from '../cli-helpers.js';
@@ -1,263 +1,81 @@
1
1
  /**
2
2
  * peaks loop * CLI (Slice #14 + M7 add).
3
3
  *
4
- * Slices:
5
4
  * #14 sub-features (L4 Agent Loop integration): distill / preflight /
6
- * detect-pattern / check-consistency / peaks goal compose.
5
+ * detect-pattern / check-consistency, plus `peaks goal compose`.
7
6
  *
8
- * M7 (2026-07-07 spec §7A.2):
9
- * peaks loop export --loop <id> --out <path.tar.gz>
10
- * peaks loop import --in <path.tar.gz> [--as <loop-id>]
7
+ * M7 (2026-07-07 spec §7A.2): `peaks loop export --loop <id> --out <p.tar.gz>`
8
+ * and `peaks loop import --in <p.tar.gz> [--as <loop-id>]`. `export` reads
9
+ * the loop_release + relations + bees + evidence briefs and hard-blocks on
10
+ * `shareable=false`; `import` validates `format_version_major=1` and lands
11
+ * the release as `candidate` (spec §7A.2) — the receiver must run an
12
+ * independent evaluation before promoting to `stable`. M7 only ADDs these
13
+ * two verbs; the existing 14.x surface is not modified.
11
14
  *
12
- * `peaks loop export` reads the source loop_release + relations +
13
- * related bees + evidence briefs and emits a `peaks.bundle/1`
14
- * tar.gz. Hard-blocks when the source has `shareable=false`.
15
- *
16
- * `peaks loop import` extracts a bundle, validates
17
- * format_version_major=1, and lands the release as `candidate`
18
- * (mandatory landing status per spec §7A.2). The receiver must run
19
- * an independent evaluation before promoting to `stable`.
20
- *
21
- * The existing 14.x commands are kept under the same `loop` parent;
22
- * M7 only ADDs export / import — it does not modify the existing
23
- * surface.
15
+ * This module owns the `loop` parent, the registrar order, and `distill` — the
16
+ * one verb that spawns a child process, kept here so the `node:child_process`
17
+ * import stays on the module `tests/unit/spawn-windows-hide-guard.test.ts`
18
+ * pins it to. Every other verb lives beside this file, one module per verb.
24
19
  */
25
- import { existsSync, mkdirSync } from 'node:fs';
26
- import { join } from 'node:path';
27
- import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
28
20
  import { fail, ok } from 'peaks-loop-shared/result';
29
- import { findProjectRoot } from '../../services/config/config-safety.js';
30
- import { openStateDb } from '../../services/skillhub/sqlite-store.js';
31
- import { writeBundle, BundleNotShareableError, BundleAssetNotFoundError } from '../../services/share/bundle-writer.js';
32
- import { readBundle, BundleMajorVersionMismatchError, BundleSchemaVersionsMismatchError, BundleImportToStableForbiddenError, BundleMalformedError } from '../../services/share/bundle-reader.js';
21
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
22
+ import { registerLoopExportCommand } from './loop-export-command.js';
23
+ import { registerLoopGoalComposeCommand } from './loop-goal-compose-command.js';
24
+ import { registerLoopImportCommand } from './loop-import-command.js';
25
+ import { registerLoopPlaceholderCommands } from './loop-placeholder-commands.js';
33
26
  export function registerLoopCommands(program, io) {
34
- // 14.5 peaks goal compose — registered as a TOP-LEVEL command (not under
35
- // `peaks loop`) because IDE adapters expose it as `goalCommand`.
36
- // The sub-agent dispatch path consumes it; the slice 0.7 hermes +
37
- // openclaw adapters will thread it through.
38
- addJsonOption(program
39
- .command('goal')
40
- .description('14.5: compose an autonomous goal (returns the goal envelope that the LLM-side UX layer feeds to peaks sub-agent dispatch)')
41
- .requiredOption('--project <path>', 'target project root')
42
- .requiredOption('--goal <text>', 'the high-level goal to compose')).action((options) => {
43
- try {
44
- printResult(io, ok('goal.compose', {
45
- project: options.project,
46
- goal: options.goal,
47
- status: 'placeholder',
48
- nextSteps: [
49
- 'The composed goal is consumed by peaks sub-agent dispatch.',
50
- 'The hermes + openclaw IDE adapters (Slice #0.7) surface this as a goalCommand.'
51
- ]
52
- }, [], [
53
- 'goal.compose is a thin facade; the LLM-side UX layer decomposes the goal into sub-agent tasks.'
54
- ]), options.json);
55
- }
56
- catch (error) {
57
- printResult(io, fail('goal.compose', 'GOAL_COMPOSE_FAILED', getErrorMessage(error), { project: options.project, goal: options.goal }, ['Verify the project path and --goal value']), options.json);
58
- process.exitCode = 1;
59
- }
60
- });
61
- // peaks loop *
27
+ // 14.5 peaks goal compose — a TOP-LEVEL command (not under `peaks loop`),
28
+ // because IDE adapters expose it as `goalCommand`.
29
+ registerLoopGoalComposeCommand(program, io);
62
30
  const loop = program
63
31
  .command('loop')
64
32
  .description('Slice #14: L4 Agent Loop sub-features (distill / preflight / detect-pattern / check-consistency)');
65
- // 14.1 distill
33
+ registerLoopDistillCommand(loop, io);
34
+ registerLoopPlaceholderCommands(loop, io);
35
+ registerLoopExportCommand(loop, io);
36
+ registerLoopImportCommand(loop, io);
37
+ }
38
+ /**
39
+ * 14.1 distill — delegate to `peaks memory extract` through a dynamic
40
+ * `node:child_process` import (no static import, so the command layer does not
41
+ * load `child_process` for verbs that never spawn). The LLM-side UX layer
42
+ * composes the two commands.
43
+ */
44
+ function registerLoopDistillCommand(loop, io) {
66
45
  addJsonOption(loop
67
46
  .command('distill')
68
47
  .description('14.1: distill patterns from past sessions into .peaks/memory/ (delegates to peaks memory extract)')
69
48
  .requiredOption('--project <path>', 'target project root')
70
49
  .option('--apply', 'write extracted memories to .peaks/memory/ (default: dry-run preview)', false)).action(async (options) => {
71
50
  try {
72
- const apply = options.apply === true;
73
- // Delegate to the existing peaks memory extract CLI via dynamic
74
- // import (avoids circular); the LLM-side UX layer composes the
75
- // two commands.
76
- const { execFileSync } = (await import('node:child_process'));
77
- const args = ['memory', 'extract', '--project', options.project];
78
- if (apply)
79
- args.push('--apply');
80
- const stdout = execFileSync('node', ['bin/peaks.js', ...args], {
81
- cwd: options.project,
82
- stdio: ['ignore', 'pipe', 'ignore'],
83
- windowsHide: true
84
- }).toString('utf-8');
85
- printResult(io, ok('loop.distill', {
86
- project: options.project,
87
- apply,
88
- delegateStdout: stdout.slice(0, 200)
89
- }, [], [
90
- apply
91
- ? 'peaks memory extract --apply was invoked'
92
- : 'peaks memory extract dry-run was invoked',
93
- 'A future slice will inline the memory extract (not via execFileSync).'
94
- ]), options.json);
51
+ printResult(io, ok('loop.distill', await extractMemoryViaDelegate(options), [], distillNextActions(options)), options.json);
95
52
  }
96
53
  catch (error) {
97
54
  printResult(io, fail('loop.distill', 'LOOP_DISTILL_FAILED', getErrorMessage(error), { project: options.project }, ['Verify the project path']), options.json);
98
55
  process.exitCode = 1;
99
56
  }
100
57
  });
101
- // 14.2 preflight
102
- addJsonOption(loop
103
- .command('preflight')
104
- .description('14.2: pre-run sanity checks (placeholder; future slice runs peaks doctor + peaks audit before each loop iter)')
105
- .requiredOption('--project <path>', 'target project root')).action((options) => {
106
- printResult(io, ok('loop.preflight', {
107
- project: options.project,
108
- status: 'placeholder',
109
- nextSteps: [
110
- 'For each L4 loop iteration, call peaks doctor + peaks audit to surface regressions.',
111
- 'A future slice will inline the preflight checks (not just placeholder).'
112
- ]
113
- }, [], [
114
- 'loop.preflight is a thin facade; the LLM-side UX layer composes peaks doctor + peaks audit.'
115
- ]), options.json);
116
- });
117
- // 14.3 detect-pattern
118
- addJsonOption(loop
119
- .command('detect-pattern')
120
- .description('14.3: detect repeating patterns across past sessions (placeholder; future slice uses peaks retrospective search)')
121
- .requiredOption('--project <path>', 'target project root')).action((options) => {
122
- printResult(io, ok('loop.detect-pattern', {
123
- project: options.project,
124
- status: 'placeholder',
125
- nextSteps: [
126
- 'Run peaks retrospective search --limit 50 to surface high-frequency patterns.',
127
- 'A future slice will rank by frequency + LLM confidence.'
128
- ]
129
- }, [], [
130
- 'loop.detect-pattern is a thin facade; the LLM-side UX layer composes peaks retrospective search.'
131
- ]), options.json);
132
- });
133
- // 14.4 check-consistency
134
- addJsonOption(loop
135
- .command('check-consistency')
136
- .description('14.4: verify state consistency (placeholder; future slice compares .peaks/_runtime across sessions)')
137
- .requiredOption('--project <path>', 'target project root')).action((options) => {
138
- printResult(io, ok('loop.check-consistency', {
139
- project: options.project,
140
- status: 'placeholder',
141
- nextSteps: [
142
- 'Compare .peaks/_runtime/<sid>/session.json across recent sessions for drift.',
143
- 'A future slice will report drift with severity (warn / fail).'
144
- ]
145
- }, [], ['loop.check-consistency is a thin facade; the LLM-side UX layer composes the drift scan.']), options.json);
146
- });
147
- // ---------- M7: peaks loop export / import (spec §7A.2) ----------
148
- const LOOP_EXPORT_IMPORT_OPTS = (cmd) => cmd
149
- .option('--project <path>', 'target project root (defaults to cwd)')
150
- .option('--json', 'print machine-readable JSON envelope');
151
- LOOP_EXPORT_IMPORT_OPTS(loop
152
- .command('export')
153
- .description('M7: export a loop_release as a peaks.bundle/1 tarball (spec §7A.2 / §10 RL-9). Refuses to export when shareable=false.')
154
- .requiredOption('--loop <id>', 'loop_release id (kebab-case)')
155
- .requiredOption('--out <path>', 'output .tar.gz path')).action((options) => {
156
- const asJson = options.json === true;
157
- try {
158
- const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
159
- if (!existsSync(join(projectRoot, '.peaks'))) {
160
- mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
161
- }
162
- const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
163
- try {
164
- const result = writeBundle({
165
- db,
166
- blobsDir: join(projectRoot, '.peaks', 'blobs'),
167
- kind: 'loop',
168
- id: options.loop,
169
- outPath: options.out
170
- });
171
- printResult(io, ok('loop.export', {
172
- outPath: result.outPath,
173
- kind: result.kind,
174
- assetId: result.assetId,
175
- importedAs: 'candidate'
176
- }, [], [
177
- `Receiver must run \`peaks loop import --in ${result.outPath}\` to land this bundle, then run an independent evolution_evaluation before any promote.`
178
- ]), asJson);
179
- }
180
- finally {
181
- db.close();
182
- }
183
- }
184
- catch (error) {
185
- if (error instanceof BundleNotShareableError) {
186
- printResult(io, fail('loop.export', error.code, error.message, { ok: false, loop: options.loop }, ['Set shareable=true on the loop_release row, or share via desktop_visible=false.']), asJson);
187
- process.exitCode = 1;
188
- return;
189
- }
190
- if (error instanceof BundleAssetNotFoundError) {
191
- printResult(io, fail('loop.export', error.code, error.message, { ok: false, loop: options.loop }, ['Verify the loop id with `peaks asset status --loop <id>`.']), asJson);
192
- process.exitCode = 1;
193
- return;
194
- }
195
- printResult(io, fail('loop.export', 'LOOP_EXPORT_FAILED', getErrorMessage(error), { ok: false, loop: options.loop }, ['Verify --loop id and --out path.']), asJson);
196
- process.exitCode = 1;
197
- }
198
- });
199
- LOOP_EXPORT_IMPORT_OPTS(loop
200
- .command('import')
201
- .description('M7: import a peaks.bundle/1 tarball. Lands as candidate only — promotion requires an evolution_evaluation row (spec §7A.2 / §10 RL-9 / AC-25 / AC-26).')
202
- .requiredOption('--in <path>', 'input .tar.gz path')
203
- .option('--as <id>', 'optional rename for the loop id when landing')).action((options) => {
204
- const asJson = options.json === true;
205
- try {
206
- const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
207
- if (!existsSync(join(projectRoot, '.peaks'))) {
208
- mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
209
- }
210
- const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
211
- try {
212
- const result = readBundle({
213
- db,
214
- blobsDir: join(projectRoot, '.peaks', 'blobs'),
215
- inPath: options.in,
216
- ...(options.as !== undefined ? { asName: options.as } : {})
217
- });
218
- printResult(io, ok('loop.import', {
219
- assetId: result.assetId,
220
- kind: result.kind,
221
- importedAs: result.importedAs,
222
- warnings: result.warnings,
223
- evidenceBriefCount: result.evidenceBriefCount
224
- }, result.warnings, [
225
- `Run an independent evaluation against this release before promoting; peaks loop promote refuses without an evolution_evaluation row.`
226
- ]), asJson);
227
- }
228
- finally {
229
- db.close();
230
- }
231
- }
232
- catch (error) {
233
- if (error instanceof BundleMajorVersionMismatchError) {
234
- printResult(io, fail('loop.import', error.code, error.message, { ok: false, receivedMajor: error.receivedMajor }, [
235
- 'Use the matching peaks.bundle/<major> reader; this peaks build only supports major=1.'
236
- ]), asJson);
237
- process.exitCode = 1;
238
- return;
239
- }
240
- if (error instanceof BundleSchemaVersionsMismatchError) {
241
- printResult(io, fail('loop.import', error.code, error.message, { ok: false }, [
242
- 'Source bundle did not declare the canonical schema versions; refuse the bundle.'
243
- ]), asJson);
244
- process.exitCode = 1;
245
- return;
246
- }
247
- if (error instanceof BundleImportToStableForbiddenError) {
248
- printResult(io, fail('loop.import', error.code, error.message, { ok: false }, [
249
- 'Bundles always land as candidate; promotion to stable requires an evolution_evaluation row (AC-26).'
250
- ]), asJson);
251
- process.exitCode = 1;
252
- return;
253
- }
254
- if (error instanceof BundleMalformedError) {
255
- printResult(io, fail('loop.import', error.code, error.message, { ok: false, inPath: options.in }, ['Re-export from the source via `peaks loop export`.']), asJson);
256
- process.exitCode = 1;
257
- return;
258
- }
259
- printResult(io, fail('loop.import', 'LOOP_IMPORT_FAILED', getErrorMessage(error), { ok: false, inPath: options.in }, ['Verify the bundle path and integrity.']), asJson);
260
- process.exitCode = 1;
261
- }
262
- });
58
+ }
59
+ /** Spawn `peaks memory extract` and report the first 200 bytes of its stdout. */
60
+ async function extractMemoryViaDelegate(options) {
61
+ const apply = options.apply === true;
62
+ const { execFileSync } = (await import('node:child_process'));
63
+ const args = ['memory', 'extract', '--project', options.project];
64
+ if (apply)
65
+ args.push('--apply');
66
+ const stdout = execFileSync('node', ['bin/peaks.js', ...args], {
67
+ cwd: options.project,
68
+ stdio: ['ignore', 'pipe', 'ignore'],
69
+ windowsHide: true
70
+ }).toString('utf-8');
71
+ return { project: options.project, apply, delegateStdout: stdout.slice(0, 200) };
72
+ }
73
+ /** The two sentences `loop.distill` tells the caller about what it just ran. */
74
+ function distillNextActions(options) {
75
+ return [
76
+ options.apply === true
77
+ ? 'peaks memory extract --apply was invoked'
78
+ : 'peaks memory extract dry-run was invoked',
79
+ 'A future slice will inline the memory extract (not via execFileSync).'
80
+ ];
263
81
  }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerLoopExportCommand(loop: Command, io: ProgramIO): void;
@@ -0,0 +1,73 @@
1
+ // src/cli/commands/loop-export-command.ts
2
+ //
3
+ // `peaks loop export` (M7, spec §7A.2) — export a loop_release as a
4
+ // `peaks.bundle/1` tarball, hard-blocked when the source has `shareable=false`.
5
+ // Extracted from `loop-commands.ts`; the registered name, description, options,
6
+ // refusal codes and envelope are unchanged.
7
+ import { existsSync, mkdirSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
10
+ import { openStateDb } from '../../services/skillhub/sqlite-store.js';
11
+ import { BundleAssetNotFoundError, BundleNotShareableError, writeBundle } from '../../services/share/bundle-writer.js';
12
+ import { printResult } from '../cli-helpers.js';
13
+ import { LOOP_EXPORT_IMPORT_OPTS, resolveLoopProjectRoot } from './loop-command-shared.js';
14
+ export function registerLoopExportCommand(loop, io) {
15
+ LOOP_EXPORT_IMPORT_OPTS(loop
16
+ .command('export')
17
+ .description('M7: export a loop_release as a peaks.bundle/1 tarball (spec §7A.2 / §10 RL-9). Refuses to export when shareable=false.')
18
+ .requiredOption('--loop <id>', 'loop_release id (kebab-case)')
19
+ .requiredOption('--out <path>', 'output .tar.gz path')).action((options) => {
20
+ const asJson = options.json === true;
21
+ try {
22
+ const result = exportLoopBundle(options);
23
+ printResult(io, ok('loop.export', {
24
+ outPath: result.outPath,
25
+ kind: result.kind,
26
+ assetId: result.assetId,
27
+ importedAs: 'candidate'
28
+ }, [], [
29
+ `Receiver must run \`peaks loop import --in ${result.outPath}\` to land this bundle, then run an independent evolution_evaluation before any promote.`
30
+ ]), asJson);
31
+ }
32
+ catch (error) {
33
+ const refusal = exportRefusal(error, options.loop) ??
34
+ fail('loop.export', 'LOOP_EXPORT_FAILED', getErrorMessage(error), { ok: false, loop: options.loop }, ['Verify --loop id and --out path.']);
35
+ printResult(io, refusal, asJson);
36
+ process.exitCode = 1;
37
+ }
38
+ });
39
+ }
40
+ /** Open `<projectRoot>/.peaks/state.db` (creating `.peaks/`) and write the bundle. */
41
+ function exportLoopBundle(options) {
42
+ const projectRoot = resolveLoopProjectRoot(options.project);
43
+ if (!existsSync(join(projectRoot, '.peaks'))) {
44
+ mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
45
+ }
46
+ const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
47
+ try {
48
+ return writeBundle({
49
+ db,
50
+ blobsDir: join(projectRoot, '.peaks', 'blobs'),
51
+ kind: 'loop',
52
+ id: options.loop,
53
+ outPath: options.out
54
+ });
55
+ }
56
+ finally {
57
+ db.close();
58
+ }
59
+ }
60
+ /** The two named refusals `writeBundle` raises, or `null` for anything else. */
61
+ function exportRefusal(error, loop) {
62
+ if (error instanceof BundleNotShareableError) {
63
+ return fail('loop.export', error.code, error.message, { ok: false, loop }, [
64
+ 'Set shareable=true on the loop_release row, or share via desktop_visible=false.'
65
+ ]);
66
+ }
67
+ if (error instanceof BundleAssetNotFoundError) {
68
+ return fail('loop.export', error.code, error.message, { ok: false, loop }, [
69
+ 'Verify the loop id with `peaks asset status --loop <id>`.'
70
+ ]);
71
+ }
72
+ return null;
73
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerLoopGoalComposeCommand(program: Command, io: ProgramIO): void;