@intentius/chant 0.124.46 → 0.124.49
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/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/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 +41 -14
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +6 -1
- package/dist/cli/handlers/graph-reader.d.ts +26 -0
- package/dist/cli/handlers/graph-reader.d.ts.map +1 -0
- package/dist/cli/handlers/graph-reader.js +41 -0
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +14 -0
- 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.js +2 -2
- 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 +183 -40
- 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.d.ts +2 -4
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +13 -39
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +87 -14
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +47 -2
- package/dist/cli/registry.d.ts +22 -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-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/pr-run.d.ts +3 -0
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +1 -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 +20 -0
- package/dist/config-environments.d.ts.map +1 -1
- package/dist/config-environments.js +12 -0
- package/dist/config.d.ts +25 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -2
- package/dist/gate-decision.d.ts +20 -2
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +30 -3
- package/dist/graph-ir.d.ts +25 -0
- package/dist/graph-ir.d.ts.map +1 -1
- 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 +94 -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/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/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/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-base.d.ts +25 -0
- package/dist/op/gate-approval-base.d.ts.map +1 -0
- package/dist/op/gate-approval-base.js +71 -0
- package/dist/op/gate-approval.d.ts +18 -9
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-approval.js +13 -31
- package/dist/op/gate-name.d.ts +13 -0
- package/dist/op/gate-name.d.ts.map +1 -1
- package/dist/op/gate-name.js +14 -1
- 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 +47 -5
- 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 +45 -3
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +68 -7
- 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-loop.d.ts +10 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +4 -0
- package/dist/pr-migrations.d.ts +62 -0
- package/dist/pr-migrations.d.ts.map +1 -0
- package/dist/pr-migrations.js +50 -0
- package/dist/pr-post.d.ts +42 -0
- package/dist/pr-post.d.ts.map +1 -1
- package/dist/pr-post.js +68 -2
- 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 +264 -254
- package/dist/workspace/check.schema.json +13 -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/gate-approval.d.ts +58 -0
- package/dist/workspace/checks/gate-approval.d.ts.map +1 -0
- package/dist/workspace/checks/gate-approval.js +103 -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 +12 -1
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +63 -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 +14 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -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/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 +50 -2
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +57 -11
- package/dist/workspace/declaration.schema.json +166 -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/exit-cli.d.ts +44 -0
- package/dist/workspace/exit-cli.d.ts.map +1 -0
- package/dist/workspace/exit-cli.js +198 -0
- package/dist/workspace/exit.d.ts +159 -0
- package/dist/workspace/exit.d.ts.map +1 -0
- package/dist/workspace/exit.js +480 -0
- package/dist/workspace/exit.schema.json +257 -0
- 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 +3 -1
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cache.js +12 -1
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +26 -8
- package/dist/workspace/graph.schema.json +34 -0
- package/dist/workspace/import-fetch.d.ts +38 -0
- package/dist/workspace/import-fetch.d.ts.map +1 -0
- package/dist/workspace/import-fetch.js +99 -0
- package/dist/workspace/import-init.d.ts +26 -0
- package/dist/workspace/import-init.d.ts.map +1 -0
- package/dist/workspace/import-init.js +130 -0
- package/dist/workspace/import-source.d.ts +147 -0
- package/dist/workspace/import-source.d.ts.map +1 -0
- package/dist/workspace/import-source.js +370 -0
- package/dist/workspace/init.d.ts +4 -0
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/init.js +70 -3
- 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 +6 -0
- package/dist/workspace/kind-readers.d.ts.map +1 -1
- package/dist/workspace/kind-readers.js +18 -0
- package/dist/workspace/kinds.d.ts +90 -3
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +161 -7
- 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/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.js +13 -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.map +1 -1
- package/dist/workspace/member-commands.js +54 -5
- 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/new-migrations.d.ts +47 -0
- package/dist/workspace/new-migrations.d.ts.map +1 -0
- package/dist/workspace/new-migrations.js +91 -0
- package/dist/workspace/pr-report.schema.json +46 -0
- package/dist/workspace/promote.d.ts +96 -0
- package/dist/workspace/promote.d.ts.map +1 -0
- package/dist/workspace/promote.js +263 -0
- package/dist/workspace/reason-codes.d.ts +21 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +25 -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-contract.d.ts +1 -1
- package/dist/workspace/search-contract.d.ts.map +1 -1
- 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 +108 -10
- 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/action-pins.test.ts +78 -0
- package/src/action-pins.ts +92 -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/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 +33 -4
- package/src/cli/handlers/build.ts +7 -1
- package/src/cli/handlers/graph-reader.test.ts +31 -0
- package/src/cli/handlers/graph-reader.ts +51 -0
- package/src/cli/handlers/graph.ts +14 -0
- 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 +2 -2
- package/src/cli/handlers/pr.ts +176 -37
- package/src/cli/handlers/query.ts +16 -4
- package/src/cli/handlers/release.ts +6 -3
- package/src/cli/handlers/search.ts +13 -34
- package/src/cli/main.test.ts +17 -0
- package/src/cli/main.ts +87 -14
- package/src/cli/parse-args.ts +35 -2
- package/src/cli/registry.ts +22 -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-run-bundle.test.ts +1 -0
- 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/pr-run.ts +4 -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 +28 -1
- package/src/config.ts +24 -1
- package/src/gate-decision-bundle.test.ts +5 -2
- package/src/gate-decision-identity.test.ts +20 -0
- package/src/gate-decision.ts +46 -3
- package/src/graph-ir.ts +27 -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 +98 -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/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/rules/op/index.ts +2 -0
- package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
- 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-at-base.test.ts +97 -0
- package/src/op/gate-approval-base.ts +72 -0
- package/src/op/gate-approval.test.ts +6 -1
- package/src/op/gate-approval.ts +22 -27
- package/src/op/gate-name.ts +16 -1
- 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 +69 -9
- package/src/op/index.ts +3 -2
- package/src/op/local-executor.ts +91 -11
- 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-loop-bundle.test.ts +3 -2
- package/src/pr-loop.test.ts +52 -0
- package/src/pr-loop.ts +12 -0
- package/src/pr-migrations.ts +97 -0
- package/src/pr-post-open.e2e.test.ts +36 -0
- package/src/pr-post.test.ts +102 -3
- package/src/pr-post.ts +90 -2
- 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/__fixtures__/import/spacelift.json +9 -0
- package/src/workspace/__fixtures__/import/tfc.json +13 -0
- package/src/workspace/behold-kinds.test.ts +2 -1
- package/src/workspace/check-contract.test.ts +8 -6
- package/src/workspace/check.schema.json +13 -2
- package/src/workspace/checks/ci-branch.test.ts +128 -0
- package/src/workspace/checks/ci-branch.ts +141 -0
- package/src/workspace/checks/gate-approval.test.ts +77 -0
- package/src/workspace/checks/gate-approval.ts +121 -0
- package/src/workspace/checks/links.ts +12 -1
- package/src/workspace/checks/org.ts +169 -0
- package/src/workspace/checks.ts +68 -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 +9 -2
- 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/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 +166 -24
- package/src/workspace/declaration.ts +101 -15
- package/src/workspace/environments.ts +40 -4
- package/src/workspace/exit-cli.ts +219 -0
- package/src/workspace/exit.schema.json +257 -0
- package/src/workspace/exit.test.ts +185 -0
- package/src/workspace/exit.ts +560 -0
- package/src/workspace/flyway-dir.ts +113 -0
- package/src/workspace/flyway-layout.ts +337 -0
- package/src/workspace/graph-cache.ts +12 -2
- package/src/workspace/graph-cli.ts +25 -10
- package/src/workspace/graph-contract.test.ts +4 -2
- package/src/workspace/graph.schema.json +34 -0
- package/src/workspace/identity.test.ts +29 -2
- package/src/workspace/import-fetch.ts +151 -0
- package/src/workspace/import-init.ts +147 -0
- package/src/workspace/import-source.test.ts +183 -0
- package/src/workspace/import-source.ts +462 -0
- package/src/workspace/init.test.ts +55 -1
- package/src/workspace/init.ts +66 -4
- package/src/workspace/intent.ts +6 -14
- package/src/workspace/kind-link-readers.ts +68 -3
- package/src/workspace/kind-readers.test.ts +36 -0
- package/src/workspace/kind-readers.ts +18 -1
- package/src/workspace/kinds.test.ts +35 -7
- package/src/workspace/kinds.ts +212 -11
- 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/lineage-upgrade.test.ts +20 -0
- package/src/workspace/lineage-upgrade.ts +16 -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 +60 -2
- 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/new-migrations.test.ts +98 -0
- package/src/workspace/new-migrations.ts +109 -0
- package/src/workspace/org-scope.test.ts +238 -0
- package/src/workspace/pr-report.schema.json +46 -0
- package/src/workspace/promote.test.ts +114 -0
- package/src/workspace/promote.ts +302 -0
- package/src/workspace/reason-codes.test.ts +10 -1
- package/src/workspace/reason-codes.ts +25 -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/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 +108 -10
- 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
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed filters for the contract reads (#4363): `--where <field><op><value>`
|
|
3
|
+
* and `--since <time>`, in place of an embedded SQL engine.
|
|
4
|
+
*
|
|
5
|
+
* Each read declares the fields it can be filtered on and their types
|
|
6
|
+
* ({@link FilterFields}). A clause naming a field the read doesn't declare, an
|
|
7
|
+
* operator its type doesn't take, or a value that isn't of its type is a
|
|
8
|
+
* {@link FilterError} before anything is read, so a typo never filters to an
|
|
9
|
+
* empty answer. Several `--where` clauses all have to hold.
|
|
10
|
+
*
|
|
11
|
+
* Operators: `=` and `!=` for every type; `<`, `<=`, `>` and `>=` for
|
|
12
|
+
* numbers, times and text (text compares by code point); `~` for text, which
|
|
13
|
+
* holds when the field contains the value. The value `null` matches a field
|
|
14
|
+
* that is null or absent, with `=` and `!=` only.
|
|
15
|
+
*
|
|
16
|
+
* A field of type `json` holds an object: a clause can name a key under it
|
|
17
|
+
* with dots (`labels.team=core`), and the value is compared as the type it
|
|
18
|
+
* holds there (a number with a number, a boolean with `true` or `false`, any
|
|
19
|
+
* other value as text). A JSON text is parsed first, so a ledger row that
|
|
20
|
+
* keeps the object as text filters the same way.
|
|
21
|
+
*
|
|
22
|
+
* A null or absent field matches only `=null` and `!=` with a value other
|
|
23
|
+
* than null; the other operators never hold for it.
|
|
24
|
+
*
|
|
25
|
+
* Pure: no I/O, so a bundle that filters rows loads nothing else.
|
|
26
|
+
*/
|
|
27
|
+
/** Every operator, longest first so `!=` is not read as `=`. */
|
|
28
|
+
export const WHERE_OPERATORS = ["!=", "<=", ">=", "=", "<", ">", "~"];
|
|
29
|
+
/** A clause or a `--since` that can't be applied. The message is for a person. */
|
|
30
|
+
export class FilterError extends Error {
|
|
31
|
+
}
|
|
32
|
+
const ORDERED = ["<", "<=", ">", ">="];
|
|
33
|
+
/**
|
|
34
|
+
* An instant from an ISO 8601 date or time, or from a span back from `now`:
|
|
35
|
+
* `<n>m`, `<n>h`, `<n>d` or `<n>w`. Epoch milliseconds, or null when `text`
|
|
36
|
+
* is neither.
|
|
37
|
+
*/
|
|
38
|
+
export function parseInstant(text, now = new Date()) {
|
|
39
|
+
const span = /^(\d+)([mhdw])$/.exec(text.trim());
|
|
40
|
+
if (span) {
|
|
41
|
+
const unit = { m: 60000, h: 3600000, d: 86400000, w: 604800000 }[span[2]];
|
|
42
|
+
return now.getTime() - Number(span[1]) * unit;
|
|
43
|
+
}
|
|
44
|
+
if (!/^\d{4}-\d{2}-\d{2}/.test(text.trim()))
|
|
45
|
+
return null;
|
|
46
|
+
const ms = Date.parse(text);
|
|
47
|
+
return Number.isNaN(ms) ? null : ms;
|
|
48
|
+
}
|
|
49
|
+
/** `--since <time>` as an ISO instant, or a {@link FilterError}. */
|
|
50
|
+
export function parseSince(text, now = new Date()) {
|
|
51
|
+
const ms = parseInstant(text, now);
|
|
52
|
+
if (ms === null)
|
|
53
|
+
throw new FilterError(`--since takes an ISO 8601 date or time, or a span back from now such as 24h or 7d, not ${JSON.stringify(text)}`);
|
|
54
|
+
return new Date(ms).toISOString();
|
|
55
|
+
}
|
|
56
|
+
/** The declared field a dotted name starts at: the whole name, or its longest declared `json` prefix. */
|
|
57
|
+
function resolveField(name, fields) {
|
|
58
|
+
if (Object.prototype.hasOwnProperty.call(fields, name))
|
|
59
|
+
return { base: name, path: [], type: fields[name] };
|
|
60
|
+
const parts = name.split(".");
|
|
61
|
+
for (let i = parts.length - 1; i > 0; i--) {
|
|
62
|
+
const base = parts.slice(0, i).join(".");
|
|
63
|
+
if (Object.prototype.hasOwnProperty.call(fields, base) && fields[base] === "json")
|
|
64
|
+
return { base, path: parts.slice(i), type: "json" };
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/** Parse each `--where` against the fields a read declares. Throws a {@link FilterError}. */
|
|
69
|
+
export function parseWhere(exprs, fields, now = new Date()) {
|
|
70
|
+
const names = Object.keys(fields).join(", ");
|
|
71
|
+
return exprs.map((expr) => {
|
|
72
|
+
const m = /^([A-Za-z_][\w.-]*)\s*(!=|<=|>=|=|<|>|~)(.*)$/s.exec(expr);
|
|
73
|
+
if (!m)
|
|
74
|
+
throw new FilterError(`--where takes <field><op><value>, with op one of ${WHERE_OPERATORS.join(" ")}, not ${JSON.stringify(expr)}`);
|
|
75
|
+
const [, field, op, rawValue] = m;
|
|
76
|
+
const raw = rawValue.trim();
|
|
77
|
+
const found = resolveField(field, fields);
|
|
78
|
+
if (!found)
|
|
79
|
+
throw new FilterError(`--where ${field}: no such field; this read filters on ${names}`);
|
|
80
|
+
const { base, path, type } = found;
|
|
81
|
+
if (type === "json" && path.length === 0)
|
|
82
|
+
throw new FilterError(`--where ${field}: holds an object; name a key under it, such as ${field}.<key>`);
|
|
83
|
+
const clause = (value) => ({ field, base, path, type, op, raw, value });
|
|
84
|
+
if (raw === "null") {
|
|
85
|
+
if (op !== "=" && op !== "!=")
|
|
86
|
+
throw new FilterError(`--where ${field}${op}null: null takes = or != only`);
|
|
87
|
+
return clause(null);
|
|
88
|
+
}
|
|
89
|
+
if (op === "~" && type !== "text" && type !== "json")
|
|
90
|
+
throw new FilterError(`--where ${field}~: ~ (contains) takes a text field; ${field} is ${type}`);
|
|
91
|
+
switch (type) {
|
|
92
|
+
case "number": {
|
|
93
|
+
const n = Number(raw);
|
|
94
|
+
if (raw === "" || !Number.isFinite(n))
|
|
95
|
+
throw new FilterError(`--where ${field}: ${field} is a number, not ${JSON.stringify(raw)}`);
|
|
96
|
+
return clause(n);
|
|
97
|
+
}
|
|
98
|
+
case "boolean": {
|
|
99
|
+
if (ORDERED.includes(op))
|
|
100
|
+
throw new FilterError(`--where ${field}${op}: a boolean takes = or != only`);
|
|
101
|
+
if (raw !== "true" && raw !== "false")
|
|
102
|
+
throw new FilterError(`--where ${field}: ${field} is true or false, not ${JSON.stringify(raw)}`);
|
|
103
|
+
return clause(raw === "true");
|
|
104
|
+
}
|
|
105
|
+
case "time": {
|
|
106
|
+
const ms = parseInstant(raw, now);
|
|
107
|
+
if (ms === null)
|
|
108
|
+
throw new FilterError(`--where ${field}: ${field} is a time; give an ISO 8601 date or time, or a span back from now such as 24h or 7d, not ${JSON.stringify(raw)}`);
|
|
109
|
+
return clause(ms);
|
|
110
|
+
}
|
|
111
|
+
default:
|
|
112
|
+
return clause(raw);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** The value at a clause's field in `row`, parsing a JSON text on the way into a `json` field. */
|
|
117
|
+
function valueAt(row, c) {
|
|
118
|
+
let v = row;
|
|
119
|
+
for (const key of c.base.split("."))
|
|
120
|
+
v = v !== null && typeof v === "object" ? v[key] : undefined;
|
|
121
|
+
for (const key of c.path) {
|
|
122
|
+
if (typeof v === "string") {
|
|
123
|
+
try {
|
|
124
|
+
v = JSON.parse(v);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
v = v !== null && typeof v === "object" && !Array.isArray(v) ? v[key] : undefined;
|
|
131
|
+
}
|
|
132
|
+
return v;
|
|
133
|
+
}
|
|
134
|
+
function compare(a, b, op) {
|
|
135
|
+
switch (op) {
|
|
136
|
+
case "=": return a === b;
|
|
137
|
+
case "!=": return a !== b;
|
|
138
|
+
case "<": return a < b;
|
|
139
|
+
case "<=": return a <= b;
|
|
140
|
+
case ">": return a > b;
|
|
141
|
+
case ">=": return a >= b;
|
|
142
|
+
case "~": return String(a).includes(String(b));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Whether one clause holds for `row`. */
|
|
146
|
+
export function clauseHolds(row, c) {
|
|
147
|
+
const v = valueAt(row, c);
|
|
148
|
+
if (c.value === null)
|
|
149
|
+
return c.op === "=" ? v === null || v === undefined : v !== null && v !== undefined;
|
|
150
|
+
if (v === null || v === undefined)
|
|
151
|
+
return c.op === "!=";
|
|
152
|
+
switch (c.type) {
|
|
153
|
+
case "number":
|
|
154
|
+
return typeof v === "number" && compare(v, c.value, c.op);
|
|
155
|
+
case "boolean":
|
|
156
|
+
return typeof v === "boolean" ? (c.op === "=") === (v === c.value) : false;
|
|
157
|
+
case "time": {
|
|
158
|
+
const ms = typeof v === "string" ? Date.parse(v) : typeof v === "number" ? v : NaN;
|
|
159
|
+
return !Number.isNaN(ms) && compare(ms, c.value, c.op);
|
|
160
|
+
}
|
|
161
|
+
case "text":
|
|
162
|
+
return typeof v === "string" && compare(v, c.value, c.op);
|
|
163
|
+
case "json": {
|
|
164
|
+
// Compared as the type the value holds there.
|
|
165
|
+
if (typeof v === "number" && c.op !== "~") {
|
|
166
|
+
const n = Number(c.raw);
|
|
167
|
+
return Number.isFinite(n) && compare(v, n, c.op);
|
|
168
|
+
}
|
|
169
|
+
if (typeof v === "boolean")
|
|
170
|
+
return (c.raw === "true" || c.raw === "false") && (c.op === "=" || c.op === "!=") ? (c.op === "=") === (String(v) === c.raw) : false;
|
|
171
|
+
const s = typeof v === "string" ? v : JSON.stringify(v);
|
|
172
|
+
return compare(s, c.raw, c.op);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Whether every clause holds for `row`. */
|
|
177
|
+
export function matchesWhere(row, clauses) {
|
|
178
|
+
return clauses.every((c) => clauseHolds(row, c));
|
|
179
|
+
}
|
package/dist/run-event.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ export type RunEventStepStatus = "ok" | "failed" | "skipped" | "cached" | "gated
|
|
|
47
47
|
/** Why a step was skipped. */
|
|
48
48
|
export type RunEventSkipReason = "receipt" | "resumed" | "refused" | "not-run";
|
|
49
49
|
/** How a gate's approval passed, when it was more than one person's approval of that gate. */
|
|
50
|
-
export type RunEventGateVia = "quorum" | "policy" | "point" | "alias" | "empty";
|
|
50
|
+
export type RunEventGateVia = "quorum" | "policy" | "point" | "alias" | "empty" | "workspace";
|
|
51
51
|
/** The run every event of a stream names: the same on every line. */
|
|
52
52
|
export interface RunEventRun {
|
|
53
53
|
/**
|
package/dist/run-event.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-event.d.ts","sourceRoot":"","sources":["../src/run-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,oFAAoF,CAAC;AAErH,8DAA8D;AAC9D,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,8EAA8E;AAC9E,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,WAAW,GAAG,UAAU,CAAC;AAE3D,gGAAgG;AAChG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;AAEzD,gHAAgH;AAChH,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzE;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE9F,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E,8FAA8F;AAC9F,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"run-event.d.ts","sourceRoot":"","sources":["../src/run-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
* (via live import) and generating the TF patches live in the command/bridge
|
|
11
11
|
* layers; this module just classifies the boundary.
|
|
12
12
|
*/
|
|
13
|
-
import { type ScoreOptions } from "./score.js";
|
|
14
|
-
import type
|
|
13
|
+
import { type Peelability, type ScoreOptions } from "./score.js";
|
|
14
|
+
import { type Adjacency } from "../graph-walk.js";
|
|
15
|
+
import type { TfEdge, TfGraph, TfNode } from "./types.js";
|
|
15
16
|
/** One resource in the carve set (the selected node plus its folded sub-resources). */
|
|
16
17
|
export interface CarveMember {
|
|
17
18
|
address: string;
|
|
@@ -77,7 +78,20 @@ export interface CarveReport {
|
|
|
77
78
|
* that fold into it (same name, a `foldParentOf` child type whose parent is the
|
|
78
79
|
* selection). Those are carried along and inlined, not left behind.
|
|
79
80
|
*/
|
|
80
|
-
export declare function resolveCarveSet(graph: TfGraph, target: string): CarveMember[];
|
|
81
|
+
export declare function resolveCarveSet(graph: TfGraph, target: string, index?: BoundaryIndex): CarveMember[];
|
|
82
|
+
/**
|
|
83
|
+
* What `boundaryReport` looks up per target, built once per graph: nodes by
|
|
84
|
+
* address, the edges by both ends, and each fold parent's children in graph
|
|
85
|
+
* order. Without it each report scans the node and edge lists itself, which
|
|
86
|
+
* over a whole estate is O(V·E) (#4391).
|
|
87
|
+
*/
|
|
88
|
+
export interface BoundaryIndex {
|
|
89
|
+
byAddress: Map<string, TfNode>;
|
|
90
|
+
adjacency: Adjacency<TfEdge>;
|
|
91
|
+
/** `foldKey(parent type, name)` → resource nodes that fold into that parent. */
|
|
92
|
+
foldChildren: Map<string, TfNode[]>;
|
|
93
|
+
}
|
|
94
|
+
export declare function boundaryIndex(graph: TfGraph): BoundaryIndex;
|
|
81
95
|
/**
|
|
82
96
|
* Which source the graph came from, and so which vocabulary its bridge patches
|
|
83
97
|
* are named in. Terraform is the default; `cdk` is the read-only cloud-assembly
|
|
@@ -89,6 +103,13 @@ export interface BoundaryOptions {
|
|
|
89
103
|
dialect?: CarveDialect;
|
|
90
104
|
/** Scoring hooks, so `peelability` is the same number the ranking reported. */
|
|
91
105
|
score?: ScoreOptions;
|
|
106
|
+
/**
|
|
107
|
+
* The target's score, when the caller already holds it (`carve advise`).
|
|
108
|
+
* Without it the estate is scored to find it (#4391).
|
|
109
|
+
*/
|
|
110
|
+
peelability?: Pick<Peelability, "score">;
|
|
111
|
+
/** `boundaryIndex(graph)`, shared across calls on one graph. */
|
|
112
|
+
index?: BoundaryIndex;
|
|
92
113
|
}
|
|
93
114
|
/**
|
|
94
115
|
* Classify the boundary of carving `target`: the inbound edges that need an
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carve.d.ts","sourceRoot":"","sources":["../../src/terraform/carve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"carve.d.ts","sourceRoot":"","sources":["../../src/terraform/carve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEvD,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;OAKG;IACH,GAAG,EAAE,MAAM,EAAE,CAAC;IACd;;;;;;OAMG;IACH,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,YAAY,GAAG,oBAAoB,GAAG,gBAAgB,CAAC;IACxG,QAAQ,EAAE,aAAa,GAAG,UAAU,CAAC;IACrC,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,iFAAiF;IACjF,UAAU,EAAE,IAAI,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,WAAW,EAAE,CAYpG;AAID;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,gFAAgF;IAChF,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAgB3D;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,KAAK,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzC,gEAAgE;IAChE,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAQD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,WAAW,GAAG,IAAI,CA0D7G;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAajE"}
|
package/dist/terraform/carve.js
CHANGED
|
@@ -13,29 +13,47 @@
|
|
|
13
13
|
import { inboundEdges, outboundEdges } from "./graph.js";
|
|
14
14
|
import { foldParentOf, resolveTier } from "./tier-map.js";
|
|
15
15
|
import { scoreEstate } from "./score.js";
|
|
16
|
+
import { adjacencyOf } from "../graph-walk.js";
|
|
16
17
|
/**
|
|
17
18
|
* The carve set for a selected address: the node itself plus any sub-resources
|
|
18
19
|
* that fold into it (same name, a `foldParentOf` child type whose parent is the
|
|
19
20
|
* selection). Those are carried along and inlined, not left behind.
|
|
20
21
|
*/
|
|
21
|
-
export function resolveCarveSet(graph, target) {
|
|
22
|
-
const byAddress =
|
|
22
|
+
export function resolveCarveSet(graph, target, index) {
|
|
23
|
+
const { byAddress, foldChildren } = index ?? boundaryIndex(graph);
|
|
23
24
|
const selected = byAddress.get(target);
|
|
24
25
|
if (!selected)
|
|
25
26
|
return [];
|
|
26
27
|
const members = [{ address: selected.address, type: selected.type }];
|
|
27
28
|
if (selected.kind === "resource" && selected.type) {
|
|
28
|
-
for (const node of
|
|
29
|
-
|
|
30
|
-
continue;
|
|
31
|
-
const parentType = foldParentOf(node.type);
|
|
32
|
-
if (parentType === selected.type && node.name === selected.name) {
|
|
33
|
-
members.push({ address: node.address, type: node.type, foldedInto: selected.address });
|
|
34
|
-
}
|
|
29
|
+
for (const node of foldChildren.get(foldKey(selected.type, selected.name)) ?? []) {
|
|
30
|
+
members.push({ address: node.address, type: node.type, foldedInto: selected.address });
|
|
35
31
|
}
|
|
36
32
|
}
|
|
37
33
|
return members;
|
|
38
34
|
}
|
|
35
|
+
const foldKey = (parentType, name) => `${parentType}\u001f${name}`;
|
|
36
|
+
export function boundaryIndex(graph) {
|
|
37
|
+
const foldChildren = new Map();
|
|
38
|
+
for (const node of graph.nodes) {
|
|
39
|
+
if (node.kind !== "resource" || !node.type)
|
|
40
|
+
continue;
|
|
41
|
+
const parentType = foldParentOf(node.type);
|
|
42
|
+
if (!parentType)
|
|
43
|
+
continue;
|
|
44
|
+
const key = foldKey(parentType, node.name);
|
|
45
|
+
const list = foldChildren.get(key);
|
|
46
|
+
if (list)
|
|
47
|
+
list.push(node);
|
|
48
|
+
else
|
|
49
|
+
foldChildren.set(key, [node]);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
byAddress: new Map(graph.nodes.map((n) => [n.address, n])),
|
|
53
|
+
adjacency: adjacencyOf(graph.edges),
|
|
54
|
+
foldChildren,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
39
57
|
/** The bridge patch an inbound cut needs, per source. */
|
|
40
58
|
function inboundBridge(dialect, fromOutput) {
|
|
41
59
|
if (dialect === "cdk")
|
|
@@ -50,14 +68,14 @@ function inboundBridge(dialect, fromOutput) {
|
|
|
50
68
|
*/
|
|
51
69
|
export function boundaryReport(graph, target, opts = {}) {
|
|
52
70
|
const dialect = opts.dialect ?? "terraform";
|
|
53
|
-
const carveSet = resolveCarveSet(graph, target);
|
|
71
|
+
const carveSet = resolveCarveSet(graph, target, opts.index);
|
|
54
72
|
if (carveSet.length === 0)
|
|
55
73
|
return null;
|
|
56
74
|
const inSet = new Set(carveSet.map((m) => m.address));
|
|
57
75
|
const inbound = [];
|
|
58
76
|
const outbound = [];
|
|
59
77
|
for (const member of carveSet) {
|
|
60
|
-
for (const e of inboundEdges(graph, member.address)) {
|
|
78
|
+
for (const e of (opts.index ? (opts.index.adjacency.in.get(member.address) ?? []) : inboundEdges(graph, member.address))) {
|
|
61
79
|
if (inSet.has(e.from))
|
|
62
80
|
continue; // internal edge
|
|
63
81
|
inbound.push({
|
|
@@ -71,7 +89,7 @@ export function boundaryReport(graph, target, opts = {}) {
|
|
|
71
89
|
...(e.crossStack ? { crossStack: true } : {}),
|
|
72
90
|
});
|
|
73
91
|
}
|
|
74
|
-
for (const e of outboundEdges(graph, member.address)) {
|
|
92
|
+
for (const e of (opts.index ? (opts.index.adjacency.out.get(member.address) ?? []) : outboundEdges(graph, member.address))) {
|
|
75
93
|
if (inSet.has(e.to))
|
|
76
94
|
continue; // internal edge
|
|
77
95
|
outbound.push({
|
|
@@ -86,12 +104,12 @@ export function boundaryReport(graph, target, opts = {}) {
|
|
|
86
104
|
});
|
|
87
105
|
}
|
|
88
106
|
}
|
|
89
|
-
const score = scoreEstate(graph, opts.score).find((r) => r.address === target);
|
|
107
|
+
const score = opts.peelability ?? scoreEstate(graph, { ...opts.score, radius: false }).find((r) => r.address === target);
|
|
90
108
|
const diagnostics = [];
|
|
91
109
|
const tierOf = opts.score?.tierOf ?? resolveTier;
|
|
92
110
|
if (carveSet[0].type &&
|
|
93
111
|
tierOf(carveSet[0].type) === null &&
|
|
94
|
-
graph.nodes.
|
|
112
|
+
(opts.index?.byAddress ?? new Map(graph.nodes.map((n) => [n.address, n]))).get(target)?.kind === "resource") {
|
|
95
113
|
diagnostics.push(`No known native mapping for ${carveSet[0].type} — emit will have no target type.`);
|
|
96
114
|
}
|
|
97
115
|
return {
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuts and reference-closed sets over the carve graph (#3909).
|
|
3
|
+
*
|
|
4
|
+
* `carve advise` scores one block at a time. A consumer splitting one root into
|
|
5
|
+
* several (terragucci's estate carving) needs the same question for a set:
|
|
6
|
+
* which edges cross its boundary and which way, and the smallest set around a
|
|
7
|
+
* seed whose crossings all run a way the caller allows. These are pure
|
|
8
|
+
* functions over `TfGraph`, on the index and walk in `reach.ts`, so the rules
|
|
9
|
+
* there hold here too: folds contract first, outputs are terminal and counted
|
|
10
|
+
* apart, modules and unresolved `count` are named as hiding their contents, a
|
|
11
|
+
* `depends_on` cycle terminates, and `crossStack` edges are counted apart.
|
|
12
|
+
*
|
|
13
|
+
* Nothing here ranks sets, reads state or plan times, writes HCL, or knows
|
|
14
|
+
* about roots or backends; that stays with the consumer.
|
|
15
|
+
*/
|
|
16
|
+
import type { TfEdge, TfGraph } from "./types.js";
|
|
17
|
+
/** Cut edges of one direction, counted. */
|
|
18
|
+
export interface CutCount {
|
|
19
|
+
/** Edges whose reading side is a resource or module block. */
|
|
20
|
+
resources: number;
|
|
21
|
+
/** Edges whose reading side is an `output` block. */
|
|
22
|
+
outputs: number;
|
|
23
|
+
/** Of all of them, the `crossStack` edges (a CDK `Fn::ImportValue`). */
|
|
24
|
+
crossStack: number;
|
|
25
|
+
}
|
|
26
|
+
/** A set of blocks, as the walks see it. */
|
|
27
|
+
export interface BlockSet {
|
|
28
|
+
/** Resource and module addresses, each fold parent with the blocks folded into it. Sorted. */
|
|
29
|
+
resources: string[];
|
|
30
|
+
/** `output.<name>` pseudo-addresses in the set. Sorted. */
|
|
31
|
+
outputs: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface Cuts extends BlockSet {
|
|
34
|
+
/** Edges where something outside reads something inside, as the graph holds them. */
|
|
35
|
+
inbound: TfEdge[];
|
|
36
|
+
/** Edges where something inside reads something outside. */
|
|
37
|
+
outbound: TfEdge[];
|
|
38
|
+
counts: {
|
|
39
|
+
inbound: CutCount;
|
|
40
|
+
outbound: CutCount;
|
|
41
|
+
};
|
|
42
|
+
/** Cuts run in both directions: the set can move only with wiring both ways. */
|
|
43
|
+
bothWays: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** The cut directions a closure may leave: `inbound` (outside may read in), `outbound` (inside may read out), or `none`. */
|
|
46
|
+
export type CutAllowance = "inbound" | "outbound" | "none";
|
|
47
|
+
export interface Closure extends Cuts {
|
|
48
|
+
/** The seeds as the walk saw them, folds contracted. */
|
|
49
|
+
seeds: string[];
|
|
50
|
+
allow: CutAllowance;
|
|
51
|
+
/**
|
|
52
|
+
* How many resource instances the set stands for: each block once, or its
|
|
53
|
+
* instance count once `--state` resolved it. `"unknown"` where a module or an
|
|
54
|
+
* unresolved `count`/`for_each` hides how much it holds; `hiddenBy` names them.
|
|
55
|
+
*/
|
|
56
|
+
instances: number | "unknown";
|
|
57
|
+
hiddenBy?: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface Component extends BlockSet {
|
|
60
|
+
/** As {@link Closure.instances}. */
|
|
61
|
+
instances: number | "unknown";
|
|
62
|
+
hiddenBy?: string[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The graph's weakly connected components (#3909): blocks joined by a
|
|
66
|
+
* reference either way, fold-contracted, each module one node. An output never
|
|
67
|
+
* joins two components, since outputs are terminal; it is listed in every
|
|
68
|
+
* component it reads into. Components are sorted by their first address.
|
|
69
|
+
*/
|
|
70
|
+
export declare function components(graph: TfGraph): Component[];
|
|
71
|
+
/**
|
|
72
|
+
* Every edge crossing the boundary of `addresses` (#3909). A folded block in
|
|
73
|
+
* the set brings its parent and siblings, and a fold parent its folded blocks,
|
|
74
|
+
* before anything is counted, so an edge inside one fold is never a cut. An
|
|
75
|
+
* `output.<name>` in the set is inside it like any block.
|
|
76
|
+
*
|
|
77
|
+
* Throws when an address is not a block of the graph.
|
|
78
|
+
*/
|
|
79
|
+
export declare function cuts(graph: TfGraph, addresses: Iterable<string>): Cuts;
|
|
80
|
+
/**
|
|
81
|
+
* The smallest superset of `seeds` whose remaining cuts all run in the
|
|
82
|
+
* direction `allow` permits, plus those cuts (#3909).
|
|
83
|
+
*
|
|
84
|
+
* - `outbound`: nothing outside may read in, so the set takes every
|
|
85
|
+
* dependent of the seeds, outputs included.
|
|
86
|
+
* - `inbound`: nothing inside may read out, so the set takes everything the
|
|
87
|
+
* seeds depend on.
|
|
88
|
+
* - `none`: the seeds' whole components, with each output that reads only
|
|
89
|
+
* into them.
|
|
90
|
+
*
|
|
91
|
+
* Outputs are terminal, so none of these walks passes through one. An output
|
|
92
|
+
* that reads both the set and something outside it is therefore a cut no
|
|
93
|
+
* closure removes: under `none` it stays outside and its read into the set is
|
|
94
|
+
* left as an inbound cut, for the caller to wire.
|
|
95
|
+
*/
|
|
96
|
+
export declare function closure(graph: TfGraph, seeds: Iterable<string>, allow: CutAllowance): Closure;
|
|
97
|
+
//# sourceMappingURL=cuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cuts.d.ts","sourceRoot":"","sources":["../../src/terraform/cuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE/C,2CAA2C;AAC3C,MAAM,WAAW,QAAQ;IACvB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,4CAA4C;AAC5C,MAAM,WAAW,QAAQ;IACvB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,IAAK,SAAQ,QAAQ;IACpC,qFAAqF;IACrF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE;QAAE,OAAO,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;IAClD,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,4HAA4H;AAC5H,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,wDAAwD;IACxD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;IACpB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,oCAAoC;IACpC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAatD;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAGtE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAmB7F"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuts and reference-closed sets over the carve graph (#3909).
|
|
3
|
+
*
|
|
4
|
+
* `carve advise` scores one block at a time. A consumer splitting one root into
|
|
5
|
+
* several (terragucci's estate carving) needs the same question for a set:
|
|
6
|
+
* which edges cross its boundary and which way, and the smallest set around a
|
|
7
|
+
* seed whose crossings all run a way the caller allows. These are pure
|
|
8
|
+
* functions over `TfGraph`, on the index and walk in `reach.ts`, so the rules
|
|
9
|
+
* there hold here too: folds contract first, outputs are terminal and counted
|
|
10
|
+
* apart, modules and unresolved `count` are named as hiding their contents, a
|
|
11
|
+
* `depends_on` cycle terminates, and `crossStack` edges are counted apart.
|
|
12
|
+
*
|
|
13
|
+
* Nothing here ranks sets, reads state or plan times, writes HCL, or knows
|
|
14
|
+
* about roots or backends; that stays with the consumer.
|
|
15
|
+
*/
|
|
16
|
+
import { carveIndex, cmp, hidesContents, isOutputAddress, walkFrom, weigh } from "./reach.js";
|
|
17
|
+
/**
|
|
18
|
+
* The graph's weakly connected components (#3909): blocks joined by a
|
|
19
|
+
* reference either way, fold-contracted, each module one node. An output never
|
|
20
|
+
* joins two components, since outputs are terminal; it is listed in every
|
|
21
|
+
* component it reads into. Components are sorted by their first address.
|
|
22
|
+
*/
|
|
23
|
+
export function components(graph) {
|
|
24
|
+
const index = carveIndex(graph);
|
|
25
|
+
const assigned = new Set();
|
|
26
|
+
const found = [];
|
|
27
|
+
for (const address of [...index.nodes.keys()].sort(cmp)) {
|
|
28
|
+
const start = index.rep(address);
|
|
29
|
+
if (assigned.has(start))
|
|
30
|
+
continue;
|
|
31
|
+
const reached = walkFrom(index, [start], "both");
|
|
32
|
+
const reps = [start, ...[...reached.keys()].filter((a) => !isOutputAddress(a))];
|
|
33
|
+
for (const rep of reps)
|
|
34
|
+
assigned.add(rep);
|
|
35
|
+
found.push({ ...blockSet(index, reps, [...reached.keys()].filter(isOutputAddress)), ...holdings(index, reps) });
|
|
36
|
+
}
|
|
37
|
+
return found;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Every edge crossing the boundary of `addresses` (#3909). A folded block in
|
|
41
|
+
* the set brings its parent and siblings, and a fold parent its folded blocks,
|
|
42
|
+
* before anything is counted, so an edge inside one fold is never a cut. An
|
|
43
|
+
* `output.<name>` in the set is inside it like any block.
|
|
44
|
+
*
|
|
45
|
+
* Throws when an address is not a block of the graph.
|
|
46
|
+
*/
|
|
47
|
+
export function cuts(graph, addresses) {
|
|
48
|
+
const index = carveIndex(graph);
|
|
49
|
+
return cutsOf(index, contract(index, addresses));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The smallest superset of `seeds` whose remaining cuts all run in the
|
|
53
|
+
* direction `allow` permits, plus those cuts (#3909).
|
|
54
|
+
*
|
|
55
|
+
* - `outbound`: nothing outside may read in, so the set takes every
|
|
56
|
+
* dependent of the seeds, outputs included.
|
|
57
|
+
* - `inbound`: nothing inside may read out, so the set takes everything the
|
|
58
|
+
* seeds depend on.
|
|
59
|
+
* - `none`: the seeds' whole components, with each output that reads only
|
|
60
|
+
* into them.
|
|
61
|
+
*
|
|
62
|
+
* Outputs are terminal, so none of these walks passes through one. An output
|
|
63
|
+
* that reads both the set and something outside it is therefore a cut no
|
|
64
|
+
* closure removes: under `none` it stays outside and its read into the set is
|
|
65
|
+
* left as an inbound cut, for the caller to wire.
|
|
66
|
+
*/
|
|
67
|
+
export function closure(graph, seeds, allow) {
|
|
68
|
+
const index = carveIndex(graph);
|
|
69
|
+
const start = contract(index, seeds);
|
|
70
|
+
const direction = allow === "outbound" ? "in" : allow === "inbound" ? "out" : "both";
|
|
71
|
+
const members = new Set([...start, ...walkFrom(index, start, direction).keys()]);
|
|
72
|
+
if (allow === "none") {
|
|
73
|
+
for (const address of [...members]) {
|
|
74
|
+
if (!isOutputAddress(address) || start.has(address))
|
|
75
|
+
continue;
|
|
76
|
+
const reads = (index.adj.out.get(address) ?? []).map((e) => e.to);
|
|
77
|
+
if (!reads.every((to) => members.has(to)))
|
|
78
|
+
members.delete(address);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const found = cutsOf(index, members);
|
|
82
|
+
return {
|
|
83
|
+
...found,
|
|
84
|
+
seeds: [...start].sort(cmp),
|
|
85
|
+
allow,
|
|
86
|
+
...holdings(index, [...members].filter((a) => !isOutputAddress(a))),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** The addresses as the walks see them: each fold child replaced by its parent. Throws on an unknown address. */
|
|
90
|
+
function contract(index, addresses) {
|
|
91
|
+
const out = new Set();
|
|
92
|
+
for (const address of addresses) {
|
|
93
|
+
const known = index.nodes.has(address) || (isOutputAddress(address) && index.adj.out.has(address));
|
|
94
|
+
if (!known)
|
|
95
|
+
throw new Error(`carve: ${address} is not a resource, module or output in this graph`);
|
|
96
|
+
out.add(index.rep(address));
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
function cutsOf(index, members) {
|
|
101
|
+
const inbound = [];
|
|
102
|
+
const outbound = [];
|
|
103
|
+
for (const address of members) {
|
|
104
|
+
for (const e of index.adj.in.get(address) ?? [])
|
|
105
|
+
if (!members.has(e.from))
|
|
106
|
+
inbound.push(e.edge);
|
|
107
|
+
for (const e of index.adj.out.get(address) ?? [])
|
|
108
|
+
if (!members.has(e.to))
|
|
109
|
+
outbound.push(e.edge);
|
|
110
|
+
}
|
|
111
|
+
const byEnds = (a, b) => cmp(a.from, b.from) || cmp(a.to, b.to);
|
|
112
|
+
inbound.sort(byEnds);
|
|
113
|
+
outbound.sort(byEnds);
|
|
114
|
+
const reps = [...members];
|
|
115
|
+
return {
|
|
116
|
+
...blockSet(index, reps.filter((a) => !isOutputAddress(a)), reps.filter(isOutputAddress)),
|
|
117
|
+
inbound,
|
|
118
|
+
outbound,
|
|
119
|
+
counts: { inbound: countOf(inbound), outbound: countOf(outbound) },
|
|
120
|
+
bothWays: inbound.length > 0 && outbound.length > 0,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function countOf(edges) {
|
|
124
|
+
const outputs = edges.filter((e) => e.fromKind === "output").length;
|
|
125
|
+
return { resources: edges.length - outputs, outputs, crossStack: edges.filter((e) => e.crossStack).length };
|
|
126
|
+
}
|
|
127
|
+
function blockSet(index, reps, outputs) {
|
|
128
|
+
return {
|
|
129
|
+
resources: reps.flatMap((rep) => index.membersOf(rep)).sort(cmp),
|
|
130
|
+
outputs: [...outputs].sort(cmp),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function holdings(index, reps) {
|
|
134
|
+
const instances = weigh(index, reps);
|
|
135
|
+
if (instances !== "unknown")
|
|
136
|
+
return { instances };
|
|
137
|
+
return { instances, hiddenBy: reps.filter((a) => hidesContents(index.nodes.get(a))).sort(cmp) };
|
|
138
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fold detection for the carve graph, shared by the scorer and the walks.
|
|
3
|
+
*
|
|
4
|
+
* A sub-resource whose type inlines into a parent (`foldParentOf`) carves with
|
|
5
|
+
* that parent when the parent is in the estate under the same name:
|
|
6
|
+
* `aws_s3_bucket_versioning.assets` goes with `aws_s3_bucket.assets`. The
|
|
7
|
+
* scorer drops it from the ranking and discounts its edge to the parent; the
|
|
8
|
+
* walks in `reach.ts` contract it into the parent before stepping, since an
|
|
9
|
+
* uncontracted walk counts the child as a separate dependent (#2325 measured a
|
|
10
|
+
* 100% overstatement on the sample estate). It lived privately in `score.ts`
|
|
11
|
+
* until the walks needed it.
|
|
12
|
+
*/
|
|
13
|
+
import type { TfGraph } from "./types.js";
|
|
14
|
+
export interface Folds {
|
|
15
|
+
/** Every address that folds into a parent present in the estate. */
|
|
16
|
+
folded: Set<string>;
|
|
17
|
+
/** Parent address → the addresses folded into it. */
|
|
18
|
+
childrenOf: Map<string, Set<string>>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build the set of addresses that fold into a parent present in the estate, plus
|
|
22
|
+
* the reverse lookup (parent → its folded children), so a parent can discount
|
|
23
|
+
* inbound edges coming from its own folded sub-resources.
|
|
24
|
+
*/
|
|
25
|
+
export declare function computeFolds(graph: TfGraph): Folds;
|
|
26
|
+
//# sourceMappingURL=folds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folds.d.ts","sourceRoot":"","sources":["../../src/terraform/folds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,KAAK;IACpB,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,qDAAqD;IACrD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAelD"}
|