@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
|
@@ -67,6 +67,13 @@
|
|
|
67
67
|
"type": "string",
|
|
68
68
|
"description": "The declared name. With `at`, it identifies the workspace."
|
|
69
69
|
},
|
|
70
|
+
"repo": {
|
|
71
|
+
"type": [
|
|
72
|
+
"string",
|
|
73
|
+
"null"
|
|
74
|
+
],
|
|
75
|
+
"description": "Added in contract 1 by #3168. The repository the document came from: the URL of the remote origin of the git repository that holds the workspace, with any user name or password removed, or null when there is no origin or the workspace is outside git. With name, root and the revision, it says which repository's workspace a document describes, so a reader that gathers several repositories' documents, such as an org workspace's repo members, tells them apart."
|
|
76
|
+
},
|
|
70
77
|
"root": {
|
|
71
78
|
"type": "string",
|
|
72
79
|
"description": "The workspace root relative to the git root, with / separators, \".\" for the git root itself. An absolute path outside a git repository."
|
|
@@ -287,6 +294,33 @@
|
|
|
287
294
|
"type": "string",
|
|
288
295
|
"description": "Relative to the workspace root, with / separators; \".\" is the root member."
|
|
289
296
|
},
|
|
297
|
+
"repo": {
|
|
298
|
+
"type": "object",
|
|
299
|
+
"description": "Added in contract 1 by #3168. For a member of kind repo, the other repository's workspace it names: url, the pinned rev and the workspace root inside that repository. Absent for every other kind. A repo member's dir is @repo/<name>, a marker that names no directory of this repository.",
|
|
300
|
+
"required": [
|
|
301
|
+
"url",
|
|
302
|
+
"rev",
|
|
303
|
+
"workspace"
|
|
304
|
+
],
|
|
305
|
+
"properties": {
|
|
306
|
+
"url": {
|
|
307
|
+
"type": "string"
|
|
308
|
+
},
|
|
309
|
+
"rev": {
|
|
310
|
+
"type": "string"
|
|
311
|
+
},
|
|
312
|
+
"workspace": {
|
|
313
|
+
"type": "string"
|
|
314
|
+
},
|
|
315
|
+
"read": {
|
|
316
|
+
"type": [
|
|
317
|
+
"string",
|
|
318
|
+
"null"
|
|
319
|
+
],
|
|
320
|
+
"description": "The repo identity the other repository's own graph document gave (its workspace.repo), or null when it gave none or the read failed."
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
},
|
|
290
324
|
"kind": {
|
|
291
325
|
"type": "string"
|
|
292
326
|
},
|
|
@@ -437,6 +471,17 @@
|
|
|
437
471
|
}
|
|
438
472
|
}
|
|
439
473
|
]
|
|
474
|
+
},
|
|
475
|
+
"capabilityView": {
|
|
476
|
+
"description": "Added in contract 1 by #4378. Only with `--capability-view`, which `chant workspace search` asks for when a query has a capability term. The lexicon-neutral view capability rules read, built by the member's own chant through the mappings and adapters of the lexicons the member loads (its `chant graph --format ir --capability-view`), with `<member>/<id>` ids. null on a composed member whose chant printed no view (one from before #4378); a capability search reports that member as `member-chant-too-old`. Absent without the flag, and on a member that was not composed.",
|
|
477
|
+
"oneOf": [
|
|
478
|
+
{
|
|
479
|
+
"type": "null"
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"$ref": "#/$defs/capabilityView"
|
|
483
|
+
}
|
|
484
|
+
]
|
|
440
485
|
}
|
|
441
486
|
},
|
|
442
487
|
"if": {
|
|
@@ -1438,6 +1483,143 @@
|
|
|
1438
1483
|
]
|
|
1439
1484
|
}
|
|
1440
1485
|
}
|
|
1486
|
+
},
|
|
1487
|
+
"capabilityView": {
|
|
1488
|
+
"type": "object",
|
|
1489
|
+
"description": "One member's capability view (#4378), as `capabilities/view.ts` serializes it. Rules read labels, attributes and edges; a node's attributes are the neutral ones its lexicon's mapping names.",
|
|
1490
|
+
"required": [
|
|
1491
|
+
"version",
|
|
1492
|
+
"lexicons",
|
|
1493
|
+
"nodes",
|
|
1494
|
+
"edges",
|
|
1495
|
+
"unresolved"
|
|
1496
|
+
],
|
|
1497
|
+
"properties": {
|
|
1498
|
+
"version": {
|
|
1499
|
+
"const": 1,
|
|
1500
|
+
"description": "The view's own format version. A reader treats a view of a version it doesn't know as no view."
|
|
1501
|
+
},
|
|
1502
|
+
"lexicons": {
|
|
1503
|
+
"type": "array",
|
|
1504
|
+
"items": {
|
|
1505
|
+
"type": "string"
|
|
1506
|
+
},
|
|
1507
|
+
"description": "The lexicons whose nodes a mapping labelled."
|
|
1508
|
+
},
|
|
1509
|
+
"nodes": {
|
|
1510
|
+
"type": "array",
|
|
1511
|
+
"items": {
|
|
1512
|
+
"type": "object",
|
|
1513
|
+
"required": [
|
|
1514
|
+
"id",
|
|
1515
|
+
"label",
|
|
1516
|
+
"irId",
|
|
1517
|
+
"lexicon",
|
|
1518
|
+
"attrs"
|
|
1519
|
+
],
|
|
1520
|
+
"properties": {
|
|
1521
|
+
"id": {
|
|
1522
|
+
"type": "string",
|
|
1523
|
+
"description": "A node id of the composed graph, or, for a policy statement or an inline block, that id with `#<attribute path>`."
|
|
1524
|
+
},
|
|
1525
|
+
"label": {
|
|
1526
|
+
"type": "string",
|
|
1527
|
+
"description": "The neutral label (`Role`, `Bucket`, `Statement`, `IngressRule`)."
|
|
1528
|
+
},
|
|
1529
|
+
"irId": {
|
|
1530
|
+
"type": "string",
|
|
1531
|
+
"description": "The composed graph node this view node is, or sits inside."
|
|
1532
|
+
},
|
|
1533
|
+
"lexicon": {
|
|
1534
|
+
"type": "string"
|
|
1535
|
+
},
|
|
1536
|
+
"attrs": {
|
|
1537
|
+
"type": "object"
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
},
|
|
1542
|
+
"edges": {
|
|
1543
|
+
"type": "array",
|
|
1544
|
+
"items": {
|
|
1545
|
+
"type": "object",
|
|
1546
|
+
"required": [
|
|
1547
|
+
"from",
|
|
1548
|
+
"to",
|
|
1549
|
+
"name",
|
|
1550
|
+
"hops"
|
|
1551
|
+
],
|
|
1552
|
+
"properties": {
|
|
1553
|
+
"from": {
|
|
1554
|
+
"type": "string"
|
|
1555
|
+
},
|
|
1556
|
+
"to": {
|
|
1557
|
+
"type": "string"
|
|
1558
|
+
},
|
|
1559
|
+
"name": {
|
|
1560
|
+
"type": "string",
|
|
1561
|
+
"description": "The view edge's name (`subnet`, `statement`, `resource`, `attachedTo`)."
|
|
1562
|
+
},
|
|
1563
|
+
"hops": {
|
|
1564
|
+
"type": "array",
|
|
1565
|
+
"description": "The graph references the edge stands for, in walk order from `from`, each in the reference's own direction.",
|
|
1566
|
+
"items": {
|
|
1567
|
+
"type": "object",
|
|
1568
|
+
"required": [
|
|
1569
|
+
"from",
|
|
1570
|
+
"to",
|
|
1571
|
+
"edge"
|
|
1572
|
+
],
|
|
1573
|
+
"properties": {
|
|
1574
|
+
"from": {
|
|
1575
|
+
"type": "string"
|
|
1576
|
+
},
|
|
1577
|
+
"fromAttr": {
|
|
1578
|
+
"type": "string"
|
|
1579
|
+
},
|
|
1580
|
+
"to": {
|
|
1581
|
+
"type": "string"
|
|
1582
|
+
},
|
|
1583
|
+
"toAttr": {
|
|
1584
|
+
"type": "string"
|
|
1585
|
+
},
|
|
1586
|
+
"edge": {
|
|
1587
|
+
"type": "string"
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
}
|
|
1591
|
+
}
|
|
1592
|
+
}
|
|
1593
|
+
}
|
|
1594
|
+
},
|
|
1595
|
+
"unresolved": {
|
|
1596
|
+
"type": "array",
|
|
1597
|
+
"description": "ARN strings naming a role, bucket or table that the member declares nothing of. `chant workspace search` resolves them by name over every member's view, so a policy in one member reaches a bucket in another.",
|
|
1598
|
+
"items": {
|
|
1599
|
+
"type": "object",
|
|
1600
|
+
"required": [
|
|
1601
|
+
"from",
|
|
1602
|
+
"fromAttr",
|
|
1603
|
+
"edge",
|
|
1604
|
+
"value"
|
|
1605
|
+
],
|
|
1606
|
+
"properties": {
|
|
1607
|
+
"from": {
|
|
1608
|
+
"type": "string"
|
|
1609
|
+
},
|
|
1610
|
+
"fromAttr": {
|
|
1611
|
+
"type": "string"
|
|
1612
|
+
},
|
|
1613
|
+
"edge": {
|
|
1614
|
+
"type": "string"
|
|
1615
|
+
},
|
|
1616
|
+
"value": {
|
|
1617
|
+
"type": "string"
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
}
|
|
1441
1623
|
}
|
|
1442
1624
|
}
|
|
1443
1625
|
}
|
|
@@ -71,14 +71,26 @@ describe("identity.attribution", () => {
|
|
|
71
71
|
expect(decl({ attribution: "identified", gates: { ship: { class: "operator" }, rollback: {} } }).identity).toEqual({
|
|
72
72
|
attribution: "identified",
|
|
73
73
|
gates: {
|
|
74
|
-
ship: { gate: "ship", class: "operator", pointer: "/identity/gates/ship" },
|
|
75
|
-
rollback: { gate: "rollback", class: null, pointer: "/identity/gates/rollback" },
|
|
74
|
+
ship: { gate: "ship", class: "operator", quorum: null, pointer: "/identity/gates/ship" },
|
|
75
|
+
rollback: { gate: "rollback", class: null, quorum: null, pointer: "/identity/gates/rollback" },
|
|
76
76
|
},
|
|
77
77
|
});
|
|
78
78
|
expect(() => decl({ attribution: "verified" })).toThrow();
|
|
79
79
|
expect(() => decl({ gates: { ship: { by: "x" } } })).toThrow();
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
+
test("a gate entry takes a quorum beside its class (#4324)", () => {
|
|
83
|
+
const rules = [{ targets: ["prod-*"], count: 2, roles: ["platform"] }, { count: 1 }];
|
|
84
|
+
const gates = decl({ gates: { ship: { class: "operator", quorum: { count: 2 } }, deploy: { quorum: rules } } }).identity!.gates;
|
|
85
|
+
expect(gates.ship).toEqual({ gate: "ship", class: "operator", quorum: { count: 2 }, pointer: "/identity/gates/ship" });
|
|
86
|
+
expect(gates.deploy!.quorum).toEqual(rules);
|
|
87
|
+
// The schema refuses a malformed rule, and the reader refuses notAuthor, which an Op gate can't judge.
|
|
88
|
+
expect(() => decl({ gates: { ship: { quorum: { count: 0 } } } })).toThrow();
|
|
89
|
+
expect(() => decl({ gates: { ship: { quorum: [] } } })).toThrow();
|
|
90
|
+
expect(() => decl({ gates: { ship: { quorum: { count: 1, by: "x" } } } })).toThrow();
|
|
91
|
+
expect(() => decl({ gates: { ship: { quorum: { count: 1, notAuthor: true } } } })).toThrow(/identity\.gates\.ship\.quorum\.notAuthor is not read here/);
|
|
92
|
+
});
|
|
93
|
+
|
|
82
94
|
test("identified refuses a bare name and takes a forge identity or a signer", () => {
|
|
83
95
|
const source = { declaration: decl({ attribution: "identified" }), policy: policyWith([{ principal: "dana@example.test", key: "ssh-ed25519 AAAA" }]) };
|
|
84
96
|
expect(() => refuseUnidentified(source, ["github:alice", "dana@example.test"], "--by")).not.toThrow();
|
package/src/workspace/intent.ts
CHANGED
|
@@ -66,6 +66,7 @@ import { isGeneratedPath } from "./generated-files";
|
|
|
66
66
|
import { entityDecisions, hasTrailer, readCommitJoins, runCommitJoins, type CommitJoins, type IntentCommit, type JoinedEntity, type PluginFinding } from "./intent-joins";
|
|
67
67
|
import { loadKindRegistry } from "./kinds";
|
|
68
68
|
import { resolveLinks, type LinkTableRow } from "./links";
|
|
69
|
+
import { readKindLinks } from "./kind-link-readers";
|
|
69
70
|
import { sourceMemberHandles } from "./member-handles";
|
|
70
71
|
import { constraintCovers, isWorkspacePath, memberHolding } from "./record-assets";
|
|
71
72
|
import type { DecidedIn } from "./record-decided";
|
|
@@ -78,6 +79,7 @@ import { memberDirOnDisk, memberSymbolResolvers, type SymbolPluginLoader } from
|
|
|
78
79
|
import { resolveSymbol, symbolResolverFor, type SymbolResolver } from "./symbols";
|
|
79
80
|
import { readTrailerJoins, type CommitTrailerJoins } from "./trailer-joins";
|
|
80
81
|
import { buildTrace, type IntentTrace } from "./intent-trace";
|
|
82
|
+
import { compareDecisionRank, type WhyRelevance } from "./decision-rank";
|
|
81
83
|
import { joinPath, skippedDir, workingTree, type WorkspaceTree } from "./tree";
|
|
82
84
|
import { activeAttestors, type ProvenanceLevel } from "./trust/attestor";
|
|
83
85
|
import { commitProvenance, policyAtBase, resolveBase } from "./trust/provenance";
|
|
@@ -524,8 +526,7 @@ export interface WhySpan {
|
|
|
524
526
|
via?: string[];
|
|
525
527
|
}
|
|
526
528
|
|
|
527
|
-
|
|
528
|
-
export type WhyRelevance = "carried" | "path" | "contract" | "issue" | "member" | "related";
|
|
529
|
+
export type { WhyRelevance };
|
|
529
530
|
|
|
530
531
|
export interface WhyDecision {
|
|
531
532
|
decision: string;
|
|
@@ -1854,7 +1855,7 @@ async function walk(query: IntentQuery, head: Head): Promise<IntentResult> {
|
|
|
1854
1855
|
atRevision: located.at !== null,
|
|
1855
1856
|
...(query.loadLexicon ? { load: query.loadLexicon as unknown as import("./lexicon-outputs").OutputsPluginLoader } : {}),
|
|
1856
1857
|
});
|
|
1857
|
-
rows = resolveLinks(declaration, sourceMemberHandles(declaration, located.tree, groups, kindsRegistry, lexiconOutputs)).filter((r) => r.origin === "declared");
|
|
1858
|
+
rows = resolveLinks(declaration, sourceMemberHandles(declaration, located.tree, groups, kindsRegistry, lexiconOutputs), undefined, readKindLinks(declaration, located.tree, kindsRegistry)).filter((r) => r.origin === "declared");
|
|
1858
1859
|
} catch (err) {
|
|
1859
1860
|
if (!(err instanceof WorkspaceReadError)) throw err;
|
|
1860
1861
|
}
|
|
@@ -2080,7 +2081,6 @@ async function walk(query: IntentQuery, head: Head): Promise<IntentResult> {
|
|
|
2080
2081
|
// The decisions, most relevant first.
|
|
2081
2082
|
const decisionNodes = [...nodes.values()].filter((n): n is DecisionNode => n.kind === "decision");
|
|
2082
2083
|
const ownLines = (d: DecisionNode) => who.filter((w) => w.sha !== null && ownWork(joined.get(w.sha) ?? { contracts: [], authorship: [], decisions: [], carries: [] }, d)).length;
|
|
2083
|
-
const ORDER: WhyRelevance[] = ["carried", "path", "contract", "issue", "member", "related"];
|
|
2084
2084
|
const ranked = decisionNodes.map((d) => {
|
|
2085
2085
|
const lines = ownLines(d);
|
|
2086
2086
|
const carried = lines > 0 || (fileLines === null && touched.some((t) => ownWork(joined.get(t.sha) ?? { contracts: [], authorship: [], decisions: [], carries: [] }, d)));
|
|
@@ -2090,16 +2090,8 @@ async function walk(query: IntentQuery, head: Head): Promise<IntentResult> {
|
|
|
2090
2090
|
const specificity = Math.max(0, ...d.constrains.filter((c) => c.granularity === "path").map((c) => c.entry.length));
|
|
2091
2091
|
return { d, entry: { decision: d.id, relevance, current: d.supersededBy === null, closed: d.closed, lines } satisfies WhyDecision, specificity };
|
|
2092
2092
|
});
|
|
2093
|
-
ranked.
|
|
2094
|
-
|
|
2095
|
-
Number(b.entry.current) - Number(a.entry.current) ||
|
|
2096
|
-
ORDER.indexOf(a.entry.relevance) - ORDER.indexOf(b.entry.relevance) ||
|
|
2097
|
-
b.entry.lines - a.entry.lines ||
|
|
2098
|
-
Number(b.entry.closed) - Number(a.entry.closed) ||
|
|
2099
|
-
b.specificity - a.specificity ||
|
|
2100
|
-
(b.d.decidedIn?.date ?? "").localeCompare(a.d.decidedIn?.date ?? "") ||
|
|
2101
|
-
a.d.id.localeCompare(b.d.id),
|
|
2102
|
-
);
|
|
2093
|
+
const key = (r: (typeof ranked)[number]) => ({ ...r.entry, id: r.d.id, specificity: r.specificity, decidedOn: r.d.decidedIn?.date ?? null });
|
|
2094
|
+
ranked.sort((a, b) => compareDecisionRank(key(a), key(b)));
|
|
2103
2095
|
const decisions = ranked.map((r) => r.entry);
|
|
2104
2096
|
|
|
2105
2097
|
// The runs that wrote the current lines, most lines first; for a directory, every run in the walk.
|
|
@@ -19,12 +19,24 @@
|
|
|
19
19
|
* `resolveLinks` (`./links.ts`) resolves the links beside the declared ones,
|
|
20
20
|
* with origin `kind-reader`; WSP093 and WSP094 name the reader's file and line,
|
|
21
21
|
* and WSP099 reports the gaps.
|
|
22
|
+
*
|
|
23
|
+
* A migration directory's reader (#4400) lists its migrations in order, in
|
|
24
|
+
* {@link KindLinkRead.migrations}, and returns no links: what the migrations
|
|
25
|
+
* produce comes from a replay.
|
|
26
|
+
*
|
|
27
|
+
* A reader may also return outputs (#3935): names the member's files state,
|
|
28
|
+
* which other members link to. A dbt project's models are outputs, read the
|
|
29
|
+
* same way as its sources. `resolveLinks` adds them to the member's handles
|
|
30
|
+
* (`withReaderOutputs`), so a link to one resolves, and goes missing when the
|
|
31
|
+
* file that states it is gone.
|
|
22
32
|
*/
|
|
23
33
|
|
|
24
34
|
import type { Declaration, Member } from "./declaration";
|
|
25
35
|
import { resolveMemberFields, type FieldValue, type KindLinkReaderName, type KindRegistry } from "./kinds";
|
|
26
36
|
import type { WorkspaceTree } from "./tree";
|
|
27
37
|
import { readDbtProject } from "./dbt-project-reader";
|
|
38
|
+
import { readClickHouseMigrationsDir, readGolangMigrateDir, readGooseDir } from "./migration-dirs";
|
|
39
|
+
import { readFlywayDir } from "./flyway-dir";
|
|
28
40
|
|
|
29
41
|
/** One link a reader found in the member's files. */
|
|
30
42
|
export interface KindReadLink {
|
|
@@ -54,18 +66,67 @@ export interface KindReadGap {
|
|
|
54
66
|
file: string;
|
|
55
67
|
line: number;
|
|
56
68
|
message: string;
|
|
69
|
+
/**
|
|
70
|
+
* True when the gap leaves an output out of {@link KindLinkRead.outputs}
|
|
71
|
+
* (#3935): a link to a name the member does not list is then unresolved,
|
|
72
|
+
* not missing.
|
|
73
|
+
*/
|
|
74
|
+
outputs?: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** One output a reader found in the member's files: a name other members may link to. */
|
|
78
|
+
export interface KindReadOutput {
|
|
79
|
+
name: string;
|
|
80
|
+
/** The file that states it, relative to the workspace root. */
|
|
81
|
+
file: string;
|
|
82
|
+
/** Its line, from 1. */
|
|
83
|
+
line: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* One migration a migration-directory reader found (#4400), in the order the
|
|
88
|
+
* tool applies it. The reader lists files and never runs the tool, so the
|
|
89
|
+
* schema the migrations produce comes from a replay, not from here.
|
|
90
|
+
*/
|
|
91
|
+
export interface KindReadMigration {
|
|
92
|
+
/** 1-based position in the order the tool applies the migrations. */
|
|
93
|
+
position: number;
|
|
94
|
+
/** The version as the file name writes it, such as `00002`, `20240101120000` or `1.2`. */
|
|
95
|
+
version: string;
|
|
96
|
+
name: string;
|
|
97
|
+
/** `versioned` runs once; `repeatable` runs again when its checksum changes (Flyway); `baseline` and `undo` are Flyway's B and U files. */
|
|
98
|
+
type: "versioned" | "repeatable" | "baseline" | "undo";
|
|
99
|
+
/** The file with the up statements, relative to the workspace root. */
|
|
100
|
+
file: string;
|
|
101
|
+
/** The line the up statements start on, from 1. */
|
|
102
|
+
line: number;
|
|
103
|
+
/** The file that undoes it, or true when the same file does (goose), or false when none does. */
|
|
104
|
+
down: string | boolean;
|
|
105
|
+
/** The SQL dialect the migration is written in: the member's `dialect` field, or what the directory's own configuration names. */
|
|
106
|
+
dialect: string;
|
|
107
|
+
/** False when the file asks to run outside a transaction (`-- +goose NO TRANSACTION`). */
|
|
108
|
+
transaction?: boolean;
|
|
57
109
|
}
|
|
58
110
|
|
|
59
111
|
export interface KindLinkRead {
|
|
60
|
-
/** The reader that ran. */
|
|
61
|
-
reader: KindLinkReaderName
|
|
112
|
+
/** The reader that ran: a kind's reader, or `lexicon <name>` for links a member's lexicon read from its declarations (#4397). */
|
|
113
|
+
reader: KindLinkReaderName | `lexicon${string}`;
|
|
62
114
|
links: KindReadLink[];
|
|
63
115
|
gaps: KindReadGap[];
|
|
116
|
+
/**
|
|
117
|
+
* The outputs the member exposes that its files state (#3935), beside the
|
|
118
|
+
* ones its kind lists. `resolveLinks` adds them to the member's handles, so
|
|
119
|
+
* another member can link to them. A gap flagged `outputs` makes the list
|
|
120
|
+
* incomplete.
|
|
121
|
+
*/
|
|
122
|
+
outputs?: KindReadOutput[];
|
|
64
123
|
/**
|
|
65
124
|
* The member field that names the producer, for messages that ask the
|
|
66
125
|
* author to set it when the files don't say (`sqlMember` for dbt).
|
|
67
126
|
*/
|
|
68
127
|
producerField?: string;
|
|
128
|
+
/** The migrations of a migration directory (#4400), in the order they apply; unset for other readers. */
|
|
129
|
+
migrations?: KindReadMigration[];
|
|
69
130
|
}
|
|
70
131
|
|
|
71
132
|
/** What a reader gets: the member, its directory and resolved fields, and the tree read. */
|
|
@@ -83,6 +144,10 @@ export type KindLinkReader = (input: KindReaderInput) => KindLinkRead;
|
|
|
83
144
|
/** Every reader chant ships, by the name a kinds file uses. */
|
|
84
145
|
export const LINK_READERS: Record<KindLinkReaderName, KindLinkReader> = {
|
|
85
146
|
"dbt-project": readDbtProject,
|
|
147
|
+
"goose-dir": readGooseDir,
|
|
148
|
+
"golang-migrate-dir": readGolangMigrateDir,
|
|
149
|
+
"clickhouse-migrations-dir": readClickHouseMigrationsDir,
|
|
150
|
+
"flyway-dir": readFlywayDir,
|
|
86
151
|
};
|
|
87
152
|
|
|
88
153
|
/**
|
|
@@ -102,7 +167,7 @@ export function readKindLinks(declaration: Declaration, tree: WorkspaceTree, kin
|
|
|
102
167
|
try {
|
|
103
168
|
out.set(m.name, LINK_READERS[kind.reader]({ member: m, dir, fields, tree }));
|
|
104
169
|
} catch (err) {
|
|
105
|
-
out.set(m.name, { reader: kind.reader, links: [], gaps: [{ file: dir || ".", line: 1, message: `the ${kind.reader} reader failed: ${(err as Error).message}
|
|
170
|
+
out.set(m.name, { reader: kind.reader, links: [], gaps: [{ file: dir || ".", line: 1, message: `the ${kind.reader} reader failed: ${(err as Error).message}`, outputs: true }] });
|
|
106
171
|
}
|
|
107
172
|
}
|
|
108
173
|
return out;
|
|
@@ -65,4 +65,32 @@ describe("terraform and choudoufu members through the terraform lexicon (#2874)"
|
|
|
65
65
|
},
|
|
66
66
|
TIMEOUT,
|
|
67
67
|
);
|
|
68
|
+
|
|
69
|
+
// behold#919: the reader project sets `graph.lint: "report"`, so a member
|
|
70
|
+
// whose HCL fails one of the lexicon's error rules is composed, with the
|
|
71
|
+
// finding on its meta.lint. Before, it failed with command-failed.
|
|
72
|
+
test(
|
|
73
|
+
"a member with a lint error is composed, the finding on its meta.lint",
|
|
74
|
+
async () => {
|
|
75
|
+
const root = repo({
|
|
76
|
+
"chant.workspace.json": declaration([{ name: "db", dir: "estates/db", kind: "terraform" }], { pins: [{ package: LEXICON, version: VERSION }] }),
|
|
77
|
+
"estates/db/main.tf":
|
|
78
|
+
'resource "aws_db_instance" "orders" {\n identifier = "orders"\n engine = "postgres"\n instance_class = "db.t3.micro"\n allocated_storage = 20\n storage_encrypted = false\n}\n',
|
|
79
|
+
".gitignore": "node_modules\n",
|
|
80
|
+
});
|
|
81
|
+
symlinkSync(join(REPO, "node_modules"), join(root, "node_modules"), "dir");
|
|
82
|
+
|
|
83
|
+
const { doc, failed } = await workspaceGraph({ cwd: root });
|
|
84
|
+
const g = result(doc);
|
|
85
|
+
expectValid(g);
|
|
86
|
+
expect(g.members.map((m) => [m.name, m.status, m.reason?.code ?? null])).toEqual([["db", "composed", null]]);
|
|
87
|
+
expect(failed).toBe(false);
|
|
88
|
+
expect(g.nodes.map((n) => n.id)).toContain("db/db/aws_db_instance.orders");
|
|
89
|
+
const lint = (g.members[0] as { meta?: { lint?: { errors: number; findings: { ruleId: string; severity: string; entity?: string }[] } } }).meta?.lint;
|
|
90
|
+
expect(lint?.errors).toBeGreaterThanOrEqual(1);
|
|
91
|
+
// The finding names its entity, the id the member IR gives the node (before composition prefixes it).
|
|
92
|
+
expect(lint?.findings).toContainEqual(expect.objectContaining({ ruleId: "TF033", severity: "error", entity: "db/aws_db_instance.orders" }));
|
|
93
|
+
},
|
|
94
|
+
TIMEOUT,
|
|
95
|
+
);
|
|
68
96
|
});
|
|
@@ -80,7 +80,7 @@ describe("workspace graph reads a package kind with a graph block (#2874)", () =
|
|
|
80
80
|
]);
|
|
81
81
|
expect(g.nodes.map((n) => n.id)).toEqual(["net/root/Thing"]);
|
|
82
82
|
const attrs = g.nodes[0].attrs as { found: boolean; pwd: string; argv: string; config: Record<string, unknown> };
|
|
83
|
-
expect(attrs.config).toEqual({ lexicons: ["fake"], fake: { moduleRoot: root, roots: { net: { dir: `${root}/estates/net` } } } });
|
|
83
|
+
expect(attrs.config).toEqual({ lexicons: ["fake"], fake: { moduleRoot: root, roots: { net: { dir: `${root}/estates/net` } } }, graph: { lint: "report" } });
|
|
84
84
|
expect(attrs.found).toBe(true);
|
|
85
85
|
// A reader project declares no environments, so --env stays with the chant members.
|
|
86
86
|
expect(attrs.argv).toBe("graph . --format ir");
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
* (`substituteGraphConfig`). The terraform lexicon's config names one root
|
|
14
14
|
* after the member, at the member's directory, with `moduleRoot` at the
|
|
15
15
|
* workspace root, so a member that calls `../modules/x` keeps its modules.
|
|
16
|
+
* - It also sets `graph.lint: "report"` (behold#919), so a member whose
|
|
17
|
+
* source fails the lexicon's lint is still composed, with the findings on
|
|
18
|
+
* its `meta.lint`, instead of failing with `command-failed`.
|
|
16
19
|
* - `node_modules` links to the `node_modules` directory holding the lexicon
|
|
17
20
|
* package, found from the workspace root as the kind's pin was. The lexicon
|
|
18
21
|
* chant loads is then the one the declaration pins.
|
|
@@ -95,7 +98,10 @@ export function prepareKindReaders(plan: MemberPlan, root: string): PreparedRead
|
|
|
95
98
|
const project = join(scratch, unit.id);
|
|
96
99
|
mkdirSync(project, { recursive: true });
|
|
97
100
|
const config = substituteGraphConfig(unit.reader.config, { member: unit.member, dir: unit.abs, workspace: root });
|
|
98
|
-
|
|
101
|
+
// `graph.lint: "report"` (behold#919): chant did not author a reader
|
|
102
|
+
// member's source, so a lint error there is a finding about it, carried
|
|
103
|
+
// on the member's `meta.lint`, not a reason to leave it out of the graph.
|
|
104
|
+
writeFileSync(join(project, "chant.config.json"), `${JSON.stringify({ lexicons: [unit.reader.lexicon], [unit.reader.lexicon]: config, graph: { lint: "report" } }, null, 2)}\n`);
|
|
99
105
|
symlinkSync(found.modules, join(project, "node_modules"), "dir");
|
|
100
106
|
unit.abs = project;
|
|
101
107
|
return true;
|
|
@@ -61,10 +61,10 @@ function pkg(name: string, version: string, kinds: unknown[] | null, extra: Reco
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
describe("the built-in kinds (#2535)", () => {
|
|
64
|
-
test("are chant, workspace, design and other, and the group kind examples", () => {
|
|
65
|
-
expect(BUILTIN_KINDS.map((k) => `${k.name}:${k.shape}`)).toEqual(["chant:member", "workspace:member", "other:member", "design:member", "examples:group"]);
|
|
64
|
+
test("are chant, workspace, repo, design and other, and the group kind examples", () => {
|
|
65
|
+
expect(BUILTIN_KINDS.map((k) => `${k.name}:${k.shape}`)).toEqual(["chant:member", "workspace:member", "repo:member", "other:member", "design:member", "examples:group"]);
|
|
66
66
|
const registry = builtinKindRegistry();
|
|
67
|
-
expect(registry.names()).toEqual(["chant", "design", "other", "workspace"]);
|
|
67
|
+
expect(registry.names()).toEqual(["chant", "design", "other", "repo", "workspace"]);
|
|
68
68
|
expect(registry.get(EXAMPLES_KIND)?.shape).toBe("group");
|
|
69
69
|
});
|
|
70
70
|
|
|
@@ -72,8 +72,13 @@ describe("the built-in kinds (#2535)", () => {
|
|
|
72
72
|
const entry = declarationSchema.$defs.entry;
|
|
73
73
|
expect(entry.if.properties.kind.const).toBe(EXAMPLES_KIND);
|
|
74
74
|
expect(declarationSchema.$defs.group.properties.kind.const).toBe(EXAMPLES_KIND);
|
|
75
|
-
|
|
76
|
-
expect(
|
|
75
|
+
const [other, repo] = declarationSchema.$defs.member.allOf;
|
|
76
|
+
expect(other.if.properties.kind.const).toBe("other");
|
|
77
|
+
expect(other.then.required).toEqual(["because"]);
|
|
78
|
+
// A repo member (#3168) has repo and no dir; every other member has dir and no repo.
|
|
79
|
+
expect(repo.if.properties.kind.const).toBe("repo");
|
|
80
|
+
expect(repo.then.required).toEqual(["repo"]);
|
|
81
|
+
expect(repo.else?.required).toEqual(["dir"]);
|
|
77
82
|
});
|
|
78
83
|
|
|
79
84
|
test("a registry refuses a name twice", () => {
|
|
@@ -203,7 +208,7 @@ describe("loadKindRegistry: kinds from the pins", () => {
|
|
|
203
208
|
const { registry, problems } = loadKindRegistry([{ package: "@acme/chant-lexicon-tf", version: "1.2.3", path: null }], root);
|
|
204
209
|
expect(problems).toEqual([]);
|
|
205
210
|
expect(registry.get("terraform")).toMatchObject({ source: "@acme/chant-lexicon-tf", precedence: 400 });
|
|
206
|
-
expect(registry.names()).toEqual(["chant", "design", "other", "terraform", "workspace"]);
|
|
211
|
+
expect(registry.names()).toEqual(["chant", "design", "other", "repo", "terraform", "workspace"]);
|
|
207
212
|
expect(existsSync(join(root, "node_modules/@acme/chant-lexicon-tf/IMPORTED"))).toBe(false);
|
|
208
213
|
expect((globalThis as { __chantKindsImported?: boolean }).__chantKindsImported).toBeUndefined();
|
|
209
214
|
});
|
|
@@ -223,7 +228,7 @@ describe("loadKindRegistry: kinds from the pins", () => {
|
|
|
223
228
|
],
|
|
224
229
|
root,
|
|
225
230
|
);
|
|
226
|
-
expect(registry.names()).toEqual(["chant", "design", "other", "workspace"]);
|
|
231
|
+
expect(registry.names()).toEqual(["chant", "design", "other", "repo", "workspace"]);
|
|
227
232
|
expect(problems).toEqual([
|
|
228
233
|
{ pin: 1, message: "pinned package absent is not installed; install it to read the kinds it supplies" },
|
|
229
234
|
{ pin: 2, message: "tf-kinds is pinned at 1.0.0, and 2.0.0 is installed" },
|