@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
package/src/cli/parse-args.ts
CHANGED
|
@@ -69,6 +69,10 @@ const BOOLEAN_FLAGS = new Set([
|
|
|
69
69
|
"--setup-key",
|
|
70
70
|
"--trust",
|
|
71
71
|
"--unsigned",
|
|
72
|
+
"--in-place",
|
|
73
|
+
"--require-runner-start",
|
|
74
|
+
"--no-push",
|
|
75
|
+
"--no-require-review",
|
|
72
76
|
"--expire",
|
|
73
77
|
"--check-live",
|
|
74
78
|
"--check-snapshot",
|
|
@@ -406,9 +410,17 @@ export function parseArgs(args: string[]): ParsedArgs {
|
|
|
406
410
|
result.requireProvenance = true;
|
|
407
411
|
} else if (arg === "--pr-loop") {
|
|
408
412
|
result.prLoop = true;
|
|
413
|
+
} else if (arg === "--apply-on-merge") {
|
|
414
|
+
// `chant build --pr-loop --apply-on-merge` and `chant ci serve --apply-on-merge` (#4168): opt into applying on merge.
|
|
415
|
+
result.applyOnMerge = true;
|
|
409
416
|
} else if (arg === "--pr-build") {
|
|
410
417
|
// `chant build --pr-loop --pr-build` (#4088), and `chant ci run --pr-build` (#4094).
|
|
411
418
|
result.prBuild = true;
|
|
419
|
+
} else if (arg === "--build-command") {
|
|
420
|
+
// `chant ci serve --build-command <line>` (#4169): the line that builds a requested commit.
|
|
421
|
+
const line = args[++i];
|
|
422
|
+
if (line === undefined || line === "") throw new Error("--build-command needs a shell line: --build-command '<line>'");
|
|
423
|
+
result.ciBuildCommand = line;
|
|
412
424
|
} else if (arg === "--pr-build-command") {
|
|
413
425
|
const line = args[++i];
|
|
414
426
|
if (line === undefined || line === "") throw new Error("--pr-build-command needs a shell line: --pr-build-command '<line>'");
|
|
@@ -777,6 +789,22 @@ export function parseArgs(args: string[]): ParsedArgs {
|
|
|
777
789
|
} else if (arg === "--trust") {
|
|
778
790
|
// `chant ci serve|run --setup-key --trust` (#4099): list the key in .chant/trust.json on a branch.
|
|
779
791
|
result.trustKey = true;
|
|
792
|
+
} else if (arg === "--in-place") {
|
|
793
|
+
// `chant ci run --in-place` (#4156): run the job in this checkout, as a generated forge job does.
|
|
794
|
+
result.ciInPlace = true;
|
|
795
|
+
} else if (arg === "--require-runner-start") {
|
|
796
|
+
// `chant ci run --require-runner-start` (#4147): refuse the job unless a provisioner's runner-start statement names it.
|
|
797
|
+
result.requireRunnerStart = true;
|
|
798
|
+
} else if (arg === "--job") {
|
|
799
|
+
// `chant ci runner-start sign --job <json|@file>` (#4147): the CI job a runner was started for.
|
|
800
|
+
result.ciJob = args[++i];
|
|
801
|
+
if (!result.ciJob || result.ciJob.startsWith("-")) throw new Error("--job needs the job as JSON or @<file>: --job @job.json");
|
|
802
|
+
} else if (arg === "--no-push") {
|
|
803
|
+
// `chant ci run --no-push` (#4156): keep the run record on the local chant/lifecycle.
|
|
804
|
+
result.noPush = true;
|
|
805
|
+
} else if (arg === "--no-require-review") {
|
|
806
|
+
// `chant ci run apply --no-require-review` (#4156): the apply without pr-apply's --require-review, the default since #4168.
|
|
807
|
+
result.requireReview = false;
|
|
780
808
|
} else if (arg === "--unsigned") {
|
|
781
809
|
// `chant ci serve --unsigned` (#4099): serve without a runner key listed at the target's head.
|
|
782
810
|
result.unsigned = true;
|
package/src/cli/registry.ts
CHANGED
|
@@ -23,7 +23,7 @@ export interface ParsedArgs {
|
|
|
23
23
|
/** `--version` / `-V` (#2701): print the installed chant's version. */
|
|
24
24
|
version?: boolean;
|
|
25
25
|
report?: boolean;
|
|
26
|
-
/** `chant run` — force the local in-process executor (the default). */
|
|
26
|
+
/** `chant run` — force the local in-process executor (the default). `chant ci run --local` (#4161): run the job on this machine with no push, status or report upload. */
|
|
27
27
|
local?: boolean;
|
|
28
28
|
/**
|
|
29
29
|
* `chant run <op> --on <lexicon>` (#2121) — which runtime hosts the run.
|
|
@@ -311,7 +311,10 @@ export interface ParsedArgs {
|
|
|
311
311
|
/**
|
|
312
312
|
* `chant components pr-apply --require-review` (#3183) — count an approval
|
|
313
313
|
* only when its approver has a standing approving review on the pull
|
|
314
|
-
* request. Needs `--forge`.
|
|
314
|
+
* request. Needs `--forge`. `chant ci run apply --require-review`
|
|
315
|
+
* passes it on, and `chant build --pr-loop --require-review` generates a
|
|
316
|
+
* pipeline that does (#4168); `--no-require-review` (#4156) sets it false,
|
|
317
|
+
* which is the default.
|
|
315
318
|
*/
|
|
316
319
|
requireReview?: boolean;
|
|
317
320
|
/**
|
|
@@ -322,12 +325,20 @@ export interface ParsedArgs {
|
|
|
322
325
|
reportUrl?: string;
|
|
323
326
|
/**
|
|
324
327
|
* `chant build --components --generate <lexicon> --pr-loop` (#3183) —
|
|
325
|
-
* generate the pull-request pipeline: plan on the pull request,
|
|
326
|
-
* merge
|
|
328
|
+
* generate the pull-request pipeline: plan on the pull request, and on
|
|
329
|
+
* merge record the plan (#4168), or apply it with `--apply-on-merge`.
|
|
327
330
|
*/
|
|
328
331
|
prLoop?: boolean;
|
|
332
|
+
/**
|
|
333
|
+
* `chant build --pr-loop --apply-on-merge` and `chant ci serve
|
|
334
|
+
* --apply-on-merge` (#4168): on merge apply the approved plan, as before
|
|
335
|
+
* #4168, in place of recording it. Opt-in: a merge deploys nothing without it.
|
|
336
|
+
*/
|
|
337
|
+
applyOnMerge?: boolean;
|
|
329
338
|
/** `chant build --pr-loop --pr-build` (#4088) — build and lint before pr-plan and pr-apply. */
|
|
330
339
|
prBuild?: boolean;
|
|
340
|
+
/** `chant ci serve --build-command <line>` (#4169) — the line that builds a commit a `ci/build/<sha>` tag asks for, in a worktree of it. */
|
|
341
|
+
ciBuildCommand?: string;
|
|
331
342
|
/** `chant build --pr-loop --pr-build-command <line>` (#4088) — the build line to run in place of `chant build --env <env>`. */
|
|
332
343
|
prBuildCommand?: string;
|
|
333
344
|
/**
|
|
@@ -466,7 +477,7 @@ export interface ParsedArgs {
|
|
|
466
477
|
ciSecrets?: string;
|
|
467
478
|
/** `chant ci workflow --chant <command>` (#3573): the command the tick step runs chant with, in place of the npx pin. Also `chant ci run --chant` (#4094): what runs chant in the job. */
|
|
468
479
|
ciChant?: string;
|
|
469
|
-
/** `chant ci run|serve --no-status` (#4097): post no commit status for the job. */
|
|
480
|
+
/** `chant ci run|serve --no-status` (#4097): post no commit status for the job. `chant components pr-plan|pr-apply --no-status` (#4161): post neither the status nor the note. */
|
|
470
481
|
noStatus?: boolean;
|
|
471
482
|
/** `chant ci run|serve --status-url <template>` (#4097): the link a job's status carries. `{key}` is `<pr>/<commit>[/<member>]`, as `--report-url` keys it. */
|
|
472
483
|
statusUrl?: string;
|
|
@@ -502,8 +513,20 @@ export interface ParsedArgs {
|
|
|
502
513
|
setupKey?: boolean;
|
|
503
514
|
/** `chant ci serve|run --setup-key --trust` (#4099): list the runner key in .chant/trust.json on a branch pushed for review. */
|
|
504
515
|
trustKey?: boolean;
|
|
505
|
-
/**
|
|
516
|
+
/**
|
|
517
|
+
* `chant ci serve --unsigned` (#4099): serve without signing. Since #4156
|
|
518
|
+
* that is the default without a trusted key, so it only skips the key, and
|
|
519
|
+
* is ignored when ci.green.signedSince requires signed runs.
|
|
520
|
+
*/
|
|
506
521
|
unsigned?: boolean;
|
|
522
|
+
/** `chant ci run --in-place` (#4156): run the job in this checkout at HEAD, as a generated forge job does. */
|
|
523
|
+
ciInPlace?: boolean;
|
|
524
|
+
/** `chant ci run --require-runner-start` (#4147): refuse the job unless a runner-start statement names it. */
|
|
525
|
+
requireRunnerStart?: boolean;
|
|
526
|
+
/** `chant ci runner-start sign --job <json|@file>` (#4147): the CI job a runner was started for. */
|
|
527
|
+
ciJob?: string;
|
|
528
|
+
/** `chant ci run --no-push` (#4156): write the run record on the local chant/lifecycle and push nothing. */
|
|
529
|
+
noPush?: boolean;
|
|
507
530
|
/** `chant ci serve|run --setup-key --trust --principal <name>` (#4099): the principal the runner key is listed for. */
|
|
508
531
|
ciPrincipal?: string;
|
|
509
532
|
/** `chant workspace trust runner add <principal> --class runner|service` (#3510): the runner entry's class. */
|
|
@@ -757,8 +780,12 @@ export interface ResolvedCommand {
|
|
|
757
780
|
* Supports compound commands like "dev generate" where args.command="dev"
|
|
758
781
|
* and args.path="generate". Falls back to simple command matching.
|
|
759
782
|
*/
|
|
760
|
-
/**
|
|
761
|
-
|
|
783
|
+
/**
|
|
784
|
+
* Command aliases. `chant lc …` is sugar for `chant lifecycle …`, and
|
|
785
|
+
* `chant sync` for `chant update`, the command that syncs lexicon types
|
|
786
|
+
* (chant #3988).
|
|
787
|
+
*/
|
|
788
|
+
const COMMAND_ALIASES: Record<string, string> = { lc: "lifecycle", sync: "update" };
|
|
762
789
|
|
|
763
790
|
export function resolveCommand(args: ParsedArgs, registry: CommandDef[]): ResolvedCommand | null {
|
|
764
791
|
const command = COMMAND_ALIASES[args.command] ?? args.command;
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import { createRequire } from "module";
|
|
17
|
-
import { listRuleFiles } from "../lint/discover";
|
|
17
|
+
import { listRuleFiles, ruleModuleBase } from "../lint/discover";
|
|
18
18
|
import { isPostSynthCheck } from "../lint/post-synth";
|
|
19
19
|
|
|
20
20
|
export interface BarrelEntry {
|
|
@@ -34,7 +34,7 @@ export function scanPostSynthChecks(dir: string, importMetaUrl: string): BarrelE
|
|
|
34
34
|
const require = createRequire(importMetaUrl);
|
|
35
35
|
const entries: BarrelEntry[] = [];
|
|
36
36
|
for (const file of listRuleFiles(dir)) {
|
|
37
|
-
const base = file
|
|
37
|
+
const base = ruleModuleBase(file);
|
|
38
38
|
let mod: Record<string, unknown>;
|
|
39
39
|
try {
|
|
40
40
|
mod = require(`${dir}/${base}`) as Record<string, unknown>;
|
|
@@ -402,7 +402,7 @@ function runExampleHarness(lexiconDir: string, verbose: boolean): RegenFailure |
|
|
|
402
402
|
/**
|
|
403
403
|
* Extract the fresh surface from the generated artifacts in the lexicon directory.
|
|
404
404
|
*/
|
|
405
|
-
function extractFreshSurface(lexiconDir: string): SurfaceSnapshot | null {
|
|
405
|
+
export function extractFreshSurface(lexiconDir: string): SurfaceSnapshot | null {
|
|
406
406
|
const generatedDir = join(lexiconDir, "src", "generated");
|
|
407
407
|
if (!existsSync(generatedDir)) return null;
|
|
408
408
|
|
|
@@ -29,7 +29,7 @@ import { regenLexicon, type RegenResult } from "./lexicon-regen";
|
|
|
29
29
|
import { fetchWithRetry } from "./fetch";
|
|
30
30
|
import { isLexiconPlugin, type UpstreamPin } from "../lexicon";
|
|
31
31
|
import { importLexiconPackage } from "../lexicon-module";
|
|
32
|
-
import {
|
|
32
|
+
import { ensureTypeScriptLoaderFor } from "../ts-loader";
|
|
33
33
|
|
|
34
34
|
// ── Public types ──────────────────────────────────────────────────────
|
|
35
35
|
|
|
@@ -252,7 +252,7 @@ export async function loadUpstreamPins(lexicon: LexiconId, lexiconDir?: string):
|
|
|
252
252
|
const entry = lexiconDir ? lexiconEntry(lexiconDir) : null;
|
|
253
253
|
if (entry) {
|
|
254
254
|
try {
|
|
255
|
-
|
|
255
|
+
ensureTypeScriptLoaderFor(entry);
|
|
256
256
|
const pins = pinsOf((await import(pathToFileURL(entry).href)) as Record<string, unknown>);
|
|
257
257
|
if (pins.length > 0) return pins;
|
|
258
258
|
} catch {
|
|
@@ -26,17 +26,12 @@ describe("post-synth barrel is exported", () => {
|
|
|
26
26
|
test.each(lexiconDirs)("%s exports ./lint/post-synth", (lexicon) => {
|
|
27
27
|
const pkg = JSON.parse(readFileSync(join(lexiconsDir, lexicon, "package.json"), "utf-8"));
|
|
28
28
|
const entry = pkg.exports?.["./lint/post-synth"];
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
} else {
|
|
36
|
-
expect(entry?.development).toBe("./src/lint/post-synth/index.ts");
|
|
37
|
-
expect(entry?.types).toBe("./dist/lint/post-synth/index.d.ts");
|
|
38
|
-
expect(entry?.default).toBe("./src/lint/post-synth/index.ts");
|
|
39
|
-
}
|
|
29
|
+
// A conditional export: `types` resolves to the emitted declaration,
|
|
30
|
+
// `development` keeps the repository's own resolution on source, and
|
|
31
|
+
// `default` is the compiled JS the package publishes (#3981).
|
|
32
|
+
expect(entry?.development).toBe("./src/lint/post-synth/index.ts");
|
|
33
|
+
expect(entry?.types).toBe("./dist/lint/post-synth/index.d.ts");
|
|
34
|
+
expect(entry?.default).toBe("./dist/lint/post-synth/index.js");
|
|
40
35
|
});
|
|
41
36
|
});
|
|
42
37
|
|
|
@@ -43,7 +43,9 @@ export interface DeployContext {
|
|
|
43
43
|
* (#3049), keyed by {@link CapabilityPlan.member}. Set by a gated-wave
|
|
44
44
|
* fan-out and by a pull request's apply (#3183). A capability whose `run`
|
|
45
45
|
* finds its own member here applies that plan, the one the approver
|
|
46
|
-
* approved, instead of planning again.
|
|
46
|
+
* approved, instead of planning again. A `run` that finds the target moved
|
|
47
|
+
* since that plan refuses with an error {@link isPlanMovedError} accepts
|
|
48
|
+
* (#3997), and the command that applied it exits 3, as for a moved digest.
|
|
47
49
|
*/
|
|
48
50
|
plans?: Record<string, unknown>;
|
|
49
51
|
/**
|
|
@@ -90,6 +92,27 @@ export interface CapabilityPlan {
|
|
|
90
92
|
* still counts toward the digest, with no entries.
|
|
91
93
|
*/
|
|
92
94
|
changeSet?: ChangeSetPart;
|
|
95
|
+
/**
|
|
96
|
+
* The outputs `run` will expose once it applies this plan (#3999), as far
|
|
97
|
+
* as the plan can tell. A pull request's plan reads a dependent's
|
|
98
|
+
* `stackOutput()` references into this member from here when both are in
|
|
99
|
+
* the change, instead of from the outputs standing now. Absent when the
|
|
100
|
+
* plan cannot say: every output of the step is then known only after it
|
|
101
|
+
* applies.
|
|
102
|
+
*/
|
|
103
|
+
outputs?: PlannedOutputs;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* What a plan says about the outputs its apply will leave (#3999). An
|
|
108
|
+
* output named in neither field is known only after apply, the same as one
|
|
109
|
+
* in `unknown`.
|
|
110
|
+
*/
|
|
111
|
+
export interface PlannedOutputs {
|
|
112
|
+
/** Each output whose value the plan knows, by name: what `run` will expose. */
|
|
113
|
+
known: Record<string, unknown>;
|
|
114
|
+
/** Outputs the plan names whose value is known only after apply, sorted. */
|
|
115
|
+
unknown: string[];
|
|
93
116
|
}
|
|
94
117
|
|
|
95
118
|
/**
|
|
@@ -136,8 +159,11 @@ export interface Capability<In = unknown, Out = unknown> {
|
|
|
136
159
|
/**
|
|
137
160
|
* Optional: the outputs `run` exposed when it last ran, read without
|
|
138
161
|
* changing anything (#3183). A pull request's plan reads them for each
|
|
139
|
-
* component a planned one depends on
|
|
140
|
-
*
|
|
162
|
+
* component a planned one depends on that the change does not plan
|
|
163
|
+
* (#4104), so a `stackOutput()` wiring resolves to the value standing now.
|
|
164
|
+
* A dependency the change plans is read from its plan's
|
|
165
|
+
* {@link CapabilityPlan.outputs} instead (#3999). The shape is `run`'s
|
|
166
|
+
* `outputs` field.
|
|
141
167
|
*/
|
|
142
168
|
outputs?(ctx: DeployContext, input: In): Promise<Record<string, unknown>>;
|
|
143
169
|
/**
|
|
@@ -160,6 +186,28 @@ export type CapabilityInput<C> = C extends Capability<infer In, unknown> ? In :
|
|
|
160
186
|
/** Extract a capability's `Out` type. */
|
|
161
187
|
export type CapabilityOutput<C> = C extends Capability<unknown, infer Out> ? Out : never;
|
|
162
188
|
|
|
189
|
+
/**
|
|
190
|
+
* The exit code of a command whose capability step refused a plan that moved
|
|
191
|
+
* since it was approved: 3, the code `pr-apply` gives a moved digest and a
|
|
192
|
+
* run gives a gate (#3997).
|
|
193
|
+
*/
|
|
194
|
+
export const PLAN_MOVED_EXIT_CODE = 3;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Whether `err` is a `run`'s refusal to apply a plan from
|
|
198
|
+
* `DeployContext.plans` because the target moved since it was planned
|
|
199
|
+
* (#3997). The mark is a `planMoved: true` property, not a class, so a
|
|
200
|
+
* lexicon built against an older core can set it. An `exitCode` of
|
|
201
|
+
* {@link PLAN_MOVED_EXIT_CODE} on the error is the same mark. Any other
|
|
202
|
+
* `exitCode` is ignored: a failed step exits 1, so a capability can't pick
|
|
203
|
+
* the process's exit code.
|
|
204
|
+
*/
|
|
205
|
+
export function isPlanMovedError(err: unknown): boolean {
|
|
206
|
+
if (typeof err !== "object" || err === null) return false;
|
|
207
|
+
const e = err as { planMoved?: unknown; exitCode?: unknown };
|
|
208
|
+
return e.planMoved === true || e.exitCode === PLAN_MOVED_EXIT_CODE;
|
|
209
|
+
}
|
|
210
|
+
|
|
163
211
|
/**
|
|
164
212
|
* Thrown by a stub `run`/`rollback` — the verb is specified and typed but has
|
|
165
213
|
* no cloud implementation yet. Distinguishes "not implemented" from a runtime
|
|
@@ -9,7 +9,7 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
|
9
9
|
import { tmpdir } from "node:os";
|
|
10
10
|
import { dirname, join } from "node:path";
|
|
11
11
|
import { afterAll, describe, expect, test } from "vitest";
|
|
12
|
-
import { changedFilesBetween } from "./changed-files";
|
|
12
|
+
import { changedFilesBetween, EMPTY_TREE_SHA, resolveMergeBase } from "./changed-files";
|
|
13
13
|
|
|
14
14
|
const repo = mkdtempSync(join(tmpdir(), "chant-changed-files-"));
|
|
15
15
|
afterAll(() => rmSync(repo, { recursive: true, force: true }));
|
|
@@ -56,3 +56,18 @@ describe("changedFilesBetween", () => {
|
|
|
56
56
|
]);
|
|
57
57
|
});
|
|
58
58
|
});
|
|
59
|
+
|
|
60
|
+
describe("the empty tree as the base (a root commit, #4004)", () => {
|
|
61
|
+
test("is its own merge base, and every file the head holds counts as changed", async () => {
|
|
62
|
+
expect(await resolveMergeBase(repo, EMPTY_TREE_SHA, "HEAD")).toBe(EMPTY_TREE_SHA);
|
|
63
|
+
expect(await changedFilesBetween(repo, EMPTY_TREE_SHA)).toEqual([
|
|
64
|
+
"apps/web/main.tf",
|
|
65
|
+
"infra/network/roots/vpc/main.tf",
|
|
66
|
+
"shared/modules/base/main.tf",
|
|
67
|
+
]);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("is git's own empty tree", () => {
|
|
71
|
+
expect(git("hash-object", "-t", "tree", "/dev/null")).toBe(EMPTY_TREE_SHA);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -20,13 +20,21 @@ async function git(cwd: string, args: string[]): Promise<string> {
|
|
|
20
20
|
return stdout;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Git's empty tree. A root commit has no parent, so a push of one is measured
|
|
25
|
+
* from this (#4004): every file it holds counts as changed.
|
|
26
|
+
*/
|
|
27
|
+
export const EMPTY_TREE_SHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
28
|
+
|
|
23
29
|
/**
|
|
24
30
|
* The commit a change is measured from: the merge base of `base` and `head`.
|
|
25
31
|
* A pull request's head that branched before `base` moved is measured from
|
|
26
32
|
* where it branched, so the other changes on `base` are not counted as its
|
|
27
|
-
* own; a merge commit's first parent is its own merge base.
|
|
33
|
+
* own; a merge commit's first parent is its own merge base. The empty tree
|
|
34
|
+
* has no merge base with anything and is returned as it is.
|
|
28
35
|
*/
|
|
29
36
|
export async function resolveMergeBase(cwd: string, base: string, head = "HEAD"): Promise<string> {
|
|
37
|
+
if (base === EMPTY_TREE_SHA) return base;
|
|
30
38
|
try {
|
|
31
39
|
return (await git(cwd, ["merge-base", base, head])).trim();
|
|
32
40
|
} catch (err) {
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
6
|
+
import { componentDeployInputs, directoryDigest, directoryFiles, stepInputRefs } from "./deploy-inputs";
|
|
7
|
+
import { componentPlanDigest } from "./gate-plan";
|
|
8
|
+
import type { DriverComponent, DriverPhase } from "./driver";
|
|
9
|
+
|
|
10
|
+
let root: string;
|
|
11
|
+
|
|
12
|
+
const write = (path: string, content: string): void => {
|
|
13
|
+
mkdirSync(dirname(join(root, path)), { recursive: true });
|
|
14
|
+
writeFileSync(join(root, path), content);
|
|
15
|
+
};
|
|
16
|
+
const deploy = (...steps: Array<Record<string, unknown>>): DriverPhase[] => [{ phase: "Deploy", steps: steps as never }];
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
root = mkdtempSync(join(tmpdir(), "deploy-inputs-"));
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
rmSync(root, { recursive: true, force: true });
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("stepInputRefs", () => {
|
|
27
|
+
test("a kind's own fields and the template fields, literal paths only", () => {
|
|
28
|
+
const refs = stepInputRefs("Deploy", { kind: "helm-upgrade", release: "web", chart: "chart", values: ["a.yaml", "@Cfg.values"] } as never);
|
|
29
|
+
expect(refs.map((r) => [r.field, r.path])).toEqual([["values", "a.yaml"], ["chart", "chart"]]);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("an archive path or a wired value is a build output and is not named", () => {
|
|
33
|
+
expect(stepInputRefs("Deploy", { kind: "cfn-deploy", template: "archive:stack.json" } as never)).toEqual([]);
|
|
34
|
+
expect(stepInputRefs("Deploy", { kind: "s3-sync", from: "@Build.dir", to: "s3://b" } as never)).toEqual([]);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("a Docker build's Dockerfile is named under its context", () => {
|
|
38
|
+
const refs = stepInputRefs("Build", { kind: "docker-build", context: "app", dockerfile: "Dockerfile.prod" } as never);
|
|
39
|
+
expect(refs.map((r) => r.path)).toEqual(["app", "app/Dockerfile.prod"]);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
describe("componentDeployInputs", () => {
|
|
44
|
+
test("a file by its bytes, a directory by its files; a missing path is left out", () => {
|
|
45
|
+
write("values.yaml", "a: 1\n");
|
|
46
|
+
write("chart/Chart.yaml", "name: c\n");
|
|
47
|
+
const read = componentDeployInputs(deploy({ kind: "helm-upgrade", chart: "chart", values: ["values.yaml", "gone.yaml"] }), root);
|
|
48
|
+
expect(read.inputs.map((i) => i.path)).toEqual(["chart", "values.yaml"]);
|
|
49
|
+
expect(read.inputs.find((i) => i.path === "values.yaml")?.digest).toMatch(/^sha256:[0-9a-f]{64}$/);
|
|
50
|
+
expect(read.unbound).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("a directory's digest moves with a file's bytes, a new file and a renamed one", () => {
|
|
54
|
+
write("site/index.html", "<h1>a</h1>");
|
|
55
|
+
const before = directoryDigest(root, "site");
|
|
56
|
+
write("site/index.html", "<h1>b</h1>");
|
|
57
|
+
const edited = directoryDigest(root, "site");
|
|
58
|
+
expect(edited).not.toBe(before);
|
|
59
|
+
write("site/about.html", "x");
|
|
60
|
+
expect(directoryDigest(root, "site")).not.toBe(edited);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("the same files under another parent hash the same: the digest reads paths from the directory", () => {
|
|
64
|
+
write("a/chart/Chart.yaml", "name: c\n");
|
|
65
|
+
write("b/chart/Chart.yaml", "name: c\n");
|
|
66
|
+
expect(directoryDigest(root, "a/chart")).toBe(directoryDigest(root, "b/chart"));
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("in a git repository, a directory leaves out what git ignores, and a directory git ignores is a build output", () => {
|
|
70
|
+
execFileSync("git", ["init", "-q"], { cwd: root });
|
|
71
|
+
write(".gitignore", "node_modules/\ndist/\n");
|
|
72
|
+
write("app/server.js", "1");
|
|
73
|
+
write("app/node_modules/dep/index.js", "1");
|
|
74
|
+
write("dist/index.html", "1");
|
|
75
|
+
expect(directoryFiles(root, "app")).toEqual(["app/server.js"]);
|
|
76
|
+
const read = componentDeployInputs(deploy({ kind: "docker-build", context: "app" }, { kind: "s3-sync", from: "dist", to: "s3://b" }), root);
|
|
77
|
+
expect(read.inputs.map((i) => i.path)).toEqual(["app"]);
|
|
78
|
+
expect(read.unbound).toEqual([{ phase: "Deploy", kind: "s3-sync", reason: expect.stringMatching(/"dist" is a directory git ignores, so a build output/) }]);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("a file git ignores is still hashed when a step names it, as a template chant build writes", () => {
|
|
82
|
+
execFileSync("git", ["init", "-q"], { cwd: root });
|
|
83
|
+
write(".gitignore", "dist/\n");
|
|
84
|
+
write("dist/stack.json", "{}");
|
|
85
|
+
expect(componentDeployInputs(deploy({ kind: "cfn-deploy", template: "dist/stack.json" }), root).inputs.map((i) => i.path)).toEqual(["dist/stack.json"]);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("a shell step is unbound; `include` limits the steps read", () => {
|
|
89
|
+
write("chart/Chart.yaml", "x");
|
|
90
|
+
const phases = deploy({ kind: "shell", cmd: "./go.sh", reason: "t" }, { kind: "helm-upgrade", chart: "chart" });
|
|
91
|
+
expect(componentDeployInputs(phases, root).unbound.map((u) => u.kind)).toEqual(["shell"]);
|
|
92
|
+
expect(componentDeployInputs(phases, root, (s) => s.kind !== "helm-upgrade").inputs).toEqual([]);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe("componentPlanDigest with inputs", () => {
|
|
97
|
+
const component: DriverComponent = { name: "web", dependsOn: [], deploy: deploy({ kind: "helm-upgrade", chart: "chart" }) };
|
|
98
|
+
|
|
99
|
+
test("no inputs keeps the digest a composition had before #4155", () => {
|
|
100
|
+
expect(componentPlanDigest({ environment: "prod", component, inputs: [] })).toBe(componentPlanDigest({ environment: "prod", component }));
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("an input's digest moves the plan digest", () => {
|
|
104
|
+
const a = componentPlanDigest({ environment: "prod", component, inputs: [{ path: "chart", digest: "sha256:aa" }] });
|
|
105
|
+
const b = componentPlanDigest({ environment: "prod", component, inputs: [{ path: "chart", digest: "sha256:bb" }] });
|
|
106
|
+
expect(a).not.toBe(b);
|
|
107
|
+
});
|
|
108
|
+
});
|