@intentius/chant 0.57.0 → 0.59.0

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 (558) hide show
  1. package/dist/audit/catalog.d.ts +51 -1
  2. package/dist/audit/catalog.d.ts.map +1 -1
  3. package/dist/audit/core.d.ts +36 -1
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts +26 -9
  6. package/dist/audit/discover.d.ts.map +1 -1
  7. package/dist/audit/lineage.d.ts +10 -0
  8. package/dist/audit/lineage.d.ts.map +1 -0
  9. package/dist/audit/prior-art.d.ts +385 -0
  10. package/dist/audit/prior-art.d.ts.map +1 -0
  11. package/dist/audit/proof.d.ts +16 -0
  12. package/dist/audit/proof.d.ts.map +1 -1
  13. package/dist/audit/report-html.d.ts.map +1 -1
  14. package/dist/audit/report-model.d.ts +8 -1
  15. package/dist/audit/report-model.d.ts.map +1 -1
  16. package/dist/audit/report.d.ts.map +1 -1
  17. package/dist/audit/rules-doc.d.ts +3 -0
  18. package/dist/audit/rules-doc.d.ts.map +1 -1
  19. package/dist/audit/secrets.d.ts +15 -0
  20. package/dist/audit/secrets.d.ts.map +1 -1
  21. package/dist/audit/terraform-state.d.ts +46 -0
  22. package/dist/audit/terraform-state.d.ts.map +1 -0
  23. package/dist/build.d.ts +17 -1
  24. package/dist/build.d.ts.map +1 -1
  25. package/dist/claimed-fields.d.ts +161 -0
  26. package/dist/claimed-fields.d.ts.map +1 -0
  27. package/dist/cli/build-params-cli.d.ts +2 -2
  28. package/dist/cli/command-group.d.ts +14 -0
  29. package/dist/cli/command-group.d.ts.map +1 -1
  30. package/dist/cli/commands/audit.d.ts +17 -1
  31. package/dist/cli/commands/audit.d.ts.map +1 -1
  32. package/dist/cli/commands/build.d.ts.map +1 -1
  33. package/dist/cli/commands/carve-bridge.d.ts.map +1 -1
  34. package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
  35. package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
  36. package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
  37. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
  38. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
  39. package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
  40. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  41. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  42. package/dist/cli/commands/init.d.ts.map +1 -1
  43. package/dist/cli/commands/lint.d.ts +13 -0
  44. package/dist/cli/commands/lint.d.ts.map +1 -1
  45. package/dist/cli/commands/onboard.d.ts +2 -0
  46. package/dist/cli/commands/onboard.d.ts.map +1 -1
  47. package/dist/cli/handlers/build.d.ts.map +1 -1
  48. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  49. package/dist/cli/handlers/operator.d.ts +82 -16
  50. package/dist/cli/handlers/operator.d.ts.map +1 -1
  51. package/dist/cli/handlers/run.d.ts +49 -42
  52. package/dist/cli/handlers/run.d.ts.map +1 -1
  53. package/dist/cli/main.d.ts +12 -1
  54. package/dist/cli/main.d.ts.map +1 -1
  55. package/dist/cli/mcp/op-tools.d.ts +16 -1
  56. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  57. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  58. package/dist/cli/mcp/resources/context.d.ts.map +1 -1
  59. package/dist/cli/plugins.d.ts +22 -0
  60. package/dist/cli/plugins.d.ts.map +1 -1
  61. package/dist/cli/registry.d.ts +40 -9
  62. package/dist/cli/registry.d.ts.map +1 -1
  63. package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
  64. package/dist/components/auto-release.d.ts +10 -20
  65. package/dist/components/auto-release.d.ts.map +1 -1
  66. package/dist/components/capability.d.ts +4 -4
  67. package/dist/components/cli-support.d.ts +24 -22
  68. package/dist/components/cli-support.d.ts.map +1 -1
  69. package/dist/components/component.d.ts +21 -6
  70. package/dist/components/component.d.ts.map +1 -1
  71. package/dist/components/driver-output.d.ts.map +1 -1
  72. package/dist/components/driver.d.ts +73 -37
  73. package/dist/components/driver.d.ts.map +1 -1
  74. package/dist/components/index.d.ts +1 -2
  75. package/dist/components/index.d.ts.map +1 -1
  76. package/dist/components/manifest-persistence.d.ts +1 -9
  77. package/dist/components/manifest-persistence.d.ts.map +1 -1
  78. package/dist/components/run-progress.d.ts +6 -6
  79. package/dist/components/run-progress.d.ts.map +1 -1
  80. package/dist/components/verbs/run-agent.d.ts +10 -22
  81. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  82. package/dist/components/verbs/verify.d.ts +2 -2
  83. package/dist/deep-observation.d.ts +17 -0
  84. package/dist/deep-observation.d.ts.map +1 -1
  85. package/dist/detectLexicon.d.ts +13 -0
  86. package/dist/detectLexicon.d.ts.map +1 -1
  87. package/dist/discovery/files.d.ts +4 -4
  88. package/dist/discovery/fold-import.d.ts.map +1 -1
  89. package/dist/discovery/param-deps.d.ts +33 -0
  90. package/dist/discovery/param-deps.d.ts.map +1 -1
  91. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  92. package/dist/discovery/sandbox/config-wire.d.ts +2 -2
  93. package/dist/fold/foldable-helpers.d.ts +5 -1
  94. package/dist/fold/foldable-helpers.d.ts.map +1 -1
  95. package/dist/fold-provenance.d.ts +236 -0
  96. package/dist/fold-provenance.d.ts.map +1 -0
  97. package/dist/graph-ops.d.ts +1 -1
  98. package/dist/held-elsewhere.d.ts +85 -0
  99. package/dist/held-elsewhere.d.ts.map +1 -0
  100. package/dist/index.d.ts +3 -0
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/kubectl-context.d.ts +3 -3
  103. package/dist/lexicon-config.d.ts +4 -4
  104. package/dist/lexicon-plugin-helpers.d.ts +1 -1
  105. package/dist/lexicon.d.ts +273 -16
  106. package/dist/lexicon.d.ts.map +1 -1
  107. package/dist/lifecycle/change-set.d.ts +13 -0
  108. package/dist/lifecycle/change-set.d.ts.map +1 -1
  109. package/dist/lifecycle/deep-diff.d.ts +133 -6
  110. package/dist/lifecycle/deep-diff.d.ts.map +1 -1
  111. package/dist/lifecycle/deep-observe.d.ts.map +1 -1
  112. package/dist/lifecycle/gate-ledger.d.ts +79 -3
  113. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  114. package/dist/lifecycle/index.d.ts +1 -0
  115. package/dist/lifecycle/index.d.ts.map +1 -1
  116. package/dist/lifecycle/release-ledger.d.ts +2 -2
  117. package/dist/lifecycle/run-ledger.d.ts +53 -0
  118. package/dist/lifecycle/run-ledger.d.ts.map +1 -0
  119. package/dist/lifecycle/symptoms.d.ts +3 -3
  120. package/dist/lifecycle/symptoms.d.ts.map +1 -1
  121. package/dist/lint/config.d.ts +81 -2
  122. package/dist/lint/config.d.ts.map +1 -1
  123. package/dist/lint/post-synth.d.ts +55 -2
  124. package/dist/lint/post-synth.d.ts.map +1 -1
  125. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
  126. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
  127. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
  128. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
  129. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
  130. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
  131. package/dist/lint/rules/comp/index.d.ts +1 -1
  132. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  133. package/dist/lint/rules/op/index.d.ts +16 -0
  134. package/dist/lint/rules/op/index.d.ts.map +1 -0
  135. package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
  136. package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
  137. package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
  138. package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
  139. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
  140. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
  141. package/dist/lint/rules/op/support.d.ts +12 -0
  142. package/dist/lint/rules/op/support.d.ts.map +1 -0
  143. package/dist/lint/suppressions.d.ts +108 -0
  144. package/dist/lint/suppressions.d.ts.map +1 -0
  145. package/dist/live-endpoint.d.ts +1 -1
  146. package/dist/op/activities/activity-contracts.d.ts +54 -0
  147. package/dist/op/activities/activity-contracts.d.ts.map +1 -0
  148. package/dist/op/activities/apply.d.ts +262 -0
  149. package/dist/op/activities/apply.d.ts.map +1 -0
  150. package/dist/op/activities/build.d.ts +13 -0
  151. package/dist/op/activities/build.d.ts.map +1 -0
  152. package/dist/op/activities/converge.d.ts +110 -0
  153. package/dist/op/activities/converge.d.ts.map +1 -0
  154. package/dist/op/activities/env-teardown.d.ts +76 -0
  155. package/dist/op/activities/env-teardown.d.ts.map +1 -0
  156. package/dist/op/activities/guard-validate.d.ts +64 -0
  157. package/dist/op/activities/guard-validate.d.ts.map +1 -0
  158. package/dist/op/activities/http-check.d.ts +34 -0
  159. package/dist/op/activities/http-check.d.ts.map +1 -0
  160. package/dist/op/activities/index.d.ts +31 -0
  161. package/dist/op/activities/index.d.ts.map +1 -0
  162. package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
  163. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
  164. package/dist/op/activities/lifecycle.d.ts +42 -0
  165. package/dist/op/activities/lifecycle.d.ts.map +1 -0
  166. package/dist/op/activities/pipeline-audit.d.ts +84 -0
  167. package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
  168. package/dist/op/activities/policy.d.ts +17 -0
  169. package/dist/op/activities/policy.d.ts.map +1 -0
  170. package/dist/op/activities/reconcile.d.ts +149 -0
  171. package/dist/op/activities/reconcile.d.ts.map +1 -0
  172. package/dist/op/activities/shell.d.ts +13 -0
  173. package/dist/op/activities/shell.d.ts.map +1 -0
  174. package/dist/op/activities/teardown.d.ts +10 -0
  175. package/dist/op/activities/teardown.d.ts.map +1 -0
  176. package/dist/op/activities/util.d.ts +7 -0
  177. package/dist/op/activities/util.d.ts.map +1 -0
  178. package/dist/op/activities/wait.d.ts +28 -0
  179. package/dist/op/activities/wait.d.ts.map +1 -0
  180. package/dist/op/activities/workflow-audit.d.ts +92 -0
  181. package/dist/op/activities/workflow-audit.d.ts.map +1 -0
  182. package/dist/op/activity-contract-registry.d.ts +76 -0
  183. package/dist/op/activity-contract-registry.d.ts.map +1 -0
  184. package/dist/op/activity-contract.d.ts +25 -18
  185. package/dist/op/activity-contract.d.ts.map +1 -1
  186. package/dist/op/activity-failure.d.ts +28 -0
  187. package/dist/op/activity-failure.d.ts.map +1 -0
  188. package/dist/op/activity-profiles.d.ts +118 -0
  189. package/dist/op/activity-profiles.d.ts.map +1 -0
  190. package/dist/op/activity-registry.d.ts +22 -38
  191. package/dist/op/activity-registry.d.ts.map +1 -1
  192. package/dist/op/activity-runtime.d.ts +3 -14
  193. package/dist/op/activity-runtime.d.ts.map +1 -1
  194. package/dist/op/builders.d.ts +85 -30
  195. package/dist/op/builders.d.ts.map +1 -1
  196. package/dist/op/change-signal.d.ts +91 -0
  197. package/dist/op/change-signal.d.ts.map +1 -0
  198. package/dist/op/composites/apply-op.d.ts +118 -0
  199. package/dist/op/composites/apply-op.d.ts.map +1 -0
  200. package/dist/op/composites/converge-op.d.ts +120 -0
  201. package/dist/op/composites/converge-op.d.ts.map +1 -0
  202. package/dist/op/composites/index.d.ts +26 -0
  203. package/dist/op/composites/index.d.ts.map +1 -0
  204. package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
  205. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
  206. package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
  207. package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
  208. package/dist/op/composites/reconcile-op.d.ts +57 -0
  209. package/dist/op/composites/reconcile-op.d.ts.map +1 -0
  210. package/dist/op/composites/watch-op.d.ts +60 -0
  211. package/dist/op/composites/watch-op.d.ts.map +1 -0
  212. package/dist/op/composites/workflow-audit-op.d.ts +57 -0
  213. package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
  214. package/dist/op/converge-rule.d.ts +12 -10
  215. package/dist/op/converge-rule.d.ts.map +1 -1
  216. package/dist/op/cron.d.ts +51 -0
  217. package/dist/op/cron.d.ts.map +1 -0
  218. package/dist/op/discover.d.ts +9 -0
  219. package/dist/op/discover.d.ts.map +1 -1
  220. package/dist/op/duration.d.ts +11 -0
  221. package/dist/op/duration.d.ts.map +1 -0
  222. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  223. package/dist/op/gate-name.d.ts +40 -0
  224. package/dist/op/gate-name.d.ts.map +1 -0
  225. package/dist/op/gate-summary.d.ts +43 -0
  226. package/dist/op/gate-summary.d.ts.map +1 -0
  227. package/dist/op/gate.d.ts +90 -0
  228. package/dist/op/gate.d.ts.map +1 -0
  229. package/dist/op/generate-pipeline.d.ts +9 -0
  230. package/dist/op/generate-pipeline.d.ts.map +1 -1
  231. package/dist/op/index.d.ts +29 -9
  232. package/dist/op/index.d.ts.map +1 -1
  233. package/dist/op/local-executor.d.ts +114 -28
  234. package/dist/op/local-executor.d.ts.map +1 -1
  235. package/dist/op/local-output.d.ts +11 -1
  236. package/dist/op/local-output.d.ts.map +1 -1
  237. package/dist/op/op-ir.d.ts +185 -0
  238. package/dist/op/op-ir.d.ts.map +1 -0
  239. package/dist/op/op-verb-class.d.ts +10 -2
  240. package/dist/op/op-verb-class.d.ts.map +1 -1
  241. package/dist/op/operator.d.ts +93 -5
  242. package/dist/op/operator.d.ts.map +1 -1
  243. package/dist/op/receipt-store.d.ts +1 -1
  244. package/dist/op/receipt-store.d.ts.map +1 -1
  245. package/dist/op/resource.d.ts +15 -1
  246. package/dist/op/resource.d.ts.map +1 -1
  247. package/dist/op/runtime.d.ts +200 -0
  248. package/dist/op/runtime.d.ts.map +1 -0
  249. package/dist/op/runtimes/local.d.ts +29 -0
  250. package/dist/op/runtimes/local.d.ts.map +1 -0
  251. package/dist/op/step-output-ref.d.ts +15 -13
  252. package/dist/op/step-output-ref.d.ts.map +1 -1
  253. package/dist/op/types.d.ts +96 -29
  254. package/dist/op/types.d.ts.map +1 -1
  255. package/dist/ownership.d.ts +1 -1
  256. package/dist/provenance.d.ts +21 -0
  257. package/dist/provenance.d.ts.map +1 -1
  258. package/dist/serializer-walker.d.ts.map +1 -1
  259. package/dist/terraform/bridge.d.ts +26 -7
  260. package/dist/terraform/bridge.d.ts.map +1 -1
  261. package/dist/terraform/carve-provider.d.ts +28 -2
  262. package/dist/terraform/carve-provider.d.ts.map +1 -1
  263. package/dist/terraform/data-source-shape.d.ts +77 -0
  264. package/dist/terraform/data-source-shape.d.ts.map +1 -0
  265. package/dist/terraform/graph.d.ts.map +1 -1
  266. package/dist/terraform/providers/kubernetes.d.ts +5 -0
  267. package/dist/terraform/providers/kubernetes.d.ts.map +1 -1
  268. package/dist/terraform/tier-map.d.ts +16 -4
  269. package/dist/terraform/tier-map.d.ts.map +1 -1
  270. package/dist/terraform/types.d.ts +8 -0
  271. package/dist/terraform/types.d.ts.map +1 -1
  272. package/package.json +6 -1
  273. package/src/audit/catalog.test.ts +79 -3
  274. package/src/audit/catalog.ts +111 -13
  275. package/src/audit/core.test.ts +26 -0
  276. package/src/audit/core.ts +84 -18
  277. package/src/audit/discover.test.ts +39 -0
  278. package/src/audit/discover.ts +202 -18
  279. package/src/audit/lineage.ts +100 -0
  280. package/src/audit/prior-art.ts +153 -0
  281. package/src/audit/proof.test.ts +67 -0
  282. package/src/audit/proof.ts +70 -0
  283. package/src/audit/report-html.ts +9 -4
  284. package/src/audit/report-model.ts +16 -2
  285. package/src/audit/report.test.ts +33 -0
  286. package/src/audit/report.ts +5 -3
  287. package/src/audit/rules-doc.test.ts +34 -2
  288. package/src/audit/rules-doc.ts +82 -9
  289. package/src/audit/secrets.ts +15 -3
  290. package/src/audit/terraform-state.test.ts +144 -0
  291. package/src/audit/terraform-state.ts +131 -0
  292. package/src/build.ts +31 -1
  293. package/src/claimed-fields.test.ts +145 -0
  294. package/src/claimed-fields.ts +208 -0
  295. package/src/cli/build-params-cli.ts +2 -2
  296. package/src/cli/command-group.ts +14 -0
  297. package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
  298. package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
  299. package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
  300. package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
  301. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
  302. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
  303. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
  304. package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
  305. package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
  306. package/src/cli/commands/audit.test.ts +191 -11
  307. package/src/cli/commands/audit.ts +78 -28
  308. package/src/cli/commands/build.test.ts +330 -9
  309. package/src/cli/commands/build.ts +170 -24
  310. package/src/cli/commands/carve-bridge.test.ts +237 -14
  311. package/src/cli/commands/carve-bridge.ts +21 -17
  312. package/src/cli/commands/carve-emit-k8s.test.ts +17 -10
  313. package/src/cli/commands/check-lexicon-docs.ts +1 -1
  314. package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
  315. package/src/cli/commands/check-lexicon-examples.ts +42 -10
  316. package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
  317. package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
  318. package/src/cli/commands/init-lexicon.test.ts +97 -2
  319. package/src/cli/commands/init-lexicon.ts +4 -2
  320. package/src/cli/commands/init.test.ts +35 -1
  321. package/src/cli/commands/init.ts +14 -3
  322. package/src/cli/commands/lint.test.ts +194 -1
  323. package/src/cli/commands/lint.ts +205 -7
  324. package/src/cli/commands/onboard.test.ts +75 -0
  325. package/src/cli/commands/onboard.ts +54 -23
  326. package/src/cli/handlers/build.test.ts +81 -1
  327. package/src/cli/handlers/build.ts +15 -1
  328. package/src/cli/handlers/graph.test.ts +3 -3
  329. package/src/cli/handlers/lifecycle.test.ts +195 -12
  330. package/src/cli/handlers/lifecycle.ts +123 -6
  331. package/src/cli/handlers/misc.ts +1 -1
  332. package/src/cli/handlers/operator.test.ts +183 -11
  333. package/src/cli/handlers/operator.ts +341 -55
  334. package/src/cli/handlers/run.test.ts +568 -1295
  335. package/src/cli/handlers/run.ts +446 -912
  336. package/src/cli/main.test.ts +22 -16
  337. package/src/cli/main.ts +66 -33
  338. package/src/cli/mcp/op-tools.ts +147 -88
  339. package/src/cli/mcp/resource-handlers.ts +10 -37
  340. package/src/cli/mcp/resources/context.ts +11 -12
  341. package/src/cli/mcp/server.test.ts +25 -27
  342. package/src/cli/mcp/server.ts +2 -2
  343. package/src/cli/plugins.test.ts +68 -2
  344. package/src/cli/plugins.ts +39 -0
  345. package/src/cli/registry.ts +40 -9
  346. package/src/codegen/docs.ts +1 -1
  347. package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
  348. package/src/codegen/generate-post-synth-barrel.ts +1 -1
  349. package/src/components/README.md +4 -3
  350. package/src/components/__fixtures__/neo4j-fanout.json +1 -1
  351. package/src/components/auto-release.test.ts +4 -20
  352. package/src/components/auto-release.ts +17 -42
  353. package/src/components/capability.ts +4 -4
  354. package/src/components/cli-support.test.ts +28 -12
  355. package/src/components/cli-support.ts +60 -47
  356. package/src/components/component-schema.test.ts +18 -2
  357. package/src/components/component.schema.json +18 -5
  358. package/src/components/component.test.ts +2 -2
  359. package/src/components/component.ts +27 -7
  360. package/src/components/config-defaults.test.ts +2 -2
  361. package/src/components/driver-output.ts +14 -2
  362. package/src/components/driver.test.ts +109 -20
  363. package/src/components/driver.ts +201 -84
  364. package/src/components/index.ts +1 -6
  365. package/src/components/manifest-persistence.test.ts +2 -20
  366. package/src/components/manifest-persistence.ts +4 -24
  367. package/src/components/pilots/neo4j-fanout.pilot.ts +3 -3
  368. package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
  369. package/src/components/run-progress.ts +6 -6
  370. package/src/components/verbs/run-agent.test.ts +19 -0
  371. package/src/components/verbs/run-agent.ts +12 -24
  372. package/src/components/verbs/verify.ts +2 -2
  373. package/src/deep-observation.test.ts +75 -0
  374. package/src/deep-observation.ts +48 -0
  375. package/src/detectLexicon.ts +18 -1
  376. package/src/discovery/collect.test.ts +3 -3
  377. package/src/discovery/files.ts +4 -4
  378. package/src/discovery/fold-import.test.ts +1 -1
  379. package/src/discovery/fold-import.ts +105 -2
  380. package/src/discovery/param-deps.test.ts +112 -1
  381. package/src/discovery/param-deps.ts +193 -0
  382. package/src/discovery/sandbox/bundle.ts +15 -1
  383. package/src/discovery/sandbox/config-wire.test.ts +2 -2
  384. package/src/discovery/sandbox/config-wire.ts +2 -2
  385. package/src/fold/fold.test.ts +56 -0
  386. package/src/fold/foldable-helpers.ts +82 -2
  387. package/src/fold-provenance-exclusion.test.ts +186 -0
  388. package/src/fold-provenance.test.ts +495 -0
  389. package/src/fold-provenance.ts +441 -0
  390. package/src/graph-ops.test.ts +3 -3
  391. package/src/graph-ops.ts +1 -1
  392. package/src/held-elsewhere.test.ts +102 -0
  393. package/src/held-elsewhere.ts +114 -0
  394. package/src/index.ts +3 -0
  395. package/src/kubectl-context.ts +3 -3
  396. package/src/lexicon-config.test.ts +5 -5
  397. package/src/lexicon-config.ts +4 -4
  398. package/src/lexicon-plugin-helpers.ts +1 -1
  399. package/src/lexicon.ts +296 -16
  400. package/src/lifecycle/change-set.test.ts +49 -0
  401. package/src/lifecycle/change-set.ts +67 -0
  402. package/src/lifecycle/converge-ledger.ts +1 -1
  403. package/src/lifecycle/deep-diff.test.ts +267 -14
  404. package/src/lifecycle/deep-diff.ts +217 -14
  405. package/src/lifecycle/deep-observe.test.ts +3 -1
  406. package/src/lifecycle/deep-observe.ts +16 -6
  407. package/src/lifecycle/gate-ledger.test.ts +74 -2
  408. package/src/lifecycle/gate-ledger.ts +154 -36
  409. package/src/lifecycle/index.ts +1 -0
  410. package/src/lifecycle/release-ledger.ts +2 -2
  411. package/src/lifecycle/run-ledger.test.ts +268 -0
  412. package/src/lifecycle/run-ledger.ts +201 -0
  413. package/src/lifecycle/symptoms.ts +3 -3
  414. package/src/lint/config.test.ts +82 -1
  415. package/src/lint/config.ts +112 -3
  416. package/src/lint/pipeline-change-gate.test.ts +2 -2
  417. package/src/lint/policy.test.ts +1 -1
  418. package/src/lint/post-synth.test.ts +31 -0
  419. package/src/lint/post-synth.ts +54 -1
  420. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
  421. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
  422. package/src/lint/rules/comp/comp.test.ts +27 -1
  423. package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +76 -0
  424. package/src/lint/rules/comp/index.ts +3 -3
  425. package/src/lint/rules/op/index.ts +23 -0
  426. package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
  427. package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
  428. package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
  429. package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
  430. package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
  431. package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
  432. package/src/lint/rules/op/support.ts +11 -0
  433. package/src/lint/suppressions.test.ts +163 -0
  434. package/src/lint/suppressions.ts +204 -0
  435. package/src/live-endpoint.ts +1 -1
  436. package/src/op/activities/activity-contracts.ts +66 -0
  437. package/src/op/activities/apply.test.ts +567 -0
  438. package/src/op/activities/apply.ts +662 -0
  439. package/src/op/activities/build.ts +26 -0
  440. package/src/op/activities/converge.test.ts +330 -0
  441. package/src/op/activities/converge.ts +449 -0
  442. package/src/op/activities/env-teardown.test.ts +187 -0
  443. package/src/op/activities/env-teardown.ts +171 -0
  444. package/src/op/activities/guard-validate.test.ts +139 -0
  445. package/src/op/activities/guard-validate.ts +223 -0
  446. package/src/op/activities/http-check.test.ts +48 -0
  447. package/src/op/activities/http-check.ts +55 -0
  448. package/src/op/activities/index.ts +119 -0
  449. package/src/op/activities/lexicon-upgrade.test.ts +492 -0
  450. package/src/op/activities/lexicon-upgrade.ts +673 -0
  451. package/src/op/activities/lifecycle.ts +85 -0
  452. package/src/op/activities/pipeline-audit.test.ts +67 -0
  453. package/src/op/activities/pipeline-audit.ts +201 -0
  454. package/src/op/activities/policy.test.ts +19 -0
  455. package/src/op/activities/policy.ts +37 -0
  456. package/src/op/activities/reconcile.test.ts +161 -0
  457. package/src/op/activities/reconcile.ts +354 -0
  458. package/src/op/activities/shell.ts +26 -0
  459. package/src/op/activities/teardown.ts +22 -0
  460. package/src/op/activities/util.ts +6 -0
  461. package/src/op/activities/wait.ts +69 -0
  462. package/src/op/activities/workflow-audit.test.ts +90 -0
  463. package/src/op/activities/workflow-audit.ts +203 -0
  464. package/src/op/activity-contract-registry.test.ts +98 -0
  465. package/src/op/activity-contract-registry.ts +114 -0
  466. package/src/op/activity-contract.test.ts +1 -1
  467. package/src/op/activity-contract.ts +37 -33
  468. package/src/op/activity-failure.ts +34 -0
  469. package/src/op/activity-profiles.test.ts +56 -0
  470. package/src/op/activity-profiles.ts +116 -0
  471. package/src/op/activity-registry.test.ts +37 -28
  472. package/src/op/activity-registry.ts +27 -56
  473. package/src/op/activity-runtime.ts +3 -47
  474. package/src/op/builders-exports.test.ts +0 -49
  475. package/src/op/builders-typed.test.ts +164 -0
  476. package/src/op/builders.ts +125 -41
  477. package/src/op/change-signal.test.ts +117 -0
  478. package/src/op/change-signal.ts +169 -0
  479. package/src/op/composites/apply-op.ts +218 -0
  480. package/src/op/composites/composites.test.ts +379 -0
  481. package/src/op/composites/converge-op.test.ts +168 -0
  482. package/src/op/composites/converge-op.ts +214 -0
  483. package/src/op/composites/index.ts +26 -0
  484. package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
  485. package/src/op/composites/lexicon-upgrade-op.ts +134 -0
  486. package/src/op/composites/pipeline-audit-op.test.ts +25 -0
  487. package/src/op/composites/pipeline-audit-op.ts +78 -0
  488. package/src/op/composites/reconcile-op.test.ts +51 -0
  489. package/src/op/composites/reconcile-op.ts +110 -0
  490. package/src/op/composites/watch-op.ts +108 -0
  491. package/src/op/composites/workflow-audit-op.test.ts +25 -0
  492. package/src/op/composites/workflow-audit-op.ts +88 -0
  493. package/src/op/converge-rule.ts +12 -10
  494. package/src/op/cron.test.ts +128 -0
  495. package/src/op/cron.ts +149 -0
  496. package/src/op/discover-root.test.ts +105 -1
  497. package/src/op/discover.test.ts +6 -2
  498. package/src/op/discover.ts +84 -16
  499. package/src/op/duration.ts +21 -0
  500. package/src/op/effect-step.test.ts +29 -14
  501. package/src/op/emulator-lifecycle.ts +1 -2
  502. package/src/op/gate-name.test.ts +65 -0
  503. package/src/op/gate-name.ts +60 -0
  504. package/src/op/gate-summary.ts +84 -0
  505. package/src/op/gate.ts +155 -0
  506. package/src/op/generate-pipeline.test.ts +65 -3
  507. package/src/op/generate-pipeline.ts +19 -2
  508. package/src/op/index.ts +48 -8
  509. package/src/op/local-executor.test.ts +178 -34
  510. package/src/op/local-executor.ts +371 -102
  511. package/src/op/local-output.test.ts +95 -11
  512. package/src/op/local-output.ts +33 -4
  513. package/src/op/op-ir.test.ts +292 -0
  514. package/src/op/op-ir.ts +419 -0
  515. package/src/op/op-verb-class.test.ts +2 -2
  516. package/src/op/op-verb-class.ts +19 -5
  517. package/src/op/op.test.ts +28 -7
  518. package/src/op/operator.test.ts +543 -6
  519. package/src/op/operator.ts +203 -20
  520. package/src/op/receipt-store.ts +1 -1
  521. package/src/op/resource.ts +20 -2
  522. package/src/op/runtime.ts +203 -0
  523. package/src/op/runtimes/local.test.ts +181 -0
  524. package/src/op/runtimes/local.ts +212 -0
  525. package/src/op/step-output-ref.ts +15 -13
  526. package/src/op/types.ts +106 -26
  527. package/src/ownership.ts +1 -1
  528. package/src/provenance.test.ts +6 -0
  529. package/src/provenance.ts +21 -1
  530. package/src/serializer-walker.test.ts +42 -0
  531. package/src/serializer-walker.ts +21 -2
  532. package/src/terraform/aws-resources.test.ts +13 -4
  533. package/src/terraform/bridge.test.ts +22 -9
  534. package/src/terraform/bridge.ts +89 -28
  535. package/src/terraform/carve-provider.ts +38 -2
  536. package/src/terraform/data-source-shape.ts +95 -0
  537. package/src/terraform/graph.ts +35 -7
  538. package/src/terraform/providers/kubernetes.ts +48 -2
  539. package/src/terraform/tier-map.ts +21 -6
  540. package/src/terraform/types.ts +8 -0
  541. package/dist/cli/handlers/op-progress.d.ts +0 -90
  542. package/dist/cli/handlers/op-progress.d.ts.map +0 -1
  543. package/dist/cli/handlers/run-client.d.ts +0 -127
  544. package/dist/cli/handlers/run-client.d.ts.map +0 -1
  545. package/dist/cli/handlers/run-report.d.ts +0 -5
  546. package/dist/cli/handlers/run-report.d.ts.map +0 -1
  547. package/dist/components/temporal-codegen-loader.d.ts +0 -27
  548. package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
  549. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
  550. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
  551. package/src/cli/handlers/op-progress.test.ts +0 -268
  552. package/src/cli/handlers/op-progress.ts +0 -248
  553. package/src/cli/handlers/run-client.test.ts +0 -82
  554. package/src/cli/handlers/run-client.ts +0 -219
  555. package/src/cli/handlers/run-report.test.ts +0 -62
  556. package/src/cli/handlers/run-report.ts +0 -122
  557. package/src/components/temporal-codegen-loader.ts +0 -41
  558. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
@@ -10,6 +10,17 @@ describe("parseArgs", () => {
10
10
  expect(parseArgs(["build", "src", "--no-fold"]).fold).toBe(false);
11
11
  });
12
12
 
13
+ // #2192 — #2130 deleted `-p/--profile` with the Temporal runtime, on the
14
+ // belief nothing outside it read the flag. #2124 had already documented it
15
+ // for fountain, so the flag is back and reaches the runtime seam.
16
+ test("-p/--profile carries the runtime's connection profile (#2124)", () => {
17
+ expect(parseArgs(["run", "prod-apply", "--on", "fountain"]).profile).toBeUndefined();
18
+ expect(parseArgs(["run", "prod-apply", "--on", "fountain", "--profile", "staging"]).profile).toBe("staging");
19
+ expect(parseArgs(["run", "prod-apply", "--on", "fountain", "-p", "staging"]).profile).toBe("staging");
20
+ // The joined form `splitJoinedFlags` rewrites into two tokens.
21
+ expect(parseArgs(["run", "prod-apply", "--profile=staging"]).profile).toBe("staging");
22
+ });
23
+
13
24
  test("--namespace carries the live read's namespace default (#1629)", () => {
14
25
  expect(parseArgs(["graph", "--live", "--env", "prod"]).namespace).toBeUndefined();
15
26
  expect(parseArgs(["graph", "--live", "--env", "prod", "--namespace", "app-b"]).namespace).toBe("app-b");
@@ -578,19 +589,19 @@ describe("resolveCommand", () => {
578
589
  });
579
590
  });
580
591
 
581
- describe("parseArgs — run flags", () => {
582
- test("parses --profile flag", () => {
583
- const result = parseArgs(["run", "alb-deploy", "--profile", "local"]);
584
- expect(result.command).toBe("run");
585
- expect(result.path).toBe("alb-deploy");
586
- expect(result.profile).toBe("local");
587
- });
588
-
589
- test("parses -p shorthand for --profile", () => {
590
- const result = parseArgs(["run", "alb-deploy", "-p", "cloud"]);
591
- expect(result.profile).toBe("cloud");
592
+ describe("--temporal, removed in #2116", () => {
593
+ // #2204 removed the bridge that caught the flag ahead of the parser and
594
+ // exited 2. Both spellings now take the same route any other unrecognised
595
+ // flag takes, and nothing in the CLI knows the word.
596
+ test("both spellings fail as an unknown flag, like any other unrecognised flag", () => {
597
+ expect(() => parseArgs(["run", "alb-deploy", "--temporal"])).toThrow(/Unknown flag: --temporal/);
598
+ expect(() => parseArgs(["run", "alb-deploy", "--temporal=true"])).toThrow(/Unknown flag: --temporal/);
599
+ // The message and the throw match what an invented flag gets.
600
+ expect(() => parseArgs(["run", "alb-deploy", "--nonesuch"])).toThrow(/Unknown flag: --nonesuch/);
592
601
  });
602
+ });
593
603
 
604
+ describe("parseArgs — run flags", () => {
594
605
  test("parses --report flag", () => {
595
606
  const result = parseArgs(["run", "alb-deploy", "--report"]);
596
607
  expect(result.command).toBe("run");
@@ -603,11 +614,6 @@ describe("parseArgs — run flags", () => {
603
614
  expect(result.report).toBe(undefined);
604
615
  });
605
616
 
606
- test("profile is undefined when not provided", () => {
607
- const result = parseArgs(["run", "alb-deploy"]);
608
- expect(result.profile).toBe(undefined);
609
- });
610
-
611
617
  test("run signal parses op name and signal into positionals", () => {
612
618
  const result = parseArgs(["run", "signal", "alb-deploy", "gate-dns"]);
613
619
  expect(result.command).toBe("run");
package/src/cli/main.ts CHANGED
@@ -30,7 +30,7 @@ import { runScenarioCheck, runScenarioUnknown } from "./handlers/scenario";
30
30
  import { runGraph } from "./handlers/graph";
31
31
  import { runExplain } from "./handlers/explain";
32
32
  import { runSearch } from "./handlers/search";
33
- import { runOp, runOpList, runOpStatus, runOpSignal, runOpCancel, runOpLog } from "./handlers/run";
33
+ import { runOp, runOpList, runOpStatus, runOpApprove, runOpSignalRenamed, runOpCancel, runOpLog } from "./handlers/run";
34
34
  import { runOperator, runOperatorStatus, runOperatorLog, runApprove } from "./handlers/operator";
35
35
  import { runEmulator } from "./handlers/emulator";
36
36
  import { splitJoinedFlags, dispatchCommandGroup, collectCommandGroups, formatCommandGroupsHelp, type CommandGroup } from "./command-group";
@@ -71,7 +71,6 @@ const BOOLEAN_FLAGS = new Set([
71
71
  "--down",
72
72
  "--include-dependents",
73
73
  "--local",
74
- "--temporal",
75
74
  "--json",
76
75
  "--progress-json",
77
76
  "--update-snapshot",
@@ -86,9 +85,11 @@ const BOOLEAN_FLAGS = new Set([
86
85
  "--yes",
87
86
  "--confirm-prod",
88
87
  "--once",
88
+ "--expire",
89
89
  "--check-live",
90
90
  "--check-snapshot",
91
91
  "--fail-on-drift",
92
+ "--durable-requests",
92
93
  ]);
93
94
 
94
95
  /**
@@ -115,12 +116,11 @@ export function parseArgs(args: string[]): ParsedArgs {
115
116
  watch: false,
116
117
  verbose: false,
117
118
  help: false,
118
- profile: undefined,
119
119
  param: undefined,
120
120
  paramsFile: undefined,
121
121
  report: undefined,
122
122
  local: undefined,
123
- temporal: undefined,
123
+ profile: undefined,
124
124
  json: undefined,
125
125
  live: false,
126
126
  migrateFrom: undefined,
@@ -303,12 +303,21 @@ export function parseArgs(args: string[]): ParsedArgs {
303
303
  result.includeDependents = true;
304
304
  } else if (arg === "--local") {
305
305
  result.local = true;
306
- } else if (arg === "--temporal") {
307
- result.temporal = true;
308
306
  } else if (arg === "--json") {
309
307
  result.json = true;
310
308
  } else if (arg === "--progress-json") {
311
309
  result.progressJson = true;
310
+ } else if (arg === "--gated-exit") {
311
+ // `chant run <op> --gated-exit <code>` (#2243) — remap only the gated
312
+ // outcome's exit code. Parsed as a number here and range-checked in the
313
+ // handler, where the refusal can name the flag alongside the run.
314
+ result.gatedExit = Number(args[++i]);
315
+ } else if (arg === "--durable-requests") {
316
+ // `chant run approve ... --on <lexicon> --durable-requests` (#2126) —
317
+ // resolve the gate on the hosting runtime's own request path rather
318
+ // than by posting a follow-up prompt. Core only carries the flag; the
319
+ // runtime decides whether it has such a path.
320
+ result.durableRequests = true;
312
321
  } else if (arg === "--update-snapshot") {
313
322
  result.updateSnapshot = true;
314
323
  } else if (arg === "--update-baseline") {
@@ -345,6 +354,10 @@ export function parseArgs(args: string[]): ParsedArgs {
345
354
  result.actor = args[++i];
346
355
  } else if (arg === "--approver") {
347
356
  result.approver = args[++i];
357
+ } else if (arg === "--on") {
358
+ // `chant run ... --on <lexicon>` (#2121) — which runtime hosts the run.
359
+ result.on = args[++i];
360
+ if (!result.on || result.on.startsWith("-")) throw new Error("--on needs a runtime name: --on <lexicon>");
348
361
  } else if (arg === "--compare-to") {
349
362
  result.compareTo = args[++i];
350
363
  } else if (arg === "--no-release-record") {
@@ -389,6 +402,8 @@ export function parseArgs(args: string[]): ParsedArgs {
389
402
  result.once = true;
390
403
  } else if (arg === "--note") {
391
404
  result.note = args[++i];
405
+ } else if (arg === "--expire") {
406
+ result.expire = true;
392
407
  } else if (arg === "--url") {
393
408
  result.url = args[++i];
394
409
  } else if (arg === "--op") {
@@ -463,7 +478,7 @@ Commands:
463
478
  chant code instead of reading a template file)
464
479
  audit [path|url] Audit a repo's CI YAML for security issues
465
480
  (--format stylish|json|sarif|markdown|html, -o <file>,
466
- --tier merge-worthy|all, --fail-on merge-worthy|warning|none,
481
+ --tier merge-worthy|all, --fail-on merge-worthy|warning|error|none,
467
482
  --template <file> / --theme <file> for the html report)
468
483
  --agents audits this machine's agent configuration —
469
484
  instruction files, MCP servers, skills, plugins,
@@ -505,18 +520,12 @@ Commands:
505
520
  applied) and path. Read-only.
506
521
 
507
522
  Ops:
508
- run <name> Start an Op workflow (spawns worker + submits to Temporal)
509
- run list List all Ops with current run status
510
- --components: list discovered Components instead (--temporal
511
- also annotates each with its latest run status; #599)
512
- run status <name> Show current workflow run state
513
- --components: show a Component's durable run state instead (#599)
514
- run signal <name> <signal> Send a named signal to unblock a gate
515
- --components: signal a Component's workflow instead (#589)
516
- run cancel <name> Cancel the active workflow run (requires --force)
517
- --components: cancel a Component's workflow instead (#589)
523
+ run <name> Run an Op on the resolved runtime (--on; local by default)
524
+ run list List all Ops with the runtime's state for each
525
+ run status <name> Show the runtime's state for one Op's latest run
526
+ run approve <op> <gate> Record a gate's resolution and wake the runtime
527
+ run cancel <name> Cancel the active run (requires --force)
518
528
  run log <name> Show run history for an Op
519
- --components: show a Component's run history instead (#599)
520
529
  run --components <name|all> Run discovered Component(s) through the interpret
521
530
  driver on the local executor (--env <env>; #585).
522
531
  On success, auto-emits a release-ledger record per
@@ -528,7 +537,7 @@ Ops:
528
537
  progress instead of tailing raw logs (additive; run
529
538
  semantics/exit code unchanged)
530
539
  operator Run scheduled ticks for discovered ConvergeOps
531
- locally, no Temporal (#1485): acquire/renew a per-op
540
+ locally (#1485): acquire/renew a per-op
532
541
  lease (git ref CAS), tick on --interval, record every
533
542
  result as a ledger fact. --env <env> scopes to one
534
543
  environment; --interval <dur> (default 60s) and
@@ -548,13 +557,14 @@ Ops:
548
557
  silently short
549
558
  approve <op> <gate> Record a gate's out-of-band resolution fact
550
559
  (--actor <name>, --note <text>, --url <url>) — the
551
- durable counterpart to a converge tick's
552
- gate-as-fact outcome; see the pending-gates list in
553
- operator status. --url is the PR/MR the resolution
560
+ durable counterpart to the pending fact a run records
561
+ when it reaches the gate; see the pending-gates list
562
+ in operator status. --url is the PR/MR the resolution
554
563
  happened at, recorded typed rather than as free text,
555
564
  and defaults to the PR/MR of the surrounding CI job.
556
- Does not itself unblock the gated op's local
557
- dispatch (re-run --temporal, or merge its PR)
565
+ The next "chant run <op>" walks through the gate.
566
+ --expire clears a pending fact without approving it,
567
+ so the gate is re-decided from scratch next run
558
568
 
559
569
  graph Show Op dependency graph (--stacks for cross-stack order,
560
570
  --format ir|mermaid|dot|layout for the lint-gated graph IR,
@@ -663,12 +673,15 @@ Options:
663
673
  resolved build parameter and per-file fold decision
664
674
  instead of the one-line summaries
665
675
  -h, --help Show this help message
666
- -p, --profile <name> Temporal worker profile to use (run command)
676
+ --on <lexicon> Which runtime hosts the run: a configured lexicon with
677
+ an opRuntime, or the built-in local runtime when
678
+ omitted (every run subcommand; #2121)
667
679
  --local Run an Op with the local in-process executor (default)
668
- --temporal Run an Op via a Temporal cluster (gates, schedules, durable resume)
680
+ -p, --profile <name> Named connection profile the hosting runtime targets
681
+ (fountain.profiles in chant.config.ts); each runtime's
682
+ own default when omitted (#2124)
669
683
  --json Emit the structured run result as JSON (run command)
670
- --report Print deployment report instead of running (run command)
671
- OR with a path arg: SARIF report destination (migrate)
684
+ --report With a path arg: SARIF report destination (migrate)
672
685
  OR '--report gitlab-mr': emit the GitLab MR plan-widget
673
686
  JSON (lifecycle plan)
674
687
  OR '--report markdown': emit a reviewer-facing markdown
@@ -794,8 +807,17 @@ async function tryPluginCommand(rawArgv: string[]): Promise<number | undefined>
794
807
  if (!groupName || groupName.startsWith("-")) return undefined;
795
808
 
796
809
  const plugins = await loadPluginsBestEffort();
797
- const rawArgs = rawArgv.slice(2);
798
- const result = await dispatchCommandGroup(plugins, groupName, verbName, rawArgs);
810
+
811
+ // A group declaring a `defaultVerb` (#2125) answers its bare name, so
812
+ // `chant acp` and `chant acp --durable-requests` both reach that verb. The
813
+ // slicing follows: with no verb token consumed, everything after the group
814
+ // name is the default verb's own argument list.
815
+ const group = collectCommandGroups(plugins).find((g) => g.name === groupName);
816
+ const useDefault =
817
+ group?.defaultVerb !== undefined && (verbName === undefined || verbName.startsWith("-"));
818
+ const verb = useDefault ? group?.defaultVerb : verbName;
819
+ const rawArgs = rawArgv.slice(useDefault ? 1 : 2);
820
+ const result = await dispatchCommandGroup(plugins, groupName, verb, rawArgs);
799
821
 
800
822
  if (result.kind === "no-group") return undefined;
801
823
  if (result.kind === "usage-error") {
@@ -852,7 +874,17 @@ async function loadPluginsOrExit(path: string): Promise<import("../lexicon").Lex
852
874
 
853
875
  // ── Command registry ──────────────────────────────────────────────
854
876
 
855
- const registry: CommandDef[] = [
877
+ /**
878
+ * Every command word `chant` answers to, and the handler behind it.
879
+ *
880
+ * Exported because a caller other than `main()` now needs to ask "is this a
881
+ * chant verb, and what runs it?" — the fountain lexicon's ACP server (#2125)
882
+ * treats a prompt as a chant command line, and the only honest answer to
883
+ * whether `chant lifecycle diff` is a verb is this list. A hand-kept copy
884
+ * would be wrong the first time a command is added, and the ACP server would
885
+ * refuse a verb that works at the terminal.
886
+ */
887
+ export const commandRegistry: CommandDef[] = [
856
888
  // Primary commands
857
889
  { name: "build", requiresPlugins: true, handler: runBuild },
858
890
  { name: "lint", handler: runLint },
@@ -897,7 +929,8 @@ const registry: CommandDef[] = [
897
929
  // Op / run subcommands
898
930
  { name: "run list", handler: runOpList },
899
931
  { name: "run status", handler: runOpStatus },
900
- { name: "run signal", handler: runOpSignal },
932
+ { name: "run approve", handler: runOpApprove },
933
+ { name: "run signal", handler: runOpSignalRenamed },
901
934
  { name: "run cancel", handler: runOpCancel },
902
935
  { name: "run log", handler: runOpLog },
903
936
  { name: "run", handler: runOp },
@@ -1026,7 +1059,7 @@ async function main(): Promise<void> {
1026
1059
  process.exit(1);
1027
1060
  }
1028
1061
 
1029
- const match = resolveCommand(args, registry);
1062
+ const match = resolveCommand(args, commandRegistry);
1030
1063
  if (!match) {
1031
1064
  // chant #1078 — not one of core's own commands; check whether a lexicon
1032
1065
  // mounted a command group under this name before giving up. This is the
@@ -1,56 +1,94 @@
1
+ /**
2
+ * MCP tools over Ops — on the runtime seam (#2121), not on any one runtime's
3
+ * own client.
4
+ *
5
+ * Every tool here goes through an {@link OpRuntimeProvider} — the built-in
6
+ * `local` one by default, or the `runtime` argument's lexicon `opRuntime` when
7
+ * an agent names one. One provider is built per call, so a long-lived server
8
+ * picks up a project's config as it is now rather than as it was at boot; the
9
+ * local provider's in-process run history is the exception and is held for the
10
+ * life of the module, so `op-status` can answer for a run `op-run` started.
11
+ *
12
+ * #2118 owns the ledger-backed record shape; when it lands, `status`/`log`
13
+ * read the ledger and this file stops depending on the process outliving the
14
+ * run.
15
+ */
16
+
1
17
  import { resolve } from "node:path";
2
18
  import { discoverOps } from "../../op/discover";
3
- import { makeTemporalClient } from "../handlers/run";
4
- import { resolveWorkflowId, fetchNormalizedHistory } from "../handlers/run-client";
5
- import { generateReport } from "../handlers/run-report";
6
- import { extractStepRecords, countActivities, queryGateState } from "../handlers/op-progress";
19
+ import { createLocalOpRuntime } from "../../op/runtimes/local";
20
+ import type { OpRuntimeProvider } from "../../op/runtime";
21
+ import { loadChantConfig } from "../../config";
22
+ import { loadPlugins } from "../plugins";
23
+ import { recordGateApproval } from "../handlers/operator";
7
24
  import type { ToolRegistration } from "./lifecycle-tools";
8
25
 
9
- function workflowFnName(opName: string): string {
10
- return opName.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase()) + "Workflow";
26
+ /** The `local` provider, shared so an `op-run` is visible to a later `op-status`. */
27
+ let localRuntime: OpRuntimeProvider | undefined;
28
+
29
+ /**
30
+ * Resolve the runtime a tool call addresses. `runtime` names a configured
31
+ * lexicon's `opRuntime`; omitted (or `local`) it is core's built-in provider.
32
+ * Throws with an actionable message — the MCP layer turns that into `isError`.
33
+ */
34
+ async function runtimeFor(name: unknown): Promise<OpRuntimeProvider> {
35
+ const wanted = typeof name === "string" && name.length > 0 ? name : "local";
36
+ if (wanted === "local") {
37
+ localRuntime ??= createLocalOpRuntime({ projectPath: resolve(".") });
38
+ return localRuntime;
39
+ }
40
+
41
+ const configured = await loadChantConfig(resolve("."))
42
+ .then(({ config }) => config.lexicons ?? [])
43
+ .catch(() => [] as string[]);
44
+ if (!configured.includes(wanted)) {
45
+ throw new Error(
46
+ `runtime "${wanted}" is not a configured lexicon` +
47
+ (configured.length > 0 ? ` (configured: ${configured.join(", ")})` : ""),
48
+ );
49
+ }
50
+ const plugin = (await loadPlugins([wanted]))[0];
51
+ if (!plugin?.opRuntime) throw new Error(`lexicon "${wanted}" does not host Op runs`);
52
+ return plugin.opRuntime;
11
53
  }
12
54
 
55
+ const RUNTIME_PARAM = {
56
+ type: "string",
57
+ description: 'Runtime to address: a lexicon name with an opRuntime, or "local" (the default)',
58
+ } as const;
59
+
13
60
  export function createOpListTool(): ToolRegistration {
14
61
  return {
15
62
  definition: {
16
63
  name: "op-list",
17
- description: "List all Op definitions discovered from *.op.ts files with their current run status",
64
+ description: "List all Op definitions discovered from *.op.ts files with their current run state",
18
65
  inputSchema: {
19
66
  type: "object",
20
67
  properties: {
21
- profile: { type: "string", description: "Temporal profile name from chant.config.ts (optional)" },
68
+ runtime: RUNTIME_PARAM,
22
69
  },
23
70
  },
24
71
  },
25
72
  handler: async (params) => {
26
73
  const { ops, errors } = await discoverOps();
27
- const profile = params.profile as string | undefined;
28
74
 
29
- let client: Awaited<ReturnType<typeof makeTemporalClient>>["client"] | undefined;
75
+ let states: Map<string, { state: string } | undefined> = new Map();
30
76
  try {
31
- ({ client } = await makeTemporalClient(profile, resolve(".")));
77
+ const runtime = await runtimeFor(params.runtime);
78
+ states = await runtime.list([...ops.values()].map((d) => d.config));
32
79
  } catch {
33
- // Temporal not available — degrade gracefully
80
+ // Runtime unavailable — the definitions are still worth listing.
34
81
  }
35
82
 
36
83
  const result = [];
37
84
  for (const [name, { config }] of ops) {
38
- let runStatus = "—";
39
- if (client) {
40
- try {
41
- const desc = await client.workflow.getHandle(resolveWorkflowId(name)).describe();
42
- runStatus = desc.status.name;
43
- } catch {
44
- // workflow not found or Temporal error
45
- }
46
- }
47
85
  result.push({
48
86
  name,
49
87
  overview: config.overview,
50
88
  phases: config.phases.length,
51
- taskQueue: config.taskQueue ?? config.name,
89
+ labels: config.labels ?? {},
52
90
  depends: config.depends ?? [],
53
- runStatus,
91
+ runState: states.get(name)?.state ?? "—",
54
92
  });
55
93
  }
56
94
 
@@ -64,19 +102,18 @@ export function createOpRunTool(): ToolRegistration {
64
102
  definition: {
65
103
  name: "op-run",
66
104
  description:
67
- "Submit an Op workflow to Temporal (Temporal mode). A Temporal worker must already be running — start it with `chant run <name> --temporal`.",
105
+ "Run an Op on a runtime and return its result. Defaults to the built-in local runtime, which executes the Op in this process.",
68
106
  inputSchema: {
69
107
  type: "object",
70
108
  properties: {
71
109
  name: { type: "string", description: "Op name (e.g. alb-deploy)" },
72
- profile: { type: "string", description: "Temporal profile name from chant.config.ts (optional)" },
110
+ runtime: RUNTIME_PARAM,
73
111
  },
74
112
  required: ["name"],
75
113
  },
76
114
  },
77
115
  handler: async (params) => {
78
116
  const name = params.name as string;
79
- const profile = params.profile as string | undefined;
80
117
 
81
118
  const { ops } = await discoverOps();
82
119
  if (!ops.has(name)) {
@@ -84,18 +121,19 @@ export function createOpRunTool(): ToolRegistration {
84
121
  return `Op "${name}" not found. Available: ${available.join(", ") || "none"}`;
85
122
  }
86
123
 
87
- const { config } = ops.get(name)!;
88
- const { client, profile: resolvedProfile } = await makeTemporalClient(profile, resolve("."));
89
- const workflowId = resolveWorkflowId(name);
90
- const taskQueue = resolvedProfile.taskQueue ?? config.taskQueue ?? name;
91
-
92
- await client.workflow.start(workflowFnName(name), {
93
- taskQueue,
94
- workflowId,
95
- workflowIdConflictPolicy: "FAIL",
96
- });
124
+ const runtime = await runtimeFor(params.runtime);
125
+ const handle = await runtime.start(ops.get(name)!.config, {});
126
+ const status = await handle.result();
97
127
 
98
- return { workflowId, message: `Workflow "${workflowId}" submitted to task queue "${taskQueue}"` };
128
+ return {
129
+ op: status.op,
130
+ runId: status.runId,
131
+ state: status.state,
132
+ startedAt: status.startedAt,
133
+ endedAt: status.endedAt ?? null,
134
+ ...(status.records ? { records: status.records } : {}),
135
+ ...(status.gate ? { gate: status.gate } : {}),
136
+ };
99
137
  },
100
138
  };
101
139
  }
@@ -104,78 +142,81 @@ export function createOpStatusTool(): ToolRegistration {
104
142
  return {
105
143
  definition: {
106
144
  name: "op-status",
107
- description: "Return the current run state of an Op workflow",
145
+ description: "Return the current run state of an Op on a runtime",
108
146
  inputSchema: {
109
147
  type: "object",
110
148
  properties: {
111
149
  name: { type: "string", description: "Op name (e.g. alb-deploy)" },
112
- profile: { type: "string", description: "Temporal profile name from chant.config.ts (optional)" },
150
+ runtime: RUNTIME_PARAM,
113
151
  },
114
152
  required: ["name"],
115
153
  },
116
154
  },
117
155
  handler: async (params) => {
118
156
  const name = params.name as string;
119
- const profile = params.profile as string | undefined;
120
157
 
121
158
  const { ops } = await discoverOps();
122
- const config = ops.get(name)?.config;
123
-
124
- const { client } = await makeTemporalClient(profile, resolve("."));
125
- const handle = client.workflow.getHandle(resolveWorkflowId(name));
126
- const desc = await handle.describe();
127
- const history = await fetchNormalizedHistory(handle);
128
-
129
- const { completed: activitiesCompleted, scheduled: activitiesScheduled } = countActivities(history);
130
- // Per-phase progress (#1676) — the same StepRecord shape `chant run
131
- // <name> --json` uses locally, so a consumer renders one way
132
- // regardless of executor. Only buildable when the Op's config was
133
- // discoverable (a *.op.ts file on disk); absent otherwise rather than
134
- // guessed at.
135
- const progress = config ? extractStepRecords(config, history, { final: Boolean(desc.closeTime) }) : undefined;
136
- const gate = await queryGateState(handle);
159
+ if (!ops.has(name)) throw new Error(`Op "${name}" not found`);
160
+
161
+ const runtime = await runtimeFor(params.runtime);
162
+ const status = await runtime.status(name);
163
+ if (!status) return { op: name, runtime: runtime.name, state: null, message: "no run recorded" };
137
164
 
138
165
  return {
139
- workflowId: desc.workflowId,
140
- runId: desc.runId,
141
- status: desc.status.name,
142
- startTime: desc.startTime,
143
- closeTime: desc.closeTime ?? null,
144
- taskQueue: desc.taskQueue,
145
- activitiesCompleted,
146
- activitiesScheduled,
147
- ...(progress ? { progress } : {}),
148
- gate: gate ?? null,
166
+ op: status.op,
167
+ runtime: runtime.name,
168
+ runId: status.runId,
169
+ state: status.state,
170
+ startedAt: status.startedAt,
171
+ endedAt: status.endedAt ?? null,
172
+ ...(status.records ? { records: status.records } : {}),
173
+ gate: status.gate ?? null,
149
174
  };
150
175
  },
151
176
  };
152
177
  }
153
178
 
154
- export function createOpSignalTool(): ToolRegistration {
179
+ export function createOpApproveTool(): ToolRegistration {
155
180
  return {
156
181
  definition: {
157
- name: "op-signal",
158
- description: "Send a named signal to an Op workflow (e.g. to unblock a gate step)",
182
+ name: "op-approve",
183
+ description:
184
+ "Record a gate's resolution on the gate ledger and wake the runtime hosting the gated run. The rename of op-signal: a gate is resolved by recording the fact, not by sending a message.",
159
185
  inputSchema: {
160
186
  type: "object",
161
187
  properties: {
162
188
  name: { type: "string", description: "Op name (e.g. alb-deploy)" },
163
- signal: { type: "string", description: "Signal name (e.g. gate-dns-delegation)" },
164
- profile: { type: "string", description: "Temporal profile name from chant.config.ts (optional)" },
189
+ gate: { type: "string", description: "Gate name (e.g. gate-dns-delegation)" },
190
+ approver: { type: "string", description: "Who approved; defaults to the CI or shell identity" },
191
+ note: { type: "string", description: "Free-text context recorded on the resolution" },
192
+ url: { type: "string", description: "Absolute http/https URL this resolution happened at" },
193
+ runtime: RUNTIME_PARAM,
165
194
  },
166
- required: ["name", "signal"],
195
+ required: ["name", "gate"],
167
196
  },
168
197
  },
169
198
  handler: async (params) => {
170
199
  const name = params.name as string;
171
- const signal = params.signal as string;
172
- const profile = params.profile as string | undefined;
200
+ const gate = params.gate as string;
201
+ if (!name || !gate) throw new Error("op-approve needs both an Op name and a gate name");
173
202
 
174
- const { client } = await makeTemporalClient(profile, resolve("."));
175
- const handle = client.workflow.getHandle(resolveWorkflowId(name));
176
- await handle.signal(signal);
203
+ const runtime = await runtimeFor(params.runtime);
204
+ const outcome = await recordGateApproval(name, gate, {
205
+ actor: params.approver as string | undefined,
206
+ note: params.note as string | undefined,
207
+ url: params.url as string | undefined,
208
+ });
209
+ if (!outcome.ok) throw new Error(`Gate "${gate}" on "${name}" was not recorded`);
210
+
211
+ if (runtime.resolveGate) await runtime.resolveGate(name, gate, outcome.record);
177
212
 
178
- return `Signal "${signal}" sent to Op "${name}"`;
213
+ return {
214
+ op: name,
215
+ gate,
216
+ resolvedBy: outcome.record.resolvedBy,
217
+ timestamp: outcome.record.timestamp,
218
+ runtimeNotified: Boolean(runtime.resolveGate),
219
+ };
179
220
  },
180
221
  };
181
222
  }
@@ -184,32 +225,50 @@ export function createOpReportTool(): ToolRegistration {
184
225
  return {
185
226
  definition: {
186
227
  name: "op-report",
187
- description: "Return a markdown deployment report for the latest run of an Op",
228
+ description: "Return a markdown report for the latest run of an Op on a runtime",
188
229
  inputSchema: {
189
230
  type: "object",
190
231
  properties: {
191
232
  name: { type: "string", description: "Op name (e.g. alb-deploy)" },
192
- profile: { type: "string", description: "Temporal profile name from chant.config.ts (optional)" },
233
+ runtime: RUNTIME_PARAM,
193
234
  },
194
235
  required: ["name"],
195
236
  },
196
237
  },
197
238
  handler: async (params) => {
198
239
  const name = params.name as string;
199
- const profile = params.profile as string | undefined;
200
240
 
201
241
  const { ops } = await discoverOps();
202
- if (!ops.has(name)) {
203
- return `Op "${name}" not found`;
204
- }
242
+ if (!ops.has(name)) return `Op "${name}" not found`;
205
243
  const { config } = ops.get(name)!;
206
244
 
207
- const { client } = await makeTemporalClient(profile, resolve("."));
208
- const handle = client.workflow.getHandle(resolveWorkflowId(name));
209
- const desc = await handle.describe();
210
- const history = await fetchNormalizedHistory(handle);
245
+ const runtime = await runtimeFor(params.runtime);
246
+ const status = await runtime.status(name);
247
+ if (!status) return `# ${name}\n\n${config.overview}\n\nNo run is recorded on the "${runtime.name}" runtime.\n`;
248
+
249
+ const lines = [
250
+ `# ${name}`,
251
+ "",
252
+ config.overview,
253
+ "",
254
+ `- Runtime: ${runtime.name}`,
255
+ `- Run: ${status.runId}`,
256
+ `- State: ${status.state}`,
257
+ `- Started: ${status.startedAt}`,
258
+ ...(status.endedAt ? [`- Ended: ${status.endedAt}`] : []),
259
+ ...(status.gate ? [`- Gate: ${status.gate.name} (pending since ${status.gate.since})`] : []),
260
+ "",
261
+ ];
262
+
263
+ if (status.records?.length) {
264
+ lines.push("| Phase | Step | Status | Duration |", "|---|---|---|---|");
265
+ for (const record of status.records) {
266
+ lines.push(`| ${record.phase} | ${record.fn} | ${record.status} | ${record.durationMs}ms |`);
267
+ }
268
+ lines.push("");
269
+ }
211
270
 
212
- return generateReport(name, config, desc, history);
271
+ return lines.join("\n");
213
272
  },
214
273
  };
215
274
  }