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,191 @@
1
+ /**
2
+ * Coverage Evidence reader for c8 `coverage-summary.json` (Fix-6B).
3
+ *
4
+ * Slice rid-Fix-6B / sub-slice T1:
5
+ * - pure helper module, no side effects beyond FS reads
6
+ * - reads the istanbul-reporter JSON shape emitted by `c8 --reporter=json-summary`
7
+ * (the project's coverage tool — see scripts/coverage-c8.mjs)
8
+ * - resolves a `coverage-summary.json` from a fixed discovery order
9
+ * - validates per-capability coverage against a `## Capability Mapping` block
10
+ *
11
+ * The module is hermetic: every function takes its inputs explicitly and returns
12
+ * either a typed success result or a typed error code. There is no global state.
13
+ * Throws only when the input shape is structurally malformed (the caller cannot
14
+ * recover by branching on a Result variant); otherwise returns Result<T, Code>.
15
+ *
16
+ * Conventions:
17
+ * - All paths are POSIX-normalized for JSON safety.
18
+ * - The c8 summary's per-file keys are project-root-relative POSIX paths
19
+ * (e.g. `src/services/openspec/openspec-archive-service.ts`).
20
+ * - Capability mapping `source` field is also project-root-relative, may be
21
+ * a file (`foo.ts`) or a directory (`src/services/openspec/`).
22
+ */
23
+ import { type Result } from './artifact-boundary.js';
24
+ export type CoverageSummaryPathError = {
25
+ code: 'missing';
26
+ triedPaths: ReadonlyArray<string>;
27
+ } | {
28
+ code: 'not-readable';
29
+ path: string;
30
+ message: string;
31
+ };
32
+ export type CoverageSummary = {
33
+ /** Resolved absolute path to the summary file. */
34
+ path: string;
35
+ /** ISO timestamp of the summary file's mtime. */
36
+ capturedAt: string;
37
+ /** Project-root-relative per-file coverage entries. */
38
+ files: ReadonlyMap<string, CoverageFileEntry>;
39
+ };
40
+ export type CoverageFileEntry = {
41
+ /** Absolute path the c8 entry covers (POSIX). */
42
+ path: string;
43
+ /** Project-root-relative POSIX path (the key the summary uses). */
44
+ relativePath: string;
45
+ statements: {
46
+ pct: number;
47
+ covered: number;
48
+ total: number;
49
+ };
50
+ branches: {
51
+ pct: number;
52
+ covered: number;
53
+ total: number;
54
+ };
55
+ functions: {
56
+ pct: number;
57
+ covered: number;
58
+ total: number;
59
+ };
60
+ lines: {
61
+ pct: number;
62
+ covered: number;
63
+ total: number;
64
+ };
65
+ };
66
+ /**
67
+ * A single row from the proposal.md `## Capability Mapping` table.
68
+ * Mirror shape of CoverageRequirementRow (Fix-6A) for symmetry.
69
+ */
70
+ export type CapabilityMappingRow = {
71
+ /** Capability name (e.g. `quality-gates`). */
72
+ capability: string;
73
+ /** Project-root-relative source path — file or directory. */
74
+ source: string;
75
+ /** Optional test anchor (informational; Fix-6B does not validate). */
76
+ testAnchor?: string;
77
+ /** Source line for diagnostics. */
78
+ line: number;
79
+ };
80
+ export type CapabilityCoverageMismatch = {
81
+ capability: string;
82
+ source: string;
83
+ failingFiles: ReadonlyArray<{
84
+ path: string;
85
+ actual: {
86
+ statements: number;
87
+ branches: number;
88
+ functions: number;
89
+ lines: number;
90
+ };
91
+ reason: 'below-threshold' | 'missing-from-summary';
92
+ }>;
93
+ };
94
+ export type CoverageValidation = {
95
+ ok: true;
96
+ } | {
97
+ ok: false;
98
+ mismatches: ReadonlyArray<CapabilityCoverageMismatch>;
99
+ };
100
+ /**
101
+ * Resolve the path to a coverage-summary.json.
102
+ *
103
+ * Discovery order (per Fix-6B AC1):
104
+ * 1. `explicitPath` (passed via `--coverage-summary`)
105
+ * 2. `<projectRoot>/coverage/coverage-summary.json` (c8 wrapper default)
106
+ * 3. `<projectRoot>/openspec/coverage-summary.json` (per-project override)
107
+ *
108
+ * Returns:
109
+ * - `{ ok: true, value: path }` when the file exists.
110
+ * - `{ ok: false, error: { code: 'missing', triedPaths } }` otherwise.
111
+ */
112
+ export declare function resolveCoverageSummaryPath(input: {
113
+ projectRoot: string;
114
+ explicitPath?: string;
115
+ }): Promise<Result<string, CoverageSummaryPathError>>;
116
+ /**
117
+ * Read and parse a coverage-summary.json into a typed `CoverageSummary`.
118
+ *
119
+ * Expected istanbul-reporter shape:
120
+ *
121
+ * {
122
+ * "total": { "lines": { "pct": 100, ... }, ... },
123
+ * "src/foo.ts": { "lines": { "pct": 100, ... }, ... },
124
+ * ...
125
+ * }
126
+ *
127
+ * Throws only on structural malformation (caller cannot branch on a Result).
128
+ * The fix-6B gate handles a missing summary via the discovery layer, not here.
129
+ */
130
+ export declare function readC8Summary(path: string): Promise<CoverageSummary>;
131
+ /**
132
+ * Parse the `## Capability Mapping` block out of a proposal.md.
133
+ *
134
+ * Accepted shape (markdown table):
135
+ *
136
+ * ## Capability Mapping
137
+ *
138
+ * | capability | source | testAnchor |
139
+ * | --- | --- | --- |
140
+ * | quality-gates | src/services/openspec/openspec-archive-service.ts | tests/unit/openspec-archive-service.test.ts |
141
+ * | artifact-workspace | src/services/openspec/artifact-boundary.ts | tests/unit/services/openspec/artifact-boundary.test.ts |
142
+ *
143
+ * Returns `{ present: false }` when the heading is missing (Fix-6B back-compat:
144
+ * the change does not declare a mapping, so no per-capability check is possible
145
+ * and the gate stays at Fix-6A's declarative level).
146
+ */
147
+ export declare function parseCapabilityMapping(proposalPath: string): Promise<{
148
+ rows: ReadonlyArray<CapabilityMappingRow>;
149
+ present: boolean;
150
+ }>;
151
+ /**
152
+ * Resolve the source files that a capability row covers.
153
+ *
154
+ * - File path: returns `[file]`.
155
+ * - Directory path: returns every `*.ts` file recursively under it (relative
156
+ * to `projectRoot`, POSIX separators). Non-TS files are excluded because
157
+ * c8 only collects coverage on TS source modules.
158
+ */
159
+ export declare function resolveCapabilityFiles(input: {
160
+ projectRoot: string;
161
+ row: CapabilityMappingRow;
162
+ }): Promise<ReadonlyArray<string>>;
163
+ /**
164
+ * Validate per-capability coverage. Each capability row's `source` is resolved
165
+ * to one or more files; each file must appear in the c8 summary with all four
166
+ * metrics at exactly 100%.
167
+ *
168
+ * Returns `{ ok: true }` when every capability passes; `{ ok: false, mismatches }`
169
+ * otherwise. The caller is responsible for rendering the mismatches into the
170
+ * `OPENSPEC_COVERAGE_EVIDENCE_MISMATCH` error envelope.
171
+ */
172
+ export declare function validateCapabilityCoverage(input: {
173
+ projectRoot: string;
174
+ summary: CoverageSummary;
175
+ rows: ReadonlyArray<CapabilityMappingRow>;
176
+ }): Promise<CoverageValidation>;
177
+ /**
178
+ * Compare the mtime of every spec/proposal/tasks file under the change against
179
+ * the mtime of the c8 summary. If any change file is newer than the summary,
180
+ * the captured V8 counters no longer match the source on disk and the summary
181
+ * is stale.
182
+ *
183
+ * Returns the list of stale files (project-root-relative POSIX paths). An empty
184
+ * array means the summary is fresh.
185
+ */
186
+ export declare function findStaleChangeFiles(input: {
187
+ projectRoot: string;
188
+ openspecRoot: string;
189
+ changeId: string;
190
+ summary: CoverageSummary;
191
+ }): Promise<ReadonlyArray<string>>;
@@ -0,0 +1,386 @@
1
+ /**
2
+ * Coverage Evidence reader for c8 `coverage-summary.json` (Fix-6B).
3
+ *
4
+ * Slice rid-Fix-6B / sub-slice T1:
5
+ * - pure helper module, no side effects beyond FS reads
6
+ * - reads the istanbul-reporter JSON shape emitted by `c8 --reporter=json-summary`
7
+ * (the project's coverage tool — see scripts/coverage-c8.mjs)
8
+ * - resolves a `coverage-summary.json` from a fixed discovery order
9
+ * - validates per-capability coverage against a `## Capability Mapping` block
10
+ *
11
+ * The module is hermetic: every function takes its inputs explicitly and returns
12
+ * either a typed success result or a typed error code. There is no global state.
13
+ * Throws only when the input shape is structurally malformed (the caller cannot
14
+ * recover by branching on a Result variant); otherwise returns Result<T, Code>.
15
+ *
16
+ * Conventions:
17
+ * - All paths are POSIX-normalized for JSON safety.
18
+ * - The c8 summary's per-file keys are project-root-relative POSIX paths
19
+ * (e.g. `src/services/openspec/openspec-archive-service.ts`).
20
+ * - Capability mapping `source` field is also project-root-relative, may be
21
+ * a file (`foo.ts`) or a directory (`src/services/openspec/`).
22
+ */
23
+ import { posix, relative, resolve } from 'node:path';
24
+ import { readFile, stat } from 'node:fs/promises';
25
+ import { isDirectory } from 'peaks-loop-shared/fs';
26
+ import { ok, err } from './artifact-boundary.js';
27
+ // ---------------------------------------------------------------------------
28
+ // Discovery
29
+ // ---------------------------------------------------------------------------
30
+ const DEFAULT_DISCOVERY = [
31
+ (root) => `${root}/coverage/coverage-summary.json`,
32
+ (root) => `${root}/openspec/coverage-summary.json`,
33
+ ];
34
+ /**
35
+ * Resolve the path to a coverage-summary.json.
36
+ *
37
+ * Discovery order (per Fix-6B AC1):
38
+ * 1. `explicitPath` (passed via `--coverage-summary`)
39
+ * 2. `<projectRoot>/coverage/coverage-summary.json` (c8 wrapper default)
40
+ * 3. `<projectRoot>/openspec/coverage-summary.json` (per-project override)
41
+ *
42
+ * Returns:
43
+ * - `{ ok: true, value: path }` when the file exists.
44
+ * - `{ ok: false, error: { code: 'missing', triedPaths } }` otherwise.
45
+ */
46
+ export async function resolveCoverageSummaryPath(input) {
47
+ const triedPaths = [];
48
+ if (input.explicitPath !== undefined) {
49
+ const abs = resolve(input.explicitPath);
50
+ triedPaths.push(abs);
51
+ if (await isReadable(abs)) {
52
+ return ok(abs);
53
+ }
54
+ return err({ code: 'not-readable', path: abs, message: `Cannot read coverage summary at ${abs}` });
55
+ }
56
+ for (const factory of DEFAULT_DISCOVERY) {
57
+ const candidate = factory(toPosix(input.projectRoot));
58
+ triedPaths.push(candidate);
59
+ if (await isReadable(candidate)) {
60
+ return ok(candidate);
61
+ }
62
+ }
63
+ return err({ code: 'missing', triedPaths });
64
+ }
65
+ function toPosix(p) {
66
+ return p.replace(/\\/g, '/').replace(/\/$/, '');
67
+ }
68
+ async function isReadable(p) {
69
+ try {
70
+ await stat(p);
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Parse
79
+ // ---------------------------------------------------------------------------
80
+ /**
81
+ * Read and parse a coverage-summary.json into a typed `CoverageSummary`.
82
+ *
83
+ * Expected istanbul-reporter shape:
84
+ *
85
+ * {
86
+ * "total": { "lines": { "pct": 100, ... }, ... },
87
+ * "src/foo.ts": { "lines": { "pct": 100, ... }, ... },
88
+ * ...
89
+ * }
90
+ *
91
+ * Throws only on structural malformation (caller cannot branch on a Result).
92
+ * The fix-6B gate handles a missing summary via the discovery layer, not here.
93
+ */
94
+ export async function readC8Summary(path) {
95
+ const raw = await readFile(path, 'utf8');
96
+ const parsed = JSON.parse(raw);
97
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
98
+ throw new Error(`coverage summary at ${path} is not a JSON object`);
99
+ }
100
+ const obj = parsed;
101
+ const files = new Map();
102
+ for (const [key, value] of Object.entries(obj)) {
103
+ if (key === 'total')
104
+ continue;
105
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
106
+ continue;
107
+ const entry = value;
108
+ const lines = asMetric(entry['lines']);
109
+ const statements = asMetric(entry['statements']);
110
+ const functions = asMetric(entry['functions']);
111
+ const branches = asMetric(entry['branches']);
112
+ if (lines === null || statements === null || functions === null || branches === null) {
113
+ continue;
114
+ }
115
+ const normalizedKey = posix.normalize(key.replace(/\\/g, '/'));
116
+ files.set(normalizedKey, {
117
+ path: normalizePathSep(normalizedKey),
118
+ relativePath: normalizedKey,
119
+ statements,
120
+ branches,
121
+ functions,
122
+ lines,
123
+ });
124
+ }
125
+ const stat_ = await stat(path);
126
+ return {
127
+ path,
128
+ capturedAt: stat_.mtime.toISOString(),
129
+ files,
130
+ };
131
+ }
132
+ function asMetric(input) {
133
+ if (input === null || typeof input !== 'object' || Array.isArray(input))
134
+ return null;
135
+ const obj = input;
136
+ const pct = obj['pct'];
137
+ const covered = obj['covered'];
138
+ const total = obj['total'];
139
+ if (typeof pct !== 'number' || typeof covered !== 'number' || typeof total !== 'number')
140
+ return null;
141
+ return { pct, covered, total };
142
+ }
143
+ function normalizePathSep(p) {
144
+ return p.replace(/\\/g, '/');
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Capability Mapping block parser (proposal.md)
148
+ // ---------------------------------------------------------------------------
149
+ /**
150
+ * Parse the `## Capability Mapping` block out of a proposal.md.
151
+ *
152
+ * Accepted shape (markdown table):
153
+ *
154
+ * ## Capability Mapping
155
+ *
156
+ * | capability | source | testAnchor |
157
+ * | --- | --- | --- |
158
+ * | quality-gates | src/services/openspec/openspec-archive-service.ts | tests/unit/openspec-archive-service.test.ts |
159
+ * | artifact-workspace | src/services/openspec/artifact-boundary.ts | tests/unit/services/openspec/artifact-boundary.test.ts |
160
+ *
161
+ * Returns `{ present: false }` when the heading is missing (Fix-6B back-compat:
162
+ * the change does not declare a mapping, so no per-capability check is possible
163
+ * and the gate stays at Fix-6A's declarative level).
164
+ */
165
+ export async function parseCapabilityMapping(proposalPath) {
166
+ let raw;
167
+ try {
168
+ raw = await readFile(proposalPath, 'utf8');
169
+ }
170
+ catch {
171
+ return { rows: [], present: false };
172
+ }
173
+ const lines = raw.split(/\r?\n/);
174
+ const headingIdx = lines.findIndex((line) => /^##\s+Capability\s+Mapping\s*$/.test(line));
175
+ if (headingIdx === -1) {
176
+ return { rows: [], present: false };
177
+ }
178
+ const rows = [];
179
+ let i = headingIdx + 1;
180
+ let inFence = false;
181
+ while (i < lines.length) {
182
+ const line = lines[i];
183
+ if (line === undefined)
184
+ break;
185
+ if (!inFence && /^##\s+/.test(line))
186
+ break;
187
+ if (/^```/.test(line.trim())) {
188
+ inFence = !inFence;
189
+ i += 1;
190
+ continue;
191
+ }
192
+ const parsed = parseCapabilityRow(line);
193
+ if (parsed !== null) {
194
+ rows.push({ ...parsed, line: i + 1 });
195
+ }
196
+ i += 1;
197
+ }
198
+ return { rows, present: true };
199
+ }
200
+ function parseCapabilityRow(line) {
201
+ const trimmed = line.trim();
202
+ if (!trimmed.startsWith('|'))
203
+ return null;
204
+ const cells = trimmed.split('|').slice(1, -1).map((c) => c.trim());
205
+ if (cells.length < 2)
206
+ return null;
207
+ const capability = cells[0];
208
+ const source = cells[1];
209
+ const testAnchor = cells[2];
210
+ if (capability === undefined || source === undefined)
211
+ return null;
212
+ if (capability.toLowerCase() === 'capability' && source.toLowerCase() === 'source')
213
+ return null;
214
+ if (/^-+$/.test(capability.replace(/\s+/g, '')))
215
+ return null;
216
+ const row = {
217
+ capability,
218
+ source: source.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/$/, ''),
219
+ };
220
+ if (testAnchor !== undefined && testAnchor !== '') {
221
+ row.testAnchor = testAnchor;
222
+ }
223
+ return row;
224
+ }
225
+ // ---------------------------------------------------------------------------
226
+ // Resolve files for a capability row
227
+ // ---------------------------------------------------------------------------
228
+ /**
229
+ * Resolve the source files that a capability row covers.
230
+ *
231
+ * - File path: returns `[file]`.
232
+ * - Directory path: returns every `*.ts` file recursively under it (relative
233
+ * to `projectRoot`, POSIX separators). Non-TS files are excluded because
234
+ * c8 only collects coverage on TS source modules.
235
+ */
236
+ export async function resolveCapabilityFiles(input) {
237
+ const abs = resolve(input.projectRoot, input.row.source);
238
+ if (!(await isDirectory(abs))) {
239
+ const rel = relative(input.projectRoot, abs).replace(/\\/g, '/');
240
+ return [rel];
241
+ }
242
+ return await walkTsFiles(abs, input.projectRoot);
243
+ }
244
+ async function walkTsFiles(absRoot, projectRoot) {
245
+ // Lightweight walk; avoids pulling in fast-glob for one offscreen consumer.
246
+ const { readdir } = await import('node:fs/promises');
247
+ const out = [];
248
+ const stack = [absRoot];
249
+ while (stack.length > 0) {
250
+ const dir = stack.pop();
251
+ let entries;
252
+ try {
253
+ entries = await readdir(dir, { withFileTypes: true });
254
+ }
255
+ catch {
256
+ continue;
257
+ }
258
+ for (const entry of entries) {
259
+ const full = `${dir}/${entry.name}`;
260
+ if (entry.isDirectory()) {
261
+ stack.push(full);
262
+ }
263
+ else if (entry.isFile() && entry.name.endsWith('.ts')) {
264
+ const rel = relative(projectRoot, full).replace(/\\/g, '/');
265
+ out.push(rel);
266
+ }
267
+ }
268
+ }
269
+ return out.sort();
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ // Validate
273
+ // ---------------------------------------------------------------------------
274
+ /**
275
+ * Validate per-capability coverage. Each capability row's `source` is resolved
276
+ * to one or more files; each file must appear in the c8 summary with all four
277
+ * metrics at exactly 100%.
278
+ *
279
+ * Returns `{ ok: true }` when every capability passes; `{ ok: false, mismatches }`
280
+ * otherwise. The caller is responsible for rendering the mismatches into the
281
+ * `OPENSPEC_COVERAGE_EVIDENCE_MISMATCH` error envelope.
282
+ */
283
+ export async function validateCapabilityCoverage(input) {
284
+ const mismatches = [];
285
+ for (const row of input.rows) {
286
+ const files = await resolveCapabilityFiles({ projectRoot: input.projectRoot, row });
287
+ const failing = [];
288
+ for (const file of files) {
289
+ const entry = input.summary.files.get(file);
290
+ if (entry === undefined) {
291
+ failing.push({
292
+ path: file,
293
+ actual: { statements: 0, branches: 0, functions: 0, lines: 0 },
294
+ reason: 'missing-from-summary',
295
+ });
296
+ continue;
297
+ }
298
+ if (entry.statements.pct !== 100 ||
299
+ entry.branches.pct !== 100 ||
300
+ entry.functions.pct !== 100 ||
301
+ entry.lines.pct !== 100) {
302
+ failing.push({
303
+ path: file,
304
+ actual: {
305
+ statements: entry.statements.pct,
306
+ branches: entry.branches.pct,
307
+ functions: entry.functions.pct,
308
+ lines: entry.lines.pct,
309
+ },
310
+ reason: 'below-threshold',
311
+ });
312
+ }
313
+ }
314
+ if (failing.length > 0) {
315
+ mismatches.push({
316
+ capability: row.capability,
317
+ source: row.source,
318
+ failingFiles: failing,
319
+ });
320
+ }
321
+ }
322
+ if (mismatches.length === 0) {
323
+ return { ok: true };
324
+ }
325
+ return { ok: false, mismatches };
326
+ }
327
+ // ---------------------------------------------------------------------------
328
+ // Freshness
329
+ // ---------------------------------------------------------------------------
330
+ /**
331
+ * Compare the mtime of every spec/proposal/tasks file under the change against
332
+ * the mtime of the c8 summary. If any change file is newer than the summary,
333
+ * the captured V8 counters no longer match the source on disk and the summary
334
+ * is stale.
335
+ *
336
+ * Returns the list of stale files (project-root-relative POSIX paths). An empty
337
+ * array means the summary is fresh.
338
+ */
339
+ export async function findStaleChangeFiles(input) {
340
+ const { stat: statFn } = await import('node:fs/promises');
341
+ const summaryMtime = (await statFn(input.summary.path)).mtimeMs;
342
+ const changeRoot = `${input.openspecRoot.replace(/\\/g, '/').replace(/\/$/, '')}/changes/${input.changeId}`;
343
+ const candidates = [
344
+ `${changeRoot}/proposal.md`,
345
+ `${changeRoot}/tasks.md`,
346
+ `${changeRoot}/design.md`,
347
+ ];
348
+ // spec files
349
+ const specsRoot = `${changeRoot}/specs`;
350
+ if (await isDirectory(specsRoot)) {
351
+ const { readdir } = await import('node:fs/promises');
352
+ const stack = [specsRoot];
353
+ while (stack.length > 0) {
354
+ const dir = stack.pop();
355
+ let entries;
356
+ try {
357
+ entries = await readdir(dir, { withFileTypes: true });
358
+ }
359
+ catch {
360
+ continue;
361
+ }
362
+ for (const entry of entries) {
363
+ const full = `${dir}/${entry.name}`;
364
+ if (entry.isDirectory()) {
365
+ stack.push(full);
366
+ }
367
+ else if (entry.isFile() && entry.name === 'spec.md') {
368
+ candidates.push(full);
369
+ }
370
+ }
371
+ }
372
+ }
373
+ const stale = [];
374
+ for (const candidate of candidates) {
375
+ try {
376
+ const m = (await statFn(candidate)).mtimeMs;
377
+ if (m > summaryMtime) {
378
+ stale.push(relative(input.projectRoot, candidate).replace(/\\/g, '/'));
379
+ }
380
+ }
381
+ catch {
382
+ // file does not exist — not stale, just absent
383
+ }
384
+ }
385
+ return stale;
386
+ }
@@ -1,12 +1,82 @@
1
1
  import type { OpenSpecScanOptions } from './openspec-scan-service.js';
2
+ import { type CapabilityCoverageMismatch, type CapabilityMappingRow } from './coverage-evidence-reader.js';
2
3
  export type OpenSpecArchiveOptions = OpenSpecScanOptions & {
3
4
  apply?: boolean;
5
+ /**
6
+ * Skip the Pre-cond 2 (Coverage Evidence) gate even when the change declares
7
+ * requirements. Use only when the operator has confirmed the gap is acceptable
8
+ * for this archive operation. Default: false (gate enforced).
9
+ */
10
+ force?: boolean;
11
+ /**
12
+ * Override coverage-summary.json discovery (Fix-6B AC1.1).
13
+ * When omitted, discovery order is:
14
+ * 1. <projectRoot>/coverage/coverage-summary.json
15
+ * 2. <projectRoot>/openspec/coverage-summary.json
16
+ */
17
+ coverageSummaryPath?: string;
4
18
  archiveDirName?: string;
5
19
  };
20
+ export type CoverageRequirementRow = {
21
+ /** Spec delta name (e.g. `quality-gates`). */
22
+ capability: string;
23
+ /** Requirement heading under which the row was declared. */
24
+ requirement: string;
25
+ /** One of `covered`, `partial`, `uncovered`. */
26
+ status: 'covered' | 'partial' | 'uncovered';
27
+ /** Optional test anchor — file path or test name. */
28
+ testAnchor?: string;
29
+ /** Source line for diagnostics. */
30
+ line: number;
31
+ };
32
+ export type CoverageEvidence = {
33
+ /** Rows parsed out of the `## Coverage Evidence` block in proposal.md. */
34
+ rows: ReadonlyArray<CoverageRequirementRow>;
35
+ /** True when a `## Coverage Evidence` block existed in the proposal. */
36
+ present: boolean;
37
+ /** Rows parsed out of the `## Capability Mapping` block in proposal.md. */
38
+ capabilityRows: ReadonlyArray<CapabilityMappingRow>;
39
+ /** Resolved coverage-summary.json absolute path (Fix-6B). */
40
+ summaryPath?: string;
41
+ /** Freshness status of the c8 summary relative to change files. */
42
+ summaryStatus: 'missing' | 'stale' | 'fresh' | 'unavailable';
43
+ /** Per-capability validation outcome. */
44
+ capabilityValidation: 'ok' | 'mismatch' | 'no-mapping' | 'not-enforced';
45
+ /** Files under the change that are newer than the summary (only when stale). */
46
+ staleFiles: ReadonlyArray<string>;
47
+ /** Per-capability failing detail (only when mismatch). */
48
+ mismatches: ReadonlyArray<CapabilityCoverageMismatch>;
49
+ };
6
50
  export type OpenSpecArchiveResult = {
7
51
  changeId: string;
8
52
  from: string;
9
53
  to: string;
10
54
  applied: boolean;
55
+ coverage?: CoverageEvidence;
56
+ /** Set when `applied === true` and the gate was bypassed via `--force`. */
57
+ coverageGateBypassed?: boolean;
58
+ /** Set when `applied === true` and the Fix-6B mismatch gate was bypassed via `--force`. */
59
+ coverageMismatchBypassed?: boolean;
11
60
  };
61
+ export declare class OpenSpecArchiveError extends Error {
62
+ readonly code: 'OPENSPEC_COVERAGE_GATE_FAILED' | 'OPENSPEC_COVERAGE_GATE_PARTIAL' | 'OPENSPEC_COVERAGE_EVIDENCE_MALFORMED' | 'OPENSPEC_COVERAGE_EVIDENCE_MISSING' | 'OPENSPEC_COVERAGE_EVIDENCE_STALE' | 'OPENSPEC_COVERAGE_EVIDENCE_MISMATCH';
63
+ readonly detail: Record<string, unknown>;
64
+ constructor(code: 'OPENSPEC_COVERAGE_GATE_FAILED' | 'OPENSPEC_COVERAGE_GATE_PARTIAL' | 'OPENSPEC_COVERAGE_EVIDENCE_MALFORMED' | 'OPENSPEC_COVERAGE_EVIDENCE_MISSING' | 'OPENSPEC_COVERAGE_EVIDENCE_STALE' | 'OPENSPEC_COVERAGE_EVIDENCE_MISMATCH', message: string, detail?: Record<string, unknown>);
65
+ }
66
+ /**
67
+ * Parse the `## Coverage Evidence` block out of a proposal.md.
68
+ *
69
+ * Accepted shape (markdown table):
70
+ *
71
+ * ## Coverage Evidence
72
+ *
73
+ * | capability | requirement | status | testAnchor |
74
+ * | --- | --- | --- | --- |
75
+ * | quality-gates | 100% coverage for included modules | covered | tests/unit/quality-gates.test.ts |
76
+ *
77
+ * Returns `{ present: false }` when the heading is missing. Throws
78
+ * `OpenSpecArchiveError` with `code: 'OPENSPEC_COVERAGE_EVIDENCE_MALFORMED'`
79
+ * when the heading is present but no parsable rows are extracted.
80
+ */
81
+ export declare function parseCoverageEvidence(proposalPath: string): Promise<CoverageEvidence>;
12
82
  export declare function archiveOpenSpecChange(changeId: string, options?: OpenSpecArchiveOptions): Promise<OpenSpecArchiveResult | null>;