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,391 @@
1
+ /**
2
+ * Slice rid-024 — runtime probes: post-compact-detect / auto-compact /
3
+ * context-now / gate-step-08 / emit-handoff.
4
+ *
5
+ * Extracted from code-commands.ts (rid-024 split).
6
+ * Owns: 5 sub-commands that read or mutate runtime state.
7
+ * Owns the `readActiveSid` helper (only used by these runtime probes).
8
+ */
9
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
10
+ import { fail, ok } from 'peaks-loop-shared/result';
11
+ import { detectPostCompactResume, formatPostCompactResumeLogLine } from '../../services/code/post-compact-detector.js';
12
+ import { runAutoCompact } from '../../services/code/auto-compact-orchestrator.js';
13
+ import { evaluateStep08, STEP_08_BACKUP_REGEX } from '../../services/code/step-08-gate.js';
14
+ import { evaluateEmitHandoff, JOB_NOT_INITIALIZED, JOB_REMAINING_BLOCKED } from '../../services/code/emit-handoff.js';
15
+ import { readJobShapeDecision, JobShapeDecisionError } from '../../services/code/job-shape-decision.js';
16
+ import { getSkillPresence } from '../../services/skills/skill-presence-service.js';
17
+ export function registerCodeRuntimeCommands(code, io) {
18
+ addJsonOption(code
19
+ .command('post-compact-detect')
20
+ .description('v2.11.0 D7: detect whether the current invocation is a same-day post-compact resume. ' +
21
+ 'Auto-resumes (no AskUserQuestion) when the most-recent checkpoint is from today, has a mode field, ' +
22
+ 'and the active skill is peaks-code. Falls through to the normal Step 0.7 flow otherwise.')
23
+ .requiredOption('--project <path>', 'target project root')
24
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
25
+ .option('--active-skill <skill>', 'override active skill (test seam; default: read from presence)')).action(async (opts) => {
26
+ try {
27
+ const sessionId = opts.sessionId ?? readActiveSid(opts.project);
28
+ if (sessionId === null) {
29
+ printResult(io, fail('code.post-compact-detect', 'NO_ACTIVE_SESSION', 'no active session id; pass --session-id or set presence via `peaks skill presence:set peaks-code`', null, ['Re-run with --session-id <sid>']), opts.json);
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const probe = await detectPostCompactResume({
34
+ sessionId,
35
+ projectRoot: opts.project,
36
+ activeSkill: opts.activeSkill
37
+ });
38
+ const logLine = formatPostCompactResumeLogLine(probe);
39
+ printResult(io, ok('code.post-compact-detect', { ...probe, logLine }, [...probe.warnings], [
40
+ probe.shouldAutoResume
41
+ ? `Post-compact match → auto-resume mode=${probe.mode ?? '?'} checkpoint=${probe.checkpointPath ?? '?'}`
42
+ : `No auto-resume: ${probe.reason}`
43
+ ]), opts.json);
44
+ }
45
+ catch (err) {
46
+ printResult(io, fail('code.post-compact-detect', 'POST_COMPACT_DETECT_FAILED', getErrorMessage(err), null, ['Verify the project path and try again']), opts.json);
47
+ process.exitCode = 1;
48
+ }
49
+ });
50
+ addJsonOption(code
51
+ .command('auto-compact')
52
+ .description('v2.13.0 AC-4: zero-human-intervention auto-compact. Probes current ' +
53
+ 'context-fill % via the active IDE adapter; ≥ 0.85 writes a pre-compact ' +
54
+ 'checkpoint + convergence plan + auto-decisions log; ≥ 0.95 forces ' +
55
+ 'synchronous IDE-side compact. The LLM / runner keeps working with ' +
56
+ 'context < 95% without human intervention. pair with `peaks context ' +
57
+ 'now` (AC-1) which feeds the ratio into this command. rid-027 ' +
58
+ 'adds `--mode <mode>`: `standard` (0.85/0.95) or `partial` (0.70/0.85 ' +
59
+ 'for 24h long-run mode).')
60
+ .requiredOption('--project <path>', 'target project root')
61
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
62
+ .option('--in-flight-batch', 'defer if a sub-agent batch is in flight (D6.e)')
63
+ .option('--force', 'force compact at any ratio (test seam)')
64
+ .option('--bypass-red-line', 'skip the 95% red-line gate (test seam; never true in production)')
65
+ .option('--mode <mode>', 'auto-compact mode (standard | partial). Default: standard. 24h mode auto-selects partial.', 'standard')).action(async (opts) => {
66
+ try {
67
+ const { isValidMode } = await import('../../services/code/auto-compact-modes.js');
68
+ const modeName = opts.mode ?? 'standard';
69
+ if (!isValidMode(modeName)) {
70
+ printResult(io, fail('code.auto-compact', 'AUTO_COMPACT_INVALID_MODE', `Invalid --mode '${modeName}'. Valid values: standard | partial.`, null, ['Re-run with --mode standard or --mode partial.']), opts.json);
71
+ process.exitCode = 1;
72
+ return;
73
+ }
74
+ const result = await runAutoCompact({
75
+ projectRoot: opts.project,
76
+ sessionId: opts.sessionId ?? readActiveSid(opts.project) ?? undefined,
77
+ inFlightBatch: opts.inFlightBatch === true
78
+ ? { hasInFlightBatch: true }
79
+ : undefined,
80
+ force: opts.force === true,
81
+ bypassRedLine: opts.bypassRedLine === true,
82
+ mode: modeName
83
+ });
84
+ const code = result.code;
85
+ const exitOk = result.ok || code === 'AUTO_COMPACT_SKIP' || code === 'AUTO_COMPACT_WAIT';
86
+ // Adapt AutoCompactResult → ResultEnvelope so printResult's
87
+ // generic accepts it. The orchestrator envelope carries
88
+ // `data` on success-path and `nextActions` on the error
89
+ // path; surface both directly to the user.
90
+ const data = 'data' in result ? result.data : null;
91
+ const nextActions = 'nextActions' in result ? result.nextActions : [];
92
+ const envelope = result.ok
93
+ ? ok(`code.auto-compact`, data ?? {}, [], [result.message, ...nextActions])
94
+ : fail(`code.auto-compact`, code, result.message, data, [...nextActions]);
95
+ printResult(io, envelope, opts.json);
96
+ if (!exitOk)
97
+ process.exitCode = 1;
98
+ }
99
+ catch (err) {
100
+ printResult(io, fail('code.auto-compact', 'AUTO_COMPACT_FAILED', getErrorMessage(err), null, [
101
+ 'Verify the project path + session id and try again'
102
+ ]), opts.json);
103
+ process.exitCode = 1;
104
+ }
105
+ });
106
+ addJsonOption(code
107
+ .command('context-now')
108
+ .description('v2.13.0 AC-1: read the active IDE adapter\'s context-fill % ' +
109
+ 'without requiring the LLM to pass --prompt-size <bytes> manually. ' +
110
+ 'Adapter-driven (no hard-coded IDE names): Claude Code is the MVP ' +
111
+ 'implementation; trae / codex / cursor / qoder / tongyi-lingma / ' +
112
+ 'hermes / openclaw register their own env-var via IdeAdapter.compact. ' +
113
+ 'v3.1.2: when --enforce-job-mode is set OR job-shape.json says isJob=true, ' +
114
+ '≥0.85 emits action=auto-compact-now (MANDATORY, not advisory) and ' +
115
+ '≥0.95 emits action=red-line (forced hook fires next turn).')
116
+ .requiredOption('--project <path>', 'target project root')
117
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
118
+ .option('--enforce-job-mode', 'v3.1.2: treat ≥0.85 as MANDATORY auto-compact (not advisory). Auto-enabled when job-shape.json says isJob=true.')).action(async (opts) => {
119
+ try {
120
+ const { readContextPercent } = await import('../../services/context/auto-compact-reader.js');
121
+ // v3.1.2: detect Job mode from job-shape.json when --enforce-job-mode
122
+ // is not explicitly passed. The LLM is the source of truth for
123
+ // whether the request is Job-shaped; the recorded decision is.
124
+ let isJobMode = opts.enforceJobMode === true;
125
+ if (!isJobMode) {
126
+ try {
127
+ const sessionIdForDecision = opts.sessionId ?? readActiveSid(opts.project);
128
+ if (sessionIdForDecision !== null) {
129
+ const record = readJobShapeDecision(opts.project, sessionIdForDecision);
130
+ if (record.decision.isJob)
131
+ isJobMode = true;
132
+ }
133
+ }
134
+ catch (err) {
135
+ if (!(err instanceof JobShapeDecisionError))
136
+ throw err;
137
+ // missing/malformed decision file is fine — fall back to advisory.
138
+ }
139
+ }
140
+ const probe = readContextPercent({
141
+ projectRoot: opts.project,
142
+ sessionId: opts.sessionId ?? readActiveSid(opts.project) ?? 'unknown',
143
+ env: process.env
144
+ });
145
+ const ratioPct = (probe.ratio * 100).toFixed(1);
146
+ let action = 'ok';
147
+ let next = null;
148
+ if (probe.ratio >= 0.95) {
149
+ action = isJobMode ? 'red-line' : 'red-line';
150
+ next = 'peaks compact auto --execute';
151
+ }
152
+ else if (probe.ratio >= 0.85) {
153
+ if (isJobMode) {
154
+ action = 'auto-compact-now';
155
+ next = 'peaks compact auto --execute';
156
+ }
157
+ else {
158
+ action = 'soft-warn';
159
+ }
160
+ }
161
+ else if (probe.ratio >= 0.5) {
162
+ action = 'soft-warn';
163
+ }
164
+ const verdict = action === 'red-line' ? 'red-line'
165
+ : action === 'auto-compact-now' ? 'pre-compact'
166
+ : action === 'soft-warn' ? 'soft-warn'
167
+ : 'ok';
168
+ const jobModeNotice = isJobMode
169
+ ? 'Job mode enforced: ≥0.85 is MANDATORY auto-compact (v3.1.2).'
170
+ : 'Advisory mode (single-rid): ≥0.85 is recommended, not mandatory.';
171
+ printResult(io, ok('code.context-now', {
172
+ ratio: probe.ratio,
173
+ ratioPct: `${ratioPct}%`,
174
+ verdict,
175
+ action,
176
+ next,
177
+ jobMode: isJobMode,
178
+ source: probe.source,
179
+ ide: probe.ide,
180
+ capacityBytes: probe.capacityBytes,
181
+ rawBytes: probe.rawBytes ?? null,
182
+ capturedAt: probe.capturedAt
183
+ }, [], [
184
+ action === 'red-line'
185
+ ? `RED LINE: ≥ 95%. Next: \`${next}\` (PreToolUse hook fires next turn).`
186
+ : action === 'auto-compact-now'
187
+ ? `Job-mode MANDATORY auto-compact. Code MUST call \`${next}\` WITHOUT confirmation.`
188
+ : action === 'soft-warn'
189
+ ? isJobMode
190
+ ? `Job mode soft-warn (50–85%). Continue working; the next \`peaks compact auto\` will re-check.`
191
+ : `Soft warn (50–85%). Continue working; the next \`peaks compact auto\` will re-check.`
192
+ : `Below 50%. No action required.`,
193
+ jobModeNotice
194
+ ]), true);
195
+ }
196
+ catch (err) {
197
+ printResult(io, fail('code.context-now', 'CONTEXT_NOW_FAILED', getErrorMessage(err), null, [
198
+ 'Verify the project path and try again'
199
+ ]), opts.json);
200
+ process.exitCode = 1;
201
+ }
202
+ });
203
+ // v3.1.2 Step 0.8 — Mechanical PreToolUse gate.
204
+ // Wire-installed by `peaks workspace init` (extends the existing hook
205
+ // installer). Exit code is the load-bearing contract:
206
+ // exit 0 → allow (with structured stdout describing the decision)
207
+ // exit 2 → block (stderr contains the BLOCKED: ... reason)
208
+ addJsonOption(code
209
+ .command('gate-step-08')
210
+ .description('v3.1.2: PreToolUse gate for Step 0.8 — allow when job-shape.json exists; ' +
211
+ 'fail-closed backup regex when missing. Exit 0 = allow, exit 2 = block. ' +
212
+ 'When the decision says isJob=true AND progress.json exists, the stdout ' +
213
+ 'also carries `Next: slice #N+1 of M (<currentSlice>)` so the LLM cannot ' +
214
+ 'wake up cold.')
215
+ .requiredOption('--project <path>', 'target project root (the hook passes "." so resolveCanonicalProjectRoot promotes it to the git root)')
216
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
217
+ .option('--prompt <text>', 'explicit prompt text (default: read last-prompt.txt; stdin ignored)')).action((opts) => {
218
+ try {
219
+ const sessionId = opts.sessionId ?? readActiveSid(opts.project);
220
+ if (sessionId === null) {
221
+ // No session binding — treat as allow (single-rid mode). The
222
+ // LLM has not yet anchored; we have nothing to gate against.
223
+ const envelope = ok('code.gate-step-08', {
224
+ allow: true,
225
+ mode: 'no-session',
226
+ decision: null,
227
+ nextSlice: null
228
+ }, [], [
229
+ 'No active session id; gate passes through (single-rid mode).'
230
+ ]);
231
+ printResult(io, envelope, opts.json);
232
+ return;
233
+ }
234
+ const evalInput = {
235
+ projectRoot: opts.project,
236
+ sessionId
237
+ };
238
+ if (opts.prompt !== undefined)
239
+ evalInput.prompt = opts.prompt;
240
+ const result = evaluateStep08(evalInput);
241
+ const verdict = result.verdict;
242
+ if (verdict.kind === 'allow-job') {
243
+ const envelope = ok('code.gate-step-08', {
244
+ allow: true,
245
+ mode: 'job',
246
+ decision: verdict.decision,
247
+ progress: verdict.progress,
248
+ nextSlice: result.nextSliceLine
249
+ }, [], result.nextSliceLine !== null ? [result.nextSliceLine] : []);
250
+ printResult(io, envelope, opts.json);
251
+ return;
252
+ }
253
+ if (verdict.kind === 'allow-single') {
254
+ const envelope = ok('code.gate-step-08', {
255
+ allow: true,
256
+ mode: 'single',
257
+ decision: null,
258
+ nextSlice: null
259
+ }, [], [
260
+ 'job-shape.json says isJob=false; single-rid mode (gate allows).'
261
+ ]);
262
+ printResult(io, envelope, opts.json);
263
+ return;
264
+ }
265
+ // block-missing-decision
266
+ if (verdict.promptHit) {
267
+ // Block: backup regex hit. Exit code 2 is the load-bearing
268
+ // signal for the PreToolUse hook.
269
+ const blockMessage = 'BLOCKED: prompt looks Job-shaped but peaks code detect-job has not been called. Run `peaks code detect-job --is-job true ...` to record your Job-shape verdict, then retry.';
270
+ const envelope = fail('code.gate-step-08', 'STEP_08_BLOCKED', blockMessage, {
271
+ promptSource: verdict.promptSource,
272
+ backupRegex: STEP_08_BACKUP_REGEX.toString()
273
+ }, [
274
+ 'Run `peaks code detect-job --is-job true --rationale <text> --suggested-job-id <slug>` to record the Job-shape verdict.',
275
+ 'Then re-run the Bash tool call.'
276
+ ]);
277
+ io.stderr(`${blockMessage}\n`);
278
+ printResult(io, envelope, opts.json);
279
+ process.exitCode = 2;
280
+ return;
281
+ }
282
+ // No decision + no regex hit → allow.
283
+ const envelope = ok('code.gate-step-08', {
284
+ allow: true,
285
+ mode: 'undecided-no-regex-hit',
286
+ decision: null,
287
+ nextSlice: null,
288
+ promptSource: verdict.promptSource
289
+ }, [], [
290
+ 'No job-shape.json AND no backup-regex match on prompt → allow (most prompts are not Job-shaped).'
291
+ ]);
292
+ printResult(io, envelope, opts.json);
293
+ return;
294
+ }
295
+ catch (err) {
296
+ printResult(io, fail('code.gate-step-08', 'GATE_STEP_08_FAILED', getErrorMessage(err), null, [
297
+ 'Verify the project path and try again'
298
+ ]), opts.json);
299
+ process.exitCode = 1;
300
+ }
301
+ });
302
+ // v3.1.2 Step 11 / final handoff — Size-fear ban.
303
+ // Refuses to emit a final handoff while a Job has remaining slices.
304
+ addJsonOption(code
305
+ .command('emit-handoff')
306
+ .description('v3.1.2 Step 11 size-fear ban: under Job mode, refuse to emit a final ' +
307
+ 'handoff while remaining > 0. Exit 0 = allow, exit 1 = block. Pass ' +
308
+ '--force-under-job to override (requires explicit user approval).')
309
+ .requiredOption('--project <path>', 'target project root')
310
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
311
+ .option('--job-id <jid>', 'override job id (default: read from job-shape.json decision.suggestedJobId)')
312
+ .option('--force-under-job', 'override the remaining>0 block (explicit user approval required)')).action((opts) => {
313
+ try {
314
+ const sessionId = opts.sessionId ?? readActiveSid(opts.project);
315
+ if (sessionId === null) {
316
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'no-session' }, [], [
317
+ 'No active session id; gate passes through (single-rid mode).'
318
+ ]);
319
+ printResult(io, envelope, opts.json);
320
+ return;
321
+ }
322
+ const evalInput = {
323
+ projectRoot: opts.project,
324
+ sessionId
325
+ };
326
+ if (opts.jobId !== undefined)
327
+ evalInput.jobId = opts.jobId;
328
+ if (opts.forceUnderJob === true)
329
+ evalInput.forceUnderJob = true;
330
+ const verdict = evaluateEmitHandoff(evalInput);
331
+ if (verdict.kind === 'allow-not-job') {
332
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'single' }, [], [
333
+ 'job-shape.json says isJob=false (or absent); normal handoff allowed.'
334
+ ]);
335
+ printResult(io, envelope, opts.json);
336
+ return;
337
+ }
338
+ if (verdict.kind === 'allow-done') {
339
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'job-done', remaining: verdict.remaining }, [], [
340
+ `Job is complete (remaining=0); handoff allowed.`
341
+ ]);
342
+ printResult(io, envelope, opts.json);
343
+ return;
344
+ }
345
+ if (verdict.kind === 'allow-force-override') {
346
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'job-force-override', remaining: verdict.remaining }, [], [
347
+ `Job has ${verdict.remaining} remaining slices; --force-under-job override applied. Handoff allowed (explicit user approval).`
348
+ ]);
349
+ printResult(io, envelope, opts.json);
350
+ return;
351
+ }
352
+ if (verdict.kind === 'block-not-initialized') {
353
+ const envelope = fail('code.emit-handoff', JOB_NOT_INITIALIZED, `Job ${verdict.jobId} has no state.json; peaks job init was skipped.`, { jobId: verdict.jobId }, [`Run \`peaks job init --job-id ${verdict.jobId} --slice-list <...>\` before emitting handoff.`]);
354
+ printResult(io, envelope, opts.json);
355
+ process.exitCode = 1;
356
+ return;
357
+ }
358
+ // block-remaining
359
+ const blockMessage = `BLOCKED: Job ${verdict.jobId} has ${verdict.remaining} remaining slices. Run \`peaks job status\`. Use --force-under-job only with explicit user approval.`;
360
+ const envelope = fail('code.emit-handoff', JOB_REMAINING_BLOCKED, blockMessage, { jobId: verdict.jobId, remaining: verdict.remaining }, [
361
+ `Run \`peaks job status --job-id ${verdict.jobId}\` to see remaining slices.`,
362
+ 'Resume Step 0.81 (per-slice checkpoint loop) and continue until remaining === 0.',
363
+ 'Use --force-under-job only with explicit user approval (size-fear ban override).'
364
+ ]);
365
+ io.stderr(`${blockMessage}\n`);
366
+ printResult(io, envelope, opts.json);
367
+ process.exitCode = 1;
368
+ return;
369
+ }
370
+ catch (err) {
371
+ printResult(io, fail('code.emit-handoff', 'EMIT_HANDOFF_FAILED', getErrorMessage(err), null, [
372
+ 'Verify the project path and try again'
373
+ ]), opts.json);
374
+ process.exitCode = 1;
375
+ }
376
+ });
377
+ }
378
+ // Local helper (was `readActiveSid` in code-commands.ts before rid-024 split).
379
+ // Only the 5 runtime probes above use it; keeping it local avoids the
380
+ // cross-file helper import.
381
+ function readActiveSid(projectRoot) {
382
+ try {
383
+ const presence = getSkillPresence(projectRoot);
384
+ if (presence === null || presence === undefined)
385
+ return null;
386
+ return presence.sessionId ?? null;
387
+ }
388
+ catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
389
+ return null;
390
+ }
391
+ }
@@ -1,6 +1,6 @@
1
1
  import { InvalidArgumentError } from 'commander';
2
2
  import { createCodegraphInvocation, executeCodegraphInvocation } from '../../services/codegraph/codegraph-service.js';
3
- import { fail } from '../../shared/result.js';
3
+ import { fail } from 'peaks-loop-shared/result';
4
4
  import { getErrorMessage, printResult, redactSensitiveErrorMessage } from '../cli-helpers.js';
5
5
  function addPeaksJsonOption(command) {
6
6
  return command.option('--peaks-json', 'print Peaks error envelope as machine-readable JSON');
@@ -1,9 +1,10 @@
1
1
  import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
2
2
  import { findProjectRoot } from '../../services/config/config-safety.js';
3
- import { fail, ok, getErrorMessage } from '../../shared/result.js';
3
+ import { fail, ok, getErrorMessage } from 'peaks-loop-shared/result';
4
4
  import { addJsonOption, printResult } from '../cli-helpers.js';
5
5
  import { writeCheckpoint } from '../../services/session/session-checkpoint-service.js';
6
6
  import { getSessionIdCanonical } from '../../services/session/session-manager.js';
7
+ import { readCompactHistory, summarizeCompactHistory, } from '../../services/compact-history/compact-history-service.js';
7
8
  import { buildRecommendEnvelopePure, dryRunCompact, suggestCompact } from '../../services/compact/suggest-service.js';
8
9
  import { PHASES, SURVIVAL_TABLE, isPhase, lookupPhaseTransition } from '../../services/compact/decision-tables.js';
9
10
  function splitList(value) {
@@ -249,4 +250,55 @@ export function registerCompactCommands(program, io) {
249
250
  process.exitCode = 1;
250
251
  }
251
252
  });
253
+ // 6. peaks compact history [--json] (slice 2026-07-30-compact-visibility)
254
+ addJsonOption(compact
255
+ .command('history')
256
+ .description('Read the per-session compact-history.jsonl and emit a structured ' +
257
+ 'summary of every auto-compact dispatch in the current session.')
258
+ .option('--project <path>', 'project root (defaults to git root or cwd)')
259
+ .option('--session-id <sid>', 'override the active session id (defaults to the canonical binding)')
260
+ .action((options) => {
261
+ try {
262
+ const project = options.project !== undefined
263
+ ? resolveCanonicalProjectRoot(options.project)
264
+ : (findProjectRoot(process.cwd()) ?? process.cwd());
265
+ const session = resolveSessionId(project, options.sessionId);
266
+ if (session.error !== null) {
267
+ printResult(io, fail('compact.history', session.error.code, session.error.message, { projectRoot: project }, session.error.nextActions), options.json);
268
+ process.exitCode = 1;
269
+ return;
270
+ }
271
+ const result = readCompactHistory({ projectRoot: project, sessionId: session.sid });
272
+ if (result.kind === 'file-missing') {
273
+ printResult(io, ok('compact.history', {
274
+ sessionId: session.sid,
275
+ totalCompacts: 0,
276
+ message: 'No compact-history.jsonl yet; auto-compact has not fired in this session.',
277
+ historyPath: result.path,
278
+ }), options.json);
279
+ return;
280
+ }
281
+ if (result.kind === 'empty') {
282
+ printResult(io, ok('compact.history', {
283
+ sessionId: session.sid,
284
+ totalCompacts: 0,
285
+ message: 'compact-history.jsonl exists but is empty.',
286
+ historyPath: result.path,
287
+ }), options.json);
288
+ return;
289
+ }
290
+ const summary = summarizeCompactHistory(result.events);
291
+ printResult(io, ok('compact.history', {
292
+ sessionId: session.sid,
293
+ ...summary,
294
+ events: result.events,
295
+ parseErrors: result.parseErrors,
296
+ historyPath: result.path,
297
+ }), options.json);
298
+ }
299
+ catch (error) {
300
+ printResult(io, fail('compact.history', 'COMPACT_HISTORY_READ_FAILED', getErrorMessage(error), {}, ['Verify the project path is readable and a session is bound']), options.json);
301
+ process.exitCode = 1;
302
+ }
303
+ }));
252
304
  }
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { findProjectRoot } from '../../services/config/config-safety.js';
8
8
  import { estimateComplexity } from '../../services/complexity/complexity-estimator.js';
9
- import { fail, ok } from '../../shared/result.js';
9
+ import { fail, ok } from 'peaks-loop-shared/result';
10
10
  import { addJsonOption, printResult } from '../cli-helpers.js';
11
11
  export function registerComplexityCommands(program, io) {
12
12
  addJsonOption(program
@@ -1,15 +1,13 @@
1
1
  import { executeMigration, planMigration } from '../../services/config/config-migration.js';
2
- import { getConfig, getMiniMaxProviderConfig, getMiniMaxProviderStatus, isSensitiveConfigPath, redactConfigSecrets, setConfig, setMiniMaxProviderConfig } from '../../services/config/config-service.js';
2
+ import { getConfig, isSensitiveConfigPath, redactConfigSecrets, setConfig } from '../../services/config/config-service.js';
3
3
  import { listAvailableFields, restoreField } from '../../services/config/config-restore.js';
4
4
  import { executeRollback, planRollback } from '../../services/config/config-rollback.js';
5
- import { testMiniMaxProvider } from '../../services/providers/minimax-provider-service.js';
6
- import { fail, ok } from '../../shared/result.js';
7
- import { addJsonOption, getErrorMessage, isMiniMaxHttpsUrl, parseConfigLayer, printInvalidConfigLayer, printResult, redactSensitiveErrorMessage, summarizeMiniMaxSmokeResult } from '../cli-helpers.js';
5
+ import { fail, ok } from 'peaks-loop-shared/result';
6
+ import { addJsonOption, getErrorMessage, parseConfigLayer, printInvalidConfigLayer, printResult } from '../cli-helpers.js';
8
7
  export function registerConfigCommands(program, io) {
9
8
  const config = program.command('config').description('Manage Peaks configuration');
10
9
  registerConfigGetSetCommands(config, io);
11
10
  registerConfigMigrationCommands(config, io);
12
- registerMiniMaxProviderCommands(config, io);
13
11
  }
14
12
  function registerConfigGetSetCommands(config, io) {
15
13
  addJsonOption(config.command('get').description('Get current config or a specific key').option('--key <path>', 'dot-notation key path').option('--layer <layer>', 'user or project')).action((options) => {
@@ -137,7 +135,7 @@ function registerConfigMigrationCommands(config, io) {
137
135
  function printConfigSetError(io, error, asJson) {
138
136
  const message = getErrorMessage(error);
139
137
  if (message === 'Sensitive config keys must be stored in the user config layer') {
140
- printResult(io, fail('config.set', 'SECRET_CONFIG_REQUIRES_USER_LAYER', message, {}, ['Use --layer user or peaks config provider minimax set']), asJson);
138
+ printResult(io, fail('config.set', 'SECRET_CONFIG_REQUIRES_USER_LAYER', message, {}, ['Use --layer user for sensitive config keys']), asJson);
141
139
  process.exitCode = 1;
142
140
  return;
143
141
  }
@@ -146,75 +144,6 @@ function printConfigSetError(io, error, asJson) {
146
144
  process.exitCode = 1;
147
145
  return;
148
146
  }
149
- if (message === 'MiniMax base URL must be the MiniMax HTTPS endpoint without embedded credentials') {
150
- printResult(io, fail('config.set', 'INVALID_MINIMAX_BASE_URL', message, {}, ['Use a MiniMax Anthropic-compatible HTTPS endpoint']), asJson);
151
- process.exitCode = 1;
152
- return;
153
- }
154
147
  printResult(io, fail('config.set', 'CONFIG_SET_FAILED', message, {}, ['Check the config key and layer, then retry']), asJson);
155
148
  process.exitCode = 1;
156
149
  }
157
- function registerMiniMaxProviderCommands(config, io) {
158
- const minimaxProvider = config.command('provider').description('Manage model provider settings').command('minimax').description('Manage MiniMax provider settings');
159
- addJsonOption(minimaxProvider.command('set').description('Set MiniMax provider settings in user config').option('--base-url <url>', 'MiniMax Anthropic-compatible base URL')).action((options) => {
160
- const baseUrl = options.baseUrl?.trim();
161
- const apiKey = process.env.MINIMAX_API_KEY?.trim();
162
- if (!baseUrl && !apiKey) {
163
- printResult(io, fail('config.provider.minimax.set', 'MINIMAX_PROVIDER_NO_VALUES', 'Provide --base-url and set MINIMAX_API_KEY', {}, ['Export MINIMAX_API_KEY and rerun peaks config provider minimax set --base-url <url>']), options.json);
164
- process.exitCode = 1;
165
- return;
166
- }
167
- if (baseUrl && !isMiniMaxHttpsUrl(baseUrl)) {
168
- printResult(io, fail('config.provider.minimax.set', 'INVALID_MINIMAX_BASE_URL', 'MiniMax base URL must be the MiniMax HTTPS endpoint without embedded credentials', {}, ['Use a MiniMax Anthropic-compatible HTTPS endpoint']), options.json);
169
- process.exitCode = 1;
170
- return;
171
- }
172
- try {
173
- const input = {};
174
- if (baseUrl)
175
- input.baseUrl = baseUrl;
176
- if (apiKey)
177
- input.apiKey = apiKey;
178
- const status = setMiniMaxProviderConfig(input);
179
- printResult(io, ok('config.provider.minimax.set', status), options.json);
180
- }
181
- catch (error) {
182
- printMiniMaxProviderSetError(io, error, options.json);
183
- }
184
- });
185
- addJsonOption(minimaxProvider.command('get').description('Show redacted MiniMax provider settings')).action((options) => {
186
- const configValue = getMiniMaxProviderConfig();
187
- const status = getMiniMaxProviderStatus();
188
- printResult(io, ok('config.provider.minimax.get', { ...redactConfigSecrets(configValue, 'providers.minimax'), ...status }), options.json);
189
- });
190
- addJsonOption(minimaxProvider.command('status').description('Show MiniMax provider configuration status')).action((options) => {
191
- printResult(io, ok('config.provider.minimax.status', getMiniMaxProviderStatus()), options.json);
192
- });
193
- addJsonOption(minimaxProvider.command('test').description('Run a redacted MiniMax provider smoke test').option('--model <model>', 'model name for the smoke test', 'MiniMax-M2.7')).action(async (options) => {
194
- try {
195
- const result = await testMiniMaxProvider(getMiniMaxProviderConfig(), { model: options.model });
196
- const safeResult = summarizeMiniMaxSmokeResult(result);
197
- if (!result.configured) {
198
- printResult(io, fail('config.provider.minimax.test', 'MINIMAX_PROVIDER_NOT_CONFIGURED', 'MiniMax provider requires baseUrl and apiKey in user config', safeResult, ['Export MINIMAX_API_KEY or set MINIMAX_API_KEY']), options.json);
199
- process.exitCode = 1;
200
- return;
201
- }
202
- printResult(io, result.ok ? ok('config.provider.minimax.test', safeResult) : fail('config.provider.minimax.test', 'MINIMAX_PROVIDER_TEST_FAILED', 'MiniMax provider smoke test failed', safeResult, ['Check the MiniMax base URL, API key, and model name']), options.json);
203
- if (!result.ok)
204
- process.exitCode = 1;
205
- }
206
- catch (error) {
207
- printResult(io, fail('config.provider.minimax.test', 'MINIMAX_PROVIDER_TEST_FAILED', redactSensitiveErrorMessage(getErrorMessage(error)), {}, ['Check network connectivity and MiniMax provider settings']), options.json);
208
- process.exitCode = 1;
209
- }
210
- });
211
- }
212
- function printMiniMaxProviderSetError(io, error, asJson) {
213
- if (getErrorMessage(error) === 'MiniMax base URL must be the MiniMax HTTPS endpoint without embedded credentials') {
214
- printResult(io, fail('config.provider.minimax.set', 'INVALID_MINIMAX_BASE_URL', 'MiniMax base URL must be the MiniMax HTTPS endpoint without embedded credentials', {}, ['Use a MiniMax Anthropic-compatible HTTPS endpoint']), asJson);
215
- process.exitCode = 1;
216
- return;
217
- }
218
- printResult(io, fail('config.provider.minimax.set', 'MINIMAX_PROVIDER_SET_FAILED', getErrorMessage(error), {}, ['Check MiniMax provider settings and retry']), asJson);
219
- process.exitCode = 1;
220
- }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `peaks container spawn | release` — slice 2026-07-29-worktree-l2-extended Part 12.
3
+ *
4
+ * L4 container isolation bridge: Part 8 landed the CLI contract
5
+ * (`peaks sub-agent dispatch --isolation container` is accepted
6
+ * and fail-fasts with ISOLATION_CONTAINER_NOT_YET_IMPLEMENTED).
7
+ * Part 12 implements the spawn/release CLI surface so the
8
+ * dispatch command can shell out to it.
9
+ *
10
+ * This file is the `peaks container` parent command. Sub-commands:
11
+ * - spawn : `docker run <image> ...` + write container lease
12
+ * - release : `docker rm --force <id>` + transition lease to released
13
+ *
14
+ * Runtime requirement: `docker` CLI on PATH. The spawn checks
15
+ * `docker --version` first and returns CONTAINER_RUNTIME_UNAVAILABLE
16
+ * with a remediation hint when the daemon is not running. Windows
17
+ * is supported if Docker Desktop / WSL2 is installed; native podman
18
+ * is a follow-up (the container-lease module is runtime-agnostic).
19
+ *
20
+ * Lease is the source of truth: the dispatch record (v3) carries
21
+ * the leaseId; the PreToolUse gate (Part 2.B pattern) will read
22
+ * PEAKS_CONTAINER_LEASE_ID and consult the lease file before
23
+ * allowing docker-related tool calls. The gate bridge is a
24
+ * follow-up rid.
25
+ */
26
+ import type { Command } from 'commander';
27
+ import { type ProgramIO } from '../cli-helpers.js';
28
+ export declare function registerContainerCommand(program: Command, io: ProgramIO): void;