@intentius/chant 0.124.51 → 0.124.54
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/discover.d.ts.map +1 -1
- package/dist/audit/discover.js +3 -1
- package/dist/behaviour.d.ts +1 -1
- package/dist/behaviour.d.ts.map +1 -1
- package/dist/capabilities/templates.d.ts +65 -0
- package/dist/capabilities/templates.d.ts.map +1 -0
- package/dist/capabilities/templates.js +193 -0
- package/dist/capabilities/templates.json +145 -0
- package/dist/change-set-graph.d.ts +35 -3
- package/dist/change-set-graph.d.ts.map +1 -1
- package/dist/change-set-graph.js +60 -9
- package/dist/change-set.d.ts +65 -7
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +23 -12
- package/dist/ci-identity.d.ts +7 -2
- package/dist/ci-identity.d.ts.map +1 -1
- package/dist/ci-identity.js +4 -1
- package/dist/cli/commands/import-index.d.ts +52 -0
- package/dist/cli/commands/import-index.d.ts.map +1 -0
- package/dist/cli/commands/import-index.js +226 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +4 -2
- package/dist/cli/handlers/components.d.ts.map +1 -1
- package/dist/cli/handlers/components.js +11 -2
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +16 -3
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +22 -4
- package/dist/cli/handlers/index-cloud.d.ts +14 -0
- package/dist/cli/handlers/index-cloud.d.ts.map +1 -0
- package/dist/cli/handlers/index-cloud.js +22 -0
- package/dist/cli/handlers/index-diff.d.ts +18 -0
- package/dist/cli/handlers/index-diff.d.ts.map +1 -0
- package/dist/cli/handlers/index-diff.js +142 -0
- package/dist/cli/handlers/lifecycle-drift.d.ts +25 -0
- package/dist/cli/handlers/lifecycle-drift.d.ts.map +1 -0
- package/dist/cli/handlers/lifecycle-drift.js +64 -0
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.js +188 -28
- package/dist/cli/handlers/misc.d.ts +9 -0
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/misc.js +77 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +17 -3
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +89 -15
- package/dist/cli/handlers/query.d.ts.map +1 -1
- package/dist/cli/handlers/query.js +28 -4
- package/dist/cli/handlers/scenario.d.ts.map +1 -1
- package/dist/cli/handlers/scenario.js +8 -7
- package/dist/cli/handlers/search.d.ts +34 -4
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +216 -36
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +55 -1
- package/dist/cli/mcp/lifecycle-tools.d.ts.map +1 -1
- package/dist/cli/mcp/lifecycle-tools.js +3 -2
- package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
- package/dist/cli/mcp/resource-handlers.js +4 -3
- package/dist/cli/mcp/workspace-tools.js +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +55 -2
- package/dist/cli/registry.d.ts +19 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cloud-lister/aws.d.ts +35 -0
- package/dist/cloud-lister/aws.d.ts.map +1 -0
- package/dist/cloud-lister/aws.js +203 -0
- package/dist/cloud-lister/azure.d.ts +34 -0
- package/dist/cloud-lister/azure.d.ts.map +1 -0
- package/dist/cloud-lister/azure.js +129 -0
- package/dist/cloud-lister/common.d.ts +40 -0
- package/dist/cloud-lister/common.d.ts.map +1 -0
- package/dist/cloud-lister/common.js +83 -0
- package/dist/cloud-lister/credentials.d.ts +50 -0
- package/dist/cloud-lister/credentials.d.ts.map +1 -0
- package/dist/cloud-lister/credentials.js +86 -0
- package/dist/cloud-lister/fakes.d.ts +27 -0
- package/dist/cloud-lister/fakes.d.ts.map +1 -0
- package/dist/cloud-lister/fakes.js +50 -0
- package/dist/cloud-lister/gcp.d.ts +42 -0
- package/dist/cloud-lister/gcp.d.ts.map +1 -0
- package/dist/cloud-lister/gcp.js +143 -0
- package/dist/cloud-lister/guard.d.ts +49 -0
- package/dist/cloud-lister/guard.d.ts.map +1 -0
- package/dist/cloud-lister/guard.js +103 -0
- package/dist/cloud-lister/ids.d.ts +23 -0
- package/dist/cloud-lister/ids.d.ts.map +1 -0
- package/dist/cloud-lister/ids.js +42 -0
- package/dist/cloud-lister/index.d.ts +67 -0
- package/dist/cloud-lister/index.d.ts.map +1 -0
- package/dist/cloud-lister/index.js +102 -0
- package/dist/cloud-lister/kubernetes.d.ts +64 -0
- package/dist/cloud-lister/kubernetes.d.ts.map +1 -0
- package/dist/cloud-lister/kubernetes.js +276 -0
- package/dist/cloud-lister/markers.d.ts +31 -0
- package/dist/cloud-lister/markers.d.ts.map +1 -0
- package/dist/cloud-lister/markers.js +73 -0
- package/dist/cloud-lister/mask.d.ts +31 -0
- package/dist/cloud-lister/mask.d.ts.map +1 -0
- package/dist/cloud-lister/mask.js +74 -0
- package/dist/cloud-lister/sigv4.d.ts +29 -0
- package/dist/cloud-lister/sigv4.d.ts.map +1 -0
- package/dist/cloud-lister/sigv4.js +54 -0
- package/dist/cloud-lister/transport.d.ts +55 -0
- package/dist/cloud-lister/transport.d.ts.map +1 -0
- package/dist/cloud-lister/transport.js +86 -0
- package/dist/cloud-lister/types.d.ts +121 -0
- package/dist/cloud-lister/types.d.ts.map +1 -0
- package/dist/cloud-lister/types.js +24 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.js +6 -0
- package/dist/components/capability-plugin.d.ts +9 -0
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/capability.d.ts +224 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/cli-support.d.ts +21 -0
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +58 -14
- package/dist/components/covered-round.d.ts +173 -0
- package/dist/components/covered-round.d.ts.map +1 -0
- package/dist/components/covered-round.js +200 -0
- package/dist/components/declared-reads.d.ts +38 -0
- package/dist/components/declared-reads.d.ts.map +1 -0
- package/dist/components/declared-reads.js +131 -0
- package/dist/components/deploy-units.d.ts.map +1 -1
- package/dist/components/deploy-units.js +4 -0
- package/dist/components/driver.d.ts +42 -1
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +74 -3
- package/dist/components/fan-out-run.d.ts +23 -1
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +82 -14
- package/dist/components/fan-out-support.d.ts +6 -0
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/fan-out-support.js +4 -1
- package/dist/components/fan-out.d.ts +28 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/groups.d.ts +229 -0
- package/dist/components/groups.d.ts.map +1 -0
- package/dist/components/groups.js +760 -0
- package/dist/components/index.d.ts +7 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -0
- package/dist/components/plan-shape-conformance.d.ts +48 -0
- package/dist/components/plan-shape-conformance.d.ts.map +1 -0
- package/dist/components/plan-shape-conformance.js +122 -0
- package/dist/components/pr-run.d.ts +62 -7
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +354 -53
- package/dist/components/promote-rounds.d.ts +9 -0
- package/dist/components/promote-rounds.d.ts.map +1 -1
- package/dist/components/promote-rounds.js +23 -2
- package/dist/components/promote.d.ts +17 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +36 -6
- package/dist/components/release-gate.d.ts +23 -1
- package/dist/components/release-gate.d.ts.map +1 -1
- package/dist/components/release-gate.js +97 -33
- package/dist/components/run-groups.d.ts +58 -0
- package/dist/components/run-groups.d.ts.map +1 -0
- package/dist/components/run-groups.js +78 -0
- package/dist/components/starter-plugin.d.ts +1 -0
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/starter-plugin.js +6 -1
- package/dist/components/verbs/index.d.ts +1 -0
- package/dist/components/verbs/index.d.ts.map +1 -1
- package/dist/components/verbs/index.js +1 -0
- package/dist/components/verbs/member-outputs.d.ts +187 -0
- package/dist/components/verbs/member-outputs.d.ts.map +1 -0
- package/dist/components/verbs/member-outputs.js +218 -0
- package/dist/components/wave-plan.d.ts +2 -0
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +4 -1
- package/dist/config.d.ts +60 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -0
- package/dist/deep-observation.d.ts +1 -13
- package/dist/deep-observation.d.ts.map +1 -1
- package/dist/deep-observation.js +5 -22
- package/dist/drift-record.d.ts +542 -0
- package/dist/drift-record.d.ts.map +1 -0
- package/dist/drift-record.js +886 -0
- package/dist/engine-facts.d.ts +144 -0
- package/dist/engine-facts.d.ts.map +1 -0
- package/dist/engine-facts.js +14 -0
- package/dist/graph-ir.d.ts +153 -2
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-ir.js +224 -6
- package/dist/graph-refs.d.ts +145 -0
- package/dist/graph-refs.d.ts.map +1 -1
- package/dist/graph-refs.js +305 -0
- package/dist/graph-schema/fixtures/adopt.json +15 -0
- package/dist/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
- package/dist/graph-schema/fixtures/index.json +68 -0
- package/dist/graph-schema/fixtures/plunge.engine-graph.json +158 -0
- package/dist/graph-schema/fixtures.d.ts +23 -0
- package/dist/graph-schema/fixtures.d.ts.map +1 -0
- package/dist/graph-schema/fixtures.js +246 -0
- package/dist/graph-schema/generate.d.ts +15 -0
- package/dist/graph-schema/generate.d.ts.map +1 -0
- package/dist/graph-schema/generate.js +267 -0
- package/dist/graph-schema/graph.schema.json +1387 -0
- package/dist/health.schema.json +2 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/instance-nodes.d.ts +159 -0
- package/dist/instance-nodes.d.ts.map +1 -0
- package/dist/instance-nodes.js +231 -0
- package/dist/lexicon.d.ts +72 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/adoption-file.d.ts +56 -0
- package/dist/lifecycle/adoption-file.d.ts.map +1 -0
- package/dist/lifecycle/adoption-file.js +123 -0
- package/dist/lifecycle/cloud-index.d.ts +186 -0
- package/dist/lifecycle/cloud-index.d.ts.map +1 -0
- package/dist/lifecycle/cloud-index.js +618 -0
- package/dist/lifecycle/derive-edges.d.ts +59 -0
- package/dist/lifecycle/derive-edges.d.ts.map +1 -0
- package/dist/lifecycle/derive-edges.js +126 -0
- package/dist/lifecycle/git.d.ts +10 -9
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/git.js +7 -1
- package/dist/lifecycle/identity-match.d.ts +133 -0
- package/dist/lifecycle/identity-match.d.ts.map +1 -0
- package/dist/lifecycle/identity-match.js +147 -0
- package/dist/lifecycle/index-diff.d.ts +224 -0
- package/dist/lifecycle/index-diff.d.ts.map +1 -0
- package/dist/lifecycle/index-diff.js +327 -0
- package/dist/lifecycle/index-document.d.ts +130 -0
- package/dist/lifecycle/index-document.d.ts.map +1 -0
- package/dist/lifecycle/index-document.js +189 -0
- package/dist/lifecycle/index-drift.d.ts +121 -0
- package/dist/lifecycle/index-drift.d.ts.map +1 -0
- package/dist/lifecycle/index-drift.js +178 -0
- package/dist/lifecycle/index-import.d.ts +168 -0
- package/dist/lifecycle/index-import.d.ts.map +1 -0
- package/dist/lifecycle/index-import.js +515 -0
- package/dist/lifecycle/index-join.d.ts +129 -0
- package/dist/lifecycle/index-join.d.ts.map +1 -0
- package/dist/lifecycle/index-join.js +248 -0
- package/dist/lifecycle/index.d.ts +4 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +4 -0
- package/dist/lifecycle/observation-baseline.d.ts +61 -21
- package/dist/lifecycle/observation-baseline.d.ts.map +1 -1
- package/dist/lifecycle/observation-baseline.js +144 -19
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/observe.js +6 -1
- package/dist/lifecycle/query.d.ts +45 -4
- package/dist/lifecycle/query.d.ts.map +1 -1
- package/dist/lifecycle/query.js +89 -7
- package/dist/lifecycle/replay.d.ts +10 -3
- package/dist/lifecycle/replay.d.ts.map +1 -1
- package/dist/lifecycle/replay.js +10 -6
- package/dist/lifecycle/scenario.d.ts +4 -3
- package/dist/lifecycle/scenario.d.ts.map +1 -1
- package/dist/lifecycle/snapshot-store-fake.d.ts +9 -0
- package/dist/lifecycle/snapshot-store-fake.d.ts.map +1 -0
- package/dist/lifecycle/snapshot-store-fake.js +21 -0
- package/dist/lifecycle/snapshot-store-s3.d.ts +102 -0
- package/dist/lifecycle/snapshot-store-s3.d.ts.map +1 -0
- package/dist/lifecycle/snapshot-store-s3.js +254 -0
- package/dist/lifecycle/snapshot-store.d.ts +170 -0
- package/dist/lifecycle/snapshot-store.d.ts.map +1 -0
- package/dist/lifecycle/snapshot-store.js +832 -0
- package/dist/lifecycle/snapshot.d.ts +11 -0
- package/dist/lifecycle/snapshot.d.ts.map +1 -1
- package/dist/lifecycle/snapshot.js +18 -5
- package/dist/lifecycle/type-listing.d.ts +148 -0
- package/dist/lifecycle/type-listing.d.ts.map +1 -0
- package/dist/lifecycle/type-listing.js +166 -0
- package/dist/lint/component-checks.d.ts +15 -1
- package/dist/lint/component-checks.d.ts.map +1 -1
- package/dist/lint/component-checks.js +1 -0
- package/dist/lint/presets/relaxed.json +2 -1
- package/dist/lint/presets/strict.json +2 -1
- package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.js +13 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.js +8 -0
- package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts +33 -0
- package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp008-applies-signal-only-root.js +123 -0
- package/dist/lint/rules/comp/index.d.ts +2 -1
- package/dist/lint/rules/comp/index.d.ts.map +1 -1
- package/dist/lint/rules/comp/index.js +4 -1
- package/dist/observation.d.ts +19 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +18 -1
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +1 -1
- package/dist/op/activities/change-set.d.ts +6 -4
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +4 -2
- package/dist/op/activity-failure.d.ts +27 -0
- package/dist/op/activity-failure.d.ts.map +1 -1
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/index.d.ts +2 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +5 -1
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +22 -8
- package/dist/pr-loop.d.ts +92 -3
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +62 -3
- package/dist/pulumi-urn.d.ts +101 -0
- package/dist/pulumi-urn.d.ts.map +1 -0
- package/dist/pulumi-urn.js +131 -0
- package/dist/release-floors.d.ts +23 -0
- package/dist/release-floors.d.ts.map +1 -0
- package/dist/release-floors.js +22 -0
- package/dist/sensitive-key.d.ts +23 -0
- package/dist/sensitive-key.d.ts.map +1 -0
- package/dist/sensitive-key.js +31 -0
- package/dist/wave-runtime.mjs +234 -234
- package/dist/workspace/adoption-report.d.ts +53 -0
- package/dist/workspace/adoption-report.d.ts.map +1 -0
- package/dist/workspace/adoption-report.js +76 -0
- package/dist/workspace/capabilities-contract.d.ts +7 -0
- package/dist/workspace/capabilities-contract.d.ts.map +1 -1
- package/dist/workspace/capabilities-contract.js +2 -1
- package/dist/workspace/capabilities.schema.json +98 -0
- package/dist/workspace/change-set.schema.json +42 -3
- package/dist/workspace/ci-cloud-identity.d.ts +13 -1
- package/dist/workspace/ci-cloud-identity.d.ts.map +1 -1
- package/dist/workspace/ci-cloud-identity.js +30 -1
- package/dist/workspace/compose-graph.d.ts +10 -1
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/compose-graph.js +6 -1
- package/dist/workspace/conformance/index.d.ts +1 -1
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/index.js +6 -1
- package/dist/workspace/drift-cli.d.ts +81 -0
- package/dist/workspace/drift-cli.d.ts.map +1 -0
- package/dist/workspace/drift-cli.js +317 -0
- package/dist/workspace/drift.schema.json +672 -0
- package/dist/workspace/graph-cli.d.ts +2 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +3 -0
- package/dist/workspace/graph.schema.json +72 -0
- package/dist/workspace/init.d.ts +5 -1
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/init.js +55 -9
- package/dist/workspace/ledger.schema.json +1 -1
- package/dist/workspace/nested-graph.d.ts.map +1 -1
- package/dist/workspace/nested-graph.js +2 -0
- package/dist/workspace/pr-report.schema.json +76 -3
- package/dist/workspace/promote-waves.d.ts +112 -0
- package/dist/workspace/promote-waves.d.ts.map +1 -0
- package/dist/workspace/promote-waves.js +290 -0
- package/dist/workspace/promote.d.ts +84 -2
- package/dist/workspace/promote.d.ts.map +1 -1
- package/dist/workspace/promote.js +347 -61
- package/dist/workspace/reason-codes.d.ts +12 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +14 -0
- package/dist/workspace/search-contract.d.ts +3 -3
- package/dist/workspace/search-contract.d.ts.map +1 -1
- package/dist/workspace/search-contract.js +2 -0
- package/dist/workspace/search.schema.json +103 -5
- package/package.json +14 -1
- package/src/__fixtures__/drift-record/README.md +58 -0
- package/src/__fixtures__/drift-record/choudoufu-cone.ndjson +4 -0
- package/src/__fixtures__/drift-record/choudoufu-resource.ndjson +3 -0
- package/src/__fixtures__/drift-record/component-status-ledger.json +65 -0
- package/src/__fixtures__/drift-record/component-status.json +91 -0
- package/src/__fixtures__/drift-record/deep-diff.json +259 -0
- package/src/__fixtures__/drift-record/lifecycle-diff-live.json +825 -0
- package/src/__fixtures__/drift-record/live-diff.json +125 -0
- package/src/audit/discover.e2e.test.ts +14 -0
- package/src/audit/discover.ts +3 -1
- package/src/behaviour.ts +1 -1
- package/src/capabilities/templates.json +145 -0
- package/src/capabilities/templates.test.ts +212 -0
- package/src/capabilities/templates.ts +204 -0
- package/src/change-set-bundle.test.ts +83 -0
- package/src/change-set-graph.ts +80 -9
- package/src/change-set.test.ts +24 -0
- package/src/change-set.ts +77 -14
- package/src/ci-identity-targets.test.ts +23 -0
- package/src/ci-identity.ts +10 -4
- package/src/cli/commands/import-index.test.ts +117 -0
- package/src/cli/commands/import-index.ts +265 -0
- package/src/cli/commands/lint.ts +4 -2
- package/src/cli/handlers/components.test.ts +9 -0
- package/src/cli/handlers/components.ts +12 -2
- package/src/cli/handlers/fan-out.ts +17 -3
- package/src/cli/handlers/graph.test.ts +42 -0
- package/src/cli/handlers/graph.ts +26 -4
- package/src/cli/handlers/index-cloud.ts +32 -0
- package/src/cli/handlers/index-diff.test.ts +68 -0
- package/src/cli/handlers/index-diff.ts +146 -0
- package/src/cli/handlers/ledger-root-member.test.ts +161 -0
- package/src/cli/handlers/lifecycle-drift.ts +68 -0
- package/src/cli/handlers/lifecycle.test.ts +33 -11
- package/src/cli/handlers/lifecycle.ts +205 -30
- package/src/cli/handlers/misc.ts +73 -0
- package/src/cli/handlers/pr-waves-blocked.test.ts +37 -2
- package/src/cli/handlers/pr.ts +16 -3
- package/src/cli/handlers/promote.test.ts +64 -0
- package/src/cli/handlers/promote.ts +81 -6
- package/src/cli/handlers/query.ts +27 -4
- package/src/cli/handlers/run-declared-reads-cli.test.ts +187 -0
- package/src/cli/handlers/run-groups-cli.test.ts +229 -0
- package/src/cli/handlers/scenario.test.ts +13 -0
- package/src/cli/handlers/scenario.ts +8 -7
- package/src/cli/handlers/search-index.test.ts +255 -0
- package/src/cli/handlers/search-json.test.ts +1 -1
- package/src/cli/handlers/search-ownership.test.ts +194 -0
- package/src/cli/handlers/search.ts +271 -38
- package/src/cli/main.test.ts +7 -0
- package/src/cli/main.ts +56 -1
- package/src/cli/mcp/lifecycle-tools.ts +3 -2
- package/src/cli/mcp/resource-handlers.ts +4 -3
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/cli/parse-args.ts +40 -2
- package/src/cli/registry.ts +19 -1
- package/src/cloud-lister/aws.test.ts +202 -0
- package/src/cloud-lister/aws.ts +226 -0
- package/src/cloud-lister/azure.test.ts +132 -0
- package/src/cloud-lister/azure.ts +142 -0
- package/src/cloud-lister/common.ts +115 -0
- package/src/cloud-lister/credentials.ts +110 -0
- package/src/cloud-lister/fakes.ts +66 -0
- package/src/cloud-lister/gcp.test.ts +121 -0
- package/src/cloud-lister/gcp.ts +159 -0
- package/src/cloud-lister/guard.test.ts +198 -0
- package/src/cloud-lister/guard.ts +111 -0
- package/src/cloud-lister/ids.ts +54 -0
- package/src/cloud-lister/index.ts +134 -0
- package/src/cloud-lister/kubernetes.test.ts +160 -0
- package/src/cloud-lister/kubernetes.ts +284 -0
- package/src/cloud-lister/markers.ts +74 -0
- package/src/cloud-lister/mask.ts +77 -0
- package/src/cloud-lister/shape.test.ts +81 -0
- package/src/cloud-lister/sigv4.ts +70 -0
- package/src/cloud-lister/transport.ts +118 -0
- package/src/cloud-lister/types.ts +135 -0
- package/src/components/capability-plugin-loader.ts +4 -0
- package/src/components/capability-plugin.ts +10 -0
- package/src/components/capability.ts +238 -0
- package/src/components/cli-support.ts +70 -14
- package/src/components/covered-round.test.ts +166 -0
- package/src/components/covered-round.ts +293 -0
- package/src/components/declared-reads.test.ts +103 -0
- package/src/components/declared-reads.ts +134 -0
- package/src/components/deploy-units.ts +4 -0
- package/src/components/driver.ts +101 -4
- package/src/components/fan-out-run.ts +95 -15
- package/src/components/fan-out-support.ts +10 -1
- package/src/components/fan-out.ts +30 -0
- package/src/components/groups.test.ts +320 -0
- package/src/components/groups.ts +880 -0
- package/src/components/index.ts +59 -0
- package/src/components/plan-shape-conformance.ts +130 -0
- package/src/components/pr-env-run-bundle.test.ts +2 -0
- package/src/components/pr-run.test.ts +728 -4
- package/src/components/pr-run.ts +395 -55
- package/src/components/promote-rounds.ts +25 -2
- package/src/components/promote.ts +55 -5
- package/src/components/registry.test.ts +1 -1
- package/src/components/release-gate.ts +115 -30
- package/src/components/release-groups.test.ts +362 -0
- package/src/components/run-groups.ts +113 -0
- package/src/components/starter-plugin.ts +6 -0
- package/src/components/verbs/index.ts +1 -0
- package/src/components/verbs/member-outputs.test.ts +205 -0
- package/src/components/verbs/member-outputs.ts +308 -0
- package/src/components/wave-plan.ts +5 -2
- package/src/config.ts +44 -0
- package/src/deep-observation.ts +5 -23
- package/src/drift-record.test.ts +596 -0
- package/src/drift-record.ts +1206 -0
- package/src/engine-facts.guard.test.ts +111 -0
- package/src/engine-facts.test.ts +178 -0
- package/src/engine-facts.ts +154 -0
- package/src/gated-waves-bundle.test.ts +2 -0
- package/src/graph-ir-live.test.ts +92 -0
- package/src/graph-ir.ts +317 -7
- package/src/graph-refs.ts +416 -0
- package/src/graph-schema/fixtures/adopt.json +15 -0
- package/src/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
- package/src/graph-schema/fixtures/index.json +68 -0
- package/src/graph-schema/fixtures/plunge.engine-graph.json +158 -0
- package/src/graph-schema/fixtures.ts +267 -0
- package/src/graph-schema/generate.ts +263 -0
- package/src/graph-schema/graph-schema.test.ts +153 -0
- package/src/graph-schema/graph.schema.json +1387 -0
- package/src/health.schema.json +2 -1
- package/src/identity.ts +2 -0
- package/src/index.ts +2 -0
- package/src/instance-nodes.ts +288 -0
- package/src/lexicon.ts +76 -0
- package/src/lifecycle/__fixtures__/index-diff/20261026T120000Z-aaaaaaaaaaaa.json +149 -0
- package/src/lifecycle/__fixtures__/index-diff/20261026T130000Z-bbbbbbbbbbbb.json +127 -0
- package/src/lifecycle/adoption-file.test.ts +100 -0
- package/src/lifecycle/adoption-file.ts +154 -0
- package/src/lifecycle/cloud-index.test.ts +517 -0
- package/src/lifecycle/cloud-index.ts +736 -0
- package/src/lifecycle/derive-edges.test.ts +193 -0
- package/src/lifecycle/derive-edges.ts +182 -0
- package/src/lifecycle/git.ts +10 -4
- package/src/lifecycle/identity-match.test.ts +308 -0
- package/src/lifecycle/identity-match.ts +257 -0
- package/src/lifecycle/index-diff.test.ts +198 -0
- package/src/lifecycle/index-diff.ts +476 -0
- package/src/lifecycle/index-document.test.ts +64 -0
- package/src/lifecycle/index-document.ts +299 -0
- package/src/lifecycle/index-drift.test.ts +191 -0
- package/src/lifecycle/index-drift.ts +304 -0
- package/src/lifecycle/index-import.test.ts +255 -0
- package/src/lifecycle/index-import.ts +634 -0
- package/src/lifecycle/index-join.test.ts +250 -0
- package/src/lifecycle/index-join.ts +304 -0
- package/src/lifecycle/index-store-load-bearing.test.ts +187 -0
- package/src/lifecycle/index.ts +4 -0
- package/src/lifecycle/member-ledger.test.ts +25 -7
- package/src/lifecycle/observation-baseline.test.ts +72 -1
- package/src/lifecycle/observation-baseline.ts +190 -27
- package/src/lifecycle/observe.ts +6 -1
- package/src/lifecycle/query.test.ts +69 -1
- package/src/lifecycle/query.ts +103 -10
- package/src/lifecycle/replay.test.ts +9 -5
- package/src/lifecycle/replay.ts +9 -5
- package/src/lifecycle/scenario.ts +4 -3
- package/src/lifecycle/snapshot-store-fake.ts +29 -0
- package/src/lifecycle/snapshot-store-s3.ts +316 -0
- package/src/lifecycle/snapshot-store.test.ts +385 -0
- package/src/lifecycle/snapshot-store.ts +981 -0
- package/src/lifecycle/snapshot.test.ts +13 -0
- package/src/lifecycle/snapshot.ts +23 -6
- package/src/lifecycle/type-listing.test.ts +166 -0
- package/src/lifecycle/type-listing.ts +309 -0
- package/src/lint/component-checks.ts +17 -1
- package/src/lint/config.test.ts +3 -0
- package/src/lint/presets/relaxed.json +2 -1
- package/src/lint/presets/strict.json +2 -1
- package/src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts +15 -0
- package/src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts +10 -0
- package/src/lint/rules/comp/comp.test.ts +2 -1
- package/src/lint/rules/comp/comp008-applies-signal-only-root.ts +121 -0
- package/src/lint/rules/comp/comp008.test.ts +77 -0
- package/src/lint/rules/comp/index.ts +4 -1
- package/src/observation-edges.test.ts +33 -0
- package/src/observation.ts +36 -1
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +8 -5
- package/src/op/activity-failure.ts +36 -0
- package/src/op/index.ts +2 -1
- package/src/op/local-executor.test.ts +80 -0
- package/src/op/local-executor.ts +27 -9
- package/src/pr-loop-bundle.test.ts +5 -2
- package/src/pr-loop.test.ts +57 -1
- package/src/pr-loop.ts +154 -6
- package/src/pulumi-urn.ts +151 -0
- package/src/release-floors.ts +22 -0
- package/src/sensitive-key.ts +34 -0
- package/src/workspace/adoption-report.test.ts +61 -0
- package/src/workspace/adoption-report.ts +103 -0
- package/src/workspace/capabilities-contract.test.ts +4 -0
- package/src/workspace/capabilities-contract.ts +9 -1
- package/src/workspace/capabilities.schema.json +98 -0
- package/src/workspace/change-set.schema.json +42 -3
- package/src/workspace/ci-cloud-identity.ts +31 -1
- package/src/workspace/compose-graph.test.ts +12 -0
- package/src/workspace/compose-graph.ts +12 -1
- package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
- package/src/workspace/conformance/index.ts +6 -1
- package/src/workspace/drift-cli.test.ts +65 -0
- package/src/workspace/drift-cli.ts +365 -0
- package/src/workspace/drift.schema.json +672 -0
- package/src/workspace/graph-cli.ts +5 -0
- package/src/workspace/graph.schema.json +72 -0
- package/src/workspace/init.test.ts +38 -1
- package/src/workspace/init.ts +50 -8
- package/src/workspace/intent-gaps.test.ts +18 -2
- package/src/workspace/ledger.schema.json +1 -1
- package/src/workspace/nested-graph.ts +1 -0
- package/src/workspace/pr-report.schema.json +76 -3
- package/src/workspace/promote-waves.test.ts +296 -0
- package/src/workspace/promote-waves.ts +340 -0
- package/src/workspace/promote.test.ts +158 -4
- package/src/workspace/promote.ts +398 -57
- package/src/workspace/reason-codes.test.ts +4 -1
- package/src/workspace/reason-codes.ts +14 -0
- package/src/workspace/search-contract.ts +2 -0
- package/src/workspace/search.schema.json +103 -5
|
@@ -5,11 +5,20 @@
|
|
|
5
5
|
import type { ObservationLexicon } from "../lexicon.js";
|
|
6
6
|
import type { BuildResult } from "../build.js";
|
|
7
7
|
import type { LifecycleSnapshot } from "./types.js";
|
|
8
|
+
import { type SnapshotStore, type StorePublish } from "./snapshot-store.js";
|
|
8
9
|
export interface TakeSnapshotResult {
|
|
9
10
|
snapshots: LifecycleSnapshot[];
|
|
11
|
+
/** The version the last write made: a commit on a git store, an object version on s3. Empty when nothing was written. */
|
|
10
12
|
commit: string;
|
|
11
13
|
warnings: string[];
|
|
12
14
|
errors: string[];
|
|
15
|
+
/** Where the snapshots went (`refs/chant/snapshots`, a directory, `s3://...`), and whether they were kept (#4519). */
|
|
16
|
+
store?: {
|
|
17
|
+
kind: SnapshotStore["kind"];
|
|
18
|
+
where: string;
|
|
19
|
+
written: boolean;
|
|
20
|
+
publish?: StorePublish;
|
|
21
|
+
};
|
|
13
22
|
}
|
|
14
23
|
/**
|
|
15
24
|
* Take state snapshots for all plugins that implement describeResources.
|
|
@@ -23,5 +32,7 @@ export declare function takeSnapshot(environment: string, plugins: ObservationLe
|
|
|
23
32
|
/** Kinds the PROJECT manages, not just this stack — a region whose stack
|
|
24
33
|
* declares no security group still has a default one (#1278). */
|
|
25
34
|
ambientKinds?: string[];
|
|
35
|
+
/** The index store to write to (#4519). Default: the project's, from `snapshots` in chant.config.ts. */
|
|
36
|
+
store?: SnapshotStore;
|
|
26
37
|
}): Promise<TakeSnapshotResult>;
|
|
27
38
|
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/lifecycle/snapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAsC,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/lifecycle/snapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAsC,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAMnE,OAAO,EAAwB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4D/F,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,yHAAyH;IACzH,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sHAAsH;IACtH,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CAClG;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,kBAAkB,EAAE,EAC7B,WAAW,EAAE,WAAW,EACxB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;qEACiE;IACjE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,wGAAwG;IACxG,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAiO7B"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { observeDeep } from "./deep-observe.js";
|
|
2
2
|
import { computeBuildDigest } from "./digest.js";
|
|
3
3
|
import { collectDependencies, collectAmbient } from "./observe.js";
|
|
4
|
-
import {
|
|
4
|
+
import { snapshotStorageKey, getHeadCommit } from "./git.js";
|
|
5
|
+
import { resolveSnapshotStore } from "./snapshot-store.js";
|
|
5
6
|
import { sortedJsonReplacer } from "../utils.js";
|
|
6
7
|
import { formatUnobserved, normalizeObservation, unobservedAll } from "../observation.js";
|
|
7
8
|
// One list of secret-bearing property names for both observation depths
|
|
@@ -220,20 +221,32 @@ export async function takeSnapshot(environment, plugins, buildResult, opts) {
|
|
|
220
221
|
}
|
|
221
222
|
}
|
|
222
223
|
}
|
|
223
|
-
// Write
|
|
224
|
+
// Write every successful snapshot through the index store (#4519). Masking
|
|
225
|
+
// already happened above, so the store never sees a secret.
|
|
226
|
+
const store = opts?.store ?? (await resolveSnapshotStore({ cwd: opts?.cwd }));
|
|
224
227
|
let commitSha = "";
|
|
228
|
+
let written = false;
|
|
225
229
|
for (const snapshot of snapshots) {
|
|
226
230
|
const json = JSON.stringify(snapshot, sortedJsonReplacer, 2);
|
|
227
|
-
|
|
231
|
+
const result = await store.write(snapshot.environment, snapshotStorageKey(snapshot.lexicon, snapshot.stack), json, opts?.cwd ? { cwd: opts.cwd } : undefined);
|
|
232
|
+
if (result.written) {
|
|
233
|
+
written = true;
|
|
234
|
+
commitSha = result.version ?? commitSha;
|
|
235
|
+
}
|
|
236
|
+
else if (result.reason) {
|
|
237
|
+
warnings.push(`${snapshot.lexicon}: snapshot not kept: ${result.reason}`);
|
|
238
|
+
}
|
|
228
239
|
}
|
|
229
240
|
// Push to remote
|
|
230
|
-
|
|
231
|
-
|
|
241
|
+
const publish = written ? await store.publish() : undefined;
|
|
242
|
+
if (publish && (publish.status === "stale" || publish.status === "failed")) {
|
|
243
|
+
warnings.push(`snapshot kept locally in ${store.where}, not pushed: ${publish.detail ?? publish.status}`);
|
|
232
244
|
}
|
|
233
245
|
return {
|
|
234
246
|
snapshots,
|
|
235
247
|
commit: commitSha,
|
|
236
248
|
warnings,
|
|
237
249
|
errors,
|
|
250
|
+
store: { kind: store.kind, where: store.where, written, ...(publish ? { publish } : {}) },
|
|
238
251
|
};
|
|
239
252
|
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed nodes for indexed resources (#4521, tier 1 of INTENTIUS/behold#1025).
|
|
3
|
+
*
|
|
4
|
+
* behold#1029's cloud lister reads one account, subscription, project or
|
|
5
|
+
* cluster through that cloud's inventory API and returns a
|
|
6
|
+
* {@link ListingResult}. {@link typeListing} turns it into an
|
|
7
|
+
* {@link IndexDocument}: each listed object becomes an `IRNode` whose `kind`
|
|
8
|
+
* is the lexicon kind that describes it, with its properties normalized by
|
|
9
|
+
* that lexicon's own deep-observe hooks, so an indexed tree has the shape an
|
|
10
|
+
* observed one has and the capability catalog (#4375) applies to it.
|
|
11
|
+
*
|
|
12
|
+
* Pure: no I/O and no clock. The lexicons come in as data (each plugin's
|
|
13
|
+
* `listedTypes` and `deepNormalizationHooks`), so behold passes the plugins
|
|
14
|
+
* it already loads and a test passes a table.
|
|
15
|
+
*
|
|
16
|
+
* Rules:
|
|
17
|
+
* - a listed type no lexicon maps stays a node of unknown kind: `kind` is
|
|
18
|
+
* the listed type, `lexicon` the substrate, `unmappedKind: true`. It is
|
|
19
|
+
* never dropped, and a note names each such type once;
|
|
20
|
+
* - secret-bearing values are masked with the one list the snapshot path
|
|
21
|
+
* uses (`isSensitiveKey`, ../sensitive-key.ts). The lister masked already;
|
|
22
|
+
* masking again here means no listing reaches the index unmasked;
|
|
23
|
+
* - a node id is the path-style id ruled on behold#1025 (Q2):
|
|
24
|
+
* `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>`.
|
|
25
|
+
*
|
|
26
|
+
* Edges are #4522's (./derive-edges.ts); this module leaves `edges` empty.
|
|
27
|
+
*/
|
|
28
|
+
import type { DeepNormalizationHooks } from "../deep-observation.js";
|
|
29
|
+
import type { EngineFacts } from "../engine-facts.js";
|
|
30
|
+
import type { GraphIR, IRNode } from "../graph-ir.js";
|
|
31
|
+
import { type CloudIndexScope, type CoverageEntry, type IndexDocument, type IndexNote } from "./index-document.js";
|
|
32
|
+
/** The four substrates the lister reads, one per run (behold#1025 Q6). */
|
|
33
|
+
export type ListingSubstrate = CloudIndexScope["substrate"];
|
|
34
|
+
/** One run's scope, as the lister names it. `"*"` means every location or type. */
|
|
35
|
+
export interface CloudScope {
|
|
36
|
+
substrate: ListingSubstrate;
|
|
37
|
+
scopeId: string;
|
|
38
|
+
locations: readonly string[] | "*";
|
|
39
|
+
types: readonly string[] | "*";
|
|
40
|
+
tagFilter?: Readonly<Record<string, string>>;
|
|
41
|
+
}
|
|
42
|
+
/** A cloud id, kinds as #4520 ruled them (`EngineFacts.cloudIds`). */
|
|
43
|
+
export interface ListedCloudId {
|
|
44
|
+
kind: "import-id" | "arn" | "provider-id" | "self-link" | "k8s-uid";
|
|
45
|
+
value: string;
|
|
46
|
+
}
|
|
47
|
+
/** The facts a cloud listing can supply: markers read off tags, cloud ids, when it was read. */
|
|
48
|
+
export interface ListedFacts {
|
|
49
|
+
markers?: EngineFacts["markers"];
|
|
50
|
+
cloudIds: ListedCloudId[];
|
|
51
|
+
observedAt: string;
|
|
52
|
+
}
|
|
53
|
+
/** One listed object (behold#1025 `ListedResource`). */
|
|
54
|
+
export interface ListedResource {
|
|
55
|
+
/** The path-style id; recomputed by {@link listedNodeId}, so a listing may leave it out. */
|
|
56
|
+
id?: string;
|
|
57
|
+
listedType: string;
|
|
58
|
+
location: string;
|
|
59
|
+
nativeId: string;
|
|
60
|
+
cloudIds: ListedCloudId[];
|
|
61
|
+
tags: Record<string, string>;
|
|
62
|
+
/** As returned, unnormalized, already masked by the lister. */
|
|
63
|
+
properties: Record<string, unknown>;
|
|
64
|
+
observedAt: string;
|
|
65
|
+
facts?: ListedFacts;
|
|
66
|
+
}
|
|
67
|
+
/** A lister note: a type with no lister, a disabled API, a tag filter. */
|
|
68
|
+
export interface ListingNote {
|
|
69
|
+
code: string;
|
|
70
|
+
message: string;
|
|
71
|
+
listedType?: string;
|
|
72
|
+
location?: string;
|
|
73
|
+
command?: string;
|
|
74
|
+
}
|
|
75
|
+
/** The lister's whole output for one run (behold#1025 `ListingResult`, behold#1029). */
|
|
76
|
+
export interface ListingResult {
|
|
77
|
+
listing: "v1";
|
|
78
|
+
source?: {
|
|
79
|
+
name: string;
|
|
80
|
+
version?: string;
|
|
81
|
+
};
|
|
82
|
+
scope: CloudScope;
|
|
83
|
+
startedAt: string;
|
|
84
|
+
completedAt: string;
|
|
85
|
+
resources: ListedResource[];
|
|
86
|
+
coverage: CoverageEntry[];
|
|
87
|
+
notes: ListingNote[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* How a lexicon reads one substrate's listed types (a plugin's
|
|
91
|
+
* `listedTypes`). Data plus two pure functions.
|
|
92
|
+
*/
|
|
93
|
+
export interface ListedTypeMapping {
|
|
94
|
+
substrate: ListingSubstrate;
|
|
95
|
+
/** The lexicon kind for a listed type, or undefined when the lexicon has none. */
|
|
96
|
+
kindFor(listedType: string): string | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* The listed properties reshaped into the tree this lexicon's deep reader
|
|
99
|
+
* returns, before the hooks run: Azure flattens `properties.*` beside
|
|
100
|
+
* `location` and `sku`, Kubernetes drops `apiVersion` and `kind`. Absent
|
|
101
|
+
* means the listing's shape already is that tree (Cloud Control's
|
|
102
|
+
* CloudFormation model).
|
|
103
|
+
*/
|
|
104
|
+
observedTree?(properties: Record<string, unknown>, context: {
|
|
105
|
+
listedType: string;
|
|
106
|
+
kind: string;
|
|
107
|
+
}): Record<string, unknown>;
|
|
108
|
+
}
|
|
109
|
+
/** What {@link typeListing} needs from a lexicon. A `LexiconPlugin` is one. */
|
|
110
|
+
export interface ListingLexicon {
|
|
111
|
+
name: string;
|
|
112
|
+
listedTypes?: ListedTypeMapping;
|
|
113
|
+
deepNormalizationHooks?: DeepNormalizationHooks;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (behold#1025
|
|
117
|
+
* Q2), exactly as behold's lister writes it (src/cloud-lister/ids.ts): `%`
|
|
118
|
+
* and `/` are escaped in the first four parts, and the native id is last and
|
|
119
|
+
* unescaped, so everything after the fourth `/` is it.
|
|
120
|
+
*/
|
|
121
|
+
export declare function listedNodeId(parts: {
|
|
122
|
+
substrate: string;
|
|
123
|
+
scopeId: string;
|
|
124
|
+
location: string;
|
|
125
|
+
listedType: string;
|
|
126
|
+
nativeId: string;
|
|
127
|
+
}): string;
|
|
128
|
+
/** The lexicon (and kind) for one listed type: the first mapping, by lexicon name, that answers. */
|
|
129
|
+
export declare function resolveListedKind(substrate: ListingSubstrate, listedType: string, lexicons: readonly ListingLexicon[]): {
|
|
130
|
+
lexicon: ListingLexicon;
|
|
131
|
+
kind: string;
|
|
132
|
+
} | undefined;
|
|
133
|
+
/** One listed object as a typed (or unknown-kind) node. */
|
|
134
|
+
export declare function typeListedResource(scope: CloudScope, resource: ListedResource, lexicons: readonly ListingLexicon[]): IRNode;
|
|
135
|
+
/** The listing's scope as the index stamp's cloud scope. */
|
|
136
|
+
export declare function listingIndexScope(scope: CloudScope): CloudIndexScope;
|
|
137
|
+
/** Every listed object as a node, sorted by id. */
|
|
138
|
+
export declare function typeListingNodes(listing: ListingResult, lexicons: readonly ListingLexicon[]): IRNode[];
|
|
139
|
+
/**
|
|
140
|
+
* The listing as one index version (behold#1025 schema). `graph.edges` is
|
|
141
|
+
* empty; chant#4522's `deriveEdges` fills it. Coverage passes through as the
|
|
142
|
+
* lister wrote it, wildcards included. The lister's notes keep their code as
|
|
143
|
+
* `kind`, and each unmapped listed type gets one `unmapped-type` note.
|
|
144
|
+
*/
|
|
145
|
+
export declare function typeListing(listing: ListingResult, lexicons: readonly ListingLexicon[]): IndexDocument;
|
|
146
|
+
/** Stamp a graph, coverage and notes read from `listing` as one index version. */
|
|
147
|
+
export declare function assembleIndexDocument(listing: ListingResult, graph: GraphIR, coverage: CoverageEntry[], notes: IndexNote[]): IndexDocument;
|
|
148
|
+
//# sourceMappingURL=type-listing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-listing.d.ts","sourceRoot":"","sources":["../../src/lifecycle/type-listing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { MASKED, isSensitiveKey, normalizeDeepProperties } from "../deep-observation.js";
|
|
2
|
+
import { canonicalScope, indexDocumentDigest, indexScopeKey, } from "./index-document.js";
|
|
3
|
+
function escapeSegment(s) {
|
|
4
|
+
return s.replace(/%/g, "%25").replace(/\//g, "%2F");
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (behold#1025
|
|
8
|
+
* Q2), exactly as behold's lister writes it (src/cloud-lister/ids.ts): `%`
|
|
9
|
+
* and `/` are escaped in the first four parts, and the native id is last and
|
|
10
|
+
* unescaped, so everything after the fourth `/` is it.
|
|
11
|
+
*/
|
|
12
|
+
export function listedNodeId(parts) {
|
|
13
|
+
return [
|
|
14
|
+
escapeSegment(parts.substrate),
|
|
15
|
+
escapeSegment(parts.scopeId),
|
|
16
|
+
escapeSegment(parts.location),
|
|
17
|
+
escapeSegment(parts.listedType),
|
|
18
|
+
parts.nativeId,
|
|
19
|
+
].join("/");
|
|
20
|
+
}
|
|
21
|
+
/** The lexicon (and kind) for one listed type: the first mapping, by lexicon name, that answers. */
|
|
22
|
+
export function resolveListedKind(substrate, listedType, lexicons) {
|
|
23
|
+
for (const lexicon of lexicons) {
|
|
24
|
+
const mapping = lexicon.listedTypes;
|
|
25
|
+
if (!mapping || mapping.substrate !== substrate)
|
|
26
|
+
continue;
|
|
27
|
+
const kind = mapping.kindFor(listedType);
|
|
28
|
+
if (kind !== undefined)
|
|
29
|
+
return { lexicon, kind };
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
function maskTags(tags) {
|
|
34
|
+
const out = {};
|
|
35
|
+
for (const k of Object.keys(tags).sort())
|
|
36
|
+
out[k] = isSensitiveKey(k) ? MASKED : tags[k];
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
const byName = (a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
40
|
+
/** One listed object as a typed (or unknown-kind) node. */
|
|
41
|
+
export function typeListedResource(scope, resource, lexicons) {
|
|
42
|
+
const sorted = [...lexicons].sort(byName);
|
|
43
|
+
const resolved = resolveListedKind(scope.substrate, resource.listedType, sorted);
|
|
44
|
+
const id = listedNodeId({
|
|
45
|
+
substrate: scope.substrate,
|
|
46
|
+
scopeId: scope.scopeId,
|
|
47
|
+
location: resource.location,
|
|
48
|
+
listedType: resource.listedType,
|
|
49
|
+
nativeId: resource.nativeId,
|
|
50
|
+
});
|
|
51
|
+
let kind;
|
|
52
|
+
let lexicon;
|
|
53
|
+
let attrs;
|
|
54
|
+
if (resolved) {
|
|
55
|
+
kind = resolved.kind;
|
|
56
|
+
lexicon = resolved.lexicon.name;
|
|
57
|
+
const reshape = resolved.lexicon.listedTypes?.observedTree;
|
|
58
|
+
const tree = reshape ? reshape(resource.properties, { listedType: resource.listedType, kind }) : resource.properties;
|
|
59
|
+
attrs = normalizeDeepProperties(tree, { entityType: kind, side: "live", hooks: resolved.lexicon.deepNormalizationHooks });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
kind = resource.listedType;
|
|
63
|
+
lexicon = scope.substrate;
|
|
64
|
+
// No lexicon, so no hooks: the listing's properties as returned, key-sorted and masked.
|
|
65
|
+
attrs = normalizeDeepProperties(resource.properties, { entityType: resource.listedType, side: "live" });
|
|
66
|
+
}
|
|
67
|
+
const cloudIds = resource.cloudIds.length > 0 ? resource.cloudIds : resource.facts?.cloudIds ?? [];
|
|
68
|
+
const facts = {
|
|
69
|
+
...(resource.facts?.markers ? { markers: resource.facts.markers } : {}),
|
|
70
|
+
...(cloudIds.length > 0 ? { cloudIds: cloudIds.map((c) => ({ kind: c.kind, value: c.value })) } : {}),
|
|
71
|
+
observedAt: resource.facts?.observedAt ?? resource.observedAt,
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
id,
|
|
75
|
+
kind,
|
|
76
|
+
lexicon,
|
|
77
|
+
attrs,
|
|
78
|
+
physicalId: resource.nativeId,
|
|
79
|
+
facts,
|
|
80
|
+
listedType: resource.listedType,
|
|
81
|
+
location: resource.location,
|
|
82
|
+
nativeId: resource.nativeId,
|
|
83
|
+
tags: maskTags(resource.tags ?? {}),
|
|
84
|
+
...(resolved ? {} : { unmappedKind: true }),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** The listing's scope as the index stamp's cloud scope. */
|
|
88
|
+
export function listingIndexScope(scope) {
|
|
89
|
+
return canonicalScope({
|
|
90
|
+
kind: "cloud",
|
|
91
|
+
substrate: scope.substrate,
|
|
92
|
+
scopeId: scope.scopeId,
|
|
93
|
+
locations: scope.locations,
|
|
94
|
+
types: scope.types,
|
|
95
|
+
...(scope.tagFilter ? { tagFilter: scope.tagFilter } : {}),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** Every listed object as a node, sorted by id. */
|
|
99
|
+
export function typeListingNodes(listing, lexicons) {
|
|
100
|
+
const nodes = listing.resources.map((r) => typeListedResource(listing.scope, r, lexicons));
|
|
101
|
+
nodes.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
102
|
+
return nodes;
|
|
103
|
+
}
|
|
104
|
+
const compareNotes = (a, b) => {
|
|
105
|
+
const ka = `${a.kind}\u0000${a.listedType ?? ""}\u0000${a.location ?? ""}\u0000${a.message}`;
|
|
106
|
+
const kb = `${b.kind}\u0000${b.listedType ?? ""}\u0000${b.location ?? ""}\u0000${b.message}`;
|
|
107
|
+
return ka < kb ? -1 : ka > kb ? 1 : 0;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* The listing as one index version (behold#1025 schema). `graph.edges` is
|
|
111
|
+
* empty; chant#4522's `deriveEdges` fills it. Coverage passes through as the
|
|
112
|
+
* lister wrote it, wildcards included. The lister's notes keep their code as
|
|
113
|
+
* `kind`, and each unmapped listed type gets one `unmapped-type` note.
|
|
114
|
+
*/
|
|
115
|
+
export function typeListing(listing, lexicons) {
|
|
116
|
+
const nodes = typeListingNodes(listing, lexicons);
|
|
117
|
+
const graph = {
|
|
118
|
+
version: 1,
|
|
119
|
+
nodes,
|
|
120
|
+
edges: [],
|
|
121
|
+
groups: { byLexicon: groupByLexicon(nodes) },
|
|
122
|
+
};
|
|
123
|
+
const coverage = [...listing.coverage].map((c) => ({ ...c }));
|
|
124
|
+
const notes = listing.notes.map((n) => ({
|
|
125
|
+
kind: n.code,
|
|
126
|
+
message: n.message,
|
|
127
|
+
...(n.listedType !== undefined ? { listedType: n.listedType } : {}),
|
|
128
|
+
...(n.location !== undefined ? { location: n.location } : {}),
|
|
129
|
+
...(n.command !== undefined ? { command: n.command } : {}),
|
|
130
|
+
}));
|
|
131
|
+
const unmapped = [...new Set(nodes.filter((n) => n.unmappedKind).map((n) => n.listedType))].sort();
|
|
132
|
+
for (const t of unmapped) {
|
|
133
|
+
notes.push({
|
|
134
|
+
kind: "unmapped-type",
|
|
135
|
+
listedType: t,
|
|
136
|
+
message: `no lexicon kind maps the listed type ${t}; its objects are kept as nodes of unknown kind, with the listing's properties masked`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
notes.sort(compareNotes);
|
|
140
|
+
return assembleIndexDocument(listing, graph, coverage, notes);
|
|
141
|
+
}
|
|
142
|
+
/** Stamp a graph, coverage and notes read from `listing` as one index version. */
|
|
143
|
+
export function assembleIndexDocument(listing, graph, coverage, notes) {
|
|
144
|
+
const scope = listingIndexScope(listing.scope);
|
|
145
|
+
return {
|
|
146
|
+
index: "v1",
|
|
147
|
+
stamp: {
|
|
148
|
+
source: { kind: "cloud", name: listing.source?.name ?? "behold-lister", ...(listing.source?.version ? { version: listing.source.version } : {}) },
|
|
149
|
+
scope,
|
|
150
|
+
scopeKey: indexScopeKey(scope),
|
|
151
|
+
observedAt: listing.startedAt,
|
|
152
|
+
completedAt: listing.completedAt,
|
|
153
|
+
digest: indexDocumentDigest({ graph, coverage }),
|
|
154
|
+
},
|
|
155
|
+
coverage,
|
|
156
|
+
graph,
|
|
157
|
+
...(notes.length > 0 ? { notes } : {}),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function groupByLexicon(nodes) {
|
|
161
|
+
var _a;
|
|
162
|
+
const out = {};
|
|
163
|
+
for (const n of nodes)
|
|
164
|
+
(out[_a = n.lexicon] ?? (out[_a] = [])).push(n.id);
|
|
165
|
+
return Object.fromEntries(Object.keys(out).sort().map((k) => [k, out[k].sort()]));
|
|
166
|
+
}
|
|
@@ -53,6 +53,20 @@ export interface ComponentCheckContext {
|
|
|
53
53
|
* `none-by-design`, i.e. flags nothing).
|
|
54
54
|
*/
|
|
55
55
|
rollbackPolicies?: ReadonlyMap<string, RollbackPolicy>;
|
|
56
|
+
/**
|
|
57
|
+
* The project's `terraform.roots` entries marked `signalOnly` (#4484),
|
|
58
|
+
* keyed by root name. Supplied by `chant lint` from the project's config
|
|
59
|
+
* (`signalOnlyRootsOf` in ./rules/comp/comp008-applies-signal-only-root.ts);
|
|
60
|
+
* undefined when none was resolved, in which case COMP008 flags nothing.
|
|
61
|
+
*/
|
|
62
|
+
signalOnlyRoots?: ReadonlyMap<string, SignalOnlyRoot>;
|
|
63
|
+
}
|
|
64
|
+
/** One `terraform.roots` entry marked `signalOnly` (#4490). */
|
|
65
|
+
export interface SignalOnlyRoot {
|
|
66
|
+
/** The root's `dir` as the config writes it. */
|
|
67
|
+
dir: string;
|
|
68
|
+
/** The workspace member whose directory holds the root, when the workspace reads. */
|
|
69
|
+
owner?: string;
|
|
56
70
|
}
|
|
57
71
|
/** A diagnostic from a component composition check. Shaped like `PostSynthDiagnostic`, plus a `file` so it can be merged into `LintDiagnostic`s and reported per-file like every other lint diagnostic. */
|
|
58
72
|
export interface ComponentCheckDiagnostic {
|
|
@@ -94,7 +108,7 @@ export interface ComponentCheck {
|
|
|
94
108
|
* COMP* checks exist precisely because they need the discovered `Component`
|
|
95
109
|
* graph, which does mean importing `*.component.ts` files.
|
|
96
110
|
*/
|
|
97
|
-
export declare function runComponentChecks(path: string, checks: ComponentCheck[], registryContext?: Pick<ComponentCheckContext, "knownKinds" | "rollbackPolicies">, sandbox?: boolean, buildParams?: BuildParamProvenance[]): Promise<ComponentCheckDiagnostic[]>;
|
|
111
|
+
export declare function runComponentChecks(path: string, checks: ComponentCheck[], registryContext?: Pick<ComponentCheckContext, "knownKinds" | "rollbackPolicies" | "signalOnlyRoots">, sandbox?: boolean, buildParams?: BuildParamProvenance[]): Promise<ComponentCheckDiagnostic[]>;
|
|
98
112
|
/** Structural type guard, mirroring `isPostSynthCheck` — used by rule discovery/registry code. */
|
|
99
113
|
export declare function isComponentCheck(value: unknown): value is ComponentCheck;
|
|
100
114
|
/** Re-exported for rule modules that need the discovered shape without importing `../components/discover` directly. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-checks.d.ts","sourceRoot":"","sources":["../../src/lint/component-checks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,wFAAwF;AACxF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mGAAmG;AACnG,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"component-checks.d.ts","sourceRoot":"","sources":["../../src/lint/component-checks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,wFAAwF;AACxF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mGAAmG;AACnG,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvD;;;;;OAKG;IACH,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACvD;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2MAA2M;AAC3M,MAAM,WAAW,wBAAwB;IACvC,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;IAC/D,gDAAgD;IAChD,KAAK,CAAC,GAAG,EAAE,qBAAqB,GAAG,wBAAwB,EAAE,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,cAAc,EAAE,EACxB,eAAe,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,CAAC,EACpG,OAAO,CAAC,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,oBAAoB,EAAE,GACnC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAqCrC;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAUxE;AAED,uHAAuH;AACvH,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -68,6 +68,7 @@ export async function runComponentChecks(path, checks, registryContext, sandbox,
|
|
|
68
68
|
components,
|
|
69
69
|
knownKinds: registryContext?.knownKinds,
|
|
70
70
|
rollbackPolicies: registryContext?.rollbackPolicies,
|
|
71
|
+
signalOnlyRoots: registryContext?.signalOnlyRoots,
|
|
71
72
|
};
|
|
72
73
|
for (const check of checks) {
|
|
73
74
|
diagnostics.push(...check.check(ctx));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns.component.d.ts","sourceRoot":"","sources":["../../../../../../../src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAGxE,kGAAkG;AAClG,eAAO,MAAM,GAAG,EAAE,SAUjB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { phase } from "../../../../../../components/component.js";
|
|
2
|
+
/** COMP008 fail case: a terraform-apply step deploys "azure", which the test marks signalOnly. */
|
|
3
|
+
export const dns = {
|
|
4
|
+
name: "dns",
|
|
5
|
+
archetype: "infra",
|
|
6
|
+
dependsOn: [],
|
|
7
|
+
deploy: [
|
|
8
|
+
phase("Apply", [
|
|
9
|
+
{ kind: "terraform-apply", root: "dns" },
|
|
10
|
+
{ kind: "terraform-apply", root: "azure" },
|
|
11
|
+
]),
|
|
12
|
+
],
|
|
13
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns.component.d.ts","sourceRoot":"","sources":["../../../../../../../src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAGxE,yEAAyE;AACzE,eAAO,MAAM,GAAG,EAAE,SAKjB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { phase } from "../../../../../../components/component.js";
|
|
2
|
+
/** COMP008 pass case: the component deploys only its own root, "dns". */
|
|
3
|
+
export const dns = {
|
|
4
|
+
name: "dns",
|
|
5
|
+
archetype: "infra",
|
|
6
|
+
dependsOn: [],
|
|
7
|
+
deploy: [phase("Apply", [{ kind: "terraform-apply", root: "dns" }])],
|
|
8
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COMP008: applies-signal-only-root (#4490)
|
|
3
|
+
*
|
|
4
|
+
* Flags a component whose `terraform-apply` step deploys a root the project
|
|
5
|
+
* marks `signalOnly: true` in `terraform.roots` (#4484). Such a root belongs
|
|
6
|
+
* to another workspace member and is declared here only so a change to it
|
|
7
|
+
* brings this project into the change: the build skips it, so this
|
|
8
|
+
* project's graph does not draw it, and the live reads skip it too. A
|
|
9
|
+
* component that applies it would apply a root chant otherwise treats as
|
|
10
|
+
* the other member's, so the warning names the root and the member that
|
|
11
|
+
* owns it (the workspace member whose directory holds the root's `dir`).
|
|
12
|
+
*
|
|
13
|
+
* The roots come from the project's chant config, resolved by `chant lint`
|
|
14
|
+
* ({@link signalOnlyRootsOf}) and handed to the check on
|
|
15
|
+
* `ComponentCheckContext.signalOnlyRoots`. A check run without them (a
|
|
16
|
+
* direct unit test, a project with no terraform roots) flags nothing.
|
|
17
|
+
*
|
|
18
|
+
* Triggers on: `{ kind: "terraform-apply", root: "azure" }` where
|
|
19
|
+
* `terraform.roots.azure.signalOnly` is `true`.
|
|
20
|
+
* OK: the same step on a root without the marker, or no `terraform-apply`
|
|
21
|
+
* step naming the marked root.
|
|
22
|
+
*/
|
|
23
|
+
import type { ComponentCheck, SignalOnlyRoot } from "../../component-checks.js";
|
|
24
|
+
export declare const comp008AppliesSignalOnlyRootRule: ComponentCheck;
|
|
25
|
+
/**
|
|
26
|
+
* The roots a project's `terraform.roots` marks `signalOnly`, keyed by root
|
|
27
|
+
* name, each with its `dir` as written and the workspace member whose
|
|
28
|
+
* directory holds it. `projectDir` is the directory holding the chant
|
|
29
|
+
* config. Tolerant: a config that does not load, or no marked root, gives an
|
|
30
|
+
* empty map; a workspace declaration that does not read leaves `owner` off.
|
|
31
|
+
*/
|
|
32
|
+
export declare function signalOnlyRootsOf(projectDir: string): Promise<Map<string, SignalOnlyRoot>>;
|
|
33
|
+
//# sourceMappingURL=comp008-applies-signal-only-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comp008-applies-signal-only-root.d.ts","sourceRoot":"","sources":["../../../../src/lint/rules/comp/comp008-applies-signal-only-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAmD,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG9H,eAAO,MAAM,gCAAgC,EAAE,cAuC9C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAyBhG"}
|