@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
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant ci runner-start sign|verify` and `chant ci run --require-runner-start`
|
|
3
|
+
* (#4147): the runner-start statement (../runner-start.ts) checked against
|
|
4
|
+
* `.chant/trust.json` at base.
|
|
5
|
+
*
|
|
6
|
+
* - `sign` is for the provisioner that starts a runner for one job: it signs
|
|
7
|
+
* the job's ids with a runner key the job never holds and prints the
|
|
8
|
+
* envelope, which the provisioner puts where the job looks for it.
|
|
9
|
+
* - `verify` is for the job: it names itself from the forge's variables,
|
|
10
|
+
* reads the statement, and fails unless a runner key `.chant/trust.json`
|
|
11
|
+
* at base lists, whose principal holds the `runner` role, signed it for
|
|
12
|
+
* this job.
|
|
13
|
+
* - `ci run --require-runner-start` makes the same check before the job's
|
|
14
|
+
* first step, so an apply refuses before it trades for any credentials.
|
|
15
|
+
*
|
|
16
|
+
* Requiring the statement is opt-in (#4156). With nothing asking for it,
|
|
17
|
+
* nothing reads it, and a runner with none never refuses, warns or hides
|
|
18
|
+
* anything.
|
|
19
|
+
*
|
|
20
|
+
* {@link runnerStartReadiness} says whether a repository could require it
|
|
21
|
+
* at base, and what is missing, for the isolated-runners security group
|
|
22
|
+
* (#4168, section 8), whose WSP165 check reports these gaps.
|
|
23
|
+
*/
|
|
24
|
+
import type { CommandContext } from "../cli/registry.js";
|
|
25
|
+
import { type CiJobIdentity, type RunnerStartVerdict } from "../runner-start.js";
|
|
26
|
+
import { type TrustPolicy } from "./trust/policy.js";
|
|
27
|
+
/**
|
|
28
|
+
* Check this job's runner-start statement against `.chant/trust.json` at
|
|
29
|
+
* `base`. `commit` is the commit the job runs, in place of the forge's
|
|
30
|
+
* variable. Never throws.
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkRunnerStart(input: {
|
|
33
|
+
top: string;
|
|
34
|
+
base: string;
|
|
35
|
+
env?: Record<string, string | undefined>;
|
|
36
|
+
commit?: string;
|
|
37
|
+
readFile?: (path: string) => string;
|
|
38
|
+
}): RunnerStartVerdict;
|
|
39
|
+
/** One thing a repository lacks before it can require runner-start statements. */
|
|
40
|
+
export interface RunnerStartGap {
|
|
41
|
+
/** Not a read-contract reason code: the isolated-runners group (#4168) maps each to its own security code. */
|
|
42
|
+
gap: "no-runner-key" | "no-runner-role" | "trust-unreadable";
|
|
43
|
+
reason: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether `.chant/trust.json` in `policy` lets a job require a runner-start
|
|
47
|
+
* statement: a key under `runners` whose principal holds the `runner` role.
|
|
48
|
+
* `configured` is true when there are no gaps. For the isolated-runners
|
|
49
|
+
* security group (#4168); nothing here refuses or warns.
|
|
50
|
+
*/
|
|
51
|
+
export declare function runnerStartReadiness(policy: TrustPolicy): {
|
|
52
|
+
configured: boolean;
|
|
53
|
+
gaps: RunnerStartGap[];
|
|
54
|
+
};
|
|
55
|
+
/** {@link runnerStartReadiness} for the repository around `cwd` at `base` (default `HEAD`). */
|
|
56
|
+
export declare function runnerStartReadinessAt(cwd: string, base?: string): {
|
|
57
|
+
configured: boolean;
|
|
58
|
+
gaps: RunnerStartGap[];
|
|
59
|
+
};
|
|
60
|
+
/** The job named by `--job`: JSON, or `@<file>` holding it. */
|
|
61
|
+
export declare function parseJobSpec(spec: string): CiJobIdentity;
|
|
62
|
+
/** `chant ci runner-start sign|verify`. */
|
|
63
|
+
export declare function runCiRunnerStart(ctx: CommandContext): Promise<number>;
|
|
64
|
+
/**
|
|
65
|
+
* The check `ci run --require-runner-start` makes before the job's first
|
|
66
|
+
* step: the statement for this job, verified against `.chant/trust.json` at
|
|
67
|
+
* `base`. Throws with the verdict's reason unless it verified.
|
|
68
|
+
*/
|
|
69
|
+
export declare function requireRunnerStart(input: {
|
|
70
|
+
top: string;
|
|
71
|
+
base: string;
|
|
72
|
+
commit: string;
|
|
73
|
+
env: Record<string, string | undefined>;
|
|
74
|
+
}): Extract<RunnerStartVerdict, {
|
|
75
|
+
status: "verified";
|
|
76
|
+
}>;
|
|
77
|
+
//# sourceMappingURL=ci-runner-start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-runner-start.d.ts","sourceRoot":"","sources":["../../src/workspace/ci-runner-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOhF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAUzL;AAED,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,8GAA8G;IAC9G,GAAG,EAAE,eAAe,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,EAAE,CAAA;CAAE,CAezG;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAS,GAAG;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,EAAE,CAAA;CAAE,CAKlH;AAkBD,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAuBxD;AAID,2CAA2C;AAC3C,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC,CAMrL"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant ci runner-start sign|verify` and `chant ci run --require-runner-start`
|
|
3
|
+
* (#4147): the runner-start statement (../runner-start.ts) checked against
|
|
4
|
+
* `.chant/trust.json` at base.
|
|
5
|
+
*
|
|
6
|
+
* - `sign` is for the provisioner that starts a runner for one job: it signs
|
|
7
|
+
* the job's ids with a runner key the job never holds and prints the
|
|
8
|
+
* envelope, which the provisioner puts where the job looks for it.
|
|
9
|
+
* - `verify` is for the job: it names itself from the forge's variables,
|
|
10
|
+
* reads the statement, and fails unless a runner key `.chant/trust.json`
|
|
11
|
+
* at base lists, whose principal holds the `runner` role, signed it for
|
|
12
|
+
* this job.
|
|
13
|
+
* - `ci run --require-runner-start` makes the same check before the job's
|
|
14
|
+
* first step, so an apply refuses before it trades for any credentials.
|
|
15
|
+
*
|
|
16
|
+
* Requiring the statement is opt-in (#4156). With nothing asking for it,
|
|
17
|
+
* nothing reads it, and a runner with none never refuses, warns or hides
|
|
18
|
+
* anything.
|
|
19
|
+
*
|
|
20
|
+
* {@link runnerStartReadiness} says whether a repository could require it
|
|
21
|
+
* at base, and what is missing, for the isolated-runners security group
|
|
22
|
+
* (#4168, section 8), whose WSP165 check reports these gaps.
|
|
23
|
+
*/
|
|
24
|
+
import { execFileSync } from "node:child_process";
|
|
25
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
26
|
+
import { resolve } from "node:path";
|
|
27
|
+
import { formatError } from "../cli/format.js";
|
|
28
|
+
import { ciJobFromEnv, RUNNER_START_SIGNER_ROLE, signRunnerStart, verifyRunnerStartForJob, } from "../runner-start.js";
|
|
29
|
+
import { gitRevisionSource } from "./record-source.js";
|
|
30
|
+
import { gitTop } from "./tree.js";
|
|
31
|
+
import { loadRunnerKey } from "./trust/dsse.js";
|
|
32
|
+
import { emptyPolicy, readTrustPolicy } from "./trust/policy.js";
|
|
33
|
+
/** The policy at `base` in the repository around `cwd`. */
|
|
34
|
+
function policyAt(top, base) {
|
|
35
|
+
return readTrustPolicy(gitRevisionSource(top, base), base);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check this job's runner-start statement against `.chant/trust.json` at
|
|
39
|
+
* `base`. `commit` is the commit the job runs, in place of the forge's
|
|
40
|
+
* variable. Never throws.
|
|
41
|
+
*/
|
|
42
|
+
export function checkRunnerStart(input) {
|
|
43
|
+
const policy = policyAt(input.top, input.base);
|
|
44
|
+
if (policy.problems.length > 0)
|
|
45
|
+
return { status: "untrusted", reason: `.chant/trust.json at ${input.base.slice(0, 12)} cannot be read: ${policy.problems.join("; ")}` };
|
|
46
|
+
return verifyRunnerStartForJob({
|
|
47
|
+
runners: policy.runners,
|
|
48
|
+
roles: policy.roles,
|
|
49
|
+
...(input.env ? { env: input.env } : {}),
|
|
50
|
+
...(input.commit ? { commit: input.commit } : {}),
|
|
51
|
+
...(input.readFile ? { readFile: input.readFile } : {}),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Whether `.chant/trust.json` in `policy` lets a job require a runner-start
|
|
56
|
+
* statement: a key under `runners` whose principal holds the `runner` role.
|
|
57
|
+
* `configured` is true when there are no gaps. For the isolated-runners
|
|
58
|
+
* security group (#4168); nothing here refuses or warns.
|
|
59
|
+
*/
|
|
60
|
+
export function runnerStartReadiness(policy) {
|
|
61
|
+
const gaps = [];
|
|
62
|
+
if (policy.problems.length > 0) {
|
|
63
|
+
gaps.push({ gap: "trust-unreadable", reason: `.chant/trust.json cannot be read: ${policy.problems.join("; ")}` });
|
|
64
|
+
return { configured: false, gaps };
|
|
65
|
+
}
|
|
66
|
+
if (policy.runners.length === 0) {
|
|
67
|
+
gaps.push({ gap: "no-runner-key", reason: ".chant/trust.json lists no key under runners for a provisioner to sign with: chant workspace trust runner add <principal> --key <ssh-ed25519 line>" });
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const holders = new Set((policy.roles[RUNNER_START_SIGNER_ROLE] ?? []).map((p) => p.normalize("NFKC").trim().toLowerCase()));
|
|
71
|
+
if (!policy.runners.some((r) => holders.has(r.principal.normalize("NFKC").trim().toLowerCase()))) {
|
|
72
|
+
gaps.push({ gap: "no-runner-role", reason: `no principal under runners holds the ${RUNNER_START_SIGNER_ROLE} role in .chant/trust.json: "roles": { "${RUNNER_START_SIGNER_ROLE}": ["<principal>"] }` });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { configured: gaps.length === 0, gaps };
|
|
76
|
+
}
|
|
77
|
+
/** {@link runnerStartReadiness} for the repository around `cwd` at `base` (default `HEAD`). */
|
|
78
|
+
export function runnerStartReadinessAt(cwd, base = "HEAD") {
|
|
79
|
+
const top = gitTop(cwd);
|
|
80
|
+
if (!top)
|
|
81
|
+
return runnerStartReadiness(emptyPolicy(null, [`${cwd} is not in a git repository`]));
|
|
82
|
+
const commit = revParse(top, base);
|
|
83
|
+
return runnerStartReadiness(commit ? policyAt(top, commit) : emptyPolicy(null, [`${base} is not a commit`]));
|
|
84
|
+
}
|
|
85
|
+
function revParse(top, rev) {
|
|
86
|
+
try {
|
|
87
|
+
return execFileSync("git", ["rev-parse", "--verify", "-q", `${rev}^{commit}`], { cwd: top, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || undefined;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** The base `verify` reads trust at: `--base`, else the remote's default branch, else `HEAD`. */
|
|
94
|
+
function verifyBase(top, base) {
|
|
95
|
+
const rev = base ?? (revParse(top, "refs/remotes/origin/HEAD") ? "refs/remotes/origin/HEAD" : "HEAD");
|
|
96
|
+
const commit = revParse(top, rev);
|
|
97
|
+
if (!commit)
|
|
98
|
+
throw new Error(`--base ${rev} is not a commit in this repository`);
|
|
99
|
+
return commit;
|
|
100
|
+
}
|
|
101
|
+
/** The job named by `--job`: JSON, or `@<file>` holding it. */
|
|
102
|
+
export function parseJobSpec(spec) {
|
|
103
|
+
const text = spec.startsWith("@") ? readFileSync(resolve(spec.slice(1)), "utf8") : spec;
|
|
104
|
+
let raw;
|
|
105
|
+
try {
|
|
106
|
+
raw = JSON.parse(text);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
throw new Error("--job takes the job as JSON, or @<file> holding it: {\"system\":\"github\",\"repo\":\"owner/name\",\"run\":\"<id>\",\"attempt\":\"1\",\"job\":\"apply\",\"commit\":\"<sha>\",\"runner\":\"<name>\"}");
|
|
110
|
+
}
|
|
111
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
112
|
+
throw new Error("--job takes a JSON object");
|
|
113
|
+
const o = raw;
|
|
114
|
+
const str = (k) => (o[k] === undefined ? undefined : String(o[k]));
|
|
115
|
+
const known = ["system", "repo", "run", "attempt", "job", "commit", "runner"];
|
|
116
|
+
const extra = Object.keys(o).filter((k) => !known.includes(k));
|
|
117
|
+
if (extra.length > 0)
|
|
118
|
+
throw new Error(`--job has fields chant does not know: ${extra.join(", ")}`);
|
|
119
|
+
return {
|
|
120
|
+
system: (str("system") ?? ""),
|
|
121
|
+
repo: str("repo") ?? "",
|
|
122
|
+
run: str("run") ?? "",
|
|
123
|
+
attempt: str("attempt") ?? "1",
|
|
124
|
+
job: str("job") ?? "",
|
|
125
|
+
commit: str("commit") ?? "",
|
|
126
|
+
...(str("runner") ? { runner: str("runner") } : {}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const USAGE = "chant ci runner-start sign --key <runner key.pem> --principal <name> --job <json|@file> [-o <file>]\n chant ci runner-start verify [--base <rev>] [--commit <sha>] [--json]";
|
|
130
|
+
/** `chant ci runner-start sign|verify`. */
|
|
131
|
+
export async function runCiRunnerStart(ctx) {
|
|
132
|
+
const { args } = ctx;
|
|
133
|
+
const action = args.extraPositional;
|
|
134
|
+
try {
|
|
135
|
+
if (action === "sign") {
|
|
136
|
+
if (!args.key)
|
|
137
|
+
throw new Error("--key names the provisioner's runner key, an Ed25519 private key in PEM, which the job never holds");
|
|
138
|
+
if (!args.ciPrincipal)
|
|
139
|
+
throw new Error("--principal names the principal .chant/trust.json lists the key for under runners");
|
|
140
|
+
if (!args.ciJob)
|
|
141
|
+
throw new Error("--job names the job the runner was started for, as JSON or @<file>");
|
|
142
|
+
const job = parseJobSpec(args.ciJob);
|
|
143
|
+
const pem = readFileSync(resolve(args.key), "utf8");
|
|
144
|
+
const loaded = loadRunnerKey(pem);
|
|
145
|
+
const envelope = signRunnerStart(job, { principal: args.ciPrincipal, key: loaded.key, publicKey: loaded.publicKey });
|
|
146
|
+
const text = `${JSON.stringify(envelope)}\n`;
|
|
147
|
+
if (args.output)
|
|
148
|
+
writeFileSync(resolve(args.output), text, { mode: 0o644 });
|
|
149
|
+
else
|
|
150
|
+
process.stdout.write(text);
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
if (action === "verify") {
|
|
154
|
+
const top = gitTop(process.cwd());
|
|
155
|
+
if (!top)
|
|
156
|
+
throw new Error("verify reads .chant/trust.json at a commit, and this directory is not in a git repository");
|
|
157
|
+
const base = verifyBase(top, args.base);
|
|
158
|
+
const verdict = checkRunnerStart({ top, base, ...(args.commit ? { commit: args.commit } : {}) });
|
|
159
|
+
if (args.json)
|
|
160
|
+
process.stdout.write(`${JSON.stringify({ ...verdict, base })}\n`);
|
|
161
|
+
else
|
|
162
|
+
console.error(`ci runner-start: ${verdict.status}: ${verdict.reason}`);
|
|
163
|
+
return verdict.status === "verified" ? 0 : 1;
|
|
164
|
+
}
|
|
165
|
+
throw new Error(`ci runner-start takes sign or verify${action ? `, not ${JSON.stringify(action)}` : ""}`);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
console.error(formatError({ message: `chant ci runner-start: ${err instanceof Error ? err.message : String(err)}`, hint: USAGE }));
|
|
169
|
+
return 1;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The check `ci run --require-runner-start` makes before the job's first
|
|
174
|
+
* step: the statement for this job, verified against `.chant/trust.json` at
|
|
175
|
+
* `base`. Throws with the verdict's reason unless it verified.
|
|
176
|
+
*/
|
|
177
|
+
export function requireRunnerStart(input) {
|
|
178
|
+
const named = ciJobFromEnv(input.env);
|
|
179
|
+
if (!named.ok)
|
|
180
|
+
throw new Error(`--require-runner-start needs a forge job to check: ${named.reason}`);
|
|
181
|
+
const verdict = checkRunnerStart({ top: input.top, base: input.base, env: input.env, commit: input.commit });
|
|
182
|
+
if (verdict.status !== "verified")
|
|
183
|
+
throw new Error(`--require-runner-start: ${verdict.status}: ${verdict.reason}`);
|
|
184
|
+
return verdict;
|
|
185
|
+
}
|
|
@@ -3,11 +3,15 @@
|
|
|
3
3
|
* host. It polls the forge for the open pull requests into the target branch
|
|
4
4
|
* and for the branch's head, and runs the pull-request jobs with
|
|
5
5
|
* {@link ciRun} (./ci-run.ts): `plan` for each new pull request head, and
|
|
6
|
-
* `
|
|
7
|
-
* the previous poll saw (the push's `before`).
|
|
6
|
+
* `record` for each new commit on the target branch (#4168), measured from
|
|
7
|
+
* the head the previous poll saw (the push's `before`). The record applies
|
|
8
|
+
* nothing; with `applyOnMerge` (`--apply-on-merge`) the commit gets `apply`
|
|
9
|
+
* in its place, as before #4168. After each job settles it runs `ci tick`
|
|
10
|
+
* from the runs the jobs recorded, when the declaration has `ci.green`.
|
|
11
|
+
* What the list below says of the apply holds for it under `applyOnMerge`.
|
|
8
12
|
*
|
|
9
13
|
* - Dedupe. A state file in the state directory keeps every job it started,
|
|
10
|
-
* keyed by job and commit (`plan:<pr>:<sha>`, `apply:<sha>`), with how it
|
|
14
|
+
* keyed by job and commit (`plan:<pr>:<sha>`, `record:<sha>`, `apply:<sha>`), with how it
|
|
11
15
|
* ended, and the target head the last apply was measured to. A job already
|
|
12
16
|
* in it is not started again, unless it failed and `rerunFailed` asks for
|
|
13
17
|
* it: the forge's "re-run failed jobs".
|
|
@@ -23,8 +27,34 @@
|
|
|
23
27
|
* as its `--resume` record, so a re-run of a failed apply at the same
|
|
24
28
|
* commit finishes under the approval it has. This replaces the forge's CI
|
|
25
29
|
* cache.
|
|
30
|
+
* - A gate per wave (#4003). With `--wave-gate` the apply job runs
|
|
31
|
+
* `pr-apply --wave-gate`, which applies the waves in order and stops at
|
|
32
|
+
* the first whose moved plan waits on its own gate. The job fails, and the
|
|
33
|
+
* resume record keeps the waves that applied; once the wave's plan is
|
|
34
|
+
* approved, `rerunFailed` runs the apply again and it carries on from
|
|
35
|
+
* that wave.
|
|
26
36
|
* - Capacity. At most `maxJobs` jobs run at once. A job over the limit is not
|
|
27
37
|
* recorded, so a later poll starts it.
|
|
38
|
+
* - Fast-forwards only (#4122). An apply runs only when the target's new head
|
|
39
|
+
* descends from the head seen before it. Any other move, such as a force
|
|
40
|
+
* push back to an older commit, is recorded as seen and not applied.
|
|
41
|
+
* - `[skip ci]` (#4122). A target head or pull request head whose commit
|
|
42
|
+
* message says `[skip ci]` or `[ci skip]` is recorded as seen and not run,
|
|
43
|
+
* as Actions does.
|
|
44
|
+
* - Build requests (#4169). With `buildCommand`, each `ci/build/<sha>`
|
|
45
|
+
* tag the tick or `ci run --at` pushed is served once: the command runs
|
|
46
|
+
* in a fresh detached worktree of the commit, with `CHANT_BUILD_COMMIT`,
|
|
47
|
+
* `CHANT_BUILD_PHASES` (comma-separated) and `CHANT_BUILD_REASON` set,
|
|
48
|
+
* and is expected to run the phases' Ops (`chant run <op>`), whose
|
|
49
|
+
* records the tick reads. A build counts against `maxJobs`, and the state
|
|
50
|
+
* file keeps it under `build:<sha>`. Without `buildCommand` the tags are
|
|
51
|
+
* left alone.
|
|
52
|
+
* - The forge's ledger (#4121). Before each job, when no other job of this
|
|
53
|
+
* serve runs, the clone's `chant/lifecycle` follows the forge's: it is
|
|
54
|
+
* deleted when the forge has none, and reset to the forge's when neither
|
|
55
|
+
* contains the other. Each is a warning. A local branch ahead of the
|
|
56
|
+
* forge's keeps its facts, and the job's push sends them. Nothing here
|
|
57
|
+
* pushes the ledger.
|
|
28
58
|
*
|
|
29
59
|
* Host mode only: each job runs in a fresh worktree on this host as this
|
|
30
60
|
* user, with the clean environment `ciRun` gives it. A pull request from a
|
|
@@ -35,6 +65,7 @@
|
|
|
35
65
|
* {@link ciServeObserve} is the poll that makes them; a webhook handler would
|
|
36
66
|
* turn a checked payload into the same triggers and schedule them.
|
|
37
67
|
*/
|
|
68
|
+
import { type BuildRequest } from "./ci-builds.js";
|
|
38
69
|
import { type OpenPullRequest } from "../pr-forge.js";
|
|
39
70
|
import type { CommandContext } from "../cli/registry.js";
|
|
40
71
|
import { type CiJobName, type CiRunRequest, type CiRunResult } from "./ci-run.js";
|
|
@@ -47,7 +78,11 @@ export interface CiServeForge {
|
|
|
47
78
|
/** The merged pull request that produced a commit, as pr-apply finds it (`pullRequestFor`). Without it an apply gets no `--pr`. */
|
|
48
79
|
pullRequestFor?(sha: string): Promise<number | null>;
|
|
49
80
|
}
|
|
50
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* A job the forge's state calls for: the plan of a pull request's head, or
|
|
83
|
+
* for a target-branch commit its record (#4168) or, with `applyOnMerge`,
|
|
84
|
+
* its apply.
|
|
85
|
+
*/
|
|
51
86
|
export type CiServeTrigger = {
|
|
52
87
|
job: "plan";
|
|
53
88
|
commit: string;
|
|
@@ -55,7 +90,7 @@ export type CiServeTrigger = {
|
|
|
55
90
|
pr: number;
|
|
56
91
|
rerun?: boolean;
|
|
57
92
|
} | {
|
|
58
|
-
job: "apply";
|
|
93
|
+
job: "apply" | "record";
|
|
59
94
|
commit: string;
|
|
60
95
|
base: string;
|
|
61
96
|
rerun?: boolean;
|
|
@@ -85,9 +120,18 @@ export interface CiServeState {
|
|
|
85
120
|
env: string;
|
|
86
121
|
branch: string;
|
|
87
122
|
member?: string;
|
|
88
|
-
/** The target branch's head the last apply was measured to, or the head
|
|
123
|
+
/** The target branch's head the last apply was measured to, or the last head seen and not applied. */
|
|
89
124
|
target?: string;
|
|
90
125
|
jobs: Record<string, CiServeJobState>;
|
|
126
|
+
/** Plans seen and not run, by state key, with why (#4122). */
|
|
127
|
+
skipped?: Record<string, "skip-ci">;
|
|
128
|
+
/** The build requests served (#4169), by `build:<sha>`, with how each ended. */
|
|
129
|
+
builds?: Record<string, {
|
|
130
|
+
tag: string;
|
|
131
|
+
status: "running" | "ok" | "fail";
|
|
132
|
+
startedAt: string;
|
|
133
|
+
settledAt?: string;
|
|
134
|
+
}>;
|
|
91
135
|
}
|
|
92
136
|
/** What a pass did, in order, for the log. */
|
|
93
137
|
export type CiServeEvent = {
|
|
@@ -125,6 +169,30 @@ export type CiServeEvent = {
|
|
|
125
169
|
status: "ok" | "fail";
|
|
126
170
|
failure?: string;
|
|
127
171
|
report?: string;
|
|
172
|
+
} | {
|
|
173
|
+
type: "not-run";
|
|
174
|
+
job: CiJobName;
|
|
175
|
+
commit: string;
|
|
176
|
+
pr?: number;
|
|
177
|
+
reason: "not-fast-forward" | "skip-ci";
|
|
178
|
+
branch?: string;
|
|
179
|
+
from?: string;
|
|
180
|
+
} | {
|
|
181
|
+
type: "ledger";
|
|
182
|
+
action: "deleted" | "reset";
|
|
183
|
+
local: string;
|
|
184
|
+
forge?: string;
|
|
185
|
+
} | {
|
|
186
|
+
type: "build";
|
|
187
|
+
commit: string;
|
|
188
|
+
phases: string[];
|
|
189
|
+
status: "started" | "ok" | "fail" | "held";
|
|
190
|
+
exitCode?: number;
|
|
191
|
+
}
|
|
192
|
+
/** `ci tick` after the pass (#4168): the tags it made from the runs. */
|
|
193
|
+
| {
|
|
194
|
+
type: "tick";
|
|
195
|
+
made: string[];
|
|
128
196
|
} | {
|
|
129
197
|
type: "error";
|
|
130
198
|
message: string;
|
|
@@ -147,6 +215,18 @@ export interface CiServeOptions {
|
|
|
147
215
|
authors?: readonly string[];
|
|
148
216
|
/** Run again the failed apply at the target's head, and the failed plans of open heads. */
|
|
149
217
|
rerunFailed?: boolean;
|
|
218
|
+
/**
|
|
219
|
+
* Apply each new target-branch commit (#4168), as `ci serve` did before
|
|
220
|
+
* #4168. Default false: each new commit gets the record job, which applies
|
|
221
|
+
* nothing.
|
|
222
|
+
*/
|
|
223
|
+
applyOnMerge?: boolean;
|
|
224
|
+
/**
|
|
225
|
+
* Run after each pass that settled a job (#4168): `ci tick` from the runs
|
|
226
|
+
* the jobs recorded. Returns the tags it made, or undefined when the
|
|
227
|
+
* declaration has no `ci.green`. The command passes one; a test may not.
|
|
228
|
+
*/
|
|
229
|
+
tick?: () => Promise<string[] | undefined>;
|
|
150
230
|
/** Passed to each job. `job.hostEnv` gets `GITHUB_REPOSITORY` set to `repo`. */
|
|
151
231
|
job?: CiServeJobOptions;
|
|
152
232
|
/** This process's lease identity. Default `currentHolderId()`. */
|
|
@@ -156,10 +236,22 @@ export interface CiServeOptions {
|
|
|
156
236
|
now?: () => Date;
|
|
157
237
|
/** Runs a job. Default {@link ciRun}. */
|
|
158
238
|
run?: (req: CiRunRequest) => Promise<CiRunResult>;
|
|
239
|
+
/**
|
|
240
|
+
* The shell line that builds a requested commit (#4169), run in a fresh
|
|
241
|
+
* worktree of it. Without it `ci/build/<sha>` tags are not served.
|
|
242
|
+
*/
|
|
243
|
+
buildCommand?: string;
|
|
244
|
+
/** Runs a build. Default: `sh -c <buildCommand>` in a detached worktree of the commit. */
|
|
245
|
+
build?: (input: {
|
|
246
|
+
top: string;
|
|
247
|
+
request: BuildRequest;
|
|
248
|
+
command: string;
|
|
249
|
+
}) => Promise<number>;
|
|
159
250
|
}
|
|
160
251
|
/** The jobs this process runs now, by state key, shared by every pass of one loop. */
|
|
161
252
|
export interface CiServeRuntime {
|
|
162
|
-
|
|
253
|
+
/** Jobs and build requests (#4169) alike, by state key: they share `maxJobs`. */
|
|
254
|
+
inflight: Map<string, Promise<unknown>>;
|
|
163
255
|
}
|
|
164
256
|
export declare const newCiServeRuntime: () => CiServeRuntime;
|
|
165
257
|
/** The state key of a job. */
|
|
@@ -168,17 +260,34 @@ export declare function ciServeKey(t: {
|
|
|
168
260
|
commit: string;
|
|
169
261
|
pr?: number;
|
|
170
262
|
}): string;
|
|
263
|
+
/**
|
|
264
|
+
* Make the clone's `chant/lifecycle` follow the forge's (#4121). The clone's
|
|
265
|
+
* branch outlives the forge's, so a ledger the forge deleted or rewrote would
|
|
266
|
+
* make the next pr-apply find the two diverged and stall.
|
|
267
|
+
*
|
|
268
|
+
* - The forge has none: the local branch and its remote-tracking ref go.
|
|
269
|
+
* - Neither contains the other: the local branch and its remote-tracking ref
|
|
270
|
+
* are reset to the forge's tip.
|
|
271
|
+
* - The local branch is ahead of the forge's, or behind it, or the same: it
|
|
272
|
+
* is left, and an apply's push sends what it holds that the forge lacks.
|
|
273
|
+
*
|
|
274
|
+
* Nothing is pushed, so a rewritten ledger never goes back to the forge. A
|
|
275
|
+
* forge that can't be reached leaves everything as it is; the job's own
|
|
276
|
+
* fetch says why.
|
|
277
|
+
*/
|
|
278
|
+
export declare function reconcileCiServeLedger(top: string): CiServeEvent | undefined;
|
|
171
279
|
/** Where a serve keeps its state when `--state` names nowhere: beside the run events, in the repository's common git directory. */
|
|
172
280
|
export declare function defaultCiServeStateDir(cwd: string): string;
|
|
173
281
|
/** The state file, or a new one. */
|
|
174
282
|
export declare function readCiServeState(file: string, fresh: Omit<CiServeState, "schema" | "jobs">): CiServeState;
|
|
175
283
|
/**
|
|
176
284
|
* One poll of the forge, as triggers: an apply when the target's head moved
|
|
177
|
-
* since the last apply (none on the first poll, which only
|
|
285
|
+
* since the last apply by a fast-forward (none on the first poll, which only
|
|
286
|
+
* notes the head, and none for a head whose message says `[skip ci]`),
|
|
178
287
|
* then a plan for each open pull request head not yet planned, oldest pull
|
|
179
288
|
* request first. A job already in the state file is left out unless it
|
|
180
|
-
* failed and `rerunFailed` is set. The first poll's head
|
|
181
|
-
* state file.
|
|
289
|
+
* failed and `rerunFailed` is set. The first poll's head, and a head seen
|
|
290
|
+
* and not applied, are written to the state file.
|
|
182
291
|
*/
|
|
183
292
|
export declare function ciServeObserve(opts: CiServeOptions, rt?: CiServeRuntime): Promise<{
|
|
184
293
|
triggers: CiServeTrigger[];
|
|
@@ -197,11 +306,21 @@ export interface CiServeScheduled {
|
|
|
197
306
|
* reported and not recorded, so the next poll finds it again.
|
|
198
307
|
*/
|
|
199
308
|
export declare function ciServeSchedule(opts: CiServeOptions, triggers: readonly CiServeTrigger[], rt?: CiServeRuntime): Promise<CiServeScheduled>;
|
|
200
|
-
/** One pass: observe, schedule, and with `wait` wait for the jobs it started. */
|
|
309
|
+
/** One pass: observe, schedule, serve build requests, and with `wait` wait for the jobs it started. */
|
|
201
310
|
export declare function ciServePass(opts: CiServeOptions, rt?: CiServeRuntime, wait?: boolean): Promise<{
|
|
202
311
|
events: CiServeEvent[];
|
|
203
312
|
jobs: CiServeJobState[];
|
|
204
313
|
}>;
|
|
314
|
+
/**
|
|
315
|
+
* Serve the build requests (#4169): fetch the `ci/build/*` tags, and start
|
|
316
|
+
* `buildCommand` for each one not in the state file yet, oldest first, while
|
|
317
|
+
* fewer than `maxJobs` jobs run. A build that fails is recorded and not run
|
|
318
|
+
* again; the tick decides what its phases say.
|
|
319
|
+
*/
|
|
320
|
+
export declare function ciServeBuilds(opts: CiServeOptions, rt: CiServeRuntime): {
|
|
321
|
+
started: Promise<void>[];
|
|
322
|
+
events: CiServeEvent[];
|
|
323
|
+
};
|
|
205
324
|
/**
|
|
206
325
|
* The loop: a pass every `intervalMs` until `signal` aborts, jobs running
|
|
207
326
|
* across passes up to `maxJobs`. A pass the forge fails is logged and the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-serve.d.ts","sourceRoot":"","sources":["../../src/workspace/ci-serve.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ci-serve.d.ts","sourceRoot":"","sources":["../../src/workspace/ci-serve.ts"],"names":[],"mappings":"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"}
|