@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.
- package/dist/audit/catalog.d.ts +51 -1
- package/dist/audit/catalog.d.ts.map +1 -1
- package/dist/audit/core.d.ts +36 -1
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts +26 -9
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/lineage.d.ts +10 -0
- package/dist/audit/lineage.d.ts.map +1 -0
- package/dist/audit/prior-art.d.ts +385 -0
- package/dist/audit/prior-art.d.ts.map +1 -0
- package/dist/audit/proof.d.ts +16 -0
- package/dist/audit/proof.d.ts.map +1 -1
- package/dist/audit/report-html.d.ts.map +1 -1
- package/dist/audit/report-model.d.ts +8 -1
- package/dist/audit/report-model.d.ts.map +1 -1
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/rules-doc.d.ts +3 -0
- package/dist/audit/rules-doc.d.ts.map +1 -1
- package/dist/audit/secrets.d.ts +15 -0
- package/dist/audit/secrets.d.ts.map +1 -1
- package/dist/audit/terraform-state.d.ts +46 -0
- package/dist/audit/terraform-state.d.ts.map +1 -0
- package/dist/build.d.ts +17 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/claimed-fields.d.ts +161 -0
- package/dist/claimed-fields.d.ts.map +1 -0
- package/dist/cli/build-params-cli.d.ts +2 -2
- package/dist/cli/command-group.d.ts +14 -0
- package/dist/cli/command-group.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts +17 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/carve-bridge.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
- package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
- package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
- package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/lint.d.ts +13 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts +2 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +82 -16
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/run.d.ts +49 -42
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/main.d.ts +12 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts +16 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
- package/dist/cli/mcp/resources/context.d.ts.map +1 -1
- package/dist/cli/plugins.d.ts +22 -0
- package/dist/cli/plugins.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +40 -9
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
- package/dist/components/auto-release.d.ts +10 -20
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability.d.ts +4 -4
- package/dist/components/cli-support.d.ts +24 -22
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +21 -6
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/driver-output.d.ts.map +1 -1
- package/dist/components/driver.d.ts +73 -37
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/manifest-persistence.d.ts +1 -9
- package/dist/components/manifest-persistence.d.ts.map +1 -1
- package/dist/components/run-progress.d.ts +6 -6
- package/dist/components/run-progress.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts +10 -22
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/components/verbs/verify.d.ts +2 -2
- package/dist/deep-observation.d.ts +17 -0
- package/dist/deep-observation.d.ts.map +1 -1
- package/dist/detectLexicon.d.ts +13 -0
- package/dist/detectLexicon.d.ts.map +1 -1
- package/dist/discovery/files.d.ts +4 -4
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/param-deps.d.ts +33 -0
- package/dist/discovery/param-deps.d.ts.map +1 -1
- package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
- package/dist/discovery/sandbox/config-wire.d.ts +2 -2
- package/dist/fold/foldable-helpers.d.ts +5 -1
- package/dist/fold/foldable-helpers.d.ts.map +1 -1
- package/dist/fold-provenance.d.ts +236 -0
- package/dist/fold-provenance.d.ts.map +1 -0
- package/dist/graph-ops.d.ts +1 -1
- package/dist/held-elsewhere.d.ts +85 -0
- package/dist/held-elsewhere.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/kubectl-context.d.ts +3 -3
- package/dist/lexicon-config.d.ts +4 -4
- package/dist/lexicon-plugin-helpers.d.ts +1 -1
- package/dist/lexicon.d.ts +273 -16
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/change-set.d.ts +13 -0
- package/dist/lifecycle/change-set.d.ts.map +1 -1
- package/dist/lifecycle/deep-diff.d.ts +133 -6
- package/dist/lifecycle/deep-diff.d.ts.map +1 -1
- package/dist/lifecycle/deep-observe.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +79 -3
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/index.d.ts +1 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts +2 -2
- package/dist/lifecycle/run-ledger.d.ts +53 -0
- package/dist/lifecycle/run-ledger.d.ts.map +1 -0
- package/dist/lifecycle/symptoms.d.ts +3 -3
- package/dist/lifecycle/symptoms.d.ts.map +1 -1
- package/dist/lint/config.d.ts +81 -2
- package/dist/lint/config.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +55 -2
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
- package/dist/lint/rules/comp/index.d.ts +1 -1
- package/dist/lint/rules/comp/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.d.ts +16 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
- package/dist/lint/rules/op/support.d.ts +12 -0
- package/dist/lint/rules/op/support.d.ts.map +1 -0
- package/dist/lint/suppressions.d.ts +108 -0
- package/dist/lint/suppressions.d.ts.map +1 -0
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/op/activities/activity-contracts.d.ts +54 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -0
- package/dist/op/activities/apply.d.ts +262 -0
- package/dist/op/activities/apply.d.ts.map +1 -0
- package/dist/op/activities/build.d.ts +13 -0
- package/dist/op/activities/build.d.ts.map +1 -0
- package/dist/op/activities/converge.d.ts +110 -0
- package/dist/op/activities/converge.d.ts.map +1 -0
- package/dist/op/activities/env-teardown.d.ts +76 -0
- package/dist/op/activities/env-teardown.d.ts.map +1 -0
- package/dist/op/activities/guard-validate.d.ts +64 -0
- package/dist/op/activities/guard-validate.d.ts.map +1 -0
- package/dist/op/activities/http-check.d.ts +34 -0
- package/dist/op/activities/http-check.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +31 -0
- package/dist/op/activities/index.d.ts.map +1 -0
- package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
- package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
- package/dist/op/activities/lifecycle.d.ts +42 -0
- package/dist/op/activities/lifecycle.d.ts.map +1 -0
- package/dist/op/activities/pipeline-audit.d.ts +84 -0
- package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
- package/dist/op/activities/policy.d.ts +17 -0
- package/dist/op/activities/policy.d.ts.map +1 -0
- package/dist/op/activities/reconcile.d.ts +149 -0
- package/dist/op/activities/reconcile.d.ts.map +1 -0
- package/dist/op/activities/shell.d.ts +13 -0
- package/dist/op/activities/shell.d.ts.map +1 -0
- package/dist/op/activities/teardown.d.ts +10 -0
- package/dist/op/activities/teardown.d.ts.map +1 -0
- package/dist/op/activities/util.d.ts +7 -0
- package/dist/op/activities/util.d.ts.map +1 -0
- package/dist/op/activities/wait.d.ts +28 -0
- package/dist/op/activities/wait.d.ts.map +1 -0
- package/dist/op/activities/workflow-audit.d.ts +92 -0
- package/dist/op/activities/workflow-audit.d.ts.map +1 -0
- package/dist/op/activity-contract-registry.d.ts +76 -0
- package/dist/op/activity-contract-registry.d.ts.map +1 -0
- package/dist/op/activity-contract.d.ts +25 -18
- package/dist/op/activity-contract.d.ts.map +1 -1
- package/dist/op/activity-failure.d.ts +28 -0
- package/dist/op/activity-failure.d.ts.map +1 -0
- package/dist/op/activity-profiles.d.ts +118 -0
- package/dist/op/activity-profiles.d.ts.map +1 -0
- package/dist/op/activity-registry.d.ts +22 -38
- package/dist/op/activity-registry.d.ts.map +1 -1
- package/dist/op/activity-runtime.d.ts +3 -14
- package/dist/op/activity-runtime.d.ts.map +1 -1
- package/dist/op/builders.d.ts +85 -30
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/change-signal.d.ts +91 -0
- package/dist/op/change-signal.d.ts.map +1 -0
- package/dist/op/composites/apply-op.d.ts +118 -0
- package/dist/op/composites/apply-op.d.ts.map +1 -0
- package/dist/op/composites/converge-op.d.ts +120 -0
- package/dist/op/composites/converge-op.d.ts.map +1 -0
- package/dist/op/composites/index.d.ts +26 -0
- package/dist/op/composites/index.d.ts.map +1 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
- package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
- package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
- package/dist/op/composites/reconcile-op.d.ts +57 -0
- package/dist/op/composites/reconcile-op.d.ts.map +1 -0
- package/dist/op/composites/watch-op.d.ts +60 -0
- package/dist/op/composites/watch-op.d.ts.map +1 -0
- package/dist/op/composites/workflow-audit-op.d.ts +57 -0
- package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
- package/dist/op/converge-rule.d.ts +12 -10
- package/dist/op/converge-rule.d.ts.map +1 -1
- package/dist/op/cron.d.ts +51 -0
- package/dist/op/cron.d.ts.map +1 -0
- package/dist/op/discover.d.ts +9 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/duration.d.ts +11 -0
- package/dist/op/duration.d.ts.map +1 -0
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/gate-name.d.ts +40 -0
- package/dist/op/gate-name.d.ts.map +1 -0
- package/dist/op/gate-summary.d.ts +43 -0
- package/dist/op/gate-summary.d.ts.map +1 -0
- package/dist/op/gate.d.ts +90 -0
- package/dist/op/gate.d.ts.map +1 -0
- package/dist/op/generate-pipeline.d.ts +9 -0
- package/dist/op/generate-pipeline.d.ts.map +1 -1
- package/dist/op/index.d.ts +29 -9
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +114 -28
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-output.d.ts +11 -1
- package/dist/op/local-output.d.ts.map +1 -1
- package/dist/op/op-ir.d.ts +185 -0
- package/dist/op/op-ir.d.ts.map +1 -0
- package/dist/op/op-verb-class.d.ts +10 -2
- package/dist/op/op-verb-class.d.ts.map +1 -1
- package/dist/op/operator.d.ts +93 -5
- package/dist/op/operator.d.ts.map +1 -1
- package/dist/op/receipt-store.d.ts +1 -1
- package/dist/op/receipt-store.d.ts.map +1 -1
- package/dist/op/resource.d.ts +15 -1
- package/dist/op/resource.d.ts.map +1 -1
- package/dist/op/runtime.d.ts +200 -0
- package/dist/op/runtime.d.ts.map +1 -0
- package/dist/op/runtimes/local.d.ts +29 -0
- package/dist/op/runtimes/local.d.ts.map +1 -0
- package/dist/op/step-output-ref.d.ts +15 -13
- package/dist/op/step-output-ref.d.ts.map +1 -1
- package/dist/op/types.d.ts +96 -29
- package/dist/op/types.d.ts.map +1 -1
- package/dist/ownership.d.ts +1 -1
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -1
- package/dist/serializer-walker.d.ts.map +1 -1
- package/dist/terraform/bridge.d.ts +26 -7
- package/dist/terraform/bridge.d.ts.map +1 -1
- package/dist/terraform/carve-provider.d.ts +28 -2
- package/dist/terraform/carve-provider.d.ts.map +1 -1
- package/dist/terraform/data-source-shape.d.ts +77 -0
- package/dist/terraform/data-source-shape.d.ts.map +1 -0
- package/dist/terraform/graph.d.ts.map +1 -1
- package/dist/terraform/providers/kubernetes.d.ts +5 -0
- package/dist/terraform/providers/kubernetes.d.ts.map +1 -1
- package/dist/terraform/tier-map.d.ts +16 -4
- package/dist/terraform/tier-map.d.ts.map +1 -1
- package/dist/terraform/types.d.ts +8 -0
- package/dist/terraform/types.d.ts.map +1 -1
- package/package.json +6 -1
- package/src/audit/catalog.test.ts +79 -3
- package/src/audit/catalog.ts +111 -13
- package/src/audit/core.test.ts +26 -0
- package/src/audit/core.ts +84 -18
- package/src/audit/discover.test.ts +39 -0
- package/src/audit/discover.ts +202 -18
- package/src/audit/lineage.ts +100 -0
- package/src/audit/prior-art.ts +153 -0
- package/src/audit/proof.test.ts +67 -0
- package/src/audit/proof.ts +70 -0
- package/src/audit/report-html.ts +9 -4
- package/src/audit/report-model.ts +16 -2
- package/src/audit/report.test.ts +33 -0
- package/src/audit/report.ts +5 -3
- package/src/audit/rules-doc.test.ts +34 -2
- package/src/audit/rules-doc.ts +82 -9
- package/src/audit/secrets.ts +15 -3
- package/src/audit/terraform-state.test.ts +144 -0
- package/src/audit/terraform-state.ts +131 -0
- package/src/build.ts +31 -1
- package/src/claimed-fields.test.ts +145 -0
- package/src/claimed-fields.ts +208 -0
- package/src/cli/build-params-cli.ts +2 -2
- package/src/cli/command-group.ts +14 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
- package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
- package/src/cli/commands/audit.test.ts +191 -11
- package/src/cli/commands/audit.ts +78 -28
- package/src/cli/commands/build.test.ts +330 -9
- package/src/cli/commands/build.ts +170 -24
- package/src/cli/commands/carve-bridge.test.ts +237 -14
- package/src/cli/commands/carve-bridge.ts +21 -17
- package/src/cli/commands/carve-emit-k8s.test.ts +17 -10
- package/src/cli/commands/check-lexicon-docs.ts +1 -1
- package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
- package/src/cli/commands/check-lexicon-examples.ts +42 -10
- package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
- package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
- package/src/cli/commands/init-lexicon.test.ts +97 -2
- package/src/cli/commands/init-lexicon.ts +4 -2
- package/src/cli/commands/init.test.ts +35 -1
- package/src/cli/commands/init.ts +14 -3
- package/src/cli/commands/lint.test.ts +194 -1
- package/src/cli/commands/lint.ts +205 -7
- package/src/cli/commands/onboard.test.ts +75 -0
- package/src/cli/commands/onboard.ts +54 -23
- package/src/cli/handlers/build.test.ts +81 -1
- package/src/cli/handlers/build.ts +15 -1
- package/src/cli/handlers/graph.test.ts +3 -3
- package/src/cli/handlers/lifecycle.test.ts +195 -12
- package/src/cli/handlers/lifecycle.ts +123 -6
- package/src/cli/handlers/misc.ts +1 -1
- package/src/cli/handlers/operator.test.ts +183 -11
- package/src/cli/handlers/operator.ts +341 -55
- package/src/cli/handlers/run.test.ts +568 -1295
- package/src/cli/handlers/run.ts +446 -912
- package/src/cli/main.test.ts +22 -16
- package/src/cli/main.ts +66 -33
- package/src/cli/mcp/op-tools.ts +147 -88
- package/src/cli/mcp/resource-handlers.ts +10 -37
- package/src/cli/mcp/resources/context.ts +11 -12
- package/src/cli/mcp/server.test.ts +25 -27
- package/src/cli/mcp/server.ts +2 -2
- package/src/cli/plugins.test.ts +68 -2
- package/src/cli/plugins.ts +39 -0
- package/src/cli/registry.ts +40 -9
- package/src/codegen/docs.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.ts +1 -1
- package/src/components/README.md +4 -3
- package/src/components/__fixtures__/neo4j-fanout.json +1 -1
- package/src/components/auto-release.test.ts +4 -20
- package/src/components/auto-release.ts +17 -42
- package/src/components/capability.ts +4 -4
- package/src/components/cli-support.test.ts +28 -12
- package/src/components/cli-support.ts +60 -47
- package/src/components/component-schema.test.ts +18 -2
- package/src/components/component.schema.json +18 -5
- package/src/components/component.test.ts +2 -2
- package/src/components/component.ts +27 -7
- package/src/components/config-defaults.test.ts +2 -2
- package/src/components/driver-output.ts +14 -2
- package/src/components/driver.test.ts +109 -20
- package/src/components/driver.ts +201 -84
- package/src/components/index.ts +1 -6
- package/src/components/manifest-persistence.test.ts +2 -20
- package/src/components/manifest-persistence.ts +4 -24
- package/src/components/pilots/neo4j-fanout.pilot.ts +3 -3
- package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
- package/src/components/run-progress.ts +6 -6
- package/src/components/verbs/run-agent.test.ts +19 -0
- package/src/components/verbs/run-agent.ts +12 -24
- package/src/components/verbs/verify.ts +2 -2
- package/src/deep-observation.test.ts +75 -0
- package/src/deep-observation.ts +48 -0
- package/src/detectLexicon.ts +18 -1
- package/src/discovery/collect.test.ts +3 -3
- package/src/discovery/files.ts +4 -4
- package/src/discovery/fold-import.test.ts +1 -1
- package/src/discovery/fold-import.ts +105 -2
- package/src/discovery/param-deps.test.ts +112 -1
- package/src/discovery/param-deps.ts +193 -0
- package/src/discovery/sandbox/bundle.ts +15 -1
- package/src/discovery/sandbox/config-wire.test.ts +2 -2
- package/src/discovery/sandbox/config-wire.ts +2 -2
- package/src/fold/fold.test.ts +56 -0
- package/src/fold/foldable-helpers.ts +82 -2
- package/src/fold-provenance-exclusion.test.ts +186 -0
- package/src/fold-provenance.test.ts +495 -0
- package/src/fold-provenance.ts +441 -0
- package/src/graph-ops.test.ts +3 -3
- package/src/graph-ops.ts +1 -1
- package/src/held-elsewhere.test.ts +102 -0
- package/src/held-elsewhere.ts +114 -0
- package/src/index.ts +3 -0
- package/src/kubectl-context.ts +3 -3
- package/src/lexicon-config.test.ts +5 -5
- package/src/lexicon-config.ts +4 -4
- package/src/lexicon-plugin-helpers.ts +1 -1
- package/src/lexicon.ts +296 -16
- package/src/lifecycle/change-set.test.ts +49 -0
- package/src/lifecycle/change-set.ts +67 -0
- package/src/lifecycle/converge-ledger.ts +1 -1
- package/src/lifecycle/deep-diff.test.ts +267 -14
- package/src/lifecycle/deep-diff.ts +217 -14
- package/src/lifecycle/deep-observe.test.ts +3 -1
- package/src/lifecycle/deep-observe.ts +16 -6
- package/src/lifecycle/gate-ledger.test.ts +74 -2
- package/src/lifecycle/gate-ledger.ts +154 -36
- package/src/lifecycle/index.ts +1 -0
- package/src/lifecycle/release-ledger.ts +2 -2
- package/src/lifecycle/run-ledger.test.ts +268 -0
- package/src/lifecycle/run-ledger.ts +201 -0
- package/src/lifecycle/symptoms.ts +3 -3
- package/src/lint/config.test.ts +82 -1
- package/src/lint/config.ts +112 -3
- package/src/lint/pipeline-change-gate.test.ts +2 -2
- package/src/lint/policy.test.ts +1 -1
- package/src/lint/post-synth.test.ts +31 -0
- package/src/lint/post-synth.ts +54 -1
- package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
- package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
- package/src/lint/rules/comp/comp.test.ts +27 -1
- package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +76 -0
- package/src/lint/rules/comp/index.ts +3 -3
- package/src/lint/rules/op/index.ts +23 -0
- package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
- package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
- package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
- package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
- package/src/lint/rules/op/support.ts +11 -0
- package/src/lint/suppressions.test.ts +163 -0
- package/src/lint/suppressions.ts +204 -0
- package/src/live-endpoint.ts +1 -1
- package/src/op/activities/activity-contracts.ts +66 -0
- package/src/op/activities/apply.test.ts +567 -0
- package/src/op/activities/apply.ts +662 -0
- package/src/op/activities/build.ts +26 -0
- package/src/op/activities/converge.test.ts +330 -0
- package/src/op/activities/converge.ts +449 -0
- package/src/op/activities/env-teardown.test.ts +187 -0
- package/src/op/activities/env-teardown.ts +171 -0
- package/src/op/activities/guard-validate.test.ts +139 -0
- package/src/op/activities/guard-validate.ts +223 -0
- package/src/op/activities/http-check.test.ts +48 -0
- package/src/op/activities/http-check.ts +55 -0
- package/src/op/activities/index.ts +119 -0
- package/src/op/activities/lexicon-upgrade.test.ts +492 -0
- package/src/op/activities/lexicon-upgrade.ts +673 -0
- package/src/op/activities/lifecycle.ts +85 -0
- package/src/op/activities/pipeline-audit.test.ts +67 -0
- package/src/op/activities/pipeline-audit.ts +201 -0
- package/src/op/activities/policy.test.ts +19 -0
- package/src/op/activities/policy.ts +37 -0
- package/src/op/activities/reconcile.test.ts +161 -0
- package/src/op/activities/reconcile.ts +354 -0
- package/src/op/activities/shell.ts +26 -0
- package/src/op/activities/teardown.ts +22 -0
- package/src/op/activities/util.ts +6 -0
- package/src/op/activities/wait.ts +69 -0
- package/src/op/activities/workflow-audit.test.ts +90 -0
- package/src/op/activities/workflow-audit.ts +203 -0
- package/src/op/activity-contract-registry.test.ts +98 -0
- package/src/op/activity-contract-registry.ts +114 -0
- package/src/op/activity-contract.test.ts +1 -1
- package/src/op/activity-contract.ts +37 -33
- package/src/op/activity-failure.ts +34 -0
- package/src/op/activity-profiles.test.ts +56 -0
- package/src/op/activity-profiles.ts +116 -0
- package/src/op/activity-registry.test.ts +37 -28
- package/src/op/activity-registry.ts +27 -56
- package/src/op/activity-runtime.ts +3 -47
- package/src/op/builders-exports.test.ts +0 -49
- package/src/op/builders-typed.test.ts +164 -0
- package/src/op/builders.ts +125 -41
- package/src/op/change-signal.test.ts +117 -0
- package/src/op/change-signal.ts +169 -0
- package/src/op/composites/apply-op.ts +218 -0
- package/src/op/composites/composites.test.ts +379 -0
- package/src/op/composites/converge-op.test.ts +168 -0
- package/src/op/composites/converge-op.ts +214 -0
- package/src/op/composites/index.ts +26 -0
- package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
- package/src/op/composites/lexicon-upgrade-op.ts +134 -0
- package/src/op/composites/pipeline-audit-op.test.ts +25 -0
- package/src/op/composites/pipeline-audit-op.ts +78 -0
- package/src/op/composites/reconcile-op.test.ts +51 -0
- package/src/op/composites/reconcile-op.ts +110 -0
- package/src/op/composites/watch-op.ts +108 -0
- package/src/op/composites/workflow-audit-op.test.ts +25 -0
- package/src/op/composites/workflow-audit-op.ts +88 -0
- package/src/op/converge-rule.ts +12 -10
- package/src/op/cron.test.ts +128 -0
- package/src/op/cron.ts +149 -0
- package/src/op/discover-root.test.ts +105 -1
- package/src/op/discover.test.ts +6 -2
- package/src/op/discover.ts +84 -16
- package/src/op/duration.ts +21 -0
- package/src/op/effect-step.test.ts +29 -14
- package/src/op/emulator-lifecycle.ts +1 -2
- package/src/op/gate-name.test.ts +65 -0
- package/src/op/gate-name.ts +60 -0
- package/src/op/gate-summary.ts +84 -0
- package/src/op/gate.ts +155 -0
- package/src/op/generate-pipeline.test.ts +65 -3
- package/src/op/generate-pipeline.ts +19 -2
- package/src/op/index.ts +48 -8
- package/src/op/local-executor.test.ts +178 -34
- package/src/op/local-executor.ts +371 -102
- package/src/op/local-output.test.ts +95 -11
- package/src/op/local-output.ts +33 -4
- package/src/op/op-ir.test.ts +292 -0
- package/src/op/op-ir.ts +419 -0
- package/src/op/op-verb-class.test.ts +2 -2
- package/src/op/op-verb-class.ts +19 -5
- package/src/op/op.test.ts +28 -7
- package/src/op/operator.test.ts +543 -6
- package/src/op/operator.ts +203 -20
- package/src/op/receipt-store.ts +1 -1
- package/src/op/resource.ts +20 -2
- package/src/op/runtime.ts +203 -0
- package/src/op/runtimes/local.test.ts +181 -0
- package/src/op/runtimes/local.ts +212 -0
- package/src/op/step-output-ref.ts +15 -13
- package/src/op/types.ts +106 -26
- package/src/ownership.ts +1 -1
- package/src/provenance.test.ts +6 -0
- package/src/provenance.ts +21 -1
- package/src/serializer-walker.test.ts +42 -0
- package/src/serializer-walker.ts +21 -2
- package/src/terraform/aws-resources.test.ts +13 -4
- package/src/terraform/bridge.test.ts +22 -9
- package/src/terraform/bridge.ts +89 -28
- package/src/terraform/carve-provider.ts +38 -2
- package/src/terraform/data-source-shape.ts +95 -0
- package/src/terraform/graph.ts +35 -7
- package/src/terraform/providers/kubernetes.ts +48 -2
- package/src/terraform/tier-map.ts +21 -6
- package/src/terraform/types.ts +8 -0
- package/dist/cli/handlers/op-progress.d.ts +0 -90
- package/dist/cli/handlers/op-progress.d.ts.map +0 -1
- package/dist/cli/handlers/run-client.d.ts +0 -127
- package/dist/cli/handlers/run-client.d.ts.map +0 -1
- package/dist/cli/handlers/run-report.d.ts +0 -5
- package/dist/cli/handlers/run-report.d.ts.map +0 -1
- package/dist/components/temporal-codegen-loader.d.ts +0 -27
- package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
- package/src/cli/handlers/op-progress.test.ts +0 -268
- package/src/cli/handlers/op-progress.ts +0 -248
- package/src/cli/handlers/run-client.test.ts +0 -82
- package/src/cli/handlers/run-client.ts +0 -219
- package/src/cli/handlers/run-report.test.ts +0 -62
- package/src/cli/handlers/run-report.ts +0 -122
- package/src/components/temporal-codegen-loader.ts +0 -41
- package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
package/src/cli/main.test.ts
CHANGED
|
@@ -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("
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
expect(
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
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,
|
|
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
|
-
|
|
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>
|
|
509
|
-
run list List all Ops with
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
run
|
|
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
|
|
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
|
|
552
|
-
gate
|
|
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
|
-
|
|
557
|
-
|
|
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
|
-
|
|
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
|
-
--
|
|
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
|
|
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
|
-
|
|
798
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
package/src/cli/mcp/op-tools.ts
CHANGED
|
@@ -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 {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
-
|
|
10
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
75
|
+
let states: Map<string, { state: string } | undefined> = new Map();
|
|
30
76
|
try {
|
|
31
|
-
|
|
77
|
+
const runtime = await runtimeFor(params.runtime);
|
|
78
|
+
states = await runtime.list([...ops.values()].map((d) => d.config));
|
|
32
79
|
} catch {
|
|
33
|
-
//
|
|
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
|
-
|
|
89
|
+
labels: config.labels ?? {},
|
|
52
90
|
depends: config.depends ?? [],
|
|
53
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
88
|
-
const
|
|
89
|
-
const
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
const
|
|
126
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
|
179
|
+
export function createOpApproveTool(): ToolRegistration {
|
|
155
180
|
return {
|
|
156
181
|
definition: {
|
|
157
|
-
name: "op-
|
|
158
|
-
description:
|
|
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
|
-
|
|
164
|
-
|
|
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", "
|
|
195
|
+
required: ["name", "gate"],
|
|
167
196
|
},
|
|
168
197
|
},
|
|
169
198
|
handler: async (params) => {
|
|
170
199
|
const name = params.name as string;
|
|
171
|
-
const
|
|
172
|
-
|
|
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
|
|
175
|
-
const
|
|
176
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
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
|
|
271
|
+
return lines.join("\n");
|
|
213
272
|
},
|
|
214
273
|
};
|
|
215
274
|
}
|