@intentius/chant 0.124.13 → 0.124.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/lexicon-module.ts +3 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +1 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for lexicon manifest and registry validation.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Intrinsic definitions
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
export const IntrinsicDefSchema = z.object({
|
|
9
|
+
name: z.string().min(1, "intrinsic name must not be empty"),
|
|
10
|
+
description: z.string().optional(),
|
|
11
|
+
outputKey: z.string().optional(),
|
|
12
|
+
// Required (chant #1067) — no silent default for whether an intrinsic
|
|
13
|
+
// folds. See IntrinsicDef.isTag in ../lexicon.ts for the history.
|
|
14
|
+
isTag: z.boolean(),
|
|
15
|
+
// chant #1044 — optional and default-off on purpose: absent means "this
|
|
16
|
+
// intrinsic's plain-call form does not fold", which is what every
|
|
17
|
+
// registration written before #1044 means. Only an explicit `true` opts a
|
|
18
|
+
// call into folding. See IntrinsicDef.foldsAsCall in ../lexicon.ts.
|
|
19
|
+
foldsAsCall: z.boolean().optional(),
|
|
20
|
+
// chant #1966 — same default-off shape as foldsAsCall, for the EAGER
|
|
21
|
+
// call-form opt-in. See IntrinsicDef.foldsEagerly in ../lexicon.ts.
|
|
22
|
+
foldsEagerly: z.boolean().optional(),
|
|
23
|
+
});
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Lexicon manifest
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$/;
|
|
28
|
+
export const LexiconManifestSchema = z.object({
|
|
29
|
+
name: z.string().min(1, "manifest name must not be empty"),
|
|
30
|
+
version: z.string().regex(semverRegex, "version must be valid semver (X.Y.Z)"),
|
|
31
|
+
chantVersion: z.string().optional(),
|
|
32
|
+
namespace: z.string().optional(),
|
|
33
|
+
intrinsics: z.array(IntrinsicDefSchema).optional(),
|
|
34
|
+
pseudoParameters: z.record(z.string(), z.string()).optional(),
|
|
35
|
+
});
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Extension constraint schema (matches ExtensionConstraint from lexicon packages)
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
const ExtensionConstraintSchema = z.object({
|
|
40
|
+
name: z.string(),
|
|
41
|
+
type: z.enum(["if_then", "dependent_excluded", "required_or", "required_xor"]),
|
|
42
|
+
condition: z.unknown().optional(),
|
|
43
|
+
requirement: z.unknown().optional(),
|
|
44
|
+
});
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Property constraints schema (matches PropertyConstraints from lexicon packages)
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
const PropertyConstraintsSchema = z.object({
|
|
49
|
+
pattern: z.string().optional(),
|
|
50
|
+
minLength: z.number().optional(),
|
|
51
|
+
maxLength: z.number().optional(),
|
|
52
|
+
minimum: z.number().optional(),
|
|
53
|
+
maximum: z.number().optional(),
|
|
54
|
+
format: z.string().optional(),
|
|
55
|
+
const: z.unknown().optional(),
|
|
56
|
+
default: z.unknown().optional(),
|
|
57
|
+
enum: z.array(z.string()).optional(),
|
|
58
|
+
});
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Lexicon entry (registry entry for a resource or property type)
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
export const LexiconEntrySchema = z.object({
|
|
63
|
+
resourceType: z.string(),
|
|
64
|
+
kind: z.enum(["resource", "property"]),
|
|
65
|
+
lexicon: z.string(),
|
|
66
|
+
attrs: z.record(z.string(), z.string()).optional(),
|
|
67
|
+
constraints: z.array(ExtensionConstraintSchema).optional(),
|
|
68
|
+
propertyConstraints: z.record(z.string(), PropertyConstraintsSchema).optional(),
|
|
69
|
+
createOnly: z.array(z.string()).optional(),
|
|
70
|
+
writeOnly: z.array(z.string()).optional(),
|
|
71
|
+
primaryIdentifier: z.array(z.string()).optional(),
|
|
72
|
+
deprecatedProperties: z.array(z.string()).optional(),
|
|
73
|
+
conditionalCreateOnly: z.array(z.string()).optional(),
|
|
74
|
+
replacementStrategy: z.enum(["delete_then_create", "create_then_delete"]).optional(),
|
|
75
|
+
tagging: z.object({
|
|
76
|
+
taggable: z.boolean(),
|
|
77
|
+
tagOnCreate: z.boolean(),
|
|
78
|
+
tagUpdatable: z.boolean(),
|
|
79
|
+
}).optional(),
|
|
80
|
+
runtimeDeprecations: z.record(z.string(), z.string()).optional(),
|
|
81
|
+
});
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Validation helpers
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* Validate a manifest from unknown input (object or JSON string).
|
|
87
|
+
* Throws a descriptive error on invalid input.
|
|
88
|
+
*/
|
|
89
|
+
export function validateManifest(data) {
|
|
90
|
+
if (data === null || data === undefined) {
|
|
91
|
+
throw new Error("manifest data is empty");
|
|
92
|
+
}
|
|
93
|
+
if (typeof data === "string") {
|
|
94
|
+
try {
|
|
95
|
+
data = JSON.parse(data);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const msg = err instanceof SyntaxError ? err.message : String(err);
|
|
99
|
+
throw new Error(`invalid JSON in manifest: ${msg}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
103
|
+
throw new Error("manifest must be a JSON object");
|
|
104
|
+
}
|
|
105
|
+
const result = LexiconManifestSchema.safeParse(data);
|
|
106
|
+
if (!result.success) {
|
|
107
|
+
const issue = result.error.issues[0];
|
|
108
|
+
const path = issue.path.length > 0 ? issue.path.join(".") : undefined;
|
|
109
|
+
const prefix = path ? `manifest field ${path}` : "manifest";
|
|
110
|
+
throw new Error(`${prefix}: ${issue.message}`);
|
|
111
|
+
}
|
|
112
|
+
return result.data;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Validate a registry JSON string into a typed record.
|
|
116
|
+
* Throws a descriptive error on invalid input.
|
|
117
|
+
*/
|
|
118
|
+
export function validateRegistry(json) {
|
|
119
|
+
let parsed;
|
|
120
|
+
try {
|
|
121
|
+
parsed = JSON.parse(json);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const msg = err instanceof SyntaxError ? err.message : String(err);
|
|
125
|
+
throw new Error(`invalid JSON in registry: ${msg}`);
|
|
126
|
+
}
|
|
127
|
+
const schema = z.record(z.string(), LexiconEntrySchema);
|
|
128
|
+
const result = schema.safeParse(parsed);
|
|
129
|
+
if (!result.success) {
|
|
130
|
+
const issue = result.error.issues[0];
|
|
131
|
+
const path = issue.path.length > 0 ? issue.path.join(".") : undefined;
|
|
132
|
+
const prefix = path ? `registry[${path}]` : "registry";
|
|
133
|
+
throw new Error(`${prefix}: ${issue.message}`);
|
|
134
|
+
}
|
|
135
|
+
return result.data;
|
|
136
|
+
}
|
package/dist/lexicon.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether `chant build --fold` can ever fold a use of this intrinsic
|
|
3
|
+
* (chant #1062, epic #1019) — in EITHER authored form.
|
|
4
|
+
*
|
|
5
|
+
* Two disjoint ways to qualify, one per form:
|
|
6
|
+
*
|
|
7
|
+
* - a registered tagged-template intrinsic (`Sub\`...\``) folds because
|
|
8
|
+
* `foldTaggedTemplate` recognizes its tag and recurses into the interior
|
|
9
|
+
* ({@link intrinsicTagFolds});
|
|
10
|
+
* - a registered plain-call intrinsic (`Ref(...)`, `Concat(...)`) folds
|
|
11
|
+
* only when its lexicon opted it in with `foldsAsCall`
|
|
12
|
+
* ({@link intrinsicCallFolds}, chant #1044). Before #1044 no plain call
|
|
13
|
+
* folded at all, whatever it was named or registered as.
|
|
14
|
+
*
|
|
15
|
+
* This function is the single predicate the generated per-lexicon intrinsics
|
|
16
|
+
* page (`../codegen/docs-sections.ts`'s "Folds?" column) calls — never a
|
|
17
|
+
* restated copy that could silently drift from the code. `fold()` itself
|
|
18
|
+
* calls the two form-specific predicates below rather than this one, because
|
|
19
|
+
* it always knows which form it is looking at, and a tag must not fold as a
|
|
20
|
+
* call (or vice versa) merely because the other form was opted in.
|
|
21
|
+
*
|
|
22
|
+
* Takes a structural `{ isTag?, foldsAsCall? }` rather than
|
|
23
|
+
* `Pick<IntrinsicDef, ...>` deliberately: `IntrinsicDef.isTag` is required
|
|
24
|
+
* for new registrations (chant #1067), but these predicates also read off
|
|
25
|
+
* untrusted, possibly-older parsed JSON (`ManifestJSON` in
|
|
26
|
+
* `./codegen/docs-types.ts`, on disk as a published lexicon's
|
|
27
|
+
* `dist/manifest.json`) that may predate either field. `undefined` there
|
|
28
|
+
* means what it always did — not a tag, not opted in.
|
|
29
|
+
*/
|
|
30
|
+
export function intrinsicFolds(def) {
|
|
31
|
+
return intrinsicTagFolds(def) || intrinsicCallFolds(def) || intrinsicCallFoldsEagerly(def);
|
|
32
|
+
}
|
|
33
|
+
/** True when this intrinsic's TAGGED-TEMPLATE form folds (`Sub\`...\``) — see {@link intrinsicFolds}. */
|
|
34
|
+
export function intrinsicTagFolds(def) {
|
|
35
|
+
return def.isTag === true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* True when this intrinsic's PLAIN-CALL form folds (`Ref(...)`) — i.e. the
|
|
39
|
+
* lexicon opted it in via {@link IntrinsicDef.foldsAsCall} (chant #1044).
|
|
40
|
+
*
|
|
41
|
+
* `isTag: true` disqualifies regardless: a tagged template is invoked as
|
|
42
|
+
* `` Name`...` ``, so a call to it isn't the registered authoring form at
|
|
43
|
+
* all. Keeping that here rather than trusting registrations means a lexicon
|
|
44
|
+
* that declares both flags cannot quietly widen `fold()`'s call case — and
|
|
45
|
+
* `chant dev check-lexicon` fails the registration outright.
|
|
46
|
+
*/
|
|
47
|
+
export function intrinsicCallFolds(def) {
|
|
48
|
+
return def.isTag !== true && def.foldsAsCall === true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* True when this intrinsic's PLAIN-CALL form folds EAGERLY (chant #1966) —
|
|
52
|
+
* i.e. the lexicon opted it in via {@link IntrinsicDef.foldsEagerly}.
|
|
53
|
+
* `isTag: true` disqualifies, same as {@link intrinsicCallFolds}.
|
|
54
|
+
*/
|
|
55
|
+
export function intrinsicCallFoldsEagerly(def) {
|
|
56
|
+
return def.isTag !== true && def.foldsEagerly === true;
|
|
57
|
+
}
|
|
58
|
+
/** `path` (relative to the member's directory) made relative to the repository root. Absolute paths pass through. */
|
|
59
|
+
export function memberRepoPath(member, path) {
|
|
60
|
+
if (path.startsWith("/") || member.dir === "." || member.dir === "")
|
|
61
|
+
return path;
|
|
62
|
+
const rest = path.replace(/^\.\/+/, "").replace(/\/+$/, "");
|
|
63
|
+
return rest === "" || rest === "." ? member.dir : `${member.dir}/${rest}`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The path filter for a member's `push` or `pull_request` trigger in GitHub
|
|
67
|
+
* Actions syntax (also Forgejo's): the member's directory and the pipeline
|
|
68
|
+
* file. A member at
|
|
69
|
+
* `"."` gets every path, minus the other members' directories.
|
|
70
|
+
*/
|
|
71
|
+
export function memberPathFilter(member, file = member.file) {
|
|
72
|
+
const paths = member.dir === "." || member.dir === ""
|
|
73
|
+
? ["**", ...(member.exclude ?? []).map((d) => `!${d}/**`)]
|
|
74
|
+
: [`${member.dir}/**`];
|
|
75
|
+
if (file && !paths.includes(file))
|
|
76
|
+
paths.push(file);
|
|
77
|
+
return paths;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The `rules: changes:` list for a member's GitLab jobs, or undefined for a
|
|
81
|
+
* member at `"."`: GitLab's `changes` has no exclusions, so the root member's
|
|
82
|
+
* jobs run on every change.
|
|
83
|
+
*/
|
|
84
|
+
export function memberGitlabChanges(member, file = member.file) {
|
|
85
|
+
if (member.dir === "." || member.dir === "")
|
|
86
|
+
return undefined;
|
|
87
|
+
return [`${member.dir}/**/*`, ...(file ? [file] : [])];
|
|
88
|
+
}
|
|
89
|
+
/** A shell word for `cd` into the member's directory. */
|
|
90
|
+
export function memberShellDir(member) {
|
|
91
|
+
return /^[A-Za-z0-9._\/-]+$/.test(member.dir) ? member.dir : `'${member.dir.replace(/'/g, `'\\''`)}'`;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resolve a `ScheduledOpSpec`'s effective trigger, most specific first:
|
|
95
|
+
* `trigger` when given; else the backward-compatible `{ kind: "cron",
|
|
96
|
+
* schedule }` built from this spec's own `schedule` — every pre-#2084 caller
|
|
97
|
+
* (`WorkflowAuditOp`, `PipelineAuditOp`, `ReconcileOp`, …, and their tests)
|
|
98
|
+
* sets only that and keeps meaning cron unchanged; else the declaring Op's
|
|
99
|
+
* own `schedule.cron` (#2120), so an Op that already carries its cadence
|
|
100
|
+
* needs no second cron declaration on the CI side. Throws when none of the
|
|
101
|
+
* three is present — a `ScheduledOpSpec` needs exactly one trigger.
|
|
102
|
+
*/
|
|
103
|
+
export function resolveOpTrigger(spec) {
|
|
104
|
+
if (spec.trigger)
|
|
105
|
+
return spec.trigger;
|
|
106
|
+
if (spec.schedule)
|
|
107
|
+
return { kind: "cron", schedule: spec.schedule };
|
|
108
|
+
if (spec.opSchedule)
|
|
109
|
+
return { kind: "cron", schedule: spec.opSchedule.cron };
|
|
110
|
+
throw new Error(`Scheduled Op "${spec.name}" has neither \`trigger\` nor \`schedule\`, and the Op itself declares no \`schedule\` — one is required.`);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Type guard to check if a value is a LexiconPlugin.
|
|
114
|
+
* Checks for required lifecycle methods in addition to name/serializer.
|
|
115
|
+
*/
|
|
116
|
+
export function isLexiconPlugin(value) {
|
|
117
|
+
if (typeof value !== "object" ||
|
|
118
|
+
value === null ||
|
|
119
|
+
!("name" in value) ||
|
|
120
|
+
typeof value.name !== "string" ||
|
|
121
|
+
!("serializer" in value) ||
|
|
122
|
+
typeof value.serializer !== "object") {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const obj = value;
|
|
126
|
+
return (typeof obj.generate === "function" &&
|
|
127
|
+
typeof obj.validate === "function" &&
|
|
128
|
+
typeof obj.coverage === "function" &&
|
|
129
|
+
typeof obj.package === "function");
|
|
130
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selective change-set scoping — which stacks does a change affect?
|
|
3
|
+
*
|
|
4
|
+
* "Affected" is two distinct things, because chant serializes cross-stack
|
|
5
|
+
* references symbolically:
|
|
6
|
+
* 1. **Directly changed** — the stack's built artifact differs between base
|
|
7
|
+
* and head. Caught by artifact diff over deterministic builds, so it
|
|
8
|
+
* ignores comment-only / refactor-with-no-output-change edits.
|
|
9
|
+
* 2. **Operationally affected (dependents)** — a stack whose own artifact is
|
|
10
|
+
* unchanged but which consumes an upstream export whose value changed. Its
|
|
11
|
+
* bytes don't move, yet it may need re-apply. Caught by walking the
|
|
12
|
+
* cross-stack graph (#200) from the directly-changed set; opt-in.
|
|
13
|
+
*
|
|
14
|
+
* A stack whose inputs come from outside synthesis (deploy-time params) cannot
|
|
15
|
+
* be judged from a source diff — reported as **indeterminate**, not silently
|
|
16
|
+
* included or excluded.
|
|
17
|
+
*
|
|
18
|
+
* ## What "stack" means here depends on the project
|
|
19
|
+
*
|
|
20
|
+
* A project that declares `stacks` in `chant.config.ts` gets each declared
|
|
21
|
+
* stack's own source built, and the answer names stacks. A single-root project
|
|
22
|
+
* has no such partition to build, so its answer names lexicon partitions, which
|
|
23
|
+
* is the only granularity it has. The difference matters downstream: a
|
|
24
|
+
* component's deploy step names a stack, so only the first kind of answer can
|
|
25
|
+
* be joined to components (#2420).
|
|
26
|
+
*
|
|
27
|
+
* This returns the set; it does not act. `chant components fan-out`
|
|
28
|
+
* (../cli/handlers/fan-out.ts) is the command that acts on it, and fanning
|
|
29
|
+
* `lifecycle plan` / `ApplyOp` over it by hand is still an Op the user
|
|
30
|
+
* composes.
|
|
31
|
+
*/
|
|
32
|
+
import { execFile } from "node:child_process";
|
|
33
|
+
import { promisify } from "node:util";
|
|
34
|
+
import { mkdtempSync, rmSync, existsSync, symlinkSync, realpathSync } from "node:fs";
|
|
35
|
+
import { join, relative, resolve } from "node:path";
|
|
36
|
+
import { tmpdir } from "node:os";
|
|
37
|
+
import { build } from "../build.js";
|
|
38
|
+
import { getPrimaryOutput } from "../lint/post-synth.js";
|
|
39
|
+
const execFileAsync = promisify(execFile);
|
|
40
|
+
// ── Pure model ──────────────────────────────────────────────────────────────
|
|
41
|
+
/** Stacks whose serialized output differs between the two builds (added/removed count). */
|
|
42
|
+
export function changedStacks(base, head) {
|
|
43
|
+
const names = new Set([...base.keys(), ...head.keys()]);
|
|
44
|
+
const changed = [];
|
|
45
|
+
for (const name of names) {
|
|
46
|
+
if (base.get(name) !== head.get(name))
|
|
47
|
+
changed.push(name);
|
|
48
|
+
}
|
|
49
|
+
return changed.sort();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Walk the cross-stack graph backwards from `changed` to find every stack that
|
|
53
|
+
* (transitively) consumes a changed stack. Edge `from → to` means `from`
|
|
54
|
+
* depends on `to`, so a changed `to` makes `from` a dependent.
|
|
55
|
+
*/
|
|
56
|
+
export function dependentStacks(changed, graph) {
|
|
57
|
+
const consumersOf = new Map();
|
|
58
|
+
for (const { from, to } of graph.edges) {
|
|
59
|
+
(consumersOf.get(to) ?? consumersOf.set(to, []).get(to)).push(from);
|
|
60
|
+
}
|
|
61
|
+
const seen = new Set(changed);
|
|
62
|
+
const queue = [...changed];
|
|
63
|
+
const dependents = new Set();
|
|
64
|
+
while (queue.length > 0) {
|
|
65
|
+
const node = queue.shift();
|
|
66
|
+
for (const consumer of consumersOf.get(node) ?? []) {
|
|
67
|
+
if (seen.has(consumer))
|
|
68
|
+
continue;
|
|
69
|
+
seen.add(consumer);
|
|
70
|
+
dependents.add(consumer);
|
|
71
|
+
queue.push(consumer);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return [...dependents].sort();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Compute the affected set from two per-stack artifact maps and the cross-stack
|
|
78
|
+
* graph. Pure — no builds, no git — so the model is independently testable.
|
|
79
|
+
*/
|
|
80
|
+
export function computeAffected(base, head, graph, opts = {}) {
|
|
81
|
+
const changed = changedStacks(base, head);
|
|
82
|
+
const dependents = opts.includeDependents ? dependentStacks(changed, graph) : [];
|
|
83
|
+
const indeterminate = [...(opts.externalInput ?? [])].sort();
|
|
84
|
+
return { changed, dependents, indeterminate };
|
|
85
|
+
}
|
|
86
|
+
// ── Build + git plumbing ──────────────────────────────────────────────────────
|
|
87
|
+
/** A built BuildResult's per-stack (lexicon) primary output, keyed by stack. */
|
|
88
|
+
export function artifactMap(outputs) {
|
|
89
|
+
const map = new Map();
|
|
90
|
+
for (const [stack, output] of outputs)
|
|
91
|
+
map.set(stack, getPrimaryOutput(output));
|
|
92
|
+
return map;
|
|
93
|
+
}
|
|
94
|
+
/** Stacks (lexicons) that declare a deploy-time parameter — external input. */
|
|
95
|
+
export function externalInputStacks(entities) {
|
|
96
|
+
const stacks = new Set();
|
|
97
|
+
for (const [, entity] of entities) {
|
|
98
|
+
if ("parameterType" in entity && typeof entity.parameterType === "string") {
|
|
99
|
+
stacks.add(entity.lexicon);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return [...stacks].sort();
|
|
103
|
+
}
|
|
104
|
+
async function gitTopLevel(cwd) {
|
|
105
|
+
const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], { cwd });
|
|
106
|
+
return stdout.trim();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check out `ref` into a throwaway worktree, symlink the repo's node_modules so
|
|
110
|
+
* lexicon imports resolve, run `fn`, then remove the worktree. At most one
|
|
111
|
+
* worktree exists at a time.
|
|
112
|
+
*/
|
|
113
|
+
async function withWorktree(repoRoot, ref, fn) {
|
|
114
|
+
const dir = mkdtempSync(join(tmpdir(), "chant-affected-"));
|
|
115
|
+
await execFileAsync("git", ["worktree", "add", "--detach", dir, ref], { cwd: repoRoot });
|
|
116
|
+
try {
|
|
117
|
+
const nm = join(repoRoot, "node_modules");
|
|
118
|
+
const linked = join(dir, "node_modules");
|
|
119
|
+
if (existsSync(nm) && !existsSync(linked))
|
|
120
|
+
symlinkSync(nm, linked, "dir");
|
|
121
|
+
return await fn(dir);
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
await execFileAsync("git", ["worktree", "remove", "--force", dir], { cwd: repoRoot }).catch(() => {
|
|
125
|
+
rmSync(dir, { recursive: true, force: true });
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build each declared stack's own source directory and key the result by
|
|
131
|
+
* **stack name**.
|
|
132
|
+
*
|
|
133
|
+
* Without this, one build of the project root produces a map keyed by lexicon
|
|
134
|
+
* partition, so an aws-only estate of fifteen stacks answers "aws changed" no
|
|
135
|
+
* matter which one moved. That answer cannot be joined to anything: a
|
|
136
|
+
* component's deploy step names a stack, not a lexicon, so
|
|
137
|
+
* `componentsForUnits` (../components/fan-out.ts) would claim none of it and
|
|
138
|
+
* a fan-out derived from it would be empty. The two halves have to speak the
|
|
139
|
+
* same names for either to be worth having.
|
|
140
|
+
*
|
|
141
|
+
* A stack that serializes through more than one lexicon folds its partitions
|
|
142
|
+
* into one artifact, because the unit being deployed is the stack.
|
|
143
|
+
*/
|
|
144
|
+
async function stackArtifacts(root, serializers, stacks,
|
|
145
|
+
/**
|
|
146
|
+
* Whether a missing `src` is an error. True for the head side, where every
|
|
147
|
+
* declared stack must exist; false for the base side, where a stack added
|
|
148
|
+
* since then legitimately has no source yet and reads as an empty artifact,
|
|
149
|
+
* which is what makes it `changed`.
|
|
150
|
+
*/
|
|
151
|
+
requireSrc) {
|
|
152
|
+
const artifacts = new Map();
|
|
153
|
+
const externalInput = [];
|
|
154
|
+
for (const stack of stacks) {
|
|
155
|
+
const src = resolve(root, stack.src);
|
|
156
|
+
// `build()` on a directory that is not there returns empty outputs rather
|
|
157
|
+
// than throwing, so a typo in `src` would make both sides build nothing,
|
|
158
|
+
// match, and report the stack as unchanged forever. A silent answer of
|
|
159
|
+
// exactly that shape is what this whole path exists to prevent.
|
|
160
|
+
if (requireSrc && !existsSync(src)) {
|
|
161
|
+
throw new Error(`stack "${stack.name}" declares src "${stack.src}", which does not exist under ${root}. ` +
|
|
162
|
+
`Fix chant.config.ts's stacks[] entry: a source directory that is not there builds to nothing, ` +
|
|
163
|
+
`and a stack that builds to nothing can never be reported as changed.`);
|
|
164
|
+
}
|
|
165
|
+
const built = await build(src, serializers);
|
|
166
|
+
artifacts.set(stack.name, [...built.outputs.entries()]
|
|
167
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
168
|
+
.map(([lexicon, output]) => `${lexicon}\n${getPrimaryOutput(output)}`)
|
|
169
|
+
.join("\n"));
|
|
170
|
+
if (externalInputStacks(built.entities).length > 0)
|
|
171
|
+
externalInput.push(stack.name);
|
|
172
|
+
}
|
|
173
|
+
return { artifacts, externalInput: externalInput.sort() };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Compute the affected stacks for a change. Head is built in place (the working
|
|
177
|
+
* tree); base is built from `baseDir` if supplied, else from `baseRef` via a
|
|
178
|
+
* single throwaway worktree. Builds are deterministic, so a cached/supplied base
|
|
179
|
+
* is as trustworthy as a rebuild.
|
|
180
|
+
*/
|
|
181
|
+
export async function affectedStacks(opts) {
|
|
182
|
+
const projectPath = resolve(opts.projectPath);
|
|
183
|
+
const needsWorktree = Boolean(opts.headRef) || Boolean(opts.baseRef && !opts.baseDir);
|
|
184
|
+
const repoRoot = needsWorktree ? await gitTopLevel(projectPath) : projectPath;
|
|
185
|
+
// Canonicalize via realpath so the worktree-relative path is correct even when
|
|
186
|
+
// the temp dir is a symlink (macOS /var → /private/var) and `git
|
|
187
|
+
// rev-parse --show-toplevel` reports the real path.
|
|
188
|
+
const relProject = needsWorktree ? relative(repoRoot, realpathSync(projectPath)) : "";
|
|
189
|
+
// Head: the in-place build of the working tree, unless an explicit headRef is
|
|
190
|
+
// given (then a throwaway worktree — removed before the base worktree, so at
|
|
191
|
+
// most one exists at a time).
|
|
192
|
+
const perStack = opts.stacks && opts.stacks.length > 0 ? opts.stacks : undefined;
|
|
193
|
+
// No cross-stack graph in per-stack mode, by construction: see `stacks` above.
|
|
194
|
+
const EMPTY_GRAPH = { nodes: [], edges: [], order: [], waves: [], cycles: [] };
|
|
195
|
+
/** One build root in, its artifact map and external-input set out, at whichever granularity applies. */
|
|
196
|
+
const readArtifacts = async (root, isHead) => {
|
|
197
|
+
if (perStack)
|
|
198
|
+
return { ...(await stackArtifacts(root, opts.serializers, perStack, isHead)), graph: EMPTY_GRAPH };
|
|
199
|
+
const built = await build(root, opts.serializers);
|
|
200
|
+
return {
|
|
201
|
+
artifacts: artifactMap(built.outputs),
|
|
202
|
+
externalInput: externalInputStacks(built.entities),
|
|
203
|
+
graph: built.manifest.stackGraph,
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
const head = opts.headRef
|
|
207
|
+
? await withWorktree(repoRoot, opts.headRef, (dir) => readArtifacts(join(dir, relProject), true))
|
|
208
|
+
: await readArtifacts(projectPath, true);
|
|
209
|
+
// Base: caller-supplied dir (cheapest), else a single worktree at baseRef.
|
|
210
|
+
let baseMap;
|
|
211
|
+
if (opts.baseDir) {
|
|
212
|
+
baseMap = (await readArtifacts(resolve(opts.baseDir), false)).artifacts;
|
|
213
|
+
}
|
|
214
|
+
else if (opts.baseRef) {
|
|
215
|
+
baseMap = await withWorktree(repoRoot, opts.baseRef, async (dir) => (await readArtifacts(join(dir, relProject), false)).artifacts);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
throw new Error("affectedStacks requires either baseDir or baseRef");
|
|
219
|
+
}
|
|
220
|
+
return computeAffected(baseMap, head.artifacts, head.graph, {
|
|
221
|
+
includeDependents: opts.includeDependents,
|
|
222
|
+
externalInput: head.externalInput,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* assertLive (#1857) — the read half of the test harness (#1224):
|
|
3
|
+
* observation-backed assertions against a live deploy, for exactly one
|
|
4
|
+
* declared entity at a time. Same primitive teardown.ts's fallback path
|
|
5
|
+
* uses — `describeResources` — turned into a pass/throw instead of a
|
|
6
|
+
* would-delete set.
|
|
7
|
+
*
|
|
8
|
+
* The observation contract (#1089) draws a hard line between OBSERVED-ABSENT
|
|
9
|
+
* and NOT-OBSERVED: a declared entity the read could not cover is never the
|
|
10
|
+
* same as one confirmed missing. `assertLiveEntity` preserves that line by
|
|
11
|
+
* construction — NOT-OBSERVED throws {@link UnobservedAssertionError}, a type
|
|
12
|
+
* distinct from the {@link LiveAssertionError} an observed-absent, foreign,
|
|
13
|
+
* or status-mismatched verdict throws, so a caller can tell "could not tell"
|
|
14
|
+
* from "confirmed wrong" without parsing a message.
|
|
15
|
+
*
|
|
16
|
+
* Marker verification is best-effort by the same logic {@link
|
|
17
|
+
* ResourceMetadata.marker}'s own contract states: a lexicon with no marker
|
|
18
|
+
* channel on this read path reports no marker at all, which is not the same
|
|
19
|
+
* claim as "foreign". Enforcing a match whenever the channel exists — a present
|
|
20
|
+
* mismatch, or `ownership: "foreign"` with no marker to show — catches the
|
|
21
|
+
* case the harness cares about (a same-named leftover from another env);
|
|
22
|
+
* an absent channel is passed through unverified rather than making every
|
|
23
|
+
* lexicon without one unusable.
|
|
24
|
+
*/
|
|
25
|
+
import { normalizeObservation, unobservedAll, unobservedReasonText } from "../observation.js";
|
|
26
|
+
/**
|
|
27
|
+
* Thrown by {@link assertLiveEntity} for a confirmed failure: observed
|
|
28
|
+
* absent, a marker that names another stack/env, a resource confirmed
|
|
29
|
+
* foreign, or a status mismatch. Never thrown for NOT-OBSERVED — see {@link
|
|
30
|
+
* UnobservedAssertionError}.
|
|
31
|
+
*/
|
|
32
|
+
export class LiveAssertionError extends Error {
|
|
33
|
+
constructor(message) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = "LiveAssertionError";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Thrown when the entity is NOT-OBSERVED (#1089) rather than confirmed
|
|
40
|
+
* present or absent. Kept as its own type, not a flag on {@link
|
|
41
|
+
* LiveAssertionError}: a suite (or a CI policy) that wants to fail loudly on
|
|
42
|
+
* "could not tell" but treat it differently from a confirmed miss can catch
|
|
43
|
+
* this one specifically.
|
|
44
|
+
*/
|
|
45
|
+
export class UnobservedAssertionError extends Error {
|
|
46
|
+
constructor(entity, reason, detail) {
|
|
47
|
+
super(`assertLive("${entity}") is NOT-OBSERVED — ${unobservedReasonText(reason)}` +
|
|
48
|
+
`${detail ? `: ${detail}` : ""}. An entity chant could not read is never the same as one confirmed absent.`);
|
|
49
|
+
this.entity = entity;
|
|
50
|
+
this.reason = reason;
|
|
51
|
+
this.detail = detail;
|
|
52
|
+
this.name = "UnobservedAssertionError";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** True when `meta` names a different stack/env than `marker`, on whichever signal it carries. */
|
|
56
|
+
function isConfirmedForeign(meta, marker) {
|
|
57
|
+
if (meta.marker)
|
|
58
|
+
return meta.marker.stack !== marker.stack || meta.marker.env !== marker.env;
|
|
59
|
+
return meta.ownership === "foreign";
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Assert one declared entity is live: observed present in `environment`, not
|
|
63
|
+
* a confirmed-foreign resource, and — when `status` is given — reporting
|
|
64
|
+
* that status. Resolves to the entity's {@link ResourceMetadata} on success.
|
|
65
|
+
*
|
|
66
|
+
* Throws {@link UnobservedAssertionError} for NOT-OBSERVED. Throws {@link
|
|
67
|
+
* LiveAssertionError} for observed-absent, a confirmed-foreign identity, or a
|
|
68
|
+
* status mismatch.
|
|
69
|
+
*/
|
|
70
|
+
export async function assertLiveEntity(opts) {
|
|
71
|
+
const { plugin, name, entityType, props, buildOutput, environment, marker, status } = opts;
|
|
72
|
+
if (!plugin.describeResources) {
|
|
73
|
+
throw new UnobservedAssertionError(name, "unsupported-kind", `the "${plugin.name}" lexicon implements no describeResources`);
|
|
74
|
+
}
|
|
75
|
+
let observed;
|
|
76
|
+
try {
|
|
77
|
+
observed = normalizeObservation(await plugin.describeResources({
|
|
78
|
+
environment,
|
|
79
|
+
buildOutput,
|
|
80
|
+
entityNames: [name],
|
|
81
|
+
entities: new Map([[name, { entityType, props }]]),
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
86
|
+
observed = {
|
|
87
|
+
resources: {},
|
|
88
|
+
unobserved: unobservedAll([name], "read-failed", detail, { [name]: entityType }),
|
|
89
|
+
queried: {},
|
|
90
|
+
sources: {},
|
|
91
|
+
notes: [],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const unobserved = observed.unobserved[name];
|
|
95
|
+
if (unobserved)
|
|
96
|
+
throw new UnobservedAssertionError(name, unobserved.reason, unobserved.detail);
|
|
97
|
+
const meta = observed.resources[name];
|
|
98
|
+
if (!meta) {
|
|
99
|
+
throw new LiveAssertionError(`assertLive("${name}"): observed absent — chant looked and "${environment}" reported no such resource.`);
|
|
100
|
+
}
|
|
101
|
+
if (isConfirmedForeign(meta, marker)) {
|
|
102
|
+
const found = meta.marker ? `{ stack: "${meta.marker.stack}", env: "${meta.marker.env ?? ""}" }` : "no chant marker";
|
|
103
|
+
throw new LiveAssertionError(`assertLive("${name}"): observed, but it is not this deploy's — carries ${found}, not ` +
|
|
104
|
+
`{ stack: "${marker.stack}", env: "${marker.env ?? ""}" }. A same-named resource from another stack or env cannot satisfy this assertion.`);
|
|
105
|
+
}
|
|
106
|
+
if (status !== undefined && meta.status !== status) {
|
|
107
|
+
throw new LiveAssertionError(`assertLive("${name}", { status: "${status}" }): observed with status "${meta.status}".`);
|
|
108
|
+
}
|
|
109
|
+
return meta;
|
|
110
|
+
}
|