peaks-loop 4.0.0-beta.9 → 4.0.1

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 (552) hide show
  1. package/CHANGELOG.md +910 -141
  2. package/README-en.md +26 -7
  3. package/README.md +75 -6
  4. package/agents/karpathy-reviewer.md +33 -0
  5. package/bin/peaks.js +0 -0
  6. package/dist/cli/cli-helpers.d.ts +31 -6
  7. package/dist/cli/cli-helpers.js +48 -25
  8. package/dist/cli/commands/_register.d.ts +3 -0
  9. package/dist/cli/commands/_register.js +139 -0
  10. package/dist/cli/commands/_super.d.ts +10 -0
  11. package/dist/cli/commands/_super.js +97 -0
  12. package/dist/cli/commands/adapter-commands-s2a.js +1 -1
  13. package/dist/cli/commands/asset-commands.js +33 -16
  14. package/dist/cli/commands/audit-commands.js +2 -2
  15. package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
  16. package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
  17. package/dist/cli/commands/bee-commands.js +1 -1
  18. package/dist/cli/commands/capability-commands.js +1 -1
  19. package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
  20. package/dist/cli/commands/changeset-commands.d.ts +13 -0
  21. package/dist/cli/commands/changeset-commands.js +46 -0
  22. package/dist/cli/commands/code-commands.d.ts +11 -1
  23. package/dist/cli/commands/code-commands.js +19 -699
  24. package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
  25. package/dist/cli/commands/code-job-shape-commands.js +164 -0
  26. package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
  27. package/dist/cli/commands/code-mode-gate-commands.js +223 -0
  28. package/dist/cli/commands/code-review-commands.js +2 -2
  29. package/dist/cli/commands/code-run-command.d.ts +12 -0
  30. package/dist/cli/commands/code-run-command.js +68 -0
  31. package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
  32. package/dist/cli/commands/code-runtime-commands.js +391 -0
  33. package/dist/cli/commands/codegraph-commands.js +1 -1
  34. package/dist/cli/commands/compact-command.js +53 -1
  35. package/dist/cli/commands/complexity-commands.js +1 -1
  36. package/dist/cli/commands/config-commands.js +4 -75
  37. package/dist/cli/commands/container-commands.d.ts +28 -0
  38. package/dist/cli/commands/container-commands.js +221 -0
  39. package/dist/cli/commands/context-commands.js +3 -2
  40. package/dist/cli/commands/core/artifacts-command.js +1 -1
  41. package/dist/cli/commands/core/binding-commands.js +1 -1
  42. package/dist/cli/commands/core/doctor-command.js +63 -3
  43. package/dist/cli/commands/core/memory-command.js +1 -1
  44. package/dist/cli/commands/core/profile-command.js +1 -1
  45. package/dist/cli/commands/core/proxy-command.js +1 -1
  46. package/dist/cli/commands/core/session-command.js +9 -7
  47. package/dist/cli/commands/core/skill-command.js +7 -4
  48. package/dist/cli/commands/core/standards-command.js +1 -1
  49. package/dist/cli/commands/cron-commands.d.ts +57 -0
  50. package/dist/cli/commands/cron-commands.js +257 -0
  51. package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
  52. package/dist/cli/commands/cron-scheduler-commands.js +284 -0
  53. package/dist/cli/commands/dashboard-commands.d.ts +4 -0
  54. package/dist/cli/commands/dashboard-commands.js +10 -0
  55. package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
  56. package/dist/cli/commands/dashboard-long-run.js +122 -0
  57. package/dist/cli/commands/dashboard-summary.d.ts +12 -0
  58. package/dist/cli/commands/dashboard-summary.js +58 -0
  59. package/dist/cli/commands/dispatch-commands.d.ts +0 -7
  60. package/dist/cli/commands/dispatch-commands.js +372 -8
  61. package/dist/cli/commands/dispatch-from-dag.js +4 -1
  62. package/dist/cli/commands/doc-commands.js +1 -1
  63. package/dist/cli/commands/ecc-commands.d.ts +30 -0
  64. package/dist/cli/commands/ecc-commands.js +119 -0
  65. package/dist/cli/commands/evolution-commands.js +1 -1
  66. package/dist/cli/commands/feedback-commands.js +1 -1
  67. package/dist/cli/commands/final-review-commands.js +1 -1
  68. package/dist/cli/commands/fixture-commands.js +1 -1
  69. package/dist/cli/commands/fork-commands.js +1 -1
  70. package/dist/cli/commands/gate-commands.js +128 -6
  71. package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
  72. package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
  73. package/dist/cli/commands/heartbeat-commands.js +76 -5
  74. package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
  75. package/dist/cli/commands/heartbeat-watch-command.js +146 -0
  76. package/dist/cli/commands/hook-handle.js +1 -1
  77. package/dist/cli/commands/hooks-commands.js +126 -10
  78. package/dist/cli/commands/ide-commands.js +1 -1
  79. package/dist/cli/commands/impact-commands.js +1 -1
  80. package/dist/cli/commands/job-commands.js +34 -1
  81. package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
  82. package/dist/cli/commands/lease-metrics-commands.js +231 -0
  83. package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
  84. package/dist/cli/commands/lease-stats-commands.js +107 -0
  85. package/dist/cli/commands/legacy-commands.js +1 -1
  86. package/dist/cli/commands/log-commands.js +1 -1
  87. package/dist/cli/commands/loop-commands.js +1 -1
  88. package/dist/cli/commands/loop-eval-commands.js +1 -1
  89. package/dist/cli/commands/memory-commands.js +1 -1
  90. package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
  91. package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
  92. package/dist/cli/commands/mut-commands.d.ts +1 -1
  93. package/dist/cli/commands/mut-commands.js +1 -5
  94. package/dist/cli/commands/observability-commands.js +1 -1
  95. package/dist/cli/commands/openspec-commands.js +65 -4
  96. package/dist/cli/commands/perf-audit-commands.js +3 -3
  97. package/dist/cli/commands/perf-commands.js +1 -1
  98. package/dist/cli/commands/polyrepo-commands.js +1 -1
  99. package/dist/cli/commands/prd-blocks-commands.js +1 -1
  100. package/dist/cli/commands/prd-commands.js +4 -2
  101. package/dist/cli/commands/preferences-commands.js +23 -3
  102. package/dist/cli/commands/project-commands.js +1 -1
  103. package/dist/cli/commands/qa-business-review-commands.js +1 -1
  104. package/dist/cli/commands/qa-commands.d.ts +1 -1
  105. package/dist/cli/commands/qa-commands.js +39 -3
  106. package/dist/cli/commands/release-commands.d.ts +15 -0
  107. package/dist/cli/commands/release-commands.js +113 -21
  108. package/dist/cli/commands/request-commands.js +1 -1
  109. package/dist/cli/commands/retrospective-commands.js +1 -1
  110. package/dist/cli/commands/reviewer-commands.js +1 -1
  111. package/dist/cli/commands/role-commands.js +1 -1
  112. package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
  113. package/dist/cli/commands/runtime-commands-helpers.js +24 -0
  114. package/dist/cli/commands/runtime-commands.js +1 -2
  115. package/dist/cli/commands/sc-commands.js +4 -2
  116. package/dist/cli/commands/scan-commands.js +1 -1
  117. package/dist/cli/commands/security-audit-commands.js +3 -3
  118. package/dist/cli/commands/sediment-commands.js +10 -1
  119. package/dist/cli/commands/session-24h-mode.d.ts +26 -0
  120. package/dist/cli/commands/session-24h-mode.js +196 -0
  121. package/dist/cli/commands/share-commands.d.ts +19 -0
  122. package/dist/cli/commands/share-commands.js +121 -2
  123. package/dist/cli/commands/skill-conformance-commands.js +1 -1
  124. package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
  125. package/dist/cli/commands/skill-search-commands.js +4 -1
  126. package/dist/cli/commands/slice-commands.js +1 -1
  127. package/dist/cli/commands/slice-integrate-commands.js +1 -1
  128. package/dist/cli/commands/slice-review-commands.js +1 -1
  129. package/dist/cli/commands/smoke-commands.js +1 -1
  130. package/dist/cli/commands/sop-commands.js +1 -1
  131. package/dist/cli/commands/spill-demo-command.d.ts +7 -0
  132. package/dist/cli/commands/spill-demo-command.js +29 -0
  133. package/dist/cli/commands/statusline-commands.d.ts +12 -0
  134. package/dist/cli/commands/statusline-commands.js +79 -17
  135. package/dist/cli/commands/sub-agent-commands.js +2 -1
  136. package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
  137. package/dist/cli/commands/sub-agent-shared.js +24 -1
  138. package/dist/cli/commands/swarm-commands.d.ts +13 -0
  139. package/dist/cli/commands/swarm-commands.js +77 -0
  140. package/dist/cli/commands/tech-commands.d.ts +64 -0
  141. package/dist/cli/commands/tech-commands.js +195 -0
  142. package/dist/cli/commands/understand-commands.js +1 -1
  143. package/dist/cli/commands/upgrade-commands.d.ts +2 -0
  144. package/dist/cli/commands/upgrade-commands.js +40 -5
  145. package/dist/cli/commands/user-touchpoint-commands.js +1 -1
  146. package/dist/cli/commands/verdict-aggregate-command.js +1 -1
  147. package/dist/cli/commands/vm-commands.d.ts +31 -0
  148. package/dist/cli/commands/vm-commands.js +274 -0
  149. package/dist/cli/commands/workflow-commands.js +24 -1
  150. package/dist/cli/commands/workflow-plan-commands.js +1 -1
  151. package/dist/cli/commands/workspace/init-command.js +1 -1
  152. package/dist/cli/commands/workspace/migrate-command.js +1 -1
  153. package/dist/cli/commands/workspace/reconcile-command.js +1 -1
  154. package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
  155. package/dist/cli/commands/worktree-auth-commands.js +652 -0
  156. package/dist/cli/index.js +58 -13
  157. package/dist/cli/program.d.ts +2 -2
  158. package/dist/cli/program.js +86 -281
  159. package/dist/services/24h-mode/decider.d.ts +103 -0
  160. package/dist/services/24h-mode/decider.js +144 -0
  161. package/dist/services/24h-mode/index.d.ts +12 -0
  162. package/dist/services/24h-mode/index.js +12 -0
  163. package/dist/services/24h-mode/state.d.ts +48 -0
  164. package/dist/services/24h-mode/state.js +51 -0
  165. package/dist/services/24h-mode/store.d.ts +27 -0
  166. package/dist/services/24h-mode/store.js +119 -0
  167. package/dist/services/artifacts/artifact-prerequisites.js +1 -1
  168. package/dist/services/artifacts/request-artifact-service.js +1 -1
  169. package/dist/services/artifacts/workspace-service.js +1 -1
  170. package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
  171. package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
  172. package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
  173. package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
  174. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
  175. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
  176. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
  177. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
  178. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
  179. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
  180. package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
  181. package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
  182. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
  183. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
  184. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
  185. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
  186. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
  187. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
  188. package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
  189. package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
  190. package/dist/services/audit/static-service.d.ts +32 -25
  191. package/dist/services/audit/static-service.js +30 -109
  192. package/dist/services/audit-independent/index.d.ts +2 -0
  193. package/dist/services/audit-independent/index.js +2 -0
  194. package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
  195. package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
  196. package/dist/services/changeset/changeset-check-service.d.ts +22 -0
  197. package/dist/services/changeset/changeset-check-service.js +47 -0
  198. package/dist/services/code/auto-compact-modes.d.ts +30 -0
  199. package/dist/services/code/auto-compact-modes.js +38 -0
  200. package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
  201. package/dist/services/code/auto-compact-orchestrator.js +101 -21
  202. package/dist/services/code/dag-orchestrator.d.ts +30 -1
  203. package/dist/services/code/dag-orchestrator.js +106 -1
  204. package/dist/services/code/status-line-renderer.d.ts +2 -0
  205. package/dist/services/code/status-line-renderer.js +21 -3
  206. package/dist/services/code-review/ocr-service.d.ts +1 -1
  207. package/dist/services/code-review/ocr-service.js +6 -3
  208. package/dist/services/compact-history/compact-history-service.d.ts +41 -0
  209. package/dist/services/compact-history/compact-history-service.js +62 -0
  210. package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
  211. package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
  212. package/dist/services/config/config-service.d.ts +1 -12
  213. package/dist/services/config/config-service.js +3 -72
  214. package/dist/services/config/config-types.d.ts +2 -4
  215. package/dist/services/config/config-types.js +1 -1
  216. package/dist/services/container/container-lease.d.ts +67 -0
  217. package/dist/services/container/container-lease.js +135 -0
  218. package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
  219. package/dist/services/context/auto-compact-dispatcher.js +32 -102
  220. package/dist/services/context/auto-compact-reader.js +1 -1
  221. package/dist/services/context/auto-compact-types.d.ts +27 -2
  222. package/dist/services/context/auto-compact-types.js +8 -1
  223. package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
  224. package/dist/services/context/build-dispatch-system-prompt.js +117 -0
  225. package/dist/services/context/collector.d.ts +2 -2
  226. package/dist/services/context/context-builder.d.ts +4 -4
  227. package/dist/services/context/context-schema.d.ts +48 -48
  228. package/dist/services/context/ide-detect.d.ts +4 -0
  229. package/dist/services/context/ide-detect.js +24 -0
  230. package/dist/services/context/main-session-monitor.d.ts +1 -4
  231. package/dist/services/context/main-session-monitor.js +1 -24
  232. package/dist/services/context/memory-index-reader.d.ts +8 -0
  233. package/dist/services/context/memory-index-reader.js +57 -0
  234. package/dist/services/context/memory-lru-cache.d.ts +12 -0
  235. package/dist/services/context/memory-lru-cache.js +60 -0
  236. package/dist/services/context/memory-preflight-config.d.ts +19 -0
  237. package/dist/services/context/memory-preflight-config.js +25 -0
  238. package/dist/services/context/memory-preflight-service.d.ts +19 -0
  239. package/dist/services/context/memory-preflight-service.js +120 -0
  240. package/dist/services/context/spillover-store.d.ts +23 -0
  241. package/dist/services/context/spillover-store.js +155 -0
  242. package/dist/services/context/spillover-types.d.ts +18 -0
  243. package/dist/services/context/spillover-types.js +1 -0
  244. package/dist/services/crystallization/crystallization-service.d.ts +22 -5
  245. package/dist/services/crystallization/crystallization-service.js +8 -14
  246. package/dist/services/crystallization/crystallization-types.d.ts +6 -6
  247. package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
  248. package/dist/services/crystallization/index.d.ts +13 -0
  249. package/dist/services/crystallization/index.js +13 -0
  250. package/dist/services/dashboard/project-dashboard-service.js +2 -2
  251. package/dist/services/dispatch/await-batch.d.ts +70 -0
  252. package/dist/services/dispatch/await-batch.js +272 -0
  253. package/dist/services/dispatch/batch-counter.js +1 -1
  254. package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
  255. package/dist/services/dispatch/dispatch-record-writer.js +239 -9
  256. package/dist/services/dispatch/slice-dag.d.ts +46 -0
  257. package/dist/services/dispatch/slice-dag.js +6 -0
  258. package/dist/services/dispatch/stage-enum.d.ts +27 -0
  259. package/dist/services/dispatch/stage-enum.js +48 -0
  260. package/dist/services/dispatch/startup-timeout.d.ts +86 -0
  261. package/dist/services/dispatch/startup-timeout.js +97 -0
  262. package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
  263. package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
  264. package/dist/services/dispatch/test-tool-detection.js +80 -0
  265. package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
  266. package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
  267. package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
  268. package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
  269. package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
  270. package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
  271. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
  272. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
  273. package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
  274. package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
  275. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
  276. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
  277. package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
  278. package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
  279. package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
  280. package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
  281. package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
  282. package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
  283. package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
  284. package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
  285. package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
  286. package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
  287. package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
  288. package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
  289. package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
  290. package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
  291. package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
  292. package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
  293. package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
  294. package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
  295. package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
  296. package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
  297. package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
  298. package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
  299. package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
  300. package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
  301. package/dist/services/doctor/doctor-service/index.d.ts +48 -0
  302. package/dist/services/doctor/doctor-service/index.js +254 -0
  303. package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
  304. package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
  305. package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
  306. package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
  307. package/dist/services/doctor/doctor-service/types.d.ts +245 -0
  308. package/dist/services/doctor/doctor-service/types.js +15 -0
  309. package/dist/services/doctor/doctor-service.d.ts +15 -146
  310. package/dist/services/doctor/doctor-service.js +22 -926
  311. package/dist/services/doctor/index.d.ts +22 -0
  312. package/dist/services/doctor/index.js +22 -0
  313. package/dist/services/env/shell-probe.d.ts +71 -0
  314. package/dist/services/env/shell-probe.js +161 -0
  315. package/dist/services/evolution/evolution-types.d.ts +39 -39
  316. package/dist/services/final-review/final-review-service.d.ts +11 -1
  317. package/dist/services/final-review/index.d.ts +2 -0
  318. package/dist/services/final-review/index.js +1 -0
  319. package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
  320. package/dist/services/hooks/auto-compact-hook-install.js +4 -5
  321. package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
  322. package/dist/services/hooks/worktree-authorization-gate.js +492 -0
  323. package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
  324. package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
  325. package/dist/services/ide/adapters/qoder-adapter.js +57 -0
  326. package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
  327. package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
  328. package/dist/services/ide/ide-registry.js +6 -0
  329. package/dist/services/ide/ide-types.d.ts +1 -1
  330. package/dist/services/job/job-types.d.ts +56 -56
  331. package/dist/services/job-snapshot/index.d.ts +8 -0
  332. package/dist/services/job-snapshot/index.js +7 -0
  333. package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
  334. package/dist/services/job-snapshot/types.d.ts +7 -0
  335. package/dist/services/job-snapshot/types.js +1 -0
  336. package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
  337. package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
  338. package/dist/services/log/retention.d.ts +16 -0
  339. package/dist/services/log/retention.js +17 -0
  340. package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
  341. package/dist/services/loop/loop-release-types.d.ts +24 -24
  342. package/dist/services/loop/monotonic-runner.d.ts +17 -11
  343. package/dist/services/loop/monotonic-runner.js +118 -79
  344. package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
  345. package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
  346. package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
  347. package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
  348. package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
  349. package/dist/services/memory/project-memory-service/index/search.js +194 -0
  350. package/dist/services/memory/project-memory-service/index.d.ts +9 -0
  351. package/dist/services/memory/project-memory-service/index.js +24 -0
  352. package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
  353. package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
  354. package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
  355. package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
  356. package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
  357. package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
  358. package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
  359. package/dist/services/memory/project-memory-service/store/paths.js +116 -0
  360. package/dist/services/memory/project-memory-service/types.d.ts +128 -0
  361. package/dist/services/memory/project-memory-service/types.js +9 -0
  362. package/dist/services/memory/project-memory-service.d.ts +1 -167
  363. package/dist/services/memory/project-memory-service.js +19 -816
  364. package/dist/services/migrate-skill-name/schema.d.ts +2 -2
  365. package/dist/services/observability/aggregation.d.ts +27 -0
  366. package/dist/services/observability/aggregation.js +72 -0
  367. package/dist/services/observability/observability-service.d.ts +73 -7
  368. package/dist/services/observability/observability-service.js +87 -1
  369. package/dist/services/openspec/artifact-boundary.d.ts +138 -0
  370. package/dist/services/openspec/artifact-boundary.js +150 -0
  371. package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
  372. package/dist/services/openspec/coverage-evidence-reader.js +386 -0
  373. package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
  374. package/dist/services/openspec/openspec-archive-service.js +320 -8
  375. package/dist/services/openspec/openspec-bridge-service.js +1 -1
  376. package/dist/services/openspec/openspec-init-service.js +1 -1
  377. package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
  378. package/dist/services/openspec/openspec-render-service.js +7 -4
  379. package/dist/services/openspec/openspec-scan-service.js +1 -1
  380. package/dist/services/openspec/openspec-validate-service.js +5 -4
  381. package/dist/services/preferences/preferences-service.js +10 -0
  382. package/dist/services/preferences/preferences-types.d.ts +13 -0
  383. package/dist/services/preferences/preferences-types.js +11 -0
  384. package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
  385. package/dist/services/qa/screenshot-archive-service.js +134 -0
  386. package/dist/services/rd/rd-service.js +10 -11
  387. package/dist/services/rd/types.d.ts +32 -32
  388. package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
  389. package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
  390. package/dist/services/recommendations/capability-seed-items.js +0 -1
  391. package/dist/services/recommendations/capability-seed-mappings.js +0 -1
  392. package/dist/services/recommendations/capability-seed-sources.js +0 -1
  393. package/dist/services/release/version-precheck-service.d.ts +51 -0
  394. package/dist/services/release/version-precheck-service.js +257 -0
  395. package/dist/services/scan/acceptance-coverage-service.js +1 -1
  396. package/dist/services/scan/archetype-service.js +1 -1
  397. package/dist/services/scan/existing-system-service.js +1 -1
  398. package/dist/services/scan/libraries-service.js +1 -1
  399. package/dist/services/sediment/json-schema.d.ts +40 -40
  400. package/dist/services/share/bundle-types.d.ts +12 -12
  401. package/dist/services/share/run-state-contract.d.ts +2 -2
  402. package/dist/services/skill/skill-search-service.d.ts +12 -7
  403. package/dist/services/skill/skill-search-service.js +8 -4
  404. package/dist/services/skillhub/migrations/001-initial.sql +71 -0
  405. package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
  406. package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
  407. package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
  408. package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
  409. package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
  410. package/dist/services/skills/hooks-settings-service.d.ts +75 -0
  411. package/dist/services/skills/hooks-settings-service.js +230 -2
  412. package/dist/services/skills/skill-registry.d.ts +1 -0
  413. package/dist/services/skills/skill-registry.js +6 -4
  414. package/dist/services/skills/skill-runbook-service.js +1 -1
  415. package/dist/services/slice/slice-check-service.js +1 -1
  416. package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
  417. package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
  418. package/dist/services/standards/missing-standards-detector.d.ts +25 -0
  419. package/dist/services/standards/missing-standards-detector.js +43 -12
  420. package/dist/services/tech/tech-change-id-service.d.ts +82 -0
  421. package/dist/services/tech/tech-change-id-service.js +117 -0
  422. package/dist/services/understand/understand-hybrid-service.js +1 -1
  423. package/dist/services/understand/understand-scan-service.js +2 -2
  424. package/dist/services/upgrade/upgrade-service.js +4 -3
  425. package/dist/services/verdict/envelopes.d.ts +2 -2
  426. package/dist/services/verdict/envelopes.js +2 -2
  427. package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
  428. package/dist/services/vm/vm-lease.d.ts +40 -0
  429. package/dist/services/vm/vm-lease.js +137 -0
  430. package/dist/services/workflow/autonomous-resume-writer.js +1 -1
  431. package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
  432. package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
  433. package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
  434. package/dist/services/workflow/pipeline-verify-service.js +42 -218
  435. package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
  436. package/dist/services/workflow/pipeline-verify-types.js +10 -0
  437. package/dist/services/workflow/plan-reader.d.ts +1 -1
  438. package/dist/services/workflow/plan-reader.js +1 -1
  439. package/dist/services/workflow/plan-refresher.d.ts +1 -1
  440. package/dist/services/workflow/plan-refresher.js +1 -1
  441. package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
  442. package/dist/services/workflow/plan-trigger-detector.js +1 -1
  443. package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
  444. package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
  445. package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
  446. package/dist/services/workflow/workflow-autonomous-types.js +21 -0
  447. package/dist/services/workflow/workflow-router-service.js +18 -16
  448. package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
  449. package/dist/services/workflow/workflow-spec-lint.js +75 -0
  450. package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
  451. package/dist/services/workflow/workflow-spec-types.js +13 -0
  452. package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
  453. package/dist/services/workflow/workflow-spec-yaml.js +88 -0
  454. package/dist/services/workflow/workflow-spec.d.ts +11 -91
  455. package/dist/services/workflow/workflow-spec.js +16 -145
  456. package/dist/services/workspace/migrate-service.js +1 -1
  457. package/dist/services/workspace/workspace-service.js +1 -1
  458. package/dist/services/worktree/worktree-lease.d.ts +170 -0
  459. package/dist/services/worktree/worktree-lease.js +242 -0
  460. package/package.json +47 -51
  461. package/scripts/clean-dist.mjs +31 -1
  462. package/scripts/copy-templates.mjs +16 -0
  463. package/scripts/sync-version.mjs +53 -2
  464. package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
  465. package/skills/bee/peaks-prd/SKILL.md +16 -0
  466. package/skills/bee/peaks-prd/test-prompts.json +12 -0
  467. package/skills/bee/peaks-qa/SKILL.md +16 -1
  468. package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
  469. package/skills/bee/peaks-qa/test-prompts.json +12 -0
  470. package/skills/bee/peaks-rd/SKILL.md +29 -20
  471. package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
  472. package/skills/bee/peaks-rd/test-prompts.json +12 -0
  473. package/skills/bee/peaks-reviewer/SKILL.md +17 -0
  474. package/skills/bee/peaks-sc/SKILL.md +16 -0
  475. package/skills/bee/peaks-security-audit/SKILL.md +17 -0
  476. package/skills/bee/peaks-txt/SKILL.md +16 -0
  477. package/skills/bee/peaks-txt/test-prompts.json +12 -0
  478. package/skills/bee/peaks-ui/SKILL.md +49 -43
  479. package/skills/bee/peaks-ui/test-prompts.json +12 -0
  480. package/skills/peaks-code/SKILL.md +54 -109
  481. package/skills/peaks-code/references/boundaries.md +15 -1
  482. package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
  483. package/skills/peaks-code/references/external-skill-invocation.md +27 -0
  484. package/skills/peaks-code/references/lease-dashboard.html +224 -0
  485. package/skills/peaks-code/references/lease-stats.sample.json +26 -0
  486. package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
  487. package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
  488. package/skills/peaks-code/references/runbook.md +63 -1
  489. package/skills/peaks-code/references/startup-sequence.md +110 -0
  490. package/skills/peaks-code/references/step-0-8-gate.md +1 -1
  491. package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
  492. package/skills/peaks-code/references/worktree-governance.md +123 -0
  493. package/skills/peaks-code/test-prompts.json +12 -0
  494. package/skills/peaks-doctor/SKILL.md +1 -1
  495. package/skills/peaks-ide/SKILL.md +1 -1
  496. package/skills/peaks-solo/SKILL.md +21 -0
  497. package/skills/peaks-solo/references/triage-decision-table.md +6 -0
  498. package/skills/peaks-sop/test-prompts.json +17 -0
  499. package/dist/cli/commands/agent-commands.d.ts +0 -20
  500. package/dist/cli/commands/agent-commands.js +0 -48
  501. package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
  502. package/dist/cli/commands/classify-classify-commands.js +0 -151
  503. package/dist/cli/commands/contract-commands.d.ts +0 -26
  504. package/dist/cli/commands/contract-commands.js +0 -114
  505. package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
  506. package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
  507. package/dist/cli/commands/worker-commands.d.ts +0 -3
  508. package/dist/cli/commands/worker-commands.js +0 -52
  509. package/dist/services/agent/ecc-agent-service.d.ts +0 -47
  510. package/dist/services/agent/ecc-agent-service.js +0 -143
  511. package/dist/services/config/provider-service.d.ts +0 -48
  512. package/dist/services/config/provider-service.js +0 -143
  513. package/dist/services/context/dispatch-context-guard.d.ts +0 -27
  514. package/dist/services/context/dispatch-context-guard.js +0 -192
  515. package/dist/services/context/shared-channel.d.ts +0 -93
  516. package/dist/services/context/shared-channel.js +0 -308
  517. package/dist/services/filesystem/file-lock.d.ts +0 -11
  518. package/dist/services/filesystem/file-lock.js +0 -152
  519. package/dist/services/mut/assert-scanner.d.ts +0 -6
  520. package/dist/services/mut/assert-scanner.js +0 -116
  521. package/dist/services/mut/index.d.ts +0 -8
  522. package/dist/services/mut/index.js +0 -7
  523. package/dist/services/mut/mut-runner.d.ts +0 -39
  524. package/dist/services/mut/mut-runner.js +0 -29
  525. package/dist/services/mut/production-stryker.d.ts +0 -2
  526. package/dist/services/mut/production-stryker.js +0 -75
  527. package/dist/services/mut/report-builder.d.ts +0 -11
  528. package/dist/services/mut/report-builder.js +0 -110
  529. package/dist/services/mut/report-loader.d.ts +0 -31
  530. package/dist/services/mut/report-loader.js +0 -78
  531. package/dist/services/mut/thresholds.d.ts +0 -21
  532. package/dist/services/mut/thresholds.js +0 -22
  533. package/dist/services/mut/types.d.ts +0 -336
  534. package/dist/services/mut/types.js +0 -59
  535. package/dist/services/providers/minimax-provider-service.d.ts +0 -24
  536. package/dist/services/providers/minimax-provider-service.js +0 -143
  537. package/dist/services/providers/minimax-worker-service.d.ts +0 -21
  538. package/dist/services/providers/minimax-worker-service.js +0 -83
  539. package/dist/shared/fs.d.ts +0 -4
  540. package/dist/shared/fs.js +0 -26
  541. package/dist/shared/paths.d.ts +0 -6
  542. package/dist/shared/paths.js +0 -50
  543. package/dist/shared/result.d.ts +0 -22
  544. package/dist/shared/result.js +0 -46
  545. package/dist/shared/version.d.ts +0 -1
  546. package/dist/shared/version.js +0 -1
  547. package/examples/video-demo/README.md +0 -142
  548. package/examples/video-demo/out/en-closing-960.png +0 -0
  549. package/examples/video-demo/out/zh-closing-960.png +0 -0
  550. package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
  551. package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
  552. /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
@@ -0,0 +1,196 @@
1
+ /**
2
+ * `peaks session 24h-mode` — state-only CLI for the 24h mode backbone.
3
+ *
4
+ * Rid-020a (state-only slice). Exposes four sub-actions so the LLM
5
+ * orchestrator can introspect, transition, audit retry attempts, and
6
+ * reset the 24h state machine without touching the JSON file
7
+ * directly. The LLM is the decision-maker; the CLI is the muscle
8
+ * (same contract as `peaks session checkpoint`).
9
+ *
10
+ * Sub-actions (all accept --json for machine-readable envelopes):
11
+ * - `peaks session 24h-mode state` — read snapshot
12
+ * - `peaks session 24h-mode transition` — move to a new state
13
+ * - `peaks session 24h-mode attempts` — read attempts map
14
+ * - `peaks session 24h-mode reset` — wipe the snapshot
15
+ *
16
+ * peaks-code is the skill that should drive this CLI; we do not
17
+ * add a new top-level verb (peaks-loop is enhancement, not a new
18
+ * CLI surface — see `.peaks/memory/peaks-loop-is-enhancement-not-new-cli.md`).
19
+ */
20
+ import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
21
+ import { getErrorMessage } from '../cli-helpers.js';
22
+ import { HANDOFF_EXIT_CONDITIONS, STATES, emptySnapshot, isHandoffExitCondition, isState, read24hState, write24hState } from '../../services/24h-mode/index.js';
23
+ function splitList(value) {
24
+ if (!value)
25
+ return [];
26
+ return value
27
+ .split(/[,\r\n]/)
28
+ .map((s) => s.trim())
29
+ .filter((s) => s.length > 0);
30
+ }
31
+ function printJson(io, payload, options) {
32
+ if (options.json === true) {
33
+ io.stdout(JSON.stringify(payload) + '\n');
34
+ }
35
+ else {
36
+ io.stdout(JSON.stringify(payload, null, 2) + '\n');
37
+ }
38
+ }
39
+ function printError(io, code, message, options) {
40
+ if (options.json === true) {
41
+ io.stderr(JSON.stringify({ ok: false, code, error: message }) + '\n');
42
+ }
43
+ else {
44
+ io.stderr(`${code}: ${message}\n`);
45
+ }
46
+ }
47
+ /**
48
+ * Resolve the session id from the parent options; falls back to the
49
+ * canonical session-manager binding if `--session-id` is not set.
50
+ * The dynamic import keeps the static dependency graph clean (no
51
+ * top-level cycle with `session-manager.ts`).
52
+ */
53
+ async function resolveSessionIdAsync(opts) {
54
+ if (opts.sessionId)
55
+ return opts.sessionId;
56
+ const projectRoot = resolveCanonicalProjectRoot(opts.project ?? process.cwd());
57
+ const { getSessionIdCanonical } = await import('../../services/session/session-manager.js');
58
+ return getSessionIdCanonical(projectRoot);
59
+ }
60
+ export function registerSession24hModeCommand(session, io) {
61
+ const cmd = session
62
+ .command('24h-mode')
63
+ .description('24h mode state machine (rid-020a). Sub-actions: state, transition, attempts, reset. ' +
64
+ 'persists to .peaks/_runtime/<sessionId>/24h-state.json.')
65
+ .option('--json', 'emit machine-readable JSON envelope')
66
+ .option('--project <path>', 'project root (defaults to current directory)', process.cwd())
67
+ .option('--session-id <sessionId>', 'explicit session id (defaults to canonical binding)');
68
+ // sub-action: state (read snapshot)
69
+ cmd
70
+ .command('state')
71
+ .description('Read the current 24h mode state snapshot')
72
+ .action(async (subOpts) => {
73
+ const parentOpts = cmd.opts();
74
+ const merged = { ...parentOpts, ...subOpts };
75
+ const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
76
+ const sid = await resolveSessionIdAsync(merged);
77
+ if (!sid) {
78
+ printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+ try {
83
+ const snapshot = read24hState(projectRoot, sid);
84
+ printJson(io, { ok: true, data: snapshot }, merged);
85
+ }
86
+ catch (error) {
87
+ printError(io, '24H_STATE_READ_FAILED', getErrorMessage(error), merged);
88
+ process.exitCode = 1;
89
+ }
90
+ });
91
+ // sub-action: transition (move to a new state)
92
+ cmd
93
+ .command('transition')
94
+ .description('Move the state machine to a new state')
95
+ .requiredOption('--state <state>', `target state (one of: ${STATES.join(', ')})`)
96
+ .option('--reason <text>', 'human-readable reason for the transition')
97
+ .option('--exit-condition <condition>', `HANDOFF exit condition (one of: ${HANDOFF_EXIT_CONDITIONS.join(', ')})`)
98
+ .option('--active-slices <list>', 'comma-separated active slice ids (e.g. "rid-020a,rid-020b")')
99
+ .action(async (subOpts) => {
100
+ const parentOpts = cmd.opts();
101
+ const merged = { ...parentOpts, ...subOpts };
102
+ const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
103
+ const sid = await resolveSessionIdAsync(merged);
104
+ if (!sid) {
105
+ printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ if (!merged.state || !isState(merged.state)) {
110
+ printError(io, 'INVALID_STATE', `--state must be one of ${STATES.join(', ')} (got ${JSON.stringify(merged.state)})`, merged);
111
+ process.exitCode = 1;
112
+ return;
113
+ }
114
+ const target = merged.state;
115
+ if (merged.exitCondition !== undefined && !isHandoffExitCondition(merged.exitCondition)) {
116
+ printError(io, 'INVALID_EXIT_CONDITION', `--exit-condition must be one of ${HANDOFF_EXIT_CONDITIONS.join(', ')}`, merged);
117
+ process.exitCode = 1;
118
+ return;
119
+ }
120
+ if (target === 'HANDOFF' && !merged.exitCondition) {
121
+ printError(io, 'HANDOFF_REQUIRES_EXIT_CONDITION', 'transitioning to HANDOFF requires --exit-condition', merged);
122
+ process.exitCode = 1;
123
+ return;
124
+ }
125
+ try {
126
+ const current = read24hState(projectRoot, sid);
127
+ const now = new Date().toISOString();
128
+ const sliceList = splitList(merged.activeSlices);
129
+ const next = {
130
+ ...current,
131
+ state: target,
132
+ enteredAt: now,
133
+ enteredFrom: current.state,
134
+ activeSlices: sliceList.length > 0 ? sliceList : current.activeSlices,
135
+ exitCondition: target === 'HANDOFF' ? (merged.exitCondition ?? null) : current.exitCondition
136
+ };
137
+ const result = write24hState(projectRoot, sid, next);
138
+ printJson(io, { ok: true, data: { ...next, path: result.path } }, merged);
139
+ }
140
+ catch (error) {
141
+ printError(io, '24H_STATE_WRITE_FAILED', getErrorMessage(error), merged);
142
+ process.exitCode = 1;
143
+ }
144
+ });
145
+ // sub-action: attempts (read attempts map)
146
+ cmd
147
+ .command('attempts')
148
+ .description('Read the B3 attempts map (per-key retry counts)')
149
+ .action(async (subOpts) => {
150
+ const parentOpts = cmd.opts();
151
+ const merged = { ...parentOpts, ...subOpts };
152
+ const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
153
+ const sid = await resolveSessionIdAsync(merged);
154
+ if (!sid) {
155
+ printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
156
+ process.exitCode = 1;
157
+ return;
158
+ }
159
+ try {
160
+ const snapshot = read24hState(projectRoot, sid);
161
+ printJson(io, { ok: true, data: { state: snapshot.state, attempts: snapshot.attempts } }, merged);
162
+ }
163
+ catch (error) {
164
+ printError(io, '24H_STATE_READ_FAILED', getErrorMessage(error), merged);
165
+ process.exitCode = 1;
166
+ }
167
+ });
168
+ // sub-action: reset (wipe the snapshot)
169
+ cmd
170
+ .command('reset')
171
+ .description('Reset the 24h state snapshot to IDLE (fresh start)')
172
+ .action(async (subOpts) => {
173
+ const parentOpts = cmd.opts();
174
+ const merged = { ...parentOpts, ...subOpts };
175
+ const projectRoot = resolveCanonicalProjectRoot(merged.project ?? process.cwd());
176
+ const sid = await resolveSessionIdAsync(merged);
177
+ if (!sid) {
178
+ printError(io, 'NO_ACTIVE_SESSION', 'no --session-id and no canonical binding', merged);
179
+ process.exitCode = 1;
180
+ return;
181
+ }
182
+ try {
183
+ const fresh = emptySnapshot();
184
+ const result = write24hState(projectRoot, sid, fresh);
185
+ printJson(io, { ok: true, data: { ...fresh, path: result.path } }, merged);
186
+ }
187
+ catch (error) {
188
+ printError(io, '24H_STATE_WRITE_FAILED', getErrorMessage(error), merged);
189
+ process.exitCode = 1;
190
+ }
191
+ });
192
+ }
193
+ export const SESSION_24H_MODE_CONSTANTS = {
194
+ STATES,
195
+ HANDOFF_EXIT_CONDITIONS
196
+ };
@@ -15,3 +15,22 @@ import { type ProgramIO } from '../cli-helpers.js';
15
15
  export declare function registerShareCommand(parent: Command, io: ProgramIO): void;
16
16
  export declare function registerSharedReadCommand(parent: Command, io: ProgramIO): void;
17
17
  export declare function registerAwaitCommand(parent: Command, io: ProgramIO): void;
18
+ /**
19
+ * Slice 2026-07-17-D21: peaks sub-agent finalize — LLM-side completion
20
+ * signal. Without this, dispatch records stay queued forever.
21
+ *
22
+ * Contract:
23
+ * - LLM MUST call once per dispatched Task, in post-completion branch.
24
+ * - --all-stale bulk-marks every queued record for this session (crash recovery).
25
+ */
26
+ export interface FinalizeOptions {
27
+ batch?: string;
28
+ requestId?: string;
29
+ outcome?: string;
30
+ error?: string;
31
+ allStale?: boolean;
32
+ project?: string;
33
+ sessionId?: string;
34
+ json?: boolean;
35
+ }
36
+ export declare function registerFinalizeCommand(parent: Command, io: ProgramIO): void;
@@ -1,6 +1,7 @@
1
- import { fail, getErrorMessage, ok } from '../../shared/result.js';
1
+ import { resolve } from 'node:path';
2
+ import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
2
3
  import { addJsonOption, printResult } from '../cli-helpers.js';
3
- import { readSharedChannel, writeSharedEntry, SHARED_CHANNEL_SOFT_VALUE_WARN } from '../../services/context/shared-channel.js';
4
+ import { readSharedChannel, writeSharedEntry, SHARED_CHANNEL_SOFT_VALUE_WARN } from 'peaks-loop-shared-channel';
4
5
  import { writeLogEntry } from '../../services/log/logger.js';
5
6
  import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
6
7
  import { summarizeBatchResults } from './sub-agent-shared.js';
@@ -294,3 +295,121 @@ function awaitErrorNextActions(code) {
294
295
  }
295
296
  return 'See error message; check that --batch matches the dispatch envelope and --timeout is a positive integer ms.';
296
297
  }
298
+ export function registerFinalizeCommand(parent, io) {
299
+ addJsonOption(parent
300
+ .command('finalize')
301
+ .description('D21: signal that a dispatched sub-agent has finished (success/failure/cancellation). Pass --all-stale for crash-recovery sweep.')
302
+ .option('--batch <batchId>', 'batchId from dispatch envelope')
303
+ .option('--request-id <rid>', 'requestId from dispatch envelope')
304
+ .option('--outcome <state>', 'done | failed | cancelled (default: done)')
305
+ .option('--error <msg>', 'error message (when --outcome=failed)')
306
+ .option('--all-stale', 'bulk-mark every queued record for this session as done')
307
+ .option('--project <path>', 'target project root (defaults to cwd)')
308
+ .option('--session-id <sid>', 'override active session id')).action((options) => {
309
+ void (async () => {
310
+ const asJson = options.json === true;
311
+ try {
312
+ const projectRoot = resolve(options.project ?? process.cwd());
313
+ const sessionId = options.sessionId ?? getCurrentSessionId(projectRoot) ?? 'unknown-sid';
314
+ if (!options.allStale && !options.requestId && !options.batch) {
315
+ printResult(io, fail('sub-agent.finalize', 'MISSING_TARGET', 'Pass --request-id or --batch (or --all-stale)', { ok: false }, ['Call finalize after each Task completes.']), asJson);
316
+ process.exitCode = 1;
317
+ return;
318
+ }
319
+ const outcome = (options.outcome ?? 'done');
320
+ const writerMod = await import('../../services/dispatch/dispatch-record-writer.js');
321
+ const { readRecord, markCompleted, readActiveDispatchIndex } = writerMod;
322
+ // map outcome -> (status, outcome)
323
+ const outcomeMap = {
324
+ done: { status: 'done', outcome: 'success' },
325
+ failed: { status: 'failed', outcome: 'failed' },
326
+ cancelled: { status: 'cancelled', outcome: 'cancelled' },
327
+ };
328
+ const mapped = outcomeMap[outcome] ?? outcomeMap['done'];
329
+ const finalized = [];
330
+ const skipped = [];
331
+ const errors = [];
332
+ const applyOutcome = (recordPath, rid) => {
333
+ markCompleted({ recordPath, now: () => new Date(), status: mapped.status, outcome: mapped.outcome, projectRoot });
334
+ finalized.push({ recordPath, requestId: rid, status: mapped.status });
335
+ };
336
+ if (options.allStale) {
337
+ const index = readActiveDispatchIndex(projectRoot, sessionId);
338
+ for (const [recordPath, entry] of Object.entries(index)) {
339
+ if (entry.status !== 'queued') {
340
+ skipped.push({ recordPath, reason: 'status is ' + entry.status });
341
+ continue;
342
+ }
343
+ try {
344
+ applyOutcome(recordPath, entry.requestId);
345
+ }
346
+ catch (e) {
347
+ errors.push({ recordPath, error: getErrorMessage(e) });
348
+ }
349
+ }
350
+ }
351
+ else if (options.requestId) {
352
+ const fs2 = await import('node:fs');
353
+ const path2 = await import('node:path');
354
+ const dir = path2.resolve(projectRoot, '.peaks', '_sub_agents', sessionId);
355
+ let resolvedPath = null;
356
+ if (fs2.existsSync(dir)) {
357
+ for (const f of fs2.readdirSync(dir)) {
358
+ if (!f.endsWith('.json'))
359
+ continue;
360
+ const p = path2.join(dir, f);
361
+ const r = readRecord(p);
362
+ if (r.requestId === options.requestId) {
363
+ resolvedPath = p;
364
+ break;
365
+ }
366
+ }
367
+ }
368
+ if (!resolvedPath) {
369
+ printResult(io, fail('sub-agent.finalize', 'RECORD_NOT_FOUND', 'No dispatch record for requestId=' + options.requestId, { ok: false }, ['Check --request-id matches the dispatch envelope.']), asJson);
370
+ process.exitCode = 1;
371
+ return;
372
+ }
373
+ try {
374
+ applyOutcome(resolvedPath, options.requestId);
375
+ }
376
+ catch (e) {
377
+ errors.push({ recordPath: resolvedPath, error: getErrorMessage(e) });
378
+ }
379
+ }
380
+ else {
381
+ const fs2 = await import('node:fs');
382
+ const path2 = await import('node:path');
383
+ const dir = path2.resolve(projectRoot, '.peaks', '_sub_agents', sessionId);
384
+ if (fs2.existsSync(dir)) {
385
+ for (const f of fs2.readdirSync(dir)) {
386
+ if (!f.startsWith('dispatch-') || !f.endsWith('.json'))
387
+ continue;
388
+ const p = path2.join(dir, f);
389
+ const r = readRecord(p);
390
+ if (r.batchId !== options.batch)
391
+ continue;
392
+ if (r.status !== 'queued') {
393
+ skipped.push({ recordPath: p, reason: 'status is ' + r.status });
394
+ continue;
395
+ }
396
+ try {
397
+ applyOutcome(p, r.requestId);
398
+ }
399
+ catch (e) {
400
+ errors.push({ recordPath: p, error: getErrorMessage(e) });
401
+ }
402
+ }
403
+ }
404
+ }
405
+ printResult(io, ok('sub-agent.finalize', { finalized, skipped, errors, sessionId, outcome }, errors.length > 0 ? [errors.length + ' failed'] : [], errors.length > 0 ? ['Re-run after fixing.'] : ['All targeted records transitioned out of queued.']), asJson);
406
+ if (errors.length > 0)
407
+ process.exitCode = 1;
408
+ }
409
+ catch (error) {
410
+ printResult(io, fail('sub-agent.finalize', 'FINALIZE_ERROR', getErrorMessage(error), { ok: false }, ['Inspect the error.']), asJson);
411
+ process.exitCode = 1;
412
+ }
413
+ })();
414
+ });
415
+ }
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { auditSkillConformance } from '../../services/skills/skill-conformance-service.js';
8
8
  import { getErrorMessage, printResult } from '../cli-helpers.js';
9
- import { fail, ok } from '../../shared/result.js';
9
+ import { fail, ok } from 'peaks-loop-shared/result';
10
10
  export function registerSkillConformanceCommands(program, io) {
11
11
  program
12
12
  .command('skills:audit-conformance')
@@ -36,7 +36,7 @@ import { readFileSync, existsSync, statSync } from 'node:fs';
36
36
  import { join, resolve } from 'node:path';
37
37
  import { lintSkillLoopEngineeringReadiness, } from '../../services/standards/loop-engineering-readiness-lint.js';
38
38
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
39
- import { fail, ok } from '../../shared/result.js';
39
+ import { fail, ok } from 'peaks-loop-shared/result';
40
40
  export const LOOP_ENGINEERING_READINESS_CATEGORY = 'loop-engineering-readiness';
41
41
  /**
42
42
  * Resolve the SKILL.md file path from a `--path <skill-dir>` value.
@@ -1,5 +1,5 @@
1
1
  import { searchSkills, SkillSearchInputSchema } from '../../services/skill/skill-search-service.js';
2
- import { getErrorMessage } from '../../shared/result.js';
2
+ import { getErrorMessage } from 'peaks-loop-shared/result';
3
3
  /**
4
4
  * Validate the raw CLI flags, call the service, and emit a JSON
5
5
  * envelope on stdout. Errors flow through stderr + non-zero exit
@@ -28,6 +28,7 @@ export function registerSkillSearchCommand(program, io) {
28
28
  .option('-t, --tag <tag>', 'exact match on metadata.tags (e.g. "orchestrator", "loop-engineering")')
29
29
  .option('-d, --domain <domain>', 'exact match on metadata.domain (locked enum: code | content | doctor | research | triage | sop | audit | final-review | resume | status | test | ide | slice-decompose | issue-fix-orchestrator | perf-audit | security-audit | reviewer)')
30
30
  .option('-l, --limit <n>', 'max results returned (1..100, default 20)', (v) => Number.parseInt(v, 10))
31
+ .option('--include-internal', 'include skills with visibility: internal (default: hide them)')
31
32
  .action(async (options) => {
32
33
  // 1) Coerce + validate input via the service's Zod schema.
33
34
  // The schema's refine rejects empty input — that is the
@@ -41,6 +42,8 @@ export function registerSkillSearchCommand(program, io) {
41
42
  raw['domain'] = options.domain;
42
43
  if (options.limit !== undefined)
43
44
  raw['limit'] = options.limit;
45
+ if (options.includeInternal === true)
46
+ raw['includeInternal'] = true;
44
47
  const parsed = SkillSearchInputSchema.safeParse(raw);
45
48
  if (!parsed.success) {
46
49
  // Exit code 1 = invalid args. Emit a human-readable message
@@ -7,7 +7,7 @@ import { decomposeSlicesWithBenchmark } from '../../services/slice/slice-benchma
7
7
  import { pickSlicesInteractive } from '../../services/slice/slice-pick-service.js';
8
8
  import { decompose as multiPassDecompose } from '../../services/slice/multi-pass-orchestrator.js';
9
9
  import { readResult as readDecompositionResult, writeResult as writeSchemaResult } from '../../services/slice/schema-router.js';
10
- import { fail, ok } from '../../shared/result.js';
10
+ import { fail, ok } from 'peaks-loop-shared/result';
11
11
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
12
12
  export function registerSliceCommands(program, io) {
13
13
  const slice = program.command('slice').description('Slice lifecycle: check (boundary), decompose (PRD -> 6-stage algorithm), ' +
@@ -10,7 +10,7 @@ import { existsSync, readFileSync } from 'node:fs';
10
10
  import { join, resolve } from 'node:path';
11
11
  import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
12
12
  import { integrateSlices } from '../../services/slice/slice-integration.js';
13
- import { fail, ok } from '../../shared/result.js';
13
+ import { fail, ok } from 'peaks-loop-shared/result';
14
14
  import { addJsonOption, printResult } from '../cli-helpers.js';
15
15
  function loadContractsForSlices(projectRoot, sessionId, sliceIds) {
16
16
  const dir = resolve(projectRoot, '.peaks', '_runtime', sessionId, 'dispatch', 'contracts');
@@ -21,7 +21,7 @@
21
21
  import { findProjectRoot } from '../../services/config/config-safety.js';
22
22
  import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
23
23
  import { acceptReview, buildEmptySliceReview, DEFAULT_REVIEW_ITEMS, deriveDecision, readSliceReview, rejectReview, renderChecklist, scoreItem, writeSliceReview } from '../../services/slice/slice-review-state.js';
24
- import { fail, ok } from '../../shared/result.js';
24
+ import { fail, ok } from 'peaks-loop-shared/result';
25
25
  import { addJsonOption, printResult } from '../cli-helpers.js';
26
26
  export function registerSliceReviewCommands(program, io) {
27
27
  // G1 commands registered as TOP-LEVEL commands prefixed with `slice-review-`
@@ -18,7 +18,7 @@ import { readFileSync } from 'node:fs';
18
18
  import { resolve as resolvePath } from 'node:path';
19
19
  import { findProjectRoot } from '../../services/config/config-safety.js';
20
20
  import { addCriticalPath, CRITICAL_PATH_SOURCES, EMPTY_SMOKE_STATE, isCriticalPathSource, makeCriticalPathId, readSmokeState, recordRun, summarizeState, writeSmokeState } from '../../services/smoke/smoke-paths-state.js';
21
- import { fail, ok } from '../../shared/result.js';
21
+ import { fail, ok } from 'peaks-loop-shared/result';
22
22
  import { addJsonOption, printResult } from '../cli-helpers.js';
23
23
  const RUN_STATUSES = ['pending', 'pass', 'fail'];
24
24
  export function registerSmokeCommands(program, io) {
@@ -6,7 +6,7 @@ import { advanceSop, SopAdvanceError, SopGateBlockedError, SopPhaseSkipError } f
6
6
  import { sopStateDir } from '../../services/sop/sop-paths.js';
7
7
  import { getSkillPresence } from '../../services/skills/skill-presence-service.js';
8
8
  import { recordBypass, isBypassLimitReached, MAX_BYPASSES_PER_SESSION } from '../../services/mode/bypass-tracker.js';
9
- import { fail, ok } from '../../shared/result.js';
9
+ import { fail, ok } from 'peaks-loop-shared/result';
10
10
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
11
11
  export function registerSopCommands(program, io) {
12
12
  const sop = program.command('sop').description('Author and validate user-defined SOP skills');
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rid-032: opt-in spill/hydrate round-trip for 24h mode.
3
+ * This demo command is additive; existing deferral behavior is unchanged.
4
+ */
5
+ import type { Command } from 'commander';
6
+ import { type ProgramIO } from '../cli-helpers.js';
7
+ export declare function registerSpillDemoCommand(parent: Command, io: ProgramIO): void;
@@ -0,0 +1,29 @@
1
+ import { ok } from 'peaks-loop-shared/result';
2
+ import { hydrate, listSpills, spill, spillDir } from '../../services/context/spillover-store.js';
3
+ import { getSessionIdCanonical } from '../../services/session/session-manager.js';
4
+ import { addJsonOption, printResult } from '../cli-helpers.js';
5
+ export function registerSpillDemoCommand(parent, io) {
6
+ addJsonOption(parent
7
+ .command('spill-demo')
8
+ .description('Demonstrate the opt-in spill/hydrate round-trip for 24h mode.')
9
+ .option('--session-id <sessionId>', 'explicit session id (defaults to canonical binding)')
10
+ .option('--project <path>', 'project root', process.cwd())
11
+ .option('--batch-id <batchId>', 'optional in-flight batch id')).action((options) => {
12
+ const sessionId = options.sessionId ?? getSessionIdCanonical(options.project);
13
+ if (sessionId === null) {
14
+ throw new Error('No active session; provide --session-id or bind a canonical session');
15
+ }
16
+ const spilled = spill({
17
+ sessionId,
18
+ projectRoot: options.project,
19
+ ...(options.batchId === undefined ? {} : { batchId: options.batchId })
20
+ }, { llm: { turn: 1, context: ['sample'] } });
21
+ const allSpills = listSpills(options.project, sessionId);
22
+ const hydrated = hydrate(options.project, sessionId, spilled.spillId);
23
+ printResult(io, ok('session.spill-demo', {
24
+ spilled: spilled.spillId,
25
+ totalSpills: allSpills.length,
26
+ hydrated
27
+ }, [], [`Spill directory: ${spillDir(options.project, sessionId)}`]), options.json === true);
28
+ });
29
+ }
@@ -1,3 +1,15 @@
1
1
  import { Command } from 'commander';
2
2
  import { type ProgramIO } from '../cli-helpers.js';
3
+ type RenderOptions = {
4
+ project?: string;
5
+ json?: boolean;
6
+ };
7
+ /**
8
+ * Default-statusline render body. Reused by both the top-level default
9
+ * action (Bug-02 dispatch) and the explicit `render` subcommand. Exported
10
+ * so a unit test can exercise the JSON / text output paths without going
11
+ * through commander.
12
+ */
13
+ export declare function runDefaultStatuslineRender(options: RenderOptions, io: ProgramIO): Promise<void>;
3
14
  export declare function registerStatusLineCommands(program: Command, io: ProgramIO): void;
15
+ export {};
@@ -1,4 +1,4 @@
1
- import { fail, ok } from '../../shared/result.js';
1
+ import { fail, ok } from 'peaks-loop-shared/result';
2
2
  import { addJsonOption, printResult, getErrorMessage } from '../cli-helpers.js';
3
3
  import { findProjectRoot } from '../../services/config/config-safety.js';
4
4
  import { buildStatusLineModel, parseStatusLineStdin } from '../../services/skills/skill-statusline-service.js';
@@ -6,6 +6,8 @@ import { renderStatusLine } from '../../services/skills/skill-statusline-rendere
6
6
  import { applyStatusLineInstall, planStatusLineInstall, removeStatusLineInstall } from '../../services/skills/statusline-settings-service.js';
7
7
  import { readHookStatus as readSettingsStatus } from '../../services/skills/hooks-settings-service.js';
8
8
  import { detectIdeFromContext } from '../../services/ide/hook-translator.js';
9
+ import { decideCompactStatusline, renderCompactStatusline, } from '../../services/compact-statusline/compact-statusline-service.js';
10
+ import { getSessionIdCanonical } from '../../services/session/session-manager.js';
9
11
  const STDIN_READ_TIMEOUT_MS = 250;
10
12
  /** Read piped stdin if present; resolve quickly with '' when attached to a TTY. */
11
13
  function readStdin() {
@@ -54,6 +56,26 @@ function resolveIdeForCommand(options, projectRoot) {
54
56
  }
55
57
  return detectIdeFromContext({ env: process.env, cwd: projectRoot ?? process.cwd(), parsedStdin: null });
56
58
  }
59
+ /**
60
+ * Default-statusline render body. Reused by both the top-level default
61
+ * action (Bug-02 dispatch) and the explicit `render` subcommand. Exported
62
+ * so a unit test can exercise the JSON / text output paths without going
63
+ * through commander.
64
+ */
65
+ export async function runDefaultStatuslineRender(options, io) {
66
+ const raw = await readStdin();
67
+ const stdin = parseStatusLineStdin(raw);
68
+ const seeded = options.project
69
+ ? { ...(stdin ?? {}), workspace: { current_dir: options.project } }
70
+ : stdin;
71
+ const model = buildStatusLineModel(seeded, Date.now());
72
+ const text = renderStatusLine(model);
73
+ if (options.json === true) {
74
+ io.stdout(JSON.stringify({ ok: true, command: 'statusline.render', data: { text } }, null, 2));
75
+ return;
76
+ }
77
+ io.stdout(text);
78
+ }
57
79
  export function registerStatusLineCommands(program, io) {
58
80
  // Top-level `peaks statusline` — register as a group with subcommands
59
81
  // (install | uninstall | status). When the user runs `peaks statusline` with
@@ -65,27 +87,31 @@ export function registerStatusLineCommands(program, io) {
65
87
  // option-shadowing bug.
66
88
  const statusline = addJsonOption(program
67
89
  .command('statusline')
68
- .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.'));
69
- // Hidden render subcommand. This is the default behavior when the user types
70
- // `peaks statusline` with no subcommand. We mark it hidden so `peaks
71
- // statusline --help` does not show "render" as a subcommand.
90
+ .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.')
91
+ .option('--project <path>', 'project root path (used to label the status line when stdin is absent; applies to the default render path)'));
92
+ // Default behavior: when the user types `peaks statusline` with no
93
+ // subcommand, render the status line. Without this default action,
94
+ // commander falls back to printing usage (Bug-02, ice-cola surface check
95
+ // 2026-07-22). The hidden `render` subcommand is preserved so callers
96
+ // can still invoke it explicitly.
97
+ //
98
+ // Note (commander 12.x): when both a top-level `.action(...)` and
99
+ // subcommands exist, commander's option parser can conflate parent and
100
+ // child flags. We therefore parse `process.argv` for the bare `statusline`
101
+ // invocation here, and otherwise let the subcommand machinery handle the
102
+ // rest. The implementation is wrapped in `peekDefaultStatuslineRender` so
103
+ // it can be exercised in isolation by unit tests.
104
+ statusline.action(async (_parentOptions, command) => {
105
+ await runDefaultStatuslineRender(command.opts(), io);
106
+ });
107
+ // Hidden render subcommand. Preserved for callers that want to invoke
108
+ // render explicitly without going through the default-action dispatch.
72
109
  statusline
73
110
  .command('render', { hidden: true })
74
111
  .description('Render the Peaks skill status line for the current session (reads session JSON on stdin; honors --project for the project label).')
75
112
  .option('--project <path>', 'project root path (used to label the status line when stdin is absent)')
76
113
  .action(async (options) => {
77
- const raw = await readStdin();
78
- const stdin = parseStatusLineStdin(raw);
79
- const seeded = options.project
80
- ? { ...(stdin ?? {}), workspace: { current_dir: options.project } }
81
- : stdin;
82
- const model = buildStatusLineModel(seeded, Date.now());
83
- const text = renderStatusLine(model);
84
- if (options.json === true) {
85
- io.stdout(JSON.stringify({ ok: true, command: 'statusline.render', data: { text } }, null, 2));
86
- return;
87
- }
88
- io.stdout(text);
114
+ await runDefaultStatuslineRender(options, io);
89
115
  });
90
116
  addJsonOption(statusline
91
117
  .command('install')
@@ -166,4 +192,40 @@ export function registerStatusLineCommands(program, io) {
166
192
  process.exitCode = 1;
167
193
  }
168
194
  });
195
+ // peaks statusline compact (slice 2026-07-30-compact-visibility)
196
+ addJsonOption(statusline
197
+ .command('compact')
198
+ .description('Render the single-line auto-compact indicator the LLM embeds ' +
199
+ "in Claude Code's statusline. Default output is plain text; " +
200
+ 'pass --json for the structured envelope.')
201
+ .option('--project <path>', 'project root (auto-detected from cwd when omitted)')
202
+ .option('--session-id <sid>', 'override the active session id (defaults to the canonical binding)')
203
+ .action((options) => {
204
+ try {
205
+ const projectRoot = options.project !== undefined
206
+ ? options.project
207
+ : (findProjectRoot(process.cwd()) ?? process.cwd());
208
+ const sid = options.sessionId ?? getSessionIdCanonical(projectRoot) ?? null;
209
+ const state = decideCompactStatusline({
210
+ projectRoot,
211
+ sessionId: sid,
212
+ now: Date.now(),
213
+ });
214
+ const label = renderCompactStatusline(state);
215
+ // For non-JSON mode we print the LABEL DIRECTLY to stdout
216
+ // (no envelope wrapping) because the consumer is the IDE
217
+ // statusline, not a peaks-Loop caller.
218
+ if (options.json === true) {
219
+ printResult(io, ok('statusline.compact', { label, state }), options.json);
220
+ }
221
+ else {
222
+ process.stdout.write(`${label}\n`);
223
+ }
224
+ }
225
+ catch (error) {
226
+ const message = getErrorMessage(error);
227
+ printResult(io, fail('statusline.compact', 'STATUSLINE_COMPACT_FAILED', message, {}, [message]), options.json);
228
+ process.exitCode = 1;
229
+ }
230
+ }));
169
231
  }
@@ -1,6 +1,6 @@
1
1
  import { registerDispatchCommand } from './dispatch-commands.js';
2
2
  import { registerHeartbeatCommand } from './heartbeat-commands.js';
3
- import { registerShareCommand, registerSharedReadCommand, registerAwaitCommand } from './share-commands.js';
3
+ import { registerShareCommand, registerSharedReadCommand, registerAwaitCommand, registerFinalizeCommand } from './share-commands.js';
4
4
  // Re-export `validateRole` for backward compat — the integration test
5
5
  // suite and any external callers still import it from this entry file.
6
6
  // The canonical implementation now lives in `sub-agent-shared.ts`.
@@ -16,4 +16,5 @@ export function registerSubAgentCommands(program, io) {
16
16
  registerShareCommand(subAgent, io);
17
17
  registerSharedReadCommand(subAgent, io);
18
18
  registerAwaitCommand(subAgent, io);
19
+ registerFinalizeCommand(subAgent, io); // D21
19
20
  }