@intentius/chant 0.57.0 → 0.58.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 +20 -1
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts +14 -8
- 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/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.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 +28 -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/registry.d.ts +26 -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 +20 -21
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +3 -3
- 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 +66 -36
- 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 +9 -15
- 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/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 +104 -14
- 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 +71 -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 +89 -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 +84 -29
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/composites/apply-op.d.ts +113 -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.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 +23 -7
- 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 +184 -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 +30 -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 +79 -27
- 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/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 +61 -17
- package/src/audit/discover.test.ts +39 -0
- package/src/audit/discover.ts +91 -15
- 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 +189 -11
- package/src/cli/commands/audit.ts +73 -27
- package/src/cli/commands/build.test.ts +292 -9
- package/src/cli/commands/build.ts +156 -24
- 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 +48 -0
- package/src/cli/commands/lint.ts +123 -0
- 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 +260 -55
- package/src/cli/handlers/run.test.ts +431 -1287
- package/src/cli/handlers/run.ts +365 -915
- package/src/cli/main.test.ts +23 -15
- package/src/cli/main.ts +88 -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/registry.ts +26 -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 +3 -2
- 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 +10 -5
- package/src/components/cli-support.ts +52 -44
- package/src/components/component.schema.json +2 -2
- package/src/components/component.ts +3 -3
- package/src/components/driver-output.ts +14 -2
- package/src/components/driver.test.ts +92 -22
- package/src/components/driver.ts +193 -83
- 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/pilots-lint-clean.test.ts +11 -10
- package/src/components/run-progress.ts +6 -6
- package/src/components/verbs/run-agent.ts +11 -17
- 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/discovery/collect.test.ts +3 -3
- package/src/discovery/files.ts +4 -4
- 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 +81 -1
- 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 +2 -2
- 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 +120 -14
- 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 +143 -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/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 +1 -1
- package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +74 -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 +81 -0
- package/src/op/activities/reconcile.ts +187 -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 +123 -39
- package/src/op/composites/apply-op.ts +208 -0
- package/src/op/composites/composites.test.ts +366 -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 +107 -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 +26 -11
- package/src/op/emulator-lifecycle.ts +1 -2
- 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 +39 -6
- package/src/op/local-executor.test.ts +163 -34
- package/src/op/local-executor.ts +370 -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 +281 -0
- package/src/op/op-ir.ts +417 -0
- package/src/op/op-verb-class.ts +19 -5
- package/src/op/op.test.ts +26 -5
- package/src/op/operator.test.ts +175 -6
- package/src/op/operator.ts +63 -16
- 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 +84 -24
- 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/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
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { describe, test, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
applyInlineSuppressions,
|
|
4
|
+
entitySuppressions,
|
|
5
|
+
SUPPRESSION_EXPIRED_ID,
|
|
6
|
+
SUPPRESSION_MISPLACED_FILE_ID,
|
|
7
|
+
SUPPRESSION_UNIGNORABLE_ID,
|
|
8
|
+
type SuppressionDirective,
|
|
9
|
+
} from "./suppressions";
|
|
10
|
+
import { DECLARABLE_MARKER, type Declarable } from "../declarable";
|
|
11
|
+
import type { PostSynthDiagnostic } from "./post-synth";
|
|
12
|
+
import type { RuleConfig } from "./rule";
|
|
13
|
+
|
|
14
|
+
/** A minimal `Declarable` carrying the duck-typed `suppressions` field this module reads. */
|
|
15
|
+
function entityWith(directives?: SuppressionDirective[]): Declarable {
|
|
16
|
+
return {
|
|
17
|
+
[DECLARABLE_MARKER]: true,
|
|
18
|
+
lexicon: "fake",
|
|
19
|
+
entityType: "Fake::Thing",
|
|
20
|
+
suppressions: directives,
|
|
21
|
+
} as unknown as Declarable;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let seq = 0;
|
|
25
|
+
function directive(partial: Partial<SuppressionDirective> & Pick<SuppressionDirective, "form">): SuppressionDirective {
|
|
26
|
+
seq += 1;
|
|
27
|
+
return { ids: "all", file: "main.tf", line: 1, key: `key-${seq}`, ...partial };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function diag(checkId: string, entityKey?: string): PostSynthDiagnostic {
|
|
31
|
+
return { checkId, severity: "warning", message: `${checkId} fired`, entity: entityKey, lexicon: "fake" };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe("entitySuppressions", () => {
|
|
35
|
+
test("returns [] for an entity with no suppressions field", () => {
|
|
36
|
+
expect(entitySuppressions(entityWith(undefined))).toEqual([]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("returns [] for undefined", () => {
|
|
40
|
+
expect(entitySuppressions(undefined)).toEqual([]);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("returns the directives array when present", () => {
|
|
44
|
+
const d = directive({ form: "chant-ignore" });
|
|
45
|
+
expect(entitySuppressions(entityWith([d]))).toEqual([d]);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe("applyInlineSuppressions", () => {
|
|
50
|
+
test("a directive naming the checkId explicitly suppresses it", () => {
|
|
51
|
+
const d = directive({ form: "chant-ignore", ids: new Set(["TF010"]) });
|
|
52
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
53
|
+
const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF010", "e1")], entities);
|
|
54
|
+
expect(diagnostics).toHaveLength(0);
|
|
55
|
+
expect(suppressed).toHaveLength(1);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("a directive naming a different id does not suppress", () => {
|
|
59
|
+
const d = directive({ form: "chant-ignore", ids: new Set(["TF010"]) });
|
|
60
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
61
|
+
const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF011", "e1")], entities);
|
|
62
|
+
expect(diagnostics).toHaveLength(1);
|
|
63
|
+
expect(suppressed).toHaveLength(0);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('"all" suppresses every rule id on the entity it anchors to', () => {
|
|
67
|
+
const d = directive({ form: "chant-ignore-block", ids: "all" });
|
|
68
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
69
|
+
const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF001", "e1"), diag("TF999", "e1")], entities);
|
|
70
|
+
expect(diagnostics).toHaveLength(0);
|
|
71
|
+
expect(suppressed).toHaveLength(2);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("a diagnostic with no entity is never suppressed (nothing to look up)", () => {
|
|
75
|
+
const d = directive({ form: "chant-ignore", ids: "all" });
|
|
76
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
77
|
+
const { diagnostics } = applyInlineSuppressions([diag("TF001", undefined)], entities);
|
|
78
|
+
expect(diagnostics).toHaveLength(1);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("a diagnostic whose entity carries no directives is unaffected", () => {
|
|
82
|
+
const entities = new Map([["e1", entityWith(undefined)]]);
|
|
83
|
+
const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF001", "e1")], entities);
|
|
84
|
+
expect(diagnostics).toHaveLength(1);
|
|
85
|
+
expect(suppressed).toHaveLength(0);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe("expiry", () => {
|
|
89
|
+
test("an expired directive no longer suppresses, and is reported once as its own finding", () => {
|
|
90
|
+
const d = directive({ form: "chant-ignore", ids: "all", expires: "2020-01-01", file: "main.tf", line: 4 });
|
|
91
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
92
|
+
const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities, undefined, new Date("2026-01-01"));
|
|
93
|
+
expect(diagnostics).toHaveLength(1); // not suppressed: the finding still fires
|
|
94
|
+
expect(suppressed).toHaveLength(0);
|
|
95
|
+
expect(meta).toHaveLength(1);
|
|
96
|
+
expect(meta[0].checkId).toBe(SUPPRESSION_EXPIRED_ID);
|
|
97
|
+
expect(meta[0].file).toBe("main.tf");
|
|
98
|
+
expect(meta[0].line).toBe(4);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("a not-yet-expired directive still suppresses normally", () => {
|
|
102
|
+
const d = directive({ form: "chant-ignore", ids: "all", expires: "2099-01-01" });
|
|
103
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
104
|
+
const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities, undefined, new Date("2026-01-01"));
|
|
105
|
+
expect(diagnostics).toHaveLength(0);
|
|
106
|
+
expect(suppressed).toHaveLength(1);
|
|
107
|
+
expect(meta).toHaveLength(0);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("an expired directive attached to several entities is reported once, not once per entity", () => {
|
|
111
|
+
const d = directive({ form: "chant-ignore-file", ids: "all", expires: "2020-01-01", file: "main.tf", line: 1 });
|
|
112
|
+
const entities = new Map([
|
|
113
|
+
["e1", entityWith([d])],
|
|
114
|
+
["e2", entityWith([d])],
|
|
115
|
+
]);
|
|
116
|
+
const { meta } = applyInlineSuppressions([diag("TF001", "e1"), diag("TF002", "e2")], entities, undefined, new Date("2026-01-01"));
|
|
117
|
+
expect(meta).toHaveLength(1);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe("a misplaced chant-ignore-file directive", () => {
|
|
122
|
+
test("has no suppressing effect and is reported once as its own finding", () => {
|
|
123
|
+
const d = directive({ form: "chant-ignore-file", ids: "all", misplaced: true, file: "main.tf", line: 3 });
|
|
124
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
125
|
+
const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities);
|
|
126
|
+
expect(diagnostics).toHaveLength(1);
|
|
127
|
+
expect(suppressed).toHaveLength(0);
|
|
128
|
+
expect(meta).toHaveLength(1);
|
|
129
|
+
expect(meta[0].checkId).toBe(SUPPRESSION_MISPLACED_FILE_ID);
|
|
130
|
+
expect(meta[0].line).toBe(3);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe("ignorable: false", () => {
|
|
135
|
+
const rules: Record<string, RuleConfig> = { TF008: ["error", { ignorable: false }] };
|
|
136
|
+
|
|
137
|
+
test("a directive explicitly naming an unignorable id does not suppress it, and is itself reported", () => {
|
|
138
|
+
const d = directive({ form: "chant-ignore", ids: new Set(["TF008"]) });
|
|
139
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
140
|
+
const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF008", "e1")], entities, rules);
|
|
141
|
+
expect(diagnostics).toHaveLength(1);
|
|
142
|
+
expect(suppressed).toHaveLength(0);
|
|
143
|
+
expect(meta.map((m) => m.checkId)).toEqual([SUPPRESSION_UNIGNORABLE_ID]);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("an unconfigured id is ignorable by default", () => {
|
|
147
|
+
const d = directive({ form: "chant-ignore", ids: new Set(["TF001"]) });
|
|
148
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
149
|
+
const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities, rules);
|
|
150
|
+
expect(diagnostics).toHaveLength(0);
|
|
151
|
+
expect(suppressed).toHaveLength(1);
|
|
152
|
+
expect(meta).toHaveLength(0);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("a directive covering a different, ignorable id in the same set still suppresses that one", () => {
|
|
156
|
+
const d = directive({ form: "chant-ignore", ids: new Set(["TF008", "TF010"]) });
|
|
157
|
+
const entities = new Map([["e1", entityWith([d])]]);
|
|
158
|
+
const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF010", "e1")], entities, rules);
|
|
159
|
+
expect(diagnostics).toHaveLength(0);
|
|
160
|
+
expect(suppressed).toHaveLength(1);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline HCL-comment suppression (chant #2111). This file is core's small,
|
|
3
|
+
* generic half of the mechanism. It filters already-produced
|
|
4
|
+
* `PostSynthDiagnostic`s against suppression directives an entity carries,
|
|
5
|
+
* with no knowledge of which lexicon produced that entity. The other half,
|
|
6
|
+
* reading `# chant-ignore` / `# chant-ignore-file` / `# chant-ignore-block`
|
|
7
|
+
* comments out of raw `.tf` text and attaching the result to each parsed
|
|
8
|
+
* entity, is terraform-specific and lives in
|
|
9
|
+
* `lexicons/terraform/src/hcl/suppressions.ts`.
|
|
10
|
+
*
|
|
11
|
+
* Placement. The issue that asked for this weighed two options: a wrapper
|
|
12
|
+
* over `runPostSynthChecks` private to the terraform lexicon, or a
|
|
13
|
+
* `PostSynthContext` field every lexicon could share. Neither is quite what
|
|
14
|
+
* this file does. `ctx.entities` is already the one thing every
|
|
15
|
+
* `PostSynthContext` carries regardless of lexicon, and a suppression
|
|
16
|
+
* directive is inherently a fact ABOUT one entity, namely which block it
|
|
17
|
+
* anchors to, not a fact about the run as a whole. That is the same reasoning
|
|
18
|
+
* that already lets each lexicon's `Declarable` carry its own `props` shape
|
|
19
|
+
* (`TerraformEntity.props`, `K8sEntity.props`, and so on), so the hook here
|
|
20
|
+
* is a plain, duck-typed optional field, `suppressions`, that any entity MAY
|
|
21
|
+
* carry beside its `props`, read generically through `entitySuppressions()`
|
|
22
|
+
* below. Choosing this over a `PostSynthContext.suppressions` field needed no
|
|
23
|
+
* change to `PostSynthContext`, `Declarable`, or any of the places that
|
|
24
|
+
* construct a context (`./post-synth.ts`'s `runPostSynthChecks`, `chant
|
|
25
|
+
* audit`'s `../audit/core.ts`, and the two test-utils builders). Every one
|
|
26
|
+
* of them already hands `applyInlineSuppressions` below `ctx.entities`, so a
|
|
27
|
+
* lexicon that wants this (k8s manifests are the epic's other named
|
|
28
|
+
* candidate) adopts the convention on its own entities, with zero further
|
|
29
|
+
* core changes.
|
|
30
|
+
*
|
|
31
|
+
* `rules` (a project's `lint.rules`) is optional here on purpose. `chant
|
|
32
|
+
* build` has one to pass, so `ignorable: false` works there; `chant audit`'s
|
|
33
|
+
* audit-core path does not thread a project config through at all today, see
|
|
34
|
+
* `../audit/core.ts`, so it calls this with `rules` omitted. Every rule
|
|
35
|
+
* reads as ignorable in that path, the same default this module
|
|
36
|
+
* gives an unconfigured rule id everywhere else.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import type { RuleConfig } from "./rule";
|
|
40
|
+
import type { PostSynthDiagnostic } from "./post-synth";
|
|
41
|
+
import type { Declarable } from "../declarable";
|
|
42
|
+
|
|
43
|
+
/** What a directive's id list names. `"all"` is the wildcard every form accepts. */
|
|
44
|
+
export type SuppressionIds = "all" | ReadonlySet<string>;
|
|
45
|
+
|
|
46
|
+
/** One `# chant-ignore*` comment, already parsed from raw source text. */
|
|
47
|
+
export interface SuppressionDirective {
|
|
48
|
+
/** Which of the three comment forms produced this directive. */
|
|
49
|
+
form: "chant-ignore" | "chant-ignore-file" | "chant-ignore-block";
|
|
50
|
+
/** Rule ids this directive names, or `"all"`. */
|
|
51
|
+
ids: SuppressionIds;
|
|
52
|
+
/** The `exp:YYYY-MM-DD` term, if present. */
|
|
53
|
+
expires?: string;
|
|
54
|
+
/** Source file the comment lives in. */
|
|
55
|
+
file: string;
|
|
56
|
+
/** 1-based line the comment ITSELF sits on (not the block it anchors to). */
|
|
57
|
+
line: number;
|
|
58
|
+
/**
|
|
59
|
+
* `chant-ignore-file` is only valid as the file's first non-blank line
|
|
60
|
+
* (tflint's own constraint on `tflint-ignore-file`, kept here so the form
|
|
61
|
+
* stays findable). A directive found elsewhere sets this instead of being
|
|
62
|
+
* applied; see `SUPPRESSION_MISPLACED_FILE_ID` below.
|
|
63
|
+
*/
|
|
64
|
+
misplaced?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Stable identity, for dedup across the several entities one directive can
|
|
67
|
+
* attach to. A file-level directive attaches to every entity parsed from
|
|
68
|
+
* its file, but an expired-or-misplaced report about it should appear once.
|
|
69
|
+
*/
|
|
70
|
+
key: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** An expired suppression is reported once as its own finding, not dropped. */
|
|
74
|
+
export const SUPPRESSION_EXPIRED_ID = "SUPP001";
|
|
75
|
+
/** A `chant-ignore-file` found anywhere but the first non-blank line. */
|
|
76
|
+
export const SUPPRESSION_MISPLACED_FILE_ID = "SUPP002";
|
|
77
|
+
/** A directive explicitly names a rule id configured `ignorable: false`. */
|
|
78
|
+
export const SUPPRESSION_UNIGNORABLE_ID = "SUPP003";
|
|
79
|
+
|
|
80
|
+
export type SuppressionMetaCheckId =
|
|
81
|
+
| typeof SUPPRESSION_EXPIRED_ID
|
|
82
|
+
| typeof SUPPRESSION_MISPLACED_FILE_ID
|
|
83
|
+
| typeof SUPPRESSION_UNIGNORABLE_ID;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A finding about the suppression mechanism itself, not about a rule id a
|
|
87
|
+
* check would normally report, so it deliberately does not go through the
|
|
88
|
+
* audit catalog: nothing here is registered as a `PostSynthCheck`, so it
|
|
89
|
+
* never needs a `RuleMeta` entry, a lineage entry, or a full page.
|
|
90
|
+
*/
|
|
91
|
+
export interface SuppressionMetaFinding {
|
|
92
|
+
checkId: SuppressionMetaCheckId;
|
|
93
|
+
severity: "warning";
|
|
94
|
+
message: string;
|
|
95
|
+
file: string;
|
|
96
|
+
line: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface InlineSuppressionResult {
|
|
100
|
+
/** Diagnostics after inline suppression, matched ones removed. */
|
|
101
|
+
diagnostics: PostSynthDiagnostic[];
|
|
102
|
+
/** Diagnostics an inline directive suppressed, unaltered (counted, never dropped silently). */
|
|
103
|
+
suppressed: PostSynthDiagnostic[];
|
|
104
|
+
/** Findings about the suppression mechanism itself: expired, misplaced, or denied by `ignorable: false`. */
|
|
105
|
+
meta: SuppressionMetaFinding[];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Read an entity's directives, if it carries any (duck-typed; see module doc). */
|
|
109
|
+
export function entitySuppressions(entity: Declarable | undefined): readonly SuppressionDirective[] {
|
|
110
|
+
if (!entity) return [];
|
|
111
|
+
const s = (entity as { suppressions?: unknown }).suppressions;
|
|
112
|
+
return Array.isArray(s) ? (s as SuppressionDirective[]) : [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Default is ignorable (per the issue); only an explicit `{ ignorable: false }` option denies it. */
|
|
116
|
+
function isIgnorable(rules: Record<string, RuleConfig> | undefined, id: string): boolean {
|
|
117
|
+
const cfg = rules?.[id];
|
|
118
|
+
if (!Array.isArray(cfg)) return true;
|
|
119
|
+
const options = cfg[1] as { ignorable?: boolean } | undefined;
|
|
120
|
+
return options?.ignorable !== false;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function namesId(ids: SuppressionIds, checkId: string): boolean {
|
|
124
|
+
return ids === "all" || ids.has(checkId);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function isExpired(expires: string | undefined, today: Date): boolean {
|
|
128
|
+
if (!expires) return false;
|
|
129
|
+
const parsed = new Date(`${expires}T00:00:00Z`);
|
|
130
|
+
if (Number.isNaN(parsed.getTime())) return false;
|
|
131
|
+
return parsed.getTime() < today.getTime();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Apply inline (`# chant-ignore*`) suppression to a set of post-synth
|
|
136
|
+
* diagnostics. `entities` is `ctx.entities`, the same map every
|
|
137
|
+
* `PostSynthContext` already carries. `rules` is the project's `lint.rules`,
|
|
138
|
+
* for `ignorable: false`; see this module's doc comment for why it is
|
|
139
|
+
* optional. `today` is injectable so an expiry test doesn't depend on the
|
|
140
|
+
* clock.
|
|
141
|
+
*/
|
|
142
|
+
export function applyInlineSuppressions(
|
|
143
|
+
diagnostics: readonly PostSynthDiagnostic[],
|
|
144
|
+
entities: Map<string, Declarable>,
|
|
145
|
+
rules?: Record<string, RuleConfig>,
|
|
146
|
+
today: Date = new Date(),
|
|
147
|
+
): InlineSuppressionResult {
|
|
148
|
+
const kept: PostSynthDiagnostic[] = [];
|
|
149
|
+
const suppressed: PostSynthDiagnostic[] = [];
|
|
150
|
+
const meta: SuppressionMetaFinding[] = [];
|
|
151
|
+
const reported = new Set<string>();
|
|
152
|
+
|
|
153
|
+
const reportMeta = (d: SuppressionDirective, checkId: SuppressionMetaCheckId, message: string): void => {
|
|
154
|
+
const dedupeKey = `${checkId}:${d.key}`;
|
|
155
|
+
if (reported.has(dedupeKey)) return;
|
|
156
|
+
reported.add(dedupeKey);
|
|
157
|
+
meta.push({ checkId, severity: "warning", file: d.file, line: d.line, message });
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// Expired and misplaced directives are findings on their own. They don't
|
|
161
|
+
// need a matching diagnostic to be worth reporting, so every directive
|
|
162
|
+
// attached to any entity is checked once here, deduplicated by its own
|
|
163
|
+
// identity (a directive attached to several entities, as a file-level one
|
|
164
|
+
// is, would otherwise be reported once per entity).
|
|
165
|
+
for (const entity of entities.values()) {
|
|
166
|
+
for (const d of entitySuppressions(entity)) {
|
|
167
|
+
if (d.misplaced) {
|
|
168
|
+
reportMeta(
|
|
169
|
+
d,
|
|
170
|
+
SUPPRESSION_MISPLACED_FILE_ID,
|
|
171
|
+
`chant-ignore-file at ${d.file}:${d.line} is not the first non-blank line of the file, so it has no effect. Move it to the top.`,
|
|
172
|
+
);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (isExpired(d.expires, today)) {
|
|
176
|
+
reportMeta(d, SUPPRESSION_EXPIRED_ID, `Suppression at ${d.file}:${d.line} expired ${d.expires} and no longer applies.`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
for (const diag of diagnostics) {
|
|
182
|
+
const entity = diag.entity ? entities.get(diag.entity) : undefined;
|
|
183
|
+
let matched: SuppressionDirective | undefined;
|
|
184
|
+
for (const d of entitySuppressions(entity)) {
|
|
185
|
+
if (d.misplaced) continue;
|
|
186
|
+
if (isExpired(d.expires, today)) continue;
|
|
187
|
+
if (!namesId(d.ids, diag.checkId)) continue;
|
|
188
|
+
if (d.ids !== "all" && !isIgnorable(rules, diag.checkId)) {
|
|
189
|
+
reportMeta(
|
|
190
|
+
d,
|
|
191
|
+
SUPPRESSION_UNIGNORABLE_ID,
|
|
192
|
+
`${diag.checkId} is configured \`ignorable: false\`; the ${d.form} at ${d.file}:${d.line} naming it has no effect.`,
|
|
193
|
+
);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
matched = d;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
if (matched) suppressed.push(diag);
|
|
200
|
+
else kept.push(diag);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return { diagnostics: kept, suppressed, meta };
|
|
204
|
+
}
|
package/src/live-endpoint.ts
CHANGED
|
@@ -42,7 +42,7 @@ import { emulatorsOf, endpointEnvVars, type EmulatorDeclaration } from "./op/emu
|
|
|
42
42
|
* The ambient endpoint vars a lexicon honors, from its emulator capability.
|
|
43
43
|
*
|
|
44
44
|
* A lexicon with no emulator contributes nothing, which is the same answer the
|
|
45
|
-
* hand-maintained map gave for k8s
|
|
45
|
+
* hand-maintained map gave for k8s and gcp — they resolve their live
|
|
46
46
|
* target from `chant.config` itself, so there is nothing to inject.
|
|
47
47
|
*/
|
|
48
48
|
export function endpointEnvVarsFor(lexicon: EndpointLexicon): string[] {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activity contracts for core's own `op/activities` (chant #1288
|
|
3
|
+
* Stage 1). Each contract's `args` schema mirrors the corresponding
|
|
4
|
+
* `*Args` interface in `./activities/*.ts` — kept alongside the
|
|
5
|
+
* implementation, the way the issue asked for, and validated by
|
|
6
|
+
* `chant build` via `tmp012` (the OPS012 activity-contract rule).
|
|
7
|
+
*
|
|
8
|
+
* Author `args` with `z.strictObject(...)`, never `z.object(...)`: the
|
|
9
|
+
* default form silently drops a key it doesn't recognize instead of
|
|
10
|
+
* rejecting it, which reproduces the exact bug this issue is about
|
|
11
|
+
* (`helmInstall("api", "./chart", { nameSpace: "prod" })` — the misspelled
|
|
12
|
+
* key vanishes rather than failing the build).
|
|
13
|
+
*
|
|
14
|
+
* Deliberately partial. Only activities with args simple enough for a zod
|
|
15
|
+
* mirror to earn its keep are covered here — `kubectlApply`/`helmInstall`/
|
|
16
|
+
* the cloud appliers carry a dozen-plus fields each with real cross-field
|
|
17
|
+
* logic (see `KubectlApplyArgs`, `HelmInstallArgs`), and forcing those
|
|
18
|
+
* through a duplicate schema is exactly the maintenance burden Stage 2
|
|
19
|
+
* (regenerating the step builders as fully typed wrappers) is meant to
|
|
20
|
+
* avoid by deriving types instead of restating them. A step calling an
|
|
21
|
+
* activity with no registered contract here is skipped by `tmp012`, not
|
|
22
|
+
* flagged — see `activityContract`'s doc in `../activity-contract` for why
|
|
23
|
+
* that's the intended, non-breaking default.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { z } from "zod";
|
|
27
|
+
import { activityContract } from "../activity-contract";
|
|
28
|
+
|
|
29
|
+
export const lifecycleSnapshotContract = activityContract(
|
|
30
|
+
"lifecycleSnapshot",
|
|
31
|
+
z.strictObject({ env: z.string() }),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
export const lifecycleDiffContract = activityContract(
|
|
35
|
+
"lifecycleDiff",
|
|
36
|
+
z.strictObject({ env: z.string(), live: z.boolean().optional() }),
|
|
37
|
+
z.object({ output: z.string(), exitCode: z.number(), drifted: z.boolean() }),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
export const shellCmdContract = activityContract(
|
|
41
|
+
"shellCmd",
|
|
42
|
+
z.strictObject({ cmd: z.string(), env: z.record(z.string(), z.string()).optional(), cwd: z.string().optional() }),
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
export const httpCheckContract = activityContract(
|
|
46
|
+
"httpCheck",
|
|
47
|
+
z.strictObject({
|
|
48
|
+
url: z.string(),
|
|
49
|
+
method: z.string().optional(),
|
|
50
|
+
status: z.number().optional(),
|
|
51
|
+
contains: z.string().optional(),
|
|
52
|
+
retries: z.number().optional(),
|
|
53
|
+
intervalMs: z.number().optional(),
|
|
54
|
+
}),
|
|
55
|
+
z.object({ status: z.number() }),
|
|
56
|
+
// The check's effect is entity-scoped (#2022): `url` names the service the
|
|
57
|
+
// step probes, so op.json resolves it into the step's `entities` — the join
|
|
58
|
+
// a renderer draws to the estate node it targets. The scope-ish args
|
|
59
|
+
// (retries, interval) stay mechanics.
|
|
60
|
+
{ entities: ["url"] },
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
export const chantTeardownContract = activityContract(
|
|
64
|
+
"chantTeardown",
|
|
65
|
+
z.strictObject({ path: z.string() }),
|
|
66
|
+
);
|