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,10 +1,3 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { getSessionMeta, rotateSessionBinding, setSessionTitle, listSessionMetas } from '../../../services/session/session-manager.js';
4
- import { resolveCanonicalProjectRoot } from '../../../services/config/config-service.js';
5
- import { findProjectRoot } from '../../../services/config/config-safety.js';
6
- import { fail, ok } from 'peaks-loop-shared/result';
7
- import { addJsonOption, getErrorMessage, printResult } from '../../cli-helpers.js';
8
1
  // `peaks session checkpoint` and `peaks session resume` subcommands
9
2
  // EAGERLY so they appear in `peaks session --help` output. The
10
3
  // previous lazy import ran AFTER commander had already produced
@@ -22,174 +15,20 @@ import { registerSessionMigrateSkillNameCommand } from '../session-migrate-skill
22
15
  // appear in `peaks session --help` for LLM `<TAB>`-discovery.
23
16
  import { registerSession24hModeCommand } from '../session-24h-mode.js';
24
17
  import { registerSpillDemoCommand } from '../spill-demo-command.js';
18
+ import { registerSessionInfoCommand } from './session-info-command.js';
19
+ import { registerSessionListCommand, registerSessionRotateCommand, registerSessionTitleCommand } from './session-verb-commands.js';
25
20
  export function registerSessionCommand(program, io) {
26
21
  const session = program.command('session').description('Manage Peaks session directories');
27
- addJsonOption(session.command('list').description('List all session directories with titles and metadata')).action((options) => {
28
- const projectRoot = findProjectRoot(process.cwd()) ?? process.cwd();
29
- const metas = listSessionMetas(projectRoot);
30
- printResult(io, ok('session.list', { sessions: metas, total: metas.length }), options.json);
31
- });
32
- addJsonOption(session
33
- .command('info [sessionId]')
34
- .description('Show full metadata for a session directory. Pass --active to resolve the canonical binding from .peaks/_runtime/session.json (the "one command a sub-agent runs to find the parent\'s sid" primitive). Slice 021: --active is the SOLE authoritative way to look up the active session id; the on-disk file path is internal and must NOT be `cat`-ed directly.')
35
- .option('--active', 'resolve the canonical session id from .peaks/_runtime/session.json (ignores [sessionId] when set)')
36
- .option('--project <path>', 'target project root (defaults to git root or cwd). Slice 021: lets sub-agents skip the cwd heuristic and look up the binding for a specific repo.')
37
- // overrides the per-process PEAKS_CALLER_ID env var and the
38
- // PLATFORM_FALLBACKS table (D4 priority). The resolved callerId is
39
- // surfaced in the JSON envelope so callers can confirm what was
40
- // resolved without re-deriving it.
41
- .option('--caller-id <id>', 'Override the caller id for this invocation (D4 priority: flag beats env beats platform fallback). When set, the response envelope includes the resolved callerId.')).action(async (sessionId, options) => {
42
- // (matches the pre-021 behaviour so the existing slice-020 / slice-007
43
- // sub-agent flow keeps working unchanged).
44
- const projectRoot = options.project !== undefined
45
- ? resolveCanonicalProjectRoot(options.project)
46
- : (findProjectRoot(process.cwd()) ?? process.cwd());
47
- // We use `resolveCallerId` for D1/D5 validation; an invalid flag
48
- // throws CallerIdError (D5 → exit 65). A missing flag and no env
49
- // and no fallback also throws (D2 → exit 64). The resolved id is
50
- // surfaced in the envelope so the caller can audit.
51
- if (options.callerId !== undefined) {
52
- const { resolveCallerId, CallerIdError } = await import('../../../services/session/resolve-caller-id.js');
53
- let callerId;
54
- try {
55
- callerId = resolveCallerId({ flagValue: options.callerId });
56
- }
57
- catch (error) {
58
- if (error instanceof CallerIdError) {
59
- const code = error.code === 'EX_USAGE' ? 64 : 65;
60
- printResult(io, fail('session.info', 'CALLER_ID_INVALID', error.message, { source: error.source }, [
61
- `Set --caller-id to a value matching ^[a-zA-Z0-9._-]{1,200}$`,
62
- 'Or set PEAKS_CALLER_ID env var (or CLAUDE_CODE_SESSION_ID for Claude Code)'
63
- ]), options.json);
64
- process.exitCode = code;
65
- return;
66
- }
67
- throw error;
68
- }
69
- // Surface the resolved id in the envelope. When --active is also
70
- // passed, look up the binding for this callerId; otherwise
71
- // just emit the resolved id so the caller knows what was used.
72
- if (options.active === true) {
73
- const { getSessionIdCanonical } = await import('../../../services/session/session-manager.js');
74
- const { getCallerBinding } = await import('../../../services/session/caller-binding-service.js');
75
- const activeSid = getSessionIdCanonical(projectRoot);
76
- const callerBinding = getCallerBinding(projectRoot, callerId);
77
- // reports. Callers / migration tooling can detect pre-migration trees
78
- // by inspecting `source === 'legacy'`.
79
- const bindingSource = existsSync(join(projectRoot, '.peaks', '_runtime', 'session.json'))
80
- ? 'canonical'
81
- : 'legacy';
82
- printResult(io, ok('session.info', {
83
- active: true,
84
- sessionId: activeSid,
85
- callerId,
86
- callerBindingPeakSessionId: callerBinding?.peakSessionId ?? null,
87
- source: bindingSource
88
- }), options.json);
89
- return;
90
- }
91
- printResult(io, ok('session.info', {
92
- callerId,
93
- note: '--caller-id resolved; pass --active to also look up the bound peak session'
94
- }), options.json);
95
- return;
96
- }
97
- // does not know the parent's sid reads it from the binding via
98
- // SOLE authoritative discovery primitive: it composes on
99
- // getSessionIdCanonical (canonicalize-on-read; handles the stored
100
- // "projectRoot: '.'" vs caller-passed absolute realpath mismatch
101
- // that the F22 fix addressed) AND falls through to getSessionId
102
- // (strict-equality) for callers on the original contract. NEITHER
103
- // path may call ensureSession() — that would side-effect-create a
104
- // fresh binding on miss, erasing the "no active session" signal
105
- // sub-agents rely on.
106
- if (options.active === true) {
107
- // Import lazily to avoid a cycle with workspace-commands.
108
- const { getSessionIdCanonical, getSessionId } = await import('../../../services/session/session-manager.js');
109
- // 1. Canonicalize-on-read first.
110
- let activeSid = getSessionIdCanonical(projectRoot);
111
- // 2. Fall through to the strict-equality reader if the canonical
112
- // miss is a projectRoot-form mismatch (e.g. the binding was
113
- // written with the absolute realpath but the caller's form
114
- // normalizes differently). The 2-read fan-out mirrors the
115
- // fallback ensureSession() uses.
116
- if (activeSid === null) {
117
- activeSid = getSessionId(projectRoot);
118
- }
119
- if (activeSid === null) {
120
- // 3. No binding at all — fail loudly, NO crash, NO side-effect,
121
- // exit 1, message must point at `peaks workspace init`
122
- // (the canonical "first action" command, not the legacy
123
- // "or `peaks skill presence:set`" hedge that the pre-021
124
- // wording used — presence:set would also need a binding to
125
- // resolve the parent sid, so it's not actually a bootstrap
126
- // path).
127
- printResult(io, fail('session.info', 'NO_ACTIVE_SESSION', 'No session bound. Run `peaks workspace init --project <repo> --json` to bind one.', { projectRoot }, [`peaks workspace init --project ${projectRoot} --json`]), options.json);
128
- process.exitCode = 1;
129
- return;
130
- }
131
- // 4. Determine the on-disk source so callers (and future
132
- // migration tooling) can detect pre-migration trees. The
133
- // contract).
134
- const bindingSource = existsSync(join(projectRoot, '.peaks', '_runtime', 'session.json'))
135
- ? 'canonical'
136
- : 'legacy';
137
- // surface a warning so callers (and humans tailing the JSON)
138
- // see "this tree has not been reconciled to the canonical
139
- // home yet". The warning is informational; the binding is
140
- // contract). `warnings` is a top-level envelope field, not a
141
- // data field, so it goes through ok()'s 3rd positional arg.
142
- const legacyWarnings = bindingSource === 'legacy'
143
- ? [
144
- 'Read from legacy back-compat path .peaks/.session.json. Run `peaks workspace reconcile --apply` to migrate to the canonical home (.peaks/_runtime/session.json).'
145
- ]
146
- : [];
147
- printResult(io, ok('session.info', {
148
- active: true,
149
- sessionId: activeSid,
150
- bindingPath: bindingSource === 'canonical'
151
- ? join(projectRoot, '.peaks', '_runtime', 'session.json')
152
- : join(projectRoot, '.peaks', '.session.json'),
153
- projectRoot,
154
- source: bindingSource
155
- }, legacyWarnings), options.json);
156
- return;
157
- }
158
- if (sessionId === undefined) {
159
- printResult(io, fail('session.info', 'SESSION_ID_REQUIRED', 'session.info requires a <sessionId> or --active', {}, ['Pass a <sessionId> argument, or use --active to resolve the canonical binding']), options.json);
160
- process.exitCode = 1;
161
- return;
162
- }
163
- const meta = getSessionMeta(projectRoot, sessionId);
164
- if (meta === null) {
165
- printResult(io, fail('session.info', 'SESSION_NOT_FOUND', `Session "${sessionId}" not found or has no metadata`, { sessionId }, ['Use `peaks session list` to see available sessions']), options.json);
166
- process.exitCode = 1;
167
- return;
168
- }
169
- printResult(io, ok('session.info', meta), options.json);
170
- });
171
- addJsonOption(session
172
- .command('title <sessionId> <title>')
173
- .description('Set a human-readable title for a session directory')).action((sessionId, title, options) => {
174
- const projectRoot = findProjectRoot(process.cwd()) ?? process.cwd();
175
- try {
176
- const meta = setSessionTitle(projectRoot, sessionId, title);
177
- printResult(io, ok('session.title', meta), options.json);
178
- }
179
- catch (error) {
180
- printResult(io, fail('session.title', 'SESSION_TITLE_FAILED', getErrorMessage(error), { sessionId }, [
181
- 'Verify the sessionId exists under .peaks/'
182
- ]), options.json);
183
- process.exitCode = 1;
184
- }
185
- });
22
+ registerSessionListCommand(session, io);
23
+ registerSessionInfoCommand(session, io);
24
+ registerSessionTitleCommand(session, io);
186
25
  // Skill-level primitives — the LLM is the decision-maker; CLI is the muscle.
187
- // via `void (async () => …)`) so commander walks the subcommand
188
- // tree synchronously and `peaks session --help` includes both
189
- // `checkpoint` and `resume`. The previous async-IIFE registered
190
- // them on a microtask tick AFTER the program-level help builder
191
- // had already serialised its output, so they were hidden from
192
- // `<TAB>`-discovery and the LLM never saw them.
26
+ // Registered synchronously (rather than via `void (async () => …)`) so
27
+ // commander walks the subcommand tree synchronously and
28
+ // `peaks session --help` includes both `checkpoint` and `resume`. The
29
+ // previous async-IIFE registered them on a microtask tick AFTER the
30
+ // program-level help builder had already serialised its output, so they
31
+ // were hidden from `<TAB>`-discovery and the LLM never saw them.
193
32
  registerSessionCheckpointCommand(session, io);
194
33
  registerSessionResumeCommand(session, io);
195
34
  // Slice 2 of the peaks-code → peaks-code rename plan:
@@ -200,38 +39,5 @@ export function registerSessionCommand(program, io) {
200
39
  registerSessionMigrateSkillNameCommand(session);
201
40
  registerSession24hModeCommand(session, io);
202
41
  registerSpillDemoCommand(session, io);
203
- addJsonOption(session
204
- .command('rotate')
205
- .description('Drop the project-level session binding so the next peaks call auto-generates a fresh session id. The on-disk session directory is left intact — only .peaks/.session.json is removed.')
206
- .option('--project <path>', 'target project root (defaults to git root or cwd)')
207
- .option('--reason <text>', 'human-readable reason for the rotation, recorded in the response data')).action((options) => {
208
- try {
209
- // Canonicalise the project root before touching the binding.
210
- // `peaks workspace init` writes the binding with the
211
- // realpath-resolved projectRoot; if the caller passes a path
212
- // through a symlink (notably /tmp on macOS, which is a
213
- // symlink to /private/tmp) without canonicalising here,
214
- // readSessionFile's strict projectRoot equality check fails
215
- // and the rotate call reports "no prior binding" even
216
- // though one exists. The same fix as `workspace init`
217
- // (b193714): promote the path to the git root, falling back
218
- // to the heuristic, falling back to cwd verbatim.
219
- const projectRoot = options.project !== undefined
220
- ? options.project
221
- : (findProjectRoot(process.cwd()) ?? process.cwd());
222
- const canonical = resolveCanonicalProjectRoot(projectRoot);
223
- const previousSessionId = rotateSessionBinding(canonical);
224
- printResult(io, ok('session.rotate', {
225
- previousSessionId,
226
- ...(options.reason !== undefined ? { reason: options.reason } : {}),
227
- note: previousSessionId === null
228
- ? 'No prior binding was present; the project is already unbound.'
229
- : 'Next ensureSession() call will auto-generate a fresh id. The previous session directory is still on disk at .peaks/_runtime/<previousSessionId>/.'
230
- }), options.json);
231
- }
232
- catch (error) {
233
- printResult(io, fail('session.rotate', 'SESSION_ROTATE_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Verify the project path exists and is writable']), options.json);
234
- process.exitCode = 1;
235
- }
236
- });
42
+ registerSessionRotateCommand(session, io);
237
43
  }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../../cli-helpers.js';
3
+ export declare function registerSessionInfoCommand(session: Command, io: ProgramIO): void;
@@ -0,0 +1,142 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { getSessionMeta } from '../../../services/session/session-manager.js';
4
+ import { resolveCanonicalProjectRoot } from '../../../services/config/config-service.js';
5
+ import { findProjectRoot } from '../../../services/config/config-safety.js';
6
+ import { fail, ok } from 'peaks-loop-shared/result';
7
+ import { addJsonOption, printResult } from '../../cli-helpers.js';
8
+ /** Exit codes for a rejected `--caller-id`, by the resolver's own errno. */
9
+ const EXIT_USAGE = 64;
10
+ const EXIT_DATAERR = 65;
11
+ /** The advisory that rides every read off the pre-canonical binding dotfile. */
12
+ const LEGACY_WARNING = 'Read from legacy back-compat path .peaks/.session.json. Run `peaks workspace reconcile --apply` to migrate to the canonical home (.peaks/_runtime/session.json).';
13
+ /** `canonical` = `.peaks/_runtime/session.json`; `legacy` = `.peaks/.session.json`. */
14
+ function bindingSourceOf(projectRoot) {
15
+ return existsSync(join(projectRoot, '.peaks', '_runtime', 'session.json'))
16
+ ? 'canonical'
17
+ : 'legacy';
18
+ }
19
+ function bindingPathOf(projectRoot, source) {
20
+ return source === 'canonical'
21
+ ? join(projectRoot, '.peaks', '_runtime', 'session.json')
22
+ : join(projectRoot, '.peaks', '.session.json');
23
+ }
24
+ /** A `--caller-id` the resolver rejected (D5 → exit 65; EX_USAGE → exit 64). */
25
+ function emitCallerIdInvalid(io, options, error) {
26
+ printResult(io, fail('session.info', 'CALLER_ID_INVALID', error.message, { source: error.source }, [
27
+ `Set --caller-id to a value matching ^[a-zA-Z0-9._-]{1,200}$`,
28
+ 'Or set PEAKS_CALLER_ID env var (or CLAUDE_CODE_SESSION_ID for Claude Code)'
29
+ ]), options.json);
30
+ process.exitCode = error.code === 'EX_USAGE' ? EXIT_USAGE : EXIT_DATAERR;
31
+ }
32
+ /**
33
+ * `--caller-id` together with `--active`: look up the binding this callerId
34
+ * holds, so the envelope carries both the resolved id and its peak session.
35
+ */
36
+ async function emitCallerBinding(io, options, projectRoot, callerId) {
37
+ const { getSessionIdCanonical } = await import('../../../services/session/session-manager.js');
38
+ const { getCallerBinding } = await import('../../../services/session/caller-binding-service.js');
39
+ const callerBinding = getCallerBinding(projectRoot, callerId);
40
+ printResult(io, ok('session.info', {
41
+ active: true,
42
+ sessionId: getSessionIdCanonical(projectRoot),
43
+ callerId,
44
+ callerBindingPeakSessionId: callerBinding?.peakSessionId ?? null,
45
+ source: bindingSourceOf(projectRoot)
46
+ }), options.json);
47
+ }
48
+ /**
49
+ * Resolve `--caller-id` (D1/D5 validation) and report it. An invalid flag
50
+ * throws `CallerIdError`, which is surfaced as `CALLER_ID_INVALID`; anything
51
+ * else propagates.
52
+ */
53
+ async function emitCallerIdPath(io, options, projectRoot, flagValue) {
54
+ const { resolveCallerId, CallerIdError } = await import('../../../services/session/resolve-caller-id.js');
55
+ let callerId;
56
+ try {
57
+ callerId = resolveCallerId({ flagValue });
58
+ }
59
+ catch (error) {
60
+ if (error instanceof CallerIdError) {
61
+ emitCallerIdInvalid(io, options, error);
62
+ return;
63
+ }
64
+ throw error;
65
+ }
66
+ if (options.active === true) {
67
+ await emitCallerBinding(io, options, projectRoot, callerId);
68
+ return;
69
+ }
70
+ printResult(io, ok('session.info', {
71
+ callerId,
72
+ note: '--caller-id resolved; pass --active to also look up the bound peak session'
73
+ }), options.json);
74
+ }
75
+ /**
76
+ * `--active` without `--caller-id`: the SOLE authoritative lookup of the
77
+ * active session id — composes on `getSessionIdCanonical`
78
+ * (canonicalize-on-read) and falls through to `getSessionId`
79
+ * (strict-equality) for callers on the original contract. NEITHER path calls
80
+ * `ensureSession()` — that would side-effect-create a fresh binding on miss,
81
+ * erasing the "no active session" signal sub-agents rely on.
82
+ */
83
+ async function emitActiveBinding(io, options, projectRoot) {
84
+ const { getSessionIdCanonical, getSessionId } = await import('../../../services/session/session-manager.js');
85
+ let activeSid = getSessionIdCanonical(projectRoot);
86
+ if (activeSid === null)
87
+ activeSid = getSessionId(projectRoot);
88
+ if (activeSid === null) {
89
+ printResult(io, fail('session.info', 'NO_ACTIVE_SESSION', 'No session bound. Run `peaks workspace init --project <repo> --json` to bind one.', { projectRoot }, [`peaks workspace init --project ${projectRoot} --json`]), options.json);
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ const source = bindingSourceOf(projectRoot);
94
+ printResult(io, ok('session.info', {
95
+ active: true,
96
+ sessionId: activeSid,
97
+ bindingPath: bindingPathOf(projectRoot, source),
98
+ projectRoot,
99
+ source
100
+ }, source === 'legacy' ? [LEGACY_WARNING] : []), options.json);
101
+ }
102
+ /** Explicit `<sessionId>`: read that session's metadata, or refuse. */
103
+ function emitSessionById(io, sessionId, options, projectRoot) {
104
+ if (sessionId === undefined) {
105
+ printResult(io, fail('session.info', 'SESSION_ID_REQUIRED', 'session.info requires a <sessionId> or --active', {}, ['Pass a <sessionId> argument, or use --active to resolve the canonical binding']), options.json);
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ const meta = getSessionMeta(projectRoot, sessionId);
110
+ if (meta === null) {
111
+ printResult(io, fail('session.info', 'SESSION_NOT_FOUND', `Session "${sessionId}" not found or has no metadata`, { sessionId }, ['Use `peaks session list` to see available sessions']), options.json);
112
+ process.exitCode = 1;
113
+ return;
114
+ }
115
+ printResult(io, ok('session.info', meta), options.json);
116
+ }
117
+ async function runSessionInfo(io, sessionId, options) {
118
+ const projectRoot = options.project !== undefined
119
+ ? resolveCanonicalProjectRoot(options.project)
120
+ : (findProjectRoot(process.cwd()) ?? process.cwd());
121
+ if (options.callerId !== undefined) {
122
+ await emitCallerIdPath(io, options, projectRoot, options.callerId);
123
+ return;
124
+ }
125
+ if (options.active === true) {
126
+ await emitActiveBinding(io, options, projectRoot);
127
+ return;
128
+ }
129
+ emitSessionById(io, sessionId, options, projectRoot);
130
+ }
131
+ export function registerSessionInfoCommand(session, io) {
132
+ addJsonOption(session
133
+ .command('info [sessionId]')
134
+ .description('Show full metadata for a session directory. Pass --active to resolve the canonical binding from .peaks/_runtime/session.json (the "one command a sub-agent runs to find the parent\'s sid" primitive). Slice 021: --active is the SOLE authoritative way to look up the active session id; the on-disk file path is internal and must NOT be `cat`-ed directly.')
135
+ .option('--active', 'resolve the canonical session id from .peaks/_runtime/session.json (ignores [sessionId] when set)')
136
+ .option('--project <path>', 'target project root (defaults to git root or cwd). Slice 021: lets sub-agents skip the cwd heuristic and look up the binding for a specific repo.')
137
+ // overrides the per-process PEAKS_CALLER_ID env var and the
138
+ // PLATFORM_FALLBACKS table (D4 priority). The resolved callerId is
139
+ // surfaced in the JSON envelope so callers can confirm what was
140
+ // resolved without re-deriving it.
141
+ .option('--caller-id <id>', 'Override the caller id for this invocation (D4 priority: flag beats env beats platform fallback). When set, the response envelope includes the resolved callerId.')).action((sessionId, options) => runSessionInfo(io, sessionId, options));
142
+ }
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../../cli-helpers.js';
3
+ export declare function registerSessionListCommand(session: Command, io: ProgramIO): void;
4
+ export declare function registerSessionTitleCommand(session: Command, io: ProgramIO): void;
5
+ export declare function registerSessionRotateCommand(session: Command, io: ProgramIO): void;
@@ -0,0 +1,58 @@
1
+ import { listSessionMetas, rotateSessionBinding, setSessionTitle } from '../../../services/session/session-manager.js';
2
+ import { resolveCanonicalProjectRoot } from '../../../services/config/config-service.js';
3
+ import { findProjectRoot } from '../../../services/config/config-safety.js';
4
+ import { fail, ok } from 'peaks-loop-shared/result';
5
+ import { addJsonOption, getErrorMessage, printResult } from '../../cli-helpers.js';
6
+ export function registerSessionListCommand(session, io) {
7
+ addJsonOption(session.command('list').description('List all session directories with titles and metadata')).action((options) => {
8
+ const projectRoot = findProjectRoot(process.cwd()) ?? process.cwd();
9
+ const metas = listSessionMetas(projectRoot);
10
+ printResult(io, ok('session.list', { sessions: metas, total: metas.length }), options.json);
11
+ });
12
+ }
13
+ export function registerSessionTitleCommand(session, io) {
14
+ addJsonOption(session
15
+ .command('title <sessionId> <title>')
16
+ .description('Set a human-readable title for a session directory')).action((sessionId, title, options) => {
17
+ const projectRoot = findProjectRoot(process.cwd()) ?? process.cwd();
18
+ try {
19
+ const meta = setSessionTitle(projectRoot, sessionId, title);
20
+ printResult(io, ok('session.title', meta), options.json);
21
+ }
22
+ catch (error) {
23
+ printResult(io, fail('session.title', 'SESSION_TITLE_FAILED', getErrorMessage(error), { sessionId }, [
24
+ 'Verify the sessionId exists under .peaks/'
25
+ ]), options.json);
26
+ process.exitCode = 1;
27
+ }
28
+ });
29
+ }
30
+ export function registerSessionRotateCommand(session, io) {
31
+ addJsonOption(session
32
+ .command('rotate')
33
+ .description('Drop the project-level session binding so the next peaks call auto-generates a fresh session id. The on-disk session directory is left intact — only .peaks/.session.json is removed.')
34
+ .option('--project <path>', 'target project root (defaults to git root or cwd)')
35
+ .option('--reason <text>', 'human-readable reason for the rotation, recorded in the response data')).action((options) => {
36
+ try {
37
+ // Canonicalise the project root before touching the binding: `peaks
38
+ // workspace init` writes it realpath-resolved, and readSessionFile's
39
+ // strict projectRoot equality check would otherwise miss a path that
40
+ // came through a symlink (notably /tmp on macOS).
41
+ const projectRoot = options.project !== undefined
42
+ ? options.project
43
+ : (findProjectRoot(process.cwd()) ?? process.cwd());
44
+ const previousSessionId = rotateSessionBinding(resolveCanonicalProjectRoot(projectRoot));
45
+ printResult(io, ok('session.rotate', {
46
+ previousSessionId,
47
+ ...(options.reason !== undefined ? { reason: options.reason } : {}),
48
+ note: previousSessionId === null
49
+ ? 'No prior binding was present; the project is already unbound.'
50
+ : 'Next ensureSession() call will auto-generate a fresh id. The previous session directory is still on disk at .peaks/_runtime/<previousSessionId>/.'
51
+ }), options.json);
52
+ }
53
+ catch (error) {
54
+ printResult(io, fail('session.rotate', 'SESSION_ROTATE_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Verify the project path exists and is writable']), options.json);
55
+ process.exitCode = 1;
56
+ }
57
+ });
58
+ }
@@ -1,27 +1,4 @@
1
1
  import type { Command } from 'commander';
2
2
  import { type ProgramIO } from '../../cli-helpers.js';
3
- /** The only `--category` this subcommand implements today. */
4
- export declare const LOOP_ENGINEERING_CATEGORY = "loop-engineering";
5
- /** Project-relative location of the file the `loop-engineering` lint reads. */
6
- export declare const LOOP_ENGINEERING_GUIDELINES_RELATIVE_PATH = ".peaks/standards/loop-engineering-guidelines.md";
7
- export interface StandardsLintEnvelope {
8
- ok: boolean;
9
- code: string;
10
- message: string;
11
- data: {
12
- category: string;
13
- path: string;
14
- redLineCount: number;
15
- redLineIds: string[];
16
- findings: string[];
17
- };
18
- nextActions: string[];
19
- }
20
- /**
21
- * Pure helper: read the loop-engineering guideline file under `projectRoot`
22
- * and lint it. Kept out of the Commander action so unit tests can drive it
23
- * without spawning a child process (same shape as
24
- * `runReadinessLint` in skill-loop-engineering-readiness-commands.ts).
25
- */
26
- export declare function runLoopEngineeringLint(projectRoot: string): StandardsLintEnvelope;
3
+ export { LOOP_ENGINEERING_CATEGORY, LOOP_ENGINEERING_GUIDELINES_RELATIVE_PATH, runLoopEngineeringLint, type StandardsLintEnvelope } from './standards-lint.js';
27
4
  export declare function registerStandardsCommand(program: Command, io: ProgramIO): void;