@intentius/chant 0.124.13 → 0.124.15
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/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +462 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Excision of a carved resource's own `resource "<type>" "<name>"` block from
|
|
3
|
+
* the surviving Terraform source (#998 — closes the "auto-excise" limitation).
|
|
4
|
+
*
|
|
5
|
+
* After `terraform state rm`, the block left behind would re-CREATE the
|
|
6
|
+
* resource on the next apply — the one edit the bridge previously left to
|
|
7
|
+
* hand-work. This removes the carve set's own blocks as part of the survivor
|
|
8
|
+
* rewrite, so the one bridge `.patch` (#1589) carries the whole handoff edit.
|
|
9
|
+
*
|
|
10
|
+
* Pure text transform. The scanner tracks brace depth outside of strings,
|
|
11
|
+
* comments, template interpolations, and heredocs — enough for real `.tf`
|
|
12
|
+
* files without pulling in the wasm parser for what is a subtractive edit.
|
|
13
|
+
*/
|
|
14
|
+
const HEADER = /^\s*resource\s+"([^"]+)"\s+"([^"]+)"\s*\{/;
|
|
15
|
+
/**
|
|
16
|
+
* Remove the targets' own `resource` blocks from one `.tf` file's text. A
|
|
17
|
+
* comment line directly above a removed block stays (it may describe more
|
|
18
|
+
* than the block); the blank line the removal leaves behind is collapsed.
|
|
19
|
+
*/
|
|
20
|
+
export function exciseResourceBlocks(content, targets) {
|
|
21
|
+
if (targets.length === 0)
|
|
22
|
+
return { content, excised: [] };
|
|
23
|
+
const wanted = new Map(targets.map((t) => [`${t.type}.${t.name}`, t.address]));
|
|
24
|
+
const lines = content.split("\n");
|
|
25
|
+
const excised = [];
|
|
26
|
+
const out = [];
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (i < lines.length) {
|
|
29
|
+
const m = lines[i].match(HEADER);
|
|
30
|
+
const key = m ? `${m[1]}.${m[2]}` : undefined;
|
|
31
|
+
if (!m || !wanted.has(key)) {
|
|
32
|
+
out.push(lines[i]);
|
|
33
|
+
i++;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const end = blockEnd(lines, i);
|
|
37
|
+
if (end === -1) {
|
|
38
|
+
// Unbalanced block — leave the file alone rather than corrupt it.
|
|
39
|
+
out.push(lines[i]);
|
|
40
|
+
i++;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
excised.push(wanted.get(key));
|
|
44
|
+
i = end + 1;
|
|
45
|
+
// Swallow the separator blank line so the removal leaves no doubled gap.
|
|
46
|
+
if (i < lines.length && lines[i].trim() === "")
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
return { content: out.join("\n"), excised };
|
|
50
|
+
}
|
|
51
|
+
/** Index of the line closing the block opened on `start`, or -1 if unbalanced. */
|
|
52
|
+
function blockEnd(lines, start) {
|
|
53
|
+
// Context stack: block/object braces, strings, `${` interpolations, block
|
|
54
|
+
// comments. The header's `{` pushes the first "brace"; the block closes when
|
|
55
|
+
// the stack empties.
|
|
56
|
+
const stack = [];
|
|
57
|
+
let opened = false;
|
|
58
|
+
let heredoc = null;
|
|
59
|
+
for (let ln = start; ln < lines.length; ln++) {
|
|
60
|
+
const line = lines[ln];
|
|
61
|
+
if (heredoc !== null) {
|
|
62
|
+
if (line.trim() === heredoc)
|
|
63
|
+
heredoc = null;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
for (let c = 0; c < line.length; c++) {
|
|
67
|
+
const top = stack[stack.length - 1];
|
|
68
|
+
const ch = line[c];
|
|
69
|
+
const next = line[c + 1];
|
|
70
|
+
if (top === "comment") {
|
|
71
|
+
if (ch === "*" && next === "/") {
|
|
72
|
+
stack.pop();
|
|
73
|
+
c++;
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (top === "string") {
|
|
78
|
+
if (ch === "\\") {
|
|
79
|
+
c++;
|
|
80
|
+
}
|
|
81
|
+
else if (ch === "$" && next === "{" && line[c - 1] !== "$") {
|
|
82
|
+
stack.push("interp");
|
|
83
|
+
c++;
|
|
84
|
+
}
|
|
85
|
+
else if (ch === '"') {
|
|
86
|
+
stack.pop();
|
|
87
|
+
}
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Code position (top of file block, a nested brace, or inside `${...}`).
|
|
91
|
+
if (ch === "#" || (ch === "/" && next === "/"))
|
|
92
|
+
break; // line comment
|
|
93
|
+
if (ch === "/" && next === "*") {
|
|
94
|
+
stack.push("comment");
|
|
95
|
+
c++;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (ch === '"') {
|
|
99
|
+
stack.push("string");
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (ch === "<" && next === "<") {
|
|
103
|
+
const hd = line.slice(c).match(/^<<-?([A-Za-z_][A-Za-z0-9_-]*)/);
|
|
104
|
+
if (hd) {
|
|
105
|
+
heredoc = hd[1];
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (ch === "{") {
|
|
110
|
+
stack.push("brace");
|
|
111
|
+
opened = true;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (ch === "}") {
|
|
115
|
+
if (top === "brace" || top === "interp")
|
|
116
|
+
stack.pop();
|
|
117
|
+
if (opened && stack.length === 0)
|
|
118
|
+
return ln;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return -1;
|
|
123
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply graduation for the strangler-fig carve (#197) — the last step.
|
|
3
|
+
*
|
|
4
|
+
* After a resource is emitted (`carve emit`) and the survivors are bridged
|
|
5
|
+
* (`carve bridge`), it sits at the observe position: chant has the source, but
|
|
6
|
+
* the live resource is an orphan carrying no chant ownership. Graduation is the
|
|
7
|
+
* dial-turn to apply: mark the resource chant-owned so `chant carve` / status
|
|
8
|
+
* recognize it, and finalize the ordered apply runbook.
|
|
9
|
+
*
|
|
10
|
+
* This is BYOL-honest: it does NOT call the cloud. It resolves the ownership
|
|
11
|
+
* marker (reusing core's `ownershipEntries`) and produces the graduation
|
|
12
|
+
* artifacts + runbook. The apply itself is whatever lifecycle you brought —
|
|
13
|
+
* the native CLI, a CI pipeline, an ApplyOp — and it stamps the marker the
|
|
14
|
+
* emitted source now carries.
|
|
15
|
+
*/
|
|
16
|
+
import { ownershipEntries, LABEL_OWNERSHIP_KEYS } from "../ownership.js";
|
|
17
|
+
/**
|
|
18
|
+
* Default tag channel, mirroring the AWS lexicon's `AWS_TAG_OWNERSHIP_KEYS`
|
|
19
|
+
* (`lexicons/aws/src/ownership.ts`). Core cannot import a lexicon, so the
|
|
20
|
+
* convention is duplicated here; the values match so the graduation plan shows
|
|
21
|
+
* the tags the AWS apply path will actually stamp.
|
|
22
|
+
*/
|
|
23
|
+
export const DEFAULT_TAG_OWNERSHIP_KEYS = {
|
|
24
|
+
managedBy: "chant:managed-by",
|
|
25
|
+
stack: "chant:stack",
|
|
26
|
+
env: "chant:env",
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* How the marker, the build output and the BYOL apply are spelled, per emitted
|
|
30
|
+
* lexicon. A Kubernetes object carries the marker as labels — the same
|
|
31
|
+
* `LABEL_OWNERSHIP_KEYS` the k8s serializer merges in — so a runbook promising
|
|
32
|
+
* `chant:managed-by` tags would name a channel nothing stamps.
|
|
33
|
+
*/
|
|
34
|
+
function applyVocabulary(lexicon, target, stack) {
|
|
35
|
+
if (lexicon === "k8s") {
|
|
36
|
+
return {
|
|
37
|
+
channel: LABEL_OWNERSHIP_KEYS,
|
|
38
|
+
markerKind: "labels",
|
|
39
|
+
build: `chant build <emitted-src> --lexicon k8s > ${target}.yaml`,
|
|
40
|
+
apply: `kubectl apply -f ${target}.yaml`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
channel: DEFAULT_TAG_OWNERSHIP_KEYS,
|
|
45
|
+
markerKind: "tags",
|
|
46
|
+
build: `chant build <emitted-src> -o ${target}.template.json`,
|
|
47
|
+
apply: `aws cloudformation deploy --template-file ${target}.template.json --stack-name ${stack} ...`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function graduationPlan(report, opts = {}) {
|
|
51
|
+
const stack = opts.stack ?? (report.target.split(".").slice(1).join(".") || report.target);
|
|
52
|
+
const marker = { stack, env: opts.env };
|
|
53
|
+
const vocabulary = applyVocabulary(opts.lexicon, report.target, stack);
|
|
54
|
+
const ownershipTags = ownershipEntries(opts.channel ?? vocabulary.channel, marker);
|
|
55
|
+
const warnings = [];
|
|
56
|
+
if (report.outbound.length) {
|
|
57
|
+
warnings.push(`${report.outbound.length} deferred deploy-time input(s) must be wired before apply (see the boundary report).`);
|
|
58
|
+
}
|
|
59
|
+
const tagList = Object.entries(ownershipTags)
|
|
60
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
61
|
+
.join(", ");
|
|
62
|
+
const steps = [
|
|
63
|
+
`1. Confirm the emitted source builds spec-true: ${vocabulary.build}`,
|
|
64
|
+
`2. Add the ownership marker so chant owns the resource — ${vocabulary.markerKind}: ${tagList}`,
|
|
65
|
+
`3. Apply with your lifecycle (BYOL), e.g.:`,
|
|
66
|
+
` ${vocabulary.apply}`,
|
|
67
|
+
` or graduate to an ApplyOp for a durable, gated apply.`,
|
|
68
|
+
`4. Verify chant now owns it: chant lifecycle diff --live <env> (expect: unchanged, owned)`,
|
|
69
|
+
`Rollback before this point: terraform import ${report.target} <physical-id>`,
|
|
70
|
+
];
|
|
71
|
+
return { target: report.target, marker, ownershipTags, markerKind: vocabulary.markerKind, steps, warnings };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A constructor-shaped emitted file: `export const x = new Ctor(`. Tag-based
|
|
75
|
+
* ownership is a property of that shape — a carved `kubernetes_manifest` is a
|
|
76
|
+
* `k8sManifest({ ... })` call whose props are the manifest, where a top-level
|
|
77
|
+
* `Tags` array would be an invented field on the object, not a marker (#999).
|
|
78
|
+
* Such a file is refused rather than stamped.
|
|
79
|
+
*/
|
|
80
|
+
const CONSTRUCTOR_SHAPE = /^export const \w+ = new \w+\(/m;
|
|
81
|
+
/**
|
|
82
|
+
* Stamp the ownership tags into an emitted chant source file (`carve apply
|
|
83
|
+
* --write-source`). The emitted source is machine-generated (`adoptFromState`),
|
|
84
|
+
* so its shape is known: one prop per line, `Tags` as a single-line JSON array.
|
|
85
|
+
* Merges into an existing `Tags` prop (replacing stale chant keys) or inserts
|
|
86
|
+
* one into the constructor's props object. Returns null when the file has no
|
|
87
|
+
* recognizable constructor to stamp.
|
|
88
|
+
*/
|
|
89
|
+
export function stampOwnershipIntoSource(content, tags) {
|
|
90
|
+
if (!CONSTRUCTOR_SHAPE.test(content))
|
|
91
|
+
return null;
|
|
92
|
+
const entries = Object.entries(tags).map(([Key, Value]) => ({ Key, Value }));
|
|
93
|
+
const keys = new Set(Object.keys(tags));
|
|
94
|
+
const lines = content.split("\n");
|
|
95
|
+
// Merge into an existing Tags prop.
|
|
96
|
+
for (let i = 0; i < lines.length; i++) {
|
|
97
|
+
const m = lines[i].match(/^(\s*)Tags: (\[.*\]),$/);
|
|
98
|
+
if (!m)
|
|
99
|
+
continue;
|
|
100
|
+
let existing;
|
|
101
|
+
try {
|
|
102
|
+
existing = JSON.parse(m[2]);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const merged = [...existing.filter((t) => !keys.has(t.Key)), ...entries];
|
|
108
|
+
const rendered = `${m[1]}Tags: ${JSON.stringify(merged)},`;
|
|
109
|
+
if (rendered === lines[i])
|
|
110
|
+
return { content, changed: false };
|
|
111
|
+
lines[i] = rendered;
|
|
112
|
+
return { content: lines.join("\n"), changed: true };
|
|
113
|
+
}
|
|
114
|
+
// No Tags prop yet: insert one into the constructor's props object.
|
|
115
|
+
const tagsLine = ` Tags: ${JSON.stringify(entries)},`;
|
|
116
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
117
|
+
if (/^\}\);\s*$/.test(lines[i])) {
|
|
118
|
+
lines.splice(i, 0, tagsLine);
|
|
119
|
+
return { content: lines.join("\n"), changed: true };
|
|
120
|
+
}
|
|
121
|
+
const empty = lines[i].match(/^(export const .+ = new \w+\()\{\}(\);)\s*$/);
|
|
122
|
+
if (empty) {
|
|
123
|
+
lines[i] = `${empty[1]}{\n${tagsLine}\n}${empty[2]}`;
|
|
124
|
+
return { content: lines.join("\n"), changed: true };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure Terraform dependency-graph builder for the carve-out advisor (#214 T1).
|
|
3
|
+
*
|
|
4
|
+
* Input is the JSON tree `@cdktn/hcl2json` produces (`Hcl2JsonTree`) plus the
|
|
5
|
+
* traversal accessors its expression AST found per interpolated string
|
|
6
|
+
* (`ExpressionRefs`, resolved in `parse.ts` — #998). Tokenizing `${...}`
|
|
7
|
+
* expression bodies is the AST's job — a quoted address inside an expression
|
|
8
|
+
* (`var.m["aws_s3_bucket.assets.arn"]`) or an escaped `$${...}` literal is not
|
|
9
|
+
* a reference, which the regex scan this replaced could not tell. This module
|
|
10
|
+
* only classifies the accessors the AST produced: no wasm, no filesystem, so
|
|
11
|
+
* graph building stays unit-testable on hand-written fixtures.
|
|
12
|
+
*/
|
|
13
|
+
import { shapeSourcePaths } from "./data-source-shape.js";
|
|
14
|
+
import { dataSourceShapeOf, identityAttrOf } from "./tier-map.js";
|
|
15
|
+
/** Non-resource reference heads that must never be read as a resource type. */
|
|
16
|
+
const NON_RESOURCE_HEADS = new Set(["var", "local", "each", "count", "self", "path", "terraform"]);
|
|
17
|
+
/**
|
|
18
|
+
* Split a traversal accessor into segments. Dots inside a quoted map key
|
|
19
|
+
* (`var.m."a.b"` — how the AST renders `var.m["a.b"]`) do not split.
|
|
20
|
+
*/
|
|
21
|
+
function accessorSegments(accessor) {
|
|
22
|
+
const segments = [];
|
|
23
|
+
let i = 0;
|
|
24
|
+
while (i < accessor.length) {
|
|
25
|
+
if (accessor[i] === '"') {
|
|
26
|
+
const close = accessor.indexOf('"', i + 1);
|
|
27
|
+
const end = close === -1 ? accessor.length : close + 1;
|
|
28
|
+
segments.push(accessor.slice(i, end));
|
|
29
|
+
i = end;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
let j = i;
|
|
33
|
+
while (j < accessor.length && accessor[j] !== ".")
|
|
34
|
+
j++;
|
|
35
|
+
segments.push(accessor.slice(i, j));
|
|
36
|
+
i = j;
|
|
37
|
+
}
|
|
38
|
+
if (accessor[i] === ".")
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
return segments;
|
|
42
|
+
}
|
|
43
|
+
const NAME = /^[A-Za-z_][A-Za-z0-9_-]*$/;
|
|
44
|
+
/**
|
|
45
|
+
* Classify one AST traversal accessor into a resource/module/data reference.
|
|
46
|
+
* `var.*`/`local.*`/`each.*`-headed accessors are not references; quoted map
|
|
47
|
+
* keys and numeric indexes never become the attribute.
|
|
48
|
+
*/
|
|
49
|
+
export function refFromAccessor(accessor) {
|
|
50
|
+
const parts = accessorSegments(accessor);
|
|
51
|
+
const isName = (s) => s !== undefined && NAME.test(s);
|
|
52
|
+
const attrAfter = (idx) => parts.slice(idx).find((p) => isName(p));
|
|
53
|
+
if (parts[0] === "module") {
|
|
54
|
+
return isName(parts[1]) ? { address: `module.${parts[1]}`, attr: attrAfter(2) } : null;
|
|
55
|
+
}
|
|
56
|
+
if (parts[0] === "data") {
|
|
57
|
+
return isName(parts[1]) && isName(parts[2])
|
|
58
|
+
? { address: `data.${parts[1]}.${parts[2]}`, attr: attrAfter(3) }
|
|
59
|
+
: null;
|
|
60
|
+
}
|
|
61
|
+
if (NON_RESOURCE_HEADS.has(parts[0]) || !isName(parts[0]) || !isName(parts[1]))
|
|
62
|
+
return null;
|
|
63
|
+
return { address: `${parts[0]}.${parts[1]}`, attr: attrAfter(2) };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The referrer key a `local.<name>` accessor names, or null for anything else.
|
|
67
|
+
*
|
|
68
|
+
* `refFromAccessor` is right to refuse `local.*`: a local is a substitution,
|
|
69
|
+
* has no address in the plan graph, and nothing carves one. But the resource a
|
|
70
|
+
* local ultimately names is a dependency all the same, so the accessor is
|
|
71
|
+
* carried this far to be resolved through the locals table (#2324) rather than
|
|
72
|
+
* dropped at the resource-head guard.
|
|
73
|
+
*/
|
|
74
|
+
function localKeyFromAccessor(accessor) {
|
|
75
|
+
const parts = accessorSegments(accessor);
|
|
76
|
+
const name = parts[1];
|
|
77
|
+
return parts[0] === "local" && name !== undefined && NAME.test(name) ? `local.${name}` : null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Every string value carrying an interpolation across the tree's resource,
|
|
81
|
+
* module, output, `locals` and `data` blocks — exactly the expressions
|
|
82
|
+
* `parse.ts` must resolve through the AST before `buildGraph` can classify
|
|
83
|
+
* them.
|
|
84
|
+
*
|
|
85
|
+
* `locals` and `data` are here because a reference can reach a resource
|
|
86
|
+
* through them (#2324): a survivor reading `local.assets_id`, or a `data`
|
|
87
|
+
* source keyed off the carved resource, is a dependency the plan breaks on
|
|
88
|
+
* just as hard as a direct one. Skipping their bodies meant the AST never saw
|
|
89
|
+
* those expressions at all.
|
|
90
|
+
*/
|
|
91
|
+
export function collectExpressions(tree) {
|
|
92
|
+
const exprs = new Set();
|
|
93
|
+
const visit = (v) => {
|
|
94
|
+
if (typeof v === "string") {
|
|
95
|
+
if (v.includes("${"))
|
|
96
|
+
exprs.add(v);
|
|
97
|
+
}
|
|
98
|
+
else if (Array.isArray(v)) {
|
|
99
|
+
v.forEach(visit);
|
|
100
|
+
}
|
|
101
|
+
else if (v && typeof v === "object") {
|
|
102
|
+
for (const inner of Object.values(v))
|
|
103
|
+
visit(inner);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
for (const named of Object.values(tree.resource ?? {}))
|
|
107
|
+
for (const blocks of Object.values(named))
|
|
108
|
+
visit(blocks);
|
|
109
|
+
for (const blocks of Object.values(tree.module ?? {}))
|
|
110
|
+
visit(blocks);
|
|
111
|
+
for (const blocks of Object.values(tree.output ?? {}))
|
|
112
|
+
visit(blocks);
|
|
113
|
+
visit(tree.locals);
|
|
114
|
+
for (const named of Object.values(tree.data ?? {}))
|
|
115
|
+
for (const blocks of Object.values(named))
|
|
116
|
+
visit(blocks);
|
|
117
|
+
return [...exprs].sort();
|
|
118
|
+
}
|
|
119
|
+
/** Collect every reference reachable in a block's value tree, via the AST-resolved accessors. */
|
|
120
|
+
function refsInValue(value, exprRefs) {
|
|
121
|
+
const refs = [];
|
|
122
|
+
const visit = (v) => {
|
|
123
|
+
if (typeof v === "string") {
|
|
124
|
+
if (!v.includes("${"))
|
|
125
|
+
return;
|
|
126
|
+
for (const accessor of exprRefs.get(v) ?? []) {
|
|
127
|
+
const ref = refFromAccessor(accessor);
|
|
128
|
+
if (ref) {
|
|
129
|
+
refs.push(ref);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const localKey = localKeyFromAccessor(accessor);
|
|
133
|
+
if (localKey)
|
|
134
|
+
refs.push({ address: localKey });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (Array.isArray(v)) {
|
|
138
|
+
v.forEach(visit);
|
|
139
|
+
}
|
|
140
|
+
else if (v && typeof v === "object") {
|
|
141
|
+
for (const inner of Object.values(v))
|
|
142
|
+
visit(inner);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
visit(value);
|
|
146
|
+
return refs;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* References in a whole block, each tagged with the top-level attribute it
|
|
150
|
+
* came in through — `via` is what a deferred outbound input gets named after
|
|
151
|
+
* when emit turns it into a build parameter (#998).
|
|
152
|
+
*/
|
|
153
|
+
function refsInBlock(block, exprRefs) {
|
|
154
|
+
if (!block || typeof block !== "object" || Array.isArray(block))
|
|
155
|
+
return refsInValue(block, exprRefs);
|
|
156
|
+
const refs = [];
|
|
157
|
+
for (const [key, value] of Object.entries(block)) {
|
|
158
|
+
for (const ref of refsInValue(value, exprRefs))
|
|
159
|
+
refs.push({ ...ref, via: key });
|
|
160
|
+
}
|
|
161
|
+
return refs;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Non-node referrers: `local.<name>` and `data.<type>.<name>` → the references
|
|
165
|
+
* in the body each one stands for (#2324).
|
|
166
|
+
*
|
|
167
|
+
* Neither is a graph node — a local is a substitution, and a data source is
|
|
168
|
+
* not carvable infrastructure — but both sit on a path between a survivor and
|
|
169
|
+
* a resource, which is the shape an `output` block already has here. A
|
|
170
|
+
* `locals` block arrives from hcl2json as an array of its assignments, one
|
|
171
|
+
* element per `locals` block in the estate.
|
|
172
|
+
*/
|
|
173
|
+
function referrerTable(tree, exprRefs) {
|
|
174
|
+
const table = new Map();
|
|
175
|
+
const add = (key, refs) => {
|
|
176
|
+
const existing = table.get(key);
|
|
177
|
+
if (existing)
|
|
178
|
+
existing.push(...refs);
|
|
179
|
+
else
|
|
180
|
+
table.set(key, refs);
|
|
181
|
+
};
|
|
182
|
+
const localsBlocks = Array.isArray(tree.locals) ? tree.locals : tree.locals ? [tree.locals] : [];
|
|
183
|
+
for (const block of localsBlocks) {
|
|
184
|
+
if (!block || typeof block !== "object")
|
|
185
|
+
continue;
|
|
186
|
+
for (const [name, value] of Object.entries(block)) {
|
|
187
|
+
add(`local.${name}`, refsInValue(value, exprRefs));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const [type, named] of Object.entries(tree.data ?? {})) {
|
|
191
|
+
for (const [name, blocks] of Object.entries(named)) {
|
|
192
|
+
add(`data.${type}.${name}`, refsInBlock(Array.isArray(blocks) ? blocks[0] : blocks, exprRefs));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return table;
|
|
196
|
+
}
|
|
197
|
+
/** Identity of a reference for de-duplication: the address plus the attribute read off it. */
|
|
198
|
+
function refKey(ref) {
|
|
199
|
+
return `${ref.address}\u0000${ref.attr ?? ""}`;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Resolve every referrer entry to the node references it ultimately names.
|
|
203
|
+
*
|
|
204
|
+
* One substitution pass is not enough: a local can read another local, and a
|
|
205
|
+
* `data` source can read a local that reads another data source. So this
|
|
206
|
+
* iterates to a fixpoint — each round replaces a referrer key appearing in an
|
|
207
|
+
* entry with that key's own resolved references, and the loop stops when a
|
|
208
|
+
* round adds nothing new.
|
|
209
|
+
*
|
|
210
|
+
* Growth is monotone and bounded by (referrers x distinct references), so a
|
|
211
|
+
* self-referential local (`a = local.a`, skipped outright) or a cycle
|
|
212
|
+
* (`a = local.b`, `b = local.a`) converges instead of recursing. Terraform
|
|
213
|
+
* rejects both, but the advisor only reads an estate and must not hang on one
|
|
214
|
+
* it disagrees with.
|
|
215
|
+
*/
|
|
216
|
+
function resolveReferrers(table) {
|
|
217
|
+
// Seed each entry with the references that already name something outside
|
|
218
|
+
// the table; the loop then folds in what the referrer keys resolve to.
|
|
219
|
+
const resolved = new Map();
|
|
220
|
+
for (const [key, refs] of table) {
|
|
221
|
+
resolved.set(key, new Map(refs.filter((r) => !table.has(r.address)).map((r) => [refKey(r), r])));
|
|
222
|
+
}
|
|
223
|
+
let changed = true;
|
|
224
|
+
while (changed) {
|
|
225
|
+
changed = false;
|
|
226
|
+
for (const [key, refs] of table) {
|
|
227
|
+
const into = resolved.get(key);
|
|
228
|
+
for (const ref of refs) {
|
|
229
|
+
if (ref.address === key)
|
|
230
|
+
continue; // `a = local.a` — nothing to fold in but itself
|
|
231
|
+
const from = resolved.get(ref.address);
|
|
232
|
+
if (!from)
|
|
233
|
+
continue;
|
|
234
|
+
for (const [id, inner] of from) {
|
|
235
|
+
if (into.has(id))
|
|
236
|
+
continue;
|
|
237
|
+
into.set(id, inner);
|
|
238
|
+
changed = true;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return new Map([...resolved].map(([key, refs]) => [key, [...refs.values()]]));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* A block's references as the graph should see them: one that reaches a
|
|
247
|
+
* `local` or `data` referrer additionally yields the node reference it
|
|
248
|
+
* resolves to.
|
|
249
|
+
*
|
|
250
|
+
* The original reference is kept — a `data.*` address is what marks the
|
|
251
|
+
* referring node dynamic, and an address that is not a node is dropped at edge
|
|
252
|
+
* time anyway. The resolved reference keeps the referring block's own `via`
|
|
253
|
+
* attribute, since that is what a deferred input is named after, and takes the
|
|
254
|
+
* carried resource attribute from the referrer's body.
|
|
255
|
+
*/
|
|
256
|
+
function throughReferrers(refs, resolved) {
|
|
257
|
+
const out = [];
|
|
258
|
+
for (const ref of refs) {
|
|
259
|
+
out.push(ref);
|
|
260
|
+
for (const inner of resolved.get(ref.address) ?? [])
|
|
261
|
+
out.push({ ...inner, via: ref.via });
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
264
|
+
}
|
|
265
|
+
/** A block carries `count`/`for_each` → dynamic, single instance until state resolves it. */
|
|
266
|
+
function blockHasMeta(block, key) {
|
|
267
|
+
return !!block && typeof block === "object" && key in block;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* The literal string at a dotted path into a block, or undefined when the path
|
|
271
|
+
* misses or lands on an interpolation. A dotted path walks nested blocks —
|
|
272
|
+
* hcl2json renders a nested block as a one-element array, so arrays step
|
|
273
|
+
* through their first element (`manifest.metadata.name`).
|
|
274
|
+
*/
|
|
275
|
+
function literalAt(block, path) {
|
|
276
|
+
let value = block;
|
|
277
|
+
for (const segment of path.split(".")) {
|
|
278
|
+
if (Array.isArray(value))
|
|
279
|
+
value = value[0];
|
|
280
|
+
if (!value || typeof value !== "object")
|
|
281
|
+
return undefined;
|
|
282
|
+
value = value[segment];
|
|
283
|
+
}
|
|
284
|
+
if (typeof value !== "string" || value.includes("${"))
|
|
285
|
+
return undefined;
|
|
286
|
+
return value;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* The resource's physical name, if its identity attribute is a plain literal
|
|
290
|
+
* (not interpolated).
|
|
291
|
+
*/
|
|
292
|
+
function literalIdentity(block, type) {
|
|
293
|
+
const attr = identityAttrOf(type);
|
|
294
|
+
if (!attr || !block || typeof block !== "object")
|
|
295
|
+
return undefined;
|
|
296
|
+
return literalAt(block, attr);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* The literals the type's data-source shape reads out of the carved block
|
|
300
|
+
* (#2034), keyed by the shape field's source path. `carve bridge` renders the
|
|
301
|
+
* data-source body from these; a required field missing here is what makes it
|
|
302
|
+
* write a TODO instead of a block Terraform would reject.
|
|
303
|
+
*/
|
|
304
|
+
function dataSourceValues(block, type) {
|
|
305
|
+
if (!block || typeof block !== "object")
|
|
306
|
+
return undefined;
|
|
307
|
+
const shape = dataSourceShapeOf(type);
|
|
308
|
+
if (!shape)
|
|
309
|
+
return undefined;
|
|
310
|
+
const values = {};
|
|
311
|
+
for (const path of shapeSourcePaths(shape)) {
|
|
312
|
+
const value = literalAt(block, path);
|
|
313
|
+
if (value !== undefined)
|
|
314
|
+
values[path] = value;
|
|
315
|
+
}
|
|
316
|
+
return Object.keys(values).length ? values : undefined;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Build the dependency graph from a merged hcl2json tree.
|
|
320
|
+
*
|
|
321
|
+
* `resource` and `module` blocks become nodes. `data` sources are NOT nodes
|
|
322
|
+
* (they are not carvable infrastructure), but a reference *to* a data source
|
|
323
|
+
* marks the referring node dynamic. An edge is recorded only when its target
|
|
324
|
+
* resolves to a known resource/module node — references to `var`/`local`/data
|
|
325
|
+
* are dropped.
|
|
326
|
+
*
|
|
327
|
+
* `output` blocks are not nodes either — nothing carves an output — but they
|
|
328
|
+
* do reference, and a reference to a carved resource breaks the surviving plan
|
|
329
|
+
* exactly like a resource's does. So an output contributes an edge tagged
|
|
330
|
+
* `fromKind: "output"` from the pseudo-address `output.<name>` (#1638),
|
|
331
|
+
* which the scorer weights lower and `carve bridge` patches.
|
|
332
|
+
*
|
|
333
|
+
* `locals` and `data` blocks are non-node referrers of a third kind (#2324):
|
|
334
|
+
* they carry a reference between two nodes rather than terminating it. A
|
|
335
|
+
* survivor reading `local.assets_id`, or reading a `data` source keyed off the
|
|
336
|
+
* carved resource, depends on that resource, so the reference is resolved
|
|
337
|
+
* through the referrer to the resource it ultimately names and the edge is
|
|
338
|
+
* recorded against the surviving node — the thing a reader can actually carve
|
|
339
|
+
* or leave behind. The referrer's own body is where `carve bridge` then lands
|
|
340
|
+
* the rewrite.
|
|
341
|
+
*/
|
|
342
|
+
export function buildGraph(tree, exprRefs) {
|
|
343
|
+
const nodes = [];
|
|
344
|
+
const dataAddresses = new Set();
|
|
345
|
+
const referrers = resolveReferrers(referrerTable(tree, exprRefs));
|
|
346
|
+
// First pass: register data-source addresses so refs to them can be spotted.
|
|
347
|
+
for (const [type, named] of Object.entries(tree.data ?? {})) {
|
|
348
|
+
for (const name of Object.keys(named))
|
|
349
|
+
dataAddresses.add(`data.${type}.${name}`);
|
|
350
|
+
}
|
|
351
|
+
// Resource nodes.
|
|
352
|
+
const rawRefsByNode = new Map();
|
|
353
|
+
for (const [type, named] of Object.entries(tree.resource ?? {})) {
|
|
354
|
+
for (const [name, blocks] of Object.entries(named)) {
|
|
355
|
+
const address = `${type}.${name}`;
|
|
356
|
+
const block = Array.isArray(blocks) ? blocks[0] : blocks;
|
|
357
|
+
const dynamic = blockHasMeta(block, "count") || blockHasMeta(block, "for_each");
|
|
358
|
+
const refs = throughReferrers(refsInBlock(block, exprRefs), referrers);
|
|
359
|
+
const touchesData = refs.some((r) => dataAddresses.has(r.address));
|
|
360
|
+
rawRefsByNode.set(address, refs);
|
|
361
|
+
nodes.push({
|
|
362
|
+
address,
|
|
363
|
+
kind: "resource",
|
|
364
|
+
type,
|
|
365
|
+
name,
|
|
366
|
+
instances: 1,
|
|
367
|
+
hasDynamic: dynamic || touchesData,
|
|
368
|
+
identity: literalIdentity(block, type),
|
|
369
|
+
dataSourceValues: dataSourceValues(block, type),
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Module nodes.
|
|
374
|
+
for (const [name, blocks] of Object.entries(tree.module ?? {})) {
|
|
375
|
+
const address = `module.${name}`;
|
|
376
|
+
const block = Array.isArray(blocks) ? blocks[0] : blocks;
|
|
377
|
+
const dynamic = blockHasMeta(block, "count") || blockHasMeta(block, "for_each");
|
|
378
|
+
const refs = throughReferrers(refsInBlock(block, exprRefs), referrers);
|
|
379
|
+
const touchesData = refs.some((r) => dataAddresses.has(r.address));
|
|
380
|
+
rawRefsByNode.set(address, refs);
|
|
381
|
+
nodes.push({
|
|
382
|
+
address,
|
|
383
|
+
kind: "module",
|
|
384
|
+
name,
|
|
385
|
+
instances: 1,
|
|
386
|
+
hasDynamic: dynamic || touchesData,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
// Output blocks: referrers without being nodes (#1638). Their pseudo-address
|
|
390
|
+
// never joins `known`, so nothing can depend on an output in turn.
|
|
391
|
+
const outputRefs = new Map();
|
|
392
|
+
for (const [name, blocks] of Object.entries(tree.output ?? {})) {
|
|
393
|
+
const block = Array.isArray(blocks) ? blocks[0] : blocks;
|
|
394
|
+
outputRefs.set(`output.${name}`, throughReferrers(refsInBlock(block, exprRefs), referrers));
|
|
395
|
+
}
|
|
396
|
+
// Edges: keep only references that resolve to a known node.
|
|
397
|
+
const known = new Set(nodes.map((n) => n.address));
|
|
398
|
+
const edges = [];
|
|
399
|
+
const collect = (source, fromKind) => {
|
|
400
|
+
for (const [from, refs] of source) {
|
|
401
|
+
const byTarget = new Map();
|
|
402
|
+
for (const ref of refs) {
|
|
403
|
+
if (ref.address === from || !known.has(ref.address))
|
|
404
|
+
continue;
|
|
405
|
+
if (!byTarget.has(ref.address))
|
|
406
|
+
byTarget.set(ref.address, { attrs: new Set(), via: new Set() });
|
|
407
|
+
const target = byTarget.get(ref.address);
|
|
408
|
+
if (ref.attr)
|
|
409
|
+
target.attrs.add(ref.attr);
|
|
410
|
+
if (ref.via)
|
|
411
|
+
target.via.add(ref.via);
|
|
412
|
+
}
|
|
413
|
+
for (const [to, { attrs, via }] of byTarget) {
|
|
414
|
+
edges.push({ from, to, attrs: [...attrs].sort(), via: [...via].sort(), ...(fromKind ? { fromKind } : {}) });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
collect(rawRefsByNode);
|
|
419
|
+
collect(outputRefs, "output");
|
|
420
|
+
// Code-point ordering (not localeCompare) so output is locale-independent and
|
|
421
|
+
// punctuation sorts predictably (`.` < `_`).
|
|
422
|
+
const cmp = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
423
|
+
return {
|
|
424
|
+
nodes: nodes.sort((a, b) => cmp(a.address, b.address)),
|
|
425
|
+
edges: edges.sort((a, b) => cmp(a.from, b.from) || cmp(a.to, b.to)),
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/** Edges where something in the surviving Terraform depends on `address`. */
|
|
429
|
+
export function inboundEdges(graph, address) {
|
|
430
|
+
return graph.edges.filter((e) => e.to === address);
|
|
431
|
+
}
|
|
432
|
+
/** Edges where `address` depends on other nodes (each → a deferred deploy-time input). */
|
|
433
|
+
export function outboundEdges(graph, address) {
|
|
434
|
+
return graph.edges.filter((e) => e.from === address);
|
|
435
|
+
}
|