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
@@ -1,283 +1,113 @@
1
1
  /**
2
+ * The `--from-dag` path of `peaks sub-agent dispatch`.
2
3
  *
3
- * Pulled out of `dispatch-commands.ts` to honor the 800-line file cap
4
- * (Karpathy #2 Simplicity First). The single-dispatch action stays in
5
- * `dispatch-commands.ts`; the DAG-dispatch path lives here because the
6
- * two paths share no logic — the warm-path single dispatch does NOT
7
- * load slice-dag / dag-orchestrator / contract-store (slice 9 perf),
8
- * while the --from-dag codepath loads all three on first call.
4
+ * Pulled out of `dispatch-commands.ts` to honor the file-size cap (Karpathy #2
5
+ * Simplicity First). The single-dispatch action stays in `dispatch-commands.ts`;
6
+ * the DAG-dispatch path lives here because the two share no logic — the
7
+ * warm-path single dispatch does NOT load slice-dag / dag-orchestrator /
8
+ * contract-store (slice 9 perf), while the `--from-dag` codepath loads all
9
+ * three on first call.
9
10
  *
10
- * 2.7.0 slice-dag-dispatcher MVP: read a SliceDag from a file and run
11
- * it through `runDag`. The orchestrator's `runSlice` is a thin wrapper
12
- * that emits the per-IDE `buildToolCall` envelope for each topological
13
- * level.
11
+ * 2.7.0 slice-dag-dispatcher MVP: read a SliceDag from a file and run it
12
+ * through `runLayeredDag`. The orchestrator's `runSlice` is a thin wrapper
13
+ * that emits the per-IDE `buildToolCall` envelope for each topological level.
14
14
  *
15
15
  * 1.2 MVP scope: this dispatches the FIRST topological level synchronously
16
- * (returns the dispatch specs); subsequent levels are not surfaced in
17
- * the CLI envelope because the LLM-side runner must actually execute
18
- * each `buildToolCall` and write the resulting contract before level 2+
19
- * can be safely auto-advanced. The LLM re-invokes
20
- * `peaks sub-agent dispatch --from-dag <file> --batch-id <id>` after
21
- * writing level-1 contracts, which causes runDag to plan level 2+ with
22
- * the level-1 ancestor contracts spliced into their dispatch prompts.
16
+ * (returns the dispatch specs); subsequent levels are not surfaced in the CLI
17
+ * envelope because the LLM-side runner must actually execute each
18
+ * `buildToolCall` and write the resulting contract before level 2+ can be
19
+ * safely auto-advanced. The LLM re-invokes `peaks sub-agent dispatch --from-dag
20
+ * <file> --batch-id <id>` after writing level-1 contracts, which causes
21
+ * `runLayeredDag` to plan level 2+ with the level-1 ancestor contracts spliced
22
+ * into their dispatch prompts.
23
23
  *
24
- * Internally, runDag DOES iterate all levels so its join-barrier +
25
- * cancel-on-fail path is exercised end-to-end during the MVP emit; only
26
- * the CLI envelope is filtered to level-1 toolCalls (see `firstLevelIds`).
24
+ * Internally, `runLayeredDag` DOES iterate all levels so its join-barrier +
25
+ * cancel-on-fail path is exercised end-to-end during the MVP emit; only the
26
+ * CLI envelope is filtered to level-1 toolCalls (see `firstLevelIds`).
27
27
  */
28
- import { randomUUID } from 'node:crypto';
29
28
  import { printResult } from '../cli-helpers.js';
30
- import { fail, ok } from 'peaks-loop-shared/result';
31
- import { detectInstalledIde } from '../../services/ide/ide-detector.js';
32
- import { getAdapter } from '../../services/ide/ide-registry.js';
33
- import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
34
- import { planFileOverlapWaves } from '../../services/dispatch/file-overlap-wave-planner.js';
29
+ import { buildDagSuccessEnvelope } from './dispatch-dag-envelope.js';
30
+ import { emitDagFailure } from './dispatch-dag-failure.js';
31
+ import { assertGraphNodesMapped, loadDagRuntime, readDagOrFail, resolveDagIds, topologicalLevelsOrFail } from './dispatch-dag-preflight.js';
32
+ import { makeCliRunner, makeNoopWriter, planFirstLevelWaves, resolveDagDispatcher } from './dispatch-dag-runners.js';
35
33
  export async function runDispatchFromDag(role, options, asJson, io) {
36
34
  if (!options.fromDag)
37
35
  return;
38
- const projectRoot = options.project ?? process.cwd();
39
- // Auto-resolve sid from .peaks/_runtime/session.json before falling back.
40
- const sid = options.sessionId ??
41
- process.env.PEAKS_SESSION_ID ??
42
- getCurrentSessionId(projectRoot) ??
43
- 'unknown-sid';
44
- const rid = options.requestId ?? 'unknown-rid';
45
- const batchId = options.batchId ?? randomUUID();
46
- // Slice 9 (dispatch CLI latency): the --from-dag codepath loads three
47
- // heavy modules (slice-dag, dag-orchestrator, contract-store) that
48
- // transitively import 10+ more services. They are NOT touched by the
49
- // warm-path single-dispatch action, so we lazy-load them here only
50
- // when --from-dag is actually requested. The dynamic-import promise
51
- // resolves on first call, then ESM caches the module for subsequent
52
- // calls in the same process.
53
- const [{ readFileSync }, sliceDagMod, dagOrchestratorMod, contractStoreMod] = await Promise.all([
54
- import('node:fs'),
55
- import('../../services/dispatch/slice-dag.js'),
56
- import('../../services/code/dag-orchestrator.js'),
57
- import('../../services/dispatch/contract-store.js')
58
- ]);
59
- const { validateDag, topologicalLevels, isSliceComplexity } = sliceDagMod;
60
- const { runLayeredDag } = dagOrchestratorMod;
61
- const { listContracts, hashContract } = contractStoreMod;
62
- let dag;
63
- try {
64
- const raw = readFileSync(options.fromDag, 'utf8');
65
- const parsed = JSON.parse(raw);
66
- validateDag(parsed);
67
- dag = parsed;
68
- }
69
- catch (err) {
70
- printResult(io, fail('sub-agent.dispatch', 'INVALID_DAG', `failed to read or validate DAG from ${options.fromDag}: ${err.message}`, { role, toolCall: null, dispatchRecordPath: null }, [
71
- 'Check the JSON file at the given path; the DAG must have {nodes, edges} and pass validateDag().'
72
- ]), asJson);
73
- process.exitCode = 1;
36
+ const scope = { role, asJson, io };
37
+ const ids = resolveDagIds(options);
38
+ const runtime = await loadDagRuntime();
39
+ const dag = readDagOrFail(runtime, options.fromDag, scope);
40
+ if (dag === null)
74
41
  return;
75
- }
76
- // Slice 4.0.8 RD §4 D4c: each DAG node must map to an explicitly
77
- // prepared workflow graph node before sub-agent dispatch. Reject
78
- // unmapped nodes with PEAKS_GRAPH_NODE_REQUIRED. The mapping is
79
- // carried via the `graphNode` annotation on each DAG node, OR — as
80
- // a back-compat fallback for DAGs without the annotation — the
81
- // DAG node id itself is treated as the graph node id. Either way,
82
- // the graph node must be prepared (RD §3 D4c) before the dispatch
83
- // CLI runs.
84
- for (const node of dag.nodes) {
85
- const graphNodeId = node.graphNode;
86
- const candidate = typeof graphNodeId === 'string' && graphNodeId.length > 0 ? graphNodeId : node.id;
87
- if (typeof candidate !== 'string' || candidate.length === 0) {
88
- printResult(io, fail('sub-agent.dispatch', 'PEAKS_GRAPH_NODE_REQUIRED', `DAG node ${node.id} has no graph-node mapping (RD §4 D4c)`, { role, toolCall: null, dispatchRecordPath: null, dagNodeId: node.id }, [
89
- 'Annotate the DAG node with `graphNode: "<id>"` so each dispatch can bind a prepared graph node.'
90
- ]), asJson);
91
- process.exitCode = 1;
92
- return;
93
- }
94
- }
95
- // MVP (1.2): the orchestrator iterates topological levels + join
96
- // barrier + cancel-on-fail end-to-end. The CLI's runner returns `done`
97
- // for every leaf (so runDag's cancel-on-fail path is exercised when a
98
- // leaf actually fails); the CLI envelope filters `emittedToolCalls` to
99
- // the first level only (see `firstLevelIds`). The LLM-side runner
100
- // re-invokes `--from-dag` for level 2+ after writing level-1
101
- // contracts via `peaks contract write`.
102
- let levelArr;
103
- try {
104
- levelArr = topologicalLevels(dag);
105
- }
106
- catch (err) {
107
- printResult(io, fail('sub-agent.dispatch', 'INVALID_DAG', `topologicalLevels failed for ${options.fromDag}: ${err.message}`, { role, toolCall: null, dispatchRecordPath: null }, [
108
- 'The DAG passed validateDag() but topologicalLevels threw (likely a cycle that slipped past validateDag, or a runtime invariant).',
109
- 'Inspect the DAG file with the editor and re-invoke dispatch. (No peaks scan dag CLI ships in 2.7.0; if you need a programmatic DAG validator, import validateDag / topologicalLevels from src/services/dispatch/slice-dag.ts directly.)'
110
- ]), asJson);
111
- process.exitCode = 1;
42
+ if (assertGraphNodesMapped(dag, scope) === null)
112
43
  return;
113
- }
114
- // Read upstream contracts so downstream-level prompts (when re-invoked
115
- // for level 2+) get auto-injected ancestors via `formatContractInjection`.
116
- // At level-1 emit time, contracts is empty (no ancestors yet); the
117
- // injection matters when the LLM re-invokes for level 2+ after writing
118
- // level-1 contracts via `writeContract`.
119
- const existingContracts = listContracts(projectRoot, sid);
120
- const ide = detectInstalledIde(projectRoot) ?? 'claude-code';
121
- const adapter = getAdapter(ide);
122
- const dispatcher = adapter.subAgentDispatcher;
123
- if (!dispatcher.supportsRole(role)) {
124
- printResult(io, fail('sub-agent.dispatch', 'IDE_NOT_SUPPORTED', `IDE ${ide} does not support role "${role}"`, { role, toolCall: null, dispatchRecordPath: null }, ['Switch to a registered IDE (e.g. claude-code) or pick a role the current IDE supports.']), asJson);
125
- process.exitCode = 1;
44
+ const levelArr = topologicalLevelsOrFail(runtime, dag, options.fromDag, scope);
45
+ if (levelArr === null)
46
+ return;
47
+ const dispatched = resolveDagDispatcher(ids.projectRoot);
48
+ if (!dispatched.dispatcher.supportsRole(role)) {
49
+ emitDagFailure(io, asJson, {
50
+ role,
51
+ code: 'IDE_NOT_SUPPORTED',
52
+ message: `IDE ${dispatched.ide} does not support role "${role}"`,
53
+ nextActions: [
54
+ 'Switch to a registered IDE (e.g. claude-code) or pick a role the current IDE supports.'
55
+ ]
56
+ });
126
57
  return;
127
58
  }
128
- // Track per-level emissions so the CLI envelope can expose ONLY the
129
- // first topological level to the LLM (matching MVP 1.2 semantics: LLM
130
- // executes level-1 toolCalls, writes contracts via `peaks contract
131
- // write`, then re-invokes `--from-dag` for level 2+). Level-2+ leaves
132
- // still flow through runDag's join-barrier — their toolCalls are
133
- // generated internally so the orchestrator's happy path is exercised
134
- // end-to-end, but they are NOT surfaced in the CLI envelope (the LLM
135
- // sees them only after re-invoking with fresh level-1 contracts).
59
+ await runLevels({ runtime, dag, levelArr, dispatched, ids, scope, fromDag: options.fromDag });
60
+ }
61
+ /**
62
+ * Run every topological level through `runLayeredDag` and print the level-1
63
+ * envelope. Upstream contracts are read first so downstream-level prompts get
64
+ * auto-injected ancestors via `formatContractInjection` (empty at level-1 emit
65
+ * time, which is when the LLM re-invokes with fresh level-1 contracts).
66
+ */
67
+ async function runLevels(run) {
68
+ const { runtime, dag, levelArr, dispatched, ids, scope, fromDag } = run;
69
+ const existingContracts = runtime.listContracts(ids.projectRoot, ids.sid);
136
70
  const firstLevelIds = new Set(levelArr[0] ?? []);
137
- // node declares `files`, refine the level into file-overlap waves so the
138
- // LLM fans out without serializing on a shared file. Emitted additively
139
- // in the envelope; the topological dispatch flow itself is unchanged.
140
- // Nodes without `files` → `firstLevelWaves: null` (legacy envelope).
141
- const firstLevelDescriptors = [...firstLevelIds].map((id) => ({
142
- id,
143
- files: dag.nodes.find((n) => n.id === id)?.files ?? []
144
- }));
145
- const firstLevelWaves = firstLevelDescriptors.length > 0 && firstLevelDescriptors.every((d) => d.files.length > 0)
146
- ? planFileOverlapWaves(firstLevelDescriptors).waves
147
- : null;
148
- const emittedToolCalls = [];
149
- const emittedSliceIds = [];
150
- // CLI runner: emit the per-slice `buildToolCall` envelope, then return
151
- // `done` with an empty `publicSurface` placeholder. The orchestrator
152
- // treats the slice as "CLI-emitted, awaiting LLM-side execution" and
153
- // advances to the next topological level (or breaks on failure). The
154
- // placeholder surface is intentionally empty: the real public surface
155
- // arrives later via `peaks contract write` from the LLM-side runner,
156
- // and overwrites the CLI placeholder contract written by `noopWriter`.
157
- // Why not `cancelled`? Returning `cancelled` here short-circuits
158
- // runDag's join-barrier + cancel-on-fail path — the orchestrator
159
- // breaks out after the first level with a cancellation, which hides
160
- // the real cancel-on-fail semantics from the test suite (and from any
161
- // future caller that wants to use `runDag` end-to-end from the CLI).
162
- // Returning `done` exercises the full happy path; cancel-on-fail
163
- // semantics will be covered when 1.3 lands real per-IDE await.
164
- const cliRunner = async (spec) => {
165
- const toolCall = dispatcher.buildToolCall({
166
- role: spec.role,
167
- prompt: spec.prompt,
168
- requestId: rid,
169
- sessionId: sid
170
- });
171
- if (firstLevelIds.has(spec.sliceId)) {
172
- emittedToolCalls.push(toolCall);
173
- emittedSliceIds.push(spec.sliceId);
174
- }
175
- return {
176
- status: 'done',
177
- publicSurface: {
178
- exports: [],
179
- types: [],
180
- publicSignatures: []
181
- }
182
- };
183
- };
184
- // CLI noop writer — the orchestrator collects a `SliceContract` per
185
- // emitted toolCall so downstream re-invocations (level 2+) can splice
186
- // ancestor contracts via `formatContractInjection`. We don't write to
187
- // disk here (the LLM-side runner does that via `peaks contract write`
188
- // after each toolCall resolves), but the returned placeholder MUST be
189
- // shape-valid: the `contractHash` field has to be a real SHA-256 hex
190
- // string so formatContractInjection + downstream validators don't
191
- // reject the placeholder. The placeholder hash is computed from the
192
- // slice identity only (`sliceId|sessionId`) — it's deterministic,
193
- // stable, and collision-free for the MVP run, but obviously does NOT
194
- // represent the slice's actual public surface. The LLM-side runner's
195
- // `peaks contract write` call will overwrite this with a content-based
196
- // hash once the slice finishes.
197
- const noopWriter = (sliceId, _publicSurface) => {
198
- const partial = {
199
- sliceId,
200
- sessionId: sid,
201
- exports: [],
202
- types: [],
203
- publicSignatures: []
204
- };
205
- return {
206
- sliceId,
207
- sessionId: sid,
208
- completedAt: new Date(0).toISOString(), // epoch sentinel = "placeholder, not yet finished"
209
- exports: [],
210
- types: [],
211
- publicSignatures: [],
212
- contractHash: hashContract(partial)
213
- };
214
- };
215
- // runLayeredDag IS in the path: validates the DAG, iterates all
216
- // topological levels (foundation/upstreamSync slices prioritized within
217
- // each level by `topologicalLevels`), runs the join barrier after
218
- // each level, and triggers cancel-on-fail rollback if any leaf
219
- // returns `failed` (or `cancelled`, once 1.3 lands). The CLI
220
- // envelope below filters `emittedToolCalls` / `emittedSliceIds` to
221
- // the first level — see the `firstLevelIds` filter inside `cliRunner`.
71
+ const emissions = { toolCalls: [], sliceIds: [] };
72
+ const runSlice = makeCliRunner({
73
+ firstLevelIds,
74
+ dispatcher: dispatched.dispatcher,
75
+ ids,
76
+ emissions
77
+ });
78
+ const writeContractFn = makeNoopWriter(runtime.hashContract, ids.sid);
222
79
  try {
223
- await runLayeredDag(dag, {
224
- projectRoot,
225
- sessionId: sid,
80
+ await runtime.runLayeredDag(dag, {
81
+ projectRoot: ids.projectRoot,
82
+ sessionId: ids.sid,
226
83
  existingContracts,
227
- runSlice: cliRunner,
228
- writeContractFn: noopWriter
84
+ runSlice,
85
+ writeContractFn
229
86
  });
230
87
  }
231
88
  catch (err) {
232
- // runLayeredDag throws DagPlanError for plan-level failures (e.g.
233
- // cycle slipping past validateDag). Surface it as INVALID_DAG so
234
- // the CLI envelope has a clear failure code, not a generic
235
- // DISPATCH_ERROR.
236
- printResult(io, fail('sub-agent.dispatch', 'INVALID_DAG', `runLayeredDag failed for ${options.fromDag}: ${err.message}`, { role, toolCall: null, dispatchRecordPath: null }, [
237
- 'runLayeredDag threw DagPlanError; the DAG passed validateDag() but failed at topologicalLevels or contractStore dispatch.',
238
- 'Inspect the DAG file and re-run.'
239
- ]), asJson);
240
- process.exitCode = 1;
89
+ emitDagFailure(scope.io, scope.asJson, {
90
+ role: scope.role,
91
+ code: 'INVALID_DAG',
92
+ message: `runLayeredDag failed for ${fromDag}: ${err.message}`,
93
+ nextActions: [
94
+ 'runLayeredDag threw DagPlanError; the DAG passed validateDag() but failed at topologicalLevels or contractStore dispatch.',
95
+ 'Inspect the DAG file and re-run.'
96
+ ]
97
+ });
241
98
  return;
242
99
  }
243
- printResult(io, ok('sub-agent.dispatch', {
244
- envelopeVersion: '2.1.0',
245
- role,
246
- ide: dispatcher.label,
247
- fromDag: options.fromDag,
248
- batchId,
249
- dispatchCount: emittedSliceIds.length,
100
+ printResult(scope.io, buildDagSuccessEnvelope({
101
+ role: scope.role,
102
+ ide: dispatched.dispatcher.label,
103
+ fromDag,
104
+ batchId: ids.batchId,
250
105
  levelsTotal: levelArr.length,
251
- firstLevel: emittedSliceIds,
252
- // §3: file-overlap wave plan for the first level (null when any
253
- // first-level node omits `files`). Additive field.
254
- firstLevelWaves,
255
- toolCalls: emittedToolCalls,
106
+ emittedSliceIds: emissions.sliceIds,
107
+ emittedToolCalls: emissions.toolCalls,
108
+ firstLevelWaves: planFirstLevelWaves(dag, levelArr),
256
109
  existingContractCount: existingContracts.length,
257
- expectedCompletionSeconds: 60,
258
- artifactsPublicPaths: [],
259
- orchestratorVisibleHint: `⏳ Spawning ${emittedSliceIds.length} sub-agents via Task tool from DAG ${options.fromDag}, batch-id=${batchId} (ETA ~60s)`,
260
- // v2.15.0 follow-up — G12/G11/G2: per-slice metadata (foundation /
261
- // upstreamSync / complexity) for downstream scheduling decisions.
262
- sliceMeta: emittedSliceIds.map((id) => {
263
- const node = dag.nodes.find((n) => n.id === id);
264
- return {
265
- id,
266
- foundation: node?.foundation === true,
267
- upstreamSync: node?.upstreamSync === true,
268
- complexity: node?.complexity !== undefined && isSliceComplexity(node.complexity)
269
- ? node.complexity
270
- : null
271
- };
272
- }),
273
- nextActions: [
274
- 'Execute each toolCall in your IDE; on completion, write the slice contract to .peaks/_runtime/<sid>/dispatch/contracts/<slice-id>.json.',
275
- 'Re-invoke `peaks sub-agent dispatch --from-dag <file>` with the same batch-id to advance to the next level once all current-level slices have written contracts.'
276
- ]
277
- }, [], [
278
- 'MVP (1.2) plans the first level via runLayeredDag orchestrator (cancel-on-fail path active); the LLM drives subsequent levels by re-invoking this command after contract writes.',
279
- existingContracts.length > 0
280
- ? `Injected ${existingContracts.length} upstream contract(s) into downstream-level prompts via formatContractInjection.`
281
- : 'No upstream contracts found; first-level prompts have empty ancestor blocks.'
282
- ]), asJson);
110
+ dag,
111
+ isSliceComplexity: runtime.isSliceComplexity
112
+ }), scope.asJson);
283
113
  }
@@ -0,0 +1,44 @@
1
+ import type { FinalReviewOutput } from '../../services/final-review/final-review-types.js';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ /** The two inputs a refusal envelope names, plus why it was refused. */
4
+ export type PrepareRefusal = {
5
+ readonly rid: string;
6
+ readonly code: string;
7
+ readonly message: string;
8
+ readonly sessionId: string;
9
+ readonly auditGoalPath: string;
10
+ readonly nextActions: string[];
11
+ };
12
+ /** Print one refusal envelope and mark the process failed. */
13
+ export declare function emitPrepareFailure(io: ProgramIO, json: boolean | undefined, refusal: PrepareRefusal, missingEnv?: readonly string[]): void;
14
+ /** Where a resolved run reads its audit goal from. */
15
+ export type PrepareGoalPath = {
16
+ readonly sessionId: string;
17
+ readonly auditGoalPath: string;
18
+ };
19
+ /**
20
+ * Stub path: surface a structured "scaffold ready" envelope.
21
+ *
22
+ * The service is NOT called here — the stub runner answers the audit-goal
23
+ * shape, not the 4-dim review shape, so running it through
24
+ * `prepareFinalReview()` would only manufacture a malformed review. The
25
+ * envelope confirms the route is wired end-to-end and reports the audit-goal
26
+ * path the service WOULD read.
27
+ */
28
+ export declare function emitStubEnvelope(io: ProgramIO, rid: string, goal: PrepareGoalPath, json: boolean | undefined): void;
29
+ /** The success envelope of a real-provider run. */
30
+ export declare function emitReviewEnvelope(io: ProgramIO, result: {
31
+ readonly rid: string;
32
+ readonly goal: PrepareGoalPath;
33
+ readonly model: string;
34
+ readonly review: FinalReviewOutput;
35
+ readonly json: boolean | undefined;
36
+ }): void;
37
+ /**
38
+ * Map a thrown error to the CLI's error code. The LLM-layer errors already
39
+ * carry codes precise enough to act on (`LLM_CREDENTIAL_MISSING`,
40
+ * `LLM_REQUEST_FAILED`, …), so they are passed through rather than flattened
41
+ * into one opaque failure.
42
+ */
43
+ export declare function finalReviewErrorCode(error: unknown): string;
44
+ export declare function finalReviewNextActions(code: string): string[];
@@ -0,0 +1,100 @@
1
+ // src/cli/commands/final-review-command-envelopes.ts
2
+ //
3
+ // Every envelope `peaks prepare-final-review` can print, and the error-code
4
+ // mapping behind the failure one. Split out of `final-review-commands.ts`; the
5
+ // codes, messages, data fields and next-action strings are unchanged.
6
+ import { fail, ok } from 'peaks-loop-shared/result';
7
+ import { IncompleteFinalReviewError } from '../../services/final-review/final-review-service.js';
8
+ import { LlmBindingError, LlmRequestError } from '../../services/llm/anthropic-runner.js';
9
+ import { printResult } from '../cli-helpers.js';
10
+ import { emptyFinalReviewData } from './final-review-command-shared.js';
11
+ /** Print one refusal envelope and mark the process failed. */
12
+ export function emitPrepareFailure(io, json, refusal, missingEnv) {
13
+ printResult(io, fail('final-review.prepare', refusal.code, refusal.message, emptyFinalReviewData(refusal.rid, refusal.sessionId, refusal.auditGoalPath, missingEnv), refusal.nextActions), json ?? false);
14
+ process.exitCode = 1;
15
+ }
16
+ /**
17
+ * Stub path: surface a structured "scaffold ready" envelope.
18
+ *
19
+ * The service is NOT called here — the stub runner answers the audit-goal
20
+ * shape, not the 4-dim review shape, so running it through
21
+ * `prepareFinalReview()` would only manufacture a malformed review. The
22
+ * envelope confirms the route is wired end-to-end and reports the audit-goal
23
+ * path the service WOULD read.
24
+ */
25
+ export function emitStubEnvelope(io, rid, goal, json) {
26
+ const data = {
27
+ status: 'scaffold-only',
28
+ rid,
29
+ sessionId: goal.sessionId,
30
+ auditGoalPath: goal.auditGoalPath,
31
+ serviceWired: true,
32
+ providerBinding: 'stub'
33
+ };
34
+ const envelope = ok('final-review.prepare', data, [], [
35
+ 'Stub provider: no 4-dim review was performed. This envelope only proves the route is wired and reachable.',
36
+ `Audit-goal file is present at: ${goal.auditGoalPath}`,
37
+ 'Re-run with `--llm-provider anthropic` to produce a real review.'
38
+ ]);
39
+ printResult(io, envelope, json ?? false);
40
+ }
41
+ /** The success envelope of a real-provider run. */
42
+ export function emitReviewEnvelope(io, result) {
43
+ const { rid, goal, model, review, json } = result;
44
+ const data = {
45
+ status: 'review-complete',
46
+ rid,
47
+ sessionId: goal.sessionId,
48
+ auditGoalPath: goal.auditGoalPath,
49
+ serviceWired: true,
50
+ providerBinding: 'anthropic-messages-api',
51
+ model,
52
+ review
53
+ };
54
+ const envelope = ok('final-review.prepare', data, review.allPass
55
+ ? []
56
+ : [
57
+ `Dimensions needing human attention: ${review.needsAttention.join(', ') || 'none flagged'}.`
58
+ ], [
59
+ `4-dim review produced by anthropic-messages-api (model: ${model}).`,
60
+ `allPass: ${String(review.allPass)}.`
61
+ ]);
62
+ printResult(io, envelope, json ?? false);
63
+ }
64
+ /**
65
+ * Map a thrown error to the CLI's error code. The LLM-layer errors already
66
+ * carry codes precise enough to act on (`LLM_CREDENTIAL_MISSING`,
67
+ * `LLM_REQUEST_FAILED`, …), so they are passed through rather than flattened
68
+ * into one opaque failure.
69
+ */
70
+ export function finalReviewErrorCode(error) {
71
+ if (error instanceof LlmBindingError ||
72
+ error instanceof LlmRequestError ||
73
+ error instanceof IncompleteFinalReviewError) {
74
+ return error.code;
75
+ }
76
+ return 'FINAL_REVIEW_FAILED';
77
+ }
78
+ export function finalReviewNextActions(code) {
79
+ switch (code) {
80
+ case 'LLM_CREDENTIAL_MISSING':
81
+ return [
82
+ 'Export ANTHROPIC_AUTH_TOKEN (or ANTHROPIC_API_KEY) in the environment that launches peaks, then re-run.',
83
+ 'For an offline scaffold instead of a review, re-run with `--llm-provider stub` — it performs NO review.'
84
+ ];
85
+ case 'LLM_MODEL_MISSING':
86
+ return [
87
+ 'Export ANTHROPIC_MODEL (or CLAUDE_CODE_SUBAGENT_MODEL) in the environment that launches peaks, then re-run.'
88
+ ];
89
+ case 'LLM_REQUEST_FAILED':
90
+ return [
91
+ 'Check ANTHROPIC_BASE_URL and network reachability, then re-run — a transport failure produces no review.'
92
+ ];
93
+ case 'INCOMPLETE_FINAL_REVIEW':
94
+ return [
95
+ 'The LLM reply was not valid JSON or omitted a required dimension; re-run so the gate is never read as complete.'
96
+ ];
97
+ default:
98
+ return ['Re-run with `--llm-provider stub` to validate the CLI route without a real LLM.'];
99
+ }
100
+ }
@@ -0,0 +1,52 @@
1
+ import type { FinalReviewOutput } from '../../services/final-review/final-review-types.js';
2
+ /** Whitelist of supported `--llm-provider` values for `peaks prepare-final-review`. */
3
+ export declare const SUPPORTED_LLM_PROVIDERS: readonly ["anthropic", "stub"];
4
+ export type SupportedLlmProvider = (typeof SUPPORTED_LLM_PROVIDERS)[number];
5
+ /**
6
+ * Default stays `stub` (unlike `peaks audit goal`, whose default is the real
7
+ * provider): the scaffold route is what CI and the registered e2e contract
8
+ * exercise without credentials, and the stub envelope is labelled
9
+ * `status: 'scaffold-only'` / `providerBinding: 'stub'` so it can never be
10
+ * read as a review.
11
+ */
12
+ export declare const DEFAULT_LLM_PROVIDER: SupportedLlmProvider;
13
+ export declare function isSupportedLlmProvider(value: string): value is SupportedLlmProvider;
14
+ export type FinalReviewStatus = 'scaffold-only' | 'review-complete' | 'not-applicable';
15
+ /**
16
+ * Which LLM produced this envelope. `unknown` is reserved for failure
17
+ * envelopes, where no binding was ever established.
18
+ */
19
+ export type FinalReviewProviderBinding = 'stub' | 'anthropic-messages-api' | 'unknown';
20
+ export interface FinalReviewData {
21
+ readonly status: FinalReviewStatus;
22
+ readonly rid: string;
23
+ readonly sessionId: string;
24
+ readonly auditGoalPath: string;
25
+ readonly serviceWired: boolean;
26
+ readonly providerBinding: FinalReviewProviderBinding;
27
+ /** Model id the bound provider answered with (real-provider runs only). */
28
+ readonly model?: string;
29
+ /** The 4-dim review the service produced (real-provider runs only). */
30
+ readonly review?: FinalReviewOutput;
31
+ /**
32
+ * Environment variables that were absent when binding failed. Surfaced on
33
+ * `data` because `fail()` redacts `message` through
34
+ * `redactSensitiveErrorMessage`, whose catch-all pattern matches the words
35
+ * `token` / `api_key` and would blank out the very names an operator needs.
36
+ */
37
+ readonly missingEnv?: readonly string[];
38
+ }
39
+ /**
40
+ * Empty placeholder used by `fail()` envelopes. `status` is
41
+ * `'not-applicable'` on the error path so consumers can tell
42
+ * "this is a placeholder on a failure" apart from "this is a real
43
+ * scaffold-only success".
44
+ */
45
+ export declare function emptyFinalReviewData(rid: string, sessionId: string, auditGoalPath: string, missingEnv?: readonly string[]): FinalReviewData;
46
+ export type PrepareFinalReviewOptions = {
47
+ project: string;
48
+ sessionId: string;
49
+ llmProvider?: string;
50
+ base?: string;
51
+ json?: boolean;
52
+ };
@@ -0,0 +1,35 @@
1
+ // src/cli/commands/final-review-command-shared.ts
2
+ //
3
+ // What `peaks prepare-final-review` reports: the envelope's data shape, its
4
+ // provider vocabulary, and the placeholder a failure carries. Split out of
5
+ // `final-review-commands.ts`; every value and every field name is unchanged.
6
+ /** Whitelist of supported `--llm-provider` values for `peaks prepare-final-review`. */
7
+ export const SUPPORTED_LLM_PROVIDERS = ['anthropic', 'stub'];
8
+ /**
9
+ * Default stays `stub` (unlike `peaks audit goal`, whose default is the real
10
+ * provider): the scaffold route is what CI and the registered e2e contract
11
+ * exercise without credentials, and the stub envelope is labelled
12
+ * `status: 'scaffold-only'` / `providerBinding: 'stub'` so it can never be
13
+ * read as a review.
14
+ */
15
+ export const DEFAULT_LLM_PROVIDER = 'stub';
16
+ export function isSupportedLlmProvider(value) {
17
+ return SUPPORTED_LLM_PROVIDERS.includes(value);
18
+ }
19
+ /**
20
+ * Empty placeholder used by `fail()` envelopes. `status` is
21
+ * `'not-applicable'` on the error path so consumers can tell
22
+ * "this is a placeholder on a failure" apart from "this is a real
23
+ * scaffold-only success".
24
+ */
25
+ export function emptyFinalReviewData(rid, sessionId, auditGoalPath, missingEnv) {
26
+ return {
27
+ status: 'not-applicable',
28
+ rid,
29
+ sessionId,
30
+ auditGoalPath,
31
+ serviceWired: false,
32
+ providerBinding: 'unknown',
33
+ ...(missingEnv === undefined ? {} : { missingEnv })
34
+ };
35
+ }