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
@@ -0,0 +1,231 @@
1
+ /**
2
+ * `peaks lease-metrics` — slice 2026-07-29-worktree-l2-extended Part 4.A + Part 5.
3
+ *
4
+ * Part 4.A: aggregate lease-kind observability events for one session,
5
+ * render per-kind counts + a 5-event chronological tail.
6
+ *
7
+ * Part 5 adds:
8
+ * - `--rate` : leak-rate computation (spawn - release - gc)
9
+ * plus lifetime stats (avg / p99) per lease id.
10
+ * - `--all-sessions` : aggregate across every session under
11
+ * `.peaks/_runtime/<sid>/metrics/slices.jsonl`
12
+ * for the given project root. Useful for
13
+ * cross-session dashboards.
14
+ *
15
+ * Aggregation is pure (operates on already-read ObservabilityEvent[]);
16
+ * the IO layer is the JSONL read at the call site. The reader filters
17
+ * on `category === 'lease'`; the schema is the same as every other
18
+ * observability event (Part 4.A reused the existing schema v1).
19
+ */
20
+ import { existsSync, readdirSync, statSync } from 'node:fs';
21
+ import { join } from 'node:path';
22
+ import { fail, ok } from 'peaks-loop-shared/result';
23
+ import { addJsonOption, printResult } from '../cli-helpers.js';
24
+ import { findProjectRoot } from '../../services/config/config-safety.js';
25
+ import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
26
+ import { readObservabilityEvents } from '../../services/observability/observability-service.js';
27
+ const EMPTY_COUNTS = {
28
+ spawn: 0,
29
+ renew: 0,
30
+ release: 0,
31
+ gc: 0,
32
+ autoRelease: 0,
33
+ 'autoRelease-failed': 0,
34
+ 'autoRelease-skipped': 0
35
+ };
36
+ /** Compute per-kind counts + chronological tail from a list of events. */
37
+ function aggregateLeaseEvents(leaseEvents) {
38
+ const counts = { ...EMPTY_COUNTS };
39
+ const recent = [];
40
+ for (const ev of leaseEvents) {
41
+ const detail = (ev.detail ?? {});
42
+ const kind = typeof detail['kind'] === 'string' ? detail['kind'] : 'unknown';
43
+ const leaseId = typeof detail['leaseId'] === 'string' ? detail['leaseId'] : '';
44
+ const rid = typeof detail['rid'] === 'string' ? detail['rid'] : null;
45
+ const reason = typeof detail['reason'] === 'string' ? detail['reason'] : null;
46
+ if (kind in counts) {
47
+ counts[kind] = (counts[kind] ?? 0) + 1;
48
+ }
49
+ recent.push({ ts: ev.ts, kind, leaseId, rid, reason });
50
+ }
51
+ recent.sort((a, b) => b.ts.localeCompare(a.ts));
52
+ return { counts: counts, tail: recent.slice(0, 5) };
53
+ }
54
+ export function recomputeRate(leaseEvents) {
55
+ // Count per-kind in one pass.
56
+ const counts = { ...EMPTY_COUNTS };
57
+ for (const ev of leaseEvents) {
58
+ const detail = (ev.detail ?? {});
59
+ const kind = typeof detail['kind'] === 'string' ? detail['kind'] : 'unknown';
60
+ if (kind in counts) {
61
+ counts[kind] = (counts[kind] ?? 0) + 1;
62
+ }
63
+ }
64
+ const totalSpawn = counts['spawn'] ?? 0;
65
+ const totalRelease = (counts['release'] ?? 0) + (counts['gc'] ?? 0) + (counts['autoRelease'] ?? 0);
66
+ const estimatedActive = Math.max(0, totalSpawn - totalRelease);
67
+ const estimatedLeaked = Math.max(0, estimatedActive - (counts['autoRelease-failed'] ?? 0));
68
+ // Pair each lease id: first spawn → first terminal.
69
+ const firstSpawn = new Map();
70
+ const firstTerminal = new Map();
71
+ const tsOf = (ev) => Date.parse(ev.ts);
72
+ const leaseIdOf = (ev) => {
73
+ const d = (ev.detail ?? {});
74
+ return typeof d['leaseId'] === 'string' ? d['leaseId'] : '';
75
+ };
76
+ const kindOf = (ev) => {
77
+ const d = (ev.detail ?? {});
78
+ return typeof d['kind'] === 'string' ? d['kind'] : 'unknown';
79
+ };
80
+ for (const ev of leaseEvents) {
81
+ const id = leaseIdOf(ev);
82
+ if (id === '')
83
+ continue;
84
+ const t = tsOf(ev);
85
+ const k = kindOf(ev);
86
+ if (k === 'spawn' && !firstSpawn.has(id)) {
87
+ firstSpawn.set(id, t);
88
+ }
89
+ else if (k === 'release' || k === 'gc' || k === 'autoRelease' || k === 'autoRelease-failed') {
90
+ if (!firstTerminal.has(id))
91
+ firstTerminal.set(id, t);
92
+ }
93
+ }
94
+ const lifetimes = [];
95
+ for (const [id, start] of firstSpawn) {
96
+ const end = firstTerminal.get(id);
97
+ if (end === undefined)
98
+ continue;
99
+ const dt = end - start;
100
+ if (dt >= 0)
101
+ lifetimes.push(dt);
102
+ }
103
+ lifetimes.sort((a, b) => a - b);
104
+ const avg = lifetimes.length === 0 ? null : Math.round(lifetimes.reduce((s, v) => s + v, 0) / lifetimes.length);
105
+ const p99 = lifetimes.length === 0
106
+ ? null
107
+ : lifetimes[Math.min(lifetimes.length - 1, Math.floor(lifetimes.length * 0.99))] ?? null;
108
+ return {
109
+ totalSpawn,
110
+ totalTerminal: totalRelease,
111
+ estimatedActive,
112
+ estimatedLeaked,
113
+ completedLifetimes: lifetimes.length,
114
+ avgLifetimeMs: avg,
115
+ p99LifetimeMs: p99
116
+ };
117
+ }
118
+ /**
119
+ * Part 5: enumerate every session under `.peaks/_runtime/` for a
120
+ * project root and aggregate their lease events. Sessions without
121
+ * a `metrics/slices.jsonl` are skipped silently (a clean project
122
+ * has no lease events to report; that's not an error).
123
+ */
124
+ export function readAllSessionLeaseEvents(projectRoot) {
125
+ const runtimeDir = join(projectRoot, '.peaks', '_runtime');
126
+ if (!existsSync(runtimeDir))
127
+ return { sessions: [], missingSessions: 0 };
128
+ let entries;
129
+ try {
130
+ entries = readdirSync(runtimeDir);
131
+ }
132
+ catch {
133
+ return { sessions: [], missingSessions: 0 };
134
+ }
135
+ const sessions = [];
136
+ let missing = 0;
137
+ for (const sid of entries) {
138
+ const sessionDir = join(runtimeDir, sid);
139
+ try {
140
+ if (!statSync(sessionDir).isDirectory())
141
+ continue;
142
+ }
143
+ catch {
144
+ continue;
145
+ }
146
+ try {
147
+ const all = readObservabilityEvents(projectRoot, sid);
148
+ const leaseEvents = all.filter((e) => e.category === 'lease');
149
+ if (leaseEvents.length === 0) {
150
+ missing++;
151
+ continue;
152
+ }
153
+ sessions.push({ sessionId: sid, events: leaseEvents });
154
+ }
155
+ catch {
156
+ missing++;
157
+ }
158
+ }
159
+ return { sessions, missingSessions: missing };
160
+ }
161
+ export function registerLeaseMetricsCommand(parent, io) {
162
+ addJsonOption(parent
163
+ .command('lease-metrics')
164
+ .description('Aggregate lease-kind observability events. Default: per-kind counts + 5-event tail for the current session. --rate: leak rate + lifetime stats. --all-sessions: aggregate across every session under .peaks/_runtime/.')
165
+ .option('--session <sid>', 'override session id (default: read .peaks/_runtime/session.json)')
166
+ .option('--project <path>', 'project root (default: findProjectRoot(cwd))')
167
+ .option('--rate', 'compute leak rate (spawn - terminal) + lifetime stats (avg / p99)')
168
+ .option('--all-sessions', 'aggregate across every session under .peaks/_runtime/ (ignores --session)')).action((options) => {
169
+ try {
170
+ const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
171
+ const allSessions = options.allSessions === true;
172
+ const showRate = options.rate === true;
173
+ if (allSessions) {
174
+ // Aggregate across every session.
175
+ const { sessions, missingSessions } = readAllSessionLeaseEvents(projectRoot);
176
+ const allEvents = sessions.flatMap((s) => s.events);
177
+ const { counts, tail } = aggregateLeaseEvents(allEvents);
178
+ const rate = showRate ? recomputeRate(allEvents) : null;
179
+ const envelope = {
180
+ mode: 'all-sessions',
181
+ projectRoot,
182
+ sessionCount: sessions.length,
183
+ missingSessions,
184
+ sessions: sessions.map((s) => ({ sessionId: s.sessionId, leaseEvents: s.events.length })),
185
+ totalEvents: allEvents.length,
186
+ counts,
187
+ tail
188
+ };
189
+ if (rate !== null)
190
+ envelope['rate'] = rate;
191
+ printResult(io, ok('lease.metrics', envelope, [], [
192
+ `${sessions.length} session(s) reported lease events; ${missingSessions} session(s) had no events.`,
193
+ showRate && rate !== null
194
+ ? `${rate.estimatedActive} estimated active, ${rate.estimatedLeaked} estimated leaked across sessions.`
195
+ : 'Pass --rate to see leak-rate + lifetime stats.'
196
+ ]), options.json);
197
+ return;
198
+ }
199
+ // Single-session path (the Part 4.A default).
200
+ const sessionId = options.session ?? process.env.PEAKS_SESSION_ID ?? getCurrentSessionId(projectRoot) ?? 'unknown-sid';
201
+ const allEvents = readObservabilityEvents(projectRoot, sessionId);
202
+ const leaseEvents = allEvents.filter((e) => e.category === 'lease');
203
+ const { counts, tail } = aggregateLeaseEvents(leaseEvents);
204
+ const rate = showRate ? recomputeRate(leaseEvents) : null;
205
+ const envelope = {
206
+ mode: 'single-session',
207
+ sessionId,
208
+ projectRoot,
209
+ totalEvents: allEvents.length,
210
+ leaseEvents: leaseEvents.length,
211
+ counts,
212
+ tail
213
+ };
214
+ if (rate !== null)
215
+ envelope['rate'] = rate;
216
+ printResult(io, ok('lease.metrics', envelope, [], [
217
+ `${leaseEvents.length} lease-kind events recorded for session ${sessionId}.`,
218
+ showRate && rate !== null
219
+ ? `${rate.estimatedActive} estimated active, ${rate.estimatedLeaked} estimated leaked.`
220
+ : 'Run `peaks audit metrics --project .` for the full observability dashboard, or pass --rate / --all-sessions.'
221
+ ]), options.json);
222
+ }
223
+ catch (err) {
224
+ printResult(io, fail('lease.metrics', 'METRICS_READ_FAILED', err instanceof Error ? err.message : String(err), { sessionId: options.session }, [
225
+ 'Verify the project root + session id are correct.',
226
+ 'For the full observability stream, run `peaks audit metrics --project .`.'
227
+ ]), options.json);
228
+ process.exitCode = 1;
229
+ }
230
+ });
231
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * `peaks lease-stats` — slice 2026-07-29-worktree-l2-extended Part 6.
3
+ *
4
+ * Single top-level command that aggregates lease observability for
5
+ * the whole project root and returns a summary envelope suitable
6
+ * for dashboards / pipelines:
7
+ *
8
+ * - per-kind counts (same as peaks lease-metrics)
9
+ * - leak rate (estimatedActive / estimatedLeaked)
10
+ * - per-rid breakdown: which request ids are still "alive"
11
+ * (i.e. the rid has a spawn event with no terminal)
12
+ * - per-role breakdown: lease spawns split by role
13
+ * - per-isolation breakdown: 'worktree' | 'container' | 'none'
14
+ * (Part 8 adds 'container')
15
+ *
16
+ * The per-rid / per-role / per-isolation breakdowns use the
17
+ * `rid` / `role` fields on the observability detail (Part 4.A
18
+ * emitter passes these). The 'isolation' field is read off the
19
+ * underlying dispatch record via the readObservabilityEvents
20
+ * reader — but the events themselves don't carry isolation
21
+ * mode. To get that, we walk the dispatch records (not events)
22
+ * and join on the dispatch's `isolation` field. This is a
23
+ * cross-file read but the operation is cheap (each session's
24
+ * dispatch records are a small JSON set).
25
+ *
26
+ * Why this is a separate command from `peaks lease-metrics`:
27
+ * `lease-metrics` answers "what events did I record?" (event
28
+ * stream semantics). `lease-stats` answers "what's the project
29
+ * status right now?" (state semantics). The two compose:
30
+ * `lease-metrics --all-sessions` is the input, `lease-stats`
31
+ * is the answer.
32
+ */
33
+ import { Command } from 'commander';
34
+ import { type ProgramIO } from '../cli-helpers.js';
35
+ import { type RateStats } from './lease-metrics-commands.js';
36
+ type RidCount = {
37
+ rid: string;
38
+ count: number;
39
+ };
40
+ type RoleCount = {
41
+ role: string;
42
+ count: number;
43
+ };
44
+ type IsolationCount = {
45
+ isolation: 'worktree' | 'container' | 'none';
46
+ count: number;
47
+ };
48
+ type LeaseStats = {
49
+ readonly projectRoot: string;
50
+ readonly sessionCount: number;
51
+ readonly totalLeaseEvents: number;
52
+ readonly rate: RateStats;
53
+ readonly perRid: ReadonlyArray<RidCount>;
54
+ readonly perRole: ReadonlyArray<RoleCount>;
55
+ readonly perIsolation: ReadonlyArray<IsolationCount>;
56
+ };
57
+ export declare function computeLeaseStats(args: {
58
+ projectRoot: string;
59
+ eventsBySession: ReadonlyArray<{
60
+ sessionId: string;
61
+ events: ReadonlyArray<unknown>;
62
+ }>;
63
+ }): LeaseStats;
64
+ export declare function registerLeaseStatsCommand(parent: Command, io: ProgramIO): void;
65
+ export {};
@@ -0,0 +1,107 @@
1
+ /**
2
+ * `peaks lease-stats` — slice 2026-07-29-worktree-l2-extended Part 6.
3
+ *
4
+ * Single top-level command that aggregates lease observability for
5
+ * the whole project root and returns a summary envelope suitable
6
+ * for dashboards / pipelines:
7
+ *
8
+ * - per-kind counts (same as peaks lease-metrics)
9
+ * - leak rate (estimatedActive / estimatedLeaked)
10
+ * - per-rid breakdown: which request ids are still "alive"
11
+ * (i.e. the rid has a spawn event with no terminal)
12
+ * - per-role breakdown: lease spawns split by role
13
+ * - per-isolation breakdown: 'worktree' | 'container' | 'none'
14
+ * (Part 8 adds 'container')
15
+ *
16
+ * The per-rid / per-role / per-isolation breakdowns use the
17
+ * `rid` / `role` fields on the observability detail (Part 4.A
18
+ * emitter passes these). The 'isolation' field is read off the
19
+ * underlying dispatch record via the readObservabilityEvents
20
+ * reader — but the events themselves don't carry isolation
21
+ * mode. To get that, we walk the dispatch records (not events)
22
+ * and join on the dispatch's `isolation` field. This is a
23
+ * cross-file read but the operation is cheap (each session's
24
+ * dispatch records are a small JSON set).
25
+ *
26
+ * Why this is a separate command from `peaks lease-metrics`:
27
+ * `lease-metrics` answers "what events did I record?" (event
28
+ * stream semantics). `lease-stats` answers "what's the project
29
+ * status right now?" (state semantics). The two compose:
30
+ * `lease-metrics --all-sessions` is the input, `lease-stats`
31
+ * is the answer.
32
+ */
33
+ import { fail, ok } from 'peaks-loop-shared/result';
34
+ import { addJsonOption, printResult } from '../cli-helpers.js';
35
+ import { findProjectRoot } from '../../services/config/config-safety.js';
36
+ import { readAllSessionLeaseEvents, recomputeRate } from './lease-metrics-commands.js';
37
+ function tallyByField(events, field) {
38
+ const out = new Map();
39
+ for (const ev of events) {
40
+ const v = ev.detail[field];
41
+ if (typeof v !== 'string' || v.length === 0)
42
+ continue;
43
+ out.set(v, (out.get(v) ?? 0) + 1);
44
+ }
45
+ return out;
46
+ }
47
+ export function computeLeaseStats(args) {
48
+ // The events pass through `tallyByField` (which only reads
49
+ // `detail`) and through `recomputeRate` (which reads `detail` +
50
+ // `ts`). The interface is widened to `unknown` here so the
51
+ // caller can pass any observability-event-shaped object;
52
+ // `recomputeRate`'s parameter type is the canonical
53
+ // `ObservabilityEvent[]`, so we cast at the boundary.
54
+ const allEvents = args.eventsBySession.flatMap((s) => s.events);
55
+ const rate = recomputeRate(allEvents);
56
+ const ridTally = tallyByField(allEvents, 'rid');
57
+ const roleTally = tallyByField(allEvents, 'role');
58
+ const isoTally = new Map();
59
+ for (const ev of allEvents) {
60
+ const detail = ev.detail;
61
+ const iso = typeof detail['isolation'] === 'string' ? detail['isolation'] : 'none';
62
+ isoTally.set(iso, (isoTally.get(iso) ?? 0) + 1);
63
+ }
64
+ return {
65
+ projectRoot: args.projectRoot,
66
+ sessionCount: args.eventsBySession.length,
67
+ totalLeaseEvents: allEvents.length,
68
+ rate,
69
+ perRid: Array.from(ridTally.entries())
70
+ .map(([rid, count]) => ({ rid, count }))
71
+ .sort((a, b) => b.count - a.count)
72
+ .slice(0, 20),
73
+ perRole: Array.from(roleTally.entries())
74
+ .map(([role, count]) => ({ role, count }))
75
+ .sort((a, b) => b.count - a.count),
76
+ perIsolation: Array.from(isoTally.entries())
77
+ .map(([isolation, count]) => ({ isolation: isolation, count }))
78
+ .sort((a, b) => b.count - a.count)
79
+ };
80
+ }
81
+ export function registerLeaseStatsCommand(parent, io) {
82
+ addJsonOption(parent
83
+ .command('lease-stats')
84
+ .description('Project-wide lease summary: counts, leak rate, per-rid / per-role / per-isolation breakdown. Always aggregates across every session in the project root.')
85
+ .option('--project <path>', 'project root (default: findProjectRoot(cwd))')).action((options) => {
86
+ try {
87
+ const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
88
+ const { sessions } = readAllSessionLeaseEvents(projectRoot);
89
+ const eventsBySession = sessions.map((s) => ({
90
+ sessionId: s.sessionId,
91
+ events: s.events.map((e) => ({ detail: (e.detail ?? {}) }))
92
+ }));
93
+ const stats = computeLeaseStats({ projectRoot, eventsBySession });
94
+ printResult(io, ok('lease.stats', stats, [], [
95
+ `${stats.totalLeaseEvents} lease events across ${stats.sessionCount} session(s); ${stats.rate.estimatedActive} estimated active, ${stats.rate.estimatedLeaked} estimated leaked.`,
96
+ stats.perRid.length > 0 ? `Top rid: ${stats.perRid[0]?.rid} (${stats.perRid[0]?.count} events).` : '',
97
+ 'Pipe to `jq` or paste into a dashboard for visual rendering.'
98
+ ].filter(Boolean)), options.json);
99
+ }
100
+ catch (err) {
101
+ printResult(io, fail('lease.stats', 'STATS_READ_FAILED', err instanceof Error ? err.message : String(err), { projectRoot: options.project }, [
102
+ 'Verify the project root is correct.'
103
+ ]), options.json);
104
+ process.exitCode = 1;
105
+ }
106
+ });
107
+ }
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { findProjectRoot } from '../../services/config/config-safety.js';
10
10
  import { detectLegacy } from '../../services/legacy/legacy-detector.js';
11
- import { ok } from '../../shared/result.js';
11
+ import { ok } from 'peaks-loop-shared/result';
12
12
  import { addJsonOption, printResult } from '../cli-helpers.js';
13
13
  export function registerLegacyCommands(program, io) {
14
14
  addJsonOption(program
@@ -16,7 +16,7 @@ import { join } from 'node:path';
16
16
  import { homedir } from 'node:os';
17
17
  import { tailLog, listLogFiles } from '../../services/log/log-commands-service.js';
18
18
  import { getErrorMessage, printResult, addJsonOption } from '../cli-helpers.js';
19
- import { ok, fail } from '../../shared/result.js';
19
+ import { ok, fail } from 'peaks-loop-shared/result';
20
20
  export function registerLogCommands(program, io) {
21
21
  const log = program
22
22
  .command('log')
@@ -25,7 +25,7 @@
25
25
  import { existsSync, mkdirSync } from 'node:fs';
26
26
  import { join } from 'node:path';
27
27
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
28
- import { fail, ok } from '../../shared/result.js';
28
+ import { fail, ok } from 'peaks-loop-shared/result';
29
29
  import { findProjectRoot } from '../../services/config/config-safety.js';
30
30
  import { openStateDb } from '../../services/skillhub/sqlite-store.js';
31
31
  import { writeBundle, BundleNotShareableError, BundleAssetNotFoundError, } from '../../services/share/bundle-writer.js';
@@ -7,7 +7,7 @@ import { runMonotonicCheck, resolveMonotonicContext } from '../../services/loop/
7
7
  import { resolveLoopSpec, persistSpec, buildSpec, lintLoopSpec, lintSpecFile, specPath, MONOTONIC_TERMINATION, DEFAULT_MAX_CYCLES } from '../../services/loop/spec-service.js';
8
8
  import { runLoop, resolveRunContext } from '../../services/loop/run-driver.js';
9
9
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
10
- import { fail, ok } from '../../shared/result.js';
10
+ import { fail, ok } from 'peaks-loop-shared/result';
11
11
  import { findProjectRoot } from '../../services/config/config-safety.js';
12
12
  const VALID_EVALUATORS = new Set([
13
13
  'karpathy',
@@ -2,7 +2,7 @@ import { findProjectRoot } from '../../services/config/config-safety.js';
2
2
  import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
3
3
  import { loadMemoryIndex, searchMemoryWithResults } from '../../services/memory/memory-search-service.js';
4
4
  import { pickFromList } from '../../services/fuzzy-matching/fzf-pick-service.js';
5
- import { fail, ok } from '../../shared/result.js';
5
+ import { fail, ok } from 'peaks-loop-shared/result';
6
6
  import { getErrorMessage, printResult } from '../cli-helpers.js';
7
7
  import { join } from 'node:path';
8
8
  const VALID_KINDS = [
@@ -6,7 +6,7 @@
6
6
  * `.peaks/_runtime/<sid>/<role>/<file>.md` path. Default is dry-run; pass
7
7
  * `--apply` to actually `rename` the files and remove emptied legacy dirs.
8
8
  */
9
- import { ok, fail } from '../../shared/result.js';
9
+ import { ok, fail } from 'peaks-loop-shared/result';
10
10
  import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
11
11
  import { addJsonOption } from '../cli-helpers.js';
12
12
  import { planMigrate1_4_1, applyMigrate1_4_1 } from '../../services/workspace/migrate-1-4-1-service.js';
@@ -18,7 +18,7 @@
18
18
  import { addJsonOption } from '../cli-helpers.js';
19
19
  import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
20
20
  import { planV2ToV11Migration, applyV2ToV11Migration, dryRunV2ToV11Migration } from '../../services/migration/v2-10-to-v2-11-service.js';
21
- import { ok, fail } from '../../shared/result.js';
21
+ import { ok, fail } from 'peaks-loop-shared/result';
22
22
  export function registerMigrateV2ToV11Command(workspace, io) {
23
23
  addJsonOption(workspace
24
24
  .command('migrate-v2-10-to-v2-11')
@@ -1,5 +1,5 @@
1
1
  import { Command } from 'commander';
2
- import { type StrykerInvoker } from '../../services/mut/mut-runner.js';
2
+ import { type StrykerInvoker } from 'peaks-loop-mut';
3
3
  import type { ProgramIO } from '../cli-helpers.js';
4
4
  export interface MutCommandsOptions {
5
5
  readonly invokeStryker: StrykerInvoker;
@@ -15,11 +15,7 @@
15
15
  */
16
16
  import { readFile } from 'node:fs/promises';
17
17
  import { Command } from 'commander';
18
- import { scanAssertions } from '../../services/mut/assert-scanner.js';
19
- import { runMutation } from '../../services/mut/mut-runner.js';
20
- import { buildMutReport } from '../../services/mut/report-builder.js';
21
- import { createProductionStrykerInvoker } from '../../services/mut/production-stryker.js';
22
- import { MutReportSchema } from '../../services/mut/types.js';
18
+ import { scanAssertions, runMutation, buildMutReport, createProductionStrykerInvoker, MutReportSchema, } from 'peaks-loop-mut';
23
19
  /**
24
20
  * Pure helper: a stub AssertionsReport used when only Stryker ran.
25
21
  * The mutants-only path does NOT touch the AST scanner; we still need
@@ -19,7 +19,7 @@
19
19
  */
20
20
  import { findProjectRoot } from '../../services/config/config-safety.js';
21
21
  import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
22
- import { fail, ok } from '../../shared/result.js';
22
+ import { fail, ok } from 'peaks-loop-shared/result';
23
23
  import { getSessionIdCanonical } from '../../services/session/session-manager.js';
24
24
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
25
25
  import { aggregateFanout, aggregateRepairCycles, aggregateSlices, aggregateStatus, filterByPeriod, periodStartIso, readAllSessionEvents, readSessionEvents } from '../../services/observability/aggregation.js';
@@ -3,11 +3,11 @@ import { loadOpenSpecChange, scanOpenSpec } from '../../services/openspec/opensp
3
3
  import { projectOpenSpecToRdInput } from '../../services/openspec/openspec-bridge-service.js';
4
4
  import { renderOpenSpecChange } from '../../services/openspec/openspec-render-service.js';
5
5
  import { validateOpenSpecChange } from '../../services/openspec/openspec-validate-service.js';
6
- import { archiveOpenSpecChange } from '../../services/openspec/openspec-archive-service.js';
6
+ import { archiveOpenSpecChange, OpenSpecArchiveError } from '../../services/openspec/openspec-archive-service.js';
7
7
  import { executeOpenSpecInit } from '../../services/openspec/openspec-init-service.js';
8
8
  import { proposeFromDoctor } from '../../services/openspec/openspec-propose-from-doctor-service.js';
9
- import { runDoctor } from '../../services/doctor/doctor-service.js';
10
- import { fail, ok } from '../../shared/result.js';
9
+ import { runDoctor } from '../../services/doctor/index.js';
10
+ import { fail, ok } from 'peaks-loop-shared/result';
11
11
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
12
12
  function resolveScanOptions(project) {
13
13
  if (project === undefined) {
@@ -143,6 +143,8 @@ export function registerOpenSpecCommands(program, io) {
143
143
  .argument('<changeId>', 'OpenSpec change directory name under openspec/changes')
144
144
  .option('--project <path>', 'project root containing an openspec/ directory')
145
145
  .option('--apply', 'actually move the change directory')
146
+ .option('--force', 'bypass the Pre-cond 2 Coverage Evidence gate (use only after confirming the gap is acceptable for this archive)')
147
+ .option('--coverage-summary <path>', 'override coverage-summary.json discovery (Fix-6B). Default: <projectRoot>/coverage/coverage-summary.json, then <projectRoot>/openspec/coverage-summary.json')
146
148
  .option('--archive-dir <name>', 'archive subdirectory name (default: archive)')).action(async (changeId, options) => {
147
149
  try {
148
150
  const scan = resolveScanOptions(options.project);
@@ -153,6 +155,12 @@ export function registerOpenSpecCommands(program, io) {
153
155
  if (options.apply === true) {
154
156
  archiveOptions.apply = true;
155
157
  }
158
+ if (options.force === true) {
159
+ archiveOptions.force = true;
160
+ }
161
+ if (options.coverageSummary !== undefined) {
162
+ archiveOptions.coverageSummaryPath = options.coverageSummary;
163
+ }
156
164
  if (options.archiveDir !== undefined) {
157
165
  archiveOptions.archiveDirName = options.archiveDir;
158
166
  }
@@ -162,9 +170,21 @@ export function registerOpenSpecCommands(program, io) {
162
170
  process.exitCode = 1;
163
171
  return;
164
172
  }
165
- printResult(io, ok('openspec.archive', result, [], result.applied ? [] : [`Re-run with --apply to move ${result.from} → ${result.to}`]), options.json);
173
+ const warnings = [];
174
+ if (result.coverageGateBypassed === true) {
175
+ warnings.push('Coverage gate bypassed via --force; archived with at least one uncovered requirement.');
176
+ }
177
+ if (result.coverageMismatchBypassed === true) {
178
+ warnings.push('Coverage summary mismatch bypassed via --force; archived with at least one capability below 100%.');
179
+ }
180
+ printResult(io, ok('openspec.archive', result, warnings, result.applied ? [] : [`Re-run with --apply to move ${result.from} → ${result.to}`]), options.json);
166
181
  }
167
182
  catch (error) {
183
+ if (error instanceof OpenSpecArchiveError) {
184
+ printResult(io, fail('openspec.archive', error.code, getErrorMessage(error), error.detail, nextActionsForArchiveError(error.code)), options.json);
185
+ process.exitCode = 1;
186
+ return;
187
+ }
168
188
  printResult(io, fail('openspec.archive', 'OPENSPEC_ARCHIVE_FAILED', getErrorMessage(error), { changeId }, ['Check the project path and openspec/ layout before retrying']), options.json);
169
189
  process.exitCode = 1;
170
190
  }
@@ -235,3 +255,44 @@ export function registerOpenSpecCommands(program, io) {
235
255
  }
236
256
  });
237
257
  }
258
+ /**
259
+ * Per-error-code remediation hints for the archive gate.
260
+ * Centralized here so the catch block stays readable and the next-actions
261
+ * can be reviewed in isolation.
262
+ */
263
+ function nextActionsForArchiveError(code) {
264
+ switch (code) {
265
+ case 'OPENSPEC_COVERAGE_GATE_PARTIAL':
266
+ return [
267
+ 'Update the Coverage Evidence table to mark each failing requirement as covered',
268
+ 'Or re-run with --force to bypass the gate after confirming the gap is acceptable'
269
+ ];
270
+ case 'OPENSPEC_COVERAGE_GATE_FAILED':
271
+ return [
272
+ 'Add the missing Coverage Evidence or Capability Mapping block to proposal.md (see error.message)',
273
+ 'Or re-run with --force to bypass the gate after confirming the gap is acceptable'
274
+ ];
275
+ case 'OPENSPEC_COVERAGE_EVIDENCE_MALFORMED':
276
+ return [
277
+ 'Fix the proposal.md Coverage Evidence table — the heading exists but no parsable rows were found',
278
+ 'Expected shape: | capability | requirement | status | testAnchor | with status in {covered, partial, uncovered}'
279
+ ];
280
+ case 'OPENSPEC_COVERAGE_EVIDENCE_MISSING':
281
+ return [
282
+ 'Run `pnpm test:coverage` (which invokes scripts/coverage-c8.mjs) to generate coverage-summary.json',
283
+ 'Or pass --coverage-summary <path> to point at an existing summary',
284
+ 'Or re-run with --force to bypass the gate'
285
+ ];
286
+ case 'OPENSPEC_COVERAGE_EVIDENCE_STALE':
287
+ return [
288
+ 'Re-run `pnpm test:coverage` to refresh coverage-summary.json',
289
+ 'Or re-run with --force to bypass the gate after confirming the source delta is acceptable'
290
+ ];
291
+ case 'OPENSPEC_COVERAGE_EVIDENCE_MISMATCH':
292
+ return [
293
+ 'Inspect error.detail.mismatches[] — each entry lists the failing capability, file, and actual pct',
294
+ 'Close the coverage gap (add tests or update the Capability Mapping block in proposal.md)',
295
+ 'Or re-run with --force to bypass the gate after confirming the gap is acceptable'
296
+ ];
297
+ }
298
+ }
@@ -1,7 +1,7 @@
1
1
  import { readFileSync } from 'node:fs';
2
- import { detectPerfAudit, isPerfAuditEnvelope, runPerfAudit, } from '../../services/audit-independent/perf-audit-service.js';
2
+ import { detectPerfAudit, isPerfAuditEnvelope, runPerfAudit, } from '../../services/audit-independent/index.js';
3
3
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
4
- import { fail, ok } from '../../shared/result.js';
4
+ import { fail, ok } from 'peaks-loop-shared/result';
5
5
  function resolveEnvelope(envelopePath) {
6
6
  if (envelopePath === undefined || envelopePath === '-') {
7
7
  // Read from stdin
@@ -36,7 +36,7 @@ function readStdinSync() {
36
36
  }
37
37
  export function registerPerfAuditCommands(program, io) {
38
38
  const perfAudit = program
39
- .command('perf-audit')
39
+ .command('perf-audit', { hidden: true })
40
40
  .description('Independent performance audit skill driver. Reads the immutable peaks-prd handoff (sha256-locked) + the project-level perf-template.md, then writes a structured perf-<rid>.md artifact. Decoupled from peaks-rd 5-way fan-out per slice v2.12.0 (Group A, Tier 3). See skills/bee/peaks-perf-audit/SKILL.md for the full workflow.');
41
41
  addJsonOption(perfAudit
42
42
  .command('detect')
@@ -1,5 +1,5 @@
1
1
  import { executePerfBaselineInit, resolveProjectRootFromCwd } from '../../services/perf/perf-baseline-service.js';
2
- import { fail, ok } from '../../shared/result.js';
2
+ import { fail, ok } from 'peaks-loop-shared/result';
3
3
  import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
4
4
  export function registerPerfCommands(program, io) {
5
5
  const perf = program.command('perf').description('Manage performance baseline scaffolding for the RD stage');
@@ -1,6 +1,6 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { addJsonOption, printResult } from '../cli-helpers.js';
3
- import { fail, ok, getErrorMessage } from '../../shared/result.js';
3
+ import { fail, ok, getErrorMessage } from 'peaks-loop-shared/result';
4
4
  import { PolyrepoService } from '../../services/polyrepo/polyrepo-service.js';
5
5
  function parseChildren(raw) {
6
6
  if (raw === undefined || raw.length === 0)