@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/src/workspace/kinds.ts
CHANGED
|
@@ -25,6 +25,7 @@ import { joinPath, skippedDir } from "./tree";
|
|
|
25
25
|
import { checkPinIntegrity } from "./pin-integrity";
|
|
26
26
|
import { dataExportTarget, findInstalledPackage } from "./class-data";
|
|
27
27
|
import { loadAjv2020 } from "./ajv2020";
|
|
28
|
+
import yaml from "js-yaml";
|
|
28
29
|
|
|
29
30
|
export const KINDS_SCHEMA_ID = schema.$id;
|
|
30
31
|
|
|
@@ -34,7 +35,9 @@ export const KINDS_SUBPATH = "./workspace-kinds";
|
|
|
34
35
|
/**
|
|
35
36
|
* The probe a package's kind carries (#2535, #2545). It passes when any of
|
|
36
37
|
* its clauses does. A name in either clause may use `*`, which matches any
|
|
37
|
-
* run of characters in one file name, so `*.tf` is every Terraform file
|
|
38
|
+
* run of characters in one file name, so `*.tf` is every Terraform file, and
|
|
39
|
+
* `[0-9]` matches one digit (#4400), so `[0-9]*_*.sql` is a file that opens
|
|
40
|
+
* with a version number.
|
|
38
41
|
*/
|
|
39
42
|
export interface FileProbe {
|
|
40
43
|
/** A file matching one of these names sits directly in the directory. */
|
|
@@ -53,6 +56,13 @@ export interface FileProbe {
|
|
|
53
56
|
* without claiming every Node package (#3151).
|
|
54
57
|
*/
|
|
55
58
|
anyJsonKey?: { in: string[]; pointers: string[] };
|
|
59
|
+
/**
|
|
60
|
+
* A file directly in the directory whose name matches one of `in` has a
|
|
61
|
+
* line that starts, after leading space and ignoring case, with one of
|
|
62
|
+
* `starts` (#4400). This is how a goose directory is told from any other
|
|
63
|
+
* directory of `.sql` files: its files carry `-- +goose Up`.
|
|
64
|
+
*/
|
|
65
|
+
anyLine?: { in: string[]; starts: string[] };
|
|
56
66
|
}
|
|
57
67
|
|
|
58
68
|
/** A string, integer or boolean field a kind declares for its members (#3151). */
|
|
@@ -81,7 +91,9 @@ export type KindProbe =
|
|
|
81
91
|
/** The directory exists; nothing else is checked (`other`). */
|
|
82
92
|
| { directory: true }
|
|
83
93
|
/** The directory holds a chant project, as {@link holdsChantProject} says (`examples`). */
|
|
84
|
-
| { chantProject: true }
|
|
94
|
+
| { chantProject: true }
|
|
95
|
+
/** Nothing local: the member names another repository's workspace (`repo`, #3168). */
|
|
96
|
+
| { repo: true };
|
|
85
97
|
|
|
86
98
|
/**
|
|
87
99
|
* Which outputs a member of a kind exposes as link targets (#2524 D6,
|
|
@@ -135,15 +147,38 @@ export interface MemberKind {
|
|
|
135
147
|
* entry states.
|
|
136
148
|
*/
|
|
137
149
|
reader?: KindLinkReaderName;
|
|
150
|
+
/** A file every member of the kind has, and the JSON Schema it must pass (#3672); unset, the kind checks no member file. */
|
|
151
|
+
memberFile?: KindMemberFile;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* A kind's member file (#3672): `path` in each member's directory must pass
|
|
156
|
+
* the JSON Schema at `schema` in the supplying package. `chant workspace
|
|
157
|
+
* check` reads and validates it (WSP012). The schema is read as data when the
|
|
158
|
+
* package's kinds are read, so a schema that is missing or doesn't compile is
|
|
159
|
+
* a load problem (WSP002), and `validate` is unset.
|
|
160
|
+
*/
|
|
161
|
+
export interface KindMemberFile {
|
|
162
|
+
/** The file, relative to the member's directory. */
|
|
163
|
+
path: string;
|
|
164
|
+
/** The schema, as the kinds file names it, relative to the package. */
|
|
165
|
+
schema: string;
|
|
166
|
+
/** The schema, absolute; unset until the package directory is known. */
|
|
167
|
+
schemaFile?: string;
|
|
168
|
+
/** The compiled schema; unset when it could not be read or compiled. */
|
|
169
|
+
validate?: MemberFileValidate;
|
|
138
170
|
}
|
|
139
171
|
|
|
172
|
+
/** A compiled member-file schema, in Ajv's shape. */
|
|
173
|
+
export type MemberFileValidate = ((data: unknown) => boolean) & { errors?: { instancePath: string; message?: string; params?: Record<string, unknown> }[] | null };
|
|
174
|
+
|
|
140
175
|
/**
|
|
141
176
|
* The link readers chant ships (#3932). A kind names one in its kinds file as
|
|
142
177
|
* `reader`. The readers are chant's own code, not the package's: a kinds file
|
|
143
178
|
* stays data, and chant never imports the package that supplies it. Closed:
|
|
144
179
|
* a kind naming another reader is kept without one, and the load reports it.
|
|
145
180
|
*/
|
|
146
|
-
export const KIND_LINK_READERS = ["dbt-project"] as const;
|
|
181
|
+
export const KIND_LINK_READERS = ["dbt-project", "goose-dir", "golang-migrate-dir", "clickhouse-migrations-dir", "flyway-dir"] as const;
|
|
147
182
|
export type KindLinkReaderName = (typeof KIND_LINK_READERS)[number];
|
|
148
183
|
|
|
149
184
|
export interface KindRegistry {
|
|
@@ -157,6 +192,9 @@ export interface KindRegistry {
|
|
|
157
192
|
/** The group kind (ws-051). An entry of this kind is a group, not a member. */
|
|
158
193
|
export const EXAMPLES_KIND = "examples";
|
|
159
194
|
|
|
195
|
+
/** The member kind that names another repository's workspace by URL and pinned revision (#3168). */
|
|
196
|
+
export const REPO_KIND = "repo";
|
|
197
|
+
|
|
160
198
|
/** The data member kind that holds design artifacts (#2549, ws-062). */
|
|
161
199
|
export const DESIGN_KIND = "design";
|
|
162
200
|
|
|
@@ -179,6 +217,15 @@ export const BUILTIN_KINDS: readonly MemberKind[] = [
|
|
|
179
217
|
outputs: { from: "none" },
|
|
180
218
|
source: "builtin",
|
|
181
219
|
},
|
|
220
|
+
{
|
|
221
|
+
name: REPO_KIND,
|
|
222
|
+
description: "another repository's workspace, named by URL and pinned revision; chant reads it through that repository's own chant workspace graph and never writes there",
|
|
223
|
+
probe: { repo: true },
|
|
224
|
+
precedence: 0,
|
|
225
|
+
shape: "member",
|
|
226
|
+
outputs: { from: "none" },
|
|
227
|
+
source: "builtin",
|
|
228
|
+
},
|
|
182
229
|
{
|
|
183
230
|
name: "other",
|
|
184
231
|
description: "a directory chant does not read; the entry says why in `because`",
|
|
@@ -232,7 +279,8 @@ export function builtinKindRegistry(): KindRegistry {
|
|
|
232
279
|
export function probeKind(kind: MemberKind, tree: WorkspaceTree, dir: string): boolean {
|
|
233
280
|
if ("directory" in kind.probe) return true;
|
|
234
281
|
if ("chantProject" in kind.probe) return holdsChantProject(tree, dir);
|
|
235
|
-
|
|
282
|
+
if ("repo" in kind.probe) return true;
|
|
283
|
+
const { anyFile, anyBlock, anyJsonKey, anyLine } = kind.probe;
|
|
236
284
|
if (anyFile && filesMatching(tree, dir, anyFile).length > 0) return true;
|
|
237
285
|
if (anyJsonKey) {
|
|
238
286
|
for (const file of filesMatching(tree, dir, anyJsonKey.in)) {
|
|
@@ -244,6 +292,16 @@ export function probeKind(kind: MemberKind, tree: WorkspaceTree, dir: string): b
|
|
|
244
292
|
}
|
|
245
293
|
}
|
|
246
294
|
}
|
|
295
|
+
if (anyLine) {
|
|
296
|
+
const starts = anyLine.starts.map((t) => t.toLowerCase());
|
|
297
|
+
for (const file of filesMatching(tree, dir, anyLine.in)) {
|
|
298
|
+
try {
|
|
299
|
+
if (tree.read(file).split(/\r?\n/).some((l) => starts.some((t) => l.trimStart().toLowerCase().startsWith(t)))) return true;
|
|
300
|
+
} catch {
|
|
301
|
+
// An unreadable file is no evidence either way.
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
247
305
|
if (anyBlock) {
|
|
248
306
|
const opener = new RegExp(`^\\s*(?:${anyBlock.blocks.map(escapeRegExp).join("|")})\\s*\\{`, "m");
|
|
249
307
|
for (const file of filesMatching(tree, dir, anyBlock.in)) {
|
|
@@ -259,7 +317,7 @@ export function probeKind(kind: MemberKind, tree: WorkspaceTree, dir: string): b
|
|
|
259
317
|
|
|
260
318
|
/** Whether a probe looks at the directory's files, and so can claim it. */
|
|
261
319
|
function isFileProbe(probe: KindProbe): probe is FileProbe {
|
|
262
|
-
return !("directory" in probe) && !("chantProject" in probe);
|
|
320
|
+
return !("directory" in probe) && !("chantProject" in probe) && !("repo" in probe);
|
|
263
321
|
}
|
|
264
322
|
|
|
265
323
|
/**
|
|
@@ -274,7 +332,7 @@ function filesMatching(tree: WorkspaceTree, dir: string, names: readonly string[
|
|
|
274
332
|
if (!name.includes("*") && tree.stat(joinPath(dir, name)) === "file") out.push(joinPath(dir, name));
|
|
275
333
|
}
|
|
276
334
|
if (globs.length > 0) {
|
|
277
|
-
const patterns = globs.map((g) => new RegExp(`^${g.split("*").map(escapeRegExp).join("[^/]*")}$`));
|
|
335
|
+
const patterns = globs.map((g) => new RegExp(`^${g.split("*").map((part) => escapeRegExp(part).replace(/\\\[0-9\\\]/g, "[0-9]")).join("[^/]*")}$`));
|
|
278
336
|
for (const e of tree.list(dir) ?? []) {
|
|
279
337
|
if (e.type === "file" && patterns.some((p) => p.test(e.name))) out.push(joinPath(dir, e.name));
|
|
280
338
|
}
|
|
@@ -400,7 +458,7 @@ export function parseKindData(text: string, source: string): KindData {
|
|
|
400
458
|
const problems: string[] = [];
|
|
401
459
|
const kinds: MemberKind[] = [];
|
|
402
460
|
const seen = new Set<string>();
|
|
403
|
-
for (const k of (raw as { kinds: { name: string; description: string; precedence: number; probe: FileProbe; outputs?: string[]; graph?: KindGraph; fields?: Record<string, KindField>; reader?: string }[] }).kinds) {
|
|
461
|
+
for (const k of (raw as { kinds: { name: string; description: string; precedence: number; probe: FileProbe; outputs?: string[]; graph?: KindGraph; fields?: Record<string, KindField>; reader?: string; memberFile?: { path: string; schema: string } }[] }).kinds) {
|
|
404
462
|
if (BUILTIN_KIND_NAMES.includes(k.name)) {
|
|
405
463
|
problems.push(`${source}: kind ${k.name} is built in and can't be supplied by a package`);
|
|
406
464
|
continue;
|
|
@@ -417,6 +475,7 @@ export function parseKindData(text: string, source: string): KindData {
|
|
|
417
475
|
...(k.probe.anyFile ? { anyFile: [...k.probe.anyFile] } : {}),
|
|
418
476
|
...(k.probe.anyBlock ? { anyBlock: { in: [...k.probe.anyBlock.in], blocks: [...k.probe.anyBlock.blocks] } } : {}),
|
|
419
477
|
...(k.probe.anyJsonKey ? { anyJsonKey: { in: [...k.probe.anyJsonKey.in], pointers: [...k.probe.anyJsonKey.pointers] } } : {}),
|
|
478
|
+
...(k.probe.anyLine ? { anyLine: { in: [...k.probe.anyLine.in], starts: [...k.probe.anyLine.starts] } } : {}),
|
|
420
479
|
},
|
|
421
480
|
precedence: k.precedence,
|
|
422
481
|
shape: "member",
|
|
@@ -425,6 +484,7 @@ export function parseKindData(text: string, source: string): KindData {
|
|
|
425
484
|
...(k.graph ? { graph: { lexicon: k.graph.lexicon, config: structuredClone(k.graph.config) } } : {}),
|
|
426
485
|
...(k.fields ? { fields: structuredClone(k.fields) } : {}),
|
|
427
486
|
...(k.reader && (KIND_LINK_READERS as readonly string[]).includes(k.reader) ? { reader: k.reader as KindLinkReaderName } : {}),
|
|
487
|
+
...(k.memberFile ? { memberFile: { path: k.memberFile.path, schema: k.memberFile.schema } } : {}),
|
|
428
488
|
});
|
|
429
489
|
if (k.reader && !(KIND_LINK_READERS as readonly string[]).includes(k.reader)) {
|
|
430
490
|
problems.push(`${source}: kind ${k.name} names link reader ${k.reader}, which this chant does not have (it has ${KIND_LINK_READERS.join(", ")}); the kind is kept, and its members' links are only those their entries state`);
|
|
@@ -477,6 +537,10 @@ export function readPackageKinds(packageDir: string, source?: string): PackageKi
|
|
|
477
537
|
const packageName = typeof pkg.name === "string" ? pkg.name : undefined;
|
|
478
538
|
for (const k of data.kinds) {
|
|
479
539
|
k.packageDir = packageDir;
|
|
540
|
+
if (k.memberFile) {
|
|
541
|
+
const problem = loadMemberFileSchema(k.memberFile, packageDir);
|
|
542
|
+
if (problem) data.problems.push(`${name}: kind ${k.name} ${problem}; members of the kind fail WSP012 until it is fixed`);
|
|
543
|
+
}
|
|
480
544
|
if (k.graph && packageName !== lexiconPackageName(k.graph.lexicon)) {
|
|
481
545
|
data.problems.push(
|
|
482
546
|
`${name}: kind ${k.name} reads its members with lexicon ${k.graph.lexicon}, which is ${lexiconPackageName(k.graph.lexicon)}, ` +
|
|
@@ -488,6 +552,67 @@ export function readPackageKinds(packageDir: string, source?: string): PackageKi
|
|
|
488
552
|
return { ...data, file };
|
|
489
553
|
}
|
|
490
554
|
|
|
555
|
+
/**
|
|
556
|
+
* Read and compile a kind's member-file schema from `packageDir` (#3672),
|
|
557
|
+
* setting `schemaFile` and `validate`. Returns why it can't be used, or
|
|
558
|
+
* undefined. The schema is a JSON file inside the package; it is data, so
|
|
559
|
+
* nothing is imported, and a `$ref` outside the file is not followed.
|
|
560
|
+
*/
|
|
561
|
+
export function loadMemberFileSchema(memberFile: KindMemberFile, packageDir: string): string | undefined {
|
|
562
|
+
const file = resolve(packageDir, ...memberFile.schema.split("/"));
|
|
563
|
+
memberFile.schemaFile = file;
|
|
564
|
+
const inside = relative(packageDir, file);
|
|
565
|
+
if (inside.startsWith("..") || isAbsolute(inside)) return `names member-file schema ${memberFile.schema}, which is outside the package`;
|
|
566
|
+
let doc: unknown;
|
|
567
|
+
try {
|
|
568
|
+
doc = JSON.parse(readFileSync(file, "utf-8"));
|
|
569
|
+
} catch (err) {
|
|
570
|
+
const missing = (err as NodeJS.ErrnoException).code === "ENOENT";
|
|
571
|
+
return missing ? `names member-file schema ${memberFile.schema}, which does not exist` : `names member-file schema ${memberFile.schema}, which is not JSON (${(err as Error).message})`;
|
|
572
|
+
}
|
|
573
|
+
if (doc === null || typeof doc !== "object" || Array.isArray(doc)) return `names member-file schema ${memberFile.schema}, which is not a JSON Schema object`;
|
|
574
|
+
try {
|
|
575
|
+
const Ajv = loadAjv2020() as new (opts: object) => { compile(s: object): MemberFileValidate };
|
|
576
|
+
memberFile.validate = new Ajv({ allErrors: true, strict: false }).compile(doc);
|
|
577
|
+
} catch (err) {
|
|
578
|
+
return `names member-file schema ${memberFile.schema}, which does not compile as a draft 2020-12 schema (${(err as Error).message})`;
|
|
579
|
+
}
|
|
580
|
+
return undefined;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/** One reason a member's file fails its kind's schema (#3672): a JSON Pointer into the file, and why. */
|
|
584
|
+
export interface MemberFileProblem {
|
|
585
|
+
pointer: string;
|
|
586
|
+
message: string;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* Check a member's file text against its kind's schema (#3672). `file` is the
|
|
591
|
+
* file's name, which picks the parser: YAML for `.yml` and `.yaml`, JSON
|
|
592
|
+
* otherwise. The kind's schema must have loaded; when it didn't, WSP002 has
|
|
593
|
+
* already said why, and this returns nothing.
|
|
594
|
+
*/
|
|
595
|
+
export function checkMemberFile(memberFile: KindMemberFile, file: string, text: string): MemberFileProblem[] {
|
|
596
|
+
if (!memberFile.validate) return [];
|
|
597
|
+
let data: unknown;
|
|
598
|
+
try {
|
|
599
|
+
data = /\.ya?ml$/i.test(file) ? yaml.load(text) : JSON.parse(text);
|
|
600
|
+
} catch (err) {
|
|
601
|
+
return [{ pointer: "", message: `is not ${/\.ya?ml$/i.test(file) ? "YAML" : "JSON"} (${(err as Error).message.split("\n")[0]})` }];
|
|
602
|
+
}
|
|
603
|
+
if (memberFile.validate(data)) return [];
|
|
604
|
+
const seen = new Set<string>();
|
|
605
|
+
const out: MemberFileProblem[] = [];
|
|
606
|
+
for (const e of memberFile.validate.errors ?? []) {
|
|
607
|
+
const extra = e.params && typeof e.params.additionalProperty === "string" ? ` (${e.params.additionalProperty})` : "";
|
|
608
|
+
const message = `${e.instancePath || "the file"} ${e.message ?? "is invalid"}${extra}`;
|
|
609
|
+
if (seen.has(message)) continue;
|
|
610
|
+
seen.add(message);
|
|
611
|
+
out.push({ pointer: e.instancePath, message });
|
|
612
|
+
}
|
|
613
|
+
return out;
|
|
614
|
+
}
|
|
615
|
+
|
|
491
616
|
/** The package a lexicon name resolves to. */
|
|
492
617
|
export function lexiconPackageName(lexicon: string): string {
|
|
493
618
|
return `@intentius/chant-lexicon-${lexicon}`;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/chant/schemas/workspace/ledger/v1/ledger.schema.json",
|
|
4
|
+
"title": "chant ledger output",
|
|
5
|
+
"description": "What `chant ledger <table> --json` prints (#4363): the rows of one ledger on the local chant/lifecycle branch, filtered with typed filters instead of SQL. The tables and columns are the ones `chant query` loads (schema version 1 of its tables); a column chant query keeps as JSON text is an object or array here, and `signed` and `empty` are booleans. It reads the local branch and never fetches. Version 1 of the read contract. Readers ignore fields they do not know; a field is only ever added within a version. The codes are a closed list, each in the one closed list of `reason-codes.ts`.",
|
|
6
|
+
"oneOf": [
|
|
7
|
+
{
|
|
8
|
+
"$ref": "#/$defs/result"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"$ref": "#/$defs/failure"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"$defs": {
|
|
15
|
+
"result": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"description": "The rows that every filter matched. Exit code 0.",
|
|
18
|
+
"required": [
|
|
19
|
+
"$schema",
|
|
20
|
+
"contract",
|
|
21
|
+
"table",
|
|
22
|
+
"columns",
|
|
23
|
+
"at",
|
|
24
|
+
"filter",
|
|
25
|
+
"total",
|
|
26
|
+
"rows",
|
|
27
|
+
"malformed"
|
|
28
|
+
],
|
|
29
|
+
"properties": {
|
|
30
|
+
"$schema": {
|
|
31
|
+
"const": "https://intentius.io/chant/schemas/workspace/ledger/v1/ledger.schema.json"
|
|
32
|
+
},
|
|
33
|
+
"contract": {
|
|
34
|
+
"const": 1
|
|
35
|
+
},
|
|
36
|
+
"table": {
|
|
37
|
+
"enum": [
|
|
38
|
+
"resources",
|
|
39
|
+
"snapshots",
|
|
40
|
+
"runs",
|
|
41
|
+
"gates",
|
|
42
|
+
"deploys",
|
|
43
|
+
"releases",
|
|
44
|
+
"cuts"
|
|
45
|
+
],
|
|
46
|
+
"description": "The table read: resources and snapshots from each lexicon's snapshots, runs from the Op run ledgers, gates from _gates/, deploys from <env>/releases.jsonl, releases and cuts from _releases/."
|
|
47
|
+
},
|
|
48
|
+
"columns": {
|
|
49
|
+
"type": "array",
|
|
50
|
+
"items": {
|
|
51
|
+
"type": "string"
|
|
52
|
+
},
|
|
53
|
+
"description": "The table's columns, in order. Every row has each of them."
|
|
54
|
+
},
|
|
55
|
+
"at": {
|
|
56
|
+
"type": [
|
|
57
|
+
"string",
|
|
58
|
+
"null"
|
|
59
|
+
],
|
|
60
|
+
"description": "The revision of chant/lifecycle read (--at), as given, or null for the branch tip."
|
|
61
|
+
},
|
|
62
|
+
"filter": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"required": [
|
|
65
|
+
"where",
|
|
66
|
+
"since"
|
|
67
|
+
],
|
|
68
|
+
"properties": {
|
|
69
|
+
"where": {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"items": {
|
|
72
|
+
"type": "string"
|
|
73
|
+
},
|
|
74
|
+
"description": "Each --where clause, <field><op><value>, as given. Every one held for each row listed."
|
|
75
|
+
},
|
|
76
|
+
"since": {
|
|
77
|
+
"type": [
|
|
78
|
+
"string",
|
|
79
|
+
"null"
|
|
80
|
+
],
|
|
81
|
+
"description": "--since as the ISO instant it was read as, or null. The rows whose time column (observed_at, started or timestamp) is at or after it are listed."
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"total": {
|
|
86
|
+
"type": "integer",
|
|
87
|
+
"minimum": 0,
|
|
88
|
+
"description": "Rows in the table before the filter."
|
|
89
|
+
},
|
|
90
|
+
"rows": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"items": {
|
|
93
|
+
"$ref": "#/$defs/row"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"malformed": {
|
|
97
|
+
"type": "integer",
|
|
98
|
+
"minimum": 0,
|
|
99
|
+
"description": "Lines and files of this table that could not be read as their kind, left out of total and rows."
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"row": {
|
|
104
|
+
"type": "object",
|
|
105
|
+
"description": "One row, keyed by column. Every row starts with member: the workspace member whose ledger it came from, or null outside a workspace. A value is a string, a number, a boolean, an object or array (a JSON column), or null.",
|
|
106
|
+
"required": [
|
|
107
|
+
"member"
|
|
108
|
+
],
|
|
109
|
+
"additionalProperties": {
|
|
110
|
+
"type": [
|
|
111
|
+
"string",
|
|
112
|
+
"number",
|
|
113
|
+
"boolean",
|
|
114
|
+
"object",
|
|
115
|
+
"array",
|
|
116
|
+
"null"
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"failure": {
|
|
121
|
+
"type": "object",
|
|
122
|
+
"description": "Nothing was read. Exit code 1.",
|
|
123
|
+
"required": [
|
|
124
|
+
"$schema",
|
|
125
|
+
"contract",
|
|
126
|
+
"error"
|
|
127
|
+
],
|
|
128
|
+
"properties": {
|
|
129
|
+
"$schema": {
|
|
130
|
+
"const": "https://intentius.io/chant/schemas/workspace/ledger/v1/ledger.schema.json"
|
|
131
|
+
},
|
|
132
|
+
"contract": {
|
|
133
|
+
"const": 1
|
|
134
|
+
},
|
|
135
|
+
"error": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"required": [
|
|
138
|
+
"code",
|
|
139
|
+
"message"
|
|
140
|
+
],
|
|
141
|
+
"properties": {
|
|
142
|
+
"code": {
|
|
143
|
+
"enum": [
|
|
144
|
+
"filter-invalid",
|
|
145
|
+
"table-unknown",
|
|
146
|
+
"revision-unknown",
|
|
147
|
+
"ledger-unreadable"
|
|
148
|
+
]
|
|
149
|
+
},
|
|
150
|
+
"message": {
|
|
151
|
+
"type": "string"
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -24,17 +24,24 @@
|
|
|
24
24
|
*
|
|
25
25
|
* Under `--at` the revision's files are not on disk to fold, so a member
|
|
26
26
|
* whose lexicons report outputs gets a gap instead.
|
|
27
|
+
*
|
|
28
|
+
* The consumer side works the same way (#4397): a lexicon's `workspaceLinks`
|
|
29
|
+
* hook names the outputs of other members its declarations read, such as
|
|
30
|
+
* the tables an otel `clickhouse` exporter writes. {@link gatherLexiconLinks}
|
|
31
|
+
* folds every member whose lexicons have the hook and hands back what they
|
|
32
|
+
* report, in the shape a kind's link reader returns (`./kind-link-readers.ts`),
|
|
33
|
+
* so `resolveLinks` checks those links like a dbt project's sources.
|
|
27
34
|
*/
|
|
28
35
|
|
|
29
36
|
import { join, posix } from "node:path";
|
|
30
37
|
import type { StaticFieldsRead } from "../config-static";
|
|
31
38
|
import { isDeclarable, type Declarable } from "../declarable";
|
|
32
|
-
import type { LexiconUnreadSource, LexiconWorkspaceOutput } from "../graph-ir";
|
|
39
|
+
import type { LexiconUnreadSource, LexiconWorkspaceLinks, LexiconWorkspaceOutput } from "../graph-ir";
|
|
33
40
|
import type { BuildRootContext, BuildRootContribution, IntrinsicDef } from "../lexicon";
|
|
34
41
|
import type { Declaration, ResolvedGroup } from "./declaration";
|
|
35
42
|
import type { KindRegistry } from "./kinds";
|
|
36
43
|
import { kindHandles } from "./links";
|
|
37
|
-
import { readKindLinks } from "./kind-link-readers";
|
|
44
|
+
import { readKindLinks, type KindLinkRead } from "./kind-link-readers";
|
|
38
45
|
import { memberExcludes, sourceFiles } from "./member-handles";
|
|
39
46
|
import { memberDirOnDisk } from "./lexicon-symbols";
|
|
40
47
|
import type { WorkspaceTree } from "./tree";
|
|
@@ -51,6 +58,7 @@ export interface OutputsPlugin {
|
|
|
51
58
|
intrinsics?: () => IntrinsicDef[];
|
|
52
59
|
buildRoots?: (ctx: BuildRootContext) => Promise<BuildRootContribution>;
|
|
53
60
|
workspaceOutputs?: (entities: ReadonlyMap<string, Declarable>, unread?: readonly LexiconUnreadSource[]) => { outputs: LexiconWorkspaceOutput[]; gaps?: string[] } | undefined;
|
|
61
|
+
workspaceLinks?: (entities: ReadonlyMap<string, Declarable>, unread?: readonly LexiconUnreadSource[]) => LexiconWorkspaceLinks | undefined;
|
|
54
62
|
}
|
|
55
63
|
|
|
56
64
|
/** Loads a lexicon plugin by name; `loadPlugin` from the CLI unless a test swaps it. */
|
|
@@ -60,6 +68,8 @@ export interface GatherLexiconOutputsOptions {
|
|
|
60
68
|
/** Read under `--at`: the member's files are a revision's, not on disk, so nothing is folded. */
|
|
61
69
|
atRevision?: boolean;
|
|
62
70
|
load?: OutputsPluginLoader;
|
|
71
|
+
/** Links the members' lexicons read (#4397), from {@link gatherLexiconLinks}: the members they target are read too. */
|
|
72
|
+
lexiconLinks?: ReadonlyMap<string, KindLinkRead>;
|
|
63
73
|
}
|
|
64
74
|
|
|
65
75
|
const firstLine = (err: unknown): string => (err instanceof Error ? err.message : String(err)).split("\n")[0];
|
|
@@ -134,7 +144,7 @@ export async function gatherLexiconOutputs(
|
|
|
134
144
|
const targets = new Set(declaration.members.flatMap((m) => m.links.filter((l) => l.member !== m.name).map((l) => l.member)));
|
|
135
145
|
// Links a kind's reader finds in a member's files target members too (#3932). One that names no
|
|
136
146
|
// producer may be any other member's, so every other member is read.
|
|
137
|
-
for (const [consumer, read] of readKindLinks(declaration, tree, kinds)) {
|
|
147
|
+
for (const [consumer, read] of [...readKindLinks(declaration, tree, kinds), ...(options.lexiconLinks ?? new Map<string, KindLinkRead>())]) {
|
|
138
148
|
for (const link of read.links) {
|
|
139
149
|
if (link.member !== null) targets.add(link.member);
|
|
140
150
|
else for (const m of declaration.members) if (m.name !== consumer) targets.add(m.name);
|
|
@@ -165,14 +175,36 @@ function importedLexicons(tree: WorkspaceTree, files: readonly string[]): string
|
|
|
165
175
|
return [...names].sort();
|
|
166
176
|
}
|
|
167
177
|
|
|
168
|
-
|
|
178
|
+
type Hook = "workspaceOutputs" | "workspaceLinks";
|
|
179
|
+
|
|
180
|
+
/** A member's source folded for the lexicons that have `hook`, or why it wasn't. */
|
|
181
|
+
type FoldedMember =
|
|
182
|
+
| { status: "none" }
|
|
183
|
+
| { status: "gaps"; gaps: string[] }
|
|
184
|
+
| {
|
|
185
|
+
status: "folded";
|
|
186
|
+
reporting: { name: string; plugin: OutputsPlugin }[];
|
|
187
|
+
entities: Map<string, Declarable>;
|
|
188
|
+
unread: LexiconUnreadSource[];
|
|
189
|
+
gaps: string[];
|
|
190
|
+
/** The tree-relative file that exports each entity, and that file's text. */
|
|
191
|
+
sourceOf: (entity: Declarable) => { file: string; text: string } | undefined;
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Fold one member's source for the lexicons that implement `hook`, never
|
|
196
|
+
* running it. "none" when no lexicon of the member's has the hook.
|
|
197
|
+
*/
|
|
198
|
+
async function foldMember(
|
|
169
199
|
root: string,
|
|
170
200
|
declaration: Declaration,
|
|
171
201
|
tree: WorkspaceTree,
|
|
172
202
|
groups: readonly ResolvedGroup[],
|
|
173
203
|
m: Declaration["members"][number],
|
|
174
204
|
options: GatherLexiconOutputsOptions,
|
|
175
|
-
|
|
205
|
+
hook: Hook,
|
|
206
|
+
): Promise<FoldedMember> {
|
|
207
|
+
const what = hook === "workspaceOutputs" ? "outputs" : "links";
|
|
176
208
|
const dir = memberDirOnDisk(root, m.dir);
|
|
177
209
|
const { readConfigFieldsStatically } = await import("../config-static");
|
|
178
210
|
const files = withinSourceDir(
|
|
@@ -188,7 +220,7 @@ async function readMemberLexiconOutputs(
|
|
|
188
220
|
// source imports stand in for the ones it names.
|
|
189
221
|
names = importedLexicons(tree, files);
|
|
190
222
|
}
|
|
191
|
-
if (names.length === 0) return
|
|
223
|
+
if (names.length === 0) return { status: "none" };
|
|
192
224
|
const load = options.load ?? ((await import("../cli/plugins")).loadPlugin as unknown as OutputsPluginLoader);
|
|
193
225
|
const plugins: { name: string; plugin: OutputsPlugin }[] = [];
|
|
194
226
|
const gaps: string[] = [];
|
|
@@ -196,13 +228,13 @@ async function readMemberLexiconOutputs(
|
|
|
196
228
|
try {
|
|
197
229
|
plugins.push({ name, plugin: await load(name) });
|
|
198
230
|
} catch (err) {
|
|
199
|
-
gaps.push(`lexicon "${name}" could not be loaded, so the
|
|
231
|
+
gaps.push(`lexicon "${name}" could not be loaded, so the ${what} it reads were not (${firstLine(err)})`);
|
|
200
232
|
}
|
|
201
233
|
}
|
|
202
|
-
const reporting = plugins.filter((p) => typeof p.plugin
|
|
203
|
-
if (reporting.length === 0) return gaps.length ? {
|
|
234
|
+
const reporting = plugins.filter((p) => typeof p.plugin[hook] === "function");
|
|
235
|
+
if (reporting.length === 0) return gaps.length && hook === "workspaceOutputs" ? { status: "gaps", gaps } : { status: "none" };
|
|
204
236
|
if (options.atRevision) {
|
|
205
|
-
return {
|
|
237
|
+
return { status: "gaps", gaps: [`the ${what} of lexicon ${reporting.map((p) => p.name).join(", ")} are read from the working tree's files, not a revision's`] };
|
|
206
238
|
}
|
|
207
239
|
|
|
208
240
|
// Fold the member's source, never run it.
|
|
@@ -216,15 +248,15 @@ async function readMemberLexiconOutputs(
|
|
|
216
248
|
});
|
|
217
249
|
let entities: Map<string, Declarable> = new Map();
|
|
218
250
|
const unread: LexiconUnreadSource[] = [];
|
|
251
|
+
const folded: { file: string; rel: string; exports: Record<string, unknown> }[] = [];
|
|
219
252
|
try {
|
|
220
253
|
const { foldProject } = await import("../discovery/fold-import");
|
|
221
254
|
const { collectEntities } = await import("../discovery/collect");
|
|
222
255
|
const verdicts = await foldProject(files.map(abs), intrinsics, { lexicons: names, sandbox: true });
|
|
223
|
-
const folded: { file: string; exports: Record<string, unknown> }[] = [];
|
|
224
256
|
for (const file of files) {
|
|
225
257
|
const v = verdicts.get(abs(file));
|
|
226
258
|
if (v?.verdict === "fold" && v.exports) {
|
|
227
|
-
folded.push({ file: abs(file), exports: ownExports(v.exports, names) });
|
|
259
|
+
folded.push({ file: abs(file), rel: file, exports: ownExports(v.exports, names) });
|
|
228
260
|
continue;
|
|
229
261
|
}
|
|
230
262
|
let text = "";
|
|
@@ -238,7 +270,7 @@ async function readMemberLexiconOutputs(
|
|
|
238
270
|
}
|
|
239
271
|
entities = collectEntities(folded, dir);
|
|
240
272
|
} catch (err) {
|
|
241
|
-
return {
|
|
273
|
+
return { status: "gaps", gaps: [...gaps, `${m.dir}: its source could not be folded, so its lexicons' ${what} were not read (${firstLine(err)})`] };
|
|
242
274
|
}
|
|
243
275
|
|
|
244
276
|
// A reporting lexicon's own build roots (the sql lexicon's `.sql` files) join
|
|
@@ -257,6 +289,32 @@ async function readMemberLexiconOutputs(
|
|
|
257
289
|
}
|
|
258
290
|
}
|
|
259
291
|
|
|
292
|
+
const sourceOf = (entity: Declarable) => {
|
|
293
|
+
const f = folded.find((x) => Object.values(x.exports).includes(entity));
|
|
294
|
+
if (!f) return undefined;
|
|
295
|
+
let text = "";
|
|
296
|
+
try {
|
|
297
|
+
text = tree.read(f.rel);
|
|
298
|
+
} catch {
|
|
299
|
+
// The line falls back to 1.
|
|
300
|
+
}
|
|
301
|
+
return { file: f.rel, text };
|
|
302
|
+
};
|
|
303
|
+
return { status: "folded", reporting, entities, unread, gaps, sourceOf };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
async function readMemberLexiconOutputs(
|
|
307
|
+
root: string,
|
|
308
|
+
declaration: Declaration,
|
|
309
|
+
tree: WorkspaceTree,
|
|
310
|
+
groups: readonly ResolvedGroup[],
|
|
311
|
+
m: Declaration["members"][number],
|
|
312
|
+
options: GatherLexiconOutputsOptions,
|
|
313
|
+
): Promise<MemberLexiconOutputs | undefined> {
|
|
314
|
+
const member = await foldMember(root, declaration, tree, groups, m, options, "workspaceOutputs");
|
|
315
|
+
if (member.status === "none") return undefined;
|
|
316
|
+
if (member.status === "gaps") return { outputs: [], gaps: member.gaps };
|
|
317
|
+
const { reporting, entities, unread, gaps } = member;
|
|
260
318
|
const outputs: MemberLexiconOutputs["outputs"] = [];
|
|
261
319
|
for (const { name, plugin } of reporting) {
|
|
262
320
|
try {
|
|
@@ -270,3 +328,64 @@ async function readMemberLexiconOutputs(
|
|
|
270
328
|
}
|
|
271
329
|
return { outputs, gaps };
|
|
272
330
|
}
|
|
331
|
+
|
|
332
|
+
/** The line of `export const <name>` (or any declaration of it) in `text`, from 1; 1 when not found. */
|
|
333
|
+
function declarationLine(text: string, name: string): number {
|
|
334
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
335
|
+
const at = text.search(new RegExp(`\\b(?:const|let|var|function|class)\\s+${escaped}\\b`));
|
|
336
|
+
return at < 0 ? 1 : text.slice(0, at).split("\n").length;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* The links each `chant` member's lexicons read from its declarations
|
|
341
|
+
* (#4397), keyed by member name, in the shape a kind's link reader returns.
|
|
342
|
+
* Only members with a lexicon that has a `workspaceLinks` hook are folded. A
|
|
343
|
+
* link carries the file and line of the declaration that states it, and the
|
|
344
|
+
* reader is named `lexicon <name>`.
|
|
345
|
+
*/
|
|
346
|
+
export async function gatherLexiconLinks(
|
|
347
|
+
root: string,
|
|
348
|
+
declaration: Declaration,
|
|
349
|
+
tree: WorkspaceTree,
|
|
350
|
+
groups: readonly ResolvedGroup[],
|
|
351
|
+
kinds: KindRegistry,
|
|
352
|
+
options: GatherLexiconOutputsOptions = {},
|
|
353
|
+
): Promise<Map<string, KindLinkRead>> {
|
|
354
|
+
const out = new Map<string, KindLinkRead>();
|
|
355
|
+
for (const m of declaration.members) {
|
|
356
|
+
const kind = kinds.get(m.kind);
|
|
357
|
+
if (!kind || kindHandles(m, kind) || tree.stat(memberDir(m.dir)) !== "dir") continue;
|
|
358
|
+
const member = await foldMember(root, declaration, tree, groups, m, options, "workspaceLinks");
|
|
359
|
+
if (member.status === "none") continue;
|
|
360
|
+
const where = memberDir(m.dir) || ".";
|
|
361
|
+
if (member.status === "gaps") {
|
|
362
|
+
out.set(m.name, { reader: "lexicon", links: [], gaps: member.gaps.map((message) => ({ file: where, line: 1, message })) });
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
for (const { name, plugin } of member.reporting) {
|
|
366
|
+
const read: KindLinkRead = { reader: `lexicon ${name}`, links: [], gaps: member.gaps.map((message) => ({ file: where, line: 1, message })) };
|
|
367
|
+
try {
|
|
368
|
+
const report = plugin.workspaceLinks!(member.entities, member.unread);
|
|
369
|
+
if (!report) continue;
|
|
370
|
+
for (const l of report.links) {
|
|
371
|
+
const entity = member.entities.get(l.entity);
|
|
372
|
+
const src = entity ? member.sourceOf(entity) : undefined;
|
|
373
|
+
read.links.push({
|
|
374
|
+
member: l.member ?? null,
|
|
375
|
+
output: l.output,
|
|
376
|
+
...(l.anchor ? { anchor: l.anchor } : {}),
|
|
377
|
+
file: src?.file ?? where,
|
|
378
|
+
line: src ? declarationLine(src.text, l.entity.split(".").pop() ?? l.entity) : 1,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
for (const g of report.gaps ?? []) read.gaps.push({ file: where, line: 1, message: g });
|
|
382
|
+
} catch (err) {
|
|
383
|
+
read.gaps.push({ file: where, line: 1, message: `lexicon "${name}" workspaceLinks threw, so its links were not read (${firstLine(err)})` });
|
|
384
|
+
}
|
|
385
|
+
if (read.links.length === 0 && read.gaps.length === 0) continue;
|
|
386
|
+
const prev = out.get(m.name);
|
|
387
|
+
out.set(m.name, prev ? { reader: prev.reader, links: [...prev.links, ...read.links], gaps: [...prev.gaps, ...read.gaps] } : read);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return out;
|
|
391
|
+
}
|