@intentius/chant 0.124.52 → 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 +15 -2
- 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 +215 -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/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 +34 -1
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +66 -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 +6 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4 -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 +41 -4
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +209 -39
- 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/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 +56 -1
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +51 -1
- 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 +51 -2
- 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 +14 -2
- 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 +229 -0
- package/src/components/cli-support.ts +70 -14
- 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 +89 -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 +42 -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 +516 -3
- package/src/components/pr-run.ts +231 -41
- 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/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 +43 -0
- package/src/pr-loop.ts +111 -2
- 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 +51 -2
- 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
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* behold#1029: the lister's one way onto the network.
|
|
3
|
+
*
|
|
4
|
+
* {@link Transport.send} runs, in order: the read-only check
|
|
5
|
+
* (packages/core/src/cloud-lister/guard.ts), the origin pin, then the fetcher. The pin is
|
|
6
|
+
* the goal's never-public-cloud rule in code: when a run names its own
|
|
7
|
+
* endpoint (an emulator), every call must go to that endpoint's origin, so a
|
|
8
|
+
* URL built wrong can never reach a public cloud host. A test passes its own
|
|
9
|
+
* {@link Fetcher}; production uses {@link nodeFetcher}, which is node's own
|
|
10
|
+
* http/https so a cluster's CA and client certificate can be passed
|
|
11
|
+
* explicitly.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { request as httpRequest } from "node:http";
|
|
15
|
+
import { request as httpsRequest } from "node:https";
|
|
16
|
+
import { assertReadCall, type WireCall } from "./guard";
|
|
17
|
+
|
|
18
|
+
export interface WireResponse {
|
|
19
|
+
status: number;
|
|
20
|
+
headers: Record<string, string>;
|
|
21
|
+
body: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** TLS material for one target, passed explicitly; nothing is read from the environment. */
|
|
25
|
+
export interface TlsOptions {
|
|
26
|
+
ca?: string;
|
|
27
|
+
cert?: string;
|
|
28
|
+
key?: string;
|
|
29
|
+
/** Only for a local emulator whose certificate the caller chose not to pin. */
|
|
30
|
+
insecureSkipVerify?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type Fetcher = (call: WireCall, tls: TlsOptions | undefined) => Promise<WireResponse>;
|
|
34
|
+
|
|
35
|
+
export class OriginRefused extends Error {
|
|
36
|
+
constructor(readonly url: string, readonly allowed: string) {
|
|
37
|
+
super(`chant's cloud lister refused ${url}: this run is pinned to ${allowed}`);
|
|
38
|
+
this.name = "OriginRefused";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface TransportOptions {
|
|
43
|
+
fetcher?: Fetcher;
|
|
44
|
+
/** When set, every call must go to this origin (an explicit endpoint). */
|
|
45
|
+
pinnedOrigin?: string;
|
|
46
|
+
tls?: TlsOptions;
|
|
47
|
+
/** Called with each call that passed the guard, before it is sent (tests record with it). */
|
|
48
|
+
onSend?: (call: WireCall, operation: string) => void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export class Transport {
|
|
52
|
+
readonly calls: Array<{ call: WireCall; operation: string }> = [];
|
|
53
|
+
private readonly fetcher: Fetcher;
|
|
54
|
+
|
|
55
|
+
constructor(private readonly options: TransportOptions = {}) {
|
|
56
|
+
this.fetcher = options.fetcher ?? nodeFetcher;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async send(call: WireCall): Promise<WireResponse> {
|
|
60
|
+
const operation = assertReadCall(call);
|
|
61
|
+
if (this.options.pinnedOrigin !== undefined) {
|
|
62
|
+
const origin = new URL(call.url).origin;
|
|
63
|
+
if (origin !== new URL(this.options.pinnedOrigin).origin) throw new OriginRefused(call.url, this.options.pinnedOrigin);
|
|
64
|
+
}
|
|
65
|
+
this.calls.push({ call, operation });
|
|
66
|
+
this.options.onSend?.(call, operation);
|
|
67
|
+
return this.fetcher(call, this.options.tls);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** node's http/https, one request, the whole body read as text. */
|
|
72
|
+
export const nodeFetcher: Fetcher = (call, tls) =>
|
|
73
|
+
new Promise((resolve, reject) => {
|
|
74
|
+
const url = new URL(call.url);
|
|
75
|
+
const secure = url.protocol === "https:";
|
|
76
|
+
const send = secure ? httpsRequest : httpRequest;
|
|
77
|
+
const req = send(
|
|
78
|
+
url,
|
|
79
|
+
{
|
|
80
|
+
method: call.method,
|
|
81
|
+
headers: call.headers,
|
|
82
|
+
...(secure && tls
|
|
83
|
+
? {
|
|
84
|
+
...(tls.ca !== undefined ? { ca: tls.ca } : {}),
|
|
85
|
+
...(tls.cert !== undefined ? { cert: tls.cert } : {}),
|
|
86
|
+
...(tls.key !== undefined ? { key: tls.key } : {}),
|
|
87
|
+
...(tls.insecureSkipVerify ? { rejectUnauthorized: false } : {}),
|
|
88
|
+
}
|
|
89
|
+
: {}),
|
|
90
|
+
timeout: 60_000,
|
|
91
|
+
},
|
|
92
|
+
(res) => {
|
|
93
|
+
const chunks: Buffer[] = [];
|
|
94
|
+
res.on("data", (c: Buffer) => chunks.push(c));
|
|
95
|
+
res.on("end", () => {
|
|
96
|
+
const headers: Record<string, string> = {};
|
|
97
|
+
for (const [k, v] of Object.entries(res.headers)) {
|
|
98
|
+
if (v !== undefined) headers[k] = Array.isArray(v) ? v.join(", ") : v;
|
|
99
|
+
}
|
|
100
|
+
resolve({ status: res.statusCode ?? 0, headers, body: Buffer.concat(chunks).toString("utf8") });
|
|
101
|
+
});
|
|
102
|
+
res.on("error", reject);
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
req.on("timeout", () => req.destroy(new Error(`timed out: ${call.method} ${call.url}`)));
|
|
106
|
+
req.on("error", reject);
|
|
107
|
+
if (call.body !== undefined) req.write(call.body);
|
|
108
|
+
req.end();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
/** The body parsed as JSON, or `undefined` when it is not JSON. */
|
|
112
|
+
export function jsonBody(res: WireResponse): unknown {
|
|
113
|
+
try {
|
|
114
|
+
return res.body === "" ? undefined : JSON.parse(res.body);
|
|
115
|
+
} catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* behold#1029: the cloud lister's output, the "listing result" source shape
|
|
3
|
+
* of behold#1025's design (https://github.com/INTENTIUS/behold/issues/1025#issuecomment-6430966093,
|
|
4
|
+
* ruled in #issuecomment-6431259469).
|
|
5
|
+
*
|
|
6
|
+
* The ruling puts the index schema's TypeScript types in chant core (Q5), and
|
|
7
|
+
* chant's `typeListing` (../lifecycle/type-listing.ts, chant#4521) turns a
|
|
8
|
+
* `ListingResult` into an `IndexDocument`. type-listing.ts reads the shape
|
|
9
|
+
* loosely (an optional id and facts, any source name); this module is the
|
|
10
|
+
* lister's exact output, and ../lifecycle/cloud-index.ts hands one to the
|
|
11
|
+
* other, so the type checker holds them together.
|
|
12
|
+
*
|
|
13
|
+
* What the lister fills, per the design and chant#4520's ruled `EngineFacts`:
|
|
14
|
+
*
|
|
15
|
+
* - every resource gets the path-style id the ruling names (Q2),
|
|
16
|
+
* `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (packages/core/src/cloud-lister/ids.ts);
|
|
17
|
+
* - `facts` carries only what a cloud listing can read: `markers` (from tags
|
|
18
|
+
* and labels), `cloudIds` and `observedAt`. `ownership`, `ownedBy` and
|
|
19
|
+
* `recordVersions` stay absent, because they are relative to an estate or
|
|
20
|
+
* stack and a record the lister never reads;
|
|
21
|
+
* - properties, tags and every string under them are masked before the
|
|
22
|
+
* result exists (packages/core/src/cloud-lister/mask.ts).
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { UnobservedReason } from "../observation";
|
|
26
|
+
|
|
27
|
+
/** The four substrates the lister reads, one per run (ruling Q6). */
|
|
28
|
+
export type Substrate = "aws" | "azure" | "gcp" | "kubernetes";
|
|
29
|
+
|
|
30
|
+
/** A tag or label filter: every pair must match. */
|
|
31
|
+
export type TagFilter = Readonly<Record<string, string>>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* One run's scope (ruling Q6): one substrate and one account, subscription,
|
|
35
|
+
* project or cluster, with every location and type the flags name. `"*"`
|
|
36
|
+
* means every location or every type the inventory API returns.
|
|
37
|
+
*/
|
|
38
|
+
export interface CloudScope {
|
|
39
|
+
substrate: Substrate;
|
|
40
|
+
/** AWS account id, Azure subscription id, GCP project id, or a cluster name. */
|
|
41
|
+
scopeId: string;
|
|
42
|
+
/** Regions or locations (Kubernetes: namespaces), sorted and deduplicated, or `"*"`. */
|
|
43
|
+
locations: readonly string[] | "*";
|
|
44
|
+
/** Types as the inventory API names them, sorted and deduplicated, or `"*"`. */
|
|
45
|
+
types: readonly string[] | "*";
|
|
46
|
+
tagFilter?: TagFilter;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* What was looked at, per type and location (#1025 "Coverage"). A
|
|
51
|
+
* (type, location) with no entry is not observed. `"*"` in `listedType` or
|
|
52
|
+
* `location` means "every": a reader that does not know the wildcard compares
|
|
53
|
+
* it as a literal, matches nothing, and so reads the entity as not observed,
|
|
54
|
+
* which is the safe direction.
|
|
55
|
+
*/
|
|
56
|
+
export interface CoverageEntry {
|
|
57
|
+
listedType: string;
|
|
58
|
+
location: string;
|
|
59
|
+
verdict: "listed" | UnobservedReason;
|
|
60
|
+
detail?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Why something was not listed, said once (#1029: "a type it cannot list goes in the notes"). */
|
|
64
|
+
export interface IndexNote {
|
|
65
|
+
code:
|
|
66
|
+
| "no-lister" // the inventory API cannot list this type
|
|
67
|
+
| "needs-parent" // the type lists only under a parent identifier
|
|
68
|
+
| "api-disabled" // GCP: Cloud Asset API is off on the project; nothing was enabled
|
|
69
|
+
| "read-failed" // a call failed after retries
|
|
70
|
+
| "no-credentials" // the call was refused for its credentials
|
|
71
|
+
| "default-types" // AWS with types "*": a fixed default set was listed
|
|
72
|
+
| "tag-filter"; // a tag filter narrows every entry to `filtered`
|
|
73
|
+
message: string;
|
|
74
|
+
listedType?: string;
|
|
75
|
+
location?: string;
|
|
76
|
+
/** A command the person can run themselves (never run by the lister). */
|
|
77
|
+
command?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* A cloud id, kinds as chant#4520 ruled them (`EngineFacts.cloudIds`):
|
|
82
|
+
* `arn` for an ARN, `import-id` for Cloud Control's identifier (what
|
|
83
|
+
* `declaredIdentifier` builds and an import takes), `provider-id` for an ARM
|
|
84
|
+
* id (as returned and once lowercased, since Resource Graph lowercases) or a
|
|
85
|
+
* GCP asset name, `self-link` for a GCP selfLink, `k8s-uid` for a
|
|
86
|
+
* Kubernetes UID.
|
|
87
|
+
*/
|
|
88
|
+
export interface CloudId {
|
|
89
|
+
kind: "import-id" | "arn" | "provider-id" | "self-link" | "k8s-uid";
|
|
90
|
+
value: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** chant#4520's `EngineFacts.markers`, as read off the live object's tags or labels. */
|
|
94
|
+
export interface MarkerFact {
|
|
95
|
+
owner?: string;
|
|
96
|
+
address?: string;
|
|
97
|
+
encoding: "plain" | "escaped" | "digest";
|
|
98
|
+
source: "live";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The facts a cloud listing can supply (ruling Q1: one nested object). */
|
|
102
|
+
export interface ListedFacts {
|
|
103
|
+
markers?: MarkerFact;
|
|
104
|
+
cloudIds: CloudId[];
|
|
105
|
+
observedAt: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** One listed object (#1025 `ListedResource`, plus the ruled id and facts). */
|
|
109
|
+
export interface ListedResource {
|
|
110
|
+
/** `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (ruling Q2). */
|
|
111
|
+
id: string;
|
|
112
|
+
listedType: string;
|
|
113
|
+
location: string;
|
|
114
|
+
/** Cloud Control `Identifier`, the ARM id, the asset `name`, `namespace/name` or `name` for Kubernetes. */
|
|
115
|
+
nativeId: string;
|
|
116
|
+
cloudIds: CloudId[];
|
|
117
|
+
tags: Record<string, string>;
|
|
118
|
+
/** As returned, unnormalized, already masked. */
|
|
119
|
+
properties: Record<string, unknown>;
|
|
120
|
+
/** When the call that returned it answered. */
|
|
121
|
+
observedAt: string;
|
|
122
|
+
facts: ListedFacts;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** The lister's whole output for one run (#1025 `ListingResult`). */
|
|
126
|
+
export interface ListingResult {
|
|
127
|
+
listing: "v1";
|
|
128
|
+
source: { name: "chant-lister"; version: string };
|
|
129
|
+
scope: CloudScope;
|
|
130
|
+
startedAt: string;
|
|
131
|
+
completedAt: string;
|
|
132
|
+
resources: ListedResource[];
|
|
133
|
+
coverage: CoverageEntry[];
|
|
134
|
+
notes: IndexNote[];
|
|
135
|
+
}
|
|
@@ -27,6 +27,7 @@ import type { CapabilityPlugin } from "./capability-plugin";
|
|
|
27
27
|
import { isCapabilityPlugin } from "./capability-plugin";
|
|
28
28
|
import { starterCapabilityPlugin } from "./starter-plugin";
|
|
29
29
|
import { isRegistryBackendConsumer, type RegistryLoginBackend } from "./verbs/publish-image";
|
|
30
|
+
import { isEngineOutputSourceConsumer, type EngineOutputSource } from "./verbs/member-outputs";
|
|
30
31
|
import { isStorageBackendConsumer, type ArtifactStorageBackend } from "./verbs/publish-artifact";
|
|
31
32
|
|
|
32
33
|
/** Thrown when a dynamically-imported capability package does not satisfy `CapabilityPlugin` — the "malformed capability package" case #559 asks doctor/validation to detect. */
|
|
@@ -171,6 +172,8 @@ export function registerCapabilityPlugins(
|
|
|
171
172
|
for (const plugin of plugins) backends.push(...(plugin.registryBackends?.() ?? []));
|
|
172
173
|
const storage: ArtifactStorageBackend[] = [];
|
|
173
174
|
for (const plugin of plugins) storage.push(...(plugin.storageBackends?.() ?? []));
|
|
175
|
+
const engines: EngineOutputSource[] = [];
|
|
176
|
+
for (const plugin of plugins) engines.push(...(plugin.engineOutputSources?.() ?? []));
|
|
174
177
|
|
|
175
178
|
for (const plugin of plugins) {
|
|
176
179
|
for (const capability of plugin.capabilities()) {
|
|
@@ -179,6 +182,7 @@ export function registerCapabilityPlugins(
|
|
|
179
182
|
let bound = capability;
|
|
180
183
|
if (isRegistryBackendConsumer(bound)) bound = bound.withRegistryBackends(backends) as typeof bound;
|
|
181
184
|
if (isStorageBackendConsumer(bound)) bound = bound.withStorageBackends(storage) as typeof bound;
|
|
185
|
+
if (isEngineOutputSourceConsumer(bound)) bound = bound.withEngineOutputSources(engines) as typeof bound;
|
|
182
186
|
registry.register(bound);
|
|
183
187
|
}
|
|
184
188
|
}
|
|
@@ -34,6 +34,7 @@ import { fileURLToPath } from "node:url";
|
|
|
34
34
|
import type { Capability } from "./capability";
|
|
35
35
|
import type { RegistryLoginBackend } from "./verbs/publish-image";
|
|
36
36
|
import type { ArtifactStorageBackend } from "./verbs/publish-artifact";
|
|
37
|
+
import type { EngineOutputSource } from "./verbs/member-outputs";
|
|
37
38
|
|
|
38
39
|
/**
|
|
39
40
|
* Manifest for a packaged capability plugin — the capability-side analogue
|
|
@@ -104,6 +105,15 @@ export interface CapabilityPlugin {
|
|
|
104
105
|
*/
|
|
105
106
|
storageBackends?(): ArtifactStorageBackend[];
|
|
106
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Engine output sources this plugin contributes to core's `member-outputs`
|
|
110
|
+
* verb (#4455): how another workspace member's outputs are read, applied
|
|
111
|
+
* and planned, for the member kinds the source names (terraform:
|
|
112
|
+
* `choudoufu`; pulumi: `pulumi`). Like `registryBackends`, not capabilities, so several
|
|
113
|
+
* engines may contribute.
|
|
114
|
+
*/
|
|
115
|
+
engineOutputSources?(): EngineOutputSource[];
|
|
116
|
+
|
|
107
117
|
/** Optional initialization hook, called once after load (mirrors `LexiconPlugin.init`). */
|
|
108
118
|
init?(): void | Promise<void>;
|
|
109
119
|
}
|
|
@@ -208,6 +208,235 @@ export interface Capability<In = unknown, Out = unknown> {
|
|
|
208
208
|
* why. Unset refuses too, with a reason that names the verb.
|
|
209
209
|
*/
|
|
210
210
|
readonly targets?: TargetSupport;
|
|
211
|
+
/**
|
|
212
|
+
* Optional (#4435, ws-107): why this capability will not plan and apply
|
|
213
|
+
* `members` as one group, or `undefined` when it will. Core asks before
|
|
214
|
+
* anything is planned, so the answer must come from the declaration and
|
|
215
|
+
* the files alone, never from a plan. A fallback with
|
|
216
|
+
* {@link GroupFallback.drop} leaves only those members out: core forms
|
|
217
|
+
* the group again from the rest and asks again (#4419 ruling 1). A
|
|
218
|
+
* capability with `planGroup` and no `groupFallback` takes every group
|
|
219
|
+
* core forms.
|
|
220
|
+
*/
|
|
221
|
+
groupFallback?(ctx: GroupContext, members: readonly GroupMember<In>[]): Promise<GroupFallback | undefined>;
|
|
222
|
+
/**
|
|
223
|
+
* Optional (#4447): reads between this capability's components that core
|
|
224
|
+
* cannot see in their declarations, such as a Terraform root's
|
|
225
|
+
* `terraform_remote_state` block. Core asks once per capability, before
|
|
226
|
+
* groups form, with every component of the change whose step this
|
|
227
|
+
* capability takes (`ctx.components` in plan order, no `input`), and adds
|
|
228
|
+
* each read to the reads it joins, orders and splits groups by, and to
|
|
229
|
+
* the group reads the report names. The answer must come from the
|
|
230
|
+
* declaration and the files alone. A read naming a component outside
|
|
231
|
+
* `members` is ignored; a throw counts as no reads.
|
|
232
|
+
*/
|
|
233
|
+
groupReads?(ctx: GroupContext, members: readonly GroupMember<In>[]): Promise<ReportedGroupRead[]>;
|
|
234
|
+
/**
|
|
235
|
+
* Optional (#4466): reads between this capability's steps that sit in the
|
|
236
|
+
* files a step names rather than in its wiring, such as a CloudFormation
|
|
237
|
+
* template's `Fn::ImportValue` of an export another stack's template
|
|
238
|
+
* declares. Core asks once, after discovery and before the order is
|
|
239
|
+
* derived, with every step of this kind in the project. Each read becomes
|
|
240
|
+
* a `stackOutput()` reference at {@link DeclaredRead.at} in the reader's
|
|
241
|
+
* step and a `dependsOn` on the upstream, so it orders the reader after
|
|
242
|
+
* the upstream, is listed under `unknownInputs` while the upstream's plan
|
|
243
|
+
* cannot say the value, and holds the reader for a round, like a read the
|
|
244
|
+
* declaration states. A place the declaration already fills is left as it
|
|
245
|
+
* is. The answer must come from the declaration and the files alone; a
|
|
246
|
+
* throw counts as no reads.
|
|
247
|
+
*/
|
|
248
|
+
declaredReads?(ctx: DeclaredReadsContext, members: readonly DeclaredReadMember[]): Promise<DeclaredRead[]> | DeclaredRead[];
|
|
249
|
+
/**
|
|
250
|
+
* Optional (#4435, ws-107): plan `members` as one, in one call. Declared
|
|
251
|
+
* together with `runGroup`; a capability with only one of the two never
|
|
252
|
+
* gets a group. Throwing makes every member plan-failed.
|
|
253
|
+
*/
|
|
254
|
+
planGroup?(ctx: GroupContext, members: readonly GroupMember<In>[]): Promise<CapabilityGroupPlan>;
|
|
255
|
+
/**
|
|
256
|
+
* Optional (#4435, ws-107): apply the group `planGroup` planned, in one
|
|
257
|
+
* call, and say how each member's part ended. It should not throw: a throw
|
|
258
|
+
* reads as every member `failed`, or every member `not-started` when the
|
|
259
|
+
* error is a moved plan ({@link isPlanMovedError}).
|
|
260
|
+
*/
|
|
261
|
+
runGroup?(ctx: GroupContext, run: GroupRun, members: readonly GroupMember<In>[]): Promise<CapabilityGroupOutcome>;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* What a group's calls share (ws-107): the run's environment and variables,
|
|
266
|
+
* and the group's components in apply order. Each member's own context is
|
|
267
|
+
* {@link GroupMember.ctx}.
|
|
268
|
+
*/
|
|
269
|
+
export interface GroupContext {
|
|
270
|
+
env: string;
|
|
271
|
+
vars?: Record<string, unknown>;
|
|
272
|
+
/** The group's components, upstreams first. */
|
|
273
|
+
components: string[];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* A read of one group member's output by another (ws-107). Core leaves the
|
|
278
|
+
* value out of the reader's `input` (it is `undefined` at `at`) and the
|
|
279
|
+
* capability wires it inside its own apply.
|
|
280
|
+
*/
|
|
281
|
+
export interface GroupRead {
|
|
282
|
+
/** Where in the reader's step input the value goes, as a JSON Pointer. */
|
|
283
|
+
at: string;
|
|
284
|
+
/** `<component>.<output>`, as `PrMember.reads` and `unknownInputs` name it. */
|
|
285
|
+
ref: string;
|
|
286
|
+
/** The member whose output it is. */
|
|
287
|
+
component: string;
|
|
288
|
+
output: string;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* A read of one component by another that a capability reports through
|
|
293
|
+
* `groupReads` (#4447), with no place in the reader's step input.
|
|
294
|
+
*/
|
|
295
|
+
export interface ReportedGroupRead {
|
|
296
|
+
/** The component that reads. */
|
|
297
|
+
reader: string;
|
|
298
|
+
/** The component whose output it reads. */
|
|
299
|
+
upstream: string;
|
|
300
|
+
/** The read as the report names it, e.g. `data.terraform_remote_state.network`. */
|
|
301
|
+
ref: string;
|
|
302
|
+
/**
|
|
303
|
+
* The upstream output read, when the capability knows it. Without it the
|
|
304
|
+
* read counts as known at plan only when the upstream's plan knows every
|
|
305
|
+
* output it names.
|
|
306
|
+
*/
|
|
307
|
+
output?: string;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/** What `declaredReads` is asked with (#4466). */
|
|
311
|
+
export interface DeclaredReadsContext {
|
|
312
|
+
/** The project root, which a step's relative file paths are read against. */
|
|
313
|
+
root: string;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/** One step a capability's `declaredReads` is asked about (#4466). */
|
|
317
|
+
export interface DeclaredReadMember {
|
|
318
|
+
component: string;
|
|
319
|
+
/** Which of the component's steps of this kind, counting from 0 in declaration order. */
|
|
320
|
+
index: number;
|
|
321
|
+
/** The step as declared, without `kind`, wiring unresolved. */
|
|
322
|
+
step: Record<string, unknown>;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* A read `declaredReads` found (#4466): `reader`'s step `index` reads
|
|
327
|
+
* `upstream`'s output `output`. Core puts `{ stackOutput: { stack:
|
|
328
|
+
* upstream, name: output } }` at `at` in that step, so the read is named
|
|
329
|
+
* `<upstream>.<output>` wherever reads are.
|
|
330
|
+
*/
|
|
331
|
+
export interface DeclaredRead {
|
|
332
|
+
reader: string;
|
|
333
|
+
/** The reader's step, as {@link DeclaredReadMember.index}. Default 0. */
|
|
334
|
+
index?: number;
|
|
335
|
+
upstream: string;
|
|
336
|
+
output: string;
|
|
337
|
+
/** Where in the reader's step the reference goes, as a JSON Pointer. */
|
|
338
|
+
at: string;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/** One component of a group, as core hands it to the capability (ws-107). */
|
|
342
|
+
export interface GroupMember<In = unknown> {
|
|
343
|
+
component: string;
|
|
344
|
+
/** The component's one step as declared, without `kind`, wiring unresolved. */
|
|
345
|
+
step: Record<string, unknown>;
|
|
346
|
+
/**
|
|
347
|
+
* The step's input resolved against the outputs from outside the group.
|
|
348
|
+
* Each {@link GroupRead} is `undefined` here. Absent in `groupFallback`,
|
|
349
|
+
* which is asked before any output is read.
|
|
350
|
+
*/
|
|
351
|
+
input?: In;
|
|
352
|
+
/** The member's reads of other members, sorted by `ref`. */
|
|
353
|
+
reads: GroupRead[];
|
|
354
|
+
/**
|
|
355
|
+
* The component's `dependsOn` as declared (#4447): an order with no read,
|
|
356
|
+
* which a capability that applies the group in one call has to keep or
|
|
357
|
+
* refuse.
|
|
358
|
+
*/
|
|
359
|
+
dependsOn?: string[];
|
|
360
|
+
/**
|
|
361
|
+
* The member's own context: `component`, `targets`, `carried` and `carry`
|
|
362
|
+
* as for a single step. `unresolvedInputs` names only components outside
|
|
363
|
+
* the group. In `runGroup`, `plans` holds this member's plan.
|
|
364
|
+
*/
|
|
365
|
+
ctx: DeployContext;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Why a set of components does not run as one group (ws-107). `kind` is a
|
|
370
|
+
* short stable word the report keys on; `reason` is one line for a person.
|
|
371
|
+
* Core's own kinds are `steps`, `split` and `cycle`; a capability names its
|
|
372
|
+
* own. A capability's `off` is recorded and not printed in the note.
|
|
373
|
+
*
|
|
374
|
+
* Without `drop`, the fallback is every member's and the group dissolves.
|
|
375
|
+
* With `drop`, only the members it names leave, each with its own `kind`
|
|
376
|
+
* and `reason` or else the fallback's; core forms the group again from the
|
|
377
|
+
* rest by its own rules (`split`, `steps`, `cycle`, and a set of one is no
|
|
378
|
+
* group) and asks again for each set that changed (#4419 ruling 1). A
|
|
379
|
+
* `drop` that names no member of the group dissolves it.
|
|
380
|
+
*/
|
|
381
|
+
export interface GroupFallback {
|
|
382
|
+
kind: string;
|
|
383
|
+
reason: string;
|
|
384
|
+
/** The members to leave out, when not the whole group. */
|
|
385
|
+
drop?: GroupDrop[];
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/** A member a {@link GroupFallback} leaves out of its group (#4419 ruling 1). */
|
|
389
|
+
export interface GroupDrop {
|
|
390
|
+
component: string;
|
|
391
|
+
/** Default: the fallback's `kind`. */
|
|
392
|
+
kind?: string;
|
|
393
|
+
/** Default: the fallback's `reason`. */
|
|
394
|
+
reason?: string;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/** What `planGroup` returns (ws-107). */
|
|
398
|
+
export interface CapabilityGroupPlan {
|
|
399
|
+
/**
|
|
400
|
+
* One plan per member, by component: what `plan` would give for that
|
|
401
|
+
* member, with `planDigest` before the group is folded in. Core folds the
|
|
402
|
+
* group digest into each `planDigest` and its change-set part. `artifact`
|
|
403
|
+
* on these is ignored; the group's artifact is below.
|
|
404
|
+
*/
|
|
405
|
+
members: Record<string, CapabilityPlan>;
|
|
406
|
+
/** The capability's digest of what the group adds to its members' plans. */
|
|
407
|
+
digest: string;
|
|
408
|
+
/** Handed back to `runGroup` in {@link GroupRun}. Core never reads it. */
|
|
409
|
+
artifact?: unknown;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/** What core hands `runGroup` (ws-107): the plan that was approved. */
|
|
413
|
+
export interface GroupRun {
|
|
414
|
+
artifact?: unknown;
|
|
415
|
+
/** The group digest core bound: the capability's digest with the members folded in. */
|
|
416
|
+
digest: string;
|
|
417
|
+
/** Each member's plan as bound into the change set, by component. */
|
|
418
|
+
plans: Record<string, CapabilityPlan>;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* How one member's part of a group apply ended (ws-107). `partial`: some of
|
|
423
|
+
* its planned changes applied. `not-started`: the apply stopped before its
|
|
424
|
+
* part began. `no-changes`: it planned none.
|
|
425
|
+
*/
|
|
426
|
+
export type GroupMemberStatus = "applied" | "partial" | "failed" | "not-started" | "no-changes";
|
|
427
|
+
|
|
428
|
+
export interface GroupMemberOutcome {
|
|
429
|
+
status: GroupMemberStatus;
|
|
430
|
+
/** What the member exposes now, as `run`'s outputs: set for `applied` and `no-changes`. */
|
|
431
|
+
outputs?: Record<string, unknown>;
|
|
432
|
+
error?: string;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/** What `runGroup` returns (ws-107): every member's outcome, by component. */
|
|
436
|
+
export interface CapabilityGroupOutcome {
|
|
437
|
+
members: Record<string, GroupMemberOutcome>;
|
|
438
|
+
/** An error no member's part names. */
|
|
439
|
+
error?: string;
|
|
211
440
|
}
|
|
212
441
|
|
|
213
442
|
/** A capability's relationship to rollback — see `Capability.rollbackPolicy`. */
|