@intentius/chant 0.124.27 → 0.124.29
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/README.md +1 -1
- package/dist/__golden__/wave-loop/fan-out-gated.json +8 -0
- package/dist/__golden__/wave-loop/fan-out-no-members.json +4 -0
- package/dist/__golden__/wave-loop/fan-out-only.json +6 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +2 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +3 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
- package/dist/__golden__/wave-loop/op-held-on.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +3 -0
- package/dist/__golden__/wave-loop/op-per-run.json +7 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +7 -0
- package/dist/__golden__/wave-loop/op-sealed.json +3 -0
- package/dist/__golden__/wave-loop/op-spend.json +3 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +7 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +4 -0
- package/dist/build-params.d.ts +34 -1
- package/dist/build-params.d.ts.map +1 -1
- package/dist/build-params.js +31 -1
- package/dist/change-set-graph.d.ts +63 -0
- package/dist/change-set-graph.d.ts.map +1 -0
- package/dist/change-set-graph.js +130 -0
- package/dist/change-set.d.ts +62 -3
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +36 -4
- package/dist/chant-version.d.ts +9 -0
- package/dist/chant-version.d.ts.map +1 -0
- package/dist/chant-version.js +16 -0
- package/dist/cli/build-params-cli.d.ts +7 -1
- package/dist/cli/build-params-cli.d.ts.map +1 -1
- package/dist/cli/build-params-cli.js +17 -8
- package/dist/cli/commands/build.d.ts +8 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +15 -11
- package/dist/cli/commands/check-lexicon-docs.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-docs.js +30 -2
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.js +13 -2
- package/dist/cli/commands/init-lexicon/templates/docs.d.ts +4 -1
- package/dist/cli/commands/init-lexicon/templates/docs.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/docs.js +6 -6
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.js +17 -8
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +64 -4
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +43 -4
- package/dist/cli/handlers/change-set.d.ts +10 -0
- package/dist/cli/handlers/change-set.d.ts.map +1 -1
- package/dist/cli/handlers/change-set.js +51 -1
- package/dist/cli/handlers/fan-out.d.ts +10 -1
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +54 -6
- package/dist/cli/handlers/lifecycle-gc.d.ts +19 -0
- package/dist/cli/handlers/lifecycle-gc.d.ts.map +1 -0
- package/dist/cli/handlers/lifecycle-gc.js +143 -0
- package/dist/cli/handlers/pr.d.ts +16 -2
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +269 -37
- package/dist/cli/handlers/promote.d.ts +7 -0
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +440 -28
- package/dist/cli/handlers/release.d.ts +91 -0
- package/dist/cli/handlers/release.d.ts.map +1 -0
- package/dist/cli/handlers/release.js +589 -0
- package/dist/cli/handlers/run.d.ts +38 -2
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +234 -16
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +143 -17
- package/dist/cli/mcp/workspace-tools.js +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +73 -5
- package/dist/cli/registry.d.ts +43 -5
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/run-events.d.ts +30 -0
- package/dist/cli/run-events.d.ts.map +1 -0
- package/dist/cli/run-events.js +49 -0
- package/dist/cli/version.d.ts +3 -5
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +3 -13
- package/dist/codegen/docs-in-site.d.ts +71 -0
- package/dist/codegen/docs-in-site.d.ts.map +1 -0
- package/dist/codegen/docs-in-site.js +177 -0
- package/dist/codegen/docs-types.d.ts +14 -1
- package/dist/codegen/docs-types.d.ts.map +1 -1
- package/dist/codegen/docs.d.ts +18 -1
- package/dist/codegen/docs.d.ts.map +1 -1
- package/dist/codegen/docs.js +40 -7
- package/dist/codegen/rehype-base-url.mjs +15 -9
- package/dist/components/auto-release.d.ts +6 -1
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/auto-release.js +3 -0
- package/dist/components/capability.d.ts +9 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/cli-support.d.ts +6 -0
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +10 -9
- package/dist/components/driver.d.ts +50 -9
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +116 -54
- package/dist/components/fan-out-inputs.d.ts +69 -0
- package/dist/components/fan-out-inputs.d.ts.map +1 -0
- package/dist/components/fan-out-inputs.js +169 -0
- package/dist/components/fan-out-record.d.ts +13 -0
- package/dist/components/fan-out-record.d.ts.map +1 -1
- package/dist/components/fan-out-record.js +16 -0
- package/dist/components/fan-out-run.d.ts +7 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +85 -26
- package/dist/components/fan-out.d.ts +4 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/pr-pipeline.d.ts +25 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +22 -4
- package/dist/components/pr-run.d.ts +11 -0
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +20 -1
- package/dist/components/promote-order.d.ts +38 -0
- package/dist/components/promote-order.d.ts.map +1 -0
- package/dist/components/promote-order.js +62 -0
- package/dist/components/promote.d.ts +38 -2
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +77 -2
- package/dist/components/release-compile.d.ts +142 -0
- package/dist/components/release-compile.d.ts.map +1 -0
- package/dist/components/release-compile.js +382 -0
- package/dist/components/release-gate.d.ts +135 -0
- package/dist/components/release-gate.d.ts.map +1 -0
- package/dist/components/release-gate.js +288 -0
- package/dist/components/release-promote.d.ts +96 -0
- package/dist/components/release-promote.d.ts.map +1 -0
- package/dist/components/release-promote.js +204 -0
- package/dist/components/run-progress.d.ts +7 -0
- package/dist/components/run-progress.d.ts.map +1 -1
- package/dist/components/wave-plan.d.ts +8 -1
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +11 -3
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/flag-params.d.ts +54 -0
- package/dist/flag-params.d.ts.map +1 -0
- package/dist/flag-params.js +130 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.d.ts +120 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.js +304 -0
- package/dist/lifecycle/change-set-store.d.ts +68 -0
- package/dist/lifecycle/change-set-store.d.ts.map +1 -0
- package/dist/lifecycle/change-set-store.js +97 -0
- package/dist/lifecycle/commit-sha.d.ts +13 -0
- package/dist/lifecycle/commit-sha.d.ts.map +1 -0
- package/dist/lifecycle/commit-sha.js +21 -0
- package/dist/lifecycle/delivery-metrics.d.ts +139 -0
- package/dist/lifecycle/delivery-metrics.d.ts.map +1 -0
- package/dist/lifecycle/delivery-metrics.js +145 -0
- package/dist/lifecycle/deploy-outcome.d.ts +81 -0
- package/dist/lifecycle/deploy-outcome.d.ts.map +1 -0
- package/dist/lifecycle/deploy-outcome.js +101 -0
- package/dist/lifecycle/gate-change-set.d.ts +78 -0
- package/dist/lifecycle/gate-change-set.d.ts.map +1 -0
- package/dist/lifecycle/gate-change-set.js +138 -0
- package/dist/lifecycle/gate-ledger.d.ts +51 -4
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +18 -0
- package/dist/lifecycle/git.d.ts +30 -1
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/git.js +31 -5
- package/dist/lifecycle/index.d.ts +4 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +4 -0
- package/dist/lifecycle/mixed-environment.d.ts +95 -0
- package/dist/lifecycle/mixed-environment.d.ts.map +1 -0
- package/dist/lifecycle/mixed-environment.js +154 -0
- package/dist/lifecycle/publish-attachments.d.ts +79 -0
- package/dist/lifecycle/publish-attachments.d.ts.map +1 -0
- package/dist/lifecycle/publish-attachments.js +179 -0
- package/dist/lifecycle/publish-credentials.d.ts +37 -0
- package/dist/lifecycle/publish-credentials.d.ts.map +1 -0
- package/dist/lifecycle/publish-credentials.js +69 -0
- package/dist/lifecycle/publish-declaration.d.ts +97 -0
- package/dist/lifecycle/publish-declaration.d.ts.map +1 -0
- package/dist/lifecycle/publish-declaration.js +83 -0
- package/dist/lifecycle/publish-forge.d.ts +53 -0
- package/dist/lifecycle/publish-forge.d.ts.map +1 -0
- package/dist/lifecycle/publish-forge.js +298 -0
- package/dist/lifecycle/publish-npm.d.ts +61 -0
- package/dist/lifecycle/publish-npm.d.ts.map +1 -0
- package/dist/lifecycle/publish-npm.js +242 -0
- package/dist/lifecycle/publish-oci.d.ts +64 -0
- package/dist/lifecycle/publish-oci.d.ts.map +1 -0
- package/dist/lifecycle/publish-oci.js +383 -0
- package/dist/lifecycle/publish-record.d.ts +66 -0
- package/dist/lifecycle/publish-record.d.ts.map +1 -0
- package/dist/lifecycle/publish-record.js +84 -0
- package/dist/lifecycle/publish-targets.d.ts +45 -0
- package/dist/lifecycle/publish-targets.d.ts.map +1 -0
- package/dist/lifecycle/publish-targets.js +85 -0
- package/dist/lifecycle/release-cut.d.ts +154 -0
- package/dist/lifecycle/release-cut.d.ts.map +1 -0
- package/dist/lifecycle/release-cut.js +366 -0
- package/dist/lifecycle/release-join.d.ts +95 -0
- package/dist/lifecycle/release-join.d.ts.map +1 -0
- package/dist/lifecycle/release-join.js +139 -0
- package/dist/lifecycle/release-ledger.d.ts +54 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +53 -20
- package/dist/lifecycle/release-publish.d.ts +312 -0
- package/dist/lifecycle/release-publish.d.ts.map +1 -0
- package/dist/lifecycle/release-publish.js +335 -0
- package/dist/lifecycle/release-revocation.d.ts +80 -0
- package/dist/lifecycle/release-revocation.d.ts.map +1 -0
- package/dist/lifecycle/release-revocation.js +123 -0
- package/dist/lifecycle/release-store.d.ts +200 -0
- package/dist/lifecycle/release-store.d.ts.map +1 -0
- package/dist/lifecycle/release-store.js +320 -0
- package/dist/lifecycle/release-verify.d.ts +61 -0
- package/dist/lifecycle/release-verify.d.ts.map +1 -0
- package/dist/lifecycle/release-verify.js +92 -0
- package/dist/lifecycle/release-workstation.d.ts +91 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -0
- package/dist/lifecycle/release-workstation.js +180 -0
- package/dist/lifecycle/retention-policy.d.ts +45 -0
- package/dist/lifecycle/retention-policy.d.ts.map +1 -0
- package/dist/lifecycle/retention-policy.js +43 -0
- package/dist/lifecycle/retention.d.ts +185 -0
- package/dist/lifecycle/retention.d.ts.map +1 -0
- package/dist/lifecycle/retention.js +400 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -0
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +2 -0
- package/dist/op/activities/change-coverage.d.ts.map +1 -1
- package/dist/op/activities/change-coverage.js +4 -2
- package/dist/op/activities/source-release.d.ts.map +1 -1
- package/dist/op/activities/source-release.js +7 -3
- package/dist/op/activities/source-rollback.d.ts.map +1 -1
- package/dist/op/activities/source-rollback.js +7 -3
- package/dist/op/gate-name.d.ts +11 -2
- package/dist/op/gate-name.d.ts.map +1 -1
- package/dist/op/gate-name.js +12 -3
- package/dist/op/gate-run-locator.d.ts +22 -0
- package/dist/op/gate-run-locator.d.ts.map +1 -1
- package/dist/op/gate-run-locator.js +31 -0
- package/dist/op/gate.d.ts +27 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +57 -3
- package/dist/op/local-executor.d.ts +36 -1
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +158 -52
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +4 -0
- package/dist/op/run-live.d.ts +2 -0
- package/dist/op/run-live.d.ts.map +1 -1
- package/dist/op/run-live.js +1 -1
- package/dist/op/runtime.d.ts +46 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/op/runtimes/local.js +8 -0
- package/dist/plan-summary.d.ts.map +1 -1
- package/dist/plan-summary.js +8 -2
- package/dist/point-decision.d.ts +2 -0
- package/dist/point-decision.d.ts.map +1 -1
- package/dist/point-decision.js +9 -2
- package/dist/pr-loop.d.ts +7 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +23 -4
- package/dist/pr-report-url.d.ts +82 -0
- package/dist/pr-report-url.d.ts.map +1 -0
- package/dist/pr-report-url.js +174 -0
- package/dist/provenance.d.ts +2 -2
- package/dist/provenance.d.ts.map +1 -1
- package/dist/run-event-store.d.ts +104 -0
- package/dist/run-event-store.d.ts.map +1 -0
- package/dist/run-event-store.js +251 -0
- package/dist/run-event-stream.d.ts +133 -0
- package/dist/run-event-stream.d.ts.map +1 -0
- package/dist/run-event-stream.js +242 -0
- package/dist/run-event.d.ts +285 -0
- package/dist/run-event.d.ts.map +1 -0
- package/dist/run-event.js +209 -0
- package/dist/wave-runtime.mjs +262 -226
- package/dist/workspace/__fixtures__/flag-workspace.d.ts +31 -0
- package/dist/workspace/__fixtures__/flag-workspace.d.ts.map +1 -0
- package/dist/workspace/__fixtures__/flag-workspace.js +114 -0
- package/dist/workspace/__fixtures__/run-event-check.d.ts +19 -0
- package/dist/workspace/__fixtures__/run-event-check.d.ts.map +1 -0
- package/dist/workspace/__fixtures__/run-event-check.js +59 -0
- package/dist/workspace/change-set-show.d.ts +56 -0
- package/dist/workspace/change-set-show.d.ts.map +1 -0
- package/dist/workspace/change-set-show.js +54 -0
- package/dist/workspace/change-set-show.schema.json +102 -0
- package/dist/workspace/change-set.schema.json +32 -1
- package/dist/workspace/changes-cli.d.ts.map +1 -1
- package/dist/workspace/changes-cli.js +10 -1
- package/dist/workspace/changes.d.ts +37 -0
- package/dist/workspace/changes.d.ts.map +1 -1
- package/dist/workspace/changes.js +49 -2
- package/dist/workspace/changes.schema.json +135 -0
- package/dist/workspace/check.schema.json +4 -2
- package/dist/workspace/checks/records.d.ts +9 -1
- package/dist/workspace/checks/records.d.ts.map +1 -1
- package/dist/workspace/checks/records.js +35 -1
- package/dist/workspace/checks.d.ts +1 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +2 -1
- package/dist/workspace/ci-green-cli.d.ts +19 -4
- package/dist/workspace/ci-green-cli.d.ts.map +1 -1
- package/dist/workspace/ci-green-cli.js +75 -12
- package/dist/workspace/ci-green-forge.d.ts +20 -3
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green-forge.js +6 -4
- package/dist/workspace/ci-green-workflow.d.ts +11 -0
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +6 -0
- package/dist/workspace/ci-green.d.ts +281 -13
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +456 -38
- package/dist/workspace/ci-last-green.schema.json +32 -2
- package/dist/workspace/ci-list.schema.json +525 -0
- package/dist/workspace/commit-links.d.ts +85 -0
- package/dist/workspace/commit-links.d.ts.map +1 -0
- package/dist/workspace/commit-links.js +163 -0
- package/dist/workspace/declaration.d.ts +35 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +27 -1
- package/dist/workspace/declaration.schema.json +76 -0
- package/dist/workspace/declared-kinds.d.ts +16 -0
- package/dist/workspace/declared-kinds.d.ts.map +1 -1
- package/dist/workspace/declared-kinds.js +25 -0
- package/dist/workspace/delivery-metrics.d.ts +91 -0
- package/dist/workspace/delivery-metrics.d.ts.map +1 -0
- package/dist/workspace/delivery-metrics.js +217 -0
- package/dist/workspace/delivery-metrics.schema.json +519 -0
- package/dist/workspace/flags-read.d.ts +37 -0
- package/dist/workspace/flags-read.d.ts.map +1 -0
- package/dist/workspace/flags-read.js +103 -0
- package/dist/workspace/flags.d.ts +100 -0
- package/dist/workspace/flags.d.ts.map +1 -0
- package/dist/workspace/flags.js +98 -0
- package/dist/workspace/graph-cli.js +1 -1
- package/dist/workspace/identity-gate-rule.d.ts +37 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -1
- package/dist/workspace/identity-gate-rule.js +72 -7
- package/dist/workspace/identity.d.ts +12 -0
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +13 -1
- package/dist/workspace/intent-cli.d.ts +11 -2
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-cli.js +54 -5
- package/dist/workspace/intent-trace.d.ts +219 -0
- package/dist/workspace/intent-trace.d.ts.map +1 -0
- package/dist/workspace/intent-trace.js +314 -0
- package/dist/workspace/intent.d.ts +36 -7
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +192 -22
- package/dist/workspace/intent.schema.json +702 -6
- package/dist/workspace/ls.d.ts +4 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +2 -0
- package/dist/workspace/ls.schema.json +3 -1
- package/dist/workspace/member-pipeline.d.ts +6 -0
- package/dist/workspace/member-pipeline.d.ts.map +1 -1
- package/dist/workspace/member-pipeline.js +6 -0
- package/dist/workspace/overlap.d.ts +146 -0
- package/dist/workspace/overlap.d.ts.map +1 -0
- package/dist/workspace/overlap.js +276 -0
- package/dist/workspace/promotion-order.d.ts +41 -0
- package/dist/workspace/promotion-order.d.ts.map +1 -0
- package/dist/workspace/promotion-order.js +95 -0
- package/dist/workspace/reason-codes.d.ts +4 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +7 -1
- package/dist/workspace/records.d.ts +15 -2
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/records.js +32 -0
- package/dist/workspace/records.schema.json +21 -2
- package/dist/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
- package/dist/workspace/reference-kinds/flag/flag.schema.json +53 -0
- package/dist/workspace/releases.d.ts +81 -0
- package/dist/workspace/releases.d.ts.map +1 -0
- package/dist/workspace/releases.js +103 -0
- package/dist/workspace/releases.schema.json +513 -0
- package/dist/workspace/run-event.schema.json +295 -0
- package/dist/workspace/status-gates.d.ts +34 -1
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status-gates.js +31 -2
- package/dist/workspace/status-stewards.d.ts +4 -0
- package/dist/workspace/status-stewards.d.ts.map +1 -1
- package/dist/workspace/status-stewards.js +2 -0
- package/dist/workspace/status.d.ts +117 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +218 -4
- package/dist/workspace/status.schema.json +268 -2
- package/dist/workspace/trust/ci-tag-statement.d.ts +102 -0
- package/dist/workspace/trust/ci-tag-statement.d.ts.map +1 -0
- package/dist/workspace/trust/ci-tag-statement.js +123 -0
- package/dist/workspace/trust/op-run-statement.d.ts +91 -0
- package/dist/workspace/trust/op-run-statement.d.ts.map +1 -0
- package/dist/workspace/trust/op-run-statement.js +143 -0
- package/dist/workspace/trust/rotation.d.ts +18 -2
- package/dist/workspace/trust/rotation.d.ts.map +1 -1
- package/dist/workspace/trust/rotation.js +65 -16
- package/dist/workspace/trust/seal.d.ts +11 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/seal.js +9 -0
- package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
- package/dist/workspace/trust/ssh-commit.js +10 -10
- package/dist/workspace/wip.d.ts.map +1 -1
- package/dist/workspace/wip.js +11 -3
- package/package.json +1 -1
- package/src/__golden__/wave-loop/fan-out-gated.json +8 -0
- package/src/__golden__/wave-loop/fan-out-no-members.json +4 -0
- package/src/__golden__/wave-loop/fan-out-only.json +6 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +2 -0
- package/src/__golden__/wave-loop/op-cost-member.json +3 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
- package/src/__golden__/wave-loop/op-held-on.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +3 -0
- package/src/__golden__/wave-loop/op-per-run.json +7 -0
- package/src/__golden__/wave-loop/op-pr-review.json +7 -0
- package/src/__golden__/wave-loop/op-sealed.json +3 -0
- package/src/__golden__/wave-loop/op-spend.json +3 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +7 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +4 -0
- package/src/build-params.test.ts +46 -0
- package/src/build-params.ts +55 -1
- package/src/change-set-graph.test.ts +72 -0
- package/src/change-set-graph.ts +141 -0
- package/src/change-set.ts +87 -6
- package/src/chant-version.ts +16 -0
- package/src/cli/build-params-cli.ts +22 -9
- package/src/cli/commands/build.ts +25 -11
- package/src/cli/commands/check-lexicon-docs.test.ts +51 -0
- package/src/cli/commands/check-lexicon-docs.ts +39 -2
- package/src/cli/commands/check-lexicon.ts +14 -2
- package/src/cli/commands/init-lexicon/templates/docs.ts +7 -6
- package/src/cli/commands/init-lexicon.test.ts +25 -0
- package/src/cli/commands/init-lexicon.ts +18 -8
- package/src/cli/handlers/approve-release.test.ts +84 -0
- package/src/cli/handlers/approve-revoked.test.ts +155 -0
- package/src/cli/handlers/approve.ts +65 -2
- package/src/cli/handlers/build.test.ts +67 -0
- package/src/cli/handlers/build.ts +46 -4
- package/src/cli/handlers/change-set.ts +49 -1
- package/src/cli/handlers/fan-out.test.ts +228 -1
- package/src/cli/handlers/fan-out.ts +53 -6
- package/src/cli/handlers/intent-trace.e2e.test.ts +201 -0
- package/src/cli/handlers/lifecycle-gc.test.ts +126 -0
- package/src/cli/handlers/lifecycle-gc.ts +146 -0
- package/src/cli/handlers/operator.test.ts +37 -0
- package/src/cli/handlers/pr.test.ts +341 -0
- package/src/cli/handlers/pr.ts +292 -47
- package/src/cli/handlers/promote.test.ts +669 -7
- package/src/cli/handlers/promote.ts +464 -29
- package/src/cli/handlers/release-implicit.e2e.test.ts +161 -0
- package/src/cli/handlers/release-join.e2e.test.ts +185 -0
- package/src/cli/handlers/release-publish-targets.e2e.test.ts +295 -0
- package/src/cli/handlers/release-verify.e2e.test.ts +117 -0
- package/src/cli/handlers/release-workstation-ci.e2e.test.ts +135 -0
- package/src/cli/handlers/release.e2e.test.ts +199 -0
- package/src/cli/handlers/release.ts +593 -0
- package/src/cli/handlers/run-auto-release.test.ts +80 -0
- package/src/cli/handlers/run-events-cmd.test.ts +92 -0
- package/src/cli/handlers/run-release.test.ts +55 -0
- package/src/cli/handlers/run.test.ts +30 -0
- package/src/cli/handlers/run.ts +243 -18
- package/src/cli/main.test.ts +8 -0
- package/src/cli/main.ts +143 -17
- package/src/cli/mcp/never-over-mcp.test.ts +2 -0
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/cli/parse-args.ts +56 -5
- package/src/cli/registry.ts +43 -5
- package/src/cli/run-events.ts +57 -0
- package/src/cli/version.ts +3 -13
- package/src/codegen/docs-in-site.test.ts +166 -0
- package/src/codegen/docs-in-site.ts +182 -0
- package/src/codegen/docs-site/AgentPrompt.astro +26 -1
- package/src/codegen/docs-types.ts +14 -1
- package/src/codegen/docs.ts +60 -7
- package/src/codegen/rehype-base-url.d.mts +3 -1
- package/src/codegen/rehype-base-url.mjs +15 -9
- package/src/codegen/rehype-base-url.test.ts +34 -0
- package/src/components/auto-release.test.ts +30 -0
- package/src/components/auto-release.ts +9 -1
- package/src/components/capability.ts +9 -0
- package/src/components/cli-support.test.ts +82 -0
- package/src/components/cli-support.ts +16 -9
- package/src/components/driver.test.ts +24 -0
- package/src/components/driver.ts +165 -56
- package/src/components/fan-out-inputs.test.ts +85 -0
- package/src/components/fan-out-inputs.ts +192 -0
- package/src/components/fan-out-record.test.ts +10 -0
- package/src/components/fan-out-record.ts +19 -0
- package/src/components/fan-out-run.ts +104 -35
- package/src/components/fan-out.ts +4 -0
- package/src/components/pr-pipeline.ts +35 -4
- package/src/components/pr-run.ts +30 -1
- package/src/components/promote-order.test.ts +90 -0
- package/src/components/promote-order.ts +75 -0
- package/src/components/promote.test.ts +10 -1
- package/src/components/promote.ts +94 -3
- package/src/components/release-compile.test.ts +147 -0
- package/src/components/release-compile.ts +459 -0
- package/src/components/release-gate.test.ts +215 -0
- package/src/components/release-gate.ts +355 -0
- package/src/components/release-promote.test.ts +159 -0
- package/src/components/release-promote.ts +232 -0
- package/src/components/run-progress.ts +7 -0
- package/src/components/wave-plan.ts +16 -3
- package/src/config.ts +15 -1
- package/src/flag-params.test.ts +144 -0
- package/src/flag-params.ts +134 -0
- package/src/index.ts +2 -0
- package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
- package/src/lifecycle/change-set-store.test.ts +217 -0
- package/src/lifecycle/change-set-store.ts +113 -0
- package/src/lifecycle/commit-sha.ts +23 -0
- package/src/lifecycle/delivery-metrics.ts +263 -0
- package/src/lifecycle/deploy-outcome.ts +147 -0
- package/src/lifecycle/gate-change-set.e2e.test.ts +122 -0
- package/src/lifecycle/gate-change-set.ts +164 -0
- package/src/lifecycle/gate-ledger.test.ts +33 -0
- package/src/lifecycle/gate-ledger.ts +68 -3
- package/src/lifecycle/git.ts +61 -8
- package/src/lifecycle/index.ts +4 -0
- package/src/lifecycle/mixed-environment.test.ts +97 -0
- package/src/lifecycle/mixed-environment.ts +204 -0
- package/src/lifecycle/publish-attachments.ts +196 -0
- package/src/lifecycle/publish-credentials.ts +84 -0
- package/src/lifecycle/publish-declaration.ts +95 -0
- package/src/lifecycle/publish-forge.ts +325 -0
- package/src/lifecycle/publish-npm.ts +259 -0
- package/src/lifecycle/publish-oci.ts +396 -0
- package/src/lifecycle/publish-record.ts +113 -0
- package/src/lifecycle/publish-resume.test.ts +168 -0
- package/src/lifecycle/publish-targets.test.ts +494 -0
- package/src/lifecycle/publish-targets.ts +100 -0
- package/src/lifecycle/release-cut-signed.test.ts +180 -0
- package/src/lifecycle/release-cut.test.ts +483 -0
- package/src/lifecycle/release-cut.ts +503 -0
- package/src/lifecycle/release-flag.test.ts +112 -0
- package/src/lifecycle/release-join.test.ts +68 -0
- package/src/lifecycle/release-join.ts +182 -0
- package/src/lifecycle/release-ledger.test.ts +14 -0
- package/src/lifecycle/release-ledger.ts +85 -17
- package/src/lifecycle/release-publish.test.ts +225 -0
- package/src/lifecycle/release-publish.ts +568 -0
- package/src/lifecycle/release-revocation.ts +147 -0
- package/src/lifecycle/release-store.ts +434 -0
- package/src/lifecycle/release-verify.test.ts +110 -0
- package/src/lifecycle/release-verify.ts +120 -0
- package/src/lifecycle/release-workstation.test.ts +204 -0
- package/src/lifecycle/release-workstation.ts +216 -0
- package/src/lifecycle/retention-growth.e2e.test.ts +279 -0
- package/src/lifecycle/retention-policy.ts +63 -0
- package/src/lifecycle/retention.test.ts +363 -0
- package/src/lifecycle/retention.ts +508 -0
- package/src/lifecycle/run-ledger.test.ts +10 -0
- package/src/lifecycle/run-ledger.ts +6 -0
- package/src/op/activities/change-coverage.ts +4 -1
- package/src/op/activities/source-release.ts +8 -3
- package/src/op/activities/source-rollback.ts +8 -4
- package/src/op/commit-run-gate-deploy-join.test.ts +117 -0
- package/src/op/gate-name.ts +13 -3
- package/src/op/gate-release.test.ts +126 -0
- package/src/op/gate-run-locator.test.ts +110 -0
- package/src/op/gate-run-locator.ts +35 -0
- package/src/op/gate.ts +88 -6
- package/src/op/local-executor.ts +207 -52
- package/src/op/op-waves-run.ts +4 -0
- package/src/op/run-events.test.ts +166 -0
- package/src/op/run-live.ts +1 -1
- package/src/op/runtime.ts +39 -0
- package/src/op/runtimes/local.test.ts +16 -0
- package/src/op/runtimes/local.ts +9 -0
- package/src/plan-summary.test.ts +20 -0
- package/src/plan-summary.ts +8 -1
- package/src/point-decision.ts +12 -2
- package/src/pr-loop.ts +25 -4
- package/src/pr-report-url.test.ts +131 -0
- package/src/pr-report-url.ts +209 -0
- package/src/provenance.ts +2 -2
- package/src/run-event-store.test.ts +144 -0
- package/src/run-event-store.ts +273 -0
- package/src/run-event-stream.test.ts +175 -0
- package/src/run-event-stream.ts +309 -0
- package/src/run-event.test.ts +277 -0
- package/src/run-event.ts +471 -0
- package/src/wave-loop-golden.test.ts +9 -0
- package/src/workspace/__fixtures__/flag-workspace.ts +132 -0
- package/src/workspace/__fixtures__/older-records/change-set-984534ea9.json +100 -0
- package/src/workspace/__fixtures__/older-records/older-records.json +326 -0
- package/src/workspace/__fixtures__/run-event-check.ts +58 -0
- package/src/workspace/ancestry-index.test.ts +93 -0
- package/src/workspace/change-set-show.schema.json +102 -0
- package/src/workspace/change-set-show.ts +72 -0
- package/src/workspace/change-set.schema.json +32 -1
- package/src/workspace/changes-cli.ts +10 -1
- package/src/workspace/changes.schema.json +135 -0
- package/src/workspace/changes.test.ts +1 -1
- package/src/workspace/changes.ts +84 -2
- package/src/workspace/check.schema.json +4 -2
- package/src/workspace/checks/records.ts +35 -1
- package/src/workspace/checks.ts +2 -1
- package/src/workspace/ci-green-cli.ts +75 -13
- package/src/workspace/ci-green-forge.ts +24 -4
- package/src/workspace/ci-green-runs.test.ts +242 -0
- package/src/workspace/ci-green-signed.test.ts +302 -0
- package/src/workspace/ci-green-workflow.test.ts +16 -0
- package/src/workspace/ci-green-workflow.ts +12 -0
- package/src/workspace/ci-green.test.ts +131 -2
- package/src/workspace/ci-green.ts +635 -42
- package/src/workspace/ci-last-green.schema.json +32 -2
- package/src/workspace/ci-list.schema.json +525 -0
- package/src/workspace/commit-links.test.ts +279 -0
- package/src/workspace/commit-links.ts +183 -0
- package/src/workspace/declaration.schema.json +76 -0
- package/src/workspace/declaration.test.ts +28 -0
- package/src/workspace/declaration.ts +60 -2
- package/src/workspace/declared-kinds.ts +40 -1
- package/src/workspace/delivery-metrics.schema.json +519 -0
- package/src/workspace/delivery-metrics.test.ts +236 -0
- package/src/workspace/delivery-metrics.ts +286 -0
- package/src/workspace/flags-read.ts +121 -0
- package/src/workspace/flags.test.ts +141 -0
- package/src/workspace/flags.ts +157 -0
- package/src/workspace/graph-cli.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +91 -7
- package/src/workspace/identity.ts +14 -1
- package/src/workspace/intent-cli.ts +46 -5
- package/src/workspace/intent-trace.test.ts +173 -0
- package/src/workspace/intent-trace.ts +484 -0
- package/src/workspace/intent.schema.json +702 -6
- package/src/workspace/intent.ts +196 -26
- package/src/workspace/ls.schema.json +3 -1
- package/src/workspace/ls.ts +6 -0
- package/src/workspace/member-pipeline.test.ts +17 -0
- package/src/workspace/member-pipeline.ts +9 -0
- package/src/workspace/older-records.test.ts +412 -0
- package/src/workspace/overlap.test.ts +165 -0
- package/src/workspace/overlap.ts +340 -0
- package/src/workspace/promotion-order.ts +97 -0
- package/src/workspace/read-contract.e2e.test.ts +5 -1
- package/src/workspace/reason-codes.test.ts +7 -1
- package/src/workspace/reason-codes.ts +7 -1
- package/src/workspace/record-assets.test.ts +2 -1
- package/src/workspace/records-contract.e2e.test.ts +2 -1
- package/src/workspace/records.schema.json +21 -2
- package/src/workspace/records.ts +36 -2
- package/src/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
- package/src/workspace/reference-kinds/flag/flag.schema.json +53 -0
- package/src/workspace/releases.schema.json +513 -0
- package/src/workspace/releases.test.ts +108 -0
- package/src/workspace/releases.ts +133 -0
- package/src/workspace/run-event.schema.json +295 -0
- package/src/workspace/status-contract.test.ts +81 -1
- package/src/workspace/status-gates.ts +64 -1
- package/src/workspace/status-mixed.test.ts +152 -0
- package/src/workspace/status-revoked.test.ts +153 -0
- package/src/workspace/status-stewards.ts +6 -0
- package/src/workspace/status.schema.json +268 -2
- package/src/workspace/status.ts +334 -4
- package/src/workspace/trust/ci-tag-statement.ts +151 -0
- package/src/workspace/trust/op-run-statement.ts +148 -0
- package/src/workspace/trust/rotation.ts +61 -14
- package/src/workspace/trust/seal.ts +10 -0
- package/src/workspace/trust/ssh-commit.ts +10 -9
- package/src/workspace/wip.ts +11 -2
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/astro.config.mjs +0 -14
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/package.json +0 -16
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content/docs/index.mdx +0 -8
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content.config.ts +0 -15
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/tsconfig.json +0 -10
package/dist/cli/handlers/pr.js
CHANGED
|
@@ -29,6 +29,20 @@
|
|
|
29
29
|
*
|
|
30
30
|
* Every run writes `pr-plan.json` or `pr-apply.json` (`pr-report.schema.json`),
|
|
31
31
|
* `change-set.json` and `pr-note.md` under `--output` (default `.chant/pr`). *
|
|
32
|
+
* `--events-json` (#4041, #4007) streams the stage's run events to stdout,
|
|
33
|
+
* one `run-event.schema.json` line each: the planning as a `plan` phase with
|
|
34
|
+
* a step per component, the gate's decision as a `gate` phase, and on
|
|
35
|
+
* pr-apply the apply's waves and components as `chant run --components`
|
|
36
|
+
* streams them. A component the apply does not start settles too, `blocked`
|
|
37
|
+
* behind a failed dependency or `already-applied` on a resumed apply.
|
|
38
|
+
* With or without it, pr-apply prints a line on stderr as each wave starts
|
|
39
|
+
* and as each component settles, so a job log shows the waves in order.
|
|
40
|
+
*
|
|
41
|
+
* `--report-url <s3 or file URL>` (#4007) copies `pr-<stage>.json`,
|
|
42
|
+
* `change-set.json` and, with `--events-json`, the events to
|
|
43
|
+
* `<url>/<pr>/<commit>/`, the events again as each wave and component
|
|
44
|
+
* settles (`../../pr-report-url.ts`).
|
|
45
|
+
*
|
|
32
46
|
* `--member <name>` (#3465) runs a workspace member's loop: the member's
|
|
33
47
|
* generated pipeline passes it from the member's directory. The gate is
|
|
34
48
|
* recorded under `pr-<n>-<member>`, and the note and the statuses carry the
|
|
@@ -42,8 +56,12 @@ import { resolveCommit, resolveMergeBase } from "../../components/changed-files.
|
|
|
42
56
|
import { deriveFanOut, fanOutRegistry } from "../../components/fan-out-support.js";
|
|
43
57
|
import { applyPrSet, approvalOf, approversWithoutReview, decidePrGate, planPrSet, prReport, readOnlyLedger, resumePrSet, } from "../../components/pr-run.js";
|
|
44
58
|
import { readFanOutAttempt, writeFanOutAttempt } from "../../components/fan-out-record.js";
|
|
59
|
+
import { componentInputDigests, progressThatCarries } from "../../components/fan-out-inputs.js";
|
|
45
60
|
import { samePlanDigest } from "../../lifecycle/plan-digest.js";
|
|
46
61
|
import { gitGateLedgerPort } from "../../op/gate.js";
|
|
62
|
+
import { emitGateStep, gateEventsOf, GATE_PHASE } from "../../run-event-stream.js";
|
|
63
|
+
import { openCliRunEvents, refusesEventsWithJson } from "../run-events.js";
|
|
64
|
+
import { openPrReportUpload, parseReportUrl, reportKey } from "../../pr-report-url.js";
|
|
47
65
|
import { describePlanChanged, PR_APPLY_GATE, prApproveCommand, prNoteMarker, prOp, prStatusDescription, prStatusContext, prStatusState, renderPrNote, } from "../../pr-loop.js";
|
|
48
66
|
import { FORGE_KINDS, forgeFromEnv, forgePrincipalOf } from "../../pr-forge.js";
|
|
49
67
|
import { GITHUB_COMMENT_LIMIT, GITLAB_NOTE_LIMIT } from "../../plan-summary.js";
|
|
@@ -51,7 +69,7 @@ import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli.js";
|
|
|
51
69
|
import { formatError, formatInfo, formatSuccess, formatWarning } from "../format.js";
|
|
52
70
|
import { findWorkspaceRoot } from "../../project-root.js";
|
|
53
71
|
import { resolveChangedUnits } from "./fan-out.js";
|
|
54
|
-
import { GATED_EXIT_CODE, recordAutoReleasesForRun } from "./run.js";
|
|
72
|
+
import { GATED_EXIT_CODE, autoReleaseRun, recordAutoReleasesForRun } from "./run.js";
|
|
55
73
|
/** Where the reports land unless `--output` says. */
|
|
56
74
|
export const PR_REPORT_DIR = ".chant/pr";
|
|
57
75
|
const fail = (message, hint) => {
|
|
@@ -179,15 +197,44 @@ async function checkMember(projectPath, names) {
|
|
|
179
197
|
return name;
|
|
180
198
|
}
|
|
181
199
|
/** Plan every member the derivation selects. */
|
|
182
|
-
function planAll(p) {
|
|
183
|
-
return planPrSet({
|
|
200
|
+
function planAll(p, onRunEvent) {
|
|
201
|
+
return planPrSet({
|
|
202
|
+
components: p.components,
|
|
203
|
+
plan: p.plan,
|
|
204
|
+
registry: p.registry,
|
|
205
|
+
env: p.env,
|
|
206
|
+
seededOutputs: p.seededOutputs,
|
|
207
|
+
...(onRunEvent ? { onRunEvent } : {}),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* How a stage's report settles its run's events (#4041): a refusal waits on
|
|
212
|
+
* a person, as a gate does, and exits the same way.
|
|
213
|
+
*/
|
|
214
|
+
function settleOf(status) {
|
|
215
|
+
switch (status) {
|
|
216
|
+
case "nothing":
|
|
217
|
+
case "planned":
|
|
218
|
+
case "applied":
|
|
219
|
+
return "ok";
|
|
220
|
+
case "refused":
|
|
221
|
+
return "gated";
|
|
222
|
+
default:
|
|
223
|
+
return "failed";
|
|
224
|
+
}
|
|
184
225
|
}
|
|
185
|
-
/** Write the report, the change set and the note
|
|
186
|
-
function writeOutputs(ctx, report, note) {
|
|
226
|
+
/** Write the report, the change set and the note, and hand the first two to `--report-url`'s upload. */
|
|
227
|
+
function writeOutputs(ctx, report, note, upload) {
|
|
187
228
|
const dir = resolve(ctx.args.output ?? PR_REPORT_DIR);
|
|
188
229
|
mkdirSync(dir, { recursive: true });
|
|
189
|
-
|
|
190
|
-
|
|
230
|
+
const files = [
|
|
231
|
+
[`pr-${report.stage}.json`, JSON.stringify(report, null, 2) + "\n"],
|
|
232
|
+
["change-set.json", JSON.stringify(report.changeSet, null, 2) + "\n"],
|
|
233
|
+
];
|
|
234
|
+
for (const [name, body] of files) {
|
|
235
|
+
writeFileSync(join(dir, name), body);
|
|
236
|
+
upload?.file(name, body);
|
|
237
|
+
}
|
|
191
238
|
writeFileSync(join(dir, "pr-note.md"), note);
|
|
192
239
|
}
|
|
193
240
|
/** Post the note and the stage's status. A forge that refuses is a warning: the stage's outcome stands. */
|
|
@@ -231,27 +278,77 @@ function printMembers(report) {
|
|
|
231
278
|
console.error(` ${m.member.padEnd(20)} ${m.status.padEnd(12)} create ${c.create} update ${c.update} replace ${c.replace} delete ${c.delete}${m.error ? ` ${m.error}` : ""}`);
|
|
232
279
|
}
|
|
233
280
|
}
|
|
234
|
-
async function finish(ctx, p, report) {
|
|
281
|
+
async function finish(ctx, p, report, upload) {
|
|
235
282
|
const note = noteFor(report, p.forge);
|
|
236
|
-
writeOutputs(ctx, report, note);
|
|
283
|
+
writeOutputs(ctx, report, note, upload);
|
|
237
284
|
await publish(p.forge, report, note);
|
|
238
285
|
if (ctx.args.json)
|
|
239
286
|
console.log(JSON.stringify(report, null, 2));
|
|
240
287
|
}
|
|
241
|
-
/**
|
|
242
|
-
|
|
288
|
+
/** Run a stage, end its stream as `failed` when the stage did not settle it, and finish its upload. */
|
|
289
|
+
async function withStageEvents(stage, ctx, run) {
|
|
290
|
+
const events = {};
|
|
291
|
+
if (ctx.args.reportUrl !== undefined) {
|
|
292
|
+
const target = parseReportUrl(ctx.args.reportUrl);
|
|
293
|
+
if ("error" in target)
|
|
294
|
+
return fail(target.error);
|
|
295
|
+
events.target = target;
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
return await run(events);
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
events.stream?.settle("failed", err instanceof Error ? err.message : String(err));
|
|
302
|
+
throw err;
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
events.stream?.settle("failed", `${stage} stopped before it finished`);
|
|
306
|
+
if (events.upload) {
|
|
307
|
+
await events.upload.close();
|
|
308
|
+
console.error(formatInfo(`report : ${events.upload.where}/`));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Open the stage's `--report-url` upload under its pull request and commit,
|
|
314
|
+
* when the flag was given. Its events are the lines `openCliRunEvents` writes.
|
|
315
|
+
*/
|
|
316
|
+
function openUpload(events, stage, pr, p) {
|
|
317
|
+
if (!events.target)
|
|
318
|
+
return undefined;
|
|
319
|
+
events.upload = openPrReportUpload({
|
|
320
|
+
target: events.target,
|
|
321
|
+
key: reportKey(pr, p.head, p.member),
|
|
322
|
+
stage,
|
|
323
|
+
warn: (message) => console.error(formatWarning({ message })),
|
|
324
|
+
});
|
|
325
|
+
return events.upload;
|
|
326
|
+
}
|
|
327
|
+
/** chant components pr-plan --base <ref> --pr <n> [--env <env>] [--gate <name>] [--forge <kind>] [--output <dir>] [--json] [--events-json] [--report-url <url>] */
|
|
328
|
+
export function runComponentsPrPlan(ctx) {
|
|
329
|
+
if (refusesEventsWithJson(ctx.args, "the stage's report"))
|
|
330
|
+
return Promise.resolve(1);
|
|
331
|
+
return withStageEvents("pr-plan", ctx, (events) => prPlan(ctx, events));
|
|
332
|
+
}
|
|
333
|
+
async function prPlan(ctx, stage) {
|
|
243
334
|
if (ctx.args.pr === undefined) {
|
|
244
335
|
return fail("pr-plan needs the pull or merge request: --pr <n>", "Its approval is recorded under op pr-<n>, so one pull request's approval never answers another's.");
|
|
245
336
|
}
|
|
246
337
|
const p = await prepare(ctx, "plan");
|
|
247
338
|
if (typeof p === "number")
|
|
248
339
|
return p;
|
|
249
|
-
const set = await planAll(p);
|
|
250
340
|
const op = prOp(ctx.args.pr, p.member);
|
|
341
|
+
const upload = openUpload(stage, "plan", ctx.args.pr, p);
|
|
342
|
+
// `--events-json` (#4041): planning, then where the approval stands.
|
|
343
|
+
const events = await openCliRunEvents(ctx.args, { kind: "component", name: `pr-plan ${op}`, cwd: resolve(".") }, upload?.line);
|
|
344
|
+
stage.stream = events;
|
|
345
|
+
events?.emit({ type: "run-start", waves: p.plan.waves });
|
|
346
|
+
const set = await planAll(p, events?.emit);
|
|
251
347
|
let approval = { status: "pending" };
|
|
252
348
|
if (p.plan.order.length > 0) {
|
|
253
349
|
try {
|
|
254
|
-
|
|
350
|
+
const check = await emitGateStep(events?.emit, { op, gate: p.gate }, () => decidePrGate(readOnlyLedger(gitGateLedgerPort()), { op, gate: p.gate, digest: set.doc.digest }));
|
|
351
|
+
approval = approvalOf(check);
|
|
255
352
|
}
|
|
256
353
|
catch (err) {
|
|
257
354
|
console.error(formatWarning({ message: `could not read the gate ledger, so the approval reads as pending: ${err instanceof Error ? err.message : String(err)}` }));
|
|
@@ -273,7 +370,9 @@ export async function runComponentsPrPlan(ctx) {
|
|
|
273
370
|
approval,
|
|
274
371
|
status,
|
|
275
372
|
});
|
|
276
|
-
await finish(ctx, p, report);
|
|
373
|
+
await finish(ctx, p, report, upload);
|
|
374
|
+
// The plan stage settles on its planning: an approval still to come is what it reports, not a stop.
|
|
375
|
+
events?.settle(settleOf(status), status === "plan-failed" ? "a member failed to plan" : undefined);
|
|
277
376
|
console.error(formatInfo(`pr-plan: ${report.members.length} member(s), ${status}`));
|
|
278
377
|
printMembers(report);
|
|
279
378
|
if (status === "planned") {
|
|
@@ -282,8 +381,13 @@ export async function runComponentsPrPlan(ctx) {
|
|
|
282
381
|
}
|
|
283
382
|
return status === "plan-failed" ? 1 : 0;
|
|
284
383
|
}
|
|
285
|
-
/** chant components pr-apply --base <ref> [--pr <n>] [--env <env>] [--gate <name>] [--forge <kind>] [--require-review] [--output <dir>] [--json] */
|
|
286
|
-
export
|
|
384
|
+
/** chant components pr-apply --base <ref> [--pr <n>] [--env <env>] [--gate <name>] [--forge <kind>] [--require-review] [--output <dir>] [--json] [--events-json] [--report-url <url>] */
|
|
385
|
+
export function runComponentsPrApply(ctx) {
|
|
386
|
+
if (refusesEventsWithJson(ctx.args, "the stage's report"))
|
|
387
|
+
return Promise.resolve(1);
|
|
388
|
+
return withStageEvents("pr-apply", ctx, (events) => prApply(ctx, events));
|
|
389
|
+
}
|
|
390
|
+
async function prApply(ctx, stage) {
|
|
287
391
|
const { args } = ctx;
|
|
288
392
|
if (args.requireReview && !args.forge)
|
|
289
393
|
return fail("--require-review reads the pull request's reviews, so it needs --forge <kind>");
|
|
@@ -300,6 +404,13 @@ export async function runComponentsPrApply(ctx) {
|
|
|
300
404
|
}
|
|
301
405
|
}
|
|
302
406
|
const op = pr === null ? "pr-unknown" : prOp(pr, p.member);
|
|
407
|
+
// The run id the release records carry, chosen before the run so that
|
|
408
|
+
// `--events-json` (#4041, #4007) names the run by it too.
|
|
409
|
+
const release = autoReleaseRun(`${op}-${Date.now()}`);
|
|
410
|
+
const upload = openUpload(stage, "apply", pr, p);
|
|
411
|
+
const events = await openCliRunEvents(args, { kind: "component", name: `pr-apply ${op}`, runId: release.runId, cwd: resolve(".") }, upload?.line);
|
|
412
|
+
stage.stream = events;
|
|
413
|
+
events?.emit({ type: "run-start", waves: p.plan.waves });
|
|
303
414
|
// `--resume` (#3464): an earlier attempt at this change on this commit
|
|
304
415
|
// applied part of an approved set. When the members left are covered by
|
|
305
416
|
// it and its approval still stands, finish it under that approval.
|
|
@@ -313,11 +424,26 @@ export async function runComponentsPrApply(ctx) {
|
|
|
313
424
|
return fail(`--resume: could not read "${args.resume}": ${err instanceof Error ? err.message : String(err)}`);
|
|
314
425
|
}
|
|
315
426
|
}
|
|
316
|
-
|
|
317
|
-
const
|
|
427
|
+
// What each component would apply now (#4081): progress carries only where it is unchanged.
|
|
428
|
+
const inputsNow = resumePath ? componentInputDigests(p.components, { projectRoot: resolve("."), env: p.env }) : {};
|
|
429
|
+
const resumed = pr !== null && p.plan.order.length > 0 && attempt ? await tryResume(p, attempt, args.resume, op, inputsNow) : undefined;
|
|
430
|
+
// The components an earlier attempt applied settle first (#4007), each in
|
|
431
|
+
// the wave the derivation gave it, which is the run-start's.
|
|
432
|
+
const log = applyLog();
|
|
433
|
+
if (resumed) {
|
|
434
|
+
const waveOf = new Map(p.plan.waves.flatMap((wave, i) => wave.map((name) => [name, i + 1])));
|
|
435
|
+
for (const component of p.plan.order.filter((name) => resumed.completed.includes(name))) {
|
|
436
|
+
const body = { type: "component-settle", wave: waveOf.get(component), component, status: "already-applied" };
|
|
437
|
+
events?.emit(body);
|
|
438
|
+
log(body);
|
|
439
|
+
}
|
|
440
|
+
emitResumedGate(events, op, p.gate, resumed.check);
|
|
441
|
+
}
|
|
442
|
+
const set = resumed?.set ?? (await planAll(p, events?.emit));
|
|
318
443
|
const base = { stage: "apply", pr, env: p.env, ...(p.member ? { member: p.member } : {}), base: p.base, head: p.head, op, gate: p.gate, plan: p.plan, signal: p.signal, set };
|
|
319
|
-
const stop = async (report, code) => {
|
|
320
|
-
|
|
444
|
+
const stop = async (report, code, settle) => {
|
|
445
|
+
events?.settle(settle ?? settleOf(report.status), report.status === "plan-failed" || report.status === "failed" ? report.message ?? `pr-apply ${report.status}` : undefined);
|
|
446
|
+
await finish(ctx, p, report, upload);
|
|
321
447
|
console.error((code === 0 ? formatInfo : (m) => formatWarning({ message: m }))(`pr-apply: ${report.status}${report.refusal ? ` (${report.refusal})` : ""}`));
|
|
322
448
|
if (report.message)
|
|
323
449
|
console.error(report.message);
|
|
@@ -344,16 +470,25 @@ export async function runComponentsPrApply(ctx) {
|
|
|
344
470
|
message: "A member failed to plan, so there is no plan to compare with the approved one. Nothing was applied.",
|
|
345
471
|
}), 1);
|
|
346
472
|
}
|
|
473
|
+
// #4022: keep the change set the gate binds on chant/lifecycle under its
|
|
474
|
+
// digest before deciding the gate, so the plan an approval bound, or the
|
|
475
|
+
// one a pending fact waits on, can be read once this job is gone.
|
|
476
|
+
await storeChangeSetForGate(ctx, p, set.doc);
|
|
347
477
|
let approval;
|
|
348
478
|
if (resumed) {
|
|
349
479
|
approval = resumed.approval;
|
|
350
480
|
}
|
|
351
481
|
else {
|
|
352
|
-
const check = await decidePrGate(gitGateLedgerPort(), {
|
|
482
|
+
const check = await emitGateStep(events?.emit, { op, gate: p.gate }, () => decidePrGate(gitGateLedgerPort(), {
|
|
353
483
|
op,
|
|
354
484
|
gate: p.gate,
|
|
355
485
|
digest: set.doc.digest,
|
|
356
486
|
description: `pull request #${pr}: ${p.plan.order.join(", ")}`,
|
|
487
|
+
}), (unapproved) => {
|
|
488
|
+
const a = approvalOf(unapproved);
|
|
489
|
+
return a.status === "changed"
|
|
490
|
+
? describePlanChanged({ op, gate: p.gate, digest: set.doc.digest, approval: a })
|
|
491
|
+
: `No approval stands for this plan. Approve it: ${prApproveCommand({ op, gate: p.gate, digest: set.doc.digest })}`;
|
|
357
492
|
});
|
|
358
493
|
approval = approvalOf(check);
|
|
359
494
|
if (!check.satisfied) {
|
|
@@ -378,21 +513,18 @@ export async function runComponentsPrApply(ctx) {
|
|
|
378
513
|
}
|
|
379
514
|
const strangers = approversWithoutReview(approval.approvedBy ?? [], reviewers);
|
|
380
515
|
if (strangers.length > 0) {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
approval
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
message: `The plan is approved by ${strangers.join(", ")}, who ${strangers.length === 1 ? "has" : "have"} no approving review on #${pr}` +
|
|
387
|
-
` (approving reviews: ${reviewers.join(", ") || "none"}). Nothing was applied. ` +
|
|
388
|
-
`An approval counts when it names the reviewer the way the forge does: ${p.forge.principalOf("<login>")}.`,
|
|
389
|
-
}), GATED_EXIT_CODE);
|
|
516
|
+
const message = `The plan is approved by ${strangers.join(", ")}, who ${strangers.length === 1 ? "has" : "have"} no approving review on #${pr}` +
|
|
517
|
+
` (approving reviews: ${reviewers.join(", ") || "none"}). Nothing was applied. ` +
|
|
518
|
+
`An approval counts when it names the reviewer the way the forge does: ${p.forge.principalOf("<login>")}.`;
|
|
519
|
+
emitReviewStop(events, message);
|
|
520
|
+
return stop(prReport({ ...base, approval, status: "refused", refusal: "not-a-reviewer", message }), GATED_EXIT_CODE);
|
|
390
521
|
}
|
|
391
522
|
}
|
|
392
523
|
// The record is written before the first component runs and again as each
|
|
393
524
|
// one settles, so a run killed partway still knows what applied.
|
|
394
525
|
const prior = resumed ? { completed: resumed.completed, outputs: resumed.outputs } : { completed: [], outputs: {} };
|
|
395
526
|
const completedSoFar = new Set(prior.completed);
|
|
527
|
+
const inputsSoFar = Object.fromEntries(prior.completed.filter((name) => inputsNow[name] !== undefined).map((name) => [name, inputsNow[name]]));
|
|
396
528
|
const failedSoFar = [];
|
|
397
529
|
const outputsSoFar = { ...prior.outputs };
|
|
398
530
|
const record = {
|
|
@@ -413,6 +545,7 @@ export async function runComponentsPrApply(ctx) {
|
|
|
413
545
|
completed: [...completedSoFar].sort(),
|
|
414
546
|
failed: [...failedSoFar].sort(),
|
|
415
547
|
outputs: outputsSoFar,
|
|
548
|
+
inputs: Object.fromEntries(Object.entries(inputsSoFar).sort(([a], [b]) => a.localeCompare(b))),
|
|
416
549
|
prApply: record,
|
|
417
550
|
});
|
|
418
551
|
};
|
|
@@ -424,11 +557,19 @@ export async function runComponentsPrApply(ctx) {
|
|
|
424
557
|
env: p.env,
|
|
425
558
|
set,
|
|
426
559
|
...(resumed ? { resumed: prior } : {}),
|
|
560
|
+
// The apply is this run's waves, so the fan-out's own run framing is
|
|
561
|
+
// dropped. The log's lines go to stderr with or without --events-json.
|
|
562
|
+
onRunEvent: (body) => {
|
|
563
|
+
events?.nested(body);
|
|
564
|
+
log(body);
|
|
565
|
+
},
|
|
427
566
|
...(resumePath
|
|
428
567
|
? {
|
|
429
568
|
onComponentSettled: (settled, outputs) => {
|
|
430
569
|
if (settled.status === "ok") {
|
|
431
570
|
completedSoFar.add(settled.component);
|
|
571
|
+
if (inputsNow[settled.component] !== undefined)
|
|
572
|
+
inputsSoFar[settled.component] = inputsNow[settled.component];
|
|
432
573
|
if (outputs)
|
|
433
574
|
outputsSoFar[settled.component] = outputs;
|
|
434
575
|
}
|
|
@@ -441,7 +582,7 @@ export async function runComponentsPrApply(ctx) {
|
|
|
441
582
|
: {}),
|
|
442
583
|
});
|
|
443
584
|
recordAttempt();
|
|
444
|
-
await recordAutoReleasesForRun(applied.run.results, p.env,
|
|
585
|
+
await recordAutoReleasesForRun(applied.run.results, p.env, release.runId, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord), release.runOrigin);
|
|
445
586
|
const report = prReport({
|
|
446
587
|
...base,
|
|
447
588
|
approval,
|
|
@@ -449,19 +590,102 @@ export async function runComponentsPrApply(ctx) {
|
|
|
449
590
|
members: applied.members,
|
|
450
591
|
...(resumed ? { resumed: resumed.completed } : {}),
|
|
451
592
|
});
|
|
452
|
-
|
|
593
|
+
// A component that stopped at a gate of its own leaves the apply waiting on a person.
|
|
594
|
+
const code = await stop(report, applied.status === "applied" ? 0 : 1, applied.run.status === "gated" ? "gated" : undefined);
|
|
453
595
|
if (applied.status === "applied")
|
|
454
596
|
console.error(formatSuccess(`applied the plan ${report.digest} approved by ${(approval.approvedBy ?? []).join(", ")}`));
|
|
455
597
|
return code;
|
|
456
598
|
}
|
|
599
|
+
/** What a component's settle says in the job log. */
|
|
600
|
+
function settleWords(body) {
|
|
601
|
+
switch (body.status) {
|
|
602
|
+
case "ok":
|
|
603
|
+
return "applied";
|
|
604
|
+
case "failed":
|
|
605
|
+
return "failed";
|
|
606
|
+
case "gated":
|
|
607
|
+
return "stopped at its own gate";
|
|
608
|
+
case "waiting":
|
|
609
|
+
return "waiting on a decision";
|
|
610
|
+
case "blocked":
|
|
611
|
+
return `blocked by ${body.blockedBy ?? "a dependency"}, not run`;
|
|
612
|
+
case "already-applied":
|
|
613
|
+
return "already applied in an earlier attempt";
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* pr-apply's job log (#4007): a line on stderr as each wave starts and as
|
|
618
|
+
* each component settles, so the log shows the waves in order while they run.
|
|
619
|
+
*/
|
|
620
|
+
function applyLog() {
|
|
621
|
+
let waves = 0;
|
|
622
|
+
return (body) => {
|
|
623
|
+
if (body.type === "run-start")
|
|
624
|
+
waves = body.waves?.length ?? 0;
|
|
625
|
+
else if (body.type === "wave-start")
|
|
626
|
+
console.error(formatInfo(`wave ${body.wave}${waves ? `/${waves}` : ""}: ${body.components.join(", ")}`));
|
|
627
|
+
else if (body.type === "component-settle")
|
|
628
|
+
console.error(formatInfo(` ${body.component}: ${settleWords(body)}`));
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
/** A resumed apply's gate (#3464), decided against the approved digest, as the run's `gate` phase. */
|
|
632
|
+
function emitResumedGate(events, op, gate, check) {
|
|
633
|
+
if (!events)
|
|
634
|
+
return;
|
|
635
|
+
const where = { component: null, phase: GATE_PHASE, step: `gate:${gate}` };
|
|
636
|
+
events.emit({ type: "phase-start", component: null, phase: GATE_PHASE });
|
|
637
|
+
events.emit({ type: "step-start", ...where });
|
|
638
|
+
for (const body of gateEventsOf(check, { ...where, op, gate }, { durationMs: null }))
|
|
639
|
+
events.emit(body);
|
|
640
|
+
events.emit({ type: "phase-settle", component: null, phase: GATE_PHASE, status: check.satisfied ? "ok" : "gated" });
|
|
641
|
+
}
|
|
642
|
+
/** An approval by someone with no approving review (#3183) stops the apply: a `review` phase that settles `gated`. */
|
|
643
|
+
function emitReviewStop(events, message) {
|
|
644
|
+
if (!events)
|
|
645
|
+
return;
|
|
646
|
+
events.emit({ type: "phase-start", component: null, phase: "review" });
|
|
647
|
+
events.emit({ type: "step-start", component: null, phase: "review", step: "review" });
|
|
648
|
+
events.emit({ type: "step-settle", component: null, phase: "review", step: "review", status: "gated", durationMs: null, message });
|
|
649
|
+
events.emit({ type: "phase-settle", component: null, phase: "review", status: "gated" });
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* Store `doc` under its digest with its entries mapped onto the member's
|
|
653
|
+
* graph (`storeGateChangeSet`), and push. A failure is a warning: the gate
|
|
654
|
+
* decides the same either way.
|
|
655
|
+
*/
|
|
656
|
+
async function storeChangeSetForGate(ctx, p, doc) {
|
|
657
|
+
const { storeGateChangeSet, gateGraphReader } = await import("../../lifecycle/gate-change-set.js");
|
|
658
|
+
const { pushLifecycleReport } = await import("../../lifecycle/git.js");
|
|
659
|
+
const graphArgs = [
|
|
660
|
+
...(ctx.args.param ?? []).flatMap((kv) => ["--param", kv]),
|
|
661
|
+
...(ctx.args.paramsFile ? ["--params-file", ctx.args.paramsFile] : []),
|
|
662
|
+
];
|
|
663
|
+
try {
|
|
664
|
+
const stored = await storeGateChangeSet({ doc, cwd: resolve("."), at: p.head, readGraph: gateGraphReader(graphArgs) });
|
|
665
|
+
if (stored.warning)
|
|
666
|
+
console.error(formatWarning({ message: stored.warning }));
|
|
667
|
+
// The push's own outcome is said by the gate's pending fact, or by the
|
|
668
|
+
// release records the apply writes, which push the same branch.
|
|
669
|
+
if (stored.written)
|
|
670
|
+
await pushLifecycleReport();
|
|
671
|
+
}
|
|
672
|
+
catch (err) {
|
|
673
|
+
console.error(formatWarning({ message: `could not store the change set ${doc.digest}: ${err instanceof Error ? err.message : String(err)}` }));
|
|
674
|
+
}
|
|
675
|
+
}
|
|
457
676
|
/**
|
|
458
677
|
* Whether `attempt` finishes here (#3464). It carries only when it was made
|
|
459
678
|
* by an apply of this pull request's gate, on this commit, for this
|
|
460
679
|
* derivation; when its approval still stands; and when every member left is
|
|
461
680
|
* covered by the approved set. Otherwise it says why on stderr and the apply
|
|
462
681
|
* runs as it would with no record.
|
|
682
|
+
*
|
|
683
|
+
* Of the components it applied, only those whose input digest is the same
|
|
684
|
+
* now carry (#4081), as in `components fan-out --resume`. One that changed
|
|
685
|
+
* runs again, under the same approval when the approved set covers its new
|
|
686
|
+
* plan. A record without input digests carries nothing.
|
|
463
687
|
*/
|
|
464
|
-
async function tryResume(p, attempt, file, op) {
|
|
688
|
+
async function tryResume(p, attempt, file, op, inputsNow) {
|
|
465
689
|
const skip = (why) => {
|
|
466
690
|
console.error(formatWarning({ message: `--resume: "${file}" does not carry: ${why}`, hint: "Every member is planned again, and the plan needs an approval of its own." }));
|
|
467
691
|
return undefined;
|
|
@@ -477,6 +701,14 @@ async function tryResume(p, attempt, file, op) {
|
|
|
477
701
|
return skip("the change selects other components than it did");
|
|
478
702
|
if (attempt.completed.length === 0)
|
|
479
703
|
return undefined;
|
|
704
|
+
const split = progressThatCarries(attempt, inputsNow);
|
|
705
|
+
if (split.unrecorded)
|
|
706
|
+
return skip("it does not record what each component applied, since it was written before chant recorded component inputs");
|
|
707
|
+
for (const name of split.changed)
|
|
708
|
+
console.error(formatInfo(`${name}: changed since the earlier attempt, so it runs again`));
|
|
709
|
+
if (split.carried.length === 0)
|
|
710
|
+
return undefined;
|
|
711
|
+
const completed = split.carried;
|
|
480
712
|
let check;
|
|
481
713
|
try {
|
|
482
714
|
check = await decidePrGate(readOnlyLedger(gitGateLedgerPort()), { op, gate: p.gate, digest: record.digest });
|
|
@@ -486,7 +718,7 @@ async function tryResume(p, attempt, file, op) {
|
|
|
486
718
|
}
|
|
487
719
|
if (!check.satisfied)
|
|
488
720
|
return skip(`no approval stands for the plan it applied (${record.digest}) any more`);
|
|
489
|
-
const outputs = Object.fromEntries(Object.entries(attempt.outputs).filter(([name]) =>
|
|
721
|
+
const outputs = Object.fromEntries(Object.entries(attempt.outputs).filter(([name]) => completed.includes(name)));
|
|
490
722
|
const resumed = await resumePrSet({
|
|
491
723
|
components: p.components,
|
|
492
724
|
plan: p.plan,
|
|
@@ -494,10 +726,10 @@ async function tryResume(p, attempt, file, op) {
|
|
|
494
726
|
env: p.env,
|
|
495
727
|
seededOutputs: p.seededOutputs,
|
|
496
728
|
record,
|
|
497
|
-
completed
|
|
729
|
+
completed,
|
|
498
730
|
});
|
|
499
731
|
if (!resumed.ok)
|
|
500
732
|
return skip(`what is left is not what was approved. ${resumed.reasons.join("; ")}`);
|
|
501
|
-
console.error(formatInfo(`resume : ${
|
|
502
|
-
return { plan: resumed.plan, set: resumed.set, approval: approvalOf(check), completed
|
|
733
|
+
console.error(formatInfo(`resume : ${completed.join(", ")} applied in an earlier attempt; applying ${resumed.plan.order.join(", ") || "nothing more"} under the approval of ${record.digest}`));
|
|
734
|
+
return { plan: resumed.plan, set: resumed.set, check, approval: approvalOf(check), completed, outputs };
|
|
503
735
|
}
|
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
* failed or stopped at a gate, so the ledger never misses a deploy that
|
|
13
13
|
* happened. Unlike an auto-recorded release, the record is what these
|
|
14
14
|
* commands are for, so a failed write is an error rather than a warning.
|
|
15
|
+
* A run that applied partly, or failed, also appends a deploy outcome
|
|
16
|
+
* (#4035, ../../lifecycle/deploy-outcome.ts) naming what it did to each
|
|
17
|
+
* component, so `workspace status` reads the environment as mixed.
|
|
18
|
+
*
|
|
19
|
+
* `rollback --release` (#4035) is a promote of an earlier release into the
|
|
20
|
+
* environment: every component of the release at the digest the environment
|
|
21
|
+
* ran from it, through the release gate `promote --release` binds (#4045).
|
|
15
22
|
*/
|
|
16
23
|
import type { CommandContext } from "../registry.js";
|
|
17
24
|
export declare function runComponentsPromote(ctx: CommandContext): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/promote.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA+CH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAukBlD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA2E/E;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsChF;AAsCD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BhF"}
|