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
@@ -5,84 +5,18 @@
5
5
  * prepare / node ack / node mark-lost / terminalize`. All commands
6
6
  * delegate to the canonical services. Each action emits the typed
7
7
  * envelope via `ok` / `fail` so the LLM runner can branch on `code`.
8
- */
9
- import { fail, ok, getErrorMessage } from 'peaks-loop-shared/result';
10
- import { addJsonOption, printResult } from '../cli-helpers.js';
11
- import { resolveCallerId } from '../../services/session/resolve-caller-id.js';
12
- import { findProjectRoot } from '../../services/config/config-safety.js';
13
- import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
14
- import { initWorkflow, terminalizeWorkflow } from '../../services/workflow/workflow-presence-lifecycle.js';
15
- import { readGraph, emptyGraph } from '../../services/workflow/workflow-graph-store.js';
16
- import { WORKFLOW_ID_REGEX, TERMINAL_REASONS } from '../../services/workflow/workflow-graph-types.js';
17
- import { prepareNodeAction, transitionNode, transitionLease } from '../../services/workflow/workflow-node-lifecycle.js';
18
- function deriveCallerId() {
19
- try {
20
- return resolveCallerId({});
21
- }
22
- catch (err) {
23
- throw fail('workflow.init', 'PEAKS_CALLER_NOT_RESOLVED', getErrorMessage(err), { callerId: null }, ['Resolve the IDE session identity before running workflow commands.']);
24
- }
25
- }
26
- function deriveProjectRoot(options) {
27
- return options.project ?? process.cwd();
28
- }
29
- /**
30
- * The literal that means "no session could be resolved". Kept as a named
31
- * constant because three call sites now have to ASK whether resolution
32
- * failed rather than consume the value as if it were an id.
33
- */
34
- export const UNKNOWN_SESSION_ID = 'unknown-sid';
35
- /**
36
- * Resolve the session id for every `workflow *` command.
37
- *
38
- * Tier order (matches the idiom every other command family in this CLI
39
- * already uses — see `job-commands.ts:85`, `container-commands.ts:138`):
40
8
  *
41
- * 1. `--session-id <sid>` — explicit wins
42
- * 2. `PEAKS_SESSION_ID` env var — scripted / sub-process callers
43
- * 3. `getCurrentSessionId(projectRoot)` — this caller's OWN binding
44
- * (`callers/<callerId>.json`) falling back to the project-global
45
- * `.peaks/_runtime/session.json`, the same resolver `peaks session
46
- * info --active` and `peaks session checkpoint` use
47
- * 4. `unknown-sid` — nothing is bound
48
- *
49
- * Tier 3 was MISSING until 2026-09-15 (S6), and its absence is the whole
50
- * defect: `workflow init` resolved on tiers 1–2 only, so with no flag and no
51
- * env var it wrote the graph into `.peaks/_runtime/unknown-sid/graphs/`
52
- * regardless of what the binding file said. `peaks workflow node prepare`
53
- * then ran under the CORRECT session dir and reported `PEAKS_GRAPH_NOT_FOUND`
54
- * — the graph it was asking for had been written one bucket over. The bucket
55
- * accumulated artifacts from at least 4 distinct caller ids between 2026-09-01
56
- * and 2026-09-15, i.e. it had never worked for anyone.
57
- *
58
- * The same prior-art sweep (`.peaks/memory/archived/2026-06-26-unknown-sid-root-cause.md`)
59
- * converted six inline `?? 'unknown-sid'` sites to this 4-tier chain;
60
- * `workflow-lifecycle-commands.ts` was missed. This is that site.
61
- *
62
- * The project root passed to tier 3 goes through the same `findProjectRoot`
63
- * walk `session info` uses, so a command run from a SUBDIRECTORY of the
64
- * project resolves the project's binding instead of `cwd`'s (which has none).
9
+ * The verb implementations live beside this file, one module per verb group:
10
+ * `workflow-init-command.ts`, `workflow-graph-commands.ts`,
11
+ * `workflow-node-commands.ts`, `workflow-terminalize-command.ts`, with the
12
+ * option vocabulary and the caller / project / session derivation in
13
+ * `workflow-command-shared.ts`.
65
14
  */
66
- function deriveSessionId(options) {
67
- if (typeof options.sessionId === 'string' && options.sessionId.length > 0)
68
- return options.sessionId;
69
- const fromEnv = process.env.PEAKS_SESSION_ID;
70
- if (typeof fromEnv === 'string' && fromEnv.length > 0)
71
- return fromEnv;
72
- return (getCurrentSessionId(findProjectRoot(options.project ?? process.cwd()) ?? options.project ?? process.cwd()) ?? UNKNOWN_SESSION_ID);
73
- }
74
- /**
75
- * Tier 3 resolving to `unknown-sid` means NO session is bound at all. A
76
- * `workflow` subcommand that WRITES must fail loudly on that rather than
77
- * create a bucket named after a failure — `graph list` already does (see its
78
- * `PEAKS_SESSION_NOT_BOUND` guard below); `init` did not.
79
- */
80
- function buildSessionNotBoundEnvelope(sessionId, projectRoot) {
81
- return fail('workflow.init', 'PEAKS_SESSION_NOT_BOUND', `No peaks session is bound for '${projectRoot}' (derived session id '${sessionId}'): --session-id, PEAKS_SESSION_ID and the project binding are all absent.`, { workflowId: null }, [
82
- 'Run `peaks workspace init --project <p>` to bind a session, then re-run.',
83
- 'Or pass `--session-id <sid>` explicitly.'
84
- ]);
85
- }
15
+ import { registerWorkflowGraphCommands } from './workflow-graph-commands.js';
16
+ import { registerWorkflowInitCommand } from './workflow-init-command.js';
17
+ import { registerWorkflowNodeCommands } from './workflow-node-commands.js';
18
+ import { registerWorkflowTerminalizeCommand } from './workflow-terminalize-command.js';
19
+ export { UNKNOWN_SESSION_ID } from './workflow-command-shared.js';
86
20
  export function registerWorkflowLifecycleCommand(parent, io) {
87
21
  // Reuse the existing `workflow` parent (created by `registerWorkflowCommands`)
88
22
  // to avoid Commander.js's "cannot add command 'workflow' as already have
@@ -90,276 +24,8 @@ export function registerWorkflowLifecycleCommand(parent, io) {
90
24
  const existingWorkflow = parent.commands.find((c) => c.name() === 'workflow');
91
25
  const workflow = existingWorkflow ??
92
26
  parent.command('workflow').description('workflow lifecycle commands (RD §4)');
93
- addJsonOption(workflow
94
- .command('init')
95
- .description('Initialize a workflow graph + canonical lease + caller index.')
96
- .requiredOption('--skill <name>', 'the skill owning this workflow (e.g. peaks-code)')
97
- .option('--workflow-id <id>', 'optional explicit workflowId (auto-generated if omitted)')
98
- .option('--parent-workflow <id>', 'parent workflowId for nested runs')
99
- .option('--session-id <sid>', 'override session id (default: derived from session.json / env)')
100
- .option('--project <path>', 'target project root (defaults to cwd)')).action(async (options) => {
101
- const asJson = options.json === true;
102
- try {
103
- const callerId = deriveCallerId();
104
- const projectRoot = deriveProjectRoot(options);
105
- const sessionId = deriveSessionId(options);
106
- if (sessionId === UNKNOWN_SESSION_ID) {
107
- printResult(io, buildSessionNotBoundEnvelope(sessionId, projectRoot), asJson);
108
- process.exitCode = 1;
109
- return;
110
- }
111
- const workflowId = options.workflowId ?? `wf-${Date.now().toString(36)}`;
112
- if (!WORKFLOW_ID_REGEX.test(workflowId)) {
113
- throw new Error(`workflowId shape invalid: ${workflowId}`);
114
- }
115
- const result = await initWorkflow({
116
- projectRoot,
117
- sessionId,
118
- callerId,
119
- skill: options.skill ?? 'peaks-code',
120
- workflowId,
121
- ...(options.parentWorkflow ? { parentWorkflowId: options.parentWorkflow } : {})
122
- });
123
- printResult(io, ok('workflow.init', {
124
- envelopeVersion: '4.0.8',
125
- workflowId: result.workflowId,
126
- graphRef: result.graphRef,
127
- events: result.events
128
- }), asJson);
129
- }
130
- catch (err) {
131
- const code = err.code ?? 'PEAKS_GRAPH_WRITE_FAILED';
132
- printResult(io, fail('workflow.init', code, getErrorMessage(err), { workflowId: null }, []), asJson);
133
- process.exitCode = 1;
134
- }
135
- });
136
- // Note: `.command('graph show')` and `.command('graph list')` each
137
- // implicitly create a NEW `graph` parent under `workflow` in
138
- // Commander v12 (no auto-reuse), so calling them in sequence throws
139
- // "cannot add command 'graph' as already have command 'graph'" at
140
- // startup. Reuse the first created `graph` parent for the second
141
- // registration.
142
- const graphCmd = workflow.command('graph').description('workflow graph read commands');
143
- graphCmd
144
- .command('show')
145
- .description('Read a workflow graph.')
146
- .option('--workflow <id>', 'workflow id')
147
- .option('--session-id <sid>', 'session id')
148
- .option('--project <path>', 'project root')
149
- .option('--json', 'json output')
150
- .action((options) => {
151
- const asJson = options.json === true;
152
- try {
153
- const sessionId = deriveSessionId(options);
154
- const projectRoot = deriveProjectRoot(options);
155
- const workflowId = options.workflow ?? '';
156
- if (!workflowId || !WORKFLOW_ID_REGEX.test(workflowId)) {
157
- throw new Error('workflowId is required');
158
- }
159
- const graph = readGraph({
160
- projectRoot,
161
- sessionId,
162
- graphRef: `graphs/${workflowId}.json`,
163
- workflowId
164
- });
165
- printResult(io, ok('workflow.graph.show', { envelopeVersion: '4.0.8', graph }), asJson);
166
- }
167
- catch (err) {
168
- const code = err.code ?? 'PEAKS_GRAPH_NOT_FOUND';
169
- printResult(io, fail('workflow.graph.show', code, getErrorMessage(err), { graph: null }, []), asJson);
170
- process.exitCode = 1;
171
- }
172
- });
173
- graphCmd
174
- .command('list')
175
- .description('List workflow graphs (metadata only).')
176
- .option('--session-id <sid>', 'session id')
177
- .option('--project <path>', 'project root')
178
- .option('--json', 'json output')
179
- .action((options) => {
180
- const asJson = options.json === true;
181
- try {
182
- const sessionId = deriveSessionId(options);
183
- if (sessionId === UNKNOWN_SESSION_ID) {
184
- throw new Error('PEAKS_SESSION_NOT_BOUND: no session id');
185
- }
186
- const result = { envelopeVersion: '4.0.8', sessionId, graphs: [] };
187
- printResult(io, ok('workflow.graph.list', result), asJson);
188
- }
189
- catch (err) {
190
- const code = err.code ?? 'PEAKS_SESSION_NOT_BOUND';
191
- printResult(io, fail('workflow.graph.list', code, getErrorMessage(err), { graphs: [] }, []), asJson);
192
- process.exitCode = 1;
193
- }
194
- });
195
- // Reuse one `node` parent for prepare / ack / mark-lost (Commander v12
196
- // creates a NEW parent per `.command('node X')` call, so we must
197
- // explicitly create the parent first to avoid duplicate-registration).
198
- const nodeCmd = workflow.command('node').description('workflow node commands');
199
- nodeCmd
200
- .command('prepare')
201
- .description('Prepare a node in a workflow graph.')
202
- .option('--workflow <id>', 'workflow id')
203
- .option('--node <id>', 'node id')
204
- .option('--kind <k>', 'node kind: step | dispatch | terminal')
205
- .option('--label <text>', 'human-readable label')
206
- .option('--depends-on <ids>', 'comma-separated list of dependency node ids')
207
- .option('--session-id <sid>', 'session id')
208
- .option('--project <path>', 'project root')
209
- .option('--json', 'json output')
210
- .action((options) => {
211
- const asJson = options.json === true;
212
- try {
213
- const sessionId = deriveSessionId(options);
214
- const projectRoot = deriveProjectRoot(options);
215
- const workflowId = options.workflow ?? '';
216
- if (!workflowId || !WORKFLOW_ID_REGEX.test(workflowId)) {
217
- throw new Error('workflowId is required');
218
- }
219
- const graphRef = `graphs/${workflowId}.json`;
220
- const existing = readGraph({ projectRoot, sessionId, graphRef, workflowId });
221
- const nodeId = options.node ?? `node-${Date.now().toString(36)}`;
222
- const kind = (options.kind ?? 'step');
223
- const dependsOn = (options.dependsOn ?? '')
224
- .split(',')
225
- .map((s) => s.trim())
226
- .filter((s) => s.length > 0);
227
- const updated = prepareNodeAction({
228
- workflowId,
229
- nodeId,
230
- graphNode: existing.nodes.find((n) => n.id === nodeId) ?? {
231
- id: nodeId,
232
- kind,
233
- label: options.label ?? nodeId,
234
- status: 'prepared',
235
- dependsOn
236
- },
237
- dependsOn,
238
- status: 'prepared'
239
- });
240
- // Persist via the graph store
241
- // (not inlined so the CLI delegates everything to the service).
242
- printResult(io, ok('workflow.node.prepare', { envelopeVersion: '4.0.8', graph: updated }), asJson);
243
- }
244
- catch (err) {
245
- const code = err.code ?? 'PEAKS_GRAPH_CORRUPTED';
246
- printResult(io, fail('workflow.node.prepare', code, getErrorMessage(err), { graph: null }, []), asJson);
247
- process.exitCode = 1;
248
- }
249
- });
250
- nodeCmd
251
- .command('ack')
252
- .description('Acknowledge a node that has an envelope-received status.')
253
- .option('--workflow <id>', 'workflow id')
254
- .option('--node <id>', 'node id')
255
- .option('--session-id <sid>', 'session id')
256
- .option('--project <path>', 'project root')
257
- .option('--json', 'json output')
258
- .action((options) => {
259
- const asJson = options.json === true;
260
- try {
261
- const sessionId = deriveSessionId(options);
262
- const projectRoot = deriveProjectRoot(options);
263
- const workflowId = options.workflow ?? '';
264
- if (!workflowId)
265
- throw new Error('workflowId is required');
266
- const graphRef = `graphs/${workflowId}.json`;
267
- const graph = readGraph({ projectRoot, sessionId, graphRef, workflowId });
268
- const nodeId = options.node ?? '';
269
- const node = graph.nodes.find((n) => n.id === nodeId);
270
- if (!node)
271
- throw new Error(`node ${nodeId} not found`);
272
- if (node.status !== 'envelope-received') {
273
- throw new Error('PEAKS_ENVELOPE_NOT_RECEIVED: node is not envelope-received');
274
- }
275
- const updated = transitionNode(node.status, 'consumed-by-parent', { graphNode: node });
276
- printResult(io, ok('workflow.node.ack', { envelopeVersion: '4.0.8', node: updated }), asJson);
277
- }
278
- catch (err) {
279
- const code = err.code ?? 'PEAKS_ENVELOPE_NOT_RECEIVED';
280
- printResult(io, fail('workflow.node.ack', code, getErrorMessage(err), { node: null }, []), asJson);
281
- process.exitCode = 1;
282
- }
283
- });
284
- nodeCmd
285
- .command('mark-lost')
286
- .description('Mark a node as lost.')
287
- .option('--workflow <id>', 'workflow id')
288
- .option('--node <id>', 'node id')
289
- .option('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
290
- .option('--session-id <sid>', 'session id')
291
- .option('--project <path>', 'project root')
292
- .option('--json', 'json output')
293
- .action((options) => {
294
- const asJson = options.json === true;
295
- try {
296
- const workflowId = options.workflow ?? '';
297
- if (!workflowId)
298
- throw new Error('workflowId is required');
299
- const nodeId = options.node ?? '';
300
- if (!nodeId)
301
- throw new Error('nodeId is required');
302
- const reason = options.reason ?? 'unknown';
303
- if (!TERMINAL_REASONS.includes(reason)) {
304
- throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${reason}`);
305
- }
306
- printResult(io, ok('workflow.node.mark-lost', {
307
- envelopeVersion: '4.0.8',
308
- workflowId,
309
- nodeId,
310
- status: 'lost',
311
- terminalReason: reason
312
- }), asJson);
313
- }
314
- catch (err) {
315
- const code = err.code ?? 'PEAKS_TERMINAL_REASON_INVALID';
316
- printResult(io, fail('workflow.node.mark-lost', code, getErrorMessage(err), { node: null }, []), asJson);
317
- process.exitCode = 1;
318
- }
319
- });
320
- addJsonOption(workflow
321
- .command('terminalize')
322
- .description('Atomically terminalize a workflow (lease + graph + index + observability event).')
323
- .requiredOption('--workflow <id>', 'workflow id')
324
- .requiredOption('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
325
- .option('--session-id <sid>', 'session id')
326
- .option('--project <path>', 'project root')
327
- .option('--require-consumed', 'fail if there are unconsumed envelopes')).action(async (options) => {
328
- const asJson = options.json === true;
329
- try {
330
- const callerId = deriveCallerId();
331
- const sessionId = deriveSessionId(options);
332
- const projectRoot = deriveProjectRoot(options);
333
- const workflowId = options.workflow ?? '';
334
- if (!workflowId)
335
- throw new Error('workflowId is required');
336
- if (!TERMINAL_REASONS.includes(options.reason)) {
337
- throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${options.reason}`);
338
- }
339
- const result = await terminalizeWorkflow({
340
- projectRoot,
341
- sessionId,
342
- callerId,
343
- workflowId,
344
- graphRef: `graphs/${workflowId}.json`,
345
- reason: options.reason,
346
- ...(options.requireConsumed ? { requireConsumed: true } : {})
347
- });
348
- printResult(io, ok('workflow.terminalize', {
349
- envelopeVersion: '4.0.8',
350
- lease: result.lease,
351
- graph: result.graph,
352
- events: result.events,
353
- indexCleared: result.indexCleared
354
- }), asJson);
355
- }
356
- catch (err) {
357
- const code = err.code ?? 'PEAKS_TERMINALIZE_ATOMICITY_FAILED';
358
- printResult(io, fail('workflow.terminalize', code, getErrorMessage(err), { lease: null }, []), asJson);
359
- process.exitCode = 1;
360
- }
361
- });
362
- // Suppress unused-import warnings for symbols reserved for future slices.
363
- void transitionLease;
364
- void emptyGraph;
27
+ registerWorkflowInitCommand(workflow, io);
28
+ registerWorkflowGraphCommands(workflow, io);
29
+ registerWorkflowNodeCommands(workflow, io);
30
+ registerWorkflowTerminalizeCommand(workflow, io);
365
31
  }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerWorkflowNodeCommands(workflow: Command, io: ProgramIO): void;
@@ -0,0 +1,154 @@
1
+ // src/cli/commands/workflow-node-commands.ts
2
+ //
3
+ // `peaks workflow node prepare` / `node ack` / `node mark-lost` — the workflow
4
+ // node lifecycle verbs. Split out of `workflow-lifecycle-commands.ts`; every
5
+ // verb name, option and envelope shape is unchanged.
6
+ import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
7
+ import { printResult } from '../cli-helpers.js';
8
+ import { readGraph } from '../../services/workflow/workflow-graph-store.js';
9
+ import { prepareNodeAction, transitionNode } from '../../services/workflow/workflow-node-lifecycle.js';
10
+ import { TERMINAL_REASONS, WORKFLOW_ID_REGEX } from '../../services/workflow/workflow-graph-types.js';
11
+ import { deriveProjectRoot, deriveSessionId, GENERATED_ID_RADIX } from './workflow-command-shared.js';
12
+ /** The comma-separated `--depends-on` list, trimmed, with empties removed. */
13
+ function parseDependsOn(raw) {
14
+ return (raw ?? '')
15
+ .split(',')
16
+ .map((s) => s.trim())
17
+ .filter((s) => s.length > 0);
18
+ }
19
+ /** The node this `prepare` acts on: the one already in the graph, or the new default. */
20
+ function prepareGraphNode(existing, request) {
21
+ return (existing.nodes.find((n) => n.id === request.nodeId) ?? {
22
+ id: request.nodeId,
23
+ kind: request.kind,
24
+ label: request.label ?? request.nodeId,
25
+ status: 'prepared',
26
+ dependsOn: request.dependsOn
27
+ });
28
+ }
29
+ function runWorkflowNodePrepare(io, options) {
30
+ const asJson = options.json === true;
31
+ try {
32
+ const sessionId = deriveSessionId(options);
33
+ const projectRoot = deriveProjectRoot(options);
34
+ const workflowId = options.workflow ?? '';
35
+ if (!workflowId || !WORKFLOW_ID_REGEX.test(workflowId)) {
36
+ throw new Error('workflowId is required');
37
+ }
38
+ const graphRef = `graphs/${workflowId}.json`;
39
+ const existing = readGraph({ projectRoot, sessionId, graphRef, workflowId });
40
+ const nodeId = options.node ?? `node-${Date.now().toString(GENERATED_ID_RADIX)}`;
41
+ const kind = (options.kind ?? 'step');
42
+ const dependsOn = parseDependsOn(options.dependsOn);
43
+ const updated = prepareNodeAction({
44
+ workflowId,
45
+ nodeId,
46
+ graphNode: prepareGraphNode(existing, {
47
+ nodeId,
48
+ kind,
49
+ label: options.label,
50
+ dependsOn
51
+ }),
52
+ dependsOn,
53
+ status: 'prepared'
54
+ });
55
+ // Persist via the graph store
56
+ // (not inlined so the CLI delegates everything to the service).
57
+ printResult(io, ok('workflow.node.prepare', { envelopeVersion: '4.0.8', graph: updated }), asJson);
58
+ }
59
+ catch (err) {
60
+ const code = err.code ?? 'PEAKS_GRAPH_CORRUPTED';
61
+ printResult(io, fail('workflow.node.prepare', code, getErrorMessage(err), { graph: null }, []), asJson);
62
+ process.exitCode = 1;
63
+ }
64
+ }
65
+ function runWorkflowNodeAck(io, options) {
66
+ const asJson = options.json === true;
67
+ try {
68
+ const sessionId = deriveSessionId(options);
69
+ const projectRoot = deriveProjectRoot(options);
70
+ const workflowId = options.workflow ?? '';
71
+ if (!workflowId)
72
+ throw new Error('workflowId is required');
73
+ const graphRef = `graphs/${workflowId}.json`;
74
+ const graph = readGraph({ projectRoot, sessionId, graphRef, workflowId });
75
+ const nodeId = options.node ?? '';
76
+ const node = graph.nodes.find((n) => n.id === nodeId);
77
+ if (!node)
78
+ throw new Error(`node ${nodeId} not found`);
79
+ if (node.status !== 'envelope-received') {
80
+ throw new Error('PEAKS_ENVELOPE_NOT_RECEIVED: node is not envelope-received');
81
+ }
82
+ const updated = transitionNode(node.status, 'consumed-by-parent', { graphNode: node });
83
+ printResult(io, ok('workflow.node.ack', { envelopeVersion: '4.0.8', node: updated }), asJson);
84
+ }
85
+ catch (err) {
86
+ const code = err.code ?? 'PEAKS_ENVELOPE_NOT_RECEIVED';
87
+ printResult(io, fail('workflow.node.ack', code, getErrorMessage(err), { node: null }, []), asJson);
88
+ process.exitCode = 1;
89
+ }
90
+ }
91
+ function runWorkflowNodeMarkLost(io, options) {
92
+ const asJson = options.json === true;
93
+ try {
94
+ const workflowId = options.workflow ?? '';
95
+ if (!workflowId)
96
+ throw new Error('workflowId is required');
97
+ const nodeId = options.node ?? '';
98
+ if (!nodeId)
99
+ throw new Error('nodeId is required');
100
+ const reason = options.reason ?? 'unknown';
101
+ if (!TERMINAL_REASONS.includes(reason)) {
102
+ throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${reason}`);
103
+ }
104
+ printResult(io, ok('workflow.node.mark-lost', {
105
+ envelopeVersion: '4.0.8',
106
+ workflowId,
107
+ nodeId,
108
+ status: 'lost',
109
+ terminalReason: reason
110
+ }), asJson);
111
+ }
112
+ catch (err) {
113
+ const code = err.code ?? 'PEAKS_TERMINAL_REASON_INVALID';
114
+ printResult(io, fail('workflow.node.mark-lost', code, getErrorMessage(err), { node: null }, []), asJson);
115
+ process.exitCode = 1;
116
+ }
117
+ }
118
+ export function registerWorkflowNodeCommands(workflow, io) {
119
+ // Reuse one `node` parent for prepare / ack / mark-lost (Commander v12
120
+ // creates a NEW parent per `.command('node X')` call, so we must
121
+ // explicitly create the parent first to avoid duplicate-registration).
122
+ const nodeCmd = workflow.command('node').description('workflow node commands');
123
+ nodeCmd
124
+ .command('prepare')
125
+ .description('Prepare a node in a workflow graph.')
126
+ .option('--workflow <id>', 'workflow id')
127
+ .option('--node <id>', 'node id')
128
+ .option('--kind <k>', 'node kind: step | dispatch | terminal')
129
+ .option('--label <text>', 'human-readable label')
130
+ .option('--depends-on <ids>', 'comma-separated list of dependency node ids')
131
+ .option('--session-id <sid>', 'session id')
132
+ .option('--project <path>', 'project root')
133
+ .option('--json', 'json output')
134
+ .action((options) => runWorkflowNodePrepare(io, options));
135
+ nodeCmd
136
+ .command('ack')
137
+ .description('Acknowledge a node that has an envelope-received status.')
138
+ .option('--workflow <id>', 'workflow id')
139
+ .option('--node <id>', 'node id')
140
+ .option('--session-id <sid>', 'session id')
141
+ .option('--project <path>', 'project root')
142
+ .option('--json', 'json output')
143
+ .action((options) => runWorkflowNodeAck(io, options));
144
+ nodeCmd
145
+ .command('mark-lost')
146
+ .description('Mark a node as lost.')
147
+ .option('--workflow <id>', 'workflow id')
148
+ .option('--node <id>', 'node id')
149
+ .option('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
150
+ .option('--session-id <sid>', 'session id')
151
+ .option('--project <path>', 'project root')
152
+ .option('--json', 'json output')
153
+ .action((options) => runWorkflowNodeMarkLost(io, options));
154
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerWorkflowTerminalizeCommand(workflow: Command, io: ProgramIO): void;
@@ -0,0 +1,56 @@
1
+ // src/cli/commands/workflow-terminalize-command.ts
2
+ //
3
+ // `peaks workflow terminalize` — atomically terminalize a workflow (lease +
4
+ // graph + index + observability event). Split out of
5
+ // `workflow-lifecycle-commands.ts`; the verb name, its options, the
6
+ // `--require-consumed` passthrough and the envelope shape are unchanged.
7
+ import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
8
+ import { addJsonOption, printResult } from '../cli-helpers.js';
9
+ import { terminalizeWorkflow } from '../../services/workflow/workflow-presence-lifecycle.js';
10
+ import { TERMINAL_REASONS } from '../../services/workflow/workflow-graph-types.js';
11
+ import { deriveCallerId, deriveProjectRoot, deriveSessionId } from './workflow-command-shared.js';
12
+ async function runWorkflowTerminalize(io, options) {
13
+ const asJson = options.json === true;
14
+ try {
15
+ const callerId = deriveCallerId();
16
+ const sessionId = deriveSessionId(options);
17
+ const projectRoot = deriveProjectRoot(options);
18
+ const workflowId = options.workflow ?? '';
19
+ if (!workflowId)
20
+ throw new Error('workflowId is required');
21
+ if (!TERMINAL_REASONS.includes(options.reason)) {
22
+ throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${options.reason}`);
23
+ }
24
+ const result = await terminalizeWorkflow({
25
+ projectRoot,
26
+ sessionId,
27
+ callerId,
28
+ workflowId,
29
+ graphRef: `graphs/${workflowId}.json`,
30
+ reason: options.reason,
31
+ ...(options.requireConsumed ? { requireConsumed: true } : {})
32
+ });
33
+ printResult(io, ok('workflow.terminalize', {
34
+ envelopeVersion: '4.0.8',
35
+ lease: result.lease,
36
+ graph: result.graph,
37
+ events: result.events,
38
+ indexCleared: result.indexCleared
39
+ }), asJson);
40
+ }
41
+ catch (err) {
42
+ const code = err.code ?? 'PEAKS_TERMINALIZE_ATOMICITY_FAILED';
43
+ printResult(io, fail('workflow.terminalize', code, getErrorMessage(err), { lease: null }, []), asJson);
44
+ process.exitCode = 1;
45
+ }
46
+ }
47
+ export function registerWorkflowTerminalizeCommand(workflow, io) {
48
+ addJsonOption(workflow
49
+ .command('terminalize')
50
+ .description('Atomically terminalize a workflow (lease + graph + index + observability event).')
51
+ .requiredOption('--workflow <id>', 'workflow id')
52
+ .requiredOption('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
53
+ .option('--session-id <sid>', 'session id')
54
+ .option('--project <path>', 'project root')
55
+ .option('--require-consumed', 'fail if there are unconsumed envelopes')).action((options) => runWorkflowTerminalize(io, options));
56
+ }
@@ -0,0 +1,54 @@
1
+ import { type HarnessWindowSyncResult } from '../context/harness-window-config.js';
2
+ import type { ConvergencePlan } from '../context/auto-compact-types.js';
3
+ /**
4
+ * What the caller is told to do next. The harness-window notice rides along because
5
+ * the run also rewrites the harness's own settings, so it says so too: the user
6
+ * accepted that write on the condition 要告知, and a write only one of the two
7
+ * syncing commands reports is not a notice.
8
+ */
9
+ export declare function compactNextActions(isRedLine: boolean, harnessWindow: HarnessWindowSyncResult | null): readonly string[];
10
+ /**
11
+ * Append a one-row convergence decision to the LLM-readable log.
12
+ * The LLM reads this on the post-compact turn to pick up exactly
13
+ * where it left off (vs. blindly trusting the IDE's compressed
14
+ * transcript).
15
+ */
16
+ export declare function appendAutoDecisionLog(input: {
17
+ readonly projectRoot: string;
18
+ readonly sessionId: string;
19
+ readonly plan: ConvergencePlan;
20
+ }): void;
21
+ /**
22
+ * main-session compact intent so the main-session LLM picks it up on
23
+ * its next turn and fires `/compact` in-band. Without this file the
24
+ * orchestrator's "main-session compact" request is invisible to the
25
+ * main Claude Code window (defeats the whole point of auto-compact
26
+ * for the main context).
27
+ *
28
+ * The file is gitignored under `.peaks/_runtime/<sessionId>/txt/` and
29
+ * is one-shot: the LLM should `mv` it to `.consumed` after firing
30
+ * `/compact`. A re-run will overwrite.
31
+ *
32
+ * write survives, but nothing consumes the file, and its `nextAction` asks
33
+ * for a `/compact` the model cannot invoke (the Skill tool exposes only
34
+ * `/init` and `/security-review`; hooks can observe or veto, never initiate).
35
+ * Retained deliberately for the sibling A2 slice, which owns harness-side
36
+ * state re-injection. Not a capability peaks-loop has today.
37
+ */
38
+ export declare function writeMainSessionCompactIntent(input: {
39
+ readonly projectRoot: string;
40
+ readonly sessionId: string;
41
+ readonly ratio: number;
42
+ readonly redLine: boolean;
43
+ readonly now: Date;
44
+ }): void;
45
+ /**
46
+ * Write a pre-compact checkpoint. The shape mirrors `peaks session
47
+ * checkpoint` so D7's post-compact-detect picks it up unchanged.
48
+ */
49
+ export declare function writePreCompactCheckpoint(input: {
50
+ readonly projectRoot: string;
51
+ readonly sessionId: string;
52
+ readonly now: Date;
53
+ readonly redLine?: boolean;
54
+ }): string;