@intentius/chant 0.124.46 → 0.124.49
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/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
- package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
- package/dist/__golden__/wave-loop/op-denied.json +16 -0
- package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on.json +16 -0
- package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/dist/__golden__/wave-loop/op-overridden.json +16 -0
- package/dist/__golden__/wave-loop/op-per-run.json +20 -0
- package/dist/__golden__/wave-loop/op-point.json +13 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
- package/dist/__golden__/wave-loop/op-sealed.json +10 -0
- package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/dist/__golden__/wave-loop/op-spend.json +10 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/dist/__golden__/wave-loop/op-wide.json +39 -0
- package/dist/action-pins.d.ts +61 -0
- package/dist/action-pins.d.ts.map +1 -0
- package/dist/action-pins.js +77 -0
- package/dist/cli/commands/carve.d.ts +3 -0
- package/dist/cli/commands/carve.d.ts.map +1 -1
- package/dist/cli/commands/carve.js +36 -7
- package/dist/cli/commands/import-report.d.ts +26 -0
- package/dist/cli/commands/import-report.d.ts.map +1 -0
- package/dist/cli/commands/import-report.js +65 -0
- package/dist/cli/commands/import.d.ts +11 -1
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +22 -3
- package/dist/cli/commands/migrate.d.ts +13 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +134 -10
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +41 -14
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +6 -1
- package/dist/cli/handlers/graph-reader.d.ts +26 -0
- package/dist/cli/handlers/graph-reader.d.ts.map +1 -0
- package/dist/cli/handlers/graph-reader.js +41 -0
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +14 -0
- package/dist/cli/handlers/ledger.d.ts +3 -0
- package/dist/cli/handlers/ledger.d.ts.map +1 -0
- package/dist/cli/handlers/ledger.js +55 -0
- package/dist/cli/handlers/migrate.d.ts.map +1 -1
- package/dist/cli/handlers/migrate.js +18 -11
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/misc.js +12 -1
- package/dist/cli/handlers/pr-env.js +2 -2
- package/dist/cli/handlers/pr.d.ts +15 -1
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +183 -40
- package/dist/cli/handlers/query.d.ts +7 -2
- package/dist/cli/handlers/query.d.ts.map +1 -1
- package/dist/cli/handlers/query.js +16 -4
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +6 -3
- package/dist/cli/handlers/search.d.ts +2 -4
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +13 -39
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +87 -14
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +47 -2
- package/dist/cli/registry.d.ts +22 -4
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/builders.d.ts +5 -1
- package/dist/components/builders.d.ts.map +1 -1
- package/dist/components/builders.js +5 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.js +16 -1
- package/dist/components/capability-plugin.d.ts +14 -0
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/pr-hooks.d.ts +21 -1
- package/dist/components/pr-hooks.d.ts.map +1 -1
- package/dist/components/pr-hooks.js +72 -4
- package/dist/components/pr-pipeline.d.ts +45 -10
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +47 -14
- package/dist/components/pr-policy.d.ts +36 -0
- package/dist/components/pr-policy.d.ts.map +1 -1
- package/dist/components/pr-policy.js +36 -0
- package/dist/components/pr-run.d.ts +3 -0
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +1 -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 +5 -1
- package/dist/components/verbs/index.d.ts +2 -0
- package/dist/components/verbs/index.d.ts.map +1 -1
- package/dist/components/verbs/index.js +2 -0
- package/dist/components/verbs/publish-artifact.d.ts +65 -0
- package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
- package/dist/components/verbs/publish-artifact.js +74 -0
- package/dist/components/verbs/publish-image.d.ts +129 -0
- package/dist/components/verbs/publish-image.d.ts.map +1 -0
- package/dist/components/verbs/publish-image.js +145 -0
- package/dist/config-environments.d.ts +20 -0
- package/dist/config-environments.d.ts.map +1 -1
- package/dist/config-environments.js +12 -0
- package/dist/config.d.ts +25 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -2
- package/dist/gate-decision.d.ts +20 -2
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +30 -3
- package/dist/graph-ir.d.ts +25 -0
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-walk.d.ts +66 -0
- package/dist/graph-walk.d.ts.map +1 -0
- package/dist/graph-walk.js +70 -0
- package/dist/import/parser.d.ts +19 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/lexicon.d.ts +94 -6
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +11 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +2 -5
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/ledger-read.d.ts +65 -0
- package/dist/lifecycle/ledger-read.d.ts.map +1 -0
- package/dist/lifecycle/ledger-read.js +160 -0
- package/dist/lifecycle/release-workstation.d.ts +7 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -1
- package/dist/lifecycle/release-workstation.js +25 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -3
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +1 -0
- package/dist/lint/discover.js +3 -1
- package/dist/lint/post-synth.d.ts +127 -1
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/post-synth.js +84 -2
- package/dist/lint/rules/op/index.d.ts +1 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.js +2 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
- package/dist/op/activities/activity-contracts.d.ts +9 -6
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +5 -2
- package/dist/op/activities/index.d.ts +2 -2
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +1 -1
- package/dist/op/activities/review-agent.d.ts +90 -4
- package/dist/op/activities/review-agent.d.ts.map +1 -1
- package/dist/op/activities/review-agent.js +217 -19
- package/dist/op/activities/work-evidence.d.ts +8 -1
- package/dist/op/activities/work-evidence.d.ts.map +1 -1
- package/dist/op/activities/work-evidence.js +1 -0
- package/dist/op/builders.d.ts +9 -5
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +9 -5
- package/dist/op/composites/apply-op.d.ts +29 -2
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/apply-op.js +20 -1
- package/dist/op/gate-approval-base.d.ts +25 -0
- package/dist/op/gate-approval-base.d.ts.map +1 -0
- package/dist/op/gate-approval-base.js +71 -0
- package/dist/op/gate-approval.d.ts +18 -9
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-approval.js +13 -31
- package/dist/op/gate-name.d.ts +13 -0
- package/dist/op/gate-name.d.ts.map +1 -1
- package/dist/op/gate-name.js +14 -1
- package/dist/op/gate-quorum.d.ts +100 -3
- package/dist/op/gate-quorum.d.ts.map +1 -1
- package/dist/op/gate-quorum.js +108 -6
- package/dist/op/gate-review.d.ts +9 -0
- package/dist/op/gate-review.d.ts.map +1 -1
- package/dist/op/gate-review.js +13 -0
- package/dist/op/gate.d.ts +47 -5
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +25 -4
- package/dist/op/index.d.ts +3 -3
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +45 -3
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +68 -7
- package/dist/op/op-waves-run.d.ts +26 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +259 -13
- package/dist/op/op-waves.d.ts +72 -5
- package/dist/op/op-waves.d.ts.map +1 -1
- package/dist/op/op-waves.js +110 -15
- package/dist/op/runtime.d.ts +11 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/schedule-overdue.d.ts +16 -0
- package/dist/op/schedule-overdue.d.ts.map +1 -1
- package/dist/op/schedule-overdue.js +36 -0
- package/dist/op/stage-hooks.d.ts +9 -2
- package/dist/op/stage-hooks.d.ts.map +1 -1
- package/dist/op/stage-hooks.js +7 -5
- package/dist/op/workspace-run-env.d.ts +22 -0
- package/dist/op/workspace-run-env.d.ts.map +1 -0
- package/dist/op/workspace-run-env.js +21 -0
- package/dist/pr-forge.d.ts +24 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +47 -0
- package/dist/pr-loop.d.ts +10 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +4 -0
- package/dist/pr-migrations.d.ts +62 -0
- package/dist/pr-migrations.d.ts.map +1 -0
- package/dist/pr-migrations.js +50 -0
- package/dist/pr-post.d.ts +42 -0
- package/dist/pr-post.d.ts.map +1 -1
- package/dist/pr-post.js +68 -2
- package/dist/read-filter.d.ts +65 -0
- package/dist/read-filter.d.ts.map +1 -0
- package/dist/read-filter.js +179 -0
- package/dist/run-event.d.ts +1 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/terraform/carve.d.ts +24 -3
- package/dist/terraform/carve.d.ts.map +1 -1
- package/dist/terraform/carve.js +32 -14
- package/dist/terraform/cuts.d.ts +97 -0
- package/dist/terraform/cuts.d.ts.map +1 -0
- package/dist/terraform/cuts.js +138 -0
- package/dist/terraform/folds.d.ts +26 -0
- package/dist/terraform/folds.d.ts.map +1 -0
- package/dist/terraform/folds.js +38 -0
- package/dist/terraform/graph.d.ts.map +1 -1
- package/dist/terraform/graph.js +10 -0
- package/dist/terraform/reach.d.ts +140 -0
- package/dist/terraform/reach.d.ts.map +1 -0
- package/dist/terraform/reach.js +170 -0
- package/dist/terraform/score.d.ts +14 -0
- package/dist/terraform/score.d.ts.map +1 -1
- package/dist/terraform/score.js +14 -31
- package/dist/terraform/state.d.ts.map +1 -1
- package/dist/terraform/state.js +4 -2
- package/dist/terraform/types.d.ts +8 -0
- package/dist/terraform/types.d.ts.map +1 -1
- package/dist/wave-blocked.d.ts +10 -1
- package/dist/wave-blocked.d.ts.map +1 -1
- package/dist/wave-blocked.js +31 -3
- package/dist/wave-runtime.mjs +264 -254
- package/dist/workspace/check.schema.json +13 -2
- package/dist/workspace/checks/ci-branch.d.ts +44 -0
- package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
- package/dist/workspace/checks/ci-branch.js +133 -0
- package/dist/workspace/checks/gate-approval.d.ts +58 -0
- package/dist/workspace/checks/gate-approval.d.ts.map +1 -0
- package/dist/workspace/checks/gate-approval.js +103 -0
- package/dist/workspace/checks/links.d.ts +3 -0
- package/dist/workspace/checks/links.d.ts.map +1 -1
- package/dist/workspace/checks/links.js +12 -1
- package/dist/workspace/checks/org.d.ts +48 -0
- package/dist/workspace/checks/org.d.ts.map +1 -0
- package/dist/workspace/checks/org.js +156 -0
- package/dist/workspace/checks.d.ts +12 -1
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +63 -7
- package/dist/workspace/ci-branches.d.ts +16 -0
- package/dist/workspace/ci-branches.d.ts.map +1 -1
- package/dist/workspace/ci-branches.js +27 -0
- package/dist/workspace/ci-green-cli.js +7 -7
- package/dist/workspace/ci-green-workflow.d.ts +1 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +13 -8
- package/dist/workspace/ci-green.d.ts +14 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +44 -11
- package/dist/workspace/ci-run.d.ts +9 -1
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +67 -6
- package/dist/workspace/ci-serve.d.ts +9 -0
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +114 -76
- package/dist/workspace/compose-graph.d.ts +14 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +4 -1
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/composites.js +5 -2
- package/dist/workspace/composites.schema.json +22 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/dist/workspace/cross-root-lint.d.ts +56 -0
- package/dist/workspace/cross-root-lint.d.ts.map +1 -0
- package/dist/workspace/cross-root-lint.js +111 -0
- package/dist/workspace/dbt-models-reader.d.ts +44 -0
- package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
- package/dist/workspace/dbt-models-reader.js +356 -0
- package/dist/workspace/dbt-project-common.d.ts +40 -0
- package/dist/workspace/dbt-project-common.d.ts.map +1 -0
- package/dist/workspace/dbt-project-common.js +106 -0
- package/dist/workspace/dbt-project-reader.d.ts +4 -3
- package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
- package/dist/workspace/dbt-project-reader.js +14 -108
- package/dist/workspace/decision-rank.d.ts +26 -0
- package/dist/workspace/decision-rank.d.ts.map +1 -0
- package/dist/workspace/decision-rank.js +16 -0
- package/dist/workspace/declaration.d.ts +50 -2
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +57 -11
- package/dist/workspace/declaration.schema.json +166 -24
- package/dist/workspace/environments.d.ts +26 -2
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/environments.js +26 -2
- package/dist/workspace/exit-cli.d.ts +44 -0
- package/dist/workspace/exit-cli.d.ts.map +1 -0
- package/dist/workspace/exit-cli.js +198 -0
- package/dist/workspace/exit.d.ts +159 -0
- package/dist/workspace/exit.d.ts.map +1 -0
- package/dist/workspace/exit.js +480 -0
- package/dist/workspace/exit.schema.json +257 -0
- package/dist/workspace/flyway-dir.d.ts +39 -0
- package/dist/workspace/flyway-dir.d.ts.map +1 -0
- package/dist/workspace/flyway-dir.js +104 -0
- package/dist/workspace/flyway-layout.d.ts +96 -0
- package/dist/workspace/flyway-layout.d.ts.map +1 -0
- package/dist/workspace/flyway-layout.js +308 -0
- package/dist/workspace/graph-cache.d.ts +3 -1
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cache.js +12 -1
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +26 -8
- package/dist/workspace/graph.schema.json +34 -0
- package/dist/workspace/import-fetch.d.ts +38 -0
- package/dist/workspace/import-fetch.d.ts.map +1 -0
- package/dist/workspace/import-fetch.js +99 -0
- package/dist/workspace/import-init.d.ts +26 -0
- package/dist/workspace/import-init.d.ts.map +1 -0
- package/dist/workspace/import-init.js +130 -0
- package/dist/workspace/import-source.d.ts +147 -0
- package/dist/workspace/import-source.d.ts.map +1 -0
- package/dist/workspace/import-source.js +370 -0
- package/dist/workspace/init.d.ts +4 -0
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/init.js +70 -3
- package/dist/workspace/intent.d.ts +2 -3
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +5 -9
- package/dist/workspace/kind-link-readers.d.ts +59 -2
- package/dist/workspace/kind-link-readers.d.ts.map +1 -1
- package/dist/workspace/kind-link-readers.js +17 -1
- package/dist/workspace/kind-readers.d.ts +6 -0
- package/dist/workspace/kind-readers.d.ts.map +1 -1
- package/dist/workspace/kind-readers.js +18 -0
- package/dist/workspace/kinds.d.ts +90 -3
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +161 -7
- package/dist/workspace/ledger.schema.json +158 -0
- package/dist/workspace/lexicon-outputs.d.ts +20 -1
- package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
- package/dist/workspace/lexicon-outputs.js +102 -10
- package/dist/workspace/lineage-check.d.ts +3 -0
- package/dist/workspace/lineage-check.d.ts.map +1 -1
- package/dist/workspace/lineage-check.js +23 -4
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.js +13 -4
- package/dist/workspace/links.d.ts +8 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/links.js +25 -1
- package/dist/workspace/ls.d.ts +8 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +7 -1
- package/dist/workspace/ls.schema.json +7 -0
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/member-commands.js +54 -5
- package/dist/workspace/migrate-links.d.ts +45 -0
- package/dist/workspace/migrate-links.d.ts.map +1 -0
- package/dist/workspace/migrate-links.js +100 -0
- package/dist/workspace/migration-dirs.d.ts +74 -0
- package/dist/workspace/migration-dirs.d.ts.map +1 -0
- package/dist/workspace/migration-dirs.js +254 -0
- package/dist/workspace/new-migrations.d.ts +47 -0
- package/dist/workspace/new-migrations.d.ts.map +1 -0
- package/dist/workspace/new-migrations.js +91 -0
- package/dist/workspace/pr-report.schema.json +46 -0
- package/dist/workspace/promote.d.ts +96 -0
- package/dist/workspace/promote.d.ts.map +1 -0
- package/dist/workspace/promote.js +263 -0
- package/dist/workspace/reason-codes.d.ts +21 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +25 -0
- package/dist/workspace/records-cli.d.ts +11 -0
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-cli.js +57 -5
- package/dist/workspace/records.schema.json +5 -0
- package/dist/workspace/release-candidates.d.ts +2 -0
- package/dist/workspace/release-candidates.d.ts.map +1 -1
- package/dist/workspace/release-candidates.js +5 -2
- package/dist/workspace/release-train.d.ts +53 -0
- package/dist/workspace/release-train.d.ts.map +1 -0
- package/dist/workspace/release-train.js +134 -0
- package/dist/workspace/release-workflow.d.ts.map +1 -1
- package/dist/workspace/release-workflow.js +4 -3
- package/dist/workspace/repo-ref.d.ts +45 -0
- package/dist/workspace/repo-ref.d.ts.map +1 -0
- package/dist/workspace/repo-ref.js +114 -0
- package/dist/workspace/run-event.schema.json +2 -2
- package/dist/workspace/runs-cli.d.ts +9 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -1
- package/dist/workspace/runs-cli.js +48 -3
- package/dist/workspace/runs.schema.json +7 -0
- package/dist/workspace/search-contract.d.ts +1 -1
- package/dist/workspace/search-contract.d.ts.map +1 -1
- package/dist/workspace/status-decisions.d.ts +37 -0
- package/dist/workspace/status-decisions.d.ts.map +1 -0
- package/dist/workspace/status-decisions.js +147 -0
- package/dist/workspace/status-gates.d.ts +9 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +4 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +14 -2
- package/dist/workspace/status.schema.json +6 -0
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-cli.js +5 -3
- package/dist/workspace/work-evidence-ops.d.ts +83 -0
- package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
- package/dist/workspace/work-evidence-ops.js +169 -0
- package/dist/workspace/work-evidence.d.ts +12 -2
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-evidence.js +21 -3
- package/dist/workspace/work-evidence.schema.json +49 -2
- package/dist/workspace/workspace-gates.d.ts +110 -0
- package/dist/workspace/workspace-gates.d.ts.map +1 -0
- package/dist/workspace/workspace-gates.js +140 -0
- package/dist/workspace/workspace-kinds.schema.json +108 -10
- package/dist/workspace/workspace-ledger.d.ts +76 -0
- package/dist/workspace/workspace-ledger.d.ts.map +1 -0
- package/dist/workspace/workspace-ledger.js +91 -0
- package/dist/workspace/workspace-run.d.ts +112 -0
- package/dist/workspace/workspace-run.d.ts.map +1 -0
- package/dist/workspace/workspace-run.js +432 -0
- package/package.json +1 -1
- package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/src/__golden__/wave-loop/op-cost-member.json +13 -0
- package/src/__golden__/wave-loop/op-denied-source.json +16 -0
- package/src/__golden__/wave-loop/op-denied.json +16 -0
- package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/src/__golden__/wave-loop/op-held-on.json +16 -0
- package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/src/__golden__/wave-loop/op-overridden.json +16 -0
- package/src/__golden__/wave-loop/op-per-run.json +20 -0
- package/src/__golden__/wave-loop/op-point.json +13 -0
- package/src/__golden__/wave-loop/op-pr-review.json +10 -0
- package/src/__golden__/wave-loop/op-sealed.json +10 -0
- package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/src/__golden__/wave-loop/op-spend.json +10 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/src/__golden__/wave-loop/op-wide.json +39 -0
- package/src/action-pins.test.ts +78 -0
- package/src/action-pins.ts +92 -0
- package/src/cli/commands/carve-score-once.test.ts +99 -0
- package/src/cli/commands/carve.ts +37 -6
- package/src/cli/commands/check-lexicon.test.ts +2 -2
- package/src/cli/commands/import-report.ts +71 -0
- package/src/cli/commands/import.ts +33 -3
- package/src/cli/commands/migrate-dialect.test.ts +145 -0
- package/src/cli/commands/migrate.ts +132 -11
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
- package/src/cli/handlers/approve.ts +33 -4
- package/src/cli/handlers/build.ts +7 -1
- package/src/cli/handlers/graph-reader.test.ts +31 -0
- package/src/cli/handlers/graph-reader.ts +51 -0
- package/src/cli/handlers/graph.ts +14 -0
- package/src/cli/handlers/ledger.ts +54 -0
- package/src/cli/handlers/migrate.ts +21 -12
- package/src/cli/handlers/misc.ts +10 -1
- package/src/cli/handlers/pr-env.ts +2 -2
- package/src/cli/handlers/pr.ts +176 -37
- package/src/cli/handlers/query.ts +16 -4
- package/src/cli/handlers/release.ts +6 -3
- package/src/cli/handlers/search.ts +13 -34
- package/src/cli/main.test.ts +17 -0
- package/src/cli/main.ts +87 -14
- package/src/cli/parse-args.ts +35 -2
- package/src/cli/registry.ts +22 -4
- package/src/components/builders.ts +8 -0
- package/src/components/capability-plugin-loader.ts +13 -1
- package/src/components/capability-plugin.ts +16 -0
- package/src/components/pr-env-run-bundle.test.ts +1 -0
- package/src/components/pr-hooks.test.ts +73 -5
- package/src/components/pr-hooks.ts +95 -5
- package/src/components/pr-pipeline.ts +64 -16
- package/src/components/pr-policy.test.ts +64 -1
- package/src/components/pr-policy.ts +53 -0
- package/src/components/pr-run.ts +4 -0
- package/src/components/registry.test.ts +1 -1
- package/src/components/starter-plugin.ts +6 -0
- package/src/components/verbs/index.ts +2 -0
- package/src/components/verbs/publish-artifact.test.ts +60 -0
- package/src/components/verbs/publish-artifact.ts +122 -0
- package/src/components/verbs/publish-image.test.ts +101 -0
- package/src/components/verbs/publish-image.ts +265 -0
- package/src/config-environments.ts +28 -1
- package/src/config.ts +24 -1
- package/src/gate-decision-bundle.test.ts +5 -2
- package/src/gate-decision-identity.test.ts +20 -0
- package/src/gate-decision.ts +46 -3
- package/src/graph-ir.ts +27 -0
- package/src/graph-walk.test.ts +44 -0
- package/src/graph-walk.ts +102 -0
- package/src/import/parser.ts +20 -0
- package/src/lexicon.ts +98 -6
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lifecycle/git.ts +2 -2
- package/src/lifecycle/ledger-read.test.ts +107 -0
- package/src/lifecycle/ledger-read.ts +195 -0
- package/src/lifecycle/release-workstation.ts +24 -0
- package/src/lifecycle/run-ledger.ts +5 -2
- package/src/lint/cross-root.test.ts +122 -0
- package/src/lint/discover.ts +3 -1
- package/src/lint/post-synth.ts +212 -2
- package/src/lint/rules/op/index.ts +2 -0
- package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
- package/src/op/activities/activity-contracts.ts +5 -2
- package/src/op/activities/index.ts +2 -2
- package/src/op/activities/review-agent.test.ts +221 -4
- package/src/op/activities/review-agent.ts +265 -22
- package/src/op/activities/work-evidence.ts +9 -1
- package/src/op/builders.ts +9 -5
- package/src/op/composites/apply-op.test.ts +108 -0
- package/src/op/composites/apply-op.ts +37 -2
- package/src/op/gate-approval-at-base.test.ts +97 -0
- package/src/op/gate-approval-base.ts +72 -0
- package/src/op/gate-approval.test.ts +6 -1
- package/src/op/gate-approval.ts +22 -27
- package/src/op/gate-name.ts +16 -1
- package/src/op/gate-quorum-at-base.test.ts +211 -0
- package/src/op/gate-quorum.ts +156 -8
- package/src/op/gate-review.ts +14 -0
- package/src/op/gate.ts +69 -9
- package/src/op/index.ts +3 -2
- package/src/op/local-executor.ts +91 -11
- package/src/op/op-waves-depends-on.test.ts +81 -0
- package/src/op/op-waves-hook-targets.test.ts +4 -2
- package/src/op/op-waves-quorum-product.test.ts +158 -0
- package/src/op/op-waves-run.ts +288 -14
- package/src/op/op-waves.ts +143 -14
- package/src/op/runtime.ts +8 -0
- package/src/op/schedule-overdue.ts +33 -0
- package/src/op/stage-hooks.ts +13 -5
- package/src/op/workspace-run-env.ts +29 -0
- package/src/pr-forge-bundle.test.ts +2 -2
- package/src/pr-forge.test.ts +47 -0
- package/src/pr-forge.ts +68 -0
- package/src/pr-loop-bundle.test.ts +3 -2
- package/src/pr-loop.test.ts +52 -0
- package/src/pr-loop.ts +12 -0
- package/src/pr-migrations.ts +97 -0
- package/src/pr-post-open.e2e.test.ts +36 -0
- package/src/pr-post.test.ts +102 -3
- package/src/pr-post.ts +90 -2
- package/src/read-filter.test.ts +54 -0
- package/src/read-filter.ts +193 -0
- package/src/run-event.ts +1 -1
- package/src/stage-hooks-bundle.test.ts +1 -0
- package/src/terraform/carve.ts +52 -15
- package/src/terraform/cuts.test.ts +173 -0
- package/src/terraform/cuts.ts +188 -0
- package/src/terraform/folds.ts +44 -0
- package/src/terraform/graph.ts +9 -0
- package/src/terraform/radius.test.ts +90 -0
- package/src/terraform/reach.test.ts +146 -0
- package/src/terraform/reach.ts +247 -0
- package/src/terraform/score.ts +27 -29
- package/src/terraform/state.ts +3 -1
- package/src/terraform/types.ts +8 -0
- package/src/wave-blocked.ts +28 -3
- package/src/wave-loop-golden.test.ts +4 -3
- package/src/workspace/__fixtures__/import/spacelift.json +9 -0
- package/src/workspace/__fixtures__/import/tfc.json +13 -0
- package/src/workspace/behold-kinds.test.ts +2 -1
- package/src/workspace/check-contract.test.ts +8 -6
- package/src/workspace/check.schema.json +13 -2
- package/src/workspace/checks/ci-branch.test.ts +128 -0
- package/src/workspace/checks/ci-branch.ts +141 -0
- package/src/workspace/checks/gate-approval.test.ts +77 -0
- package/src/workspace/checks/gate-approval.ts +121 -0
- package/src/workspace/checks/links.ts +12 -1
- package/src/workspace/checks/org.ts +169 -0
- package/src/workspace/checks.ts +68 -7
- package/src/workspace/ci-branches.ts +31 -0
- package/src/workspace/ci-green-branches.test.ts +153 -0
- package/src/workspace/ci-green-cli.ts +7 -7
- package/src/workspace/ci-green-workflow.test.ts +4 -3
- package/src/workspace/ci-green-workflow.ts +13 -9
- package/src/workspace/ci-green.ts +49 -12
- package/src/workspace/ci-run.test.ts +72 -1
- package/src/workspace/ci-run.ts +68 -8
- package/src/workspace/ci-serve.test.ts +95 -0
- package/src/workspace/ci-serve.ts +106 -65
- package/src/workspace/component-environments.test.ts +25 -2
- package/src/workspace/compose-graph.ts +9 -2
- package/src/workspace/composites.schema.json +22 -0
- package/src/workspace/composites.test.ts +39 -8
- package/src/workspace/composites.ts +6 -2
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/src/workspace/cross-root-lint.test.ts +90 -0
- package/src/workspace/cross-root-lint.ts +126 -0
- package/src/workspace/dbt-kind.test.ts +3 -2
- package/src/workspace/dbt-models-reader.ts +362 -0
- package/src/workspace/dbt-models.test.ts +248 -0
- package/src/workspace/dbt-project-common.ts +113 -0
- package/src/workspace/dbt-project-reader.ts +29 -112
- package/src/workspace/decision-rank.ts +40 -0
- package/src/workspace/declaration.schema.json +166 -24
- package/src/workspace/declaration.ts +101 -15
- package/src/workspace/environments.ts +40 -4
- package/src/workspace/exit-cli.ts +219 -0
- package/src/workspace/exit.schema.json +257 -0
- package/src/workspace/exit.test.ts +185 -0
- package/src/workspace/exit.ts +560 -0
- package/src/workspace/flyway-dir.ts +113 -0
- package/src/workspace/flyway-layout.ts +337 -0
- package/src/workspace/graph-cache.ts +12 -2
- package/src/workspace/graph-cli.ts +25 -10
- package/src/workspace/graph-contract.test.ts +4 -2
- package/src/workspace/graph.schema.json +34 -0
- package/src/workspace/identity.test.ts +29 -2
- package/src/workspace/import-fetch.ts +151 -0
- package/src/workspace/import-init.ts +147 -0
- package/src/workspace/import-source.test.ts +183 -0
- package/src/workspace/import-source.ts +462 -0
- package/src/workspace/init.test.ts +55 -1
- package/src/workspace/init.ts +66 -4
- package/src/workspace/intent.ts +6 -14
- package/src/workspace/kind-link-readers.ts +68 -3
- package/src/workspace/kind-readers.test.ts +36 -0
- package/src/workspace/kind-readers.ts +18 -1
- package/src/workspace/kinds.test.ts +35 -7
- package/src/workspace/kinds.ts +212 -11
- package/src/workspace/ledger.schema.json +158 -0
- package/src/workspace/lexicon-outputs.ts +132 -13
- package/src/workspace/lineage-check.ts +30 -7
- package/src/workspace/lineage-upgrade.test.ts +20 -0
- package/src/workspace/lineage-upgrade.ts +16 -7
- package/src/workspace/links.ts +24 -1
- package/src/workspace/ls-contract.test.ts +1 -1
- package/src/workspace/ls.schema.json +7 -0
- package/src/workspace/ls.ts +10 -1
- package/src/workspace/member-commands.ts +60 -2
- package/src/workspace/member-file-schema.test.ts +124 -0
- package/src/workspace/migrate-links.test.ts +99 -0
- package/src/workspace/migrate-links.ts +108 -0
- package/src/workspace/migration-dirs.test.ts +272 -0
- package/src/workspace/migration-dirs.ts +267 -0
- package/src/workspace/new-migrations.test.ts +98 -0
- package/src/workspace/new-migrations.ts +109 -0
- package/src/workspace/org-scope.test.ts +238 -0
- package/src/workspace/pr-report.schema.json +46 -0
- package/src/workspace/promote.test.ts +114 -0
- package/src/workspace/promote.ts +302 -0
- package/src/workspace/reason-codes.test.ts +10 -1
- package/src/workspace/reason-codes.ts +25 -0
- package/src/workspace/records-cli.ts +58 -5
- package/src/workspace/records.schema.json +5 -0
- package/src/workspace/release-candidates.ts +7 -2
- package/src/workspace/release-train.ts +157 -0
- package/src/workspace/release-workflow.ts +4 -3
- package/src/workspace/repo-ref.ts +113 -0
- package/src/workspace/run-event.schema.json +2 -2
- package/src/workspace/runs-cli.ts +48 -4
- package/src/workspace/runs.schema.json +7 -0
- package/src/workspace/status-contract.test.ts +46 -1
- package/src/workspace/status-decisions.test.ts +100 -0
- package/src/workspace/status-decisions.ts +151 -0
- package/src/workspace/status-gates.ts +9 -0
- package/src/workspace/status.schema.json +6 -0
- package/src/workspace/status.ts +17 -3
- package/src/workspace/where-filters.test.ts +39 -0
- package/src/workspace/work-cli.ts +5 -3
- package/src/workspace/work-evidence-ops.test.ts +176 -0
- package/src/workspace/work-evidence-ops.ts +189 -0
- package/src/workspace/work-evidence.schema.json +49 -2
- package/src/workspace/work-evidence.ts +22 -3
- package/src/workspace/workspace-gates.ts +200 -0
- package/src/workspace/workspace-kinds.schema.json +108 -10
- package/src/workspace/workspace-ledger.ts +130 -0
- package/src/workspace/workspace-run.test.ts +322 -0
- package/src/workspace/workspace-run.ts +461 -0
|
@@ -30,6 +30,13 @@
|
|
|
30
30
|
"$ref": "#/$defs/version",
|
|
31
31
|
"description": "The oldest chant that may read this declaration. An older chant refuses it with reader-too-old."
|
|
32
32
|
},
|
|
33
|
+
"scope": {
|
|
34
|
+
"enum": [
|
|
35
|
+
"repo",
|
|
36
|
+
"org"
|
|
37
|
+
],
|
|
38
|
+
"description": "What the workspace spans (#3168). repo, the default, is one repository's workspace. org is an org-level workspace: it holds only members of kind repo, each a reference to another repository's workspace, and chant workspace check fails any other member (WSP013). A warden generates an org workspace from its policy, or checks one against the forge's repository list with chant workspace check --forge-repos. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer."
|
|
39
|
+
},
|
|
33
40
|
"members": {
|
|
34
41
|
"type": "array",
|
|
35
42
|
"description": "Members and example groups, in the order readers list them.",
|
|
@@ -161,6 +168,33 @@
|
|
|
161
168
|
"class": {
|
|
162
169
|
"$ref": "#/$defs/className",
|
|
163
170
|
"description": "The principal class the signer must be in, read from the role grants at base (#3080, ws-079): human, runner, service, or a domain class a pinned package supplies. A class no pinned package supplies lets no approval through (fail closed). Absent: any signer the signers file lists."
|
|
171
|
+
},
|
|
172
|
+
"quorum": {
|
|
173
|
+
"description": "The approval rules an Op gate of this name takes (#4324), in place of the Op's own approval.quorum: one rule or a list, each with count, and optionally targets globs over the run's environment and roles from .chant/trust.json at base. Read at base, so a change can't lower the quorum its own run needs. notAuthor is refused: an Op gate has no pull request to read the author from. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer.",
|
|
174
|
+
"oneOf": [
|
|
175
|
+
{ "$ref": "#/$defs/gateQuorumRule" },
|
|
176
|
+
{ "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/gateQuorumRule" } }
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
"policy": {
|
|
180
|
+
"$ref": "#/$defs/gatePolicyRef",
|
|
181
|
+
"description": "The policy set an Op gate of this name takes (#4404), in place of the Op's own approval.policy. Read at base, so a change can't swap in a permissive policy for its own run. Build the object with the owning lexicon's helper (the cedar lexicon's gatePolicy()) and paste it here. Added in schema 1 by chant 0.124.49, so a declaration that uses it sets minReader to 0.124.49 or newer."
|
|
182
|
+
},
|
|
183
|
+
"mode": {
|
|
184
|
+
"enum": ["log-only", "enforce"],
|
|
185
|
+
"description": "Whether the policy's decision binds the gate (#4404), in place of the Op's own approval.mode: log-only records it next to the approval, enforce passes the gate only on a permit. Read at base, so a change can't switch its own gate to a mode that passes it. Added in schema 1 by chant 0.124.49, so a declaration that uses it sets minReader to 0.124.49 or newer."
|
|
186
|
+
},
|
|
187
|
+
"context": {
|
|
188
|
+
"type": "object",
|
|
189
|
+
"description": "Plan attributes handed to the policy (#4404), over the Op's own approval.context, key by key: a change can't edit a key declared here, and a key only the Op declares still reaches the policy. A value is a plain one, since a step output reference is resolved at run time and a declaration can't hold one. plan is reserved. Added in schema 1 by chant 0.124.49, so a declaration that uses it sets minReader to 0.124.49 or newer.",
|
|
190
|
+
"additionalProperties": {
|
|
191
|
+
"oneOf": [
|
|
192
|
+
{ "type": "string" },
|
|
193
|
+
{ "type": "number" },
|
|
194
|
+
{ "type": "boolean" },
|
|
195
|
+
{ "type": "array", "items": { "type": "string" } }
|
|
196
|
+
]
|
|
197
|
+
}
|
|
164
198
|
}
|
|
165
199
|
}
|
|
166
200
|
}
|
|
@@ -446,6 +480,31 @@
|
|
|
446
480
|
"type": "string",
|
|
447
481
|
"pattern": "^[a-z][a-z0-9-]{0,39}$"
|
|
448
482
|
},
|
|
483
|
+
"gatePolicyRef": {
|
|
484
|
+
"type": "object",
|
|
485
|
+
"additionalProperties": false,
|
|
486
|
+
"required": ["kind", "lexicon", "name", "version", "text"],
|
|
487
|
+
"description": "A gate policy set a lexicon rendered (#2508), as plain data.",
|
|
488
|
+
"properties": {
|
|
489
|
+
"kind": { "const": "gate-policy" },
|
|
490
|
+
"lexicon": { "type": "string", "minLength": 1, "description": "The lexicon whose gate-policy module evaluates text." },
|
|
491
|
+
"name": { "type": "string", "minLength": 1, "description": "A name for the policy set, carried into every recorded decision." },
|
|
492
|
+
"version": { "type": "string", "minLength": 1, "description": "sha256: and the hex digest of text. A recorded permit counts only under the version it was evaluated against." },
|
|
493
|
+
"text": { "type": "string", "minLength": 1, "description": "The policy set, in the lexicon's own language." }
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
"gateQuorumRule": {
|
|
497
|
+
"type": "object",
|
|
498
|
+
"additionalProperties": false,
|
|
499
|
+
"required": ["count"],
|
|
500
|
+
"description": "One approval rule (#4290): count distinct human approvers, from roles when it names them.",
|
|
501
|
+
"properties": {
|
|
502
|
+
"targets": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 }, "description": "Globs over the run's environment: * within one / segment, ** across segments, ? one character. Absent: every run. A rule with targets never covers a run with no environment." },
|
|
503
|
+
"count": { "type": "integer", "minimum": 1, "description": "Distinct human approvers the rule needs." },
|
|
504
|
+
"roles": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 }, "description": "Only an approver .chant/trust.json at base gives one of these roles counts, and only with an approval sealed by a signer listed at base." },
|
|
505
|
+
"notAuthor": { "type": "boolean", "description": "Refused on an Op gate, which has no author to judge by." }
|
|
506
|
+
}
|
|
507
|
+
},
|
|
449
508
|
"className": {
|
|
450
509
|
"type": "string",
|
|
451
510
|
"pattern": "^(?!x-)[a-z][a-z0-9-]{0,39}$",
|
|
@@ -573,7 +632,6 @@
|
|
|
573
632
|
"description": "A member (#2524 D2). Its directory leaves the root project, and it gets its own build, lint and ledger.",
|
|
574
633
|
"required": [
|
|
575
634
|
"name",
|
|
576
|
-
"dir",
|
|
577
635
|
"kind"
|
|
578
636
|
],
|
|
579
637
|
"properties": {
|
|
@@ -586,7 +644,10 @@
|
|
|
586
644
|
},
|
|
587
645
|
"kind": {
|
|
588
646
|
"$ref": "#/$defs/kindName",
|
|
589
|
-
"description": "How to read the member: chant, workspace, other, or a kind a pinned plugin supplies (#2535)."
|
|
647
|
+
"description": "How to read the member: chant, workspace, repo, other, or a kind a pinned plugin supplies (#2535). Every kind but repo needs dir; a repo member has repo instead (#3168)."
|
|
648
|
+
},
|
|
649
|
+
"repo": {
|
|
650
|
+
"$ref": "#/$defs/repoRef"
|
|
590
651
|
},
|
|
591
652
|
"roles": {
|
|
592
653
|
"type": "array",
|
|
@@ -685,6 +746,10 @@
|
|
|
685
746
|
"type": "boolean",
|
|
686
747
|
"description": "Whether the member goes with an export (#2524 D10, #2552). chant workspace export writes only members that set travel to true into the export member, and refuses to name one that does not. Added in schema 1 by chant 0.101.0, so a declaration that uses it sets minReader to 0.101.0 or newer."
|
|
687
748
|
},
|
|
749
|
+
"acceptWorkspaceGates": {
|
|
750
|
+
"type": "boolean",
|
|
751
|
+
"description": "Whether an approval of a workspace gate may stand in for this member's own gates (#2554, ws-039). It does only when the approval's digest covers the plan the member's run reached its gate with, and only when the declaration at base sets this to true; a working-tree change never opts a member in. Absent or false, a workspace gate never satisfies this member's gates. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer."
|
|
752
|
+
},
|
|
688
753
|
"security": {
|
|
689
754
|
"type": "array",
|
|
690
755
|
"uniqueItems": true,
|
|
@@ -706,28 +771,91 @@
|
|
|
706
771
|
"^x-": true
|
|
707
772
|
},
|
|
708
773
|
"additionalProperties": false,
|
|
709
|
-
"
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
"
|
|
774
|
+
"allOf": [
|
|
775
|
+
{
|
|
776
|
+
"if": {
|
|
777
|
+
"type": "object",
|
|
778
|
+
"properties": {
|
|
779
|
+
"kind": {
|
|
780
|
+
"const": "other"
|
|
781
|
+
}
|
|
782
|
+
},
|
|
783
|
+
"required": [
|
|
784
|
+
"kind"
|
|
785
|
+
]
|
|
786
|
+
},
|
|
787
|
+
"then": {
|
|
788
|
+
"type": "object",
|
|
789
|
+
"properties": {
|
|
790
|
+
"because": {
|
|
791
|
+
"type": "string"
|
|
792
|
+
}
|
|
793
|
+
},
|
|
794
|
+
"required": [
|
|
795
|
+
"because"
|
|
796
|
+
]
|
|
714
797
|
}
|
|
715
798
|
},
|
|
716
|
-
|
|
717
|
-
"
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
"
|
|
799
|
+
{
|
|
800
|
+
"if": {
|
|
801
|
+
"type": "object",
|
|
802
|
+
"properties": {
|
|
803
|
+
"kind": {
|
|
804
|
+
"const": "repo"
|
|
805
|
+
}
|
|
806
|
+
},
|
|
807
|
+
"required": [
|
|
808
|
+
"kind"
|
|
809
|
+
]
|
|
810
|
+
},
|
|
811
|
+
"then": {
|
|
812
|
+
"required": [
|
|
813
|
+
"repo"
|
|
814
|
+
],
|
|
815
|
+
"properties": {
|
|
816
|
+
"repo": true,
|
|
817
|
+
"dir": false
|
|
818
|
+
}
|
|
819
|
+
},
|
|
820
|
+
"else": {
|
|
821
|
+
"required": [
|
|
822
|
+
"dir"
|
|
823
|
+
],
|
|
824
|
+
"properties": {
|
|
825
|
+
"dir": true,
|
|
826
|
+
"repo": false
|
|
827
|
+
}
|
|
725
828
|
}
|
|
829
|
+
}
|
|
830
|
+
]
|
|
831
|
+
},
|
|
832
|
+
"repoRef": {
|
|
833
|
+
"type": "object",
|
|
834
|
+
"description": "Another repository's workspace, named by URL and pinned revision (#3168). A member of kind repo carries it and has no dir. chant reads that workspace read-only through the other repository's own read contract, its chant workspace graph at the revision, the way it reads a nested workspace member, and never writes there. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer.",
|
|
835
|
+
"required": [
|
|
836
|
+
"url",
|
|
837
|
+
"rev"
|
|
838
|
+
],
|
|
839
|
+
"properties": {
|
|
840
|
+
"url": {
|
|
841
|
+
"type": "string",
|
|
842
|
+
"pattern": "^[^\\s]+$",
|
|
843
|
+
"description": "Where git fetches the repository from: an https, ssh or file URL, a local path, or an scp-style git@host:org/repo. A URL that carries a password or token is refused when it is read."
|
|
726
844
|
},
|
|
727
|
-
"
|
|
728
|
-
"
|
|
729
|
-
|
|
730
|
-
|
|
845
|
+
"rev": {
|
|
846
|
+
"type": "string",
|
|
847
|
+
"pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$",
|
|
848
|
+
"description": "The pinned revision, a full commit id. A branch or tag is not a pin."
|
|
849
|
+
},
|
|
850
|
+
"workspace": {
|
|
851
|
+
"$ref": "#/$defs/dir",
|
|
852
|
+
"description": "The workspace root inside that repository, relative to its git root. Defaults to \".\"."
|
|
853
|
+
}
|
|
854
|
+
},
|
|
855
|
+
"patternProperties": {
|
|
856
|
+
"^x-": true
|
|
857
|
+
},
|
|
858
|
+
"additionalProperties": false
|
|
731
859
|
},
|
|
732
860
|
"memberFields": {
|
|
733
861
|
"type": "object",
|
|
@@ -1696,10 +1824,24 @@
|
|
|
1696
1824
|
],
|
|
1697
1825
|
"properties": {
|
|
1698
1826
|
"branch": {
|
|
1699
|
-
"
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1827
|
+
"oneOf": [
|
|
1828
|
+
{
|
|
1829
|
+
"type": "string",
|
|
1830
|
+
"minLength": 1,
|
|
1831
|
+
"pattern": "^[^\\s~^:?*\\[\\\\]+$"
|
|
1832
|
+
},
|
|
1833
|
+
{
|
|
1834
|
+
"type": "array",
|
|
1835
|
+
"minItems": 1,
|
|
1836
|
+
"uniqueItems": true,
|
|
1837
|
+
"items": {
|
|
1838
|
+
"type": "string",
|
|
1839
|
+
"minLength": 1,
|
|
1840
|
+
"pattern": "^[^\\s~^:?*\\[\\\\]+$"
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
],
|
|
1844
|
+
"description": "The branch whose commits are tagged, such as main. Only its first-parent commits count. A list judges each branch, so a branch ci.branches routes members to gets a green verdict and can release (#4325); the first is the trunk that readers use when they are not told a branch. A string reads as it always did."
|
|
1703
1845
|
},
|
|
1704
1846
|
"window": {
|
|
1705
1847
|
"type": "string",
|
|
@@ -22,7 +22,7 @@ import schema from "./declaration.schema.json" with { type: "json" };
|
|
|
22
22
|
import { routeConflicts } from "./ci-branches";
|
|
23
23
|
import { cloudIdentityProblems, CLOUDS, type CloudIdentityDeclaration } from "../ci-identity";
|
|
24
24
|
import { expandGlob } from "./glob";
|
|
25
|
-
import { EXAMPLES_KIND, holdsChantProject } from "./kinds";
|
|
25
|
+
import { EXAMPLES_KIND, holdsChantProject, REPO_KIND } from "./kinds";
|
|
26
26
|
import { parseJsonText, pointerToken, type TextLocation } from "./jsonc";
|
|
27
27
|
import type { ReasonCode } from "./reason-codes";
|
|
28
28
|
import type { SecurityGroup } from "./security";
|
|
@@ -30,6 +30,8 @@ import { joinPath, type WorkspaceTree } from "./tree";
|
|
|
30
30
|
import { loadAjv2020 } from "./ajv2020";
|
|
31
31
|
import { readChantPackageVersion } from "../package-version";
|
|
32
32
|
import { assertPrLoopHooks, type OpWaveHooks } from "../op/op-waves";
|
|
33
|
+
import { quorumProblems, type GateQuorumSpec } from "../op/gate-quorum";
|
|
34
|
+
import { gateBaseApprovalProblems, type GateApprovalMode, type GatePolicyRef } from "../op/gate-approval";
|
|
33
35
|
import { assertGatePolicySettings, type GatePolicySettings } from "../gate-policy";
|
|
34
36
|
|
|
35
37
|
export const DECLARATION_SCHEMA_ID = schema.$id;
|
|
@@ -159,6 +161,19 @@ export interface SignedGate {
|
|
|
159
161
|
gate: string;
|
|
160
162
|
/** The class the signer must be in, or null for any signer the signers file at base lists. */
|
|
161
163
|
class: PrincipalClass | null;
|
|
164
|
+
/**
|
|
165
|
+
* The approval rules an Op gate of this name takes (#4324): one rule or a
|
|
166
|
+
* list, as an Op's `approval.quorum`. Read here, at base, a change can't
|
|
167
|
+
* lower the quorum its own run needs. Null when the entry sets none, and
|
|
168
|
+
* the Op's own `approval.quorum` then applies.
|
|
169
|
+
*/
|
|
170
|
+
quorum: GateQuorumSpec | null;
|
|
171
|
+
/** The policy an Op gate of this name takes in place of its own `approval.policy` (#4404). Null when the entry sets none. */
|
|
172
|
+
policy: GatePolicyRef | null;
|
|
173
|
+
/** The mode an Op gate of this name runs its policy in, in place of its own `approval.mode` (#4404). Null when the entry sets none. */
|
|
174
|
+
mode: GateApprovalMode | null;
|
|
175
|
+
/** The context an Op gate of this name hands its policy, in place of its own `approval.context` (#4404). Null when the entry sets none. */
|
|
176
|
+
context: Record<string, string | number | boolean | string[]> | null;
|
|
162
177
|
pointer: string;
|
|
163
178
|
}
|
|
164
179
|
|
|
@@ -212,13 +227,24 @@ export interface CiPhase {
|
|
|
212
227
|
pointer: string;
|
|
213
228
|
}
|
|
214
229
|
|
|
230
|
+
/** Every branch `ci.green` judges (#4325): `branches` when the declaration names several, else `branch`. */
|
|
231
|
+
export function greenBranches(green: Pick<CiGreen, "branch" | "branches">): string[] {
|
|
232
|
+
return green.branches ?? [green.branch];
|
|
233
|
+
}
|
|
234
|
+
|
|
215
235
|
/** The default `ci.green.window`. */
|
|
216
236
|
export const DEFAULT_CI_WINDOW = "24h";
|
|
217
237
|
|
|
218
238
|
/** The declaration's `ci.green` block (#3573, ws-103), with its defaults. */
|
|
219
239
|
export interface CiGreen {
|
|
220
|
-
/** The branch whose first-parent commits are tagged. */
|
|
240
|
+
/** The branch whose first-parent commits are tagged. With several (#4325), the first one declared. */
|
|
221
241
|
branch: string;
|
|
242
|
+
/**
|
|
243
|
+
* Every branch whose first-parent commits are tagged (#4325), in declaration
|
|
244
|
+
* order, the first being `branch`. Present only when the declaration names
|
|
245
|
+
* more than one, so a one-branch declaration reads as it always did.
|
|
246
|
+
*/
|
|
247
|
+
branches?: string[];
|
|
222
248
|
/** How far back a tick looks, such as `24h`. */
|
|
223
249
|
window: string;
|
|
224
250
|
/** The phases, in file order. */
|
|
@@ -638,9 +664,16 @@ export const DEFAULT_STATE_ROOT = "${XDG_STATE_HOME}/chant/boxes";
|
|
|
638
664
|
export interface Member {
|
|
639
665
|
type: "member";
|
|
640
666
|
name: string;
|
|
641
|
-
/**
|
|
667
|
+
/**
|
|
668
|
+
* Relative to the workspace root; `"."` is the root member. A member of kind
|
|
669
|
+
* `repo` has no directory here: its `dir` is {@link repoMemberDir}, which
|
|
670
|
+
* names no directory of this repository, and every reader that looks at
|
|
671
|
+
* member directories leaves it out by its kind (#3168).
|
|
672
|
+
*/
|
|
642
673
|
dir: string;
|
|
643
674
|
kind: string;
|
|
675
|
+
/** For a member of kind `repo`, the other repository's workspace it names (#3168); null for every other kind. */
|
|
676
|
+
repo: RepoRef | null;
|
|
644
677
|
roles: MemberRole[];
|
|
645
678
|
/** Declared generated files, in file order. The implicit ones are not listed here (see `generated-files.ts`). */
|
|
646
679
|
generated: GeneratedFile[];
|
|
@@ -660,6 +693,12 @@ export interface Member {
|
|
|
660
693
|
because: string | null;
|
|
661
694
|
/** Whether `chant workspace export` takes the member (#2552, D10). False when the entry does not say. */
|
|
662
695
|
travel: boolean;
|
|
696
|
+
/**
|
|
697
|
+
* Whether a workspace gate's approval may stand in for this member's own
|
|
698
|
+
* gates (#2554, ws-039), when its digest covers the member's plan. Read
|
|
699
|
+
* from the declaration at base. Set only when the entry says true.
|
|
700
|
+
*/
|
|
701
|
+
acceptWorkspaceGates?: true;
|
|
663
702
|
/** The security groups this member adds to the declaration's top-level `security` (#4168 step 7), in file order; empty when it names none. */
|
|
664
703
|
security: SecurityGroup[];
|
|
665
704
|
/** The member's own `ci.workflow` (#4168 step 6), which wins over the top level's; null when it names none. */
|
|
@@ -691,10 +730,26 @@ export interface Pin {
|
|
|
691
730
|
integrity: string | null;
|
|
692
731
|
}
|
|
693
732
|
|
|
733
|
+
/** Another repository's workspace, by URL and pinned revision (#3168). */
|
|
734
|
+
export interface RepoRef {
|
|
735
|
+
url: string;
|
|
736
|
+
/** A full commit id. */
|
|
737
|
+
rev: string;
|
|
738
|
+
/** The workspace root inside that repository, relative to its git root; `"."` when the entry doesn't say. */
|
|
739
|
+
workspace: string;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/** The `dir` a `repo` member reads as (#3168): a marker, never a directory of this repository. */
|
|
743
|
+
export function repoMemberDir(name: string): string {
|
|
744
|
+
return `@repo/${name}`;
|
|
745
|
+
}
|
|
746
|
+
|
|
694
747
|
export interface Declaration {
|
|
695
748
|
name: string;
|
|
696
749
|
schema: number;
|
|
697
750
|
minReader: string | null;
|
|
751
|
+
/** `org` for an org-level workspace, which holds only `repo` members; `repo` otherwise, the default (#3168). */
|
|
752
|
+
scope: "repo" | "org";
|
|
698
753
|
/** Members and groups, in file order. */
|
|
699
754
|
entries: Entry[];
|
|
700
755
|
members: Member[];
|
|
@@ -817,9 +872,13 @@ function explain(e: AjvError, value: unknown): string {
|
|
|
817
872
|
const missing = String(e.params.missingProperty);
|
|
818
873
|
if (missing === "because" && e.instancePath.endsWith("/handWritten")) return `a hand-written generated file needs "because", saying why it is kept by hand`;
|
|
819
874
|
if (missing === "because") return `a member of kind other needs "because", saying why it is there`;
|
|
875
|
+
if (missing === "repo") return `a member of kind repo needs "repo", the other repository's url and pinned rev`;
|
|
820
876
|
return `missing required field ${JSON.stringify(missing)}`;
|
|
821
877
|
}
|
|
822
878
|
if (e.keyword === "const" && e.instancePath === "/schema") return `schema must be 1, the only declaration format this chant reads`;
|
|
879
|
+
// A repo member has repo and no dir; every other member has dir and no repo (#3168).
|
|
880
|
+
if (e.keyword === "false schema" && e.instancePath.endsWith("/dir")) return `a member of kind repo has no dir: it names another repository's workspace with repo`;
|
|
881
|
+
if (e.keyword === "false schema" && e.instancePath.endsWith("/repo")) return `only a member of kind repo has repo`;
|
|
823
882
|
return e.message ?? "is invalid";
|
|
824
883
|
}
|
|
825
884
|
|
|
@@ -942,14 +1001,17 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
942
1001
|
protocol: l.protocol ?? null,
|
|
943
1002
|
pointer: `${pointer}/links/${j}`,
|
|
944
1003
|
}));
|
|
945
|
-
const
|
|
1004
|
+
const repoRaw = e.repo as { url: string; rev: string; workspace?: string } | undefined;
|
|
1005
|
+
const dir = e.kind === REPO_KIND ? repoMemberDir(e.name as string) : (e.dir as string);
|
|
1006
|
+
const records = recordKindsOf(e.records, dir, e.name as string, `${pointer}/records`);
|
|
946
1007
|
const diagrams = diagramsOf(e.diagrams, e.name as string, `${pointer}/diagrams`);
|
|
947
1008
|
const box = boxOf(e.box, `${pointer}/box`);
|
|
948
1009
|
return {
|
|
949
1010
|
type: "member",
|
|
950
1011
|
name: e.name as string,
|
|
951
|
-
dir
|
|
1012
|
+
dir,
|
|
952
1013
|
kind: e.kind as string,
|
|
1014
|
+
repo: repoRaw ? { url: repoRaw.url, rev: repoRaw.rev, workspace: repoRaw.workspace ?? "." } : null,
|
|
953
1015
|
roles,
|
|
954
1016
|
generated,
|
|
955
1017
|
outputs: e.outputs === undefined ? null : [...(e.outputs as string[])],
|
|
@@ -961,6 +1023,7 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
961
1023
|
upstream: (e.upstream as string | undefined) ?? null,
|
|
962
1024
|
because: (e.because as string | undefined) ?? null,
|
|
963
1025
|
travel: e.travel === true,
|
|
1026
|
+
...(e.acceptWorkspaceGates === true ? { acceptWorkspaceGates: true as const } : {}),
|
|
964
1027
|
security: [...((e.security as SecurityGroup[] | undefined) ?? [])],
|
|
965
1028
|
ciWorkflow: ((e.ci as { workflow?: CiWorkflow } | undefined)?.workflow) ?? null,
|
|
966
1029
|
ciHooks: ciHooksOf((e.ci as { hooks?: unknown } | undefined)?.hooks, `${pointer}/ci/hooks`, at),
|
|
@@ -986,8 +1049,10 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
986
1049
|
// Placement (#2524 D2): one root member at most, no two members in one
|
|
987
1050
|
// directory, and only the root member contains other members.
|
|
988
1051
|
const members = entries.filter((e): e is Member => e.type === "member");
|
|
1052
|
+
// A repo member has no directory here (#3168), so it takes no part in placement.
|
|
1053
|
+
const placed = members.filter((m) => m.kind !== REPO_KIND);
|
|
989
1054
|
const byDir = new Map<string, Member>();
|
|
990
|
-
for (const m of
|
|
1055
|
+
for (const m of placed) {
|
|
991
1056
|
const other = byDir.get(m.dir);
|
|
992
1057
|
if (other) {
|
|
993
1058
|
throw new WorkspaceReadError(
|
|
@@ -998,8 +1063,8 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
998
1063
|
}
|
|
999
1064
|
byDir.set(m.dir, m);
|
|
1000
1065
|
}
|
|
1001
|
-
for (const m of
|
|
1002
|
-
const outer =
|
|
1066
|
+
for (const m of placed) {
|
|
1067
|
+
const outer = placed.find((o) => o !== m && o.dir !== "." && isInside(m.dir, o.dir));
|
|
1003
1068
|
if (outer) {
|
|
1004
1069
|
throw new WorkspaceReadError(
|
|
1005
1070
|
"placement-invalid",
|
|
@@ -1109,6 +1174,7 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
1109
1174
|
name: obj.name as string,
|
|
1110
1175
|
schema: obj.schema as number,
|
|
1111
1176
|
minReader: (obj.minReader as string | undefined) ?? null,
|
|
1177
|
+
scope: obj.scope === "org" ? "org" : "repo",
|
|
1112
1178
|
entries,
|
|
1113
1179
|
members,
|
|
1114
1180
|
groups: entries.filter((e): e is Group => e.type === "group"),
|
|
@@ -1121,7 +1187,7 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
1121
1187
|
changes: changesOf(obj.changes as Record<string, unknown> | undefined),
|
|
1122
1188
|
writeScope,
|
|
1123
1189
|
agents,
|
|
1124
|
-
identity: identityOf(obj.identity),
|
|
1190
|
+
identity: identityOf(obj.identity, at),
|
|
1125
1191
|
ci,
|
|
1126
1192
|
retention: retentionOf(obj.retention),
|
|
1127
1193
|
metrics: metricsOf(obj.metrics),
|
|
@@ -1181,13 +1247,32 @@ function writeScopeOf(raw: unknown, members: Member[], at: (pointer: string, key
|
|
|
1181
1247
|
* (#2548, ws-101): names are unique, every member a session names is a
|
|
1182
1248
|
* declared member, and a principal is listed by one session at most.
|
|
1183
1249
|
*/
|
|
1184
|
-
/**
|
|
1185
|
-
|
|
1250
|
+
/**
|
|
1251
|
+
* The `identity` block, already validated by the schema (#3163), with the
|
|
1252
|
+
* quorum rules the schema can't say (#4324): `notAuthor` is refused, since an
|
|
1253
|
+
* Op gate has no pull request to read the author from.
|
|
1254
|
+
*/
|
|
1255
|
+
function identityOf(raw: unknown, at: (pointer: string, key?: boolean) => ErrorLocation): IdentityPolicy | null {
|
|
1186
1256
|
if (raw === undefined) return null;
|
|
1187
|
-
const block = raw as { attribution?: "any" | "identified"; gates?: Record<string, { class?: string }> };
|
|
1257
|
+
const block = raw as { attribution?: "any" | "identified"; gates?: Record<string, { class?: string; quorum?: GateQuorumSpec; policy?: GatePolicyRef; mode?: GateApprovalMode; context?: Record<string, string | number | boolean | string[]> }> };
|
|
1188
1258
|
const gates: Record<string, SignedGate> = {};
|
|
1189
1259
|
for (const [gate, entry] of Object.entries(block.gates ?? {})) {
|
|
1190
|
-
|
|
1260
|
+
const pointer = `/identity/gates/${gate.replace(/~/g, "~0").replace(/\//g, "~1")}`;
|
|
1261
|
+
if (entry.quorum !== undefined) {
|
|
1262
|
+
const [problem] = quorumProblems(entry.quorum, `identity.gates.${gate}.quorum`, { notAuthor: false });
|
|
1263
|
+
if (problem) throw new WorkspaceReadError("declaration-invalid", problem.replace(/`/g, ""), at(`${pointer}/quorum`));
|
|
1264
|
+
}
|
|
1265
|
+
const [rest] = gateBaseApprovalProblems(entry, `identity.gates.${gate}`);
|
|
1266
|
+
if (rest) throw new WorkspaceReadError("declaration-invalid", rest.replace(/`/g, ""), at(pointer));
|
|
1267
|
+
gates[gate] = {
|
|
1268
|
+
gate,
|
|
1269
|
+
class: entry.class ?? null,
|
|
1270
|
+
quorum: entry.quorum !== undefined ? structuredClone(entry.quorum) : null,
|
|
1271
|
+
policy: entry.policy !== undefined ? structuredClone(entry.policy) : null,
|
|
1272
|
+
mode: entry.mode ?? null,
|
|
1273
|
+
context: entry.context !== undefined ? structuredClone(entry.context) : null,
|
|
1274
|
+
pointer,
|
|
1275
|
+
};
|
|
1191
1276
|
}
|
|
1192
1277
|
return { attribution: block.attribution ?? "any", gates };
|
|
1193
1278
|
}
|
|
@@ -1266,7 +1351,7 @@ function cloudIdentityOf(raw: CloudIdentityDeclaration, at: (pointer: string, ke
|
|
|
1266
1351
|
|
|
1267
1352
|
function ciOf(raw: unknown, at: (pointer: string, key?: boolean) => ErrorLocation): CiDeclaration | null {
|
|
1268
1353
|
if (raw === undefined) return null;
|
|
1269
|
-
const block = raw as { reportUrl?: string; workflow?: CiWorkflow; hooks?: unknown; identity?: { cloud?: CloudIdentityDeclaration }; branches?: Record<string, string[]>; labels?: Record<string, string[]>; locks?: CiLocks; policy?: unknown; prEnvironment?: { template: string; ttl?: string; teardown?: { name?: string; command: string[]; lexicons?: string[] } }; green?: { branch: string; window?: string; phases: Record<string, string[] | { runs: string[]; skipped?: CiSkipped; build?: CiBuild }>; require: string[]; preMerge?: string[]; signedSince?: string; source?: CiSource } };
|
|
1354
|
+
const block = raw as { reportUrl?: string; workflow?: CiWorkflow; hooks?: unknown; identity?: { cloud?: CloudIdentityDeclaration }; branches?: Record<string, string[]>; labels?: Record<string, string[]>; locks?: CiLocks; policy?: unknown; prEnvironment?: { template: string; ttl?: string; teardown?: { name?: string; command: string[]; lexicons?: string[] } }; green?: { branch: string | string[]; window?: string; phases: Record<string, string[] | { runs: string[]; skipped?: CiSkipped; build?: CiBuild }>; require: string[]; preMerge?: string[]; signedSince?: string; source?: CiSource } };
|
|
1270
1355
|
const hooks = ciHooksOf(block.hooks, "/ci/hooks", at);
|
|
1271
1356
|
const policy = ciPolicyOf(block.policy, at);
|
|
1272
1357
|
const workflow = {
|
|
@@ -1327,7 +1412,8 @@ function ciOf(raw: unknown, at: (pointer: string, key?: boolean) => ErrorLocatio
|
|
|
1327
1412
|
at(`/ci/green/preMerge/${i}`),
|
|
1328
1413
|
);
|
|
1329
1414
|
}
|
|
1330
|
-
|
|
1415
|
+
const judged = Array.isArray(g.branch) ? g.branch : [g.branch];
|
|
1416
|
+
return { green: { branch: judged[0]!, ...(judged.length > 1 ? { branches: [...judged] } : {}), window: g.window ?? DEFAULT_CI_WINDOW, phases, require: [...g.require], ...(g.preMerge !== undefined ? { preMerge: [...g.preMerge] } : {}), signedSince: g.signedSince ?? null, source: g.source ?? "checks", pointer: "/ci/green" }, ...workflow, reportUrl };
|
|
1331
1417
|
}
|
|
1332
1418
|
|
|
1333
1419
|
function agentsOf(raw: unknown, members: Member[], at: (pointer: string, key?: boolean) => ErrorLocation): AgentDeclaration[] {
|
|
@@ -23,6 +23,13 @@
|
|
|
23
23
|
* would take it, or left out with `environments-component-undeclared` when
|
|
24
24
|
* the config's environments don't cover it.
|
|
25
25
|
*
|
|
26
|
+
* Each environment also names its `executor` (#4402): the forge and committed
|
|
27
|
+
* workflow that deploys it, as the member's config declares on the
|
|
28
|
+
* environment's entry (`{ name: "prod", executor: { forge: "github",
|
|
29
|
+
* workflow: "deploy-prod.yml" } }`), a literal entry before a pattern. When
|
|
30
|
+
* none is declared, `forge` and `workflow` are null and `reason` says why.
|
|
31
|
+
* chant never derives it from a generated workflow's name.
|
|
32
|
+
*
|
|
26
33
|
* `chant run --env` refuses a name the config's `environments` doesn't cover
|
|
27
34
|
* whenever it declares any (`unknownEnvError` in `../env.ts`), so a ledger
|
|
28
35
|
* environment the config no longer covers is left out, with a reason. The
|
|
@@ -36,7 +43,7 @@
|
|
|
36
43
|
*/
|
|
37
44
|
|
|
38
45
|
import { execFileSync } from "node:child_process";
|
|
39
|
-
import { environmentName, isEnvironmentPattern, matchesDeclaredEnvironment, type EnvironmentDeclaration } from "../config";
|
|
46
|
+
import { environmentExecutor, environmentName, isEnvironmentPattern, matchesDeclaredEnvironment, type EnvironmentDeclaration, type EnvironmentExecutor } from "../config";
|
|
40
47
|
import type { ComponentEnvironmentDeclaration } from "../components/component";
|
|
41
48
|
import type { ReasonCode } from "./reason-codes";
|
|
42
49
|
import { LOCAL_RUNTIME, type MemberRuntimes } from "./runtimes";
|
|
@@ -60,6 +67,23 @@ export const ENVIRONMENT_REASON_CODES = [
|
|
|
60
67
|
] as const satisfies readonly ReasonCode[];
|
|
61
68
|
export type EnvironmentReasonCode = (typeof ENVIRONMENT_REASON_CODES)[number];
|
|
62
69
|
|
|
70
|
+
/** Why an environment names no executor (#4402). Closed: part of the read contract. */
|
|
71
|
+
export const EXECUTOR_REASON_CODES = [
|
|
72
|
+
/** The member's chant.config.ts declares no executor for the environment, so nothing says which forge workflow deploys it. */
|
|
73
|
+
"executor-none-declared",
|
|
74
|
+
/** The member's chant.config.ts could not be read, so whether a forge workflow deploys the environment is unknown. */
|
|
75
|
+
"executor-config-unreadable",
|
|
76
|
+
] as const satisfies readonly ReasonCode[];
|
|
77
|
+
export type ExecutorReasonCode = (typeof EXECUTOR_REASON_CODES)[number];
|
|
78
|
+
|
|
79
|
+
/** The forge workflow that deploys an environment (#4402), or why none is named. */
|
|
80
|
+
export interface ComponentExecutor {
|
|
81
|
+
forge: EnvironmentExecutor["forge"] | null;
|
|
82
|
+
workflow: string | null;
|
|
83
|
+
/** Null when `forge` and `workflow` are set. */
|
|
84
|
+
reason: { code: ExecutorReasonCode; message: string } | null;
|
|
85
|
+
}
|
|
86
|
+
|
|
63
87
|
export interface EnvironmentReason {
|
|
64
88
|
code: EnvironmentReasonCode;
|
|
65
89
|
message: string;
|
|
@@ -75,6 +99,8 @@ export interface ComponentEnvironment {
|
|
|
75
99
|
source: "config" | "ledger" | "builtin" | "component";
|
|
76
100
|
/** Where a release of the component goes in this environment, as the component declares it (#3153), or null when it declares nothing for it. */
|
|
77
101
|
site: ComponentSite | null;
|
|
102
|
+
/** The forge and committed workflow that deploys this environment, from the member's config (#4402). */
|
|
103
|
+
executor: ComponentExecutor;
|
|
78
104
|
/** The command that deploys the component there, on the site's runtime when the member hosts it and else the default runtime, run in the member's directory. */
|
|
79
105
|
command: string;
|
|
80
106
|
}
|
|
@@ -99,7 +125,7 @@ export type LedgerEnvironmentReader = (member: { name: string; dir: string }, cw
|
|
|
99
125
|
/** What one member's config and ledger say about environments. */
|
|
100
126
|
export interface MemberEnvironments {
|
|
101
127
|
/** Each environment in list order, without the per-component site and command. */
|
|
102
|
-
environments: Omit<ComponentEnvironment, "command" | "site">[];
|
|
128
|
+
environments: Omit<ComponentEnvironment, "command" | "site" | "executor">[];
|
|
103
129
|
reasons: EnvironmentReason[];
|
|
104
130
|
/** The config's environments, for whether `chant run --env` takes a name: null when the config couldn't be read, `[]` when it declares none. */
|
|
105
131
|
declared?: EnvironmentDeclaration[] | null;
|
|
@@ -177,6 +203,16 @@ export function memberEnvironments(runtimes: MemberRuntimes | undefined, ledger:
|
|
|
177
203
|
return { environments: out, reasons, declared };
|
|
178
204
|
}
|
|
179
205
|
|
|
206
|
+
/** The executor the member's config declares for `env`, or why there is none. */
|
|
207
|
+
export function executorFor(env: string, member: MemberEnvironments | undefined): ComponentExecutor {
|
|
208
|
+
if (member && member.declared === null) {
|
|
209
|
+
return { forge: null, workflow: null, reason: { code: "executor-config-unreadable", message: `chant.config.ts could not be read, so no executor is known for ${env}` } };
|
|
210
|
+
}
|
|
211
|
+
const found = environmentExecutor(member?.declared ?? undefined, env);
|
|
212
|
+
if (found) return { forge: found.forge, workflow: found.workflow, reason: null };
|
|
213
|
+
return { forge: null, workflow: null, reason: { code: "executor-none-declared", message: `chant.config.ts declares no executor for ${env}` } };
|
|
214
|
+
}
|
|
215
|
+
|
|
180
216
|
/**
|
|
181
217
|
* The environments one component may deploy to, each with its command line.
|
|
182
218
|
* `declared` is what the component's contract says (#3153): an environment
|
|
@@ -194,7 +230,7 @@ export function componentEnvironments(
|
|
|
194
230
|
hosts: readonly string[] = [],
|
|
195
231
|
reasons: EnvironmentReason[] = [],
|
|
196
232
|
): ComponentEnvironment[] {
|
|
197
|
-
const list: Omit<ComponentEnvironment, "command" | "site">[] = [...(member?.environments ?? [{ name: LOCAL_ENVIRONMENT, default: true, source: "builtin" as const }])];
|
|
233
|
+
const list: Omit<ComponentEnvironment, "command" | "site" | "executor">[] = [...(member?.environments ?? [{ name: LOCAL_ENVIRONMENT, default: true, source: "builtin" as const }])];
|
|
198
234
|
const config = member?.declared;
|
|
199
235
|
const takes = (env: string): boolean => !config || config.length === 0 || matchesDeclaredEnvironment(config, env);
|
|
200
236
|
const sites = new Map<string, ComponentSite>();
|
|
@@ -212,6 +248,6 @@ export function componentEnvironments(
|
|
|
212
248
|
return list.map((e) => {
|
|
213
249
|
const site = sites.get(e.name) ?? null;
|
|
214
250
|
const on = site?.runtime && (site.runtime === LOCAL_RUNTIME || hosts.includes(site.runtime)) ? site.runtime : runtime;
|
|
215
|
-
return { ...e, site, command: `chant run --components ${component}${on === LOCAL_RUNTIME ? "" : ` --on ${on}`}${e.default ? "" : ` --env ${e.name}`}` };
|
|
251
|
+
return { ...e, site, executor: executorFor(e.name, member), command: `chant run --components ${component}${on === LOCAL_RUNTIME ? "" : ` --on ${on}`}${e.default ? "" : ` --env ${e.name}`}` };
|
|
216
252
|
});
|
|
217
253
|
}
|