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,107 @@
1
+ // Split out of `request-commands.ts`: the
2
+ // pre-transition refusals `peaks request transition` runs before it touches an
3
+ // artifact — session-id resolution, the `--allow-incomplete` reason rule, and
4
+ // the assisted/strict-mode bypass gate.
5
+ import { join } from 'node:path';
6
+ import { fail } from 'peaks-loop-shared/result';
7
+ import { isUnsafePathInput } from '../../shared/path-safety.js';
8
+ import { printResult } from '../cli-helpers.js';
9
+ import { isBypassLimitReached, recordBypass, MAX_BYPASSES_PER_SESSION } from '../../services/mode/bypass-tracker.js';
10
+ import { showRequestArtifact } from '../../services/artifacts/request-artifact-service.js';
11
+ function refuseInvalidSession(io, options, resolvedSessionId) {
12
+ printResult(io, fail('request.transition', 'INVALID_SESSION_ID', `Invalid session id: ${resolvedSessionId} (must be a single path segment)`, { provided: resolvedSessionId }, ['Pass a session id that is a single path segment']), options.json);
13
+ process.exitCode = 1;
14
+ }
15
+ /**
16
+ * Resolve the artifact's real session up front. Falling back to a literal
17
+ * 'default' (the previous behavior) points the bypass counter at a
18
+ * non-existent .peaks/default/ dir and crashes with ENOENT, so when
19
+ * --session-id is omitted we look the artifact up to find its session.
20
+ * Returns `null` when a refusal was printed.
21
+ */
22
+ async function resolveTransitionSessionId(io, requestId, role, options) {
23
+ let resolvedSessionId = options.sessionId;
24
+ // Sid axis: either arm of `resolvedSessionId` can be a caller-supplied
25
+ // `--session-id`, and it is joined into the bypass-counter root below.
26
+ if (resolvedSessionId !== undefined && isUnsafePathInput(resolvedSessionId)) {
27
+ refuseInvalidSession(io, options, resolvedSessionId);
28
+ return null;
29
+ }
30
+ if (resolvedSessionId === undefined) {
31
+ const located = await showRequestArtifact({ projectRoot: options.project, role, requestId });
32
+ if (located !== null) {
33
+ resolvedSessionId = located.sessionId;
34
+ }
35
+ }
36
+ return resolvedSessionId;
37
+ }
38
+ function refuseBypassReasonRequired(io, ctx) {
39
+ printResult(io, fail('request.transition', 'BYPASS_REASON_REQUIRED', '--allow-incomplete requires --reason explaining why prerequisites are skipped', { role: ctx.role, requestId: ctx.requestId }, [
40
+ 'Add --reason "<short justification>" or remove --allow-incomplete and produce the missing artifacts'
41
+ ]), ctx.options.json);
42
+ process.exitCode = 1;
43
+ }
44
+ function refuseAllowIncompleteRestricted(io, ctx, mode) {
45
+ printResult(io, fail('request.transition', 'ALLOW_INCOMPLETE_RESTRICTED', `--allow-incomplete requires --confirm in ${mode} mode`, { role: ctx.role, requestId: ctx.requestId, mode }, [
46
+ 'Ask the user via AskUserQuestion whether to proceed, then re-run with --confirm if they approve.'
47
+ ]), ctx.options.json);
48
+ process.exitCode = 1;
49
+ }
50
+ function refuseBypassLimitReached(io, ctx) {
51
+ printResult(io, fail('request.transition', 'BYPASS_LIMIT_REACHED', `--allow-incomplete limit reached (${MAX_BYPASSES_PER_SESSION} per session)`, { role: ctx.role, requestId: ctx.requestId, limit: MAX_BYPASSES_PER_SESSION }, ['Produce the missing artifacts instead of bypassing.']), ctx.options.json);
52
+ process.exitCode = 1;
53
+ }
54
+ /**
55
+ * Restrict --allow-incomplete in assisted/strict modes: require --confirm,
56
+ * then count the bypass under the canonical session home
57
+ * `.peaks/_runtime/<sid>/`, NOT `.peaks/_runtime/<sid>/`. The legacy path
58
+ * landed `.bypass-count.json` at the project root and was ignored only by
59
+ * `.gitignore`, not by the runtime — a back-compat reader on the root would
60
+ * never see it. The canonical home is the same one `peaks session info
61
+ * --active` resolves from `_runtime/session.json`, so all session-scoped state
62
+ * (artifacts + bypass counter) now lives in one tree.
63
+ */
64
+ async function applyRestrictedBypassGate(io, ctx) {
65
+ const { options, resolvedSessionId } = ctx;
66
+ const { getSkillPresence } = await import('../../services/skills/skill-presence-service.js');
67
+ const presence = getSkillPresence(options.project);
68
+ if (!(presence?.mode === 'assisted' || presence?.mode === 'strict'))
69
+ return true;
70
+ if (options.confirm !== true) {
71
+ refuseAllowIncompleteRestricted(io, ctx, presence.mode);
72
+ return false;
73
+ }
74
+ const sessionRoot = join(options.project, '.peaks', '_runtime', resolvedSessionId ?? 'default');
75
+ if (isBypassLimitReached(sessionRoot)) {
76
+ refuseBypassLimitReached(io, ctx);
77
+ return false;
78
+ }
79
+ recordBypass(sessionRoot);
80
+ return true;
81
+ }
82
+ async function checkBypassPreconditions(io, ctx) {
83
+ const { options } = ctx;
84
+ if (options.allowIncomplete === true &&
85
+ (options.reason === undefined || options.reason.trim().length === 0)) {
86
+ refuseBypassReasonRequired(io, ctx);
87
+ return false;
88
+ }
89
+ if (options.allowIncomplete === true && options.forceConfirm !== true) {
90
+ return applyRestrictedBypassGate(io, ctx);
91
+ }
92
+ return true;
93
+ }
94
+ export async function runTransitionPreflight(io, requestId, role, options) {
95
+ const resolvedSessionId = await resolveTransitionSessionId(io, requestId, role, options);
96
+ if (resolvedSessionId === null)
97
+ return { proceed: false };
98
+ const allowed = await checkBypassPreconditions(io, {
99
+ requestId,
100
+ role,
101
+ options,
102
+ resolvedSessionId
103
+ });
104
+ if (!allowed)
105
+ return { proceed: false };
106
+ return { proceed: true, resolvedSessionId };
107
+ }
@@ -0,0 +1,96 @@
1
+ import { type RequestType } from '../../services/artifacts/artifact-prerequisites.js';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export type ArchetypeOptions = {
4
+ project: string;
5
+ json?: boolean;
6
+ };
7
+ export type ExistingSystemOptions = {
8
+ project: string;
9
+ maxTokens?: string;
10
+ maxSamples?: string;
11
+ json?: boolean;
12
+ };
13
+ export type RequestTypeSanityOptions = {
14
+ project: string;
15
+ type: RequestType;
16
+ baseRef?: string;
17
+ json?: boolean;
18
+ };
19
+ export type FileSizeScanOptions = {
20
+ project: string;
21
+ baseRef?: string;
22
+ threshold?: string;
23
+ json?: boolean;
24
+ };
25
+ export type ScanLibrariesOptions = {
26
+ project: string;
27
+ json?: boolean;
28
+ };
29
+ export type AcceptanceCoverageOptions = {
30
+ rid: string;
31
+ project: string;
32
+ sessionId?: string;
33
+ json?: boolean;
34
+ };
35
+ export type DiffVsScopeOptions = {
36
+ rid: string;
37
+ project: string;
38
+ sessionId?: string;
39
+ baseRef?: string;
40
+ json?: boolean;
41
+ };
42
+ /** `--format` accepts exactly these two values across the report subcommands. */
43
+ export type ScanOutputFormat = 'md' | 'json';
44
+ export type ApiSurfaceOptions = {
45
+ project: string;
46
+ format?: ScanOutputFormat;
47
+ includeDirs?: string;
48
+ maxPerKind?: number;
49
+ json?: boolean;
50
+ };
51
+ export type OrphanScope = 'working-tree' | 'git-diff' | 'all';
52
+ export type OrphanOptions = {
53
+ project: string;
54
+ format?: ScanOutputFormat;
55
+ scope?: OrphanScope;
56
+ strict?: boolean;
57
+ json?: boolean;
58
+ };
59
+ export type KarpathyScope = 'working-tree' | 'all';
60
+ export type KarpathyOptions = {
61
+ project: string;
62
+ format?: ScanOutputFormat;
63
+ scope?: KarpathyScope;
64
+ json?: boolean;
65
+ };
66
+ export declare function parsePositiveInt(value: string | undefined, fallback: number): number;
67
+ export declare function parseOptionalNonNegativeInt(value: string | undefined): number | undefined;
68
+ export declare function parseRequestType(value: string): RequestType;
69
+ export declare function parseScanOutputFormat(value: string): ScanOutputFormat;
70
+ export declare function parseNonNegativeIntOption(value: string): number;
71
+ export declare function parseOrphanScope(value: string): OrphanScope;
72
+ export declare function parseKarpathyScope(value: string): KarpathyScope;
73
+ /**
74
+ * Everything `emitScanReport` needs. `renderMarkdown` is a thunk because the
75
+ * original callbacks built the markdown at this exact point in the flow — after
76
+ * the `--format json` branches have returned — and it must stay lazy so a
77
+ * `--format json` run never renders markdown it would throw away.
78
+ */
79
+ export type ScanReportOutput = {
80
+ command: string;
81
+ format?: ScanOutputFormat | undefined;
82
+ json?: boolean | undefined;
83
+ report: unknown;
84
+ nextActions: string[];
85
+ renderMarkdown: () => string;
86
+ };
87
+ /**
88
+ * The output contract shared by `scan api-surface`, `scan orphan` and
89
+ * `scan karpathy`:
90
+ * - `--format json` without `--json` writes the bare report (no envelope);
91
+ * - `--format json` with `--json` writes the ok/data/code envelope;
92
+ * - otherwise markdown goes to stdout, and `--json` wraps it as
93
+ * `{ markdown, report }` while the human path prints "Next actions:" to
94
+ * stderr only when there is at least one.
95
+ */
96
+ export declare function emitScanReport(io: ProgramIO, output: ScanReportOutput): void;
@@ -0,0 +1,83 @@
1
+ // Shared plumbing for the `peaks scan` subcommands, extracted from
2
+ // scan-commands.ts so that no single file (or function) has to carry ten
3
+ // subcommands at once. Everything here is parameter-in / value-out: the option
4
+ // shapes each runner receives, the parsers the command definitions hand to
5
+ // Commander as option-processing callbacks, and the two output shapes the
6
+ // report commands share (the format-aware envelope / markdown / raw-JSON
7
+ // writer and its "Next actions:" tail).
8
+ //
9
+ // Dependency direction is one-way: this module never imports scan-commands.ts.
10
+ import { InvalidArgumentError } from 'commander';
11
+ import { ok } from 'peaks-loop-shared/result';
12
+ import { isRequestType, VALID_REQUEST_TYPES } from '../../services/artifacts/artifact-prerequisites.js';
13
+ import { printResult } from '../cli-helpers.js';
14
+ export function parsePositiveInt(value, fallback) {
15
+ if (value === undefined)
16
+ return fallback;
17
+ if (!/^\d+$/.test(value))
18
+ return fallback;
19
+ const parsed = Number(value);
20
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback;
21
+ }
22
+ export function parseOptionalNonNegativeInt(value) {
23
+ return value !== undefined && /^\d+$/.test(value) ? Number(value) : undefined;
24
+ }
25
+ export function parseRequestType(value) {
26
+ if (!isRequestType(value)) {
27
+ throw new InvalidArgumentError(`must be one of ${VALID_REQUEST_TYPES.join(', ')}`);
28
+ }
29
+ return value;
30
+ }
31
+ export function parseScanOutputFormat(value) {
32
+ if (value !== 'md' && value !== 'json') {
33
+ throw new InvalidArgumentError('must be md or json');
34
+ }
35
+ return value;
36
+ }
37
+ export function parseNonNegativeIntOption(value) {
38
+ if (!/^\d+$/.test(value)) {
39
+ throw new InvalidArgumentError('must be a non-negative integer');
40
+ }
41
+ return Number(value);
42
+ }
43
+ export function parseOrphanScope(value) {
44
+ if (value !== 'working-tree' && value !== 'git-diff' && value !== 'all') {
45
+ throw new InvalidArgumentError('must be working-tree, git-diff, or all');
46
+ }
47
+ return value;
48
+ }
49
+ export function parseKarpathyScope(value) {
50
+ if (value !== 'working-tree' && value !== 'all') {
51
+ throw new InvalidArgumentError('must be working-tree or all');
52
+ }
53
+ return value;
54
+ }
55
+ /**
56
+ * The output contract shared by `scan api-surface`, `scan orphan` and
57
+ * `scan karpathy`:
58
+ * - `--format json` without `--json` writes the bare report (no envelope);
59
+ * - `--format json` with `--json` writes the ok/data/code envelope;
60
+ * - otherwise markdown goes to stdout, and `--json` wraps it as
61
+ * `{ markdown, report }` while the human path prints "Next actions:" to
62
+ * stderr only when there is at least one.
63
+ */
64
+ export function emitScanReport(io, output) {
65
+ if (output.format === 'json' && !output.json) {
66
+ // Raw JSON without the ok/data/code envelope.
67
+ process.stdout.write(JSON.stringify(output.report, null, 2) + '\n');
68
+ return;
69
+ }
70
+ if (output.format === 'json') {
71
+ printResult(io, ok(output.command, output.report, [], output.nextActions), output.json);
72
+ return;
73
+ }
74
+ const md = output.renderMarkdown();
75
+ if (output.json) {
76
+ printResult(io, ok(output.command, { markdown: md, report: output.report }, [], output.nextActions), output.json);
77
+ return;
78
+ }
79
+ process.stdout.write(md + '\n');
80
+ if (output.nextActions.length > 0) {
81
+ process.stderr.write('\nNext actions:\n' + output.nextActions.map((a) => ' - ' + a).join('\n') + '\n');
82
+ }
83
+ }
@@ -1,3 +1,4 @@
1
- import { Command } from 'commander';
2
- import { type ProgramIO } from '../cli-helpers.js';
1
+ import type { Command } from 'commander';
2
+ import type { ProgramIO } from '../cli-helpers.js';
3
+ export type { AcceptanceCoverageOptions, ApiSurfaceOptions, ArchetypeOptions, DiffVsScopeOptions, ExistingSystemOptions, FileSizeScanOptions, KarpathyOptions, KarpathyScope, OrphanOptions, OrphanScope, RequestTypeSanityOptions, ScanLibrariesOptions, ScanOutputFormat, ScanReportOutput } from './scan-command-shared.js';
3
4
  export declare function registerScanCommands(program: Command, io: ProgramIO): void;