@intentius/chant 0.124.13 → 0.124.14
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.js +668 -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.js +312 -0
- package/dist/child-project.js +21 -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.js +134 -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.js +305 -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.js +208 -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 +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- 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.js +260 -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.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.js +193 -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.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.js +64 -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.js +997 -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.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.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.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- 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 +460 -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.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -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.js +587 -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.js +245 -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/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/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/lexicon-module.ts +3 -0
- 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/discover.ts +3 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +1 -1
package/dist/graph-ir.js
ADDED
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
import { relative, isAbsolute } from "node:path";
|
|
2
|
+
import { isAttrRefLike } from "./utils.js";
|
|
3
|
+
import { isDeclarable } from "./declarable.js";
|
|
4
|
+
import { isLexiconOutput } from "./lexicon-output.js";
|
|
5
|
+
import { getProvenance } from "./provenance.js";
|
|
6
|
+
import { INTRINSIC_MARKER } from "./intrinsic.js";
|
|
7
|
+
/** True when `value` has the {@link EntityReference} shape. */
|
|
8
|
+
function isEntityReference(value) {
|
|
9
|
+
return (typeof value === "object" &&
|
|
10
|
+
value !== null &&
|
|
11
|
+
typeof value.to === "string");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The references an entity declared for itself (#2265), or an empty list.
|
|
15
|
+
* Duck-typed on purpose, see {@link EntityReference}.
|
|
16
|
+
*/
|
|
17
|
+
export function entityReferences(entity) {
|
|
18
|
+
const declared = entity.references;
|
|
19
|
+
if (!Array.isArray(declared))
|
|
20
|
+
return [];
|
|
21
|
+
return declared.filter(isEntityReference);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The deployable unit an entity says it belongs to (#2266), or undefined.
|
|
25
|
+
*
|
|
26
|
+
* Same duck-typed channel as {@link entityReferences}, for the other half of
|
|
27
|
+
* the same problem. `groups.byStack` keys by lexicon partition when nothing
|
|
28
|
+
* says otherwise, on the reasoning that one lexicon serialises to one
|
|
29
|
+
* deployable stack. That reasoning is exactly wrong for a lexicon reading an
|
|
30
|
+
* estate that already has several: a terraform project declaring five
|
|
31
|
+
* `terraform.roots` has five things `terraform apply` runs against, and each
|
|
32
|
+
* one is a stack in every sense `byStack` means, so five roots landed in one
|
|
33
|
+
* bucket named `terraform`.
|
|
34
|
+
*
|
|
35
|
+
* The root is not inferable here and should not be: it is the producer's own
|
|
36
|
+
* name for its own unit. A consumer could recover it from the node id prefix
|
|
37
|
+
* the terraform lexicon mints, but an id convention is not a promise, and
|
|
38
|
+
* `byStack` is the field whose whole job is saying which box a node goes in.
|
|
39
|
+
*/
|
|
40
|
+
export function entityStack(entity) {
|
|
41
|
+
const stack = entity.stack;
|
|
42
|
+
return typeof stack === "string" && stack.length > 0 ? stack : undefined;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The version `chant graph --format ir` writes on its output (#2529, #2524 D8).
|
|
46
|
+
* The format changes only additively: a new field or edge kind never bumps
|
|
47
|
+
* it, and a consumer ignores the fields and edge kinds it does not know. The
|
|
48
|
+
* number moves only for a change a consumer could not ignore.
|
|
49
|
+
*/
|
|
50
|
+
export const GRAPH_IR_VERSION = 1;
|
|
51
|
+
/** A node is anything that serializes to a resource — not a property or output. */
|
|
52
|
+
function isNodeEntity(entity) {
|
|
53
|
+
if (isLexiconOutput(entity))
|
|
54
|
+
return false;
|
|
55
|
+
if (entity.kind === "property")
|
|
56
|
+
return false;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
function relFile(file, projectPath) {
|
|
60
|
+
if (!file)
|
|
61
|
+
return undefined;
|
|
62
|
+
if (projectPath && isAbsolute(file)) {
|
|
63
|
+
const rel = relative(projectPath, file);
|
|
64
|
+
return rel.startsWith("..") ? file : rel;
|
|
65
|
+
}
|
|
66
|
+
return file;
|
|
67
|
+
}
|
|
68
|
+
/** The logical name a `Ref`-style intrinsic points at, or undefined. Lexicon-
|
|
69
|
+
* agnostic: reads the intrinsic's `toJSON()` for the CloudFormation `{ Ref: name }`
|
|
70
|
+
* shape (aws `RefIntrinsic` etc.). A `Ref` to a node is a real dependency edge,
|
|
71
|
+
* not an opaque intrinsic (#513) — so we resolve it rather than flatten it. */
|
|
72
|
+
function refIntrinsicTarget(value) {
|
|
73
|
+
try {
|
|
74
|
+
const json = value.toJSON?.();
|
|
75
|
+
if (json && typeof json === "object" && typeof json.Ref === "string") {
|
|
76
|
+
return json.Ref;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Unresolvable at graph-build time — leave it as an opaque intrinsic.
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
/** Resolve the producer (logical name) an AttrRef points at. */
|
|
85
|
+
function refTarget(ref, reverse) {
|
|
86
|
+
// Nested refs (under `props`) aren't assigned a logical name by resolveAttrRefs,
|
|
87
|
+
// which only resolves top-level own props — so fall back to the parent's name.
|
|
88
|
+
const parent = ref.parent.deref();
|
|
89
|
+
return ref.getLogicalName() ?? (parent ? reverse.get(parent) : undefined);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The node id a whole declarable held in a config bag stands for, or undefined
|
|
93
|
+
* when it is not a node of this graph (an inlined property-kind resource, say,
|
|
94
|
+
* which is config of the holder and gets walked instead). An entity can name
|
|
95
|
+
* another entity directly rather than through an AttrRef, as the sql lexicon's
|
|
96
|
+
* enumerable `dependsOn` does with the tables, views and databases a statement
|
|
97
|
+
* mentions (#3257); that is a reference to the node, not a nested bag.
|
|
98
|
+
*/
|
|
99
|
+
function nodeReference(value, reverse, nodeIds) {
|
|
100
|
+
const id = reverse.get(value);
|
|
101
|
+
return id !== undefined && nodeIds.has(id) ? id : undefined;
|
|
102
|
+
}
|
|
103
|
+
/** Project a value into a JSON-safe, scrubbed form. References become `{ $ref }`. */
|
|
104
|
+
function project(value, seen, reverse, nodeIds) {
|
|
105
|
+
if (value === null)
|
|
106
|
+
return null;
|
|
107
|
+
const t = typeof value;
|
|
108
|
+
if (t === "string" || t === "number" || t === "boolean")
|
|
109
|
+
return value;
|
|
110
|
+
if (t !== "object")
|
|
111
|
+
return undefined; // functions, symbols, undefined
|
|
112
|
+
// Duck-type, not `instanceof`: a lexicon built against a different copy of
|
|
113
|
+
// `@intentius/chant` produces AttrRefs that fail `instanceof AttrRef` but carry
|
|
114
|
+
// the same shape. Without this, a real cross-resource reference falls through to
|
|
115
|
+
// the intrinsic branch below and is silently flattened to `{$intrinsic}` (#511).
|
|
116
|
+
if (isAttrRefLike(value)) {
|
|
117
|
+
const to = refTarget(value, reverse);
|
|
118
|
+
return { $ref: to ? `${to}.${value.attribute}` : value.attribute };
|
|
119
|
+
}
|
|
120
|
+
if (value[INTRINSIC_MARKER] === true) {
|
|
121
|
+
// A `Ref` to a known node is a real reference — surface it as `$ref` so attrs
|
|
122
|
+
// match the edge (#513). Other intrinsics (interpolations, pseudo-parameters,
|
|
123
|
+
// Ref to a non-node) stay opaque.
|
|
124
|
+
const to = refIntrinsicTarget(value);
|
|
125
|
+
if (to && nodeIds.has(to))
|
|
126
|
+
return { $ref: to };
|
|
127
|
+
return { $intrinsic: true };
|
|
128
|
+
}
|
|
129
|
+
if (seen.has(value))
|
|
130
|
+
return undefined; // break cycles
|
|
131
|
+
seen.add(value);
|
|
132
|
+
// Nested declarables (e.g. an inlined property-kind resource) keep their
|
|
133
|
+
// config in a non-enumerable `props` bag, like top-level nodes — project that.
|
|
134
|
+
if (isDeclarable(value)) {
|
|
135
|
+
// Another node held whole is a reference to it, not config to inline.
|
|
136
|
+
const to = nodeReference(value, reverse, nodeIds);
|
|
137
|
+
if (to)
|
|
138
|
+
return { $ref: to };
|
|
139
|
+
const out = projectConfig(value, seen, reverse, nodeIds);
|
|
140
|
+
seen.delete(value);
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
if (Array.isArray(value)) {
|
|
144
|
+
const out = value.map((v) => project(v, seen, reverse, nodeIds)).filter((v) => v !== undefined);
|
|
145
|
+
seen.delete(value);
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
const out = {};
|
|
149
|
+
for (const [k, v] of Object.entries(value)) {
|
|
150
|
+
const p = project(v, seen, reverse, nodeIds);
|
|
151
|
+
if (p !== undefined)
|
|
152
|
+
out[k] = p;
|
|
153
|
+
}
|
|
154
|
+
seen.delete(value);
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
// `references` and `stack` are the two duck-typed channels above
|
|
158
|
+
// ({@link entityReferences}, {@link entityStack}). They are metadata about the
|
|
159
|
+
// entity's place in the graph, not declared configuration, and both are read
|
|
160
|
+
// directly, so projecting them into `attrs` would only restate an edge and a
|
|
161
|
+
// group key the IR already carries.
|
|
162
|
+
const SKIP_KEYS = new Set(["lexicon", "entityType", "kind", "attributes", "Ref", "references", "stack"]);
|
|
163
|
+
/** The config bag of a node, paired with each key. Lexicon entities keep their
|
|
164
|
+
* declared props in a (usually non-enumerable) `props` object; simpler entities
|
|
165
|
+
* carry config as enumerable own properties. We surface both, flattening `props`
|
|
166
|
+
* so a field reads as e.g. `network`, not `props.network`. */
|
|
167
|
+
function configRoots(entity) {
|
|
168
|
+
const out = [];
|
|
169
|
+
for (const [k, v] of Object.entries(entity)) {
|
|
170
|
+
if (SKIP_KEYS.has(k) || k === "props")
|
|
171
|
+
continue;
|
|
172
|
+
out.push([k, v]);
|
|
173
|
+
}
|
|
174
|
+
const props = entity.props;
|
|
175
|
+
if (props && typeof props === "object" && !Array.isArray(props)) {
|
|
176
|
+
for (const [k, v] of Object.entries(props))
|
|
177
|
+
out.push([k, v]);
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
/** Project a declarable's config bag (flattened props + enumerable own props). */
|
|
182
|
+
function projectConfig(entity, seen, reverse, nodeIds) {
|
|
183
|
+
const out = {};
|
|
184
|
+
for (const [k, v] of configRoots(entity)) {
|
|
185
|
+
const p = project(v, seen, reverse, nodeIds);
|
|
186
|
+
if (p !== undefined)
|
|
187
|
+
out[k] = p;
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Collect ref edges from one node, labelling each with its consumer property.
|
|
193
|
+
*
|
|
194
|
+
* Two sources, merged here. First the references the entity resolved for
|
|
195
|
+
* itself ({@link EntityReference}), which is how a lexicon that parses HCL,
|
|
196
|
+
* YAML or any other foreign source says what its strings point at. Then the
|
|
197
|
+
* walk over the config bag for {@link AttrRef} objects and `Ref` intrinsics,
|
|
198
|
+
* which is how a typed lexicon's props carry the same fact. A lexicon uses one
|
|
199
|
+
* or the other; nothing stops it using both, and the dedup in `buildGraphIr`
|
|
200
|
+
* collapses an edge two sources agree on.
|
|
201
|
+
*/
|
|
202
|
+
function collectEdges(entity, from, nodeIds, reverse) {
|
|
203
|
+
const edges = [];
|
|
204
|
+
for (const ref of entityReferences(entity)) {
|
|
205
|
+
if (ref.to === from || !nodeIds.has(ref.to))
|
|
206
|
+
continue;
|
|
207
|
+
edges.push({
|
|
208
|
+
from,
|
|
209
|
+
to: ref.to,
|
|
210
|
+
kind: "ref",
|
|
211
|
+
...(ref.viaAttr ? { viaAttr: ref.viaAttr } : {}),
|
|
212
|
+
...(ref.toAttr ? { toAttr: ref.toAttr } : {}),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
const seen = new Set();
|
|
216
|
+
const visit = (value, viaAttr) => {
|
|
217
|
+
if (value === null || typeof value !== "object")
|
|
218
|
+
return;
|
|
219
|
+
if (isAttrRefLike(value)) {
|
|
220
|
+
const to = refTarget(value, reverse);
|
|
221
|
+
if (to && to !== from && nodeIds.has(to)) {
|
|
222
|
+
edges.push({ from, to, kind: "ref", viaAttr });
|
|
223
|
+
}
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (value[INTRINSIC_MARKER] === true) {
|
|
227
|
+
// A `Ref` to a known node (a Parameter, or a resource) is a real dependency
|
|
228
|
+
// — resolve it to an edge instead of dropping it as an opaque intrinsic (#513).
|
|
229
|
+
const to = refIntrinsicTarget(value);
|
|
230
|
+
if (to && to !== from && nodeIds.has(to))
|
|
231
|
+
edges.push({ from, to, kind: "ref", viaAttr });
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// A whole node held in props or an enumerable field (the sql lexicon's
|
|
235
|
+
// `dependsOn`) is a reference to it: draw the edge, and do not walk its
|
|
236
|
+
// config, whose refs belong to that node's own edges (#3257). Checked
|
|
237
|
+
// before `seen` so the same node under two attributes yields both edges.
|
|
238
|
+
const held = nodeReference(value, reverse, nodeIds);
|
|
239
|
+
if (held) {
|
|
240
|
+
if (held !== from)
|
|
241
|
+
edges.push({ from, to: held, kind: "ref", viaAttr });
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (seen.has(value))
|
|
245
|
+
return;
|
|
246
|
+
seen.add(value);
|
|
247
|
+
// A nested declarable (an inlined property-kind resource, e.g. a listener's
|
|
248
|
+
// `DefaultActions: [Listener_Action{ TargetGroupArn: tg.TargetGroupArn }]`)
|
|
249
|
+
// keeps its config in a NON-enumerable `props` bag, so `Object.values`
|
|
250
|
+
// below would walk right past the ref inside it and drop the edge. Descend
|
|
251
|
+
// via `configRoots` (which reads `props`), mirroring `project`'s handling —
|
|
252
|
+
// the ref then resolves to a real from→to edge on the containing node.
|
|
253
|
+
if (isDeclarable(value)) {
|
|
254
|
+
for (const [, v] of configRoots(value))
|
|
255
|
+
visit(v, viaAttr);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (Array.isArray(value)) {
|
|
259
|
+
for (const item of value)
|
|
260
|
+
visit(item, viaAttr);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
for (const v of Object.values(value))
|
|
264
|
+
visit(v, viaAttr);
|
|
265
|
+
};
|
|
266
|
+
for (const [k, v] of configRoots(entity))
|
|
267
|
+
visit(v, k);
|
|
268
|
+
return edges;
|
|
269
|
+
}
|
|
270
|
+
/** Stable key for deduping and sorting an edge. */
|
|
271
|
+
function edgeKey(e) {
|
|
272
|
+
return `${e.from}\0${e.to}\0${e.viaAttr ?? ""}`;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Build the graph IR from resolved entities (the output of `discover`). Pure and
|
|
276
|
+
* deterministic: nodes and edges are sorted, so the same source yields identical
|
|
277
|
+
* IR. `projectPath` relativizes source-file paths for portable output.
|
|
278
|
+
*/
|
|
279
|
+
export function buildGraphIr(entities, projectPath) {
|
|
280
|
+
var _a, _b, _c;
|
|
281
|
+
// Reverse lookup for producers whose AttrRef logical name wasn't resolved.
|
|
282
|
+
const reverse = new Map();
|
|
283
|
+
for (const [name, entity] of entities)
|
|
284
|
+
reverse.set(entity, name);
|
|
285
|
+
const nodeIds = new Set();
|
|
286
|
+
for (const [name, entity] of entities) {
|
|
287
|
+
if (isNodeEntity(entity))
|
|
288
|
+
nodeIds.add(name);
|
|
289
|
+
}
|
|
290
|
+
const nodes = [];
|
|
291
|
+
const byLexicon = {};
|
|
292
|
+
const byComposite = {};
|
|
293
|
+
const byStack = {};
|
|
294
|
+
for (const [name, entity] of entities) {
|
|
295
|
+
if (!nodeIds.has(name))
|
|
296
|
+
continue;
|
|
297
|
+
const prov = getProvenance(entity);
|
|
298
|
+
const node = {
|
|
299
|
+
id: name,
|
|
300
|
+
kind: entity.entityType,
|
|
301
|
+
lexicon: entity.lexicon,
|
|
302
|
+
attrs: projectConfig(entity, new Set(), reverse, nodeIds),
|
|
303
|
+
};
|
|
304
|
+
if (prov?.composite)
|
|
305
|
+
node.compositeParent = prov.composite;
|
|
306
|
+
if (prov?.compositeInstance)
|
|
307
|
+
node.compositeInstance = prov.compositeInstance;
|
|
308
|
+
const file = relFile(prov?.sourceFile, projectPath);
|
|
309
|
+
if (file)
|
|
310
|
+
node.sourceLoc = { file };
|
|
311
|
+
nodes.push(node);
|
|
312
|
+
(byLexicon[_a = entity.lexicon] ?? (byLexicon[_a] = [])).push(name);
|
|
313
|
+
// An entity that names its own deployable unit is taken at its word
|
|
314
|
+
// (#2266): a terraform root is one `terraform apply`, and a project
|
|
315
|
+
// declaring five of them has five stacks whatever the lexicon count says.
|
|
316
|
+
// See {@link entityStack}.
|
|
317
|
+
//
|
|
318
|
+
// Otherwise, within ONE source tree a stack is a lexicon partition — each
|
|
319
|
+
// lexicon serialises to one deployable stack (a CloudFormation template, a
|
|
320
|
+
// CI config) — so that is what `byStack` reports. It stays a distinct axis
|
|
321
|
+
// from `byLexicon` (which is for provenance/colouring), emitted separately
|
|
322
|
+
// even where the two coincide.
|
|
323
|
+
//
|
|
324
|
+
// A project with genuinely separate, side-by-side stacks declares them in
|
|
325
|
+
// config, and `buildDeclaredPerStack` (./graph-declared.ts) groups those by
|
|
326
|
+
// their declared names — no inference, since the project already said. That
|
|
327
|
+
// is the multi-stack shape chant steers toward (#1433).
|
|
328
|
+
//
|
|
329
|
+
// This previously promised that "#513 phase 2 will regroup it by nested
|
|
330
|
+
// child-project". #513 is closed, that phase was never filed, and directory
|
|
331
|
+
// partitioning is the exception rather than the rule — so the promise is
|
|
332
|
+
// withdrawn rather than left pointing at a closed issue.
|
|
333
|
+
(byStack[_b = entityStack(entity) ?? entity.lexicon] ?? (byStack[_b] = [])).push(name);
|
|
334
|
+
if (prov?.composite)
|
|
335
|
+
(byComposite[_c = prov.composite] ?? (byComposite[_c] = [])).push(name);
|
|
336
|
+
}
|
|
337
|
+
const edgeMap = new Map();
|
|
338
|
+
for (const [name, entity] of entities) {
|
|
339
|
+
if (!nodeIds.has(name))
|
|
340
|
+
continue;
|
|
341
|
+
for (const e of collectEdges(entity, name, nodeIds, reverse)) {
|
|
342
|
+
edgeMap.set(edgeKey(e), e);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
nodes.sort((a, b) => a.id.localeCompare(b.id));
|
|
346
|
+
const edges = [...edgeMap.values()].sort((a, b) => edgeKey(a).localeCompare(edgeKey(b)));
|
|
347
|
+
for (const ids of Object.values(byLexicon))
|
|
348
|
+
ids.sort();
|
|
349
|
+
for (const ids of Object.values(byComposite))
|
|
350
|
+
ids.sort();
|
|
351
|
+
for (const ids of Object.values(byStack))
|
|
352
|
+
ids.sort();
|
|
353
|
+
const groups = {};
|
|
354
|
+
if (Object.keys(byLexicon).length)
|
|
355
|
+
groups.byLexicon = sortKeys(byLexicon);
|
|
356
|
+
if (Object.keys(byComposite).length)
|
|
357
|
+
groups.byComposite = sortKeys(byComposite);
|
|
358
|
+
if (Object.keys(byStack).length)
|
|
359
|
+
groups.byStack = sortKeys(byStack);
|
|
360
|
+
// Cross-stack exports: a stack's `output(ref, name)` LexiconOutputs are dropped
|
|
361
|
+
// from the node set (they're not resources), but their name + producing node is
|
|
362
|
+
// the handle another stack imports by. Surface them so a viewer can draw the
|
|
363
|
+
// cross-stack edge (#513). Resolve the producer via the output's source entity.
|
|
364
|
+
const exports = [];
|
|
365
|
+
for (const entity of entities.values()) {
|
|
366
|
+
if (!isLexiconOutput(entity))
|
|
367
|
+
continue;
|
|
368
|
+
const lo = entity;
|
|
369
|
+
if (!lo.outputName)
|
|
370
|
+
continue;
|
|
371
|
+
const parent = lo._sourceParent?.deref();
|
|
372
|
+
const node = (parent ? reverse.get(parent) : undefined) ?? (lo.sourceEntity || undefined);
|
|
373
|
+
exports.push({ name: lo.outputName, ...(node ? { node } : {}), ...(lo.sourceAttribute ? { attr: lo.sourceAttribute } : {}) });
|
|
374
|
+
}
|
|
375
|
+
exports.sort((a, b) => a.name.localeCompare(b.name));
|
|
376
|
+
// Cross-stack imports: parameter nodes are the handles this stack imports by,
|
|
377
|
+
// matched to another stack's export names (#513). Detected by kind — the aws
|
|
378
|
+
// `Parameter` is the cross-stack input mechanism.
|
|
379
|
+
const imports = nodes
|
|
380
|
+
.filter((n) => /(^|::)Parameter$/i.test(n.kind))
|
|
381
|
+
.map((n) => ({ name: n.id, node: n.id }))
|
|
382
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
383
|
+
const ir = { nodes, edges, groups };
|
|
384
|
+
if (exports.length)
|
|
385
|
+
ir.exports = exports;
|
|
386
|
+
if (imports.length)
|
|
387
|
+
ir.imports = imports;
|
|
388
|
+
return ir;
|
|
389
|
+
}
|
|
390
|
+
function sortKeys(rec) {
|
|
391
|
+
const out = {};
|
|
392
|
+
for (const k of Object.keys(rec).sort())
|
|
393
|
+
out[k] = rec[k];
|
|
394
|
+
return out;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Build the graph IR from **live-observed** resources (`chant graph --live`) —
|
|
398
|
+
* the provisioned graph, not the declared one. This is the C1 half of epic #776:
|
|
399
|
+
* nodes only. Edges are reconstructed separately by the per-lexicon reference
|
|
400
|
+
* resolver (#778); containment grouping by #779. Pure and deterministic given a
|
|
401
|
+
* fixed observation set (nodes and group ids sorted), so the same snapshot yields
|
|
402
|
+
* identical IR.
|
|
403
|
+
*
|
|
404
|
+
* Each node carries the observed `physicalId` (the reference resolver's index
|
|
405
|
+
* key) and `ownership` marker. `attrs` is the resource's observed attributes.
|
|
406
|
+
*/
|
|
407
|
+
export function buildLiveGraphIr(observations) {
|
|
408
|
+
const nodes = [];
|
|
409
|
+
const byLexicon = {};
|
|
410
|
+
const byStack = {};
|
|
411
|
+
for (const { lexicon, resources } of observations) {
|
|
412
|
+
for (const [name, meta] of Object.entries(resources)) {
|
|
413
|
+
const node = {
|
|
414
|
+
id: name,
|
|
415
|
+
kind: meta.type,
|
|
416
|
+
lexicon,
|
|
417
|
+
attrs: meta.attributes ?? {},
|
|
418
|
+
};
|
|
419
|
+
if (meta.physicalId)
|
|
420
|
+
node.physicalId = meta.physicalId;
|
|
421
|
+
// `unknown` is a legitimate verdict on the metadata (#1089) but carries no
|
|
422
|
+
// information for a painter, and the IR's `ownership` field means "a
|
|
423
|
+
// verdict was reached" — so only owned/foreign land on the node.
|
|
424
|
+
if (meta.ownership === "owned" || meta.ownership === "foreign")
|
|
425
|
+
node.ownership = meta.ownership;
|
|
426
|
+
// Owner-reference chain (#1077): only a resolved `declared` root is
|
|
427
|
+
// carried onto the node — the same "a verdict was reached" rule as
|
|
428
|
+
// ownership above, since `unowned`/`foreign`/`unknown` all mean "no
|
|
429
|
+
// declared owner", which is simply the absence of this field.
|
|
430
|
+
if (meta.ownerChain?.root === "declared")
|
|
431
|
+
node.runtimeOwner = meta.ownerChain.entity;
|
|
432
|
+
nodes.push(node);
|
|
433
|
+
(byLexicon[lexicon] ?? (byLexicon[lexicon] = [])).push(name);
|
|
434
|
+
// A live lexicon maps to one deployable stack, same as the source IR.
|
|
435
|
+
(byStack[lexicon] ?? (byStack[lexicon] = [])).push(name);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
nodes.sort((a, b) => a.id.localeCompare(b.id));
|
|
439
|
+
for (const ids of Object.values(byLexicon))
|
|
440
|
+
ids.sort();
|
|
441
|
+
for (const ids of Object.values(byStack))
|
|
442
|
+
ids.sort();
|
|
443
|
+
const groups = {};
|
|
444
|
+
if (Object.keys(byLexicon).length)
|
|
445
|
+
groups.byLexicon = sortKeys(byLexicon);
|
|
446
|
+
if (Object.keys(byStack).length)
|
|
447
|
+
groups.byStack = sortKeys(byStack);
|
|
448
|
+
// Observed relationships (#1271). An edge whose endpoints were not both
|
|
449
|
+
// observed is dropped rather than kept as a dangling reference: the fold
|
|
450
|
+
// resolves ids to nodes, and a half-edge would silently traverse to nothing.
|
|
451
|
+
// Deduped and sorted for the same reason nodes are — the IR is compared and
|
|
452
|
+
// committed, so it has to be stable across reads.
|
|
453
|
+
const observedIds = new Set(nodes.map((n) => n.id));
|
|
454
|
+
const seen = new Set();
|
|
455
|
+
const edges = [];
|
|
456
|
+
for (const observation of observations) {
|
|
457
|
+
for (const edge of observation.edges ?? []) {
|
|
458
|
+
if (!observedIds.has(edge.from) || !observedIds.has(edge.to))
|
|
459
|
+
continue;
|
|
460
|
+
const key = `${edge.from}\u0000${edge.to}\u0000${edge.viaAttr ?? ""}\u0000${edge.toAttr ?? ""}`;
|
|
461
|
+
if (seen.has(key))
|
|
462
|
+
continue;
|
|
463
|
+
seen.add(key);
|
|
464
|
+
edges.push(edge);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
edges.sort((a, b) => a.from.localeCompare(b.from) ||
|
|
468
|
+
a.to.localeCompare(b.to) ||
|
|
469
|
+
(a.viaAttr ?? "").localeCompare(b.viaAttr ?? ""));
|
|
470
|
+
// Stack exports (#1279) land on the IR's `exports`, the same place the
|
|
471
|
+
// declared graph keeps what a stack publishes — not on the member nodes.
|
|
472
|
+
const exports = [];
|
|
473
|
+
for (const observation of observations) {
|
|
474
|
+
for (const [stack, values] of Object.entries(observation.stackExports ?? {})) {
|
|
475
|
+
for (const [name, value] of Object.entries(values))
|
|
476
|
+
exports.push({ name, value, stack });
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
exports.sort((a, b) => a.name.localeCompare(b.name) || (a.stack ?? "").localeCompare(b.stack ?? ""));
|
|
480
|
+
return { nodes, edges, groups, ...(exports.length > 0 ? { exports } : {}) };
|
|
481
|
+
}
|
|
482
|
+
/** The union of every observation's unobserved entities — the input to the overlays. */
|
|
483
|
+
export function collectUnobserved(observations) {
|
|
484
|
+
const out = {};
|
|
485
|
+
for (const o of observations)
|
|
486
|
+
Object.assign(out, o.unobserved ?? {});
|
|
487
|
+
return out;
|
|
488
|
+
}
|
|
489
|
+
function tagStatus(n, status, unobserved) {
|
|
490
|
+
return {
|
|
491
|
+
...n,
|
|
492
|
+
attrs: {
|
|
493
|
+
...n.attrs,
|
|
494
|
+
_status: status,
|
|
495
|
+
...(unobserved ? { _unobserved: unobserved.reason } : {}),
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Overlay the declared graph on the provisioned one (#780, `chant graph --live
|
|
501
|
+
* --overlay`) and classify each resource, tagging a `_status` a renderer colours:
|
|
502
|
+
* - **managed** (declared + provisioned) → `good`
|
|
503
|
+
* - **runtime** (provisioned, not declared, owner chain reaches a declared
|
|
504
|
+
* entity — #1077) → `runtime`, e.g. a Pod a declared Deployment's
|
|
505
|
+
* controller created — expected, not a foreign resource needing attention
|
|
506
|
+
* - **foreign** (provisioned, not declared, no declared owner) → `warn`
|
|
507
|
+
* - **pending** (declared, provider confirmed absent) → `accent`
|
|
508
|
+
* - **unobserved** (declared, chant could not look — #1089) → `neutral`,
|
|
509
|
+
* plus an `_unobserved` attr carrying the reason
|
|
510
|
+
* Live nodes keep their edges/containment; pending nodes are appended (they have
|
|
511
|
+
* no live edges). Sorted; the live groups pass through unchanged.
|
|
512
|
+
*/
|
|
513
|
+
export function overlayGraphs(live, declared, opts) {
|
|
514
|
+
const declaredIds = new Set(declared.nodes.map((n) => n.id));
|
|
515
|
+
const liveIds = new Set(live.nodes.map((n) => n.id));
|
|
516
|
+
const unobserved = opts?.unobserved ?? {};
|
|
517
|
+
const nodes = live.nodes.map((n) => tagStatus(n, declaredIds.has(n.id) ? "good" : n.runtimeOwner ? "runtime" : "warn"));
|
|
518
|
+
for (const n of declared.nodes) {
|
|
519
|
+
if (liveIds.has(n.id))
|
|
520
|
+
continue;
|
|
521
|
+
const u = unobserved[n.id];
|
|
522
|
+
nodes.push(u ? tagStatus(n, "neutral", u) : tagStatus(n, "accent"));
|
|
523
|
+
}
|
|
524
|
+
nodes.sort((a, b) => a.id.localeCompare(b.id));
|
|
525
|
+
return { ...live, nodes };
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Source-anchored overlay (#821) — the inverse of {@link overlayGraphs}. The
|
|
529
|
+
* **declared** graph is the canvas, so its edges are kept: cross-substrate edges
|
|
530
|
+
* (an ECS service wired to a k8s workload) are a source-graph property, since live
|
|
531
|
+
* reconstruction is per-substrate (identifier value-match) and never crosses
|
|
532
|
+
* providers. Use this when the overlay must keep the mixed topology; use
|
|
533
|
+
* `overlayGraphs` when the provisioned graph itself is the subject.
|
|
534
|
+
*
|
|
535
|
+
* Each declared node is classified against live observation and tagged `_status`:
|
|
536
|
+
* - **managed** (declared + provisioned) → `good`, carrying the observed
|
|
537
|
+
* `physicalId` / `ownership` onto the declared node
|
|
538
|
+
* - **pending** (declared, provider confirmed absent) → `accent`
|
|
539
|
+
* - **unobserved** (declared, chant could not look — #1089) → `neutral`, with
|
|
540
|
+
* the reason on `_unobserved`. A wrong-cluster or unsupported-kind read used
|
|
541
|
+
* to paint the whole estate "pending", which is the diagram equivalent of
|
|
542
|
+
* planning a create for something that already exists.
|
|
543
|
+
* **Foreign** resources (provisioned, not declared, no declared owner) are
|
|
544
|
+
* appended and tagged `warn`; a provisioned-but-undeclared resource whose
|
|
545
|
+
* owner chain reaches a declared entity (#1077) is tagged `runtime` instead —
|
|
546
|
+
* both carry any live-reconstructed edges that touch them, since a declared
|
|
547
|
+
* edge cannot describe an undeclared resource. Declared groups/exports pass
|
|
548
|
+
* through unchanged; nodes and edges are sorted for deterministic output.
|
|
549
|
+
*/
|
|
550
|
+
export function sourceOverlayGraphs(declared, live, opts) {
|
|
551
|
+
const liveById = new Map(live.nodes.map((n) => [n.id, n]));
|
|
552
|
+
const declaredIds = new Set(declared.nodes.map((n) => n.id));
|
|
553
|
+
const foreignIds = new Set(live.nodes.filter((n) => !declaredIds.has(n.id)).map((n) => n.id));
|
|
554
|
+
const unobserved = opts?.unobserved ?? {};
|
|
555
|
+
const nodes = declared.nodes.map((n) => {
|
|
556
|
+
const obs = liveById.get(n.id);
|
|
557
|
+
if (!obs) {
|
|
558
|
+
const u = unobserved[n.id];
|
|
559
|
+
// unobserved — declared, and nobody looked; not "pending"
|
|
560
|
+
return u ? tagStatus(n, "neutral", u) : tagStatus(n, "accent");
|
|
561
|
+
}
|
|
562
|
+
const merged = { ...n }; // managed — carry the observed identity
|
|
563
|
+
if (obs.physicalId)
|
|
564
|
+
merged.physicalId = obs.physicalId;
|
|
565
|
+
if (obs.ownership)
|
|
566
|
+
merged.ownership = obs.ownership;
|
|
567
|
+
// ...and what was observed ABOUT it (#1279). The declared canvas holds what
|
|
568
|
+
// the source says; the observation holds what the account says, and a fact
|
|
569
|
+
// like `VpcId` exists only on the second. Dropping it here made every
|
|
570
|
+
// observed property invisible to anything reading the overlaid graph —
|
|
571
|
+
// `search --show VpcId` printed six blank columns, which reads as an estate
|
|
572
|
+
// with no VPCs rather than a read that never happened.
|
|
573
|
+
//
|
|
574
|
+
// Observed wins a collision. The declared value for something like `VpcId`
|
|
575
|
+
// is an unresolved reference to another entity, not an id — the account has
|
|
576
|
+
// the id. Same precedence `enrichLiveAttrs` already uses when it folds live
|
|
577
|
+
// facts onto this graph, so both paths agree on what a name means.
|
|
578
|
+
if (obs.attrs && Object.keys(obs.attrs).length > 0)
|
|
579
|
+
merged.attrs = { ...n.attrs, ...obs.attrs };
|
|
580
|
+
return tagStatus(merged, "good");
|
|
581
|
+
});
|
|
582
|
+
for (const n of live.nodes) {
|
|
583
|
+
if (!foreignIds.has(n.id))
|
|
584
|
+
continue;
|
|
585
|
+
nodes.push(tagStatus(n, n.runtimeOwner ? "runtime" : "warn")); // runtime child or foreign
|
|
586
|
+
}
|
|
587
|
+
nodes.sort((a, b) => a.id.localeCompare(b.id));
|
|
588
|
+
// Declared edges are the canvas (the cross-substrate topology). Add only the
|
|
589
|
+
// live edges that touch a foreign node — declared edges already cover every
|
|
590
|
+
// declared relationship, so keeping all live edges would double managed ones.
|
|
591
|
+
const seen = new Set(declared.edges.map(edgeKey));
|
|
592
|
+
const edges = [...declared.edges];
|
|
593
|
+
for (const e of live.edges) {
|
|
594
|
+
if (!(foreignIds.has(e.from) || foreignIds.has(e.to)))
|
|
595
|
+
continue;
|
|
596
|
+
const k = edgeKey(e);
|
|
597
|
+
if (seen.has(k))
|
|
598
|
+
continue;
|
|
599
|
+
seen.add(k);
|
|
600
|
+
edges.push(e);
|
|
601
|
+
}
|
|
602
|
+
edges.sort((a, b) => edgeKey(a).localeCompare(edgeKey(b)));
|
|
603
|
+
// Observed export values (#1279) join the declared exports by name: the
|
|
604
|
+
// declaration says which node publishes it, the observation says what it
|
|
605
|
+
// currently is. An export only the stack carries is appended.
|
|
606
|
+
const liveExports = live.exports ?? [];
|
|
607
|
+
let exports = declared.exports;
|
|
608
|
+
if (liveExports.length > 0) {
|
|
609
|
+
const byName = new Map(liveExports.map((e) => [e.name, e]));
|
|
610
|
+
const merged = (declared.exports ?? []).map((e) => {
|
|
611
|
+
const obs = byName.get(e.name);
|
|
612
|
+
if (!obs)
|
|
613
|
+
return e;
|
|
614
|
+
byName.delete(e.name);
|
|
615
|
+
return { ...e, value: obs.value, ...(obs.stack ? { stack: obs.stack } : {}) };
|
|
616
|
+
});
|
|
617
|
+
for (const e of byName.values())
|
|
618
|
+
merged.push(e);
|
|
619
|
+
merged.sort((a, b) => a.name.localeCompare(b.name));
|
|
620
|
+
exports = merged;
|
|
621
|
+
}
|
|
622
|
+
return { ...declared, nodes, edges, ...(exports ? { exports } : {}) };
|
|
623
|
+
}
|