@intentius/chant 0.124.28 → 0.124.30
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/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 +8 -1
- package/dist/change-set-graph.d.ts.map +1 -1
- package/dist/change-set-graph.js +4 -2
- package/dist/change-set.d.ts +10 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +4 -3
- 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.map +1 -1
- package/dist/cli/commands/build.js +6 -3
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +45 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +18 -4
- package/dist/cli/handlers/fan-out.d.ts +9 -0
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +67 -8
- 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 +11 -3
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +134 -26
- 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 +210 -33
- package/dist/cli/handlers/release.d.ts +62 -5
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +414 -28
- package/dist/cli/handlers/run.d.ts +11 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +67 -6
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +91 -10
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +73 -2
- package/dist/cli/registry.d.ts +32 -4
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/run-events.d.ts +3 -2
- package/dist/cli/run-events.d.ts.map +1 -1
- package/dist/cli/run-events.js +5 -3
- package/dist/components/auto-release.d.ts +2 -0
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/auto-release.js +1 -0
- package/dist/components/capability.d.ts +9 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/driver.d.ts +8 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +35 -0
- 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.map +1 -1
- package/dist/components/fan-out-run.js +50 -0
- 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 +49 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +38 -4
- package/dist/components/pr-run.d.ts +20 -2
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +26 -13
- package/dist/components/promote.d.ts +23 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +60 -2
- package/dist/components/release-compile.d.ts +9 -0
- package/dist/components/release-compile.d.ts.map +1 -1
- package/dist/components/release-compile.js +9 -3
- package/dist/components/release-gate.d.ts +11 -1
- package/dist/components/release-gate.d.ts.map +1 -1
- package/dist/components/release-gate.js +10 -4
- package/dist/components/wave-plan.d.ts +16 -0
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +36 -2
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -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/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 +2 -1
- package/dist/lifecycle/change-set-store.d.ts.map +1 -1
- package/dist/lifecycle/change-set-store.js +2 -1
- 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 +10 -1
- package/dist/lifecycle/gate-change-set.d.ts.map +1 -1
- package/dist/lifecycle/gate-change-set.js +35 -3
- package/dist/lifecycle/gate-ledger.d.ts +2 -3
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- 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 +48 -1
- package/dist/lifecycle/release-cut.d.ts.map +1 -1
- package/dist/lifecycle/release-cut.js +116 -23
- 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 +8 -3
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +2 -0
- 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 +12 -2
- package/dist/lifecycle/release-store.d.ts.map +1 -1
- package/dist/lifecycle/release-store.js +4 -2
- 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 +1 -1
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +9 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +1 -0
- package/dist/op/activities/shell.d.ts +6 -0
- package/dist/op/activities/shell.d.ts.map +1 -1
- package/dist/op/activities/shell.js +1 -1
- package/dist/op/local-executor.d.ts +23 -1
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +9 -3
- package/dist/op/runtime.d.ts +27 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/runtime.js +20 -0
- package/dist/plan-summary.d.ts.map +1 -1
- package/dist/plan-summary.js +8 -2
- package/dist/pr-forge.d.ts +23 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +44 -0
- package/dist/pr-loop.d.ts +17 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +30 -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 +29 -2
- package/dist/run-event-store.d.ts.map +1 -1
- package/dist/run-event-store.js +50 -3
- package/dist/run-event-stream.d.ts +4 -3
- package/dist/run-event-stream.d.ts.map +1 -1
- package/dist/run-event-stream.js +7 -3
- package/dist/run-event.d.ts +34 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/run-event.js +4 -0
- package/dist/wave-runtime.mjs +260 -229
- 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/change-set.schema.json +5 -1
- 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-forge.d.ts +2 -0
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green.d.ts +10 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +14 -5
- package/dist/workspace/ci-run.d.ts +222 -0
- package/dist/workspace/ci-run.d.ts.map +1 -0
- package/dist/workspace/ci-run.js +464 -0
- package/dist/workspace/ci-serve.d.ts +214 -0
- package/dist/workspace/ci-serve.d.ts.map +1 -0
- package/dist/workspace/ci-serve.js +412 -0
- package/dist/workspace/declaration.d.ts +16 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +26 -0
- package/dist/workspace/declaration.schema.json +64 -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/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 +30 -6
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +141 -21
- package/dist/workspace/intent.schema.json +702 -6
- 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/pr-report.schema.json +5 -0
- package/dist/workspace/reason-codes.d.ts +2 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +3 -0
- 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 +9 -0
- package/dist/workspace/releases.d.ts.map +1 -1
- package/dist/workspace/releases.js +9 -0
- package/dist/workspace/releases.schema.json +123 -1
- package/dist/workspace/run-event.schema.json +24 -6
- package/dist/workspace/status-gates.d.ts +8 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status-stewards.d.ts +2 -0
- package/dist/workspace/status-stewards.d.ts.map +1 -1
- package/dist/workspace/status-stewards.js +1 -0
- package/dist/workspace/status.d.ts +78 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +170 -3
- package/dist/workspace/status.schema.json +210 -2
- package/dist/workspace/wip.d.ts.map +1 -1
- package/dist/workspace/wip.js +11 -3
- package/package.json +1 -1
- package/src/build-params.test.ts +46 -0
- package/src/build-params.ts +55 -1
- package/src/change-set-graph.ts +10 -2
- package/src/change-set.ts +14 -3
- package/src/cli/build-params-cli.ts +22 -9
- package/src/cli/commands/build.ts +6 -3
- package/src/cli/handlers/approve-release.test.ts +5 -1
- package/src/cli/handlers/approve-revoked.test.ts +155 -0
- package/src/cli/handlers/approve.ts +47 -0
- package/src/cli/handlers/build.test.ts +30 -0
- package/src/cli/handlers/build.ts +20 -4
- package/src/cli/handlers/fan-out.test.ts +262 -1
- package/src/cli/handlers/fan-out.ts +72 -8
- 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/pr.test.ts +148 -1
- package/src/cli/handlers/pr.ts +144 -28
- package/src/cli/handlers/promote.test.ts +280 -2
- package/src/cli/handlers/promote.ts +210 -34
- package/src/cli/handlers/release-implicit.e2e.test.ts +12 -4
- 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 +146 -32
- package/src/cli/handlers/release.ts +415 -28
- package/src/cli/handlers/run-auto-release.test.ts +9 -0
- package/src/cli/handlers/run-release.test.ts +55 -0
- package/src/cli/handlers/run.ts +69 -5
- package/src/cli/main.test.ts +1 -0
- package/src/cli/main.ts +91 -10
- package/src/cli/parse-args.ts +54 -2
- package/src/cli/registry.ts +32 -4
- package/src/cli/run-events.ts +5 -2
- package/src/components/auto-release.test.ts +9 -0
- package/src/components/auto-release.ts +3 -0
- package/src/components/capability.ts +9 -0
- package/src/components/driver.test.ts +24 -0
- package/src/components/driver.ts +36 -0
- 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 +48 -0
- package/src/components/fan-out.ts +4 -0
- package/src/components/pr-pipeline.ts +67 -4
- package/src/components/pr-run.test.ts +127 -0
- package/src/components/pr-run.ts +32 -12
- package/src/components/promote.ts +68 -2
- package/src/components/release-compile.ts +17 -3
- package/src/components/release-gate.ts +18 -4
- package/src/components/wave-plan.ts +45 -2
- package/src/config.ts +8 -0
- package/src/flag-params.test.ts +144 -0
- package/src/flag-params.ts +134 -0
- package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
- package/src/lifecycle/change-set-store.ts +2 -1
- package/src/lifecycle/delivery-metrics.ts +263 -0
- package/src/lifecycle/deploy-outcome.ts +147 -0
- package/src/lifecycle/gate-change-set.ts +37 -6
- package/src/lifecycle/gate-ledger.ts +2 -2
- 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.test.ts +74 -2
- package/src/lifecycle/release-cut.ts +158 -22
- 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.ts +9 -3
- 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 +15 -4
- 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.ts +7 -1
- package/src/op/activities/activity-contracts.ts +1 -0
- package/src/op/activities/shell.ts +7 -1
- package/src/op/local-executor.ts +27 -4
- package/src/op/runtime.ts +42 -0
- package/src/plan-summary.test.ts +20 -0
- package/src/plan-summary.ts +8 -1
- package/src/pr-forge.test.ts +25 -0
- package/src/pr-forge.ts +62 -0
- package/src/pr-loop.test.ts +13 -1
- package/src/pr-loop.ts +41 -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.ts +63 -3
- package/src/run-event-stream.ts +8 -4
- package/src/run-event.ts +38 -1
- 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/change-set.schema.json +5 -1
- 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-forge.ts +2 -0
- package/src/workspace/ci-green.ts +20 -5
- package/src/workspace/ci-run.test.ts +416 -0
- package/src/workspace/ci-run.ts +571 -0
- package/src/workspace/ci-serve.test.ts +268 -0
- package/src/workspace/ci-serve.ts +521 -0
- package/src/workspace/declaration.schema.json +64 -0
- package/src/workspace/declaration.test.ts +28 -0
- package/src/workspace/declaration.ts +38 -0
- 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/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 +148 -25
- 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/pr-report.schema.json +5 -0
- package/src/workspace/read-contract.e2e.test.ts +2 -1
- package/src/workspace/reason-codes.test.ts +5 -0
- package/src/workspace/reason-codes.ts +3 -0
- 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 +123 -1
- package/src/workspace/releases.ts +11 -0
- package/src/workspace/run-event.schema.json +24 -6
- package/src/workspace/status-contract.test.ts +29 -0
- package/src/workspace/status-gates.ts +8 -0
- package/src/workspace/status-mixed.test.ts +152 -0
- package/src/workspace/status-revoked.test.ts +153 -0
- package/src/workspace/status-stewards.ts +3 -0
- package/src/workspace/status.schema.json +210 -2
- package/src/workspace/status.ts +254 -3
- package/src/workspace/wip.ts +11 -2
|
@@ -32,7 +32,10 @@
|
|
|
32
32
|
*/
|
|
33
33
|
import type { CommandContext } from "../cli/registry.js";
|
|
34
34
|
import { type ReleaseRecord } from "../lifecycle/release-ledger.js";
|
|
35
|
+
import { type RevokedRelease } from "../lifecycle/release-revocation.js";
|
|
35
36
|
import { type ReleasePlan } from "../lifecycle/plan-ledger.js";
|
|
37
|
+
import { type DeployOutcome } from "../lifecycle/deploy-outcome.js";
|
|
38
|
+
import { type MixedEnvironment } from "../lifecycle/mixed-environment.js";
|
|
36
39
|
import { type WorkLeaseState } from "../lifecycle/work-lease.js";
|
|
37
40
|
import { type CheckoutHead } from "./records-checkout.js";
|
|
38
41
|
import { type ReplicationState } from "./wip.js";
|
|
@@ -41,6 +44,9 @@ import { type BoxIntent } from "./box-intent.js";
|
|
|
41
44
|
import { type MemberFields } from "./kinds.js";
|
|
42
45
|
import { type FactoryView, type ListingView, type Plantable } from "./box-factory.js";
|
|
43
46
|
import { type ErrorLocation } from "./declaration.js";
|
|
47
|
+
import type { FlagDecision, FlagValue } from "./flags.js";
|
|
48
|
+
import type { OverlapReport } from "./overlap.js";
|
|
49
|
+
import type { WorkLink } from "./work.js";
|
|
44
50
|
import { type PromotionStep } from "./promotion-order.js";
|
|
45
51
|
import { type ReleaseSignatureCheck } from "./identity-gate-rule.js";
|
|
46
52
|
import { type GateLedgerReader, type StatusGate, type StatusGateLedger } from "./status-gates.js";
|
|
@@ -88,6 +94,10 @@ export interface StatusRelease {
|
|
|
88
94
|
gate: string;
|
|
89
95
|
resolvedAt: string;
|
|
90
96
|
} | null;
|
|
97
|
+
/** The release this deploy was made from (#4043): the `releaseDigest` of `_releases/<releaseDigest>.json`. Null for a deploy that named no release and for one recorded before chant 0.124.29. */
|
|
98
|
+
releaseDigest: string | null;
|
|
99
|
+
/** The label that release was cut with (#4043), or null when it has none, when no release is named, or when the cut can't be read. Chant 0.124.29 and newer write it. */
|
|
100
|
+
releaseLabel: string | null;
|
|
91
101
|
/** Read flags, such as `legacy-digest` (#2514). */
|
|
92
102
|
flags: string[];
|
|
93
103
|
/**
|
|
@@ -99,6 +109,24 @@ export interface StatusRelease {
|
|
|
99
109
|
* hasn't fetched yet.
|
|
100
110
|
*/
|
|
101
111
|
plan: ReleasePlan | null;
|
|
112
|
+
/**
|
|
113
|
+
* Set when the deploy names a release (`releaseDigest` on its record) that
|
|
114
|
+
* was cut from a revoked commit (#4033, ws-105): the revoked tag on that
|
|
115
|
+
* commit, the release and its label, and the line that rolls the component
|
|
116
|
+
* back. Absent otherwise, and from chant older than 0.124.29.
|
|
117
|
+
*/
|
|
118
|
+
revoked?: StatusRevokedRelease;
|
|
119
|
+
}
|
|
120
|
+
/** A release an environment runs that was cut from a revoked commit (#4033). */
|
|
121
|
+
export interface StatusRevokedRelease extends RevokedRelease {
|
|
122
|
+
/**
|
|
123
|
+
* The command that rolls the environment back, run in the member's
|
|
124
|
+
* directory: `chant components rollback <env> --release <label|digest>`
|
|
125
|
+
* naming the newest release the environment ran before this one that is
|
|
126
|
+
* still kept and not revoked (#4035), or `chant components rollback <env>
|
|
127
|
+
* --component <component>` when there is none.
|
|
128
|
+
*/
|
|
129
|
+
rollback: string;
|
|
102
130
|
}
|
|
103
131
|
export interface StatusLedger {
|
|
104
132
|
/** `members` for `_members/<member>/<env>/releases.jsonl`, `flat` for `<env>/releases.jsonl`. */
|
|
@@ -117,6 +145,14 @@ export interface StatusEnvironment {
|
|
|
117
145
|
code: StatusReasonCode;
|
|
118
146
|
message: string;
|
|
119
147
|
} | null;
|
|
148
|
+
/**
|
|
149
|
+
* Set when the environment runs a mix (#4035): a promote, rollback or
|
|
150
|
+
* redeploy left a component failed or gated and nothing has been recorded
|
|
151
|
+
* for it since, or its components' latest records name more than one
|
|
152
|
+
* release. Each component with what it runs, and the lines that settle it.
|
|
153
|
+
* Absent otherwise, and from chant older than 0.124.29.
|
|
154
|
+
*/
|
|
155
|
+
mixed?: MixedEnvironment;
|
|
120
156
|
}
|
|
121
157
|
export type CompareState = "same" | "differs" | "only-env" | "only-compare";
|
|
122
158
|
export interface StatusCompare {
|
|
@@ -175,6 +211,34 @@ export interface StatusMember {
|
|
|
175
211
|
* cuts could not be read. Added in contract 1 by chant 0.124.28.
|
|
176
212
|
*/
|
|
177
213
|
releaseCuts: StatusReleaseCut[] | null;
|
|
214
|
+
/**
|
|
215
|
+
* The member's feature flags (#4024): each record of a declared flag kind
|
|
216
|
+
* that names this member, with its value per environment and the work item
|
|
217
|
+
* it hides. Sorted by id. `[]` when none names it, null when the flag
|
|
218
|
+
* records could not be read. Called `featureFlags` because a release
|
|
219
|
+
* record's `flags` already means something else. Added in contract 1 by
|
|
220
|
+
* chant 0.124.29.
|
|
221
|
+
*/
|
|
222
|
+
featureFlags: StatusFeatureFlag[] | null;
|
|
223
|
+
}
|
|
224
|
+
/** One feature flag of a member (#4024), as `status --json` lists it. */
|
|
225
|
+
export interface StatusFeatureFlag {
|
|
226
|
+
/** The flag's name, its record's id. */
|
|
227
|
+
id: string;
|
|
228
|
+
/** The build parameter of the member the flag sets. */
|
|
229
|
+
param: string;
|
|
230
|
+
owner: string;
|
|
231
|
+
/** The value per environment, as the record writes it. An environment it leaves out builds with the parameter's default. */
|
|
232
|
+
values: Record<string, FlagValue>;
|
|
233
|
+
/** The work item the flag hides, with its state (null when no record has it), or null when the record names none. */
|
|
234
|
+
work: WorkLink | null;
|
|
235
|
+
/** Each decision the work item implements, with its state and whether it is confirmed. */
|
|
236
|
+
implements: FlagDecision[];
|
|
237
|
+
/** True when every decision the work item implements is confirmed: the flag is due for removal (check WSP118). */
|
|
238
|
+
stale: boolean;
|
|
239
|
+
/** The kind file and the record file, from the workspace root. */
|
|
240
|
+
kind: string;
|
|
241
|
+
path: string;
|
|
178
242
|
}
|
|
179
243
|
/** One cut of a member's release (#4031), as `status --json` lists it. */
|
|
180
244
|
export interface StatusReleaseCut {
|
|
@@ -312,6 +376,14 @@ export type StatusDocument = {
|
|
|
312
376
|
acceptance: StatusAcceptance[];
|
|
313
377
|
/** How far each ref the box's replicate policy names is from its remote (#3172), read locally; null when no box declares one. */
|
|
314
378
|
replication: ReplicationState | null;
|
|
379
|
+
/**
|
|
380
|
+
* Overlap between in-flight work items (#4025): pairs of items whose
|
|
381
|
+
* linked commits touch the same files, or that both reach one entry of
|
|
382
|
+
* a change set a pending or approved gate binds. A report, never a
|
|
383
|
+
* lock. Null when no work kind is declared or the work records or
|
|
384
|
+
* history can't be read. Added in contract 1 by chant 0.124.29.
|
|
385
|
+
*/
|
|
386
|
+
overlap: OverlapReport | null;
|
|
315
387
|
summary: {
|
|
316
388
|
members: number;
|
|
317
389
|
released: number;
|
|
@@ -339,6 +411,8 @@ export interface StatusQuery {
|
|
|
339
411
|
compareTo?: string;
|
|
340
412
|
/** Reads one ledger; the lifecycle reader unless a test swaps it. */
|
|
341
413
|
readLedger?: LedgerReader;
|
|
414
|
+
/** Reads the deploy outcomes beside one ledger (#4035), given the ledger's path; the lifecycle reader unless a test swaps it. */
|
|
415
|
+
readOutcomes?: OutcomeReader;
|
|
342
416
|
/** Reads one member's gate ledger directory; git unless a test swaps it. */
|
|
343
417
|
readGates?: GateLedgerReader;
|
|
344
418
|
/** The instant a gate's expiry is measured against; now by default. */
|
|
@@ -348,6 +422,10 @@ export interface StatusQuery {
|
|
|
348
422
|
/** Reads one member's promotion order from its directory; its chant.config.ts unless a test swaps it. */
|
|
349
423
|
readPromotionOrder?: (dir: string) => Promise<PromotionStep[] | null>;
|
|
350
424
|
}
|
|
425
|
+
/** Reads the deploy outcomes (#4035) in the directory of the ledger at `path`. */
|
|
426
|
+
type OutcomeReader = (path: string, cwd: string) => Promise<DeployOutcome[]>;
|
|
427
|
+
/** The per-component rollback line, for a component an environment runs from a revoked release when no earlier release can be named (#4033). */
|
|
428
|
+
export declare function rollbackLine(env: string, component: string): string;
|
|
351
429
|
export declare function compareEnvironments(a: StatusEnvironment, b: StatusEnvironment): StatusCompare;
|
|
352
430
|
/** Find the workspace, read every member's ledger and build the document `--json` prints. */
|
|
353
431
|
export declare function workspaceStatus(query: StatusQuery): Promise<StatusDocument>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/workspace/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAqD,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACtI,OAAO,EAA2G,KAAK,aAAa,EAAe,MAAM,eAAe,CAAC;AAEzK,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EAAiD,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEjH,OAAO,EAAsC,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnI,OAAO,EAAwB,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIzH,4DAA4D;AAC5D,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,8EAA8E,CAAC;AAEnH,wCAAwC;AACxC,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C,gFAAgF;AAChF,eAAO,MAAM,WAAW,aAAa,CAAC;AAItC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,oDAKU,CAAC;AAC3C,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,8FAA8F;AAC9F,eAAO,MAAM,wBAAwB,iFAAoB,CAAC;AAE1D,uGAAuG;AACvG,eAAO,MAAM,2BAA2B,kFAAuB,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,0NAYW,CAAC;AAC3C,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,wHAAwH;AACxH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wKAAwK;IACxK,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnE,mDAAmD;IACnD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;;;OAOG;IACH,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/workspace/status.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace/status.js
CHANGED
|
@@ -37,7 +37,10 @@ import { formatError } from "../cli/format.js";
|
|
|
37
37
|
import { GATES_DIR } from "../lifecycle/gate-ledger.js";
|
|
38
38
|
import { readPathSha } from "../lifecycle/git.js";
|
|
39
39
|
import { latestPerComponent, readReleaseLedger } from "../lifecycle/release-ledger.js";
|
|
40
|
+
import { describeRevocation, revokedCommitsAt, revokedReleaseLookup } from "../lifecycle/release-revocation.js";
|
|
40
41
|
import { readReleasePlan } from "../lifecycle/plan-ledger.js";
|
|
42
|
+
import { readDeployOutcomes } from "../lifecycle/deploy-outcome.js";
|
|
43
|
+
import { mixedEnvironment, releaseRollbackLine, rollbackTarget } from "../lifecycle/mixed-environment.js";
|
|
41
44
|
import { listWorkLeases } from "../lifecycle/work-lease.js";
|
|
42
45
|
import { readCheckoutHead, worktreeChanges } from "./records-checkout.js";
|
|
43
46
|
import { policyView, replicationState } from "./wip.js";
|
|
@@ -187,7 +190,12 @@ async function shipView(member, cwd, read) {
|
|
|
187
190
|
return view;
|
|
188
191
|
}
|
|
189
192
|
const defaultReader = (path, cwd) => readReleaseLedger(path.slice(0, -"/releases.jsonl".length), { cwd });
|
|
190
|
-
|
|
193
|
+
const defaultOutcomeReader = (path, cwd) => readDeployOutcomes(path.slice(0, -"/releases.jsonl".length), { cwd }).catch(() => []);
|
|
194
|
+
/** The per-component rollback line, for a component an environment runs from a revoked release when no earlier release can be named (#4033). */
|
|
195
|
+
export function rollbackLine(env, component) {
|
|
196
|
+
return `chant components rollback ${env} --component ${component}`;
|
|
197
|
+
}
|
|
198
|
+
async function readEnvironment(member, env, cwd, read, revokedOf = async () => null, readOutcomes = defaultOutcomeReader) {
|
|
191
199
|
const ledger = await ledgerFor(member, env, cwd);
|
|
192
200
|
let records;
|
|
193
201
|
let malformed;
|
|
@@ -210,6 +218,40 @@ async function readEnvironment(member, env, cwd, read) {
|
|
|
210
218
|
// member (see plan-ledger.ts's readReleasePlan doc).
|
|
211
219
|
const planPrefix = ledger.layout === "members" ? `${MEMBERS_DIR}/${member.name}/` : "";
|
|
212
220
|
const latest = [...latestPerComponent(records).values()].sort((a, b) => (a.component < b.component ? -1 : a.component > b.component ? 1 : 0));
|
|
221
|
+
// #4043: a release item names the label of the release it was deployed from.
|
|
222
|
+
const memberDir = resolve(cwd, member.dir);
|
|
223
|
+
let labels = new Map();
|
|
224
|
+
let labelsRead = false;
|
|
225
|
+
const readLabels = async () => {
|
|
226
|
+
if (labelsRead)
|
|
227
|
+
return labels;
|
|
228
|
+
labelsRead = true;
|
|
229
|
+
try {
|
|
230
|
+
const { readCuts, labelsByDigest } = await import("../lifecycle/release-store.js");
|
|
231
|
+
labels = labelsByDigest((await readCuts({ cwd: memberDir })).cuts);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// The label is a convenience; the digest is the join key.
|
|
235
|
+
}
|
|
236
|
+
return labels;
|
|
237
|
+
};
|
|
238
|
+
if (latest.some((r) => r.releaseDigest !== undefined))
|
|
239
|
+
await readLabels();
|
|
240
|
+
// #4035: whether a release a rollback could go back to is kept and not revoked.
|
|
241
|
+
const checks = new Map();
|
|
242
|
+
const check = (digest) => {
|
|
243
|
+
let found = checks.get(digest);
|
|
244
|
+
if (!found) {
|
|
245
|
+
found = (async () => {
|
|
246
|
+
const { readRelease } = await import("../lifecycle/release-store.js");
|
|
247
|
+
const kept = (await readRelease(digest, { cwd: memberDir }).catch(() => null)) !== null;
|
|
248
|
+
return { kept, revoked: kept && (await revokedOf(digest)) !== null };
|
|
249
|
+
})();
|
|
250
|
+
checks.set(digest, found);
|
|
251
|
+
}
|
|
252
|
+
return found;
|
|
253
|
+
};
|
|
254
|
+
const back = { records, check, label: async (digest) => (await readLabels()).get(digest) };
|
|
213
255
|
const releases = await Promise.all(latest.map(async (r) => ({
|
|
214
256
|
component: r.component,
|
|
215
257
|
digest: r.digest,
|
|
@@ -220,9 +262,13 @@ async function readEnvironment(member, env, cwd, read) {
|
|
|
220
262
|
actor: r.actor,
|
|
221
263
|
approver: r.approver ?? null,
|
|
222
264
|
admission: r.admission ? { op: r.admission.op, gate: r.admission.gate, resolvedAt: r.admission.resolvedAt } : null,
|
|
265
|
+
releaseDigest: r.releaseDigest ?? null,
|
|
266
|
+
releaseLabel: (r.releaseDigest !== undefined ? labels.get(r.releaseDigest) : undefined) ?? null,
|
|
223
267
|
flags: [...(r.flags ?? [])],
|
|
224
268
|
plan: await readReleasePlan(r.digest, { cwd, prefix: planPrefix }),
|
|
269
|
+
...(await revokedItem(r, env, revokedOf, back)),
|
|
225
270
|
})));
|
|
271
|
+
const mixed = await mixedEnvironment({ env, records, outcomes: await readOutcomes(ledger.path, cwd), label: back.label, check });
|
|
226
272
|
return {
|
|
227
273
|
env,
|
|
228
274
|
ledger: { ...ledger, shared: false },
|
|
@@ -230,8 +276,41 @@ async function readEnvironment(member, env, cwd, read) {
|
|
|
230
276
|
reason: malformed > 0
|
|
231
277
|
? { code: "ledger-malformed", message: `${ledger.path}: ${malformed} line${malformed === 1 ? " is" : "s are"} not a release record and ${malformed === 1 ? "was" : "were"} skipped` }
|
|
232
278
|
: null,
|
|
279
|
+
...(mixed ? { mixed } : {}),
|
|
233
280
|
};
|
|
234
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* `{ revoked }` when the record names a release cut from a revoked commit
|
|
284
|
+
* (#4033), else nothing. Its rollback line names the newest release the
|
|
285
|
+
* environment ran before this one that is kept and not revoked (#4035).
|
|
286
|
+
*/
|
|
287
|
+
async function revokedItem(r, env, revokedOf, back) {
|
|
288
|
+
if (r.releaseDigest === undefined)
|
|
289
|
+
return {};
|
|
290
|
+
const revoked = await revokedOf(r.releaseDigest);
|
|
291
|
+
if (!revoked)
|
|
292
|
+
return {};
|
|
293
|
+
const target = await rollbackTarget({ records: back.records, exclude: new Set([r.releaseDigest]), before: r.timestamp, check: back.check });
|
|
294
|
+
const rollback = target ? releaseRollbackLine(env, target, await back.label(target)) : rollbackLine(env, r.component);
|
|
295
|
+
return { revoked: { ...revoked, rollback } };
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* A release gate whose release was cut from a revoked commit is superseded
|
|
299
|
+
* (#4033): `chant approve` refuses it and the promote refuses the release, so
|
|
300
|
+
* neither an approval nor a pending fact will pass it. An expired gate stays
|
|
301
|
+
* expired. The gate carries the revocation.
|
|
302
|
+
*/
|
|
303
|
+
async function supersedeRevokedGates(gates, revokedOf) {
|
|
304
|
+
return Promise.all(gates.map(async (g) => {
|
|
305
|
+
if (g.releaseDigest === undefined)
|
|
306
|
+
return g;
|
|
307
|
+
const revoked = await revokedOf(g.releaseDigest);
|
|
308
|
+
if (!revoked)
|
|
309
|
+
return g;
|
|
310
|
+
const { releaseDigest: _d, label: _l, ...revocation } = revoked;
|
|
311
|
+
return { ...g, state: g.state === "expired" ? g.state : "superseded", revoked: revocation };
|
|
312
|
+
}));
|
|
313
|
+
}
|
|
235
314
|
/** The digest two environments are compared on: the input side when there is one. */
|
|
236
315
|
const compareKey = (r) => r.inputDigest ?? r.digest;
|
|
237
316
|
export function compareEnvironments(a, b) {
|
|
@@ -276,11 +355,18 @@ export async function workspaceStatus(query) {
|
|
|
276
355
|
const ruleSource = scopeSource(found.dir);
|
|
277
356
|
const rules = (gate) => gateAdmissionFrom(ruleSource, gate);
|
|
278
357
|
const releaseRule = releaseRuleFrom(ruleSource).rule;
|
|
358
|
+
// #4033 (ws-105): revoked commits, read from local tags once and only when a release is met.
|
|
359
|
+
// Tags that can't be judged read as none revoked; workspace check reports the declaration.
|
|
360
|
+
let revokedCommits;
|
|
361
|
+
const revoked = () => (revokedCommits ?? (revokedCommits = revokedCommitsAt(top, ruleSource.declaration?.ci?.green ?? null).catch(() => new Map())));
|
|
362
|
+
// #4024: the flag records, read once for every member. Unreadable records list as null.
|
|
363
|
+
const flags = await readStatusFlags(declaration, found.dir);
|
|
279
364
|
const members = [];
|
|
280
365
|
for (const m of declaration.members) {
|
|
366
|
+
const revokedOf = revokedReleaseLookup(resolve(found.dir, m.dir), revoked);
|
|
281
367
|
const environments = [];
|
|
282
368
|
for (const env of envs)
|
|
283
|
-
environments.push(await readEnvironment(m, env, found.dir, read));
|
|
369
|
+
environments.push(await readEnvironment(m, env, found.dir, read, revokedOf, query.readOutcomes));
|
|
284
370
|
const own = await hasMemberLedger(m, found.dir);
|
|
285
371
|
const gates = await readMemberGates(own ? `${MEMBERS_DIR}/${m.name}/${GATES_DIR}` : GATES_DIR, own ? "members" : "flat", commit, envs, found.dir, now, query.readGates, rules);
|
|
286
372
|
const stewards = await (query.readStewards ?? readMemberStewards)(resolve(found.dir, m.dir), query.env, now, m.kind, m.box);
|
|
@@ -297,7 +383,7 @@ export async function workspaceStatus(query) {
|
|
|
297
383
|
compare: query.compareTo === undefined ? null : compareEnvironments(environments[0], environments[environments.length - 1]),
|
|
298
384
|
readable: environments.every((e) => e.reason === null),
|
|
299
385
|
gateLedger: gates.ledger,
|
|
300
|
-
gates: gates.gates,
|
|
386
|
+
gates: await supersedeRevokedGates(gates.gates, revokedOf),
|
|
301
387
|
box: m.box === null
|
|
302
388
|
? null
|
|
303
389
|
: {
|
|
@@ -325,6 +411,7 @@ export async function workspaceStatus(query) {
|
|
|
325
411
|
stewardReasons: stewards.reasons,
|
|
326
412
|
promotionOrder: await (query.readPromotionOrder ?? readMemberPromotionOrder)(resolve(found.dir, m.dir)),
|
|
327
413
|
releaseCuts: await readReleaseCuts(resolve(found.dir, m.dir), releaseRule),
|
|
414
|
+
featureFlags: flags === null ? null : flags.filter((f) => f.member === m.name).map(({ member: _member, ...f }) => f),
|
|
328
415
|
...x(m.pointer),
|
|
329
416
|
});
|
|
330
417
|
}
|
|
@@ -342,6 +429,17 @@ export async function workspaceStatus(query) {
|
|
|
342
429
|
m.gateLedger.shared = m.gateLedger.layout === "flat" && flatGates > 1;
|
|
343
430
|
const leases = await readWorkspaceLeases(declaration.members, found.dir, new Date(now));
|
|
344
431
|
const acceptance = await readWorkspaceAcceptance(declaration, found.dir);
|
|
432
|
+
// #4025: the change sets still waiting to apply, the ones a pending or approved gate binds.
|
|
433
|
+
const pendingChangeSets = [];
|
|
434
|
+
for (const m of members) {
|
|
435
|
+
const own = m.gateLedger.layout === "members";
|
|
436
|
+
for (const g of m.gates) {
|
|
437
|
+
if (g.changeSet === undefined || (g.state !== "pending" && g.state !== "approved"))
|
|
438
|
+
continue;
|
|
439
|
+
pendingChangeSets.push({ digest: g.changeSet, cwd: resolve(found.dir, m.dir), ledgerMember: own ? m.name : null, gitSha: g.gitSha ?? null });
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
const overlap = await readStatusOverlap(declaration, found.dir, top, pendingChangeSets);
|
|
345
443
|
return {
|
|
346
444
|
...head,
|
|
347
445
|
env: query.env,
|
|
@@ -354,6 +452,7 @@ export async function workspaceStatus(query) {
|
|
|
354
452
|
leases,
|
|
355
453
|
acceptance,
|
|
356
454
|
replication: replicationOf(declaration, top),
|
|
455
|
+
overlap,
|
|
357
456
|
summary: {
|
|
358
457
|
members: members.length,
|
|
359
458
|
released: members.filter((m) => m.environments[0].releases.length > 0).length,
|
|
@@ -419,6 +518,33 @@ async function readWorkspaceLeases(members, cwd, now) {
|
|
|
419
518
|
}
|
|
420
519
|
return out;
|
|
421
520
|
}
|
|
521
|
+
/** Every flag of the declared flag kinds (#4024), read in the working tree, sorted by id; null when they can't be read. */
|
|
522
|
+
async function readStatusFlags(declaration, root) {
|
|
523
|
+
if (declaredRecordKinds(declaration).length === 0)
|
|
524
|
+
return [];
|
|
525
|
+
try {
|
|
526
|
+
const { readWorkspaceFlags } = await import("./flags-read.js");
|
|
527
|
+
const { flags } = await readWorkspaceFlags(root);
|
|
528
|
+
return flags
|
|
529
|
+
.map((f) => ({ id: f.id, member: f.member, param: f.param, owner: f.owner, values: f.values, work: f.work, implements: f.implements, stale: f.stale, kind: f.kind, path: f.path }))
|
|
530
|
+
.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
return null;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
/** The overlap report (#4025); null when no work kind is declared or it can't be read. */
|
|
537
|
+
async function readStatusOverlap(declaration, root, top, changeSets) {
|
|
538
|
+
if (declaredRecordKinds(declaration).length === 0)
|
|
539
|
+
return null;
|
|
540
|
+
try {
|
|
541
|
+
const { readOverlap } = await import("./overlap.js");
|
|
542
|
+
return await readOverlap({ declaration, root, top, changeSets });
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
return null;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
422
548
|
/** The acceptance counts of every declared work kind with criteria (#2772), read in the working tree. */
|
|
423
549
|
async function readWorkspaceAcceptance(declaration, root) {
|
|
424
550
|
if (declaredRecordKinds(declaration).length === 0)
|
|
@@ -504,6 +630,25 @@ export function formatStatus(doc) {
|
|
|
504
630
|
memberNotes.push(` ${e.reason.code}: ${e.reason.message}`);
|
|
505
631
|
else if (e.ledger.shared && e.releases.length > 0)
|
|
506
632
|
memberNotes.push(` ${e.env} is read from the shared flat ledger ${e.ledger.path}`);
|
|
633
|
+
// #4033: a component running a release cut from a revoked commit, and the way back.
|
|
634
|
+
for (const r of e.releases) {
|
|
635
|
+
if (!r.revoked)
|
|
636
|
+
continue;
|
|
637
|
+
const name = r.revoked.label ?? r.revoked.releaseDigest;
|
|
638
|
+
memberNotes.push(` ${e.env}: ${r.component} runs release ${name}, revoked by ${r.revoked.tag} (${describeRevocation(r.revoked)}); roll back: ${r.revoked.rollback}`);
|
|
639
|
+
}
|
|
640
|
+
// #4035: an environment running a mix, what each component runs, and the lines that settle it.
|
|
641
|
+
if (e.mixed) {
|
|
642
|
+
const what = e.mixed.components.map((c) => {
|
|
643
|
+
const runs = c.releaseDigest ? `release ${c.releaseLabel ?? c.releaseDigest.slice(0, 24)}` : c.digest ? "no release" : "nothing recorded";
|
|
644
|
+
return c.state === "settled" ? `${c.component} runs ${runs}` : `${c.component} ${c.state} (${c.attempt.verb} ${c.attempt.runId}), recorded ${runs}`;
|
|
645
|
+
});
|
|
646
|
+
memberNotes.push(` ${e.env} is mixed: ${what.join("; ")}`);
|
|
647
|
+
for (const line of e.mixed.redeploy)
|
|
648
|
+
memberNotes.push(` redeploy: ${line}`);
|
|
649
|
+
if (e.mixed.rollback)
|
|
650
|
+
memberNotes.push(` roll back: ${e.mixed.rollback}`);
|
|
651
|
+
}
|
|
507
652
|
}
|
|
508
653
|
if (memberNotes.length > 0)
|
|
509
654
|
notes.set(rows.length - 1, memberNotes);
|
|
@@ -538,6 +683,28 @@ export function formatStatus(doc) {
|
|
|
538
683
|
}
|
|
539
684
|
lines.push(...table(rows));
|
|
540
685
|
}
|
|
686
|
+
const flagged = doc.members.filter((m) => (m.featureFlags ?? []).length > 0);
|
|
687
|
+
if (flagged.length > 0) {
|
|
688
|
+
lines.push("");
|
|
689
|
+
const rows = [["FLAG", "PARAM", doc.env.toUpperCase(), "WORK ITEM", ""]];
|
|
690
|
+
for (const m of flagged) {
|
|
691
|
+
for (const f of m.featureFlags) {
|
|
692
|
+
const value = f.values[doc.env];
|
|
693
|
+
rows.push([`${m.name}/${f.id}`, f.param, value === undefined ? "default" : JSON.stringify(value), f.work ? `${f.work.id} (${f.work.state ?? "unknown"})` : "-", f.stale ? "due for removal" : ""]);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
lines.push(...table(rows));
|
|
697
|
+
}
|
|
698
|
+
// #4025: in-flight work items that changed the same thing.
|
|
699
|
+
if (doc.overlap && doc.overlap.pairs.length > 0) {
|
|
700
|
+
lines.push("");
|
|
701
|
+
const rows = [["OVERLAP", "FILES", "ADDRESSES"]];
|
|
702
|
+
for (const p of doc.overlap.pairs) {
|
|
703
|
+
const list = (xs) => (xs.length === 0 ? "-" : xs.length <= 2 ? xs.join(", ") : `${xs.slice(0, 2).join(", ")} and ${xs.length - 2} more`);
|
|
704
|
+
rows.push([`${p.items[0]} and ${p.items[1]}`, list(p.files), list([...new Set(p.addresses.map((x) => x.node ?? x.address))])]);
|
|
705
|
+
}
|
|
706
|
+
lines.push(...table(rows));
|
|
707
|
+
}
|
|
541
708
|
const boxes = doc.members.filter((m) => m.box?.isolation);
|
|
542
709
|
if (boxes.length > 0) {
|
|
543
710
|
lines.push("");
|