@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
|
@@ -394,6 +394,13 @@
|
|
|
394
394
|
],
|
|
395
395
|
"description": "What the per-member cache keys this read on (#2876): sha256 over the member's files and install state, or over the commit id with --at. Present on composed members; null for a live read or when no stamp could be taken. Two reads of a member with equal stamps read the same source."
|
|
396
396
|
},
|
|
397
|
+
"rootReads": {
|
|
398
|
+
"type": "object",
|
|
399
|
+
"description": "Added in contract 1 by #4452. With --live: which read answered each of the member's roots, the member IR's rootReads as its chant wrote it, keyed by the lexicon's root key (terraform uses terraform.roots.<root>), unprefixed. The read that answered is fellBackTo when set, else depth. Absent when the member's IR had none, including a member read by a chant before #4452.",
|
|
400
|
+
"additionalProperties": {
|
|
401
|
+
"$ref": "#/$defs/rootRead"
|
|
402
|
+
}
|
|
403
|
+
},
|
|
397
404
|
"meta": {
|
|
398
405
|
"type": "object",
|
|
399
406
|
"description": "The member IR's whole-read facts."
|
|
@@ -548,6 +555,45 @@
|
|
|
548
555
|
"runtimeOwner": {
|
|
549
556
|
"type": "string"
|
|
550
557
|
},
|
|
558
|
+
"instanceOf": {
|
|
559
|
+
"type": "string",
|
|
560
|
+
"description": "Added in contract 1 by #4454. On an instance node of a count or for_each block: the block node's id, prefixed like the ids. The instance node's id is that id followed by instanceKey (<member>/<block>[0]); the block node stays and is the rollup."
|
|
561
|
+
},
|
|
562
|
+
"instanceKey": {
|
|
563
|
+
"type": "string",
|
|
564
|
+
"description": "Added in contract 1 by #4454. With instanceOf: the block's own instance key as the engine prints it, [0] or [\"a\"]. Absent on an instance only an expanded module call makes (#4486)."
|
|
565
|
+
},
|
|
566
|
+
"instanceScope": {
|
|
567
|
+
"type": "string",
|
|
568
|
+
"description": "Added in contract 1 by #4486. With instanceOf, under an expanded module call: the module path as the engine prints it, module.app[0]. The id then carries the key on the call's segment, <member>/<root>/module.app[0]/aws_eip.pool[1]."
|
|
569
|
+
},
|
|
570
|
+
"instanceRollup": {
|
|
571
|
+
"type": "object",
|
|
572
|
+
"description": "Added in contract 1 by #4489, written by chant 0.124.54 and newer. On a block node whose count or for_each the declared graph cannot count: why it stays one node, with no instance nodes under it. Absent on a block that is not expanded and on one whose instances are listed. The read contract lists every form that is rolled up and its code.",
|
|
573
|
+
"required": ["code", "argument", "expression"],
|
|
574
|
+
"properties": {
|
|
575
|
+
"code": {
|
|
576
|
+
"type": "string",
|
|
577
|
+
"enum": ["instances-each-value", "instances-merge", "instances-value-unknown", "instances-form-unread", "instances-over-limit", "instances-module-uncounted"]
|
|
578
|
+
},
|
|
579
|
+
"argument": {
|
|
580
|
+
"type": "string",
|
|
581
|
+
"enum": ["count", "for_each"]
|
|
582
|
+
},
|
|
583
|
+
"expression": {
|
|
584
|
+
"type": "string",
|
|
585
|
+
"description": "The count or for_each expression as written, without the ${ } around it. With call, the module call's."
|
|
586
|
+
},
|
|
587
|
+
"call": {
|
|
588
|
+
"type": "string",
|
|
589
|
+
"description": "With instances-module-uncounted: the module call that could not be counted, module.app or module.app.module.db."
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
},
|
|
593
|
+
"facts": {
|
|
594
|
+
"type": "object",
|
|
595
|
+
"description": "Added in contract 1 by #4529, written by chant 0.124.54 and newer. What an ownership engine observed about the node: ownership, markers, ownedBy, cloudIds, recordVersions and observedAt, each optional, in the shape of EngineFacts (packages/core/src/graph-schema/graph.schema.json). Set on a Pulumi member on plunge from its checked-in engine-graph.json. Never read for a decision."
|
|
596
|
+
},
|
|
551
597
|
"nested": {
|
|
552
598
|
"type": "string",
|
|
553
599
|
"description": "For a node read through a nested workspace (#2551): the nested workspace's member it belongs to. `member` is then the outer member, and the id is `<member>/<nested>/<id>`."
|
|
@@ -605,6 +651,10 @@
|
|
|
605
651
|
"type": "boolean",
|
|
606
652
|
"description": "Added in contract 1 by #3922. True when the edge leaves the pipeline `from` belongs to (#3910): a reusable-workflow call, a `workflow_run` trigger, a GitLab child or multi-project trigger, an include. Absent on every in-pipeline edge."
|
|
607
653
|
},
|
|
654
|
+
"grain": {
|
|
655
|
+
"enum": ["block", "instance", "property"],
|
|
656
|
+
"description": "Added in contract 1 by #4529, written by chant 0.124.54 and newer. What the edge joins: two blocks, two instances, or a property of one instance to another. A Pulumi member's dependencies and parent edges are instance; a plunge member's property edges are property. Absent when the source does not say."
|
|
657
|
+
},
|
|
608
658
|
"member": {
|
|
609
659
|
"type": "string"
|
|
610
660
|
}
|
|
@@ -1620,6 +1670,28 @@
|
|
|
1620
1670
|
}
|
|
1621
1671
|
}
|
|
1622
1672
|
}
|
|
1673
|
+
},
|
|
1674
|
+
"rootRead": {
|
|
1675
|
+
"type": "object",
|
|
1676
|
+
"description": "Which read answered one root (#4452), as packages/core/src/observation.ts RootRead. depth is the read asked for (plan for a plan-depth root, live+plan for a live root at the plan depth). fellBackTo is set only when that read failed: the read that answered instead (live is live-plan alone, for a live root), or declared when none did. reason is a short machine-stable cause such as no-credentials, needs-init, backend-unreachable or plan-failed, not prose to match on.",
|
|
1677
|
+
"required": [
|
|
1678
|
+
"depth"
|
|
1679
|
+
],
|
|
1680
|
+
"properties": {
|
|
1681
|
+
"depth": {
|
|
1682
|
+
"type": "string"
|
|
1683
|
+
},
|
|
1684
|
+
"fellBackTo": {
|
|
1685
|
+
"enum": [
|
|
1686
|
+
"state",
|
|
1687
|
+
"live",
|
|
1688
|
+
"declared"
|
|
1689
|
+
]
|
|
1690
|
+
},
|
|
1691
|
+
"reason": {
|
|
1692
|
+
"type": "string"
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1623
1695
|
}
|
|
1624
1696
|
}
|
|
1625
1697
|
}
|
|
@@ -4,7 +4,8 @@ import { tmpdir } from "node:os";
|
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
5
|
import { afterAll, afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
6
6
|
import { parseArgs } from "../cli/main";
|
|
7
|
-
import { parseDeclaration } from "./declaration";
|
|
7
|
+
import { parseDeclaration, resolveGroups } from "./declaration";
|
|
8
|
+
import { workingTree } from "./tree";
|
|
8
9
|
import { proposeWorkspace, runWorkspaceInit, sanitizeName } from "./init";
|
|
9
10
|
|
|
10
11
|
const REPO = join(import.meta.dirname, "..", "..", "..", "..");
|
|
@@ -129,6 +130,42 @@ describe("proposeWorkspace (#2534)", () => {
|
|
|
129
130
|
expect(() => parseDeclaration(JSON.stringify(declaration), "chant.workspace.json")).not.toThrow();
|
|
130
131
|
});
|
|
131
132
|
|
|
133
|
+
test("a workspace under an examples directory is a workspace member with a note; plain projects there stay examples (#4499)", () => {
|
|
134
|
+
const root = repo({
|
|
135
|
+
"examples/a/chant.config.ts": "",
|
|
136
|
+
"examples/b/chant.config.ts": "",
|
|
137
|
+
"examples/kit/chant.workspace.json": JSON.stringify({ name: "kit", schema: 1, members: [] }),
|
|
138
|
+
"examples/kit/chant.config.ts": "",
|
|
139
|
+
"examples/kit/app/chant.config.ts": "",
|
|
140
|
+
});
|
|
141
|
+
const { declaration } = proposeWorkspace(root, { name: "acme" });
|
|
142
|
+
expect(declaration.members).toEqual([
|
|
143
|
+
{
|
|
144
|
+
name: "kit",
|
|
145
|
+
dir: "examples/kit",
|
|
146
|
+
kind: "workspace",
|
|
147
|
+
because: "a workspace of its own under examples, an examples directory; a workspace is a member, never an example",
|
|
148
|
+
},
|
|
149
|
+
// The group's glob leaves the member's directory out by name.
|
|
150
|
+
{ name: "examples", kind: "examples", glob: "examples/!(kit)" },
|
|
151
|
+
]);
|
|
152
|
+
const parsed = parseDeclaration(JSON.stringify(declaration), "chant.workspace.json");
|
|
153
|
+
expect(resolveGroups(parsed, workingTree(root))[0].matches).toEqual(["examples/a", "examples/b"]);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("a workspace under an examples directory inside another package stays an example, since members don't nest (#4499)", () => {
|
|
157
|
+
const root = repo({
|
|
158
|
+
"package.json": JSON.stringify({ name: "acme", workspaces: ["lexicons/*"] }),
|
|
159
|
+
"lexicons/x/package.json": pkg("@acme/lexicon-x"),
|
|
160
|
+
"lexicons/x/examples/ws/chant.workspace.json": JSON.stringify({ name: "ws", schema: 1, members: [] }),
|
|
161
|
+
"lexicons/x/examples/ws/chant.config.ts": "",
|
|
162
|
+
"lexicons/x/examples/plain/chant.config.ts": "",
|
|
163
|
+
});
|
|
164
|
+
const { declaration } = proposeWorkspace(root, { name: "acme" });
|
|
165
|
+
expect(declaration.members.some((m) => m.kind === "workspace")).toBe(false);
|
|
166
|
+
expect(declaration.members.find((m) => m.kind === "examples")?.glob).toBe("lexicons/x/examples/*");
|
|
167
|
+
});
|
|
168
|
+
|
|
132
169
|
test("names the workspace by --name, then the remote, then the root package, then the directory", () => {
|
|
133
170
|
expect(proposeWorkspace(repo(ACME, "https://example.com/org/Platform.git"), { name: "given" }).declaration.name).toBe("given");
|
|
134
171
|
expect(proposeWorkspace(repo(ACME)).declaration.name).toBe("acme-monorepo");
|
package/src/workspace/init.ts
CHANGED
|
@@ -8,7 +8,11 @@
|
|
|
8
8
|
*
|
|
9
9
|
* - each outermost chant project (a chant.config.ts or .json) becomes a
|
|
10
10
|
* `chant` member, and the root's own config makes a root member `"."`;
|
|
11
|
-
* - each nested declaration becomes a `workspace` member;
|
|
11
|
+
* - each nested declaration becomes a `workspace` member; one under an
|
|
12
|
+
* examples-style directory does too, with a `because` saying where it sits
|
|
13
|
+
* (#4499), and the example group's glob leaves its directory out, unless
|
|
14
|
+
* it sits inside another package or project, where it stays an example
|
|
15
|
+
* since only the root member contains other members;
|
|
12
16
|
* - each other npm package, from the npm workspaces or any other
|
|
13
17
|
* package.json, becomes an `other` member with a `because`;
|
|
14
18
|
* - projects under an `examples`, `test` or `fixtures`-style directory become
|
|
@@ -342,8 +346,24 @@ function exampleGlobs(tree: WorkspaceTree, matches: string[], memberDirs: string
|
|
|
342
346
|
if (ms.length * 2 >= subdirs) wide.push(parent);
|
|
343
347
|
else explicit.push(...ms);
|
|
344
348
|
}
|
|
345
|
-
const
|
|
346
|
-
|
|
349
|
+
const blocked = (d: string): boolean => memberDirs.some((m) => m !== "" && isInside(m, d)) || (!matches.includes(d) && holdsChantProject(tree, d));
|
|
350
|
+
const safe = (glob: string): boolean => expandGlob(tree, glob).every((d) => !blocked(d));
|
|
351
|
+
/**
|
|
352
|
+
* `<prefix>/*` when it is safe, else `<prefix>/!(a|b)` leaving out the
|
|
353
|
+
* directories that block it (a workspace member under an examples
|
|
354
|
+
* directory, #4499), when that is safe and still covers every match the
|
|
355
|
+
* prefix's parents hold. Undefined when neither works.
|
|
356
|
+
*/
|
|
357
|
+
const lastSegment = (prefix: string, parents: readonly string[]): string | undefined => {
|
|
358
|
+
const all = `${prefix}/*`;
|
|
359
|
+
if (safe(all)) return all;
|
|
360
|
+
const names = [...new Set(expandGlob(tree, all).filter(blocked).map((d) => d.slice(d.lastIndexOf("/") + 1)))].sort();
|
|
361
|
+
if (names.length === 0 || names.some((n) => /[*?[\]{}()!+@|]/.test(n))) return undefined;
|
|
362
|
+
const glob = `${prefix}/!(${names.join("|")})`;
|
|
363
|
+
if (!safe(glob)) return undefined;
|
|
364
|
+
const reached = new Set(expandGlob(tree, glob));
|
|
365
|
+
return matches.every((m) => !parents.includes(dirOf(m)) || reached.has(m)) ? glob : undefined;
|
|
366
|
+
};
|
|
347
367
|
|
|
348
368
|
const globs: string[] = [];
|
|
349
369
|
const left = new Set(wide);
|
|
@@ -358,11 +378,17 @@ function exampleGlobs(tree: WorkspaceTree, matches: string[], memberDirs: string
|
|
|
358
378
|
}
|
|
359
379
|
for (const [pattern, parents] of [...candidates].sort((a, b) => b[1].length - a[1].length)) {
|
|
360
380
|
const open = parents.filter((p) => left.has(p));
|
|
361
|
-
if (open.length < 2
|
|
362
|
-
|
|
381
|
+
if (open.length < 2) continue;
|
|
382
|
+
const glob = lastSegment(pattern, open);
|
|
383
|
+
if (glob === undefined) continue;
|
|
384
|
+
globs.push(glob);
|
|
363
385
|
for (const p of open) left.delete(p);
|
|
364
386
|
}
|
|
365
|
-
for (const p of left)
|
|
387
|
+
for (const p of left) {
|
|
388
|
+
const glob = lastSegment(p, [p]);
|
|
389
|
+
if (glob !== undefined) globs.push(glob);
|
|
390
|
+
else explicit.push(...(byParent.get(p) ?? []));
|
|
391
|
+
}
|
|
366
392
|
// Explicit matches a glob already covers need no entry of their own.
|
|
367
393
|
const covered = new Set(globs.flatMap((g) => expandGlob(tree, g)));
|
|
368
394
|
for (const m of explicit) if (!covered.has(m)) globs.push(m);
|
|
@@ -422,7 +448,14 @@ export function proposeWorkspace(root: string, options: { name?: string } = {}):
|
|
|
422
448
|
const declDirs = dirsWith((n) => (DECLARATION_FILES as readonly string[]).includes(n));
|
|
423
449
|
const pkgDirs = dirsWith((n) => n === "package.json");
|
|
424
450
|
|
|
425
|
-
|
|
451
|
+
// A declaration under an examples-style directory is a `workspace` member
|
|
452
|
+
// too (#4499, ruled), with a note saying where it sits. Plain projects
|
|
453
|
+
// there stay examples. Only the root member contains other members, so one
|
|
454
|
+
// that sits inside another package or project (a lexicon shipping a whole
|
|
455
|
+
// workspace as an example, chant#4468) stays an example of its group.
|
|
456
|
+
const insideAnother = (d: string): boolean =>
|
|
457
|
+
[...pkgDirs, ...configDirs, ...declDirs].some((o) => o !== "" && o !== d && isInside(d, o));
|
|
458
|
+
const nested = outermost([...declDirs].filter((d) => d !== "" && !(exampleMatch(d) && insideAnother(d))));
|
|
426
459
|
const notNested = (d: string) => !nested.some((n) => isInside(d, n));
|
|
427
460
|
|
|
428
461
|
const projects = outermost([...configDirs].filter((d) => d !== "" && notNested(d)));
|
|
@@ -476,7 +509,16 @@ export function proposeWorkspace(root: string, options: { name?: string } = {}):
|
|
|
476
509
|
const taken = new Set<string>([name]);
|
|
477
510
|
const entries: (ProposedEntry & { sort: string })[] = [];
|
|
478
511
|
if (configDirs.has("")) entries.push({ sort: "", name: uniqueName(memberName(tree, "", name), taken), dir: ".", kind: "chant" });
|
|
479
|
-
for (const d of nested)
|
|
512
|
+
for (const d of nested) {
|
|
513
|
+
const ex = exampleMatch(d);
|
|
514
|
+
entries.push({
|
|
515
|
+
sort: d,
|
|
516
|
+
name: uniqueName(memberName(tree, d, name), taken),
|
|
517
|
+
dir: d,
|
|
518
|
+
kind: "workspace",
|
|
519
|
+
...(ex ? { because: `a workspace of its own under ${ex.parent}, an examples directory; a workspace is a member, never an example` } : {}),
|
|
520
|
+
});
|
|
521
|
+
}
|
|
480
522
|
for (const d of chantMembers) entries.push({ sort: d, name: uniqueName(memberName(tree, d, name), taken), dir: d, kind: "chant" });
|
|
481
523
|
for (const d of packages) {
|
|
482
524
|
entries.push({
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
* intent-decision-contested on the server, which still fires), W-004
|
|
15
15
|
* (done, from intent-pin-drifted on the spec, which does not fire) and
|
|
16
16
|
* W-005 (open, implements dec-002 and dec-003, no gap source).
|
|
17
|
+
*
|
|
18
|
+
* Kept fast (#4502): a walk reads the repository through git, so the tests
|
|
19
|
+
* that only read a region share one walk of it. The one test that edits the
|
|
20
|
+
* working tree walks afresh.
|
|
17
21
|
*/
|
|
18
22
|
|
|
19
23
|
import { readFileSync } from "node:fs";
|
|
@@ -106,13 +110,25 @@ const intent = contract(intentSchema);
|
|
|
106
110
|
const records = contract(recordsSchema);
|
|
107
111
|
type Result = Exclude<IntentDocument, { error: unknown }>;
|
|
108
112
|
|
|
109
|
-
async function
|
|
113
|
+
async function freshWalk(region: string): Promise<Result> {
|
|
110
114
|
const { doc } = await intentGraph({ cwd: root, region, kinds: ["decisions/decision.kind.mjs", "work/work.kind.mjs"].map((k) => join(root, k)) });
|
|
111
115
|
intent.expectValid(doc);
|
|
112
116
|
if ("error" in doc) throw new Error(`${doc.error.code}: ${doc.error.message}`);
|
|
113
117
|
return doc;
|
|
114
118
|
}
|
|
115
119
|
|
|
120
|
+
const walks = new Map<string, Promise<Result>>();
|
|
121
|
+
|
|
122
|
+
/** The walk of `region` over the committed fixture, made once and shared by the tests that only read it. */
|
|
123
|
+
function walk(region: string): Promise<Result> {
|
|
124
|
+
let w = walks.get(region);
|
|
125
|
+
if (!w) {
|
|
126
|
+
w = freshWalk(region);
|
|
127
|
+
walks.set(region, w);
|
|
128
|
+
}
|
|
129
|
+
return w;
|
|
130
|
+
}
|
|
131
|
+
|
|
116
132
|
const findingsOf = (doc: Result, code: string) => doc.nodes.filter((n): n is FindingNode => n.kind === "finding" && n.code === code);
|
|
117
133
|
|
|
118
134
|
describe("intent-pin-stale (#2686)", () => {
|
|
@@ -166,7 +182,7 @@ describe("intent-decision-contested (#2686)", () => {
|
|
|
166
182
|
test("a decision whose dissents are all addressed or withdrawn is not contested", async () => {
|
|
167
183
|
writeFiles(root, { "decisions/dec-003-server.md": DEC_003.replace(`"note": "The port is wrong.",`, `"note": "The port is wrong.", "addressed_by": "acme/studio#8",`) });
|
|
168
184
|
try {
|
|
169
|
-
const doc = await
|
|
185
|
+
const doc = await freshWalk("app/server.mjs");
|
|
170
186
|
expect(findingsOf(doc, "intent-decision-contested")).toEqual([]);
|
|
171
187
|
} finally {
|
|
172
188
|
writeFiles(root, { "decisions/dec-003-server.md": DEC_003 });
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
},
|
|
103
103
|
"row": {
|
|
104
104
|
"type": "object",
|
|
105
|
-
"description": "One row, keyed by column. Every row starts with member: the workspace member whose ledger it came from, or null outside a workspace. A value is a string, a number, a boolean, an object or array (a JSON column), or null.",
|
|
105
|
+
"description": "One row, keyed by column. Every row starts with member: the workspace member whose ledger it came from, or null outside a workspace. A value is a string, a number, a boolean, an object or array (a JSON column), or null. A runs row's root_member, added within version 1 by #4500, written by chant 0.124.54 and newer, is the member whose directory holds the terraform root a TerraformApplyOp run applied, or null when that is unknown (another kind of run, or a run whose Init step failed before it resolved the root, #4508; a failed terraform init still names it, #4512); a row from an older chant lacks it. A resources row's marker_stack, marker_env, engine_ownership and engine_owned_by, added within version 1 by #4534, written by chant 0.124.54 and newer, are the stack and env the resource's chant marker names and an ownership engine's verdict and what bound the node (never read for a decision), or null when unknown; a row from an older chant lacks them.",
|
|
106
106
|
"required": [
|
|
107
107
|
"member"
|
|
108
108
|
],
|
|
@@ -143,6 +143,7 @@ export function foldNested(graph: WorkspaceGraph, member: ComposedMember, inner:
|
|
|
143
143
|
};
|
|
144
144
|
if (node.compositeInstance) n.compositeInstance = prefixed(outer, node.compositeInstance);
|
|
145
145
|
if (node.runtimeOwner) n.runtimeOwner = prefixed(outer, node.runtimeOwner);
|
|
146
|
+
if (node.instanceOf) n.instanceOf = prefixed(outer, node.instanceOf);
|
|
146
147
|
if (node.compositeParent) n.compositeParent = node.compositeParent;
|
|
147
148
|
// sourceLoc is relative to the member's directory: the outer member's is the nested root.
|
|
148
149
|
const dir = dirs.get(node.member);
|
|
@@ -153,6 +153,16 @@
|
|
|
153
153
|
},
|
|
154
154
|
"status": { "enum": ["applied", "failed", "waiting", "plan-failed"] },
|
|
155
155
|
"message": { "type": "string", "description": "With waiting: why an approval that stands does not count under --require-review." },
|
|
156
|
+
"covered": {
|
|
157
|
+
"type": "object",
|
|
158
|
+
"required": ["digest", "filledInputs"],
|
|
159
|
+
"description": "Added within contract version 1 by #4419. The first approval covered this round's plan, so no gate of its own was decided and approval is the first one. The plan touched only components and logical ids the first plan previewed, with the same actions, and only inputs the first plan marked unknown differed.",
|
|
160
|
+
"properties": {
|
|
161
|
+
"digest": { "type": "string", "pattern": "^(?:jcs1-)?sha256:[0-9a-f]{64}$", "description": "The digest of the first approval, which the coverage is bound to: the report's digest." },
|
|
162
|
+
"filledInputs": { "type": "array", "items": { "type": "string" }, "description": "The inputs the first plan marked unknown that this plan had a value for, as <component>.<output>, sorted." }
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
"notCovered": { "type": "string", "description": "Added within contract version 1 by #4419. Why an approval that stands for the first plan did not cover this round, so the round asked for its own." },
|
|
156
166
|
"changeSet": { "type": "object", "description": "The change-set document the round planned. Its digest equals digest." }
|
|
157
167
|
}
|
|
158
168
|
}
|
|
@@ -188,7 +198,7 @@
|
|
|
188
198
|
"member": { "type": "string", "description": "The member's name in the change set: the root, for a terraform-family step." },
|
|
189
199
|
"component": { "type": "string" },
|
|
190
200
|
"planDigest": { "type": ["string", "null"], "description": "What a gate on this member alone binds. null when it failed to plan." },
|
|
191
|
-
"status": { "enum": ["planned", "plan-failed", "applied", "failed", "blocked", "waiting"], "description": "waiting (#3999): held back because its plan read an upstream output that applied as another value, or was known only after apply; it waits on an approval of its plan in rounds." },
|
|
201
|
+
"status": { "enum": ["planned", "plan-failed", "applied", "failed", "blocked", "waiting", "not-started"], "description": "waiting (#3999): held back because its plan read an upstream output that applied as another value, or was known only after apply; it waits on an approval of its plan in rounds. not-started (ws-107, #4440, written by chant 0.124.54 and newer): a member of a group whose apply stopped before its part began." },
|
|
192
202
|
"counts": {
|
|
193
203
|
"type": "object",
|
|
194
204
|
"required": ["create", "update", "replace", "delete"],
|
|
@@ -208,15 +218,78 @@
|
|
|
208
218
|
"unknownInputs": {
|
|
209
219
|
"type": "array",
|
|
210
220
|
"items": { "type": "string" },
|
|
211
|
-
"description": "#3999: the upstream outputs its plan read that the change's plans could not say, as <component>.<output>, sorted. Known only after that upstream applies
|
|
221
|
+
"description": "#3999: the upstream outputs its plan read that the change's plans could not say, as <component>.<output>, sorted. Known only after that upstream applies. The first approval covers the round that plans the member again when that plan does only what the preview showed, with only these inputs filled in; anything else waits for an approval of its own."
|
|
212
222
|
},
|
|
213
223
|
"buildInputs": {
|
|
214
224
|
"type": "array",
|
|
215
225
|
"items": { "type": "string" },
|
|
216
226
|
"description": "#3999: the published artifact identities its plan read from a build in the same change, as <component>.publish.<field>, sorted. Known only after the build runs and never approved again: the build's provenance binds them, so the member applies without a later round."
|
|
217
227
|
},
|
|
228
|
+
"reads": {
|
|
229
|
+
"type": "array",
|
|
230
|
+
"description": "Added within contract version 1, written by chant 0.124.52 and newer. Every other component's output its steps read, one entry per upstream: the output names, sorted, and under unknown the ones its plan had no value for. A read whose value the plan knew is listed too. Absent when it reads none.",
|
|
231
|
+
"items": {
|
|
232
|
+
"type": "object",
|
|
233
|
+
"required": ["upstream", "outputs"],
|
|
234
|
+
"additionalProperties": false,
|
|
235
|
+
"properties": {
|
|
236
|
+
"upstream": { "type": "string", "description": "The component (or stack) whose outputs it reads." },
|
|
237
|
+
"outputs": { "type": "array", "items": { "type": "string" }, "description": "The output names it reads, sorted. publish.<field> for a published artifact." },
|
|
238
|
+
"unknown": { "type": "array", "items": { "type": "string" }, "description": "The ones its plan had no value for, sorted: known only after the upstream applies. Absent when every one was known." }
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
218
242
|
"round": { "type": "integer", "minimum": 2, "description": "Apply stage (#3999): the round whose plan it applied or waits on, when not the first. planDigest and counts are that round's." },
|
|
219
|
-
"held": { "type": "string", "description": "Apply stage (#3999): why the first round's plan did not apply." }
|
|
243
|
+
"held": { "type": "string", "description": "Apply stage (#3999): why the first round's plan did not apply." },
|
|
244
|
+
"group": { "type": "integer", "minimum": 0, "description": "Added within contract version 1 by #4446, written by chant 0.124.54 and newer. The index in groups of the group the member planned and applied with. Absent when it is in no group." },
|
|
245
|
+
"groupOutcome": {
|
|
246
|
+
"enum": ["applied", "partial", "failed", "not-started", "no-changes"],
|
|
247
|
+
"description": "Added within contract version 1 by #4446, written by chant 0.124.54 and newer. Apply stage: how the member's part of its group's apply ended, as the capability said. applied and no-changes give status applied, and what applied stays applied; partial and failed give status failed; not-started gives status not-started. pr-apply --resume plans partial, failed and not-started members again. Absent when the group did not run."
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"groups": {
|
|
253
|
+
"type": "array",
|
|
254
|
+
"description": "Added within contract version 1 by #4446, written by chant 0.124.54 and newer. The groups of components one capability planned and applied as one (ws-107), in plan order of their first member. On a resumed apply, what is left of each approved group, grouped again. Absent when none formed.",
|
|
255
|
+
"items": {
|
|
256
|
+
"type": "object",
|
|
257
|
+
"required": ["capability", "components", "wave", "digest"],
|
|
258
|
+
"additionalProperties": false,
|
|
259
|
+
"properties": {
|
|
260
|
+
"capability": { "type": "string", "description": "The kind of the capability every member's one step names, such as terraform-apply." },
|
|
261
|
+
"components": { "type": "array", "minItems": 2, "items": { "type": "string" }, "description": "The members, by component, in apply order: upstreams first." },
|
|
262
|
+
"wave": { "type": "integer", "minimum": 1, "description": "The 1-based wave of selection.waves the group ran in." },
|
|
263
|
+
"digest": { "type": ["string", "null"], "description": "The group digest folded into each member's planDigest. null when the group failed to plan." },
|
|
264
|
+
"error": { "type": "string", "description": "Why the group failed to plan. Every member is then plan-failed." },
|
|
265
|
+
"reads": {
|
|
266
|
+
"type": "array",
|
|
267
|
+
"description": "Each read of another member that its plan did not know, which the group's apply computes, sorted by component then ref. Absent when none.",
|
|
268
|
+
"items": {
|
|
269
|
+
"type": "object",
|
|
270
|
+
"required": ["component", "ref"],
|
|
271
|
+
"additionalProperties": false,
|
|
272
|
+
"properties": {
|
|
273
|
+
"component": { "type": "string", "description": "The member that reads." },
|
|
274
|
+
"ref": { "type": "string", "description": "What it reads, as <component>.<output>." }
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"fallbacks": {
|
|
282
|
+
"type": "array",
|
|
283
|
+
"description": "Added within contract version 1 by #4446, written by chant 0.124.54 and newer. Each component in the change whose capability declares planGroup and runGroup, that a read joins to another such component of its kind, and that ended in no group, sorted by component. Absent when none.",
|
|
284
|
+
"items": {
|
|
285
|
+
"type": "object",
|
|
286
|
+
"required": ["component", "capability", "kind", "reason"],
|
|
287
|
+
"additionalProperties": false,
|
|
288
|
+
"properties": {
|
|
289
|
+
"component": { "type": "string" },
|
|
290
|
+
"capability": { "type": "string", "description": "The kind of the capability its step names." },
|
|
291
|
+
"kind": { "type": "string", "description": "Why, as a kind: core's steps (its deploy has more than one step), split (a component outside the group lies on a dependency path between it and the rest), alone (the capability dropped the other members of its group and a group of one is no group), cycle (placing the group would order two groups each before the other) or error (the capability's groupFallback threw), or the capability's own, for the whole group or for each member it drops. off: the capability's setting turns grouping off; the note does not print it." },
|
|
292
|
+
"reason": { "type": "string", "description": "The reason as printed." }
|
|
220
293
|
}
|
|
221
294
|
}
|
|
222
295
|
},
|