@intentius/chant 0.124.27 → 0.124.29
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/README.md +1 -1
- package/dist/__golden__/wave-loop/fan-out-gated.json +8 -0
- package/dist/__golden__/wave-loop/fan-out-no-members.json +4 -0
- package/dist/__golden__/wave-loop/fan-out-only.json +6 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +2 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +3 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
- package/dist/__golden__/wave-loop/op-held-on.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +3 -0
- package/dist/__golden__/wave-loop/op-per-run.json +7 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +7 -0
- package/dist/__golden__/wave-loop/op-sealed.json +3 -0
- package/dist/__golden__/wave-loop/op-spend.json +3 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +7 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +4 -0
- package/dist/build-params.d.ts +34 -1
- package/dist/build-params.d.ts.map +1 -1
- package/dist/build-params.js +31 -1
- package/dist/change-set-graph.d.ts +63 -0
- package/dist/change-set-graph.d.ts.map +1 -0
- package/dist/change-set-graph.js +130 -0
- package/dist/change-set.d.ts +62 -3
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +36 -4
- package/dist/chant-version.d.ts +9 -0
- package/dist/chant-version.d.ts.map +1 -0
- package/dist/chant-version.js +16 -0
- package/dist/cli/build-params-cli.d.ts +7 -1
- package/dist/cli/build-params-cli.d.ts.map +1 -1
- package/dist/cli/build-params-cli.js +17 -8
- package/dist/cli/commands/build.d.ts +8 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +15 -11
- package/dist/cli/commands/check-lexicon-docs.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-docs.js +30 -2
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.js +13 -2
- package/dist/cli/commands/init-lexicon/templates/docs.d.ts +4 -1
- package/dist/cli/commands/init-lexicon/templates/docs.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/docs.js +6 -6
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.js +17 -8
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +64 -4
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +43 -4
- package/dist/cli/handlers/change-set.d.ts +10 -0
- package/dist/cli/handlers/change-set.d.ts.map +1 -1
- package/dist/cli/handlers/change-set.js +51 -1
- package/dist/cli/handlers/fan-out.d.ts +10 -1
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +54 -6
- package/dist/cli/handlers/lifecycle-gc.d.ts +19 -0
- package/dist/cli/handlers/lifecycle-gc.d.ts.map +1 -0
- package/dist/cli/handlers/lifecycle-gc.js +143 -0
- package/dist/cli/handlers/pr.d.ts +16 -2
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +269 -37
- package/dist/cli/handlers/promote.d.ts +7 -0
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +440 -28
- package/dist/cli/handlers/release.d.ts +91 -0
- package/dist/cli/handlers/release.d.ts.map +1 -0
- package/dist/cli/handlers/release.js +589 -0
- package/dist/cli/handlers/run.d.ts +38 -2
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +234 -16
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +143 -17
- package/dist/cli/mcp/workspace-tools.js +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +73 -5
- package/dist/cli/registry.d.ts +43 -5
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/run-events.d.ts +30 -0
- package/dist/cli/run-events.d.ts.map +1 -0
- package/dist/cli/run-events.js +49 -0
- package/dist/cli/version.d.ts +3 -5
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +3 -13
- package/dist/codegen/docs-in-site.d.ts +71 -0
- package/dist/codegen/docs-in-site.d.ts.map +1 -0
- package/dist/codegen/docs-in-site.js +177 -0
- package/dist/codegen/docs-types.d.ts +14 -1
- package/dist/codegen/docs-types.d.ts.map +1 -1
- package/dist/codegen/docs.d.ts +18 -1
- package/dist/codegen/docs.d.ts.map +1 -1
- package/dist/codegen/docs.js +40 -7
- package/dist/codegen/rehype-base-url.mjs +15 -9
- package/dist/components/auto-release.d.ts +6 -1
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/auto-release.js +3 -0
- package/dist/components/capability.d.ts +9 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/cli-support.d.ts +6 -0
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +10 -9
- package/dist/components/driver.d.ts +50 -9
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +116 -54
- package/dist/components/fan-out-inputs.d.ts +69 -0
- package/dist/components/fan-out-inputs.d.ts.map +1 -0
- package/dist/components/fan-out-inputs.js +169 -0
- package/dist/components/fan-out-record.d.ts +13 -0
- package/dist/components/fan-out-record.d.ts.map +1 -1
- package/dist/components/fan-out-record.js +16 -0
- package/dist/components/fan-out-run.d.ts +7 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +85 -26
- package/dist/components/fan-out.d.ts +4 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/pr-pipeline.d.ts +25 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +22 -4
- package/dist/components/pr-run.d.ts +11 -0
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +20 -1
- package/dist/components/promote-order.d.ts +38 -0
- package/dist/components/promote-order.d.ts.map +1 -0
- package/dist/components/promote-order.js +62 -0
- package/dist/components/promote.d.ts +38 -2
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +77 -2
- package/dist/components/release-compile.d.ts +142 -0
- package/dist/components/release-compile.d.ts.map +1 -0
- package/dist/components/release-compile.js +382 -0
- package/dist/components/release-gate.d.ts +135 -0
- package/dist/components/release-gate.d.ts.map +1 -0
- package/dist/components/release-gate.js +288 -0
- package/dist/components/release-promote.d.ts +96 -0
- package/dist/components/release-promote.d.ts.map +1 -0
- package/dist/components/release-promote.js +204 -0
- package/dist/components/run-progress.d.ts +7 -0
- package/dist/components/run-progress.d.ts.map +1 -1
- package/dist/components/wave-plan.d.ts +8 -1
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +11 -3
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/flag-params.d.ts +54 -0
- package/dist/flag-params.d.ts.map +1 -0
- package/dist/flag-params.js +130 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.d.ts +120 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.js +304 -0
- package/dist/lifecycle/change-set-store.d.ts +68 -0
- package/dist/lifecycle/change-set-store.d.ts.map +1 -0
- package/dist/lifecycle/change-set-store.js +97 -0
- package/dist/lifecycle/commit-sha.d.ts +13 -0
- package/dist/lifecycle/commit-sha.d.ts.map +1 -0
- package/dist/lifecycle/commit-sha.js +21 -0
- package/dist/lifecycle/delivery-metrics.d.ts +139 -0
- package/dist/lifecycle/delivery-metrics.d.ts.map +1 -0
- package/dist/lifecycle/delivery-metrics.js +145 -0
- package/dist/lifecycle/deploy-outcome.d.ts +81 -0
- package/dist/lifecycle/deploy-outcome.d.ts.map +1 -0
- package/dist/lifecycle/deploy-outcome.js +101 -0
- package/dist/lifecycle/gate-change-set.d.ts +78 -0
- package/dist/lifecycle/gate-change-set.d.ts.map +1 -0
- package/dist/lifecycle/gate-change-set.js +138 -0
- package/dist/lifecycle/gate-ledger.d.ts +51 -4
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +18 -0
- package/dist/lifecycle/git.d.ts +30 -1
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/git.js +31 -5
- package/dist/lifecycle/index.d.ts +4 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +4 -0
- package/dist/lifecycle/mixed-environment.d.ts +95 -0
- package/dist/lifecycle/mixed-environment.d.ts.map +1 -0
- package/dist/lifecycle/mixed-environment.js +154 -0
- package/dist/lifecycle/publish-attachments.d.ts +79 -0
- package/dist/lifecycle/publish-attachments.d.ts.map +1 -0
- package/dist/lifecycle/publish-attachments.js +179 -0
- package/dist/lifecycle/publish-credentials.d.ts +37 -0
- package/dist/lifecycle/publish-credentials.d.ts.map +1 -0
- package/dist/lifecycle/publish-credentials.js +69 -0
- package/dist/lifecycle/publish-declaration.d.ts +97 -0
- package/dist/lifecycle/publish-declaration.d.ts.map +1 -0
- package/dist/lifecycle/publish-declaration.js +83 -0
- package/dist/lifecycle/publish-forge.d.ts +53 -0
- package/dist/lifecycle/publish-forge.d.ts.map +1 -0
- package/dist/lifecycle/publish-forge.js +298 -0
- package/dist/lifecycle/publish-npm.d.ts +61 -0
- package/dist/lifecycle/publish-npm.d.ts.map +1 -0
- package/dist/lifecycle/publish-npm.js +242 -0
- package/dist/lifecycle/publish-oci.d.ts +64 -0
- package/dist/lifecycle/publish-oci.d.ts.map +1 -0
- package/dist/lifecycle/publish-oci.js +383 -0
- package/dist/lifecycle/publish-record.d.ts +66 -0
- package/dist/lifecycle/publish-record.d.ts.map +1 -0
- package/dist/lifecycle/publish-record.js +84 -0
- package/dist/lifecycle/publish-targets.d.ts +45 -0
- package/dist/lifecycle/publish-targets.d.ts.map +1 -0
- package/dist/lifecycle/publish-targets.js +85 -0
- package/dist/lifecycle/release-cut.d.ts +154 -0
- package/dist/lifecycle/release-cut.d.ts.map +1 -0
- package/dist/lifecycle/release-cut.js +366 -0
- package/dist/lifecycle/release-join.d.ts +95 -0
- package/dist/lifecycle/release-join.d.ts.map +1 -0
- package/dist/lifecycle/release-join.js +139 -0
- package/dist/lifecycle/release-ledger.d.ts +54 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +53 -20
- package/dist/lifecycle/release-publish.d.ts +312 -0
- package/dist/lifecycle/release-publish.d.ts.map +1 -0
- package/dist/lifecycle/release-publish.js +335 -0
- package/dist/lifecycle/release-revocation.d.ts +80 -0
- package/dist/lifecycle/release-revocation.d.ts.map +1 -0
- package/dist/lifecycle/release-revocation.js +123 -0
- package/dist/lifecycle/release-store.d.ts +200 -0
- package/dist/lifecycle/release-store.d.ts.map +1 -0
- package/dist/lifecycle/release-store.js +320 -0
- package/dist/lifecycle/release-verify.d.ts +61 -0
- package/dist/lifecycle/release-verify.d.ts.map +1 -0
- package/dist/lifecycle/release-verify.js +92 -0
- package/dist/lifecycle/release-workstation.d.ts +91 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -0
- package/dist/lifecycle/release-workstation.js +180 -0
- package/dist/lifecycle/retention-policy.d.ts +45 -0
- package/dist/lifecycle/retention-policy.d.ts.map +1 -0
- package/dist/lifecycle/retention-policy.js +43 -0
- package/dist/lifecycle/retention.d.ts +185 -0
- package/dist/lifecycle/retention.d.ts.map +1 -0
- package/dist/lifecycle/retention.js +400 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -0
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +2 -0
- package/dist/op/activities/change-coverage.d.ts.map +1 -1
- package/dist/op/activities/change-coverage.js +4 -2
- package/dist/op/activities/source-release.d.ts.map +1 -1
- package/dist/op/activities/source-release.js +7 -3
- package/dist/op/activities/source-rollback.d.ts.map +1 -1
- package/dist/op/activities/source-rollback.js +7 -3
- package/dist/op/gate-name.d.ts +11 -2
- package/dist/op/gate-name.d.ts.map +1 -1
- package/dist/op/gate-name.js +12 -3
- package/dist/op/gate-run-locator.d.ts +22 -0
- package/dist/op/gate-run-locator.d.ts.map +1 -1
- package/dist/op/gate-run-locator.js +31 -0
- package/dist/op/gate.d.ts +27 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +57 -3
- package/dist/op/local-executor.d.ts +36 -1
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +158 -52
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +4 -0
- package/dist/op/run-live.d.ts +2 -0
- package/dist/op/run-live.d.ts.map +1 -1
- package/dist/op/run-live.js +1 -1
- package/dist/op/runtime.d.ts +46 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/op/runtimes/local.js +8 -0
- package/dist/plan-summary.d.ts.map +1 -1
- package/dist/plan-summary.js +8 -2
- package/dist/point-decision.d.ts +2 -0
- package/dist/point-decision.d.ts.map +1 -1
- package/dist/point-decision.js +9 -2
- package/dist/pr-loop.d.ts +7 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +23 -4
- package/dist/pr-report-url.d.ts +82 -0
- package/dist/pr-report-url.d.ts.map +1 -0
- package/dist/pr-report-url.js +174 -0
- package/dist/provenance.d.ts +2 -2
- package/dist/provenance.d.ts.map +1 -1
- package/dist/run-event-store.d.ts +104 -0
- package/dist/run-event-store.d.ts.map +1 -0
- package/dist/run-event-store.js +251 -0
- package/dist/run-event-stream.d.ts +133 -0
- package/dist/run-event-stream.d.ts.map +1 -0
- package/dist/run-event-stream.js +242 -0
- package/dist/run-event.d.ts +285 -0
- package/dist/run-event.d.ts.map +1 -0
- package/dist/run-event.js +209 -0
- package/dist/wave-runtime.mjs +262 -226
- package/dist/workspace/__fixtures__/flag-workspace.d.ts +31 -0
- package/dist/workspace/__fixtures__/flag-workspace.d.ts.map +1 -0
- package/dist/workspace/__fixtures__/flag-workspace.js +114 -0
- package/dist/workspace/__fixtures__/run-event-check.d.ts +19 -0
- package/dist/workspace/__fixtures__/run-event-check.d.ts.map +1 -0
- package/dist/workspace/__fixtures__/run-event-check.js +59 -0
- package/dist/workspace/change-set-show.d.ts +56 -0
- package/dist/workspace/change-set-show.d.ts.map +1 -0
- package/dist/workspace/change-set-show.js +54 -0
- package/dist/workspace/change-set-show.schema.json +102 -0
- package/dist/workspace/change-set.schema.json +32 -1
- package/dist/workspace/changes-cli.d.ts.map +1 -1
- package/dist/workspace/changes-cli.js +10 -1
- package/dist/workspace/changes.d.ts +37 -0
- package/dist/workspace/changes.d.ts.map +1 -1
- package/dist/workspace/changes.js +49 -2
- package/dist/workspace/changes.schema.json +135 -0
- package/dist/workspace/check.schema.json +4 -2
- package/dist/workspace/checks/records.d.ts +9 -1
- package/dist/workspace/checks/records.d.ts.map +1 -1
- package/dist/workspace/checks/records.js +35 -1
- package/dist/workspace/checks.d.ts +1 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +2 -1
- package/dist/workspace/ci-green-cli.d.ts +19 -4
- package/dist/workspace/ci-green-cli.d.ts.map +1 -1
- package/dist/workspace/ci-green-cli.js +75 -12
- package/dist/workspace/ci-green-forge.d.ts +20 -3
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green-forge.js +6 -4
- package/dist/workspace/ci-green-workflow.d.ts +11 -0
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +6 -0
- package/dist/workspace/ci-green.d.ts +281 -13
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +456 -38
- package/dist/workspace/ci-last-green.schema.json +32 -2
- package/dist/workspace/ci-list.schema.json +525 -0
- package/dist/workspace/commit-links.d.ts +85 -0
- package/dist/workspace/commit-links.d.ts.map +1 -0
- package/dist/workspace/commit-links.js +163 -0
- package/dist/workspace/declaration.d.ts +35 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +27 -1
- package/dist/workspace/declaration.schema.json +76 -0
- package/dist/workspace/declared-kinds.d.ts +16 -0
- package/dist/workspace/declared-kinds.d.ts.map +1 -1
- package/dist/workspace/declared-kinds.js +25 -0
- package/dist/workspace/delivery-metrics.d.ts +91 -0
- package/dist/workspace/delivery-metrics.d.ts.map +1 -0
- package/dist/workspace/delivery-metrics.js +217 -0
- package/dist/workspace/delivery-metrics.schema.json +519 -0
- package/dist/workspace/flags-read.d.ts +37 -0
- package/dist/workspace/flags-read.d.ts.map +1 -0
- package/dist/workspace/flags-read.js +103 -0
- package/dist/workspace/flags.d.ts +100 -0
- package/dist/workspace/flags.d.ts.map +1 -0
- package/dist/workspace/flags.js +98 -0
- package/dist/workspace/graph-cli.js +1 -1
- package/dist/workspace/identity-gate-rule.d.ts +37 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -1
- package/dist/workspace/identity-gate-rule.js +72 -7
- package/dist/workspace/identity.d.ts +12 -0
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +13 -1
- package/dist/workspace/intent-cli.d.ts +11 -2
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-cli.js +54 -5
- package/dist/workspace/intent-trace.d.ts +219 -0
- package/dist/workspace/intent-trace.d.ts.map +1 -0
- package/dist/workspace/intent-trace.js +314 -0
- package/dist/workspace/intent.d.ts +36 -7
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +192 -22
- package/dist/workspace/intent.schema.json +702 -6
- package/dist/workspace/ls.d.ts +4 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +2 -0
- package/dist/workspace/ls.schema.json +3 -1
- package/dist/workspace/member-pipeline.d.ts +6 -0
- package/dist/workspace/member-pipeline.d.ts.map +1 -1
- package/dist/workspace/member-pipeline.js +6 -0
- package/dist/workspace/overlap.d.ts +146 -0
- package/dist/workspace/overlap.d.ts.map +1 -0
- package/dist/workspace/overlap.js +276 -0
- package/dist/workspace/promotion-order.d.ts +41 -0
- package/dist/workspace/promotion-order.d.ts.map +1 -0
- package/dist/workspace/promotion-order.js +95 -0
- package/dist/workspace/reason-codes.d.ts +4 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +7 -1
- package/dist/workspace/records.d.ts +15 -2
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/records.js +32 -0
- package/dist/workspace/records.schema.json +21 -2
- package/dist/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
- package/dist/workspace/reference-kinds/flag/flag.schema.json +53 -0
- package/dist/workspace/releases.d.ts +81 -0
- package/dist/workspace/releases.d.ts.map +1 -0
- package/dist/workspace/releases.js +103 -0
- package/dist/workspace/releases.schema.json +513 -0
- package/dist/workspace/run-event.schema.json +295 -0
- package/dist/workspace/status-gates.d.ts +34 -1
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status-gates.js +31 -2
- package/dist/workspace/status-stewards.d.ts +4 -0
- package/dist/workspace/status-stewards.d.ts.map +1 -1
- package/dist/workspace/status-stewards.js +2 -0
- package/dist/workspace/status.d.ts +117 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +218 -4
- package/dist/workspace/status.schema.json +268 -2
- package/dist/workspace/trust/ci-tag-statement.d.ts +102 -0
- package/dist/workspace/trust/ci-tag-statement.d.ts.map +1 -0
- package/dist/workspace/trust/ci-tag-statement.js +123 -0
- package/dist/workspace/trust/op-run-statement.d.ts +91 -0
- package/dist/workspace/trust/op-run-statement.d.ts.map +1 -0
- package/dist/workspace/trust/op-run-statement.js +143 -0
- package/dist/workspace/trust/rotation.d.ts +18 -2
- package/dist/workspace/trust/rotation.d.ts.map +1 -1
- package/dist/workspace/trust/rotation.js +65 -16
- package/dist/workspace/trust/seal.d.ts +11 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/seal.js +9 -0
- package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
- package/dist/workspace/trust/ssh-commit.js +10 -10
- package/dist/workspace/wip.d.ts.map +1 -1
- package/dist/workspace/wip.js +11 -3
- package/package.json +1 -1
- package/src/__golden__/wave-loop/fan-out-gated.json +8 -0
- package/src/__golden__/wave-loop/fan-out-no-members.json +4 -0
- package/src/__golden__/wave-loop/fan-out-only.json +6 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +2 -0
- package/src/__golden__/wave-loop/op-cost-member.json +3 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
- package/src/__golden__/wave-loop/op-held-on.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +3 -0
- package/src/__golden__/wave-loop/op-per-run.json +7 -0
- package/src/__golden__/wave-loop/op-pr-review.json +7 -0
- package/src/__golden__/wave-loop/op-sealed.json +3 -0
- package/src/__golden__/wave-loop/op-spend.json +3 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +7 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +4 -0
- package/src/build-params.test.ts +46 -0
- package/src/build-params.ts +55 -1
- package/src/change-set-graph.test.ts +72 -0
- package/src/change-set-graph.ts +141 -0
- package/src/change-set.ts +87 -6
- package/src/chant-version.ts +16 -0
- package/src/cli/build-params-cli.ts +22 -9
- package/src/cli/commands/build.ts +25 -11
- package/src/cli/commands/check-lexicon-docs.test.ts +51 -0
- package/src/cli/commands/check-lexicon-docs.ts +39 -2
- package/src/cli/commands/check-lexicon.ts +14 -2
- package/src/cli/commands/init-lexicon/templates/docs.ts +7 -6
- package/src/cli/commands/init-lexicon.test.ts +25 -0
- package/src/cli/commands/init-lexicon.ts +18 -8
- package/src/cli/handlers/approve-release.test.ts +84 -0
- package/src/cli/handlers/approve-revoked.test.ts +155 -0
- package/src/cli/handlers/approve.ts +65 -2
- package/src/cli/handlers/build.test.ts +67 -0
- package/src/cli/handlers/build.ts +46 -4
- package/src/cli/handlers/change-set.ts +49 -1
- package/src/cli/handlers/fan-out.test.ts +228 -1
- package/src/cli/handlers/fan-out.ts +53 -6
- package/src/cli/handlers/intent-trace.e2e.test.ts +201 -0
- package/src/cli/handlers/lifecycle-gc.test.ts +126 -0
- package/src/cli/handlers/lifecycle-gc.ts +146 -0
- package/src/cli/handlers/operator.test.ts +37 -0
- package/src/cli/handlers/pr.test.ts +341 -0
- package/src/cli/handlers/pr.ts +292 -47
- package/src/cli/handlers/promote.test.ts +669 -7
- package/src/cli/handlers/promote.ts +464 -29
- package/src/cli/handlers/release-implicit.e2e.test.ts +161 -0
- package/src/cli/handlers/release-join.e2e.test.ts +185 -0
- package/src/cli/handlers/release-publish-targets.e2e.test.ts +295 -0
- package/src/cli/handlers/release-verify.e2e.test.ts +117 -0
- package/src/cli/handlers/release-workstation-ci.e2e.test.ts +135 -0
- package/src/cli/handlers/release.e2e.test.ts +199 -0
- package/src/cli/handlers/release.ts +593 -0
- package/src/cli/handlers/run-auto-release.test.ts +80 -0
- package/src/cli/handlers/run-events-cmd.test.ts +92 -0
- package/src/cli/handlers/run-release.test.ts +55 -0
- package/src/cli/handlers/run.test.ts +30 -0
- package/src/cli/handlers/run.ts +243 -18
- package/src/cli/main.test.ts +8 -0
- package/src/cli/main.ts +143 -17
- package/src/cli/mcp/never-over-mcp.test.ts +2 -0
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/cli/parse-args.ts +56 -5
- package/src/cli/registry.ts +43 -5
- package/src/cli/run-events.ts +57 -0
- package/src/cli/version.ts +3 -13
- package/src/codegen/docs-in-site.test.ts +166 -0
- package/src/codegen/docs-in-site.ts +182 -0
- package/src/codegen/docs-site/AgentPrompt.astro +26 -1
- package/src/codegen/docs-types.ts +14 -1
- package/src/codegen/docs.ts +60 -7
- package/src/codegen/rehype-base-url.d.mts +3 -1
- package/src/codegen/rehype-base-url.mjs +15 -9
- package/src/codegen/rehype-base-url.test.ts +34 -0
- package/src/components/auto-release.test.ts +30 -0
- package/src/components/auto-release.ts +9 -1
- package/src/components/capability.ts +9 -0
- package/src/components/cli-support.test.ts +82 -0
- package/src/components/cli-support.ts +16 -9
- package/src/components/driver.test.ts +24 -0
- package/src/components/driver.ts +165 -56
- package/src/components/fan-out-inputs.test.ts +85 -0
- package/src/components/fan-out-inputs.ts +192 -0
- package/src/components/fan-out-record.test.ts +10 -0
- package/src/components/fan-out-record.ts +19 -0
- package/src/components/fan-out-run.ts +104 -35
- package/src/components/fan-out.ts +4 -0
- package/src/components/pr-pipeline.ts +35 -4
- package/src/components/pr-run.ts +30 -1
- package/src/components/promote-order.test.ts +90 -0
- package/src/components/promote-order.ts +75 -0
- package/src/components/promote.test.ts +10 -1
- package/src/components/promote.ts +94 -3
- package/src/components/release-compile.test.ts +147 -0
- package/src/components/release-compile.ts +459 -0
- package/src/components/release-gate.test.ts +215 -0
- package/src/components/release-gate.ts +355 -0
- package/src/components/release-promote.test.ts +159 -0
- package/src/components/release-promote.ts +232 -0
- package/src/components/run-progress.ts +7 -0
- package/src/components/wave-plan.ts +16 -3
- package/src/config.ts +15 -1
- package/src/flag-params.test.ts +144 -0
- package/src/flag-params.ts +134 -0
- package/src/index.ts +2 -0
- package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
- package/src/lifecycle/change-set-store.test.ts +217 -0
- package/src/lifecycle/change-set-store.ts +113 -0
- package/src/lifecycle/commit-sha.ts +23 -0
- package/src/lifecycle/delivery-metrics.ts +263 -0
- package/src/lifecycle/deploy-outcome.ts +147 -0
- package/src/lifecycle/gate-change-set.e2e.test.ts +122 -0
- package/src/lifecycle/gate-change-set.ts +164 -0
- package/src/lifecycle/gate-ledger.test.ts +33 -0
- package/src/lifecycle/gate-ledger.ts +68 -3
- package/src/lifecycle/git.ts +61 -8
- package/src/lifecycle/index.ts +4 -0
- package/src/lifecycle/mixed-environment.test.ts +97 -0
- package/src/lifecycle/mixed-environment.ts +204 -0
- package/src/lifecycle/publish-attachments.ts +196 -0
- package/src/lifecycle/publish-credentials.ts +84 -0
- package/src/lifecycle/publish-declaration.ts +95 -0
- package/src/lifecycle/publish-forge.ts +325 -0
- package/src/lifecycle/publish-npm.ts +259 -0
- package/src/lifecycle/publish-oci.ts +396 -0
- package/src/lifecycle/publish-record.ts +113 -0
- package/src/lifecycle/publish-resume.test.ts +168 -0
- package/src/lifecycle/publish-targets.test.ts +494 -0
- package/src/lifecycle/publish-targets.ts +100 -0
- package/src/lifecycle/release-cut-signed.test.ts +180 -0
- package/src/lifecycle/release-cut.test.ts +483 -0
- package/src/lifecycle/release-cut.ts +503 -0
- package/src/lifecycle/release-flag.test.ts +112 -0
- package/src/lifecycle/release-join.test.ts +68 -0
- package/src/lifecycle/release-join.ts +182 -0
- package/src/lifecycle/release-ledger.test.ts +14 -0
- package/src/lifecycle/release-ledger.ts +85 -17
- package/src/lifecycle/release-publish.test.ts +225 -0
- package/src/lifecycle/release-publish.ts +568 -0
- package/src/lifecycle/release-revocation.ts +147 -0
- package/src/lifecycle/release-store.ts +434 -0
- package/src/lifecycle/release-verify.test.ts +110 -0
- package/src/lifecycle/release-verify.ts +120 -0
- package/src/lifecycle/release-workstation.test.ts +204 -0
- package/src/lifecycle/release-workstation.ts +216 -0
- package/src/lifecycle/retention-growth.e2e.test.ts +279 -0
- package/src/lifecycle/retention-policy.ts +63 -0
- package/src/lifecycle/retention.test.ts +363 -0
- package/src/lifecycle/retention.ts +508 -0
- package/src/lifecycle/run-ledger.test.ts +10 -0
- package/src/lifecycle/run-ledger.ts +6 -0
- package/src/op/activities/change-coverage.ts +4 -1
- package/src/op/activities/source-release.ts +8 -3
- package/src/op/activities/source-rollback.ts +8 -4
- package/src/op/commit-run-gate-deploy-join.test.ts +117 -0
- package/src/op/gate-name.ts +13 -3
- package/src/op/gate-release.test.ts +126 -0
- package/src/op/gate-run-locator.test.ts +110 -0
- package/src/op/gate-run-locator.ts +35 -0
- package/src/op/gate.ts +88 -6
- package/src/op/local-executor.ts +207 -52
- package/src/op/op-waves-run.ts +4 -0
- package/src/op/run-events.test.ts +166 -0
- package/src/op/run-live.ts +1 -1
- package/src/op/runtime.ts +39 -0
- package/src/op/runtimes/local.test.ts +16 -0
- package/src/op/runtimes/local.ts +9 -0
- package/src/plan-summary.test.ts +20 -0
- package/src/plan-summary.ts +8 -1
- package/src/point-decision.ts +12 -2
- package/src/pr-loop.ts +25 -4
- package/src/pr-report-url.test.ts +131 -0
- package/src/pr-report-url.ts +209 -0
- package/src/provenance.ts +2 -2
- package/src/run-event-store.test.ts +144 -0
- package/src/run-event-store.ts +273 -0
- package/src/run-event-stream.test.ts +175 -0
- package/src/run-event-stream.ts +309 -0
- package/src/run-event.test.ts +277 -0
- package/src/run-event.ts +471 -0
- package/src/wave-loop-golden.test.ts +9 -0
- package/src/workspace/__fixtures__/flag-workspace.ts +132 -0
- package/src/workspace/__fixtures__/older-records/change-set-984534ea9.json +100 -0
- package/src/workspace/__fixtures__/older-records/older-records.json +326 -0
- package/src/workspace/__fixtures__/run-event-check.ts +58 -0
- package/src/workspace/ancestry-index.test.ts +93 -0
- package/src/workspace/change-set-show.schema.json +102 -0
- package/src/workspace/change-set-show.ts +72 -0
- package/src/workspace/change-set.schema.json +32 -1
- package/src/workspace/changes-cli.ts +10 -1
- package/src/workspace/changes.schema.json +135 -0
- package/src/workspace/changes.test.ts +1 -1
- package/src/workspace/changes.ts +84 -2
- package/src/workspace/check.schema.json +4 -2
- package/src/workspace/checks/records.ts +35 -1
- package/src/workspace/checks.ts +2 -1
- package/src/workspace/ci-green-cli.ts +75 -13
- package/src/workspace/ci-green-forge.ts +24 -4
- package/src/workspace/ci-green-runs.test.ts +242 -0
- package/src/workspace/ci-green-signed.test.ts +302 -0
- package/src/workspace/ci-green-workflow.test.ts +16 -0
- package/src/workspace/ci-green-workflow.ts +12 -0
- package/src/workspace/ci-green.test.ts +131 -2
- package/src/workspace/ci-green.ts +635 -42
- package/src/workspace/ci-last-green.schema.json +32 -2
- package/src/workspace/ci-list.schema.json +525 -0
- package/src/workspace/commit-links.test.ts +279 -0
- package/src/workspace/commit-links.ts +183 -0
- package/src/workspace/declaration.schema.json +76 -0
- package/src/workspace/declaration.test.ts +28 -0
- package/src/workspace/declaration.ts +60 -2
- package/src/workspace/declared-kinds.ts +40 -1
- package/src/workspace/delivery-metrics.schema.json +519 -0
- package/src/workspace/delivery-metrics.test.ts +236 -0
- package/src/workspace/delivery-metrics.ts +286 -0
- package/src/workspace/flags-read.ts +121 -0
- package/src/workspace/flags.test.ts +141 -0
- package/src/workspace/flags.ts +157 -0
- package/src/workspace/graph-cli.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +91 -7
- package/src/workspace/identity.ts +14 -1
- package/src/workspace/intent-cli.ts +46 -5
- package/src/workspace/intent-trace.test.ts +173 -0
- package/src/workspace/intent-trace.ts +484 -0
- package/src/workspace/intent.schema.json +702 -6
- package/src/workspace/intent.ts +196 -26
- package/src/workspace/ls.schema.json +3 -1
- package/src/workspace/ls.ts +6 -0
- package/src/workspace/member-pipeline.test.ts +17 -0
- package/src/workspace/member-pipeline.ts +9 -0
- package/src/workspace/older-records.test.ts +412 -0
- package/src/workspace/overlap.test.ts +165 -0
- package/src/workspace/overlap.ts +340 -0
- package/src/workspace/promotion-order.ts +97 -0
- package/src/workspace/read-contract.e2e.test.ts +5 -1
- package/src/workspace/reason-codes.test.ts +7 -1
- package/src/workspace/reason-codes.ts +7 -1
- package/src/workspace/record-assets.test.ts +2 -1
- package/src/workspace/records-contract.e2e.test.ts +2 -1
- package/src/workspace/records.schema.json +21 -2
- package/src/workspace/records.ts +36 -2
- package/src/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
- package/src/workspace/reference-kinds/flag/flag.schema.json +53 -0
- package/src/workspace/releases.schema.json +513 -0
- package/src/workspace/releases.test.ts +108 -0
- package/src/workspace/releases.ts +133 -0
- package/src/workspace/run-event.schema.json +295 -0
- package/src/workspace/status-contract.test.ts +81 -1
- package/src/workspace/status-gates.ts +64 -1
- package/src/workspace/status-mixed.test.ts +152 -0
- package/src/workspace/status-revoked.test.ts +153 -0
- package/src/workspace/status-stewards.ts +6 -0
- package/src/workspace/status.schema.json +268 -2
- package/src/workspace/status.ts +334 -4
- package/src/workspace/trust/ci-tag-statement.ts +151 -0
- package/src/workspace/trust/op-run-statement.ts +148 -0
- package/src/workspace/trust/rotation.ts +61 -14
- package/src/workspace/trust/seal.ts +10 -0
- package/src/workspace/trust/ssh-commit.ts +10 -9
- package/src/workspace/wip.ts +11 -2
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/astro.config.mjs +0 -14
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/package.json +0 -16
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content/docs/index.mdx +0 -8
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content.config.ts +0 -15
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/tsconfig.json +0 -10
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The why chain of a region (#4023): for each commit the intent walk read,
|
|
3
|
+
* the work item it names, its ci tag, the release that shipped it, the gate
|
|
4
|
+
* resolutions that admitted that release and the deploy records per
|
|
5
|
+
* environment. "Who asked for this, and who let it ship" in one read.
|
|
6
|
+
*
|
|
7
|
+
* Every link is made by a record that already exists, and each one states
|
|
8
|
+
* that record in `source`, so a reader can follow it:
|
|
9
|
+
*
|
|
10
|
+
* - work item: a `Chant-Record` or `Chant-Lease` trailer, judged as #4029's
|
|
11
|
+
* `judgeCommitLink` judges it. A commit in a work item's window (the
|
|
12
|
+
* intent graph's `worked` bucket) is listed apart, as a window match, and
|
|
13
|
+
* never links it.
|
|
14
|
+
* - ci tag: `ci/green/<sha>` or `ci/revoked/<sha>`, judged as `release cut`
|
|
15
|
+
* judges it (#4031, `judgedCiTags`).
|
|
16
|
+
* - release: `_releases/<digest>.json`, whose `commit` is the commit itself
|
|
17
|
+
* (`cut-from`) or one that has it in its history (`contains`).
|
|
18
|
+
* - gates and deploys: `joinRelease` (#4043), and a deploy's `admission`
|
|
19
|
+
* read back to the resolution in `_gates/<op>.jsonl` (#4020).
|
|
20
|
+
* - the plan a gate bound: the change set stored under its `planDigest`
|
|
21
|
+
* (#4022), and a deploy's release plan in `_plans/` (ws-055).
|
|
22
|
+
*
|
|
23
|
+
* A commit is "contained" by a later commit when that commit has it as an
|
|
24
|
+
* ancestor in the history read. For each commit the chain names the releases
|
|
25
|
+
* cut from it, or failing those the first release cut after it, and the first
|
|
26
|
+
* deploy per environment that shipped it, so the document stays the size of
|
|
27
|
+
* the walk. Everything is read from local git: the tags and the local
|
|
28
|
+
* `chant/lifecycle` branch. Nothing is fetched.
|
|
29
|
+
*/
|
|
30
|
+
import type { RunOrigin } from "../lifecycle/release-ledger.js";
|
|
31
|
+
import type { ReleasePlan } from "../lifecycle/plan-ledger.js";
|
|
32
|
+
import type { IgnoredCiTag, RevokedTagView } from "./ci-green.js";
|
|
33
|
+
import type { CommitLinkProblem, CommitLinkState, WorkIndex } from "./commit-links.js";
|
|
34
|
+
import type { CiGreen } from "./declaration.js";
|
|
35
|
+
import type { CommitTrailerJoins } from "./trailer-joins.js";
|
|
36
|
+
/** Where a link comes from: the record (`ref`), and the field of it whose `value` made the join. */
|
|
37
|
+
export interface TraceSource {
|
|
38
|
+
/** A commit sha, a tag ref (`refs/tags/...`), a record file, or a path on `chant/lifecycle` (`chant/lifecycle:<path>`). */
|
|
39
|
+
ref: string;
|
|
40
|
+
/** The trailer, field or edge that joins, such as `Chant-Record`, `commit`, `releaseDigest`, `admission` or `window`. */
|
|
41
|
+
field: string;
|
|
42
|
+
/** Its value, as the record holds it. */
|
|
43
|
+
value: string;
|
|
44
|
+
}
|
|
45
|
+
/** A work item a commit links to, or falls in the window of. */
|
|
46
|
+
export interface TraceWork {
|
|
47
|
+
/** `<kind>:<id>`. */
|
|
48
|
+
id: string;
|
|
49
|
+
/** The work node in `nodes`, or null when no kind read has the record. */
|
|
50
|
+
node: string | null;
|
|
51
|
+
source: TraceSource;
|
|
52
|
+
}
|
|
53
|
+
export interface TraceTagView {
|
|
54
|
+
tag: string;
|
|
55
|
+
tagged: string | null;
|
|
56
|
+
/** The runner whose statement the tag carries, or null for a tag that counts unsigned (#4031). */
|
|
57
|
+
signer: string | null;
|
|
58
|
+
source: TraceSource;
|
|
59
|
+
}
|
|
60
|
+
/** A commit's ci tags as readers count them (#4031, ws-103). */
|
|
61
|
+
export interface TraceTag {
|
|
62
|
+
/** `revoked` when a revoked tag counts, else `green` when a green tag counts, else `none`. */
|
|
63
|
+
state: "green" | "revoked" | "none";
|
|
64
|
+
green: TraceTagView | null;
|
|
65
|
+
revoked: (TraceTagView & Pick<RevokedTagView, "phase" | "run">) | null;
|
|
66
|
+
/** Tags on the commit that exist and don't count. */
|
|
67
|
+
ignored: IgnoredCiTag[];
|
|
68
|
+
}
|
|
69
|
+
/** One gate resolution: who let it through, on which channel, when, and for which plan. */
|
|
70
|
+
export interface TraceGate {
|
|
71
|
+
op: string;
|
|
72
|
+
gate: string;
|
|
73
|
+
environment: string | null;
|
|
74
|
+
resolvedBy: string;
|
|
75
|
+
relayedBy: string | null;
|
|
76
|
+
/** `cli`, `mcp` or `acp`, the channel the resolution was authored on (#2384), or null when the record doesn't say. */
|
|
77
|
+
channel: string | null;
|
|
78
|
+
at: string;
|
|
79
|
+
planDigest: string | null;
|
|
80
|
+
/** `planDigest`, when a change set is stored under it (#4022): `chant change-set show <changeSet>` prints it. */
|
|
81
|
+
changeSet: string | null;
|
|
82
|
+
changeSetSource: TraceSource | null;
|
|
83
|
+
/** A pass over an empty change set, written by the promote itself (#4045). */
|
|
84
|
+
empty: boolean;
|
|
85
|
+
/** Whether the approval carries an ssh seal (`chant approve --sign`, #3163). `status` judges it against the signers at base. */
|
|
86
|
+
sealed: boolean;
|
|
87
|
+
url: string | null;
|
|
88
|
+
source: TraceSource;
|
|
89
|
+
}
|
|
90
|
+
/** A release that shipped a commit of the walk. */
|
|
91
|
+
export interface TraceRelease {
|
|
92
|
+
releaseDigest: string;
|
|
93
|
+
label: string | null;
|
|
94
|
+
member: string | null;
|
|
95
|
+
/** The green commit it was cut from. */
|
|
96
|
+
commit: string;
|
|
97
|
+
/** That commit's ci tags. */
|
|
98
|
+
tag: TraceTag;
|
|
99
|
+
source: TraceSource;
|
|
100
|
+
cuts: {
|
|
101
|
+
label: string | null;
|
|
102
|
+
actor: string;
|
|
103
|
+
timestamp: string;
|
|
104
|
+
signed: boolean;
|
|
105
|
+
runOrigin: RunOrigin | null;
|
|
106
|
+
source: TraceSource;
|
|
107
|
+
}[];
|
|
108
|
+
/** The release gate's resolutions for it, oldest first. */
|
|
109
|
+
gates: TraceGate[];
|
|
110
|
+
/** The ids of its deploy records in `deploys`, oldest first. */
|
|
111
|
+
deploys: string[];
|
|
112
|
+
}
|
|
113
|
+
/** A deploy record (`ReleaseRecord` in `<env>/releases.jsonl`). */
|
|
114
|
+
export interface TraceDeploy {
|
|
115
|
+
/** `deploy:<member>/<env>/<component>/<runId>@<timestamp>`, with `.` for a ledger of no member. */
|
|
116
|
+
id: string;
|
|
117
|
+
member: string | null;
|
|
118
|
+
env: string;
|
|
119
|
+
component: string;
|
|
120
|
+
timestamp: string;
|
|
121
|
+
actor: string;
|
|
122
|
+
approver: string | null;
|
|
123
|
+
runId: string;
|
|
124
|
+
runOrigin: RunOrigin | null;
|
|
125
|
+
gitSha: string;
|
|
126
|
+
digest: string;
|
|
127
|
+
/** The release it was made from, by its `releaseDigest` or through the release gate resolution its admission names (#4043), or null. */
|
|
128
|
+
release: string | null;
|
|
129
|
+
releaseSource: TraceSource | null;
|
|
130
|
+
/** The gate resolution its `admission` names (#4020), or null for an ungated deploy, one recorded before 0.124.28, or one whose resolution is not on the branch. */
|
|
131
|
+
admittedBy: TraceGate | null;
|
|
132
|
+
/** The release plan its `digest` names in `_plans/` (ws-055), or null when none is stored. */
|
|
133
|
+
plan: {
|
|
134
|
+
document: ReleasePlan;
|
|
135
|
+
source: TraceSource;
|
|
136
|
+
} | null;
|
|
137
|
+
source: TraceSource;
|
|
138
|
+
}
|
|
139
|
+
export interface TraceCommit {
|
|
140
|
+
/** The commit node. */
|
|
141
|
+
commit: string;
|
|
142
|
+
sha: string;
|
|
143
|
+
/**
|
|
144
|
+
* The work items the commit names, judged as `check --changes` judges it
|
|
145
|
+
* (#4029): `linked`, `unlinked`, `wrong` or `merge`. Null when no work kind
|
|
146
|
+
* was read.
|
|
147
|
+
*/
|
|
148
|
+
work: {
|
|
149
|
+
state: CommitLinkState;
|
|
150
|
+
items: TraceWork[];
|
|
151
|
+
problems: CommitLinkProblem[];
|
|
152
|
+
} | null;
|
|
153
|
+
/** The work items whose window holds the commit (the `worked` within edges). They don't link it. */
|
|
154
|
+
windowMatches: TraceWork[];
|
|
155
|
+
tag: TraceTag;
|
|
156
|
+
/** The releases cut from the commit, or when none, the first release cut from a commit that has it in its history. */
|
|
157
|
+
releases: {
|
|
158
|
+
release: string;
|
|
159
|
+
link: "cut-from" | "contains";
|
|
160
|
+
source: TraceSource;
|
|
161
|
+
}[];
|
|
162
|
+
/** Per environment, the first deploy record built from the commit or a commit that has it in its history. */
|
|
163
|
+
deploys: {
|
|
164
|
+
deploy: string;
|
|
165
|
+
env: string;
|
|
166
|
+
link: "built-from" | "contains";
|
|
167
|
+
source: TraceSource;
|
|
168
|
+
}[];
|
|
169
|
+
}
|
|
170
|
+
export type TraceReasonCode = "ledger-unreadable" | "declaration-invalid";
|
|
171
|
+
/** The why chain (#4023): commits in walk order, then the releases and deploys they name. */
|
|
172
|
+
export interface IntentTrace {
|
|
173
|
+
commits: TraceCommit[];
|
|
174
|
+
releases: TraceRelease[];
|
|
175
|
+
deploys: TraceDeploy[];
|
|
176
|
+
/** Parts of the chain that could not be read: the ci tags (`declaration-invalid`) or a ledger (`ledger-unreadable`). The rest stands. */
|
|
177
|
+
reasons: {
|
|
178
|
+
code: TraceReasonCode;
|
|
179
|
+
message: string;
|
|
180
|
+
}[];
|
|
181
|
+
}
|
|
182
|
+
export interface TraceInput {
|
|
183
|
+
top: string;
|
|
184
|
+
/** The commits of the walk, in its order. */
|
|
185
|
+
commits: {
|
|
186
|
+
id: string;
|
|
187
|
+
sha: string;
|
|
188
|
+
trailers: Record<string, string[]>;
|
|
189
|
+
joins: CommitTrailerJoins;
|
|
190
|
+
}[];
|
|
191
|
+
/** The work records the walk read, by work kind, and their nodes by `<kind>:<id>`. Null when no work kind was read. */
|
|
192
|
+
work: {
|
|
193
|
+
index: Omit<WorkIndex, "ledger">;
|
|
194
|
+
nodes: Map<string, string>;
|
|
195
|
+
} | null;
|
|
196
|
+
/** The work items whose window holds each commit, by sha. */
|
|
197
|
+
windows: Map<string, {
|
|
198
|
+
id: string;
|
|
199
|
+
node: string;
|
|
200
|
+
path: string;
|
|
201
|
+
}[]>;
|
|
202
|
+
/**
|
|
203
|
+
* The ledgers to read, each as the directory `chant/lifecycle` stores
|
|
204
|
+
* resolve it from. `within` is a path part every ledger of the member has,
|
|
205
|
+
* `_members/<name>/`, so a member with nothing on the branch is skipped
|
|
206
|
+
* unread; null when it can't be told, as for a member at the root.
|
|
207
|
+
*/
|
|
208
|
+
ledgers: {
|
|
209
|
+
member: string | null;
|
|
210
|
+
cwd: string;
|
|
211
|
+
within: string | null;
|
|
212
|
+
}[];
|
|
213
|
+
green: CiGreen | null;
|
|
214
|
+
/** Whether `later` is `sha` or has it as an ancestor, in the history read. */
|
|
215
|
+
contains: (sha: string, later: string) => boolean;
|
|
216
|
+
}
|
|
217
|
+
/** Build the chain. Never throws for a ledger or tag it can't read: that is a reason. */
|
|
218
|
+
export declare function buildTrace(input: TraceInput): Promise<IntentTrace>;
|
|
219
|
+
//# sourceMappingURL=intent-trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-trace.d.ts","sourceRoot":"","sources":["../../src/workspace/intent-trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The why chain of a region (#4023): for each commit the intent walk read,
|
|
3
|
+
* the work item it names, its ci tag, the release that shipped it, the gate
|
|
4
|
+
* resolutions that admitted that release and the deploy records per
|
|
5
|
+
* environment. "Who asked for this, and who let it ship" in one read.
|
|
6
|
+
*
|
|
7
|
+
* Every link is made by a record that already exists, and each one states
|
|
8
|
+
* that record in `source`, so a reader can follow it:
|
|
9
|
+
*
|
|
10
|
+
* - work item: a `Chant-Record` or `Chant-Lease` trailer, judged as #4029's
|
|
11
|
+
* `judgeCommitLink` judges it. A commit in a work item's window (the
|
|
12
|
+
* intent graph's `worked` bucket) is listed apart, as a window match, and
|
|
13
|
+
* never links it.
|
|
14
|
+
* - ci tag: `ci/green/<sha>` or `ci/revoked/<sha>`, judged as `release cut`
|
|
15
|
+
* judges it (#4031, `judgedCiTags`).
|
|
16
|
+
* - release: `_releases/<digest>.json`, whose `commit` is the commit itself
|
|
17
|
+
* (`cut-from`) or one that has it in its history (`contains`).
|
|
18
|
+
* - gates and deploys: `joinRelease` (#4043), and a deploy's `admission`
|
|
19
|
+
* read back to the resolution in `_gates/<op>.jsonl` (#4020).
|
|
20
|
+
* - the plan a gate bound: the change set stored under its `planDigest`
|
|
21
|
+
* (#4022), and a deploy's release plan in `_plans/` (ws-055).
|
|
22
|
+
*
|
|
23
|
+
* A commit is "contained" by a later commit when that commit has it as an
|
|
24
|
+
* ancestor in the history read. For each commit the chain names the releases
|
|
25
|
+
* cut from it, or failing those the first release cut after it, and the first
|
|
26
|
+
* deploy per environment that shipped it, so the document stays the size of
|
|
27
|
+
* the walk. Everything is read from local git: the tags and the local
|
|
28
|
+
* `chant/lifecycle` branch. Nothing is fetched.
|
|
29
|
+
*/
|
|
30
|
+
import { execFileSync } from "node:child_process";
|
|
31
|
+
function tryGit(top, args) {
|
|
32
|
+
try {
|
|
33
|
+
return execFileSync("git", args, { cwd: top, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 256 * 1024 * 1024 });
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const fileOf = (digest) => `${digest.replace(/:/g, "_")}.json`;
|
|
40
|
+
const onBranch = (path) => `chant/lifecycle:${path}`;
|
|
41
|
+
const byTime = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
42
|
+
function tagOf(sha, tags, revokedView) {
|
|
43
|
+
const green = tags?.green.get(sha);
|
|
44
|
+
const revoked = tags?.revoked.get(sha);
|
|
45
|
+
const view = (kind, t) => ({
|
|
46
|
+
tag: `ci/${kind}/${sha}`,
|
|
47
|
+
tagged: t.tagged,
|
|
48
|
+
signer: t.signer,
|
|
49
|
+
source: { ref: `refs/tags/ci/${kind}/${sha}`, field: "name", value: sha },
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
state: revoked ? "revoked" : green ? "green" : "none",
|
|
53
|
+
green: green ? view("green", green) : null,
|
|
54
|
+
revoked: revoked ? { ...view("revoked", revoked), phase: revokedView(sha, revoked).phase, run: revokedView(sha, revoked).run } : null,
|
|
55
|
+
ignored: tags?.ignored.get(sha) ?? [],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Build the chain. Never throws for a ledger or tag it can't read: that is a reason. */
|
|
59
|
+
export async function buildTrace(input) {
|
|
60
|
+
const { top } = input;
|
|
61
|
+
const reasons = [];
|
|
62
|
+
const shas = input.commits.map((c) => c.sha);
|
|
63
|
+
// The ci tags, judged as release cut judges them.
|
|
64
|
+
let tags = null;
|
|
65
|
+
const { revokedTagView } = await import("./ci-green.js");
|
|
66
|
+
try {
|
|
67
|
+
const { judgedCiTags } = await import("../lifecycle/release-revocation.js");
|
|
68
|
+
tags = await judgedCiTags(top, input.green);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
reasons.push({ code: "declaration-invalid", message: `the ci tags could not be judged: ${err instanceof Error ? err.message : String(err)}` });
|
|
72
|
+
}
|
|
73
|
+
// The work item each commit names (#4029).
|
|
74
|
+
const { judgeCommitLink, hasLeaseLedger, mergeCommits } = await import("./commit-links.js");
|
|
75
|
+
const index = input.work ? { ...input.work.index, ledger: hasLeaseLedger(top) } : null;
|
|
76
|
+
const merges = index ? mergeCommits(top, shas) : new Set();
|
|
77
|
+
const workNode = (id) => input.work?.nodes.get(id) ?? null;
|
|
78
|
+
// The ledgers on the local chant/lifecycle branch.
|
|
79
|
+
const branch = tryGit(top, ["rev-parse", "--verify", "--quiet", "refs/heads/chant/lifecycle"]) !== undefined;
|
|
80
|
+
const ledgers = [];
|
|
81
|
+
// One listing of the branch, so a ledger that holds no release and no deploy costs nothing more.
|
|
82
|
+
const paths = branch ? (tryGit(top, ["ls-tree", "-r", "--name-only", "--full-tree", "refs/heads/chant/lifecycle"]) ?? "").split("\n").filter(Boolean) : [];
|
|
83
|
+
const holds = (prefix) => paths.some((p) => p.startsWith(prefix) && (p.startsWith(`${prefix}_releases/`) || /^[^/_][^/]*\/releases\.jsonl$/.test(p.slice(prefix.length))));
|
|
84
|
+
if (branch) {
|
|
85
|
+
const { resolveMemberLedger } = await import("../lifecycle/member-ledger.js");
|
|
86
|
+
const { readAllReleases } = await import("../lifecycle/release-store.js");
|
|
87
|
+
const { listReleaseEnvironments, readReleaseLedger } = await import("../lifecycle/release-ledger.js");
|
|
88
|
+
for (const l of input.ledgers) {
|
|
89
|
+
if (l.within !== null && !paths.some((p) => p.includes(l.within)))
|
|
90
|
+
continue;
|
|
91
|
+
const loc = { cwd: l.cwd };
|
|
92
|
+
try {
|
|
93
|
+
const prefix = (await resolveMemberLedger(l.cwd)).prefix;
|
|
94
|
+
if (ledgers.some((x) => x.prefix === prefix) || !holds(prefix))
|
|
95
|
+
continue;
|
|
96
|
+
const { releases } = await readAllReleases(loc);
|
|
97
|
+
const deploys = [];
|
|
98
|
+
for (const env of await listReleaseEnvironments(loc)) {
|
|
99
|
+
for (const record of (await readReleaseLedger(env, loc)).records)
|
|
100
|
+
deploys.push({ env, record });
|
|
101
|
+
}
|
|
102
|
+
ledgers.push({ member: l.member, loc, prefix, releases, deploys });
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
reasons.push({ code: "ledger-unreadable", message: `${l.member ?? "the workspace"}'s ledger on chant/lifecycle: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}` });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Each commit to the releases and deploys that shipped it.
|
|
110
|
+
const firstCut = new Map();
|
|
111
|
+
const releaseHits = new Map();
|
|
112
|
+
const deployHits = new Map();
|
|
113
|
+
const deployId = (l, env, r) => `deploy:${l.member ?? "."}/${env}/${r.component}/${r.runId}@${r.timestamp}`;
|
|
114
|
+
const perCommit = new Map();
|
|
115
|
+
if (ledgers.some((l) => l.releases.length > 0)) {
|
|
116
|
+
const { readCuts } = await import("../lifecycle/release-store.js");
|
|
117
|
+
for (const l of ledgers) {
|
|
118
|
+
if (l.releases.length === 0)
|
|
119
|
+
continue;
|
|
120
|
+
try {
|
|
121
|
+
for (const c of (await readCuts(l.loc)).cuts)
|
|
122
|
+
if (!firstCut.has(c.releaseDigest) || byTime(c.timestamp, firstCut.get(c.releaseDigest)) < 0)
|
|
123
|
+
firstCut.set(c.releaseDigest, c.timestamp);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// A release with no readable cut sorts last; its file still joins.
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
for (const sha of shas) {
|
|
131
|
+
const releases = [];
|
|
132
|
+
const deploys = [];
|
|
133
|
+
for (const l of ledgers) {
|
|
134
|
+
const releaseSource = (r) => ({ ref: onBranch(`${l.prefix}_releases/${fileOf(r.releaseDigest)}`), field: "commit", value: r.commit });
|
|
135
|
+
const cut = l.releases.filter((r) => r.commit === sha);
|
|
136
|
+
const chosen = cut.map((r) => ({ r, link: "cut-from" }));
|
|
137
|
+
if (chosen.length === 0) {
|
|
138
|
+
const later = l.releases.filter((r) => input.contains(sha, r.commit)).sort((a, b) => byTime(firstCut.get(a.releaseDigest) ?? "", firstCut.get(b.releaseDigest) ?? "") || byTime(a.releaseDigest, b.releaseDigest));
|
|
139
|
+
if (later.length > 0)
|
|
140
|
+
chosen.push({ r: later[0], link: "contains" });
|
|
141
|
+
}
|
|
142
|
+
for (const { r, link } of chosen) {
|
|
143
|
+
releases.push({ release: r.releaseDigest, link, source: releaseSource(r) });
|
|
144
|
+
(releaseHits.get(l) ?? releaseHits.set(l, new Set()).get(l)).add(r.releaseDigest);
|
|
145
|
+
}
|
|
146
|
+
const first = new Map();
|
|
147
|
+
for (const d of l.deploys) {
|
|
148
|
+
const link = d.record.gitSha === sha ? "built-from" : input.contains(sha, d.record.gitSha) ? "contains" : null;
|
|
149
|
+
if (!link)
|
|
150
|
+
continue;
|
|
151
|
+
const had = first.get(d.env);
|
|
152
|
+
if (!had || byTime(d.record.timestamp, had.record.timestamp) < 0)
|
|
153
|
+
first.set(d.env, { ...d, link });
|
|
154
|
+
}
|
|
155
|
+
for (const [env, d] of [...first].sort(([a], [b]) => byTime(a, b))) {
|
|
156
|
+
const id = deployId(l, env, d.record);
|
|
157
|
+
deployHits.set(id, { ledger: l, env, record: d.record });
|
|
158
|
+
deploys.push({ deploy: id, env, link: d.link, source: { ref: onBranch(`${l.prefix}${env}/releases.jsonl`), field: "gitSha", value: d.record.gitSha } });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
perCommit.set(sha, { releases, deploys });
|
|
162
|
+
}
|
|
163
|
+
// The releases, through joinRelease, with their gates and deploys.
|
|
164
|
+
const { joinRelease } = await import("../lifecycle/release-join.js");
|
|
165
|
+
const { readGateLedger } = await import("../lifecycle/gate-ledger.js");
|
|
166
|
+
const { readStoredChangeSet, changeSetFile, CHANGE_SETS_DIR } = await import("../lifecycle/change-set-store.js");
|
|
167
|
+
const gateLedgers = new Map();
|
|
168
|
+
const resolutionsOf = (l, op) => {
|
|
169
|
+
const key = `${l.prefix}\0${op}`;
|
|
170
|
+
let hit = gateLedgers.get(key);
|
|
171
|
+
if (!hit) {
|
|
172
|
+
hit = readGateLedger(op, l.loc).then((g) => g.resolutions, () => []);
|
|
173
|
+
gateLedgers.set(key, hit);
|
|
174
|
+
}
|
|
175
|
+
return hit;
|
|
176
|
+
};
|
|
177
|
+
const changeSets = new Map();
|
|
178
|
+
const gateOf = async (l, r) => {
|
|
179
|
+
let stored;
|
|
180
|
+
if (r.planDigest) {
|
|
181
|
+
const key = `${l.prefix}\0${r.planDigest}`;
|
|
182
|
+
stored = changeSets.get(key);
|
|
183
|
+
if (!stored) {
|
|
184
|
+
stored = readStoredChangeSet(r.planDigest, l.loc).then((x) => x.status === "found", () => false);
|
|
185
|
+
changeSets.set(key, stored);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const has = stored ? await stored : false;
|
|
189
|
+
return {
|
|
190
|
+
op: r.op,
|
|
191
|
+
gate: r.gate,
|
|
192
|
+
environment: r.environment ?? null,
|
|
193
|
+
resolvedBy: r.resolvedBy,
|
|
194
|
+
relayedBy: r.relayedBy ?? null,
|
|
195
|
+
channel: r.origin ?? null,
|
|
196
|
+
at: r.timestamp,
|
|
197
|
+
planDigest: r.planDigest ?? null,
|
|
198
|
+
changeSet: has ? r.planDigest : null,
|
|
199
|
+
changeSetSource: has ? { ref: onBranch(`${l.prefix}${CHANGE_SETS_DIR}/${changeSetFile(r.planDigest)}`), field: "planDigest", value: r.planDigest } : null,
|
|
200
|
+
empty: r.empty === true,
|
|
201
|
+
sealed: r.seal !== undefined,
|
|
202
|
+
url: r.url ?? null,
|
|
203
|
+
source: { ref: onBranch(`${l.prefix}_gates/${r.op}.jsonl`), field: r.releaseDigest ? "releaseDigest" : "gate", value: r.releaseDigest ?? r.gate },
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
const releases = [];
|
|
207
|
+
const joinedDeploys = new Map();
|
|
208
|
+
for (const l of ledgers) {
|
|
209
|
+
const wanted = releaseHits.get(l);
|
|
210
|
+
if (!wanted || wanted.size === 0)
|
|
211
|
+
continue;
|
|
212
|
+
const commits = [...new Set(l.releases.filter((r) => wanted.has(r.releaseDigest)).map((r) => r.commit))];
|
|
213
|
+
let joined;
|
|
214
|
+
try {
|
|
215
|
+
joined = (await joinRelease({ commits }, l.loc)).releases;
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
reasons.push({ code: "ledger-unreadable", message: `joining ${l.member ?? "the workspace"}'s releases: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}` });
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
for (const j of joined) {
|
|
222
|
+
for (const d of j.deploys)
|
|
223
|
+
joinedDeploys.set(deployId(l, d.env, d), { ledger: l, env: d.env, record: d, release: j });
|
|
224
|
+
releases.push({
|
|
225
|
+
releaseDigest: j.releaseDigest,
|
|
226
|
+
label: j.label,
|
|
227
|
+
member: j.release.member,
|
|
228
|
+
commit: j.commit,
|
|
229
|
+
tag: tagOf(j.commit, tags, revokedTagView),
|
|
230
|
+
source: { ref: onBranch(`${l.prefix}_releases/${fileOf(j.releaseDigest)}`), field: "releaseDigest", value: j.releaseDigest },
|
|
231
|
+
cuts: j.cuts.map((c) => ({
|
|
232
|
+
label: c.label,
|
|
233
|
+
actor: c.actor,
|
|
234
|
+
timestamp: c.timestamp,
|
|
235
|
+
signed: c.signature !== null,
|
|
236
|
+
runOrigin: c.runOrigin,
|
|
237
|
+
source: { ref: onBranch(`${l.prefix}_releases/cuts.jsonl`), field: "releaseDigest", value: c.releaseDigest },
|
|
238
|
+
})),
|
|
239
|
+
gates: await Promise.all([...j.gates.resolutions].sort((a, b) => byTime(a.timestamp, b.timestamp)).map((r) => gateOf(l, r))),
|
|
240
|
+
deploys: j.deploys.map((d) => deployId(l, d.env, d)),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// The deploys: those a commit names and those of each release, oldest first.
|
|
245
|
+
const { readReleasePlan } = await import("../lifecycle/plan-ledger.js");
|
|
246
|
+
const plans = new Map();
|
|
247
|
+
const all = new Map([...deployHits, ...joinedDeploys]);
|
|
248
|
+
const releaseResolutions = new Map();
|
|
249
|
+
const deploys = [];
|
|
250
|
+
for (const [id, d] of [...all].sort(([, a], [, b]) => byTime(a.record.timestamp, b.record.timestamp) || byTime(a.env, b.env))) {
|
|
251
|
+
const r = d.record;
|
|
252
|
+
const l = d.ledger;
|
|
253
|
+
let release = r.releaseDigest ?? null;
|
|
254
|
+
let releaseSource = release ? { ref: onBranch(`${l.prefix}${d.env}/releases.jsonl`), field: "releaseDigest", value: release } : null;
|
|
255
|
+
if (!release && r.admission?.op === "release") {
|
|
256
|
+
if (!releaseResolutions.has(l))
|
|
257
|
+
releaseResolutions.set(l, await resolutionsOf(l, "release"));
|
|
258
|
+
const { releaseOfDeploy } = await import("../lifecycle/release-join.js");
|
|
259
|
+
release = releaseOfDeploy(r, releaseResolutions.get(l)) ?? null;
|
|
260
|
+
if (release)
|
|
261
|
+
releaseSource = { ref: onBranch(`${l.prefix}${d.env}/releases.jsonl`), field: "admission", value: `${r.admission.gate}@${r.admission.resolvedAt}` };
|
|
262
|
+
}
|
|
263
|
+
let admittedBy = null;
|
|
264
|
+
if (r.admission) {
|
|
265
|
+
const found = (await resolutionsOf(l, r.admission.op)).find((x) => x.gate === r.admission.gate && x.timestamp === r.admission.resolvedAt);
|
|
266
|
+
if (found)
|
|
267
|
+
admittedBy = await gateOf(l, found);
|
|
268
|
+
}
|
|
269
|
+
const planKey = `${l.prefix}\0${r.digest}`;
|
|
270
|
+
let plan = plans.get(planKey);
|
|
271
|
+
if (!plan) {
|
|
272
|
+
plan = readReleasePlan(r.digest, l.loc).catch(() => null);
|
|
273
|
+
plans.set(planKey, plan);
|
|
274
|
+
}
|
|
275
|
+
const document = await plan;
|
|
276
|
+
deploys.push({
|
|
277
|
+
id,
|
|
278
|
+
member: l.member,
|
|
279
|
+
env: d.env,
|
|
280
|
+
component: r.component,
|
|
281
|
+
timestamp: r.timestamp,
|
|
282
|
+
actor: r.actor,
|
|
283
|
+
approver: r.approver ?? null,
|
|
284
|
+
runId: r.runId,
|
|
285
|
+
runOrigin: r.runOrigin ?? null,
|
|
286
|
+
gitSha: r.gitSha,
|
|
287
|
+
digest: r.digest,
|
|
288
|
+
release,
|
|
289
|
+
releaseSource,
|
|
290
|
+
admittedBy,
|
|
291
|
+
plan: document ? { document, source: { ref: onBranch(`${l.prefix}_plans/${fileOf(r.digest)}`), field: "digest", value: r.digest } } : null,
|
|
292
|
+
source: { ref: onBranch(`${l.prefix}${d.env}/releases.jsonl`), field: "runId", value: r.runId },
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
const commits = input.commits.map((c) => {
|
|
296
|
+
let work = null;
|
|
297
|
+
if (index) {
|
|
298
|
+
const judged = merges.has(c.sha) ? { state: "merge", ids: [], problems: [] } : judgeCommitLink(c.trailers, c.joins, index);
|
|
299
|
+
const items = judged.ids.map((id) => {
|
|
300
|
+
const named = c.joins.records.some((r) => `${r.kind}:${r.id}` === id);
|
|
301
|
+
return {
|
|
302
|
+
id,
|
|
303
|
+
node: workNode(id),
|
|
304
|
+
source: named ? { ref: c.sha, field: "Chant-Record", value: id } : { ref: c.sha, field: "Chant-Lease", value: c.joins.lease?.token ?? "" },
|
|
305
|
+
};
|
|
306
|
+
});
|
|
307
|
+
work = { state: judged.state, items, problems: judged.problems };
|
|
308
|
+
}
|
|
309
|
+
const windowMatches = (input.windows.get(c.sha) ?? []).map((w) => ({ id: w.id, node: w.node, source: { ref: w.path, field: "window", value: "worked" } }));
|
|
310
|
+
const hit = perCommit.get(c.sha) ?? { releases: [], deploys: [] };
|
|
311
|
+
return { commit: c.id, sha: c.sha, work, windowMatches, tag: tagOf(c.sha, tags, revokedTagView), releases: hit.releases, deploys: hit.deploys };
|
|
312
|
+
});
|
|
313
|
+
return { commits, releases, deploys, reasons };
|
|
314
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The intent graph over one region: `chant workspace graph --intent
|
|
3
|
-
* <path[:start-end]|path#symbol>` (#2651; #2650 sections B and C1; #2524 D8,
|
|
3
|
+
* <path[:start-end]|path#symbol|member/node|sha>` (#2651; #2650 sections B and C1; #2524 D8,
|
|
4
4
|
* D15; #3034).
|
|
5
5
|
*
|
|
6
6
|
* A person points at some code and asks how it got this way and who decided
|
|
@@ -66,6 +66,7 @@ import { type RunCost, type RunJoin, type RunPin, type RunUsage } from "./runs.j
|
|
|
66
66
|
import { type Forge } from "./squash.js";
|
|
67
67
|
import { type SymbolPluginLoader } from "./lexicon-symbols.js";
|
|
68
68
|
import { type CommitTrailerJoins } from "./trailer-joins.js";
|
|
69
|
+
import { type IntentTrace } from "./intent-trace.js";
|
|
69
70
|
import { type ProvenanceLevel } from "./trust/attestor.js";
|
|
70
71
|
import { type WorkLink, type WorkWarningCode } from "./work.js";
|
|
71
72
|
/** The version of the `intent` document this chant writes. */
|
|
@@ -101,9 +102,12 @@ export interface RegionNode {
|
|
|
101
102
|
/** The member whose directory holds the path, or null. */
|
|
102
103
|
member: string | null;
|
|
103
104
|
at: string | null;
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
/** `commit` for a region given as a commit sha (#4023): the files that commit changed. */
|
|
106
|
+
type: "file" | "dir" | "commit";
|
|
107
|
+
/** For a file region, whether the file is generated (#2524 D14); null for a directory or a commit. */
|
|
106
108
|
generated: boolean | null;
|
|
109
|
+
/** Set when the region was given as a commit sha (#4023): its full sha. `path` is then `.`. */
|
|
110
|
+
commit?: string;
|
|
107
111
|
/** Set when the region was given as a graph node id. */
|
|
108
112
|
node: string | null;
|
|
109
113
|
/** Set when the region was given as `path#symbol` (#3034): the symbol as given, the declaration it resolved to, and its kind. `lines` holds its current lines. */
|
|
@@ -374,6 +378,19 @@ export interface WorkNode {
|
|
|
374
378
|
* to the review through it. Empty when none does. Added within contract 1.
|
|
375
379
|
*/
|
|
376
380
|
reviews?: WorkReview[];
|
|
381
|
+
/**
|
|
382
|
+
* The other in-flight work items whose linked commits touch a file this
|
|
383
|
+
* item's linked commits touch (#4025), as `workspace status --json` reports
|
|
384
|
+
* in `overlap`, each with the shared files. Empty when none does, or when
|
|
385
|
+
* this item is not in flight. Absent on a read with `--at` and when the
|
|
386
|
+
* overlap can't be read. The change-set entries two items share are in
|
|
387
|
+
* `status`, which reads the gates. Added within contract 1 by chant
|
|
388
|
+
* 0.124.29.
|
|
389
|
+
*/
|
|
390
|
+
overlaps?: {
|
|
391
|
+
with: string;
|
|
392
|
+
files: string[];
|
|
393
|
+
}[];
|
|
377
394
|
}
|
|
378
395
|
/**
|
|
379
396
|
* An agent run that made a commit in the walk (#3033): from the run ledger on
|
|
@@ -537,7 +554,7 @@ export type IntentDocument = (Head & {
|
|
|
537
554
|
region: string;
|
|
538
555
|
history: {
|
|
539
556
|
rev: string | null;
|
|
540
|
-
follows: "line-range" | "file" | "directory";
|
|
557
|
+
follows: "line-range" | "file" | "directory" | "commit";
|
|
541
558
|
shallow: boolean;
|
|
542
559
|
};
|
|
543
560
|
kinds: {
|
|
@@ -556,6 +573,8 @@ export type IntentDocument = (Head & {
|
|
|
556
573
|
findings: number;
|
|
557
574
|
};
|
|
558
575
|
why: WhyAnswer;
|
|
576
|
+
/** The why chain (#4023): each commit's work item, ci tag, release, gate resolutions and deploys. Added within contract 1 by chant 0.124.29. */
|
|
577
|
+
trace?: IntentTrace;
|
|
559
578
|
}) | (Head & {
|
|
560
579
|
error: {
|
|
561
580
|
code: IntentErrorCode;
|
|
@@ -565,7 +584,7 @@ export type IntentDocument = (Head & {
|
|
|
565
584
|
export interface IntentQuery {
|
|
566
585
|
/** Where the walk up to the declaration starts, and what the region path is relative to. */
|
|
567
586
|
cwd: string;
|
|
568
|
-
/** `path`, `path:line`, `path:start-end` or `path#symbol`,
|
|
587
|
+
/** `path`, `path:line`, `path:start-end` or `path#symbol`, a graph node id `<member>/<id>`, or a commit sha (#4023). */
|
|
569
588
|
region: string;
|
|
570
589
|
at?: string;
|
|
571
590
|
/** Follow squash merges to their pull requests' original commits, fetching a missing pull request ref from `origin` (#3035). */
|
|
@@ -629,9 +648,20 @@ export declare function addingCommit(top: string, rev: string, path: string): st
|
|
|
629
648
|
* added it.
|
|
630
649
|
*/
|
|
631
650
|
export declare function closingCommit(top: string, rev: string, path: string, stateField: string, closed: readonly string[]): string | null;
|
|
651
|
+
/**
|
|
652
|
+
* The files a commit changed, from the workspace root (#4023): against its
|
|
653
|
+
* first parent, or every file for a root commit. Files outside the workspace
|
|
654
|
+
* are left out.
|
|
655
|
+
*/
|
|
656
|
+
export declare function changedFiles(top: string, sha: string, workspacePrefix: string): string[];
|
|
632
657
|
/** The commit a decision record's window opens at: the one that decided it, or, when it is not approved, the one that added it. */
|
|
633
658
|
export declare function windowOpening(top: string, rev: string, view: Pick<RecordView, "path" | "decidedIn">): string | null;
|
|
634
|
-
/**
|
|
659
|
+
/**
|
|
660
|
+
* `commit` and every commit between it and `rev` that has it as an ancestor:
|
|
661
|
+
* what `git rev-list --ancestry-path <commit>..<rev>` lists, plus `commit`.
|
|
662
|
+
* With full commit ids it is read from the children of what `rev` reaches,
|
|
663
|
+
* walked once per revision, instead of one `git rev-list` per record (#4032).
|
|
664
|
+
*/
|
|
635
665
|
export declare function descendants(top: string, commit: string, rev: string): Set<string>;
|
|
636
666
|
/** Parse `path`, `path:line` or `path:start-end`. */
|
|
637
667
|
export declare function parseRegion(arg: string): {
|
|
@@ -654,7 +684,6 @@ export interface LoadedKind {
|
|
|
654
684
|
joins?: CommitJoins;
|
|
655
685
|
}
|
|
656
686
|
export declare function loadKinds(query: IntentQuery, top: string): Promise<LoadedKind[]>;
|
|
657
|
-
/** Build the intent document. Never throws an {@link IntentError}, {@link WorkspaceReadError} or {@link RecordReadError}. */
|
|
658
687
|
export declare function intentGraph(query: IntentQuery): Promise<IntentResult>;
|
|
659
688
|
export {};
|
|
660
689
|
//# sourceMappingURL=intent.d.ts.map
|