@intentius/chant 0.124.31 → 0.124.33
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/bin/chant +7 -2
- package/dist/ci-jobs.d.ts +4 -0
- package/dist/ci-jobs.d.ts.map +1 -1
- package/dist/ci-jobs.js +9 -2
- package/dist/cli/commands/check-lexicon-plugin.d.ts +7 -4
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +10 -7
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.js +18 -12
- package/dist/cli/commands/import.d.ts +10 -0
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/project.js +4 -3
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/onboard.js +8 -4
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +2 -1
- package/dist/cli/dependencies.d.ts +18 -0
- package/dist/cli/dependencies.d.ts.map +1 -0
- package/dist/cli/dependencies.js +120 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +38 -4
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +12 -4
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +16 -6
- package/dist/cli/handlers/lifecycle-health.d.ts +16 -0
- package/dist/cli/handlers/lifecycle-health.d.ts.map +1 -0
- package/dist/cli/handlers/lifecycle-health.js +150 -0
- package/dist/cli/handlers/lifecycle.d.ts +26 -0
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.js +1 -1
- package/dist/cli/handlers/lint.d.ts.map +1 -1
- package/dist/cli/handlers/lint.js +6 -0
- package/dist/cli/handlers/operator.d.ts +2 -2
- package/dist/cli/handlers/operator.js +3 -3
- package/dist/cli/handlers/pr.d.ts +16 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +610 -32
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +19 -2
- package/dist/cli/handlers/release.d.ts +16 -1
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +83 -11
- package/dist/cli/handlers/run.d.ts +13 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +38 -15
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +121 -33
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +37 -0
- package/dist/cli/registry.d.ts +29 -6
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +6 -2
- package/dist/codegen/generate-post-synth-barrel.js +2 -2
- package/dist/codegen/lexicon-regen.d.ts +4 -0
- package/dist/codegen/lexicon-regen.d.ts.map +1 -1
- package/dist/codegen/lexicon-regen.js +1 -1
- package/dist/codegen/pinned-upgrade.js +2 -2
- package/dist/components/capability.d.ts +44 -3
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/capability.js +21 -0
- package/dist/components/changed-files.d.ts +7 -1
- package/dist/components/changed-files.d.ts.map +1 -1
- package/dist/components/changed-files.js +9 -1
- package/dist/components/deploy-inputs.d.ts +91 -0
- package/dist/components/deploy-inputs.d.ts.map +1 -0
- package/dist/components/deploy-inputs.js +184 -0
- package/dist/components/driver.d.ts +38 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +56 -6
- package/dist/components/fan-out-record.d.ts +6 -1
- package/dist/components/fan-out-record.d.ts.map +1 -1
- package/dist/components/fan-out-record.js +24 -0
- package/dist/components/fan-out-run.d.ts +20 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +21 -1
- package/dist/components/gate-plan.d.ts +8 -0
- package/dist/components/gate-plan.d.ts.map +1 -1
- package/dist/components/gate-plan.js +6 -0
- package/dist/components/pr-pipeline.d.ts +98 -12
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +146 -23
- package/dist/components/pr-run.d.ts +128 -30
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +290 -70
- package/dist/components/release-compile.d.ts +37 -2
- package/dist/components/release-compile.d.ts.map +1 -1
- package/dist/components/release-compile.js +64 -8
- package/dist/components/release-promote.d.ts +17 -3
- package/dist/components/release-promote.d.ts.map +1 -1
- package/dist/components/release-promote.js +79 -18
- package/dist/components/verbs/bom-writer.d.ts +1 -1
- package/dist/components/verbs/bom-writer.d.ts.map +1 -1
- package/dist/components/verbs/lockfile-sbom-generator.d.ts +20 -0
- package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -1
- package/dist/components/verbs/lockfile-sbom-generator.js +41 -4
- package/dist/components/wave-plan.d.ts +15 -2
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +44 -5
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +16 -6
- package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
- package/dist/discovery/sandbox/bundle.js +6 -0
- package/dist/discovery/specifier-resolve.d.ts.map +1 -1
- package/dist/discovery/specifier-resolve.js +8 -2
- package/dist/fold/fold.d.ts.map +1 -1
- package/dist/fold/fold.js +68 -1
- package/dist/fold/subset.d.ts +37 -0
- package/dist/fold/subset.d.ts.map +1 -1
- package/dist/fold/subset.js +88 -0
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-detail.js +32 -7
- package/dist/health.d.ts +110 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +105 -0
- package/dist/health.schema.json +191 -0
- package/dist/lexicon-module.d.ts +10 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +53 -8
- package/dist/lexicon-plugin-helpers.d.ts.map +1 -1
- package/dist/lexicon-plugin-helpers.js +6 -4
- package/dist/lexicon.d.ts +29 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/affected.d.ts.map +1 -1
- package/dist/lifecycle/affected.js +7 -1
- package/dist/lifecycle/merge-record.d.ts +104 -0
- package/dist/lifecycle/merge-record.d.ts.map +1 -0
- package/dist/lifecycle/merge-record.js +102 -0
- package/dist/lifecycle/publish-attachments.d.ts +8 -5
- package/dist/lifecycle/publish-attachments.d.ts.map +1 -1
- package/dist/lifecycle/publish-attachments.js +27 -13
- package/dist/lifecycle/publish-npm.d.ts +3 -2
- package/dist/lifecycle/publish-npm.d.ts.map +1 -1
- package/dist/lifecycle/publish-npm.js +4 -3
- package/dist/lifecycle/release-at.d.ts +40 -0
- package/dist/lifecycle/release-at.d.ts.map +1 -0
- package/dist/lifecycle/release-at.js +83 -0
- package/dist/lifecycle/release-cut.d.ts.map +1 -1
- package/dist/lifecycle/release-cut.js +23 -12
- package/dist/lifecycle/release-ledger.d.ts +21 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +24 -0
- package/dist/lifecycle/release-publish.d.ts +28 -12
- package/dist/lifecycle/release-publish.d.ts.map +1 -1
- package/dist/lifecycle/release-publish.js +29 -17
- package/dist/lifecycle/release-store.d.ts +25 -2
- package/dist/lifecycle/release-store.d.ts.map +1 -1
- package/dist/lifecycle/release-store.js +40 -13
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +1 -0
- package/dist/lifecycle/work-dir.d.ts +45 -0
- package/dist/lifecycle/work-dir.d.ts.map +1 -0
- package/dist/lifecycle/work-dir.js +78 -0
- package/dist/lint/discover.d.ts +17 -9
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +62 -54
- package/dist/lint/rules/op/index.d.ts +2 -1
- package/dist/lint/rules/op/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.js +4 -2
- package/dist/lint/rules/op/ops018-shell-image-digest.d.ts +10 -0
- package/dist/lint/rules/op/ops018-shell-image-digest.d.ts.map +1 -0
- package/dist/lint/rules/op/ops018-shell-image-digest.js +38 -0
- package/dist/module-source.d.ts +57 -0
- package/dist/module-source.d.ts.map +1 -0
- package/dist/module-source.js +104 -0
- package/dist/op/activities/activity-contracts.d.ts +5 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +3 -0
- package/dist/op/activities/factory.js +1 -1
- package/dist/op/activities/shell.d.ts +38 -0
- package/dist/op/activities/shell.d.ts.map +1 -1
- package/dist/op/activities/shell.js +89 -3
- package/dist/op/builders.d.ts +7 -0
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +7 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +13 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +3 -0
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +20 -5
- package/dist/op/operator.d.ts +2 -2
- package/dist/op/operator.js +2 -2
- package/dist/op/runtime.d.ts +2 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/steward.d.ts +6 -4
- package/dist/op/steward.d.ts.map +1 -1
- package/dist/op/steward.js +5 -3
- package/dist/op/work-lease-run.d.ts +20 -7
- package/dist/op/work-lease-run.d.ts.map +1 -1
- package/dist/op/work-lease-run.js +56 -12
- package/dist/pr-forge.d.ts +10 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +39 -0
- package/dist/pr-loop.d.ts +155 -7
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +137 -11
- package/dist/pr-report-url.d.ts +4 -4
- package/dist/pr-report-url.d.ts.map +1 -1
- package/dist/pr-report-url.js +5 -5
- package/dist/runner-start.d.ts +179 -0
- package/dist/runner-start.d.ts.map +1 -0
- package/dist/runner-start.js +277 -0
- package/dist/ts-loader.d.ts +38 -4
- package/dist/ts-loader.d.ts.map +1 -1
- package/dist/ts-loader.js +190 -16
- package/dist/wave-runtime.mjs +238 -231
- package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts +34 -0
- package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts.map +1 -0
- package/dist/workspace/chant-migrations/fountain-retired-kinds.js +176 -0
- package/dist/workspace/chant-migrations.d.ts.map +1 -1
- package/dist/workspace/chant-migrations.js +2 -0
- package/dist/workspace/check.schema.json +70 -2
- package/dist/workspace/checks/boxes.d.ts +6 -6
- package/dist/workspace/checks/boxes.js +9 -9
- package/dist/workspace/checks/security.d.ts +35 -0
- package/dist/workspace/checks/security.d.ts.map +1 -0
- package/dist/workspace/checks/security.js +305 -0
- package/dist/workspace/checks.d.ts +2 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +5 -0
- package/dist/workspace/ci-builds.d.ts +163 -0
- package/dist/workspace/ci-builds.d.ts.map +1 -0
- package/dist/workspace/ci-builds.js +315 -0
- package/dist/workspace/ci-green-cli.d.ts +2 -1
- package/dist/workspace/ci-green-cli.d.ts.map +1 -1
- package/dist/workspace/ci-green-cli.js +25 -5
- package/dist/workspace/ci-green-forge.d.ts +18 -4
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green-forge.js +12 -0
- package/dist/workspace/ci-green-workflow.d.ts +55 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +128 -1
- package/dist/workspace/ci-green.d.ts +117 -16
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +358 -43
- package/dist/workspace/ci-last-green.schema.json +49 -0
- package/dist/workspace/ci-list.schema.json +47 -7
- package/dist/workspace/ci-report-url.d.ts +18 -0
- package/dist/workspace/ci-report-url.d.ts.map +1 -0
- package/dist/workspace/ci-report-url.js +33 -0
- package/dist/workspace/ci-run-index.d.ts +13 -1
- package/dist/workspace/ci-run-index.d.ts.map +1 -1
- package/dist/workspace/ci-run-index.js +6 -4
- package/dist/workspace/ci-run-index.schema.json +6 -4
- package/dist/workspace/ci-run.d.ts +85 -6
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +262 -64
- package/dist/workspace/ci-runner-key.d.ts +16 -3
- package/dist/workspace/ci-runner-key.d.ts.map +1 -1
- package/dist/workspace/ci-runner-key.js +30 -10
- package/dist/workspace/ci-runner-start.d.ts +77 -0
- package/dist/workspace/ci-runner-start.d.ts.map +1 -0
- package/dist/workspace/ci-runner-start.js +185 -0
- package/dist/workspace/ci-serve.d.ts +130 -11
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +323 -40
- package/dist/workspace/declaration.d.ts +25 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +14 -2
- package/dist/workspace/declaration.schema.json +30 -2
- package/dist/workspace/export.d.ts +1 -1
- package/dist/workspace/export.d.ts.map +1 -1
- package/dist/workspace/export.js +7 -3
- package/dist/workspace/ls.d.ts +8 -1
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +2 -1
- package/dist/workspace/ls.schema.json +9 -2
- package/dist/workspace/member-pipeline.d.ts +1 -0
- package/dist/workspace/member-pipeline.d.ts.map +1 -1
- package/dist/workspace/member-pipeline.js +2 -0
- package/dist/workspace/merge-record.schema.json +49 -0
- package/dist/workspace/pin-integrity.d.ts.map +1 -1
- package/dist/workspace/pin-integrity.js +3 -2
- package/dist/workspace/pr-report.schema.json +75 -8
- package/dist/workspace/reason-codes.d.ts +18 -1
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +20 -2
- package/dist/workspace/release-candidates.d.ts +129 -0
- package/dist/workspace/release-candidates.d.ts.map +1 -0
- package/dist/workspace/release-candidates.js +233 -0
- package/dist/workspace/release-candidates.schema.json +353 -0
- package/dist/workspace/run-event.schema.json +3 -1
- package/dist/workspace/security.d.ts +40 -0
- package/dist/workspace/security.d.ts.map +1 -0
- package/dist/workspace/security.js +99 -0
- package/dist/workspace/status.schema.json +3 -1
- package/dist/workspace/write-scope.d.ts +9 -0
- package/dist/workspace/write-scope.d.ts.map +1 -1
- package/dist/workspace/write-scope.js +11 -1
- package/package.json +8 -1
- package/src/__fixtures__/pr-loop/pr-apply-wave-waiting.note.golden.md +48 -0
- package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +1 -1
- package/src/ci-jobs.ts +11 -2
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +3 -3
- package/src/cli/commands/audit.test.ts +2 -2
- package/src/cli/commands/check-lexicon-plugin.test.ts +9 -0
- package/src/cli/commands/check-lexicon-plugin.ts +11 -8
- package/src/cli/commands/check-lexicon.test.ts +1 -1
- package/src/cli/commands/check-lexicon.ts +16 -11
- package/src/cli/commands/import.ts +40 -0
- package/src/cli/commands/init-lexicon/templates/project.ts +4 -3
- package/src/cli/commands/init-lexicon.test.ts +8 -5
- package/src/cli/commands/onboard.test.ts +45 -0
- package/src/cli/commands/onboard.ts +8 -4
- package/src/cli/commands/update.test.ts +6 -0
- package/src/cli/commands/update.ts +4 -1
- package/src/cli/compiled-cli.e2e.test.ts +76 -11
- package/src/cli/dependencies.e2e.test.ts +101 -0
- package/src/cli/dependencies.test.ts +93 -0
- package/src/cli/dependencies.ts +122 -0
- package/src/cli/handlers/build.test.ts +105 -0
- package/src/cli/handlers/build.ts +35 -4
- package/src/cli/handlers/fan-out.test.ts +73 -0
- package/src/cli/handlers/fan-out.ts +11 -4
- package/src/cli/handlers/graph.test.ts +76 -0
- package/src/cli/handlers/graph.ts +19 -12
- package/src/cli/handlers/lifecycle-health.test.ts +123 -0
- package/src/cli/handlers/lifecycle-health.ts +157 -0
- package/src/cli/handlers/lifecycle.ts +1 -1
- package/src/cli/handlers/lint.test.ts +42 -0
- package/src/cli/handlers/lint.ts +6 -0
- package/src/cli/handlers/operator.ts +3 -3
- package/src/cli/handlers/pr-deploy-inputs.test.ts +209 -0
- package/src/cli/handlers/pr-record.test.ts +201 -0
- package/src/cli/handlers/pr-waves.test.ts +449 -0
- package/src/cli/handlers/pr.test.ts +156 -0
- package/src/cli/handlers/pr.ts +648 -33
- package/src/cli/handlers/promote.test.ts +43 -1
- package/src/cli/handlers/promote.ts +19 -3
- package/src/cli/handlers/release-cut-at.e2e.test.ts +115 -0
- package/src/cli/handlers/release-publish-targets.e2e.test.ts +2 -2
- package/src/cli/handlers/release-verify.e2e.test.ts +12 -10
- package/src/cli/handlers/release.e2e.test.ts +19 -28
- package/src/cli/handlers/release.ts +81 -11
- package/src/cli/handlers/run-components-exit.test.ts +99 -0
- package/src/cli/handlers/run-signer.test.ts +79 -0
- package/src/cli/handlers/run.ts +34 -16
- package/src/cli/main.test.ts +18 -0
- package/src/cli/main.ts +120 -33
- package/src/cli/parse-args.ts +28 -0
- package/src/cli/registry.ts +35 -8
- package/src/codegen/generate-post-synth-barrel.ts +2 -2
- package/src/codegen/lexicon-regen.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -2
- package/src/codegen/post-synth-barrel-guards.test.ts +6 -11
- package/src/components/capability.ts +51 -3
- package/src/components/changed-files.test.ts +16 -1
- package/src/components/changed-files.ts +9 -1
- package/src/components/deploy-inputs.test.ts +108 -0
- package/src/components/deploy-inputs.ts +225 -0
- package/src/components/driver.test.ts +36 -1
- package/src/components/driver.ts +87 -4
- package/src/components/fan-out-record.ts +29 -1
- package/src/components/fan-out-run.test.ts +35 -0
- package/src/components/fan-out-run.ts +40 -1
- package/src/components/gate-plan.ts +9 -0
- package/src/components/pr-pipeline.test.ts +100 -0
- package/src/components/pr-pipeline.ts +184 -28
- package/src/components/pr-run.test.ts +323 -18
- package/src/components/pr-run.ts +355 -76
- package/src/components/release-compile.test.ts +34 -0
- package/src/components/release-compile.ts +89 -8
- package/src/components/release-promote.test.ts +55 -2
- package/src/components/release-promote.ts +93 -23
- package/src/components/verbs/bom-writer.ts +1 -1
- package/src/components/verbs/lockfile-sbom-generator.test.ts +36 -0
- package/src/components/verbs/lockfile-sbom-generator.ts +43 -5
- package/src/components/wave-plan.ts +48 -8
- package/src/discovery/fold-host-method.test.ts +87 -0
- package/src/discovery/fold-import.ts +15 -5
- package/src/discovery/fold-package-composite.test.ts +27 -0
- package/src/discovery/fold-specifiers.test.ts +8 -0
- package/src/discovery/sandbox/bundle.ts +6 -0
- package/src/discovery/specifier-resolve.ts +8 -2
- package/src/fold/fold.test.ts +72 -0
- package/src/fold/fold.ts +71 -0
- package/src/fold/subset.test.ts +31 -0
- package/src/fold/subset.ts +99 -0
- package/src/graph-detail.test.ts +57 -0
- package/src/graph-detail.ts +33 -7
- package/src/health.schema.json +191 -0
- package/src/health.test.ts +62 -0
- package/src/health.ts +178 -0
- package/src/lexicon-dist.e2e.test.ts +254 -0
- package/src/lexicon-module.test.ts +47 -0
- package/src/lexicon-module.ts +49 -7
- package/src/lexicon-plugin-helpers.ts +6 -4
- package/src/lexicon.ts +43 -1
- package/src/lifecycle/affected.test.ts +7 -0
- package/src/lifecycle/affected.ts +6 -1
- package/src/lifecycle/merge-record.test.ts +111 -0
- package/src/lifecycle/merge-record.ts +154 -0
- package/src/lifecycle/publish-attachments.ts +25 -13
- package/src/lifecycle/publish-npm.ts +4 -3
- package/src/lifecycle/publish-targets.test.ts +34 -4
- package/src/lifecycle/release-at.test.ts +48 -0
- package/src/lifecycle/release-at.ts +100 -0
- package/src/lifecycle/release-cut.test.ts +41 -0
- package/src/lifecycle/release-cut.ts +22 -11
- package/src/lifecycle/release-ledger.ts +34 -0
- package/src/lifecycle/release-publish.test.ts +43 -13
- package/src/lifecycle/release-publish.ts +38 -18
- package/src/lifecycle/release-store.ts +57 -13
- package/src/lifecycle/run-ledger.test.ts +13 -0
- package/src/lifecycle/run-ledger.ts +1 -0
- package/src/lifecycle/work-dir.test.ts +77 -0
- package/src/lifecycle/work-dir.ts +82 -0
- package/src/lint/discover.test.ts +46 -2
- package/src/lint/discover.ts +55 -49
- package/src/lint/rules/op/index.ts +4 -2
- package/src/lint/rules/op/ops018-shell-image-digest.test.ts +60 -0
- package/src/lint/rules/op/ops018-shell-image-digest.ts +48 -0
- package/src/module-source.test.ts +85 -0
- package/src/module-source.ts +112 -0
- package/src/op/activities/activity-contracts.ts +3 -0
- package/src/op/activities/factory.ts +1 -1
- package/src/op/activities/shell-container.e2e.test.ts +67 -0
- package/src/op/activities/shell.test.ts +44 -1
- package/src/op/activities/shell.ts +110 -3
- package/src/op/builders.ts +7 -0
- package/src/op/discover-root.test.ts +31 -2
- package/src/op/discover.ts +14 -4
- package/src/op/gate.test.ts +30 -0
- package/src/op/gate.ts +3 -0
- package/src/op/op-waves-run.ts +20 -5
- package/src/op/op-waves.test.ts +49 -0
- package/src/op/operator.ts +2 -2
- package/src/op/runtime.ts +2 -0
- package/src/op/step-console.test.ts +4 -2
- package/src/op/steward.ts +6 -4
- package/src/op/work-lease-run.test.ts +88 -2
- package/src/op/work-lease-run.ts +52 -12
- package/src/pr-forge-bundle.test.ts +2 -2
- package/src/pr-forge.test.ts +42 -0
- package/src/pr-forge.ts +40 -0
- package/src/pr-loop-bundle.test.ts +2 -1
- package/src/pr-loop.test.ts +146 -1
- package/src/pr-loop.ts +278 -17
- package/src/pr-report-url.ts +7 -7
- package/src/runner-start-bundle.test.ts +29 -0
- package/src/runner-start.test.ts +179 -0
- package/src/runner-start.ts +329 -0
- package/src/terraform/__fixtures__/advise.test.ts +21 -2
- package/src/ts-loader.test.ts +89 -1
- package/src/ts-loader.ts +180 -13
- package/src/workspace/changes.test.ts +1 -1
- package/src/workspace/chant-migrations/fountain-retired-kinds.test.ts +33 -0
- package/src/workspace/chant-migrations/fountain-retired-kinds.ts +190 -0
- package/src/workspace/chant-migrations.e2e.test.ts +5 -0
- package/src/workspace/chant-migrations.ts +2 -0
- package/src/workspace/check-contract.test.ts +3 -2
- package/src/workspace/check.schema.json +70 -2
- package/src/workspace/checks/boxes.ts +9 -9
- package/src/workspace/checks/security.test.ts +138 -0
- package/src/workspace/checks/security.ts +305 -0
- package/src/workspace/checks.ts +5 -0
- package/src/workspace/ci-builds.e2e.test.ts +208 -0
- package/src/workspace/ci-builds.test.ts +174 -0
- package/src/workspace/ci-builds.ts +385 -0
- package/src/workspace/ci-green-builds.test.ts +180 -0
- package/src/workspace/ci-green-cli.test.ts +54 -0
- package/src/workspace/ci-green-cli.ts +26 -5
- package/src/workspace/ci-green-forge.ts +30 -4
- package/src/workspace/ci-green-runs.test.ts +53 -11
- package/src/workspace/ci-green-workflow.test.ts +84 -1
- package/src/workspace/ci-green-workflow.ts +139 -2
- package/src/workspace/ci-green.test.ts +6 -3
- package/src/workspace/ci-green.ts +408 -48
- package/src/workspace/ci-last-green.schema.json +49 -0
- package/src/workspace/ci-list.schema.json +47 -7
- package/src/workspace/ci-report-url.test.ts +220 -0
- package/src/workspace/ci-report-url.ts +33 -0
- package/src/workspace/ci-run-index.schema.json +6 -4
- package/src/workspace/ci-run-index.test.ts +42 -3
- package/src/workspace/ci-run-index.ts +19 -5
- package/src/workspace/ci-run.test.ts +203 -8
- package/src/workspace/ci-run.ts +295 -63
- package/src/workspace/ci-runner-key.test.ts +55 -17
- package/src/workspace/ci-runner-key.ts +36 -11
- package/src/workspace/ci-runner-start.test.ts +151 -0
- package/src/workspace/ci-runner-start.ts +193 -0
- package/src/workspace/ci-serve-builds.test.ts +86 -0
- package/src/workspace/ci-serve.test.ts +209 -6
- package/src/workspace/ci-serve.ts +341 -42
- package/src/workspace/declaration.schema.json +30 -2
- package/src/workspace/declaration.test.ts +40 -0
- package/src/workspace/declaration.ts +40 -3
- package/src/workspace/export.ts +6 -3
- package/src/workspace/ls.schema.json +9 -2
- package/src/workspace/ls.ts +10 -4
- package/src/workspace/member-pipeline.ts +2 -1
- package/src/workspace/merge-record.schema.json +49 -0
- package/src/workspace/pin-integrity.test.ts +5 -0
- package/src/workspace/pin-integrity.ts +3 -2
- package/src/workspace/pr-report.schema.json +75 -8
- package/src/workspace/reason-codes.test.ts +2 -0
- package/src/workspace/reason-codes.ts +20 -2
- package/src/workspace/release-candidates.schema.json +353 -0
- package/src/workspace/release-candidates.test.ts +106 -0
- package/src/workspace/release-candidates.ts +315 -0
- package/src/workspace/run-event.schema.json +3 -1
- package/src/workspace/security.test.ts +70 -0
- package/src/workspace/security.ts +118 -0
- package/src/workspace/status.schema.json +3 -1
- package/src/workspace/write-scope.test.ts +29 -1
- package/src/workspace/write-scope.ts +12 -1
|
@@ -8,26 +8,42 @@
|
|
|
8
8
|
* everything before applying anything is what makes the two digests
|
|
9
9
|
* comparable: each member is planned against the same state both times.
|
|
10
10
|
*
|
|
11
|
-
* ##
|
|
11
|
+
* ## What a dependent is planned against
|
|
12
12
|
*
|
|
13
13
|
* A member that reads another one's output through `stackOutput()` is
|
|
14
|
-
* planned with
|
|
15
|
-
* `outputs` (`readComponentOutputs`). When the change moves that output, the
|
|
16
|
-
* dependent's approved plan still carries the old value; the apply applies
|
|
17
|
-
* it as approved and marks the member `inputsMoved`, and the next run plans
|
|
18
|
-
* it against the new value. A change that must carry a moved output through
|
|
19
|
-
* its dependents in one rollout is what gated waves are for (#3049): each
|
|
20
|
-
* wave is planned after the one before it applied.
|
|
14
|
+
* planned with one of three values (#3999):
|
|
21
15
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
16
|
+
* - the upstream is in the change too: the value its plan says it will
|
|
17
|
+
* expose (`CapabilityPlan.outputs`). The report lists these under
|
|
18
|
+
* `plannedOutputs`.
|
|
19
|
+
* - the upstream is not in the change (#4104): the value it has now, read
|
|
20
|
+
* through its capability's `outputs` (`readComponentOutputs`). The report
|
|
21
|
+
* lists these under `deployedOutputs`. A change to one cluster is planned
|
|
22
|
+
* against the network it sits on, which is why `components` is every
|
|
23
|
+
* component in the project and not the selection.
|
|
24
|
+
* - the upstream is in the change and its plan cannot say, or says the value
|
|
25
|
+
* is known only after apply: no value. The dependent's members list the
|
|
26
|
+
* reference under `unknownInputs`, and the approval does not cover what
|
|
27
|
+
* it will do with it.
|
|
28
|
+
*
|
|
29
|
+
* `--seed-outputs` wins over both. The apply stage's plan reads the same
|
|
30
|
+
* values, so on the same estate it gets the digest the plan stage showed.
|
|
31
|
+
* A resume plans against the outputs the approved plans read, from the
|
|
32
|
+
* record (`planOutputs`), and reads nothing those cover.
|
|
33
|
+
*
|
|
34
|
+
* ## Planning again once an upstream applied
|
|
35
|
+
*
|
|
36
|
+
* The apply runs each member's approved plan, except a member whose plan
|
|
37
|
+
* read an upstream output that is not the value standing when its turn
|
|
38
|
+
* comes (`movedWiringReferences`): the upstream applied as another value
|
|
39
|
+
* than its plan said, or the value was unknown. That member, and what is
|
|
40
|
+
* downstream of it, is held back. Once the rest settled, the held members
|
|
41
|
+
* are planned again against the outputs the apply left, and that set's
|
|
42
|
+
* digest is decided at its own gate, `<gate>-round-<n>` (`prRoundGate`), as
|
|
43
|
+
* a gated wave decides each wave (#3049). Approved, it applies, and a member
|
|
44
|
+
* that is held again goes to the next round. Not approved, the apply stops
|
|
45
|
+
* `waiting` with the new digest named, and the same apply with its
|
|
46
|
+
* `--resume` record carries on from there.
|
|
31
47
|
*
|
|
32
48
|
* ## Finishing an apply that failed partway
|
|
33
49
|
*
|
|
@@ -41,15 +57,24 @@
|
|
|
41
57
|
* the rest applies. Planning everything again would give the applied members
|
|
42
58
|
* empty plans and the set a new digest, and so ask for a second approval of
|
|
43
59
|
* work already approved.
|
|
60
|
+
*
|
|
61
|
+
* ## A gate per wave on merge
|
|
62
|
+
*
|
|
63
|
+
* `pr-apply --wave-gate` (#4003) applies the approved set a wave at a time.
|
|
64
|
+
* {@link prWavePlan} narrows the derivation to one wave, which is planned
|
|
65
|
+
* against the outputs the waves before it left, and {@link waveNotCovered}
|
|
66
|
+
* says whether the approved change set covers what it planned, by the same
|
|
67
|
+
* test a resume uses ({@link planCoveredBy}). Covered, the wave applies under
|
|
68
|
+
* the pull request's approval; not covered, it needs its own.
|
|
44
69
|
*/
|
|
45
70
|
import { composeChangeSet, verifyChangeSetDigest } from "../change-set.js";
|
|
46
71
|
import { evaluateGate } from "../op/gate.js";
|
|
47
|
-
import { memberCounts, PR_REPORT_CONTRACT, PR_REPORT_SCHEMA_ID, } from "../pr-loop.js";
|
|
48
|
-
import { deployContext } from "./driver.js";
|
|
72
|
+
import { memberCounts, PR_APPLY_GATE, prRoundGate, PR_REPORT_CONTRACT, PR_REPORT_SCHEMA_ID, } from "../pr-loop.js";
|
|
73
|
+
import { deployContext, movedWiringReferences, unresolvedWiringReferences, } from "./driver.js";
|
|
49
74
|
import { deployUnits } from "./deploy-units.js";
|
|
50
75
|
import { runFanOut } from "./fan-out-run.js";
|
|
51
76
|
import { remainingFanOut } from "./fan-out.js";
|
|
52
|
-
import { planWaveComponent, readDeployedOutputs } from "./wave-plan.js";
|
|
77
|
+
import { capabilitySteps, planWaveComponent, readDeployedOutputs } from "./wave-plan.js";
|
|
53
78
|
/** The phase a pull request's planning is, in its run's events. */
|
|
54
79
|
export const PR_PLAN_PHASE = "plan";
|
|
55
80
|
/** A failed component's members: the units its steps target, else the component itself. */
|
|
@@ -61,36 +86,51 @@ function failedParts(component, error) {
|
|
|
61
86
|
}));
|
|
62
87
|
}
|
|
63
88
|
/**
|
|
64
|
-
* Plan every component in `plan.order`, a wave at a time, each against
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
89
|
+
* Plan every component in `plan.order`, a wave at a time, each against its
|
|
90
|
+
* dependencies' planned outputs when the change plans them too, and against
|
|
91
|
+
* the outputs they have now otherwise. Never throws for a component that
|
|
92
|
+
* fails to plan: it becomes a failed member, and `failed` is set. Throws
|
|
93
|
+
* when a planned member's dependency is not among `components`, which means
|
|
94
|
+
* the caller passed the selection where the whole graph belongs.
|
|
69
95
|
*/
|
|
70
96
|
export async function planPrSet(options) {
|
|
71
97
|
const byName = new Map(options.components.map((c) => [c.name, c]));
|
|
72
98
|
const outputs = { ...(options.seededOutputs ?? {}) };
|
|
73
99
|
const read = new Set(Object.keys(outputs));
|
|
100
|
+
const inChange = new Set(options.plan.order);
|
|
101
|
+
/** What each component of the change planned to expose, once its wave planned. */
|
|
102
|
+
const plannedBy = new Map();
|
|
74
103
|
const deployed = {};
|
|
104
|
+
const planned = {};
|
|
75
105
|
const parts = [];
|
|
76
106
|
const componentOf = new Map();
|
|
107
|
+
const unknownOf = new Map();
|
|
77
108
|
const plans = {};
|
|
78
109
|
let failed = false;
|
|
79
110
|
const emit = options.onRunEvent;
|
|
80
111
|
emit?.({ type: "phase-start", component: null, phase: PR_PLAN_PHASE });
|
|
81
112
|
for (const wave of options.plan.waves) {
|
|
82
|
-
// The dependencies' outputs first, each
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
//
|
|
113
|
+
// The dependencies' outputs first, each once. One the change plans is
|
|
114
|
+
// read from its plan, which an earlier wave made (#3999). Any other is
|
|
115
|
+
// read from the deployed estate (#4104). A dependency that cannot say
|
|
116
|
+
// leaves its references unresolved, which its dependent's plan reports
|
|
117
|
+
// if it needs them.
|
|
86
118
|
const deps = [...new Set(wave.flatMap((name) => byName.get(name)?.dependsOn ?? []))].filter((dep) => !read.has(dep));
|
|
119
|
+
const fromEstate = [];
|
|
87
120
|
for (const dep of deps) {
|
|
88
121
|
read.add(dep);
|
|
89
122
|
if (!byName.has(dep))
|
|
90
123
|
throw new Error(`planPrSet: ${dep}, a dependency of a planned member, is not among the components; pass every component in the project`);
|
|
124
|
+
if (!inChange.has(dep)) {
|
|
125
|
+
fromEstate.push(dep);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const known = plannedBy.get(dep)?.known ?? {};
|
|
129
|
+
outputs[dep] = { ...known };
|
|
130
|
+
planned[dep] = Object.keys(known).sort();
|
|
91
131
|
}
|
|
92
|
-
Object.assign(deployed, await readDeployedOutputs(
|
|
93
|
-
const
|
|
132
|
+
Object.assign(deployed, await readDeployedOutputs(fromEstate, byName, options.registry, (dep) => deployContext(options, dep), outputs));
|
|
133
|
+
const results = await Promise.all(wave.map(async (name) => {
|
|
94
134
|
const at = { component: name, phase: PR_PLAN_PHASE, step: "plan" };
|
|
95
135
|
emit?.({ type: "step-start", ...at });
|
|
96
136
|
const start = Date.now();
|
|
@@ -104,16 +144,21 @@ export async function planPrSet(options) {
|
|
|
104
144
|
});
|
|
105
145
|
return p;
|
|
106
146
|
}));
|
|
107
|
-
for (const p of
|
|
147
|
+
for (const p of results) {
|
|
108
148
|
const component = byName.get(p.component);
|
|
149
|
+
const unknown = unknownInputsOf(component, outputs, inChange);
|
|
150
|
+
if (unknown.unknown.length > 0 || unknown.build.length > 0)
|
|
151
|
+
unknownOf.set(p.component, unknown);
|
|
109
152
|
if ("error" in p) {
|
|
110
153
|
failed = true;
|
|
154
|
+
plannedBy.set(p.component, undefined);
|
|
111
155
|
for (const part of failedParts(component, p.error)) {
|
|
112
156
|
parts.push(part);
|
|
113
157
|
componentOf.set(part.member.member, p.component);
|
|
114
158
|
}
|
|
115
159
|
continue;
|
|
116
160
|
}
|
|
161
|
+
plannedBy.set(p.component, p.outputs);
|
|
117
162
|
plans[p.component] = p.plans;
|
|
118
163
|
for (const part of p.parts) {
|
|
119
164
|
parts.push(part);
|
|
@@ -123,16 +168,71 @@ export async function planPrSet(options) {
|
|
|
123
168
|
}
|
|
124
169
|
emit?.({ type: "phase-settle", component: null, phase: PR_PLAN_PHASE, status: failed ? "failed" : "ok" });
|
|
125
170
|
const doc = composeChangeSet(parts);
|
|
126
|
-
const members = doc.members.map((m) =>
|
|
127
|
-
member
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
171
|
+
const members = doc.members.map((m) => {
|
|
172
|
+
const component = componentOf.get(m.member) ?? m.member;
|
|
173
|
+
const unknown = unknownOf.get(component);
|
|
174
|
+
return {
|
|
175
|
+
member: m.member,
|
|
176
|
+
component,
|
|
177
|
+
planDigest: m.planDigest,
|
|
178
|
+
status: m.status === "failed" ? "plan-failed" : "planned",
|
|
179
|
+
counts: memberCounts(doc, m.member),
|
|
180
|
+
...(m.error ? { error: m.error } : {}),
|
|
181
|
+
...(unknown?.unknown.length ? { unknownInputs: unknown.unknown } : {}),
|
|
182
|
+
...(unknown?.build.length ? { buildInputs: unknown.build } : {}),
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
const sorted = (r) => Object.fromEntries(Object.entries(r).sort(([a], [b]) => a.localeCompare(b)));
|
|
186
|
+
const deployedOutputs = sorted(deployed);
|
|
187
|
+
const plannedOutputs = sorted(planned);
|
|
188
|
+
return {
|
|
189
|
+
doc,
|
|
190
|
+
members,
|
|
191
|
+
plans,
|
|
192
|
+
outputs,
|
|
193
|
+
failed,
|
|
194
|
+
...(Object.keys(deployedOutputs).length > 0 ? { deployedOutputs } : {}),
|
|
195
|
+
...(Object.keys(plannedOutputs).length > 0 ? { plannedOutputs } : {}),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The references `component`'s steps make to an output of a component in
|
|
200
|
+
* the change that `outputs` holds no value for (#3999), known only after
|
|
201
|
+
* that upstream applies, each sorted. `build` are the published artifact
|
|
202
|
+
* identities a build in the change produces (`WiringReference.publish`):
|
|
203
|
+
* the build's provenance binds those, so they are never approved again.
|
|
204
|
+
* `unknown` are the rest.
|
|
205
|
+
*/
|
|
206
|
+
function unknownInputsOf(component, outputs, inChange) {
|
|
207
|
+
const unknown = new Set();
|
|
208
|
+
const build = new Set();
|
|
209
|
+
for (const step of capabilitySteps(component.deploy)) {
|
|
210
|
+
const { kind: _kind, ...rest } = step;
|
|
211
|
+
for (const r of unresolvedWiringReferences(rest, outputs)) {
|
|
212
|
+
if (inChange.has(r.source))
|
|
213
|
+
(r.publish ? build : unknown).add(r.ref);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return { unknown: [...unknown].sort(), build: [...build].sort() };
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Why `component` cannot apply the plan that read `read` now that `now`
|
|
220
|
+
* stands (#3999): each reference its steps make that resolves to another
|
|
221
|
+
* value, said once. `undefined` when every one resolves as it did. A
|
|
222
|
+
* published artifact's identity from a build in `inChange` never holds a
|
|
223
|
+
* member back: the build's provenance binds it, not this approval.
|
|
224
|
+
*/
|
|
225
|
+
export function heldReason(component, read, now, inChange = new Set()) {
|
|
226
|
+
const refs = new Set();
|
|
227
|
+
for (const step of capabilitySteps(component.deploy)) {
|
|
228
|
+
const { kind: _kind, ...rest } = step;
|
|
229
|
+
for (const r of movedWiringReferences(rest, read, now))
|
|
230
|
+
if (!(r.publish && inChange.has(r.source)))
|
|
231
|
+
refs.add(r.ref);
|
|
232
|
+
}
|
|
233
|
+
if (refs.size === 0)
|
|
234
|
+
return undefined;
|
|
235
|
+
return `its plan read ${[...refs].sort().join(", ")} before ${refs.size === 1 ? "that output" : "those outputs"} applied as another value`;
|
|
136
236
|
}
|
|
137
237
|
/**
|
|
138
238
|
* A ledger that reads the real one and records nothing. The plan stage
|
|
@@ -178,58 +278,132 @@ export function approversWithoutReview(approvedBy, reviewers) {
|
|
|
178
278
|
const allowed = new Set(reviewers.map(norm));
|
|
179
279
|
return approvedBy.filter((by) => !allowed.has(norm(by)));
|
|
180
280
|
}
|
|
181
|
-
|
|
281
|
+
/**
|
|
282
|
+
* Who approved the gate but wrote the change (#4000): each approval's
|
|
283
|
+
* `resolvedBy` that names one of `authors`, the forge's naming of the pull
|
|
284
|
+
* request's author and of its commits' authors and committers. Their own
|
|
285
|
+
* approval never counts, whether a forge review or a ledger line backs it.
|
|
286
|
+
*/
|
|
287
|
+
export function approversWhoAuthored(approvedBy, authors) {
|
|
288
|
+
const norm = (s) => s.trim().toLowerCase();
|
|
289
|
+
const wrote = new Set(authors.map(norm));
|
|
290
|
+
return approvedBy.filter((by) => wrote.has(norm(by)));
|
|
291
|
+
}
|
|
292
|
+
/** Two runs of one apply as one: `b` ran after `a`, against the outputs `a` left. */
|
|
293
|
+
function joinRuns(a, b) {
|
|
294
|
+
const status = a.status === "fail" || b.status === "fail" ? "fail" : a.status === "gated" || b.status === "gated" ? "gated" : "ok";
|
|
295
|
+
const gate = a.gate ?? b.gate;
|
|
296
|
+
return {
|
|
297
|
+
plan: a.plan,
|
|
298
|
+
status,
|
|
299
|
+
results: [...a.results, ...b.results],
|
|
300
|
+
completed: [...new Set([...a.completed, ...b.completed])].sort(),
|
|
301
|
+
failed: [...new Set([...a.failed, ...b.failed])].sort(),
|
|
302
|
+
blocked: [...a.blocked, ...b.blocked],
|
|
303
|
+
componentOutputs: b.componentOutputs,
|
|
304
|
+
...(gate ? { gate } : {}),
|
|
305
|
+
...(b.held ? { held: b.held } : {}),
|
|
306
|
+
};
|
|
307
|
+
}
|
|
182
308
|
/**
|
|
183
309
|
* Apply the approved plans in dependency order. A failed component blocks
|
|
184
|
-
* its dependents and nothing else (`runFanOut`).
|
|
310
|
+
* its dependents and nothing else (`runFanOut`). A member whose plan read an
|
|
311
|
+
* upstream output that is not the value standing when its turn comes is held
|
|
312
|
+
* back with what is downstream of it, planned again once the rest settled,
|
|
313
|
+
* and applied when `decideRound` approves that plan (#3999).
|
|
185
314
|
*/
|
|
186
315
|
export async function applyPrSet(options) {
|
|
187
|
-
const
|
|
188
|
-
const
|
|
316
|
+
const byName = new Map(options.components.map((c) => [c.name, c]));
|
|
317
|
+
const priorCompleted = new Set(options.resumed?.completed ?? []);
|
|
318
|
+
const inChange = new Set([...options.set.members.map((m) => m.component), ...options.plan.order]);
|
|
319
|
+
const toApply = new Set([...inChange].filter((name) => !priorCompleted.has(name)));
|
|
320
|
+
// The outputs standing as the apply starts: what the plans read of
|
|
321
|
+
// components outside the change, and what an earlier attempt's components
|
|
322
|
+
// left (the values the plans read, where its record kept none). A planned
|
|
323
|
+
// value of a component still to apply stands nowhere until it applies.
|
|
324
|
+
const standing = {
|
|
325
|
+
...Object.fromEntries(Object.entries(options.set.outputs).filter(([name]) => !toApply.has(name))),
|
|
326
|
+
...(options.resumed?.outputs ?? {}),
|
|
327
|
+
};
|
|
328
|
+
const runRound = (plan, plans, read, outputs) => runFanOut(plan, options.components, options.registry, {
|
|
189
329
|
env: options.env,
|
|
190
330
|
...(options.vars ? { vars: options.vars } : {}),
|
|
191
|
-
plans
|
|
192
|
-
componentOutputs:
|
|
331
|
+
plans,
|
|
332
|
+
componentOutputs: outputs,
|
|
333
|
+
hold: (name, now) => heldReason(byName.get(name), read, now, inChange),
|
|
193
334
|
...(options.onProgress ? { onProgress: options.onProgress } : {}),
|
|
194
335
|
...(options.onRunEvent ? { onRunEvent: options.onRunEvent } : {}),
|
|
195
336
|
...(options.onComponentSettled ? { onComponentSettled: options.onComponentSettled } : {}),
|
|
196
337
|
});
|
|
338
|
+
let run = await runRound(options.plan, options.set.plans, options.set.outputs, { ...standing });
|
|
339
|
+
const rounds = [];
|
|
340
|
+
/** Per component, the round that applied it or holds it, and that round's set, after the first. */
|
|
341
|
+
const roundOf = new Map();
|
|
342
|
+
let stopped;
|
|
343
|
+
while (run.held && run.held.length > 0 && run.status === "ok" && options.decideRound) {
|
|
344
|
+
const round = rounds.length + 2;
|
|
345
|
+
const gate = prRoundGate(options.gate ?? PR_APPLY_GATE, round);
|
|
346
|
+
const heldNames = new Set(run.held.map((h) => h.component));
|
|
347
|
+
const plan = remainingFanOut(options.plan, options.components, { completed: options.plan.order.filter((name) => !heldNames.has(name)) });
|
|
348
|
+
const set = await planPrSet({
|
|
349
|
+
components: options.components,
|
|
350
|
+
plan,
|
|
351
|
+
registry: options.registry,
|
|
352
|
+
env: options.env,
|
|
353
|
+
...(options.vars ? { vars: options.vars } : {}),
|
|
354
|
+
seededOutputs: run.componentOutputs,
|
|
355
|
+
});
|
|
356
|
+
for (const name of plan.order)
|
|
357
|
+
roundOf.set(name, { round, set });
|
|
358
|
+
const record = (status, approval, message) => {
|
|
359
|
+
rounds.push({ round, gate, digest: set.doc.digest, components: plan.order, approval, status, ...(message ? { message } : {}), changeSet: set.doc });
|
|
360
|
+
};
|
|
361
|
+
if (set.failed) {
|
|
362
|
+
record("plan-failed", { status: "pending" });
|
|
363
|
+
stopped = "plan-failed";
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
const decision = await options.decideRound({ round, gate, set, plan });
|
|
367
|
+
if (!decision.satisfied) {
|
|
368
|
+
record("waiting", decision.approval, decision.message);
|
|
369
|
+
stopped = "waiting";
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
const next = await runRound(plan, set.plans, set.outputs, run.componentOutputs);
|
|
373
|
+
record(next.status === "fail" ? "failed" : "applied", decision.approval);
|
|
374
|
+
run = joinRuns(run, next);
|
|
375
|
+
}
|
|
197
376
|
const completed = new Set(run.completed);
|
|
198
|
-
const
|
|
199
|
-
/**
|
|
200
|
-
* Whether a dependency's outputs moved from what the plans read: by this
|
|
201
|
-
* run's apply, or by the earlier attempt's when the record kept them.
|
|
202
|
-
*/
|
|
203
|
-
const movedBy = (dep) => {
|
|
204
|
-
if (completed.has(dep))
|
|
205
|
-
return !sameJson(before[dep], run.componentOutputs[dep]);
|
|
206
|
-
const earlier = options.resumed?.outputs;
|
|
207
|
-
return priorCompleted.has(dep) && earlier !== undefined && dep in earlier && !sameJson(before[dep], earlier[dep]);
|
|
208
|
-
};
|
|
377
|
+
const held = new Map((run.held ?? []).map((h) => [h.component, h]));
|
|
209
378
|
const blocked = new Set(run.blocked.map((b) => b.component));
|
|
210
379
|
const errorOf = (component) => {
|
|
211
|
-
const result = run.results.find((r) => r.component === component);
|
|
380
|
+
const result = [...run.results].reverse().find((r) => r.component === component);
|
|
212
381
|
if (result?.status === "gated")
|
|
213
382
|
return `stopped at its own gate ${result.gate?.gate ?? ""}`.trim();
|
|
214
383
|
return result?.records.find((r) => r.status === "fail")?.error;
|
|
215
384
|
};
|
|
216
|
-
const byName = new Map(options.components.map((c) => [c.name, c]));
|
|
217
385
|
const members = options.set.members.map((m) => {
|
|
218
386
|
if (priorCompleted.has(m.component))
|
|
219
387
|
return { ...m, status: "applied" };
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
return { ...
|
|
225
|
-
|
|
388
|
+
const later = roundOf.get(m.component);
|
|
389
|
+
const fresh = later?.set.members.find((x) => x.member === m.member);
|
|
390
|
+
const asPlanned = later && fresh ? { ...m, planDigest: fresh.planDigest, counts: fresh.counts, round: later.round } : m;
|
|
391
|
+
if (completed.has(m.component))
|
|
392
|
+
return { ...asPlanned, status: "applied" };
|
|
393
|
+
const h = held.get(m.component);
|
|
394
|
+
if (h)
|
|
395
|
+
return { ...asPlanned, status: "waiting", held: h.heldBy ? `${h.heldBy} is held: ${h.reason}` : h.reason };
|
|
396
|
+
if (fresh?.status === "plan-failed")
|
|
397
|
+
return { ...asPlanned, status: "plan-failed", ...(fresh.error ? { error: fresh.error } : {}) };
|
|
226
398
|
if (blocked.has(m.component))
|
|
227
|
-
return { ...
|
|
399
|
+
return { ...asPlanned, status: "blocked" };
|
|
228
400
|
const error = errorOf(m.component);
|
|
229
|
-
return { ...
|
|
401
|
+
return { ...asPlanned, status: "failed", ...(error ? { error } : {}) };
|
|
230
402
|
});
|
|
231
|
-
|
|
403
|
+
const status = run.status !== "ok" || stopped === "plan-failed" ? "failed" : held.size > 0 || stopped === "waiting" ? "waiting" : "applied";
|
|
404
|
+
return { members, status, run, ...(rounds.length > 0 ? { rounds } : {}) };
|
|
232
405
|
}
|
|
406
|
+
const sameJson = (a, b) => JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
233
407
|
const entryKey = (e) => `${e.member}\u0000${e.address}\u0000${e.deposed ?? ""}`;
|
|
234
408
|
/**
|
|
235
409
|
* Why `member`'s fresh plan is not covered by the approved change set, or
|
|
@@ -361,6 +535,48 @@ export async function resumePrSet(options) {
|
|
|
361
535
|
},
|
|
362
536
|
};
|
|
363
537
|
}
|
|
538
|
+
/**
|
|
539
|
+
* The fan-out narrowed to wave `wave` of `plan` (1-based), less the
|
|
540
|
+
* components in `completed` (#4003). Its one wave is what is left of that
|
|
541
|
+
* wave; a dependency outside it, an earlier wave's component among them, is
|
|
542
|
+
* a seed. The digest is the derivation's, as {@link remainingFanOut} keeps it.
|
|
543
|
+
*/
|
|
544
|
+
export function prWavePlan(plan, components, wave, completed = []) {
|
|
545
|
+
const done = new Set(completed);
|
|
546
|
+
const order = (plan.waves[wave - 1] ?? []).filter((name) => !done.has(name));
|
|
547
|
+
const inWave = new Set(order);
|
|
548
|
+
const byName = new Map(components.map((c) => [c.name, c]));
|
|
549
|
+
const seeds = [
|
|
550
|
+
...new Set([...plan.seeds, ...order.flatMap((name) => (byName.get(name)?.dependsOn ?? []).filter((dep) => !inWave.has(dep)))]),
|
|
551
|
+
].sort();
|
|
552
|
+
return { order, waves: order.length > 0 ? [order] : [], skipped: [], seeds, indeterminate: plan.indeterminate, digest: plan.digest };
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Why the approved change set does not cover a wave's new plan, one line per
|
|
556
|
+
* member, or `[]` when it covers every member (#4003). A member is covered
|
|
557
|
+
* as {@link planCoveredBy} says, with one rule more: a member whose planner
|
|
558
|
+
* describes no changes (chant's own empty part, for a capability that
|
|
559
|
+
* returns no change set) is covered only by the digest it was approved
|
|
560
|
+
* with, since with no entries there is nothing to compare a moved plan by.
|
|
561
|
+
*/
|
|
562
|
+
export function waveNotCovered(approved, fresh, approvedMembers = []) {
|
|
563
|
+
// #3999: a member whose approved plan waited only on an artifact a build in
|
|
564
|
+
// the change publishes is covered by that build's provenance, as it is
|
|
565
|
+
// without --wave-gate.
|
|
566
|
+
const byBuild = new Set(approvedMembers.filter((m) => m.buildInputs?.length && !m.unknownInputs?.length).map((m) => m.member));
|
|
567
|
+
return fresh.members
|
|
568
|
+
.map((m) => {
|
|
569
|
+
if (byBuild.has(m.member))
|
|
570
|
+
return undefined;
|
|
571
|
+
const was = approved.members.find((a) => a.member === m.member);
|
|
572
|
+
const opaque = m.planner === "chant" && m.lexicon === "chant" && m.status === "planned";
|
|
573
|
+
if (opaque && was && was.planDigest !== m.planDigest) {
|
|
574
|
+
return `${m.member} now plans to ${m.planDigest}, not the approved ${was.planDigest ?? "(none)"}, and its planner describes no changes to compare`;
|
|
575
|
+
}
|
|
576
|
+
return planCoveredBy(approved, fresh, m.member);
|
|
577
|
+
})
|
|
578
|
+
.filter((r) => r !== undefined);
|
|
579
|
+
}
|
|
364
580
|
/** The report a stage writes. */
|
|
365
581
|
export function prReport(input) {
|
|
366
582
|
const changed = new Set(input.signal.changed);
|
|
@@ -381,7 +597,11 @@ export function prReport(input) {
|
|
|
381
597
|
...(input.message ? { message: input.message } : {}),
|
|
382
598
|
...(input.resumed ? { resumed: { applied: [...input.resumed].sort() } } : {}),
|
|
383
599
|
...(input.set.deployedOutputs ? { deployedOutputs: input.set.deployedOutputs } : {}),
|
|
600
|
+
...(input.set.plannedOutputs ? { plannedOutputs: input.set.plannedOutputs } : {}),
|
|
601
|
+
...(input.rounds && input.rounds.length > 0 ? { rounds: input.rounds } : {}),
|
|
384
602
|
approval: input.approval,
|
|
603
|
+
...(input.waveGate ? { waveGate: input.waveGate } : {}),
|
|
604
|
+
...(input.waveGate && input.waves?.length ? { waves: [...input.waves].sort((a, b) => a.wave - b.wave) } : {}),
|
|
385
605
|
selection: {
|
|
386
606
|
changed: input.plan.order.filter((c) => changed.has(c)),
|
|
387
607
|
dependents: input.plan.order.filter((c) => !changed.has(c)),
|
|
@@ -15,7 +15,14 @@
|
|
|
15
15
|
* ./promote.ts: a literal path in a deploy step's `template`, `manifest` or
|
|
16
16
|
* `values` field ({@link TEMPLATE_FIELDS}), read after the environment's build
|
|
17
17
|
* command has run. A path with the `archive:` prefix names the file after it.
|
|
18
|
-
*
|
|
18
|
+
*
|
|
19
|
+
* Since #4155 a cut also records the other local paths a deploy step names
|
|
20
|
+
* ({@link recordedInputRefs}: a Helm chart, a kustomize directory, a sync's
|
|
21
|
+
* source tree, the fields `./deploy-inputs.ts` lists). A directory is
|
|
22
|
+
* recorded file by file and named in the target's `trees`; a file that is not
|
|
23
|
+
* UTF-8 is recorded as base64. Such a path that does not exist after the
|
|
24
|
+
* build, as a chart named from a repository, is not recorded, and the
|
|
25
|
+
* promote leaves it as written.
|
|
19
26
|
*
|
|
20
27
|
* A project with no components (#4046) is compiled the way `chant build --env
|
|
21
28
|
* <env> -o <output>` builds it ({@link compileBuildOutput}): every file that
|
|
@@ -28,7 +35,7 @@ import { type DriverComponent, type DriverStep } from "./driver.js";
|
|
|
28
35
|
import type { CapabilityRegistry } from "./capability.js";
|
|
29
36
|
import type { ReleaseArtifact, ReleaseParam } from "../lifecycle/release-store.js";
|
|
30
37
|
/** The deploy step fields whose literal file paths are a component's templates. */
|
|
31
|
-
export
|
|
38
|
+
export { TEMPLATE_FIELDS } from "./deploy-inputs.js";
|
|
32
39
|
/** One template a component's deploy reads, as the step names it. */
|
|
33
40
|
export interface TemplateRef {
|
|
34
41
|
component: string;
|
|
@@ -44,7 +51,9 @@ export interface TemplateRef {
|
|
|
44
51
|
export interface CompiledTemplate {
|
|
45
52
|
component: string | null;
|
|
46
53
|
path: string;
|
|
54
|
+
/** The text, or the base64 of the bytes under `encoding: "base64"`. */
|
|
47
55
|
content: string;
|
|
56
|
+
encoding?: "base64";
|
|
48
57
|
}
|
|
49
58
|
/** What one environment compiles to. */
|
|
50
59
|
export interface CompiledTarget {
|
|
@@ -66,6 +75,11 @@ export interface CompiledTarget {
|
|
|
66
75
|
/** For each component, the file that declares it, relative to the member's directory. */
|
|
67
76
|
componentFiles: Record<string, string>;
|
|
68
77
|
templates: CompiledTemplate[];
|
|
78
|
+
/** The directories recorded file by file in `templates` (#4155). Absent from a compiler written before #4155. */
|
|
79
|
+
trees?: Array<{
|
|
80
|
+
component: string | null;
|
|
81
|
+
path: string;
|
|
82
|
+
}>;
|
|
69
83
|
}
|
|
70
84
|
/** Compiles a member for one environment, and builds its artifacts. The cut talks to a compiler only, so a test can hand it fixtures. */
|
|
71
85
|
export interface TargetCompiler {
|
|
@@ -74,6 +88,17 @@ export interface TargetCompiler {
|
|
|
74
88
|
}
|
|
75
89
|
/** The templates a component's deploy reads: literal paths in {@link TEMPLATE_FIELDS} of its steps other than build and publish steps. */
|
|
76
90
|
export declare function templateRefs(component: DriverComponent): TemplateRef[];
|
|
91
|
+
/** A path a deploy step names that a cut records (#4155): a {@link TemplateRef}, and whether its field is a template field, which must exist. */
|
|
92
|
+
export interface RecordedInputRef extends TemplateRef {
|
|
93
|
+
/** True for `template`, `manifest` and `values`, whose path must exist after the build. */
|
|
94
|
+
required: boolean;
|
|
95
|
+
}
|
|
96
|
+
/** Every literal path a component's deploy names that a cut records: {@link templateRefs}, plus each kind's own fields in `DEPLOY_INPUT_FIELDS`. */
|
|
97
|
+
export declare function recordedInputRefs(component: DriverComponent): RecordedInputRef[];
|
|
98
|
+
/** The fields of a step of `kind` whose paths a cut records and a promote points at the recorded copy. */
|
|
99
|
+
export declare function recordedFields(kind: string): string[];
|
|
100
|
+
/** A file's bytes as a template: its text when it is UTF-8, else base64. */
|
|
101
|
+
export declare function templateOf(component: string | null, path: string, file: string): CompiledTemplate;
|
|
77
102
|
/** A component's build-time steps ({@link BUILD_STEP_KINDS}), each as declared, in composition order. */
|
|
78
103
|
export declare function buildStepsOf(component: DriverComponent): DriverStep[];
|
|
79
104
|
/** A component's publish steps ({@link PUBLISH_STEP_KINDS}), each as declared, in composition order. */
|
|
@@ -98,7 +123,17 @@ export interface CompileInputs {
|
|
|
98
123
|
output?: string;
|
|
99
124
|
/** For a project with no components: build only this lexicon, as `chant build --lexicon` does. */
|
|
100
125
|
lexicon?: string;
|
|
126
|
+
/**
|
|
127
|
+
* The release's label (#4168, decision 5), passed to every compile and
|
|
128
|
+
* artifact build as `CHANT_RELEASE_LABEL`, so a version reaches the build
|
|
129
|
+
* without a version-bump commit. A build parameter reads it by declaring
|
|
130
|
+
* `env: "CHANT_RELEASE_LABEL"`, and a build step's own tool (cargo, npm)
|
|
131
|
+
* reads the variable. Unset for a cut with no label.
|
|
132
|
+
*/
|
|
133
|
+
releaseLabel?: string;
|
|
101
134
|
}
|
|
135
|
+
/** The variable a cut's label reaches the build through (#4168). */
|
|
136
|
+
export declare const RELEASE_LABEL_ENV = "CHANT_RELEASE_LABEL";
|
|
102
137
|
/**
|
|
103
138
|
* Where a project with no components writes its build output when the cut
|
|
104
139
|
* names no `-o`. YAML, since the k8s and helm serializers write YAML whatever
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-compile.d.ts","sourceRoot":"","sources":["../../src/components/release-compile.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"release-compile.d.ts","sourceRoot":"","sources":["../../src/components/release-compile.ts"],"names":[],"mappings":"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"}
|