@intentius/chant 0.79.0 → 0.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts +30 -0
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/report-html.d.ts +5 -0
- package/dist/audit/report-html.d.ts.map +1 -1
- package/dist/audit/report-model.d.ts +13 -0
- package/dist/audit/report-model.d.ts.map +1 -1
- package/dist/audit/terraform-state.d.ts +13 -0
- package/dist/audit/terraform-state.d.ts.map +1 -1
- package/dist/cli/command-group.d.ts +6 -0
- package/dist/cli/command-group.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts +44 -3
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.d.ts +8 -0
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/import-agents.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/update.d.ts +6 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/vendor.d.ts +5 -0
- package/dist/cli/commands/vendor.d.ts.map +1 -1
- package/dist/cli/conflict-check.d.ts +6 -0
- package/dist/cli/conflict-check.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/components.d.ts.map +1 -1
- package/dist/cli/handlers/dev.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/init.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +7 -0
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/promote.d.ts +20 -0
- package/dist/cli/handlers/promote.d.ts.map +1 -0
- package/dist/cli/handlers/run-generate.d.ts +39 -0
- package/dist/cli/handlers/run-generate.d.ts.map +1 -0
- package/dist/cli/handlers/run.d.ts +4 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/vendor.d.ts +8 -3
- package/dist/cli/handlers/vendor.d.ts.map +1 -1
- package/dist/cli/main.d.ts +12 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/plugins.d.ts +14 -0
- package/dist/cli/plugins.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +46 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/fetch.d.ts +10 -0
- package/dist/codegen/fetch.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/cli-support.d.ts +3 -1
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/driver.d.ts +16 -2
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/gate-plan.d.ts +40 -0
- package/dist/components/gate-plan.d.ts.map +1 -0
- package/dist/components/pilots/alb-ecs.pilot.d.ts +7 -1
- package/dist/components/pilots/alb-ecs.pilot.d.ts.map +1 -1
- package/dist/components/presets/ecs-fargate.d.ts +10 -4
- package/dist/components/presets/ecs-fargate.d.ts.map +1 -1
- package/dist/components/promote.d.ts +264 -0
- package/dist/components/promote.d.ts.map +1 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/run.d.ts.map +1 -1
- package/dist/components/verbs/build-archive.d.ts +22 -11
- package/dist/components/verbs/build-archive.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/config-static.d.ts +59 -0
- package/dist/config-static.d.ts.map +1 -0
- package/dist/config.d.ts +104 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/content-digest.d.ts +17 -0
- package/dist/content-digest.d.ts.map +1 -0
- package/dist/discovery/files.d.ts +48 -4
- package/dist/discovery/files.d.ts.map +1 -1
- package/dist/discovery/fold-import.d.ts +32 -1
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.d.ts +20 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/fork.d.ts +20 -0
- package/dist/discovery/sandbox/fork.d.ts.map +1 -1
- package/dist/discovery/walk.d.ts +119 -0
- package/dist/discovery/walk.d.ts.map +1 -0
- package/dist/graph-ir.d.ts +17 -1
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/join-key.d.ts +31 -0
- package/dist/join-key.d.ts.map +1 -0
- package/dist/lexicon-module.d.ts +110 -0
- package/dist/lexicon-module.d.ts.map +1 -0
- package/dist/lexicon.d.ts +82 -1
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/build-ledger-store.d.ts.map +1 -1
- package/dist/lifecycle/digest.d.ts +5 -1
- package/dist/lifecycle/digest.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +20 -5
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +64 -0
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/lease.d.ts +8 -1
- package/dist/lifecycle/lease.d.ts.map +1 -1
- package/dist/lifecycle/legacy-digest.d.ts +59 -0
- package/dist/lifecycle/legacy-digest.d.ts.map +1 -0
- package/dist/lifecycle/member-ledger.d.ts +67 -0
- package/dist/lifecycle/member-ledger.d.ts.map +1 -0
- package/dist/lifecycle/plan-digest.d.ts +4 -3
- package/dist/lifecycle/plan-digest.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts +42 -1
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/status.d.ts +90 -5
- package/dist/lifecycle/status.d.ts.map +1 -1
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts +2 -3
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.d.ts +32 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/index.d.ts +2 -0
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/propose-upgrade.d.ts +75 -0
- package/dist/op/activities/propose-upgrade.d.ts.map +1 -0
- package/dist/op/activity-contract-registry.d.ts.map +1 -1
- package/dist/op/activity-registry.d.ts.map +1 -1
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-name.d.ts +7 -0
- package/dist/op/gate-name.d.ts.map +1 -1
- package/dist/op/gate-summary.d.ts +16 -0
- package/dist/op/gate-summary.d.ts.map +1 -1
- package/dist/op/gate.d.ts +16 -2
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/generate-pipeline.d.ts.map +1 -1
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/project-root.d.ts +26 -0
- package/dist/project-root.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.d.ts +37 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -0
- package/dist/workspace/__fixtures__/two-member-workspace.d.ts +11 -0
- package/dist/workspace/__fixtures__/two-member-workspace.d.ts.map +1 -0
- package/dist/workspace/checks/generated.d.ts +156 -0
- package/dist/workspace/checks/generated.d.ts.map +1 -0
- package/dist/workspace/checks/ledgers.d.ts +78 -0
- package/dist/workspace/checks/ledgers.d.ts.map +1 -0
- package/dist/workspace/checks/links.d.ts +25 -0
- package/dist/workspace/checks/links.d.ts.map +1 -0
- package/dist/workspace/checks/pipelines.d.ts +76 -0
- package/dist/workspace/checks/pipelines.d.ts.map +1 -0
- package/dist/workspace/checks.d.ts +161 -0
- package/dist/workspace/checks.d.ts.map +1 -0
- package/dist/workspace/compose-graph.d.ts +115 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -0
- package/dist/workspace/compose-reports.d.ts +68 -0
- package/dist/workspace/compose-reports.d.ts.map +1 -0
- package/dist/workspace/declaration.d.ts +220 -0
- package/dist/workspace/declaration.d.ts.map +1 -0
- package/dist/workspace/declaration.schema.json +434 -0
- package/dist/workspace/generated-files.d.ts +65 -0
- package/dist/workspace/generated-files.d.ts.map +1 -0
- package/dist/workspace/glob.d.ts +13 -0
- package/dist/workspace/glob.d.ts.map +1 -0
- package/dist/workspace/graph-cli.d.ts +75 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -0
- package/dist/workspace/init.d.ts +96 -0
- package/dist/workspace/init.d.ts.map +1 -0
- package/dist/workspace/jsonc.d.ts +38 -0
- package/dist/workspace/jsonc.d.ts.map +1 -0
- package/dist/workspace/kinds.d.ts +192 -0
- package/dist/workspace/kinds.d.ts.map +1 -0
- package/dist/workspace/lineage-check.d.ts +84 -0
- package/dist/workspace/lineage-check.d.ts.map +1 -0
- package/dist/workspace/lineage-cli.d.ts +31 -0
- package/dist/workspace/lineage-cli.d.ts.map +1 -0
- package/dist/workspace/lineage-init.d.ts +101 -0
- package/dist/workspace/lineage-init.d.ts.map +1 -0
- package/dist/workspace/lineage-lock.d.ts +258 -0
- package/dist/workspace/lineage-lock.d.ts.map +1 -0
- package/dist/workspace/lineage-merge.d.ts +14 -0
- package/dist/workspace/lineage-merge.d.ts.map +1 -0
- package/dist/workspace/lineage-migrations.d.ts +178 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -0
- package/dist/workspace/lineage-update.d.ts +59 -0
- package/dist/workspace/lineage-update.d.ts.map +1 -0
- package/dist/workspace/lineage-upgrade-cli.d.ts +40 -0
- package/dist/workspace/lineage-upgrade-cli.d.ts.map +1 -0
- package/dist/workspace/lineage-upgrade.d.ts +146 -0
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -0
- package/dist/workspace/lineage-vendor.d.ts +63 -0
- package/dist/workspace/lineage-vendor.d.ts.map +1 -0
- package/dist/workspace/lineage-version.d.ts +32 -0
- package/dist/workspace/lineage-version.d.ts.map +1 -0
- package/dist/workspace/links.d.ts +150 -0
- package/dist/workspace/links.d.ts.map +1 -0
- package/dist/workspace/ls.d.ts +99 -0
- package/dist/workspace/ls.d.ts.map +1 -0
- package/dist/workspace/member-commands.d.ts +139 -0
- package/dist/workspace/member-commands.d.ts.map +1 -0
- package/dist/workspace/member-handles.d.ts +54 -0
- package/dist/workspace/member-handles.d.ts.map +1 -0
- package/dist/workspace/member-pipeline.d.ts +143 -0
- package/dist/workspace/member-pipeline.d.ts.map +1 -0
- package/dist/workspace/member-run.d.ts +67 -0
- package/dist/workspace/member-run.d.ts.map +1 -0
- package/dist/workspace/reason-codes.d.ts +65 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -0
- package/dist/workspace/record-source.d.ts +22 -0
- package/dist/workspace/record-source.d.ts.map +1 -0
- package/dist/workspace/records-cli.d.ts +81 -0
- package/dist/workspace/records-cli.d.ts.map +1 -0
- package/dist/workspace/records.d.ts +118 -0
- package/dist/workspace/records.d.ts.map +1 -0
- package/dist/workspace/root-refusal.d.ts +53 -0
- package/dist/workspace/root-refusal.d.ts.map +1 -0
- package/dist/workspace/status.d.ts +150 -0
- package/dist/workspace/status.d.ts.map +1 -0
- package/dist/workspace/template-manifest.d.ts +90 -0
- package/dist/workspace/template-manifest.d.ts.map +1 -0
- package/dist/workspace/tree.d.ts +36 -0
- package/dist/workspace/tree.d.ts.map +1 -0
- package/dist/workspace/trust/attestor.d.ts +67 -0
- package/dist/workspace/trust/attestor.d.ts.map +1 -0
- package/dist/workspace/trust/policy.d.ts +111 -0
- package/dist/workspace/trust/policy.d.ts.map +1 -0
- package/dist/workspace/trust/provenance.d.ts +67 -0
- package/dist/workspace/trust/provenance.d.ts.map +1 -0
- package/dist/workspace/trust/ssh-commit.d.ts +43 -0
- package/dist/workspace/trust/ssh-commit.d.ts.map +1 -0
- package/dist/workspace/trust/test-repo.d.ts +42 -0
- package/dist/workspace/trust/test-repo.d.ts.map +1 -0
- package/dist/workspace/trust/verify-cli.d.ts +9 -0
- package/dist/workspace/trust/verify-cli.d.ts.map +1 -0
- package/dist/workspace/trust/verify.d.ts +66 -0
- package/dist/workspace/trust/verify.d.ts.map +1 -0
- package/dist/workspace/which-chant.d.ts +58 -0
- package/dist/workspace/which-chant.d.ts.map +1 -0
- package/dist/workspace/workspace-kinds.schema.json +133 -0
- package/package.json +4 -3
- package/src/audit/core.ts +13 -2
- package/src/audit/discover.ts +102 -36
- package/src/audit/report-html.ts +3 -1
- package/src/audit/report-model.ts +14 -1
- package/src/audit/terraform-state.test.ts +81 -1
- package/src/audit/terraform-state.ts +25 -0
- package/src/cli/command-group.ts +7 -0
- package/src/cli/commands/audit-truncation.test.ts +167 -0
- package/src/cli/commands/audit.ts +132 -29
- package/src/cli/commands/check-lexicon-examples.ts +2 -1
- package/src/cli/commands/check-lexicon.ts +24 -0
- package/src/cli/commands/doctor.test.ts +30 -0
- package/src/cli/commands/doctor.ts +21 -0
- package/src/cli/commands/import-agents.ts +15 -4
- package/src/cli/commands/init.ts +76 -25
- package/src/cli/commands/lint.test.ts +52 -1
- package/src/cli/commands/lint.ts +41 -71
- package/src/cli/commands/onboard.ts +15 -0
- package/src/cli/commands/update.ts +18 -5
- package/src/cli/commands/vendor.ts +11 -6
- package/src/cli/conflict-check.test.ts +18 -1
- package/src/cli/conflict-check.ts +13 -0
- package/src/cli/discovery-skip.test.ts +168 -0
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +38 -0
- package/src/cli/handlers/build-member.test.ts +127 -0
- package/src/cli/handlers/build.test.ts +11 -0
- package/src/cli/handlers/build.ts +35 -1
- package/src/cli/handlers/components.test.ts +127 -0
- package/src/cli/handlers/components.ts +70 -8
- package/src/cli/handlers/dev.ts +6 -1
- package/src/cli/handlers/fan-out.ts +9 -2
- package/src/cli/handlers/graph.test.ts +20 -0
- package/src/cli/handlers/graph.ts +4 -2
- package/src/cli/handlers/init.ts +54 -1
- package/src/cli/handlers/lifecycle.ts +2 -1
- package/src/cli/handlers/misc.ts +16 -0
- package/src/cli/handlers/operator.test.ts +68 -0
- package/src/cli/handlers/operator.ts +39 -10
- package/src/cli/handlers/promote.test.ts +377 -0
- package/src/cli/handlers/promote.ts +391 -0
- package/src/cli/handlers/run-generate-member.test.ts +83 -0
- package/src/cli/handlers/run-generate.test.ts +158 -0
- package/src/cli/handlers/run-generate.ts +168 -0
- package/src/cli/handlers/run.test.ts +47 -0
- package/src/cli/handlers/run.ts +41 -6
- package/src/cli/handlers/vendor.ts +147 -43
- package/src/cli/main.test.ts +137 -1
- package/src/cli/main.ts +290 -24
- package/src/cli/mcp/op-tools.ts +2 -1
- package/src/cli/path-lexicon-messages.test.ts +152 -0
- package/src/cli/plugins.ts +43 -5
- package/src/cli/registry.ts +46 -1
- package/src/cli/static-config-read.test.ts +208 -0
- package/src/codegen/fetch.test.ts +63 -1
- package/src/codegen/fetch.ts +30 -1
- package/src/components/__fixtures__/alb-ecs-service.json +0 -8
- package/src/components/capability-plugin-loader.ts +3 -1
- package/src/components/cli-support.ts +9 -3
- package/src/components/discover.test.ts +27 -57
- package/src/components/discover.ts +20 -51
- package/src/components/driver.test.ts +90 -12
- package/src/components/driver.ts +43 -5
- package/src/components/fan-out-support.ts +2 -1
- package/src/components/gate-plan.ts +53 -0
- package/src/components/pilots/README.md +1 -1
- package/src/components/pilots/alb-ecs.pilot.ts +7 -7
- package/src/components/presets/ecs-fargate.ts +10 -5
- package/src/components/promote.test.ts +645 -0
- package/src/components/promote.ts +641 -0
- package/src/components/sandbox/driver.ts +8 -8
- package/src/components/sandbox/run.ts +4 -1
- package/src/components/verbs/build-archive.ts +27 -21
- package/src/components/verbs/run-agent.ts +3 -5
- package/src/config-static.test.ts +136 -0
- package/src/config-static.ts +232 -0
- package/src/config.test.ts +40 -0
- package/src/config.ts +161 -11
- package/src/content-digest.test.ts +120 -0
- package/src/content-digest.ts +21 -0
- package/src/discovery/files.test.ts +127 -1
- package/src/discovery/files.ts +91 -59
- package/src/discovery/fold-import.ts +127 -9
- package/src/discovery/index.ts +1 -0
- package/src/discovery/sandbox/driver.ts +73 -35
- package/src/discovery/sandbox/fork-diagnostic.test.ts +136 -13
- package/src/discovery/sandbox/fork.ts +83 -43
- package/src/discovery/sandbox/path-lexicon-multifile.test.ts +285 -0
- package/src/discovery/sandbox/path-lexicon-parity.test.ts +162 -0
- package/src/discovery/walk.test.ts +263 -0
- package/src/discovery/walk.ts +334 -0
- package/src/effect-receipt.ts +2 -2
- package/src/graph-ir.ts +18 -1
- package/src/join-key.test.ts +25 -0
- package/src/join-key.ts +39 -0
- package/src/lexicon-module.test.ts +203 -0
- package/src/lexicon-module.ts +215 -0
- package/src/lexicon.ts +105 -1
- package/src/lifecycle/build-ledger-store.ts +13 -2
- package/src/lifecycle/digest.ts +9 -5
- package/src/lifecycle/gate-ledger.test.ts +20 -0
- package/src/lifecycle/gate-ledger.ts +28 -6
- package/src/lifecycle/git.test.ts +13 -1
- package/src/lifecycle/git.ts +221 -176
- package/src/lifecycle/lease.ts +25 -10
- package/src/lifecycle/legacy-digest.test.ts +206 -0
- package/src/lifecycle/legacy-digest.ts +103 -0
- package/src/lifecycle/member-ledger.test.ts +319 -0
- package/src/lifecycle/member-ledger.ts +145 -0
- package/src/lifecycle/plan-digest.ts +7 -7
- package/src/lifecycle/release-ledger.test.ts +20 -0
- package/src/lifecycle/release-ledger.ts +53 -3
- package/src/lifecycle/status.test.ts +151 -1
- package/src/lifecycle/status.ts +228 -7
- package/src/lint/rules/comp/comp003-mutating-no-rollback.ts +2 -3
- package/src/op/activities/activity-contracts.ts +37 -0
- package/src/op/activities/index.ts +10 -0
- package/src/op/activities/propose-upgrade.ts +206 -0
- package/src/op/activity-contract-registry.ts +18 -4
- package/src/op/activity-registry.ts +26 -0
- package/src/op/discover.test.ts +14 -4
- package/src/op/discover.ts +19 -23
- package/src/op/gate-approval.ts +3 -1
- package/src/op/gate-name.ts +8 -0
- package/src/op/gate-summary.test.ts +14 -0
- package/src/op/gate-summary.ts +25 -2
- package/src/op/gate.ts +36 -7
- package/src/op/generate-pipeline.test.ts +14 -5
- package/src/op/generate-pipeline.ts +2 -1
- package/src/op/runtimes/local.ts +2 -1
- package/src/project-root.test.ts +66 -1
- package/src/project-root.ts +48 -0
- package/src/workspace/__fixtures__/contract-repo.ts +100 -0
- package/src/workspace/__fixtures__/two-member-workspace.ts +35 -0
- package/src/workspace/behold-kinds.test.ts +162 -0
- package/src/workspace/check-contract.test.ts +127 -0
- package/src/workspace/check.schema.json +347 -0
- package/src/workspace/checks/generated.test.ts +287 -0
- package/src/workspace/checks/generated.ts +475 -0
- package/src/workspace/checks/ledgers.test.ts +139 -0
- package/src/workspace/checks/ledgers.ts +246 -0
- package/src/workspace/checks/links.ts +183 -0
- package/src/workspace/checks/pipelines.test.ts +133 -0
- package/src/workspace/checks/pipelines.ts +225 -0
- package/src/workspace/checks-repo.test.ts +71 -0
- package/src/workspace/checks.test.ts +450 -0
- package/src/workspace/checks.ts +461 -0
- package/src/workspace/compose-graph.test.ts +146 -0
- package/src/workspace/compose-graph.ts +228 -0
- package/src/workspace/compose-reports.test.ts +109 -0
- package/src/workspace/compose-reports.ts +186 -0
- package/src/workspace/declaration.schema.json +434 -0
- package/src/workspace/declaration.test.ts +347 -0
- package/src/workspace/declaration.ts +623 -0
- package/src/workspace/generated-files.test.ts +114 -0
- package/src/workspace/generated-files.ts +94 -0
- package/src/workspace/glob.ts +49 -0
- package/src/workspace/graph-cli.ts +220 -0
- package/src/workspace/graph-contract.test.ts +204 -0
- package/src/workspace/graph.schema.json +662 -0
- package/src/workspace/init.test.ts +223 -0
- package/src/workspace/init.ts +585 -0
- package/src/workspace/jsonc.test.ts +65 -0
- package/src/workspace/jsonc.ts +231 -0
- package/src/workspace/kinds.test.ts +288 -0
- package/src/workspace/kinds.ts +506 -0
- package/src/workspace/lineage-check.ts +264 -0
- package/src/workspace/lineage-cli.ts +114 -0
- package/src/workspace/lineage-init.test.ts +231 -0
- package/src/workspace/lineage-init.ts +365 -0
- package/src/workspace/lineage-lock.test.ts +224 -0
- package/src/workspace/lineage-lock.ts +357 -0
- package/src/workspace/lineage-merge.ts +44 -0
- package/src/workspace/lineage-migrations.test.ts +178 -0
- package/src/workspace/lineage-migrations.ts +343 -0
- package/src/workspace/lineage-update.ts +160 -0
- package/src/workspace/lineage-upgrade-cli.ts +151 -0
- package/src/workspace/lineage-upgrade.test.ts +474 -0
- package/src/workspace/lineage-upgrade.ts +624 -0
- package/src/workspace/lineage-vendor.test.ts +126 -0
- package/src/workspace/lineage-vendor.ts +215 -0
- package/src/workspace/lineage-version.ts +127 -0
- package/src/workspace/links.test.ts +344 -0
- package/src/workspace/links.ts +331 -0
- package/src/workspace/ls-contract.test.ts +200 -0
- package/src/workspace/ls.schema.json +190 -0
- package/src/workspace/ls.ts +254 -0
- package/src/workspace/member-commands.e2e.test.ts +244 -0
- package/src/workspace/member-commands.test.ts +217 -0
- package/src/workspace/member-commands.ts +540 -0
- package/src/workspace/member-handles.test.ts +76 -0
- package/src/workspace/member-handles.ts +228 -0
- package/src/workspace/member-pipeline.test.ts +135 -0
- package/src/workspace/member-pipeline.ts +317 -0
- package/src/workspace/member-run.ts +146 -0
- package/src/workspace/read-contract.test.ts +129 -0
- package/src/workspace/reason-codes.test.ts +113 -0
- package/src/workspace/reason-codes.ts +81 -0
- package/src/workspace/record-source.ts +117 -0
- package/src/workspace/records-cli.ts +198 -0
- package/src/workspace/records-contract.test.ts +93 -0
- package/src/workspace/records.schema.json +150 -0
- package/src/workspace/records.test.ts +243 -0
- package/src/workspace/records.ts +384 -0
- package/src/workspace/root-refusal.ts +97 -0
- package/src/workspace/status-contract.test.ts +308 -0
- package/src/workspace/status.schema.json +210 -0
- package/src/workspace/status.ts +412 -0
- package/src/workspace/template-manifest.test.ts +79 -0
- package/src/workspace/template-manifest.ts +221 -0
- package/src/workspace/tree.ts +132 -0
- package/src/workspace/trust/attestor.ts +93 -0
- package/src/workspace/trust/policy.ts +306 -0
- package/src/workspace/trust/provenance.ts +181 -0
- package/src/workspace/trust/ssh-commit.ts +138 -0
- package/src/workspace/trust/test-repo.ts +138 -0
- package/src/workspace/trust/trust.test.ts +397 -0
- package/src/workspace/trust/verify-cli.ts +56 -0
- package/src/workspace/trust/verify.ts +194 -0
- package/src/workspace/which-chant.test.ts +117 -0
- package/src/workspace/which-chant.ts +151 -0
- package/src/workspace/workspace-kinds.schema.json +133 -0
package/src/cli/handlers/init.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { formatError } from "../format";
|
|
1
|
+
import { formatError, formatSuccess, formatWarning } from "../format";
|
|
2
2
|
import type { CommandContext } from "../registry";
|
|
3
3
|
|
|
4
4
|
export async function runInit(ctx: CommandContext): Promise<number> {
|
|
5
5
|
const { args } = ctx;
|
|
6
6
|
|
|
7
|
+
if (args.migrateFrom !== undefined) return runInitFrom(ctx);
|
|
8
|
+
|
|
7
9
|
if (!args.lexicon) {
|
|
8
10
|
console.error(formatError({
|
|
9
11
|
message: "Missing --lexicon flag",
|
|
@@ -47,3 +49,54 @@ export async function runInitLexicon(ctx: CommandContext): Promise<number> {
|
|
|
47
49
|
await printInitLexiconResult(result);
|
|
48
50
|
return result.success ? 0 : 1;
|
|
49
51
|
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* `chant init --from <repo>@<ref>[#<member>] [--param <name>=<value>]... [path]`
|
|
55
|
+
* (#2540, #2627): copy a template repository at a ref, substitute the
|
|
56
|
+
* parameters its `chant.template.json` declares, and record its lineage.
|
|
57
|
+
* The template brings its own lexicons and configuration, so `--lexicon` and
|
|
58
|
+
* `--template` do not apply.
|
|
59
|
+
*/
|
|
60
|
+
async function runInitFrom(ctx: CommandContext): Promise<number> {
|
|
61
|
+
const { args } = ctx;
|
|
62
|
+
const usage = "Usage: chant init --from <repo>@<ref>[#<member>] [--param <name>=<value>]... [path]";
|
|
63
|
+
if (!args.migrateFrom) {
|
|
64
|
+
console.error(formatError({ message: "--from needs a template: <repo>@<ref>[#<member>]", hint: usage }));
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
if (args.lexicon || args.template) {
|
|
68
|
+
console.error(formatError({ message: "--from cannot be combined with --lexicon or --template", hint: usage }));
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
71
|
+
if (args.paramsFile) {
|
|
72
|
+
console.error(formatError({ message: "--params-file does not apply to init --from; pass each value with --param <name>=<value>", hint: usage }));
|
|
73
|
+
return 1;
|
|
74
|
+
}
|
|
75
|
+
const { parseParamArgs } = await import("../../workspace/template-manifest");
|
|
76
|
+
let params: Record<string, string>;
|
|
77
|
+
try {
|
|
78
|
+
params = parseParamArgs(args.param ?? []);
|
|
79
|
+
} catch (err) {
|
|
80
|
+
console.error(formatError({ message: (err as Error).message, hint: usage }));
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
const { initFromCommand } = await import("../../workspace/lineage-init");
|
|
84
|
+
const result = await initFromCommand({
|
|
85
|
+
from: args.migrateFrom,
|
|
86
|
+
path: args.path === "." ? undefined : args.path,
|
|
87
|
+
force: args.force,
|
|
88
|
+
params,
|
|
89
|
+
});
|
|
90
|
+
if (!result.success) {
|
|
91
|
+
console.error(formatError({ message: result.error ?? "init --from failed", hint: usage }));
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
for (const warning of result.warnings) console.error(formatWarning({ message: warning }));
|
|
95
|
+
console.log(formatSuccess("Created:"));
|
|
96
|
+
for (const file of result.createdFiles) console.log(` ${file}`);
|
|
97
|
+
console.log("");
|
|
98
|
+
console.log(`Lineage: ${result.spec!.id} at ${result.spec!.ref} (${result.commit!.slice(0, 12)}), recorded in .chant/workspace.lock.json`);
|
|
99
|
+
const parameters = Object.entries(result.parameters ?? {});
|
|
100
|
+
if (parameters.length > 0) console.log(`Parameters: ${parameters.map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(", ")}`);
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { lexiconNames } from "../../lexicon-module";
|
|
1
2
|
import { resolve } from "node:path";
|
|
2
3
|
import { commandBuildParams } from "../build-params-cli";
|
|
3
4
|
import { build } from "../../build";
|
|
@@ -559,7 +560,7 @@ interface BetweenDiffArgs {
|
|
|
559
560
|
async function runLifecycleDiffBetween(args: BetweenDiffArgs): Promise<number> {
|
|
560
561
|
await fetchLifecycle();
|
|
561
562
|
const { config } = await loadChantConfig(resolve("."));
|
|
562
|
-
const lexicons = args.lexiconFilter ? [args.lexiconFilter] : config.lexicons ?? [];
|
|
563
|
+
const lexicons = args.lexiconFilter ? [args.lexiconFilter] : lexiconNames(config.lexicons ?? []);
|
|
563
564
|
if (lexicons.length === 0) {
|
|
564
565
|
console.error(formatError({ message: "No lexicons to diff — pass a lexicon or declare `lexicons` in chant.config." }));
|
|
565
566
|
return 1;
|
package/src/cli/handlers/misc.ts
CHANGED
|
@@ -114,6 +114,21 @@ export async function runAudit(ctx: CommandContext): Promise<number> {
|
|
|
114
114
|
return result.exitCode;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
// `--max-files` (#2528) only means something to the local walk. A URL audit
|
|
118
|
+
// fetches through the host's tree API with its own caps, so the flag is
|
|
119
|
+
// refused there rather than silently ignored.
|
|
120
|
+
const maxFiles = args.maxFiles;
|
|
121
|
+
if (maxFiles !== undefined) {
|
|
122
|
+
if (!Number.isInteger(maxFiles) || maxFiles < 1) {
|
|
123
|
+
console.error(formatError({ message: `--max-files must be a positive integer (got "${maxFiles}")` }));
|
|
124
|
+
return 1;
|
|
125
|
+
}
|
|
126
|
+
if (/^https?:\/\//.test(args.path)) {
|
|
127
|
+
console.error(formatError({ message: "--max-files applies to a local path; a repository URL is fetched with its own limits." }));
|
|
128
|
+
return 1;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
117
132
|
// HTML report customization: --template <file> (full override) + --theme <file> (JSON knobs).
|
|
118
133
|
let template: string | undefined;
|
|
119
134
|
let theme: ReportTheme | undefined;
|
|
@@ -146,6 +161,7 @@ export async function runAudit(ctx: CommandContext): Promise<number> {
|
|
|
146
161
|
template,
|
|
147
162
|
theme,
|
|
148
163
|
toolVersion: CHANT_VERSION,
|
|
164
|
+
maxFiles,
|
|
149
165
|
});
|
|
150
166
|
printAuditResult(result);
|
|
151
167
|
return result.exitCode;
|
|
@@ -897,6 +897,74 @@ describe("runApprove — the resolution names the plan it approves (#2300)", ()
|
|
|
897
897
|
});
|
|
898
898
|
});
|
|
899
899
|
|
|
900
|
+
/**
|
|
901
|
+
* #2574 — a component's gate ledger holds every environment's pending facts.
|
|
902
|
+
* The approval records the environment it answers, and `--env` picks it.
|
|
903
|
+
*/
|
|
904
|
+
describe("runApprove — a component gate approval names its environment (#2574)", () => {
|
|
905
|
+
const PLAN_STAGING = `sha256:${"c".repeat(64)}`;
|
|
906
|
+
const PLAN_PROD = `sha256:${"d".repeat(64)}`;
|
|
907
|
+
function seedTwoEnvironments(): void {
|
|
908
|
+
readGateLedgerMock.mockResolvedValue({
|
|
909
|
+
resolutions: [],
|
|
910
|
+
pending: [
|
|
911
|
+
{
|
|
912
|
+
version: 1, kind: "pending", op: "search-service", gate: "release",
|
|
913
|
+
timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
|
|
914
|
+
planDigest: PLAN_STAGING, environment: "staging",
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
version: 1, kind: "pending", op: "search-service", gate: "release",
|
|
918
|
+
timestamp: "2026-01-02T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
|
|
919
|
+
planDigest: PLAN_PROD, environment: "prod",
|
|
920
|
+
},
|
|
921
|
+
],
|
|
922
|
+
malformed: 0,
|
|
923
|
+
});
|
|
924
|
+
appendGateResolutionMock.mockImplementation(async (input: object) => ({ commit: "sha", record: { version: 1, ...input } }));
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
test("without --env it approves the newest pending fact and records its environment", async () => {
|
|
928
|
+
seedTwoEnvironments();
|
|
929
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
930
|
+
|
|
931
|
+
expect(await runApprove(ctx({ path: "search-service", extraPositional: "release", actor: "alex" }))).toBe(0);
|
|
932
|
+
expect(appendGateResolutionMock).toHaveBeenCalledWith(expect.objectContaining({ planDigest: PLAN_PROD, environment: "prod" }));
|
|
933
|
+
expect(errSpy.mock.calls.map((c) => String(c[0])).join("\n")).toContain(`approves the plan ${PLAN_PROD} in environment "prod"`);
|
|
934
|
+
errSpy.mockRestore();
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
test("--env picks that environment's pending fact", async () => {
|
|
938
|
+
seedTwoEnvironments();
|
|
939
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
940
|
+
|
|
941
|
+
expect(await runApprove(ctx({ path: "search-service", extraPositional: "release", actor: "alex", env: "staging" }))).toBe(0);
|
|
942
|
+
expect(appendGateResolutionMock).toHaveBeenCalledWith(expect.objectContaining({ planDigest: PLAN_STAGING, environment: "staging" }));
|
|
943
|
+
errSpy.mockRestore();
|
|
944
|
+
});
|
|
945
|
+
|
|
946
|
+
test("--env with no pending fact there refuses and writes nothing", async () => {
|
|
947
|
+
seedTwoEnvironments();
|
|
948
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
949
|
+
|
|
950
|
+
expect(await runApprove(ctx({ path: "search-service", extraPositional: "release", actor: "alex", env: "dev" }))).toBe(1);
|
|
951
|
+
expect(appendGateResolutionMock).not.toHaveBeenCalled();
|
|
952
|
+
expect(errSpy.mock.calls.map((c) => String(c[0])).join("\n")).toContain('no pending fact in environment "dev"');
|
|
953
|
+
errSpy.mockRestore();
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
test("--env is ignored for a gate whose pending facts record no environment", async () => {
|
|
957
|
+
seedPending("fountain-apply", "rollout-gate", PLAN_A);
|
|
958
|
+
appendGateResolutionMock.mockImplementation(async (input: object) => ({ commit: "sha", record: { version: 1, ...input } }));
|
|
959
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
960
|
+
|
|
961
|
+
expect(await runApprove(ctx({ path: "fountain-apply", extraPositional: "rollout-gate", actor: "alex", env: "prod" }))).toBe(0);
|
|
962
|
+
expect(appendGateResolutionMock.mock.calls[0][0]).toMatchObject({ planDigest: PLAN_A });
|
|
963
|
+
expect(appendGateResolutionMock.mock.calls[0][0]).not.toHaveProperty("environment");
|
|
964
|
+
errSpy.mockRestore();
|
|
965
|
+
});
|
|
966
|
+
});
|
|
967
|
+
|
|
900
968
|
describe("runApprove — the ledger branch is read before it is appended to (#2303)", () => {
|
|
901
969
|
test("reads the branch before recording the resolution", async () => {
|
|
902
970
|
seedPending("fountain-apply", "rollout-gate", PLAN_A);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* `run.ts`'s `runOpLocal` shape (SIGINT → AbortController, `loadActivities`/
|
|
7
7
|
* `loadProfiles` from the project's configured lexicons).
|
|
8
8
|
*/
|
|
9
|
+
import { lexiconNames } from "../../lexicon-module";
|
|
9
10
|
import { loadChantConfig } from "../../config";
|
|
10
11
|
import { build } from "../../build";
|
|
11
12
|
import { isResourceDeclarable } from "../../declarable";
|
|
@@ -43,7 +44,7 @@ import {
|
|
|
43
44
|
type GateApprover, type GatePolicyDecision, type GatePolicyEvaluator, type ResolvedGateApproval,
|
|
44
45
|
} from "../../op/gate-approval";
|
|
45
46
|
import { approverOf, tallyGateApprovals } from "../../op/gate";
|
|
46
|
-
import { FAN_OUT_GATE_OP } from "../../op/gate-name";
|
|
47
|
+
import { FAN_OUT_GATE_OP, WORKSPACE_UPGRADE_GATE_OP } from "../../op/gate-name";
|
|
47
48
|
import { pushLifecycle, requireLifecycleLedger } from "../../lifecycle/git";
|
|
48
49
|
import { formatError, formatWarning, formatSuccess, formatBold, formatInfo } from "../format";
|
|
49
50
|
import type { CommandContext } from "../registry";
|
|
@@ -52,7 +53,7 @@ import type { CommandContext } from "../registry";
|
|
|
52
53
|
async function loadOperatorActivities() {
|
|
53
54
|
let lexicons: string[] = [];
|
|
54
55
|
try {
|
|
55
|
-
lexicons = (await loadChantConfig(process.cwd())).config.lexicons ?? [];
|
|
56
|
+
lexicons = lexiconNames((await loadChantConfig(process.cwd())).config.lexicons ?? []);
|
|
56
57
|
} catch {
|
|
57
58
|
// No/invalid chant.config — fall back to base activities only.
|
|
58
59
|
}
|
|
@@ -688,7 +689,9 @@ export async function runApprove(ctx: CommandContext): Promise<number> {
|
|
|
688
689
|
console.error(formatInfo(
|
|
689
690
|
opName === FAN_OUT_GATE_OP
|
|
690
691
|
? `The next \`chant components fan-out\` decides this gate from scratch and records a fresh pending fact.`
|
|
691
|
-
:
|
|
692
|
+
: opName === WORKSPACE_UPGRADE_GATE_OP
|
|
693
|
+
? `The next \`chant workspace upgrade ${gate}\` decides this gate from scratch and records a fresh pending fact.`
|
|
694
|
+
: `The next \`chant run ${opName}\` decides this gate from scratch and records a fresh pending fact.`,
|
|
692
695
|
));
|
|
693
696
|
return 0;
|
|
694
697
|
}
|
|
@@ -702,6 +705,7 @@ export async function runApprove(ctx: CommandContext): Promise<number> {
|
|
|
702
705
|
note: ctx.args.note,
|
|
703
706
|
url: ctx.args.url,
|
|
704
707
|
plan: ctx.args.plan,
|
|
708
|
+
...(ctx.args.env !== undefined ? { environment: ctx.args.env } : {}),
|
|
705
709
|
allowSameOrigin: ctx.args.allowSameOrigin,
|
|
706
710
|
...(ctx.args.roles ? { roles: ctx.args.roles } : {}),
|
|
707
711
|
...(ctx.args.agent ? { agent: true } : {}),
|
|
@@ -712,7 +716,9 @@ export async function runApprove(ctx: CommandContext): Promise<number> {
|
|
|
712
716
|
`This records the resolution as a fact; it does not itself re-run anything. ` +
|
|
713
717
|
(opName === FAN_OUT_GATE_OP
|
|
714
718
|
? `Repeat the \`chant components fan-out\` command and it walks through gate "${gate}".`
|
|
715
|
-
:
|
|
719
|
+
: opName === WORKSPACE_UPGRADE_GATE_OP
|
|
720
|
+
? `Repeat \`chant workspace upgrade ${gate}\` with the same target, and it applies the patch this approval names.`
|
|
721
|
+
: `Run \`chant run ${opName}\` and it walks through gate "${gate}".`),
|
|
716
722
|
));
|
|
717
723
|
return 0;
|
|
718
724
|
}
|
|
@@ -746,6 +752,13 @@ export interface GateApprovalOptions {
|
|
|
746
752
|
* stays one command: run, read what it planned, approve it.
|
|
747
753
|
*/
|
|
748
754
|
plan?: string;
|
|
755
|
+
/**
|
|
756
|
+
* `--env <env>` (#2574) — which environment's pending fact a component gate
|
|
757
|
+
* approval answers. A component's gate ledger holds every environment's
|
|
758
|
+
* facts, so without it the newest one is approved. Ignored for a gate whose
|
|
759
|
+
* pending facts record no environment (every Op gate).
|
|
760
|
+
*/
|
|
761
|
+
environment?: string;
|
|
749
762
|
/** `--role` (#2508) — roles the approver claims. */
|
|
750
763
|
roles?: string[];
|
|
751
764
|
/**
|
|
@@ -785,7 +798,7 @@ export async function recordGateApproval(
|
|
|
785
798
|
// `fan-out` is the op name every `chant components fan-out` gate is recorded
|
|
786
799
|
// under (../handlers/fan-out.ts). It is a command rather than a declaration,
|
|
787
800
|
// so there is no `*.op.ts` to find and nothing is wrong when none is there.
|
|
788
|
-
if (!ops.has(opName) && opName !== FAN_OUT_GATE_OP) {
|
|
801
|
+
if (!ops.has(opName) && opName !== FAN_OUT_GATE_OP && opName !== WORKSPACE_UPGRADE_GATE_OP) {
|
|
789
802
|
console.error(formatWarning({
|
|
790
803
|
message: `Op "${opName}" was not found among discovered *.op.ts declarations — recording the resolution anyway`,
|
|
791
804
|
}));
|
|
@@ -825,6 +838,18 @@ export async function recordGateApproval(
|
|
|
825
838
|
// third fallback: approving with no plan in sight is the behaviour
|
|
826
839
|
// INTENTIUS/choudoufu#1026 measured, where the resolution authorised the
|
|
827
840
|
// next run rather than anything anyone had seen.
|
|
841
|
+
// #2574: a component gate's pending facts carry the environment they were
|
|
842
|
+
// recorded in, and an approval answers one environment. `--env` picks it;
|
|
843
|
+
// without it, the newest standing fact decides, and the success line below
|
|
844
|
+
// names the environment it chose.
|
|
845
|
+
const ledgerBefore = await readGateLedger(opName);
|
|
846
|
+
const pendingFor = (all: PendingGateRecord[]): PendingGateRecord[] => {
|
|
847
|
+
const bound = all.some((p) => p.gate === gate && p.environment !== undefined);
|
|
848
|
+
return bound && opts.environment !== undefined ? all.filter((p) => p.environment === opts.environment) : all;
|
|
849
|
+
};
|
|
850
|
+
const standing = latestPendingGate(pendingFor(ledgerBefore.pending), gate);
|
|
851
|
+
const environment = standing?.environment;
|
|
852
|
+
|
|
828
853
|
let planDigest: string | undefined;
|
|
829
854
|
if (opts.plan !== undefined) {
|
|
830
855
|
if (!isPlanDigest(opts.plan)) {
|
|
@@ -836,10 +861,12 @@ export async function recordGateApproval(
|
|
|
836
861
|
}
|
|
837
862
|
planDigest = opts.plan;
|
|
838
863
|
} else {
|
|
839
|
-
const standing = latestPendingGate((await readGateLedger(opName)).pending, gate);
|
|
840
864
|
if (!standing) {
|
|
841
865
|
console.error(formatError({
|
|
842
|
-
message:
|
|
866
|
+
message:
|
|
867
|
+
opts.environment !== undefined && ledgerBefore.pending.some((p) => p.gate === gate && p.environment !== undefined)
|
|
868
|
+
? `Gate "${gate}" on "${opName}" has no pending fact in environment "${opts.environment}", so there is no plan to approve`
|
|
869
|
+
: `Gate "${gate}" on "${opName}" has no pending fact, so there is no plan to approve`,
|
|
843
870
|
hint:
|
|
844
871
|
`Run \`chant run ${opName}\` first — it plans, stops at the gate, and records the plan this ` +
|
|
845
872
|
`approval would be for. To approve a plan you already have the digest for, pass ` +
|
|
@@ -858,7 +885,7 @@ export async function recordGateApproval(
|
|
|
858
885
|
// the way #2300 refuses a plan nobody approved.
|
|
859
886
|
const origin = opts.origin ?? currentGateOrigin();
|
|
860
887
|
const ledger = await readGateLedger(opName);
|
|
861
|
-
const standingForOrigin = latestPendingGate(ledger.pending, gate);
|
|
888
|
+
const standingForOrigin = latestPendingGate(pendingFor(ledger.pending), gate);
|
|
862
889
|
const refusal = sameOriginRefusal(standingForOrigin?.origin, origin);
|
|
863
890
|
if (refusal && !opts.allowSameOrigin) {
|
|
864
891
|
console.error(formatError({
|
|
@@ -934,6 +961,7 @@ export async function recordGateApproval(
|
|
|
934
961
|
...(opts.note ? { note: opts.note } : {}),
|
|
935
962
|
...(url ? { url } : {}),
|
|
936
963
|
...(planDigest !== undefined ? { planDigest } : {}),
|
|
964
|
+
...(environment !== undefined ? { environment } : {}),
|
|
937
965
|
origin,
|
|
938
966
|
...(refusal && opts.allowSameOrigin ? { sameOriginOverride: true } : {}),
|
|
939
967
|
});
|
|
@@ -949,8 +977,9 @@ export async function recordGateApproval(
|
|
|
949
977
|
));
|
|
950
978
|
if (record.planDigest) {
|
|
951
979
|
console.error(formatInfo(
|
|
952
|
-
`This approves the plan ${record.planDigest}
|
|
953
|
-
|
|
980
|
+
`This approves the plan ${record.planDigest}` +
|
|
981
|
+
(record.environment !== undefined ? ` in environment "${record.environment}"` : "") +
|
|
982
|
+
", and only that plan. A run whose fresh plan differs refuses rather than applying it.",
|
|
954
983
|
));
|
|
955
984
|
}
|
|
956
985
|
if (approval) {
|