@intentius/chant 0.124.30 → 0.124.32
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/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 +23 -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/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 +14 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +488 -32
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +3 -1
- 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 +74 -12
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +65 -0
- package/dist/cli/registry.d.ts +29 -2
- 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/driver.d.ts +38 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +47 -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/pr-pipeline.d.ts +65 -2
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +107 -15
- package/dist/components/pr-run.d.ts +127 -29
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +290 -70
- package/dist/components/wave-plan.d.ts +5 -2
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +12 -1
- 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/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 +2 -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/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/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/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/factory.js +1 -1
- 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/local-executor.d.ts +12 -0
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +22 -3
- 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/redact.d.ts +34 -0
- package/dist/op/redact.d.ts.map +1 -0
- package/dist/op/redact.js +94 -0
- package/dist/op/step-console.d.ts +2 -0
- package/dist/op/step-console.d.ts.map +1 -1
- package/dist/op/step-console.js +5 -2
- 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 +27 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +51 -6
- package/dist/pr-loop.d.ts +141 -4
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +122 -6
- package/dist/pr-report-url.d.ts +10 -2
- package/dist/pr-report-url.d.ts.map +1 -1
- package/dist/pr-report-url.js +52 -6
- 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 +208 -208
- 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/checks/boxes.d.ts +6 -6
- package/dist/workspace/checks/boxes.js +9 -9
- package/dist/workspace/ci-green-forge.d.ts +6 -4
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green.d.ts +28 -12
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +49 -21
- package/dist/workspace/ci-list.schema.json +12 -6
- 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 +108 -0
- package/dist/workspace/ci-run-index.d.ts.map +1 -0
- package/dist/workspace/ci-run-index.js +164 -0
- package/dist/workspace/ci-run-index.schema.json +52 -0
- package/dist/workspace/ci-run.d.ts +159 -9
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +419 -50
- package/dist/workspace/ci-runner-key.d.ts +133 -0
- package/dist/workspace/ci-runner-key.d.ts.map +1 -0
- package/dist/workspace/ci-runner-key.js +237 -0
- package/dist/workspace/ci-secrets.d.ts +65 -0
- package/dist/workspace/ci-secrets.d.ts.map +1 -0
- package/dist/workspace/ci-secrets.js +211 -0
- package/dist/workspace/ci-serve.d.ts +67 -4
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +240 -35
- package/dist/workspace/declaration.d.ts +8 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +11 -2
- package/dist/workspace/declaration.schema.json +7 -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 +6 -1
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +1 -0
- package/dist/workspace/ls.schema.json +7 -1
- 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 +74 -7
- package/dist/workspace/reason-codes.d.ts +7 -3
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +9 -4
- package/dist/workspace/run-event.schema.json +3 -1
- package/dist/workspace/status.schema.json +3 -1
- package/dist/workspace/trust/trust-write.d.ts +109 -0
- package/dist/workspace/trust/trust-write.d.ts.map +1 -0
- package/dist/workspace/trust/trust-write.js +320 -0
- package/dist/workspace/trust-write.schema.json +265 -0
- 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 +1 -1
- package/src/__fixtures__/pr-loop/pr-apply-wave-waiting.note.golden.md +48 -0
- 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 +69 -0
- package/src/cli/handlers/build.ts +20 -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/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-waves.test.ts +449 -0
- package/src/cli/handlers/pr.test.ts +134 -0
- package/src/cli/handlers/pr.ts +523 -31
- package/src/cli/handlers/promote.test.ts +26 -1
- package/src/cli/handlers/promote.ts +3 -2
- 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 +19 -0
- package/src/cli/main.ts +73 -12
- package/src/cli/parse-args.ts +48 -0
- package/src/cli/registry.ts +35 -4
- 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/driver.test.ts +36 -1
- package/src/components/driver.ts +76 -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/pr-pipeline.test.ts +100 -0
- package/src/components/pr-pipeline.ts +132 -17
- package/src/components/pr-run.test.ts +323 -18
- package/src/components/pr-run.ts +354 -75
- package/src/components/wave-plan.ts +16 -4
- 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/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 +2 -0
- package/src/lifecycle/affected.test.ts +7 -0
- package/src/lifecycle/affected.ts +6 -1
- package/src/lifecycle/release-ledger.ts +34 -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/module-source.test.ts +85 -0
- package/src/module-source.ts +112 -0
- package/src/op/activities/factory.ts +1 -1
- 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/local-executor.ts +31 -3
- 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/redact.ts +93 -0
- package/src/op/step-console.ts +7 -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 +71 -0
- package/src/pr-forge.ts +70 -6
- package/src/pr-loop-bundle.test.ts +2 -1
- package/src/pr-loop.test.ts +117 -1
- package/src/pr-loop.ts +252 -10
- package/src/pr-report-url.ts +58 -6
- 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/checks/boxes.ts +9 -9
- package/src/workspace/ci-green-forge.ts +6 -4
- package/src/workspace/ci-green-runs.test.ts +53 -11
- package/src/workspace/ci-green.test.ts +1 -1
- package/src/workspace/ci-green.ts +50 -22
- package/src/workspace/ci-list.schema.json +12 -6
- 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 +52 -0
- package/src/workspace/ci-run-index.test.ts +392 -0
- package/src/workspace/ci-run-index.ts +206 -0
- package/src/workspace/ci-run.test.ts +520 -42
- package/src/workspace/ci-run.ts +483 -51
- package/src/workspace/ci-runner-key.test.ts +204 -0
- package/src/workspace/ci-runner-key.ts +275 -0
- package/src/workspace/ci-secrets.test.ts +106 -0
- package/src/workspace/ci-secrets.ts +213 -0
- package/src/workspace/ci-serve.test.ts +282 -39
- package/src/workspace/ci-serve.ts +231 -34
- package/src/workspace/declaration.schema.json +7 -2
- package/src/workspace/declaration.test.ts +23 -0
- package/src/workspace/declaration.ts +19 -3
- package/src/workspace/export.ts +6 -3
- package/src/workspace/ls.schema.json +7 -1
- package/src/workspace/ls.ts +7 -2
- package/src/workspace/pin-integrity.test.ts +5 -0
- package/src/workspace/pin-integrity.ts +3 -2
- package/src/workspace/pr-report.schema.json +74 -7
- package/src/workspace/reason-codes.test.ts +2 -0
- package/src/workspace/reason-codes.ts +9 -4
- package/src/workspace/run-event.schema.json +3 -1
- package/src/workspace/status.schema.json +3 -1
- package/src/workspace/trust/trust-write.test.ts +179 -0
- package/src/workspace/trust/trust-write.ts +377 -0
- package/src/workspace/trust-write.schema.json +265 -0
- package/src/workspace/write-scope.test.ts +29 -1
- package/src/workspace/write-scope.ts +12 -1
|
@@ -240,8 +240,11 @@
|
|
|
240
240
|
"description": "The env the run is recorded under."
|
|
241
241
|
},
|
|
242
242
|
"signer": {
|
|
243
|
-
"type":
|
|
244
|
-
|
|
243
|
+
"type": [
|
|
244
|
+
"string",
|
|
245
|
+
"null"
|
|
246
|
+
],
|
|
247
|
+
"description": "The runner principal whose statement the run carries. null for an unsigned run, which counts unless ci.green.signedSince asks for a statement (#4156, chant 0.124.32 and newer)."
|
|
245
248
|
}
|
|
246
249
|
},
|
|
247
250
|
"description": "Added within contract version 1 by #4044, written by chant 0.124.28 and newer. Present only when the run is a chant Op run (ci.green.source runs): name is then the Op's name and id is null. Absent for a check run."
|
|
@@ -334,8 +337,11 @@
|
|
|
334
337
|
"description": "The env the run is recorded under."
|
|
335
338
|
},
|
|
336
339
|
"signer": {
|
|
337
|
-
"type":
|
|
338
|
-
|
|
340
|
+
"type": [
|
|
341
|
+
"string",
|
|
342
|
+
"null"
|
|
343
|
+
],
|
|
344
|
+
"description": "The runner principal whose statement the run carries. null for an unsigned run, which counts unless ci.green.signedSince asks for a statement (#4156, chant 0.124.32 and newer)."
|
|
339
345
|
}
|
|
340
346
|
},
|
|
341
347
|
"description": "Added within contract version 1 by #4044, written by chant 0.124.28 and newer. Present only when the run is a chant Op run (ci.green.source runs): name is then the Op's name and id is null. Absent for a check run."
|
|
@@ -432,7 +438,7 @@
|
|
|
432
438
|
},
|
|
433
439
|
"ignoredRuns": {
|
|
434
440
|
"type": "array",
|
|
435
|
-
"description": "Added within contract version 1 by #4044, written by chant 0.124.28 and newer. Present only when the source is chant runs (ci.green.source or --source runs): the Op runs on the commit that do not count
|
|
441
|
+
"description": "Added within contract version 1 by #4044, written by chant 0.124.28 and newer. Present only when the source is chant runs (ci.green.source or --source runs): the Op runs on the commit that do not count: a statement that does not verify (invalid, untrusted or mismatch), or, under ci.green.signedSince, no statement on a commit that needs one (#4156). They neither green nor revoke the commit.",
|
|
436
442
|
"items": {
|
|
437
443
|
"type": "object",
|
|
438
444
|
"required": [
|
|
@@ -460,7 +466,7 @@
|
|
|
460
466
|
"untrusted",
|
|
461
467
|
"mismatch"
|
|
462
468
|
],
|
|
463
|
-
"description": "unsigned: the record carries no statement. invalid: the statement is not an op-run statement, or names another signer than the key's. untrusted: no runner key .chant/trust.json lists at base signed it, or its principal holds no runner role. mismatch: it signs another run, commit or record than the ledger holds."
|
|
469
|
+
"description": "unsigned: the record carries no statement, on a commit ci.green.signedSince asks one for (#4156: without signedSince an unsigned run counts). invalid: the statement is not an op-run statement, or names another signer than the key's. untrusted: no runner key .chant/trust.json lists at base signed it, or its principal holds no runner role. mismatch: it signs another run, commit or record than the ledger holds."
|
|
464
470
|
},
|
|
465
471
|
"reason": {
|
|
466
472
|
"type": "string"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The report URL a command uses (#4160): `--report-url` when it is given,
|
|
3
|
+
* else the workspace declaration's `ci.reportUrl`, else none.
|
|
4
|
+
*
|
|
5
|
+
* `chant build --pr-loop`, `chant ci run`, `chant ci serve` and `chant ci
|
|
6
|
+
* runs` call this. The declaration is read from the working tree of the
|
|
7
|
+
* workspace that holds `cwd`. A directory with no declaration between it and
|
|
8
|
+
* the git root reads nothing and loads no declaration module, so a project
|
|
9
|
+
* outside a workspace behaves as before. A declaration that can't be read
|
|
10
|
+
* is an error naming its place and its reason code, such as
|
|
11
|
+
* `declaration-invalid`, since the command would otherwise run without the
|
|
12
|
+
* URL the workspace may declare.
|
|
13
|
+
*/
|
|
14
|
+
/** The declared `ci.reportUrl` of the workspace holding `cwd`, or undefined. */
|
|
15
|
+
export declare function declaredReportUrl(cwd: string): Promise<string | undefined>;
|
|
16
|
+
/** `flag` when given, else the declared `ci.reportUrl` (#4160). */
|
|
17
|
+
export declare function reportUrlOf(flag: string | undefined, cwd: string): Promise<string | undefined>;
|
|
18
|
+
//# sourceMappingURL=ci-report-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-report-url.d.ts","sourceRoot":"","sources":["../../src/workspace/ci-report-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,gFAAgF;AAChF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAUhF;AAED,mEAAmE;AACnE,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEpG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The report URL a command uses (#4160): `--report-url` when it is given,
|
|
3
|
+
* else the workspace declaration's `ci.reportUrl`, else none.
|
|
4
|
+
*
|
|
5
|
+
* `chant build --pr-loop`, `chant ci run`, `chant ci serve` and `chant ci
|
|
6
|
+
* runs` call this. The declaration is read from the working tree of the
|
|
7
|
+
* workspace that holds `cwd`. A directory with no declaration between it and
|
|
8
|
+
* the git root reads nothing and loads no declaration module, so a project
|
|
9
|
+
* outside a workspace behaves as before. A declaration that can't be read
|
|
10
|
+
* is an error naming its place and its reason code, such as
|
|
11
|
+
* `declaration-invalid`, since the command would otherwise run without the
|
|
12
|
+
* URL the workspace may declare.
|
|
13
|
+
*/
|
|
14
|
+
import { findWorkspaceRoot } from "../project-root.js";
|
|
15
|
+
/** The declared `ci.reportUrl` of the workspace holding `cwd`, or undefined. */
|
|
16
|
+
export async function declaredReportUrl(cwd) {
|
|
17
|
+
const found = findWorkspaceRoot(cwd);
|
|
18
|
+
if (!found)
|
|
19
|
+
return undefined;
|
|
20
|
+
const [{ readDeclaration, WorkspaceReadError }, { workingTree }] = await Promise.all([import("./declaration.js"), import("./tree.js")]);
|
|
21
|
+
try {
|
|
22
|
+
return readDeclaration(workingTree(found.dir)).ci?.reportUrl ?? undefined;
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (!(err instanceof WorkspaceReadError))
|
|
26
|
+
throw err;
|
|
27
|
+
throw Object.assign(new Error(`${err.describe()} [${err.code}]`), { code: err.code });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** `flag` when given, else the declared `ci.reportUrl` (#4160). */
|
|
31
|
+
export async function reportUrlOf(flag, cwd) {
|
|
32
|
+
return flag ?? (await declaredReportUrl(cwd));
|
|
33
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run index (#4098, epic #4101): where the chant runner says which jobs it
|
|
3
|
+
* ran, at the `--report-url` root, for behold and the demo kiosk to find runs
|
|
4
|
+
* without a forge or a workflow file.
|
|
5
|
+
*
|
|
6
|
+
* ```
|
|
7
|
+
* <url>/runs/index.json
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* One document, `ci-run-index/v1` (`ci-run-index.schema.json`). Each settled
|
|
11
|
+
* `chant ci run` job with `--report-url` set adds an entry to its front, so
|
|
12
|
+
* the newest run is first, and the list is cut to the newest `limit` entries,
|
|
13
|
+
* 200 by default. An entry's `key` is the folder the job's report went to
|
|
14
|
+
* (`reportKey`, `<pr>/<commit>`), so a reader goes from the index to
|
|
15
|
+
* `<url>/<key>/pr-<job>.json`.
|
|
16
|
+
*
|
|
17
|
+
* The update reads the index, changes it and writes it back through the same
|
|
18
|
+
* `file://` and `s3://` paths the report upload uses (pr-report-url.ts). A
|
|
19
|
+
* `file://` write goes through a temporary name and a rename. Two runners
|
|
20
|
+
* updating one index at once can lose an entry, and that is out of scope:
|
|
21
|
+
* `chant ci serve` is one host. Within one process the updates for one URL
|
|
22
|
+
* take turns, so `ci serve --max-jobs 2` does not race itself.
|
|
23
|
+
*
|
|
24
|
+
* An index that can't be parsed is replaced with a warning. An index this
|
|
25
|
+
* chant can't read for any other reason, or a newer contract, is left alone
|
|
26
|
+
* with a warning. Nothing here fails a job.
|
|
27
|
+
*/
|
|
28
|
+
import type { RunOrigin } from "../lifecycle/release-ledger.js";
|
|
29
|
+
import type { CommandContext } from "../cli/registry.js";
|
|
30
|
+
import { type ReportGet, type ReportPut, type ReportTarget } from "../pr-report-url.js";
|
|
31
|
+
export declare const CI_RUN_INDEX_SCHEMA_ID = "https://intentius.io/chant/schemas/workspace/ci-run-index/v1/ci-run-index.schema.json";
|
|
32
|
+
export declare const CI_RUN_INDEX_CONTRACT = 1;
|
|
33
|
+
/** The first chant that writes the index. */
|
|
34
|
+
export declare const CI_RUN_INDEX_FLOOR = "0.124.31";
|
|
35
|
+
/** Where the index is kept, below the report URL. */
|
|
36
|
+
export declare const CI_RUN_INDEX_KEY = "runs/index.json";
|
|
37
|
+
/** How many entries the index keeps unless told otherwise. */
|
|
38
|
+
export declare const CI_RUN_INDEX_LIMIT = 200;
|
|
39
|
+
/** One job the runner ran. */
|
|
40
|
+
export interface CiRunIndexEntry {
|
|
41
|
+
job: "plan" | "apply";
|
|
42
|
+
/** The pull request, or null when the job found none. */
|
|
43
|
+
pr: number | null;
|
|
44
|
+
commit: string;
|
|
45
|
+
status: "ok" | "fail";
|
|
46
|
+
/** Why a failed job failed: the `failure.code` of its run record. */
|
|
47
|
+
failure?: {
|
|
48
|
+
code: string;
|
|
49
|
+
};
|
|
50
|
+
member?: string;
|
|
51
|
+
started: string;
|
|
52
|
+
ended: string;
|
|
53
|
+
runId: string;
|
|
54
|
+
/** The folder the job's report is under, below the report URL: `<pr>/<commit>[/<member>]`. */
|
|
55
|
+
key: string;
|
|
56
|
+
runOrigin: RunOrigin;
|
|
57
|
+
/**
|
|
58
|
+
* The runner whose key signed the run's record, or null for an unsigned
|
|
59
|
+
* run (#4156). Written by chant 0.124.32 and newer; an entry from an older
|
|
60
|
+
* chant lacks it.
|
|
61
|
+
*/
|
|
62
|
+
signer?: string | null;
|
|
63
|
+
/**
|
|
64
|
+
* The code `chant ci run` exited with for the job: 0, its command's own
|
|
65
|
+
* code such as 3 for a moved plan or a waiting wave, else 1 (#4165).
|
|
66
|
+
* Written by chant 0.124.32 and newer; an entry from an older chant lacks it.
|
|
67
|
+
*/
|
|
68
|
+
exitCode?: number;
|
|
69
|
+
}
|
|
70
|
+
export interface CiRunIndex {
|
|
71
|
+
$schema: typeof CI_RUN_INDEX_SCHEMA_ID;
|
|
72
|
+
contract: typeof CI_RUN_INDEX_CONTRACT;
|
|
73
|
+
chant: string;
|
|
74
|
+
/** When the index was last written. */
|
|
75
|
+
updated: string;
|
|
76
|
+
/** Newest first. */
|
|
77
|
+
runs: CiRunIndexEntry[];
|
|
78
|
+
}
|
|
79
|
+
/** The index as `text` holds it, or why it can't be used: `corrupt` is replaced, `newer` is left alone. */
|
|
80
|
+
export declare function parseCiRunIndex(text: string): {
|
|
81
|
+
index: CiRunIndex;
|
|
82
|
+
} | {
|
|
83
|
+
corrupt: string;
|
|
84
|
+
} | {
|
|
85
|
+
newer: number;
|
|
86
|
+
};
|
|
87
|
+
/** `entry` at the front of `runs`, replacing an entry with its run id, cut to the newest `limit`. */
|
|
88
|
+
export declare function addRunEntry(runs: readonly CiRunIndexEntry[], entry: CiRunIndexEntry, limit: number): CiRunIndexEntry[];
|
|
89
|
+
/**
|
|
90
|
+
* Add `entry` to the index at `target`. Never throws: a problem is a warning
|
|
91
|
+
* and the index stays as it was, or is replaced when it was unreadable JSON.
|
|
92
|
+
*/
|
|
93
|
+
export declare function updateCiRunIndex(input: {
|
|
94
|
+
target: ReportTarget;
|
|
95
|
+
entry: CiRunIndexEntry;
|
|
96
|
+
limit?: number;
|
|
97
|
+
warn: (message: string) => void;
|
|
98
|
+
now?: () => Date;
|
|
99
|
+
put?: ReportPut;
|
|
100
|
+
get?: ReportGet;
|
|
101
|
+
}): Promise<void>;
|
|
102
|
+
/** The index at `target`, or null when none is there. Throws a line a person can read when it can't be read. */
|
|
103
|
+
export declare function readCiRunIndex(target: ReportTarget, get?: ReportGet): Promise<CiRunIndex | null>;
|
|
104
|
+
/** The text `chant ci runs` prints: one line per run, newest first. */
|
|
105
|
+
export declare function formatCiRunIndex(index: CiRunIndex): string;
|
|
106
|
+
/** `chant ci runs` (#4098): list the index at the report URL. */
|
|
107
|
+
export declare function runCiRuns(ctx: CommandContext): Promise<number>;
|
|
108
|
+
//# sourceMappingURL=ci-run-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-run-index.d.ts","sourceRoot":"","sources":["../../src/workspace/ci-run-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAwC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG3H,eAAO,MAAM,sBAAsB,0FAA0F,CAAC;AAC9H,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACtB,yDAAyD;IACzD,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,qEAAqE;IACrE,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,sBAAsB,CAAC;IACvC,QAAQ,EAAE,OAAO,qBAAqB,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB;AAID,2GAA2G;AAC3G,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAc7G;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAEtH;AAKD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChB;AAED,gHAAgH;AAChH,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,GAAE,SAA6B,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQzH;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAS1D;AAID,iEAAiE;AACjE,wBAAsB,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAepE"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run index (#4098, epic #4101): where the chant runner says which jobs it
|
|
3
|
+
* ran, at the `--report-url` root, for behold and the demo kiosk to find runs
|
|
4
|
+
* without a forge or a workflow file.
|
|
5
|
+
*
|
|
6
|
+
* ```
|
|
7
|
+
* <url>/runs/index.json
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* One document, `ci-run-index/v1` (`ci-run-index.schema.json`). Each settled
|
|
11
|
+
* `chant ci run` job with `--report-url` set adds an entry to its front, so
|
|
12
|
+
* the newest run is first, and the list is cut to the newest `limit` entries,
|
|
13
|
+
* 200 by default. An entry's `key` is the folder the job's report went to
|
|
14
|
+
* (`reportKey`, `<pr>/<commit>`), so a reader goes from the index to
|
|
15
|
+
* `<url>/<key>/pr-<job>.json`.
|
|
16
|
+
*
|
|
17
|
+
* The update reads the index, changes it and writes it back through the same
|
|
18
|
+
* `file://` and `s3://` paths the report upload uses (pr-report-url.ts). A
|
|
19
|
+
* `file://` write goes through a temporary name and a rename. Two runners
|
|
20
|
+
* updating one index at once can lose an entry, and that is out of scope:
|
|
21
|
+
* `chant ci serve` is one host. Within one process the updates for one URL
|
|
22
|
+
* take turns, so `ci serve --max-jobs 2` does not race itself.
|
|
23
|
+
*
|
|
24
|
+
* An index that can't be parsed is replaced with a warning. An index this
|
|
25
|
+
* chant can't read for any other reason, or a newer contract, is left alone
|
|
26
|
+
* with a warning. Nothing here fails a job.
|
|
27
|
+
*/
|
|
28
|
+
import { formatError } from "../cli/format.js";
|
|
29
|
+
import { reportUrlOf } from "./ci-report-url.js";
|
|
30
|
+
import { parseReportUrl, reportGet, reportPut } from "../pr-report-url.js";
|
|
31
|
+
import { readerVersion } from "./declaration.js";
|
|
32
|
+
export const CI_RUN_INDEX_SCHEMA_ID = "https://intentius.io/chant/schemas/workspace/ci-run-index/v1/ci-run-index.schema.json";
|
|
33
|
+
export const CI_RUN_INDEX_CONTRACT = 1;
|
|
34
|
+
/** The first chant that writes the index. */
|
|
35
|
+
export const CI_RUN_INDEX_FLOOR = "0.124.31";
|
|
36
|
+
/** Where the index is kept, below the report URL. */
|
|
37
|
+
export const CI_RUN_INDEX_KEY = "runs/index.json";
|
|
38
|
+
/** How many entries the index keeps unless told otherwise. */
|
|
39
|
+
export const CI_RUN_INDEX_LIMIT = 200;
|
|
40
|
+
const messageOf = (err) => (err instanceof Error ? err.message : String(err));
|
|
41
|
+
/** The index as `text` holds it, or why it can't be used: `corrupt` is replaced, `newer` is left alone. */
|
|
42
|
+
export function parseCiRunIndex(text) {
|
|
43
|
+
let doc;
|
|
44
|
+
try {
|
|
45
|
+
doc = JSON.parse(text);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return { corrupt: `it is not JSON (${messageOf(err)})` };
|
|
49
|
+
}
|
|
50
|
+
if (doc === null || typeof doc !== "object" || Array.isArray(doc))
|
|
51
|
+
return { corrupt: "it is not an object" };
|
|
52
|
+
const d = doc;
|
|
53
|
+
if (typeof d.contract === "number" && d.contract > CI_RUN_INDEX_CONTRACT)
|
|
54
|
+
return { newer: d.contract };
|
|
55
|
+
if (d.contract !== CI_RUN_INDEX_CONTRACT)
|
|
56
|
+
return { corrupt: "it is not a ci-run-index document" };
|
|
57
|
+
if (!Array.isArray(d.runs))
|
|
58
|
+
return { corrupt: "it has no runs list" };
|
|
59
|
+
const runs = d.runs.filter((r) => r !== null && typeof r === "object" && typeof r.runId === "string");
|
|
60
|
+
return { index: { ...doc, runs } };
|
|
61
|
+
}
|
|
62
|
+
/** `entry` at the front of `runs`, replacing an entry with its run id, cut to the newest `limit`. */
|
|
63
|
+
export function addRunEntry(runs, entry, limit) {
|
|
64
|
+
return [entry, ...runs.filter((r) => r.runId !== entry.runId)].slice(0, limit);
|
|
65
|
+
}
|
|
66
|
+
/** The turn each index URL is waiting for, so updates in one process run one after another. */
|
|
67
|
+
const turns = new Map();
|
|
68
|
+
/**
|
|
69
|
+
* Add `entry` to the index at `target`. Never throws: a problem is a warning
|
|
70
|
+
* and the index stays as it was, or is replaced when it was unreadable JSON.
|
|
71
|
+
*/
|
|
72
|
+
export function updateCiRunIndex(input) {
|
|
73
|
+
const where = `${input.target.url}/${CI_RUN_INDEX_KEY}`;
|
|
74
|
+
const put = input.put ?? reportPut(input.target);
|
|
75
|
+
const get = input.get ?? reportGet(input.target);
|
|
76
|
+
const limit = Math.max(1, Math.floor(input.limit ?? CI_RUN_INDEX_LIMIT));
|
|
77
|
+
const work = async () => {
|
|
78
|
+
let runs = [];
|
|
79
|
+
try {
|
|
80
|
+
const text = await get(CI_RUN_INDEX_KEY);
|
|
81
|
+
if (text !== null) {
|
|
82
|
+
const parsed = parseCiRunIndex(text);
|
|
83
|
+
if ("corrupt" in parsed)
|
|
84
|
+
input.warn(`the run index at ${where} is replaced, since ${parsed.corrupt}`);
|
|
85
|
+
else if ("newer" in parsed)
|
|
86
|
+
return input.warn(`the run index at ${where} is contract ${parsed.newer}, which this chant does not write; it is left as it is`);
|
|
87
|
+
else
|
|
88
|
+
runs = parsed.index.runs;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
return input.warn(`could not read the run index at ${where}, so it is not updated: ${messageOf(err)}`);
|
|
93
|
+
}
|
|
94
|
+
const index = {
|
|
95
|
+
$schema: CI_RUN_INDEX_SCHEMA_ID,
|
|
96
|
+
contract: CI_RUN_INDEX_CONTRACT,
|
|
97
|
+
chant: readerVersion(),
|
|
98
|
+
updated: (input.now?.() ?? new Date()).toISOString(),
|
|
99
|
+
runs: addRunEntry(runs, input.entry, limit),
|
|
100
|
+
};
|
|
101
|
+
try {
|
|
102
|
+
await put(CI_RUN_INDEX_KEY, JSON.stringify(index, null, 2) + "\n", "application/json");
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
input.warn(`could not write the run index at ${where}: ${messageOf(err)}`);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const previous = turns.get(where) ?? Promise.resolve();
|
|
109
|
+
const next = previous.then(work, work);
|
|
110
|
+
const settled = next.catch(() => undefined);
|
|
111
|
+
turns.set(where, settled);
|
|
112
|
+
void settled.then(() => {
|
|
113
|
+
if (turns.get(where) === settled)
|
|
114
|
+
turns.delete(where);
|
|
115
|
+
});
|
|
116
|
+
return next.catch((err) => input.warn(`could not update the run index at ${where}: ${messageOf(err)}`));
|
|
117
|
+
}
|
|
118
|
+
/** The index at `target`, or null when none is there. Throws a line a person can read when it can't be read. */
|
|
119
|
+
export async function readCiRunIndex(target, get = reportGet(target)) {
|
|
120
|
+
const where = `${target.url}/${CI_RUN_INDEX_KEY}`;
|
|
121
|
+
const text = await get(CI_RUN_INDEX_KEY);
|
|
122
|
+
if (text === null)
|
|
123
|
+
return null;
|
|
124
|
+
const parsed = parseCiRunIndex(text);
|
|
125
|
+
if ("corrupt" in parsed)
|
|
126
|
+
throw new Error(`the run index at ${where} is unusable: ${parsed.corrupt}`);
|
|
127
|
+
if ("newer" in parsed)
|
|
128
|
+
throw new Error(`the run index at ${where} is contract ${parsed.newer}; this chant reads contract ${CI_RUN_INDEX_CONTRACT}`);
|
|
129
|
+
return parsed.index;
|
|
130
|
+
}
|
|
131
|
+
/** The text `chant ci runs` prints: one line per run, newest first. */
|
|
132
|
+
export function formatCiRunIndex(index) {
|
|
133
|
+
if (index.runs.length === 0)
|
|
134
|
+
return "no runs in the index";
|
|
135
|
+
return index.runs
|
|
136
|
+
.map((r) => {
|
|
137
|
+
const pr = r.pr === null ? "no PR" : `PR ${r.pr}`;
|
|
138
|
+
const why = r.status === "fail" ? ` (${r.failure?.code ?? "failed"})` : "";
|
|
139
|
+
return `${r.ended} ${r.job.padEnd(5)} ${r.status}${why} ${pr} ${r.commit.slice(0, 12)} ${r.runId} ${r.key}${r.signer ? ` signed by ${r.signer}` : ""}`;
|
|
140
|
+
})
|
|
141
|
+
.join("\n");
|
|
142
|
+
}
|
|
143
|
+
const RUNS_USAGE = "chant ci runs [--report-url <s3://<bucket>/<prefix> | file://<directory>>] [--json]";
|
|
144
|
+
/** `chant ci runs` (#4098): list the index at the report URL. */
|
|
145
|
+
export async function runCiRuns(ctx) {
|
|
146
|
+
try {
|
|
147
|
+
// #4160: without --report-url, the declaration's ci.reportUrl.
|
|
148
|
+
const raw = await reportUrlOf(ctx.args.reportUrl, process.cwd());
|
|
149
|
+
if (!raw)
|
|
150
|
+
throw new Error("--report-url names where the index is kept, unless the workspace declares ci.reportUrl");
|
|
151
|
+
const target = parseReportUrl(raw);
|
|
152
|
+
if ("error" in target)
|
|
153
|
+
throw new Error(target.error);
|
|
154
|
+
const index = await readCiRunIndex(target);
|
|
155
|
+
if (index === null)
|
|
156
|
+
throw new Error(`there is no run index at ${target.url}/${CI_RUN_INDEX_KEY}`);
|
|
157
|
+
console.log(ctx.args.json ? JSON.stringify(index, null, 2) : formatCiRunIndex(index));
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
console.error(formatError({ message: `chant ci runs: ${messageOf(err)}`, hint: RUNS_USAGE }));
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/chant/schemas/workspace/ci-run-index/v1/ci-run-index.schema.json",
|
|
4
|
+
"title": "chant ci run index",
|
|
5
|
+
"description": "The runs the chant runner has run, kept at <report-url>/runs/index.json (#4098, epic #4101) so a reader outside CI finds them without a forge or a workflow file. `chant ci run` adds an entry to the front after each job settles when --report-url is set, so the list is newest first, and keeps the newest 200 entries unless --run-index-limit says otherwise. `chant ci runs --json` prints the same document. An entry's `key` is the folder the job's report is under, below the report URL. The update is a read, a change and a write of the whole file, through the same s3:// and file:// paths the report upload uses; a file:// write goes through a temporary name and a rename. Two runners updating one index at once can lose an entry. That is out of scope, because `chant ci serve` is one host. Version 1 of the workspace read contract. Readers ignore fields they do not know; a field is only ever added within a version. Written by chant 0.124.31 and newer. Added within contract 1 at chant 0.124.32: an entry's signer (#4156) and exitCode (#4165); an entry from an older chant lacks them.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["$schema", "contract", "chant", "updated", "runs"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": { "const": "https://intentius.io/chant/schemas/workspace/ci-run-index/v1/ci-run-index.schema.json" },
|
|
10
|
+
"contract": { "const": 1 },
|
|
11
|
+
"chant": { "type": "string", "description": "The chant that last wrote the index." },
|
|
12
|
+
"updated": { "type": "string", "description": "When the index was last written." },
|
|
13
|
+
"runs": {
|
|
14
|
+
"type": "array",
|
|
15
|
+
"description": "Newest first, at most the limit the writer was given (200 by default).",
|
|
16
|
+
"items": { "$ref": "#/$defs/run" }
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"$defs": {
|
|
20
|
+
"run": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"required": ["job", "pr", "commit", "status", "started", "ended", "runId", "key", "runOrigin"],
|
|
23
|
+
"if": { "properties": { "status": { "const": "fail" } } },
|
|
24
|
+
"then": { "required": ["failure"], "properties": { "failure": { "type": "object" } } },
|
|
25
|
+
"properties": {
|
|
26
|
+
"job": { "enum": ["plan", "apply"] },
|
|
27
|
+
"pr": { "type": ["integer", "null"], "minimum": 1, "description": "The pull or merge request number: the one the job's report names, else --pr. null when neither has one." },
|
|
28
|
+
"commit": { "type": "string", "pattern": "^[0-9a-f]{40,64}$", "description": "The full commit the job ran at." },
|
|
29
|
+
"status": { "enum": ["ok", "fail"] },
|
|
30
|
+
"failure": {
|
|
31
|
+
"type": "object",
|
|
32
|
+
"required": ["code"],
|
|
33
|
+
"description": "Present when status is fail. The same code the run record's failure carries: setup-failed, build-failed, a report's refusal or status, or command-failed.",
|
|
34
|
+
"properties": { "code": { "type": "string" } }
|
|
35
|
+
},
|
|
36
|
+
"member": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,39}$", "description": "The workspace member whose pipeline the job ran for. Absent outside a member." },
|
|
37
|
+
"started": { "type": "string", "description": "ISO-8601 instant the job started." },
|
|
38
|
+
"ended": { "type": "string", "description": "ISO-8601 instant the job settled." },
|
|
39
|
+
"runId": { "type": "string", "description": "The Op run id, as in the run ledger on chant/lifecycle." },
|
|
40
|
+
"key": { "type": "string", "description": "reportKey(pr, commit): <pr>/<commit>, with /<member> after for a member, and unknown for a missing pr. The job's report is <report-url>/<key>/pr-<job>.json." },
|
|
41
|
+
"signer": { "type": ["string", "null"], "description": "Added within contract 1 by #4156, written by chant 0.124.32 and newer. The runner whose key signed the run's record, or null for an unsigned run. Signing is optional, and an unsigned run is listed like any other." },
|
|
42
|
+
"exitCode": { "type": "integer", "minimum": 0, "maximum": 255, "description": "Added within contract 1 by #4165, written by chant 0.124.32 and newer. The code chant ci run exited with for the job: 0 for a passed job, else the command's own code when it is 1 to 255, such as 3 for a plan that moved after review or a wave waiting at its gate, else 1. A reader tells a held run from a failed one by it when the report carries no refusal. An entry from an older chant lacks it." },
|
|
43
|
+
"runOrigin": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"required": ["forge"],
|
|
46
|
+
"description": "Where the run says it ran. { forge: \"chant\" } for a job the chant runner ran. From chant 0.124.32 a forge job that runs chant ci run names the forge's run (#4156): forge github (GitHub and Forgejo) or gitlab, with repo, url, jobId and attempt when the forge gives them.",
|
|
47
|
+
"properties": { "forge": { "type": "string" }, "repo": { "type": "string" }, "url": { "type": "string" }, "jobId": { "type": "string" }, "attempt": { "type": "integer", "minimum": 1 } }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|