@intentius/chant 0.124.28 → 0.124.30
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/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 +8 -1
- package/dist/change-set-graph.d.ts.map +1 -1
- package/dist/change-set-graph.js +4 -2
- package/dist/change-set.d.ts +10 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +4 -3
- 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.map +1 -1
- package/dist/cli/commands/build.js +6 -3
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +45 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +18 -4
- package/dist/cli/handlers/fan-out.d.ts +9 -0
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +67 -8
- 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 +11 -3
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +134 -26
- 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 +210 -33
- package/dist/cli/handlers/release.d.ts +62 -5
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +414 -28
- package/dist/cli/handlers/run.d.ts +11 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +67 -6
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +91 -10
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +73 -2
- package/dist/cli/registry.d.ts +32 -4
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/run-events.d.ts +3 -2
- package/dist/cli/run-events.d.ts.map +1 -1
- package/dist/cli/run-events.js +5 -3
- package/dist/components/auto-release.d.ts +2 -0
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/auto-release.js +1 -0
- package/dist/components/capability.d.ts +9 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/driver.d.ts +8 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +35 -0
- 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.map +1 -1
- package/dist/components/fan-out-run.js +50 -0
- 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 +49 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +38 -4
- package/dist/components/pr-run.d.ts +20 -2
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +26 -13
- package/dist/components/promote.d.ts +23 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +60 -2
- package/dist/components/release-compile.d.ts +9 -0
- package/dist/components/release-compile.d.ts.map +1 -1
- package/dist/components/release-compile.js +9 -3
- package/dist/components/release-gate.d.ts +11 -1
- package/dist/components/release-gate.d.ts.map +1 -1
- package/dist/components/release-gate.js +10 -4
- package/dist/components/wave-plan.d.ts +16 -0
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +36 -2
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -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/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 +2 -1
- package/dist/lifecycle/change-set-store.d.ts.map +1 -1
- package/dist/lifecycle/change-set-store.js +2 -1
- 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 +10 -1
- package/dist/lifecycle/gate-change-set.d.ts.map +1 -1
- package/dist/lifecycle/gate-change-set.js +35 -3
- package/dist/lifecycle/gate-ledger.d.ts +2 -3
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- 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 +48 -1
- package/dist/lifecycle/release-cut.d.ts.map +1 -1
- package/dist/lifecycle/release-cut.js +116 -23
- 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 +8 -3
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +2 -0
- 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 +12 -2
- package/dist/lifecycle/release-store.d.ts.map +1 -1
- package/dist/lifecycle/release-store.js +4 -2
- 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 +1 -1
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +9 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +1 -0
- package/dist/op/activities/shell.d.ts +6 -0
- package/dist/op/activities/shell.d.ts.map +1 -1
- package/dist/op/activities/shell.js +1 -1
- package/dist/op/local-executor.d.ts +23 -1
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +9 -3
- package/dist/op/runtime.d.ts +27 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/runtime.js +20 -0
- package/dist/plan-summary.d.ts.map +1 -1
- package/dist/plan-summary.js +8 -2
- package/dist/pr-forge.d.ts +23 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +44 -0
- package/dist/pr-loop.d.ts +17 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +30 -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 +29 -2
- package/dist/run-event-store.d.ts.map +1 -1
- package/dist/run-event-store.js +50 -3
- package/dist/run-event-stream.d.ts +4 -3
- package/dist/run-event-stream.d.ts.map +1 -1
- package/dist/run-event-stream.js +7 -3
- package/dist/run-event.d.ts +34 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/run-event.js +4 -0
- package/dist/wave-runtime.mjs +260 -229
- 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/change-set.schema.json +5 -1
- 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-forge.d.ts +2 -0
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green.d.ts +10 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +14 -5
- package/dist/workspace/ci-run.d.ts +222 -0
- package/dist/workspace/ci-run.d.ts.map +1 -0
- package/dist/workspace/ci-run.js +464 -0
- package/dist/workspace/ci-serve.d.ts +214 -0
- package/dist/workspace/ci-serve.d.ts.map +1 -0
- package/dist/workspace/ci-serve.js +412 -0
- package/dist/workspace/declaration.d.ts +16 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +26 -0
- package/dist/workspace/declaration.schema.json +64 -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/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 +30 -6
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +141 -21
- package/dist/workspace/intent.schema.json +702 -6
- 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/pr-report.schema.json +5 -0
- package/dist/workspace/reason-codes.d.ts +2 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +3 -0
- 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 +9 -0
- package/dist/workspace/releases.d.ts.map +1 -1
- package/dist/workspace/releases.js +9 -0
- package/dist/workspace/releases.schema.json +123 -1
- package/dist/workspace/run-event.schema.json +24 -6
- package/dist/workspace/status-gates.d.ts +8 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status-stewards.d.ts +2 -0
- package/dist/workspace/status-stewards.d.ts.map +1 -1
- package/dist/workspace/status-stewards.js +1 -0
- package/dist/workspace/status.d.ts +78 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +170 -3
- package/dist/workspace/status.schema.json +210 -2
- package/dist/workspace/wip.d.ts.map +1 -1
- package/dist/workspace/wip.js +11 -3
- package/package.json +1 -1
- package/src/build-params.test.ts +46 -0
- package/src/build-params.ts +55 -1
- package/src/change-set-graph.ts +10 -2
- package/src/change-set.ts +14 -3
- package/src/cli/build-params-cli.ts +22 -9
- package/src/cli/commands/build.ts +6 -3
- package/src/cli/handlers/approve-release.test.ts +5 -1
- package/src/cli/handlers/approve-revoked.test.ts +155 -0
- package/src/cli/handlers/approve.ts +47 -0
- package/src/cli/handlers/build.test.ts +30 -0
- package/src/cli/handlers/build.ts +20 -4
- package/src/cli/handlers/fan-out.test.ts +262 -1
- package/src/cli/handlers/fan-out.ts +72 -8
- 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/pr.test.ts +148 -1
- package/src/cli/handlers/pr.ts +144 -28
- package/src/cli/handlers/promote.test.ts +280 -2
- package/src/cli/handlers/promote.ts +210 -34
- package/src/cli/handlers/release-implicit.e2e.test.ts +12 -4
- 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 +146 -32
- package/src/cli/handlers/release.ts +415 -28
- package/src/cli/handlers/run-auto-release.test.ts +9 -0
- package/src/cli/handlers/run-release.test.ts +55 -0
- package/src/cli/handlers/run.ts +69 -5
- package/src/cli/main.test.ts +1 -0
- package/src/cli/main.ts +91 -10
- package/src/cli/parse-args.ts +54 -2
- package/src/cli/registry.ts +32 -4
- package/src/cli/run-events.ts +5 -2
- package/src/components/auto-release.test.ts +9 -0
- package/src/components/auto-release.ts +3 -0
- package/src/components/capability.ts +9 -0
- package/src/components/driver.test.ts +24 -0
- package/src/components/driver.ts +36 -0
- 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 +48 -0
- package/src/components/fan-out.ts +4 -0
- package/src/components/pr-pipeline.ts +67 -4
- package/src/components/pr-run.test.ts +127 -0
- package/src/components/pr-run.ts +32 -12
- package/src/components/promote.ts +68 -2
- package/src/components/release-compile.ts +17 -3
- package/src/components/release-gate.ts +18 -4
- package/src/components/wave-plan.ts +45 -2
- package/src/config.ts +8 -0
- package/src/flag-params.test.ts +144 -0
- package/src/flag-params.ts +134 -0
- package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
- package/src/lifecycle/change-set-store.ts +2 -1
- package/src/lifecycle/delivery-metrics.ts +263 -0
- package/src/lifecycle/deploy-outcome.ts +147 -0
- package/src/lifecycle/gate-change-set.ts +37 -6
- package/src/lifecycle/gate-ledger.ts +2 -2
- 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.test.ts +74 -2
- package/src/lifecycle/release-cut.ts +158 -22
- 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.ts +9 -3
- 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 +15 -4
- 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.ts +7 -1
- package/src/op/activities/activity-contracts.ts +1 -0
- package/src/op/activities/shell.ts +7 -1
- package/src/op/local-executor.ts +27 -4
- package/src/op/runtime.ts +42 -0
- package/src/plan-summary.test.ts +20 -0
- package/src/plan-summary.ts +8 -1
- package/src/pr-forge.test.ts +25 -0
- package/src/pr-forge.ts +62 -0
- package/src/pr-loop.test.ts +13 -1
- package/src/pr-loop.ts +41 -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.ts +63 -3
- package/src/run-event-stream.ts +8 -4
- package/src/run-event.ts +38 -1
- 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/change-set.schema.json +5 -1
- 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-forge.ts +2 -0
- package/src/workspace/ci-green.ts +20 -5
- package/src/workspace/ci-run.test.ts +416 -0
- package/src/workspace/ci-run.ts +571 -0
- package/src/workspace/ci-serve.test.ts +268 -0
- package/src/workspace/ci-serve.ts +521 -0
- package/src/workspace/declaration.schema.json +64 -0
- package/src/workspace/declaration.test.ts +28 -0
- package/src/workspace/declaration.ts +38 -0
- 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/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 +148 -25
- 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/pr-report.schema.json +5 -0
- package/src/workspace/read-contract.e2e.test.ts +2 -1
- package/src/workspace/reason-codes.test.ts +5 -0
- package/src/workspace/reason-codes.ts +3 -0
- 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 +123 -1
- package/src/workspace/releases.ts +11 -0
- package/src/workspace/run-event.schema.json +24 -6
- package/src/workspace/status-contract.test.ts +29 -0
- package/src/workspace/status-gates.ts +8 -0
- package/src/workspace/status-mixed.test.ts +152 -0
- package/src/workspace/status-revoked.test.ts +153 -0
- package/src/workspace/status-stewards.ts +3 -0
- package/src/workspace/status.schema.json +210 -2
- package/src/workspace/status.ts +254 -3
- package/src/workspace/wip.ts +11 -2
package/dist/workspace/intent.js
CHANGED
|
@@ -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
|
|
@@ -75,6 +75,7 @@ import { followSquashes, squashLineOrigins } from "./squash.js";
|
|
|
75
75
|
import { memberDirOnDisk, memberSymbolResolvers } from "./lexicon-symbols.js";
|
|
76
76
|
import { resolveSymbol, symbolResolverFor } from "./symbols.js";
|
|
77
77
|
import { readTrailerJoins } from "./trailer-joins.js";
|
|
78
|
+
import { buildTrace } from "./intent-trace.js";
|
|
78
79
|
import { joinPath, skippedDir, workingTree } from "./tree.js";
|
|
79
80
|
import { activeAttestors } from "./trust/attestor.js";
|
|
80
81
|
import { commitProvenance, policyAtBase, resolveBase } from "./trust/provenance.js";
|
|
@@ -303,6 +304,24 @@ export function closingCommit(top, rev, path, stateField, closed) {
|
|
|
303
304
|
}
|
|
304
305
|
return closing;
|
|
305
306
|
}
|
|
307
|
+
/**
|
|
308
|
+
* The files a commit changed, from the workspace root (#4023): against its
|
|
309
|
+
* first parent, or every file for a root commit. Files outside the workspace
|
|
310
|
+
* are left out.
|
|
311
|
+
*/
|
|
312
|
+
export function changedFiles(top, sha, workspacePrefix) {
|
|
313
|
+
const out = tryGit(top, ["diff-tree", "--no-commit-id", "-r", "--name-only", "--root", "-m", "--first-parent", "-z", sha]) ?? "";
|
|
314
|
+
const files = new Set();
|
|
315
|
+
for (const f of out.split("\0")) {
|
|
316
|
+
if (!f)
|
|
317
|
+
continue;
|
|
318
|
+
if (workspacePrefix === "")
|
|
319
|
+
files.add(f);
|
|
320
|
+
else if (f.startsWith(`${workspacePrefix}/`))
|
|
321
|
+
files.add(f.slice(workspacePrefix.length + 1));
|
|
322
|
+
}
|
|
323
|
+
return [...files].sort();
|
|
324
|
+
}
|
|
306
325
|
/** 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. */
|
|
307
326
|
export function windowOpening(top, rev, view) {
|
|
308
327
|
return view.decidedIn?.sha ?? addingCommit(top, rev, view.path);
|
|
@@ -504,6 +523,8 @@ export async function loadKinds(query, top) {
|
|
|
504
523
|
}
|
|
505
524
|
return out;
|
|
506
525
|
}
|
|
526
|
+
/** A commit sha as a region may give it: 7 to 64 hex digits. */
|
|
527
|
+
const COMMIT_REGION = /^[0-9a-fA-F]{7,64}$/;
|
|
507
528
|
async function resolveRegion(query, located, declaration) {
|
|
508
529
|
const parsed = parseRegion(query.region);
|
|
509
530
|
if ("error" in parsed)
|
|
@@ -553,9 +574,40 @@ async function resolveRegion(query, located, declaration) {
|
|
|
553
574
|
return { path: file === "" ? "." : file, lines: loc.line ? { start: loc.line, end: loc.line } : null, node: query.region, symbol: null };
|
|
554
575
|
}
|
|
555
576
|
}
|
|
556
|
-
|
|
577
|
+
// A commit sha, when no path or node has the name (#4023): the commit and the files it changed.
|
|
578
|
+
if (COMMIT_REGION.test(query.region) && located.top) {
|
|
579
|
+
const sha = tryGit(located.top, ["rev-parse", "--verify", "--quiet", `${query.region}^{commit}`])?.trim();
|
|
580
|
+
if (sha)
|
|
581
|
+
return { path: ".", lines: null, node: null, symbol: null, commit: sha };
|
|
582
|
+
}
|
|
583
|
+
throw new IntentError("intent-region-invalid", `${query.region} is not a path in the workspace${located.tree.label}, a path#symbol, a graph node id or a commit`);
|
|
557
584
|
}
|
|
558
585
|
/** Build the intent document. Never throws an {@link IntentError}, {@link WorkspaceReadError} or {@link RecordReadError}. */
|
|
586
|
+
/**
|
|
587
|
+
* Give each work node the in-flight items it overlaps by file (#4025). Only a
|
|
588
|
+
* working-tree read, since the overlap is about the branches as they are now;
|
|
589
|
+
* a read that fails leaves the field off.
|
|
590
|
+
*/
|
|
591
|
+
async function addOverlaps(work, declaration, root, top, at) {
|
|
592
|
+
if (work.length === 0 || at !== null)
|
|
593
|
+
return;
|
|
594
|
+
let report;
|
|
595
|
+
try {
|
|
596
|
+
const { readOverlap } = await import("./overlap.js");
|
|
597
|
+
report = await readOverlap({ declaration, root, top, changeSets: [] });
|
|
598
|
+
}
|
|
599
|
+
catch {
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
if (report === null)
|
|
603
|
+
return;
|
|
604
|
+
for (const n of work) {
|
|
605
|
+
const self = `${n.recordKind}:${n.record}`;
|
|
606
|
+
n.overlaps = report.pairs
|
|
607
|
+
.filter((p) => p.items.includes(self) && p.files.length > 0)
|
|
608
|
+
.map((p) => ({ with: p.items[0] === self ? p.items[1] : p.items[0], files: p.files }));
|
|
609
|
+
}
|
|
610
|
+
}
|
|
559
611
|
export async function intentGraph(query) {
|
|
560
612
|
const head = { $schema: INTENT_OUTPUT_SCHEMA_ID, contract: INTENT_CONTRACT_VERSION, chant: readerVersion() };
|
|
561
613
|
try {
|
|
@@ -575,7 +627,7 @@ async function walk(query, head) {
|
|
|
575
627
|
throw new IntentError("not-a-git-repository", "the intent graph reads git history, and this directory is not in a git repository");
|
|
576
628
|
const declaration = readDeclaration(located.tree, "", { rootChant: true });
|
|
577
629
|
const region = await resolveRegion(query, located, declaration);
|
|
578
|
-
const type = region.path === "." ? "dir" : located.tree.stat(region.path);
|
|
630
|
+
const type = region.commit ? "commit" : region.path === "." ? "dir" : located.tree.stat(region.path);
|
|
579
631
|
if (!type)
|
|
580
632
|
throw new IntentError("intent-region-invalid", `${region.path} does not exist${located.tree.label}`);
|
|
581
633
|
if (region.lines) {
|
|
@@ -601,8 +653,21 @@ async function walk(query, head) {
|
|
|
601
653
|
findings.push({ id: `finding:${code}:${findings.filter((f) => f.code === code).length + 1}`, kind: "finding", code, message, concerns });
|
|
602
654
|
};
|
|
603
655
|
// The region, its files and its member.
|
|
604
|
-
|
|
605
|
-
const
|
|
656
|
+
// A commit region (#4023) covers the files the commit changed, from the workspace root, and the members holding them.
|
|
657
|
+
const workspacePrefix = located.root === "." ? "" : located.root;
|
|
658
|
+
const changed = region.commit ? changedFiles(top, region.commit, workspacePrefix) : [];
|
|
659
|
+
const changedMembers = [...new Set(changed.map((f) => memberHolding(f, declaration.members)).filter((m) => m !== null))];
|
|
660
|
+
const member = region.commit
|
|
661
|
+
? changedMembers.length === 1
|
|
662
|
+
? changedMembers[0]
|
|
663
|
+
: null
|
|
664
|
+
: region.path === "."
|
|
665
|
+
? (declaration.members.find((m) => m.dir === ".")?.name ?? null)
|
|
666
|
+
: memberHolding(region.path, declaration.members);
|
|
667
|
+
const regionMembers = region.commit ? changedMembers : member ? [member] : [];
|
|
668
|
+
const rid = region.commit ? `region:commit:${region.commit}` : regionId(region.path, region.lines, region.symbol?.name);
|
|
669
|
+
/** How messages name the region: its path, or the commit. */
|
|
670
|
+
const regionLabel = region.commit ? `commit ${region.commit.slice(0, 8)}` : region.path;
|
|
606
671
|
add({
|
|
607
672
|
id: rid,
|
|
608
673
|
kind: "region",
|
|
@@ -614,6 +679,7 @@ async function walk(query, head) {
|
|
|
614
679
|
generated: type === "file" ? isGeneratedPath(declaration, region.path) : null,
|
|
615
680
|
node: region.node,
|
|
616
681
|
symbol: region.symbol,
|
|
682
|
+
...(region.commit ? { commit: region.commit } : {}),
|
|
617
683
|
});
|
|
618
684
|
const files = type === "dir" ? filesUnder(located.tree, region.path) : [];
|
|
619
685
|
for (const f of files)
|
|
@@ -629,9 +695,8 @@ async function walk(query, head) {
|
|
|
629
695
|
const shallow = tryGit(top, ["rev-parse", "--is-shallow-repository"])?.trim() === "true";
|
|
630
696
|
if (shallow)
|
|
631
697
|
reasons.push({ code: "intent-history-shallow", message: "this is a shallow clone, so the history stops at its boundary and the oldest commit listed may stand for many" });
|
|
632
|
-
const workspacePrefix = located.root === "." ? "" : located.root;
|
|
633
698
|
const gitPath = joinPath(workspacePrefix, region.path);
|
|
634
|
-
const touched = rev ? regionHistory(top, rev, gitPath, type, region.lines) : [];
|
|
699
|
+
const touched = region.commit ? [{ sha: region.commit, lines: null }] : rev && type !== "commit" ? regionHistory(top, rev, gitPath, type, region.lines) : [];
|
|
635
700
|
// Who last wrote each current line of a file region (#3034). A commit blame
|
|
636
701
|
// names and the history walk missed, as when a move confuses git log -L,
|
|
637
702
|
// joins the commits that touched the region.
|
|
@@ -848,7 +913,11 @@ async function walk(query, head) {
|
|
|
848
913
|
if (!isWorkspacePath(p))
|
|
849
914
|
continue;
|
|
850
915
|
const full = joinPath(kindPrefix, p);
|
|
851
|
-
if (
|
|
916
|
+
if (type === "commit") {
|
|
917
|
+
if (changed.some((f) => constraintCovers(full, joinPath(workspacePrefix, f))))
|
|
918
|
+
matched.push({ entry, granularity: "path", to: rid });
|
|
919
|
+
}
|
|
920
|
+
else if (regionFull !== "" && constraintCovers(full, regionFull)) {
|
|
852
921
|
matched.push({ entry, granularity: "path", to: rid });
|
|
853
922
|
}
|
|
854
923
|
else if (type === "dir" && full !== regionFull && (regionFull === "" || full.startsWith(`${regionFull}/`))) {
|
|
@@ -858,7 +927,7 @@ async function walk(query, head) {
|
|
|
858
927
|
}
|
|
859
928
|
}
|
|
860
929
|
else if (entry.startsWith("member:")) {
|
|
861
|
-
if (
|
|
930
|
+
if (regionMembers.includes(entry.slice("member:".length)))
|
|
862
931
|
matched.push({ entry, granularity: "member", to: rid });
|
|
863
932
|
}
|
|
864
933
|
else {
|
|
@@ -1264,7 +1333,7 @@ async function walk(query, head) {
|
|
|
1264
1333
|
edges.push({ kind: "within", from: c.id, to: h.node.id, state: "worked" });
|
|
1265
1334
|
}
|
|
1266
1335
|
if (readsRecords && c.state === "undecided") {
|
|
1267
|
-
find("intent-commit-undecided", `${t.sha.slice(0, 8)} changed the region when no decision constrained ${
|
|
1336
|
+
find("intent-commit-undecided", `${t.sha.slice(0, 8)} changed the region when no decision constrained ${regionLabel} by path`, [c.id, rid]);
|
|
1268
1337
|
}
|
|
1269
1338
|
if (readsRecords && !j.unit && j.carries.length === 0 && c.pullRequest === null && coveredAt(t.sha, ["path", "member", "contract", "issue"]).length === 0) {
|
|
1270
1339
|
find("intent-commit-bare", `${t.sha.slice(0, 8)} names no unit, no record, no pull request and no decision`, [c.id]);
|
|
@@ -1278,13 +1347,13 @@ async function walk(query, head) {
|
|
|
1278
1347
|
if (readsRecords) {
|
|
1279
1348
|
const current = covering.filter((c) => c.node.supersededBy === null);
|
|
1280
1349
|
if (covering.length === 0) {
|
|
1281
|
-
find("intent-region-unconstrained", `no decision constrains ${
|
|
1350
|
+
find("intent-region-unconstrained", `no decision constrains ${regionLabel}`, [rid]);
|
|
1282
1351
|
}
|
|
1283
1352
|
else if (current.length === 0) {
|
|
1284
|
-
find("intent-decision-superseded-live", `every decision constraining ${
|
|
1353
|
+
find("intent-decision-superseded-live", `every decision constraining ${regionLabel} is superseded: ${covering.map((c) => `${c.node.record} by ${c.node.supersededBy}`).join(", ")}`, [rid, ...covering.map((c) => c.node.id)]);
|
|
1285
1354
|
}
|
|
1286
1355
|
else if (current.every((c) => !c.node.closed)) {
|
|
1287
|
-
find("intent-decision-provisional", `the decisions constraining ${
|
|
1356
|
+
find("intent-decision-provisional", `the decisions constraining ${regionLabel} are ${[...new Set(current.map((c) => c.node.state ?? "stateless"))].join(" or ")}, and none is in a closed state`, [rid, ...current.map((c) => c.node.id)]);
|
|
1288
1357
|
}
|
|
1289
1358
|
// A current decision with a dissent nobody addressed or withdrew (#2686), from its quorum.
|
|
1290
1359
|
for (const c of current) {
|
|
@@ -1296,14 +1365,14 @@ async function walk(query, head) {
|
|
|
1296
1365
|
id: `finding:intent-decision-contested:${findings.filter((f) => f.code === "intent-decision-contested").length + 1}`,
|
|
1297
1366
|
kind: "finding",
|
|
1298
1367
|
code: "intent-decision-contested",
|
|
1299
|
-
message: `${c.node.record} constrains ${
|
|
1368
|
+
message: `${c.node.record} constrains ${regionLabel} and has ${open.length} open ${open.length === 1 ? "concern" : "concerns"}, from ${open.map((o) => o.reviewer).join(", ")}: a dissent neither addressed nor withdrawn`,
|
|
1300
1369
|
concerns: [c.node.id, rid],
|
|
1301
1370
|
openConcerns: { count: open.length, principals },
|
|
1302
1371
|
});
|
|
1303
1372
|
}
|
|
1304
1373
|
const granularities = new Set(covering.flatMap((c) => c.node.constrains.map((x) => x.granularity)));
|
|
1305
1374
|
if (covering.length > 0 && !granularities.has("path") && granularities.has("member")) {
|
|
1306
|
-
find("intent-constraint-coarse", `${
|
|
1375
|
+
find("intent-constraint-coarse", `${regionLabel} is constrained only through its member, ${regionMembers.join(", ")}`, [rid, ...covering.map((c) => c.node.id)]);
|
|
1307
1376
|
}
|
|
1308
1377
|
}
|
|
1309
1378
|
// Findings about work items (#2683).
|
|
@@ -1316,7 +1385,7 @@ async function walk(query, head) {
|
|
|
1316
1385
|
const w = windows.get(c.node.id);
|
|
1317
1386
|
if (w && touched.some((t) => w.from.has(t.sha) && !w.until?.has(t.sha)))
|
|
1318
1387
|
continue;
|
|
1319
|
-
find("intent-decision-unimplemented", `${c.node.record} is ${c.node.state} and constrains ${
|
|
1388
|
+
find("intent-decision-unimplemented", `${c.node.record} is ${c.node.state} and constrains ${regionLabel}, and no work item that is not dropped implements it, and no commit changed the region in its window`, [c.node.id, rid]);
|
|
1320
1389
|
}
|
|
1321
1390
|
for (const h of workCovering) {
|
|
1322
1391
|
const node = h.node;
|
|
@@ -1336,7 +1405,7 @@ async function walk(query, head) {
|
|
|
1336
1405
|
const impl = implementersOf(d);
|
|
1337
1406
|
if (impl.length === 0 || impl.some((h) => h.view.state === workSpec(h).done))
|
|
1338
1407
|
continue;
|
|
1339
|
-
find("intent-work-open-decided-code", `${own.length} ${own.length === 1 ? "commit" : "commits"} in ${
|
|
1408
|
+
find("intent-work-open-decided-code", `${own.length} ${own.length === 1 ? "commit" : "commits"} in ${regionLabel} ${own.length === 1 ? "is" : "are"} ${d.record}'s own work, and ${impl.map((h) => `${h.view.id} is ${h.view.state ?? "stateless"}`).join(", ")}: the code says done and the queue says not`, [d.id, ...own, ...impl.map((h) => workNode(h).id)]);
|
|
1340
1409
|
}
|
|
1341
1410
|
}
|
|
1342
1411
|
// 5. Links: the declared member links that touch the region's member, read in source.
|
|
@@ -1412,6 +1481,8 @@ async function walk(query, head) {
|
|
|
1412
1481
|
const kindPrefix = h.kind.records.workspaceRoot === "." ? "" : h.kind.records.workspaceRoot;
|
|
1413
1482
|
const full = joinPath(kindPrefix, parsed.path);
|
|
1414
1483
|
const contains = (a, b) => a === b || a === "" || b.startsWith(`${a}/`);
|
|
1484
|
+
if (type === "commit")
|
|
1485
|
+
return changed.some((f) => contains(full, joinPath(workspacePrefix, f)) || contains(joinPath(workspacePrefix, f), full));
|
|
1415
1486
|
if (!contains(full, regionFull) && !contains(regionFull, full))
|
|
1416
1487
|
return false;
|
|
1417
1488
|
if (full === regionFull && parsed.lines && region.lines)
|
|
@@ -1428,7 +1499,7 @@ async function walk(query, head) {
|
|
|
1428
1499
|
if (gap && h.view.state === workSpec(h).done) {
|
|
1429
1500
|
const node = workNode(h);
|
|
1430
1501
|
if (!node.warnings.some((w) => w.code === "work-done-gap-open")) {
|
|
1431
|
-
node.warnings.push({ code: "work-done-gap-open", message: `${node.record} is ${h.view.state}, and ${f.code}, the gap it came from, still fires on ${
|
|
1502
|
+
node.warnings.push({ code: "work-done-gap-open", message: `${node.record} is ${h.view.state}, and ${f.code}, the gap it came from, still fires on ${regionLabel}` });
|
|
1432
1503
|
}
|
|
1433
1504
|
}
|
|
1434
1505
|
}
|
|
@@ -1474,15 +1545,63 @@ async function walk(query, head) {
|
|
|
1474
1545
|
}
|
|
1475
1546
|
for (const f of findings)
|
|
1476
1547
|
nodes.set(f.id, f);
|
|
1548
|
+
await addOverlaps([...nodes.values()].filter((n) => n.kind === "work"), declaration, located.rootOnDisk, top, located.at);
|
|
1477
1549
|
const why = explain();
|
|
1478
1550
|
const all = [...nodes.values()];
|
|
1551
|
+
// The why chain (#4023): each commit's work item, ci tag, release, gate resolutions and deploys.
|
|
1552
|
+
const workIds = new Map();
|
|
1553
|
+
const workNodeIds = new Map();
|
|
1554
|
+
for (const h of workAll) {
|
|
1555
|
+
const name = h.kind.records.loaded.kind.name;
|
|
1556
|
+
(workIds.get(name) ?? workIds.set(name, new Set()).get(name)).add(h.view.id);
|
|
1557
|
+
if (h.node)
|
|
1558
|
+
workNodeIds.set(`${name}:${h.view.id}`, h.node.id);
|
|
1559
|
+
}
|
|
1560
|
+
for (const k of workKinds)
|
|
1561
|
+
if (!workIds.has(k.records.loaded.kind.name))
|
|
1562
|
+
workIds.set(k.records.loaded.kind.name, new Set());
|
|
1563
|
+
const windowsOf = new Map();
|
|
1564
|
+
for (const e of edges) {
|
|
1565
|
+
if (e.kind !== "within" || e.state !== "worked")
|
|
1566
|
+
continue;
|
|
1567
|
+
const w = nodes.get(e.to);
|
|
1568
|
+
if (!w)
|
|
1569
|
+
continue;
|
|
1570
|
+
const sha = e.from.slice("commit:".length);
|
|
1571
|
+
(windowsOf.get(sha) ?? windowsOf.set(sha, []).get(sha)).push({ id: `${w.recordKind}:${w.record}`, node: w.id, path: w.path });
|
|
1572
|
+
}
|
|
1573
|
+
const later = new Map();
|
|
1574
|
+
const trace = await buildTrace({
|
|
1575
|
+
top,
|
|
1576
|
+
commits: all.filter((n) => n.kind === "commit").map((c) => ({ id: c.id, sha: c.sha, trailers: c.trailers, joins: c.joins })),
|
|
1577
|
+
work: readsWork ? { index: { kinds: workIds }, nodes: workNodeIds } : null,
|
|
1578
|
+
windows: windowsOf,
|
|
1579
|
+
// The region's member's ledger; for a region in no member, every member's and the workspace's own.
|
|
1580
|
+
ledgers: (regionMembers.length > 0 ? regionMembers : declaration.members.map((m) => m.name))
|
|
1581
|
+
.map((name) => {
|
|
1582
|
+
const dir = declaration.members.find((m) => m.name === name).dir;
|
|
1583
|
+
return { member: name, cwd: memberDirOnDisk(located.rootOnDisk, dir), within: dir === "." ? null : `_members/${name}/` };
|
|
1584
|
+
})
|
|
1585
|
+
.concat(regionMembers.length > 0 ? [] : [{ member: null, cwd: located.rootOnDisk, within: null }]),
|
|
1586
|
+
green: declaration.ci?.green ?? null,
|
|
1587
|
+
contains: (sha, commit) => {
|
|
1588
|
+
if (commit === sha)
|
|
1589
|
+
return true;
|
|
1590
|
+
if (!rev || !FULL_COMMIT_ID.test(commit))
|
|
1591
|
+
return false;
|
|
1592
|
+
let set = later.get(sha);
|
|
1593
|
+
if (!set)
|
|
1594
|
+
later.set(sha, (set = descendants(top, sha, rev)));
|
|
1595
|
+
return set.has(commit);
|
|
1596
|
+
},
|
|
1597
|
+
});
|
|
1479
1598
|
return {
|
|
1480
1599
|
doc: {
|
|
1481
1600
|
...head,
|
|
1482
1601
|
at: located.at,
|
|
1483
1602
|
workspace: { name: declaration.name, root: located.root },
|
|
1484
1603
|
region: rid,
|
|
1485
|
-
history: { rev, follows: region.lines ? "line-range" : type === "file" ? "file" : "directory", shallow },
|
|
1604
|
+
history: { rev, follows: region.commit ? "commit" : region.lines ? "line-range" : type === "file" ? "file" : "directory", shallow },
|
|
1486
1605
|
kinds: kinds.map((k) => ({ file: k.display, name: k.name, records: k.records?.loaded.kind.name ?? null, joins: k.joins?.form ?? null })),
|
|
1487
1606
|
nodes: all,
|
|
1488
1607
|
edges,
|
|
@@ -1494,6 +1613,7 @@ async function walk(query, head) {
|
|
|
1494
1613
|
findings: findings.length,
|
|
1495
1614
|
},
|
|
1496
1615
|
why,
|
|
1616
|
+
trace,
|
|
1497
1617
|
},
|
|
1498
1618
|
failed: reasons.some((r) => r.code === "intent-plugin-failed"),
|
|
1499
1619
|
};
|
|
@@ -1618,12 +1738,12 @@ async function walk(query, head) {
|
|
|
1618
1738
|
if (!explained) {
|
|
1619
1739
|
gaps.push({
|
|
1620
1740
|
code: "intent-why-no-decision",
|
|
1621
|
-
message: readsRecords ? `no current decision governs ${
|
|
1741
|
+
message: readsRecords ? `no current decision governs ${regionLabel}, and none is carried out by what made its lines` : `no record kind was read, so no decision can account for ${regionLabel}`,
|
|
1622
1742
|
});
|
|
1623
1743
|
}
|
|
1624
1744
|
const committed = who.filter((w) => w.sha !== null);
|
|
1625
1745
|
if (fileLines !== null ? committed.length > 0 && committed.every((w) => w.runs.length === 0) : touched.length > 0 && runNodes.length === 0) {
|
|
1626
|
-
gaps.push({ code: "intent-why-no-run", message: `no agent run is joined to the commits that made ${fileLines !== null ? "the current lines of " : ""}${
|
|
1746
|
+
gaps.push({ code: "intent-why-no-run", message: `no agent run is joined to the commits that made ${fileLines !== null ? "the current lines of " : ""}${regionLabel}` });
|
|
1627
1747
|
}
|
|
1628
1748
|
const uncommitted = who.filter((w) => w.sha === null).map((w) => w.line);
|
|
1629
1749
|
if (uncommitted.length > 0)
|