peaks-loop 4.0.0-beta.9 → 4.0.3

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 +572 -234
  2. package/README-en.md +67 -30
  3. package/README.md +67 -30
  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 +91 -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
@@ -16,7 +16,8 @@
16
16
  */
17
17
  import { existsSync } from 'node:fs';
18
18
  import { randomUUID } from 'node:crypto';
19
- import { fail, getErrorMessage, ok } from '../../shared/result.js';
19
+ import { spawn as childProcessSpawn } from 'node:child_process';
20
+ import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
20
21
  import { addJsonOption, printResult } from '../cli-helpers.js';
21
22
  import { detectInstalledIde } from '../../services/ide/ide-detector.js';
22
23
  import { getAdapter } from '../../services/ide/ide-registry.js';
@@ -27,7 +28,7 @@ import { writeInitialDispatchRecord } from '../../services/dispatch/dispatch-rec
27
28
  import { evaluatePromptSize } from '../../services/context/context-guard.js';
28
29
  import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
29
30
  import { buildArtifactMeta, buildContextImpact } from '../../services/context/artifact-meta.js';
30
- import { assertSafeArtifactPath } from '../../services/context/dispatch-context-guard.js';
31
+ import { assertSafeArtifactPath } from 'peaks-loop-shared-channel';
31
32
  import { compressPrompt } from '../../services/context/headroom-client.js';
32
33
  import { resolveHeadroomOptions } from '../../services/context/headroom-prefs.js';
33
34
  import { loadPreferences } from '../../services/preferences/preferences-service.js';
@@ -36,6 +37,8 @@ import { writeLogEntry } from '../../services/log/logger.js';
36
37
  import { HEADROOM_MODES, PROMPT_LIMIT_BYTES, RECOMMENDED_ROLES, validateRole } from './sub-agent-shared.js';
37
38
  import { runDispatchFromDag } from './dispatch-from-dag.js';
38
39
  import { TEST_TOOL_DETECTION_BLOCK, formatTestToolDetection } from '../../services/dispatch/test-tool-detection.js';
40
+ import { MemoryPreflightService } from '../../services/context/memory-preflight-service.js';
41
+ import { buildDispatchSystemPrompt } from '../../services/context/build-dispatch-system-prompt.js';
39
42
  export function registerDispatchCommand(parent, io) {
40
43
  addJsonOption(parent
41
44
  .command('dispatch')
@@ -61,7 +64,8 @@ export function registerDispatchCommand(parent, io) {
61
64
  .option('--use-headroom', 'G7.7/G9: compress the prompt via headroom-ai before dispatch (opt-in; falls back to G7 metadata-only if headroom unavailable)')
62
65
  .option('--headroom-mode <mode>', `G7.7: headroom mode (${HEADROOM_MODES.join(' | ')}); default balanced`)
63
66
  .option('--force', 'G9: override the 80% hard reject threshold at CLI (NOT allowed at hook layer per RL-30 strict)')
64
- .option('--from-dag <file>', '2.7.0 slice-dag-dispatcher MVP: read a SliceDag JSON file, dispatch one sub-agent per node in topological order; --batch-id overrides the auto-generated batch id (mutually exclusive with <role>)')).action(async (role, options) => {
67
+ .option('--from-dag <file>', '2.7.0 slice-dag-dispatcher MVP: read a SliceDag JSON file, dispatch one sub-agent per node in topological order; --batch-id overrides the auto-generated batch id (mutually exclusive with <role>)')
68
+ .option('--isolation <mode>', 'slice 2026-07-29-worktree-l2-extended Part 2.C: isolation mode for the sub-agent. Accepts "worktree" (Part 2.C + Part 12 L2 surface), "container" (Part 8 contract + Part 12 L4 docker runtime), or "vm" (Part 25 contract; the VM runtime is a follow-up rid and fail-fasts with ISOLATION_VM_NOT_YET_IMPLEMENTED). Auto-spawns a lease + injects PEAKS_<MODE>_LEASE_ID into the dispatch envelope so the sub-agent can write to the isolated surface without a separate auth grant.')).action(async (role, options) => {
65
69
  const asJson = options.json === true;
66
70
  // 2.7.0 slice-dag-dispatcher MVP: --from-dag short-circuits the single
67
71
  // sub-agent path and runs the full DAG plan via `dag-orchestrator`.
@@ -78,6 +82,20 @@ export function registerDispatchCommand(parent, io) {
78
82
  process.exitCode = 1;
79
83
  return;
80
84
  }
85
+ // Slice 3 (on-demand-ecc) D-012: the `agent` role was removed in
86
+ // 4.0.0-beta.11 — there is no longer a subprocess path for it
87
+ // (the upstream ECC v2.0.0 ships no `ecc` binary). This guard
88
+ // sits AFTER role validation but BEFORE the missing-prompt
89
+ // check so an action-path dispatch with a valid prompt still
90
+ // returns a clear ROLE_REMOVED envelope + exit 1. Note that
91
+ // Commander short-circuits `--help` BEFORE `.action()` fires,
92
+ // so `peaks sub-agent dispatch agent --help` continues to
93
+ // exit 0 with the help text — that is intentional, not a bug.
94
+ if (role === 'agent') {
95
+ printResult(io, fail('sub-agent.dispatch', 'ROLE_REMOVED', 'The agent role was removed in Slice 3', { role, reason: 'role-removed-in-slice-3', toolCall: null, dispatchRecordPath: null }, []), asJson);
96
+ process.exitCode = 1;
97
+ return;
98
+ }
81
99
  if (!options.prompt || options.prompt.length === 0) {
82
100
  printResult(io, fail('sub-agent.dispatch', 'MISSING_PROMPT', '--prompt is required when --from-dag is not provided', { role, toolCall: null, dispatchRecordPath: null }, [
83
101
  'Re-run with either:',
@@ -134,13 +152,136 @@ export function registerDispatchCommand(parent, io) {
134
152
  ?? 'unknown-sid';
135
153
  const rid = options.requestId ?? 'unknown-rid';
136
154
  const batchId = options.batchId ?? randomUUID();
155
+ // Slice 2026-07-29-worktree-l2-extended Part 2.C: --isolation worktree
156
+ // auto-spawns a worktree lease and injects PEAKS_WORKTREE_LEASE_ID
157
+ // into the sub-agent dispatch envelope. This is the bridge that
158
+ // makes the lease-aware gate (Part 2.B) work for sub-agents:
159
+ // without this injection, the gate has no leaseId to consult and
160
+ // the sub-agent would need a separate `peaks worktree auth grant`.
161
+ let isolationMode = null;
162
+ let leaseId = null;
163
+ let worktreePath = null;
164
+ let worktreeBranch = null;
165
+ if (typeof options.isolation === 'string' && options.isolation.length > 0) {
166
+ if (options.isolation !== 'worktree' && options.isolation !== 'container' && options.isolation !== 'vm') {
167
+ printResult(io, fail('sub-agent.dispatch', 'INVALID_ISOLATION', `--isolation only accepts "worktree" | "container" | "vm" (got "${options.isolation}")`, {
168
+ role,
169
+ toolCall: null,
170
+ dispatchRecordPath: null
171
+ }, ['Drop --isolation or pass --isolation worktree / --isolation container / --isolation vm.']), asJson);
172
+ process.exitCode = 1;
173
+ return;
174
+ }
175
+ if (options.isolation === 'container') {
176
+ // Slice 2026-07-29-worktree-l2-extended Part 12: container
177
+ // isolation is now live (Part 8 contract was the
178
+ // bridge; Part 12 is the runtime). Shell out to
179
+ // `peaks container spawn` to run `docker run` and
180
+ // write the container lease.
181
+ isolationMode = 'container';
182
+ try {
183
+ const spawnResult = await spawnContainerLease({
184
+ projectRoot,
185
+ sessionId: sid,
186
+ rid,
187
+ role,
188
+ purpose: `auto-spawned by dispatch --isolation container (batch=${batchId})`
189
+ });
190
+ // Reuse the leaseId variable — same field semantically
191
+ // (id of the isolation surface the dispatch owns).
192
+ leaseId = spawnResult.leaseId;
193
+ }
194
+ catch (error) {
195
+ printResult(io, fail('sub-agent.dispatch', 'ISOLATION_CONTAINER_SPAWN_FAILED', getErrorMessage(error), {
196
+ role,
197
+ toolCall: null,
198
+ dispatchRecordPath: null
199
+ }, [
200
+ 'The dispatch aborts when --isolation container lease spawn fails; retry without --isolation or fix the underlying docker error.',
201
+ 'For environments without a docker daemon, use --isolation worktree (the L2 production path).'
202
+ ]), asJson);
203
+ process.exitCode = 1;
204
+ return;
205
+ }
206
+ }
207
+ if (options.isolation === 'worktree') {
208
+ isolationMode = 'worktree';
209
+ try {
210
+ const spawnResult = await spawnWorktreeLease({
211
+ projectRoot,
212
+ sessionId: sid,
213
+ rid,
214
+ role,
215
+ purpose: `auto-spawned by dispatch --isolation worktree (batch=${batchId})`
216
+ });
217
+ leaseId = spawnResult.leaseId;
218
+ worktreePath = spawnResult.path;
219
+ worktreeBranch = spawnResult.branch;
220
+ }
221
+ catch (error) {
222
+ printResult(io, fail('sub-agent.dispatch', 'ISOLATION_SPAWN_FAILED', getErrorMessage(error), {
223
+ role,
224
+ toolCall: null,
225
+ dispatchRecordPath: null
226
+ }, [
227
+ 'The dispatch aborts when --isolation worktree lease spawn fails; retry without --isolation or fix the underlying git error.'
228
+ ]), asJson);
229
+ process.exitCode = 1;
230
+ return;
231
+ }
232
+ }
233
+ else if (options.isolation === 'vm') {
234
+ // Slice 2026-07-29-worktree-l2-extended Part 25: the
235
+ // VM isolation mode is the L4 follow-up to L4 container.
236
+ // The CLI contract is shipped (--isolation vm is accepted
237
+ // by the dispatch parser and reflected in the envelope's
238
+ // isolationMode type). The VM runtime (Linux KVM / macOS
239
+ // HyperKit / Windows Hyper-V) is a much larger follow-up
240
+ // and is intentionally not implemented yet — we
241
+ // fail-fast with ISOLATION_VM_NOT_YET_IMPLEMENTED so
242
+ // operators see a clear "this is a placeholder" signal
243
+ // rather than a silent fallback to worktree.
244
+ //
245
+ // The full implementation lives in a future rid; the
246
+ // design is:
247
+ // 1. New service: src/services/vm/vm-lease.ts (parallels
248
+ // worktree-lease.ts / container-lease.ts) — pure lease
249
+ // store with vmId + hypervisor + status.
250
+ // 2. CLI: 'peaks vm spawn --hypervisor kvm|hyperkit|hyperv
251
+ // --image <name> --rid <rid> --role <role>' — runs
252
+ // virsh create / hvftool / hvcreate, captures the
253
+ // vm id, writes the lease.
254
+ // 3. CLI: 'peaks vm release --lease-id <id>' — virsh
255
+ // destroy + cleanup.
256
+ // 4. dispatch --isolation vm: shells out to peaks vm
257
+ // spawn, injects PEAKS_VM_LEASE_ID env (parallel
258
+ // to PEAKS_CONTAINER_LEASE_ID).
259
+ // 5. PreToolUse gate: when the env var is set AND the
260
+ // tool call is bash-with-vm-bearing-command,
261
+ // allow via the vm lease.
262
+ //
263
+ // Until then: fail-fast.
264
+ printResult(io, fail('sub-agent.dispatch', 'ISOLATION_VM_NOT_YET_IMPLEMENTED', '--isolation vm is the L4 follow-up to --isolation container (Part 25 contract); the VM runtime (KVM / HyperKit / Hyper-V) is a much larger follow-up rid and is intentionally not implemented yet. Drop --isolation or pass --isolation worktree / --isolation container for now.', {
265
+ role,
266
+ toolCall: null,
267
+ dispatchRecordPath: null
268
+ }, [
269
+ 'The VM contract is shipped (--isolation vm is accepted by the dispatch parser); the runtime is the next rid.',
270
+ 'Use --isolation worktree (L2 production) or --isolation container (L4 docker, Part 12) for now.'
271
+ ]), asJson);
272
+ process.exitCode = 1;
273
+ return;
274
+ }
275
+ }
137
276
  // G7.7 / G9: resolve headroom options from preferences + CLI overrides.
138
277
  // Preferences hard-block when headroom.enabled=false (returns HEADROOM_DISABLED_BY_PREFERENCE).
139
278
  // loadPreferences can throw on schema mismatch; we fall back to defaults to avoid
140
279
  // breaking the dispatch on a stale preferences.json file.
280
+ let projectPrefs = DEFAULT_PREFERENCES;
141
281
  let headroomPrefs = DEFAULT_PREFERENCES.headroom;
142
282
  try {
143
- headroomPrefs = loadPreferences(projectRoot).headroom;
283
+ projectPrefs = loadPreferences(projectRoot);
284
+ headroomPrefs = projectPrefs.headroom;
144
285
  }
145
286
  catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
146
287
  // Keep default preferences; the user can re-run with explicit --headroom-mode
@@ -173,7 +314,56 @@ export function registerDispatchCommand(parent, io) {
173
314
  }
174
315
  // G7.7 headroom compress (opt-in). If headroom fails or is unavailable,
175
316
  // fall back to the original prompt + emit warning.
176
- let effectivePrompt = `${formatTestToolDetection()}\n\n${options.prompt}`;
317
+ // Slice 2026-07-22-orchestrator-memory-preflight (Task 5): prepend the
318
+ // memory preflight block (or silently skip when unavailable) via the
319
+ // pure-function builder, BEFORE the headroom-ai compress step so the
320
+ // compressor sees the augmented payload.
321
+ const preflightService = new MemoryPreflightService(projectRoot, projectPrefs);
322
+ const memoryBlock = await preflightService.fetchBlock(role);
323
+ // Slice 2026-07-29-context-evaluation-accuracy: capture the
324
+ // authoritative context-fill probe before composing the
325
+ // dispatch prompt. The probe is token-counted (IDE adapter's
326
+ // `compact` env-var), not a byte estimate. The composer
327
+ // prepends a `## Context window` block so the dispatched
328
+ // sub-agent reads the actual ratio instead of guessing
329
+ // from message length (char/4 estimates diverge by 2-4x
330
+ // and have caused false "context too low" reports at 60%+
331
+ // free).
332
+ let contextProbe = null;
333
+ try {
334
+ const { readContextPercent } = await import('../../services/context/auto-compact-reader.js');
335
+ contextProbe = readContextPercent({
336
+ projectRoot,
337
+ sessionId: sid,
338
+ env: process.env
339
+ });
340
+ }
341
+ catch {
342
+ // Probe is best-effort; the composer renders a
343
+ // "no probe available" hint instead of failing the
344
+ // dispatch.
345
+ }
346
+ const memoryAugmentedBody = buildDispatchSystemPrompt({
347
+ taskTitle: role,
348
+ taskBody: options.prompt,
349
+ memoryBlock,
350
+ contextProbe
351
+ });
352
+ // Part 2.C: when --isolation worktree, prepend an isolation envelope
353
+ // block so the sub-agent sees the lease id + worktree path BEFORE
354
+ // headroom-ai compress. The block is short (a few lines) and the
355
+ // compressor is expected to keep it. We deliberately do NOT set
356
+ // process.env.PEAKS_WORKTREE_LEASE_ID here — sub-agents are spawned
357
+ // by the LLM in its own environment, not as children of this CLI;
358
+ // the lease id travels through the dispatch record + prompt body.
359
+ const isolationBlock = isolationMode !== null && leaseId !== null
360
+ ? `\n## Worktree isolation (Part 2.C)\n` +
361
+ `leaseId: ${leaseId}\n` +
362
+ `worktreePath: ${worktreePath}\n` +
363
+ `branch: ${worktreeBranch}\n` +
364
+ `You MAY ` + '`git worktree add` ' + `and ` + '`git worktree remove` ' + `against this lease without a separate ` + '`peaks worktree auth grant` ' + `— the PreToolUse gate reads the lease file. Run ` + '`peaks worktree release --lease-id ${leaseId}` ' + `when done.\n`
365
+ : '';
366
+ let effectivePrompt = `${formatTestToolDetection()}\n\n${memoryAugmentedBody}${isolationBlock}`;
177
367
  let headroomCompressed = false;
178
368
  let headroomResult = null;
179
369
  const warnings = [...decision.warnings];
@@ -190,6 +380,22 @@ export function registerDispatchCommand(parent, io) {
190
380
  let toolCall;
191
381
  try {
192
382
  toolCall = adapter.subAgentDispatcher.buildToolCall({ role, prompt: effectivePrompt, requestId: rid, sessionId: sid });
383
+ // Part 2.C: stamp the toolCall with `isolation` + a sub-agent
384
+ // env block so adapters that surface it (Claude Code's Task
385
+ // tool) propagate the lease id to the spawned process. The
386
+ // env block is the canonical hook the PreToolUse gate reads
387
+ // (gate-commands.ts: process.env.PEAKS_WORKTREE_LEASE_ID).
388
+ if (isolationMode !== null && leaseId !== null) {
389
+ const existingEnv = toolCall.args['env'] ?? {};
390
+ toolCall = {
391
+ ...toolCall,
392
+ args: {
393
+ ...toolCall.args,
394
+ isolation: 'worktree',
395
+ env: { ...existingEnv, PEAKS_WORKTREE_LEASE_ID: leaseId }
396
+ }
397
+ };
398
+ }
193
399
  // Slice C of v2.11.1 — observability hook #2/7. Fire-and-forget
194
400
  // per PRD Q4 (full-auto must never fail-loud). The
195
401
  // synchronous emit returns {written:false} on disk-full; we
@@ -253,7 +459,20 @@ export function registerDispatchCommand(parent, io) {
253
459
  role,
254
460
  prompt: effectivePrompt,
255
461
  toolCall,
256
- batchId
462
+ batchId,
463
+ // Slice 2026-07-29-worktree-l2-extended Part 3.A: persist the
464
+ // lease id on the dispatch record so the finalize-time
465
+ // release hook (markCompleted / heartbeat --status done) can
466
+ // auto-fire `peaks worktree release` when the sub-agent
467
+ // completes. Null when --isolation was not requested.
468
+ leaseId,
469
+ // Slice 2026-07-29-worktree-l2-extended Part 7: stamp the
470
+ // ISO timestamp when the isolation mode was set up. Null
471
+ // when --isolation was not requested. The dashboard reads
472
+ // this directly off the dispatch record to compute
473
+ // isolation duration without cross-referencing the
474
+ // metrics stream.
475
+ isolationStartedAt: isolationMode !== null ? new Date().toISOString() : null
257
476
  });
258
477
  const counter = noteDispatched(projectRoot, sid, batchId);
259
478
  if (counter.warning) {
@@ -273,11 +492,16 @@ export function registerDispatchCommand(parent, io) {
273
492
  if (headroomResult && headroomResult.warning === 'HEADROOM_UNAVAILABLE') {
274
493
  nextActions.push('Headroom daemon unavailable; dispatched with G7 metadata-only fallback.');
275
494
  }
495
+ const expectedCompletionSeconds = 45;
496
+ const artifactsPublicPaths = typeof options.writeArtifact === 'string' && options.writeArtifact.length > 0
497
+ ? [options.writeArtifact]
498
+ : [];
499
+ const orchestratorVisibleHint = `⏳ Spawning sub-agent via Task tool: ${role} for rid=${rid}, batch-id=${batchId} (ETA ~${expectedCompletionSeconds}s)`;
276
500
  printResult(io, ok('sub-agent.dispatch', {
277
501
  // Slice 2026-06-23-audit-4th #E1: every CLI envelope carries
278
502
  // an envelopeVersion marker so consumers can detect contract
279
503
  // changes (the previous #4 dropped `data.prompt` silently).
280
- envelopeVersion: '2.2.0',
504
+ envelopeVersion: '2.3.0',
281
505
  role,
282
506
  ide: adapter.subAgentDispatcher.label,
283
507
  // Slice 2026-06-23-audit-3rd #4: do NOT echo `prompt` in stdout.
@@ -307,7 +531,19 @@ export function registerDispatchCommand(parent, io) {
307
531
  : null,
308
532
  forcedAt: decision.forcedAt,
309
533
  contextImpact,
310
- artifactMetas: artifactMeta ? [artifactMeta] : []
534
+ artifactMetas: artifactMeta ? [artifactMeta] : [],
535
+ orchestratorVisibleHint,
536
+ artifactsPublicPaths,
537
+ expectedCompletionSeconds,
538
+ // Part 2.C: when --isolation worktree, surface the lease
539
+ // handle to the LLM-side runner so it can call
540
+ // `peaks worktree release --lease-id <id>` after the sub-agent
541
+ // finishes (or rely on the next gc pass to clean up). When
542
+ // isolation is not requested, isolation === null.
543
+ isolation: isolationMode,
544
+ leaseId,
545
+ worktreePath,
546
+ worktreeBranch
311
547
  }, warnings, nextActions), asJson);
312
548
  // Slice 2026-06-23-audit-4th #B1: structured log on success path.
313
549
  // Best-effort: writeLogEntry swallows its own errors (logger.ts:155-159),
@@ -349,3 +585,131 @@ export function registerDispatchCommand(parent, io) {
349
585
  * module loads (slice-dag / dag-orchestrator / contract-store) to the
350
586
  * --from-dag codepath only.
351
587
  */
588
+ /**
589
+ * Part 2.C (slice 2026-07-29-worktree-l2-extended) — spawn a worktree
590
+ * lease by shelling out to `peaks worktree spawn` (avoid re-implementing
591
+ * the lease-write + git-worktree-add sequence in this file). The CLI
592
+ * does the lease write, the git worktree add, AND the error handling;
593
+ * we just parse the JSON envelope and surface the leaseId + path.
594
+ *
595
+ * Throws on spawn failure; the caller converts the error to a
596
+ * ISOLATION_SPAWN_FAILED envelope. Synchronous wait is acceptable: the
597
+ * dispatch is already async, the lease is a few hundred ms of FS work,
598
+ * and we need the leaseId before we build the dispatch record.
599
+ */
600
+ function spawnWorktreeLease(args) {
601
+ return new Promise((resolve, reject) => {
602
+ const child = childProcessSpawn(process.execPath, [
603
+ // The compiled CLI lives in dist/cli/peaks.js. We pass the entry
604
+ // through node so the test suite (which also runs on the same
605
+ // process) and the production binary share the same path. When
606
+ // the binary is invoked as `peaks`, the package bin stub does
607
+ // this for us; here we explicitly use process.execPath + the
608
+ // resolved entry to avoid PATH surprises.
609
+ process.argv[1] ?? '',
610
+ 'worktree', 'spawn',
611
+ '--rid', args.rid,
612
+ '--role', args.role,
613
+ '--purpose', args.purpose,
614
+ '--project', args.projectRoot,
615
+ '--session', args.sessionId,
616
+ '--json'
617
+ ], { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true, detached: true });
618
+ let stdout = '';
619
+ let stderr = '';
620
+ child.stdout.on('data', (d) => { stdout += d.toString('utf8'); });
621
+ child.stderr.on('data', (d) => { stderr += d.toString('utf8'); });
622
+ child.on('error', (err) => reject(new Error(`worktree spawn subprocess failed: ${err.message}`)));
623
+ child.on('close', (code) => {
624
+ if (code !== 0) {
625
+ reject(new Error(`peaks worktree spawn exited ${code}; stderr: ${stderr.trim() || '(empty)'}`));
626
+ return;
627
+ }
628
+ let parsed;
629
+ try {
630
+ parsed = JSON.parse(stdout);
631
+ }
632
+ catch (err) {
633
+ reject(new Error(`peaks worktree spawn produced unparseable JSON: ${err.message}; stdout: ${stdout.slice(0, 400)}`));
634
+ return;
635
+ }
636
+ if (typeof parsed !== 'object' || parsed === null) {
637
+ reject(new Error('peaks worktree spawn envelope is not an object'));
638
+ return;
639
+ }
640
+ const env = parsed;
641
+ if (env.ok !== true || !env.data?.lease) {
642
+ reject(new Error(`peaks worktree spawn envelope missing lease; got: ${stdout.slice(0, 200)}`));
643
+ return;
644
+ }
645
+ resolve({
646
+ leaseId: env.data.lease.leaseId,
647
+ path: env.data.lease.path,
648
+ branch: env.data.lease.branch,
649
+ expiresAt: env.data.lease.expiresAt
650
+ });
651
+ // Part 47: unref via setImmediate so the close handler
652
+ // finishes first and Node's stdio 'end' events drain the
653
+ // stdout/stderr buffers before the parent releases the
654
+ // child handle. Without this microtask defer, the unref
655
+ // races the buffered stdout close and the test receives
656
+ // an empty JSON envelope.
657
+ setImmediate(() => { child.unref(); });
658
+ });
659
+ });
660
+ }
661
+ /**
662
+ * Slice 2026-07-29-worktree-l2-extended Part 12: container
663
+ * isolation bridge. Shells out to `peaks container spawn` to
664
+ * run `docker run` + write the container lease. Returns the
665
+ * leaseId the dispatch record needs to persist. The shape is
666
+ * a subset of the spawnWorktreeLease return (just leaseId);
667
+ * we do not need the path/branch/expiresAt for the container
668
+ * path because the envelope surfaces a different set of
669
+ * fields (image + containerId; see container-lease.ts).
670
+ */
671
+ function spawnContainerLease(args) {
672
+ return new Promise((resolve, reject) => {
673
+ const child = childProcessSpawn(process.execPath, [
674
+ process.argv[1] ?? '',
675
+ 'container', 'spawn',
676
+ '--rid', args.rid,
677
+ '--role', args.role,
678
+ '--purpose', args.purpose,
679
+ '--project', args.projectRoot,
680
+ '--session', args.sessionId,
681
+ '--json'
682
+ ], { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true, detached: true });
683
+ let stdout = '';
684
+ let stderr = '';
685
+ child.stdout.on('data', (d) => { stdout += d.toString('utf8'); });
686
+ child.stderr.on('data', (d) => { stderr += d.toString('utf8'); });
687
+ child.on('error', (err) => reject(new Error(`container spawn subprocess failed: ${err.message}`)));
688
+ child.on('close', (code) => {
689
+ if (code !== 0) {
690
+ reject(new Error(`peaks container spawn exited ${code}; stderr: ${stderr.trim() || '(empty)'}`));
691
+ return;
692
+ }
693
+ let parsed;
694
+ try {
695
+ parsed = JSON.parse(stdout);
696
+ }
697
+ catch (err) {
698
+ reject(new Error(`peaks container spawn produced unparseable JSON: ${err.message}; stdout: ${stdout.slice(0, 400)}`));
699
+ return;
700
+ }
701
+ if (typeof parsed !== 'object' || parsed === null) {
702
+ reject(new Error('peaks container spawn envelope is not an object'));
703
+ return;
704
+ }
705
+ const env = parsed;
706
+ if (env.ok !== true || !env.data?.lease) {
707
+ reject(new Error(`peaks container spawn envelope missing lease; got: ${stdout.slice(0, 200)}`));
708
+ return;
709
+ }
710
+ resolve({ leaseId: env.data.lease.leaseId });
711
+ });
712
+ // See spawnWorktreeLease above for the rationale.
713
+ child.unref();
714
+ });
715
+ }
@@ -28,7 +28,7 @@
28
28
  */
29
29
  import { randomUUID } from 'node:crypto';
30
30
  import { printResult } from '../cli-helpers.js';
31
- import { fail, ok } from '../../shared/result.js';
31
+ import { fail, ok } from 'peaks-loop-shared/result';
32
32
  import { detectInstalledIde } from '../../services/ide/ide-detector.js';
33
33
  import { getAdapter } from '../../services/ide/ide-registry.js';
34
34
  import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
@@ -225,6 +225,9 @@ export async function runDispatchFromDag(role, options, asJson, io) {
225
225
  firstLevel: emittedSliceIds,
226
226
  toolCalls: emittedToolCalls,
227
227
  existingContractCount: existingContracts.length,
228
+ expectedCompletionSeconds: 60,
229
+ artifactsPublicPaths: [],
230
+ orchestratorVisibleHint: `⏳ Spawning ${emittedSliceIds.length} sub-agents via Task tool from DAG ${options.fromDag}, batch-id=${batchId} (ETA ~60s)`,
228
231
  // v2.15.0 follow-up — G12/G11/G2: per-slice metadata (foundation /
229
232
  // upstreamSync / complexity) for downstream scheduling decisions.
230
233
  sliceMeta: emittedSliceIds.map((id) => {
@@ -9,7 +9,7 @@
9
9
  import { resolve as resolvePath } from 'node:path';
10
10
  import { findProjectRoot } from '../../services/config/config-safety.js';
11
11
  import { generateSkillFromCommands, gitLogSince, renderSkillMarkdown, suggestChangelog } from '../../services/doc/doc-generator.js';
12
- import { fail, ok } from '../../shared/result.js';
12
+ import { fail, ok } from 'peaks-loop-shared/result';
13
13
  import { addJsonOption, printResult } from '../cli-helpers.js';
14
14
  export function registerDocCommands(program, io) {
15
15
  const doc = program
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `peaks ecc install|status|ls|show` — Slice 3 of 4.0.0-beta.11.
3
+ *
4
+ * Drop-in replacement for the deleted `peaks agent run|list`
5
+ * surface. The pre-Slice-3 implementation shelled out to
6
+ * `npx ecc agent run ...`, but the upstream `affaan-m/everything-claude-code`
7
+ * v2.0.0 release has NO `ecc` binary — the repo is `agents/*.md`
8
+ * flat files plus SKILL.md descriptors.
9
+ *
10
+ * The new flow:
11
+ * - `peaks ecc install [--ref <tag>]` downloads the ECC tarball
12
+ * into `~/.peaks/cache/ecc-<sha>/agents/` (selective extract,
13
+ * agents/*.md only).
14
+ * - `peaks ecc status` reports the cache manifest state.
15
+ * - `peaks ecc ls` lists cached agents from `<cache>/agents/*.md`,
16
+ * parsing YAML frontmatter (with D-009 fallback to filename +
17
+ * first body line when frontmatter is malformed).
18
+ * - `peaks ecc show <name> [--section H] [--max-lines N]` prints
19
+ * the SKILL.md body to stdout — this is the Skill-first path
20
+ * the LLM consumes directly.
21
+ *
22
+ * The `--section` filter extracts a single H1 (`# heading`)
23
+ * through the next H1 — useful when the SKILL.md is large.
24
+ *
25
+ * Per the "Enhancement, not new AI CLI" tenet: this command is a
26
+ * download + read-only access layer. There is no `peaks ecc run`.
27
+ */
28
+ import { Command } from 'commander';
29
+ import { type ProgramIO } from '../cli-helpers.js';
30
+ export declare function registerEccCommands(program: Command, io: ProgramIO): void;
@@ -0,0 +1,119 @@
1
+ import { downloadToCache, listCachedAgents, readAgentSkill, readCacheManifest, } from 'peaks-loop-mut';
2
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
3
+ import { fail, ok } from 'peaks-loop-shared/result';
4
+ export function registerEccCommands(program, io) {
5
+ const ecc = program
6
+ .command('ecc')
7
+ .description('affaan-m/everything-claude-code cache: download + read-only access for the LLM (no subprocess; no peaks agent run).');
8
+ addJsonOption(ecc
9
+ .command('install')
10
+ .description('Download affaan-m/ECC to ~/.peaks/cache/ecc-<sha>/ (selective extract: agents/ subtree only).')
11
+ .option('--ref <tag>', 'release tag (default: latest)')).action(async (options) => {
12
+ const asJson = options.json === true;
13
+ try {
14
+ const result = await downloadToCache(options.ref !== undefined && options.ref.length > 0 ? { ref: options.ref } : {});
15
+ const envelope = ok('ecc.install', result, [], [
16
+ `Cache landed at ~/.peaks/cache/ecc-${result.sha}/agents/`,
17
+ `Inspect with: peaks ecc ls`,
18
+ `Consume one agent with: peaks ecc show <name>`,
19
+ ]);
20
+ printResult(io, envelope, asJson);
21
+ }
22
+ catch (error) {
23
+ const message = getErrorMessage(error);
24
+ printResult(io, fail('ecc.install', 'FETCH_FAILED', message, { ref: options.ref ?? 'latest' }, [
25
+ 'Network failure during ECC download. Manual fallback:',
26
+ ' git clone https://github.com/affaan-m/everything-claude-code.git',
27
+ ' Copy <repo>/agents/*.md into ~/.peaks/cache/ecc-<sha>/agents/.',
28
+ ' Drop a minimal ecc-installed.json manifest into ~/.peaks/cache/.',
29
+ ]), asJson);
30
+ process.exitCode = 1;
31
+ }
32
+ });
33
+ addJsonOption(ecc
34
+ .command('status')
35
+ .description('Show ECC cache state (version, sha, fetchedAt, agent count).')).action((options) => {
36
+ const asJson = options.json === true;
37
+ const manifest = readCacheManifest();
38
+ if (manifest === null) {
39
+ printResult(io, fail('ecc.status', 'NO_CACHE', 'No ECC cache found. Run `peaks ecc install` first.', { installed: false }, ['Run `peaks ecc install [--ref <tag>]` to populate ~/.peaks/cache/ecc-<sha>/agents/.']), asJson);
40
+ process.exitCode = 1;
41
+ return;
42
+ }
43
+ printResult(io, ok('ecc.status', manifest, [], [
44
+ `Inspect agents with: peaks ecc ls`,
45
+ `Print one agent with: peaks ecc show <name>`,
46
+ ]), asJson);
47
+ });
48
+ addJsonOption(ecc
49
+ .command('ls')
50
+ .description('List cached agents from <cache>/agents/*.md with parsed frontmatter.')).action((options) => {
51
+ const asJson = options.json === true;
52
+ const agents = listCachedAgents();
53
+ printResult(io, ok('ecc.ls', { agents }, [], [
54
+ 'Print one with: `peaks ecc show <name>`',
55
+ ]), asJson);
56
+ });
57
+ addJsonOption(ecc
58
+ .command('show <name>')
59
+ .description('Print agent SKILL.md to stdout (LLM-consumable; Skill-first path).')
60
+ .option('--section <heading>', 'extract only the named H1 section (# <heading> through next # )')
61
+ .option('--max-lines <n>', 'cap stdout at N lines (default: unlimited)')).action((name, options) => {
62
+ const asJson = options.json === true;
63
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
64
+ printResult(io, fail('ecc.show', 'INVALID_NAME', `agent name must match ^[a-z][a-z0-9-]*$ (got "${name}")`, { name }, [
65
+ 'Run `peaks ecc ls` to see valid agent names.',
66
+ ]), asJson);
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ const body = readAgentSkill(name);
71
+ if (body === null) {
72
+ printResult(io, fail('ecc.show', 'NOT_FOUND', `agent "${name}" is not in the cache`, { name }, [
73
+ 'Run `peaks ecc ls` to see available agents.',
74
+ 'Or run `peaks ecc install` to (re-)populate the cache.',
75
+ ]), asJson);
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ let filtered = body;
80
+ if (typeof options.section === 'string' && options.section.length > 0) {
81
+ const heading = options.section.trim();
82
+ const lines = body.split(/\r?\n/);
83
+ const startIdx = lines.findIndex((line) => new RegExp(`^#\\s+${escapeRegExp(heading)}\\s*$`).test(line));
84
+ if (startIdx === -1) {
85
+ printResult(io, fail('ecc.show', 'SECTION_NOT_FOUND', `section "# ${heading}" not found in ${name}.md`, { name, section: heading }, [
86
+ 'Open the file directly to see section names.',
87
+ ]), asJson);
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ let endIdx = lines.length;
92
+ for (let i = startIdx + 1; i < lines.length; i += 1) {
93
+ const line = lines[i] ?? '';
94
+ if (/^#\s+/.test(line)) {
95
+ endIdx = i;
96
+ break;
97
+ }
98
+ }
99
+ filtered = lines.slice(startIdx, endIdx).join('\n');
100
+ }
101
+ if (typeof options.maxLines === 'string' && options.maxLines.length > 0) {
102
+ const cap = Number.parseInt(options.maxLines, 10);
103
+ if (Number.isInteger(cap) && cap > 0) {
104
+ const lines = filtered.split(/\r?\n/);
105
+ if (lines.length > cap)
106
+ filtered = lines.slice(0, cap).join('\n');
107
+ }
108
+ }
109
+ if (asJson) {
110
+ printResult(io, ok('ecc.show', { name, body: filtered }, [], []), asJson);
111
+ return;
112
+ }
113
+ // Human-readable path: raw SKILL.md body to stdout (LLM-consumable).
114
+ io.stdout(filtered);
115
+ });
116
+ }
117
+ function escapeRegExp(value) {
118
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
119
+ }