@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",
|
|
@@ -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
|
|
@@ -34,7 +41,7 @@
|
|
|
34
41
|
* `--at` exported. The ledger is always the local `chant/lifecycle` branch,
|
|
35
42
|
* as for `workspace status`, and is never fetched.
|
|
36
43
|
*/
|
|
37
|
-
import { type EnvironmentDeclaration } from "../config.js";
|
|
44
|
+
import { type EnvironmentDeclaration, type EnvironmentExecutor } from "../config.js";
|
|
38
45
|
import type { ComponentEnvironmentDeclaration } from "../components/component.js";
|
|
39
46
|
import { type MemberRuntimes } from "./runtimes.js";
|
|
40
47
|
/** The environment `chant run --components` deploys to without `--env`. */
|
|
@@ -42,6 +49,19 @@ export declare const LOCAL_ENVIRONMENT = "local";
|
|
|
42
49
|
/** Why a member's environments are only `local`, or leave out one the ledger has. Closed: part of the read contract. */
|
|
43
50
|
export declare const ENVIRONMENT_REASON_CODES: readonly ["runtimes-config-unreadable", "environments-none-declared", "environments-ledger-undeclared", "environments-ledger-unreadable", "environments-component-undeclared"];
|
|
44
51
|
export type EnvironmentReasonCode = (typeof ENVIRONMENT_REASON_CODES)[number];
|
|
52
|
+
/** Why an environment names no executor (#4402). Closed: part of the read contract. */
|
|
53
|
+
export declare const EXECUTOR_REASON_CODES: readonly ["executor-none-declared", "executor-config-unreadable"];
|
|
54
|
+
export type ExecutorReasonCode = (typeof EXECUTOR_REASON_CODES)[number];
|
|
55
|
+
/** The forge workflow that deploys an environment (#4402), or why none is named. */
|
|
56
|
+
export interface ComponentExecutor {
|
|
57
|
+
forge: EnvironmentExecutor["forge"] | null;
|
|
58
|
+
workflow: string | null;
|
|
59
|
+
/** Null when `forge` and `workflow` are set. */
|
|
60
|
+
reason: {
|
|
61
|
+
code: ExecutorReasonCode;
|
|
62
|
+
message: string;
|
|
63
|
+
} | null;
|
|
64
|
+
}
|
|
45
65
|
export interface EnvironmentReason {
|
|
46
66
|
code: EnvironmentReasonCode;
|
|
47
67
|
message: string;
|
|
@@ -56,6 +76,8 @@ export interface ComponentEnvironment {
|
|
|
56
76
|
source: "config" | "ledger" | "builtin" | "component";
|
|
57
77
|
/** Where a release of the component goes in this environment, as the component declares it (#3153), or null when it declares nothing for it. */
|
|
58
78
|
site: ComponentSite | null;
|
|
79
|
+
/** The forge and committed workflow that deploys this environment, from the member's config (#4402). */
|
|
80
|
+
executor: ComponentExecutor;
|
|
59
81
|
/** 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. */
|
|
60
82
|
command: string;
|
|
61
83
|
}
|
|
@@ -79,7 +101,7 @@ export type LedgerEnvironmentReader = (member: {
|
|
|
79
101
|
/** What one member's config and ledger say about environments. */
|
|
80
102
|
export interface MemberEnvironments {
|
|
81
103
|
/** Each environment in list order, without the per-component site and command. */
|
|
82
|
-
environments: Omit<ComponentEnvironment, "command" | "site">[];
|
|
104
|
+
environments: Omit<ComponentEnvironment, "command" | "site" | "executor">[];
|
|
83
105
|
reasons: EnvironmentReason[];
|
|
84
106
|
/** The config's environments, for whether `chant run --env` takes a name: null when the config couldn't be read, `[]` when it declares none. */
|
|
85
107
|
declared?: EnvironmentDeclaration[] | null;
|
|
@@ -93,6 +115,8 @@ export interface MemberEnvironments {
|
|
|
93
115
|
export declare const readLedgerEnvironments: LedgerEnvironmentReader;
|
|
94
116
|
/** Join a member's config and ledger into its environment list, `local` first, then config order, then the ledger's. */
|
|
95
117
|
export declare function memberEnvironments(runtimes: MemberRuntimes | undefined, ledger: LedgerEnvironments | undefined): MemberEnvironments;
|
|
118
|
+
/** The executor the member's config declares for `env`, or why there is none. */
|
|
119
|
+
export declare function executorFor(env: string, member: MemberEnvironments | undefined): ComponentExecutor;
|
|
96
120
|
/**
|
|
97
121
|
* The environments one component may deploy to, each with its command line.
|
|
98
122
|
* `declared` is what the component's contract says (#3153): an environment
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/workspace/environments.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/workspace/environments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,EAA0F,KAAK,sBAAsB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC1K,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhE,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC,wHAAwH;AACxH,eAAO,MAAM,wBAAwB,gLAWK,CAAC;AAC3C,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,mEAKQ,CAAC;AAC3C,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,oFAAoF;AACpF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gDAAgD;IAChD,MAAM,EAAE;QAAE,IAAI,EAAE,kBAAkB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,OAAO,EAAE,OAAO,CAAC;IACjB,yHAAyH;IACzH,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACtD,gJAAgJ;IAChJ,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,wGAAwG;IACxG,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,gKAAgK;IAChK,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2GAA2G;AAC3G,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AAED,0EAA0E;AAC1E,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,KAAK,kBAAkB,CAAC;AAEjH,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,YAAY,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC;IAC5E,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,gJAAgJ;IAChJ,QAAQ,CAAC,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAAC;CAC5C;AAeD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,uBAkBpC,CAAC;AAEF,wHAAwH;AACxH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,EAAE,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,kBAAkB,CA8BnI;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,iBAAiB,CAOlG;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,OAAO,SAAgB,EACvB,QAAQ,GAAE,SAAS,+BAA+B,EAAO,EACzD,KAAK,GAAE,SAAS,MAAM,EAAO,EAC7B,OAAO,GAAE,iBAAiB,EAAO,GAChC,oBAAoB,EAAE,CAqBxB"}
|
|
@@ -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
|
|
@@ -35,7 +42,7 @@
|
|
|
35
42
|
* as for `workspace status`, and is never fetched.
|
|
36
43
|
*/
|
|
37
44
|
import { execFileSync } from "node:child_process";
|
|
38
|
-
import { environmentName, isEnvironmentPattern, matchesDeclaredEnvironment } from "../config.js";
|
|
45
|
+
import { environmentExecutor, environmentName, isEnvironmentPattern, matchesDeclaredEnvironment } from "../config.js";
|
|
39
46
|
import { LOCAL_RUNTIME } from "./runtimes.js";
|
|
40
47
|
import { ENV_PATTERN, LIFECYCLE_REF, MEMBERS_DIR } from "./status.js";
|
|
41
48
|
/** The environment `chant run --components` deploys to without `--env`. */
|
|
@@ -53,6 +60,13 @@ export const ENVIRONMENT_REASON_CODES = [
|
|
|
53
60
|
/** A component declares an environment the config's environments don't cover, so chant run --env would refuse it (#3153). */
|
|
54
61
|
"environments-component-undeclared",
|
|
55
62
|
];
|
|
63
|
+
/** Why an environment names no executor (#4402). Closed: part of the read contract. */
|
|
64
|
+
export const EXECUTOR_REASON_CODES = [
|
|
65
|
+
/** The member's chant.config.ts declares no executor for the environment, so nothing says which forge workflow deploys it. */
|
|
66
|
+
"executor-none-declared",
|
|
67
|
+
/** The member's chant.config.ts could not be read, so whether a forge workflow deploys the environment is unknown. */
|
|
68
|
+
"executor-config-unreadable",
|
|
69
|
+
];
|
|
56
70
|
function git(cwd, args, input) {
|
|
57
71
|
return execFileSync("git", args, { cwd, encoding: "utf-8", input, stdio: [input === undefined ? "ignore" : "pipe", "pipe", "pipe"] });
|
|
58
72
|
}
|
|
@@ -129,6 +143,16 @@ export function memberEnvironments(runtimes, ledger) {
|
|
|
129
143
|
add(name, "ledger");
|
|
130
144
|
return { environments: out, reasons, declared };
|
|
131
145
|
}
|
|
146
|
+
/** The executor the member's config declares for `env`, or why there is none. */
|
|
147
|
+
export function executorFor(env, member) {
|
|
148
|
+
if (member && member.declared === null) {
|
|
149
|
+
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}` } };
|
|
150
|
+
}
|
|
151
|
+
const found = environmentExecutor(member?.declared ?? undefined, env);
|
|
152
|
+
if (found)
|
|
153
|
+
return { forge: found.forge, workflow: found.workflow, reason: null };
|
|
154
|
+
return { forge: null, workflow: null, reason: { code: "executor-none-declared", message: `chant.config.ts declares no executor for ${env}` } };
|
|
155
|
+
}
|
|
132
156
|
/**
|
|
133
157
|
* The environments one component may deploy to, each with its command line.
|
|
134
158
|
* `declared` is what the component's contract says (#3153): an environment
|
|
@@ -159,6 +183,6 @@ export function componentEnvironments(component, member, runtime = LOCAL_RUNTIME
|
|
|
159
183
|
return list.map((e) => {
|
|
160
184
|
const site = sites.get(e.name) ?? null;
|
|
161
185
|
const on = site?.runtime && (site.runtime === LOCAL_RUNTIME || hosts.includes(site.runtime)) ? site.runtime : runtime;
|
|
162
|
-
return { ...e, site, command: `chant run --components ${component}${on === LOCAL_RUNTIME ? "" : ` --on ${on}`}${e.default ? "" : ` --env ${e.name}`}` };
|
|
186
|
+
return { ...e, site, executor: executorFor(e.name, member), command: `chant run --components ${component}${on === LOCAL_RUNTIME ? "" : ` --on ${on}`}${e.default ? "" : ` --env ${e.name}`}` };
|
|
163
187
|
});
|
|
164
188
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant workspace exit [<member>...] [--dry-run] [--drill] [--output <file>] [--json]`
|
|
3
|
+
* (#3177).
|
|
4
|
+
*
|
|
5
|
+
* Stages the exit in a git worktree (see ./exit.ts), checks the staged tree
|
|
6
|
+
* with the same static checks the exit drill uses, then decides a gate. The
|
|
7
|
+
* gate is `workspace-exit/<scope>` on the gate ledger and binds the digest of
|
|
8
|
+
* the patch, as `workspace upgrade` does: the first run records the pending
|
|
9
|
+
* fact and exits 3; after `chant approve workspace-exit <scope>` the same
|
|
10
|
+
* command stages the same patch and applies it to the tree.
|
|
11
|
+
*
|
|
12
|
+
* `--drill` skips the worktree and the gate: it runs the exit on a scratch
|
|
13
|
+
* copy and prints the per-member result, the check CI runs on every commit.
|
|
14
|
+
*/
|
|
15
|
+
import type { CommandContext } from "../cli/registry.js";
|
|
16
|
+
import { type GateLedgerPort } from "../op/gate.js";
|
|
17
|
+
import { type DrillReport, type ExitBuildRunner, type ExitResult } from "./exit.js";
|
|
18
|
+
/** The exit code of a gated exit: the same as `chant run`'s gated run. */
|
|
19
|
+
export declare const EXIT_GATED = 3;
|
|
20
|
+
export interface ExitCommandOptions {
|
|
21
|
+
root: string;
|
|
22
|
+
members?: string[];
|
|
23
|
+
dryRun?: boolean;
|
|
24
|
+
drill?: boolean;
|
|
25
|
+
output?: string;
|
|
26
|
+
json?: boolean;
|
|
27
|
+
/** For tests. */
|
|
28
|
+
runBuild?: ExitBuildRunner;
|
|
29
|
+
ledger?: GateLedgerPort;
|
|
30
|
+
now?: string;
|
|
31
|
+
}
|
|
32
|
+
export type ExitOutcome = "drill" | "nothing-to-exit" | "checks-failed" | "dry-run" | "gated" | "applied";
|
|
33
|
+
export interface ExitCommandResult {
|
|
34
|
+
outcome: ExitOutcome;
|
|
35
|
+
exitCode: number;
|
|
36
|
+
result?: ExitResult;
|
|
37
|
+
report?: DrillReport;
|
|
38
|
+
digest?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function exitCommand(opts: ExitCommandOptions): Promise<ExitCommandResult>;
|
|
41
|
+
/** One line per member, for the terminal. */
|
|
42
|
+
export declare function describeExit(result: ExitResult, digest: string): string[];
|
|
43
|
+
export declare function runWorkspaceExit(ctx: CommandContext): Promise<number>;
|
|
44
|
+
//# sourceMappingURL=exit-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-cli.d.ts","sourceRoot":"","sources":["../../src/workspace/exit-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAuF,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAGtI,OAAO,EAA2E,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAK1J,0EAA0E;AAC1E,eAAO,MAAM,UAAU,IAAI,CAAC;AAI5B,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iBAAiB;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,iBAAiB,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE1G,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsGtF;AAgBD,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAYzE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB3E"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant workspace exit [<member>...] [--dry-run] [--drill] [--output <file>] [--json]`
|
|
3
|
+
* (#3177).
|
|
4
|
+
*
|
|
5
|
+
* Stages the exit in a git worktree (see ./exit.ts), checks the staged tree
|
|
6
|
+
* with the same static checks the exit drill uses, then decides a gate. The
|
|
7
|
+
* gate is `workspace-exit/<scope>` on the gate ledger and binds the digest of
|
|
8
|
+
* the patch, as `workspace upgrade` does: the first run records the pending
|
|
9
|
+
* fact and exits 3; after `chant approve workspace-exit <scope>` the same
|
|
10
|
+
* command stages the same patch and applies it to the tree.
|
|
11
|
+
*
|
|
12
|
+
* `--drill` skips the worktree and the gate: it runs the exit on a scratch
|
|
13
|
+
* copy and prints the per-member result, the check CI runs on every commit.
|
|
14
|
+
*/
|
|
15
|
+
import { execFileSync } from "node:child_process";
|
|
16
|
+
import { createHash } from "node:crypto";
|
|
17
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
18
|
+
import { tmpdir } from "node:os";
|
|
19
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
20
|
+
import { formatError, formatInfo, formatSuccess, formatWarning } from "../cli/format.js";
|
|
21
|
+
import { approveCommand, describeGateMismatch, evaluateGate, gateIsSealed, gitGateLedgerPort } from "../op/gate.js";
|
|
22
|
+
import { WORKSPACE_EXIT_GATE_OP } from "../op/gate-name.js";
|
|
23
|
+
import { findWorkspaceRoot } from "../project-root.js";
|
|
24
|
+
import { describeDrill, ExitError, exitInDir, planExit, runExitDrill, verifyExit } from "./exit.js";
|
|
25
|
+
import { spawnChant } from "./lineage-upgrade.js";
|
|
26
|
+
const USAGE = "chant workspace exit [<member>...] [--member <name>] [--dry-run] [--drill] [--output <patch file>] [--json]";
|
|
27
|
+
/** The exit code of a gated exit: the same as `chant run`'s gated run. */
|
|
28
|
+
export const EXIT_GATED = 3;
|
|
29
|
+
const EXIT_DIR = ".chant/exit";
|
|
30
|
+
function git(cwd, args) {
|
|
31
|
+
return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 256 * 1024 * 1024 });
|
|
32
|
+
}
|
|
33
|
+
const defaultBuild = (command, cwd, args) => spawnChant(command, cwd, args);
|
|
34
|
+
export async function exitCommand(opts) {
|
|
35
|
+
const runBuild = opts.runBuild ?? defaultBuild;
|
|
36
|
+
const names = opts.members ?? [];
|
|
37
|
+
const print = (lines) => {
|
|
38
|
+
if (!opts.json)
|
|
39
|
+
console.log(lines.join("\n"));
|
|
40
|
+
};
|
|
41
|
+
if (opts.drill) {
|
|
42
|
+
const report = await runExitDrill({ root: opts.root, members: names, runBuild });
|
|
43
|
+
if (opts.json)
|
|
44
|
+
console.log(JSON.stringify({ outcome: "drill", ...report }, null, 2));
|
|
45
|
+
else
|
|
46
|
+
print(describeDrill(report));
|
|
47
|
+
return { outcome: "drill", exitCode: report.ok ? 0 : 1, report };
|
|
48
|
+
}
|
|
49
|
+
let repo;
|
|
50
|
+
let head;
|
|
51
|
+
try {
|
|
52
|
+
repo = git(opts.root, ["rev-parse", "--show-toplevel"]).trim();
|
|
53
|
+
head = git(opts.root, ["rev-parse", "HEAD"]).trim();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new ExitError("chant workspace exit stages its change in a git worktree, so the project must be in a git repository with at least one commit");
|
|
57
|
+
}
|
|
58
|
+
const dirty = git(repo, ["status", "--porcelain", "--untracked-files=all"])
|
|
59
|
+
.split("\n")
|
|
60
|
+
.filter(Boolean)
|
|
61
|
+
.filter((l) => !l.slice(3).includes(`${EXIT_DIR}/`));
|
|
62
|
+
if (dirty.length > 0) {
|
|
63
|
+
throw new ExitError(`the tree has uncommitted changes (${dirty.slice(0, 5).map((l) => l.slice(3)).join(", ")}${dirty.length > 5 ? ", ..." : ""}). Commit them: the exit stages from HEAD and applies its patch to the tree.`);
|
|
64
|
+
}
|
|
65
|
+
const rel = relative(repo, opts.root).split(sep).join("/");
|
|
66
|
+
const holder = join(opts.root, EXIT_DIR);
|
|
67
|
+
mkdirSync(holder, { recursive: true });
|
|
68
|
+
const worktree = mkdtempSync(join(holder, "wt-"));
|
|
69
|
+
rmSync(worktree, { recursive: true, force: true });
|
|
70
|
+
git(repo, ["worktree", "add", "--detach", "-q", worktree, head]);
|
|
71
|
+
const dispose = () => {
|
|
72
|
+
try {
|
|
73
|
+
git(repo, ["worktree", "remove", "--force", worktree]);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
rmSync(worktree, { recursive: true, force: true });
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
try {
|
|
80
|
+
const project = rel ? join(worktree, rel) : worktree;
|
|
81
|
+
const plan = planExit(project, names);
|
|
82
|
+
const result = await exitInDir(plan, runBuild);
|
|
83
|
+
const report = verifyExit(project, result);
|
|
84
|
+
git(worktree, ["add", "-A"]);
|
|
85
|
+
const patch = git(worktree, ["diff", "--cached", "--binary", "HEAD"]);
|
|
86
|
+
const digest = `sha256:${createHash("sha256").update(patch).digest("hex").slice(0, 16)}`;
|
|
87
|
+
if (opts.json) {
|
|
88
|
+
// printed once, below
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
print(describeExit(result, digest));
|
|
92
|
+
print(describeDrill(report));
|
|
93
|
+
}
|
|
94
|
+
const out = (outcome, exitCode, extra = {}) => {
|
|
95
|
+
if (opts.json)
|
|
96
|
+
console.log(JSON.stringify({ outcome, digest, ...result, report, ...extra }, null, 2));
|
|
97
|
+
return { outcome, exitCode, result, report, digest };
|
|
98
|
+
};
|
|
99
|
+
if (opts.output)
|
|
100
|
+
writeFileSync(resolve(opts.output), patch);
|
|
101
|
+
if (!patch) {
|
|
102
|
+
if (!opts.json)
|
|
103
|
+
console.error(formatInfo("nothing to exit: no member changed"));
|
|
104
|
+
return out("nothing-to-exit", 0);
|
|
105
|
+
}
|
|
106
|
+
if (!report.ok) {
|
|
107
|
+
if (!opts.json)
|
|
108
|
+
console.error(formatError({ message: "the exit was not gated: its checks must pass first. The tree is unchanged." }));
|
|
109
|
+
return out("checks-failed", 1);
|
|
110
|
+
}
|
|
111
|
+
if (opts.dryRun) {
|
|
112
|
+
if (!opts.json)
|
|
113
|
+
console.error(formatInfo("--dry-run: staged and checked; no gate recorded, the tree is unchanged"));
|
|
114
|
+
return out("dry-run", 0);
|
|
115
|
+
}
|
|
116
|
+
const gate = names.length > 0 ? names.join("+") : "workspace";
|
|
117
|
+
const check = await evaluateGate(opts.ledger ?? gitGateLedgerPort({ cwd: repo }), {
|
|
118
|
+
op: WORKSPACE_EXIT_GATE_OP,
|
|
119
|
+
gate,
|
|
120
|
+
description: `leave chant: ${gate}`,
|
|
121
|
+
planDigest: digest,
|
|
122
|
+
...(opts.now ? { now: opts.now } : {}),
|
|
123
|
+
});
|
|
124
|
+
if (!check.satisfied) {
|
|
125
|
+
if (!opts.json) {
|
|
126
|
+
const sealed = await gateIsSealed(gate);
|
|
127
|
+
if (check.mismatch)
|
|
128
|
+
console.error(formatWarning({ message: describeGateMismatch(WORKSPACE_EXIT_GATE_OP, gate, check.mismatch, sealed) }));
|
|
129
|
+
console.error(formatInfo(`Gated: the patch ${digest} waits for approval. Review it (--output <file> writes it), then run \`${approveCommand(WORKSPACE_EXIT_GATE_OP, gate, undefined, undefined, sealed)}\` and repeat this command to apply it.`));
|
|
130
|
+
}
|
|
131
|
+
return out("gated", EXIT_GATED, { pending: check.pending });
|
|
132
|
+
}
|
|
133
|
+
applyPatch(repo, patch);
|
|
134
|
+
if (!opts.json)
|
|
135
|
+
console.error(formatSuccess(`applied the approved exit (${digest}), approved by ${check.resolution.resolvedBy}. Review and commit it.`));
|
|
136
|
+
return out("applied", 0, { approvedBy: check.resolution.resolvedBy });
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
dispose();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function applyPatch(repo, patch) {
|
|
143
|
+
const dir = mkdtempSync(join(tmpdir(), "chant-exit-patch-"));
|
|
144
|
+
const file = join(dir, "exit.patch");
|
|
145
|
+
try {
|
|
146
|
+
writeFileSync(file, patch);
|
|
147
|
+
git(repo, ["apply", "--binary", "--whitespace=nowarn", file]);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
const stderr = err.stderr?.toString().trim();
|
|
151
|
+
throw new ExitError(`the approved patch no longer applies to the tree${stderr ? `: ${stderr}` : ""}`);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
rmSync(dir, { recursive: true, force: true });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** One line per member, for the terminal. */
|
|
158
|
+
export function describeExit(result, digest) {
|
|
159
|
+
const lines = [];
|
|
160
|
+
for (const m of result.members) {
|
|
161
|
+
lines.push(`${m.name} ${m.kind} ${m.status}${m.detail ? ` (${m.detail})` : ""}`);
|
|
162
|
+
for (const n of m.native)
|
|
163
|
+
lines.push(` native: ${n}`);
|
|
164
|
+
for (const d of m.deploy)
|
|
165
|
+
lines.push(` deploy: ${d}`);
|
|
166
|
+
for (const c of m.ci)
|
|
167
|
+
lines.push(` ci: ${c}`);
|
|
168
|
+
for (const o of m.ops)
|
|
169
|
+
lines.push(` kept: ${o}`);
|
|
170
|
+
for (const s of m.steps)
|
|
171
|
+
lines.push(` step: ${s}`);
|
|
172
|
+
}
|
|
173
|
+
lines.push(` patch: ${digest}`);
|
|
174
|
+
return lines;
|
|
175
|
+
}
|
|
176
|
+
export async function runWorkspaceExit(ctx) {
|
|
177
|
+
const { args } = ctx;
|
|
178
|
+
// positionals are ["exit", <member>...]
|
|
179
|
+
const named = [...(args.positionals ?? []).slice(1), ...(args.members ?? [])];
|
|
180
|
+
const root = findWorkspaceRoot(process.cwd())?.dir ?? process.cwd();
|
|
181
|
+
try {
|
|
182
|
+
const result = await exitCommand({
|
|
183
|
+
root,
|
|
184
|
+
members: [...new Set(named)],
|
|
185
|
+
dryRun: args.dryRun,
|
|
186
|
+
drill: args.drill,
|
|
187
|
+
output: args.output,
|
|
188
|
+
json: args.json,
|
|
189
|
+
});
|
|
190
|
+
return result.exitCode;
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
if (!(err instanceof ExitError))
|
|
194
|
+
throw err;
|
|
195
|
+
console.error(formatError({ message: err.message, hint: USAGE }));
|
|
196
|
+
return 1;
|
|
197
|
+
}
|
|
198
|
+
}
|