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,42 @@
1
+ import { lintSpecFile } from '../../services/loop/spec-service.js';
2
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
3
+ import { fail, ok } from 'peaks-loop-shared/result';
4
+ import { loopSpecParent } from './loop-eval-parents.js';
5
+ export function registerLoopSpecLintCommand(program, io) {
6
+ const spec = loopSpecParent(program);
7
+ addJsonOption(spec
8
+ .command('lint')
9
+ .description('Slice E.2: schema-validate a spec.yaml file (path required).')
10
+ .argument('<file>', 'path to spec.yaml')
11
+ .option('--rid <rid>', 'override the rid embedded in the spec (default: inferred from path)')).action((file, options) => runLoopSpecLint(file, options, io));
12
+ }
13
+ function reportLoopSpecLintFailure(io, error, file, asJson) {
14
+ printResult(io, fail('loop.spec.lint', 'LOOP_SPEC_LINT_FAILED', getErrorMessage(error), { file }, [
15
+ 'Verify the file path and rid flag.'
16
+ ]), asJson);
17
+ process.exitCode = 1;
18
+ }
19
+ function runLoopSpecLint(file, options, io) {
20
+ try {
21
+ const result = lintSpecFile(file, options.rid);
22
+ if (result.spec === null) {
23
+ printResult(io, fail('loop.spec.lint', 'SPEC_LINT_FAILED', result.report.errors.join('; '), { file, raw: result.raw.slice(0, 200) }, ['Verify the file path and YAML syntax.']), options.json);
24
+ process.exitCode = 1;
25
+ return;
26
+ }
27
+ printResult(io, ok('loop.spec.lint', {
28
+ file,
29
+ spec: result.spec,
30
+ lint: {
31
+ ok: result.report.ok,
32
+ errors: result.report.errors,
33
+ warnings: result.report.warnings
34
+ }
35
+ }, [], []), options.json);
36
+ if (!result.report.ok)
37
+ process.exitCode = 1;
38
+ }
39
+ catch (error) {
40
+ reportLoopSpecLintFailure(io, error, file, options.json);
41
+ }
42
+ }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerWorkflowEvalWorkflowCommands(program: Command, io: ProgramIO): void;
@@ -0,0 +1,141 @@
1
+ import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
2
+ import { fail, ok } from 'peaks-loop-shared/result';
3
+ import { resolveWorkflow, planWorkflow, planWorkflowRun } from '../../services/workflow/workflow-loader.js';
4
+ import { findProjectRoot } from '../../services/config/config-safety.js';
5
+ import { workflowCommandParent } from './loop-eval-parents.js';
6
+ export function registerWorkflowEvalWorkflowCommands(program, io) {
7
+ const workflow = workflowCommandParent(program);
8
+ // peaks workflow run <id>
9
+ addJsonOption(workflow
10
+ .command('run')
11
+ .description('Slice A.3: replay a captured workflow (.peaks/workflows/<id>.yaml) deterministically. Returns the run-plan order + per-phase status without re-deriving the phase plan.')
12
+ .argument('<id>', 'workflow id (matches .peaks/workflows/<id>.yaml)')
13
+ .requiredOption('--session <sid>', 'session id (from peaks workspace init)')
14
+ .option('--project <path>', 'project root (default: cwd)')).action((id, options) => runWorkflowRun(id, options, io));
15
+ // peaks workflow graph <id> (dry-run graph render)
16
+ // Renamed from `plan` to `graph` to avoid collision with the existing
17
+ // `peaks workflow plan <read|refresh|detect-trigger>` family registered
18
+ // Reuse the existing `graph` parent if `registerWorkflowLifecycleCommand`
19
+ // already created one (it owns `peaks workflow graph show|list`).
20
+ const existingGraph = workflow.commands.find((c) => c.name() === 'graph');
21
+ const graphParent = existingGraph ??
22
+ workflow
23
+ .command('graph')
24
+ .description('workflow graph read commands (slice A.3 dry-run + slice 4.0.8 lifecycle)');
25
+ addJsonOption(graphParent
26
+ .description('Slice A.3 dry-run: render the workflow graph (phases + parallel groups + evaluators + budget). No phase is executed.')
27
+ .argument('<id>', 'workflow id')
28
+ .requiredOption('--session <sid>', 'session id')
29
+ .option('--project <path>', 'project root (default: cwd)')).action((id, options) => runWorkflowGraph(id, options, io));
30
+ // peaks workflow lint <id>
31
+ addJsonOption(workflow
32
+ .command('lint')
33
+ .description('Slice A.3: validate a workflow spec (phases / gates / evaluators / parallel groups / budget).')
34
+ .argument('<id>', 'workflow id')
35
+ .requiredOption('--session <sid>', 'session id')
36
+ .option('--project <path>', 'project root (default: cwd)')).action((id, options) => runWorkflowLint(id, options, io));
37
+ }
38
+ function reportWorkflowRunFailure(io, error, sessionId, asJson) {
39
+ printResult(io, fail('workflow.run', 'WORKFLOW_RUN_FAILED', getErrorMessage(error), { sessionId }, [
40
+ 'Verify the workflow id and session binding.'
41
+ ]), asJson);
42
+ process.exitCode = 1;
43
+ }
44
+ function reportWorkflowGraphFailure(io, error, sessionId, asJson) {
45
+ printResult(io, fail('workflow.graph', 'WORKFLOW_GRAPH_FAILED', getErrorMessage(error), { sessionId }, [
46
+ 'Verify the workflow id and session binding.'
47
+ ]), asJson);
48
+ process.exitCode = 1;
49
+ }
50
+ function reportWorkflowLintFailure(io, error, sessionId, asJson) {
51
+ printResult(io, fail('workflow.lint', 'WORKFLOW_LINT_FAILED', getErrorMessage(error), { sessionId }, [
52
+ 'Verify the workflow file syntax.'
53
+ ]), asJson);
54
+ process.exitCode = 1;
55
+ }
56
+ function workflowRunData(sessionId, resolved, runPlan) {
57
+ return {
58
+ sessionId,
59
+ workflow: { id: resolved.spec.id, label: resolved.spec.label, source: resolved.source },
60
+ runPlan,
61
+ lintWarnings: resolved.lint.warnings
62
+ };
63
+ }
64
+ function workflowGraphData(sessionId, graph, resolved) {
65
+ return {
66
+ sessionId,
67
+ graph,
68
+ lintWarnings: resolved.lint.warnings
69
+ };
70
+ }
71
+ function runWorkflowRun(id, options, io) {
72
+ try {
73
+ const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
74
+ const resolved = resolveWorkflow(projectRoot, id);
75
+ if (resolved.source.kind === 'missing') {
76
+ printResult(io, fail('workflow.run', 'WORKFLOW_NOT_FOUND', `workflow "${id}" not found`, { sessionId: options.session }, [`peaks workflow lint ${id} --session ${options.session} --json`]), options.json);
77
+ process.exitCode = 1;
78
+ return;
79
+ }
80
+ if (!resolved.lint.ok) {
81
+ printResult(io, fail('workflow.run', 'WORKFLOW_LINT_FAILED', `workflow "${id}" has ${resolved.lint.errors.length} lint error(s): ${resolved.lint.errors.join('; ')}`, resolved.lint, [`peaks workflow lint ${id} --session ${options.session} --json`]), options.json);
82
+ process.exitCode = 1;
83
+ return;
84
+ }
85
+ const runPlan = planWorkflowRun(resolved.spec);
86
+ const data = workflowRunData(options.session, resolved, runPlan);
87
+ const actions = [
88
+ `Run \`peaks workflow plan ${id} --session ${options.session} --json\` to preview the graph.`
89
+ ];
90
+ printResult(io, ok('workflow.run', data, [], actions), options.json);
91
+ }
92
+ catch (error) {
93
+ reportWorkflowRunFailure(io, error, options.session, options.json);
94
+ }
95
+ }
96
+ function runWorkflowGraph(id, options, io) {
97
+ try {
98
+ const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
99
+ const resolved = resolveWorkflow(projectRoot, id);
100
+ if (resolved.source.kind === 'missing') {
101
+ printResult(io, fail('workflow.graph', 'WORKFLOW_NOT_FOUND', `workflow "${id}" not found`, { sessionId: options.session }, [`Create .peaks/workflows/${id}.yaml or use the bundled default-fullauto-md.`]), options.json);
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ if (!resolved.lint.ok) {
106
+ printResult(io, fail('workflow.graph', 'WORKFLOW_LINT_FAILED', `workflow "${id}" has ${resolved.lint.errors.length} lint error(s): ${resolved.lint.errors.join('; ')}`, resolved.lint, [`peaks workflow lint ${id} --session ${options.session} --json`]), options.json);
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ const graph = planWorkflow(resolved.spec, resolved.source);
111
+ const data = workflowGraphData(options.session, graph, resolved);
112
+ const actions = [
113
+ `Run \`peaks workflow run ${id} --session ${options.session} --json\` to materialize the run-plan order.`
114
+ ];
115
+ printResult(io, ok('workflow.graph', data, [], actions), options.json);
116
+ }
117
+ catch (error) {
118
+ reportWorkflowGraphFailure(io, error, options.session, options.json);
119
+ }
120
+ }
121
+ function runWorkflowLint(id, options, io) {
122
+ try {
123
+ const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
124
+ const resolved = resolveWorkflow(projectRoot, id);
125
+ if (resolved.source.kind === 'missing') {
126
+ printResult(io, fail('workflow.lint', 'WORKFLOW_NOT_FOUND', `workflow "${id}" not found`, { sessionId: options.session }, [`Create .peaks/workflows/${id}.yaml`]), options.json);
127
+ process.exitCode = 1;
128
+ return;
129
+ }
130
+ printResult(io, ok('workflow.lint', {
131
+ sessionId: options.session,
132
+ source: resolved.source,
133
+ lint: resolved.lint
134
+ }, [], []), options.json);
135
+ if (!resolved.lint.ok)
136
+ process.exitCode = 1;
137
+ }
138
+ catch (error) {
139
+ reportWorkflowLintFailure(io, error, options.session, options.json);
140
+ }
141
+ }
@@ -0,0 +1,10 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ /** Absolute path of the MCP server's process entry. */
4
+ export declare function mcpServerEntryPath(): string;
5
+ /** The exact command this launcher will spawn, resolved without spawning it. */
6
+ export declare function mcpServeInvocation(entry?: string): {
7
+ command: string;
8
+ args: string[];
9
+ };
10
+ export declare function registerMcpCommands(program: Command, io: ProgramIO): void;
@@ -0,0 +1,157 @@
1
+ // src/cli/commands/mcp-commands.ts
2
+ //
3
+ // `peaks mcp` — the command family around the read-only MCP surface. This slice
4
+ // delivers `serve`; `install` / `uninstall` / `status` are the distribution
5
+ // slice's (spec §12, segment ③).
6
+ //
7
+ // WHY THIS FILE DOES NOT IMPORT THE SERVER. The design's load-bearing invariant
8
+ // is that `src/services/mcp/` is a DELETABLE PIPE (spec §1): remove it and the
9
+ // CLI is unchanged, the interceptor is unchanged, and a harness that used MCP
10
+ // simply falls back to Bash. That invariant is an assertion about import edges,
11
+ // and it is enforced by `tests/unit/standards/no-mcp-source-import.test.ts` —
12
+ // which reports an edge from any module outside the MCP root, this file
13
+ // included. So the server is reached the way the design says a server is
14
+ // reached: as a PROCESS, by path.
15
+ //
16
+ // The path is computed here rather than asked for, because asking would be the
17
+ // import. `SOURCE_TREE` / `TREE_DIR` are the same two facts every other
18
+ // self-spawn in this tree derives the same way (see `daemon-supervisor.ts`):
19
+ // this file's own extension says which tree it was loaded from, and its own
20
+ // directory says where that tree is.
21
+ import { spawn } from 'node:child_process';
22
+ import { dirname, extname, join, resolve } from 'node:path';
23
+ import { fileURLToPath } from 'node:url';
24
+ import { installMcpForAdapter, resolveMcpServerArgv, spawnMcpInstallRunner, uninstallMcpForAdapter } from '../../services/distribution/mcp-install.js';
25
+ import { detectIdeFromContext } from '../../services/ide/hook-translator.js';
26
+ import { resolveIdeOptionHelp, tryGetAdapter } from '../../services/ide/ide-registry.js';
27
+ import { interpreterArgs } from '../../services/web/daemon-supervisor.js';
28
+ import { printResult } from '../cli-helpers.js';
29
+ import { fail, ok } from 'peaks-loop-shared/result';
30
+ /** This file's directory — `<root>/src/cli/commands` or `<root>/dist/cli/commands`. */
31
+ const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
32
+ /** `<root>/src` or `<root>/dist`. */
33
+ const TREE_DIR = resolve(MODULE_DIR, '..', '..');
34
+ /** Compiled trees run `.js` under node; the source tree is TypeScript. */
35
+ const SOURCE_TREE = extname(fileURLToPath(import.meta.url)) === '.ts';
36
+ /** Absolute path of the MCP server's process entry. */
37
+ export function mcpServerEntryPath() {
38
+ return join(TREE_DIR, 'services', 'mcp', SOURCE_TREE ? 'server-main.ts' : 'server-main.js');
39
+ }
40
+ /** The exact command this launcher will spawn, resolved without spawning it. */
41
+ export function mcpServeInvocation(entry = mcpServerEntryPath()) {
42
+ return { command: process.execPath, args: interpreterArgs(entry) };
43
+ }
44
+ /**
45
+ * Hand the process over to the MCP server: the child inherits all three standard
46
+ * streams, so the harness's stdin/stdout pipe IS the server's pipe and this
47
+ * process adds a frame of indirection and nothing else.
48
+ */
49
+ function runMcpServe(io, options) {
50
+ const invocation = mcpServeInvocation();
51
+ const child = spawn(invocation.command, invocation.args, {
52
+ stdio: 'inherit',
53
+ cwd: options.project ?? process.cwd(),
54
+ // Windows contract: a spawned child must not allocate a console window.
55
+ windowsHide: true
56
+ });
57
+ child.on('error', (error) => {
58
+ printResult(io, fail('mcp.serve', 'MCP_SERVE_SPAWN_FAILED', `Could not start the MCP server: ${error.message}`, {
59
+ entry: invocation.args.at(-1) ?? ''
60
+ }, ['Check that the build is present, or run `pnpm build`']), options.json === true);
61
+ process.exitCode = 1;
62
+ });
63
+ child.on('exit', (code, signal) => {
64
+ // The child's status IS this command's status — an MCP client reads the
65
+ // server's exit, so masking it would be the only lie this launcher told.
66
+ if (signal !== null) {
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ process.exitCode = code ?? 0;
71
+ });
72
+ }
73
+ export function registerMcpCommands(program, io) {
74
+ const mcp = program
75
+ .command('mcp')
76
+ .description('Serve peaks-loop read-only capabilities over MCP (stdio)');
77
+ mcp
78
+ .command('serve')
79
+ .description('Run the read-only MCP server on stdio until the caller closes it')
80
+ .option('--project <path>', 'project the server runs the CLI in (default: current directory)')
81
+ .action((options) => {
82
+ runMcpServe(io, options);
83
+ });
84
+ registerMcpRegistrationCommands(mcp, io);
85
+ }
86
+ function resolveTargetAdapter(options) {
87
+ const ide = options.ide !== undefined && options.ide.length > 0
88
+ ? options.ide
89
+ : detectIdeFromContext({ env: process.env, cwd: process.cwd(), parsedStdin: null });
90
+ const adapter = tryGetAdapter(ide);
91
+ return adapter === undefined ? { kind: 'unsupported', ide } : { kind: 'adapter', adapter };
92
+ }
93
+ /** One envelope line per adapter: what was registered, or why nothing was. */
94
+ function reportRegistration(result, verb) {
95
+ if (result.skipped) {
96
+ return `${result.ideId}: skipped — ${result.reason}`;
97
+ }
98
+ const { report } = result;
99
+ return `${result.ideId}: ${verb} ${report.ok ? 'ok' : 'FAILED'} — ${report.detail}`;
100
+ }
101
+ /** The `data` BOTH envelopes carry, so the failure path is never a thinner shape. */
102
+ function registrationEnvelopeData(result, verb) {
103
+ return {
104
+ ide: result.ideId,
105
+ skipped: result.skipped,
106
+ summary: reportRegistration(result, verb),
107
+ registration: result
108
+ };
109
+ }
110
+ function runMcpRegistration(io, verb, options) {
111
+ const target = resolveTargetAdapter(options);
112
+ if (target.kind === 'unsupported') {
113
+ printResult(io, fail(`mcp.${verb}`, 'MCP_HARNESS_UNSUPPORTED', `No adapter is registered for harness '${target.ide}'.`, { ide: target.ide }, ['Pass --ide with a registered adapter id']), options.json === true);
114
+ process.exitCode = 1;
115
+ return;
116
+ }
117
+ const { adapter } = target;
118
+ const serverArgv = resolveMcpServerArgv();
119
+ const result = verb === 'install'
120
+ ? installMcpForAdapter(adapter, serverArgv, spawnMcpInstallRunner)
121
+ : uninstallMcpForAdapter(adapter, serverArgv, spawnMcpInstallRunner);
122
+ const report = result.skipped ? undefined : result.report;
123
+ if (report !== undefined && !report.ok) {
124
+ printResult(io, fail(`mcp.${verb}`, 'MCP_REGISTRATION_FAILED', report.detail, registrationEnvelopeData(result, verb), ['Run the harness command by hand to see its own error']), options.json === true);
125
+ process.exitCode = 1;
126
+ return;
127
+ }
128
+ printResult(io, ok(`mcp.${verb}`, registrationEnvelopeData(result, verb)), options.json === true);
129
+ }
130
+ /**
131
+ * `peaks mcp install` / `peaks mcp uninstall` — the distribution half of the MCP
132
+ * surface, and an explicit pair on purpose (spec §8.3 Q19): an uninstall that
133
+ * only ran from a package manager's hook is skipped whenever the manager decides
134
+ * to skip it, and the leftover registration then makes the NEXT install fail on
135
+ * a duplicate. Neither command starts a process; they register one.
136
+ */
137
+ function registerMcpRegistrationCommands(mcp, io) {
138
+ mcp
139
+ .command('install')
140
+ .description('Register the peaks MCP server with the detected harness. Removes the name ' +
141
+ 'from every declared scope first, because the harness registers non-idempotently. ' +
142
+ 'A harness whose adapter declares no registration entry is skipped, not failed.')
143
+ .option('--ide <id>', resolveIdeOptionHelp())
144
+ .option('--json', 'JSON envelope output')
145
+ .action((options) => {
146
+ runMcpRegistration(io, 'install', options);
147
+ });
148
+ mcp
149
+ .command('uninstall')
150
+ .description('Remove the peaks MCP registration from the harness, sweeping every scope it ' +
151
+ 'may hold. Explicit, because no package-manager hook is relied on.')
152
+ .option('--ide <id>', resolveIdeOptionHelp())
153
+ .option('--json', 'JSON envelope output')
154
+ .action((options) => {
155
+ runMcpRegistration(io, 'uninstall', options);
156
+ });
157
+ }
@@ -0,0 +1,49 @@
1
+ import type { RequestArtifactRole, RequestArtifactState, RequestType } from '../../services/artifacts/request-artifact-service.js';
2
+ export type RequestInitOptions = {
3
+ role: string;
4
+ id: string;
5
+ project: string;
6
+ sessionId?: string;
7
+ apply?: boolean;
8
+ type?: RequestType;
9
+ callerId?: string;
10
+ json?: boolean;
11
+ };
12
+ export type RequestListOptions = {
13
+ project: string;
14
+ sessionId?: string;
15
+ role?: RequestArtifactRole;
16
+ summary?: boolean;
17
+ json?: boolean;
18
+ };
19
+ export type RequestShowOptions = {
20
+ role: RequestArtifactRole;
21
+ project: string;
22
+ sessionId?: string;
23
+ json?: boolean;
24
+ pretty?: boolean;
25
+ compact?: boolean;
26
+ };
27
+ export type RequestTransitionOptions = {
28
+ role: RequestArtifactRole;
29
+ project: string;
30
+ state: RequestArtifactState;
31
+ sessionId?: string;
32
+ reason?: string;
33
+ allowIncomplete?: boolean;
34
+ confirm?: boolean;
35
+ forceConfirm?: boolean;
36
+ json?: boolean;
37
+ };
38
+ export type RequestLintOptions = {
39
+ role: RequestArtifactRole;
40
+ project: string;
41
+ sessionId?: string;
42
+ json?: boolean;
43
+ };
44
+ export type RequestRepairStatusOptions = {
45
+ project: string;
46
+ sessionId?: string;
47
+ maxCycles?: string;
48
+ json?: boolean;
49
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,10 +1,4 @@
1
- import { Command } from 'commander';
2
- import { type RequestArtifactSummary } from '../../services/artifacts/request-artifact-service.js';
3
- import { type ProgramIO } from '../cli-helpers.js';
4
- /**
5
- * `request list`. `count` is the true total; `names` carries
6
- * `role/requestId (state)` labels for the first N entries. The full `items`
7
- * array (with paths + timestamps) is one flag away — omit `--summary`.
8
- */
9
- export declare function buildRequestListSummary(items: readonly RequestArtifactSummary[]): Record<string, unknown>;
1
+ import type { Command } from 'commander';
2
+ import type { ProgramIO } from '../cli-helpers.js';
3
+ export { buildRequestListSummary } from './request-list-command.js';
10
4
  export declare function registerRequestCommands(program: Command, io: ProgramIO): void;