peaks-loop 4.0.0-beta.9 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/CHANGELOG.md +910 -141
  2. package/README-en.md +26 -7
  3. package/README.md +75 -6
  4. package/agents/karpathy-reviewer.md +33 -0
  5. package/bin/peaks.js +0 -0
  6. package/dist/cli/cli-helpers.d.ts +31 -6
  7. package/dist/cli/cli-helpers.js +48 -25
  8. package/dist/cli/commands/_register.d.ts +3 -0
  9. package/dist/cli/commands/_register.js +139 -0
  10. package/dist/cli/commands/_super.d.ts +10 -0
  11. package/dist/cli/commands/_super.js +97 -0
  12. package/dist/cli/commands/adapter-commands-s2a.js +1 -1
  13. package/dist/cli/commands/asset-commands.js +33 -16
  14. package/dist/cli/commands/audit-commands.js +2 -2
  15. package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
  16. package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
  17. package/dist/cli/commands/bee-commands.js +1 -1
  18. package/dist/cli/commands/capability-commands.js +1 -1
  19. package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
  20. package/dist/cli/commands/changeset-commands.d.ts +13 -0
  21. package/dist/cli/commands/changeset-commands.js +46 -0
  22. package/dist/cli/commands/code-commands.d.ts +11 -1
  23. package/dist/cli/commands/code-commands.js +19 -699
  24. package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
  25. package/dist/cli/commands/code-job-shape-commands.js +164 -0
  26. package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
  27. package/dist/cli/commands/code-mode-gate-commands.js +223 -0
  28. package/dist/cli/commands/code-review-commands.js +2 -2
  29. package/dist/cli/commands/code-run-command.d.ts +12 -0
  30. package/dist/cli/commands/code-run-command.js +68 -0
  31. package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
  32. package/dist/cli/commands/code-runtime-commands.js +391 -0
  33. package/dist/cli/commands/codegraph-commands.js +1 -1
  34. package/dist/cli/commands/compact-command.js +53 -1
  35. package/dist/cli/commands/complexity-commands.js +1 -1
  36. package/dist/cli/commands/config-commands.js +4 -75
  37. package/dist/cli/commands/container-commands.d.ts +28 -0
  38. package/dist/cli/commands/container-commands.js +221 -0
  39. package/dist/cli/commands/context-commands.js +3 -2
  40. package/dist/cli/commands/core/artifacts-command.js +1 -1
  41. package/dist/cli/commands/core/binding-commands.js +1 -1
  42. package/dist/cli/commands/core/doctor-command.js +63 -3
  43. package/dist/cli/commands/core/memory-command.js +1 -1
  44. package/dist/cli/commands/core/profile-command.js +1 -1
  45. package/dist/cli/commands/core/proxy-command.js +1 -1
  46. package/dist/cli/commands/core/session-command.js +9 -7
  47. package/dist/cli/commands/core/skill-command.js +7 -4
  48. package/dist/cli/commands/core/standards-command.js +1 -1
  49. package/dist/cli/commands/cron-commands.d.ts +57 -0
  50. package/dist/cli/commands/cron-commands.js +257 -0
  51. package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
  52. package/dist/cli/commands/cron-scheduler-commands.js +284 -0
  53. package/dist/cli/commands/dashboard-commands.d.ts +4 -0
  54. package/dist/cli/commands/dashboard-commands.js +10 -0
  55. package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
  56. package/dist/cli/commands/dashboard-long-run.js +122 -0
  57. package/dist/cli/commands/dashboard-summary.d.ts +12 -0
  58. package/dist/cli/commands/dashboard-summary.js +58 -0
  59. package/dist/cli/commands/dispatch-commands.d.ts +0 -7
  60. package/dist/cli/commands/dispatch-commands.js +372 -8
  61. package/dist/cli/commands/dispatch-from-dag.js +4 -1
  62. package/dist/cli/commands/doc-commands.js +1 -1
  63. package/dist/cli/commands/ecc-commands.d.ts +30 -0
  64. package/dist/cli/commands/ecc-commands.js +119 -0
  65. package/dist/cli/commands/evolution-commands.js +1 -1
  66. package/dist/cli/commands/feedback-commands.js +1 -1
  67. package/dist/cli/commands/final-review-commands.js +1 -1
  68. package/dist/cli/commands/fixture-commands.js +1 -1
  69. package/dist/cli/commands/fork-commands.js +1 -1
  70. package/dist/cli/commands/gate-commands.js +128 -6
  71. package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
  72. package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
  73. package/dist/cli/commands/heartbeat-commands.js +76 -5
  74. package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
  75. package/dist/cli/commands/heartbeat-watch-command.js +146 -0
  76. package/dist/cli/commands/hook-handle.js +1 -1
  77. package/dist/cli/commands/hooks-commands.js +126 -10
  78. package/dist/cli/commands/ide-commands.js +1 -1
  79. package/dist/cli/commands/impact-commands.js +1 -1
  80. package/dist/cli/commands/job-commands.js +34 -1
  81. package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
  82. package/dist/cli/commands/lease-metrics-commands.js +231 -0
  83. package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
  84. package/dist/cli/commands/lease-stats-commands.js +107 -0
  85. package/dist/cli/commands/legacy-commands.js +1 -1
  86. package/dist/cli/commands/log-commands.js +1 -1
  87. package/dist/cli/commands/loop-commands.js +1 -1
  88. package/dist/cli/commands/loop-eval-commands.js +1 -1
  89. package/dist/cli/commands/memory-commands.js +1 -1
  90. package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
  91. package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
  92. package/dist/cli/commands/mut-commands.d.ts +1 -1
  93. package/dist/cli/commands/mut-commands.js +1 -5
  94. package/dist/cli/commands/observability-commands.js +1 -1
  95. package/dist/cli/commands/openspec-commands.js +65 -4
  96. package/dist/cli/commands/perf-audit-commands.js +3 -3
  97. package/dist/cli/commands/perf-commands.js +1 -1
  98. package/dist/cli/commands/polyrepo-commands.js +1 -1
  99. package/dist/cli/commands/prd-blocks-commands.js +1 -1
  100. package/dist/cli/commands/prd-commands.js +4 -2
  101. package/dist/cli/commands/preferences-commands.js +23 -3
  102. package/dist/cli/commands/project-commands.js +1 -1
  103. package/dist/cli/commands/qa-business-review-commands.js +1 -1
  104. package/dist/cli/commands/qa-commands.d.ts +1 -1
  105. package/dist/cli/commands/qa-commands.js +39 -3
  106. package/dist/cli/commands/release-commands.d.ts +15 -0
  107. package/dist/cli/commands/release-commands.js +113 -21
  108. package/dist/cli/commands/request-commands.js +1 -1
  109. package/dist/cli/commands/retrospective-commands.js +1 -1
  110. package/dist/cli/commands/reviewer-commands.js +1 -1
  111. package/dist/cli/commands/role-commands.js +1 -1
  112. package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
  113. package/dist/cli/commands/runtime-commands-helpers.js +24 -0
  114. package/dist/cli/commands/runtime-commands.js +1 -2
  115. package/dist/cli/commands/sc-commands.js +4 -2
  116. package/dist/cli/commands/scan-commands.js +1 -1
  117. package/dist/cli/commands/security-audit-commands.js +3 -3
  118. package/dist/cli/commands/sediment-commands.js +10 -1
  119. package/dist/cli/commands/session-24h-mode.d.ts +26 -0
  120. package/dist/cli/commands/session-24h-mode.js +196 -0
  121. package/dist/cli/commands/share-commands.d.ts +19 -0
  122. package/dist/cli/commands/share-commands.js +121 -2
  123. package/dist/cli/commands/skill-conformance-commands.js +1 -1
  124. package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
  125. package/dist/cli/commands/skill-search-commands.js +4 -1
  126. package/dist/cli/commands/slice-commands.js +1 -1
  127. package/dist/cli/commands/slice-integrate-commands.js +1 -1
  128. package/dist/cli/commands/slice-review-commands.js +1 -1
  129. package/dist/cli/commands/smoke-commands.js +1 -1
  130. package/dist/cli/commands/sop-commands.js +1 -1
  131. package/dist/cli/commands/spill-demo-command.d.ts +7 -0
  132. package/dist/cli/commands/spill-demo-command.js +29 -0
  133. package/dist/cli/commands/statusline-commands.d.ts +12 -0
  134. package/dist/cli/commands/statusline-commands.js +79 -17
  135. package/dist/cli/commands/sub-agent-commands.js +2 -1
  136. package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
  137. package/dist/cli/commands/sub-agent-shared.js +24 -1
  138. package/dist/cli/commands/swarm-commands.d.ts +13 -0
  139. package/dist/cli/commands/swarm-commands.js +77 -0
  140. package/dist/cli/commands/tech-commands.d.ts +64 -0
  141. package/dist/cli/commands/tech-commands.js +195 -0
  142. package/dist/cli/commands/understand-commands.js +1 -1
  143. package/dist/cli/commands/upgrade-commands.d.ts +2 -0
  144. package/dist/cli/commands/upgrade-commands.js +40 -5
  145. package/dist/cli/commands/user-touchpoint-commands.js +1 -1
  146. package/dist/cli/commands/verdict-aggregate-command.js +1 -1
  147. package/dist/cli/commands/vm-commands.d.ts +31 -0
  148. package/dist/cli/commands/vm-commands.js +274 -0
  149. package/dist/cli/commands/workflow-commands.js +24 -1
  150. package/dist/cli/commands/workflow-plan-commands.js +1 -1
  151. package/dist/cli/commands/workspace/init-command.js +1 -1
  152. package/dist/cli/commands/workspace/migrate-command.js +1 -1
  153. package/dist/cli/commands/workspace/reconcile-command.js +1 -1
  154. package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
  155. package/dist/cli/commands/worktree-auth-commands.js +652 -0
  156. package/dist/cli/index.js +58 -13
  157. package/dist/cli/program.d.ts +2 -2
  158. package/dist/cli/program.js +86 -281
  159. package/dist/services/24h-mode/decider.d.ts +103 -0
  160. package/dist/services/24h-mode/decider.js +144 -0
  161. package/dist/services/24h-mode/index.d.ts +12 -0
  162. package/dist/services/24h-mode/index.js +12 -0
  163. package/dist/services/24h-mode/state.d.ts +48 -0
  164. package/dist/services/24h-mode/state.js +51 -0
  165. package/dist/services/24h-mode/store.d.ts +27 -0
  166. package/dist/services/24h-mode/store.js +119 -0
  167. package/dist/services/artifacts/artifact-prerequisites.js +1 -1
  168. package/dist/services/artifacts/request-artifact-service.js +1 -1
  169. package/dist/services/artifacts/workspace-service.js +1 -1
  170. package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
  171. package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
  172. package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
  173. package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
  174. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
  175. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
  176. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
  177. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
  178. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
  179. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
  180. package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
  181. package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
  182. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
  183. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
  184. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
  185. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
  186. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
  187. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
  188. package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
  189. package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
  190. package/dist/services/audit/static-service.d.ts +32 -25
  191. package/dist/services/audit/static-service.js +30 -109
  192. package/dist/services/audit-independent/index.d.ts +2 -0
  193. package/dist/services/audit-independent/index.js +2 -0
  194. package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
  195. package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
  196. package/dist/services/changeset/changeset-check-service.d.ts +22 -0
  197. package/dist/services/changeset/changeset-check-service.js +47 -0
  198. package/dist/services/code/auto-compact-modes.d.ts +30 -0
  199. package/dist/services/code/auto-compact-modes.js +38 -0
  200. package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
  201. package/dist/services/code/auto-compact-orchestrator.js +101 -21
  202. package/dist/services/code/dag-orchestrator.d.ts +30 -1
  203. package/dist/services/code/dag-orchestrator.js +106 -1
  204. package/dist/services/code/status-line-renderer.d.ts +2 -0
  205. package/dist/services/code/status-line-renderer.js +21 -3
  206. package/dist/services/code-review/ocr-service.d.ts +1 -1
  207. package/dist/services/code-review/ocr-service.js +6 -3
  208. package/dist/services/compact-history/compact-history-service.d.ts +41 -0
  209. package/dist/services/compact-history/compact-history-service.js +62 -0
  210. package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
  211. package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
  212. package/dist/services/config/config-service.d.ts +1 -12
  213. package/dist/services/config/config-service.js +3 -72
  214. package/dist/services/config/config-types.d.ts +2 -4
  215. package/dist/services/config/config-types.js +1 -1
  216. package/dist/services/container/container-lease.d.ts +67 -0
  217. package/dist/services/container/container-lease.js +135 -0
  218. package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
  219. package/dist/services/context/auto-compact-dispatcher.js +32 -102
  220. package/dist/services/context/auto-compact-reader.js +1 -1
  221. package/dist/services/context/auto-compact-types.d.ts +27 -2
  222. package/dist/services/context/auto-compact-types.js +8 -1
  223. package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
  224. package/dist/services/context/build-dispatch-system-prompt.js +117 -0
  225. package/dist/services/context/collector.d.ts +2 -2
  226. package/dist/services/context/context-builder.d.ts +4 -4
  227. package/dist/services/context/context-schema.d.ts +48 -48
  228. package/dist/services/context/ide-detect.d.ts +4 -0
  229. package/dist/services/context/ide-detect.js +24 -0
  230. package/dist/services/context/main-session-monitor.d.ts +1 -4
  231. package/dist/services/context/main-session-monitor.js +1 -24
  232. package/dist/services/context/memory-index-reader.d.ts +8 -0
  233. package/dist/services/context/memory-index-reader.js +57 -0
  234. package/dist/services/context/memory-lru-cache.d.ts +12 -0
  235. package/dist/services/context/memory-lru-cache.js +60 -0
  236. package/dist/services/context/memory-preflight-config.d.ts +19 -0
  237. package/dist/services/context/memory-preflight-config.js +25 -0
  238. package/dist/services/context/memory-preflight-service.d.ts +19 -0
  239. package/dist/services/context/memory-preflight-service.js +120 -0
  240. package/dist/services/context/spillover-store.d.ts +23 -0
  241. package/dist/services/context/spillover-store.js +155 -0
  242. package/dist/services/context/spillover-types.d.ts +18 -0
  243. package/dist/services/context/spillover-types.js +1 -0
  244. package/dist/services/crystallization/crystallization-service.d.ts +22 -5
  245. package/dist/services/crystallization/crystallization-service.js +8 -14
  246. package/dist/services/crystallization/crystallization-types.d.ts +6 -6
  247. package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
  248. package/dist/services/crystallization/index.d.ts +13 -0
  249. package/dist/services/crystallization/index.js +13 -0
  250. package/dist/services/dashboard/project-dashboard-service.js +2 -2
  251. package/dist/services/dispatch/await-batch.d.ts +70 -0
  252. package/dist/services/dispatch/await-batch.js +272 -0
  253. package/dist/services/dispatch/batch-counter.js +1 -1
  254. package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
  255. package/dist/services/dispatch/dispatch-record-writer.js +239 -9
  256. package/dist/services/dispatch/slice-dag.d.ts +46 -0
  257. package/dist/services/dispatch/slice-dag.js +6 -0
  258. package/dist/services/dispatch/stage-enum.d.ts +27 -0
  259. package/dist/services/dispatch/stage-enum.js +48 -0
  260. package/dist/services/dispatch/startup-timeout.d.ts +86 -0
  261. package/dist/services/dispatch/startup-timeout.js +97 -0
  262. package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
  263. package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
  264. package/dist/services/dispatch/test-tool-detection.js +80 -0
  265. package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
  266. package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
  267. package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
  268. package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
  269. package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
  270. package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
  271. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
  272. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
  273. package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
  274. package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
  275. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
  276. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
  277. package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
  278. package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
  279. package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
  280. package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
  281. package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
  282. package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
  283. package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
  284. package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
  285. package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
  286. package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
  287. package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
  288. package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
  289. package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
  290. package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
  291. package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
  292. package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
  293. package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
  294. package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
  295. package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
  296. package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
  297. package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
  298. package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
  299. package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
  300. package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
  301. package/dist/services/doctor/doctor-service/index.d.ts +48 -0
  302. package/dist/services/doctor/doctor-service/index.js +254 -0
  303. package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
  304. package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
  305. package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
  306. package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
  307. package/dist/services/doctor/doctor-service/types.d.ts +245 -0
  308. package/dist/services/doctor/doctor-service/types.js +15 -0
  309. package/dist/services/doctor/doctor-service.d.ts +15 -146
  310. package/dist/services/doctor/doctor-service.js +22 -926
  311. package/dist/services/doctor/index.d.ts +22 -0
  312. package/dist/services/doctor/index.js +22 -0
  313. package/dist/services/env/shell-probe.d.ts +71 -0
  314. package/dist/services/env/shell-probe.js +161 -0
  315. package/dist/services/evolution/evolution-types.d.ts +39 -39
  316. package/dist/services/final-review/final-review-service.d.ts +11 -1
  317. package/dist/services/final-review/index.d.ts +2 -0
  318. package/dist/services/final-review/index.js +1 -0
  319. package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
  320. package/dist/services/hooks/auto-compact-hook-install.js +4 -5
  321. package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
  322. package/dist/services/hooks/worktree-authorization-gate.js +492 -0
  323. package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
  324. package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
  325. package/dist/services/ide/adapters/qoder-adapter.js +57 -0
  326. package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
  327. package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
  328. package/dist/services/ide/ide-registry.js +6 -0
  329. package/dist/services/ide/ide-types.d.ts +1 -1
  330. package/dist/services/job/job-types.d.ts +56 -56
  331. package/dist/services/job-snapshot/index.d.ts +8 -0
  332. package/dist/services/job-snapshot/index.js +7 -0
  333. package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
  334. package/dist/services/job-snapshot/types.d.ts +7 -0
  335. package/dist/services/job-snapshot/types.js +1 -0
  336. package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
  337. package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
  338. package/dist/services/log/retention.d.ts +16 -0
  339. package/dist/services/log/retention.js +17 -0
  340. package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
  341. package/dist/services/loop/loop-release-types.d.ts +24 -24
  342. package/dist/services/loop/monotonic-runner.d.ts +17 -11
  343. package/dist/services/loop/monotonic-runner.js +118 -79
  344. package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
  345. package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
  346. package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
  347. package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
  348. package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
  349. package/dist/services/memory/project-memory-service/index/search.js +194 -0
  350. package/dist/services/memory/project-memory-service/index.d.ts +9 -0
  351. package/dist/services/memory/project-memory-service/index.js +24 -0
  352. package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
  353. package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
  354. package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
  355. package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
  356. package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
  357. package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
  358. package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
  359. package/dist/services/memory/project-memory-service/store/paths.js +116 -0
  360. package/dist/services/memory/project-memory-service/types.d.ts +128 -0
  361. package/dist/services/memory/project-memory-service/types.js +9 -0
  362. package/dist/services/memory/project-memory-service.d.ts +1 -167
  363. package/dist/services/memory/project-memory-service.js +19 -816
  364. package/dist/services/migrate-skill-name/schema.d.ts +2 -2
  365. package/dist/services/observability/aggregation.d.ts +27 -0
  366. package/dist/services/observability/aggregation.js +72 -0
  367. package/dist/services/observability/observability-service.d.ts +73 -7
  368. package/dist/services/observability/observability-service.js +87 -1
  369. package/dist/services/openspec/artifact-boundary.d.ts +138 -0
  370. package/dist/services/openspec/artifact-boundary.js +150 -0
  371. package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
  372. package/dist/services/openspec/coverage-evidence-reader.js +386 -0
  373. package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
  374. package/dist/services/openspec/openspec-archive-service.js +320 -8
  375. package/dist/services/openspec/openspec-bridge-service.js +1 -1
  376. package/dist/services/openspec/openspec-init-service.js +1 -1
  377. package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
  378. package/dist/services/openspec/openspec-render-service.js +7 -4
  379. package/dist/services/openspec/openspec-scan-service.js +1 -1
  380. package/dist/services/openspec/openspec-validate-service.js +5 -4
  381. package/dist/services/preferences/preferences-service.js +10 -0
  382. package/dist/services/preferences/preferences-types.d.ts +13 -0
  383. package/dist/services/preferences/preferences-types.js +11 -0
  384. package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
  385. package/dist/services/qa/screenshot-archive-service.js +134 -0
  386. package/dist/services/rd/rd-service.js +10 -11
  387. package/dist/services/rd/types.d.ts +32 -32
  388. package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
  389. package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
  390. package/dist/services/recommendations/capability-seed-items.js +0 -1
  391. package/dist/services/recommendations/capability-seed-mappings.js +0 -1
  392. package/dist/services/recommendations/capability-seed-sources.js +0 -1
  393. package/dist/services/release/version-precheck-service.d.ts +51 -0
  394. package/dist/services/release/version-precheck-service.js +257 -0
  395. package/dist/services/scan/acceptance-coverage-service.js +1 -1
  396. package/dist/services/scan/archetype-service.js +1 -1
  397. package/dist/services/scan/existing-system-service.js +1 -1
  398. package/dist/services/scan/libraries-service.js +1 -1
  399. package/dist/services/sediment/json-schema.d.ts +40 -40
  400. package/dist/services/share/bundle-types.d.ts +12 -12
  401. package/dist/services/share/run-state-contract.d.ts +2 -2
  402. package/dist/services/skill/skill-search-service.d.ts +12 -7
  403. package/dist/services/skill/skill-search-service.js +8 -4
  404. package/dist/services/skillhub/migrations/001-initial.sql +71 -0
  405. package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
  406. package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
  407. package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
  408. package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
  409. package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
  410. package/dist/services/skills/hooks-settings-service.d.ts +75 -0
  411. package/dist/services/skills/hooks-settings-service.js +230 -2
  412. package/dist/services/skills/skill-registry.d.ts +1 -0
  413. package/dist/services/skills/skill-registry.js +6 -4
  414. package/dist/services/skills/skill-runbook-service.js +1 -1
  415. package/dist/services/slice/slice-check-service.js +1 -1
  416. package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
  417. package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
  418. package/dist/services/standards/missing-standards-detector.d.ts +25 -0
  419. package/dist/services/standards/missing-standards-detector.js +43 -12
  420. package/dist/services/tech/tech-change-id-service.d.ts +82 -0
  421. package/dist/services/tech/tech-change-id-service.js +117 -0
  422. package/dist/services/understand/understand-hybrid-service.js +1 -1
  423. package/dist/services/understand/understand-scan-service.js +2 -2
  424. package/dist/services/upgrade/upgrade-service.js +4 -3
  425. package/dist/services/verdict/envelopes.d.ts +2 -2
  426. package/dist/services/verdict/envelopes.js +2 -2
  427. package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
  428. package/dist/services/vm/vm-lease.d.ts +40 -0
  429. package/dist/services/vm/vm-lease.js +137 -0
  430. package/dist/services/workflow/autonomous-resume-writer.js +1 -1
  431. package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
  432. package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
  433. package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
  434. package/dist/services/workflow/pipeline-verify-service.js +42 -218
  435. package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
  436. package/dist/services/workflow/pipeline-verify-types.js +10 -0
  437. package/dist/services/workflow/plan-reader.d.ts +1 -1
  438. package/dist/services/workflow/plan-reader.js +1 -1
  439. package/dist/services/workflow/plan-refresher.d.ts +1 -1
  440. package/dist/services/workflow/plan-refresher.js +1 -1
  441. package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
  442. package/dist/services/workflow/plan-trigger-detector.js +1 -1
  443. package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
  444. package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
  445. package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
  446. package/dist/services/workflow/workflow-autonomous-types.js +21 -0
  447. package/dist/services/workflow/workflow-router-service.js +18 -16
  448. package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
  449. package/dist/services/workflow/workflow-spec-lint.js +75 -0
  450. package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
  451. package/dist/services/workflow/workflow-spec-types.js +13 -0
  452. package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
  453. package/dist/services/workflow/workflow-spec-yaml.js +88 -0
  454. package/dist/services/workflow/workflow-spec.d.ts +11 -91
  455. package/dist/services/workflow/workflow-spec.js +16 -145
  456. package/dist/services/workspace/migrate-service.js +1 -1
  457. package/dist/services/workspace/workspace-service.js +1 -1
  458. package/dist/services/worktree/worktree-lease.d.ts +170 -0
  459. package/dist/services/worktree/worktree-lease.js +242 -0
  460. package/package.json +47 -51
  461. package/scripts/clean-dist.mjs +31 -1
  462. package/scripts/copy-templates.mjs +16 -0
  463. package/scripts/sync-version.mjs +53 -2
  464. package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
  465. package/skills/bee/peaks-prd/SKILL.md +16 -0
  466. package/skills/bee/peaks-prd/test-prompts.json +12 -0
  467. package/skills/bee/peaks-qa/SKILL.md +16 -1
  468. package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
  469. package/skills/bee/peaks-qa/test-prompts.json +12 -0
  470. package/skills/bee/peaks-rd/SKILL.md +29 -20
  471. package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
  472. package/skills/bee/peaks-rd/test-prompts.json +12 -0
  473. package/skills/bee/peaks-reviewer/SKILL.md +17 -0
  474. package/skills/bee/peaks-sc/SKILL.md +16 -0
  475. package/skills/bee/peaks-security-audit/SKILL.md +17 -0
  476. package/skills/bee/peaks-txt/SKILL.md +16 -0
  477. package/skills/bee/peaks-txt/test-prompts.json +12 -0
  478. package/skills/bee/peaks-ui/SKILL.md +49 -43
  479. package/skills/bee/peaks-ui/test-prompts.json +12 -0
  480. package/skills/peaks-code/SKILL.md +54 -109
  481. package/skills/peaks-code/references/boundaries.md +15 -1
  482. package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
  483. package/skills/peaks-code/references/external-skill-invocation.md +27 -0
  484. package/skills/peaks-code/references/lease-dashboard.html +224 -0
  485. package/skills/peaks-code/references/lease-stats.sample.json +26 -0
  486. package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
  487. package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
  488. package/skills/peaks-code/references/runbook.md +63 -1
  489. package/skills/peaks-code/references/startup-sequence.md +110 -0
  490. package/skills/peaks-code/references/step-0-8-gate.md +1 -1
  491. package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
  492. package/skills/peaks-code/references/worktree-governance.md +123 -0
  493. package/skills/peaks-code/test-prompts.json +12 -0
  494. package/skills/peaks-doctor/SKILL.md +1 -1
  495. package/skills/peaks-ide/SKILL.md +1 -1
  496. package/skills/peaks-solo/SKILL.md +21 -0
  497. package/skills/peaks-solo/references/triage-decision-table.md +6 -0
  498. package/skills/peaks-sop/test-prompts.json +17 -0
  499. package/dist/cli/commands/agent-commands.d.ts +0 -20
  500. package/dist/cli/commands/agent-commands.js +0 -48
  501. package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
  502. package/dist/cli/commands/classify-classify-commands.js +0 -151
  503. package/dist/cli/commands/contract-commands.d.ts +0 -26
  504. package/dist/cli/commands/contract-commands.js +0 -114
  505. package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
  506. package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
  507. package/dist/cli/commands/worker-commands.d.ts +0 -3
  508. package/dist/cli/commands/worker-commands.js +0 -52
  509. package/dist/services/agent/ecc-agent-service.d.ts +0 -47
  510. package/dist/services/agent/ecc-agent-service.js +0 -143
  511. package/dist/services/config/provider-service.d.ts +0 -48
  512. package/dist/services/config/provider-service.js +0 -143
  513. package/dist/services/context/dispatch-context-guard.d.ts +0 -27
  514. package/dist/services/context/dispatch-context-guard.js +0 -192
  515. package/dist/services/context/shared-channel.d.ts +0 -93
  516. package/dist/services/context/shared-channel.js +0 -308
  517. package/dist/services/filesystem/file-lock.d.ts +0 -11
  518. package/dist/services/filesystem/file-lock.js +0 -152
  519. package/dist/services/mut/assert-scanner.d.ts +0 -6
  520. package/dist/services/mut/assert-scanner.js +0 -116
  521. package/dist/services/mut/index.d.ts +0 -8
  522. package/dist/services/mut/index.js +0 -7
  523. package/dist/services/mut/mut-runner.d.ts +0 -39
  524. package/dist/services/mut/mut-runner.js +0 -29
  525. package/dist/services/mut/production-stryker.d.ts +0 -2
  526. package/dist/services/mut/production-stryker.js +0 -75
  527. package/dist/services/mut/report-builder.d.ts +0 -11
  528. package/dist/services/mut/report-builder.js +0 -110
  529. package/dist/services/mut/report-loader.d.ts +0 -31
  530. package/dist/services/mut/report-loader.js +0 -78
  531. package/dist/services/mut/thresholds.d.ts +0 -21
  532. package/dist/services/mut/thresholds.js +0 -22
  533. package/dist/services/mut/types.d.ts +0 -336
  534. package/dist/services/mut/types.js +0 -59
  535. package/dist/services/providers/minimax-provider-service.d.ts +0 -24
  536. package/dist/services/providers/minimax-provider-service.js +0 -143
  537. package/dist/services/providers/minimax-worker-service.d.ts +0 -21
  538. package/dist/services/providers/minimax-worker-service.js +0 -83
  539. package/dist/shared/fs.d.ts +0 -4
  540. package/dist/shared/fs.js +0 -26
  541. package/dist/shared/paths.d.ts +0 -6
  542. package/dist/shared/paths.js +0 -50
  543. package/dist/shared/result.d.ts +0 -22
  544. package/dist/shared/result.js +0 -46
  545. package/dist/shared/version.d.ts +0 -1
  546. package/dist/shared/version.js +0 -1
  547. package/examples/video-demo/README.md +0 -142
  548. package/examples/video-demo/out/en-closing-960.png +0 -0
  549. package/examples/video-demo/out/zh-closing-960.png +0 -0
  550. package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
  551. package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
  552. /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
@@ -0,0 +1,31 @@
1
+ import type { Command } from 'commander';
2
+ import { type DispatchRecord } from '../../services/dispatch/dispatch-record-writer.js';
3
+ import { summarize, viewSubAgent } from '../../services/code/status-line-renderer.js';
4
+ import { type ProgramIO } from '../cli-helpers.js';
5
+ declare const DEFAULT_INTERVAL_MS = 10000;
6
+ declare const DEFAULT_STALE_THRESHOLD_MS: number;
7
+ type WatchSnapshot = {
8
+ readonly records: readonly DispatchRecord[];
9
+ readonly line: string;
10
+ readonly summary: ReturnType<typeof summarize>;
11
+ readonly views: readonly ReturnType<typeof viewSubAgent>[];
12
+ readonly stale: {
13
+ readonly count: number;
14
+ readonly thresholdSec: number;
15
+ readonly customThresholdSec: number;
16
+ readonly views: readonly ReturnType<typeof viewSubAgent>[];
17
+ };
18
+ };
19
+ declare function parsePositiveMs(raw: string | undefined, fallback: number, flag: string): number;
20
+ declare function findBatchRecords(projectRoot: string, sessionId: string, batchId: string): DispatchRecord[];
21
+ declare function snapshot(records: readonly DispatchRecord[], batchId: string, staleThresholdMs: number, now?: () => Date): WatchSnapshot;
22
+ declare function isTerminal(records: readonly DispatchRecord[]): boolean;
23
+ /** Register the independently runnable `peaks heartbeat watch` daemon. */
24
+ export declare function registerHeartbeatWatchCommand(parent: Command, io: ProgramIO): void;
25
+ export declare const __test__: {
26
+ findBatchRecords: typeof findBatchRecords;
27
+ isTerminal: typeof isTerminal;
28
+ parsePositiveMs: typeof parsePositiveMs;
29
+ snapshot: typeof snapshot;
30
+ };
31
+ export { DEFAULT_INTERVAL_MS, DEFAULT_STALE_THRESHOLD_MS };
@@ -0,0 +1,146 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
4
+ import { getSessionIdCanonical } from '../../services/session/session-manager.js';
5
+ import { readRecords } from '../../services/dispatch/dispatch-record-writer.js';
6
+ import { renderStatusLine, summarize, viewSubAgent } from '../../services/code/status-line-renderer.js';
7
+ import { getErrorMessage } from '../cli-helpers.js';
8
+ const DEFAULT_INTERVAL_MS = 10_000;
9
+ const DEFAULT_STALE_THRESHOLD_MS = 5 * 60 * 1000;
10
+ const TERMINAL_STATUSES = new Set([
11
+ 'done',
12
+ 'failed',
13
+ 'cancelled',
14
+ 'no-execution'
15
+ ]);
16
+ function parsePositiveMs(raw, fallback, flag) {
17
+ if (raw === undefined)
18
+ return fallback;
19
+ const value = Number(raw);
20
+ if (!Number.isInteger(value) || value <= 0) {
21
+ throw new Error(`${flag} must be a positive integer (got ${raw})`);
22
+ }
23
+ return value;
24
+ }
25
+ function parseMaxTicks(raw) {
26
+ if (raw === undefined)
27
+ return Number.POSITIVE_INFINITY;
28
+ const value = Number(raw);
29
+ if (!Number.isInteger(value) || value <= 0) {
30
+ throw new Error(`--max-ticks must be a positive integer (got ${raw})`);
31
+ }
32
+ return value;
33
+ }
34
+ function findBatchRecords(projectRoot, sessionId, batchId) {
35
+ const sessionDir = resolve(projectRoot, '.peaks', '_sub_agents', sessionId);
36
+ if (!existsSync(sessionDir))
37
+ return [];
38
+ const paths = readdirSync(sessionDir)
39
+ .filter((name) => /^dispatch-[^/\\]+\.json$/.test(name))
40
+ .map((name) => join(sessionDir, name));
41
+ return readRecords(paths).filter((record) => record.batchId === batchId);
42
+ }
43
+ function snapshot(records, batchId, staleThresholdMs, now = () => new Date()) {
44
+ const prefix = `[peaks-heartbeat:${batchId}]`;
45
+ const summary = summarize(records);
46
+ const views = records.map((record) => viewSubAgent(record, now));
47
+ const customThresholdSec = Math.floor(staleThresholdMs / 1000);
48
+ const staleViews = views.filter((view) => view.lastBeatAgoSec !== null && view.lastBeatAgoSec > customThresholdSec);
49
+ let line = renderStatusLine(prefix, records, now);
50
+ if (staleThresholdMs > DEFAULT_STALE_THRESHOLD_MS) {
51
+ line = line.replaceAll(' ⚠ stale', '');
52
+ }
53
+ else if (staleThresholdMs < DEFAULT_STALE_THRESHOLD_MS) {
54
+ const staleRoles = new Set(staleViews.map((view) => view.role));
55
+ if (staleRoles.size > 0 && !line.includes('⚠ stale')) {
56
+ line += ` ⚠ stale (${[...staleRoles].join(', ')})`;
57
+ }
58
+ }
59
+ return {
60
+ records,
61
+ line,
62
+ summary,
63
+ views,
64
+ stale: {
65
+ count: staleViews.length,
66
+ thresholdSec: Math.floor(DEFAULT_STALE_THRESHOLD_MS / 1000),
67
+ customThresholdSec,
68
+ views: staleViews
69
+ }
70
+ };
71
+ }
72
+ function isTerminal(records) {
73
+ return records.length > 0 && records.every((record) => TERMINAL_STATUSES.has(record.status));
74
+ }
75
+ function emit(io, value, json) {
76
+ if (json) {
77
+ io.stdout(`${JSON.stringify({ ok: true, data: value })}\n`);
78
+ }
79
+ else {
80
+ io.stdout(`${value.line}\n`);
81
+ }
82
+ }
83
+ /** Register the independently runnable `peaks heartbeat watch` daemon. */
84
+ export function registerHeartbeatWatchCommand(parent, io) {
85
+ parent
86
+ .command('watch')
87
+ .description('Watch persisted sub-agent heartbeat records for one batch')
88
+ .requiredOption('--batch-id <id>', 'batch id to watch')
89
+ .option('--interval-ms <n>', `poll interval in milliseconds (default ${DEFAULT_INTERVAL_MS})`)
90
+ .option('--stale-threshold-ms <n>', `stale threshold in milliseconds (default ${DEFAULT_STALE_THRESHOLD_MS})`)
91
+ .option('--max-ticks <n>', 'stop after n ticks (test/diagnostic seam)')
92
+ .option('--project <path>', 'project root (defaults to current directory)')
93
+ .option('--session-id <id>', 'session id (defaults to the active binding)')
94
+ .option('--json', 'emit one JSON envelope per poll tick')
95
+ .action(async (options) => {
96
+ try {
97
+ const intervalMs = parsePositiveMs(options.intervalMs, DEFAULT_INTERVAL_MS, '--interval-ms');
98
+ const staleThresholdMs = parsePositiveMs(options.staleThresholdMs, DEFAULT_STALE_THRESHOLD_MS, '--stale-threshold-ms');
99
+ const maxTicks = parseMaxTicks(options.maxTicks);
100
+ const projectRoot = resolveCanonicalProjectRoot(options.project ?? process.cwd());
101
+ const sessionId = options.sessionId ?? getSessionIdCanonical(projectRoot);
102
+ if (!sessionId)
103
+ throw new Error('no active session; pass --session-id');
104
+ const tick = () => {
105
+ const records = findBatchRecords(projectRoot, sessionId, options.batchId);
106
+ const current = snapshot(records, options.batchId, staleThresholdMs);
107
+ emit(io, current, options.json === true);
108
+ return isTerminal(records);
109
+ };
110
+ if (tick())
111
+ return;
112
+ let count = 1;
113
+ await new Promise((resolveWait, reject) => {
114
+ const timer = setInterval(() => {
115
+ try {
116
+ count += 1;
117
+ if (tick() || count >= maxTicks) {
118
+ clearInterval(timer);
119
+ resolveWait();
120
+ }
121
+ }
122
+ catch (error) {
123
+ clearInterval(timer);
124
+ reject(error);
125
+ }
126
+ }, intervalMs);
127
+ timer.unref?.();
128
+ });
129
+ }
130
+ catch (error) {
131
+ const message = getErrorMessage(error);
132
+ if (options.json === true)
133
+ io.stdout(`${JSON.stringify({ ok: false, code: 'HEARTBEAT_WATCH_FAILED', message })}\n`);
134
+ else
135
+ io.stderr(`HEARTBEAT_WATCH_FAILED: ${message}\n`);
136
+ process.exitCode = 1;
137
+ }
138
+ });
139
+ }
140
+ export const __test__ = {
141
+ findBatchRecords,
142
+ isTerminal,
143
+ parsePositiveMs,
144
+ snapshot
145
+ };
146
+ export { DEFAULT_INTERVAL_MS, DEFAULT_STALE_THRESHOLD_MS };
@@ -6,7 +6,7 @@ import { evaluateCodeBan } from '../../services/audit/enforcers/code-ban.js';
6
6
  import { isRootWrite } from '../../services/audit/enforcers/no-root-pollution.js';
7
7
  import { checkLoginGate } from '../../services/audit/enforcers/login-gate.js';
8
8
  import { resolveActiveSkillForCaller } from '../../services/audit/enforcers/active-skill-resolver.js';
9
- import { fail, ok } from '../../shared/result.js';
9
+ import { fail, ok } from 'peaks-loop-shared/result';
10
10
  import { emitDecision, emitHint } from '../../services/hooks/output.js';
11
11
  /**
12
12
  * Read the hook payload. `PEAKS_HOOK_STDIN` is a test seam (same convention as
@@ -1,8 +1,9 @@
1
- import { existsSync } from 'node:fs';
2
- import { fail, ok } from '../../shared/result.js';
1
+ import { existsSync, copyFileSync, mkdirSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fail, ok } from 'peaks-loop-shared/result';
3
4
  import { addJsonOption, printResult, getErrorMessage } from '../cli-helpers.js';
4
5
  import { findProjectRoot } from '../../services/config/config-safety.js';
5
- import { applyHookInstall, planHookInstall, readHookStatus, readInstalledEntriesFromSettings, removeHookInstall } from '../../services/skills/hooks-settings-service.js';
6
+ import { applyHookInstall, planHookInstall, readHookStatus, readInstalledEntriesFromSettings, removeHookInstall, listSuperpowersDenyEntries } from '../../services/skills/hooks-settings-service.js';
6
7
  import { readJsonObjectFile } from '../../services/ide/shared/atomic-json.js';
7
8
  import { detectIdeFromContext } from '../../services/ide/hook-translator.js';
8
9
  import { getAdapter } from '../../services/ide/ide-registry.js';
@@ -44,6 +45,59 @@ function listExpectedEntriesForIde(ide, _skipProgress = false) {
44
45
  }
45
46
  return [{ matcher: adapter.toolMatcher, sentinel: 'peaks gate enforce' }];
46
47
  }
48
+ /**
49
+ * Slice 2026-07-24-peaks-code-bridge-002-rootcause (G6b / G10): copy the
50
+ * superpowers-bridge hook source from the peaks-loop repo
51
+ * (src/services/hooks/pre-tool-superpowers-bridge.sh) into the user-global
52
+ * `<userHome>/.claude/skills/peaks-code/hooks/` directory. The user-global
53
+ * copy is treated as a build artifact: it MUST be byte-identical to the
54
+ * repo source after install, and the source of truth is the repo file.
55
+ *
56
+ * Why this lives in the install command: the install is the single
57
+ * declared surface where the user-global directory is touched. Adding it
58
+ * here keeps the "hooks only ship from src/services/hooks/" invariant
59
+ * (G10 / AC10) — no other code path writes to `~/.claude/skills/peaks-code/hooks/`.
60
+ *
61
+ * Failure modes:
62
+ * - Source file missing (build not run yet) → silently skip and emit a
63
+ * warning. The settings.json install still succeeds; only the script
64
+ * distribution is skipped. Matches the "release-pack silent skip
65
+ * when tarball lacks dist/version.js" pattern from commit 08d93353.
66
+ * - Target directory unwritable → throw so the user knows.
67
+ * - Target file already exists with identical bytes → no-op.
68
+ * - Target file exists with different bytes → overwrite (the repo
69
+ * source is authoritative).
70
+ *
71
+ * Returns `{ copied, source, target }` so the install envelope can report
72
+ * it without forcing the caller to inspect the filesystem.
73
+ */
74
+ /**
75
+ * Slice 2026-07-29-worktree-layer3-deny: read the on-disk
76
+ * `permissions.deny` block from a settings.json object and return
77
+ * every peaks-managed entry currently present. Used by `hooks status`
78
+ * to surface Layer 3 governance state without forcing the caller to
79
+ * re-read the file. Tolerant of missing / malformed `permissions` —
80
+ * a missing field returns an empty array, never throws.
81
+ */
82
+ function readOnDiskDenyEntries(settings) {
83
+ const permissions = settings.permissions;
84
+ if (!permissions || typeof permissions !== 'object' || Array.isArray(permissions))
85
+ return [];
86
+ const deny = permissions.deny;
87
+ if (!Array.isArray(deny))
88
+ return [];
89
+ return deny.filter((d) => typeof d === 'string');
90
+ }
91
+ function copyBridgeHookIfPresent(userHome) {
92
+ const source = resolve(__dirname, '..', '..', 'services', 'hooks', 'pre-tool-superpowers-bridge.sh');
93
+ const target = resolve(userHome, '.claude', 'skills', 'peaks-code', 'hooks', 'pre-tool-superpowers-bridge.sh');
94
+ if (!existsSync(source)) {
95
+ return { copied: false, source, target };
96
+ }
97
+ mkdirSync(dirname(target), { recursive: true });
98
+ copyFileSync(source, target);
99
+ return { copied: true, source, target };
100
+ }
47
101
  export function registerHooksCommands(program, io) {
48
102
  const hooks = program
49
103
  .command('hooks')
@@ -64,14 +118,31 @@ export function registerHooksCommands(program, io) {
64
118
  if (options.dryRun === true) {
65
119
  const plan = planHookInstall(scope, projectRoot, { ide, skipProgress });
66
120
  const dryRunEntries = listExpectedEntriesForIde(ide, skipProgress);
121
+ const bridgeCopy = scope === 'global'
122
+ ? copyBridgeHookIfPresent(process.env.USERPROFILE ?? process.env.HOME ?? '')
123
+ : { copied: false, source: '', target: '' };
67
124
  printResult(io, ok('hooks.install', {
68
125
  ...plan,
69
126
  ide,
70
127
  applied: false,
71
128
  dryRun: true,
72
129
  skipProgress,
73
- entries: dryRunEntries
74
- }, [], [`would install ${dryRunEntries.length} peaks-managed hook entries`]), options.json);
130
+ entries: dryRunEntries,
131
+ bridgeHookCopy: bridgeCopy,
132
+ // Slice 2026-07-29-worktree-layer3-deny: surface the
133
+ // Layer 3 deny entries the install WOULD write. The
134
+ // dry-run branch never actually invokes
135
+ // `applyHookInstall`, so the on-disk snapshot is not
136
+ // consulted here — the list is the desired-state
137
+ // constant for clarity in the JSON envelope.
138
+ permissionsDenyEntries: listSuperpowersDenyEntries()
139
+ }, [], [
140
+ `would install ${dryRunEntries.length} peaks-managed hook entries`,
141
+ `would write ${listSuperpowersDenyEntries().length} permissions.deny entries (Layer 3 worktree governance)`,
142
+ bridgeCopy.copied
143
+ ? `would copy bridge hook from ${bridgeCopy.source} to ${bridgeCopy.target}`
144
+ : 'would not copy bridge hook (source missing or non-global scope)'
145
+ ]), options.json);
75
146
  return;
76
147
  }
77
148
  const result = applyHookInstall(scope, projectRoot, { ide, skipProgress });
@@ -82,18 +153,44 @@ export function registerHooksCommands(program, io) {
82
153
  // entry; the summary mirrors the install shape, NOT a hardcoded
83
154
  // expected list.
84
155
  const installedEntries = listExpectedEntriesForIde(ide, skipProgress);
156
+ // Slice 2026-07-24-peaks-code-bridge-002-rootcause (G6b / G10): when
157
+ // the install targets global scope, also copy the superpowers-bridge
158
+ // hook script from src/services/hooks/ to the user-global hooks
159
+ // directory. Project scope does not need this — project's
160
+ // .claude/skills/peaks-code is already a junction into the npm source.
161
+ const bridgeCopy = scope === 'global'
162
+ ? copyBridgeHookIfPresent(process.env.USERPROFILE ?? process.env.HOME ?? '')
163
+ : { copied: false, source: '', target: '' };
85
164
  const nextActions = result.applied
86
165
  ? [
87
166
  'Restart the IDE (or reload the workspace) so the hook entries take effect',
88
- `Installed: ${installedEntries.map((e) => `${e.matcher}→${e.sentinel}`).join(', ')}`
167
+ `Installed: ${installedEntries.map((e) => `${e.matcher}→${e.sentinel}`).join(', ')}`,
168
+ // Slice 2026-07-29-worktree-layer3-deny: surface L3 deny
169
+ // write alongside the hook install — single atomic write.
170
+ `Layer 3 deny: wrote ${listSuperpowersDenyEntries().length} permissions.deny entries (worktree governance)`,
171
+ bridgeCopy.copied
172
+ ? `Copied bridge hook: ${bridgeCopy.target}`
173
+ : 'Bridge hook not copied (source missing or non-global scope)'
89
174
  ]
90
- : [];
175
+ : (bridgeCopy.copied
176
+ ? [`Bridge hook copied: ${bridgeCopy.target}`]
177
+ : []);
178
+ // Slice 2026-07-29-worktree-layer3-deny: emit L3 deny bookkeeping
179
+ // in the JSON envelope so downstream automation (audit / sc) can
180
+ // confirm Layer 3 was applied without re-reading the file. When
181
+ // the install is a no-op (`applied: false`) the deny block was
182
+ // already on disk from a prior install; we still emit the
183
+ // current desired list for symmetry with the dry-run envelope.
184
+ const denyEntries = listSuperpowersDenyEntries();
91
185
  printResult(io, ok('hooks.install', {
92
186
  ...result,
93
187
  ide,
94
188
  dryRun: false,
95
189
  skipProgress,
96
- entries: installedEntries.map((e) => ({ matcher: e.matcher, sentinel: e.sentinel }))
190
+ entries: installedEntries.map((e) => ({ matcher: e.matcher, sentinel: e.sentinel })),
191
+ bridgeHookCopy: bridgeCopy,
192
+ permissionsDenyApplied: result.applied,
193
+ permissionsDenyEntries: denyEntries
97
194
  }, [], nextActions), options.json);
98
195
  }
99
196
  catch (error) {
@@ -113,7 +210,16 @@ export function registerHooksCommands(program, io) {
113
210
  const ide = resolveIdeForCommand(options, projectRoot);
114
211
  try {
115
212
  const result = removeHookInstall(scope, projectRoot, { ide });
116
- printResult(io, ok('hooks.uninstall', { ...result, ide }), options.json);
213
+ // Slice 2026-07-29-worktree-layer3-deny: surface L3 deny removal
214
+ // bookkeeping. `permissionsDenyRemoved` mirrors `removed` (the
215
+ // service strips deny entries on the same atomic write that
216
+ // strips the hook entries; they share the same boolean).
217
+ printResult(io, ok('hooks.uninstall', {
218
+ ...result,
219
+ ide,
220
+ permissionsDenyRemoved: result.removed,
221
+ permissionsDenyEntries: listSuperpowersDenyEntries()
222
+ }), options.json);
117
223
  }
118
224
  catch (error) {
119
225
  const message = getErrorMessage(error);
@@ -141,10 +247,20 @@ export function registerHooksCommands(program, io) {
141
247
  // install left behind.
142
248
  const settingsPath = status.settingsPath;
143
249
  const settings = existsSync(settingsPath) ? readJsonObjectFile(settingsPath) : {};
250
+ // Slice 2026-07-29-worktree-layer3-deny: report the Layer 3 deny
251
+ // entries actually on disk. We read the existing settings.json
252
+ // (above) and surface its `permissions.deny` block. Any entry
253
+ // that matches the current `SUPERPOWERS_DENIED_SKILLS` set is
254
+ // considered "peaks-managed"; user-written entries are passed
255
+ // through verbatim so the envelope reflects reality. The desired
256
+ // list is also included for parity with install / uninstall.
257
+ const onDiskDeny = readOnDiskDenyEntries(settings);
144
258
  printResult(io, ok('hooks.status', {
145
259
  ...status,
146
260
  ide,
147
- entries: readInstalledEntriesFromSettings(settings, ide)
261
+ entries: readInstalledEntriesFromSettings(settings, ide),
262
+ permissionsDenyEntries: listSuperpowersDenyEntries(),
263
+ permissionsDenyOnDisk: onDiskDeny
148
264
  }), options.json);
149
265
  }
150
266
  catch (error) {
@@ -1,6 +1,6 @@
1
1
  import { detectCurrentIdeModel } from '../../services/ide/current-model-detector.js';
2
2
  import { addJsonOption, printResult } from '../cli-helpers.js';
3
- import { fail, ok } from '../../shared/result.js';
3
+ import { fail, ok } from 'peaks-loop-shared/result';
4
4
  import { listAdapterIds } from '../../services/ide/ide-registry.js';
5
5
  export function registerIdeCommands(program, io) {
6
6
  const ide = program.command('ide').description('Read-only introspection helpers for the registered IDE adapter layer (slice 2026-07-09 add-zcode-adapter, Slice C)');
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import { findProjectRoot } from '../../services/config/config-safety.js';
14
14
  import { mustCheckFromReport, runImpactScan } from '../../services/impact/impact-scan-service.js';
15
- import { fail, ok } from '../../shared/result.js';
15
+ import { fail, ok } from 'peaks-loop-shared/result';
16
16
  import { addJsonOption, printResult } from '../cli-helpers.js';
17
17
  export function registerImpactCommands(program, io) {
18
18
  const impact = program
@@ -1,7 +1,7 @@
1
1
  // src/cli/commands/job-commands.ts
2
2
  import { join } from 'node:path';
3
3
  import { Command } from 'commander';
4
- import { fail, ok } from '../../shared/result.js';
4
+ import { fail, ok } from 'peaks-loop-shared/result';
5
5
  import { addJsonOption, printResult } from '../cli-helpers.js';
6
6
  import { JobStateStore } from '../../services/job/job-state-store.js';
7
7
  import { JobOrchestrator } from '../../services/job/job-orchestrator.js';
@@ -11,6 +11,8 @@ import { SubAgentJobWrapper } from '../../services/job/subagent-job-wrapper.js';
11
11
  import { emitJobEvent } from '../../services/job/job-event-emitter.js';
12
12
  import { JobInitInputSchema, JobCheckpointInputSchema, JobBlockInputSchema, } from '../../services/job/job-types.js';
13
13
  import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
14
+ import { buildCostCheckEnvelope, runKarpathyCostCheck, } from '../../services/karpathy-cost/karpathy-cost-check-service.js';
15
+ import { read24hState } from '../../services/24h-mode/store.js';
14
16
  function projectRoot(opts) {
15
17
  // Reuse the workspace root resolver from peaks CLI; for now, CWD as a safe placeholder.
16
18
  return opts.project ?? process.cwd();
@@ -285,5 +287,36 @@ export function registerJobCommands(program, io = { stdout: (t) => process.stdou
285
287
  printResult(io, ok('handoff', { handoffFor: opts.jobId, ...s }), opts);
286
288
  });
287
289
  addJsonOption(job.commands.find(c => c.name() === 'handoff'));
290
+ job
291
+ .command('karpathy-cost-check')
292
+ .description('Read the slice\'s rd/karpathy-review.md and decide whether to downgrade a block gateAction to warn (slice 2026-07-30-karpathy-cost-self-review).')
293
+ .requiredOption('--review-file <path>', 'path to rd/karpathy-review.md (or its .json sibling if the file is JSON)')
294
+ .option('--project <repo>')
295
+ .option('--session-id <sid>')
296
+ .action(async (opts) => {
297
+ const project = projectRoot(opts);
298
+ const sessionId = opts.sessionId ?? getCurrentSessionId(project);
299
+ if (!sessionId) {
300
+ return printResult(io, fail('karpathy-cost-check', 'NO_ACTIVE_SESSION', 'karpathy-cost-check requires --session-id (or an active peaks-code session)', { project }, [
301
+ 'Re-run with --session-id <sid>',
302
+ 'Or run `peaks workspace init` to create a session first',
303
+ ]), opts);
304
+ }
305
+ const is24hModeActive = () => {
306
+ try {
307
+ const snapshot = read24hState(project, sessionId);
308
+ return snapshot.state === '24H_ACTIVE';
309
+ }
310
+ catch {
311
+ return false;
312
+ }
313
+ };
314
+ const out = runKarpathyCostCheck({
315
+ reviewFilePath: opts.reviewFile,
316
+ is24hModeActive,
317
+ });
318
+ printResult(io, buildCostCheckEnvelope(out), opts);
319
+ });
320
+ addJsonOption(job.commands.find(c => c.name() === 'karpathy-cost-check'));
288
321
  program.addCommand(job);
289
322
  }
@@ -0,0 +1,67 @@
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 { Command } from 'commander';
21
+ import { type ProgramIO } from '../cli-helpers.js';
22
+ import { type ObservabilityEvent } from '../../services/observability/observability-service.js';
23
+ /**
24
+ * Part 5: leak-rate + lifetime statistics.
25
+ *
26
+ * Leaks are leases that were spawned but neither released (manual)
27
+ * nor auto-released nor gc'd. A naive count is
28
+ * `spawn - release - gc - autoRelease`; the result is the number
29
+ * of currently-alive leases in the absence of in-flight work
30
+ * (the on-disk lease files in `.peaks/_runtime/<sid>/worktree-leases/`
31
+ * are the canonical "alive" set; this aggregation is an estimate
32
+ * for sessions whose files have been pruned but the metrics
33
+ * stream survived).
34
+ *
35
+ * Lifetime: pair each spawn event with its first terminal event
36
+ * (release / gc / autoRelease / autoRelease-failed) for the same
37
+ * leaseId; the duration is the difference in milliseconds. The
38
+ * result is an avg / p99 across the completed leases. p99 is the
39
+ * 99th percentile; with 0-1 completed leases the field is null.
40
+ */
41
+ export type RateStats = {
42
+ readonly totalSpawn: number;
43
+ readonly totalTerminal: number;
44
+ /** spawn - terminal — leases still "alive" per the metrics stream alone. */
45
+ readonly estimatedActive: number;
46
+ /** Estimated leaked = active - autoRelease-failed. Positive = worktrees
47
+ * the user / CLI will need to gc manually. */
48
+ readonly estimatedLeaked: number;
49
+ readonly completedLifetimes: number;
50
+ readonly avgLifetimeMs: number | null;
51
+ readonly p99LifetimeMs: number | null;
52
+ };
53
+ export declare function recomputeRate(leaseEvents: ReadonlyArray<ObservabilityEvent>): RateStats;
54
+ /**
55
+ * Part 5: enumerate every session under `.peaks/_runtime/` for a
56
+ * project root and aggregate their lease events. Sessions without
57
+ * a `metrics/slices.jsonl` are skipped silently (a clean project
58
+ * has no lease events to report; that's not an error).
59
+ */
60
+ export declare function readAllSessionLeaseEvents(projectRoot: string): {
61
+ sessions: ReadonlyArray<{
62
+ sessionId: string;
63
+ events: ReadonlyArray<ObservabilityEvent>;
64
+ }>;
65
+ missingSessions: number;
66
+ };
67
+ export declare function registerLeaseMetricsCommand(parent: Command, io: ProgramIO): void;