peaks-loop 4.0.0-beta.9 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/CHANGELOG.md +572 -234
  2. package/README-en.md +67 -30
  3. package/README.md +67 -30
  4. package/agents/karpathy-reviewer.md +33 -0
  5. package/bin/peaks.js +0 -0
  6. package/dist/cli/cli-helpers.d.ts +31 -6
  7. package/dist/cli/cli-helpers.js +48 -25
  8. package/dist/cli/commands/_register.d.ts +3 -0
  9. package/dist/cli/commands/_register.js +139 -0
  10. package/dist/cli/commands/_super.d.ts +10 -0
  11. package/dist/cli/commands/_super.js +97 -0
  12. package/dist/cli/commands/adapter-commands-s2a.js +1 -1
  13. package/dist/cli/commands/asset-commands.js +33 -16
  14. package/dist/cli/commands/audit-commands.js +2 -2
  15. package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
  16. package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
  17. package/dist/cli/commands/bee-commands.js +1 -1
  18. package/dist/cli/commands/capability-commands.js +1 -1
  19. package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
  20. package/dist/cli/commands/changeset-commands.d.ts +13 -0
  21. package/dist/cli/commands/changeset-commands.js +46 -0
  22. package/dist/cli/commands/code-commands.d.ts +11 -1
  23. package/dist/cli/commands/code-commands.js +19 -699
  24. package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
  25. package/dist/cli/commands/code-job-shape-commands.js +164 -0
  26. package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
  27. package/dist/cli/commands/code-mode-gate-commands.js +223 -0
  28. package/dist/cli/commands/code-review-commands.js +2 -2
  29. package/dist/cli/commands/code-run-command.d.ts +12 -0
  30. package/dist/cli/commands/code-run-command.js +68 -0
  31. package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
  32. package/dist/cli/commands/code-runtime-commands.js +391 -0
  33. package/dist/cli/commands/codegraph-commands.js +1 -1
  34. package/dist/cli/commands/compact-command.js +53 -1
  35. package/dist/cli/commands/complexity-commands.js +1 -1
  36. package/dist/cli/commands/config-commands.js +4 -75
  37. package/dist/cli/commands/container-commands.d.ts +28 -0
  38. package/dist/cli/commands/container-commands.js +221 -0
  39. package/dist/cli/commands/context-commands.js +3 -2
  40. package/dist/cli/commands/core/artifacts-command.js +1 -1
  41. package/dist/cli/commands/core/binding-commands.js +1 -1
  42. package/dist/cli/commands/core/doctor-command.js +63 -3
  43. package/dist/cli/commands/core/memory-command.js +1 -1
  44. package/dist/cli/commands/core/profile-command.js +1 -1
  45. package/dist/cli/commands/core/proxy-command.js +1 -1
  46. package/dist/cli/commands/core/session-command.js +9 -7
  47. package/dist/cli/commands/core/skill-command.js +7 -4
  48. package/dist/cli/commands/core/standards-command.js +1 -1
  49. package/dist/cli/commands/cron-commands.d.ts +57 -0
  50. package/dist/cli/commands/cron-commands.js +257 -0
  51. package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
  52. package/dist/cli/commands/cron-scheduler-commands.js +284 -0
  53. package/dist/cli/commands/dashboard-commands.d.ts +4 -0
  54. package/dist/cli/commands/dashboard-commands.js +10 -0
  55. package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
  56. package/dist/cli/commands/dashboard-long-run.js +122 -0
  57. package/dist/cli/commands/dashboard-summary.d.ts +12 -0
  58. package/dist/cli/commands/dashboard-summary.js +58 -0
  59. package/dist/cli/commands/dispatch-commands.d.ts +0 -7
  60. package/dist/cli/commands/dispatch-commands.js +372 -8
  61. package/dist/cli/commands/dispatch-from-dag.js +4 -1
  62. package/dist/cli/commands/doc-commands.js +1 -1
  63. package/dist/cli/commands/ecc-commands.d.ts +30 -0
  64. package/dist/cli/commands/ecc-commands.js +119 -0
  65. package/dist/cli/commands/evolution-commands.js +1 -1
  66. package/dist/cli/commands/feedback-commands.js +1 -1
  67. package/dist/cli/commands/final-review-commands.js +1 -1
  68. package/dist/cli/commands/fixture-commands.js +1 -1
  69. package/dist/cli/commands/fork-commands.js +1 -1
  70. package/dist/cli/commands/gate-commands.js +128 -6
  71. package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
  72. package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
  73. package/dist/cli/commands/heartbeat-commands.js +76 -5
  74. package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
  75. package/dist/cli/commands/heartbeat-watch-command.js +146 -0
  76. package/dist/cli/commands/hook-handle.js +1 -1
  77. package/dist/cli/commands/hooks-commands.js +126 -10
  78. package/dist/cli/commands/ide-commands.js +1 -1
  79. package/dist/cli/commands/impact-commands.js +1 -1
  80. package/dist/cli/commands/job-commands.js +34 -1
  81. package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
  82. package/dist/cli/commands/lease-metrics-commands.js +231 -0
  83. package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
  84. package/dist/cli/commands/lease-stats-commands.js +107 -0
  85. package/dist/cli/commands/legacy-commands.js +1 -1
  86. package/dist/cli/commands/log-commands.js +1 -1
  87. package/dist/cli/commands/loop-commands.js +1 -1
  88. package/dist/cli/commands/loop-eval-commands.js +1 -1
  89. package/dist/cli/commands/memory-commands.js +1 -1
  90. package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
  91. package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
  92. package/dist/cli/commands/mut-commands.d.ts +1 -1
  93. package/dist/cli/commands/mut-commands.js +1 -5
  94. package/dist/cli/commands/observability-commands.js +1 -1
  95. package/dist/cli/commands/openspec-commands.js +65 -4
  96. package/dist/cli/commands/perf-audit-commands.js +3 -3
  97. package/dist/cli/commands/perf-commands.js +1 -1
  98. package/dist/cli/commands/polyrepo-commands.js +1 -1
  99. package/dist/cli/commands/prd-blocks-commands.js +1 -1
  100. package/dist/cli/commands/prd-commands.js +4 -2
  101. package/dist/cli/commands/preferences-commands.js +23 -3
  102. package/dist/cli/commands/project-commands.js +1 -1
  103. package/dist/cli/commands/qa-business-review-commands.js +1 -1
  104. package/dist/cli/commands/qa-commands.d.ts +1 -1
  105. package/dist/cli/commands/qa-commands.js +39 -3
  106. package/dist/cli/commands/release-commands.d.ts +15 -0
  107. package/dist/cli/commands/release-commands.js +113 -21
  108. package/dist/cli/commands/request-commands.js +1 -1
  109. package/dist/cli/commands/retrospective-commands.js +1 -1
  110. package/dist/cli/commands/reviewer-commands.js +1 -1
  111. package/dist/cli/commands/role-commands.js +1 -1
  112. package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
  113. package/dist/cli/commands/runtime-commands-helpers.js +24 -0
  114. package/dist/cli/commands/runtime-commands.js +1 -2
  115. package/dist/cli/commands/sc-commands.js +4 -2
  116. package/dist/cli/commands/scan-commands.js +1 -1
  117. package/dist/cli/commands/security-audit-commands.js +3 -3
  118. package/dist/cli/commands/sediment-commands.js +10 -1
  119. package/dist/cli/commands/session-24h-mode.d.ts +26 -0
  120. package/dist/cli/commands/session-24h-mode.js +196 -0
  121. package/dist/cli/commands/share-commands.d.ts +19 -0
  122. package/dist/cli/commands/share-commands.js +121 -2
  123. package/dist/cli/commands/skill-conformance-commands.js +1 -1
  124. package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
  125. package/dist/cli/commands/skill-search-commands.js +4 -1
  126. package/dist/cli/commands/slice-commands.js +1 -1
  127. package/dist/cli/commands/slice-integrate-commands.js +1 -1
  128. package/dist/cli/commands/slice-review-commands.js +1 -1
  129. package/dist/cli/commands/smoke-commands.js +1 -1
  130. package/dist/cli/commands/sop-commands.js +1 -1
  131. package/dist/cli/commands/spill-demo-command.d.ts +7 -0
  132. package/dist/cli/commands/spill-demo-command.js +29 -0
  133. package/dist/cli/commands/statusline-commands.d.ts +12 -0
  134. package/dist/cli/commands/statusline-commands.js +79 -17
  135. package/dist/cli/commands/sub-agent-commands.js +2 -1
  136. package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
  137. package/dist/cli/commands/sub-agent-shared.js +24 -1
  138. package/dist/cli/commands/swarm-commands.d.ts +13 -0
  139. package/dist/cli/commands/swarm-commands.js +77 -0
  140. package/dist/cli/commands/tech-commands.d.ts +64 -0
  141. package/dist/cli/commands/tech-commands.js +195 -0
  142. package/dist/cli/commands/understand-commands.js +1 -1
  143. package/dist/cli/commands/upgrade-commands.d.ts +2 -0
  144. package/dist/cli/commands/upgrade-commands.js +40 -5
  145. package/dist/cli/commands/user-touchpoint-commands.js +1 -1
  146. package/dist/cli/commands/verdict-aggregate-command.js +1 -1
  147. package/dist/cli/commands/vm-commands.d.ts +31 -0
  148. package/dist/cli/commands/vm-commands.js +274 -0
  149. package/dist/cli/commands/workflow-commands.js +24 -1
  150. package/dist/cli/commands/workflow-plan-commands.js +1 -1
  151. package/dist/cli/commands/workspace/init-command.js +1 -1
  152. package/dist/cli/commands/workspace/migrate-command.js +1 -1
  153. package/dist/cli/commands/workspace/reconcile-command.js +1 -1
  154. package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
  155. package/dist/cli/commands/worktree-auth-commands.js +652 -0
  156. package/dist/cli/index.js +58 -13
  157. package/dist/cli/program.d.ts +2 -2
  158. package/dist/cli/program.js +86 -281
  159. package/dist/services/24h-mode/decider.d.ts +103 -0
  160. package/dist/services/24h-mode/decider.js +144 -0
  161. package/dist/services/24h-mode/index.d.ts +12 -0
  162. package/dist/services/24h-mode/index.js +12 -0
  163. package/dist/services/24h-mode/state.d.ts +48 -0
  164. package/dist/services/24h-mode/state.js +51 -0
  165. package/dist/services/24h-mode/store.d.ts +27 -0
  166. package/dist/services/24h-mode/store.js +119 -0
  167. package/dist/services/artifacts/artifact-prerequisites.js +1 -1
  168. package/dist/services/artifacts/request-artifact-service.js +1 -1
  169. package/dist/services/artifacts/workspace-service.js +1 -1
  170. package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
  171. package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
  172. package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
  173. package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
  174. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
  175. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
  176. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
  177. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
  178. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
  179. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
  180. package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
  181. package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
  182. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
  183. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
  184. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
  185. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
  186. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
  187. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
  188. package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
  189. package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
  190. package/dist/services/audit/static-service.d.ts +32 -25
  191. package/dist/services/audit/static-service.js +30 -109
  192. package/dist/services/audit-independent/index.d.ts +2 -0
  193. package/dist/services/audit-independent/index.js +2 -0
  194. package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
  195. package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
  196. package/dist/services/changeset/changeset-check-service.d.ts +22 -0
  197. package/dist/services/changeset/changeset-check-service.js +47 -0
  198. package/dist/services/code/auto-compact-modes.d.ts +30 -0
  199. package/dist/services/code/auto-compact-modes.js +38 -0
  200. package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
  201. package/dist/services/code/auto-compact-orchestrator.js +101 -21
  202. package/dist/services/code/dag-orchestrator.d.ts +30 -1
  203. package/dist/services/code/dag-orchestrator.js +106 -1
  204. package/dist/services/code/status-line-renderer.d.ts +2 -0
  205. package/dist/services/code/status-line-renderer.js +21 -3
  206. package/dist/services/code-review/ocr-service.d.ts +1 -1
  207. package/dist/services/code-review/ocr-service.js +6 -3
  208. package/dist/services/compact-history/compact-history-service.d.ts +41 -0
  209. package/dist/services/compact-history/compact-history-service.js +62 -0
  210. package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
  211. package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
  212. package/dist/services/config/config-service.d.ts +1 -12
  213. package/dist/services/config/config-service.js +3 -72
  214. package/dist/services/config/config-types.d.ts +2 -4
  215. package/dist/services/config/config-types.js +1 -1
  216. package/dist/services/container/container-lease.d.ts +67 -0
  217. package/dist/services/container/container-lease.js +135 -0
  218. package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
  219. package/dist/services/context/auto-compact-dispatcher.js +32 -102
  220. package/dist/services/context/auto-compact-reader.js +1 -1
  221. package/dist/services/context/auto-compact-types.d.ts +27 -2
  222. package/dist/services/context/auto-compact-types.js +8 -1
  223. package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
  224. package/dist/services/context/build-dispatch-system-prompt.js +117 -0
  225. package/dist/services/context/collector.d.ts +2 -2
  226. package/dist/services/context/context-builder.d.ts +4 -4
  227. package/dist/services/context/context-schema.d.ts +48 -48
  228. package/dist/services/context/ide-detect.d.ts +4 -0
  229. package/dist/services/context/ide-detect.js +24 -0
  230. package/dist/services/context/main-session-monitor.d.ts +1 -4
  231. package/dist/services/context/main-session-monitor.js +1 -24
  232. package/dist/services/context/memory-index-reader.d.ts +8 -0
  233. package/dist/services/context/memory-index-reader.js +57 -0
  234. package/dist/services/context/memory-lru-cache.d.ts +12 -0
  235. package/dist/services/context/memory-lru-cache.js +60 -0
  236. package/dist/services/context/memory-preflight-config.d.ts +19 -0
  237. package/dist/services/context/memory-preflight-config.js +25 -0
  238. package/dist/services/context/memory-preflight-service.d.ts +19 -0
  239. package/dist/services/context/memory-preflight-service.js +120 -0
  240. package/dist/services/context/spillover-store.d.ts +23 -0
  241. package/dist/services/context/spillover-store.js +155 -0
  242. package/dist/services/context/spillover-types.d.ts +18 -0
  243. package/dist/services/context/spillover-types.js +1 -0
  244. package/dist/services/crystallization/crystallization-service.d.ts +22 -5
  245. package/dist/services/crystallization/crystallization-service.js +8 -14
  246. package/dist/services/crystallization/crystallization-types.d.ts +6 -6
  247. package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
  248. package/dist/services/crystallization/index.d.ts +13 -0
  249. package/dist/services/crystallization/index.js +13 -0
  250. package/dist/services/dashboard/project-dashboard-service.js +2 -2
  251. package/dist/services/dispatch/await-batch.d.ts +70 -0
  252. package/dist/services/dispatch/await-batch.js +272 -0
  253. package/dist/services/dispatch/batch-counter.js +1 -1
  254. package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
  255. package/dist/services/dispatch/dispatch-record-writer.js +239 -9
  256. package/dist/services/dispatch/slice-dag.d.ts +46 -0
  257. package/dist/services/dispatch/slice-dag.js +6 -0
  258. package/dist/services/dispatch/stage-enum.d.ts +27 -0
  259. package/dist/services/dispatch/stage-enum.js +48 -0
  260. package/dist/services/dispatch/startup-timeout.d.ts +86 -0
  261. package/dist/services/dispatch/startup-timeout.js +97 -0
  262. package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
  263. package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
  264. package/dist/services/dispatch/test-tool-detection.js +80 -0
  265. package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
  266. package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
  267. package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
  268. package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
  269. package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
  270. package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
  271. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
  272. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
  273. package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
  274. package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
  275. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
  276. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
  277. package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
  278. package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
  279. package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
  280. package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
  281. package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
  282. package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
  283. package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
  284. package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
  285. package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
  286. package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
  287. package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
  288. package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
  289. package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
  290. package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
  291. package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
  292. package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
  293. package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
  294. package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
  295. package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
  296. package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
  297. package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
  298. package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
  299. package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
  300. package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
  301. package/dist/services/doctor/doctor-service/index.d.ts +48 -0
  302. package/dist/services/doctor/doctor-service/index.js +254 -0
  303. package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
  304. package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
  305. package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
  306. package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
  307. package/dist/services/doctor/doctor-service/types.d.ts +245 -0
  308. package/dist/services/doctor/doctor-service/types.js +15 -0
  309. package/dist/services/doctor/doctor-service.d.ts +15 -146
  310. package/dist/services/doctor/doctor-service.js +22 -926
  311. package/dist/services/doctor/index.d.ts +22 -0
  312. package/dist/services/doctor/index.js +22 -0
  313. package/dist/services/env/shell-probe.d.ts +71 -0
  314. package/dist/services/env/shell-probe.js +161 -0
  315. package/dist/services/evolution/evolution-types.d.ts +39 -39
  316. package/dist/services/final-review/final-review-service.d.ts +11 -1
  317. package/dist/services/final-review/index.d.ts +2 -0
  318. package/dist/services/final-review/index.js +1 -0
  319. package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
  320. package/dist/services/hooks/auto-compact-hook-install.js +4 -5
  321. package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
  322. package/dist/services/hooks/worktree-authorization-gate.js +492 -0
  323. package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
  324. package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
  325. package/dist/services/ide/adapters/qoder-adapter.js +57 -0
  326. package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
  327. package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
  328. package/dist/services/ide/ide-registry.js +6 -0
  329. package/dist/services/ide/ide-types.d.ts +1 -1
  330. package/dist/services/job/job-types.d.ts +56 -56
  331. package/dist/services/job-snapshot/index.d.ts +8 -0
  332. package/dist/services/job-snapshot/index.js +7 -0
  333. package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
  334. package/dist/services/job-snapshot/types.d.ts +7 -0
  335. package/dist/services/job-snapshot/types.js +1 -0
  336. package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
  337. package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
  338. package/dist/services/log/retention.d.ts +16 -0
  339. package/dist/services/log/retention.js +17 -0
  340. package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
  341. package/dist/services/loop/loop-release-types.d.ts +24 -24
  342. package/dist/services/loop/monotonic-runner.d.ts +17 -11
  343. package/dist/services/loop/monotonic-runner.js +118 -79
  344. package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
  345. package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
  346. package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
  347. package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
  348. package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
  349. package/dist/services/memory/project-memory-service/index/search.js +194 -0
  350. package/dist/services/memory/project-memory-service/index.d.ts +9 -0
  351. package/dist/services/memory/project-memory-service/index.js +24 -0
  352. package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
  353. package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
  354. package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
  355. package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
  356. package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
  357. package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
  358. package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
  359. package/dist/services/memory/project-memory-service/store/paths.js +116 -0
  360. package/dist/services/memory/project-memory-service/types.d.ts +128 -0
  361. package/dist/services/memory/project-memory-service/types.js +9 -0
  362. package/dist/services/memory/project-memory-service.d.ts +1 -167
  363. package/dist/services/memory/project-memory-service.js +19 -816
  364. package/dist/services/migrate-skill-name/schema.d.ts +2 -2
  365. package/dist/services/observability/aggregation.d.ts +27 -0
  366. package/dist/services/observability/aggregation.js +72 -0
  367. package/dist/services/observability/observability-service.d.ts +73 -7
  368. package/dist/services/observability/observability-service.js +87 -1
  369. package/dist/services/openspec/artifact-boundary.d.ts +138 -0
  370. package/dist/services/openspec/artifact-boundary.js +150 -0
  371. package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
  372. package/dist/services/openspec/coverage-evidence-reader.js +386 -0
  373. package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
  374. package/dist/services/openspec/openspec-archive-service.js +320 -8
  375. package/dist/services/openspec/openspec-bridge-service.js +1 -1
  376. package/dist/services/openspec/openspec-init-service.js +1 -1
  377. package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
  378. package/dist/services/openspec/openspec-render-service.js +7 -4
  379. package/dist/services/openspec/openspec-scan-service.js +1 -1
  380. package/dist/services/openspec/openspec-validate-service.js +5 -4
  381. package/dist/services/preferences/preferences-service.js +10 -0
  382. package/dist/services/preferences/preferences-types.d.ts +13 -0
  383. package/dist/services/preferences/preferences-types.js +11 -0
  384. package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
  385. package/dist/services/qa/screenshot-archive-service.js +134 -0
  386. package/dist/services/rd/rd-service.js +10 -11
  387. package/dist/services/rd/types.d.ts +32 -32
  388. package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
  389. package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
  390. package/dist/services/recommendations/capability-seed-items.js +0 -1
  391. package/dist/services/recommendations/capability-seed-mappings.js +0 -1
  392. package/dist/services/recommendations/capability-seed-sources.js +0 -1
  393. package/dist/services/release/version-precheck-service.d.ts +51 -0
  394. package/dist/services/release/version-precheck-service.js +257 -0
  395. package/dist/services/scan/acceptance-coverage-service.js +1 -1
  396. package/dist/services/scan/archetype-service.js +1 -1
  397. package/dist/services/scan/existing-system-service.js +1 -1
  398. package/dist/services/scan/libraries-service.js +1 -1
  399. package/dist/services/sediment/json-schema.d.ts +40 -40
  400. package/dist/services/share/bundle-types.d.ts +12 -12
  401. package/dist/services/share/run-state-contract.d.ts +2 -2
  402. package/dist/services/skill/skill-search-service.d.ts +12 -7
  403. package/dist/services/skill/skill-search-service.js +8 -4
  404. package/dist/services/skillhub/migrations/001-initial.sql +71 -0
  405. package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
  406. package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
  407. package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
  408. package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
  409. package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
  410. package/dist/services/skills/hooks-settings-service.d.ts +75 -0
  411. package/dist/services/skills/hooks-settings-service.js +230 -2
  412. package/dist/services/skills/skill-registry.d.ts +1 -0
  413. package/dist/services/skills/skill-registry.js +6 -4
  414. package/dist/services/skills/skill-runbook-service.js +1 -1
  415. package/dist/services/slice/slice-check-service.js +1 -1
  416. package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
  417. package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
  418. package/dist/services/standards/missing-standards-detector.d.ts +25 -0
  419. package/dist/services/standards/missing-standards-detector.js +43 -12
  420. package/dist/services/tech/tech-change-id-service.d.ts +82 -0
  421. package/dist/services/tech/tech-change-id-service.js +117 -0
  422. package/dist/services/understand/understand-hybrid-service.js +1 -1
  423. package/dist/services/understand/understand-scan-service.js +2 -2
  424. package/dist/services/upgrade/upgrade-service.js +4 -3
  425. package/dist/services/verdict/envelopes.d.ts +2 -2
  426. package/dist/services/verdict/envelopes.js +2 -2
  427. package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
  428. package/dist/services/vm/vm-lease.d.ts +40 -0
  429. package/dist/services/vm/vm-lease.js +137 -0
  430. package/dist/services/workflow/autonomous-resume-writer.js +1 -1
  431. package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
  432. package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
  433. package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
  434. package/dist/services/workflow/pipeline-verify-service.js +42 -218
  435. package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
  436. package/dist/services/workflow/pipeline-verify-types.js +10 -0
  437. package/dist/services/workflow/plan-reader.d.ts +1 -1
  438. package/dist/services/workflow/plan-reader.js +1 -1
  439. package/dist/services/workflow/plan-refresher.d.ts +1 -1
  440. package/dist/services/workflow/plan-refresher.js +1 -1
  441. package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
  442. package/dist/services/workflow/plan-trigger-detector.js +1 -1
  443. package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
  444. package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
  445. package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
  446. package/dist/services/workflow/workflow-autonomous-types.js +21 -0
  447. package/dist/services/workflow/workflow-router-service.js +18 -16
  448. package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
  449. package/dist/services/workflow/workflow-spec-lint.js +75 -0
  450. package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
  451. package/dist/services/workflow/workflow-spec-types.js +13 -0
  452. package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
  453. package/dist/services/workflow/workflow-spec-yaml.js +88 -0
  454. package/dist/services/workflow/workflow-spec.d.ts +11 -91
  455. package/dist/services/workflow/workflow-spec.js +16 -145
  456. package/dist/services/workspace/migrate-service.js +1 -1
  457. package/dist/services/workspace/workspace-service.js +1 -1
  458. package/dist/services/worktree/worktree-lease.d.ts +170 -0
  459. package/dist/services/worktree/worktree-lease.js +242 -0
  460. package/package.json +91 -51
  461. package/scripts/clean-dist.mjs +31 -1
  462. package/scripts/copy-templates.mjs +16 -0
  463. package/scripts/sync-version.mjs +53 -2
  464. package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
  465. package/skills/bee/peaks-prd/SKILL.md +16 -0
  466. package/skills/bee/peaks-prd/test-prompts.json +12 -0
  467. package/skills/bee/peaks-qa/SKILL.md +16 -1
  468. package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
  469. package/skills/bee/peaks-qa/test-prompts.json +12 -0
  470. package/skills/bee/peaks-rd/SKILL.md +29 -20
  471. package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
  472. package/skills/bee/peaks-rd/test-prompts.json +12 -0
  473. package/skills/bee/peaks-reviewer/SKILL.md +17 -0
  474. package/skills/bee/peaks-sc/SKILL.md +16 -0
  475. package/skills/bee/peaks-security-audit/SKILL.md +17 -0
  476. package/skills/bee/peaks-txt/SKILL.md +16 -0
  477. package/skills/bee/peaks-txt/test-prompts.json +12 -0
  478. package/skills/bee/peaks-ui/SKILL.md +49 -43
  479. package/skills/bee/peaks-ui/test-prompts.json +12 -0
  480. package/skills/peaks-code/SKILL.md +54 -109
  481. package/skills/peaks-code/references/boundaries.md +15 -1
  482. package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
  483. package/skills/peaks-code/references/external-skill-invocation.md +27 -0
  484. package/skills/peaks-code/references/lease-dashboard.html +224 -0
  485. package/skills/peaks-code/references/lease-stats.sample.json +26 -0
  486. package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
  487. package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
  488. package/skills/peaks-code/references/runbook.md +63 -1
  489. package/skills/peaks-code/references/startup-sequence.md +110 -0
  490. package/skills/peaks-code/references/step-0-8-gate.md +1 -1
  491. package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
  492. package/skills/peaks-code/references/worktree-governance.md +123 -0
  493. package/skills/peaks-code/test-prompts.json +12 -0
  494. package/skills/peaks-doctor/SKILL.md +1 -1
  495. package/skills/peaks-ide/SKILL.md +1 -1
  496. package/skills/peaks-solo/SKILL.md +21 -0
  497. package/skills/peaks-solo/references/triage-decision-table.md +6 -0
  498. package/skills/peaks-sop/test-prompts.json +17 -0
  499. package/dist/cli/commands/agent-commands.d.ts +0 -20
  500. package/dist/cli/commands/agent-commands.js +0 -48
  501. package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
  502. package/dist/cli/commands/classify-classify-commands.js +0 -151
  503. package/dist/cli/commands/contract-commands.d.ts +0 -26
  504. package/dist/cli/commands/contract-commands.js +0 -114
  505. package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
  506. package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
  507. package/dist/cli/commands/worker-commands.d.ts +0 -3
  508. package/dist/cli/commands/worker-commands.js +0 -52
  509. package/dist/services/agent/ecc-agent-service.d.ts +0 -47
  510. package/dist/services/agent/ecc-agent-service.js +0 -143
  511. package/dist/services/config/provider-service.d.ts +0 -48
  512. package/dist/services/config/provider-service.js +0 -143
  513. package/dist/services/context/dispatch-context-guard.d.ts +0 -27
  514. package/dist/services/context/dispatch-context-guard.js +0 -192
  515. package/dist/services/context/shared-channel.d.ts +0 -93
  516. package/dist/services/context/shared-channel.js +0 -308
  517. package/dist/services/filesystem/file-lock.d.ts +0 -11
  518. package/dist/services/filesystem/file-lock.js +0 -152
  519. package/dist/services/mut/assert-scanner.d.ts +0 -6
  520. package/dist/services/mut/assert-scanner.js +0 -116
  521. package/dist/services/mut/index.d.ts +0 -8
  522. package/dist/services/mut/index.js +0 -7
  523. package/dist/services/mut/mut-runner.d.ts +0 -39
  524. package/dist/services/mut/mut-runner.js +0 -29
  525. package/dist/services/mut/production-stryker.d.ts +0 -2
  526. package/dist/services/mut/production-stryker.js +0 -75
  527. package/dist/services/mut/report-builder.d.ts +0 -11
  528. package/dist/services/mut/report-builder.js +0 -110
  529. package/dist/services/mut/report-loader.d.ts +0 -31
  530. package/dist/services/mut/report-loader.js +0 -78
  531. package/dist/services/mut/thresholds.d.ts +0 -21
  532. package/dist/services/mut/thresholds.js +0 -22
  533. package/dist/services/mut/types.d.ts +0 -336
  534. package/dist/services/mut/types.js +0 -59
  535. package/dist/services/providers/minimax-provider-service.d.ts +0 -24
  536. package/dist/services/providers/minimax-provider-service.js +0 -143
  537. package/dist/services/providers/minimax-worker-service.d.ts +0 -21
  538. package/dist/services/providers/minimax-worker-service.js +0 -83
  539. package/dist/shared/fs.d.ts +0 -4
  540. package/dist/shared/fs.js +0 -26
  541. package/dist/shared/paths.d.ts +0 -6
  542. package/dist/shared/paths.js +0 -50
  543. package/dist/shared/result.d.ts +0 -22
  544. package/dist/shared/result.js +0 -46
  545. package/dist/shared/version.d.ts +0 -1
  546. package/dist/shared/version.js +0 -1
  547. package/examples/video-demo/README.md +0 -142
  548. package/examples/video-demo/out/en-closing-960.png +0 -0
  549. package/examples/video-demo/out/zh-closing-960.png +0 -0
  550. package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
  551. package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
  552. /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * 24h mode B3 trigger evaluation + attempts counter.
3
+ *
4
+ * Rid-020a (state-only slice). `fireB3` is the single mutating
5
+ * primitive: it increments the per-key counter and escalates with a
6
+ * `B3Escalation` when the count reaches `B3_THRESHOLD` (3). The
7
+ * counter is **per-key** — AC-T3 mandates B1 and B2 retries do not
8
+ * share a global counter. The T3/T4 auto-24H_ACTIVE path is encoded
9
+ * in `isAutoEngageTrigger` (BRAINSTORM is bypassed for these
10
+ * triggers so an offline-resumed session does not deadlock in
11
+ * WAITING_USER — proposal §1 T3/T4 exception).
12
+ */
13
+ import { B3_THRESHOLD, isDecisionKey } from './state.js';
14
+ import { read24hState } from './store.js';
15
+ export const B3_TRIGGER_REASONS = [
16
+ 'prd_direction_change',
17
+ 'blocker_3_consecutive_slices',
18
+ 'registry_affecting_failure',
19
+ 'destructive_irreversible_op',
20
+ 'any_B1_B2_failure_3x_non_converging',
21
+ 'runtime_or_shared_version_mismatch',
22
+ 'sub-agent_stale_5min_x3'
23
+ ];
24
+ export class B3Escalation extends Error {
25
+ reason;
26
+ attempts;
27
+ constructor(reason, attempts) {
28
+ super(`B3 escalation: reason=${reason}, attempts=${attempts}`);
29
+ this.name = 'B3Escalation';
30
+ this.reason = reason;
31
+ this.attempts = attempts;
32
+ }
33
+ }
34
+ export function isB3Reason(value) {
35
+ return B3_TRIGGER_REASONS.includes(value);
36
+ }
37
+ export function isValidReason(value) {
38
+ return isDecisionKey(value);
39
+ }
40
+ export function freshAttempts() {
41
+ const out = {};
42
+ for (const key of B3_TRIGGER_REASONS)
43
+ out[key] = 0;
44
+ return out;
45
+ }
46
+ /**
47
+ * Per AC-T1 (attempts=1 continue, no B3) and AC-T2 (attempts=3
48
+ * escalate), the 3rd call escalates. The threshold is intentionally
49
+ * NOT configurable — the proposal pins the constant so QA v3 can
50
+ * assert it. Returns a FireB3Result instead of throwing so test
51
+ * code can read the `attempts` field via plain property access
52
+ * (Error-subclass property access through vitest 4.1.10 matchers
53
+ * is unreliable; the discriminated union sidesteps that).
54
+ */
55
+ export function fireB3(reason, attempts) {
56
+ const cur = attempts[reason] ?? 0;
57
+ const next = cur + 1;
58
+ attempts[reason] = next;
59
+ if (next >= B3_THRESHOLD) {
60
+ return { kind: 'escalate', reason, attempts: next };
61
+ }
62
+ return { kind: 'continue', reason, attempts: next };
63
+ }
64
+ /**
65
+ * T3 (runaway recovery) and T4 (offline resume) auto-engage
66
+ * `24H_ACTIVE` without forcing `USER_CONFIRM` — the deferred
67
+ * AskUserQuestion fires at the first 10min checkpoint instead, so
68
+ * a T4 session does not deadlock in `WAITING_USER` while the
69
+ * user is offline (proposal §1 T3/T4 exception).
70
+ */
71
+ export const AUTO_ENGAGE_TRIGGERS = ['T3', 'T4'];
72
+ export function isAutoEngageTrigger(t) {
73
+ return AUTO_ENGAGE_TRIGGERS.includes(t);
74
+ }
75
+ export const T1_KEYWORDS = ['24h', '通宵跑', '通宵', '夜跑', '夜机', '不计成本', '不停机'];
76
+ export const T2_MIN_SLICES = 30;
77
+ export const T2_MIN_WALL_HOURS = 6;
78
+ export const T3_MIN_MONOTONIC_GUARDS = 3;
79
+ export const T3_MIN_REMAINING_SLICES = 10;
80
+ export const T4_SESSION_GAP_HOURS = 4;
81
+ export const T5_MIN_ACTIVE_SLICES = 3;
82
+ export function checkTriggers(input) {
83
+ if (T1_KEYWORDS.some((kw) => input.userMessage.includes(kw))) {
84
+ return { triggered: true, trigger: 'T1', reason: `T1 keyword match in user message` };
85
+ }
86
+ if (input.sliceListSize >= T2_MIN_SLICES || input.estimatedWallHours >= T2_MIN_WALL_HOURS) {
87
+ return {
88
+ triggered: true,
89
+ trigger: 'T2',
90
+ reason: `T2 scale: sliceList=${input.sliceListSize} OR wallHours=${input.estimatedWallHours}`
91
+ };
92
+ }
93
+ if (input.monotonicGuards >= T3_MIN_MONOTONIC_GUARDS &&
94
+ input.remainingSlices >= T3_MIN_REMAINING_SLICES) {
95
+ return {
96
+ triggered: true,
97
+ trigger: 'T3',
98
+ reason: `T3 runaway recovery: monotonicGuards=${input.monotonicGuards} remaining=${input.remainingSlices}`
99
+ };
100
+ }
101
+ if (input.sessionGapHours >= T4_SESSION_GAP_HOURS && input.remainingSlices > 0) {
102
+ return {
103
+ triggered: true,
104
+ trigger: 'T4',
105
+ reason: `T4 offline resume: gapHours=${input.sessionGapHours} remaining=${input.remainingSlices}`
106
+ };
107
+ }
108
+ if (input.activeSlicesAcrossServices >= T5_MIN_ACTIVE_SLICES) {
109
+ return {
110
+ triggered: true,
111
+ trigger: 'T5',
112
+ reason: `T5 multi-business: activeAcrossServices=${input.activeSlicesAcrossServices}`
113
+ };
114
+ }
115
+ return { triggered: false, trigger: null, reason: 'no trigger' };
116
+ }
117
+ /**
118
+ * HANDOFF is reachable via three exit conditions per proposal §1:
119
+ * - user abort
120
+ * - all-trigger-resolved
121
+ * - B3 unresolvable (B3Escalation that the user dismisses)
122
+ */
123
+ export const HANDOFF_EXIT_CONDITIONS = ['user_abort', 'all_triggers_resolved', 'b3_unresolvable'];
124
+ export function isHandoffExitCondition(s) {
125
+ return HANDOFF_EXIT_CONDITIONS.includes(s);
126
+ }
127
+ export function isHandoffState(s) {
128
+ return s === 'HANDOFF';
129
+ }
130
+ /**
131
+ * Slice 2026-07-28 (rid-027): resolve the auto-compact mode from
132
+ * 24h-mode awareness. Returns `'partial'` when the session is
133
+ * `24H_ACTIVE`, otherwise `'standard'`. This is the CLI-side default;
134
+ * the explicit `--mode` flag in `peaks compact auto` overrides it.
135
+ */
136
+ export function getAutoCompactMode(projectRoot, sessionId) {
137
+ try {
138
+ const snap = read24hState(projectRoot, sessionId);
139
+ return snap.state === '24H_ACTIVE' ? 'partial' : 'standard';
140
+ }
141
+ catch {
142
+ return 'standard';
143
+ }
144
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Public barrel for 24h-mode service module.
3
+ *
4
+ * Rid-020a (state-only slice). Exports the 6-state enum, the
5
+ * DecisionKey enum, the persistence API, and the B3 decider API
6
+ * so that the `peaks session 24h-mode` CLI (and future rid-020b
7
+ * `peaks code run --24h`) can consume them without reaching into
8
+ * the internal file layout.
9
+ */
10
+ export { B3_THRESHOLD, DECISION_KEYS, STATES, emptyAttempts, isDecisionKey, isState, type DecisionKey, type State, type State24hSnapshot } from './state.js';
11
+ export { STATE_STORE_CONSTANTS, emptySnapshot, read24hState, write24hState } from './store.js';
12
+ export { AUTO_ENGAGE_TRIGGERS, B3_TRIGGER_REASONS, B3Escalation, HANDOFF_EXIT_CONDITIONS, T1_KEYWORDS, T2_MIN_SLICES, T2_MIN_WALL_HOURS, T3_MIN_MONOTONIC_GUARDS, T3_MIN_REMAINING_SLICES, T4_SESSION_GAP_HOURS, T5_MIN_ACTIVE_SLICES, checkTriggers, fireB3, freshAttempts, isAutoEngageTrigger, isB3Reason, isHandoffExitCondition, isHandoffState, isValidReason, type AttemptsMap, type AutoEngageTrigger, type B3Reason, type FireB3Result, type HandoffExitCondition, type TriggerCheck } from './decider.js';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Public barrel for 24h-mode service module.
3
+ *
4
+ * Rid-020a (state-only slice). Exports the 6-state enum, the
5
+ * DecisionKey enum, the persistence API, and the B3 decider API
6
+ * so that the `peaks session 24h-mode` CLI (and future rid-020b
7
+ * `peaks code run --24h`) can consume them without reaching into
8
+ * the internal file layout.
9
+ */
10
+ export { B3_THRESHOLD, DECISION_KEYS, STATES, emptyAttempts, isDecisionKey, isState } from './state.js';
11
+ export { STATE_STORE_CONSTANTS, emptySnapshot, read24hState, write24hState } from './store.js';
12
+ export { AUTO_ENGAGE_TRIGGERS, B3_TRIGGER_REASONS, B3Escalation, HANDOFF_EXIT_CONDITIONS, T1_KEYWORDS, T2_MIN_SLICES, T2_MIN_WALL_HOURS, T3_MIN_MONOTONIC_GUARDS, T3_MIN_REMAINING_SLICES, T4_SESSION_GAP_HOURS, T5_MIN_ACTIVE_SLICES, checkTriggers, fireB3, freshAttempts, isAutoEngageTrigger, isB3Reason, isHandoffExitCondition, isHandoffState, isValidReason } from './decider.js';
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 24h mode state machine — state types + DecisionKey enum.
3
+ *
4
+ * Rid-020a (state-only slice). The proposal defines six states that
5
+ * capture the lifecycle of a 24h code run; the DecisionKey enum is the
6
+ * enumeration of B1/B2 decision keys whose retry counter lives in
7
+ * `AttemptsMap`. Persistence and trigger evaluation live in sibling
8
+ * files; this module is pure data so the persistence tests can
9
+ * round-trip without pulling in IO and the decider tests can be
10
+ * exercised on an in-memory map.
11
+ */
12
+ export declare const STATES: readonly ["IDLE", "BRAINSTORM", "USER_CONFIRM", "24H_ACTIVE", "WAITING_USER", "HANDOFF"];
13
+ export type State = (typeof STATES)[number];
14
+ /**
15
+ * Reasons recorded in the persisted `attempts` map. Mirrors the
16
+ * 7 B3 trigger rows in the v2 proposal §1 (B3 trigger table) plus
17
+ * generic B1/B2 retry keys (per-key independence in AC-T3).
18
+ */
19
+ export declare const DECISION_KEYS: readonly ["prd_direction_change", "blocker_3_consecutive_slices", "registry_affecting_failure", "destructive_irreversible_op", "any_B1_B2_failure_3x_non_converging", "runtime_or_shared_version_mismatch", "sub-agent_stale_5min_x3"];
20
+ export type DecisionKey = (typeof DECISION_KEYS)[number];
21
+ /**
22
+ * B3 trigger threshold: per decision key, the 3rd consecutive fire
23
+ * escalates. Lower thresholds are not configurable here — proposal
24
+ * pins the constant so QA v3 can verify.
25
+ */
26
+ export declare const B3_THRESHOLD = 3;
27
+ /**
28
+ * The persisted shape for `.peaks/_runtime/<sessionId>/24h-state.json`.
29
+ * `enteredAt` is the ISO timestamp of the most recent state
30
+ * transition; `enteredFrom` is the previous state (or `null` for the
31
+ * IDLE bootstrap). `attempts` is keyed by `DecisionKey` and
32
+ * monotonically incremented by `fireB3`.
33
+ */
34
+ export interface State24hSnapshot {
35
+ state: State;
36
+ enteredAt: string;
37
+ enteredFrom: State | null;
38
+ activeSlices: string[];
39
+ monotonicGuards: number;
40
+ autoCompactCount: number;
41
+ checkpoints: number;
42
+ lastCheckpointAt: string | null;
43
+ attempts: Record<DecisionKey, number>;
44
+ exitCondition: string | null;
45
+ }
46
+ export declare function isState(value: string): value is State;
47
+ export declare function isDecisionKey(value: string): value is DecisionKey;
48
+ export declare function emptyAttempts(): Record<DecisionKey, number>;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * 24h mode state machine — state types + DecisionKey enum.
3
+ *
4
+ * Rid-020a (state-only slice). The proposal defines six states that
5
+ * capture the lifecycle of a 24h code run; the DecisionKey enum is the
6
+ * enumeration of B1/B2 decision keys whose retry counter lives in
7
+ * `AttemptsMap`. Persistence and trigger evaluation live in sibling
8
+ * files; this module is pure data so the persistence tests can
9
+ * round-trip without pulling in IO and the decider tests can be
10
+ * exercised on an in-memory map.
11
+ */
12
+ export const STATES = [
13
+ 'IDLE',
14
+ 'BRAINSTORM',
15
+ 'USER_CONFIRM',
16
+ '24H_ACTIVE',
17
+ 'WAITING_USER',
18
+ 'HANDOFF'
19
+ ];
20
+ /**
21
+ * Reasons recorded in the persisted `attempts` map. Mirrors the
22
+ * 7 B3 trigger rows in the v2 proposal §1 (B3 trigger table) plus
23
+ * generic B1/B2 retry keys (per-key independence in AC-T3).
24
+ */
25
+ export const DECISION_KEYS = [
26
+ 'prd_direction_change',
27
+ 'blocker_3_consecutive_slices',
28
+ 'registry_affecting_failure',
29
+ 'destructive_irreversible_op',
30
+ 'any_B1_B2_failure_3x_non_converging',
31
+ 'runtime_or_shared_version_mismatch',
32
+ 'sub-agent_stale_5min_x3'
33
+ ];
34
+ /**
35
+ * B3 trigger threshold: per decision key, the 3rd consecutive fire
36
+ * escalates. Lower thresholds are not configurable here — proposal
37
+ * pins the constant so QA v3 can verify.
38
+ */
39
+ export const B3_THRESHOLD = 3;
40
+ export function isState(value) {
41
+ return STATES.includes(value);
42
+ }
43
+ export function isDecisionKey(value) {
44
+ return DECISION_KEYS.includes(value);
45
+ }
46
+ export function emptyAttempts() {
47
+ const out = {};
48
+ for (const key of DECISION_KEYS)
49
+ out[key] = 0;
50
+ return out;
51
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 24h mode persistence — atomic JSON snapshot under
3
+ * `.peaks/_runtime/<sessionId>/24h-state.json`.
4
+ *
5
+ * Rid-020a (state-only slice). The store never invents a session id:
6
+ * the caller passes one (the CLI resolves it from `.peaks/_runtime/session.json`).
7
+ * Writes use the temp-file + rename pattern so a crash mid-write never
8
+ * leaves a half-written state file (atomic on POSIX, near-atomic on
9
+ * Windows — same approach used by `session-checkpoint-service.ts`).
10
+ */
11
+ import { type State24hSnapshot } from './state.js';
12
+ export declare function emptySnapshot(now?: Date): State24hSnapshot;
13
+ export declare function read24hState(projectRoot: string, sessionId: string): State24hSnapshot;
14
+ /**
15
+ * Atomic write: temp file in the same directory, then rename. The
16
+ * rename is a single syscall on POSIX and a single MoveFile on
17
+ * Windows — a crash in between leaves the previous valid snapshot
18
+ * intact. `fsync` on the temp file is omitted (we accept the
19
+ * same weaker contract that `session-checkpoint-service.ts` uses)
20
+ * because the state is reconstructible from the B3 attempt log.
21
+ */
22
+ export declare function write24hState(projectRoot: string, sessionId: string, snapshot: State24hSnapshot): {
23
+ path: string;
24
+ };
25
+ export declare const STATE_STORE_CONSTANTS: {
26
+ readonly STATE_FILENAME: "24h-state.json";
27
+ };
@@ -0,0 +1,119 @@
1
+ /**
2
+ * 24h mode persistence — atomic JSON snapshot under
3
+ * `.peaks/_runtime/<sessionId>/24h-state.json`.
4
+ *
5
+ * Rid-020a (state-only slice). The store never invents a session id:
6
+ * the caller passes one (the CLI resolves it from `.peaks/_runtime/session.json`).
7
+ * Writes use the temp-file + rename pattern so a crash mid-write never
8
+ * leaves a half-written state file (atomic on POSIX, near-atomic on
9
+ * Windows — same approach used by `session-checkpoint-service.ts`).
10
+ */
11
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
12
+ import { dirname, join } from 'node:path';
13
+ import { getSessionDir } from '../session/getSessionDir.js';
14
+ import { emptyAttempts, isDecisionKey, isState } from './state.js';
15
+ const STATE_FILENAME = '24h-state.json';
16
+ function statePath(projectRoot, sessionId) {
17
+ return join(getSessionDir(projectRoot, sessionId), STATE_FILENAME);
18
+ }
19
+ function isPlainObject(v) {
20
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
21
+ }
22
+ function coerceSnapshot(raw) {
23
+ if (!isPlainObject(raw)) {
24
+ throw new Error('24H_STATE_INVALID: root must be an object');
25
+ }
26
+ if (typeof raw['state'] !== 'string' || !isState(raw['state'])) {
27
+ throw new Error(`24H_STATE_INVALID: state must be one of IDLE|BRAINSTORM|USER_CONFIRM|24H_ACTIVE|WAITING_USER|HANDOFF (got ${JSON.stringify(raw['state'])})`);
28
+ }
29
+ if (typeof raw['enteredAt'] !== 'string') {
30
+ throw new Error('24H_STATE_INVALID: enteredAt must be an ISO string');
31
+ }
32
+ if (raw['enteredFrom'] !== null && (typeof raw['enteredFrom'] !== 'string' || !isState(raw['enteredFrom']))) {
33
+ throw new Error('24H_STATE_INVALID: enteredFrom must be a State or null');
34
+ }
35
+ if (!Array.isArray(raw['activeSlices']) || !raw['activeSlices'].every((s) => typeof s === 'string')) {
36
+ throw new Error('24H_STATE_INVALID: activeSlices must be string[]');
37
+ }
38
+ if (typeof raw['monotonicGuards'] !== 'number' || !Number.isInteger(raw['monotonicGuards'])) {
39
+ throw new Error('24H_STATE_INVALID: monotonicGuards must be a non-negative integer');
40
+ }
41
+ if (typeof raw['autoCompactCount'] !== 'number' || !Number.isInteger(raw['autoCompactCount'])) {
42
+ throw new Error('24H_STATE_INVALID: autoCompactCount must be a non-negative integer');
43
+ }
44
+ if (typeof raw['checkpoints'] !== 'number' || !Number.isInteger(raw['checkpoints'])) {
45
+ throw new Error('24H_STATE_INVALID: checkpoints must be a non-negative integer');
46
+ }
47
+ if (raw['lastCheckpointAt'] !== null && typeof raw['lastCheckpointAt'] !== 'string') {
48
+ throw new Error('24H_STATE_INVALID: lastCheckpointAt must be ISO string or null');
49
+ }
50
+ if (raw['exitCondition'] !== null && typeof raw['exitCondition'] !== 'string') {
51
+ throw new Error('24H_STATE_INVALID: exitCondition must be string or null');
52
+ }
53
+ const rawAttempts = raw['attempts'];
54
+ if (!isPlainObject(rawAttempts)) {
55
+ throw new Error('24H_STATE_INVALID: attempts must be an object');
56
+ }
57
+ const attempts = emptyAttempts();
58
+ for (const [k, v] of Object.entries(rawAttempts)) {
59
+ if (!isDecisionKey(k)) {
60
+ throw new Error(`24H_STATE_INVALID: attempts has unknown key ${k}`);
61
+ }
62
+ if (typeof v !== 'number' || !Number.isInteger(v) || v < 0) {
63
+ throw new Error(`24H_STATE_INVALID: attempts.${k} must be a non-negative integer`);
64
+ }
65
+ attempts[k] = v;
66
+ }
67
+ return {
68
+ state: raw['state'],
69
+ enteredAt: raw['enteredAt'],
70
+ enteredFrom: raw['enteredFrom'],
71
+ activeSlices: raw['activeSlices'],
72
+ monotonicGuards: raw['monotonicGuards'],
73
+ autoCompactCount: raw['autoCompactCount'],
74
+ checkpoints: raw['checkpoints'],
75
+ lastCheckpointAt: raw['lastCheckpointAt'],
76
+ attempts,
77
+ exitCondition: raw['exitCondition']
78
+ };
79
+ }
80
+ export function emptySnapshot(now = new Date()) {
81
+ return {
82
+ state: 'IDLE',
83
+ enteredAt: now.toISOString(),
84
+ enteredFrom: null,
85
+ activeSlices: [],
86
+ monotonicGuards: 0,
87
+ autoCompactCount: 0,
88
+ checkpoints: 0,
89
+ lastCheckpointAt: null,
90
+ attempts: emptyAttempts(),
91
+ exitCondition: null
92
+ };
93
+ }
94
+ export function read24hState(projectRoot, sessionId) {
95
+ const path = statePath(projectRoot, sessionId);
96
+ if (!existsSync(path))
97
+ return emptySnapshot();
98
+ const raw = readFileSync(path, 'utf8');
99
+ return coerceSnapshot(JSON.parse(raw));
100
+ }
101
+ /**
102
+ * Atomic write: temp file in the same directory, then rename. The
103
+ * rename is a single syscall on POSIX and a single MoveFile on
104
+ * Windows — a crash in between leaves the previous valid snapshot
105
+ * intact. `fsync` on the temp file is omitted (we accept the
106
+ * same weaker contract that `session-checkpoint-service.ts` uses)
107
+ * because the state is reconstructible from the B3 attempt log.
108
+ */
109
+ export function write24hState(projectRoot, sessionId, snapshot) {
110
+ const path = statePath(projectRoot, sessionId);
111
+ mkdirSync(dirname(path), { recursive: true });
112
+ const tmp = `${path}.tmp-${process.pid}-${Date.now()}`;
113
+ writeFileSync(tmp, JSON.stringify(snapshot, null, 2) + '\n', 'utf8');
114
+ renameSync(tmp, path);
115
+ return { path };
116
+ }
117
+ export const STATE_STORE_CONSTANTS = {
118
+ STATE_FILENAME
119
+ };
@@ -1,6 +1,6 @@
1
1
  import { join, dirname, basename } from 'node:path';
2
2
  import { readFile, readdir } from 'node:fs/promises';
3
- import { pathExists } from '../../shared/fs.js';
3
+ import { pathExists } from 'peaks-loop-shared/fs';
4
4
  import { emitObservabilityEvent } from '../observability/observability-service.js';
5
5
  export const VALID_REQUEST_TYPES = [
6
6
  'feature',
@@ -1,7 +1,7 @@
1
1
  import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
2
2
  import { existsSync } from 'node:fs';
3
3
  import { dirname, join } from 'node:path';
4
- import { isDirectory, listDirectories } from '../../shared/fs.js';
4
+ import { isDirectory, listDirectories } from 'peaks-loop-shared/fs';
5
5
  import { checkPrerequisites, DEFAULT_REQUEST_TYPE, isRequestType, VALID_REQUEST_TYPES } from './artifact-prerequisites.js';
6
6
  import { ensureSession, getSessionIdCanonical } from '../session/session-manager.js';
7
7
  // Slice 2026-06-29-change-id-root-removal: `getCurrentChangeId` was
@@ -3,7 +3,7 @@ import { Buffer } from 'node:buffer';
3
3
  import { resolve } from 'node:path';
4
4
  import { isInsidePath, stablePath } from '../../shared/path-utils.js';
5
5
  import { getWorkspaceConfig, getWorkspaceConfigForCurrentPath } from '../config/config-service.js';
6
- import { pathExists } from '../../shared/fs.js';
6
+ import { pathExists } from 'peaks-loop-shared/fs';
7
7
  import { execCommand } from '../../shared/process.js';
8
8
  function canonicalPath(path) {
9
9
  return stablePath(path);
@@ -0,0 +1,25 @@
1
+ /**
2
+ * P2-b sweep 008 — peaks-rd / peaks-ui / peaks-txt / peaks-sc
3
+ * runtime contract enforcer. Closes six discovered lines:
4
+ *
5
+ * - peaks-rd-skill-md-166 : OpenSpec usage (BLOCKING)
6
+ * - peaks-rd-skill-md-184 : Frontend project generation (MUST NOT)
7
+ * - peaks-sc-skill-md-150 : Transition verification gates (MANDATORY)
8
+ * - peaks-txt-skill-md-266 : Memory block embedding rule (MANDATORY)
9
+ * - peaks-txt-skill-md-277 : Transition verification gates (MANDATORY)
10
+ * - peaks-ui-skill-md-188 : Transition verification gates (MANDATORY)
11
+ *
12
+ * The contract is a single enforcer per skill: each skill
13
+ * declares its own runtime contract markers. The sweep covers
14
+ * 3 marker classes (OpenSpec, FrontendGen, TransitionGates,
15
+ * MemoryBlock) by 4 skills (rd, ui, sc, txt).
16
+ *
17
+ * scope: each helper scopes to a specific skill via the
18
+ * `name` field on SkillFile; ui-363 + peaks-rd-58 (skill
19
+ * presence) are already closed by sweep 003.
20
+ */
21
+ import type { LintHit, SkillFile } from './lint-style.js';
22
+ export declare function lintRdRuntimeContract(skill: SkillFile): ReadonlyArray<LintHit>;
23
+ export declare function lintUiTransitionGates(skill: SkillFile): ReadonlyArray<LintHit>;
24
+ export declare function lintScTransitionGates(skill: SkillFile): ReadonlyArray<LintHit>;
25
+ export declare function lintTxtRuntimeContract(skill: SkillFile): ReadonlyArray<LintHit>;
@@ -0,0 +1,91 @@
1
+ const OPENSPEC_USAGE = /use openspec when the/i;
2
+ const FRONTEND_PROJECT_GENERATION = /rd work creates a frontend application/i;
3
+ const TRANSITION_GATES = /Transition verification gates/im;
4
+ const MEMORY_BLOCK_EMBEDDING = /memory block embedding rule/i;
5
+ function findContract(lines) {
6
+ let openspec = false;
7
+ let frontendGen = false;
8
+ let transitionGates = false;
9
+ let memoryBlock = false;
10
+ for (const line of lines) {
11
+ if (OPENSPEC_USAGE.test(line))
12
+ openspec = true;
13
+ if (FRONTEND_PROJECT_GENERATION.test(line))
14
+ frontendGen = true;
15
+ if (TRANSITION_GATES.test(line))
16
+ transitionGates = true;
17
+ if (MEMORY_BLOCK_EMBEDDING.test(line))
18
+ memoryBlock = true;
19
+ }
20
+ return { openspec, frontendGen, transitionGates, memoryBlock };
21
+ }
22
+ export function lintRdRuntimeContract(skill) {
23
+ if (skill.name !== 'peaks-rd')
24
+ return [];
25
+ const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
26
+ const { openspec, frontendGen } = findContract(lines);
27
+ if (openspec && frontendGen)
28
+ return [];
29
+ const missing = [];
30
+ if (!openspec)
31
+ missing.push('OpenSpec usage');
32
+ if (!frontendGen)
33
+ missing.push('Frontend project generation');
34
+ return [{
35
+ catalogId: 'rl-peaks-rd-runtime-contract-001',
36
+ rule: 'peaks-rd SKILL.md must declare the runtime contract (OpenSpec usage + Frontend project generation)',
37
+ file: skill.path,
38
+ line: 1,
39
+ matchedText: `missing markers: ${missing.join(', ')}`
40
+ }];
41
+ }
42
+ export function lintUiTransitionGates(skill) {
43
+ if (skill.name !== 'peaks-ui')
44
+ return [];
45
+ const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
46
+ const { transitionGates } = findContract(lines);
47
+ if (transitionGates)
48
+ return [];
49
+ return [{
50
+ catalogId: 'rl-peaks-ui-transition-gates-001',
51
+ rule: 'peaks-ui SKILL.md must declare the Transition verification gates section',
52
+ file: skill.path,
53
+ line: 1,
54
+ matchedText: 'missing "Transition verification gates" heading'
55
+ }];
56
+ }
57
+ export function lintScTransitionGates(skill) {
58
+ if (skill.name !== 'peaks-sc')
59
+ return [];
60
+ const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
61
+ const { transitionGates } = findContract(lines);
62
+ if (transitionGates)
63
+ return [];
64
+ return [{
65
+ catalogId: 'rl-peaks-sc-transition-gates-001',
66
+ rule: 'peaks-sc SKILL.md must declare the Transition verification gates section',
67
+ file: skill.path,
68
+ line: 1,
69
+ matchedText: 'missing "Transition verification gates" heading'
70
+ }];
71
+ }
72
+ export function lintTxtRuntimeContract(skill) {
73
+ if (skill.name !== 'peaks-txt')
74
+ return [];
75
+ const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
76
+ const { transitionGates, memoryBlock } = findContract(lines);
77
+ if (transitionGates && memoryBlock)
78
+ return [];
79
+ const missing = [];
80
+ if (!transitionGates)
81
+ missing.push('Transition verification gates');
82
+ if (!memoryBlock)
83
+ missing.push('Memory block embedding rule');
84
+ return [{
85
+ catalogId: 'rl-peaks-txt-runtime-contract-001',
86
+ rule: 'peaks-txt SKILL.md must declare the runtime contract (Transition verification gates + Memory block embedding rule)',
87
+ file: skill.path,
88
+ line: 1,
89
+ matchedText: `missing markers: ${missing.join(', ')}`
90
+ }];
91
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * P2-b sweep 009 — peaks-code SKILL.md runtime contract.
3
+ * Single enforcer closing 13 of the 33 remaining discovered
4
+ * lines (peaks-code-skill-md-6, 79, 93, 111, 119, 121, 123,
5
+ * 125, 153, 184, 188, 248).
6
+ *
7
+ * The contract is the section-marker skeleton that every
8
+ * peaks-code SKILL.md must declare. Each heading is one of
9
+ * the peaks-code runbook's red-line chapters; the enforcer
10
+ * checks the headings are present and emits a hit on each
11
+ * missing one.
12
+ *
13
+ * scope: peaks-code only.
14
+ */
15
+ import type { LintHit, SkillFile } from './lint-style.js';
16
+ export declare function lintPeaksCodeRuntimeContract(skill: SkillFile): ReadonlyArray<LintHit>;
@@ -0,0 +1,31 @@
1
+ const REQUIRED_HEADINGS = Object.freeze([
2
+ { name: 'Scope (rl-8 red line)', pattern: /scope \(rl-8/i },
3
+ { name: 'No auto-compact prose ban', pattern: /no auto-compact prose ban/i },
4
+ { name: 'Superpowers 协作边界', pattern: /peaks-loop superpowers 协作边界/i },
5
+ { name: 'npm-contract boundary', pattern: /npm-contract boundary/i },
6
+ { name: 'Startup sequence', pattern: /peaks-loop startup sequence/i },
7
+ { name: 'Step 0.8 job-shape detection', pattern: /step 0\.8.*job-shape detection/i },
8
+ { name: 'Local intermediate artifact workspace', pattern: /peaks-loop local intermediate artifact workspace/i },
9
+ { name: 'Pre-rd project scan checklist', pattern: /peaks-loop pre-rd project scan checklist/i },
10
+ { name: 'Step 11 memory sediment', pattern: /step 11.*memory sediment/i },
11
+ { name: '--enforce-job-mode (v3.1.2)', pattern: /enforce-job-mode \(v3\.1\.2\)/i }
12
+ ]);
13
+ export function lintPeaksCodeRuntimeContract(skill) {
14
+ if (skill.name !== 'peaks-code')
15
+ return [];
16
+ const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
17
+ const missing = [];
18
+ for (const h of REQUIRED_HEADINGS) {
19
+ if (!lines.some((l) => h.pattern.test(l)))
20
+ missing.push(h.name);
21
+ }
22
+ if (missing.length === 0)
23
+ return [];
24
+ return [{
25
+ catalogId: 'rl-peaks-code-runtime-contract-001',
26
+ rule: 'peaks-code SKILL.md must declare the runbook section markers (Scope, no auto-compact, superpowers bridge, npm-contract, startup sequence, step 0.8 job-shape, local intermediate artifact workspace, pre-rd project scan checklist, step 11 memory sediment, --enforce-job-mode v3.1.2).',
27
+ file: skill.path,
28
+ line: 1,
29
+ matchedText: `missing markers: ${missing.join(', ')}`
30
+ }];
31
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * P2-b sweep 010 — peaks-* runtime contract enforcer (excluding
3
+ * peaks-code which has its own sweep 009 enforcer; excluding
4
+ * peaks-prd / peaks-rd / peaks-qa / peaks-ui / peaks-sc / peaks-txt
5
+ * which have their own per-skill enforcers in earlier sweeps).
6
+ *
7
+ * Closes 8 of the remaining 22 discovered lines:
8
+ * - peaks-audit-skill-md-52, 70, 125, 133
9
+ * - peaks-content-skill-md-141, 235
10
+ * - peaks-ide-skill-md-12, 114
11
+ *
12
+ * The contract is the section-marker skeleton that every
13
+ * peaks-* SKILL.md must declare. Single enforcer scopes per
14
+ * skill via the SkillFile.name field.
15
+ */
16
+ import type { LintHit, SkillFile } from './lint-style.js';
17
+ export declare const lintPeaksAuditRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
18
+ export declare const lintPeaksContentRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
19
+ export declare const lintPeaksIdeRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
20
+ export declare const lintPeaksDoctorRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
21
+ export declare const lintPeaksIssueFixOrchestratorRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
22
+ export declare const lintPeaksSopRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
23
+ export declare const lintPeaksSliceDecomposeRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;