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,171 +1,31 @@
1
- import { fail, ok } from 'peaks-loop-shared/result';
2
- import { addJsonOption, printResult, getErrorMessage } from '../cli-helpers.js';
3
- import { findProjectRoot } from '../../services/config/config-safety.js';
4
- import { buildStatusLineModel, parseStatusLineStdin } from '../../services/skills/skill-statusline-service.js';
5
- import { renderStatusLine, resolveStatusLineCapability } from '../../services/skills/skill-statusline-renderer.js';
6
- import { applyStatusLineInstall, planStatusLineInstall, removeStatusLineInstall } from '../../services/skills/statusline-settings-service.js';
7
- import { readHookStatus as readSettingsStatus } from '../../services/skills/hooks-settings-service.js';
8
- import { detectIdeFromContext } from '../../services/ide/hook-translator.js';
1
+ // src/cli/commands/statusline-commands.ts
2
+ //
3
+ // `peaks statusline` and its subcommands. The option chains are declared here —
4
+ // this is the file `tests/unit/cli/ide-option-help-lists-the-registry.test.ts`
5
+ // scans for `--ide` declarations — and the verb bodies live beside it, one
6
+ // module per verb, over the stdin seam and the scope/IDE resolution in
7
+ // `statusline-command-shared.ts`.
8
+ import { addJsonOption } from '../cli-helpers.js';
9
9
  import { resolveIdeOptionHelp } from '../../services/ide/ide-registry.js';
10
- import { decideCompactStatusline, renderCompactStatusline } from '../../services/compact-statusline/compact-statusline-service.js';
11
- import { getSessionIdCanonical } from '../../services/session/session-manager.js';
12
- import { writeHarnessWitness } from '../../services/context/harness-context-witness.js';
13
- const STDIN_READ_TIMEOUT_MS = 250;
10
+ import { runDefaultStatuslineRender } from './statusline-render-command.js';
11
+ import { runStatuslineInstall } from './statusline-install-command.js';
12
+ import { runStatuslineUninstall } from './statusline-uninstall-command.js';
13
+ import { runStatuslineStatus } from './statusline-status-command.js';
14
+ import { runStatuslineCompact } from './statusline-compact-command.js';
14
15
  /**
15
- * Read piped stdin if present; resolve quickly with '' when attached to a TTY.
16
+ * The bare `peaks statusline` invocation plus the hidden `render` subcommand.
17
+ * This pattern is required by commander 12.x: when a command has both an
18
+ * action AND subcommands, commander's option parser conflates the parent's
19
+ * options with the subcommand's and drops flags. Routing through a subcommand
20
+ * (even one that's hidden) avoids the option-shadowing bug.
16
21
  *
17
- * `PEAKS_STATUSLINE_STDIN` is a test seam (same shape as the `PEAKS_HOOK_STDIN`
18
- * seam in `gate-commands.ts`): the harness payload is the only channel that
19
- * carries the harness's own context numbers, and a test that cannot supply one
20
- * cannot verify the capture at all.
21
- *
22
- * WHY THIS SEAM IS ACCEPTABLE ON A DIFFERENT ARGUMENT (repair cycle 3). The
23
- * precedent does not transfer by itself: `PEAKS_HOOK_STDIN` is defended in
24
- * `.peaks/memory/peaks-hook-stdin-test-seam-pattern.md` because its payload
25
- * still routes through the `enforceBashCommand` SOP gate. This payload is
26
- * routed through no gate — it is PERSISTED verbatim as the record the witness
27
- * guard then reads. So the compensating control is different, not absent: the
28
- * record is observation-only and one-way. It reaches only `data` and the
29
- * `warnings` / `nextActions` arrays of `peaks code context-now`; the compact
30
- * `action` there is computed from `probe.ratio` alone, before and independently
31
- * of the witness. A forged payload can therefore make the instrument lie —
32
- * measured: a hand-written record yields a confident false `agree`, or a
33
- * self-contradictory false `disagree` — and can do nothing else. What it cannot
34
- * do is fire, block or delay a compact. Unconditional rather than NODE_ENV-
35
- * gated, for the reason already recorded for the sibling seam.
22
+ * Without the default action, commander falls back to printing usage (Bug-02,
23
+ * ice-cola surface check 2026-07-22).
36
24
  */
37
- function readStdin() {
38
- const override = process.env['PEAKS_STATUSLINE_STDIN'];
39
- if (override !== undefined) {
40
- return Promise.resolve(override);
41
- }
42
- return new Promise((resolve) => {
43
- if (process.stdin.isTTY) {
44
- resolve('');
45
- return;
46
- }
47
- let data = '';
48
- let settled = false;
49
- const finish = () => {
50
- if (settled)
51
- return;
52
- settled = true;
53
- resolve(data);
54
- };
55
- const timer = setTimeout(finish, STDIN_READ_TIMEOUT_MS);
56
- timer.unref?.();
57
- process.stdin.setEncoding('utf8');
58
- process.stdin.on('data', (chunk) => {
59
- data += chunk;
60
- });
61
- process.stdin.on('end', () => {
62
- clearTimeout(timer);
63
- finish();
64
- });
65
- process.stdin.on('error', () => {
66
- clearTimeout(timer);
67
- finish();
68
- });
69
- });
70
- }
71
- function resolveScope(options) {
72
- return options.global ? 'global' : 'project';
73
- }
74
- /**
75
- * Resolve the IDE the install should target. The CLI user can override with
76
- * `--ide <id>`. Otherwise we delegate to `detectIdeFromContext` which checks
77
- * `process.env[adapter.envVar]` → stdin shape → cwd `.trae`/`.claude` →
78
- * fallback `'claude-code'`. Pass `parsedStdin: null` since `peaks statusline
79
- * install` is not invoked from inside an IDE hook — there's no stdin payload.
80
- */
81
- function resolveIdeForCommand(options, projectRoot) {
82
- if (options.ide !== undefined && options.ide.length > 0) {
83
- return options.ide;
84
- }
85
- return detectIdeFromContext({
86
- env: process.env,
87
- cwd: projectRoot ?? process.cwd(),
88
- parsedStdin: null
89
- });
90
- }
91
- /**
92
- * Default-statusline render body. Reused by both the top-level default
93
- * action (Bug-02 dispatch) and the explicit `render` subcommand. Exported
94
- * so a unit test can exercise the JSON / text output paths without going
95
- * through commander.
96
- *
97
- * Capability resolution is delegated to {@link resolveStatusLineCapability}
98
- * with only `env` and `isTTY` — the env-driven path is the single first-
99
- * version source of truth. No CLI flag widens the surface. The model
100
- * itself is read-only: `buildStatusLineModel` is the sole I/O boundary,
101
- * and it now also resolves compact state.
102
- */
103
- export async function runDefaultStatuslineRender(options, io) {
104
- const raw = await readStdin();
105
- const stdin = parseStatusLineStdin(raw);
106
- const seeded = options.project
107
- ? { ...(stdin ?? {}), workspace: { current_dir: options.project } }
108
- : stdin;
109
- // `Date.now()` for deterministic lifecycle-window checks under full-
110
- // suite concurrency. The integration test passes a test-time `now`
111
- // pinned at the moment `seedLifecycle` was called so the completed-
112
- // expiry window stays in-range regardless of how long the spawned
113
- // subprocess sat descheduled. Production callers omit the flag.
114
- const now = options.now !== undefined ? Number(options.now) : Date.now();
115
- const model = buildStatusLineModel(seeded, now);
116
- // context numbers from the payload it just piped in. The project root and the
117
- // canonical session id are taken from the model that was JUST built, so the
118
- // witness lands under the same session this render already resolved — a second
119
- // resolution here could disagree with it. Never throws; never changes the
120
- // rendered line.
121
- writeHarnessWitness({
122
- projectRoot: model.projectRoot,
123
- sessionId: model.sessionId,
124
- stdin,
125
- nowMs: now
126
- });
127
- const capability = resolveStatusLineCapability({
128
- env: process.env,
129
- isTTY: Boolean(process.stdout.isTTY)
130
- });
131
- const text = renderStatusLine(model, { capability }, process.env);
132
- if (options.json === true) {
133
- io.stdout(JSON.stringify({ ok: true, command: 'statusline.render', data: { text } }, null, 2));
134
- return;
135
- }
136
- io.stdout(text);
137
- }
138
- export function registerStatusLineCommands(program, io) {
139
- // Top-level `peaks statusline` — register as a group with subcommands
140
- // (install | uninstall | status). When the user runs `peaks statusline` with
141
- // no subcommand, commander falls back to a hidden render subcommand so the
142
- // status line still renders. This pattern is required by commander 12.x:
143
- // when a command has both an action AND subcommands, commander's option
144
- // parser conflates the parent's options with the subcommand's and drops
145
- // flags. Routing through a subcommand (even one that's hidden) avoids the
146
- // option-shadowing bug.
147
- const statusline = addJsonOption(program
148
- .command('statusline')
149
- .description('Render the Peaks skill status line for the current session, or manage the adapter-driven statusLine entry. Run with no subcommand to render; with a subcommand (install | uninstall | status) to manage.')
150
- .option('--project <path>', 'project root path (used to label the status line when stdin is absent; applies to the default render path)')
151
- .option('--now <ms>', 'override current time (epoch ms) — for testing / deterministic rendering of the lifecycle expiry window'));
152
- // Default behavior: when the user types `peaks statusline` with no
153
- // subcommand, render the status line. Without this default action,
154
- // commander falls back to printing usage (Bug-02, ice-cola surface check
155
- // 2026-07-22). The hidden `render` subcommand is preserved so callers
156
- // can still invoke it explicitly.
157
- //
158
- // Note (commander 12.x): when both a top-level `.action(...)` and
159
- // subcommands exist, commander's option parser can conflate parent and
160
- // child flags. We therefore parse `process.argv` for the bare `statusline`
161
- // invocation here, and otherwise let the subcommand machinery handle the
162
- // rest. The implementation is wrapped in `peekDefaultStatuslineRender` so
163
- // it can be exercised in isolation by unit tests.
25
+ function registerRenderVerbs(statusline, io) {
164
26
  statusline.action(async (_parentOptions, command) => {
165
27
  await runDefaultStatuslineRender(command.opts(), io);
166
28
  });
167
- // Hidden render subcommand. Preserved for callers that want to invoke
168
- // render explicitly without going through the default-action dispatch.
169
29
  statusline
170
30
  .command('render', { hidden: true })
171
31
  .description('Render the Peaks skill status line for the current session (reads session JSON on stdin; honors --project for the project label).')
@@ -173,6 +33,8 @@ export function registerStatusLineCommands(program, io) {
173
33
  .action(async (options) => {
174
34
  await runDefaultStatuslineRender(options, io);
175
35
  });
36
+ }
37
+ function registerInstallVerb(statusline, io) {
176
38
  addJsonOption(statusline
177
39
  .command('install')
178
40
  .description("Install the Peaks status line into the adapter's settings.json (project scope by default).")
@@ -180,97 +42,25 @@ export function registerStatusLineCommands(program, io) {
180
42
  .option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
181
43
  .option('--ide <id>', resolveIdeOptionHelp())
182
44
  .option('--force', 'overwrite an existing non-Peaks statusLine entry')
183
- .option('--dry-run', 'show what would change without writing')).action((options) => {
184
- const scope = resolveScope(options);
185
- const projectRoot = scope === 'project'
186
- ? (options.project ?? findProjectRoot(process.cwd()) ?? process.cwd())
187
- : undefined;
188
- const ide = resolveIdeForCommand(options, projectRoot);
189
- try {
190
- if (options.dryRun) {
191
- const plan = planStatusLineInstall(scope, projectRoot, { ide });
192
- const warnings = plan.conflict
193
- ? [
194
- `An existing statusLine command is set: ${plan.conflictCommand}. Rerun with --force to overwrite.`
195
- ]
196
- : [];
197
- printResult(io, ok('statusline.install', { ...plan, ide, applied: false, dryRun: true }, warnings), options.json);
198
- return;
199
- }
200
- const result = applyStatusLineInstall(scope, projectRoot, {
201
- force: options.force === true,
202
- ide
203
- });
204
- const warnings = result.conflict && !result.applied
205
- ? [
206
- `An existing statusLine command is set: ${result.conflictCommand}. Rerun with --force to overwrite.`
207
- ]
208
- : [];
209
- const nextActions = result.applied
210
- ? ['Restart the IDE (or reload the workspace) so the status line takes effect']
211
- : [];
212
- printResult(io, ok('statusline.install', { ...result, ide, dryRun: false }, warnings, nextActions), options.json);
213
- }
214
- catch (error) {
215
- const message = getErrorMessage(error);
216
- printResult(io, fail('statusline.install', 'STATUSLINE_INSTALL_FAILED', message, { scope, ide, applied: false }, [message]), options.json);
217
- process.exitCode = 1;
218
- }
219
- });
45
+ .option('--dry-run', 'show what would change without writing')).action((options) => runStatuslineInstall(io, options));
46
+ }
47
+ function registerUninstallVerb(statusline, io) {
220
48
  addJsonOption(statusline
221
49
  .command('uninstall')
222
50
  .description("Remove the Peaks status line from the adapter's settings.json.")
223
51
  .option('--global', 'remove from the user-level ~/.claude/settings.json instead of the project')
224
52
  .option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
225
- .option('--ide <id>', resolveIdeOptionHelp())).action((options) => {
226
- const scope = resolveScope(options);
227
- const projectRoot = scope === 'project'
228
- ? (options.project ?? findProjectRoot(process.cwd()) ?? process.cwd())
229
- : undefined;
230
- const ide = resolveIdeForCommand(options, projectRoot);
231
- try {
232
- const result = removeStatusLineInstall(scope, projectRoot, { ide });
233
- printResult(io, ok('statusline.uninstall', { ...result, ide }), options.json);
234
- }
235
- catch (error) {
236
- const message = getErrorMessage(error);
237
- printResult(io, fail('statusline.uninstall', 'STATUSLINE_UNINSTALL_FAILED', message, { scope, ide, removed: false }, [message]), options.json);
238
- process.exitCode = 1;
239
- }
240
- });
53
+ .option('--ide <id>', resolveIdeOptionHelp())).action((options) => runStatuslineUninstall(io, options));
54
+ }
55
+ function registerStatusVerb(statusline, io) {
241
56
  addJsonOption(statusline
242
57
  .command('status')
243
58
  .description('Report whether the Peaks status line is installed in the adapter settings.json.')
244
59
  .option('--global', 'inspect the user-level ~/.claude/settings.json instead of the project')
245
60
  .option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
246
- .option('--ide <id>', resolveIdeOptionHelp())).action((options) => {
247
- const scope = resolveScope(options);
248
- const projectRoot = scope === 'project'
249
- ? (options.project ?? findProjectRoot(process.cwd()) ?? process.cwd())
250
- : undefined;
251
- const ide = resolveIdeForCommand(options, projectRoot);
252
- try {
253
- const status = readSettingsStatus(scope, projectRoot, { ide });
254
- printResult(io, ok('statusline.status', { ...status, ide, command: 'peaks statusline' }), options.json);
255
- }
256
- catch (error) {
257
- const message = getErrorMessage(error);
258
- printResult(io, fail('statusline.status', 'STATUSLINE_STATUS_FAILED', message, { scope, ide }, [message]), options.json);
259
- process.exitCode = 1;
260
- }
261
- });
262
- //
263
- // --session-id contract: this flag is registered on the compact
264
- // subcommand but NOT on the default `peaks statusline` render path.
265
- // The flag is the internal-supported surface for the QA / LLM layer
266
- // (the integration test, the QA criteria, and any future
267
- // peaks-loop-internal tool that wants to read a non-canonical session's
268
- // compact state). The IDE consumer (Claude Code) does NOT need this
269
- // flag — its primary-line path binds to the canonical session via
270
- // `getSessionIdCanonical(projectRoot)`. Documenting both paths here
271
- // keeps the surface small and consistent: the compact subcommand is
272
- // the "I have a specific session id in mind" surface; the default
273
- // render is the "use the canonical binding" surface.
61
+ .option('--ide <id>', resolveIdeOptionHelp())).action((options) => runStatuslineStatus(io, options));
62
+ }
63
+ function registerCompactVerb(statusline, io) {
274
64
  addJsonOption(statusline
275
65
  .command('compact')
276
66
  .description('Render the single-line auto-compact indicator the LLM embeds ' +
@@ -281,49 +71,20 @@ export function registerStatusLineCommands(program, io) {
281
71
  '--session-id to target a non-canonical session explicitly.')
282
72
  .option('--project <path>', 'project root (auto-detected from cwd when omitted)')
283
73
  .option('--session-id <sid>', 'override the active session id (defaults to the canonical binding; supported for QA / internal tooling)')
284
- .option('--now <ms>', 'override current time (epoch ms) — for testing / deterministic rendering of the lifecycle expiry window')
285
- .action((options, command) => {
286
- // Re-resolve options via `command.optsWithGlobals()` (Commander 12.x
287
- // compatibility): when the parent `statusline` command has its own
288
- // `--json` registered AND the user types `peaks statusline compact
289
- // --json`, commander's parent-vs-child option parser can land
290
- // `--json` on the parent scope only. `optsWithGlobals()` merges
291
- // parent + child options so the JSON branch fires regardless of
292
- // which scope commander assigned the flag to. Verified by the
293
- // `compact --json emits the documented envelope` integration test.
294
- const merged = {
295
- ...options,
296
- ...command.optsWithGlobals?.()
297
- };
298
- try {
299
- const projectRoot = merged.project !== undefined
300
- ? merged.project
301
- : (findProjectRoot(process.cwd()) ?? process.cwd());
302
- const sid = merged.sessionId ?? getSessionIdCanonical(projectRoot) ?? null;
303
- // when present so deterministic lifecycle-window checks stay
304
- // in-range under full-suite concurrency. See `--now` doc on
305
- // the parent `statusline` command.
306
- const now = merged.now !== undefined ? Number(merged.now) : Date.now();
307
- const state = decideCompactStatusline({
308
- projectRoot,
309
- sessionId: sid,
310
- now
311
- });
312
- const label = renderCompactStatusline(state);
313
- // For non-JSON mode we print the LABEL DIRECTLY to stdout
314
- // (no envelope wrapping) because the consumer is the IDE
315
- // statusline, not a peaks-Loop caller.
316
- if (merged.json === true) {
317
- printResult(io, ok('statusline.compact', { label, state }), merged.json);
318
- }
319
- else {
320
- process.stdout.write(`${label}\n`);
321
- }
322
- }
323
- catch (error) {
324
- const message = getErrorMessage(error);
325
- printResult(io, fail('statusline.compact', 'STATUSLINE_COMPACT_FAILED', message, {}, [message]), merged.json);
326
- process.exitCode = 1;
327
- }
328
- }));
74
+ .option('--now <ms>', 'override current time (epoch ms) — for testing / deterministic rendering of the lifecycle expiry window')).action((options, command) => runStatuslineCompact(io, options, command));
75
+ }
76
+ export function registerStatusLineCommands(program, io) {
77
+ const statusline = addJsonOption(program
78
+ .command('statusline')
79
+ .description('Render the Peaks skill status line for the current session, or manage the adapter-driven statusLine entry. Run with no subcommand to render; with a subcommand (install | uninstall | status) to manage.')
80
+ .option('--project <path>', 'project root path (used to label the status line when stdin is absent; applies to the default render path)')
81
+ .option('--now <ms>', 'override current time (epoch ms) — for testing / deterministic rendering of the lifecycle expiry window'));
82
+ registerRenderVerbs(statusline, io);
83
+ registerInstallVerb(statusline, io);
84
+ registerUninstallVerb(statusline, io);
85
+ registerStatusVerb(statusline, io);
86
+ registerCompactVerb(statusline, io);
329
87
  }
88
+ // Re-export for tests / external consumers: the render body is driven directly
89
+ // by `tests/unit/cli/statusline-witness-capture.test.ts`.
90
+ export { runDefaultStatuslineRender } from './statusline-render-command.js';
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ import { type CompactOptions } from './statusline-command-shared.js';
4
+ export declare function runStatuslineCompact(io: ProgramIO, options: CompactOptions, command: Command): void;
@@ -0,0 +1,54 @@
1
+ // src/cli/commands/statusline-compact-command.ts
2
+ //
3
+ // `peaks statusline compact` — the single-line auto-compact indicator.
4
+ // Split out of `statusline-commands.ts`; the label, the JSON envelope and the
5
+ // option-merge order are unchanged.
6
+ //
7
+ // --session-id contract: the flag is registered on this subcommand but NOT on
8
+ // the default `peaks statusline` render path. It is the internal-supported
9
+ // surface for the QA / LLM layer (the integration test, the QA criteria, and
10
+ // any future peaks-loop-internal tool that wants to read a non-canonical
11
+ // session's compact state). The IDE consumer (Claude Code) does NOT need it —
12
+ // its primary-line path binds to the canonical session via
13
+ // `getSessionIdCanonical(projectRoot)`. The compact subcommand is the "I have a
14
+ // specific session id in mind" surface; the default render is the "use the
15
+ // canonical binding" surface.
16
+ import { getErrorMessage, printResult } from '../cli-helpers.js';
17
+ import { fail, ok } from 'peaks-loop-shared/result';
18
+ import { decideCompactStatusline, renderCompactStatusline } from '../../services/compact-statusline/compact-statusline-service.js';
19
+ import { getSessionIdCanonical } from '../../services/session/session-manager.js';
20
+ import { resolveProjectRoot } from './statusline-command-shared.js';
21
+ export function runStatuslineCompact(io, options, command) {
22
+ // Re-resolve options via `command.optsWithGlobals()` (Commander 12.x
23
+ // compatibility): when the parent `statusline` command has its own `--json`
24
+ // registered AND the user types `peaks statusline compact --json`,
25
+ // commander's parent-vs-child option parser can land `--json` on the parent
26
+ // scope only. `optsWithGlobals()` merges parent + child options so the JSON
27
+ // branch fires regardless of which scope commander assigned the flag to.
28
+ // Verified by the `compact --json emits the documented envelope` test.
29
+ const merged = { ...options, ...command.optsWithGlobals?.() };
30
+ try {
31
+ const projectRoot = resolveProjectRoot(merged.project);
32
+ const sid = merged.sessionId ?? getSessionIdCanonical(projectRoot) ?? null;
33
+ // `--now` is passed through when present so deterministic lifecycle-window
34
+ // checks stay in-range under full-suite concurrency. See `--now` doc on the
35
+ // parent `statusline` command.
36
+ const now = merged.now !== undefined ? Number(merged.now) : Date.now();
37
+ const state = decideCompactStatusline({ projectRoot, sessionId: sid, now });
38
+ const label = renderCompactStatusline(state);
39
+ // For non-JSON mode we print the LABEL DIRECTLY to stdout (no envelope
40
+ // wrapping) because the consumer is the IDE statusline, not a peaks-Loop
41
+ // caller.
42
+ if (merged.json === true) {
43
+ printResult(io, ok('statusline.compact', { label, state }), merged.json);
44
+ }
45
+ else {
46
+ process.stdout.write(`${label}\n`);
47
+ }
48
+ }
49
+ catch (error) {
50
+ const message = getErrorMessage(error);
51
+ printResult(io, fail('statusline.compact', 'STATUSLINE_COMPACT_FAILED', message, {}, [message]), merged.json ?? false);
52
+ process.exitCode = 1;
53
+ }
54
+ }
@@ -0,0 +1,3 @@
1
+ import { type ProgramIO } from '../cli-helpers.js';
2
+ import { type InstallOptions } from './statusline-command-shared.js';
3
+ export declare function runStatuslineInstall(io: ProgramIO, options: InstallOptions): void;
@@ -0,0 +1,48 @@
1
+ // src/cli/commands/statusline-install-command.ts
2
+ //
3
+ // `peaks statusline install` — write the statusLine entry into the adapter's
4
+ // settings.json. Split out of `statusline-commands.ts`; the scope resolution,
5
+ // the warnings, the next-action string and the failure envelope are unchanged.
6
+ import { getErrorMessage, printResult } from '../cli-helpers.js';
7
+ import { fail, ok } from 'peaks-loop-shared/result';
8
+ import { applyStatusLineInstall, planStatusLineInstall } from '../../services/skills/statusline-settings-service.js';
9
+ import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './statusline-command-shared.js';
10
+ function emitInstall(io, options, target) {
11
+ const { scope, projectRoot, ide } = target;
12
+ if (options.dryRun) {
13
+ const plan = planStatusLineInstall(scope, projectRoot, { ide });
14
+ const warnings = plan.conflict
15
+ ? [
16
+ `An existing statusLine command is set: ${plan.conflictCommand}. Rerun with --force to overwrite.`
17
+ ]
18
+ : [];
19
+ printResult(io, ok('statusline.install', { ...plan, ide, applied: false, dryRun: true }, warnings), options.json ?? false);
20
+ return;
21
+ }
22
+ const result = applyStatusLineInstall(scope, projectRoot, {
23
+ force: options.force === true,
24
+ ide
25
+ });
26
+ const warnings = result.conflict && !result.applied
27
+ ? [
28
+ `An existing statusLine command is set: ${result.conflictCommand}. Rerun with --force to overwrite.`
29
+ ]
30
+ : [];
31
+ const nextActions = result.applied
32
+ ? ['Restart the IDE (or reload the workspace) so the status line takes effect']
33
+ : [];
34
+ printResult(io, ok('statusline.install', { ...result, ide, dryRun: false }, warnings, nextActions), options.json ?? false);
35
+ }
36
+ export function runStatuslineInstall(io, options) {
37
+ const scope = resolveScope(options);
38
+ const projectRoot = scope === 'project' ? resolveProjectRoot(options.project) : undefined;
39
+ const ide = resolveIdeForCommand(options, projectRoot);
40
+ try {
41
+ emitInstall(io, options, { scope, projectRoot, ide });
42
+ }
43
+ catch (error) {
44
+ const message = getErrorMessage(error);
45
+ printResult(io, fail('statusline.install', 'STATUSLINE_INSTALL_FAILED', message, { scope, ide, applied: false }, [message]), options.json ?? false);
46
+ process.exitCode = 1;
47
+ }
48
+ }
@@ -0,0 +1,9 @@
1
+ import type { ProgramIO } from '../cli-helpers.js';
2
+ import { type RenderOptions } from './statusline-command-shared.js';
3
+ /**
4
+ * Default-statusline render body. Reused by both the top-level default
5
+ * action (Bug-02 dispatch) and the explicit `render` subcommand. Exported
6
+ * so a unit test can exercise the JSON / text output paths without going
7
+ * through commander.
8
+ */
9
+ export declare function runDefaultStatuslineRender(options: RenderOptions, io: ProgramIO): Promise<void>;
@@ -0,0 +1,55 @@
1
+ // src/cli/commands/statusline-render-command.ts
2
+ //
3
+ // The default-statusline render body. Split out of `statusline-commands.ts`;
4
+ // the rendered line, the JSON envelope and the witness write are unchanged.
5
+ //
6
+ // Capability resolution is delegated to `resolveStatusLineCapability` with only
7
+ // `env` and `isTTY` — the env-driven path is the single first-version source of
8
+ // truth. No CLI flag widens the surface. The model itself is read-only:
9
+ // `buildStatusLineModel` is the sole I/O boundary, and it also resolves compact
10
+ // state.
11
+ import { buildStatusLineModel, parseStatusLineStdin } from '../../services/skills/skill-statusline-service.js';
12
+ import { renderStatusLine, resolveStatusLineCapability } from '../../services/skills/skill-statusline-renderer.js';
13
+ import { writeHarnessWitness } from '../../services/context/harness-context-witness.js';
14
+ import { readStdin } from './statusline-command-shared.js';
15
+ /**
16
+ * Default-statusline render body. Reused by both the top-level default
17
+ * action (Bug-02 dispatch) and the explicit `render` subcommand. Exported
18
+ * so a unit test can exercise the JSON / text output paths without going
19
+ * through commander.
20
+ */
21
+ export async function runDefaultStatuslineRender(options, io) {
22
+ const raw = await readStdin();
23
+ const stdin = parseStatusLineStdin(raw);
24
+ const seeded = options.project
25
+ ? { ...(stdin ?? {}), workspace: { current_dir: options.project } }
26
+ : stdin;
27
+ // `Date.now()` for deterministic lifecycle-window checks under full-
28
+ // suite concurrency. The integration test passes a test-time `now`
29
+ // pinned at the moment `seedLifecycle` was called so the completed-
30
+ // expiry window stays in-range regardless of how long the spawned
31
+ // subprocess sat descheduled. Production callers omit the flag.
32
+ const now = options.now !== undefined ? Number(options.now) : Date.now();
33
+ const model = buildStatusLineModel(seeded, now);
34
+ // context numbers from the payload it just piped in. The project root and the
35
+ // canonical session id are taken from the model that was JUST built, so the
36
+ // witness lands under the same session this render already resolved — a second
37
+ // resolution here could disagree with it. Never throws; never changes the
38
+ // rendered line.
39
+ writeHarnessWitness({
40
+ projectRoot: model.projectRoot,
41
+ sessionId: model.sessionId,
42
+ stdin,
43
+ nowMs: now
44
+ });
45
+ const capability = resolveStatusLineCapability({
46
+ env: process.env,
47
+ isTTY: Boolean(process.stdout.isTTY)
48
+ });
49
+ const text = renderStatusLine(model, { capability }, process.env);
50
+ if (options.json === true) {
51
+ io.stdout(JSON.stringify({ ok: true, command: 'statusline.render', data: { text } }, null, 2));
52
+ return;
53
+ }
54
+ io.stdout(text);
55
+ }
@@ -0,0 +1,3 @@
1
+ import { type ProgramIO } from '../cli-helpers.js';
2
+ import { type StatusOptions } from './statusline-command-shared.js';
3
+ export declare function runStatuslineStatus(io: ProgramIO, options: StatusOptions): void;
@@ -0,0 +1,23 @@
1
+ // src/cli/commands/statusline-status-command.ts
2
+ //
3
+ // `peaks statusline status` — report whether the status line is installed.
4
+ // Split out of `statusline-commands.ts`; the scope resolution and both
5
+ // envelopes are unchanged.
6
+ import { getErrorMessage, printResult } from '../cli-helpers.js';
7
+ import { fail, ok } from 'peaks-loop-shared/result';
8
+ import { readHookStatus as readSettingsStatus } from '../../services/skills/hooks-settings-service.js';
9
+ import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './statusline-command-shared.js';
10
+ export function runStatuslineStatus(io, options) {
11
+ const scope = resolveScope(options);
12
+ const projectRoot = scope === 'project' ? resolveProjectRoot(options.project) : undefined;
13
+ const ide = resolveIdeForCommand(options, projectRoot);
14
+ try {
15
+ const status = readSettingsStatus(scope, projectRoot, { ide });
16
+ printResult(io, ok('statusline.status', { ...status, ide, command: 'peaks statusline' }), options.json ?? false);
17
+ }
18
+ catch (error) {
19
+ const message = getErrorMessage(error);
20
+ printResult(io, fail('statusline.status', 'STATUSLINE_STATUS_FAILED', message, { scope, ide }, [message]), options.json ?? false);
21
+ process.exitCode = 1;
22
+ }
23
+ }
@@ -0,0 +1,3 @@
1
+ import { type ProgramIO } from '../cli-helpers.js';
2
+ import { type UninstallOptions } from './statusline-command-shared.js';
3
+ export declare function runStatuslineUninstall(io: ProgramIO, options: UninstallOptions): void;
@@ -0,0 +1,23 @@
1
+ // src/cli/commands/statusline-uninstall-command.ts
2
+ //
3
+ // `peaks statusline uninstall` — remove the statusLine entry from the
4
+ // adapter's settings.json. Split out of `statusline-commands.ts`; the scope
5
+ // resolution and both envelopes are unchanged.
6
+ import { getErrorMessage, printResult } from '../cli-helpers.js';
7
+ import { fail, ok } from 'peaks-loop-shared/result';
8
+ import { removeStatusLineInstall } from '../../services/skills/statusline-settings-service.js';
9
+ import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './statusline-command-shared.js';
10
+ export function runStatuslineUninstall(io, options) {
11
+ const scope = resolveScope(options);
12
+ const projectRoot = scope === 'project' ? resolveProjectRoot(options.project) : undefined;
13
+ const ide = resolveIdeForCommand(options, projectRoot);
14
+ try {
15
+ const result = removeStatusLineInstall(scope, projectRoot, { ide });
16
+ printResult(io, ok('statusline.uninstall', { ...result, ide }), options.json ?? false);
17
+ }
18
+ catch (error) {
19
+ const message = getErrorMessage(error);
20
+ printResult(io, fail('statusline.uninstall', 'STATUSLINE_UNINSTALL_FAILED', message, { scope, ide, removed: false }, [message]), options.json ?? false);
21
+ process.exitCode = 1;
22
+ }
23
+ }
@@ -0,0 +1,27 @@
1
+ import { type TestFramework } from '../../services/test-cache/test-cache-service.js';
2
+ export type TestOptions = {
3
+ all?: boolean;
4
+ changed?: boolean;
5
+ clearCache?: boolean;
6
+ noCacheResult?: boolean;
7
+ /** Whether the test runner's --cache should be enabled. Commander maps
8
+ * `--no-cache` to `cache = false` (BASE name); default `true`. */
9
+ cache?: boolean;
10
+ passthrough?: boolean;
11
+ framework?: string;
12
+ project?: string;
13
+ json?: boolean;
14
+ };
15
+ /** A refused run, on the stream and in the shape the caller asked for. */
16
+ export declare function emitTestFailure(options: TestOptions, message: string): void;
17
+ /** The `--clear-cache` short circuit. */
18
+ export declare function clearCacheAndReport(options: TestOptions, projectRoot: string): void;
19
+ /** The framework to run, or null after the matching refusal was emitted. */
20
+ export declare function resolveFramework(options: TestOptions, projectRoot: string): TestFramework | null;
21
+ /** Stream the runner's output to the user, then emit the JSON envelope. */
22
+ export declare function reportRunResult(options: TestOptions, framework: TestFramework, argv: string[], result: {
23
+ code: number;
24
+ stdout: string;
25
+ stderr: string;
26
+ notice: string | null;
27
+ }): void;