peaks-loop 4.1.3 → 4.1.4

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 (402) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +56 -0
  3. package/README-en.md +1 -1
  4. package/README.md +1 -1
  5. package/dist/cli/commands/asset-command-shared.d.ts +12 -0
  6. package/dist/cli/commands/asset-command-shared.js +45 -0
  7. package/dist/cli/commands/asset-commands.d.ts +6 -1
  8. package/dist/cli/commands/asset-commands.js +11 -372
  9. package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
  10. package/dist/cli/commands/asset-crystallize-command.js +60 -0
  11. package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
  12. package/dist/cli/commands/asset-crystallize-payload.js +85 -0
  13. package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
  14. package/dist/cli/commands/asset-crystallize-runner.js +133 -0
  15. package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
  16. package/dist/cli/commands/asset-dispose-command.js +99 -0
  17. package/dist/cli/commands/asset-status-command.d.ts +3 -0
  18. package/dist/cli/commands/asset-status-command.js +100 -0
  19. package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
  20. package/dist/cli/commands/baseline-audit-command.js +64 -0
  21. package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
  22. package/dist/cli/commands/baseline-command-shared.js +39 -0
  23. package/dist/cli/commands/baseline-commands.js +33 -313
  24. package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
  25. package/dist/cli/commands/baseline-freeze-commands.js +81 -0
  26. package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
  27. package/dist/cli/commands/baseline-guard-command.js +52 -0
  28. package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
  29. package/dist/cli/commands/baseline-read-commands.js +72 -0
  30. package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
  31. package/dist/cli/commands/baseline-rollback-commands.js +88 -0
  32. package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
  33. package/dist/cli/commands/classify-downgrade-command.js +21 -0
  34. package/dist/cli/commands/classify-run-command.d.ts +9 -0
  35. package/dist/cli/commands/classify-run-command.js +73 -0
  36. package/dist/cli/commands/classify-signals.d.ts +5 -0
  37. package/dist/cli/commands/classify-signals.js +104 -0
  38. package/dist/cli/commands/code-emit-handoff-command.js +40 -3
  39. package/dist/cli/commands/code-gate-step-08-command.js +25 -9
  40. package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
  41. package/dist/cli/commands/codegraph-command-options.js +22 -0
  42. package/dist/cli/commands/codegraph-commands.d.ts +2 -2
  43. package/dist/cli/commands/codegraph-commands.js +14 -397
  44. package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
  45. package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
  46. package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
  47. package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
  48. package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
  49. package/dist/cli/commands/codegraph-repair-commands.js +94 -0
  50. package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
  51. package/dist/cli/commands/codegraph-status-command.js +27 -214
  52. package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
  53. package/dist/cli/commands/codegraph-status-integrity.js +121 -0
  54. package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
  55. package/dist/cli/commands/codegraph-status-json.js +127 -0
  56. package/dist/cli/commands/container-command-shared.d.ts +60 -0
  57. package/dist/cli/commands/container-command-shared.js +52 -0
  58. package/dist/cli/commands/container-commands.d.ts +1 -1
  59. package/dist/cli/commands/container-commands.js +4 -216
  60. package/dist/cli/commands/container-release-command.d.ts +3 -0
  61. package/dist/cli/commands/container-release-command.js +105 -0
  62. package/dist/cli/commands/container-spawn-command.d.ts +3 -0
  63. package/dist/cli/commands/container-spawn-command.js +148 -0
  64. package/dist/cli/commands/context-check-command.d.ts +3 -0
  65. package/dist/cli/commands/context-check-command.js +81 -0
  66. package/dist/cli/commands/context-commands.d.ts +2 -7
  67. package/dist/cli/commands/context-commands.js +6 -276
  68. package/dist/cli/commands/context-layer-command.d.ts +3 -0
  69. package/dist/cli/commands/context-layer-command.js +34 -0
  70. package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
  71. package/dist/cli/commands/context-layer-fetchers.js +162 -0
  72. package/dist/cli/commands/context-status-command.d.ts +17 -0
  73. package/dist/cli/commands/context-status-command.js +41 -0
  74. package/dist/cli/commands/contract-write-command.d.ts +3 -0
  75. package/dist/cli/commands/contract-write-command.js +144 -0
  76. package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
  77. package/dist/cli/commands/core/doctor-bindings.js +30 -0
  78. package/dist/cli/commands/core/doctor-command.d.ts +4 -18
  79. package/dist/cli/commands/core/doctor-command.js +2 -323
  80. package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
  81. package/dist/cli/commands/core/doctor-logs.js +32 -0
  82. package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
  83. package/dist/cli/commands/core/doctor-probes.js +55 -0
  84. package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
  85. package/dist/cli/commands/core/doctor-run-command.js +172 -0
  86. package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
  87. package/dist/cli/commands/core/doctor-summary.js +39 -0
  88. package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
  89. package/dist/cli/commands/core/memory-command-shared.js +20 -0
  90. package/dist/cli/commands/core/memory-command.d.ts +1 -1
  91. package/dist/cli/commands/core/memory-command.js +6 -227
  92. package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
  93. package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
  94. package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
  95. package/dist/cli/commands/core/memory-extract-command.js +90 -0
  96. package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
  97. package/dist/cli/commands/core/memory-sync-command.js +38 -0
  98. package/dist/cli/commands/core/session-command.d.ts +1 -1
  99. package/dist/cli/commands/core/session-command.js +12 -206
  100. package/dist/cli/commands/core/session-info-command.d.ts +3 -0
  101. package/dist/cli/commands/core/session-info-command.js +142 -0
  102. package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
  103. package/dist/cli/commands/core/session-verb-commands.js +58 -0
  104. package/dist/cli/commands/core/standards-command.d.ts +1 -24
  105. package/dist/cli/commands/core/standards-command.js +33 -201
  106. package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
  107. package/dist/cli/commands/core/standards-init-command.js +87 -0
  108. package/dist/cli/commands/core/standards-lint.d.ts +24 -0
  109. package/dist/cli/commands/core/standards-lint.js +57 -0
  110. package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
  111. package/dist/cli/commands/core/standards-migrate-command.js +57 -0
  112. package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
  113. package/dist/cli/commands/cron-scheduler-commands.js +36 -206
  114. package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
  115. package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
  116. package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
  117. package/dist/cli/commands/cron-scheduler-shared.js +48 -0
  118. package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
  119. package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
  120. package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
  121. package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
  122. package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
  123. package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
  124. package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
  125. package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
  126. package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
  127. package/dist/cli/commands/dispatch-dag-failure.js +16 -0
  128. package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
  129. package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
  130. package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
  131. package/dist/cli/commands/dispatch-dag-runners.js +73 -0
  132. package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
  133. package/dist/cli/commands/dispatch-from-dag.js +87 -257
  134. package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
  135. package/dist/cli/commands/final-review-command-envelopes.js +100 -0
  136. package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
  137. package/dist/cli/commands/final-review-command-shared.js +35 -0
  138. package/dist/cli/commands/final-review-commands.d.ts +7 -27
  139. package/dist/cli/commands/final-review-commands.js +13 -240
  140. package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
  141. package/dist/cli/commands/final-review-prepare-command.js +200 -0
  142. package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
  143. package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
  144. package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
  145. package/dist/cli/commands/hooks-command-shared.js +32 -0
  146. package/dist/cli/commands/hooks-commands.d.ts +20 -0
  147. package/dist/cli/commands/hooks-commands.js +75 -309
  148. package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
  149. package/dist/cli/commands/hooks-install-envelopes.js +144 -0
  150. package/dist/cli/commands/hooks-status-command.d.ts +3 -0
  151. package/dist/cli/commands/hooks-status-command.js +93 -0
  152. package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
  153. package/dist/cli/commands/hooks-uninstall-command.js +43 -0
  154. package/dist/cli/commands/loop-command-shared.d.ts +31 -0
  155. package/dist/cli/commands/loop-command-shared.js +15 -0
  156. package/dist/cli/commands/loop-commands.d.ts +12 -17
  157. package/dist/cli/commands/loop-commands.js +56 -238
  158. package/dist/cli/commands/loop-export-command.d.ts +3 -0
  159. package/dist/cli/commands/loop-export-command.js +73 -0
  160. package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
  161. package/dist/cli/commands/loop-goal-compose-command.js +36 -0
  162. package/dist/cli/commands/loop-import-command.d.ts +3 -0
  163. package/dist/cli/commands/loop-import-command.js +86 -0
  164. package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
  165. package/dist/cli/commands/loop-placeholder-commands.js +52 -0
  166. package/dist/cli/commands/memory-command-shared.d.ts +59 -0
  167. package/dist/cli/commands/memory-command-shared.js +39 -0
  168. package/dist/cli/commands/memory-commands.d.ts +6 -79
  169. package/dist/cli/commands/memory-commands.js +19 -309
  170. package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
  171. package/dist/cli/commands/memory-ingest-command.js +50 -0
  172. package/dist/cli/commands/memory-list-command.d.ts +16 -0
  173. package/dist/cli/commands/memory-list-command.js +129 -0
  174. package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
  175. package/dist/cli/commands/memory-reindex-command.js +78 -0
  176. package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
  177. package/dist/cli/commands/memory-rotate-command.js +55 -0
  178. package/dist/cli/commands/memory-search-command.d.ts +7 -0
  179. package/dist/cli/commands/memory-search-command.js +46 -0
  180. package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
  181. package/dist/cli/commands/openspec-archive-command.js +55 -0
  182. package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
  183. package/dist/cli/commands/openspec-command-shared.js +135 -0
  184. package/dist/cli/commands/openspec-commands.d.ts +1 -1
  185. package/dist/cli/commands/openspec-commands.js +33 -306
  186. package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
  187. package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
  188. package/dist/cli/commands/openspec-init-command.d.ts +3 -0
  189. package/dist/cli/commands/openspec-init-command.js +49 -0
  190. package/dist/cli/commands/openspec-list-command.d.ts +3 -0
  191. package/dist/cli/commands/openspec-list-command.js +27 -0
  192. package/dist/cli/commands/openspec-render-command.d.ts +3 -0
  193. package/dist/cli/commands/openspec-render-command.js +33 -0
  194. package/dist/cli/commands/openspec-show-command.d.ts +3 -0
  195. package/dist/cli/commands/openspec-show-command.js +33 -0
  196. package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
  197. package/dist/cli/commands/openspec-to-rd-command.js +33 -0
  198. package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
  199. package/dist/cli/commands/openspec-validate-command.js +45 -0
  200. package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
  201. package/dist/cli/commands/playwright-browser-command.js +61 -0
  202. package/dist/cli/commands/playwright-commands.d.ts +10 -62
  203. package/dist/cli/commands/playwright-commands.js +77 -400
  204. package/dist/cli/commands/playwright-envelope.d.ts +8 -0
  205. package/dist/cli/commands/playwright-envelope.js +29 -0
  206. package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
  207. package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
  208. package/dist/cli/commands/playwright-session-store.d.ts +65 -0
  209. package/dist/cli/commands/playwright-session-store.js +189 -0
  210. package/dist/cli/commands/project-commands.d.ts +19 -0
  211. package/dist/cli/commands/project-commands.js +98 -259
  212. package/dist/cli/commands/project-context-command.d.ts +3 -0
  213. package/dist/cli/commands/project-context-command.js +44 -0
  214. package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
  215. package/dist/cli/commands/project-dashboard-command.js +74 -0
  216. package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
  217. package/dist/cli/commands/project-knowledge-command.js +48 -0
  218. package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
  219. package/dist/cli/commands/project-memories-show-command.js +87 -0
  220. package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
  221. package/dist/cli/commands/project-memory-index-command.js +31 -0
  222. package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
  223. package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
  224. package/dist/cli/commands/qa-commands.d.ts +14 -87
  225. package/dist/cli/commands/qa-commands.js +17 -315
  226. package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
  227. package/dist/cli/commands/qa-context-prestep.js +34 -0
  228. package/dist/cli/commands/qa-run-command.d.ts +3 -0
  229. package/dist/cli/commands/qa-run-command.js +105 -0
  230. package/dist/cli/commands/qa-run-options.d.ts +23 -0
  231. package/dist/cli/commands/qa-run-options.js +31 -0
  232. package/dist/cli/commands/qa-run-slice.d.ts +41 -0
  233. package/dist/cli/commands/qa-run-slice.js +145 -0
  234. package/dist/cli/commands/release-canary-command.d.ts +28 -0
  235. package/dist/cli/commands/release-canary-command.js +129 -0
  236. package/dist/cli/commands/release-command-shared.d.ts +13 -0
  237. package/dist/cli/commands/release-command-shared.js +18 -0
  238. package/dist/cli/commands/release-commands.d.ts +10 -18
  239. package/dist/cli/commands/release-commands.js +25 -298
  240. package/dist/cli/commands/release-done-command.d.ts +3 -0
  241. package/dist/cli/commands/release-done-command.js +64 -0
  242. package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
  243. package/dist/cli/commands/release-hotfix-command.js +50 -0
  244. package/dist/cli/commands/release-plan-command.d.ts +3 -0
  245. package/dist/cli/commands/release-plan-command.js +33 -0
  246. package/dist/cli/commands/release-precheck-command.d.ts +3 -0
  247. package/dist/cli/commands/release-precheck-command.js +28 -0
  248. package/dist/cli/commands/release-promote-command.d.ts +3 -0
  249. package/dist/cli/commands/release-promote-command.js +34 -0
  250. package/dist/cli/commands/release-rollback-command.d.ts +3 -0
  251. package/dist/cli/commands/release-rollback-command.js +33 -0
  252. package/dist/cli/commands/release-watch-command.d.ts +3 -0
  253. package/dist/cli/commands/release-watch-command.js +44 -0
  254. package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
  255. package/dist/cli/commands/sediment-argv-flags.js +116 -0
  256. package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
  257. package/dist/cli/commands/sediment-command-shared.js +5 -0
  258. package/dist/cli/commands/sediment-commands.d.ts +35 -59
  259. package/dist/cli/commands/sediment-commands.js +36 -590
  260. package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
  261. package/dist/cli/commands/sediment-pool-commands.js +185 -0
  262. package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
  263. package/dist/cli/commands/sediment-query-commands.js +94 -0
  264. package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
  265. package/dist/cli/commands/sediment-release-commands.js +232 -0
  266. package/dist/cli/commands/sop-advance-command.d.ts +3 -0
  267. package/dist/cli/commands/sop-advance-command.js +160 -0
  268. package/dist/cli/commands/sop-check-command.d.ts +3 -0
  269. package/dist/cli/commands/sop-check-command.js +44 -0
  270. package/dist/cli/commands/sop-command-shared.d.ts +23 -0
  271. package/dist/cli/commands/sop-command-shared.js +18 -0
  272. package/dist/cli/commands/sop-commands.d.ts +15 -1
  273. package/dist/cli/commands/sop-commands.js +26 -240
  274. package/dist/cli/commands/sop-init-command.d.ts +3 -0
  275. package/dist/cli/commands/sop-init-command.js +51 -0
  276. package/dist/cli/commands/sop-lint-command.d.ts +3 -0
  277. package/dist/cli/commands/sop-lint-command.js +64 -0
  278. package/dist/cli/commands/sop-register-command.d.ts +3 -0
  279. package/dist/cli/commands/sop-register-command.js +48 -0
  280. package/dist/cli/commands/sop-registry-command.d.ts +3 -0
  281. package/dist/cli/commands/sop-registry-command.js +30 -0
  282. package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
  283. package/dist/cli/commands/statusline-command-shared.js +90 -0
  284. package/dist/cli/commands/statusline-commands.d.ts +1 -19
  285. package/dist/cli/commands/statusline-commands.js +48 -287
  286. package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
  287. package/dist/cli/commands/statusline-compact-command.js +54 -0
  288. package/dist/cli/commands/statusline-install-command.d.ts +3 -0
  289. package/dist/cli/commands/statusline-install-command.js +48 -0
  290. package/dist/cli/commands/statusline-render-command.d.ts +9 -0
  291. package/dist/cli/commands/statusline-render-command.js +55 -0
  292. package/dist/cli/commands/statusline-status-command.d.ts +3 -0
  293. package/dist/cli/commands/statusline-status-command.js +23 -0
  294. package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
  295. package/dist/cli/commands/statusline-uninstall-command.js +23 -0
  296. package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
  297. package/dist/cli/commands/test-command-run-helpers.js +73 -0
  298. package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
  299. package/dist/cli/commands/test-command-runner-resolution.js +183 -0
  300. package/dist/cli/commands/test-commands.d.ts +8 -56
  301. package/dist/cli/commands/test-commands.js +26 -249
  302. package/dist/cli/commands/vm-command-shared.d.ts +23 -0
  303. package/dist/cli/commands/vm-command-shared.js +23 -0
  304. package/dist/cli/commands/vm-commands.d.ts +1 -28
  305. package/dist/cli/commands/vm-commands.js +36 -270
  306. package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
  307. package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
  308. package/dist/cli/commands/vm-release-command.d.ts +5 -0
  309. package/dist/cli/commands/vm-release-command.js +101 -0
  310. package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
  311. package/dist/cli/commands/vm-spawn-command.js +177 -0
  312. package/dist/cli/commands/web-command-shared.d.ts +12 -0
  313. package/dist/cli/commands/web-command-shared.js +30 -0
  314. package/dist/cli/commands/web-commands.d.ts +7 -14
  315. package/dist/cli/commands/web-commands.js +6 -314
  316. package/dist/cli/commands/web-install-command.d.ts +10 -0
  317. package/dist/cli/commands/web-install-command.js +116 -0
  318. package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
  319. package/dist/cli/commands/web-lifecycle-commands.js +14 -322
  320. package/dist/cli/commands/web-login-command.d.ts +14 -0
  321. package/dist/cli/commands/web-login-command.js +189 -0
  322. package/dist/cli/commands/web-op-payload.d.ts +22 -0
  323. package/dist/cli/commands/web-op-payload.js +89 -0
  324. package/dist/cli/commands/web-op-refusals.d.ts +37 -0
  325. package/dist/cli/commands/web-op-refusals.js +73 -0
  326. package/dist/cli/commands/web-op-runner.d.ts +14 -0
  327. package/dist/cli/commands/web-op-runner.js +166 -0
  328. package/dist/cli/commands/web-status-command.d.ts +4 -0
  329. package/dist/cli/commands/web-status-command.js +32 -0
  330. package/dist/cli/commands/web-stop-command.d.ts +10 -0
  331. package/dist/cli/commands/web-stop-command.js +59 -0
  332. package/dist/cli/commands/web-verb-specs.d.ts +18 -0
  333. package/dist/cli/commands/web-verb-specs.js +66 -0
  334. package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
  335. package/dist/cli/commands/workflow-command-shared.js +74 -0
  336. package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
  337. package/dist/cli/commands/workflow-graph-commands.js +73 -0
  338. package/dist/cli/commands/workflow-init-command.d.ts +3 -0
  339. package/dist/cli/commands/workflow-init-command.js +68 -0
  340. package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
  341. package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
  342. package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
  343. package/dist/cli/commands/workflow-node-commands.js +154 -0
  344. package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
  345. package/dist/cli/commands/workflow-terminalize-command.js +56 -0
  346. package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
  347. package/dist/services/code/auto-compact-artifacts.js +135 -0
  348. package/dist/services/code/auto-compact-attempt.d.ts +46 -0
  349. package/dist/services/code/auto-compact-attempt.js +88 -0
  350. package/dist/services/code/auto-compact-decision.d.ts +74 -0
  351. package/dist/services/code/auto-compact-decision.js +149 -0
  352. package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
  353. package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
  354. package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
  355. package/dist/services/code/auto-compact-envelopes.js +134 -0
  356. package/dist/services/code/auto-compact-history.d.ts +46 -0
  357. package/dist/services/code/auto-compact-history.js +17 -0
  358. package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
  359. package/dist/services/code/auto-compact-orchestrator.js +165 -686
  360. package/dist/services/code/auto-compact-run-types.d.ts +123 -0
  361. package/dist/services/code/auto-compact-run-types.js +1 -0
  362. package/dist/services/code/emit-handoff.d.ts +35 -1
  363. package/dist/services/code/emit-handoff.js +128 -7
  364. package/dist/services/code/step-08-gate.d.ts +28 -19
  365. package/dist/services/code/step-08-gate.js +92 -35
  366. package/dist/services/config/config-coercion.d.ts +7 -0
  367. package/dist/services/config/config-coercion.js +156 -0
  368. package/dist/services/config/config-file-io.d.ts +11 -0
  369. package/dist/services/config/config-file-io.js +61 -0
  370. package/dist/services/config/config-get.d.ts +2 -0
  371. package/dist/services/config/config-get.js +36 -0
  372. package/dist/services/config/config-global-loader.d.ts +15 -0
  373. package/dist/services/config/config-global-loader.js +111 -0
  374. package/dist/services/config/config-nested-path.d.ts +3 -0
  375. package/dist/services/config/config-nested-path.js +53 -0
  376. package/dist/services/config/config-primitives.d.ts +16 -0
  377. package/dist/services/config/config-primitives.js +24 -0
  378. package/dist/services/config/config-service.d.ts +9 -33
  379. package/dist/services/config/config-service.js +16 -665
  380. package/dist/services/config/config-validation.d.ts +19 -0
  381. package/dist/services/config/config-validation.js +152 -0
  382. package/dist/services/config/config-workspace.d.ts +10 -0
  383. package/dist/services/config/config-workspace.js +158 -0
  384. package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
  385. package/dist/services/skills/hooks-settings-deny-list.js +173 -0
  386. package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
  387. package/dist/services/skills/hooks-settings-envelopes.js +79 -0
  388. package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
  389. package/dist/services/skills/hooks-settings-file-shape.js +207 -0
  390. package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
  391. package/dist/services/skills/hooks-settings-paths.js +75 -0
  392. package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
  393. package/dist/services/skills/hooks-settings-read-installed.js +60 -0
  394. package/dist/services/skills/hooks-settings-service.d.ts +12 -212
  395. package/dist/services/skills/hooks-settings-service.js +71 -657
  396. package/dist/services/skills/hooks-settings-types.d.ts +139 -0
  397. package/dist/services/skills/hooks-settings-types.js +1 -0
  398. package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
  399. package/dist/services/workspace/claude-settings-template-merge.js +243 -0
  400. package/dist/services/workspace/claude-settings-template.d.ts +29 -87
  401. package/dist/services/workspace/claude-settings-template.js +81 -236
  402. package/package.json +5 -5
@@ -0,0 +1,34 @@
1
+ import { fail, ok } from 'peaks-loop-shared/result';
2
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
3
+ import { fetchContextLayer, isContextLayer } from './context-layer-fetchers.js';
4
+ /** The two advisory `nextActions` a loaded layer reports. */
5
+ function layerActions(payload) {
6
+ return [
7
+ `${payload.layer} loaded: ${payload.byteSize} bytes across ${payload.files.length} file(s)`,
8
+ payload.warnings.length > 0
9
+ ? `${payload.warnings.length} warning(s); see envelope.warnings`
10
+ : null
11
+ ].filter((x) => typeof x === 'string');
12
+ }
13
+ export function registerContextLayerCommand(context, io) {
14
+ addJsonOption(context
15
+ .command('layer')
16
+ .description('Fetch a context layer (L0 = full SKILL.md; L1 = first paragraph; L2 = index; L3 = fuzzy search by --query)')
17
+ .requiredOption('--project <path>', 'target project root')
18
+ .requiredOption('--level <L0|L1|L2|L3>', 'context layer to load')
19
+ .option('--query <text>', 'fuzzy search query (required for L3)')).action(async (options) => {
20
+ try {
21
+ if (!isContextLayer(options.level)) {
22
+ printResult(io, fail('context.layer', 'INVALID_LEVEL', `level must be one of L0, L1, L2, L3 (got ${options.level})`, { provided: options.level }, ['Pass --level L0|L1|L2|L3']), options.json);
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ const payload = await fetchContextLayer(options.level, options.project, options.query ?? '');
27
+ printResult(io, ok('context.layer', payload, [], layerActions(payload)), options.json);
28
+ }
29
+ catch (error) {
30
+ printResult(io, fail('context.layer', 'CONTEXT_LAYER_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Verify the project path and --level value']), options.json);
31
+ process.exitCode = 1;
32
+ }
33
+ });
34
+ }
@@ -0,0 +1,15 @@
1
+ export type ContextLayer = 'L0' | 'L1' | 'L2' | 'L3';
2
+ export interface LayerPayload {
3
+ readonly layer: ContextLayer;
4
+ readonly description: string;
5
+ readonly files: readonly {
6
+ path: string;
7
+ bytes: number;
8
+ }[];
9
+ readonly content: string;
10
+ readonly byteSize: number;
11
+ readonly warnings: readonly string[];
12
+ }
13
+ /** Dispatch one layer by its validated `L0|L1|L2|L3` id. */
14
+ export declare function fetchContextLayer(level: ContextLayer, projectRoot: string, query: string): Promise<LayerPayload>;
15
+ export declare function isContextLayer(value: string): value is ContextLayer;
@@ -0,0 +1,162 @@
1
+ /**
2
+ * The four context layers the `peaks context layer` verb can fetch.
3
+ *
4
+ * - L0: full read (every SKILL.md in full)
5
+ * - L1: summary (one paragraph per skill + the skill list)
6
+ * - L2: index (just names + paths)
7
+ * - L3: fuzzy search by query (delegates to peaks memory search)
8
+ */
9
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { searchMemory } from '../../services/memory/memory-search-service.js';
12
+ import { getErrorMessage } from '../cli-helpers.js';
13
+ const SKILLS_DIR = 'skills';
14
+ /** Fallback preview length for a skill whose body has no blank-line paragraph break. */
15
+ const L1_PREVIEW_CHARS = 400;
16
+ /** How much of an L3 hit's description is echoed into the search listing. */
17
+ const L3_DESCRIPTION_CHARS = 120;
18
+ function readSkillsDir(projectRoot) {
19
+ const skillsRoot = join(projectRoot, SKILLS_DIR);
20
+ if (!existsSync(skillsRoot))
21
+ return [];
22
+ const out = [];
23
+ for (const entry of readdirSync(skillsRoot, { withFileTypes: true })) {
24
+ if (!entry.isDirectory() || entry.name.startsWith('.'))
25
+ continue;
26
+ const skillMd = join(skillsRoot, entry.name, 'SKILL.md');
27
+ if (existsSync(skillMd)) {
28
+ out.push(`skills/${entry.name}/SKILL.md`);
29
+ }
30
+ }
31
+ return out;
32
+ }
33
+ function readSkillFile(projectRoot, relPath) {
34
+ const abs = join(projectRoot, relPath);
35
+ try {
36
+ return readFileSync(abs, 'utf-8');
37
+ }
38
+ catch {
39
+ return '';
40
+ }
41
+ }
42
+ /** Concatenate every SKILL.md in full. */
43
+ async function fetchL0(projectRoot) {
44
+ const files = readSkillsDir(projectRoot);
45
+ const warnings = [];
46
+ let content = '';
47
+ let byteSize = 0;
48
+ const sizes = [];
49
+ for (const rel of files) {
50
+ const body = readSkillFile(projectRoot, rel);
51
+ if (body.length === 0) {
52
+ warnings.push(`failed to read ${rel}`);
53
+ continue;
54
+ }
55
+ content += `## ${rel}\n\n${body}\n\n`;
56
+ sizes.push({ path: rel, bytes: body.length });
57
+ byteSize += body.length;
58
+ }
59
+ return {
60
+ layer: 'L0',
61
+ description: 'full read: every SKILL.md concatenated',
62
+ files: sizes,
63
+ content,
64
+ byteSize,
65
+ warnings
66
+ };
67
+ }
68
+ /** One paragraph (or a bounded preview) per skill. */
69
+ async function fetchL1(projectRoot) {
70
+ const files = readSkillsDir(projectRoot);
71
+ const warnings = [];
72
+ let content = '';
73
+ let byteSize = 0;
74
+ const sizes = [];
75
+ for (const rel of files) {
76
+ const body = readSkillFile(projectRoot, rel);
77
+ if (body.length === 0) {
78
+ warnings.push(`failed to read ${rel}`);
79
+ continue;
80
+ }
81
+ const firstPara = body.split(/\r?\n\r?\n/, 2)[0] ?? body.slice(0, L1_PREVIEW_CHARS);
82
+ content += `## ${rel}\n\n${firstPara}\n\n`;
83
+ sizes.push({ path: rel, bytes: firstPara.length });
84
+ byteSize += firstPara.length;
85
+ }
86
+ return {
87
+ layer: 'L1',
88
+ description: 'summary: first paragraph per skill',
89
+ files: sizes,
90
+ content,
91
+ byteSize,
92
+ warnings
93
+ };
94
+ }
95
+ /** Names and paths only, no bodies. */
96
+ async function fetchL2(projectRoot) {
97
+ const files = readSkillsDir(projectRoot);
98
+ const content = files.map((f) => `- ${f}`).join('\n') + '\n';
99
+ const byteSize = content.length;
100
+ return {
101
+ layer: 'L2',
102
+ description: 'index: skill paths only (no body)',
103
+ files: files.map((f) => ({ path: f, bytes: 0 })),
104
+ content,
105
+ byteSize,
106
+ warnings: []
107
+ };
108
+ }
109
+ /** Top 10 memory-search hits for `query`; a failure rides `warnings`. */
110
+ async function fetchL3(projectRoot, query) {
111
+ const warnings = [];
112
+ if (query.trim().length === 0) {
113
+ warnings.push('empty query; L3 requires a --query string for fuzzy search');
114
+ return {
115
+ layer: 'L3',
116
+ description: 'fuzzy search (empty query)',
117
+ files: [],
118
+ content: '',
119
+ byteSize: 0,
120
+ warnings
121
+ };
122
+ }
123
+ try {
124
+ const hits = searchMemory({ projectRoot, query, limit: 10 });
125
+ const lines = [];
126
+ for (const hit of hits) {
127
+ lines.push(`- [${hit.score.toFixed(2)}] ${hit.sourcePath}: ${hit.description.slice(0, L3_DESCRIPTION_CHARS)}`);
128
+ }
129
+ const content = lines.join('\n') + '\n';
130
+ return {
131
+ layer: 'L3',
132
+ description: 'fuzzy search: top 10 hits from memory index',
133
+ files: hits.map((h) => ({ path: h.sourcePath, bytes: h.description.length })),
134
+ content,
135
+ byteSize: content.length,
136
+ warnings
137
+ };
138
+ }
139
+ catch (error) {
140
+ return {
141
+ layer: 'L3',
142
+ description: 'fuzzy search (failed)',
143
+ files: [],
144
+ content: '',
145
+ byteSize: 0,
146
+ warnings: [`L3 search failed: ${getErrorMessage(error)}`]
147
+ };
148
+ }
149
+ }
150
+ /** Dispatch one layer by its validated `L0|L1|L2|L3` id. */
151
+ export async function fetchContextLayer(level, projectRoot, query) {
152
+ if (level === 'L0')
153
+ return fetchL0(projectRoot);
154
+ if (level === 'L1')
155
+ return fetchL1(projectRoot);
156
+ if (level === 'L2')
157
+ return fetchL2(projectRoot);
158
+ return fetchL3(projectRoot, query);
159
+ }
160
+ export function isContextLayer(value) {
161
+ return value === 'L0' || value === 'L1' || value === 'L2' || value === 'L3';
162
+ }
@@ -0,0 +1,17 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export type ContextThresholdOptions = {
4
+ promptSize: string;
5
+ capacity?: string;
6
+ inFlightBatch?: boolean;
7
+ autoTrigger?: boolean;
8
+ json?: boolean;
9
+ };
10
+ /** `--capacity` override, or `undefined` to let the monitor use its default. */
11
+ export declare function capacityOf(opts: ContextThresholdOptions): number | undefined;
12
+ /**
13
+ * Parse `--prompt-size`, refusing a non-finite or negative value; `null` once
14
+ * the refusal envelope for `command` has been printed.
15
+ */
16
+ export declare function requirePromptSize(command: string, opts: ContextThresholdOptions, io: ProgramIO): number | null;
17
+ export declare function registerContextStatusCommand(context: Command, io: ProgramIO): void;
@@ -0,0 +1,41 @@
1
+ import { fail, ok } from 'peaks-loop-shared/result';
2
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
3
+ import { evaluateMainSessionThreshold } from '../../services/context/main-session-monitor.js';
4
+ import { detectIdeFromEnv } from '../../services/context/ide-detect.js';
5
+ /** `--capacity` override, or `undefined` to let the monitor use its default. */
6
+ export function capacityOf(opts) {
7
+ return opts.capacity !== undefined ? Number(opts.capacity) : undefined;
8
+ }
9
+ /**
10
+ * Parse `--prompt-size`, refusing a non-finite or negative value; `null` once
11
+ * the refusal envelope for `command` has been printed.
12
+ */
13
+ export function requirePromptSize(command, opts, io) {
14
+ const promptSize = Number(opts.promptSize);
15
+ if (Number.isFinite(promptSize) && promptSize >= 0)
16
+ return promptSize;
17
+ printResult(io, fail(command, 'INVALID_PROMPT_SIZE', `prompt-size must be a non-negative number (got "${opts.promptSize}")`, { provided: opts.promptSize }, ['Pass --prompt-size <bytes>']), opts.json);
18
+ process.exitCode = 1;
19
+ return null;
20
+ }
21
+ export function registerContextStatusCommand(context, io) {
22
+ addJsonOption(context
23
+ .command('status')
24
+ .description('v2.11.0 D6: report main-session threshold tier for a given prompt size (no trigger dispatched). Useful for `--json` probes before invoking `peaks context check --auto-trigger`.')
25
+ .requiredOption('--prompt-size <bytes>', 'estimated prompt size in bytes')
26
+ .option('--capacity <bytes>', 'override the 256K default capacity (test seam)', '262144')).action((opts) => {
27
+ try {
28
+ const promptSize = requirePromptSize('context.status', opts, io);
29
+ if (promptSize === null)
30
+ return;
31
+ const evaluation = evaluateMainSessionThreshold(promptSize, capacityOf(opts));
32
+ printResult(io, ok('context.status', { ...evaluation, ide: detectIdeFromEnv() }, [...evaluation.warnings], [`Main-session tier=${evaluation.tier} (${(evaluation.ratio * 100).toFixed(0)}%)`]), opts.json);
33
+ }
34
+ catch (err) {
35
+ printResult(io, fail('context.status', 'CONTEXT_STATUS_FAILED', getErrorMessage(err), null, [
36
+ 'Verify --prompt-size is a non-negative number'
37
+ ]), opts.json);
38
+ process.exitCode = 1;
39
+ }
40
+ });
41
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerContractCommands(program: Command, io: ProgramIO): void;
@@ -0,0 +1,144 @@
1
+ // src/cli/commands/contract-write-command.ts
2
+ //
3
+ // `peaks contract write` — persist a finished slice's public surface (exports /
4
+ // types / publicSignatures) to
5
+ // `.peaks/_runtime/<sessionId>/dispatch/contracts/<slice-id>.json`, where the
6
+ // orchestrator picks it up on the next dispatch run. Extracted from
7
+ // `governance-classify-contract-commands.ts` (which had merged
8
+ // `contract-commands.ts` and `classify-classify-commands.ts` verbatim); the
9
+ // registered name, description, options, refusal codes and envelope are
10
+ // unchanged.
11
+ //
12
+ // The guards and the write are separate functions because the merged file had
13
+ // all three inline in one 151-line registrar, and every branch there was over
14
+ // the per-function line cap on its own.
15
+ import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
16
+ import { writeContract } from '../../services/dispatch/contract-store.js';
17
+ import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
18
+ import { addJsonOption, printResult } from '../cli-helpers.js';
19
+ const INPUT_LIMIT_BYTES = 256 * 1024;
20
+ /** Split a comma-separated flag value into a trimmed string array. */
21
+ function splitCsv(value) {
22
+ if (value === undefined)
23
+ return [];
24
+ return value
25
+ .split(',')
26
+ .map((s) => s.trim())
27
+ .filter((s) => s.length > 0);
28
+ }
29
+ export function registerContractCommands(program, io) {
30
+ const contract = program
31
+ .command('contract')
32
+ .description('Slice contract store (skill-first / CLI-auxiliary). These commands ' +
33
+ 'are primitives that peaks-code / peaks-rd SKILL.md compose. The LLM-side ' +
34
+ 'runner (the IDE-resident sub-agent that finished a slice) calls ' +
35
+ "`peaks contract write` to persist the slice's public surface; the " +
36
+ 'orchestrator picks it up on the next dispatch run via listContracts() ' +
37
+ 'and splices it into downstream prompts via formatContractInjection().');
38
+ addJsonOption(contractWriteCommand(contract)).action((options) => {
39
+ const envelope = contractWriteEnvelope(options);
40
+ printResult(io, envelope, options.json === true);
41
+ if (!envelope.ok)
42
+ process.exitCode = 1;
43
+ });
44
+ }
45
+ // peaks contract write --project <root> --session-id <sid>
46
+ // --slice-id <id> --exports <a,b> --types <x,y> --signatures <s1,s2>
47
+ // [--broadcast-to <b1,b2>] [--completed-at <iso>]
48
+ function contractWriteCommand(contract) {
49
+ return contract
50
+ .command('write')
51
+ .description("2.7.0 slice-dag-dispatcher MVP: persist a finished slice's public " +
52
+ 'surface (exports / types / publicSignatures) to disk at ' +
53
+ '.peaks/_runtime/<sessionId>/dispatch/contracts/<slice-id>.json. ' +
54
+ 'The orchestrator picks it up on the next dispatch run. Idempotent: ' +
55
+ 're-running with the same inputs overwrites in place; the SHA-256 ' +
56
+ 'contractHash is content-derived so a contract write from a different ' +
57
+ 'runner (re-execution) is detected as a content change.')
58
+ .option('--project <path>', 'target project root (defaults to cwd)')
59
+ .option('--session-id <sid>', 'session id (default: resolve from .peaks/_runtime/session.json; falls back to PEAKS_SESSION_ID env var; final fallback "unknown-sid")')
60
+ .requiredOption('--slice-id <id>', 'slice id; must be non-empty; used as the contract filename basename')
61
+ .option('--exports <list>', 'comma-separated public export names (e.g. "validateDag,topologicalLevels")')
62
+ .option('--types <list>', 'comma-separated public type names (e.g. "SliceDag,SliceNode")')
63
+ .option('--signatures <list>', 'comma-separated public function/method signatures (e.g. "validateDag(dag: SliceDag): void")')
64
+ .option('--broadcast-to <list>', 'comma-separated downstream slice ids that should auto-inherit this contract (e.g. "B,C")')
65
+ .option('--completed-at <iso>', 'ISO 8601 timestamp; defaults to now()');
66
+ }
67
+ /** The written-contract envelope, or the refusal the caller earned. */
68
+ function contractWriteEnvelope(options) {
69
+ const projectRoot = options.project ?? process.cwd();
70
+ const sid = options.sessionId ??
71
+ process.env['PEAKS_SESSION_ID'] ??
72
+ getCurrentSessionId(projectRoot) ??
73
+ 'unknown-sid';
74
+ const lists = {
75
+ exports: splitCsv(options.exports),
76
+ types: splitCsv(options.types),
77
+ signatures: splitCsv(options.signatures),
78
+ broadcastTo: splitCsv(options.broadcastTo)
79
+ };
80
+ const refusal = contractWriteRefusal(options, sid, lists);
81
+ if (refusal !== null)
82
+ return refusal;
83
+ try {
84
+ const result = writeContract(projectRoot, sid, contractWriteInput(options, sid, lists));
85
+ return ok('contract.write', contractWriteData(result), [], [
86
+ 'Contract written; orchestrator will pick it up on the next `peaks sub-agent dispatch --from-dag` run.',
87
+ 'Re-running with the same inputs is idempotent (overwrites in place).'
88
+ ]);
89
+ }
90
+ catch (err) {
91
+ return fail('contract.write', 'WRITE_ERROR', getErrorMessage(err), { path: null, contract: null }, [
92
+ 'See error message; check that --project is a writable directory and --slice-id is a valid filename basename (no path separators).'
93
+ ]);
94
+ }
95
+ }
96
+ /**
97
+ * The `writeContract` input: `--broadcast-to` and `--completed-at` ride only
98
+ * when the caller set them, so an absent flag never becomes an empty value.
99
+ */
100
+ function contractWriteInput(options, sid, lists) {
101
+ return {
102
+ // The refusal above already rejected `undefined` / empty.
103
+ sliceId: options.sliceId,
104
+ sessionId: sid,
105
+ exports: lists.exports,
106
+ types: lists.types,
107
+ publicSignatures: lists.signatures,
108
+ ...(lists.broadcastTo.length > 0 ? { broadcastTo: lists.broadcastTo } : {}),
109
+ ...(options.completedAt !== undefined ? { completedAt: options.completedAt } : {})
110
+ };
111
+ }
112
+ /** The written contract, counted per surface — never the raw store row. */
113
+ function contractWriteData(result) {
114
+ return {
115
+ path: result.path,
116
+ contractHash: result.contract.contractHash,
117
+ sliceId: result.contract.sliceId,
118
+ sessionId: result.contract.sessionId,
119
+ completedAt: result.contract.completedAt,
120
+ exportCount: result.contract.exports.length,
121
+ typeCount: result.contract.types.length,
122
+ signatureCount: result.contract.publicSignatures.length,
123
+ broadcastTo: result.contract.broadcastTo ?? []
124
+ };
125
+ }
126
+ /** The two pre-write refusals (missing slice id, oversized input), or `null`. */
127
+ function contractWriteRefusal(options, sid, lists) {
128
+ const sliceId = options.sliceId;
129
+ if (sliceId === undefined || sliceId.length === 0) {
130
+ return fail('contract.write', 'MISSING_SLICE_ID', '--slice-id is required', { path: null, contract: null }, ['Re-run with --slice-id <id> (must be non-empty; used as the contract filename basename).']);
131
+ }
132
+ // Cap the combined input to protect the file IO from runaway values
133
+ // (e.g. a 10MB comma-separated --signatures flag).
134
+ const inputSize = sliceId.length +
135
+ sid.length +
136
+ lists.exports.join(',').length +
137
+ lists.types.join(',').length +
138
+ lists.signatures.join(',').length +
139
+ lists.broadcastTo.join(',').length +
140
+ (options.completedAt?.length ?? 0);
141
+ if (inputSize <= INPUT_LIMIT_BYTES)
142
+ return null;
143
+ return fail('contract.write', 'INPUT_TOO_LARGE', `combined input size ${inputSize} bytes exceeds ${INPUT_LIMIT_BYTES} (likely oversized --exports/--types/--signatures lists)`, { path: null, contract: null }, ['Split the slice into smaller surfaces or omit optional fields.']);
144
+ }
@@ -0,0 +1,17 @@
1
+ export type BindingSource = 'canonical' | 'legacy';
2
+ /** One stale entry in the project-level binding. */
3
+ export type StaleInstance = {
4
+ sid: string;
5
+ callerId: string;
6
+ lastHeartbeat: string;
7
+ };
8
+ export declare const STALE_TTL_MS = 300000;
9
+ export declare function listStaleInstances(projectRoot: string, ttlMs?: number): StaleInstance[];
10
+ /** The `staleBinding` block every doctor envelope carries. */
11
+ export declare function staleBindingSection(ttlMs: number, staleInstances: readonly StaleInstance[], droppedStale: readonly string[]): {
12
+ ttlMs: number;
13
+ staleCount: number;
14
+ staleInstances: readonly StaleInstance[];
15
+ droppedCount: number;
16
+ droppedSids: readonly string[];
17
+ };
@@ -0,0 +1,30 @@
1
+ import { readBinding } from '../../../services/session/binding-store.js';
2
+ // threshold is exposed as a CLI flag so users can tune it for
3
+ // long-running sessions. 300000 ms = 5 minutes.
4
+ export const STALE_TTL_MS = 300_000;
5
+ // in the project-level binding. Used by `peaks doctor` and surfaced as
6
+ // a warning in the report. Returns the stale entry descriptors.
7
+ export function listStaleInstances(projectRoot, ttlMs = STALE_TTL_MS) {
8
+ const binding = readBinding(projectRoot);
9
+ if (!binding)
10
+ return [];
11
+ const cutoff = Date.now() - ttlMs;
12
+ const stale = [];
13
+ for (const [sid, inst] of Object.entries(binding.instances)) {
14
+ const t = Date.parse(inst.lastHeartbeat);
15
+ if (Number.isFinite(t) && t < cutoff) {
16
+ stale.push({ sid, callerId: inst.callerId, lastHeartbeat: inst.lastHeartbeat });
17
+ }
18
+ }
19
+ return stale;
20
+ }
21
+ /** The `staleBinding` block every doctor envelope carries. */
22
+ export function staleBindingSection(ttlMs, staleInstances, droppedStale) {
23
+ return {
24
+ ttlMs,
25
+ staleCount: staleInstances.length,
26
+ staleInstances,
27
+ droppedCount: droppedStale.length,
28
+ droppedSids: droppedStale
29
+ };
30
+ }
@@ -1,18 +1,4 @@
1
- import type { Command } from 'commander';
2
- import { type ProgramIO } from '../../cli-helpers.js';
3
- /**
4
- * the doctor envelope. The `checks` array (one object per check, each with a
5
- * full message) and the stale-binding instance list collapse to counts +
6
- * names-of-first-N; the summary counters and log section are scalars and are
7
- * kept verbatim. ≤ 2 KB by construction.
8
- */
9
- export declare function buildDoctorSummary(data: Record<string, unknown>): Record<string, unknown>;
10
- export type BindingSource = 'canonical' | 'legacy';
11
- export type DoctorLogsSection = {
12
- logDir: string;
13
- todayFile: string;
14
- sizeBytes: number;
15
- retentionDays: number;
16
- level: string;
17
- };
18
- export declare function registerDoctorCommand(program: Command, io: ProgramIO): void;
1
+ export type { BindingSource, StaleInstance } from './doctor-bindings.js';
2
+ export type { DoctorLogsSection } from './doctor-logs.js';
3
+ export { buildDoctorSummary } from './doctor-summary.js';
4
+ export { registerDoctorCommand } from './doctor-run-command.js';