@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
|
@@ -15,7 +15,7 @@ import { join } from "node:path";
|
|
|
15
15
|
import { afterAll, beforeAll, describe, expect, test } from "vitest";
|
|
16
16
|
import { cleanScratch, declaration, git, repoFixture, scratchDir, writeFiles } from "./__fixtures__/contract-repo";
|
|
17
17
|
import { ciServeInterval, ciServeKey, ciServePass, formatCiServeEvent, readCiServeState, type CiServeEvent, type CiServeForge, type CiServeOptions } from "./ci-serve";
|
|
18
|
-
import { ciRun } from "./ci-run";
|
|
18
|
+
import { ciRun, type CiRunResult } from "./ci-run";
|
|
19
19
|
import { acquireLease, releaseLease } from "../lifecycle/lease";
|
|
20
20
|
import { prApplyGroup, prApplyRecordKey } from "../components/pr-pipeline";
|
|
21
21
|
import { parseArgs } from "../cli/parse-args";
|
|
@@ -23,9 +23,9 @@ import { forgejoForge, githubForge, type ForgeFetch, type OpenPullRequest } from
|
|
|
23
23
|
|
|
24
24
|
afterAll(cleanScratch);
|
|
25
25
|
|
|
26
|
-
function commit(root: string, file: string): string {
|
|
26
|
+
function commit(root: string, file: string, message = file): string {
|
|
27
27
|
writeFiles(root, { [file]: `${file} ${Math.random()}\n` });
|
|
28
|
-
for (const args of [["add", "-A"], ["commit", "-q", "-m",
|
|
28
|
+
for (const args of [["add", "-A"], ["commit", "-q", "-m", message]]) {
|
|
29
29
|
execFileSync("git", ["-c", "user.name=t", "-c", "user.email=t@example.com", "-c", "commit.gpgsign=false", ...args], { cwd: root, stdio: "ignore" });
|
|
30
30
|
}
|
|
31
31
|
return git(root, "rev-parse", "HEAD");
|
|
@@ -53,11 +53,12 @@ const workspaceTemplate = repoFixture(() => {
|
|
|
53
53
|
}, "chant-ci-serve-");
|
|
54
54
|
|
|
55
55
|
/** A copy of the template, its origin pointed at the copy of the bare one. */
|
|
56
|
-
function workspace(): { root: string; app: string; main: string } {
|
|
56
|
+
function workspace(): { root: string; app: string; main: string; origin: string } {
|
|
57
57
|
const top = workspaceTemplate();
|
|
58
58
|
const root = join(top, "root");
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
const origin = join(top, "origin");
|
|
60
|
+
git(root, "remote", "set-url", "origin", origin);
|
|
61
|
+
return { root, app: join(root, "app"), main: git(root, "rev-parse", "HEAD"), origin };
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
/** A pull request's head commit, on a branch off main, pushed to the forge's refs/pull/<n>/head. */
|
|
@@ -142,6 +143,8 @@ function serve(app: string, client: CiServeForge, extra: Partial<CiServeOptions>
|
|
|
142
143
|
client,
|
|
143
144
|
stateDir: state,
|
|
144
145
|
holder: "serve-test",
|
|
146
|
+
// Most tests here cover the apply on merge, which #4168 made opt-in; the record tests pass false.
|
|
147
|
+
applyOnMerge: true,
|
|
145
148
|
// A job image of its own, so no setup line downloads OpenTofu.
|
|
146
149
|
job: { image: "chant-ci-serve-test:local", chant: fakeChant(), hostEnv: env, passEnv: Object.keys(hostEnv ?? {}) },
|
|
147
150
|
log: (e) => events.push(e),
|
|
@@ -150,9 +153,89 @@ function serve(app: string, client: CiServeForge, extra: Partial<CiServeOptions>
|
|
|
150
153
|
};
|
|
151
154
|
}
|
|
152
155
|
|
|
156
|
+
const EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
157
|
+
|
|
158
|
+
/** A commit on no branch, with `parent` when given, as a ledger commit stands in. */
|
|
159
|
+
const ledgerCommit = (root: string, message: string, parent?: string): string => git(root, "commit-tree", EMPTY_TREE, ...(parent ? ["-p", parent] : []), "-m", message);
|
|
160
|
+
|
|
161
|
+
/** Seed `chant/lifecycle` in the clone and on the forge, as an earlier apply left it. */
|
|
162
|
+
function seedLedger(root: string): string {
|
|
163
|
+
const seed = ledgerCommit(root, "seed");
|
|
164
|
+
git(root, "update-ref", "refs/heads/chant/lifecycle", seed);
|
|
165
|
+
git(root, "push", "-q", "origin", "chant/lifecycle");
|
|
166
|
+
expect(git(root, "rev-parse", "refs/remotes/origin/chant/lifecycle")).toBe(seed);
|
|
167
|
+
return seed;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const isAncestor = (cwd: string, a: string, b: string): boolean => {
|
|
171
|
+
try {
|
|
172
|
+
git(cwd, "merge-base", "--is-ancestor", a, b);
|
|
173
|
+
return true;
|
|
174
|
+
} catch {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
153
179
|
const argsOf = (report: string, stage: string): string[] => readFileSync(join(report, `${stage}.args`), "utf-8").trimEnd().split("\n");
|
|
154
180
|
const ofType = <T extends CiServeEvent["type"]>(events: CiServeEvent[], type: T) => events.filter((e): e is Extract<CiServeEvent, { type: T }> => e.type === type);
|
|
155
181
|
|
|
182
|
+
describe("ci serve records each merge unless apply on merge is opted in (#4168)", () => {
|
|
183
|
+
test("a merge to the target branch gets the record job, measured from the head before it, and no resume record", async () => {
|
|
184
|
+
const { root, app, main } = workspace();
|
|
185
|
+
const forge = fakeForge(main);
|
|
186
|
+
const { opts, events, state } = serve(app, forge, { applyOnMerge: false });
|
|
187
|
+
await ciServePass(opts);
|
|
188
|
+
const merged = commit(root, "app/merged.txt");
|
|
189
|
+
git(root, "push", "-q", "origin", "main");
|
|
190
|
+
forge.head = merged;
|
|
191
|
+
forge.merges.set(merged, 21);
|
|
192
|
+
|
|
193
|
+
const pass = await ciServePass(opts);
|
|
194
|
+
expect(pass.jobs).toEqual([expect.objectContaining({ job: "record", commit: merged, base: main, pr: 21, status: "ok" })]);
|
|
195
|
+
const argv = argsOf(pass.jobs[0]!.report!, "pr-record");
|
|
196
|
+
expect(argv.slice(0, 4)).toEqual(["components", "pr-record", "--base", main]);
|
|
197
|
+
expect(argv).not.toContain("--resume");
|
|
198
|
+
expect(ofType(events, "started")[0]).not.toHaveProperty("resume");
|
|
199
|
+
expect(existsSync(join(state, "resume"))).toBe(false);
|
|
200
|
+
const saved = readCiServeState(join(state, `${prApplyGroup("prod", "app")}.json`), { forge: "forgejo", repo: "demo/estate", env: "prod", branch: "main" });
|
|
201
|
+
expect(saved.target).toBe(merged);
|
|
202
|
+
expect(saved.jobs[ciServeKey({ job: "record", commit: merged })]).toMatchObject({ status: "ok" });
|
|
203
|
+
expect((await ciServePass(opts)).jobs).toEqual([]);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("each settled job runs the tick, and a tick that fails is an error event, never a failed job", async () => {
|
|
207
|
+
const { root, app, main } = workspace();
|
|
208
|
+
const forge = fakeForge(main);
|
|
209
|
+
const ticks: string[] = [];
|
|
210
|
+
let fail = false;
|
|
211
|
+
const { opts, events } = serve(app, forge, {
|
|
212
|
+
applyOnMerge: false,
|
|
213
|
+
tick: async () => {
|
|
214
|
+
ticks.push("tick");
|
|
215
|
+
if (fail) throw new Error("forge said no");
|
|
216
|
+
return ["ci/green/abc"];
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
await ciServePass(opts);
|
|
220
|
+
expect(ticks).toEqual([]);
|
|
221
|
+
const merged = commit(root, "app/merged.txt");
|
|
222
|
+
git(root, "push", "-q", "origin", "main");
|
|
223
|
+
forge.head = merged;
|
|
224
|
+
await ciServePass(opts);
|
|
225
|
+
expect(ticks).toEqual(["tick"]);
|
|
226
|
+
expect(ofType(events, "tick")).toEqual([{ type: "tick", made: ["ci/green/abc"] }]);
|
|
227
|
+
expect(formatCiServeEvent({ type: "tick", made: ["ci/green/abc"] })).toBe("ci tick made ci/green/abc");
|
|
228
|
+
|
|
229
|
+
fail = true;
|
|
230
|
+
const next = commit(root, "app/next.txt");
|
|
231
|
+
git(root, "push", "-q", "origin", "main");
|
|
232
|
+
forge.head = next;
|
|
233
|
+
const pass = await ciServePass(opts);
|
|
234
|
+
expect(pass.jobs[0]).toMatchObject({ job: "record", status: "ok" });
|
|
235
|
+
expect(ofType(events, "error").map((e) => e.message)).toContain("ci tick after a job settled: forge said no");
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
156
239
|
describe("chant ci serve (#4095)", () => {
|
|
157
240
|
test("one poll plans a new pull request head once, and skips forks and authors not given", async () => {
|
|
158
241
|
const { root, app, main } = workspace();
|
|
@@ -365,3 +448,123 @@ describe("chant ci serve (#4095)", () => {
|
|
|
365
448
|
expect(() => ciServeInterval("0")).toThrow(/a second or more/);
|
|
366
449
|
});
|
|
367
450
|
});
|
|
451
|
+
|
|
452
|
+
describe("ci serve follows the forge's chant/lifecycle (#4121)", () => {
|
|
453
|
+
/** A serve past its baseline pass, with one merge waiting to apply, and each run's result in `results`. */
|
|
454
|
+
async function mergeWaiting() {
|
|
455
|
+
const w = workspace();
|
|
456
|
+
const seed = seedLedger(w.root);
|
|
457
|
+
const forge = fakeForge(w.main);
|
|
458
|
+
const results: CiRunResult[] = [];
|
|
459
|
+
const { opts, events } = serve(w.app, forge, { run: async (req) => { const r = await ciRun(req); results.push(r); return r; } });
|
|
460
|
+
await ciServePass(opts);
|
|
461
|
+
const merged = commit(w.root, "app/merged.txt");
|
|
462
|
+
git(w.root, "push", "-q", "origin", "main");
|
|
463
|
+
forge.head = merged;
|
|
464
|
+
return { ...w, seed, opts, events, results };
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
test("a ledger the forge deleted is deleted here, and the next apply runs clean", async () => {
|
|
468
|
+
const { root, origin, seed, opts, events, results } = await mergeWaiting();
|
|
469
|
+
git(origin, "update-ref", "-d", "refs/heads/chant/lifecycle");
|
|
470
|
+
|
|
471
|
+
const pass = await ciServePass(opts);
|
|
472
|
+
expect(ofType(events, "ledger")).toEqual([{ type: "ledger", action: "deleted", local: seed }]);
|
|
473
|
+
expect(formatCiServeEvent(ofType(events, "ledger")[0]!)).toContain("was deleted");
|
|
474
|
+
expect(pass.jobs).toEqual([expect.objectContaining({ job: "apply", status: "ok" })]);
|
|
475
|
+
expect(results[0]).toMatchObject({ pushed: true });
|
|
476
|
+
const tip = git(origin, "rev-parse", "refs/heads/chant/lifecycle");
|
|
477
|
+
expect(git(root, "rev-parse", "chant/lifecycle")).toBe(tip);
|
|
478
|
+
expect(isAncestor(origin, seed, tip)).toBe(false);
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
test("a ledger the forge rewrote is reset to the forge's and not pushed back", async () => {
|
|
482
|
+
const { root, origin, seed, opts, events, results } = await mergeWaiting();
|
|
483
|
+
const rewritten = ledgerCommit(root, "rewritten");
|
|
484
|
+
git(root, "push", "-q", "origin", `${rewritten}:refs/scratch/rewritten`);
|
|
485
|
+
git(origin, "update-ref", "refs/heads/chant/lifecycle", rewritten);
|
|
486
|
+
|
|
487
|
+
const pass = await ciServePass(opts);
|
|
488
|
+
expect(ofType(events, "ledger")).toEqual([{ type: "ledger", action: "reset", local: seed, forge: rewritten }]);
|
|
489
|
+
expect(pass.jobs).toEqual([expect.objectContaining({ job: "apply", status: "ok" })]);
|
|
490
|
+
expect(results[0]).toMatchObject({ pushed: true });
|
|
491
|
+
const tip = git(origin, "rev-parse", "refs/heads/chant/lifecycle");
|
|
492
|
+
expect(isAncestor(origin, rewritten, tip)).toBe(true);
|
|
493
|
+
expect(isAncestor(root, seed, tip)).toBe(false);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
test("a ledger ahead of the forge's keeps its facts, and the apply pushes them", async () => {
|
|
497
|
+
const { root, origin, seed, opts, events, results } = await mergeWaiting();
|
|
498
|
+
const ahead = ledgerCommit(root, "unpushed fact", seed);
|
|
499
|
+
git(root, "update-ref", "refs/heads/chant/lifecycle", ahead);
|
|
500
|
+
|
|
501
|
+
const pass = await ciServePass(opts);
|
|
502
|
+
expect(ofType(events, "ledger")).toEqual([]);
|
|
503
|
+
expect(pass.jobs).toEqual([expect.objectContaining({ job: "apply", status: "ok" })]);
|
|
504
|
+
expect(results[0]).toMatchObject({ pushed: true });
|
|
505
|
+
expect(isAncestor(origin, ahead, git(origin, "rev-parse", "refs/heads/chant/lifecycle"))).toBe(true);
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
describe("ci serve applies fast-forwards only, and honours [skip ci] (#4122)", () => {
|
|
510
|
+
test("a force push back to an older commit is recorded as seen and not applied, and the next fast-forward applies", async () => {
|
|
511
|
+
const { root, app, main } = workspace();
|
|
512
|
+
const later = commit(root, "app/later.txt");
|
|
513
|
+
git(root, "push", "-q", "origin", "main");
|
|
514
|
+
const forge = fakeForge(later);
|
|
515
|
+
const { opts, events, state } = serve(app, forge);
|
|
516
|
+
await ciServePass(opts);
|
|
517
|
+
expect(ofType(events, "baseline")).toEqual([{ type: "baseline", commit: later }]);
|
|
518
|
+
|
|
519
|
+
git(root, "reset", "-q", "--hard", main);
|
|
520
|
+
git(root, "push", "-q", "-f", "origin", "main");
|
|
521
|
+
forge.head = main;
|
|
522
|
+
const back = await ciServePass(opts);
|
|
523
|
+
expect(back.jobs).toEqual([]);
|
|
524
|
+
expect(ofType(events, "not-run")).toEqual([{ type: "not-run", job: "apply", commit: main, reason: "not-fast-forward", branch: "main", from: later }]);
|
|
525
|
+
expect(formatCiServeEvent(ofType(events, "not-run")[0]!)).toContain("not a fast-forward");
|
|
526
|
+
const file = join(state, `${prApplyGroup("prod", "app")}.json`);
|
|
527
|
+
expect(readCiServeState(file, { forge: "forgejo", repo: "demo/estate", env: "prod", branch: "main" }).target).toBe(main);
|
|
528
|
+
|
|
529
|
+
const next = commit(root, "app/next.txt");
|
|
530
|
+
git(root, "push", "-q", "origin", "main");
|
|
531
|
+
forge.head = next;
|
|
532
|
+
const pass = await ciServePass(opts);
|
|
533
|
+
expect(pass.jobs).toEqual([expect.objectContaining({ job: "apply", commit: next, base: main, status: "ok" })]);
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
test("a target head whose message says [skip ci] is recorded as seen and not applied", async () => {
|
|
537
|
+
const { root, app, main } = workspace();
|
|
538
|
+
const forge = fakeForge(main);
|
|
539
|
+
const { opts, events, state } = serve(app, forge);
|
|
540
|
+
await ciServePass(opts);
|
|
541
|
+
const skip = commit(root, "app/tidy.txt", "tidy the app [skip ci]");
|
|
542
|
+
git(root, "push", "-q", "origin", "main");
|
|
543
|
+
forge.head = skip;
|
|
544
|
+
|
|
545
|
+
expect((await ciServePass(opts)).jobs).toEqual([]);
|
|
546
|
+
expect(ofType(events, "not-run")).toEqual([{ type: "not-run", job: "apply", commit: skip, reason: "skip-ci" }]);
|
|
547
|
+
expect(formatCiServeEvent(ofType(events, "not-run")[0]!)).toContain("says [skip ci]");
|
|
548
|
+
const file = join(state, `${prApplyGroup("prod", "app")}.json`);
|
|
549
|
+
expect(readCiServeState(file, { forge: "forgejo", repo: "demo/estate", env: "prod", branch: "main" }).target).toBe(skip);
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
test("a pull request head whose message says [ci skip] is not planned", async () => {
|
|
553
|
+
const { root, app, main } = workspace();
|
|
554
|
+
git(root, "checkout", "-q", "-b", "pr-4");
|
|
555
|
+
const head = commit(root, "app/pr-4.txt", "draft [ci skip]");
|
|
556
|
+
git(root, "push", "-q", "origin", `${head}:refs/pull/4/head`);
|
|
557
|
+
git(root, "checkout", "-q", "main");
|
|
558
|
+
const forge = fakeForge(main);
|
|
559
|
+
forge.prs = [pr(4, head, main)];
|
|
560
|
+
const { opts, events, state } = serve(app, forge);
|
|
561
|
+
|
|
562
|
+
expect((await ciServePass(opts)).jobs).toEqual([]);
|
|
563
|
+
expect(ofType(events, "not-run")).toEqual([{ type: "not-run", job: "plan", commit: head, pr: 4, reason: "skip-ci" }]);
|
|
564
|
+
const file = join(state, `${prApplyGroup("prod", "app")}.json`);
|
|
565
|
+
expect(readCiServeState(file, { forge: "forgejo", repo: "demo/estate", env: "prod", branch: "main" }).skipped).toEqual({ [ciServeKey({ job: "plan", pr: 4, commit: head })]: "skip-ci" });
|
|
566
|
+
// Seen once: the next poll says nothing of it.
|
|
567
|
+
expect((await ciServePass(opts)).jobs).toEqual([]);
|
|
568
|
+
expect(ofType(events, "not-run")).toHaveLength(1);
|
|
569
|
+
});
|
|
570
|
+
});
|