@intentius/chant 0.124.12 → 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.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- 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.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- 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.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.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.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- 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.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- 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 +36 -6
- 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/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -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/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -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/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- 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 +5 -30
package/dist/builder.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for builder pattern implementations
|
|
3
|
+
*
|
|
4
|
+
* Provides a fluent API for constructing Declarable entities.
|
|
5
|
+
* Subclasses should implement the build() method to return
|
|
6
|
+
* a fully constructed Declarable entity.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* class ResourceBuilder extends Builder<MyResource> {
|
|
11
|
+
* private name?: string;
|
|
12
|
+
* private type?: string;
|
|
13
|
+
*
|
|
14
|
+
* withName(name: string): this {
|
|
15
|
+
* this.name = name;
|
|
16
|
+
* return this;
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* withType(type: string): this {
|
|
20
|
+
* this.type = type;
|
|
21
|
+
* return this;
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* build(): MyResource {
|
|
25
|
+
* if (!this.name || !this.type) {
|
|
26
|
+
* throw new Error("Name and type are required");
|
|
27
|
+
* }
|
|
28
|
+
* return {
|
|
29
|
+
* entityType: "MyResource",
|
|
30
|
+
* [DECLARABLE_MARKER]: true,
|
|
31
|
+
* name: this.name,
|
|
32
|
+
* type: this.type,
|
|
33
|
+
* };
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* const resource = new ResourceBuilder()
|
|
38
|
+
* .withName("myResource")
|
|
39
|
+
* .withType("custom")
|
|
40
|
+
* .build();
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export class Builder {
|
|
44
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CDK half of `chant carve advise` (#1056): read a cloud assembly, rank its
|
|
3
|
+
* constructs with the same model the Terraform advisor uses.
|
|
4
|
+
*
|
|
5
|
+
* Read-only, like the Terraform path — it emits nothing, patches nothing, and
|
|
6
|
+
* touches no live resource. `carve emit`, `carve bridge` and `carve apply` are
|
|
7
|
+
* deliberately Terraform-only: bridging a CDK carve means rewriting the
|
|
8
|
+
* surviving app's source, which does not generalize across jsii languages.
|
|
9
|
+
*/
|
|
10
|
+
import { readCloudAssembly } from "./assembly.js";
|
|
11
|
+
import { buildCdkGraph } from "./graph.js";
|
|
12
|
+
import { resolveCfnTier } from "./tier-map.js";
|
|
13
|
+
import { scoreEstate } from "../terraform/score.js";
|
|
14
|
+
/** The bridge vocabulary a CDK report's boundary edges are named in. */
|
|
15
|
+
export const CDK_DIALECT = "cdk";
|
|
16
|
+
/**
|
|
17
|
+
* Rank a cloud assembly. The scoring model, the bands and the report shape are
|
|
18
|
+
* the Terraform path's, verbatim; what changes is the tier lookup (already in
|
|
19
|
+
* CloudFormation type space, so no translation) and the signals only a CDK
|
|
20
|
+
* reader can see — assets, nested stacks, L3 subtrees, a dummy-value assembly.
|
|
21
|
+
*/
|
|
22
|
+
export function adviseCloudAssembly(dir) {
|
|
23
|
+
const assembly = readCloudAssembly(dir);
|
|
24
|
+
const { graph, signals, diagnostics } = buildCdkGraph(assembly);
|
|
25
|
+
const scoreOptions = {
|
|
26
|
+
tierOf: resolveCfnTier,
|
|
27
|
+
signalsFor: (node) => signals.get(node.address) ?? {},
|
|
28
|
+
};
|
|
29
|
+
return { graph, results: scoreEstate(graph, scoreOptions), scoreOptions, diagnostics };
|
|
30
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a CDK cloud assembly off disk (#1056).
|
|
3
|
+
*
|
|
4
|
+
* The only filesystem layer the CDK advisor needs. Detection is by content, not
|
|
5
|
+
* a flag: a directory holding `manifest.json` plus at least one
|
|
6
|
+
* `*.template.json` is a cloud assembly, so `chant carve advise --from ./cdk.out`
|
|
7
|
+
* routes itself.
|
|
8
|
+
*
|
|
9
|
+
* A malformed or truncated assembly degrades rather than throws — a stack whose
|
|
10
|
+
* template will not parse is dropped with a diagnostic, and the rest is still
|
|
11
|
+
* ranked. The advisor is read-only, so a partial read costs nothing but a
|
|
12
|
+
* shorter report.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "fs";
|
|
15
|
+
import { join } from "path";
|
|
16
|
+
/** Every `*.template.json` directly under `dir`. */
|
|
17
|
+
function listTemplates(dir) {
|
|
18
|
+
return readdirSync(dir)
|
|
19
|
+
.filter((f) => f.endsWith(".template.json"))
|
|
20
|
+
.sort();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Is `dir` a CDK cloud assembly? `manifest.json` plus at least one synthesized
|
|
24
|
+
* template. Both are required: `manifest.json` alone is far too common a
|
|
25
|
+
* filename to claim on sight.
|
|
26
|
+
*/
|
|
27
|
+
export function isCloudAssembly(dir) {
|
|
28
|
+
try {
|
|
29
|
+
if (!existsSync(dir) || !statSync(dir).isDirectory())
|
|
30
|
+
return false;
|
|
31
|
+
if (!existsSync(join(dir, "manifest.json")))
|
|
32
|
+
return false;
|
|
33
|
+
return listTemplates(dir).length > 0;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Why a Terraform-only carve phase refuses a cloud assembly (#1056).
|
|
41
|
+
*
|
|
42
|
+
* Advise is the only phase that reads CDK. Bridging a carve means rewriting the
|
|
43
|
+
* surviving app's source so it reimports what was taken, and CDK source is
|
|
44
|
+
* TypeScript, Python, Java or C# depending on who wrote it — nothing that
|
|
45
|
+
* generalizes the way patching HCL does. Better to say so than to parse the
|
|
46
|
+
* assembly's `.tf` files, find none, and report an empty estate.
|
|
47
|
+
*/
|
|
48
|
+
export function cdkNotSupported(dir, phase) {
|
|
49
|
+
return (`${dir} is a CDK cloud assembly, and \`chant carve ${phase}\` reads Terraform. ` +
|
|
50
|
+
`\`chant carve advise --from ${dir}\` ranks it read-only; emit, bridge and apply are Terraform-only.`);
|
|
51
|
+
}
|
|
52
|
+
function readJson(path) {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The stack's construct path. `displayName` carries it when the stack sits in a
|
|
62
|
+
* Stage (`Stage/AppStack` for artifact id `Stage-AppStack`); otherwise the
|
|
63
|
+
* artifact id is the path.
|
|
64
|
+
*/
|
|
65
|
+
function stackPath(id, displayName) {
|
|
66
|
+
return typeof displayName === "string" && displayName.length > 0 ? displayName : id;
|
|
67
|
+
}
|
|
68
|
+
/** Index `tree.json` by construct path, so a resource's path resolves in one lookup. */
|
|
69
|
+
export function indexTree(root) {
|
|
70
|
+
const byPath = new Map();
|
|
71
|
+
const visit = (node) => {
|
|
72
|
+
if (typeof node.path === "string")
|
|
73
|
+
byPath.set(node.path, node);
|
|
74
|
+
for (const child of Object.values(node.children ?? {}))
|
|
75
|
+
visit(child);
|
|
76
|
+
};
|
|
77
|
+
if (root)
|
|
78
|
+
visit(root);
|
|
79
|
+
return byPath;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Read the assembly at `dir`. Throws only when the directory is not an assembly
|
|
83
|
+
* at all — everything past that point is a diagnostic.
|
|
84
|
+
*/
|
|
85
|
+
export function readCloudAssembly(dir) {
|
|
86
|
+
const diagnostics = [];
|
|
87
|
+
const manifest = readJson(join(dir, "manifest.json"));
|
|
88
|
+
if (!manifest) {
|
|
89
|
+
throw new Error(`${join(dir, "manifest.json")} is not readable JSON — not a CDK cloud assembly.`);
|
|
90
|
+
}
|
|
91
|
+
const tree = readJson(join(dir, "tree.json"))?.tree;
|
|
92
|
+
if (!tree) {
|
|
93
|
+
diagnostics.push("No tree.json in the assembly — CloudFormation resources are grouped by their construct path alone, " +
|
|
94
|
+
"so sibling constructs of one L2 (a function's role and policy, say) rank separately instead of folding in.");
|
|
95
|
+
}
|
|
96
|
+
const stacks = [];
|
|
97
|
+
const artifacts = Object.entries(manifest.artifacts ?? {});
|
|
98
|
+
for (const [id, artifact] of artifacts) {
|
|
99
|
+
if (artifact?.type !== "aws:cloudformation:stack")
|
|
100
|
+
continue;
|
|
101
|
+
const templateFile = artifact.properties?.templateFile;
|
|
102
|
+
if (typeof templateFile !== "string") {
|
|
103
|
+
diagnostics.push(`Stack artifact ${id} names no templateFile — skipped.`);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const template = readJson(join(dir, templateFile));
|
|
107
|
+
if (!template) {
|
|
108
|
+
diagnostics.push(`Could not read ${templateFile} for stack ${id} — skipped.`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
stacks.push({ id, path: stackPath(id, artifact.displayName), templateFile, template });
|
|
112
|
+
}
|
|
113
|
+
if (stacks.length === 0) {
|
|
114
|
+
// Templates exist (isCloudAssembly said so) but no artifact claims them —
|
|
115
|
+
// an assembly written by something other than `cdk synth`, or a manifest
|
|
116
|
+
// from a version this does not understand. Say so rather than reporting an
|
|
117
|
+
// empty estate as if the app were empty.
|
|
118
|
+
diagnostics.push("The manifest declares no aws:cloudformation:stack artifacts, so no template was ranked. " +
|
|
119
|
+
"Re-synthesize with `cdk synth` and point --from at the resulting cdk.out.");
|
|
120
|
+
}
|
|
121
|
+
return { dir, manifest, tree, stacks: stacks.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)), diagnostics };
|
|
122
|
+
}
|
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn a CDK cloud assembly into the same dependency graph the Terraform
|
|
3
|
+
* advisor scores (#1056).
|
|
4
|
+
*
|
|
5
|
+
* Two jobs, both exact rather than heuristic:
|
|
6
|
+
*
|
|
7
|
+
* **Grouping.** CloudFormation resources are the wrong unit to rank. One L2
|
|
8
|
+
* construct emits several of them — a `Function` emits a role, a policy and the
|
|
9
|
+
* function — and they carve together or not at all. Every resource carries its
|
|
10
|
+
* emitting construct in `Metadata["aws:cdk:path"]`, and `tree.json` says which
|
|
11
|
+
* ancestor of that path is the construct a person actually wrote. So resources
|
|
12
|
+
* fold up to the shallowest L2 (or L3) ancestor and that construct ranks once.
|
|
13
|
+
* This is the CDK analogue of Terraform sub-resources folding into their parent.
|
|
14
|
+
*
|
|
15
|
+
* **Edges.** `Ref`, `Fn::GetAtt` and `Fn::Sub` are intra-stack; `Fn::ImportValue`
|
|
16
|
+
* resolves through the exporting stack's `Outputs` to the construct that
|
|
17
|
+
* actually produces the value, so a cross-stack dependency lands as a real edge
|
|
18
|
+
* between two constructs in both directions rather than a dangling name. There
|
|
19
|
+
* is no expression AST to consult and no regex over HCL: the template is JSON,
|
|
20
|
+
* and an intrinsic is a JSON object with a known key.
|
|
21
|
+
*
|
|
22
|
+
* Pure — no filesystem, no CDK CLI. `assembly.ts` does the reading.
|
|
23
|
+
*/
|
|
24
|
+
import { indexTree } from "./assembly.js";
|
|
25
|
+
import { NESTED_STACK_TYPE, SCAFFOLDING_TYPES, isScaffoldingParameter, resolveCfnTier } from "./tier-map.js";
|
|
26
|
+
const CONTAINER_FQNS = new Set([
|
|
27
|
+
"aws-cdk-lib.App",
|
|
28
|
+
"aws-cdk-lib.Stack",
|
|
29
|
+
"aws-cdk-lib.Stage",
|
|
30
|
+
"aws-cdk-lib.TreeMetadata",
|
|
31
|
+
"@aws-cdk/core.App",
|
|
32
|
+
"@aws-cdk/core.Stack",
|
|
33
|
+
"@aws-cdk/core.Stage",
|
|
34
|
+
]);
|
|
35
|
+
const NESTED_STACK_FQNS = new Set(["aws-cdk-lib.NestedStack", "@aws-cdk/core.NestedStack"]);
|
|
36
|
+
/** The leaf ids CDK gives an L2's own L1 child. Not constructs anyone wrote. */
|
|
37
|
+
const IMPLICIT_LEAF_IDS = new Set(["Resource", "Default"]);
|
|
38
|
+
export function constructLevel(fqn) {
|
|
39
|
+
if (!fqn)
|
|
40
|
+
return "unknown";
|
|
41
|
+
if (CONTAINER_FQNS.has(fqn))
|
|
42
|
+
return "container";
|
|
43
|
+
if (NESTED_STACK_FQNS.has(fqn))
|
|
44
|
+
return "nested";
|
|
45
|
+
const cls = fqn.slice(fqn.lastIndexOf(".") + 1);
|
|
46
|
+
if (cls.startsWith("Cfn"))
|
|
47
|
+
return "l1";
|
|
48
|
+
if (/^(aws-cdk-lib\.aws_|@aws-cdk\/aws-)/.test(fqn))
|
|
49
|
+
return "l2";
|
|
50
|
+
return "l3";
|
|
51
|
+
}
|
|
52
|
+
const AWS_PSEUDO = /^AWS::/;
|
|
53
|
+
/**
|
|
54
|
+
* Every reference in a JSON value, plus whether the value carries a construct
|
|
55
|
+
* that makes it dynamic (`Fn::If`, a template `Condition`). Walks the JSON
|
|
56
|
+
* looking for CloudFormation intrinsics — the whole grammar is `{"Fn::X": ...}`
|
|
57
|
+
* and `{"Ref": "..."}`, so there is nothing to tokenize.
|
|
58
|
+
*/
|
|
59
|
+
function refsIn(value, via, out, flags) {
|
|
60
|
+
if (Array.isArray(value)) {
|
|
61
|
+
for (const item of value)
|
|
62
|
+
refsIn(item, via, out, flags);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!value || typeof value !== "object")
|
|
66
|
+
return;
|
|
67
|
+
const obj = value;
|
|
68
|
+
const keys = Object.keys(obj);
|
|
69
|
+
if (keys.length === 1) {
|
|
70
|
+
const [key] = keys;
|
|
71
|
+
const arg = obj[key];
|
|
72
|
+
if (key === "Ref" && typeof arg === "string") {
|
|
73
|
+
if (!AWS_PSEUDO.test(arg))
|
|
74
|
+
out.push({ target: arg, attr: "Ref", via });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (key === "Fn::GetAtt") {
|
|
78
|
+
// Both encodings: ["LogicalId", "Attr"] and the "LogicalId.Attr" shorthand.
|
|
79
|
+
const parts = Array.isArray(arg) ? arg : typeof arg === "string" ? arg.split(".") : [];
|
|
80
|
+
const [id, ...rest] = parts;
|
|
81
|
+
if (typeof id === "string" && !AWS_PSEUDO.test(id)) {
|
|
82
|
+
out.push({ target: id, attr: rest.filter((p) => typeof p === "string").join(".") || "Ref", via });
|
|
83
|
+
}
|
|
84
|
+
// A GetAtt argument can itself be an intrinsic in the array form.
|
|
85
|
+
if (Array.isArray(arg))
|
|
86
|
+
for (const item of arg)
|
|
87
|
+
if (typeof item !== "string")
|
|
88
|
+
refsIn(item, via, out, flags);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (key === "Fn::ImportValue") {
|
|
92
|
+
if (typeof arg === "string")
|
|
93
|
+
out.push({ target: arg, attr: "Export", via, crossStack: true });
|
|
94
|
+
else
|
|
95
|
+
refsIn(arg, via, out, flags);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (key === "Fn::Sub") {
|
|
99
|
+
// `"...${LogicalId.Attr}..."` or `["...", { var: <expr> }]`.
|
|
100
|
+
const body = Array.isArray(arg) ? arg[0] : arg;
|
|
101
|
+
const vars = Array.isArray(arg) && arg[1] && typeof arg[1] === "object" ? arg[1] : {};
|
|
102
|
+
const declared = new Set(Object.keys(vars));
|
|
103
|
+
if (typeof body === "string") {
|
|
104
|
+
for (const match of body.matchAll(/\$\{([^}]+)\}/g)) {
|
|
105
|
+
const token = match[1].trim();
|
|
106
|
+
if (AWS_PSEUDO.test(token) || declared.has(token) || token.startsWith("!"))
|
|
107
|
+
continue;
|
|
108
|
+
const dot = token.indexOf(".");
|
|
109
|
+
const id = dot > 0 ? token.slice(0, dot) : token;
|
|
110
|
+
out.push({ target: id, attr: dot > 0 ? token.slice(dot + 1) : "Ref", via });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for (const inner of Object.values(vars))
|
|
114
|
+
refsIn(inner, via, out, flags);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (key === "Fn::If") {
|
|
118
|
+
flags.conditional = true;
|
|
119
|
+
// The condition name is not a resource; its branches are.
|
|
120
|
+
if (Array.isArray(arg))
|
|
121
|
+
for (const branch of arg.slice(1))
|
|
122
|
+
refsIn(branch, via, out, flags);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const [key, inner] of Object.entries(obj))
|
|
127
|
+
refsIn(inner, via ?? key, out, flags);
|
|
128
|
+
}
|
|
129
|
+
/** The construct path a resource declares, normalized (CDK writes a leading `/` in places). */
|
|
130
|
+
function declaredPath(resource) {
|
|
131
|
+
const raw = resource.Metadata?.["aws:cdk:path"];
|
|
132
|
+
if (typeof raw !== "string" || raw.length === 0)
|
|
133
|
+
return undefined;
|
|
134
|
+
return raw.replace(/^\/+/, "");
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The property a CDK asset backs, when the resource is asset-backed at all.
|
|
138
|
+
* `""` means asset metadata is present but names no property; `undefined` means
|
|
139
|
+
* the resource carries no asset.
|
|
140
|
+
*/
|
|
141
|
+
function assetProperty(resource) {
|
|
142
|
+
const metadata = resource.Metadata ?? {};
|
|
143
|
+
const prop = metadata["aws:asset:property"];
|
|
144
|
+
if (typeof prop === "string")
|
|
145
|
+
return prop;
|
|
146
|
+
return Object.keys(metadata).some((k) => k.startsWith("aws:asset:")) ? "" : undefined;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Strip an implicit `Resource`/`Default` leaf: the construct a person wrote is
|
|
150
|
+
* the parent. Used only when tree metadata cannot say better.
|
|
151
|
+
*/
|
|
152
|
+
function ownerOf(path) {
|
|
153
|
+
const segments = path.split("/");
|
|
154
|
+
if (segments.length > 1 && IMPLICIT_LEAF_IDS.has(segments[segments.length - 1]))
|
|
155
|
+
segments.pop();
|
|
156
|
+
return segments.join("/");
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The construct a resource ranks under: the shallowest ancestor inside the
|
|
160
|
+
* stack that is an L2, an L3 or a nested stack. With no such ancestor (a bare
|
|
161
|
+
* L1, or no tree metadata at all) it is the construct that owns the resource.
|
|
162
|
+
*/
|
|
163
|
+
function resolveUnit(resourcePath, stackPath, tree) {
|
|
164
|
+
const inStack = resourcePath.startsWith(`${stackPath}/`) ? resourcePath.slice(stackPath.length + 1) : undefined;
|
|
165
|
+
if (inStack) {
|
|
166
|
+
const segments = inStack.split("/");
|
|
167
|
+
for (let i = 1; i <= segments.length; i++) {
|
|
168
|
+
const candidate = `${stackPath}/${segments.slice(0, i).join("/")}`;
|
|
169
|
+
const level = constructLevel(tree.get(candidate)?.constructInfo?.fqn);
|
|
170
|
+
if (level === "l2" || level === "l3" || level === "nested")
|
|
171
|
+
return { path: candidate, level };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const owner = ownerOf(resourcePath);
|
|
175
|
+
return { path: owner, level: constructLevel(tree.get(owner)?.constructInfo?.fqn) };
|
|
176
|
+
}
|
|
177
|
+
/** Every resource in a stack that describes infrastructure rather than synthesis. */
|
|
178
|
+
function realResources(stack) {
|
|
179
|
+
const entries = [];
|
|
180
|
+
for (const [logicalId, resource] of Object.entries(stack.template.Resources ?? {})) {
|
|
181
|
+
const type = typeof resource?.Type === "string" ? resource.Type : "";
|
|
182
|
+
if (!type || SCAFFOLDING_TYPES.has(type))
|
|
183
|
+
continue;
|
|
184
|
+
entries.push({
|
|
185
|
+
logicalId,
|
|
186
|
+
type,
|
|
187
|
+
stack: stack.path,
|
|
188
|
+
path: declaredPath(resource) ?? `${stack.path}/${logicalId}`,
|
|
189
|
+
resource: resource ?? {},
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return entries;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* The unit's primary CloudFormation type — the one a carve would target. A
|
|
196
|
+
* construct's own resource sits at `<construct>/Resource` or `<construct>/Default`
|
|
197
|
+
* (or is the construct, for an L1); anything else is a supporting resource that
|
|
198
|
+
* carves along with it. With no obvious principal, the shallowest member wins,
|
|
199
|
+
* tie-broken by type so the answer does not depend on template key order.
|
|
200
|
+
*/
|
|
201
|
+
function primaryMember(unit) {
|
|
202
|
+
const principal = unit.members.find((m) => m.path === unit.path || IMPLICIT_LEAF_IDS.has(m.path.slice(unit.path.length + 1)));
|
|
203
|
+
if (principal)
|
|
204
|
+
return principal;
|
|
205
|
+
return [...unit.members].sort((a, b) => a.path.split("/").length - b.path.split("/").length || (a.type < b.type ? -1 : a.type > b.type ? 1 : 0))[0];
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Placeholder values `cdk synth` writes when a context lookup could not be
|
|
209
|
+
* answered. A template holding one describes an account that does not exist.
|
|
210
|
+
*/
|
|
211
|
+
const DUMMY_MARKERS = ["dummy-value-for-", "vpc-12345678", "dummy1a", "ami-1234", "s-12345"];
|
|
212
|
+
/**
|
|
213
|
+
* Is the assembly a faithful picture of an account, or a guess? Either the
|
|
214
|
+
* manifest admits an unresolved context query, or a template still carries the
|
|
215
|
+
* placeholder that query would have replaced.
|
|
216
|
+
*/
|
|
217
|
+
export function dummyAssemblyReason(assembly) {
|
|
218
|
+
const missing = assembly.manifest.missing ?? [];
|
|
219
|
+
if (missing.length > 0) {
|
|
220
|
+
const providers = [...new Set(missing.map((m) => m.provider).filter((p) => !!p))].sort();
|
|
221
|
+
return (`The assembly was synthesized with ${missing.length} unresolved context lookup(s)` +
|
|
222
|
+
`${providers.length ? ` (${providers.join(", ")})` : ""}, so its templates hold placeholder values rather ` +
|
|
223
|
+
"than this account's. Prime the context and re-synthesize before advising.");
|
|
224
|
+
}
|
|
225
|
+
for (const stack of assembly.stacks) {
|
|
226
|
+
const text = JSON.stringify(stack.template);
|
|
227
|
+
const hit = DUMMY_MARKERS.find((marker) => text.includes(marker));
|
|
228
|
+
if (hit) {
|
|
229
|
+
return (`${stack.templateFile} still holds the context placeholder \`${hit}\`, so it describes a lookup that ` +
|
|
230
|
+
"never resolved. Prime the context and re-synthesize before advising.");
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Build the graph and the per-construct signals from a read assembly.
|
|
237
|
+
*
|
|
238
|
+
* Every resource folds into a construct, every construct becomes one node, and
|
|
239
|
+
* every intrinsic becomes an edge between two nodes. Nothing is inferred: a
|
|
240
|
+
* reference with no resolvable target is dropped rather than drawn.
|
|
241
|
+
*/
|
|
242
|
+
export function buildCdkGraph(assembly) {
|
|
243
|
+
const tree = indexTree(assembly.tree);
|
|
244
|
+
const diagnostics = [...assembly.diagnostics];
|
|
245
|
+
// Resources, grouped into units.
|
|
246
|
+
const units = new Map();
|
|
247
|
+
/** logical ID → unit address, per stack. */
|
|
248
|
+
const unitOfLogicalId = new Map();
|
|
249
|
+
const resourcesOf = new Map();
|
|
250
|
+
for (const stack of assembly.stacks) {
|
|
251
|
+
const byLogicalId = new Map();
|
|
252
|
+
unitOfLogicalId.set(stack.path, byLogicalId);
|
|
253
|
+
const entries = realResources(stack);
|
|
254
|
+
resourcesOf.set(stack.path, entries);
|
|
255
|
+
for (const entry of entries) {
|
|
256
|
+
const { path, level } = resolveUnit(entry.path, stack.path, tree);
|
|
257
|
+
const unit = units.get(path) ?? { path, kind: level === "l3" ? "module" : "resource", level, members: [] };
|
|
258
|
+
unit.members.push(entry);
|
|
259
|
+
units.set(path, unit);
|
|
260
|
+
byLogicalId.set(entry.logicalId, path);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const exports = new Map();
|
|
264
|
+
for (const stack of assembly.stacks) {
|
|
265
|
+
for (const output of Object.values(stack.template.Outputs ?? {})) {
|
|
266
|
+
const name = output?.Export?.Name;
|
|
267
|
+
if (typeof name !== "string")
|
|
268
|
+
continue;
|
|
269
|
+
const refs = [];
|
|
270
|
+
refsIn(output.Value, "Value", refs, { conditional: false });
|
|
271
|
+
exports.set(name, { stack: stack.path, refs });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Edges.
|
|
275
|
+
const rawEdges = [];
|
|
276
|
+
const consumedExports = new Set();
|
|
277
|
+
const push = (from, to, attrs, via, crossStack) => {
|
|
278
|
+
if (!from || !to || from === to)
|
|
279
|
+
return;
|
|
280
|
+
rawEdges.push({ from, to, attrs, via, ...(crossStack ? { crossStack: true } : {}) });
|
|
281
|
+
};
|
|
282
|
+
/** Resolve a raw ref to the unit(s) it names, following exports across stacks. */
|
|
283
|
+
const targetsOf = (ref, stackPath) => {
|
|
284
|
+
if (ref.crossStack) {
|
|
285
|
+
const entry = exports.get(ref.target);
|
|
286
|
+
if (!entry)
|
|
287
|
+
return [];
|
|
288
|
+
consumedExports.add(ref.target);
|
|
289
|
+
const local = unitOfLogicalId.get(entry.stack);
|
|
290
|
+
return entry.refs
|
|
291
|
+
.map((inner) => local?.get(inner.target))
|
|
292
|
+
.filter((address) => !!address)
|
|
293
|
+
.map((address) => ({ address, crossStack: true }));
|
|
294
|
+
}
|
|
295
|
+
const address = unitOfLogicalId.get(stackPath)?.get(ref.target);
|
|
296
|
+
return address ? [{ address, crossStack: false }] : [];
|
|
297
|
+
};
|
|
298
|
+
const dynamicUnits = new Set();
|
|
299
|
+
/** unit address → the property the asset backs, `""` when CDK did not name one. */
|
|
300
|
+
const assetUnits = new Map();
|
|
301
|
+
for (const stack of assembly.stacks) {
|
|
302
|
+
const parameters = new Set(Object.keys(stack.template.Parameters ?? {}));
|
|
303
|
+
for (const entry of resourcesOf.get(stack.path) ?? []) {
|
|
304
|
+
const from = unitOfLogicalId.get(stack.path)?.get(entry.logicalId);
|
|
305
|
+
if (!from)
|
|
306
|
+
continue;
|
|
307
|
+
const refs = [];
|
|
308
|
+
const flags = { conditional: !!entry.resource.Condition };
|
|
309
|
+
refsIn(entry.resource.Properties, undefined, refs, flags);
|
|
310
|
+
const asset = assetProperty(entry.resource);
|
|
311
|
+
if (asset !== undefined && !assetUnits.get(from))
|
|
312
|
+
assetUnits.set(from, asset);
|
|
313
|
+
for (const ref of refs) {
|
|
314
|
+
if (!ref.crossStack && parameters.has(ref.target)) {
|
|
315
|
+
// A template parameter, not a resource. The synthesizer's own
|
|
316
|
+
// bootstrap/asset parameters say nothing about the author's design.
|
|
317
|
+
if (isScaffoldingParameter(ref.target)) {
|
|
318
|
+
if (ref.target.startsWith("AssetParameters") && !assetUnits.has(from))
|
|
319
|
+
assetUnits.set(from, "");
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
flags.conditional = true;
|
|
323
|
+
}
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
for (const target of targetsOf(ref, stack.path)) {
|
|
327
|
+
push(from, target.address, [ref.attr], ref.via ? [ref.via] : [], target.crossStack);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// `DependsOn` is an ordering dependency, and just as real a cut.
|
|
331
|
+
const dependsOn = entry.resource.DependsOn;
|
|
332
|
+
for (const id of Array.isArray(dependsOn) ? dependsOn : dependsOn ? [dependsOn] : []) {
|
|
333
|
+
if (typeof id !== "string")
|
|
334
|
+
continue;
|
|
335
|
+
const address = unitOfLogicalId.get(stack.path)?.get(id);
|
|
336
|
+
if (address)
|
|
337
|
+
push(from, address, ["DependsOn"], ["DependsOn"]);
|
|
338
|
+
}
|
|
339
|
+
if (flags.conditional)
|
|
340
|
+
dynamicUnits.add(from);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// `Outputs` blocks reference without being nodes — the CloudFormation twin of
|
|
344
|
+
// a Terraform `output` (#1638). An output whose export something imports is
|
|
345
|
+
// skipped: the direct cross-stack edge already stands for that cut, and
|
|
346
|
+
// counting both would charge one dependency twice.
|
|
347
|
+
const outputEdges = [];
|
|
348
|
+
for (const stack of assembly.stacks) {
|
|
349
|
+
for (const [outputName, output] of Object.entries(stack.template.Outputs ?? {})) {
|
|
350
|
+
const exportName = output?.Export?.Name;
|
|
351
|
+
if (typeof exportName === "string" && consumedExports.has(exportName))
|
|
352
|
+
continue;
|
|
353
|
+
const refs = [];
|
|
354
|
+
refsIn(output?.Value, "Value", refs, { conditional: false });
|
|
355
|
+
for (const ref of refs) {
|
|
356
|
+
for (const target of targetsOf(ref, stack.path)) {
|
|
357
|
+
outputEdges.push({
|
|
358
|
+
from: `output.${stack.path}.${outputName}`,
|
|
359
|
+
to: target.address,
|
|
360
|
+
attrs: [ref.attr],
|
|
361
|
+
via: ["Value"],
|
|
362
|
+
fromKind: "output",
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Nodes.
|
|
369
|
+
const nodes = [];
|
|
370
|
+
const signals = new Map();
|
|
371
|
+
const dummyReason = dummyAssemblyReason(assembly);
|
|
372
|
+
for (const unit of units.values()) {
|
|
373
|
+
const primary = primaryMember(unit);
|
|
374
|
+
const type = unit.kind === "module" ? undefined : primary?.type;
|
|
375
|
+
const nested = unit.level === "nested" || primary?.type === NESTED_STACK_TYPE;
|
|
376
|
+
const assetProp = assetUnits.get(unit.path);
|
|
377
|
+
const stacks = [...new Set(unit.members.map((m) => m.stack))].sort();
|
|
378
|
+
nodes.push({
|
|
379
|
+
address: unit.path,
|
|
380
|
+
kind: unit.kind,
|
|
381
|
+
...(type ? { type } : {}),
|
|
382
|
+
name: unit.path.split("/").pop() ?? unit.path,
|
|
383
|
+
instances: 1,
|
|
384
|
+
hasDynamic: dynamicUnits.has(unit.path),
|
|
385
|
+
});
|
|
386
|
+
const members = [...unit.members]
|
|
387
|
+
.sort((a, b) => (a.logicalId < b.logicalId ? -1 : a.logicalId > b.logicalId ? 1 : 0))
|
|
388
|
+
.map((m) => ({ id: m.logicalId, type: m.type, stack: m.stack, path: m.path }));
|
|
389
|
+
const notes = [];
|
|
390
|
+
if (unit.kind === "module") {
|
|
391
|
+
notes.push("L3 construct subtree — a Composite candidate (#1000). Its leaves rank here as one unit rather than separately.");
|
|
392
|
+
}
|
|
393
|
+
if (assetProp !== undefined) {
|
|
394
|
+
notes.push(`Asset-backed${assetProp ? ` (${assetProp})` : ""} — carving it moves the CDK bundling too, not just the resource.`);
|
|
395
|
+
}
|
|
396
|
+
if (unit.members.length > 1) {
|
|
397
|
+
notes.push(`${unit.members.length} CloudFormation resources fold into this construct.`);
|
|
398
|
+
}
|
|
399
|
+
if (stacks.length > 1)
|
|
400
|
+
notes.push(`Spans ${stacks.length} stacks: ${stacks.join(", ")}.`);
|
|
401
|
+
if (type && !nested && resolveCfnTier(type) === null) {
|
|
402
|
+
notes.push(`No chant AWS lexicon target for ${type}.`);
|
|
403
|
+
}
|
|
404
|
+
const disqualified = dummyReason
|
|
405
|
+
? dummyReason
|
|
406
|
+
: nested
|
|
407
|
+
? "Nested stack — its resources live in a template this advisor does not descend into, so carving it means " +
|
|
408
|
+
"carving that whole template. Advise the nested assembly on its own."
|
|
409
|
+
: undefined;
|
|
410
|
+
signals.set(unit.path, {
|
|
411
|
+
...(assetProp !== undefined && !disqualified ? { penalties: { asset: -10 } } : {}),
|
|
412
|
+
...(notes.length ? { notes } : {}),
|
|
413
|
+
members,
|
|
414
|
+
...(disqualified ? { disqualified } : {}),
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
if (dummyReason)
|
|
418
|
+
diagnostics.push(dummyReason);
|
|
419
|
+
// Merge duplicate edges (same pair), then order by code point so the report
|
|
420
|
+
// is stable across platforms and template key order.
|
|
421
|
+
const cmp = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
422
|
+
const merged = new Map();
|
|
423
|
+
for (const edge of [...rawEdges, ...outputEdges]) {
|
|
424
|
+
const key = `${edge.from}|${edge.to}|${edge.fromKind ?? ""}`;
|
|
425
|
+
const prev = merged.get(key);
|
|
426
|
+
if (prev) {
|
|
427
|
+
prev.attrs = [...new Set([...prev.attrs, ...edge.attrs])].sort(cmp);
|
|
428
|
+
prev.via = [...new Set([...prev.via, ...edge.via])].sort(cmp);
|
|
429
|
+
if (edge.crossStack)
|
|
430
|
+
prev.crossStack = true;
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
merged.set(key, { ...edge, attrs: [...new Set(edge.attrs)].sort(cmp), via: [...new Set(edge.via)].sort(cmp) });
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
graph: {
|
|
438
|
+
nodes: nodes.sort((a, b) => cmp(a.address, b.address)),
|
|
439
|
+
edges: [...merged.values()].sort((a, b) => cmp(a.from, b.from) || cmp(a.to, b.to)),
|
|
440
|
+
},
|
|
441
|
+
signals,
|
|
442
|
+
diagnostics,
|
|
443
|
+
};
|
|
444
|
+
}
|