@intentius/chant 0.124.45 → 0.124.48
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/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
- package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
- package/dist/__golden__/wave-loop/op-denied.json +16 -0
- package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on.json +16 -0
- package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/dist/__golden__/wave-loop/op-overridden.json +16 -0
- package/dist/__golden__/wave-loop/op-per-run.json +20 -0
- package/dist/__golden__/wave-loop/op-point.json +13 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
- package/dist/__golden__/wave-loop/op-sealed.json +10 -0
- package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/dist/__golden__/wave-loop/op-spend.json +10 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/dist/__golden__/wave-loop/op-wide.json +39 -0
- package/dist/action-pins.d.ts +61 -0
- package/dist/action-pins.d.ts.map +1 -0
- package/dist/action-pins.js +77 -0
- package/dist/capabilities/aws.paths +148 -0
- package/dist/capabilities/base-mappings.json +122 -0
- package/dist/capabilities/catalog.d.ts +89 -0
- package/dist/capabilities/catalog.d.ts.map +1 -0
- package/dist/capabilities/catalog.js +204 -0
- package/dist/capabilities/language.d.ts +103 -0
- package/dist/capabilities/language.d.ts.map +1 -0
- package/dist/capabilities/language.js +335 -0
- package/dist/capabilities/matcher.d.ts +65 -0
- package/dist/capabilities/matcher.d.ts.map +1 -0
- package/dist/capabilities/matcher.js +299 -0
- package/dist/capabilities/view.d.ts +207 -0
- package/dist/capabilities/view.d.ts.map +1 -0
- package/dist/capabilities/view.js +484 -0
- package/dist/cli/commands/carve.d.ts +3 -0
- package/dist/cli/commands/carve.d.ts.map +1 -1
- package/dist/cli/commands/carve.js +36 -7
- package/dist/cli/commands/import-report.d.ts +26 -0
- package/dist/cli/commands/import-report.d.ts.map +1 -0
- package/dist/cli/commands/import-report.js +65 -0
- package/dist/cli/commands/import.d.ts +11 -1
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +22 -3
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +1 -0
- package/dist/cli/commands/migrate.d.ts +13 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +134 -10
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +21 -2
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +6 -1
- package/dist/cli/handlers/declared-graph.d.ts +44 -0
- package/dist/cli/handlers/declared-graph.d.ts.map +1 -0
- package/dist/cli/handlers/declared-graph.js +87 -0
- package/dist/cli/handlers/graph.d.ts +25 -0
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +93 -87
- package/dist/cli/handlers/ledger.d.ts +3 -0
- package/dist/cli/handlers/ledger.d.ts.map +1 -0
- package/dist/cli/handlers/ledger.js +55 -0
- package/dist/cli/handlers/migrate.d.ts.map +1 -1
- package/dist/cli/handlers/migrate.js +18 -11
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/misc.js +12 -1
- package/dist/cli/handlers/pr-env.d.ts.map +1 -1
- package/dist/cli/handlers/pr-env.js +4 -3
- package/dist/cli/handlers/pr.d.ts +15 -1
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +143 -39
- package/dist/cli/handlers/query.d.ts +7 -2
- package/dist/cli/handlers/query.d.ts.map +1 -1
- package/dist/cli/handlers/query.js +16 -4
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +6 -3
- package/dist/cli/handlers/search-count.d.ts +89 -0
- package/dist/cli/handlers/search-count.d.ts.map +1 -0
- package/dist/cli/handlers/search-count.js +132 -0
- package/dist/cli/handlers/search.d.ts +356 -6
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +1039 -155
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +88 -17
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/server.js +3 -0
- package/dist/cli/mcp/tools/capabilities.d.ts +7 -0
- package/dist/cli/mcp/tools/capabilities.d.ts.map +1 -0
- package/dist/cli/mcp/tools/capabilities.js +27 -0
- package/dist/cli/mcp/workspace-tools.d.ts +3 -1
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.js +47 -2
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +100 -19
- package/dist/cli/registry.d.ts +36 -4
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/builders.d.ts +5 -1
- package/dist/components/builders.d.ts.map +1 -1
- package/dist/components/builders.js +5 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.js +16 -1
- package/dist/components/capability-plugin.d.ts +14 -0
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/pr-env-ports.d.ts +29 -0
- package/dist/components/pr-env-ports.d.ts.map +1 -0
- package/dist/components/pr-env-ports.js +77 -0
- package/dist/components/pr-env-run.d.ts +5 -21
- package/dist/components/pr-env-run.d.ts.map +1 -1
- package/dist/components/pr-env-run.js +6 -70
- package/dist/components/pr-environment.d.ts +2 -1
- package/dist/components/pr-environment.d.ts.map +1 -1
- package/dist/components/pr-environment.js +1 -1
- package/dist/components/pr-hooks.d.ts +21 -1
- package/dist/components/pr-hooks.d.ts.map +1 -1
- package/dist/components/pr-hooks.js +72 -4
- package/dist/components/pr-pipeline.d.ts +45 -10
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +47 -14
- package/dist/components/pr-policy.d.ts +36 -0
- package/dist/components/pr-policy.d.ts.map +1 -1
- package/dist/components/pr-policy.js +36 -0
- package/dist/components/starter-plugin.d.ts +1 -0
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/starter-plugin.js +5 -1
- package/dist/components/verbs/index.d.ts +2 -0
- package/dist/components/verbs/index.d.ts.map +1 -1
- package/dist/components/verbs/index.js +2 -0
- package/dist/components/verbs/publish-artifact.d.ts +65 -0
- package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
- package/dist/components/verbs/publish-artifact.js +74 -0
- package/dist/components/verbs/publish-image.d.ts +129 -0
- package/dist/components/verbs/publish-image.d.ts.map +1 -0
- package/dist/components/verbs/publish-image.js +145 -0
- package/dist/config-environments.d.ts +112 -0
- package/dist/config-environments.d.ts.map +1 -0
- package/dist/config-environments.js +114 -0
- package/dist/config.d.ts +32 -84
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -96
- package/dist/gate-decision.d.ts +11 -2
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +15 -3
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-detail.js +15 -3
- package/dist/graph-effective.d.ts +33 -2
- package/dist/graph-effective.d.ts.map +1 -1
- package/dist/graph-effective.js +215 -68
- package/dist/graph-ir.d.ts +48 -0
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-ir.js +130 -0
- package/dist/graph-sub-template.d.ts +11 -0
- package/dist/graph-sub-template.d.ts.map +1 -0
- package/dist/graph-sub-template.js +19 -0
- package/dist/graph-walk.d.ts +66 -0
- package/dist/graph-walk.d.ts.map +1 -0
- package/dist/graph-walk.js +70 -0
- package/dist/import/parser.d.ts +19 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/lexicon.d.ts +80 -6
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +11 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +2 -5
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/ledger-read.d.ts +65 -0
- package/dist/lifecycle/ledger-read.d.ts.map +1 -0
- package/dist/lifecycle/ledger-read.js +160 -0
- package/dist/lifecycle/observe.d.ts +28 -0
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/observe.js +23 -1
- package/dist/lifecycle/release-workstation.d.ts +7 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -1
- package/dist/lifecycle/release-workstation.js +25 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -3
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +1 -0
- package/dist/lint/discover.js +3 -1
- package/dist/lint/post-synth.d.ts +127 -1
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/post-synth.js +84 -2
- package/dist/lint/rule.d.ts +6 -0
- package/dist/lint/rule.d.ts.map +1 -1
- package/dist/lint/rules/op/index.d.ts +1 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.js +2 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/live-endpoint.d.ts.map +1 -1
- package/dist/live-endpoint.js +1 -1
- package/dist/observation.d.ts +48 -1
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +21 -5
- package/dist/op/activities/activity-contracts.d.ts +9 -6
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +5 -2
- package/dist/op/activities/index.d.ts +2 -2
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +1 -1
- package/dist/op/activities/review-agent.d.ts +90 -4
- package/dist/op/activities/review-agent.d.ts.map +1 -1
- package/dist/op/activities/review-agent.js +217 -19
- package/dist/op/activities/work-evidence.d.ts +8 -1
- package/dist/op/activities/work-evidence.d.ts.map +1 -1
- package/dist/op/activities/work-evidence.js +1 -0
- package/dist/op/builders.d.ts +9 -5
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +9 -5
- package/dist/op/composites/apply-op.d.ts +29 -2
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/apply-op.js +20 -1
- package/dist/op/gate-approval.d.ts +11 -5
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-approval.js +11 -6
- package/dist/op/gate-quorum.d.ts +100 -3
- package/dist/op/gate-quorum.d.ts.map +1 -1
- package/dist/op/gate-quorum.js +108 -6
- package/dist/op/gate-review.d.ts +9 -0
- package/dist/op/gate-review.d.ts.map +1 -1
- package/dist/op/gate-review.js +13 -0
- package/dist/op/gate.d.ts +44 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +25 -4
- package/dist/op/index.d.ts +3 -3
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +38 -3
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +48 -6
- package/dist/op/op-waves-run.d.ts +26 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +259 -13
- package/dist/op/op-waves.d.ts +72 -5
- package/dist/op/op-waves.d.ts.map +1 -1
- package/dist/op/op-waves.js +110 -15
- package/dist/op/runtime.d.ts +11 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/schedule-overdue.d.ts +16 -0
- package/dist/op/schedule-overdue.d.ts.map +1 -1
- package/dist/op/schedule-overdue.js +36 -0
- package/dist/op/stage-hooks.d.ts +9 -2
- package/dist/op/stage-hooks.d.ts.map +1 -1
- package/dist/op/stage-hooks.js +7 -5
- package/dist/op/workspace-run-env.d.ts +22 -0
- package/dist/op/workspace-run-env.d.ts.map +1 -0
- package/dist/op/workspace-run-env.js +21 -0
- package/dist/pr-forge.d.ts +24 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +47 -0
- package/dist/pr-post.d.ts +42 -0
- package/dist/pr-post.d.ts.map +1 -1
- package/dist/pr-post.js +67 -1
- package/dist/read-filter.d.ts +65 -0
- package/dist/read-filter.d.ts.map +1 -0
- package/dist/read-filter.js +179 -0
- package/dist/run-event.d.ts +1 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/terraform/carve.d.ts +24 -3
- package/dist/terraform/carve.d.ts.map +1 -1
- package/dist/terraform/carve.js +32 -14
- package/dist/terraform/cuts.d.ts +97 -0
- package/dist/terraform/cuts.d.ts.map +1 -0
- package/dist/terraform/cuts.js +138 -0
- package/dist/terraform/folds.d.ts +26 -0
- package/dist/terraform/folds.d.ts.map +1 -0
- package/dist/terraform/folds.js +38 -0
- package/dist/terraform/graph.d.ts.map +1 -1
- package/dist/terraform/graph.js +10 -0
- package/dist/terraform/reach.d.ts +140 -0
- package/dist/terraform/reach.d.ts.map +1 -0
- package/dist/terraform/reach.js +170 -0
- package/dist/terraform/score.d.ts +14 -0
- package/dist/terraform/score.d.ts.map +1 -1
- package/dist/terraform/score.js +14 -31
- package/dist/terraform/state.d.ts.map +1 -1
- package/dist/terraform/state.js +4 -2
- package/dist/terraform/types.d.ts +8 -0
- package/dist/terraform/types.d.ts.map +1 -1
- package/dist/wave-blocked.d.ts +10 -1
- package/dist/wave-blocked.d.ts.map +1 -1
- package/dist/wave-blocked.js +31 -3
- package/dist/wave-runtime.mjs +266 -256
- package/dist/workspace/capabilities-contract.d.ts +66 -0
- package/dist/workspace/capabilities-contract.d.ts.map +1 -0
- package/dist/workspace/capabilities-contract.js +107 -0
- package/dist/workspace/capabilities.schema.json +229 -0
- package/dist/workspace/check.schema.json +11 -2
- package/dist/workspace/checks/ci-branch.d.ts +44 -0
- package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
- package/dist/workspace/checks/ci-branch.js +133 -0
- package/dist/workspace/checks/links.d.ts +3 -0
- package/dist/workspace/checks/links.d.ts.map +1 -1
- package/dist/workspace/checks/links.js +12 -1
- package/dist/workspace/checks/org.d.ts +48 -0
- package/dist/workspace/checks/org.d.ts.map +1 -0
- package/dist/workspace/checks/org.js +156 -0
- package/dist/workspace/checks.d.ts +11 -1
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +59 -7
- package/dist/workspace/ci-branches.d.ts +16 -0
- package/dist/workspace/ci-branches.d.ts.map +1 -1
- package/dist/workspace/ci-branches.js +27 -0
- package/dist/workspace/ci-green-cli.js +7 -7
- package/dist/workspace/ci-green-workflow.d.ts +1 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +13 -8
- package/dist/workspace/ci-green.d.ts +14 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +44 -11
- package/dist/workspace/ci-run.d.ts +9 -1
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +67 -6
- package/dist/workspace/ci-serve.d.ts +9 -0
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +114 -76
- package/dist/workspace/compose-graph.d.ts +23 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/compose-graph.js +3 -1
- package/dist/workspace/composites.d.ts +4 -1
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/composites.js +5 -2
- package/dist/workspace/composites.schema.json +22 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/dist/workspace/conformance/index.d.ts +1 -1
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/index.js +39 -2
- package/dist/workspace/cross-root-lint.d.ts +56 -0
- package/dist/workspace/cross-root-lint.d.ts.map +1 -0
- package/dist/workspace/cross-root-lint.js +111 -0
- package/dist/workspace/dbt-models-reader.d.ts +44 -0
- package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
- package/dist/workspace/dbt-models-reader.js +356 -0
- package/dist/workspace/dbt-project-common.d.ts +40 -0
- package/dist/workspace/dbt-project-common.d.ts.map +1 -0
- package/dist/workspace/dbt-project-common.js +106 -0
- package/dist/workspace/dbt-project-reader.d.ts +4 -3
- package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
- package/dist/workspace/dbt-project-reader.js +14 -108
- package/dist/workspace/decision-rank.d.ts +26 -0
- package/dist/workspace/decision-rank.d.ts.map +1 -0
- package/dist/workspace/decision-rank.js +16 -0
- package/dist/workspace/declaration.d.ts +43 -2
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +45 -11
- package/dist/workspace/declaration.schema.json +133 -24
- package/dist/workspace/environments.d.ts +26 -2
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/environments.js +26 -2
- package/dist/workspace/flyway-dir.d.ts +39 -0
- package/dist/workspace/flyway-dir.d.ts.map +1 -0
- package/dist/workspace/flyway-dir.js +104 -0
- package/dist/workspace/flyway-layout.d.ts +96 -0
- package/dist/workspace/flyway-layout.d.ts.map +1 -0
- package/dist/workspace/flyway-layout.js +308 -0
- package/dist/workspace/graph-cache.d.ts +8 -0
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cache.js +27 -3
- package/dist/workspace/graph-cli.d.ts +39 -2
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +92 -32
- package/dist/workspace/graph.schema.json +182 -0
- package/dist/workspace/intent.d.ts +2 -3
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +5 -9
- package/dist/workspace/kind-link-readers.d.ts +59 -2
- package/dist/workspace/kind-link-readers.d.ts.map +1 -1
- package/dist/workspace/kind-link-readers.js +17 -1
- package/dist/workspace/kind-readers.d.ts +3 -0
- package/dist/workspace/kind-readers.d.ts.map +1 -1
- package/dist/workspace/kind-readers.js +7 -1
- package/dist/workspace/kinds.d.ts +66 -2
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +98 -4
- package/dist/workspace/ledger.schema.json +158 -0
- package/dist/workspace/lexicon-outputs.d.ts +20 -1
- package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
- package/dist/workspace/lexicon-outputs.js +102 -10
- package/dist/workspace/lineage-check.d.ts +3 -0
- package/dist/workspace/lineage-check.d.ts.map +1 -1
- package/dist/workspace/lineage-check.js +23 -4
- package/dist/workspace/links.d.ts +8 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/links.js +25 -1
- package/dist/workspace/ls.d.ts +8 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +7 -1
- package/dist/workspace/ls.schema.json +7 -0
- package/dist/workspace/member-commands.d.ts +10 -1
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/member-commands.js +71 -6
- package/dist/workspace/migrate-links.d.ts +45 -0
- package/dist/workspace/migrate-links.d.ts.map +1 -0
- package/dist/workspace/migrate-links.js +100 -0
- package/dist/workspace/migration-dirs.d.ts +74 -0
- package/dist/workspace/migration-dirs.d.ts.map +1 -0
- package/dist/workspace/migration-dirs.js +254 -0
- package/dist/workspace/nested-graph.d.ts +2 -0
- package/dist/workspace/nested-graph.d.ts.map +1 -1
- package/dist/workspace/nested-graph.js +32 -1
- package/dist/workspace/reason-codes.d.ts +18 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +23 -0
- package/dist/workspace/records-cli.d.ts +11 -0
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-cli.js +57 -5
- package/dist/workspace/records.schema.json +5 -0
- package/dist/workspace/release-candidates.d.ts +2 -0
- package/dist/workspace/release-candidates.d.ts.map +1 -1
- package/dist/workspace/release-candidates.js +5 -2
- package/dist/workspace/release-train.d.ts +53 -0
- package/dist/workspace/release-train.d.ts.map +1 -0
- package/dist/workspace/release-train.js +134 -0
- package/dist/workspace/release-workflow.d.ts.map +1 -1
- package/dist/workspace/release-workflow.js +4 -3
- package/dist/workspace/repo-ref.d.ts +45 -0
- package/dist/workspace/repo-ref.d.ts.map +1 -0
- package/dist/workspace/repo-ref.js +114 -0
- package/dist/workspace/run-event.schema.json +2 -2
- package/dist/workspace/runs-cli.d.ts +9 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -1
- package/dist/workspace/runs-cli.js +48 -3
- package/dist/workspace/runs.schema.json +7 -0
- package/dist/workspace/search-cli.d.ts +204 -0
- package/dist/workspace/search-cli.d.ts.map +1 -0
- package/dist/workspace/search-cli.js +466 -0
- package/dist/workspace/search-contract.d.ts +56 -0
- package/dist/workspace/search-contract.d.ts.map +1 -0
- package/dist/workspace/search-contract.js +70 -0
- package/dist/workspace/search.schema.json +822 -0
- package/dist/workspace/status-decisions.d.ts +37 -0
- package/dist/workspace/status-decisions.d.ts.map +1 -0
- package/dist/workspace/status-decisions.js +147 -0
- package/dist/workspace/status-gates.d.ts +9 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +4 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +14 -2
- package/dist/workspace/status.schema.json +6 -0
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-cli.js +5 -3
- package/dist/workspace/work-evidence-ops.d.ts +83 -0
- package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
- package/dist/workspace/work-evidence-ops.js +169 -0
- package/dist/workspace/work-evidence.d.ts +12 -2
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-evidence.js +21 -3
- package/dist/workspace/work-evidence.schema.json +49 -2
- package/dist/workspace/workspace-gates.d.ts +110 -0
- package/dist/workspace/workspace-gates.d.ts.map +1 -0
- package/dist/workspace/workspace-gates.js +140 -0
- package/dist/workspace/workspace-kinds.schema.json +58 -3
- package/dist/workspace/workspace-ledger.d.ts +76 -0
- package/dist/workspace/workspace-ledger.d.ts.map +1 -0
- package/dist/workspace/workspace-ledger.js +91 -0
- package/dist/workspace/workspace-run.d.ts +112 -0
- package/dist/workspace/workspace-run.d.ts.map +1 -0
- package/dist/workspace/workspace-run.js +432 -0
- package/package.json +1 -1
- package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/src/__golden__/wave-loop/op-cost-member.json +13 -0
- package/src/__golden__/wave-loop/op-denied-source.json +16 -0
- package/src/__golden__/wave-loop/op-denied.json +16 -0
- package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/src/__golden__/wave-loop/op-held-on.json +16 -0
- package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/src/__golden__/wave-loop/op-overridden.json +16 -0
- package/src/__golden__/wave-loop/op-per-run.json +20 -0
- package/src/__golden__/wave-loop/op-point.json +13 -0
- package/src/__golden__/wave-loop/op-pr-review.json +10 -0
- package/src/__golden__/wave-loop/op-sealed.json +10 -0
- package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/src/__golden__/wave-loop/op-spend.json +10 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/src/__golden__/wave-loop/op-wide.json +39 -0
- package/src/__snapshots__/okf.test.ts.snap +10 -0
- package/src/action-pins.test.ts +78 -0
- package/src/action-pins.ts +92 -0
- package/src/capabilities/aws.paths +148 -0
- package/src/capabilities/base-mappings.json +122 -0
- package/src/capabilities/catalog.ts +230 -0
- package/src/capabilities/language.test.ts +191 -0
- package/src/capabilities/language.ts +373 -0
- package/src/capabilities/matcher.ts +315 -0
- package/src/capabilities/view-compose.test.ts +76 -0
- package/src/capabilities/view.ts +631 -0
- package/src/cli/commands/carve-score-once.test.ts +99 -0
- package/src/cli/commands/carve.ts +37 -6
- package/src/cli/commands/check-lexicon.test.ts +2 -2
- package/src/cli/commands/import-report.ts +71 -0
- package/src/cli/commands/import.ts +33 -3
- package/src/cli/commands/lint.ts +1 -0
- package/src/cli/commands/migrate-dialect.test.ts +145 -0
- package/src/cli/commands/migrate.ts +132 -11
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
- package/src/cli/handlers/approve.ts +23 -2
- package/src/cli/handlers/build.ts +7 -1
- package/src/cli/handlers/declared-graph.ts +99 -0
- package/src/cli/handlers/graph.test.ts +94 -3
- package/src/cli/handlers/graph.ts +123 -96
- package/src/cli/handlers/ledger.ts +54 -0
- package/src/cli/handlers/migrate.ts +21 -12
- package/src/cli/handlers/misc.ts +10 -1
- package/src/cli/handlers/pr-env.ts +3 -4
- package/src/cli/handlers/pr.ts +138 -36
- package/src/cli/handlers/query.ts +16 -4
- package/src/cli/handlers/release.ts +6 -3
- package/src/cli/handlers/search-build-roots.test.ts +144 -0
- package/src/cli/handlers/search-count.test.ts +191 -0
- package/src/cli/handlers/search-count.ts +165 -0
- package/src/cli/handlers/search-json.test.ts +333 -0
- package/src/cli/handlers/search-live.test.ts +387 -0
- package/src/cli/handlers/search-paths.test.ts +235 -0
- package/src/cli/handlers/search.ts +1291 -166
- package/src/cli/main.test.ts +43 -3
- package/src/cli/main.ts +88 -17
- package/src/cli/mcp/server.test.ts +3 -3
- package/src/cli/mcp/server.ts +3 -0
- package/src/cli/mcp/tools/capabilities.ts +32 -0
- package/src/cli/mcp/workspace-tools.e2e.test.ts +21 -1
- package/src/cli/mcp/workspace-tools.ts +47 -2
- package/src/cli/parse-args.ts +79 -15
- package/src/cli/registry.ts +36 -4
- package/src/components/builders.ts +8 -0
- package/src/components/capability-plugin-loader.ts +13 -1
- package/src/components/capability-plugin.ts +16 -0
- package/src/components/pr-env-ports.ts +89 -0
- package/src/components/pr-env-run-bundle.test.ts +54 -0
- package/src/components/pr-env-run.ts +5 -76
- package/src/components/pr-environment.ts +2 -1
- package/src/components/pr-hooks.test.ts +73 -5
- package/src/components/pr-hooks.ts +95 -5
- package/src/components/pr-pipeline.ts +64 -16
- package/src/components/pr-policy.test.ts +64 -1
- package/src/components/pr-policy.ts +53 -0
- package/src/components/registry.test.ts +1 -1
- package/src/components/starter-plugin.ts +6 -0
- package/src/components/verbs/index.ts +2 -0
- package/src/components/verbs/publish-artifact.test.ts +60 -0
- package/src/components/verbs/publish-artifact.ts +122 -0
- package/src/components/verbs/publish-image.test.ts +101 -0
- package/src/components/verbs/publish-image.ts +265 -0
- package/src/config-environments.ts +160 -0
- package/src/config.ts +44 -124
- package/src/gate-decision-bundle.test.ts +1 -0
- package/src/gate-decision-identity.test.ts +9 -0
- package/src/gate-decision.ts +26 -3
- package/src/graph-detail.ts +15 -3
- package/src/graph-effective.ts +226 -75
- package/src/graph-ir.test.ts +163 -0
- package/src/graph-ir.ts +174 -0
- package/src/graph-sub-template.ts +22 -0
- package/src/graph-walk.test.ts +44 -0
- package/src/graph-walk.ts +102 -0
- package/src/import/parser.ts +20 -0
- package/src/lexicon.ts +84 -6
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lifecycle/git.ts +2 -2
- package/src/lifecycle/ledger-read.test.ts +107 -0
- package/src/lifecycle/ledger-read.ts +195 -0
- package/src/lifecycle/observe.test.ts +27 -1
- package/src/lifecycle/observe.ts +43 -1
- package/src/lifecycle/release-workstation.ts +24 -0
- package/src/lifecycle/run-ledger.ts +5 -2
- package/src/lint/cross-root.test.ts +122 -0
- package/src/lint/discover.ts +3 -1
- package/src/lint/post-synth.ts +212 -2
- package/src/lint/rule.ts +6 -0
- package/src/lint/rules/op/index.ts +2 -0
- package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
- package/src/live-endpoint.ts +1 -1
- package/src/observation.test.ts +25 -0
- package/src/observation.ts +69 -5
- package/src/op/activities/activity-contracts.ts +5 -2
- package/src/op/activities/index.ts +2 -2
- package/src/op/activities/review-agent.test.ts +221 -4
- package/src/op/activities/review-agent.ts +265 -22
- package/src/op/activities/work-evidence.ts +9 -1
- package/src/op/builders.ts +9 -5
- package/src/op/composites/apply-op.test.ts +108 -0
- package/src/op/composites/apply-op.ts +37 -2
- package/src/op/gate-approval.test.ts +6 -1
- package/src/op/gate-approval.ts +12 -6
- package/src/op/gate-quorum-at-base.test.ts +211 -0
- package/src/op/gate-quorum.ts +156 -8
- package/src/op/gate-review.ts +14 -0
- package/src/op/gate.ts +67 -8
- package/src/op/index.ts +3 -2
- package/src/op/local-executor.ts +69 -9
- package/src/op/op-waves-depends-on.test.ts +81 -0
- package/src/op/op-waves-hook-targets.test.ts +4 -2
- package/src/op/op-waves-quorum-product.test.ts +158 -0
- package/src/op/op-waves-run.ts +288 -14
- package/src/op/op-waves.ts +143 -14
- package/src/op/runtime.ts +8 -0
- package/src/op/schedule-overdue.ts +33 -0
- package/src/op/stage-hooks.ts +13 -5
- package/src/op/workspace-run-env.ts +29 -0
- package/src/pr-forge-bundle.test.ts +2 -2
- package/src/pr-forge.test.ts +47 -0
- package/src/pr-forge.ts +68 -0
- package/src/pr-post-open.e2e.test.ts +36 -0
- package/src/pr-post.test.ts +102 -3
- package/src/pr-post.ts +89 -1
- package/src/read-filter.test.ts +54 -0
- package/src/read-filter.ts +193 -0
- package/src/run-event.ts +1 -1
- package/src/stage-hooks-bundle.test.ts +1 -0
- package/src/terraform/carve.ts +52 -15
- package/src/terraform/cuts.test.ts +173 -0
- package/src/terraform/cuts.ts +188 -0
- package/src/terraform/folds.ts +44 -0
- package/src/terraform/graph.ts +9 -0
- package/src/terraform/radius.test.ts +90 -0
- package/src/terraform/reach.test.ts +146 -0
- package/src/terraform/reach.ts +247 -0
- package/src/terraform/score.ts +27 -29
- package/src/terraform/state.ts +3 -1
- package/src/terraform/types.ts +8 -0
- package/src/wave-blocked.ts +28 -3
- package/src/wave-loop-golden.test.ts +4 -3
- package/src/workspace/behold-kinds.test.ts +1 -1
- package/src/workspace/capabilities-contract.test.ts +88 -0
- package/src/workspace/capabilities-contract.ts +132 -0
- package/src/workspace/capabilities.schema.json +229 -0
- package/src/workspace/check-contract.test.ts +7 -6
- package/src/workspace/check.schema.json +11 -2
- package/src/workspace/checks/ci-branch.test.ts +128 -0
- package/src/workspace/checks/ci-branch.ts +141 -0
- package/src/workspace/checks/links.ts +12 -1
- package/src/workspace/checks/org.ts +169 -0
- package/src/workspace/checks.ts +64 -7
- package/src/workspace/ci-branches.ts +31 -0
- package/src/workspace/ci-green-branches.test.ts +153 -0
- package/src/workspace/ci-green-cli.ts +7 -7
- package/src/workspace/ci-green-workflow.test.ts +4 -3
- package/src/workspace/ci-green-workflow.ts +13 -9
- package/src/workspace/ci-green.ts +49 -12
- package/src/workspace/ci-run.test.ts +72 -1
- package/src/workspace/ci-run.ts +68 -8
- package/src/workspace/ci-serve.test.ts +95 -0
- package/src/workspace/ci-serve.ts +106 -65
- package/src/workspace/component-environments.test.ts +25 -2
- package/src/workspace/compose-graph.ts +19 -3
- package/src/workspace/composites.schema.json +22 -0
- package/src/workspace/composites.test.ts +39 -8
- package/src/workspace/composites.ts +6 -2
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/src/workspace/conformance/conformance.e2e.test.ts +14 -1
- package/src/workspace/conformance/index.ts +31 -2
- package/src/workspace/cross-root-lint.test.ts +90 -0
- package/src/workspace/cross-root-lint.ts +126 -0
- package/src/workspace/dbt-kind.test.ts +3 -2
- package/src/workspace/dbt-models-reader.ts +362 -0
- package/src/workspace/dbt-models.test.ts +248 -0
- package/src/workspace/dbt-project-common.ts +113 -0
- package/src/workspace/dbt-project-reader.ts +29 -112
- package/src/workspace/decision-rank.ts +40 -0
- package/src/workspace/declaration.schema.json +133 -24
- package/src/workspace/declaration.ts +84 -15
- package/src/workspace/environments.ts +40 -4
- package/src/workspace/flyway-dir.ts +113 -0
- package/src/workspace/flyway-layout.ts +337 -0
- package/src/workspace/graph-cache.ts +27 -3
- package/src/workspace/graph-cli.ts +119 -32
- package/src/workspace/graph-contract.test.ts +4 -2
- package/src/workspace/graph.schema.json +182 -0
- package/src/workspace/identity.test.ts +14 -2
- package/src/workspace/intent.ts +6 -14
- package/src/workspace/kind-link-readers.ts +68 -3
- package/src/workspace/kind-readers.e2e.test.ts +28 -0
- package/src/workspace/kind-readers.test.ts +1 -1
- package/src/workspace/kind-readers.ts +7 -1
- package/src/workspace/kinds.test.ts +12 -7
- package/src/workspace/kinds.ts +132 -7
- package/src/workspace/ledger.schema.json +158 -0
- package/src/workspace/lexicon-outputs.ts +132 -13
- package/src/workspace/lineage-check.ts +30 -7
- package/src/workspace/links.ts +24 -1
- package/src/workspace/ls-contract.test.ts +1 -1
- package/src/workspace/ls.schema.json +7 -0
- package/src/workspace/ls.ts +10 -1
- package/src/workspace/member-commands.ts +82 -3
- package/src/workspace/member-file-schema.test.ts +124 -0
- package/src/workspace/migrate-links.test.ts +99 -0
- package/src/workspace/migrate-links.ts +108 -0
- package/src/workspace/migration-dirs.test.ts +272 -0
- package/src/workspace/migration-dirs.ts +267 -0
- package/src/workspace/nested-graph.ts +32 -1
- package/src/workspace/org-scope.test.ts +238 -0
- package/src/workspace/reason-codes.test.ts +13 -1
- package/src/workspace/reason-codes.ts +23 -0
- package/src/workspace/records-cli.ts +58 -5
- package/src/workspace/records.schema.json +5 -0
- package/src/workspace/release-candidates.ts +7 -2
- package/src/workspace/release-train.ts +157 -0
- package/src/workspace/release-workflow.ts +4 -3
- package/src/workspace/repo-ref.ts +113 -0
- package/src/workspace/run-event.schema.json +2 -2
- package/src/workspace/runs-cli.ts +48 -4
- package/src/workspace/runs.schema.json +7 -0
- package/src/workspace/search-cli.e2e.test.ts +305 -0
- package/src/workspace/search-cli.ts +591 -0
- package/src/workspace/search-contract.ts +95 -0
- package/src/workspace/search.schema.json +822 -0
- package/src/workspace/status-contract.test.ts +46 -1
- package/src/workspace/status-decisions.test.ts +100 -0
- package/src/workspace/status-decisions.ts +151 -0
- package/src/workspace/status-gates.ts +9 -0
- package/src/workspace/status.schema.json +6 -0
- package/src/workspace/status.ts +17 -3
- package/src/workspace/where-filters.test.ts +39 -0
- package/src/workspace/work-cli.ts +5 -3
- package/src/workspace/work-evidence-ops.test.ts +176 -0
- package/src/workspace/work-evidence-ops.ts +189 -0
- package/src/workspace/work-evidence.schema.json +49 -2
- package/src/workspace/work-evidence.ts +22 -3
- package/src/workspace/workspace-gates.ts +200 -0
- package/src/workspace/workspace-kinds.schema.json +58 -3
- package/src/workspace/workspace-ledger.ts +130 -0
- package/src/workspace/workspace-run.test.ts +322 -0
- package/src/workspace/workspace-run.ts +461 -0
package/dist/cli/handlers/pr.js
CHANGED
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
* through `--forge`.
|
|
65
65
|
*/
|
|
66
66
|
import { spawnSync } from "node:child_process";
|
|
67
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
68
|
-
import { join, resolve } from "node:path";
|
|
67
|
+
import { mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
|
68
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
69
69
|
import { loadChantConfig, resolveAutoReleaseDisabled } from "../../config.js";
|
|
70
70
|
import { resolveCommit, resolveMergeBase } from "../../components/changed-files.js";
|
|
71
71
|
import { deriveFanOut, fanOutRegistry } from "../../components/fan-out-support.js";
|
|
@@ -76,7 +76,7 @@ import { blockedMembers, blockedWords, settleEarlierWaves } from "../../wave-blo
|
|
|
76
76
|
import { readFanOutAttempt, writeFanOutAttempt } from "../../components/fan-out-record.js";
|
|
77
77
|
import { componentInputDigests, progressThatCarries } from "../../components/fan-out-inputs.js";
|
|
78
78
|
import { samePlanDigest } from "../../lifecycle/plan-digest.js";
|
|
79
|
-
import { gateIsSealed, gitGateLedgerPort } from "../../op/gate.js";
|
|
79
|
+
import { evaluateGate, gateIsSealed, gitGateLedgerPort } from "../../op/gate.js";
|
|
80
80
|
import { emitGateStep, gateEventsOf, GATE_PHASE } from "../../run-event-stream.js";
|
|
81
81
|
import { openCliRunEvents, refusesEventsWithJson } from "../run-events.js";
|
|
82
82
|
import { openPrReportUpload, parseReportUrl, reportKey } from "../../pr-report-url.js";
|
|
@@ -94,7 +94,7 @@ import { appliedDigestOf } from "../../components/auto-release.js";
|
|
|
94
94
|
import { withComponentEndpoint } from "../component-endpoint.js";
|
|
95
95
|
import { failedRunExitCode } from "../../components/driver.js";
|
|
96
96
|
import { prLoopHooksAt, runPrHooks } from "../../components/pr-hooks.js";
|
|
97
|
-
import { decidePrPolicyOverride, prLoopPolicyAt, prPolicyReport, runPrPolicy, spendPrPolicyOverride } from "../../components/pr-policy.js";
|
|
97
|
+
import { decidePrPolicyOverride, policyReviewOf, prLoopPolicyAt, prPolicyReport, runPrPolicy, spendPrPolicyOverride } from "../../components/pr-policy.js";
|
|
98
98
|
/** Where the reports land unless `--output` says. */
|
|
99
99
|
export const PR_REPORT_DIR = ".chant/pr";
|
|
100
100
|
const fail = (message, hint) => {
|
|
@@ -237,10 +237,13 @@ export function placeHooks(ctx, p, stage, op) {
|
|
|
237
237
|
* when no hook failed. A hold is logged: the pull request's gate already
|
|
238
238
|
* waits for a person's approval of the digest.
|
|
239
239
|
*/
|
|
240
|
-
export function runStageHook(p, moment, components, planned, what = "nothing was applied") {
|
|
240
|
+
export async function runStageHook(p, moment, components, planned, what = "nothing was applied", env) {
|
|
241
241
|
if (!p.hookPlace || components.length === 0)
|
|
242
242
|
return undefined;
|
|
243
|
-
const ran = runPrHooks(p.hooks, moment, p.hookPlace, components, planned ? { members: planned.members, plans: planned.plans } : undefined
|
|
243
|
+
const ran = await runPrHooks(p.hooks, moment, p.hookPlace, components, planned ? { members: planned.members, plans: planned.plans } : undefined, {
|
|
244
|
+
...(env ? { env } : {}),
|
|
245
|
+
settle: (hold) => settleHeldGate(p, hold),
|
|
246
|
+
});
|
|
244
247
|
p.hookOutcomes.push(...ran.outcomes);
|
|
245
248
|
for (const hold of ran.holds)
|
|
246
249
|
console.error(formatInfo(`${hold} held, and the pull request's gate asks for an approval of the digest either way`));
|
|
@@ -249,6 +252,46 @@ export function runStageHook(p, moment, components, planned, what = "nothing was
|
|
|
249
252
|
p.hookFailed = `The ${ran.failed}, so ${what}.`;
|
|
250
253
|
return p.hookFailed;
|
|
251
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Settle a hook's hold on another gate (#4323), the way an Op waves job does:
|
|
257
|
+
* an approval of that gate and digest under its `identity.gates` rule read at
|
|
258
|
+
* base, else a pending fact for it. The plan stage writes nothing, so there
|
|
259
|
+
* it only reads.
|
|
260
|
+
*/
|
|
261
|
+
async function settleHeldGate(p, hold) {
|
|
262
|
+
const real = gitGateLedgerPort();
|
|
263
|
+
const ledger = p.hookPlace?.stage === "plan" ? readOnlyLedger(real) : real;
|
|
264
|
+
const port = ledger.approvalRule ? { ...ledger, approvalRule: (g) => ledger.approvalRule(g, { base: p.base }) } : ledger;
|
|
265
|
+
const op = hold.request.op ?? p.hookPlace?.op ?? "";
|
|
266
|
+
const check = await evaluateGate(port, {
|
|
267
|
+
op,
|
|
268
|
+
gate: hold.request.gate,
|
|
269
|
+
planDigest: hold.request.digest,
|
|
270
|
+
description: hold.request.description ?? `${hold.label} holds the pull request on it`,
|
|
271
|
+
fields: { ...hold.request.pending, approvalMode: "ledger", heldBy: { hook: hold.name, moment: hold.moment, ...(hold.target ? { target: hold.target } : {}) } },
|
|
272
|
+
});
|
|
273
|
+
if (check.satisfied)
|
|
274
|
+
return { status: "approved", approvedBy: check.resolution.resolvedBy, approvedAt: check.resolution.timestamp };
|
|
275
|
+
for (const { resolution: r, reason } of check.refused ?? [])
|
|
276
|
+
console.error(formatInfo(`${op} / ${hold.request.gate}: the approval by ${r.resolvedBy} at ${r.timestamp} does not count: ${reason}`));
|
|
277
|
+
return { status: "waiting" };
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Run the `after-gate` hooks once the pull request's gate decided (#4323),
|
|
281
|
+
* whatever it decided. `CHANT_GATE_STATUS` is `approved`, or `waiting` when no
|
|
282
|
+
* approval of the digest stands; `CHANT_GATE_OP`, `CHANT_GATE` and
|
|
283
|
+
* `CHANT_GATE_DIGEST` name the gate. Returns the failure message, as
|
|
284
|
+
* {@link runStageHook} does; the caller ignores it when the gate did not let
|
|
285
|
+
* the apply through, since the stage ends there anyway.
|
|
286
|
+
*/
|
|
287
|
+
export function runGateHook(p, at, components) {
|
|
288
|
+
return runStageHook(p, "after-gate", components, undefined, "nothing was applied", {
|
|
289
|
+
CHANT_GATE_STATUS: at.satisfied ? "approved" : "waiting",
|
|
290
|
+
CHANT_GATE_OP: at.op,
|
|
291
|
+
CHANT_GATE: p.gate,
|
|
292
|
+
CHANT_GATE_DIGEST: at.digest,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
252
295
|
const EMPTY_SET = () => ({ doc: composeChangeSet([]), members: [], plans: {}, outputs: {}, failed: true });
|
|
253
296
|
/**
|
|
254
297
|
* Plan with the plan-side hooks around it (#4288): before-observe and
|
|
@@ -256,14 +299,14 @@ const EMPTY_SET = () => ({ doc: composeChangeSet([]), members: [], plans: {}, ou
|
|
|
256
299
|
* set, so the stage reports `plan-failed` and nothing applies.
|
|
257
300
|
*/
|
|
258
301
|
async function hookedPlan(p, components, plan) {
|
|
259
|
-
if (runStageHook(p, "before-observe", components, undefined, "nothing was planned or applied"))
|
|
302
|
+
if (await runStageHook(p, "before-observe", components, undefined, "nothing was planned or applied"))
|
|
260
303
|
return EMPTY_SET();
|
|
261
|
-
if (runStageHook(p, "before-plan", components, undefined, "nothing was planned or applied"))
|
|
304
|
+
if (await runStageHook(p, "before-plan", components, undefined, "nothing was planned or applied"))
|
|
262
305
|
return EMPTY_SET();
|
|
263
306
|
const set = await plan();
|
|
264
307
|
if (set.failed)
|
|
265
308
|
return set;
|
|
266
|
-
if (runStageHook(p, "after-plan", components, set))
|
|
309
|
+
if (await runStageHook(p, "after-plan", components, set))
|
|
267
310
|
return { ...set, failed: true };
|
|
268
311
|
return set;
|
|
269
312
|
}
|
|
@@ -487,7 +530,9 @@ function openUpload(events, stage, pr, p) {
|
|
|
487
530
|
* read only at the plan stage, and recorded for an override at the apply.
|
|
488
531
|
*/
|
|
489
532
|
async function judgePolicy(p, at) {
|
|
490
|
-
|
|
533
|
+
// The review is read only when a policy will run: a workspace with no policy makes no forge call for it.
|
|
534
|
+
const review = p.policy.settings ? await policyReviewOf(p.forge, at.pr) : undefined;
|
|
535
|
+
const verdict = runPrPolicy(p.policy, { version: 1, stage: at.stage, op: at.op, gate: p.gate, env: p.env, pr: at.pr, base: p.base, head: p.head, changeSet: at.set.doc, ...(review ? { review } : {}) });
|
|
491
536
|
if (!verdict)
|
|
492
537
|
return { held: false };
|
|
493
538
|
const report = prPolicyReport(verdict, p.policy.base);
|
|
@@ -633,31 +678,8 @@ async function prPlan(ctx, stage) {
|
|
|
633
678
|
* `pr-post` asks instead, reading the Ops at the target branch's commit.
|
|
634
679
|
*/
|
|
635
680
|
async function overdueOps(forge, member) {
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
try {
|
|
639
|
-
const { discoverOps } = await import("../../op/discover.js");
|
|
640
|
-
const { scheduledWatches, checkOverdueOps } = await import("../../op/schedule-overdue.js");
|
|
641
|
-
const discovered = await discoverOps({ cwd: resolve(".") });
|
|
642
|
-
const watches = scheduledWatches([...discovered.ops.values()].map((d) => d.config));
|
|
643
|
-
if (watches.length === 0)
|
|
644
|
-
return [];
|
|
645
|
-
const top = spawnSync("git", ["rev-parse", "--show-toplevel"], { encoding: "utf-8" });
|
|
646
|
-
if (top.status !== 0)
|
|
647
|
-
return [];
|
|
648
|
-
return await checkOverdueOps({
|
|
649
|
-
watches,
|
|
650
|
-
forge,
|
|
651
|
-
repoRoot: top.stdout.trim(),
|
|
652
|
-
...(member ? { member } : {}),
|
|
653
|
-
now: new Date(),
|
|
654
|
-
log: (line) => console.error(formatWarning({ message: line })),
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
catch (err) {
|
|
658
|
-
console.error(formatWarning({ message: `could not check the scheduled Ops, so none is reported overdue: ${err instanceof Error ? err.message : String(err)}` }));
|
|
659
|
-
return [];
|
|
660
|
-
}
|
|
681
|
+
const { overdueOpsAt } = await import("../../op/schedule-overdue.js");
|
|
682
|
+
return overdueOpsAt({ forge, cwd: resolve("."), ...(member ? { member } : {}), log: (line) => console.error(formatWarning({ message: line })) });
|
|
661
683
|
}
|
|
662
684
|
/** chant components pr-apply --base <ref> [--pr <n>] [--env <env>] [--gate <name>] [--forge <kind>] [--require-review] [--output <dir>] [--json] [--events-json] [--report-url <url>] */
|
|
663
685
|
export function runComponentsPrApply(ctx) {
|
|
@@ -804,6 +826,10 @@ async function prApply(ctx, stage, beforeMerge) {
|
|
|
804
826
|
return stop(prReport({ ...base, approval: { status: "pending" }, status: "refused", refusal: judged.stop.refusal, message: judged.stop.message }), judged.stop.code);
|
|
805
827
|
const decided = await decideApplyGate(p, { op, pr, set, events, held: judged.held, ...(green ? { green } : {}) });
|
|
806
828
|
approval = decided.approval;
|
|
829
|
+
// #4323: the after-gate hooks hear the decision, a refusal too; only a failure that would have applied changes the outcome.
|
|
830
|
+
const afterGate = await runGateHook(p, { op, digest: set.doc.digest, satisfied: decided.satisfied }, p.plan.order);
|
|
831
|
+
if (afterGate && decided.satisfied)
|
|
832
|
+
return stop(prReport({ ...base, approval, status: "failed", message: afterGate }), 1);
|
|
807
833
|
if (!decided.satisfied)
|
|
808
834
|
return stop(prReport({ ...base, approval, status: "refused", refusal: decided.refusal, message: decided.message }), GATED_EXIT_CODE);
|
|
809
835
|
via = decided.via;
|
|
@@ -859,7 +885,7 @@ async function prApply(ctx, stage, beforeMerge) {
|
|
|
859
885
|
recordAttempt();
|
|
860
886
|
// #4288: the before-apply hooks, once the gate and the review let the apply through.
|
|
861
887
|
const toApply = (resumed?.plan ?? p.plan).order.filter((name) => !completedSoFar.has(name));
|
|
862
|
-
const beforeFailed = runStageHook(p, "before-apply", toApply);
|
|
888
|
+
const beforeFailed = await runStageHook(p, "before-apply", toApply);
|
|
863
889
|
if (beforeFailed)
|
|
864
890
|
return stop(prReport({ ...base, approval, status: "failed", message: beforeFailed }), 1);
|
|
865
891
|
// #3999: a round planned after an upstream applied waits on a gate of its
|
|
@@ -919,7 +945,7 @@ async function prApply(ctx, stage, beforeMerge) {
|
|
|
919
945
|
});
|
|
920
946
|
recordAttempt();
|
|
921
947
|
// #4288: the after-apply hooks, for the components that applied.
|
|
922
|
-
const afterFailed = runStageHook(p, "after-apply", toApply.filter((name) => applied.run.completed.includes(name)), undefined, "the apply counts as failed though its components applied");
|
|
948
|
+
const afterFailed = await runStageHook(p, "after-apply", toApply.filter((name) => applied.run.completed.includes(name)), undefined, "the apply counts as failed though its components applied");
|
|
923
949
|
await recordAutoReleasesForRun(applied.run.results, p.env, release.runId, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord), release.runOrigin, undefined, undefined, prAppliedDigests(p, applied.members));
|
|
924
950
|
const report = prReport({
|
|
925
951
|
...base,
|
|
@@ -1694,6 +1720,10 @@ async function prApplyWaves(ctx, p, at) {
|
|
|
1694
1720
|
return stop(report({ status: "refused", refusal: judged.stop.refusal, message: judged.stop.message }), judged.stop.code);
|
|
1695
1721
|
const decided = await decideApplyGate(p, { op, pr, set, events, held: judged.held, ...(green ? { green } : {}) });
|
|
1696
1722
|
approval = decided.approval;
|
|
1723
|
+
// #4323: the after-gate hooks hear the decision, a refusal too.
|
|
1724
|
+
const afterGate = await runGateHook(p, { op, digest: set.doc.digest, satisfied: decided.satisfied }, p.plan.order);
|
|
1725
|
+
if (afterGate && decided.satisfied)
|
|
1726
|
+
return stop(report({ status: "failed", message: afterGate }), 1);
|
|
1697
1727
|
if (!decided.satisfied)
|
|
1698
1728
|
return stop(report({ status: "refused", refusal: decided.refusal, message: decided.message }), GATED_EXIT_CODE);
|
|
1699
1729
|
via = decided.via;
|
|
@@ -1849,7 +1879,7 @@ async function prApplyWaves(ctx, p, at) {
|
|
|
1849
1879
|
}
|
|
1850
1880
|
}
|
|
1851
1881
|
// #4288: the wave's apply-side hooks, around its apply.
|
|
1852
|
-
const waveBefore = runStageHook(p, "before-apply", wavePlan.order, undefined, `nothing in wave ${k} was applied`);
|
|
1882
|
+
const waveBefore = await runStageHook(p, "before-apply", wavePlan.order, undefined, `nothing in wave ${k} was applied`);
|
|
1853
1883
|
if (waveBefore) {
|
|
1854
1884
|
setWave({ ...entry, status: "failed" });
|
|
1855
1885
|
return stop(report({ status: "failed", message: waveBefore }), 1);
|
|
@@ -1890,7 +1920,7 @@ async function prApplyWaves(ctx, p, at) {
|
|
|
1890
1920
|
if (outputs)
|
|
1891
1921
|
outputsSoFar[name] = outputs;
|
|
1892
1922
|
}
|
|
1893
|
-
const waveAfter = runStageHook(p, "after-apply", wavePlan.order.filter((name) => applied.run.completed.includes(name)), undefined, `wave ${k} counts as failed though its components applied`);
|
|
1923
|
+
const waveAfter = await runStageHook(p, "after-apply", wavePlan.order.filter((name) => applied.run.completed.includes(name)), undefined, `wave ${k} counts as failed though its components applied`);
|
|
1894
1924
|
setWave({ ...entry, status: applied.status === "applied" && !waveAfter ? "applied" : "failed" });
|
|
1895
1925
|
await recordAutoReleasesForRun(applied.run.results, p.env, at.release.runId, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord), at.release.runOrigin, undefined, undefined, prAppliedDigests(p, applied.members));
|
|
1896
1926
|
if (applied.status !== "applied") {
|
|
@@ -1928,6 +1958,7 @@ function writeWaveChangeSet(ctx, wave, doc, upload) {
|
|
|
1928
1958
|
}
|
|
1929
1959
|
/**
|
|
1930
1960
|
* chant components pr-post --pr <n> --head <sha> --env <env> --forge <kind> [--member <name>] [--output <dir>] [--result <result>] (#4295)
|
|
1961
|
+
* chant components pr-post --open --env <env> --forge gitlab [--branch <branch>] [--member <name>] [--output <dir>] (#4328)
|
|
1931
1962
|
*
|
|
1932
1963
|
* Post the plan note and the `chant/plan` status from the report a plan job
|
|
1933
1964
|
* wrote with `pr-plan --no-status`, in a job that runs none of the change's
|
|
@@ -1938,6 +1969,8 @@ function writeWaveChangeSet(ctx, wave, doc, upload) {
|
|
|
1938
1969
|
*/
|
|
1939
1970
|
export async function runComponentsPrPost(ctx) {
|
|
1940
1971
|
const { args } = ctx;
|
|
1972
|
+
if (args.open)
|
|
1973
|
+
return runComponentsPrPostOpen(ctx);
|
|
1941
1974
|
if (args.pr === undefined)
|
|
1942
1975
|
return fail("pr-post needs the pull or merge request: --pr <n>");
|
|
1943
1976
|
if (!args.head || !/^[0-9a-f]{40}$/.test(args.head))
|
|
@@ -1975,3 +2008,74 @@ export async function runComponentsPrPost(ctx) {
|
|
|
1975
2008
|
console.error(formatInfo(`pr-post: ${prStatusContext("plan", member)} ${posted.state}: ${posted.description}${posted.noted ? "; note posted" : ""}`));
|
|
1976
2009
|
return 0;
|
|
1977
2010
|
}
|
|
2011
|
+
/**
|
|
2012
|
+
* `pr-post --open` (#4328): in a pipeline of the target branch on GitLab,
|
|
2013
|
+
* post the plan note and status of every open merge request into it whose
|
|
2014
|
+
* plan job settled, reading each report from the plan job's artifacts
|
|
2015
|
+
* (`postOpenPlanReports`, ../../pr-post.ts). The branch is `--branch`, else
|
|
2016
|
+
* the pipeline's own (`CI_COMMIT_BRANCH`). The plan job is `plan`, or
|
|
2017
|
+
* `<member>-plan` with `--member`, as the gitlab lexicon names it, and the
|
|
2018
|
+
* artifact path is `--output` from the repository root. It exits 0 once it
|
|
2019
|
+
* has posted, as `pr-post` does.
|
|
2020
|
+
*/
|
|
2021
|
+
async function runComponentsPrPostOpen(ctx) {
|
|
2022
|
+
const { args } = ctx;
|
|
2023
|
+
if (args.pr !== undefined || args.head)
|
|
2024
|
+
return fail("pr-post --open finds each merge request and its head itself, so it takes no --pr or --head");
|
|
2025
|
+
if (!args.env)
|
|
2026
|
+
return fail("pr-post needs the environment the plan was for: --env <env>");
|
|
2027
|
+
if (args.forge !== "gitlab")
|
|
2028
|
+
return fail("pr-post --open is for a GitLab pipeline of the target branch: --forge gitlab");
|
|
2029
|
+
if (args.members && args.members.length > 1)
|
|
2030
|
+
return fail(`pr-post takes one --member, not ${args.members.join(", ")}`);
|
|
2031
|
+
const branch = args.branch ?? process.env.CI_COMMIT_BRANCH;
|
|
2032
|
+
if (!branch)
|
|
2033
|
+
return fail("pr-post --open posts for the merge requests into a branch: run it in a branch pipeline, or pass --branch <branch>");
|
|
2034
|
+
let forge;
|
|
2035
|
+
try {
|
|
2036
|
+
forge = forgeFromEnv("gitlab");
|
|
2037
|
+
}
|
|
2038
|
+
catch (err) {
|
|
2039
|
+
return fail(err instanceof Error ? err.message : String(err));
|
|
2040
|
+
}
|
|
2041
|
+
const top = spawnSync("git", ["rev-parse", "--show-toplevel"], { encoding: "utf-8" });
|
|
2042
|
+
if (top.status !== 0)
|
|
2043
|
+
return fail("pr-post --open reads the plan report's path from the repository root, and this directory is not in a git repository");
|
|
2044
|
+
const member = args.members?.[0];
|
|
2045
|
+
const artifactDir = relative(realpathSync(top.stdout.trim()), resolve(args.output ?? PR_REPORT_DIR)).split(sep).join("/");
|
|
2046
|
+
const { postOpenPlanReports } = await import("../../pr-post.js");
|
|
2047
|
+
const { gitlabPlanJobName } = await import("../../components/pr-pipeline.js");
|
|
2048
|
+
let done;
|
|
2049
|
+
try {
|
|
2050
|
+
done = await postOpenPlanReports({
|
|
2051
|
+
forge,
|
|
2052
|
+
branch,
|
|
2053
|
+
job: gitlabPlanJobName(member),
|
|
2054
|
+
artifactDir,
|
|
2055
|
+
env: args.env,
|
|
2056
|
+
...(member ? { member } : {}),
|
|
2057
|
+
// #4289: the Ops at the commit this pipeline checked out, the target branch's.
|
|
2058
|
+
overdue: () => overdueOps(forge, member),
|
|
2059
|
+
});
|
|
2060
|
+
}
|
|
2061
|
+
catch (err) {
|
|
2062
|
+
return fail(err instanceof Error ? err.message : String(err));
|
|
2063
|
+
}
|
|
2064
|
+
for (const message of done.warnings)
|
|
2065
|
+
console.error(formatWarning({ message }));
|
|
2066
|
+
for (const p of done.posts) {
|
|
2067
|
+
if (p.skipped) {
|
|
2068
|
+
console.error(formatInfo(`pr-post: !${p.pr}: ${p.skipped}`));
|
|
2069
|
+
continue;
|
|
2070
|
+
}
|
|
2071
|
+
const posted = p.posted;
|
|
2072
|
+
for (const message of posted.warnings)
|
|
2073
|
+
console.error(formatWarning({ message: `!${p.pr}: ${message}` }));
|
|
2074
|
+
if (posted.refused)
|
|
2075
|
+
console.error(formatWarning({ message: `!${p.pr}: the plan report was not used: ${posted.refused}` }));
|
|
2076
|
+
console.error(formatInfo(`pr-post: !${p.pr} ${prStatusContext("plan", member)} ${posted.state}: ${posted.description}${posted.noted ? "; note posted" : ""}`));
|
|
2077
|
+
}
|
|
2078
|
+
if (done.posts.length === 0)
|
|
2079
|
+
console.error(formatInfo(`pr-post: no open merge request into ${branch} has a ${gitlabPlanJobName(member)} job`));
|
|
2080
|
+
return 0;
|
|
2081
|
+
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { CommandContext } from "../registry.js";
|
|
2
2
|
import type { QueryLedger } from "../../lifecycle/query.js";
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* The ledgers `chant query` and `chant ledger` read from `cwd`: every
|
|
5
|
+
* member's in a workspace, else the project's own. With `at`, a commit of
|
|
6
|
+
* `chant/lifecycle` (`chant ledger --at`, #4363), each is read as that commit
|
|
7
|
+
* held it rather than at the branch tip.
|
|
8
|
+
*/
|
|
9
|
+
export declare function queryLedgers(cwd: string, members?: readonly string[], at?: string): Promise<QueryLedger[]>;
|
|
5
10
|
export declare function runQueryCommand(ctx: CommandContext): Promise<number>;
|
|
6
11
|
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/query.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/query.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8BhH;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B1E"}
|
|
@@ -14,12 +14,24 @@ import { resolve } from "node:path";
|
|
|
14
14
|
import { formatError, formatWarning } from "../format.js";
|
|
15
15
|
import { findWorkspaceRoot } from "../../project-root.js";
|
|
16
16
|
const USAGE = 'chant query "<sql>" [dir] [--member <name>] [--json]';
|
|
17
|
-
/**
|
|
18
|
-
|
|
17
|
+
/**
|
|
18
|
+
* The ledgers `chant query` and `chant ledger` read from `cwd`: every
|
|
19
|
+
* member's in a workspace, else the project's own. With `at`, a commit of
|
|
20
|
+
* `chant/lifecycle` (`chant ledger --at`, #4363), each is read as that commit
|
|
21
|
+
* held it rather than at the branch tip.
|
|
22
|
+
*/
|
|
23
|
+
export async function queryLedgers(cwd, members, at) {
|
|
19
24
|
const { gitLedgerReadPort } = await import("../../lifecycle/git.js");
|
|
20
25
|
const found = findWorkspaceRoot(cwd);
|
|
26
|
+
const atPort = at === undefined ? undefined : await (async () => {
|
|
27
|
+
const { resolveLedgerRevision, revisionLedgerReadPort } = await import("../../lifecycle/ledger-read.js");
|
|
28
|
+
const { memberLedgerPrefix } = await import("../../lifecycle/member-ledger.js");
|
|
29
|
+
const repo = found?.dir ?? cwd;
|
|
30
|
+
const commit = resolveLedgerRevision(repo, at);
|
|
31
|
+
return (member) => revisionLedgerReadPort(repo, commit, member === null ? "" : memberLedgerPrefix([member]));
|
|
32
|
+
})();
|
|
21
33
|
if (!found)
|
|
22
|
-
return [{ member: null, port: gitLedgerReadPort({ cwd }) }];
|
|
34
|
+
return [{ member: null, port: atPort ? atPort(null) : gitLedgerReadPort({ cwd }) }];
|
|
23
35
|
// Workspace code loads only when there is a workspace, so a level-0 project never pays for it.
|
|
24
36
|
const { readDeclaration, WorkspaceReadError } = await import("../../workspace/declaration.js");
|
|
25
37
|
const { workingTree } = await import("../../workspace/tree.js");
|
|
@@ -41,7 +53,7 @@ export async function queryLedgers(cwd, members) {
|
|
|
41
53
|
}
|
|
42
54
|
return declaration.members
|
|
43
55
|
.filter((m) => !wanted || wanted.has(m.name))
|
|
44
|
-
.map((m) => ({ member: m.name, port: gitLedgerReadPort({ cwd: found.dir, member: m.dir === "." ? "." : m.name }) }));
|
|
56
|
+
.map((m) => ({ member: m.name, port: atPort ? atPort(m.dir === "." ? null : m.name) : gitLedgerReadPort({ cwd: found.dir, member: m.dir === "." ? "." : m.name }) }));
|
|
45
57
|
}
|
|
46
58
|
export async function runQueryCommand(ctx) {
|
|
47
59
|
const { args } = ctx;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAyBlD,0HAA0H;AAC1H,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uFAAuF;IACvF,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,EAAE,CASX;AAED,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAG3D;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAyBlD,0HAA0H;AAC1H,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uFAAuF;IACvF,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,EAAE,CASX;AAED,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAG3D;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAwPxE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA4G5E;AAQD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC3E;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC/E;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BzE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC3E;AAED,gHAAgH;AAChH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB5E;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5E;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD5E"}
|
|
@@ -155,9 +155,12 @@ export async function runReleaseCut(ctx) {
|
|
|
155
155
|
const { scopeSource } = await import("../../workspace/write-scope.js");
|
|
156
156
|
const { releaseRuleFrom } = await import("../../workspace/identity.js");
|
|
157
157
|
const source = scopeSource(cwd);
|
|
158
|
-
|
|
158
|
+
const greenDecl = source.declaration?.ci?.green ?? null;
|
|
159
|
+
const primary = ws.resolveTrunk(top, greenDecl?.branch ?? null);
|
|
160
|
+
trunk = primary;
|
|
159
161
|
try {
|
|
160
|
-
|
|
162
|
+
// #4325: a commit of a branch ci.green also judges (one ci.branches routes members to) is cut like trunk's.
|
|
163
|
+
trunk = ws.checkOnGreenBranches(top, commit, primary, (greenDecl?.branches ?? []).slice(1));
|
|
161
164
|
}
|
|
162
165
|
catch (err) {
|
|
163
166
|
// #4168 4.3: a commit of a pushed compose branch is cut too, and the cut records what it carries.
|
|
@@ -553,7 +556,7 @@ export async function runReleaseVerify(ctx) {
|
|
|
553
556
|
*/
|
|
554
557
|
export async function runReleaseCandidates(ctx) {
|
|
555
558
|
const { releaseCandidatesDocument } = await import("../../workspace/release-candidates.js");
|
|
556
|
-
const doc = await releaseCandidatesDocument({ cwd: resolve("."), ...(ctx.args.env ? { env: ctx.args.env } : {}) });
|
|
559
|
+
const doc = await releaseCandidatesDocument({ cwd: resolve("."), ...(ctx.args.env ? { env: ctx.args.env } : {}), ...(ctx.args.branch ? { branch: ctx.args.branch } : {}) });
|
|
557
560
|
if (ctx.args.json) {
|
|
558
561
|
console.log(JSON.stringify(doc, null, 2));
|
|
559
562
|
return "error" in doc ? 1 : 0;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { GraphIR, IRNode } from "../../graph-ir.js";
|
|
2
|
+
import { terraformType } from "../../graph-effective.js";
|
|
3
|
+
export { terraformType };
|
|
4
|
+
/**
|
|
5
|
+
* `chant search --count-by <kind|module|attr:<name>>` (#4360): grouped counts
|
|
6
|
+
* over the matched set, one line per group, instead of one row per match.
|
|
7
|
+
*
|
|
8
|
+
* An agent asking "how many resources of each type does each module own" used
|
|
9
|
+
* to run one search per value, or read every row and count them itself. The
|
|
10
|
+
* second is the token cost `search` exists to avoid.
|
|
11
|
+
*
|
|
12
|
+
* Every matched node lands in exactly one group. A node with no value for the
|
|
13
|
+
* grouped dimension is counted under `(none)`, never dropped, so the groups
|
|
14
|
+
* always add up to the total line.
|
|
15
|
+
*/
|
|
16
|
+
export type CountBy = {
|
|
17
|
+
by: "kind";
|
|
18
|
+
} | {
|
|
19
|
+
by: "module";
|
|
20
|
+
} | {
|
|
21
|
+
by: "attr";
|
|
22
|
+
name: string;
|
|
23
|
+
};
|
|
24
|
+
/** The group a node with no value for the grouped dimension is counted under. */
|
|
25
|
+
export declare const NONE_GROUP = "(none)";
|
|
26
|
+
/** The module group of a Terraform block declared in the root module itself. */
|
|
27
|
+
export declare const ROOT_MODULE_GROUP = "(root)";
|
|
28
|
+
/** Parse a `--count-by` value, or say what the accepted spellings are. */
|
|
29
|
+
export declare function parseCountBy(raw: string): CountBy | {
|
|
30
|
+
error: string;
|
|
31
|
+
hint: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The group one node belongs to.
|
|
35
|
+
*
|
|
36
|
+
* `module` on a Terraform node is its call chain. When the graph holds more
|
|
37
|
+
* than one Terraform root, the chain is prefixed with the root (`app/(root)`,
|
|
38
|
+
* `net/module.vpc`): `module.vpc` in two roots is two modules, applied
|
|
39
|
+
* separately, and counting them as one would add up resources that never sit
|
|
40
|
+
* in the same state. A node of another lexicon groups under the composite that
|
|
41
|
+
* expanded it, chant's own unit of reuse, or `(none)`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function groupOf(n: IRNode, countBy: CountBy, multiRoot?: boolean): string;
|
|
44
|
+
/** Whether the graph holds blocks from more than one Terraform root. */
|
|
45
|
+
export declare function hasManyTerraformRoots(ir: GraphIR): boolean;
|
|
46
|
+
/** Count `matches` per group, sorted by count (highest first) and then by name. */
|
|
47
|
+
export declare function countGroups(matches: IRNode[], countBy: CountBy, multiRoot?: boolean): Array<{
|
|
48
|
+
group: string;
|
|
49
|
+
count: number;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* The groups with the ids of the matches in each, in match order (#4382), in
|
|
53
|
+
* the order {@link countGroups} gives. `count` is always `ids.length`. A
|
|
54
|
+
* reader that draws the groups (behold#922) lights each group's nodes from
|
|
55
|
+
* `ids`, so it never has to read a node's group itself.
|
|
56
|
+
*/
|
|
57
|
+
export declare function groupMembers(matches: IRNode[], countBy: CountBy, multiRoot?: boolean): Array<{
|
|
58
|
+
group: string;
|
|
59
|
+
count: number;
|
|
60
|
+
ids: string[];
|
|
61
|
+
}>;
|
|
62
|
+
/** `--count-by` with `--json`: the groups, in printed order, each with its matched ids, and the total they add up to. */
|
|
63
|
+
export interface CountsJson {
|
|
64
|
+
query: string;
|
|
65
|
+
source: unknown;
|
|
66
|
+
countBy: string;
|
|
67
|
+
groups: Array<{
|
|
68
|
+
group: string;
|
|
69
|
+
count: number;
|
|
70
|
+
ids: string[];
|
|
71
|
+
}>;
|
|
72
|
+
total: number;
|
|
73
|
+
liveFailures?: string[];
|
|
74
|
+
}
|
|
75
|
+
export declare function countsJson(query: string, source: unknown, groups: Array<{
|
|
76
|
+
group: string;
|
|
77
|
+
count: number;
|
|
78
|
+
ids: string[];
|
|
79
|
+
}>, countBy: CountBy, liveFailures?: string[]): CountsJson;
|
|
80
|
+
/**
|
|
81
|
+
* Render grouped counts: one `<count> <group>` line per group, counts right
|
|
82
|
+
* aligned, then the total. The total is the number of matches, which is the
|
|
83
|
+
* sum of the group counts by construction.
|
|
84
|
+
*/
|
|
85
|
+
export declare function formatCounts(groups: Array<{
|
|
86
|
+
group: string;
|
|
87
|
+
count: number;
|
|
88
|
+
}>, countBy: CountBy): string[];
|
|
89
|
+
//# sourceMappingURL=search-count.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-count.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/search-count.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,OAAO,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF,iFAAiF;AACjF,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAUnF;AAiCD;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,MAAM,CAQ9E;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAI1D;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAE3H;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAW3I;AAED,yHAAyH;AACzH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAC9D,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,MAAM,EAAO,GAC1B,UAAU,CASZ;AAOD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAMxG"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { terraformType } from "../../graph-effective.js";
|
|
2
|
+
// The one reading of a terraform node's type lives with the folds that also
|
|
3
|
+
// select on it, so `--count-by kind` and `kind:` cannot disagree (#4366).
|
|
4
|
+
export { terraformType };
|
|
5
|
+
/** The group a node with no value for the grouped dimension is counted under. */
|
|
6
|
+
export const NONE_GROUP = "(none)";
|
|
7
|
+
/** The module group of a Terraform block declared in the root module itself. */
|
|
8
|
+
export const ROOT_MODULE_GROUP = "(root)";
|
|
9
|
+
/** Parse a `--count-by` value, or say what the accepted spellings are. */
|
|
10
|
+
export function parseCountBy(raw) {
|
|
11
|
+
const value = raw.trim();
|
|
12
|
+
if (value === "kind")
|
|
13
|
+
return { by: "kind" };
|
|
14
|
+
if (value === "module")
|
|
15
|
+
return { by: "module" };
|
|
16
|
+
const attr = /^attr:(.+)$/.exec(value);
|
|
17
|
+
if (attr && attr[1].trim())
|
|
18
|
+
return { by: "attr", name: attr[1].trim() };
|
|
19
|
+
return {
|
|
20
|
+
error: `--count-by "${raw}" is not a grouping`,
|
|
21
|
+
hint: "group by one of: --count-by kind, --count-by module, --count-by attr:<name>",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** A Terraform node's root name, from its attrs or the first segment of its id. */
|
|
25
|
+
function terraformRoot(n) {
|
|
26
|
+
const attrs = (n.attrs ?? {});
|
|
27
|
+
if (typeof attrs.root === "string")
|
|
28
|
+
return attrs.root;
|
|
29
|
+
const slash = n.id.indexOf("/");
|
|
30
|
+
return slash === -1 ? "" : n.id.slice(0, slash);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The module a Terraform node sits in: its call chain as Terraform writes it
|
|
34
|
+
* (`module.cdn`, `module.cdn.module.bucket`), or `(root)` for a block of the
|
|
35
|
+
* root module itself. The chain is on `attrs.callers`; an entity key
|
|
36
|
+
* `<root>/module.cdn/<address>` carries the same chain when it is absent.
|
|
37
|
+
*/
|
|
38
|
+
function terraformModule(n) {
|
|
39
|
+
const attrs = (n.attrs ?? {});
|
|
40
|
+
const callers = Array.isArray(attrs.callers)
|
|
41
|
+
? attrs.callers.filter((c) => typeof c === "string")
|
|
42
|
+
: n.id.split("/").slice(1, -1);
|
|
43
|
+
return callers.length === 0 ? ROOT_MODULE_GROUP : callers.join(".");
|
|
44
|
+
}
|
|
45
|
+
/** An attribute's value as a group name, matched by exact name and then case-insensitively, as `--show` does. */
|
|
46
|
+
function attrGroup(n, name) {
|
|
47
|
+
const attrs = (n.attrs ?? {});
|
|
48
|
+
const key = name in attrs ? name : Object.keys(attrs).find((k) => k.toLowerCase() === name.toLowerCase());
|
|
49
|
+
const v = key === undefined ? undefined : attrs[key];
|
|
50
|
+
if (v === undefined || v === null || v === "")
|
|
51
|
+
return NONE_GROUP;
|
|
52
|
+
return typeof v === "object" ? JSON.stringify(v) : String(v);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The group one node belongs to.
|
|
56
|
+
*
|
|
57
|
+
* `module` on a Terraform node is its call chain. When the graph holds more
|
|
58
|
+
* than one Terraform root, the chain is prefixed with the root (`app/(root)`,
|
|
59
|
+
* `net/module.vpc`): `module.vpc` in two roots is two modules, applied
|
|
60
|
+
* separately, and counting them as one would add up resources that never sit
|
|
61
|
+
* in the same state. A node of another lexicon groups under the composite that
|
|
62
|
+
* expanded it, chant's own unit of reuse, or `(none)`.
|
|
63
|
+
*/
|
|
64
|
+
export function groupOf(n, countBy, multiRoot = false) {
|
|
65
|
+
if (countBy.by === "kind")
|
|
66
|
+
return terraformType(n) ?? (n.kind || NONE_GROUP);
|
|
67
|
+
if (countBy.by === "attr")
|
|
68
|
+
return attrGroup(n, countBy.name);
|
|
69
|
+
if (n.lexicon === "terraform") {
|
|
70
|
+
const module = terraformModule(n);
|
|
71
|
+
return multiRoot ? `${terraformRoot(n) || NONE_GROUP}/${module}` : module;
|
|
72
|
+
}
|
|
73
|
+
return n.compositeParent || NONE_GROUP;
|
|
74
|
+
}
|
|
75
|
+
/** Whether the graph holds blocks from more than one Terraform root. */
|
|
76
|
+
export function hasManyTerraformRoots(ir) {
|
|
77
|
+
const roots = new Set();
|
|
78
|
+
for (const n of ir.nodes)
|
|
79
|
+
if (n.lexicon === "terraform")
|
|
80
|
+
roots.add(terraformRoot(n));
|
|
81
|
+
return roots.size > 1;
|
|
82
|
+
}
|
|
83
|
+
/** Count `matches` per group, sorted by count (highest first) and then by name. */
|
|
84
|
+
export function countGroups(matches, countBy, multiRoot = false) {
|
|
85
|
+
return groupMembers(matches, countBy, multiRoot).map(({ group, count }) => ({ group, count }));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The groups with the ids of the matches in each, in match order (#4382), in
|
|
89
|
+
* the order {@link countGroups} gives. `count` is always `ids.length`. A
|
|
90
|
+
* reader that draws the groups (behold#922) lights each group's nodes from
|
|
91
|
+
* `ids`, so it never has to read a node's group itself.
|
|
92
|
+
*/
|
|
93
|
+
export function groupMembers(matches, countBy, multiRoot = false) {
|
|
94
|
+
const ids = new Map();
|
|
95
|
+
for (const n of matches) {
|
|
96
|
+
const g = groupOf(n, countBy, multiRoot);
|
|
97
|
+
const list = ids.get(g);
|
|
98
|
+
if (list)
|
|
99
|
+
list.push(n.id);
|
|
100
|
+
else
|
|
101
|
+
ids.set(g, [n.id]);
|
|
102
|
+
}
|
|
103
|
+
return [...ids]
|
|
104
|
+
.map(([group, members]) => ({ group, count: members.length, ids: members }))
|
|
105
|
+
.sort((a, b) => b.count - a.count || (a.group < b.group ? -1 : a.group > b.group ? 1 : 0));
|
|
106
|
+
}
|
|
107
|
+
export function countsJson(query, source, groups, countBy, liveFailures = []) {
|
|
108
|
+
return {
|
|
109
|
+
query,
|
|
110
|
+
source,
|
|
111
|
+
countBy: countByLabel(countBy),
|
|
112
|
+
groups,
|
|
113
|
+
total: groups.reduce((sum, g) => sum + g.count, 0),
|
|
114
|
+
...(liveFailures.length > 0 ? { liveFailures } : {}),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** The label a `--count-by` value is printed with on the total line. */
|
|
118
|
+
function countByLabel(countBy) {
|
|
119
|
+
return countBy.by === "attr" ? `attr:${countBy.name}` : countBy.by;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Render grouped counts: one `<count> <group>` line per group, counts right
|
|
123
|
+
* aligned, then the total. The total is the number of matches, which is the
|
|
124
|
+
* sum of the group counts by construction.
|
|
125
|
+
*/
|
|
126
|
+
export function formatCounts(groups, countBy) {
|
|
127
|
+
const total = groups.reduce((sum, g) => sum + g.count, 0);
|
|
128
|
+
const width = String(groups[0]?.count ?? 0).length;
|
|
129
|
+
const lines = groups.map((g) => `${String(g.count).padStart(width)} ${g.group}`);
|
|
130
|
+
lines.push(`— ${total} total · ${groups.length} group${groups.length === 1 ? "" : "s"} by ${countByLabel(countBy)}`);
|
|
131
|
+
return lines;
|
|
132
|
+
}
|