peaks-loop 4.1.2 → 4.1.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 (323) hide show
  1. package/.claude-plugin/marketplace.json +136 -47
  2. package/CHANGELOG.md +56 -0
  3. package/README-en.md +1 -1
  4. package/README.md +1 -1
  5. package/contracts/readonly-argv-whitelist.json +211 -0
  6. package/dist/cli/commands/audit-artifact-runners.d.ts +16 -0
  7. package/dist/cli/commands/audit-artifact-runners.js +170 -0
  8. package/dist/cli/commands/audit-command-shared.d.ts +97 -0
  9. package/dist/cli/commands/audit-command-shared.js +60 -0
  10. package/dist/cli/commands/audit-commands.d.ts +7 -31
  11. package/dist/cli/commands/audit-commands.js +64 -473
  12. package/dist/cli/commands/audit-goal-runners.d.ts +17 -0
  13. package/dist/cli/commands/audit-goal-runners.js +114 -0
  14. package/dist/cli/commands/audit-red-lines-runners.d.ts +11 -0
  15. package/dist/cli/commands/audit-red-lines-runners.js +43 -0
  16. package/dist/cli/commands/audit-refusal-data.d.ts +23 -0
  17. package/dist/cli/commands/audit-refusal-data.js +69 -0
  18. package/dist/cli/commands/audit-static-runners.d.ts +13 -0
  19. package/dist/cli/commands/audit-static-runners.js +139 -0
  20. package/dist/cli/commands/await-runners.d.ts +11 -0
  21. package/dist/cli/commands/await-runners.js +148 -0
  22. package/dist/cli/commands/code-auto-compact-command.d.ts +3 -0
  23. package/dist/cli/commands/code-auto-compact-command.js +124 -0
  24. package/dist/cli/commands/code-auto-compact-envelope.d.ts +22 -0
  25. package/dist/cli/commands/code-auto-compact-envelope.js +39 -0
  26. package/dist/cli/commands/code-context-audit-command.d.ts +3 -0
  27. package/dist/cli/commands/code-context-audit-command.js +68 -0
  28. package/dist/cli/commands/code-context-now-command.d.ts +3 -0
  29. package/dist/cli/commands/code-context-now-command.js +124 -0
  30. package/dist/cli/commands/code-context-now-envelope.d.ts +66 -0
  31. package/dist/cli/commands/code-context-now-envelope.js +136 -0
  32. package/dist/cli/commands/code-context-now-mapping.d.ts +27 -0
  33. package/dist/cli/commands/code-context-now-mapping.js +43 -0
  34. package/dist/cli/commands/code-emit-handoff-command.d.ts +3 -0
  35. package/dist/cli/commands/code-emit-handoff-command.js +99 -0
  36. package/dist/cli/commands/code-gate-step-08-command.d.ts +3 -0
  37. package/dist/cli/commands/code-gate-step-08-command.js +139 -0
  38. package/dist/cli/commands/code-post-compact-detect-command.d.ts +3 -0
  39. package/dist/cli/commands/code-post-compact-detect-command.js +50 -0
  40. package/dist/cli/commands/code-runtime-commands.d.ts +9 -43
  41. package/dist/cli/commands/code-runtime-commands.js +20 -672
  42. package/dist/cli/commands/code-runtime-session.d.ts +1 -0
  43. package/dist/cli/commands/code-runtime-session.js +15 -0
  44. package/dist/cli/commands/compact-command.d.ts +6 -2
  45. package/dist/cli/commands/compact-command.js +12 -559
  46. package/dist/cli/commands/compact-dry-run-command.d.ts +3 -0
  47. package/dist/cli/commands/compact-dry-run-command.js +87 -0
  48. package/dist/cli/commands/compact-force-command.d.ts +3 -0
  49. package/dist/cli/commands/compact-force-command.js +98 -0
  50. package/dist/cli/commands/compact-harness-window-command.d.ts +3 -0
  51. package/dist/cli/commands/compact-harness-window-command.js +174 -0
  52. package/dist/cli/commands/compact-history-command.d.ts +3 -0
  53. package/dist/cli/commands/compact-history-command.js +89 -0
  54. package/dist/cli/commands/compact-read-commands.d.ts +3 -0
  55. package/dist/cli/commands/compact-read-commands.js +123 -0
  56. package/dist/cli/commands/compact-settle-command.d.ts +3 -0
  57. package/dist/cli/commands/compact-settle-command.js +130 -0
  58. package/dist/cli/commands/compact-shared.d.ts +9 -0
  59. package/dist/cli/commands/compact-shared.js +26 -0
  60. package/dist/cli/commands/core/skill-command.d.ts +1 -44
  61. package/dist/cli/commands/core/skill-command.js +13 -541
  62. package/dist/cli/commands/core/skill-context-verdict.d.ts +38 -0
  63. package/dist/cli/commands/core/skill-context-verdict.js +63 -0
  64. package/dist/cli/commands/core/skill-generated-config-notice.d.ts +41 -0
  65. package/dist/cli/commands/core/skill-generated-config-notice.js +75 -0
  66. package/dist/cli/commands/core/skill-heartbeat-commands.d.ts +3 -0
  67. package/dist/cli/commands/core/skill-heartbeat-commands.js +50 -0
  68. package/dist/cli/commands/core/skill-presence-commands.d.ts +3 -0
  69. package/dist/cli/commands/core/skill-presence-commands.js +123 -0
  70. package/dist/cli/commands/core/skill-presence-housekeeping-commands.d.ts +3 -0
  71. package/dist/cli/commands/core/skill-presence-housekeeping-commands.js +165 -0
  72. package/dist/cli/commands/core/skill-registry-commands.d.ts +3 -0
  73. package/dist/cli/commands/core/skill-registry-commands.js +117 -0
  74. package/dist/cli/commands/core/skill-runbook-command.d.ts +3 -0
  75. package/dist/cli/commands/core/skill-runbook-command.js +29 -0
  76. package/dist/cli/commands/dispatch-command-spec.d.ts +2 -0
  77. package/dist/cli/commands/dispatch-command-spec.js +62 -0
  78. package/dist/cli/commands/dispatch-commands.js +159 -775
  79. package/dist/cli/commands/dispatch-detached-branch.d.ts +3 -0
  80. package/dist/cli/commands/dispatch-detached-branch.js +58 -0
  81. package/dist/cli/commands/dispatch-envelope.d.ts +36 -0
  82. package/dist/cli/commands/dispatch-envelope.js +104 -0
  83. package/dist/cli/commands/dispatch-isolation-lease.d.ts +17 -0
  84. package/dist/cli/commands/dispatch-isolation-lease.js +149 -0
  85. package/dist/cli/commands/dispatch-preflight.d.ts +7 -0
  86. package/dist/cli/commands/dispatch-preflight.js +105 -0
  87. package/dist/cli/commands/dispatch-prompt-blocks.d.ts +10 -0
  88. package/dist/cli/commands/dispatch-prompt-blocks.js +56 -0
  89. package/dist/cli/commands/dispatch-prompt-composition.d.ts +30 -0
  90. package/dist/cli/commands/dispatch-prompt-composition.js +171 -0
  91. package/dist/cli/commands/dispatch-record-write.d.ts +24 -0
  92. package/dist/cli/commands/dispatch-record-write.js +96 -0
  93. package/dist/cli/commands/dispatch-tool-call.d.ts +15 -0
  94. package/dist/cli/commands/dispatch-tool-call.js +128 -0
  95. package/dist/cli/commands/evolution-command-shared.d.ts +78 -0
  96. package/dist/cli/commands/evolution-command-shared.js +107 -0
  97. package/dist/cli/commands/evolution-commands.d.ts +11 -1
  98. package/dist/cli/commands/evolution-commands.js +19 -350
  99. package/dist/cli/commands/evolution-evaluate-command.d.ts +24 -0
  100. package/dist/cli/commands/evolution-evaluate-command.js +138 -0
  101. package/dist/cli/commands/evolution-propose-command.d.ts +23 -0
  102. package/dist/cli/commands/evolution-propose-command.js +145 -0
  103. package/dist/cli/commands/evolution-status-command.d.ts +17 -0
  104. package/dist/cli/commands/evolution-status-command.js +41 -0
  105. package/dist/cli/commands/evolution-verdict-commands.d.ts +30 -0
  106. package/dist/cli/commands/evolution-verdict-commands.js +100 -0
  107. package/dist/cli/commands/finalize-accumulator.d.ts +44 -0
  108. package/dist/cli/commands/finalize-accumulator.js +55 -0
  109. package/dist/cli/commands/finalize-branches.d.ts +34 -0
  110. package/dist/cli/commands/finalize-branches.js +119 -0
  111. package/dist/cli/commands/finalize-runners.d.ts +3 -0
  112. package/dist/cli/commands/finalize-runners.js +92 -0
  113. package/dist/cli/commands/finalize-selection.d.ts +65 -0
  114. package/dist/cli/commands/finalize-selection.js +35 -0
  115. package/dist/cli/commands/gate-commands.js +26 -8
  116. package/dist/cli/commands/job-checkpoint-commands.d.ts +3 -0
  117. package/dist/cli/commands/job-checkpoint-commands.js +157 -0
  118. package/dist/cli/commands/job-command-shared.d.ts +109 -0
  119. package/dist/cli/commands/job-command-shared.js +72 -0
  120. package/dist/cli/commands/job-commands.d.ts +4 -64
  121. package/dist/cli/commands/job-commands.js +42 -552
  122. package/dist/cli/commands/job-cost-check-command.d.ts +3 -0
  123. package/dist/cli/commands/job-cost-check-command.js +41 -0
  124. package/dist/cli/commands/job-init-status-commands.d.ts +3 -0
  125. package/dist/cli/commands/job-init-status-commands.js +149 -0
  126. package/dist/cli/commands/job-run-commands.d.ts +3 -0
  127. package/dist/cli/commands/job-run-commands.js +97 -0
  128. package/dist/cli/commands/job-state-root.d.ts +35 -0
  129. package/dist/cli/commands/job-state-root.js +76 -0
  130. package/dist/cli/commands/loop-eval-capture-index.d.ts +4 -0
  131. package/dist/cli/commands/loop-eval-capture-index.js +44 -0
  132. package/dist/cli/commands/loop-eval-commands.d.ts +8 -5
  133. package/dist/cli/commands/loop-eval-commands.js +12 -626
  134. package/dist/cli/commands/loop-eval-eval-command.d.ts +3 -0
  135. package/dist/cli/commands/loop-eval-eval-command.js +168 -0
  136. package/dist/cli/commands/loop-eval-monotonic-command.d.ts +3 -0
  137. package/dist/cli/commands/loop-eval-monotonic-command.js +90 -0
  138. package/dist/cli/commands/loop-eval-parents.d.ts +7 -0
  139. package/dist/cli/commands/loop-eval-parents.js +20 -0
  140. package/dist/cli/commands/loop-eval-run-code.d.ts +7 -0
  141. package/dist/cli/commands/loop-eval-run-code.js +40 -0
  142. package/dist/cli/commands/loop-eval-run-command.d.ts +3 -0
  143. package/dist/cli/commands/loop-eval-run-command.js +113 -0
  144. package/dist/cli/commands/loop-eval-spec-commands.d.ts +3 -0
  145. package/dist/cli/commands/loop-eval-spec-commands.js +165 -0
  146. package/dist/cli/commands/loop-eval-spec-lint-command.d.ts +3 -0
  147. package/dist/cli/commands/loop-eval-spec-lint-command.js +42 -0
  148. package/dist/cli/commands/loop-eval-workflow-commands.d.ts +3 -0
  149. package/dist/cli/commands/loop-eval-workflow-commands.js +141 -0
  150. package/dist/cli/commands/mcp-commands.d.ts +10 -0
  151. package/dist/cli/commands/mcp-commands.js +157 -0
  152. package/dist/cli/commands/request-command-options.d.ts +49 -0
  153. package/dist/cli/commands/request-command-options.js +1 -0
  154. package/dist/cli/commands/request-commands.d.ts +3 -9
  155. package/dist/cli/commands/request-commands.js +17 -522
  156. package/dist/cli/commands/request-init-command.d.ts +3 -0
  157. package/dist/cli/commands/request-init-command.js +100 -0
  158. package/dist/cli/commands/request-lint-command.d.ts +3 -0
  159. package/dist/cli/commands/request-lint-command.js +50 -0
  160. package/dist/cli/commands/request-list-command.d.ts +10 -0
  161. package/dist/cli/commands/request-list-command.js +53 -0
  162. package/dist/cli/commands/request-repair-status-command.d.ts +3 -0
  163. package/dist/cli/commands/request-repair-status-command.js +61 -0
  164. package/dist/cli/commands/request-show-command.d.ts +3 -0
  165. package/dist/cli/commands/request-show-command.js +56 -0
  166. package/dist/cli/commands/request-transition-command.d.ts +3 -0
  167. package/dist/cli/commands/request-transition-command.js +122 -0
  168. package/dist/cli/commands/request-transition-failures.d.ts +8 -0
  169. package/dist/cli/commands/request-transition-failures.js +90 -0
  170. package/dist/cli/commands/request-transition-hooks.d.ts +50 -0
  171. package/dist/cli/commands/request-transition-hooks.js +115 -0
  172. package/dist/cli/commands/request-transition-preflight.d.ts +10 -0
  173. package/dist/cli/commands/request-transition-preflight.js +107 -0
  174. package/dist/cli/commands/scan-command-shared.d.ts +96 -0
  175. package/dist/cli/commands/scan-command-shared.js +83 -0
  176. package/dist/cli/commands/scan-commands.d.ts +3 -2
  177. package/dist/cli/commands/scan-commands.js +23 -463
  178. package/dist/cli/commands/scan-inventory-commands.d.ts +3 -0
  179. package/dist/cli/commands/scan-inventory-commands.js +96 -0
  180. package/dist/cli/commands/scan-project-commands.d.ts +3 -0
  181. package/dist/cli/commands/scan-project-commands.js +65 -0
  182. package/dist/cli/commands/scan-scope-commands.d.ts +3 -0
  183. package/dist/cli/commands/scan-scope-commands.js +149 -0
  184. package/dist/cli/commands/scan-scope-helpers.d.ts +8 -0
  185. package/dist/cli/commands/scan-scope-helpers.js +54 -0
  186. package/dist/cli/commands/scan-structural-commands.d.ts +3 -0
  187. package/dist/cli/commands/scan-structural-commands.js +113 -0
  188. package/dist/cli/commands/share-commands.d.ts +12 -68
  189. package/dist/cli/commands/share-commands.js +47 -556
  190. package/dist/cli/commands/share-error-hints.d.ts +14 -0
  191. package/dist/cli/commands/share-error-hints.js +38 -0
  192. package/dist/cli/commands/share-identity.d.ts +13 -0
  193. package/dist/cli/commands/share-identity.js +22 -0
  194. package/dist/cli/commands/share-record-paths.d.ts +37 -0
  195. package/dist/cli/commands/share-record-paths.js +68 -0
  196. package/dist/cli/commands/share-runners.d.ts +3 -0
  197. package/dist/cli/commands/share-runners.js +158 -0
  198. package/dist/cli/commands/shared-read-runners.d.ts +3 -0
  199. package/dist/cli/commands/shared-read-runners.js +51 -0
  200. package/dist/cli/commands/slice-check-command.d.ts +3 -0
  201. package/dist/cli/commands/slice-check-command.js +54 -0
  202. package/dist/cli/commands/slice-commands.d.ts +2 -22
  203. package/dist/cli/commands/slice-commands.js +18 -517
  204. package/dist/cli/commands/slice-decompose-artifacts.d.ts +18 -0
  205. package/dist/cli/commands/slice-decompose-artifacts.js +79 -0
  206. package/dist/cli/commands/slice-decompose-command.d.ts +3 -0
  207. package/dist/cli/commands/slice-decompose-command.js +123 -0
  208. package/dist/cli/commands/slice-list-commands.d.ts +3 -0
  209. package/dist/cli/commands/slice-list-commands.js +182 -0
  210. package/dist/cli/commands/slice-pick-command.d.ts +3 -0
  211. package/dist/cli/commands/slice-pick-command.js +60 -0
  212. package/dist/cli/commands/slice-plan-command.d.ts +24 -0
  213. package/dist/cli/commands/slice-plan-command.js +111 -0
  214. package/dist/cli/commands/workflow-commands.d.ts +10 -1
  215. package/dist/cli/commands/workflow-commands.js +6 -594
  216. package/dist/cli/commands/workflow-gate-commands.d.ts +3 -0
  217. package/dist/cli/commands/workflow-gate-commands.js +116 -0
  218. package/dist/cli/commands/workflow-plan-helpers.d.ts +48 -0
  219. package/dist/cli/commands/workflow-plan-helpers.js +103 -0
  220. package/dist/cli/commands/workflow-planning-commands.d.ts +3 -0
  221. package/dist/cli/commands/workflow-planning-commands.js +56 -0
  222. package/dist/cli/commands/workflow-swarm-actions.d.ts +7 -0
  223. package/dist/cli/commands/workflow-swarm-actions.js +109 -0
  224. package/dist/cli/commands/workflow-swarm-commands.d.ts +3 -0
  225. package/dist/cli/commands/workflow-swarm-commands.js +138 -0
  226. package/dist/cli/commands/workflow-tech-actions.d.ts +10 -0
  227. package/dist/cli/commands/workflow-tech-actions.js +150 -0
  228. package/dist/cli/commands/workspace/init-actions.d.ts +10 -0
  229. package/dist/cli/commands/workspace/init-actions.js +199 -0
  230. package/dist/cli/commands/workspace/init-codegraph-stake.d.ts +10 -0
  231. package/dist/cli/commands/workspace/init-codegraph-stake.js +54 -0
  232. package/dist/cli/commands/workspace/init-command.d.ts +8 -124
  233. package/dist/cli/commands/workspace/init-command.js +59 -623
  234. package/dist/cli/commands/workspace/init-context.d.ts +58 -0
  235. package/dist/cli/commands/workspace/init-context.js +121 -0
  236. package/dist/cli/commands/workspace/init-envelope.d.ts +3 -0
  237. package/dist/cli/commands/workspace/init-envelope.js +34 -0
  238. package/dist/cli/commands/workspace/init-failures.d.ts +3 -0
  239. package/dist/cli/commands/workspace/init-failures.js +84 -0
  240. package/dist/cli/commands/workspace/init-hooks-decision.d.ts +24 -0
  241. package/dist/cli/commands/workspace/init-hooks-decision.js +189 -0
  242. package/dist/cli/commands/workspace/init-options.d.ts +102 -0
  243. package/dist/cli/commands/workspace/init-options.js +1 -0
  244. package/dist/cli/commands/worktree-lease-commands.d.ts +10 -6
  245. package/dist/cli/commands/worktree-lease-commands.js +42 -512
  246. package/dist/cli/commands/worktree-lease-gc-command.d.ts +12 -0
  247. package/dist/cli/commands/worktree-lease-gc-command.js +117 -0
  248. package/dist/cli/commands/worktree-lease-git.d.ts +22 -0
  249. package/dist/cli/commands/worktree-lease-git.js +48 -0
  250. package/dist/cli/commands/worktree-lease-list-command.d.ts +12 -0
  251. package/dist/cli/commands/worktree-lease-list-command.js +100 -0
  252. package/dist/cli/commands/worktree-lease-load.d.ts +37 -0
  253. package/dist/cli/commands/worktree-lease-load.js +28 -0
  254. package/dist/cli/commands/worktree-lease-release-command.d.ts +13 -0
  255. package/dist/cli/commands/worktree-lease-release-command.js +105 -0
  256. package/dist/cli/commands/worktree-lease-renew-command.d.ts +11 -0
  257. package/dist/cli/commands/worktree-lease-renew-command.js +99 -0
  258. package/dist/cli/commands/worktree-lease-session.d.ts +22 -0
  259. package/dist/cli/commands/worktree-lease-session.js +29 -0
  260. package/dist/cli/commands/worktree-lease-spawn-command.d.ts +11 -0
  261. package/dist/cli/commands/worktree-lease-spawn-command.js +119 -0
  262. package/dist/cli/commands/worktree-lease-status-command.d.ts +11 -0
  263. package/dist/cli/commands/worktree-lease-status-command.js +86 -0
  264. package/dist/cli/commands/worktree-lease-store.d.ts +19 -0
  265. package/dist/cli/commands/worktree-lease-store.js +24 -0
  266. package/dist/cli/program.js +5 -0
  267. package/dist/services/distribution/mcp-install-runner.d.ts +21 -0
  268. package/dist/services/distribution/mcp-install-runner.js +59 -0
  269. package/dist/services/distribution/mcp-install.d.ts +95 -0
  270. package/dist/services/distribution/mcp-install.js +179 -0
  271. package/dist/services/distribution/plugin-manifest.d.ts +97 -0
  272. package/dist/services/distribution/plugin-manifest.js +126 -0
  273. package/dist/services/hooks/mcp-surface-gate.d.ts +19 -0
  274. package/dist/services/hooks/mcp-surface-gate.js +87 -0
  275. package/dist/services/ide/adapters/claude-code-adapter.d.ts +4 -35
  276. package/dist/services/ide/adapters/claude-code-adapter.js +48 -171
  277. package/dist/services/ide/adapters/claude-code-local-state.d.ts +28 -0
  278. package/dist/services/ide/adapters/claude-code-local-state.js +112 -0
  279. package/dist/services/ide/adapters/claude-code-model-window.d.ts +37 -0
  280. package/dist/services/ide/adapters/claude-code-model-window.js +113 -0
  281. package/dist/services/ide/ide-mcp-install-types.d.ts +78 -0
  282. package/dist/services/ide/ide-mcp-install-types.js +104 -0
  283. package/dist/services/ide/ide-types.d.ts +45 -1
  284. package/dist/services/ide/mcp-tool-matcher.d.ts +34 -0
  285. package/dist/services/ide/mcp-tool-matcher.js +84 -0
  286. package/dist/services/lint/npx-resolver.js +7 -0
  287. package/dist/services/mcp/cli-executor.d.ts +36 -0
  288. package/dist/services/mcp/cli-executor.js +97 -0
  289. package/dist/services/mcp/json-rpc.d.ts +81 -0
  290. package/dist/services/mcp/json-rpc.js +116 -0
  291. package/dist/services/mcp/memory-tool.d.ts +3 -0
  292. package/dist/services/mcp/memory-tool.js +62 -0
  293. package/dist/services/mcp/server-main.d.ts +1 -0
  294. package/dist/services/mcp/server-main.js +66 -0
  295. package/dist/services/mcp/server.d.ts +22 -0
  296. package/dist/services/mcp/server.js +152 -0
  297. package/dist/services/mcp/surface.d.ts +62 -0
  298. package/dist/services/mcp/surface.js +198 -0
  299. package/dist/services/mcp/tool-core.d.ts +42 -0
  300. package/dist/services/mcp/tool-core.js +137 -0
  301. package/dist/services/mcp/tools.d.ts +13 -0
  302. package/dist/services/mcp/tools.js +58 -0
  303. package/dist/services/readonly-surface/argv-guard.d.ts +32 -0
  304. package/dist/services/readonly-surface/argv-guard.js +164 -0
  305. package/dist/services/readonly-surface/readonly-whitelist.d.ts +147 -0
  306. package/dist/services/readonly-surface/readonly-whitelist.js +107 -0
  307. package/dist/services/readonly-surface/whitelist-generator.d.ts +64 -0
  308. package/dist/services/readonly-surface/whitelist-generator.js +212 -0
  309. package/dist/services/skills/hooks-codegate-superpowers.d.ts +1 -0
  310. package/dist/services/skills/hooks-codegate-superpowers.js +26 -0
  311. package/dist/services/skills/hooks-settings-service.js +10 -2
  312. package/package.json +17 -6
  313. package/scripts/install-skills-bundles.mjs +233 -0
  314. package/scripts/install-skills-fs.mjs +148 -0
  315. package/scripts/install-skills-ide.mjs +279 -0
  316. package/scripts/install-skills-output-style-default.mjs +196 -0
  317. package/scripts/install-skills-output-styles.mjs +121 -0
  318. package/scripts/install-skills-report.mjs +42 -0
  319. package/scripts/install-skills-user-config.mjs +198 -0
  320. package/scripts/install-skills.mjs +36 -1066
  321. package/scripts/watch-tree.mjs +140 -0
  322. package/scripts/watch.mjs +4 -126
  323. package/skills/peaks-status/SKILL.md +31 -13
@@ -0,0 +1,43 @@
1
+ // The one table-to-vocabulary mapping `peaks code context-now` decides with: the
2
+ // shared `CompactTrigger` kind translated to this command's `action`, and the labels
3
+ // it prints, both read out of the mode in force.
4
+ import { thresholdFor } from '../../services/code/auto-compact-modes.js';
5
+ import { AUTO_COMPACT_SOFT_WARN_RATIO } from '../../services/context/auto-compact-types.js';
6
+ import { evaluateCompactTrigger } from '../../services/code/auto-compact-orchestrator.js';
7
+ /** The one dispatch verb the action and red-line tiers name. */
8
+ const COMPACT_CMD = 'peaks code auto-compact';
9
+ /**
10
+ * Slice H4 (rid=h4-context-now-mode-blind) — the ONE mapping from the shared
11
+ * `CompactTrigger` to this command's `action` vocabulary, so the two cannot
12
+ * drift: the trigger is `evaluateCompactTrigger`, the same function `peaks
13
+ * code auto-compact` decides with.
14
+ *
15
+ * `auto-fire` maps to `soft-warn` in BOTH modes: that tier is `peaks skill
16
+ * presence`'s — the every-turn probe, which reads this same table and mode
17
+ * resolver — so `context-now` has no auto-fire tier of its own (SKILL.md
18
+ * "two probes, two thresholds"). Reporting it as `auto-compact-now` would
19
+ * change every non-24h session's output, which slice H4 forbids.
20
+ */
21
+ export function contextNowActionFor(ratio, mode) {
22
+ const kind = evaluateCompactTrigger(ratio, mode).kind;
23
+ if (kind === 'red-line')
24
+ return { action: 'red-line', next: COMPACT_CMD };
25
+ if (kind === 'pre-compact')
26
+ return { action: 'auto-compact-now', next: COMPACT_CMD };
27
+ return { action: kind === 'none' ? 'ok' : 'soft-warn', next: null };
28
+ }
29
+ /** Slice H4: the labels `context-now` prints, read out of the table for the mode
30
+ * in force — the old hard-coded "≥0.85 / ≥0.95 / 50–85%" told a 24h operator
31
+ * the wrong lines. `*Ratio` is the `0.85` form `gateModeNotice` uses. */
32
+ export function contextNowBandLabels(mode) {
33
+ const pct = (r) => `${(r * 100).toFixed(0)}`;
34
+ const pre = thresholdFor(mode, 'preCompact');
35
+ const red = thresholdFor(mode, 'redLine');
36
+ return {
37
+ softWarn: pct(AUTO_COMPACT_SOFT_WARN_RATIO),
38
+ preCompact: pct(pre),
39
+ redLine: pct(red),
40
+ preCompactRatio: pre.toFixed(2),
41
+ redLineRatio: red.toFixed(2)
42
+ };
43
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerCodeEmitHandoffCommand(code: Command, io: ProgramIO): void;
@@ -0,0 +1,99 @@
1
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
2
+ import { fail, ok } from 'peaks-loop-shared/result';
3
+ import { evaluateEmitHandoff, JOB_NOT_INITIALIZED, JOB_REMAINING_BLOCKED } from '../../services/code/emit-handoff.js';
4
+ import { readActiveSid } from './code-runtime-session.js';
5
+ export function registerCodeEmitHandoffCommand(code, io) {
6
+ // v3.1.2 Step 11 / final handoff — Size-fear ban.
7
+ // Refuses to emit a final handoff while a Job has remaining slices.
8
+ addJsonOption(code
9
+ .command('emit-handoff')
10
+ .description('v3.1.2 Step 11 size-fear ban: under Job mode, refuse to emit a final ' +
11
+ 'handoff while remaining > 0. Exit 0 = allow, exit 1 = block. Pass ' +
12
+ '--force-under-job to override (requires explicit user approval).')
13
+ .requiredOption('--project <path>', 'target project root')
14
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
15
+ .option('--job-id <jid>', 'override job id (default: read from job-shape.json decision.suggestedJobId)')
16
+ .option('--force-under-job', 'override the remaining>0 block (explicit user approval required)')).action((opts) => runEmitHandoff(opts, io));
17
+ }
18
+ function runEmitHandoff(opts, io) {
19
+ try {
20
+ const sessionId = opts.sessionId ?? readActiveSid(opts.project);
21
+ if (sessionId === null) {
22
+ printEmitHandoffNoSession(io, opts.json);
23
+ return;
24
+ }
25
+ const evalInput = {
26
+ projectRoot: opts.project,
27
+ sessionId
28
+ };
29
+ if (opts.jobId !== undefined)
30
+ evalInput.jobId = opts.jobId;
31
+ if (opts.forceUnderJob === true)
32
+ evalInput.forceUnderJob = true;
33
+ const verdict = evaluateEmitHandoff(evalInput);
34
+ reportEmitHandoffVerdict(verdict, io, opts.json);
35
+ }
36
+ catch (err) {
37
+ reportEmitHandoffFailure(io, err, opts.json);
38
+ }
39
+ }
40
+ function reportEmitHandoffVerdict(verdict, io, json) {
41
+ if (verdict.kind === 'allow-not-job') {
42
+ printEmitHandoffAllowNotJob(io, json);
43
+ return;
44
+ }
45
+ if (verdict.kind === 'allow-done') {
46
+ printEmitHandoffAllowDone(verdict, io, json);
47
+ return;
48
+ }
49
+ if (verdict.kind === 'allow-force-override') {
50
+ printEmitHandoffAllowForceOverride(verdict, io, json);
51
+ return;
52
+ }
53
+ if (verdict.kind === 'block-not-initialized') {
54
+ printEmitHandoffBlockNotInitialized(verdict, io, json);
55
+ return;
56
+ }
57
+ printEmitHandoffBlockRemaining(verdict, io, json);
58
+ }
59
+ function printEmitHandoffNoSession(io, json) {
60
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'no-session' }, [], ['No active session id; gate passes through (single-rid mode).']);
61
+ printResult(io, envelope, json);
62
+ }
63
+ function printEmitHandoffAllowNotJob(io, json) {
64
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'single' }, [], ['job-shape.json says isJob=false (or absent); normal handoff allowed.']);
65
+ printResult(io, envelope, json);
66
+ }
67
+ function printEmitHandoffAllowDone(verdict, io, json) {
68
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'job-done', remaining: verdict.remaining }, [], [`Job is complete (remaining=0); handoff allowed.`]);
69
+ printResult(io, envelope, json);
70
+ }
71
+ function printEmitHandoffAllowForceOverride(verdict, io, json) {
72
+ const envelope = ok('code.emit-handoff', { allow: true, mode: 'job-force-override', remaining: verdict.remaining }, [], [
73
+ `Job has ${verdict.remaining} remaining slices; --force-under-job override applied. Handoff allowed (explicit user approval).`
74
+ ]);
75
+ printResult(io, envelope, json);
76
+ }
77
+ function printEmitHandoffBlockNotInitialized(verdict, io, json) {
78
+ const envelope = fail('code.emit-handoff', JOB_NOT_INITIALIZED, `Job ${verdict.jobId} has no state.json; peaks job init was skipped.`, { jobId: verdict.jobId }, [`Run \`peaks job init --job-id ${verdict.jobId} --slice-list <...>\` before emitting handoff.`]);
79
+ printResult(io, envelope, json);
80
+ process.exitCode = 1;
81
+ }
82
+ function printEmitHandoffBlockRemaining(verdict, io, json) {
83
+ // block-remaining
84
+ const blockMessage = `BLOCKED: Job ${verdict.jobId} has ${verdict.remaining} remaining slices. Run \`peaks job status\`. Use --force-under-job only with explicit user approval.`;
85
+ const envelope = fail('code.emit-handoff', JOB_REMAINING_BLOCKED, blockMessage, { jobId: verdict.jobId, remaining: verdict.remaining }, [
86
+ `Run \`peaks job status --job-id ${verdict.jobId}\` to see remaining slices.`,
87
+ 'Resume Step 0.81 (per-slice checkpoint loop) and continue until remaining === 0.',
88
+ 'Use --force-under-job only with explicit user approval (size-fear ban override).'
89
+ ]);
90
+ io.stderr(`${blockMessage}\n`);
91
+ printResult(io, envelope, json);
92
+ process.exitCode = 1;
93
+ }
94
+ function reportEmitHandoffFailure(io, err, json) {
95
+ printResult(io, fail('code.emit-handoff', 'EMIT_HANDOFF_FAILED', getErrorMessage(err), null, [
96
+ 'Verify the project path and try again'
97
+ ]), json);
98
+ process.exitCode = 1;
99
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerCodeGateStep08Command(code: Command, io: ProgramIO): void;
@@ -0,0 +1,139 @@
1
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
2
+ import { fail, ok } from 'peaks-loop-shared/result';
3
+ import { evaluateStep08, STEP_08_BACKUP_REGEX } from '../../services/code/step-08-gate.js';
4
+ import { buildContextAuditHint } from '../../services/context/context-audit-hint.js';
5
+ import { resolveOuterSessionId } from '../../services/session/binding-status-service.js';
6
+ import { readActiveSid } from './code-runtime-session.js';
7
+ export function registerCodeGateStep08Command(code, io) {
8
+ // v3.1.2 Step 0.8 — Mechanical PreToolUse gate.
9
+ // Wire-installed by `peaks workspace init` (extends the existing hook
10
+ // installer). Exit code is the load-bearing contract:
11
+ // exit 0 → allow (with structured stdout describing the decision)
12
+ // exit 2 → block (stderr contains the BLOCKED: ... reason)
13
+ addJsonOption(code
14
+ .command('gate-step-08')
15
+ .description('v3.1.2: PreToolUse gate for Step 0.8 — allow when job-shape.json exists; ' +
16
+ 'fail-closed backup regex when missing. Exit 0 = allow, exit 2 = block. ' +
17
+ 'When the decision says isJob=true AND progress.json exists, the stdout ' +
18
+ 'also carries `Next: slice #N+1 of M (<currentSlice>)` so the LLM cannot ' +
19
+ 'wake up cold. When the context ratio is ≥ 0.70 the stdout gains ONE more ' +
20
+ 'line naming the largest context consumer (audit cached ≥ 5 min; fail-soft).')
21
+ .requiredOption('--project <path>', 'target project root (the hook passes "." so resolveCanonicalProjectRoot promotes it to the git root)')
22
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
23
+ .option('--prompt <text>', 'explicit prompt text (default: read last-prompt.txt; stdin ignored)')).action((opts) => runGateStep08(opts, io));
24
+ }
25
+ function runGateStep08(opts, io) {
26
+ try {
27
+ const sessionId = opts.sessionId ?? readActiveSid(opts.project);
28
+ if (sessionId === null) {
29
+ // No session binding — treat as allow (single-rid mode). The
30
+ // LLM has not yet anchored; we have nothing to gate against.
31
+ printGateStep08NoSession(io, opts.json);
32
+ return;
33
+ }
34
+ const context = resolveGateStep08Context(opts, sessionId);
35
+ const verdict = context.result.verdict;
36
+ if (verdict.kind === 'allow-job') {
37
+ printGateStep08AllowJob(verdict, context, io, opts.json);
38
+ return;
39
+ }
40
+ if (verdict.kind === 'allow-single') {
41
+ printGateStep08AllowSingle(context, io, opts.json);
42
+ return;
43
+ }
44
+ // block-missing-decision
45
+ if (verdict.promptHit) {
46
+ // Block: backup regex hit. Exit code 2 is the load-bearing
47
+ // signal for the PreToolUse hook.
48
+ printGateStep08Blocked(verdict, context, io, opts.json);
49
+ return;
50
+ }
51
+ // No decision + no regex hit → allow.
52
+ printGateStep08Undecided(verdict, context, io, opts.json);
53
+ }
54
+ catch (err) {
55
+ reportGateStep08Failure(io, err, opts.json);
56
+ }
57
+ }
58
+ function resolveGateStep08Context(opts, sessionId) {
59
+ // hint. Runs ONLY when the window is ≥ 0.70 full, caches the audit
60
+ // result for ≥ 5 min so the transcript is scanned at most once per
61
+ // TTL window, and is fail-soft (null → no extra line). It never
62
+ // changes the exit code and never blocks.
63
+ const hintLine = buildContextAuditHint({
64
+ projectRoot: opts.project,
65
+ sessionId,
66
+ outerSessionId: resolveOuterSessionId(opts.project, sessionId)
67
+ });
68
+ const hintActions = hintLine === null ? [] : [hintLine];
69
+ const evalInput = {
70
+ projectRoot: opts.project,
71
+ sessionId
72
+ };
73
+ if (opts.prompt !== undefined)
74
+ evalInput.prompt = opts.prompt;
75
+ const result = evaluateStep08(evalInput);
76
+ return { result, hintActions };
77
+ }
78
+ function printGateStep08NoSession(io, json) {
79
+ const envelope = ok('code.gate-step-08', {
80
+ allow: true,
81
+ mode: 'no-session',
82
+ decision: null,
83
+ nextSlice: null
84
+ }, [], ['No active session id; gate passes through (single-rid mode).']);
85
+ printResult(io, envelope, json);
86
+ }
87
+ function printGateStep08AllowJob(verdict, context, io, json) {
88
+ const result = context.result;
89
+ const envelope = ok('code.gate-step-08', {
90
+ allow: true,
91
+ mode: 'job',
92
+ decision: verdict.decision,
93
+ progress: verdict.progress,
94
+ nextSlice: result.nextSliceLine
95
+ }, [], [...(result.nextSliceLine !== null ? [result.nextSliceLine] : []), ...context.hintActions]);
96
+ printResult(io, envelope, json);
97
+ }
98
+ function printGateStep08AllowSingle(context, io, json) {
99
+ const envelope = ok('code.gate-step-08', {
100
+ allow: true,
101
+ mode: 'single',
102
+ decision: null,
103
+ nextSlice: null
104
+ }, [], ['job-shape.json says isJob=false; single-rid mode (gate allows).', ...context.hintActions]);
105
+ printResult(io, envelope, json);
106
+ }
107
+ function printGateStep08Blocked(verdict, context, io, json) {
108
+ const blockMessage = 'BLOCKED: prompt looks Job-shaped but peaks code detect-job has not been called. Run `peaks code detect-job --is-job true ...` to record your Job-shape verdict, then retry.';
109
+ const envelope = fail('code.gate-step-08', 'STEP_08_BLOCKED', blockMessage, {
110
+ promptSource: verdict.promptSource,
111
+ backupRegex: STEP_08_BACKUP_REGEX.toString()
112
+ }, [
113
+ 'Run `peaks code detect-job --is-job true --rationale <text> --suggested-job-id <slug>` to record the Job-shape verdict.',
114
+ 'Then re-run the Bash tool call.',
115
+ ...context.hintActions
116
+ ]);
117
+ io.stderr(`${blockMessage}\n`);
118
+ printResult(io, envelope, json);
119
+ process.exitCode = 2;
120
+ }
121
+ function printGateStep08Undecided(verdict, context, io, json) {
122
+ const envelope = ok('code.gate-step-08', {
123
+ allow: true,
124
+ mode: 'undecided-no-regex-hit',
125
+ decision: null,
126
+ nextSlice: null,
127
+ promptSource: verdict.promptSource
128
+ }, [], [
129
+ 'No job-shape.json AND no backup-regex match on prompt → allow (most prompts are not Job-shaped).',
130
+ ...context.hintActions
131
+ ]);
132
+ printResult(io, envelope, json);
133
+ }
134
+ function reportGateStep08Failure(io, err, json) {
135
+ printResult(io, fail('code.gate-step-08', 'GATE_STEP_08_FAILED', getErrorMessage(err), null, [
136
+ 'Verify the project path and try again'
137
+ ]), json);
138
+ process.exitCode = 1;
139
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerCodePostCompactDetectCommand(code: Command, io: ProgramIO): void;
@@ -0,0 +1,50 @@
1
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
2
+ import { fail, ok } from 'peaks-loop-shared/result';
3
+ import { detectPostCompactResume, formatPostCompactResumeLogLine } from '../../services/code/post-compact-detector.js';
4
+ import { readActiveSid } from './code-runtime-session.js';
5
+ function printPostCompactNoActiveSession(io, opts) {
6
+ printResult(io, fail('code.post-compact-detect', 'NO_ACTIVE_SESSION', 'no active session id; pass --session-id or set presence via `peaks skill presence:set peaks-code`', null, ['Re-run with --session-id <sid>']), opts.json);
7
+ process.exitCode = 1;
8
+ }
9
+ const POST_COMPACT_DETECT_DESCRIPTION = 'v2.11.0 D7: detect whether the current invocation is a same-day post-compact resume. ' +
10
+ 'Auto-resumes (no AskUserQuestion) when the most-recent checkpoint is from today, has a mode field, ' +
11
+ 'and the active skill is peaks-code. Falls through to the normal Step 0.7 flow otherwise.';
12
+ /** The catch branch, lifted verbatim out of the action body. */
13
+ function reportPostCompactDetectFailure(io, err, json) {
14
+ printResult(io, fail('code.post-compact-detect', 'POST_COMPACT_DETECT_FAILED', getErrorMessage(err), null, [
15
+ 'Verify the project path and try again'
16
+ ]), json);
17
+ process.exitCode = 1;
18
+ }
19
+ /** The action body, lifted to a module-level function so both it and the registrar fit in 50 lines. */
20
+ async function runPostCompactDetect(opts, io) {
21
+ try {
22
+ const sessionId = opts.sessionId ?? readActiveSid(opts.project);
23
+ if (sessionId === null) {
24
+ printPostCompactNoActiveSession(io, opts);
25
+ return;
26
+ }
27
+ const probe = await detectPostCompactResume({
28
+ sessionId,
29
+ projectRoot: opts.project,
30
+ activeSkill: opts.activeSkill
31
+ });
32
+ const logLine = formatPostCompactResumeLogLine(probe);
33
+ printResult(io, ok('code.post-compact-detect', { ...probe, logLine }, [...probe.warnings], [
34
+ probe.shouldAutoResume
35
+ ? `Post-compact match → auto-resume mode=${probe.mode ?? '?'} checkpoint=${probe.checkpointPath ?? '?'}`
36
+ : `No auto-resume: ${probe.reason}`
37
+ ]), opts.json);
38
+ }
39
+ catch (err) {
40
+ reportPostCompactDetectFailure(io, err, opts.json);
41
+ }
42
+ }
43
+ export function registerCodePostCompactDetectCommand(code, io) {
44
+ addJsonOption(code
45
+ .command('post-compact-detect')
46
+ .description(POST_COMPACT_DETECT_DESCRIPTION)
47
+ .requiredOption('--project <path>', 'target project root')
48
+ .option('--session-id <sid>', 'override session id (default: read from active presence)')
49
+ .option('--active-skill <skill>', 'override active skill (test seam; default: read from presence)')).action((opts) => runPostCompactDetect(opts, io));
50
+ }
@@ -1,50 +1,16 @@
1
1
  /**
2
- * context-now / context-audit / gate-step-08 / emit-handoff.
2
+ * context-now / context-audit / post-compact-detect / auto-compact / gate-step-08 /
3
+ * emit-handoff.
3
4
  *
4
5
  * Owns: 6 sub-commands that read or mutate runtime state.
5
- * Owns the `readActiveSid` helper (only used by these runtime probes).
6
6
  *
7
- * (what fills the window, grouped by tool + short input key).
7
+ * This module is the registrar only. Each sub-command owns a file, and the pure
8
+ * helpers they share live beside them rather than inside one of them. Both
9
+ * re-exports below are part of the published surface of this module path, so the
10
+ * callers that reach for them keep their specifier.
8
11
  */
9
12
  import type { Command } from 'commander';
10
- import { type ProgramIO } from '../cli-helpers.js';
11
- import { type ResultEnvelope } from 'peaks-loop-shared/result';
12
- import { type AutoCompactResult } from '../../services/code/auto-compact-orchestrator.js';
13
- import { type AutoCompactMode } from '../../services/code/auto-compact-modes.js';
14
- /**
15
- * Slice H4 (rid=h4-context-now-mode-blind) — the ONE mapping from the shared
16
- * `CompactTrigger` to this command's `action` vocabulary, so the two cannot
17
- * drift: the trigger is `evaluateCompactTrigger`, the same function `peaks
18
- * code auto-compact` decides with.
19
- *
20
- * `auto-fire` maps to `soft-warn` in BOTH modes: that tier is `peaks skill
21
- * presence`'s — the every-turn probe, which reads this same table and mode
22
- * resolver — so `context-now` has no auto-fire tier of its own (SKILL.md
23
- * "two probes, two thresholds"). Reporting it as `auto-compact-now` would
24
- * change every non-24h session's output, which slice H4 forbids.
25
- */
26
- export declare function contextNowActionFor(ratio: number, mode: AutoCompactMode): {
27
- action: 'ok' | 'soft-warn' | 'auto-compact-now' | 'red-line';
28
- next: string | null;
29
- };
30
- /**
31
- * Adapt `runAutoCompact`'s domain result to a `ResultEnvelope`.
32
- *
33
- * Extracted and exported so the CHANNEL each fact chooses can be asserted
34
- * directly, without a real red-line probe.
35
- *
36
- * The harness-window CONFLICT ("peaks-loop divided this ratio by N but the
37
- * settings file pins M") is a fact about the STATE, not an instruction, so it
38
- * rides `warnings` — the very channel `peaks code context-now` already puts it
39
- * on, via the same `harnessWindowSyncWarning`. Before this, the shim hard-coded
40
- * `warnings: []`, so the identical fact reached a consumer as a sentence inside
41
- * `nextActions` on this command and as a `warnings` entry on the other one. One
42
- * fact, two shapes, depending on which of the two syncing commands a consumer
43
- * happened to read: two parsers for one mechanism.
44
- *
45
- * The prose description (`describeHarnessWindowSync`) stays in `nextActions` on
46
- * BOTH commands — that half is advice ("what to do about it") and both already
47
- * agree on it.
48
- */
49
- export declare function buildAutoCompactEnvelope(result: AutoCompactResult): ResultEnvelope<unknown>;
13
+ import type { ProgramIO } from '../cli-helpers.js';
14
+ export { buildAutoCompactEnvelope } from './code-auto-compact-envelope.js';
15
+ export { contextNowActionFor } from './code-context-now-mapping.js';
50
16
  export declare function registerCodeRuntimeCommands(code: Command, io: ProgramIO): void;