@intentius/chant 0.124.13 → 0.124.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +462 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
|
@@ -0,0 +1,969 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { discoverOps } from "../../op/discover.js";
|
|
3
|
+
import { discover } from "../../discovery/index.js";
|
|
4
|
+
import { partitionByLexicon, computeStackGraph, build, mergeBuildRootEntities } from "../../build.js";
|
|
5
|
+
import { buildGraphIr, buildLiveGraphIr, collectUnobserved, overlayGraphs, sourceOverlayGraphs, GRAPH_IR_VERSION } from "../../graph-ir.js";
|
|
6
|
+
import { behaviourOverlay } from "../../behaviour-overlay.js";
|
|
7
|
+
import { applyBehaviourOverlay, behaviourRequestFromIr } from "../../behaviour-graph.js";
|
|
8
|
+
import { buildDeclaredPerStack } from "../../graph-declared.js";
|
|
9
|
+
import { mergeProjectOps } from "../../graph-ops.js";
|
|
10
|
+
import { reconstructEdges, mergeCatalogs, containmentGroups } from "../../graph-refs.js";
|
|
11
|
+
import { observeResources } from "../../lifecycle/observe.js";
|
|
12
|
+
import { withLiveReadSession } from "../../live-read-session.js";
|
|
13
|
+
import { replaySnapshots, hasSnapshot } from "../../lifecycle/replay.js";
|
|
14
|
+
import { loadChantConfig, environmentNames, matchesDeclaredEnvironment, loadChantConfigUpward } from "../../config.js";
|
|
15
|
+
import { applyLiveEndpoint } from "../../live-endpoint.js";
|
|
16
|
+
import { applyDetail, detailInertNotice } from "../../graph-detail.js";
|
|
17
|
+
import { applyLens, parseLens } from "../../graph-lens.js";
|
|
18
|
+
import { toMermaid } from "../../graph-mermaid.js";
|
|
19
|
+
import { toDot } from "../../graph-dot.js";
|
|
20
|
+
import { getLayoutEngine, toLayoutInput } from "../../graph-layout.js";
|
|
21
|
+
import { lintCommand } from "../commands/lint.js";
|
|
22
|
+
import { loadPlugins, resolveProjectLexicons, collectBuildRootContributors } from "../plugins.js";
|
|
23
|
+
import { isNoLexiconDetected } from "../../detectLexicon.js";
|
|
24
|
+
import { readFileSync } from "node:fs";
|
|
25
|
+
import { formatError, formatWarning, formatBold } from "../format.js";
|
|
26
|
+
import { computeComponentGraph, generateComponentsPipeline } from "../../components/cli-support.js";
|
|
27
|
+
import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli.js";
|
|
28
|
+
import { discoverComponents } from "../../components/discover.js";
|
|
29
|
+
import { cfnDeployStacks } from "./components.js";
|
|
30
|
+
/**
|
|
31
|
+
* The project's lexicons, or none for a project that declares none and imports
|
|
32
|
+
* none (an Ops-only member, `lexicons: []`): detection's NO_LEXICON_DETECTED
|
|
33
|
+
* sentinel means "no lexicon", as `chant lint` reads it, not a failed graph (#2841).
|
|
34
|
+
*/
|
|
35
|
+
async function projectLexiconsOrNone(projectPath) {
|
|
36
|
+
try {
|
|
37
|
+
return await resolveProjectLexicons(projectPath);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (isNoLexiconDetected(err))
|
|
41
|
+
return [];
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve this invocation's declared build-time parameters, the same way
|
|
47
|
+
* `chant build` does, so `discover()` sees the values the source will read.
|
|
48
|
+
*
|
|
49
|
+
* Without this `chant graph` discovered source with `params.*` empty, so every
|
|
50
|
+
* declaration conditioned on a parameter took its default — a project whose
|
|
51
|
+
* tier is a `buildParams` entry graphed as one tier whatever `--param tier=`
|
|
52
|
+
* or the declared `env:` mapping said, while `chant build` on the same source
|
|
53
|
+
* and the same environment emitted a different resource set. Two commands
|
|
54
|
+
* disagreeing about what the source says.
|
|
55
|
+
*
|
|
56
|
+
* Returns `undefined` when resolution failed, having printed why — the caller
|
|
57
|
+
* should stop rather than graph something that will not build.
|
|
58
|
+
*/
|
|
59
|
+
async function graphBuildParams(ctx, projectPath) {
|
|
60
|
+
const { config } = await loadChantConfigUpward(projectPath).catch(() => ({ config: {} }));
|
|
61
|
+
const resolution = resolveCliBuildParams(config.buildParams, {
|
|
62
|
+
cli: parseParamFlags(ctx.args.param),
|
|
63
|
+
paramsFile: ctx.args.paramsFile,
|
|
64
|
+
verbose: ctx.args.verbose,
|
|
65
|
+
});
|
|
66
|
+
if (!resolution.success) {
|
|
67
|
+
for (const message of resolution.errors)
|
|
68
|
+
console.error(message);
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return resolution.provenance;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The build-root contributors this invocation's project configures (#1626) —
|
|
75
|
+
* the same closures `chant build` and the lifecycle handlers hand to
|
|
76
|
+
* `BuildOptions.buildRoots`, bound here for the graph command's
|
|
77
|
+
* discover-based paths, which never run `build()` and so never ran the hook:
|
|
78
|
+
* a `k8s.kustomize.roots` estate graphed only its typed source while its
|
|
79
|
+
* built (and deployed) output carried the rendered manifests too.
|
|
80
|
+
*
|
|
81
|
+
* `graph` is not `requiresPlugins` (Op/source-graph modes must work without a
|
|
82
|
+
* lexicon), so plugins are loaded here when `ctx.plugins` is empty, mirroring
|
|
83
|
+
* `runGraphLive`. Rooted at the config's own directory, like
|
|
84
|
+
* `cli/commands/build.ts` — a relative kustomize root resolves against where
|
|
85
|
+
* it was declared, not against a sourceDir-scoped graph path. A project that
|
|
86
|
+
* fails to load plugins degrades to no contributors with a warning rather
|
|
87
|
+
* than failing modes that never needed plugins at all.
|
|
88
|
+
*/
|
|
89
|
+
async function graphBuildRootContributors(ctx, projectPath) {
|
|
90
|
+
const { config, configPath } = await loadChantConfigUpward(projectPath).catch(() => ({ config: {}, configPath: undefined }));
|
|
91
|
+
let plugins = ctx.plugins;
|
|
92
|
+
if (plugins.length === 0) {
|
|
93
|
+
try {
|
|
94
|
+
plugins = await loadPlugins(await resolveProjectLexicons(projectPath));
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.error(formatWarning({
|
|
98
|
+
message: `could not load the project's lexicons — build-root entities (kustomize roots) will be missing from the graph (${err instanceof Error ? err.message : String(err)})`,
|
|
99
|
+
}));
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return collectBuildRootContributors(plugins, config, configPath ? dirname(configPath) : projectPath);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Merge build-root contributions into a discovered entity set — the exact
|
|
107
|
+
* merge `build()` performs (one implementation: `mergeBuildRootEntities`,
|
|
108
|
+
* ../../build.ts), surfaced in the graph command's error style. Returns false
|
|
109
|
+
* when a contributor failed or a name collided; the caller stops, matching
|
|
110
|
+
* how the discover-based paths treat discovery errors — a graph missing the
|
|
111
|
+
* entities the build would refuse over must not be emitted as if complete.
|
|
112
|
+
*/
|
|
113
|
+
async function mergeGraphBuildRoots(entities, contributors) {
|
|
114
|
+
if (contributors.length === 0)
|
|
115
|
+
return true;
|
|
116
|
+
const merged = await mergeBuildRootEntities(entities, contributors);
|
|
117
|
+
for (const w of merged.warnings)
|
|
118
|
+
console.error(formatWarning({ message: w }));
|
|
119
|
+
if (merged.errors.length > 0) {
|
|
120
|
+
for (const message of merged.errors)
|
|
121
|
+
console.error(formatError({ message }));
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
/** #1675 — join git-root ops into a discovered entity map; op-discovery
|
|
127
|
+
* errors are warnings here (the lint gate never saw those files). */
|
|
128
|
+
async function mergeGraphOps(entities, sourceFiles, projectPath) {
|
|
129
|
+
const { errors } = await mergeProjectOps(entities, sourceFiles, projectPath);
|
|
130
|
+
for (const e of errors)
|
|
131
|
+
console.error(formatWarning({ message: e }));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* `chant graph` — the Op dependency graph by default; `--stacks` renders the
|
|
135
|
+
* cross-stack apply-ordering graph (edges, order, waves) chant computes from
|
|
136
|
+
* cross-lexicon references; `--components` (#560) renders the same
|
|
137
|
+
* order/waves shape for discovered `Component` declarations, from their
|
|
138
|
+
* `dependsOn`; `--format ir|mermaid` emits the lint-gated entity-graph IR (or
|
|
139
|
+
* a Mermaid flowchart of it) for diagrams (#493/#496). `--components` with a
|
|
140
|
+
* `--format` projects the component DAG itself into that format (nodes =
|
|
141
|
+
* components, wave groups, `dependsOn` edges) — the graph behold renders.
|
|
142
|
+
*/
|
|
143
|
+
/**
|
|
144
|
+
* One `chant graph` is one read of the account (chant #2498): the live
|
|
145
|
+
* observation and the `--traffic` prediction are two plugin methods that
|
|
146
|
+
* each read a live root, and inside this session a read one of them made
|
|
147
|
+
* is the read the other gets.
|
|
148
|
+
*/
|
|
149
|
+
export function runGraph(ctx) {
|
|
150
|
+
return withLiveReadSession(() => runGraphCommand(ctx));
|
|
151
|
+
}
|
|
152
|
+
async function runGraphCommand(ctx) {
|
|
153
|
+
const viewFormats = ["ir", "mermaid", "dot", "layout"];
|
|
154
|
+
const isViewFormat = viewFormats.includes(ctx.args.format);
|
|
155
|
+
// `--projection <lexicon>` (#989) only means anything for the component
|
|
156
|
+
// graph's IR — it adds the CI/pipeline shape to `GraphIR.pipeline`, a field
|
|
157
|
+
// the other view formats' emitters (mermaid/dot/layout) don't read, and the
|
|
158
|
+
// plain (non-`--format`) `--components` text/`--json` modes don't build an
|
|
159
|
+
// IR at all. Reject every other combination up front rather than silently
|
|
160
|
+
// ignoring the flag.
|
|
161
|
+
if (ctx.args.projection && !(ctx.args.components && ctx.args.format === "ir")) {
|
|
162
|
+
console.error(formatError({
|
|
163
|
+
message: "--projection needs --components --format ir — the CI/pipeline projection extends the component-graph IR, the only mode that carries it.",
|
|
164
|
+
}));
|
|
165
|
+
return 1;
|
|
166
|
+
}
|
|
167
|
+
// `--at` graphs a recorded observation instead of reading the estate (#1279).
|
|
168
|
+
// Two different observations with no rule for which wins, so not both.
|
|
169
|
+
if (ctx.args.at && ctx.args.live) {
|
|
170
|
+
console.error(formatError({
|
|
171
|
+
message: "chant graph takes --live or --at, not both",
|
|
172
|
+
hint: "--live reads the estate now; --at graphs a recorded snapshot",
|
|
173
|
+
}));
|
|
174
|
+
return 1;
|
|
175
|
+
}
|
|
176
|
+
// `--live` graphs the provisioned (observed) infrastructure, not the declared
|
|
177
|
+
// source (epic #776). It only makes sense as a view format; default to `ir`.
|
|
178
|
+
if (ctx.args.live || ctx.args.at) {
|
|
179
|
+
return runGraphLive(ctx, isViewFormat ? ctx.args.format : "ir");
|
|
180
|
+
}
|
|
181
|
+
if (isViewFormat) {
|
|
182
|
+
// `--components` projects the component DAG (nodes = components, wave groups,
|
|
183
|
+
// dependsOn edges) into the same view formats; without it, the entity graph.
|
|
184
|
+
if (ctx.args.components) {
|
|
185
|
+
return runComponentGraphView(ctx, ctx.args.format);
|
|
186
|
+
}
|
|
187
|
+
return runGraphView(ctx, ctx.args.format);
|
|
188
|
+
}
|
|
189
|
+
if (ctx.args.components)
|
|
190
|
+
return runComponentGraph(ctx);
|
|
191
|
+
if (ctx.args.stacks)
|
|
192
|
+
return runStackGraph(ctx);
|
|
193
|
+
return runOpGraph();
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* `chant graph --live --env <name> [--format ir|mermaid|dot|layout]` — the
|
|
197
|
+
* **provisioned** graph (C1 of epic #776). Queries each lexicon's
|
|
198
|
+
* `describeResources()` for the environment (managed-only: `owned`) and projects
|
|
199
|
+
* the observed resources into IR nodes. Nodes only — edges are reconstructed by
|
|
200
|
+
* the reference resolver (#778), containment by #779. No lint gate: this reads
|
|
201
|
+
* the cloud, not source.
|
|
202
|
+
*/
|
|
203
|
+
async function runGraphLive(ctx, format) {
|
|
204
|
+
const { args } = ctx;
|
|
205
|
+
const environment = args.env;
|
|
206
|
+
if (!environment) {
|
|
207
|
+
console.error(formatError({ message: "chant graph --live needs an environment: --live --env <name>" }));
|
|
208
|
+
return 1;
|
|
209
|
+
}
|
|
210
|
+
const projectPath = resolve(".");
|
|
211
|
+
const { config } = await loadChantConfig(projectPath);
|
|
212
|
+
// `graph` is not `requiresPlugins` (Op/source-graph modes must work without a
|
|
213
|
+
// lexicon), so `ctx.plugins` is empty. The live path needs the project's
|
|
214
|
+
// observation plugins — load them here, mirroring the lifecycle handlers.
|
|
215
|
+
const plugins = ctx.plugins.length > 0 ? ctx.plugins : await loadPlugins(await projectLexiconsOrNone(projectPath));
|
|
216
|
+
const declaredEnvNames = environmentNames(config.environments);
|
|
217
|
+
if (declaredEnvNames && !matchesDeclaredEnvironment(config.environments, environment)) {
|
|
218
|
+
console.error(formatError({
|
|
219
|
+
message: `Unknown environment "${environment}"`,
|
|
220
|
+
hint: `Defined environments: ${declaredEnvNames.join(", ")}`,
|
|
221
|
+
}));
|
|
222
|
+
return 1;
|
|
223
|
+
}
|
|
224
|
+
// Build to get each lexicon's entity names + output (the scope
|
|
225
|
+
// describeResources needs), mirroring `chant lifecycle snapshot`.
|
|
226
|
+
//
|
|
227
|
+
// With the same build params the source graph resolves (#1483). Without
|
|
228
|
+
// them this build ran on defaults while the declared overlay below ran on
|
|
229
|
+
// the caller's, so a project whose parameters choose *which resources
|
|
230
|
+
// exist* — a tier, a size, a profile — observed one estate and compared it
|
|
231
|
+
// against another. Every resource the real parameter declares read as
|
|
232
|
+
// absent and every resource the default declares read as pending, which is
|
|
233
|
+
// a confidently wrong overlay rather than an empty one.
|
|
234
|
+
const liveBuildParams = await graphBuildParams(ctx, projectPath);
|
|
235
|
+
if (!liveBuildParams)
|
|
236
|
+
return 1;
|
|
237
|
+
// #1626 — the same build-root contributors `chant build` runs (kustomize
|
|
238
|
+
// roots rendered into entities), so the scope handed to describeResources
|
|
239
|
+
// includes the rendered objects and the live read observes them like any
|
|
240
|
+
// declared entity. Without this the built estate carried them but the graph
|
|
241
|
+
// build here didn't, and the overlay called every one of them foreign.
|
|
242
|
+
const buildRoots = collectBuildRootContributors(plugins, config, projectPath);
|
|
243
|
+
const buildResult = await build(resolve(args.src ?? config.sourceDir ?? "."), plugins.map((p) => p.serializer), undefined, { buildParams: liveBuildParams, buildRoots });
|
|
244
|
+
if (buildResult.errors.length > 0) {
|
|
245
|
+
console.error(formatError({ message: "Build failed — fix errors before graphing live state" }));
|
|
246
|
+
return 1;
|
|
247
|
+
}
|
|
248
|
+
const observing = plugins.filter((p) => p.describeResources);
|
|
249
|
+
if (observing.length === 0) {
|
|
250
|
+
console.error(formatError({ message: "No lexicons implement describeResources — nothing to observe live." }));
|
|
251
|
+
return 1;
|
|
252
|
+
}
|
|
253
|
+
// Multi-stack, per-component projects (#57): AWS's single-stack convention
|
|
254
|
+
// (`describeResources` defaults to a stack named after the environment,
|
|
255
|
+
// lexicons/aws/src/plugin.ts) never matches a per-component layout (e.g.
|
|
256
|
+
// `loom-local-a-<component>`), so the plain single call always observes zero
|
|
257
|
+
// nodes. Resolve every discovered component's `cfn-deploy` stack(s) — the
|
|
258
|
+
// same walk `chant components status --live` uses (`cfnDeployStacks`,
|
|
259
|
+
// ./components.ts) — and hand them to `observeResources`, which queries
|
|
260
|
+
// `describeResources` once per stack and unions the results. A project with
|
|
261
|
+
// no components (or whose discovery errors) yields no stacks, so
|
|
262
|
+
// `observeResources` falls back to its original single-stack call —
|
|
263
|
+
// unchanged.
|
|
264
|
+
const componentsDiscovery = await discoverComponents(resolve(args.src ?? config.sourceDir ?? "."), {
|
|
265
|
+
sandbox: args.sandbox,
|
|
266
|
+
});
|
|
267
|
+
const stacks = [];
|
|
268
|
+
const seenStacks = new Set();
|
|
269
|
+
if (componentsDiscovery.errors.length === 0) {
|
|
270
|
+
for (const { component } of componentsDiscovery.components.values()) {
|
|
271
|
+
for (const stack of cfnDeployStacks(component.deploy)) {
|
|
272
|
+
if (!seenStacks.has(stack)) {
|
|
273
|
+
seenStacks.add(stack);
|
|
274
|
+
stacks.push({ name: stack });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.error(formatWarning({ message: "component discovery failed — observing the single-stack convention instead" }));
|
|
281
|
+
}
|
|
282
|
+
// ChantConfig.stacks (with optional per-stack region) — multi-region estates.
|
|
283
|
+
for (const declared of config.stacks ?? []) {
|
|
284
|
+
if (!seenStacks.has(declared.name)) {
|
|
285
|
+
seenStacks.add(declared.name);
|
|
286
|
+
stacks.push({ name: declared.name, region: declared.region, src: declared.src });
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// #1166 — an environment can declare its own endpoint (a local emulator like
|
|
290
|
+
// Floci), so this read is self-sufficient even when the ambient shell never
|
|
291
|
+
// exported e.g. AWS_ENDPOINT_URL. Ambient always wins when it's already set.
|
|
292
|
+
// Scoped to just this describe/enrich pass — restored in `finally` so it
|
|
293
|
+
// never leaks into a later invocation in the same process.
|
|
294
|
+
const endpointResult = applyLiveEndpoint(config.environments, environment, observing);
|
|
295
|
+
if (endpointResult.notice)
|
|
296
|
+
console.error(formatWarning({ message: endpointResult.notice }));
|
|
297
|
+
let ir;
|
|
298
|
+
let observations;
|
|
299
|
+
// A replay is a graph of what was recorded, so it must not reach the provider
|
|
300
|
+
// at all — not for observation and not for enrichment. Anything that quietly
|
|
301
|
+
// called out would make `--at` a live read with an older label on it.
|
|
302
|
+
const replaying = !!args.at && !args.live;
|
|
303
|
+
try {
|
|
304
|
+
if (replaying) {
|
|
305
|
+
const scoped = new Set(stacks.filter((st) => st.src).map((st) => st.name));
|
|
306
|
+
const replay = await replaySnapshots(environment, String(args.at), scoped);
|
|
307
|
+
if ("error" in replay) {
|
|
308
|
+
console.error(formatError({ message: replay.error, ...(replay.hint ? { hint: replay.hint } : {}) }));
|
|
309
|
+
return 1;
|
|
310
|
+
}
|
|
311
|
+
observations = replay.observations;
|
|
312
|
+
console.error(formatWarning({
|
|
313
|
+
message: `graphing snapshot ${replay.commit.slice(0, 7)} taken ${replay.timestamp} — the estate was not read`,
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
const observeResult = await observeResources(environment, observing, buildResult, {
|
|
318
|
+
owned: true,
|
|
319
|
+
stacks: [...stacks],
|
|
320
|
+
// `--namespace <ns>` (#1629): where to read entities that declare no
|
|
321
|
+
// namespace. One project declaring the GitOps binding and another
|
|
322
|
+
// declaring the objects is the whole reason this is a per-read option
|
|
323
|
+
// and not config.
|
|
324
|
+
...(args.namespace ? { namespace: args.namespace } : {}),
|
|
325
|
+
});
|
|
326
|
+
observations = observeResult.observations;
|
|
327
|
+
const { errors, warnings, notes = [] } = observeResult;
|
|
328
|
+
for (const e of errors)
|
|
329
|
+
console.error(formatWarning({ message: e }));
|
|
330
|
+
// Unobserved entities (#1089) arrive as warnings — a node missing from the
|
|
331
|
+
// live graph because nobody looked is a different fact from one that isn't
|
|
332
|
+
// deployed, and the diagram alone cannot say which. Capped: an estate with no
|
|
333
|
+
// ownership markers can produce one per declared entity, and a wall of them
|
|
334
|
+
// buries the graph output. The full list is `lifecycle diff --live`.
|
|
335
|
+
const WARN_CAP = 5;
|
|
336
|
+
for (const w of warnings.slice(0, WARN_CAP))
|
|
337
|
+
console.error(formatWarning({ message: w }));
|
|
338
|
+
if (warnings.length > WARN_CAP) {
|
|
339
|
+
console.error(formatWarning({
|
|
340
|
+
message: `... and ${warnings.length - WARN_CAP} more entity(ies) not observed — run \`chant lifecycle diff ${environment} --live\` for the full list`,
|
|
341
|
+
}));
|
|
342
|
+
}
|
|
343
|
+
// Run-level notes (#1265): one line each, outside the per-entity cap.
|
|
344
|
+
for (const n of notes)
|
|
345
|
+
console.error(formatWarning({ message: n }));
|
|
346
|
+
}
|
|
347
|
+
// Both paths land here: a replay rejoins the live pipeline at exactly this
|
|
348
|
+
// point, which is what makes every fold and overlay below shared.
|
|
349
|
+
ir = buildLiveGraphIr(observations);
|
|
350
|
+
// The estate was asked for and nothing came back. Say that once, and say
|
|
351
|
+
// that a recording exists — the per-entity warnings above describe the same
|
|
352
|
+
// failure N times without ever naming the thing that would answer. Agents
|
|
353
|
+
// denied the network read the empty graph as an empty estate and spent
|
|
354
|
+
// their turns retrying `--live`.
|
|
355
|
+
if (!replaying && ir.nodes.length === 0 && (await hasSnapshot(environment))) {
|
|
356
|
+
console.error(formatWarning({
|
|
357
|
+
message: `could not read the estate for "${environment}" — a snapshot of it is recorded; graph that instead with --at latest`,
|
|
358
|
+
}));
|
|
359
|
+
}
|
|
360
|
+
// Enrich node attrs from the fuller live config (#784) so references are
|
|
361
|
+
// present for edge reconstruction — describeResources metadata alone is often
|
|
362
|
+
// too thin (e.g. AWS returns stack outputs, not per-resource references).
|
|
363
|
+
// Live-only: enrichment is a provider call, so a replay must skip it.
|
|
364
|
+
for (const p of replaying ? [] : observing) {
|
|
365
|
+
if (!p.enrichLiveAttrs)
|
|
366
|
+
continue;
|
|
367
|
+
try {
|
|
368
|
+
const enriched = await p.enrichLiveAttrs({ environment, owned: true, stacks });
|
|
369
|
+
ir = {
|
|
370
|
+
...ir,
|
|
371
|
+
nodes: ir.nodes.map((n) => n.lexicon === p.name && enriched[n.id] ? { ...n, attrs: { ...n.attrs, ...enriched[n.id] } } : n),
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
console.error(formatWarning({ message: `${p.name}: live attr enrichment failed — edges may be sparse (${err instanceof Error ? err.message : String(err)})` }));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
finally {
|
|
380
|
+
endpointResult.restore();
|
|
381
|
+
}
|
|
382
|
+
// Reconstruct edges + containment from live references (#778): merge the
|
|
383
|
+
// observing lexicons' reference catalogs and resolve them over the live nodes.
|
|
384
|
+
const catalogs = observing.map((p) => p.referenceCatalog).filter((c) => !!c);
|
|
385
|
+
let containment = [];
|
|
386
|
+
if (catalogs.length > 0) {
|
|
387
|
+
const reconstructed = reconstructEdges(ir.nodes, mergeCatalogs(catalogs));
|
|
388
|
+
ir = { ...ir, edges: reconstructed.edges };
|
|
389
|
+
containment = reconstructed.containment;
|
|
390
|
+
}
|
|
391
|
+
// Drift overlay: classify each resource against declared source (managed /
|
|
392
|
+
// foreign / pending) so a renderer colours the drift. Two anchorings:
|
|
393
|
+
// - source (default, #821): declared graph is the canvas — keeps its edges,
|
|
394
|
+
// so cross-substrate topology survives; live status joined per node.
|
|
395
|
+
// - live (#780): provisioned graph is the canvas — reconstructed live edges.
|
|
396
|
+
if (args.overlay) {
|
|
397
|
+
// Declared nodes chant could not read are painted `neutral`, not
|
|
398
|
+
// `accent`/pending (#1089) — a wrong-cluster or unsupported-kind read must
|
|
399
|
+
// not draw the estate as "not deployed yet".
|
|
400
|
+
const overlayOpts = { unobserved: collectUnobserved(observations) };
|
|
401
|
+
// Multi-stack (#1162): the live `ir` keys nodes by `${stack}::${logicalId}`,
|
|
402
|
+
// so the declared canvas must qualify identically — build each stack's src
|
|
403
|
+
// scoped rather than a flat whole-project discovery (whose disambiguated
|
|
404
|
+
// names never match the observed bare ids). Fall back to the flat build when
|
|
405
|
+
// no stack carries a `src`.
|
|
406
|
+
const scopedStacks = stacks.filter((s) => s.src);
|
|
407
|
+
if (scopedStacks.length > 0) {
|
|
408
|
+
const declaredIr = await buildDeclaredPerStack(scopedStacks, projectPath);
|
|
409
|
+
ir =
|
|
410
|
+
args.overlayAnchor === "live"
|
|
411
|
+
? overlayGraphs(ir, declaredIr, overlayOpts)
|
|
412
|
+
: sourceOverlayGraphs(declaredIr, ir, overlayOpts);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
const declaredParams = await graphBuildParams(ctx, projectPath);
|
|
416
|
+
const declared = await discover(resolve(args.src ?? config.sourceDir ?? "."), {
|
|
417
|
+
...(declaredParams ? { buildParams: declaredParams } : {}),
|
|
418
|
+
});
|
|
419
|
+
// #1626 — the declared canvas must include what the build declares, and
|
|
420
|
+
// that is discovery PLUS build-root contributions (rendered kustomize
|
|
421
|
+
// objects). Same contributors, same merge as the `build()` above — so
|
|
422
|
+
// the rendered nodes classify `good`/`accent` like typed ones instead
|
|
423
|
+
// of reading as foreign. A merge that fails here (it just succeeded in
|
|
424
|
+
// the build above, so only a non-deterministic render gets this far)
|
|
425
|
+
// degrades exactly like discovery errors: overlay skipped, said once.
|
|
426
|
+
if (declared.errors.length > 0) {
|
|
427
|
+
console.error(formatWarning({ message: "overlay: source has discovery errors — showing the provisioned graph without the declared overlay" }));
|
|
428
|
+
}
|
|
429
|
+
else if (!(await mergeGraphBuildRoots(declared.entities, buildRoots))) {
|
|
430
|
+
console.error(formatWarning({ message: "overlay: a build root failed to render — showing the provisioned graph without the declared overlay" }));
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
await mergeGraphOps(declared.entities, declared.sourceFiles, projectPath);
|
|
434
|
+
const declaredIr = buildGraphIr(declared.entities, projectPath);
|
|
435
|
+
ir =
|
|
436
|
+
args.overlayAnchor === "live"
|
|
437
|
+
? overlayGraphs(ir, declaredIr, overlayOpts)
|
|
438
|
+
: sourceOverlayGraphs(declaredIr, ir, overlayOpts);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// Behaviour overlay (#2377, epic #2355): carry a prediction on the graph.
|
|
443
|
+
// After the drift overlay so it lands on the final node set beside `_status`,
|
|
444
|
+
// and before the lens so a lens filters a predicted node like any other.
|
|
445
|
+
{
|
|
446
|
+
const raw = buildResult.outputs ? [...buildResult.outputs.values()][0] : undefined;
|
|
447
|
+
const predicted = await predictOntoIr(ir, plugins, args, {
|
|
448
|
+
environment: environment ?? "",
|
|
449
|
+
buildOutput: raw === undefined ? "" : typeof raw === "string" ? raw : raw.primary,
|
|
450
|
+
// This graph was read from the account, drift included.
|
|
451
|
+
from: "live",
|
|
452
|
+
});
|
|
453
|
+
if (predicted === REFUSED)
|
|
454
|
+
return 1;
|
|
455
|
+
ir = predicted;
|
|
456
|
+
}
|
|
457
|
+
if (args.lens) {
|
|
458
|
+
try {
|
|
459
|
+
ir = applyLens(ir, parseLens(args.lens, { up: args.up, down: args.down }));
|
|
460
|
+
}
|
|
461
|
+
catch (err) {
|
|
462
|
+
console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
|
|
463
|
+
return 1;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
{
|
|
467
|
+
const base = ir;
|
|
468
|
+
ir = applyDetail(ir, (args.detail ?? 2));
|
|
469
|
+
// #1489 — a --detail 3 that changed nothing says so instead of silently
|
|
470
|
+
// emitting the same bytes as --detail 2.
|
|
471
|
+
if (args.detail === 3) {
|
|
472
|
+
const notice = detailInertNotice(base, ir);
|
|
473
|
+
if (notice)
|
|
474
|
+
console.error(formatWarning({ message: notice }));
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
// Containment grouping (#779) → boundary boxes. Built after lens/detail and
|
|
478
|
+
// filtered to surviving nodes, so a lens can't leave dangling group refs.
|
|
479
|
+
if (containment.length > 0) {
|
|
480
|
+
const present = new Set(ir.nodes.map((n) => n.id));
|
|
481
|
+
const byContainer = containmentGroups(containment.filter((c) => present.has(c.child) && present.has(c.parent)));
|
|
482
|
+
if (Object.keys(byContainer).length > 0) {
|
|
483
|
+
ir = { ...ir, groups: { ...ir.groups, byContainer } };
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
return emitIr(ir, ctx, format);
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* `chant graph --components` (#560) — dependency order/waves for discovered
|
|
490
|
+
* `Component` declarations, mirroring `runStackGraph`'s presentation
|
|
491
|
+
* (waves top-to-bottom, consumer → producer edges) but sourced from
|
|
492
|
+
* `computeComponentGraph` (../../components/cli-support.ts), which resolves
|
|
493
|
+
* order purely from each component's flat `dependsOn` list — no AttrRef-style
|
|
494
|
+
* cross-lexicon inference needed, since a component's dependency is always
|
|
495
|
+
* an explicit name.
|
|
496
|
+
*/
|
|
497
|
+
async function runComponentGraph(ctx) {
|
|
498
|
+
const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
|
|
499
|
+
// #1490 — as in runComponentGraphView: the text/--json mode reads the same
|
|
500
|
+
// source and must not disagree with the --format modes about it.
|
|
501
|
+
const componentParams = await graphBuildParams(ctx, projectPath);
|
|
502
|
+
if (!componentParams)
|
|
503
|
+
return 1;
|
|
504
|
+
const graph = await computeComponentGraph(projectPath, ctx.args.sandbox, componentParams);
|
|
505
|
+
if (!graph.success) {
|
|
506
|
+
console.error(formatError({ message: graph.error ?? "Failed to compute component graph" }));
|
|
507
|
+
return 1;
|
|
508
|
+
}
|
|
509
|
+
if (ctx.args.json) {
|
|
510
|
+
console.log(JSON.stringify(graph, null, 2));
|
|
511
|
+
return 0;
|
|
512
|
+
}
|
|
513
|
+
if (graph.order.length === 0) {
|
|
514
|
+
console.log("No components found");
|
|
515
|
+
return 0;
|
|
516
|
+
}
|
|
517
|
+
console.log(formatBold("Deploy order (waves apply top-to-bottom; a wave's components are parallel-safe):"));
|
|
518
|
+
graph.waves.forEach((wave, i) => console.log(` ${i + 1}. ${wave.join(", ")}`));
|
|
519
|
+
if (graph.edges.length > 0) {
|
|
520
|
+
console.log(formatBold("\nDependencies (consumer → producer):"));
|
|
521
|
+
for (const { from, to } of graph.edges)
|
|
522
|
+
console.log(` ${from} → ${to}`);
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
console.log("\nNo cross-component dependencies — all components are independent.");
|
|
526
|
+
}
|
|
527
|
+
return 0;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* `chant graph --components --format ir|mermaid|dot|layout` — the component DAG
|
|
531
|
+
* projected into the renderable IR (nodes = components, `groups.byWave` = the
|
|
532
|
+
* parallel-safe deploy waves, edges = `dependsOn` consumer → producer). This is
|
|
533
|
+
* the graph behold paints: read one way it is the deploy order, read the other
|
|
534
|
+
* the CI pipeline. Distinct from `runGraphView`, which emits the AWS *entity*
|
|
535
|
+
* graph — the component projection has one node per component, not per resource.
|
|
536
|
+
*
|
|
537
|
+
* `--projection <lexicon>` (#989, `--format ir` only — validated in `runGraph`)
|
|
538
|
+
* adds the **CI/pipeline projection** alongside this component graph:
|
|
539
|
+
* `ir.pipeline` carries the stages/jobs/`needs` `<lexicon>`'s
|
|
540
|
+
* `generateComponentPipeline` synthesizes for `chant build --components
|
|
541
|
+
* --generate <lexicon>` (`generateComponentsPipeline`, ../../components/cli-support.ts)
|
|
542
|
+
* — reused wholesale, not re-derived, so a consumer (e.g. behold, epic #492/
|
|
543
|
+
* INTENTIUS/behold#54) gets the pipeline shape as first-class IR nodes/edges
|
|
544
|
+
* instead of re-deriving it from `dependsOn` or parsing generated CI YAML.
|
|
545
|
+
*
|
|
546
|
+
* Lint-gated like the entity view: the DAG stands for deployable source, so we
|
|
547
|
+
* refuse to emit it for source that does not pass lint.
|
|
548
|
+
*/
|
|
549
|
+
async function runComponentGraphView(ctx, format) {
|
|
550
|
+
const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
|
|
551
|
+
// #1490 — resolved BEFORE the lint gate, not after. The COMP* checks import
|
|
552
|
+
// every `*.component.ts`, an ES module evaluates once per path, and the
|
|
553
|
+
// values in effect at that first import are the ones the graph below will
|
|
554
|
+
// read no matter what it resolves for itself. Ordering is the fix; passing
|
|
555
|
+
// them to `computeComponentGraph` alone did nothing.
|
|
556
|
+
const componentParams = await graphBuildParams(ctx, projectPath);
|
|
557
|
+
if (!componentParams)
|
|
558
|
+
return 1;
|
|
559
|
+
const lint = await lintCommand({
|
|
560
|
+
path: ctx.args.path,
|
|
561
|
+
format: "stylish",
|
|
562
|
+
sandbox: ctx.args.sandbox,
|
|
563
|
+
buildParams: componentParams,
|
|
564
|
+
});
|
|
565
|
+
if (!lint.success) {
|
|
566
|
+
console.error(formatError({
|
|
567
|
+
message: "Refusing to emit graph: source has lint errors. Run `chant lint` and fix them first.",
|
|
568
|
+
}));
|
|
569
|
+
return 1;
|
|
570
|
+
}
|
|
571
|
+
const graph = await computeComponentGraph(projectPath, ctx.args.sandbox, componentParams);
|
|
572
|
+
if (!graph.success) {
|
|
573
|
+
console.error(formatError({ message: graph.error ?? "Failed to compute component graph" }));
|
|
574
|
+
return 1;
|
|
575
|
+
}
|
|
576
|
+
// One node per component; wave index carried on the node so a renderer that
|
|
577
|
+
// ignores groups can still lane by it. `dependsOn` is a plain name edge —
|
|
578
|
+
// `kind: "ref"` matches the entity graph's edge vocabulary the emitters read.
|
|
579
|
+
const waveOf = new Map();
|
|
580
|
+
graph.waves.forEach((wave, i) => wave.forEach((name) => waveOf.set(name, i + 1)));
|
|
581
|
+
let ir = {
|
|
582
|
+
nodes: graph.order.map((name) => ({
|
|
583
|
+
id: name,
|
|
584
|
+
kind: "Component",
|
|
585
|
+
lexicon: "chant",
|
|
586
|
+
// `liveNames` (#1491): the resources this component owns — declared, or
|
|
587
|
+
// the contract's `[name]` identity fallback — so a consumer can join
|
|
588
|
+
// the component DAG to the resource graph instead of guessing at kinds.
|
|
589
|
+
// `composites` (#1492): the composite kind(s) this component's
|
|
590
|
+
// resources come from, when the component declared them explicitly —
|
|
591
|
+
// omitted from attrs (not defaulted) when it didn't, so a consumer
|
|
592
|
+
// knows to fall back to its own naming-convention guess rather than
|
|
593
|
+
// reading "no composites" from an empty array.
|
|
594
|
+
attrs: {
|
|
595
|
+
wave: waveOf.get(name) ?? null,
|
|
596
|
+
liveNames: graph.liveNames?.[name] ?? [name],
|
|
597
|
+
...(graph.composites?.[name] ? { composites: graph.composites[name] } : {}),
|
|
598
|
+
// The archetype (#2662), declared or inferred, so a reader such as
|
|
599
|
+
// `chant workspace graph --composites` labels a component without
|
|
600
|
+
// importing its source.
|
|
601
|
+
...(graph.archetypes?.[name] ? { archetype: graph.archetypes[name] } : {}),
|
|
602
|
+
// The environments the component declares (#3153), where each release goes, so
|
|
603
|
+
// `chant workspace graph --composites` lists them without importing its source.
|
|
604
|
+
...(graph.environments?.[name] ? { environments: graph.environments[name] } : {}),
|
|
605
|
+
},
|
|
606
|
+
// Deep-link the node to its `*.component.ts` (behold's inspect panel).
|
|
607
|
+
...(graph.files?.[name] ? { sourceLoc: { file: graph.files[name] } } : {}),
|
|
608
|
+
})),
|
|
609
|
+
edges: graph.edges.map(({ from, to }) => ({ from, to, kind: "ref" })),
|
|
610
|
+
groups: {
|
|
611
|
+
byWave: Object.fromEntries(graph.waves.map((wave, i) => [`wave-${i + 1}`, [...wave]])),
|
|
612
|
+
},
|
|
613
|
+
};
|
|
614
|
+
if (ctx.args.projection) {
|
|
615
|
+
const pipeline = await buildPipelineProjection(projectPath, ctx.args.projection, ctx.args.sandbox);
|
|
616
|
+
if (!pipeline.success) {
|
|
617
|
+
console.error(formatError({ message: pipeline.error ?? `Failed to generate ${ctx.args.projection} pipeline projection` }));
|
|
618
|
+
return 1;
|
|
619
|
+
}
|
|
620
|
+
ir = { ...ir, pipeline: pipeline.pipeline };
|
|
621
|
+
}
|
|
622
|
+
return emitIr(ir, ctx, format);
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Reshape `generateComponentsPipeline`'s result (../../components/cli-support.ts
|
|
626
|
+
* — the exact function `chant build --components --generate <lexicon>` calls)
|
|
627
|
+
* into the IR's `IRPipeline` vocabulary (#989): one `IRPipelineNode` per
|
|
628
|
+
* generated CI job, one `IRPipelineEdge` per `needs:` dependency (consumer job
|
|
629
|
+
* → producer job, mirroring the component edges' consumer → producer
|
|
630
|
+
* direction). Every shape decision — job naming, one stage per wave,
|
|
631
|
+
* dependency resolution — stays owned by `lexicon`'s `generateComponentPipeline`;
|
|
632
|
+
* this only relabels its `{ stages, jobs }` output as IR nodes/edges, it never
|
|
633
|
+
* re-derives the graph.
|
|
634
|
+
*/
|
|
635
|
+
async function buildPipelineProjection(projectPath, lexicon, sandbox) {
|
|
636
|
+
const result = await generateComponentsPipeline(projectPath, lexicon, undefined, sandbox);
|
|
637
|
+
if (!result.success)
|
|
638
|
+
return { success: false, error: result.error };
|
|
639
|
+
const jobs = result.jobs ?? [];
|
|
640
|
+
return {
|
|
641
|
+
success: true,
|
|
642
|
+
pipeline: {
|
|
643
|
+
provider: lexicon,
|
|
644
|
+
// The environment the projected pipeline deploys (#2046) — the
|
|
645
|
+
// generator's own resolution, carried rather than re-derived.
|
|
646
|
+
...(result.env ? { env: result.env } : {}),
|
|
647
|
+
stages: result.stages ?? [],
|
|
648
|
+
nodes: jobs.map((j) => ({ id: j.jobName, kind: "CIJob", component: j.component, stage: j.stage })),
|
|
649
|
+
edges: jobs.flatMap((j) => j.needs.map((dep) => ({ from: j.jobName, to: dep, kind: "needs" }))),
|
|
650
|
+
},
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* `chant graph --format ir|mermaid|dot|layout` — build the graph IR (honouring
|
|
655
|
+
* `--detail`) and emit it as JSON, a Mermaid flowchart, Graphviz DOT, or node
|
|
656
|
+
* positions from a layout engine. `layout` takes optional painter-measured
|
|
657
|
+
* `--node-sizes` so spacing fits real node footprints, and defaults to the dagre
|
|
658
|
+
* engine (no native dependency); `--layout-engine graphviz` opts into `dot`.
|
|
659
|
+
* Lint-gated: the IR represents valid infra, so we refuse to emit for source that
|
|
660
|
+
* does not pass lint. Non-zero on discovery errors or a layout-engine failure.
|
|
661
|
+
*/
|
|
662
|
+
/**
|
|
663
|
+
* Add what the lexicons' `graphMeta` hooks report to `ir.meta` (#2559). A
|
|
664
|
+
* lexicon with nothing to report leaves the IR as it was, so a project that
|
|
665
|
+
* declares none of their entities prints what it did before. Two lexicons
|
|
666
|
+
* that answer the same key keep the first and say so on stderr.
|
|
667
|
+
*/
|
|
668
|
+
function withGraphMeta(ir, plugins, entities) {
|
|
669
|
+
const added = {};
|
|
670
|
+
for (const p of plugins) {
|
|
671
|
+
if (!p.graphMeta)
|
|
672
|
+
continue;
|
|
673
|
+
for (const [key, value] of Object.entries(p.graphMeta(entities) ?? {})) {
|
|
674
|
+
if (key in added || (ir.meta && key in ir.meta)) {
|
|
675
|
+
console.error(formatWarning({ message: `the ${p.name} lexicon reports graph meta "${key}", which another source already set; its value is dropped` }));
|
|
676
|
+
continue;
|
|
677
|
+
}
|
|
678
|
+
added[key] = value;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
return Object.keys(added).length === 0 ? ir : { ...ir, meta: { ...(ir.meta ?? {}), ...added } };
|
|
682
|
+
}
|
|
683
|
+
/** Returned instead of a graph when the prediction cannot be attempted honestly. */
|
|
684
|
+
const REFUSED = Symbol("behaviour-refused");
|
|
685
|
+
/**
|
|
686
|
+
* Carry a prediction on `ir`, if one was asked for (#2377, epic #2355).
|
|
687
|
+
*
|
|
688
|
+
* Shared by both graph paths, because the epic wants both: "the live path
|
|
689
|
+
* predicts the account as it stands, drift included. The declared path
|
|
690
|
+
* predicts the file. The two are shown as a delta" (#2355). A delta between
|
|
691
|
+
* two shapes that reached the engine by different routes is the worst possible
|
|
692
|
+
* input to a delta, so there is one route.
|
|
693
|
+
*
|
|
694
|
+
* `--traffic` is the trigger, and it is the trigger rather than the engine
|
|
695
|
+
* variable because the contract forbids defaulting the level
|
|
696
|
+
* (../../behaviour.ts): every figure an engine returns is *at* a stated
|
|
697
|
+
* traffic, so inventing one would silently decide what every number on the
|
|
698
|
+
* graph means. Without the flag nothing is asked, neither key appears, and a
|
|
699
|
+
* consumer reads that absence as "not looked" rather than as a refusal.
|
|
700
|
+
*/
|
|
701
|
+
async function predictOntoIr(ir, plugins, args, ctx) {
|
|
702
|
+
if (!args.traffic)
|
|
703
|
+
return ir;
|
|
704
|
+
const predicting = plugins.filter((p) => p.predictBehaviour);
|
|
705
|
+
if (predicting.length === 0) {
|
|
706
|
+
console.error(formatWarning({
|
|
707
|
+
message: "--traffic: no installed lexicon implements predictBehaviour, so nothing was predicted. The graph is unchanged.",
|
|
708
|
+
}));
|
|
709
|
+
return ir;
|
|
710
|
+
}
|
|
711
|
+
if (predicting.length > 1) {
|
|
712
|
+
// Two engines would mean two `meta._behaviour` values and one key. Rather
|
|
713
|
+
// than pick, say so: a merged prediction across engines is not defined by
|
|
714
|
+
// the contract, and silently taking the first would attribute one engine's
|
|
715
|
+
// figures to the other's provenance.
|
|
716
|
+
console.error(formatError({
|
|
717
|
+
message: `--traffic: ${predicting.length} lexicons implement predictBehaviour (${predicting.map((p) => p.name).join(", ")}) — chant cannot merge two engines' figures onto one graph.`,
|
|
718
|
+
hint: "Predict one lexicon at a time, or drop --traffic to graph without a prediction",
|
|
719
|
+
}));
|
|
720
|
+
return REFUSED;
|
|
721
|
+
}
|
|
722
|
+
const request = behaviourRequestFromIr(ir, {
|
|
723
|
+
environment: ctx.environment,
|
|
724
|
+
traffic: args.traffic,
|
|
725
|
+
buildOutput: ctx.buildOutput,
|
|
726
|
+
from: ctx.from,
|
|
727
|
+
// `unknown`, for the reason the declared path claims it
|
|
728
|
+
// (../../op/activities/predict-behaviour.ts): reference edges resolved,
|
|
729
|
+
// containment absent, and no vocabulary here for "this kind is a boundary
|
|
730
|
+
// whose containment is missing". Claiming `complete` would be true about
|
|
731
|
+
// references and false about the graph; `partial` has to name its gap as
|
|
732
|
+
// `dangling` or `unresolvedKinds`, and this gap is neither.
|
|
733
|
+
edgeCoverage: { verdict: "unknown" },
|
|
734
|
+
...(args.owned === undefined ? {} : { owned: args.owned }),
|
|
735
|
+
});
|
|
736
|
+
try {
|
|
737
|
+
// A refusal is a value, not a throw: it comes back as a result and rides on
|
|
738
|
+
// `meta._behaviour` whole, which is the one shape behold's reader branches
|
|
739
|
+
// on (../../behaviour-overlay.ts).
|
|
740
|
+
return applyBehaviourOverlay(ir, behaviourOverlay(await predicting[0].predictBehaviour(request)));
|
|
741
|
+
}
|
|
742
|
+
catch (err) {
|
|
743
|
+
// The estate graph is the thing asked for; a broken engine must not take it
|
|
744
|
+
// away. Say what failed and serve the graph without the block.
|
|
745
|
+
console.error(formatWarning({
|
|
746
|
+
message: `--traffic: ${predicting[0].name}'s predictBehaviour failed (${err instanceof Error ? err.message : String(err)}) — showing the graph without a prediction`,
|
|
747
|
+
}));
|
|
748
|
+
return ir;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
async function runGraphView(ctx, format) {
|
|
752
|
+
const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
|
|
753
|
+
const level = ctx.args.detail ?? 2;
|
|
754
|
+
if (![0, 1, 2, 3].includes(level)) {
|
|
755
|
+
console.error(formatError({ message: `Invalid --detail ${level}. Expected 0, 1, 2, or 3.` }));
|
|
756
|
+
return 1;
|
|
757
|
+
}
|
|
758
|
+
// Resolved before the gate for the reason in runComponentGraphView: the
|
|
759
|
+
// lint pass imports project source, and the first import of a module is the
|
|
760
|
+
// one that binds its parameter-derived values (#1490).
|
|
761
|
+
const buildParams = await graphBuildParams(ctx, projectPath);
|
|
762
|
+
if (!buildParams)
|
|
763
|
+
return 1;
|
|
764
|
+
// Gate: only emit for lint-clean source.
|
|
765
|
+
const lint = await lintCommand({
|
|
766
|
+
path: ctx.args.path,
|
|
767
|
+
format: "stylish",
|
|
768
|
+
sandbox: ctx.args.sandbox,
|
|
769
|
+
buildParams,
|
|
770
|
+
});
|
|
771
|
+
if (!lint.success) {
|
|
772
|
+
console.error(formatError({
|
|
773
|
+
message: "Refusing to emit graph: source has lint errors. Run `chant lint` and fix them first.",
|
|
774
|
+
}));
|
|
775
|
+
return 1;
|
|
776
|
+
}
|
|
777
|
+
const result = await discover(projectPath, { buildParams });
|
|
778
|
+
if (result.errors.length > 0) {
|
|
779
|
+
for (const e of result.errors)
|
|
780
|
+
console.error(formatError({ message: e.message }));
|
|
781
|
+
return 1;
|
|
782
|
+
}
|
|
783
|
+
// #1626 — join the build-root contributions (rendered kustomize objects) to
|
|
784
|
+
// the discovered set, the way `build()` does before partitioning, so the
|
|
785
|
+
// static graph shows the same estate the build emits. Fatal on failure,
|
|
786
|
+
// like discovery errors: this graph stands for what would build.
|
|
787
|
+
if (!(await mergeGraphBuildRoots(result.entities, await graphBuildRootContributors(ctx, projectPath)))) {
|
|
788
|
+
return 1;
|
|
789
|
+
}
|
|
790
|
+
// #1675 — ops live outside sourceDir by convention; join the ones
|
|
791
|
+
// `discoverOps` finds from the git root so the IR carries the declared DAG.
|
|
792
|
+
await mergeGraphOps(result.entities, result.sourceFiles, projectPath);
|
|
793
|
+
// Build the base IR, focus with a lens (declarable-level, most precise), then
|
|
794
|
+
// apply the detail tier — so e.g. blast:<resource> works before any collapse.
|
|
795
|
+
let ir = buildGraphIr(result.entities, projectPath);
|
|
796
|
+
// The declared half of the epic's delta (#2355): this path predicts the
|
|
797
|
+
// file, the live path predicts the account. Same helper, so the two shapes
|
|
798
|
+
// reach the engine by one route and stay comparable.
|
|
799
|
+
{
|
|
800
|
+
const plugins = ctx.plugins.length > 0
|
|
801
|
+
? ctx.plugins
|
|
802
|
+
: await loadPlugins(await projectLexiconsOrNone(projectPath));
|
|
803
|
+
const predicted = await predictOntoIr(ir, plugins, ctx.args, {
|
|
804
|
+
// No environment on the declared path: the file is not deployed anywhere
|
|
805
|
+
// yet, and naming one would claim it was.
|
|
806
|
+
environment: ctx.args.env ?? "",
|
|
807
|
+
buildOutput: "",
|
|
808
|
+
// And this graph was built from the file, so say so. Without it a
|
|
809
|
+
// lexicon cannot tell the two paths apart and answers about whichever
|
|
810
|
+
// estate it defaults to, with nothing in the report to say which.
|
|
811
|
+
from: "declared",
|
|
812
|
+
});
|
|
813
|
+
if (predicted === REFUSED)
|
|
814
|
+
return 1;
|
|
815
|
+
ir = predicted;
|
|
816
|
+
ir = withGraphMeta(ir, plugins, result.entities);
|
|
817
|
+
}
|
|
818
|
+
if (ctx.args.lens) {
|
|
819
|
+
try {
|
|
820
|
+
ir = applyLens(ir, parseLens(ctx.args.lens, { up: ctx.args.up, down: ctx.args.down }));
|
|
821
|
+
}
|
|
822
|
+
catch (err) {
|
|
823
|
+
console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
|
|
824
|
+
return 1;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
{
|
|
828
|
+
const base = ir;
|
|
829
|
+
ir = applyDetail(ir, level);
|
|
830
|
+
// #1489 — same say-so as the live path: an inert --detail 3 names itself.
|
|
831
|
+
if (level === 3) {
|
|
832
|
+
const notice = detailInertNotice(base, ir);
|
|
833
|
+
if (notice)
|
|
834
|
+
console.error(formatWarning({ message: notice }));
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
return emitIr(ir, ctx, format);
|
|
838
|
+
}
|
|
839
|
+
/** Emit a built IR in the requested view format — shared by the source
|
|
840
|
+
* (`runGraphView`) and live (`runGraphLive`) paths. */
|
|
841
|
+
async function emitIr(ir, ctx, format) {
|
|
842
|
+
switch (format) {
|
|
843
|
+
case "mermaid":
|
|
844
|
+
console.log(toMermaid(ir));
|
|
845
|
+
return 0;
|
|
846
|
+
case "dot":
|
|
847
|
+
console.log(toDot(ir));
|
|
848
|
+
return 0;
|
|
849
|
+
case "layout":
|
|
850
|
+
try {
|
|
851
|
+
const sizes = readNodeSizes(ctx.args.nodeSizes);
|
|
852
|
+
const engine = getLayoutEngine(ctx.args.layoutEngine);
|
|
853
|
+
const layout = await engine.layout(toLayoutInput(ir, sizes));
|
|
854
|
+
console.log(JSON.stringify(layout, null, 2));
|
|
855
|
+
return 0;
|
|
856
|
+
}
|
|
857
|
+
catch (err) {
|
|
858
|
+
console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
|
|
859
|
+
return 1;
|
|
860
|
+
}
|
|
861
|
+
case "ir":
|
|
862
|
+
default:
|
|
863
|
+
// The version leads the document (#2529), so a reader sees it before
|
|
864
|
+
// anything it might not understand.
|
|
865
|
+
console.log(JSON.stringify({ version: GRAPH_IR_VERSION, ...ir }, null, 2));
|
|
866
|
+
return 0;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
/**
|
|
870
|
+
* Resolve the `--node-sizes` value into a `{ id: {w, h} }` map. The spec is one
|
|
871
|
+
* of: inline JSON, `-` (read JSON from stdin, to dodge arg-length limits), or
|
|
872
|
+
* `@path` (read from a file). Empty/absent → no sizes (engine uses defaults).
|
|
873
|
+
* Throws on malformed JSON so a typo fails loudly rather than mis-laying out.
|
|
874
|
+
*/
|
|
875
|
+
function readNodeSizes(spec) {
|
|
876
|
+
if (!spec)
|
|
877
|
+
return {};
|
|
878
|
+
let raw;
|
|
879
|
+
if (spec === "-")
|
|
880
|
+
raw = readFileSync(0, "utf8");
|
|
881
|
+
else if (spec.startsWith("@"))
|
|
882
|
+
raw = readFileSync(spec.slice(1), "utf8");
|
|
883
|
+
else
|
|
884
|
+
raw = spec;
|
|
885
|
+
raw = raw.trim();
|
|
886
|
+
if (!raw)
|
|
887
|
+
return {};
|
|
888
|
+
let parsed;
|
|
889
|
+
try {
|
|
890
|
+
parsed = JSON.parse(raw);
|
|
891
|
+
}
|
|
892
|
+
catch (err) {
|
|
893
|
+
throw new Error(`--node-sizes is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
894
|
+
}
|
|
895
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
896
|
+
throw new Error("--node-sizes must be a JSON object mapping node id → {w, h}");
|
|
897
|
+
}
|
|
898
|
+
const out = {};
|
|
899
|
+
for (const [id, val] of Object.entries(parsed)) {
|
|
900
|
+
const v = val;
|
|
901
|
+
if (typeof v?.w === "number" && typeof v?.h === "number" && v.w > 0 && v.h > 0) {
|
|
902
|
+
out[id] = { w: v.w, h: v.h };
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
return out;
|
|
906
|
+
}
|
|
907
|
+
async function runOpGraph() {
|
|
908
|
+
const { ops, errors } = await discoverOps();
|
|
909
|
+
for (const err of errors)
|
|
910
|
+
console.error(formatError({ message: err }));
|
|
911
|
+
if (ops.size === 0) {
|
|
912
|
+
console.log("No Ops found");
|
|
913
|
+
return 0;
|
|
914
|
+
}
|
|
915
|
+
let hasEdges = false;
|
|
916
|
+
for (const [name, { config }] of ops) {
|
|
917
|
+
for (const dep of config.depends ?? []) {
|
|
918
|
+
console.log(`${dep} → ${name}`);
|
|
919
|
+
hasEdges = true;
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
if (!hasEdges)
|
|
923
|
+
console.log("No Op dependencies");
|
|
924
|
+
return 0;
|
|
925
|
+
}
|
|
926
|
+
async function runStackGraph(ctx) {
|
|
927
|
+
const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
|
|
928
|
+
const buildParams = await graphBuildParams(ctx, projectPath);
|
|
929
|
+
if (!buildParams)
|
|
930
|
+
return 1;
|
|
931
|
+
const result = await discover(projectPath, { buildParams });
|
|
932
|
+
if (result.errors.length > 0) {
|
|
933
|
+
for (const e of result.errors)
|
|
934
|
+
console.error(formatError({ message: e.message }));
|
|
935
|
+
return 1;
|
|
936
|
+
}
|
|
937
|
+
// #1626 — same join as runGraphView: contributed entities are part of the
|
|
938
|
+
// built estate, so they belong in its stack partitions too.
|
|
939
|
+
if (!(await mergeGraphBuildRoots(result.entities, await graphBuildRootContributors(ctx, projectPath)))) {
|
|
940
|
+
return 1;
|
|
941
|
+
}
|
|
942
|
+
const lexicons = [...partitionByLexicon(result.entities).keys()];
|
|
943
|
+
const graph = computeStackGraph(result.entities, lexicons);
|
|
944
|
+
if (ctx.args.json) {
|
|
945
|
+
console.log(JSON.stringify(graph, null, 2));
|
|
946
|
+
return graph.cycles.length > 0 ? 1 : 0;
|
|
947
|
+
}
|
|
948
|
+
if (graph.nodes.length === 0) {
|
|
949
|
+
console.log("No stacks found");
|
|
950
|
+
return 0;
|
|
951
|
+
}
|
|
952
|
+
console.log(formatBold("Apply order (waves apply top-to-bottom; a wave's stacks are parallel-safe):"));
|
|
953
|
+
graph.waves.forEach((wave, i) => console.log(` ${i + 1}. ${wave.join(", ")}`));
|
|
954
|
+
if (graph.edges.length > 0) {
|
|
955
|
+
console.log(formatBold("\nDependencies (consumer → producer):"));
|
|
956
|
+
for (const { from, to } of graph.edges)
|
|
957
|
+
console.log(` ${from} → ${to}`);
|
|
958
|
+
}
|
|
959
|
+
else {
|
|
960
|
+
console.log("\nNo cross-stack dependencies — all stacks are independent.");
|
|
961
|
+
}
|
|
962
|
+
if (graph.cycles.length > 0) {
|
|
963
|
+
for (const cycle of graph.cycles) {
|
|
964
|
+
console.error(formatWarning({ message: `Dependency cycle among stacks: ${cycle.join(" ↔ ")}` }));
|
|
965
|
+
}
|
|
966
|
+
return 1;
|
|
967
|
+
}
|
|
968
|
+
return 0;
|
|
969
|
+
}
|