@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/graph-ir.ts
CHANGED
|
@@ -5,9 +5,12 @@ import { type Declarable, isDeclarable } from "./declarable";
|
|
|
5
5
|
import { isLexiconOutput, type LexiconOutput } from "./lexicon-output";
|
|
6
6
|
import { getProvenance } from "./provenance";
|
|
7
7
|
import { INTRINSIC_MARKER } from "./intrinsic";
|
|
8
|
+
import { subTemplateRefs } from "./graph-sub-template";
|
|
8
9
|
import type { ResourceMetadata } from "./lexicon";
|
|
9
10
|
import type { UnobservedEntity } from "./observation";
|
|
10
11
|
|
|
12
|
+
export { subTemplateRefs };
|
|
13
|
+
|
|
11
14
|
/**
|
|
12
15
|
* Graph IR — the engine-neutral, lint-gated representation of a project's
|
|
13
16
|
* resolved infrastructure graph. Painters (mermaid, graphviz, custom SVG) and
|
|
@@ -35,6 +38,21 @@ export interface AttrRefEnvelope {
|
|
|
35
38
|
$ref: string;
|
|
36
39
|
}
|
|
37
40
|
|
|
41
|
+
/**
|
|
42
|
+
* A CloudFormation `Fn::Sub` in an attribute projection (#4373), in place of
|
|
43
|
+
* `{ $intrinsic: true }`. `$sub` is the template exactly as it serializes, so
|
|
44
|
+
* `${assets.Arn}/*` names the producer and attribute a reader would otherwise
|
|
45
|
+
* have to guess. `$vars` is the two-argument form's variable map, each value
|
|
46
|
+
* projected like any other attr. Every `${Name}` or `${Name.Attr}` in the
|
|
47
|
+
* template that names a node, and every reference in `$vars`, is also an edge.
|
|
48
|
+
* `${!Literal}` (CloudFormation's escape), pseudo-parameters (`${AWS::Region}`)
|
|
49
|
+
* and names `$vars` binds are not.
|
|
50
|
+
*/
|
|
51
|
+
export interface SubEnvelope {
|
|
52
|
+
$sub: string;
|
|
53
|
+
$vars?: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
|
|
38
56
|
/** One resource in the graph. */
|
|
39
57
|
export interface IRNode {
|
|
40
58
|
/** Logical name (the export name, or composite-expanded name). */
|
|
@@ -192,6 +210,33 @@ export interface LexiconWorkspaceOutputs {
|
|
|
192
210
|
gaps?: string[];
|
|
193
211
|
}
|
|
194
212
|
|
|
213
|
+
/**
|
|
214
|
+
* One link a lexicon reads from its own declarations (#4397): an output of
|
|
215
|
+
* another member that a declaration depends on, such as a table an otel
|
|
216
|
+
* `clickhouse` exporter writes.
|
|
217
|
+
*/
|
|
218
|
+
export interface LexiconWorkspaceLink {
|
|
219
|
+
/** The producer's output the declaration reads or writes: `default.otel_logs`, `default.otel_logs.Body`. */
|
|
220
|
+
output: string;
|
|
221
|
+
/**
|
|
222
|
+
* The output that picks the producer when `member` is unset; unset, the
|
|
223
|
+
* output itself. A column is anchored on its table, so a dropped column is
|
|
224
|
+
* missing from the member that still has the table.
|
|
225
|
+
*/
|
|
226
|
+
anchor?: string;
|
|
227
|
+
/** The producer, when the declaration names it. Unset, the one member exposing `anchor`. */
|
|
228
|
+
member?: string;
|
|
229
|
+
/** The entity key that states the link, for the finding's file and line. */
|
|
230
|
+
entity: string;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** What a lexicon's `workspaceLinks` hook returns (#4397). */
|
|
234
|
+
export interface LexiconWorkspaceLinks {
|
|
235
|
+
links: LexiconWorkspaceLink[];
|
|
236
|
+
/** Places the hook could not read without the environment, one line each. Their links are left out. */
|
|
237
|
+
gaps?: string[];
|
|
238
|
+
}
|
|
239
|
+
|
|
195
240
|
/** What a lexicon's `graphEdges` hook returns (#3910). */
|
|
196
241
|
export interface LexiconGraphEdges {
|
|
197
242
|
references: LexiconGraphReference[];
|
|
@@ -465,6 +510,13 @@ export interface GraphIR {
|
|
|
465
510
|
* the passes produced, not a list maintained by hand.
|
|
466
511
|
*/
|
|
467
512
|
derivedAttrs?: Record<string, string[]>;
|
|
513
|
+
/**
|
|
514
|
+
* With `chant graph --format ir --capability-view` (#4378): the
|
|
515
|
+
* lexicon-neutral view capability rules read, built by this chant through
|
|
516
|
+
* the project's own lexicon mappings and adapters. A `ViewDocument`
|
|
517
|
+
* (`capabilities/view.ts`). Absent unless asked for.
|
|
518
|
+
*/
|
|
519
|
+
capabilityView?: unknown;
|
|
468
520
|
}
|
|
469
521
|
|
|
470
522
|
/** A node is anything that serializes to a resource — not a property or output. */
|
|
@@ -499,6 +551,80 @@ function refIntrinsicTarget(value: unknown): string | undefined {
|
|
|
499
551
|
return undefined;
|
|
500
552
|
}
|
|
501
553
|
|
|
554
|
+
/** A CloudFormation `Fn::Sub`: its template, and the variable map of the two-argument form. */
|
|
555
|
+
interface SubForm {
|
|
556
|
+
template: string;
|
|
557
|
+
vars?: Record<string, unknown>;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/** Read `{ "Fn::Sub": "..." }` or `{ "Fn::Sub": ["...", { ... }] }`, or undefined. */
|
|
561
|
+
function subForm(json: unknown): SubForm | undefined {
|
|
562
|
+
if (json === null || typeof json !== "object" || Array.isArray(json)) return undefined;
|
|
563
|
+
const keys = Object.keys(json);
|
|
564
|
+
if (keys.length !== 1 || keys[0] !== "Fn::Sub") return undefined;
|
|
565
|
+
const arg = (json as Record<string, unknown>)["Fn::Sub"];
|
|
566
|
+
if (typeof arg === "string") return { template: arg };
|
|
567
|
+
if (Array.isArray(arg) && typeof arg[0] === "string") {
|
|
568
|
+
const vars = arg[1];
|
|
569
|
+
return vars !== null && typeof vars === "object" && !Array.isArray(vars)
|
|
570
|
+
? { template: arg[0], vars: vars as Record<string, unknown> }
|
|
571
|
+
: { template: arg[0] };
|
|
572
|
+
}
|
|
573
|
+
return undefined;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/** The `Fn::Sub` an intrinsic serializes to (the aws `Sub` tag), or undefined. */
|
|
577
|
+
function subIntrinsicForm(value: unknown): SubForm | undefined {
|
|
578
|
+
try {
|
|
579
|
+
return subForm((value as { toJSON?: () => unknown }).toJSON?.());
|
|
580
|
+
} catch {
|
|
581
|
+
// An AttrRef inside whose logical name is not set yet: no template to read.
|
|
582
|
+
return undefined;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
/** False when an intrinsic's `toJSON()` throws (an AttrRef inside it has no logical name yet). */
|
|
587
|
+
function serializes(value: unknown): boolean {
|
|
588
|
+
try {
|
|
589
|
+
(value as { toJSON?: () => unknown }).toJSON?.();
|
|
590
|
+
return true;
|
|
591
|
+
} catch {
|
|
592
|
+
return false;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* The logical names serialized CloudFormation JSON references: `{ Ref }`,
|
|
598
|
+
* `{ "Fn::GetAtt" }` in either encoding, and a nested `Fn::Sub`. Reads a
|
|
599
|
+
* two-argument `Sub`'s variable map after `toJSON()` has turned its live
|
|
600
|
+
* references into JSON.
|
|
601
|
+
*/
|
|
602
|
+
function cfnJsonRefNames(json: unknown, out: string[]): void {
|
|
603
|
+
if (json === null || typeof json !== "object") return;
|
|
604
|
+
if (Array.isArray(json)) {
|
|
605
|
+
for (const item of json) cfnJsonRefNames(item, out);
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
const obj = json as Record<string, unknown>;
|
|
609
|
+
if (typeof obj.Ref === "string") {
|
|
610
|
+
out.push(obj.Ref);
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
const getAtt = obj["Fn::GetAtt"];
|
|
614
|
+
if (getAtt !== undefined) {
|
|
615
|
+
const id = Array.isArray(getAtt) ? getAtt[0] : typeof getAtt === "string" ? getAtt.split(".")[0] : undefined;
|
|
616
|
+
if (typeof id === "string") out.push(id);
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
const sub = subForm(obj);
|
|
620
|
+
if (sub) {
|
|
621
|
+
for (const r of subTemplateRefs(sub.template, new Set(Object.keys(sub.vars ?? {})))) out.push(r.name);
|
|
622
|
+
if (sub.vars) cfnJsonRefNames(Object.values(sub.vars), out);
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
for (const v of Object.values(obj)) cfnJsonRefNames(v, out);
|
|
626
|
+
}
|
|
627
|
+
|
|
502
628
|
/** Resolve the producer (logical name) an AttrRef points at. */
|
|
503
629
|
function refTarget(ref: AttrRef, reverse: Map<object, string>): string | undefined {
|
|
504
630
|
// Nested refs (under `props`) aren't assigned a logical name by resolveAttrRefs,
|
|
@@ -545,6 +671,9 @@ function project(value: unknown, seen: Set<unknown>, reverse: Map<object, string
|
|
|
545
671
|
// Ref to a non-node) stay opaque.
|
|
546
672
|
const to = refIntrinsicTarget(value);
|
|
547
673
|
if (to && nodeIds.has(to)) return { $ref: to } satisfies AttrRefEnvelope;
|
|
674
|
+
// A Sub keeps its template, so a reader sees which node and attribute it names (#4373).
|
|
675
|
+
const sub = subIntrinsicForm(value);
|
|
676
|
+
if (sub) return subEnvelope(sub, seen, reverse, nodeIds);
|
|
548
677
|
return { $intrinsic: true };
|
|
549
678
|
}
|
|
550
679
|
|
|
@@ -568,6 +697,14 @@ function project(value: unknown, seen: Set<unknown>, reverse: Map<object, string
|
|
|
568
697
|
return out;
|
|
569
698
|
}
|
|
570
699
|
|
|
700
|
+
// A Sub written as plain CloudFormation JSON reads the same as the `Sub` tag's.
|
|
701
|
+
const plainSub = subForm(value);
|
|
702
|
+
if (plainSub) {
|
|
703
|
+
const out = subEnvelope(plainSub, seen, reverse, nodeIds);
|
|
704
|
+
seen.delete(value);
|
|
705
|
+
return out;
|
|
706
|
+
}
|
|
707
|
+
|
|
571
708
|
const out: Record<string, unknown> = {};
|
|
572
709
|
for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
|
|
573
710
|
const p = project(v, seen, reverse, nodeIds);
|
|
@@ -577,6 +714,17 @@ function project(value: unknown, seen: Set<unknown>, reverse: Map<object, string
|
|
|
577
714
|
return out;
|
|
578
715
|
}
|
|
579
716
|
|
|
717
|
+
/** Project a {@link SubForm} into its {@link SubEnvelope}. */
|
|
718
|
+
function subEnvelope(sub: SubForm, seen: Set<unknown>, reverse: Map<object, string>, nodeIds: Set<string>): SubEnvelope {
|
|
719
|
+
if (!sub.vars) return { $sub: sub.template };
|
|
720
|
+
const vars: Record<string, unknown> = {};
|
|
721
|
+
for (const [k, v] of Object.entries(sub.vars)) {
|
|
722
|
+
const p = project(v, seen, reverse, nodeIds);
|
|
723
|
+
if (p !== undefined) vars[k] = p;
|
|
724
|
+
}
|
|
725
|
+
return { $sub: sub.template, $vars: vars };
|
|
726
|
+
}
|
|
727
|
+
|
|
580
728
|
// `references` and `stack` are the two duck-typed channels above
|
|
581
729
|
// ({@link entityReferences}, {@link entityStack}). They are metadata about the
|
|
582
730
|
// entity's place in the graph, not declared configuration, and both are read
|
|
@@ -645,6 +793,9 @@ function collectEdges(
|
|
|
645
793
|
});
|
|
646
794
|
}
|
|
647
795
|
const seen = new Set<unknown>();
|
|
796
|
+
const edgeTo = (to: string, viaAttr: string): void => {
|
|
797
|
+
if (to !== from && nodeIds.has(to)) edges.push({ from, to, kind: "ref", viaAttr });
|
|
798
|
+
};
|
|
648
799
|
const visit = (value: unknown, viaAttr: string): void => {
|
|
649
800
|
if (value === null || typeof value !== "object") return;
|
|
650
801
|
if (isAttrRefLike(value)) {
|
|
@@ -659,8 +810,31 @@ function collectEdges(
|
|
|
659
810
|
// — resolve it to an edge instead of dropping it as an opaque intrinsic (#513).
|
|
660
811
|
const to = refIntrinsicTarget(value);
|
|
661
812
|
if (to && to !== from && nodeIds.has(to)) edges.push({ from, to, kind: "ref", viaAttr });
|
|
813
|
+
// A Sub's interpolations are references too (#4373): each `${Name}` or
|
|
814
|
+
// `${Name.Attr}` naming a node, and each reference in a variable map.
|
|
815
|
+
const sub = subIntrinsicForm(value);
|
|
816
|
+
if (sub) {
|
|
817
|
+
const names = subTemplateRefs(sub.template, new Set(Object.keys(sub.vars ?? {}))).map((r) => r.name);
|
|
818
|
+
if (sub.vars) cfnJsonRefNames(Object.values(sub.vars), names);
|
|
819
|
+
for (const name of names) edgeTo(name, viaAttr);
|
|
820
|
+
}
|
|
821
|
+
// The live values the aws `Sub` tag interpolated. Covers an AttrRef whose
|
|
822
|
+
// logical name was not set, where `toJSON()` throws and leaves no
|
|
823
|
+
// template to read above. Any other intrinsic stays opaque.
|
|
824
|
+
const interpolated = (value as { values?: unknown }).values;
|
|
825
|
+
if (Array.isArray(interpolated) && (sub || !serializes(value))) {
|
|
826
|
+
for (const v of interpolated) visit(v, viaAttr);
|
|
827
|
+
}
|
|
662
828
|
return;
|
|
663
829
|
}
|
|
830
|
+
// A Sub written as plain CloudFormation JSON in props: the template's names
|
|
831
|
+
// here, then the variable map's live values through the walk below.
|
|
832
|
+
const plainSub = subForm(value);
|
|
833
|
+
if (plainSub) {
|
|
834
|
+
for (const r of subTemplateRefs(plainSub.template, new Set(Object.keys(plainSub.vars ?? {})))) {
|
|
835
|
+
edgeTo(r.name, viaAttr);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
664
838
|
// A whole node held in props or an enumerable field (the sql lexicon's
|
|
665
839
|
// `dependsOn`) is a reference to it: draw the edge, and do not walk its
|
|
666
840
|
// config, whose refs belong to that node's own edges (#3257). Checked
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Kept apart from ./graph-ir so ./graph-detail, which runs in the browser
|
|
2
|
+
// bundle, can read a Sub template without pulling in node:path.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The names a `Sub` template interpolates (#4373): `${Name}` and
|
|
6
|
+
* `${Name.Attr}`, in order. Skips CloudFormation's `${!Literal}` escape,
|
|
7
|
+
* pseudo-parameters (`${AWS::Region}`, anything with `::`), and names the
|
|
8
|
+
* two-argument form's variable map binds, which are not resources.
|
|
9
|
+
*/
|
|
10
|
+
export function subTemplateRefs(
|
|
11
|
+
template: string,
|
|
12
|
+
bound: ReadonlySet<string> = new Set(),
|
|
13
|
+
): Array<{ name: string; attr?: string }> {
|
|
14
|
+
const out: Array<{ name: string; attr?: string }> = [];
|
|
15
|
+
for (const match of template.matchAll(/\$\{([^}]*)\}/g)) {
|
|
16
|
+
const token = match[1].trim();
|
|
17
|
+
if (!token || token.startsWith("!") || token.includes("::") || bound.has(token)) continue;
|
|
18
|
+
const dot = token.indexOf(".");
|
|
19
|
+
out.push(dot > 0 ? { name: token.slice(0, dot), attr: token.slice(dot + 1) } : { name: token });
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { adjacencyOf, walkBreadthFirst } from "./graph-walk";
|
|
3
|
+
|
|
4
|
+
const edges = [
|
|
5
|
+
{ from: "a", to: "b" },
|
|
6
|
+
{ from: "b", to: "c" },
|
|
7
|
+
{ from: "c", to: "a" },
|
|
8
|
+
{ from: "c", to: "d" },
|
|
9
|
+
];
|
|
10
|
+
const idx = adjacencyOf(edges);
|
|
11
|
+
const out = (id: string) => (idx.out.get(id) ?? []).map((e) => ({ far: e.to, hops: [e] }));
|
|
12
|
+
|
|
13
|
+
describe("walkBreadthFirst", () => {
|
|
14
|
+
test("offers every node at its shortest depth first, and ends on a cycle", () => {
|
|
15
|
+
const first = new Map<string, number>();
|
|
16
|
+
const found = walkBreadthFirst("a", {
|
|
17
|
+
steps: out,
|
|
18
|
+
arrive: ({ id, depth }) => {
|
|
19
|
+
if (!first.has(id)) first.set(id, depth);
|
|
20
|
+
return false;
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
expect(found).toBeNull();
|
|
24
|
+
expect([...first]).toEqual([["b", 1], ["c", 2], ["a", 3], ["d", 3]]);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("stops on the first accepted arrival and returns its hops", () => {
|
|
28
|
+
const found = walkBreadthFirst("a", { steps: out, arrive: ({ id }) => id === "d" });
|
|
29
|
+
expect(found?.depth).toBe(3);
|
|
30
|
+
expect(found?.hops.map((h) => `${h.from}->${h.to}`)).toEqual(["a->b", "b->c", "c->d"]);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("min and max bound which arrivals are offered and how far it steps", () => {
|
|
34
|
+
const offered: string[] = [];
|
|
35
|
+
walkBreadthFirst("a", { steps: out, min: 2, max: 2, arrive: ({ id }) => (offered.push(id), false) });
|
|
36
|
+
expect(offered).toEqual(["c"]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("walks from several starts at once", () => {
|
|
40
|
+
const offered = new Set<string>();
|
|
41
|
+
walkBreadthFirst(["c", "b"], { steps: out, arrive: ({ id }) => (offered.add(id), false) });
|
|
42
|
+
expect([...offered].sort()).toEqual(["a", "b", "c", "d"]);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one breadth-first edge walk in core.
|
|
3
|
+
*
|
|
4
|
+
* `chant search`'s transitive edge terms (#4359) walk the graph IR, and carve's
|
|
5
|
+
* reachability (#2325) and reference-closed sets (#3909) walk a `TfGraph`. The
|
|
6
|
+
* two graphs have different node and edge shapes but the same walk: an index of
|
|
7
|
+
* each node's edges by direction, built once, and a frontier that steps along
|
|
8
|
+
* it. This module is that walk, generic over what a step carries, so neither
|
|
9
|
+
* caller keeps a traversal of its own.
|
|
10
|
+
*
|
|
11
|
+
* Pure: no IR or Terraform types, no filesystem.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** Edges grouped by the node they leave (`out`) and the node they enter (`in`). */
|
|
15
|
+
export interface Adjacency<E> {
|
|
16
|
+
out: Map<string, E[]>;
|
|
17
|
+
in: Map<string, E[]>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Index edges by both ends, once. Looking a node's edges up in here is O(1),
|
|
22
|
+
* where filtering the edge list for them is O(E) per node and O(V·E) per walk
|
|
23
|
+
* (#2325 measured 21 s against 52 ms at 6 000 nodes).
|
|
24
|
+
*/
|
|
25
|
+
export function adjacencyOf<E extends { from: string; to: string }>(edges: Iterable<E>): Adjacency<E> {
|
|
26
|
+
const idx: Adjacency<E> = { out: new Map(), in: new Map() };
|
|
27
|
+
for (const e of edges) {
|
|
28
|
+
let out = idx.out.get(e.from);
|
|
29
|
+
if (!out) idx.out.set(e.from, (out = []));
|
|
30
|
+
out.push(e);
|
|
31
|
+
let inn = idx.in.get(e.to);
|
|
32
|
+
if (!inn) idx.in.set(e.to, (inn = []));
|
|
33
|
+
inn.push(e);
|
|
34
|
+
}
|
|
35
|
+
return idx;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** One step out of a node: where it lands, and the hops (edges) it took to get there. */
|
|
39
|
+
export interface WalkStep<H> {
|
|
40
|
+
far: string;
|
|
41
|
+
hops: readonly H[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** A node reached by the walk: its id, how many steps from the start, and the hops on the way. */
|
|
45
|
+
export interface WalkArrival<H> {
|
|
46
|
+
id: string;
|
|
47
|
+
depth: number;
|
|
48
|
+
hops: H[];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface WalkOptions<H> {
|
|
52
|
+
/** The steps out of a node. The walk follows exactly these; filter here. */
|
|
53
|
+
steps: (id: string) => readonly WalkStep<H>[];
|
|
54
|
+
/** Arrivals shallower than this are walked through but not offered. Default 1. */
|
|
55
|
+
min?: number;
|
|
56
|
+
/** No step is taken from a node this deep. Default unbounded. */
|
|
57
|
+
max?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Called for each arrival at a depth of at least `min`, in breadth-first
|
|
60
|
+
* order, so a node's first arrival is at its shortest depth. A node can
|
|
61
|
+
* arrive more than once (by several edges, or again past `min` on a cycle);
|
|
62
|
+
* return true to stop the walk and return this arrival.
|
|
63
|
+
*/
|
|
64
|
+
arrive?: (arrival: WalkArrival<H>) => boolean;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Walk breadth-first from one or more start nodes (#4359, #2325).
|
|
69
|
+
*
|
|
70
|
+
* Termination on a cycle: a state is (node, depth capped at `min`). Past the
|
|
71
|
+
* minimum, arriving at a node again by a longer walk can reach nothing the
|
|
72
|
+
* first arrival could not, so it is not queued twice. The state space is
|
|
73
|
+
* finite and the walk always ends, which matters for carve: chant never runs
|
|
74
|
+
* Terraform, so a `depends_on` cycle in a malformed estate reaches it
|
|
75
|
+
* unvalidated.
|
|
76
|
+
*
|
|
77
|
+
* Returns the arrival `arrive` stopped on, or null when the walk ran out.
|
|
78
|
+
*/
|
|
79
|
+
export function walkBreadthFirst<H>(start: string | Iterable<string>, opts: WalkOptions<H>): WalkArrival<H> | null {
|
|
80
|
+
const min = opts.min ?? 1;
|
|
81
|
+
const max = opts.max ?? Infinity;
|
|
82
|
+
const starts = typeof start === "string" ? [start] : [...start];
|
|
83
|
+
const seen = new Set<string>(starts.map((id) => `${id}|0`));
|
|
84
|
+
let frontier: WalkArrival<H>[] = starts.map((id) => ({ id, depth: 0, hops: [] }));
|
|
85
|
+
while (frontier.length > 0) {
|
|
86
|
+
const next: WalkArrival<H>[] = [];
|
|
87
|
+
for (const s of frontier) {
|
|
88
|
+
if (s.depth >= max) continue;
|
|
89
|
+
for (const step of opts.steps(s.id)) {
|
|
90
|
+
const depth = s.depth + 1;
|
|
91
|
+
const arrival: WalkArrival<H> = { id: step.far, depth, hops: step.hops.length ? [...s.hops, ...step.hops] : s.hops };
|
|
92
|
+
if (depth >= min && opts.arrive?.(arrival)) return arrival;
|
|
93
|
+
const key = `${step.far}|${Math.min(depth, min)}`;
|
|
94
|
+
if (seen.has(key)) continue;
|
|
95
|
+
seen.add(key);
|
|
96
|
+
next.push(arrival);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
frontier = next;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
package/src/import/parser.ts
CHANGED
|
@@ -57,6 +57,24 @@ export interface OutputIR {
|
|
|
57
57
|
readonly condition?: string;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
/**
|
|
61
|
+
* A finding a parser reports about the translation it made (#4398): a
|
|
62
|
+
* judgment call the author must confirm, or something it could not carry.
|
|
63
|
+
* `chant import --report <path>` writes these as SARIF and `--strict` fails
|
|
64
|
+
* while any `warning` or `error` is open, as `chant migrate` does.
|
|
65
|
+
*/
|
|
66
|
+
export interface ImportDiagnostic {
|
|
67
|
+
readonly ruleId: string;
|
|
68
|
+
readonly severity: "error" | "warning" | "info";
|
|
69
|
+
readonly message: string;
|
|
70
|
+
/** 1-based line in the template, when the parser knows it. */
|
|
71
|
+
readonly line?: number;
|
|
72
|
+
/** 1-based column in the template. */
|
|
73
|
+
readonly column?: number;
|
|
74
|
+
/** The object the finding is about, as the source names it. */
|
|
75
|
+
readonly entity?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
60
78
|
/**
|
|
61
79
|
* Intermediate representation of a parsed template
|
|
62
80
|
*/
|
|
@@ -71,6 +89,8 @@ export interface TemplateIR {
|
|
|
71
89
|
/** Sections or keys the parser read but import cannot carry, named so the
|
|
72
90
|
* import surfaces them instead of dropping them silently (#2069). */
|
|
73
91
|
readonly warnings?: string[];
|
|
92
|
+
/** Findings for `--report` and `--strict` (#4398); a parser that has none leaves it out. */
|
|
93
|
+
readonly diagnostics?: ImportDiagnostic[];
|
|
74
94
|
}
|
|
75
95
|
|
|
76
96
|
/**
|
package/src/lexicon.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import type { CapabilityPack } from "./capabilities/view";
|
|
1
2
|
import type { Serializer } from "./serializer";
|
|
2
3
|
import type { Declarable } from "./declarable";
|
|
3
4
|
import type { LintRule } from "./lint/rule";
|
|
4
5
|
import type { RuleSpec } from "./lint/declarative";
|
|
5
|
-
import type { PostSynthCheck } from "./lint/post-synth";
|
|
6
|
-
import type { TemplateParser, TemplateIR, ParseContext, ParserOptions, ParserOptionSpec } from "./import/parser";
|
|
6
|
+
import type { CrossRootCheck, PostSynthCheck } from "./lint/post-synth";
|
|
7
|
+
import type { TemplateParser, TemplateIR, ParseContext, ParserOptions, ParserOptionSpec, ImportDiagnostic } from "./import/parser";
|
|
7
8
|
import type { TypeScriptGenerator } from "./import/generator";
|
|
8
9
|
import type { EmbeddedContentImporter } from "./import/embedded";
|
|
9
10
|
import type { AgentConfigImporter } from "./agents/importer";
|
|
@@ -23,7 +24,7 @@ import type { OwnershipChannel, OwnershipMarker } from "./ownership";
|
|
|
23
24
|
import type { LexiconConfigSchema } from "./lexicon-config";
|
|
24
25
|
import type { RuleMeta } from "./audit/catalog";
|
|
25
26
|
import type { ReferenceCatalog } from "./graph-refs";
|
|
26
|
-
import type { IREdge, LexiconGraphEdges, LexiconUnreadSource, LexiconWorkspaceOutputs } from "./graph-ir";
|
|
27
|
+
import type { IREdge, LexiconGraphEdges, LexiconUnreadSource, LexiconWorkspaceLinks, LexiconWorkspaceOutputs } from "./graph-ir";
|
|
27
28
|
import type { DescribeResourcesResult, UnobservedReason } from "./observation";
|
|
28
29
|
import type { DescribeIdentityOptions, DescribeIdentityResult } from "./identity";
|
|
29
30
|
import type { DeepNormalizationHooks, DeepObservationResult } from "./deep-observation";
|
|
@@ -381,8 +382,11 @@ export function intrinsicCallFoldsEagerly(def: { isTag?: boolean; foldsEagerly?:
|
|
|
381
382
|
* Options passed to a MigrationSource by `chant migrate`.
|
|
382
383
|
*/
|
|
383
384
|
export interface MigrateOptions {
|
|
384
|
-
/**
|
|
385
|
-
|
|
385
|
+
/**
|
|
386
|
+
* Output format. `yaml` and `ts` are the gitlab pair's; `sql` writes plain
|
|
387
|
+
* DDL for a pair whose target is a database (#4399).
|
|
388
|
+
*/
|
|
389
|
+
emit?: "yaml" | "ts" | "sql";
|
|
386
390
|
/** Recognise composite patterns when emitting. */
|
|
387
391
|
useComposites?: boolean;
|
|
388
392
|
/** Source file path (for provenance display only). */
|
|
@@ -410,6 +414,20 @@ export interface MigrationResult {
|
|
|
410
414
|
diagnostics: Array<Record<string, unknown>>;
|
|
411
415
|
/** Markdown "Security posture" section, when security analysis ran (#306). */
|
|
412
416
|
securityPosture?: string;
|
|
417
|
+
/**
|
|
418
|
+
* Outputs of the source member that the rendered output reads, by the names
|
|
419
|
+
* a workspace link takes (#4399). In a workspace, `chant migrate` writes
|
|
420
|
+
* them as `links` of the member the output lands in, so a source that drops
|
|
421
|
+
* or renames one fails `chant workspace check`.
|
|
422
|
+
*/
|
|
423
|
+
links?: string[];
|
|
424
|
+
/**
|
|
425
|
+
* The checks that need the target's own server, run for `--validate`
|
|
426
|
+
* instead of the external linter (#4399). Returns the diagnostics found,
|
|
427
|
+
* `error` severity for a refusal. Throws when the server cannot start, which
|
|
428
|
+
* `chant migrate` reports as a validation that did not run.
|
|
429
|
+
*/
|
|
430
|
+
validate?(): Promise<Array<Record<string, unknown>>>;
|
|
413
431
|
}
|
|
414
432
|
|
|
415
433
|
/**
|
|
@@ -419,6 +437,12 @@ export interface MigrationResult {
|
|
|
419
437
|
export interface MigrationSource {
|
|
420
438
|
/** Lightweight detector: does this content look like the expected source? */
|
|
421
439
|
detect(content: string): boolean;
|
|
440
|
+
/**
|
|
441
|
+
* The source may be a directory, which `transform` reads itself from
|
|
442
|
+
* `opts.sourceFile` (a workspace member, #4399). `chant migrate` then skips
|
|
443
|
+
* `detect` and passes empty content.
|
|
444
|
+
*/
|
|
445
|
+
directory?: boolean;
|
|
422
446
|
/** Run the translation. */
|
|
423
447
|
transform(content: string, opts: MigrateOptions): Promise<MigrationResult>;
|
|
424
448
|
}
|
|
@@ -869,6 +893,19 @@ export interface ScheduledOpSpec {
|
|
|
869
893
|
* per-job environment mapping to put a value in.
|
|
870
894
|
*/
|
|
871
895
|
variables?: Record<string, string>;
|
|
896
|
+
/**
|
|
897
|
+
* The Op runs a `reviewAgent` step in `handoff` mode (#4326): generate the
|
|
898
|
+
* review as two jobs. The first runs `chant run <name>` with no forge write
|
|
899
|
+
* token (the checkout's fetches get the job's token and nothing after
|
|
900
|
+
* them does) and hands the review on as job outputs. The second checks
|
|
901
|
+
* nothing out, takes the review as data and posts it as one note with the
|
|
902
|
+
* write token (`postReviewNote`). GitHub and Forgejo only: a GitLab merge
|
|
903
|
+
* request pipeline hands every job the project's unprotected variables, so
|
|
904
|
+
* the gitlab generator refuses this by name. The trigger must be
|
|
905
|
+
* `pull_request` and the finding-mode `report`, since the first job posts
|
|
906
|
+
* nothing.
|
|
907
|
+
*/
|
|
908
|
+
reviewAgent?: boolean;
|
|
872
909
|
}
|
|
873
910
|
|
|
874
911
|
/**
|
|
@@ -1190,6 +1227,14 @@ export interface LexiconPlugin {
|
|
|
1190
1227
|
/** Return post-synthesis checks for build validation */
|
|
1191
1228
|
postSynthChecks?(): PostSynthCheck[];
|
|
1192
1229
|
|
|
1230
|
+
/**
|
|
1231
|
+
* Checks that read across build roots (chant #1939). Only a cross-root run
|
|
1232
|
+
* (`runCrossRootChecks`, ./lint/post-synth.ts) calls this; `chant build`
|
|
1233
|
+
* and `chant lint` never do, so a lexicon that adds one costs a
|
|
1234
|
+
* single-build project nothing.
|
|
1235
|
+
*/
|
|
1236
|
+
crossRootChecks?(): CrossRootCheck[];
|
|
1237
|
+
|
|
1193
1238
|
/**
|
|
1194
1239
|
* Activity contracts (`ActivityContract`, `./op/activity-contract.ts`) for
|
|
1195
1240
|
* the activities this lexicon implements, so another lexicon's post-synth
|
|
@@ -1304,6 +1349,15 @@ export interface LexiconPlugin {
|
|
|
1304
1349
|
*/
|
|
1305
1350
|
parserOptions?(): ParserOptionSpec[];
|
|
1306
1351
|
|
|
1352
|
+
/**
|
|
1353
|
+
* `chant import --validate` (#4398): check what the import would write
|
|
1354
|
+
* against the lexicon's own emulator, and return one diagnostic per
|
|
1355
|
+
* failure (severity `error`). Called with the parsed IR and the checked
|
|
1356
|
+
* parser options. A lexicon without an emulator leaves this out, and
|
|
1357
|
+
* `--validate` then fails the import with a message saying so.
|
|
1358
|
+
*/
|
|
1359
|
+
validateImport?(ir: TemplateIR, options: ParserOptions): Promise<ImportDiagnostic[]>;
|
|
1360
|
+
|
|
1307
1361
|
/** Return a generator for converting IR to TypeScript */
|
|
1308
1362
|
templateGenerator?(): TypeScriptGenerator;
|
|
1309
1363
|
|
|
@@ -1498,6 +1552,17 @@ export interface LexiconPlugin {
|
|
|
1498
1552
|
*/
|
|
1499
1553
|
workspaceOutputs?(entities: ReadonlyMap<string, Declarable>, unread?: readonly LexiconUnreadSource[]): LexiconWorkspaceOutputs | undefined;
|
|
1500
1554
|
|
|
1555
|
+
/**
|
|
1556
|
+
* The outputs of other workspace members this lexicon's declarations read
|
|
1557
|
+
* or write (#4397), such as the ClickHouse tables an otel `clickhouse`
|
|
1558
|
+
* exporter writes. `chant workspace check` calls it offline on the member's
|
|
1559
|
+
* folded source, as it calls `workspaceOutputs`, and checks each link like
|
|
1560
|
+
* one a kind's reader found (WSP093 to WSP095, WSP099 for `gaps`), naming
|
|
1561
|
+
* the file and line of the declaring entity. Pure: no I/O. Return
|
|
1562
|
+
* `undefined` when the project declares nothing that links.
|
|
1563
|
+
*/
|
|
1564
|
+
workspaceLinks?(entities: ReadonlyMap<string, Declarable>, unread?: readonly LexiconUnreadSource[]): LexiconWorkspaceLinks | undefined;
|
|
1565
|
+
|
|
1501
1566
|
// LSP
|
|
1502
1567
|
/** Provide completions for LSP */
|
|
1503
1568
|
completionProvider?(ctx: CompletionContext): CompletionItem[];
|
|
@@ -1543,10 +1608,14 @@ export interface LexiconPlugin {
|
|
|
1543
1608
|
* Return a migration source for translating from another lexicon's
|
|
1544
1609
|
* format into this lexicon. Returns undefined if `from` is not supported.
|
|
1545
1610
|
*
|
|
1611
|
+
* `to` is the target as `--to` names it. A side may add a dialect after the
|
|
1612
|
+
* lexicon, `sql/clickhouse` (#4399); `from` is passed as written, and a
|
|
1613
|
+
* lexicon with one target ignores `to`.
|
|
1614
|
+
*
|
|
1546
1615
|
* Example: the gitlab lexicon implements `migrationSource("github")` to
|
|
1547
1616
|
* translate `.github/workflows/*.yml` into `.gitlab-ci.yml`.
|
|
1548
1617
|
*/
|
|
1549
|
-
migrationSource?(from: string): MigrationSource | undefined;
|
|
1618
|
+
migrationSource?(from: string, to?: string): MigrationSource | undefined;
|
|
1550
1619
|
|
|
1551
1620
|
// State
|
|
1552
1621
|
/**
|
|
@@ -2082,6 +2151,15 @@ export interface LexiconPlugin {
|
|
|
2082
2151
|
*/
|
|
2083
2152
|
referenceCatalog?: ReferenceCatalog;
|
|
2084
2153
|
|
|
2154
|
+
/**
|
|
2155
|
+
* This lexicon's capability pack (#4375): its mapping onto the
|
|
2156
|
+
* lexicon-neutral view the capability rules read (labels, edge names,
|
|
2157
|
+
* attributes, policy documents, inline blocks, link resources), as data,
|
|
2158
|
+
* plus an adapter for what the mapping can't say as data. `chant search`'s
|
|
2159
|
+
* `cap:` terms and `--capabilities` read it. Opt-in.
|
|
2160
|
+
*/
|
|
2161
|
+
capabilityPack?: CapabilityPack;
|
|
2162
|
+
|
|
2085
2163
|
/**
|
|
2086
2164
|
* Enrich live IR node attributes for edge reconstruction (#784). Returns
|
|
2087
2165
|
* `nodeId → attributes` with cross-resource references resolved to the
|
|
@@ -181,6 +181,14 @@ export interface GateResolutionRecord {
|
|
|
181
181
|
* other resolution.
|
|
182
182
|
*/
|
|
183
183
|
empty?: true;
|
|
184
|
+
/**
|
|
185
|
+
* The workspace gate that stood in for this member gate (#2554, ws-039):
|
|
186
|
+
* its name and the digest of the member plans it covers. Set only on the
|
|
187
|
+
* resolution a run builds when a workspace approval passes the gate; it is
|
|
188
|
+
* never written to the member's ledger, where the approval stays the
|
|
189
|
+
* workspace's (`_members/_workspace/_gates/`).
|
|
190
|
+
*/
|
|
191
|
+
workspaceGate?: { gate: string; digest: string };
|
|
184
192
|
/**
|
|
185
193
|
* The channel this resolution was authored on (chant#2384) — set by the
|
|
186
194
|
* writer, never by the caller. `chant approve` records `"cli"`, the
|
package/src/lifecycle/git.ts
CHANGED
|
@@ -148,7 +148,7 @@ export async function writeBlobToPath(
|
|
|
148
148
|
filename: string,
|
|
149
149
|
content: string,
|
|
150
150
|
commitMessage: string,
|
|
151
|
-
opts?:
|
|
151
|
+
opts?: LedgerLocation & { expectPriorPathSha?: string | null },
|
|
152
152
|
): Promise<string> {
|
|
153
153
|
const dir = await ledgerDir(environment, opts);
|
|
154
154
|
return writeLedgerFiles(
|
|
@@ -447,7 +447,7 @@ export async function readBlobFromPath(
|
|
|
447
447
|
export async function readPathSha(
|
|
448
448
|
environment: string,
|
|
449
449
|
filename: string,
|
|
450
|
-
opts?:
|
|
450
|
+
opts?: LedgerLocation,
|
|
451
451
|
): Promise<string | null> {
|
|
452
452
|
const rt = getRuntime();
|
|
453
453
|
const dir = await ledgerDir(environment, opts);
|