@intentius/chant 0.80.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/discover.d.ts +8 -16
- 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 +4 -5
- package/dist/audit/terraform-state.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts +25 -9
- package/dist/cli/commands/audit.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.map +1 -1
- package/dist/cli/commands/lint.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/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/operator.d.ts +7 -0
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/promote.d.ts +7 -4
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/run-generate.d.ts.map +1 -1
- 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/plugins.d.ts +12 -7
- package/dist/cli/plugins.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +32 -0
- 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/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/gate-plan.d.ts +40 -0
- package/dist/components/gate-plan.d.ts.map +1 -0
- package/dist/components/promote.d.ts +60 -7
- package/dist/components/promote.d.ts.map +1 -1
- 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 +32 -10
- 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 +10 -5
- package/dist/discovery/files.d.ts.map +1 -1
- package/dist/discovery/fold-import.d.ts +20 -4
- 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 +4 -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 +51 -6
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon.d.ts +58 -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 +41 -8
- package/dist/lifecycle/legacy-digest.d.ts.map +1 -1
- 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 +18 -2
- 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/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/discover.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/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/records-cli.d.ts +28 -4
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records.d.ts.map +1 -1
- 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 +2 -1
- package/src/audit/discover.ts +66 -78
- package/src/audit/report-html.ts +3 -1
- package/src/audit/report-model.ts +14 -1
- package/src/audit/terraform-state.test.ts +4 -9
- package/src/audit/terraform-state.ts +4 -5
- package/src/cli/commands/audit-truncation.test.ts +167 -0
- package/src/cli/commands/audit.ts +89 -60
- package/src/cli/commands/check-lexicon.ts +24 -0
- package/src/cli/commands/doctor.test.ts +30 -0
- package/src/cli/commands/doctor.ts +18 -0
- package/src/cli/commands/import-agents.ts +6 -2
- package/src/cli/commands/init.ts +22 -3
- package/src/cli/commands/lint.test.ts +17 -23
- package/src/cli/commands/lint.ts +24 -84
- package/src/cli/commands/update.ts +13 -4
- package/src/cli/commands/vendor.ts +11 -6
- 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.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 +5 -3
- package/src/cli/handlers/fan-out.ts +9 -2
- package/src/cli/handlers/init.ts +54 -1
- package/src/cli/handlers/operator.test.ts +68 -0
- package/src/cli/handlers/operator.ts +37 -9
- package/src/cli/handlers/promote.test.ts +118 -2
- package/src/cli/handlers/promote.ts +82 -16
- package/src/cli/handlers/run-generate-member.test.ts +83 -0
- package/src/cli/handlers/run-generate.test.ts +6 -8
- package/src/cli/handlers/run-generate.ts +36 -1
- package/src/cli/handlers/run.test.ts +47 -0
- package/src/cli/handlers/run.ts +28 -5
- package/src/cli/handlers/vendor.ts +147 -43
- package/src/cli/main.test.ts +105 -1
- package/src/cli/main.ts +230 -17
- package/src/cli/plugins.ts +17 -17
- package/src/cli/registry.ts +32 -0
- 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/cli-support.ts +6 -1
- package/src/components/discover.test.ts +27 -57
- package/src/components/discover.ts +13 -68
- package/src/components/driver.test.ts +78 -1
- package/src/components/driver.ts +43 -7
- package/src/components/gate-plan.ts +53 -0
- package/src/components/promote.test.ts +276 -2
- package/src/components/promote.ts +119 -15
- 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 +2 -2
- package/src/config.ts +48 -15
- package/src/content-digest.test.ts +120 -0
- package/src/content-digest.ts +21 -0
- package/src/discovery/files.test.ts +10 -10
- package/src/discovery/files.ts +25 -81
- package/src/discovery/fold-import.ts +49 -5
- 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/walk.test.ts +263 -0
- package/src/discovery/walk.ts +334 -0
- package/src/effect-receipt.ts +2 -2
- package/src/graph-ir.ts +4 -1
- package/src/join-key.test.ts +25 -0
- package/src/join-key.ts +39 -0
- package/src/lexicon-module.ts +108 -10
- package/src/lexicon.ts +79 -1
- package/src/lifecycle/build-ledger-store.ts +11 -10
- 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 +115 -23
- package/src/lifecycle/legacy-digest.ts +60 -19
- 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 +23 -7
- package/src/lifecycle/status.test.ts +151 -1
- package/src/lifecycle/status.ts +228 -7
- 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/discover.test.ts +14 -4
- package/src/op/discover.ts +19 -27
- 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/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/records-cli.ts +86 -14
- package/src/workspace/records-contract.test.ts +5 -0
- package/src/workspace/records.schema.json +32 -2
- package/src/workspace/records.ts +3 -2
- 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/dist/components/unbound-gate-approval.d.ts +0 -24
- package/dist/components/unbound-gate-approval.d.ts.map +0 -1
- package/dist/discovery/convergence.d.ts +0 -97
- package/dist/discovery/convergence.d.ts.map +0 -1
- package/src/cli/commands/audit-walk-warnings.test.ts +0 -156
- package/src/components/unbound-gate-approval.test.ts +0 -82
- package/src/components/unbound-gate-approval.ts +0 -51
- package/src/discovery/convergence.test.ts +0 -231
- package/src/discovery/convergence.ts +0 -399
- package/src/op/discover-convergence.test.ts +0 -70
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace checks behind per-member pipelines (#2542; #2524 D19,
|
|
3
|
+
* ws-040, ws-041 and ws-042).
|
|
4
|
+
*
|
|
5
|
+
* - `WSP081`: each generated file has exactly one declarer. Two members that
|
|
6
|
+
* both list `.github/workflows/deploy.yml` would each overwrite the other's
|
|
7
|
+
* pipeline on every regeneration.
|
|
8
|
+
* - `WSP082`: a member declares generated files only inside its own
|
|
9
|
+
* directory, with one exception: forge CI files, which forges read from
|
|
10
|
+
* fixed paths at the repository root ({@link isForgePath}).
|
|
11
|
+
* - `WSP083`: linked members share at least one environment name. Names are
|
|
12
|
+
* matched exactly, with no mapping (ws-040), so this is a warning: a
|
|
13
|
+
* member with its own names still builds.
|
|
14
|
+
*
|
|
15
|
+
* The checks are pure functions over {@link MemberPipelineFacts}.
|
|
16
|
+
* {@link gatherPipelineFacts} collects those facts from a checkout, reading
|
|
17
|
+
* each member's generated-file record (../member-pipeline.ts), and
|
|
18
|
+
* `chant workspace check` gathers them before it runs {@link PIPELINE_CHECKS}
|
|
19
|
+
* (#2641).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import type { WorkspaceCheck, WorkspaceCheckContext, WorkspaceDiagnostic } from "../checks";
|
|
24
|
+
import type { Declaration } from "../declaration";
|
|
25
|
+
import { declaredMemberLinks } from "../links";
|
|
26
|
+
import { readGeneratedRecord } from "../member-pipeline";
|
|
27
|
+
|
|
28
|
+
export const WSP_ONE_DECLARER = "WSP081";
|
|
29
|
+
export const WSP_GENERATED_PLACEMENT = "WSP082";
|
|
30
|
+
export const WSP_LINKED_ENVIRONMENTS = "WSP083";
|
|
31
|
+
|
|
32
|
+
export interface PipelineFinding {
|
|
33
|
+
id: typeof WSP_ONE_DECLARER | typeof WSP_GENERATED_PLACEMENT | typeof WSP_LINKED_ENVIRONMENTS;
|
|
34
|
+
severity: "error" | "warning";
|
|
35
|
+
/** The members the finding is about, in declaration order. */
|
|
36
|
+
members: string[];
|
|
37
|
+
/** The generated file the finding is about, when there is one. */
|
|
38
|
+
path?: string;
|
|
39
|
+
message: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** What the pipeline checks need to know about one member. */
|
|
43
|
+
export interface MemberPipelineFacts {
|
|
44
|
+
name: string;
|
|
45
|
+
/** Relative to the repository root, with `/` separators; `"."` is the root. */
|
|
46
|
+
dir: string;
|
|
47
|
+
/** The generated files the member declares, relative to the repository root. */
|
|
48
|
+
generated: string[];
|
|
49
|
+
/** The environment names the member's pipelines deploy. */
|
|
50
|
+
environments: string[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** A link between two members: `consumer` reads something `producer` exposes (#2524 D6). */
|
|
54
|
+
export interface MemberLink {
|
|
55
|
+
consumer: string;
|
|
56
|
+
producer: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Whether `path` (repository-relative) is a forge CI file: a file directly in
|
|
61
|
+
* `.github/workflows/`, `.forgejo/workflows/` or `.gitea/workflows/`, the
|
|
62
|
+
* root `.gitlab-ci.yml`, or a file directly in `.gitlab/ci/`, which the root
|
|
63
|
+
* `.gitlab-ci.yml` includes. The exemption is this narrow on purpose (ws-042).
|
|
64
|
+
*/
|
|
65
|
+
export function isForgePath(path: string): boolean {
|
|
66
|
+
if (path === ".gitlab-ci.yml") return true;
|
|
67
|
+
return /^(\.github\/workflows|\.forgejo\/workflows|\.gitea\/workflows|\.gitlab\/ci)\/[^/]+$/.test(path);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function inside(path: string, dir: string): boolean {
|
|
71
|
+
return dir === "." || path === dir || path.startsWith(`${dir}/`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** `WSP081`: no two members declare the same generated file. */
|
|
75
|
+
export function checkOneDeclarer(facts: readonly MemberPipelineFacts[]): PipelineFinding[] {
|
|
76
|
+
const byPath = new Map<string, string[]>();
|
|
77
|
+
for (const f of facts) {
|
|
78
|
+
for (const path of new Set(f.generated)) byPath.set(path, [...(byPath.get(path) ?? []), f.name]);
|
|
79
|
+
}
|
|
80
|
+
const findings: PipelineFinding[] = [];
|
|
81
|
+
for (const [path, members] of [...byPath].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))) {
|
|
82
|
+
if (members.length < 2) continue;
|
|
83
|
+
findings.push({
|
|
84
|
+
id: WSP_ONE_DECLARER,
|
|
85
|
+
severity: "error",
|
|
86
|
+
members,
|
|
87
|
+
path,
|
|
88
|
+
message:
|
|
89
|
+
`members ${members.join(", ")} all declare ${path} as a generated file; each would overwrite ` +
|
|
90
|
+
`the others' output. Keep it in one member, and give the others their own file ` +
|
|
91
|
+
`(a member's pipeline is named after it by default).`,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return findings;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** `WSP082`: a member's generated files sit in its own directory, or are forge CI files. */
|
|
98
|
+
export function checkGeneratedPlacement(facts: readonly MemberPipelineFacts[]): PipelineFinding[] {
|
|
99
|
+
const findings: PipelineFinding[] = [];
|
|
100
|
+
for (const f of facts) {
|
|
101
|
+
for (const path of f.generated) {
|
|
102
|
+
if (inside(path, f.dir) || isForgePath(path)) continue;
|
|
103
|
+
findings.push({
|
|
104
|
+
id: WSP_GENERATED_PLACEMENT,
|
|
105
|
+
severity: "error",
|
|
106
|
+
members: [f.name],
|
|
107
|
+
path,
|
|
108
|
+
message:
|
|
109
|
+
`member ${f.name} declares ${path}, which is outside its directory (${f.dir}) and is not a forge ` +
|
|
110
|
+
`CI file. Only files in .github/workflows/, .forgejo/workflows/, .gitea/workflows/ or .gitlab/ci/, ` +
|
|
111
|
+
`and .gitlab-ci.yml, may sit outside the member that generates them.`,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return findings;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** `WSP083`: every link joins members that share an environment name, when both name any. */
|
|
119
|
+
export function checkLinkedEnvironments(facts: readonly MemberPipelineFacts[], links: readonly MemberLink[]): PipelineFinding[] {
|
|
120
|
+
const byName = new Map(facts.map((f) => [f.name, f]));
|
|
121
|
+
const order = new Map(facts.map((f, i) => [f.name, i]));
|
|
122
|
+
const seen = new Set<string>();
|
|
123
|
+
const findings: PipelineFinding[] = [];
|
|
124
|
+
for (const link of links) {
|
|
125
|
+
const a = byName.get(link.consumer);
|
|
126
|
+
const b = byName.get(link.producer);
|
|
127
|
+
if (!a || !b || a === b) continue;
|
|
128
|
+
const [first, second] = order.get(a.name)! <= order.get(b.name)! ? [a, b] : [b, a];
|
|
129
|
+
const key = `${first.name}\0${second.name}`;
|
|
130
|
+
if (seen.has(key)) continue;
|
|
131
|
+
seen.add(key);
|
|
132
|
+
// A member that names no environment has nothing to line up yet.
|
|
133
|
+
if (first.environments.length === 0 || second.environments.length === 0) continue;
|
|
134
|
+
const shared = first.environments.filter((e) => second.environments.includes(e));
|
|
135
|
+
if (shared.length > 0) continue;
|
|
136
|
+
const list = (f: MemberPipelineFacts) => [...new Set(f.environments)].sort().join(", ");
|
|
137
|
+
findings.push({
|
|
138
|
+
id: WSP_LINKED_ENVIRONMENTS,
|
|
139
|
+
severity: "warning",
|
|
140
|
+
members: [first.name, second.name],
|
|
141
|
+
message:
|
|
142
|
+
`linked members ${first.name} (${list(first)}) and ${second.name} (${list(second)}) share no ` +
|
|
143
|
+
`environment name. Names are matched exactly, so a view across members, such as ` +
|
|
144
|
+
`chant workspace status <env>, can't line their releases up. Rename one side to match.`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return findings;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Collect the facts from a checkout. `prefix` is the workspace root relative
|
|
152
|
+
* to the repository root (`"."` when they are the same). Each member's
|
|
153
|
+
* generated files and environments come from its generated-file record.
|
|
154
|
+
*/
|
|
155
|
+
export function gatherPipelineFacts(workspaceRoot: string, declaration: Declaration, prefix = "."): MemberPipelineFacts[] {
|
|
156
|
+
return declaration.members.map((m) => {
|
|
157
|
+
const record = readGeneratedRecord(m.dir === "." ? workspaceRoot : join(workspaceRoot, m.dir));
|
|
158
|
+
const dir = prefix === "." ? m.dir : m.dir === "." ? prefix : `${prefix}/${m.dir}`;
|
|
159
|
+
return {
|
|
160
|
+
name: m.name,
|
|
161
|
+
dir,
|
|
162
|
+
generated: record.files.map((f) => f.path),
|
|
163
|
+
environments: [...new Set(record.files.flatMap((f) => (f.env ? [f.env] : [])))],
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Run the three checks. `links` defaults to none; `chant workspace check`
|
|
170
|
+
* passes the declared member links (#2539).
|
|
171
|
+
*/
|
|
172
|
+
export function checkPipelines(facts: readonly MemberPipelineFacts[], links: readonly MemberLink[] = []): PipelineFinding[] {
|
|
173
|
+
return [...checkOneDeclarer(facts), ...checkGeneratedPlacement(facts), ...checkLinkedEnvironments(facts, links)];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// ── As workspace checks ──────────────────────────────────────────────────────
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* A finding as a workspace diagnostic. It sits at the first member it names,
|
|
180
|
+
* in declaration order, and that member's entry is the one that can carry a
|
|
181
|
+
* `suppress`.
|
|
182
|
+
*/
|
|
183
|
+
function toDiagnostic(check: WorkspaceCheck, ctx: WorkspaceCheckContext, f: PipelineFinding): WorkspaceDiagnostic {
|
|
184
|
+
const member = ctx.declaration.members.find((m) => m.name === f.members[0]);
|
|
185
|
+
return { checkId: check.id, severity: check.severity, message: f.message, entity: f.members[0], pointer: member?.pointer ?? "" };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** The member links `WSP083` compares: the pairs the declaration links (#2539). */
|
|
189
|
+
function declaredLinks(ctx: WorkspaceCheckContext): MemberLink[] {
|
|
190
|
+
return declaredMemberLinks(ctx.declaration);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** The pipeline checks, which read `ctx.facts.pipelines`. They find nothing when the facts were not gathered. */
|
|
194
|
+
export const PIPELINE_CHECKS: readonly WorkspaceCheck[] = [
|
|
195
|
+
{
|
|
196
|
+
id: WSP_ONE_DECLARER,
|
|
197
|
+
name: "generated-declared-twice",
|
|
198
|
+
description: "No two members record the same generated file, so no member's regeneration overwrites another's pipeline.",
|
|
199
|
+
severity: "error",
|
|
200
|
+
configurable: true,
|
|
201
|
+
check(ctx) {
|
|
202
|
+
return checkOneDeclarer(ctx.facts?.pipelines ?? []).map((f) => toDiagnostic(this, ctx, f));
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: WSP_GENERATED_PLACEMENT,
|
|
207
|
+
name: "generated-outside-member",
|
|
208
|
+
description: "A member's recorded generated files sit in its own directory, or are forge CI files at the fixed paths forges read.",
|
|
209
|
+
severity: "error",
|
|
210
|
+
configurable: true,
|
|
211
|
+
check(ctx) {
|
|
212
|
+
return checkGeneratedPlacement(ctx.facts?.pipelines ?? []).map((f) => toDiagnostic(this, ctx, f));
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: WSP_LINKED_ENVIRONMENTS,
|
|
217
|
+
name: "linked-environments-disjoint",
|
|
218
|
+
description: "Linked members share at least one environment name, matched exactly, when both name any.",
|
|
219
|
+
severity: "warning",
|
|
220
|
+
configurable: true,
|
|
221
|
+
check(ctx) {
|
|
222
|
+
return checkLinkedEnvironments(ctx.facts?.pipelines ?? [], declaredLinks(ctx)).map((f) => toDiagnostic(this, ctx, f));
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
];
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant workspace check` over chant's own trees (#2641): the repository's
|
|
3
|
+
* declaration (#2557), run from the root and from `reference-workspace/`,
|
|
4
|
+
* and the reference workspace (#2543) as a workspace of its own, copied out
|
|
5
|
+
* of the repository with its declaration. Every check runs, the member
|
|
6
|
+
* ledger, pipeline and generated-file checks included, and none may report
|
|
7
|
+
* an error. Warnings are fine: the `other` members are reported on purpose.
|
|
8
|
+
*
|
|
9
|
+
* Declared generators are not run here (`--generated`): on the chant
|
|
10
|
+
* repository they take about six minutes. The file sits beside the checks
|
|
11
|
+
* rather than in test/, whose files vitest includes one by one.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { execFileSync } from "node:child_process";
|
|
15
|
+
import { cpSync, existsSync, mkdtempSync, renameSync, rmSync } from "node:fs";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { dirname, join, resolve } from "node:path";
|
|
18
|
+
import { afterEach, describe, expect, test, vi } from "vitest";
|
|
19
|
+
import { parseArgs } from "../cli/main";
|
|
20
|
+
import { runWorkspaceCheck } from "./lineage-check";
|
|
21
|
+
|
|
22
|
+
const repoRoot = resolve(import.meta.dirname, "../../../..");
|
|
23
|
+
const fixture = join(repoRoot, "reference-workspace");
|
|
24
|
+
|
|
25
|
+
interface Report {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
declaration?: { ok: boolean; diagnostics: { ruleId: string; severity: string; message: string }[] };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** `chant workspace check --json` run in `cwd`, with its report. */
|
|
31
|
+
async function check(cwd: string): Promise<{ code: number; report: Report }> {
|
|
32
|
+
const out: string[] = [];
|
|
33
|
+
vi.spyOn(console, "log").mockImplementation((...a: unknown[]) => void out.push(a.join(" ")));
|
|
34
|
+
vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
35
|
+
vi.spyOn(process, "cwd").mockReturnValue(cwd);
|
|
36
|
+
const code = await runWorkspaceCheck({ args: parseArgs(["workspace", "check", "--json"]), plugins: [] } as never);
|
|
37
|
+
vi.restoreAllMocks();
|
|
38
|
+
return { code, report: JSON.parse(out.join("\n")) as Report };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const errors = (r: Report) => (r.declaration?.diagnostics ?? []).filter((d) => d.severity === "error").map((d) => `${d.ruleId}: ${d.message}`);
|
|
42
|
+
|
|
43
|
+
describe("chant workspace check on chant's own trees (#2641)", () => {
|
|
44
|
+
afterEach(() => vi.restoreAllMocks());
|
|
45
|
+
|
|
46
|
+
test("the chant repository's declaration has no error, from the root or from the reference workspace", async () => {
|
|
47
|
+
for (const cwd of [repoRoot, fixture]) {
|
|
48
|
+
const { code, report } = await check(cwd);
|
|
49
|
+
expect(report.declaration, cwd).toBeDefined();
|
|
50
|
+
expect(errors(report), cwd).toEqual([]);
|
|
51
|
+
expect(code, cwd).toBe(0);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("the reference workspace, copied out with its declaration, has no error", async () => {
|
|
56
|
+
const target = join(mkdtempSync(join(tmpdir(), "chant-2641-check-")), "ws");
|
|
57
|
+
try {
|
|
58
|
+
cpSync(fixture, target, { recursive: true, filter: (src) => !/(^|[\\/])(node_modules|dist)$/.test(src) });
|
|
59
|
+
// Until #2543 lands the fixture holds its declaration as a draft.
|
|
60
|
+
const draft = join(target, "chant.workspace.draft.json");
|
|
61
|
+
if (existsSync(draft)) renameSync(draft, join(target, "chant.workspace.json"));
|
|
62
|
+
execFileSync("git", ["init", "-q"], { cwd: target });
|
|
63
|
+
const { code, report } = await check(target);
|
|
64
|
+
expect(errors(report)).toEqual([]);
|
|
65
|
+
expect(report.declaration?.diagnostics.map((d) => d.ruleId)).toContain("WSP009");
|
|
66
|
+
expect(code).toBe(0);
|
|
67
|
+
} finally {
|
|
68
|
+
rmSync(dirname(target), { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|