@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
|
@@ -11,7 +11,10 @@ const loadChantConfigMock = vi.fn();
|
|
|
11
11
|
const readLeaseMock = vi.fn();
|
|
12
12
|
const readConvergeLedgerMock = vi.fn();
|
|
13
13
|
const appendGateResolutionMock = vi.fn();
|
|
14
|
+
const appendPendingGateMock = vi.fn();
|
|
14
15
|
const readGateResolutionsMock = vi.fn();
|
|
16
|
+
const readGateLedgerMock = vi.fn();
|
|
17
|
+
const readRunLedgerMock = vi.fn();
|
|
15
18
|
const pushLifecycleMock = vi.fn();
|
|
16
19
|
|
|
17
20
|
vi.mock("../../op/operator", async () => {
|
|
@@ -40,12 +43,18 @@ vi.mock("../../lifecycle/converge-ledger", async () => {
|
|
|
40
43
|
const actual = await vi.importActual<typeof import("../../lifecycle/converge-ledger")>("../../lifecycle/converge-ledger");
|
|
41
44
|
return { ...actual, readConvergeLedger: (...args: unknown[]) => readConvergeLedgerMock(...args) };
|
|
42
45
|
});
|
|
46
|
+
vi.mock("../../lifecycle/run-ledger", async () => {
|
|
47
|
+
const actual = await vi.importActual<typeof import("../../lifecycle/run-ledger")>("../../lifecycle/run-ledger");
|
|
48
|
+
return { ...actual, readRunLedger: (...args: unknown[]) => readRunLedgerMock(...args) };
|
|
49
|
+
});
|
|
43
50
|
vi.mock("../../lifecycle/gate-ledger", async () => {
|
|
44
51
|
const actual = await vi.importActual<typeof import("../../lifecycle/gate-ledger")>("../../lifecycle/gate-ledger");
|
|
45
52
|
return {
|
|
46
53
|
...actual,
|
|
47
54
|
appendGateResolution: (...args: unknown[]) => appendGateResolutionMock(...args),
|
|
55
|
+
appendPendingGate: (...args: unknown[]) => appendPendingGateMock(...args),
|
|
48
56
|
readGateResolutions: (...args: unknown[]) => readGateResolutionsMock(...args),
|
|
57
|
+
readGateLedger: (...args: unknown[]) => readGateLedgerMock(...args),
|
|
49
58
|
};
|
|
50
59
|
});
|
|
51
60
|
vi.mock("../../lifecycle/git", async () => {
|
|
@@ -71,6 +80,8 @@ beforeEach(() => {
|
|
|
71
80
|
loadProfilesMock.mockResolvedValue({});
|
|
72
81
|
discoverOpsMock.mockResolvedValue({ ops: new Map([["fountain-apply", {}]]), errors: [] });
|
|
73
82
|
pushLifecycleMock.mockResolvedValue(true);
|
|
83
|
+
readGateResolutionsMock.mockResolvedValue({ records: [], malformed: 0 });
|
|
84
|
+
readGateLedgerMock.mockResolvedValue({ resolutions: [], pending: [], malformed: 0 });
|
|
74
85
|
});
|
|
75
86
|
|
|
76
87
|
describe("runOperator", () => {
|
|
@@ -84,7 +95,7 @@ describe("runOperator", () => {
|
|
|
84
95
|
|
|
85
96
|
test("--once runs exactly one round and exits 0 when nothing failed", async () => {
|
|
86
97
|
discoverConvergeOpsMock.mockResolvedValue({ ops: [{ config: { name: "staging-converge" } }], errors: [] });
|
|
87
|
-
runOperatorRoundMock.mockResolvedValue([{ kind: "ticked", op: "staging-converge", env: "staging", result: { op: "staging-converge", records: [], totalMs: 1, ok:
|
|
98
|
+
runOperatorRoundMock.mockResolvedValue([{ kind: "ticked", op: "staging-converge", env: "staging", result: { op: "staging-converge", records: [], totalMs: 1, status: "ok", startedAt: "2026-01-01T00:00:00.000Z" } }]);
|
|
88
99
|
|
|
89
100
|
const code = await runOperator(ctx({ once: true }));
|
|
90
101
|
expect(code).toBe(0);
|
|
@@ -147,7 +158,7 @@ describe("runOperatorStatus", () => {
|
|
|
147
158
|
|
|
148
159
|
test("--json emits one row per discovered ConvergeOp with last tick, lease, and pending gates", async () => {
|
|
149
160
|
discoverConvergeOpsMock.mockResolvedValue({
|
|
150
|
-
ops: [{ config: { name: "staging-converge",
|
|
161
|
+
ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
|
|
151
162
|
errors: [],
|
|
152
163
|
});
|
|
153
164
|
readConvergeLedgerMock.mockResolvedValue({
|
|
@@ -185,7 +196,7 @@ describe("runOperatorStatus", () => {
|
|
|
185
196
|
// and the only affordance a renderer could offer was a shell command.
|
|
186
197
|
test("a gated outcome's approval url rides onto the pending-gate row", async () => {
|
|
187
198
|
discoverConvergeOpsMock.mockResolvedValue({
|
|
188
|
-
ops: [{ config: { name: "staging-converge",
|
|
199
|
+
ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
|
|
189
200
|
errors: [],
|
|
190
201
|
});
|
|
191
202
|
readConvergeLedgerMock.mockResolvedValue({
|
|
@@ -223,7 +234,7 @@ describe("runOperatorStatus", () => {
|
|
|
223
234
|
|
|
224
235
|
test("the human render prints the address under the pending gate", async () => {
|
|
225
236
|
discoverConvergeOpsMock.mockResolvedValue({
|
|
226
|
-
ops: [{ config: { name: "staging-converge",
|
|
237
|
+
ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
|
|
227
238
|
errors: [],
|
|
228
239
|
});
|
|
229
240
|
readConvergeLedgerMock.mockResolvedValue({
|
|
@@ -253,7 +264,7 @@ describe("runOperatorStatus", () => {
|
|
|
253
264
|
|
|
254
265
|
test("a gate resolved after the tick that recorded it is no longer pending", async () => {
|
|
255
266
|
discoverConvergeOpsMock.mockResolvedValue({
|
|
256
|
-
ops: [{ config: { name: "staging-converge",
|
|
267
|
+
ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
|
|
257
268
|
errors: [],
|
|
258
269
|
});
|
|
259
270
|
readConvergeLedgerMock.mockResolvedValue({
|
|
@@ -283,6 +294,51 @@ describe("runOperatorStatus", () => {
|
|
|
283
294
|
expect(printed[0].pendingGates).toEqual([]);
|
|
284
295
|
logSpy.mockRestore();
|
|
285
296
|
});
|
|
297
|
+
// #2119 — a gate a plain `chant run <op>` stopped at is a pending fact on
|
|
298
|
+
// that op's own ledger, with no converge tick anywhere behind it.
|
|
299
|
+
test("lists a pending fact for a non-converge op", async () => {
|
|
300
|
+
discoverConvergeOpsMock.mockResolvedValue({ ops: [], errors: [] });
|
|
301
|
+
discoverOpsMock.mockResolvedValue({ ops: new Map([["prod-apply", {}]]), errors: [] });
|
|
302
|
+
readGateLedgerMock.mockResolvedValue({
|
|
303
|
+
resolutions: [],
|
|
304
|
+
pending: [{
|
|
305
|
+
version: 1, kind: "pending", op: "prod-apply", gate: "rollout-gate",
|
|
306
|
+
description: "release manager signs off",
|
|
307
|
+
timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
|
|
308
|
+
url: "https://pr.example/9",
|
|
309
|
+
}],
|
|
310
|
+
malformed: 0,
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
314
|
+
expect(await runOperatorStatus(ctx({}))).toBe(0);
|
|
315
|
+
const out = logSpy.mock.calls.map((c) => String(c[0])).join("\n");
|
|
316
|
+
expect(out).toContain("pending gates (no converge tick)");
|
|
317
|
+
expect(out).toContain("chant approve prod-apply rollout-gate");
|
|
318
|
+
expect(out).toContain("expires: 2099-01-01T00:00:00.000Z");
|
|
319
|
+
expect(out).toContain("approve at: https://pr.example/9");
|
|
320
|
+
logSpy.mockRestore();
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
test("an expired pending fact is not listed", async () => {
|
|
324
|
+
discoverConvergeOpsMock.mockResolvedValue({ ops: [], errors: [] });
|
|
325
|
+
discoverOpsMock.mockResolvedValue({ ops: new Map([["prod-apply", {}]]), errors: [] });
|
|
326
|
+
readGateLedgerMock.mockResolvedValue({
|
|
327
|
+
resolutions: [],
|
|
328
|
+
pending: [{
|
|
329
|
+
version: 1, kind: "pending", op: "prod-apply", gate: "rollout-gate",
|
|
330
|
+
timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2026-01-03T00:00:00.000Z",
|
|
331
|
+
}],
|
|
332
|
+
malformed: 0,
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
336
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
337
|
+
expect(await runOperatorStatus(ctx({}))).toBe(0);
|
|
338
|
+
expect(logSpy.mock.calls.map((c) => String(c[0])).join("\n")).not.toContain("pending gates");
|
|
339
|
+
logSpy.mockRestore();
|
|
340
|
+
errSpy.mockRestore();
|
|
341
|
+
});
|
|
286
342
|
});
|
|
287
343
|
|
|
288
344
|
describe("runApprove", () => {
|
|
@@ -310,6 +366,30 @@ describe("runApprove", () => {
|
|
|
310
366
|
errSpy.mockRestore();
|
|
311
367
|
});
|
|
312
368
|
|
|
369
|
+
// #2192 — every example README teaches `--approver you`; the handler read
|
|
370
|
+
// only `--actor` and fell through to $GITHUB_ACTOR / $USER, so the ledger
|
|
371
|
+
// recorded the shell user. Same precedence as `chant run approve`.
|
|
372
|
+
test("--approver wins over --actor and over the CI/shell identity", async () => {
|
|
373
|
+
vi.stubEnv("GITHUB_ACTOR", "ci-bot");
|
|
374
|
+
vi.stubEnv("USER", "alex");
|
|
375
|
+
appendGateResolutionMock.mockResolvedValue({
|
|
376
|
+
commit: "sha",
|
|
377
|
+
record: { version: 1, op: "deploy-gated", gate: "approve-deploy", resolvedBy: "you", timestamp: "2026-01-01T00:00:00.000Z" },
|
|
378
|
+
});
|
|
379
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
380
|
+
|
|
381
|
+
const code = await runApprove(ctx({
|
|
382
|
+
path: "deploy-gated", extraPositional: "approve-deploy", approver: "you", actor: "alex",
|
|
383
|
+
}));
|
|
384
|
+
|
|
385
|
+
expect(code).toBe(0);
|
|
386
|
+
expect(appendGateResolutionMock).toHaveBeenCalledWith(
|
|
387
|
+
expect.objectContaining({ op: "deploy-gated", gate: "approve-deploy", resolvedBy: "you" }),
|
|
388
|
+
);
|
|
389
|
+
errSpy.mockRestore();
|
|
390
|
+
vi.unstubAllEnvs();
|
|
391
|
+
});
|
|
392
|
+
|
|
313
393
|
// #2028 — the resolution's link is typed, so a reader is not sniffing
|
|
314
394
|
// free-text `note` for something that looks like a URL.
|
|
315
395
|
test("--url is recorded typed, alongside --note's prose", async () => {
|
|
@@ -361,6 +441,43 @@ describe("runApprove", () => {
|
|
|
361
441
|
errSpy.mockRestore();
|
|
362
442
|
});
|
|
363
443
|
|
|
444
|
+
// #2119 — `--expire` clears a standing pending fact without approving it.
|
|
445
|
+
test("--expire supersedes the standing pending fact and writes no resolution", async () => {
|
|
446
|
+
readGateLedgerMock.mockResolvedValue({
|
|
447
|
+
resolutions: [],
|
|
448
|
+
pending: [{
|
|
449
|
+
version: 1, kind: "pending", op: "fountain-apply", gate: "rollout-gate",
|
|
450
|
+
description: "release manager signs off",
|
|
451
|
+
timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
|
|
452
|
+
}],
|
|
453
|
+
malformed: 0,
|
|
454
|
+
});
|
|
455
|
+
appendPendingGateMock.mockResolvedValue({ commit: "sha", record: {} });
|
|
456
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
457
|
+
|
|
458
|
+
const code = await runApprove(ctx({ path: "fountain-apply", extraPositional: "rollout-gate", expire: true }));
|
|
459
|
+
|
|
460
|
+
expect(code).toBe(0);
|
|
461
|
+
expect(appendGateResolutionMock).not.toHaveBeenCalled();
|
|
462
|
+
const written = appendPendingGateMock.mock.calls[0][0];
|
|
463
|
+
expect(written.op).toBe("fountain-apply");
|
|
464
|
+
expect(written.gate).toBe("rollout-gate");
|
|
465
|
+
expect(written.description).toBe("release manager signs off");
|
|
466
|
+
// Already expired the moment it is written: the next run re-decides.
|
|
467
|
+
expect(written.expiresAt).toBe(written.timestamp);
|
|
468
|
+
expect(pushLifecycleMock).toHaveBeenCalled();
|
|
469
|
+
errSpy.mockRestore();
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
test("--expire with nothing standing writes nothing and still exits 0", async () => {
|
|
473
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
474
|
+
const code = await runApprove(ctx({ path: "fountain-apply", extraPositional: "rollout-gate", expire: true }));
|
|
475
|
+
expect(code).toBe(0);
|
|
476
|
+
expect(appendPendingGateMock).not.toHaveBeenCalled();
|
|
477
|
+
expect(appendGateResolutionMock).not.toHaveBeenCalled();
|
|
478
|
+
errSpy.mockRestore();
|
|
479
|
+
});
|
|
480
|
+
|
|
364
481
|
test("warns (but still records) when the op isn't among discovered *.op.ts declarations", async () => {
|
|
365
482
|
discoverOpsMock.mockResolvedValue({ ops: new Map(), errors: [] });
|
|
366
483
|
appendGateResolutionMock.mockResolvedValue({
|
|
@@ -396,10 +513,65 @@ describe("runOperatorLog", () => {
|
|
|
396
513
|
|
|
397
514
|
beforeEach(() => {
|
|
398
515
|
discoverConvergeOpsMock.mockResolvedValue({
|
|
399
|
-
ops: [{ config: { name: "staging-converge",
|
|
516
|
+
ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
|
|
400
517
|
errors: [],
|
|
401
518
|
});
|
|
402
519
|
readGateResolutionsMock.mockResolvedValue({ records: [], malformed: 0 });
|
|
520
|
+
readRunLedgerMock.mockResolvedValue({ records: [], malformed: 0 });
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
/** One Op-run record (#2118) as `readRunLedger` returns it. */
|
|
524
|
+
function run(over: Record<string, unknown> = {}) {
|
|
525
|
+
return {
|
|
526
|
+
version: 1,
|
|
527
|
+
id: "99999999-8888-7777-6666-555555555555",
|
|
528
|
+
op: "staging-converge",
|
|
529
|
+
env: "staging",
|
|
530
|
+
started: "2026-01-01T00:29:00.000Z",
|
|
531
|
+
ended: "2026-01-01T00:30:00.000Z",
|
|
532
|
+
status: "ok",
|
|
533
|
+
labels: { Converge: "true", Env: "staging" },
|
|
534
|
+
outcomes: { Drift: false },
|
|
535
|
+
phases: [{ name: "Converge", status: "ok", steps: [{ fn: "convergeTick", status: "ok", durationMs: 60_000 }] }],
|
|
536
|
+
...over,
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
test("run records are merged into the timeline, ordered by the instant they ended (#2118)", async () => {
|
|
541
|
+
readConvergeLedgerMock.mockResolvedValue({
|
|
542
|
+
records: [
|
|
543
|
+
tick({ id: "t1", timestamp: "2026-01-01T00:00:00.000Z" }),
|
|
544
|
+
tick({ id: "t2", timestamp: "2026-01-01T01:00:00.000Z" }),
|
|
545
|
+
],
|
|
546
|
+
malformed: 0,
|
|
547
|
+
});
|
|
548
|
+
readRunLedgerMock.mockResolvedValue({ records: [run({ id: "r1" })], malformed: 0 });
|
|
549
|
+
|
|
550
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
551
|
+
expect(await runOperatorLog(ctx({ json: true }))).toBe(0);
|
|
552
|
+
|
|
553
|
+
const printed = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
554
|
+
expect(printed.entries.map((e: { kind: string; record: { id: string } }) => [e.kind, e.record.id])).toEqual([
|
|
555
|
+
["tick", "t1"],
|
|
556
|
+
["run", "r1"],
|
|
557
|
+
["tick", "t2"],
|
|
558
|
+
]);
|
|
559
|
+
expect(readRunLedgerMock).toHaveBeenCalledWith("staging", "staging-converge", expect.anything());
|
|
560
|
+
logSpy.mockRestore();
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
test("a run renders one line naming its status and captured outcomes", async () => {
|
|
564
|
+
readConvergeLedgerMock.mockResolvedValue({ records: [], malformed: 0 });
|
|
565
|
+
readRunLedgerMock.mockResolvedValue({ records: [run({ id: "r1", status: "gated" })], malformed: 0 });
|
|
566
|
+
|
|
567
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
568
|
+
expect(await runOperatorLog(ctx({}))).toBe(0);
|
|
569
|
+
|
|
570
|
+
const out = logSpy.mock.calls.map((c) => String(c[0])).join("\n");
|
|
571
|
+
expect(out).toContain("staging-converge@staging");
|
|
572
|
+
expect(out).toContain("run gated phases=1 steps=1");
|
|
573
|
+
expect(out).toContain("Drift=false");
|
|
574
|
+
logSpy.mockRestore();
|
|
403
575
|
});
|
|
404
576
|
|
|
405
577
|
test("--json emits the whole tick history, not just the newest row", async () => {
|
|
@@ -416,7 +588,7 @@ describe("runOperatorLog", () => {
|
|
|
416
588
|
|
|
417
589
|
const printed = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
418
590
|
expect(printed.entries.map((e: { record: { id: string } }) => e.record.id)).toEqual(["t1", "t2", "t3"]);
|
|
419
|
-
expect(printed.malformed).toEqual({ converge: 0, gates: 0 });
|
|
591
|
+
expect(printed.malformed).toEqual({ converge: 0, gates: 0, runs: 0 });
|
|
420
592
|
logSpy.mockRestore();
|
|
421
593
|
});
|
|
422
594
|
|
|
@@ -488,8 +660,8 @@ describe("runOperatorLog", () => {
|
|
|
488
660
|
test("--op restricts to one ConvergeOp", async () => {
|
|
489
661
|
discoverConvergeOpsMock.mockResolvedValue({
|
|
490
662
|
ops: [
|
|
491
|
-
{ config: { name: "staging-converge",
|
|
492
|
-
{ config: { name: "other-converge",
|
|
663
|
+
{ config: { name: "staging-converge", labels: { Env: "staging" } } },
|
|
664
|
+
{ config: { name: "other-converge", labels: { Env: "staging" } } },
|
|
493
665
|
],
|
|
494
666
|
errors: [],
|
|
495
667
|
});
|
|
@@ -507,8 +679,8 @@ describe("runOperatorLog", () => {
|
|
|
507
679
|
test("two ConvergeOps sharing one environment read that ledger once", async () => {
|
|
508
680
|
discoverConvergeOpsMock.mockResolvedValue({
|
|
509
681
|
ops: [
|
|
510
|
-
{ config: { name: "staging-converge",
|
|
511
|
-
{ config: { name: "other-converge",
|
|
682
|
+
{ config: { name: "staging-converge", labels: { Env: "staging" } } },
|
|
683
|
+
{ config: { name: "other-converge", labels: { Env: "staging" } } },
|
|
512
684
|
],
|
|
513
685
|
errors: [],
|
|
514
686
|
});
|