@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,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure evaluation of a plan scenario's `expect` clause against a `ChangeSet`
|
|
3
|
+
* (#1292).
|
|
4
|
+
*
|
|
5
|
+
* `evaluateScenario` reads only what the caller hands it — a `ChangeSet` and
|
|
6
|
+
* a `ScenarioExpect` — and does no I/O. Building the change set (reading a
|
|
7
|
+
* fixture, replaying it in place of a live observation) is the CLI handler's
|
|
8
|
+
* job (../cli/handlers/scenario.ts); this module is the part that stays
|
|
9
|
+
* testable without a filesystem, a build, or a fixture.
|
|
10
|
+
*
|
|
11
|
+
* Built on the same primitives `chant lifecycle plan` already computes from:
|
|
12
|
+
* `summarize` for counts, a filter over `cs.entries` for named deletes and
|
|
13
|
+
* ownership, and `evaluateUnobservedGate` (./unobserved-gate.ts, #1568) for
|
|
14
|
+
* the unobserved clause.
|
|
15
|
+
*/
|
|
16
|
+
import { summarize } from "./change-set.js";
|
|
17
|
+
import { evaluateUnobservedGate } from "./unobserved-gate.js";
|
|
18
|
+
import { unobservedReasonText } from "../observation.js";
|
|
19
|
+
import { isBehaviourRefusalReport, renderBehaviourRefusal } from "../behaviour.js";
|
|
20
|
+
import { formatPerHour } from "../behaviour-delta.js";
|
|
21
|
+
/**
|
|
22
|
+
* Evaluate `expect` against `cs`. Pure: reads `cs`, `expect` and, for a
|
|
23
|
+
* `cost` clause, the fixture's `behaviour` block handed over as `behaviour`;
|
|
24
|
+
* computes nothing else. Every clause present on `expect` is checked
|
|
25
|
+
* independently and every one contributes to `checks`; `pass` is true only
|
|
26
|
+
* when all of them are.
|
|
27
|
+
*/
|
|
28
|
+
export function evaluateScenario(cs, expect, behaviour) {
|
|
29
|
+
const counts = summarize(cs);
|
|
30
|
+
const checks = [];
|
|
31
|
+
if (expect.noop) {
|
|
32
|
+
// An effect receipt's fire (#1832) is a real proposed action — a
|
|
33
|
+
// migration or seed job about to run — even though it never counts
|
|
34
|
+
// toward the create/update/delete triad `buildChangeSet` classifies
|
|
35
|
+
// ordinary resources into. `noop: true` claims the plan does nothing;
|
|
36
|
+
// a pending effect fire is something, so it offends the claim exactly
|
|
37
|
+
// like a create/update/delete would.
|
|
38
|
+
const offenders = { create: counts.create, update: counts.update, delete: counts.delete, effect: counts.effect };
|
|
39
|
+
const clean = offenders.create === 0 && offenders.update === 0 && offenders.delete === 0 && offenders.effect === 0;
|
|
40
|
+
checks.push({
|
|
41
|
+
clause: "noop",
|
|
42
|
+
pass: clean,
|
|
43
|
+
...(clean
|
|
44
|
+
? {}
|
|
45
|
+
: {
|
|
46
|
+
detail: `expected noop (no create/update/delete/effect) but the plan proposes ` +
|
|
47
|
+
`${offenders.create} create, ${offenders.update} update, ${offenders.delete} delete, ${offenders.effect} effect — ` +
|
|
48
|
+
nameList(cs, ["create", "update", "delete", "effect"]),
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
for (const clause of ["create", "update", "delete"]) {
|
|
53
|
+
const want = expect[clause];
|
|
54
|
+
if (want === undefined)
|
|
55
|
+
continue;
|
|
56
|
+
const got = counts[clause];
|
|
57
|
+
const pass = got === want;
|
|
58
|
+
checks.push({
|
|
59
|
+
clause,
|
|
60
|
+
pass,
|
|
61
|
+
...(pass ? {} : { detail: `expected ${want} ${clause}, plan proposes ${got} — ${nameList(cs, [clause])}` }),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (expect.deletes) {
|
|
65
|
+
checks.push(evaluateDeletesClause(cs, expect.deletes));
|
|
66
|
+
}
|
|
67
|
+
if (expect.unobserved !== undefined) {
|
|
68
|
+
checks.push(evaluateUnobservedClause(cs, expect.unobserved));
|
|
69
|
+
}
|
|
70
|
+
if (expect.cost !== undefined) {
|
|
71
|
+
checks.push(evaluateCostClause(expect.cost, behaviour));
|
|
72
|
+
}
|
|
73
|
+
return { pass: checks.every((c) => c.pass), checks };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The `cost` clause (#2358). Three refusals before any number is read, each
|
|
77
|
+
* naming why, because the alternative to each is a bound that passes on
|
|
78
|
+
* nothing:
|
|
79
|
+
*
|
|
80
|
+
* - no `behaviour` block in the fixture — nothing was predicted;
|
|
81
|
+
* - the block is a refusal — the engine was absent, unreachable, out of
|
|
82
|
+
* credit, over quota, or refused a credential, and the fixture carries
|
|
83
|
+
* that refusal's own text;
|
|
84
|
+
* - the named entity is not in the fixture's figures — declined with a
|
|
85
|
+
* reason, or never asked about.
|
|
86
|
+
*
|
|
87
|
+
* The figure is then one of three, and the detail says which: the named
|
|
88
|
+
* entity's own rate, the engine's stated total, or chant's sum over every
|
|
89
|
+
* predicted entity when the engine states no total. The sum is chant's own
|
|
90
|
+
* arithmetic and is labelled so; it also names every entity the engine
|
|
91
|
+
* declined, because those are in the estate and not in the sum.
|
|
92
|
+
*/
|
|
93
|
+
function evaluateCostClause(bound, behaviour) {
|
|
94
|
+
const fail = (detail) => ({ clause: "cost", pass: false, detail });
|
|
95
|
+
if (behaviour === undefined || "missing" in behaviour) {
|
|
96
|
+
return fail(`${behaviour?.missing ?? "the fixture carries no `behaviour` block"} — a cost bound is checked against the ` +
|
|
97
|
+
"fixture's recorded prediction, and there is none. Record one on the snapshot, or drop the clause.");
|
|
98
|
+
}
|
|
99
|
+
const result = behaviour.result;
|
|
100
|
+
if (isBehaviourRefusalReport(result)) {
|
|
101
|
+
return fail(`the fixture's prediction is a refusal (${result.refusal.cause}), and a bound cannot be checked against no ` +
|
|
102
|
+
`figure: ${renderBehaviourRefusal(result.refusal, { color: false }).replace(/\n\s*/g, " ")}`);
|
|
103
|
+
}
|
|
104
|
+
const declined = Object.entries(result.unpredicted ?? {}).map(([name, u]) => `${name} (${u.reason}${u.detail ? `: ${u.detail}` : ""})`);
|
|
105
|
+
const declinedNote = declined.length > 0 ? `; ${declined.length} declined and not in the figure: ${declined.join(", ")}` : "";
|
|
106
|
+
let perHour;
|
|
107
|
+
let currency;
|
|
108
|
+
let which;
|
|
109
|
+
if (bound.entity !== undefined) {
|
|
110
|
+
const figure = Object.prototype.hasOwnProperty.call(result.entities, bound.entity)
|
|
111
|
+
? result.entities[bound.entity]
|
|
112
|
+
: undefined;
|
|
113
|
+
if (!figure) {
|
|
114
|
+
const hole = result.unpredicted?.[bound.entity];
|
|
115
|
+
return fail(hole
|
|
116
|
+
? `"${bound.entity}" was declined by the engine (${hole.reason}${hole.detail ? `: ${hole.detail}` : ""}), so it has no figure to bound`
|
|
117
|
+
: `"${bound.entity}" is in neither the fixture's figures nor its declined entities — the prediction never asked about it`);
|
|
118
|
+
}
|
|
119
|
+
perHour = figure.cost.perHour;
|
|
120
|
+
currency = figure.cost.currency;
|
|
121
|
+
which = `${bound.entity}'s own rate (${figure.provenance.engine} ${figure.provenance.version}, ${figure.provenance.tolerance}, ${figure.provenance.basis})`;
|
|
122
|
+
}
|
|
123
|
+
else if (result.meta.total) {
|
|
124
|
+
perHour = result.meta.total.perHour;
|
|
125
|
+
currency = result.meta.total.currency;
|
|
126
|
+
which = `the engine's own estate total (${result.meta.engine} ${result.meta.version})${declinedNote}`;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const names = Object.keys(result.entities);
|
|
130
|
+
const currencies = new Set(names.map((n) => result.entities[n].cost.currency));
|
|
131
|
+
if (currencies.size > 1) {
|
|
132
|
+
return fail(`the engine states no total and the entities are priced in ${[...currencies].sort().join(", ")} — chant converts ` +
|
|
133
|
+
"nothing, so there is no one sum to bound");
|
|
134
|
+
}
|
|
135
|
+
if (names.length === 0) {
|
|
136
|
+
return fail(`the engine states no total and predicted no entity${declinedNote} — nothing to bound`);
|
|
137
|
+
}
|
|
138
|
+
perHour = names.reduce((sum, n) => sum + result.entities[n].cost.perHour, 0);
|
|
139
|
+
currency = [...currencies][0];
|
|
140
|
+
which = `chant's own sum over ${names.length} predicted entit${names.length === 1 ? "y" : "ies"} (the engine states no total)${declinedNote}`;
|
|
141
|
+
}
|
|
142
|
+
const level = result.meta.at.traffic;
|
|
143
|
+
if (currency !== bound.currency) {
|
|
144
|
+
return fail(`the bound is in ${bound.currency} and the figure is ${formatPerHour(perHour)} ${currency}/hour at "${level}" — ` +
|
|
145
|
+
`chant converts nothing; read from ${which}`);
|
|
146
|
+
}
|
|
147
|
+
const pass = perHour <= bound.maxPerHour;
|
|
148
|
+
const detail = `${pass ? "" : "exceeded: "}${formatPerHour(perHour)} ${currency}/hour at "${level}" against a bound of ` +
|
|
149
|
+
`${formatPerHour(bound.maxPerHour)} ${bound.currency}/hour; read from ${which}`;
|
|
150
|
+
return { clause: "cost", pass, detail };
|
|
151
|
+
}
|
|
152
|
+
/** Names (with type) of every entry matching one of `actions`, for a legible failure message. */
|
|
153
|
+
function nameList(cs, actions) {
|
|
154
|
+
const names = cs.entries
|
|
155
|
+
.filter((e) => actions.includes(e.action))
|
|
156
|
+
.map((e) => `${e.name}${e.type ? ` (${e.type})` : ""} [${e.action}]`);
|
|
157
|
+
return names.length === 0 ? "(no matching entries)" : names.join(", ");
|
|
158
|
+
}
|
|
159
|
+
function evaluateDeletesClause(cs, wanted) {
|
|
160
|
+
const actualDeletes = cs.entries.filter((e) => e.action === "delete");
|
|
161
|
+
const actualByName = new Map(actualDeletes.map((e) => [e.name, e]));
|
|
162
|
+
const wantedNames = new Set(wanted.map((w) => w.name));
|
|
163
|
+
const problems = [];
|
|
164
|
+
for (const want of wanted) {
|
|
165
|
+
const match = actualByName.get(want.name);
|
|
166
|
+
if (!match) {
|
|
167
|
+
problems.push(`"${want.name}" (ownership ${want.ownership}) — not proposed for delete`);
|
|
168
|
+
}
|
|
169
|
+
else if (match.ownership !== want.ownership) {
|
|
170
|
+
problems.push(`"${want.name}" — expected ownership "${want.ownership}", plan proposes ownership "${match.ownership}"`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
for (const e of actualDeletes) {
|
|
174
|
+
if (!wantedNames.has(e.name)) {
|
|
175
|
+
problems.push(`"${e.name}"${e.type ? ` (${e.type})` : ""} [${e.ownership}] — deleted but not expected`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
clause: "deletes",
|
|
180
|
+
pass: problems.length === 0,
|
|
181
|
+
...(problems.length > 0 ? { detail: problems.join("; ") } : {}),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function evaluateUnobservedClause(cs, policy) {
|
|
185
|
+
// evaluateUnobservedGate enumerates every unobserved row regardless of
|
|
186
|
+
// reason — "refuse" collects the full set to check against below. A
|
|
187
|
+
// scenario's allow list names ENTITIES, not reasons (./scenario.ts's
|
|
188
|
+
// ScenarioUnobservedPolicy doc explains why), so the gate's own reason-keyed
|
|
189
|
+
// policy isn't reused for the pass/fail decision — only for the enumeration.
|
|
190
|
+
const gate = evaluateUnobservedGate(cs, "refuse");
|
|
191
|
+
const allowedNames = typeof policy === "object" ? new Set(policy.allow) : undefined;
|
|
192
|
+
const unallowed = gate.findings.filter((f) => !allowedNames?.has(f.name));
|
|
193
|
+
return {
|
|
194
|
+
clause: "unobserved",
|
|
195
|
+
pass: unallowed.length === 0,
|
|
196
|
+
...(unallowed.length > 0
|
|
197
|
+
? {
|
|
198
|
+
detail: unallowed
|
|
199
|
+
.map((f) => `${f.name}${f.type ? ` (${f.type})` : ""} — ${unobservedReasonText(f.reason)}${f.detail ? `: ${f.detail}` : ""}`)
|
|
200
|
+
.join(", "),
|
|
201
|
+
}
|
|
202
|
+
: {}),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan scenarios (chant #1292): a declared expectation about what a change
|
|
3
|
+
* SHOULD do, checkable offline against a fixture snapshot.
|
|
4
|
+
*
|
|
5
|
+
* Everything else chant validates is about shape — is this declaration
|
|
6
|
+
* well-formed, does this reference resolve. Nothing answers "what will this
|
|
7
|
+
* change do" as something source can assert about itself, until now. A
|
|
8
|
+
* `Scenario` pairs a `given` (a stand-in for live observation) with an
|
|
9
|
+
* `expect` (a claim about the resulting change set) — `chant scenario check`
|
|
10
|
+
* (../cli/handlers/scenario.ts) builds the project, replays `given` in place
|
|
11
|
+
* of a live read, and evaluates `expect` against the resulting `ChangeSet`
|
|
12
|
+
* (./change-set.ts) via `evaluateScenario` (./scenario-eval.ts).
|
|
13
|
+
*
|
|
14
|
+
* Modeled precisely on the other non-resource Declarables (../effect-receipt.ts,
|
|
15
|
+
* ../secret-provenance.ts): discovery collects a `Scenario` like any entity
|
|
16
|
+
* (it is a Declarable), but it carries no resource payload and no serializer
|
|
17
|
+
* ever emits it — `partitionByLexicon` (../build.ts) excludes it from every
|
|
18
|
+
* lexicon's partition, the same way it excludes a secret declaration.
|
|
19
|
+
*
|
|
20
|
+
* This module is pure and does no I/O: `snapshot()` records where the fixture
|
|
21
|
+
* comes from without reading it, and the factory validates and freezes. The
|
|
22
|
+
* CLI handler is where the fixture is actually read, replayed, and compared —
|
|
23
|
+
* the same synthesis/plan split every other lifecycle primitive here follows.
|
|
24
|
+
*/
|
|
25
|
+
import { DECLARABLE_MARKER } from "../declarable.js";
|
|
26
|
+
/** Marker symbol identifying a scenario declaration. `Symbol.for` so it
|
|
27
|
+
* survives the entity-wire codec, the same reason ../effect-receipt.ts and
|
|
28
|
+
* ../secret-provenance.ts use `Symbol.for` for their markers. */
|
|
29
|
+
export const SCENARIO_MARKER = Symbol.for("chant.scenario");
|
|
30
|
+
/** The `entityType` every scenario declaration carries. */
|
|
31
|
+
export const SCENARIO_ENTITY_TYPE = "Chant::Scenario";
|
|
32
|
+
/**
|
|
33
|
+
* Declare `given` from a single string. Pure and offline: no filesystem
|
|
34
|
+
* access, no git — the factory only classifies the string's SHAPE, never
|
|
35
|
+
* checks whether it exists. That is what keeps `Scenario` foldable under
|
|
36
|
+
* `--sandbox`, the same discipline `declareSecret`'s committed-encrypted path
|
|
37
|
+
* validation follows (../secret-provenance.ts).
|
|
38
|
+
*
|
|
39
|
+
* The classification is structural: a string containing a path separator or
|
|
40
|
+
* ending in `.json` is a fixture file; anything else (a bare token like
|
|
41
|
+
* `"prod"`) is an environment name. A `chant.config.ts` environment name that
|
|
42
|
+
* happens to contain a slash or end in `.json` is not supported by this
|
|
43
|
+
* heuristic — pass `{ kind: "env", env }` directly in that unlikely case.
|
|
44
|
+
*/
|
|
45
|
+
export function snapshot(source) {
|
|
46
|
+
if (typeof source !== "string" || source.length === 0) {
|
|
47
|
+
throw new Error("snapshot: `source` must be a non-empty string");
|
|
48
|
+
}
|
|
49
|
+
const looksLikeFile = source.includes("/") || source.includes("\\") || source.toLowerCase().endsWith(".json");
|
|
50
|
+
return looksLikeFile ? { kind: "file", path: source } : { kind: "env", env: source };
|
|
51
|
+
}
|
|
52
|
+
/** Every recognized `expect` clause key — for the excess-key check below and
|
|
53
|
+
* for exhaustiveness at call sites. */
|
|
54
|
+
export const EXPECT_KEYS = ["noop", "create", "update", "delete", "deletes", "unobserved", "cost"];
|
|
55
|
+
const OWNERSHIP_VALUES = ["owned", "foreign", "unknown"];
|
|
56
|
+
/**
|
|
57
|
+
* Declare a plan scenario. The returned object is a locked Declarable:
|
|
58
|
+
* declared fields are immutable and nested structures are frozen, the same
|
|
59
|
+
* shape ../effect-receipt.ts and ../secret-provenance.ts lock down; the
|
|
60
|
+
* top-level object stays extensible so discovery can still stamp its own
|
|
61
|
+
* symbol-keyed metadata.
|
|
62
|
+
*/
|
|
63
|
+
export function Scenario(name, options) {
|
|
64
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
65
|
+
throw new Error("Scenario: `name` must be a non-empty string");
|
|
66
|
+
}
|
|
67
|
+
const given = validateGiven(name, options?.given);
|
|
68
|
+
const expect = validateExpect(name, options?.expect);
|
|
69
|
+
const decl = {
|
|
70
|
+
[DECLARABLE_MARKER]: true,
|
|
71
|
+
[SCENARIO_MARKER]: true,
|
|
72
|
+
lexicon: "chant",
|
|
73
|
+
entityType: SCENARIO_ENTITY_TYPE,
|
|
74
|
+
name,
|
|
75
|
+
given,
|
|
76
|
+
expect,
|
|
77
|
+
};
|
|
78
|
+
for (const key of Object.keys(decl)) {
|
|
79
|
+
Object.defineProperty(decl, key, { writable: false, configurable: false });
|
|
80
|
+
}
|
|
81
|
+
return decl;
|
|
82
|
+
}
|
|
83
|
+
function validateGiven(name, given) {
|
|
84
|
+
if (typeof given !== "object" || given === null) {
|
|
85
|
+
throw new Error(`Scenario("${name}"): \`given\` is required — use snapshot(path) or snapshot(env)`);
|
|
86
|
+
}
|
|
87
|
+
const g = given;
|
|
88
|
+
if (g.kind === "file") {
|
|
89
|
+
if (typeof g.path !== "string" || g.path.length === 0) {
|
|
90
|
+
throw new Error(`Scenario("${name}"): \`given\` of kind "file" requires a non-empty \`path\``);
|
|
91
|
+
}
|
|
92
|
+
return Object.freeze({ kind: "file", path: g.path });
|
|
93
|
+
}
|
|
94
|
+
if (g.kind === "env") {
|
|
95
|
+
if (typeof g.env !== "string" || g.env.length === 0) {
|
|
96
|
+
throw new Error(`Scenario("${name}"): \`given\` of kind "env" requires a non-empty \`env\``);
|
|
97
|
+
}
|
|
98
|
+
return Object.freeze({ kind: "env", env: g.env });
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`Scenario("${name}"): \`given\` must come from snapshot(path) or snapshot(env), got kind "${String(g.kind)}"`);
|
|
101
|
+
}
|
|
102
|
+
function validateExpect(name, expect) {
|
|
103
|
+
if (typeof expect !== "object" || expect === null || Array.isArray(expect)) {
|
|
104
|
+
throw new Error(`Scenario("${name}"): \`expect\` must be a plain object`);
|
|
105
|
+
}
|
|
106
|
+
const e = expect;
|
|
107
|
+
for (const key of Object.keys(e)) {
|
|
108
|
+
if (!EXPECT_KEYS.includes(key)) {
|
|
109
|
+
throw new Error(`Scenario("${name}"): unknown \`expect\` clause "${key}" — expected one of ${EXPECT_KEYS.join(", ")}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (Object.keys(e).length === 0) {
|
|
113
|
+
throw new Error(`Scenario("${name}"): \`expect\` must include at least one clause (${EXPECT_KEYS.join(", ")}) — an empty expect asserts nothing`);
|
|
114
|
+
}
|
|
115
|
+
const out = {};
|
|
116
|
+
if ("noop" in e) {
|
|
117
|
+
if (e.noop !== true) {
|
|
118
|
+
throw new Error(`Scenario("${name}"): \`expect.noop\`, when present, must be exactly \`true\``);
|
|
119
|
+
}
|
|
120
|
+
out.noop = true;
|
|
121
|
+
}
|
|
122
|
+
for (const countKey of ["create", "update", "delete"]) {
|
|
123
|
+
if (countKey in e) {
|
|
124
|
+
const v = e[countKey];
|
|
125
|
+
if (typeof v !== "number" || !Number.isInteger(v) || v < 0) {
|
|
126
|
+
throw new Error(`Scenario("${name}"): \`expect.${countKey}\`, when present, must be a non-negative integer`);
|
|
127
|
+
}
|
|
128
|
+
out[countKey] = v;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if ("deletes" in e) {
|
|
132
|
+
if (!Array.isArray(e.deletes)) {
|
|
133
|
+
throw new Error(`Scenario("${name}"): \`expect.deletes\` must be an array`);
|
|
134
|
+
}
|
|
135
|
+
out.deletes = Object.freeze(e.deletes.map((d, i) => {
|
|
136
|
+
if (typeof d !== "object" || d === null) {
|
|
137
|
+
throw new Error(`Scenario("${name}"): \`expect.deletes[${i}]\` must be an object`);
|
|
138
|
+
}
|
|
139
|
+
const { name: deleteName, ownership } = d;
|
|
140
|
+
if (typeof deleteName !== "string" || deleteName.length === 0) {
|
|
141
|
+
throw new Error(`Scenario("${name}"): \`expect.deletes[${i}].name\` must be a non-empty string`);
|
|
142
|
+
}
|
|
143
|
+
if (!OWNERSHIP_VALUES.includes(ownership)) {
|
|
144
|
+
throw new Error(`Scenario("${name}"): \`expect.deletes[${i}].ownership\` must be one of ${OWNERSHIP_VALUES.join(", ")}`);
|
|
145
|
+
}
|
|
146
|
+
return Object.freeze({ name: deleteName, ownership: ownership });
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
if ("unobserved" in e) {
|
|
150
|
+
const u = e.unobserved;
|
|
151
|
+
if (u === "refuse") {
|
|
152
|
+
out.unobserved = "refuse";
|
|
153
|
+
}
|
|
154
|
+
else if (typeof u === "object" && u !== null && Array.isArray(u.allow)) {
|
|
155
|
+
const allow = u.allow;
|
|
156
|
+
allow.forEach((entry, i) => {
|
|
157
|
+
if (typeof entry !== "string" || entry.length === 0) {
|
|
158
|
+
throw new Error(`Scenario("${name}"): \`expect.unobserved.allow[${i}]\` must be a non-empty string`);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
out.unobserved = Object.freeze({ allow: Object.freeze([...allow]) });
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
throw new Error(`Scenario("${name}"): \`expect.unobserved\` must be "refuse" or { allow: [names] }`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if ("cost" in e) {
|
|
168
|
+
const c = e.cost;
|
|
169
|
+
if (typeof c !== "object" || c === null || Array.isArray(c)) {
|
|
170
|
+
throw new Error(`Scenario("${name}"): \`expect.cost\` must be { maxPerHour, currency, entity? }`);
|
|
171
|
+
}
|
|
172
|
+
const { maxPerHour, currency, entity } = c;
|
|
173
|
+
if (typeof maxPerHour !== "number" || !Number.isFinite(maxPerHour) || maxPerHour < 0) {
|
|
174
|
+
throw new Error(`Scenario("${name}"): \`expect.cost.maxPerHour\` must be a non-negative finite number`);
|
|
175
|
+
}
|
|
176
|
+
if (typeof currency !== "string" || currency.trim() === "") {
|
|
177
|
+
throw new Error(`Scenario("${name}"): \`expect.cost.currency\` must be a non-empty ISO 4217 code — chant converts nothing, so a bound needs its currency`);
|
|
178
|
+
}
|
|
179
|
+
if (entity !== undefined && (typeof entity !== "string" || entity.length === 0)) {
|
|
180
|
+
throw new Error(`Scenario("${name}"): \`expect.cost.entity\`, when present, must be a non-empty string`);
|
|
181
|
+
}
|
|
182
|
+
for (const key of Object.keys(c)) {
|
|
183
|
+
if (!["maxPerHour", "currency", "entity"].includes(key)) {
|
|
184
|
+
throw new Error(`Scenario("${name}"): unknown \`expect.cost\` field "${key}" — expected maxPerHour, currency, entity`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
out.cost = Object.freeze({
|
|
188
|
+
maxPerHour,
|
|
189
|
+
currency: currency.trim(),
|
|
190
|
+
...(entity !== undefined ? { entity } : {}),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return Object.freeze(out);
|
|
194
|
+
}
|
|
195
|
+
/** Type guard for a scenario declaration. */
|
|
196
|
+
export function isScenario(value) {
|
|
197
|
+
return (typeof value === "object" &&
|
|
198
|
+
value !== null &&
|
|
199
|
+
SCENARIO_MARKER in value &&
|
|
200
|
+
value[SCENARIO_MARKER] === true);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Extract the scenario declarations from a discovered entity map — the read
|
|
204
|
+
* surface `chant scenario check` (../cli/handlers/scenario.ts) uses. Keyed by
|
|
205
|
+
* entity name (export name), the same key `DiscoveryResult.entities` uses.
|
|
206
|
+
*/
|
|
207
|
+
export function collectScenarios(entities) {
|
|
208
|
+
const out = new Map();
|
|
209
|
+
for (const [name, entity] of entities) {
|
|
210
|
+
if (isScenario(entity))
|
|
211
|
+
out.set(name, entity);
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { observeDeep } from "./deep-observe.js";
|
|
2
|
+
import { computeBuildDigest } from "./digest.js";
|
|
3
|
+
import { collectDependencies, collectAmbient } from "./observe.js";
|
|
4
|
+
import { writeSnapshot, snapshotStorageKey, getHeadCommit, pushLifecycle } from "./git.js";
|
|
5
|
+
import { sortedJsonReplacer } from "../utils.js";
|
|
6
|
+
import { formatUnobserved, normalizeObservation, unobservedAll } from "../observation.js";
|
|
7
|
+
// One list of secret-bearing property names for both observation depths
|
|
8
|
+
// (#1014): the thin path warns on them here, the deep path masks them before a
|
|
9
|
+
// property tree is ever rendered or committed. Two lists would eventually
|
|
10
|
+
// disagree about what counts as a secret.
|
|
11
|
+
import { isSensitiveKey } from "../deep-observation.js";
|
|
12
|
+
import { isObservableDeclarable } from "../declarable.js";
|
|
13
|
+
/**
|
|
14
|
+
* Check for potential sensitive data in resource attributes and return warnings.
|
|
15
|
+
*/
|
|
16
|
+
function checkSensitiveData(resources) {
|
|
17
|
+
const warnings = [];
|
|
18
|
+
for (const [name, meta] of Object.entries(resources)) {
|
|
19
|
+
if (!meta.attributes)
|
|
20
|
+
continue;
|
|
21
|
+
for (const attrName of Object.keys(meta.attributes)) {
|
|
22
|
+
if (isSensitiveKey(attrName)) {
|
|
23
|
+
warnings.push(`Potential sensitive data in ${name}.attributes.${attrName} — ensure it is scrubbed`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return warnings;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate ResourceMetadata entries — resources must have at least type and status.
|
|
31
|
+
* Returns { valid, dropped, warnings }.
|
|
32
|
+
*/
|
|
33
|
+
function validateResources(resources) {
|
|
34
|
+
const valid = {};
|
|
35
|
+
const dropped = [];
|
|
36
|
+
const warnings = [];
|
|
37
|
+
for (const [name, meta] of Object.entries(resources)) {
|
|
38
|
+
if (!meta.type || !meta.status) {
|
|
39
|
+
dropped.push(name);
|
|
40
|
+
warnings.push(`Dropped ${name}: missing type or status`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
valid[name] = meta;
|
|
44
|
+
}
|
|
45
|
+
// Check for sensitive data in valid resources
|
|
46
|
+
warnings.push(...checkSensitiveData(valid));
|
|
47
|
+
return { valid, dropped, warnings };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Take state snapshots for all plugins that implement describeResources.
|
|
51
|
+
*/
|
|
52
|
+
export async function takeSnapshot(environment, plugins, buildResult, opts) {
|
|
53
|
+
const stack = opts?.stack;
|
|
54
|
+
const depth = opts?.deep ? "deep" : "identity";
|
|
55
|
+
// A stack declares the region it deploys to (#1261). Passing it through is
|
|
56
|
+
// what lets a multi-region estate be observed at all: the reader targets the
|
|
57
|
+
// stack's own region rather than whichever one the shell happens to be set
|
|
58
|
+
// to, so out-of-region stacks stop coming back empty.
|
|
59
|
+
const region = opts?.region;
|
|
60
|
+
const warnings = [];
|
|
61
|
+
const errors = [];
|
|
62
|
+
const snapshots = [];
|
|
63
|
+
const headCommit = await getHeadCommit(opts);
|
|
64
|
+
const timestamp = new Date().toISOString();
|
|
65
|
+
const digest = computeBuildDigest(buildResult);
|
|
66
|
+
for (const plugin of plugins) {
|
|
67
|
+
if (!plugin.describeResources && !plugin.listArtifacts)
|
|
68
|
+
continue;
|
|
69
|
+
// Get serialized build output for this lexicon
|
|
70
|
+
const rawOutput = buildResult.outputs.get(plugin.name);
|
|
71
|
+
const buildOutput = rawOutput === undefined
|
|
72
|
+
? ""
|
|
73
|
+
: typeof rawOutput === "string"
|
|
74
|
+
? rawOutput
|
|
75
|
+
: rawOutput.primary;
|
|
76
|
+
// Get entity names + entity props for this lexicon
|
|
77
|
+
const entityNames = [];
|
|
78
|
+
const entities = new Map();
|
|
79
|
+
for (const [name, entity] of buildResult.entities) {
|
|
80
|
+
// Resource declarables only — outputs, parameters and serializer
|
|
81
|
+
// directives have no live counterpart (see lifecycle/observe.ts).
|
|
82
|
+
if (entity.lexicon === plugin.name && isObservableDeclarable(entity)) {
|
|
83
|
+
entityNames.push(name);
|
|
84
|
+
entities.set(name, {
|
|
85
|
+
entityType: entity.entityType,
|
|
86
|
+
props: (entity.props != null ? entity.props : {}),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
let resources = {};
|
|
91
|
+
let artifacts = {};
|
|
92
|
+
let unobserved = {};
|
|
93
|
+
let stackExports;
|
|
94
|
+
try {
|
|
95
|
+
if (plugin.describeResources) {
|
|
96
|
+
const observed = normalizeObservation(await plugin.describeResources({
|
|
97
|
+
environment,
|
|
98
|
+
buildOutput,
|
|
99
|
+
entityNames,
|
|
100
|
+
entities,
|
|
101
|
+
stack,
|
|
102
|
+
region,
|
|
103
|
+
}));
|
|
104
|
+
const { valid, dropped, warnings: validationWarnings } = validateResources(observed.resources);
|
|
105
|
+
warnings.push(...validationWarnings);
|
|
106
|
+
if (dropped.length > 0) {
|
|
107
|
+
warnings.push(`${plugin.name}: dropped ${dropped.length} invalid resource(s)`);
|
|
108
|
+
}
|
|
109
|
+
resources = valid;
|
|
110
|
+
// Record the holes (#1089). A snapshot is evidence of what was seen; an
|
|
111
|
+
// entity nobody could read must not be recorded as "was not there",
|
|
112
|
+
// because the next diff would then read it back as absent.
|
|
113
|
+
unobserved = observed.unobserved;
|
|
114
|
+
stackExports = observed.stackExports;
|
|
115
|
+
for (const [name, entry] of Object.entries(unobserved)) {
|
|
116
|
+
warnings.push(`${plugin.name}: not observed — ${formatUnobserved(name, entry)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (plugin.listArtifacts) {
|
|
120
|
+
// No region: artifacts are registry/chart objects (docker, helm), not
|
|
121
|
+
// regional cloud resources, and `listArtifacts` takes no region.
|
|
122
|
+
const raw = await plugin.listArtifacts({ environment, entities, stack });
|
|
123
|
+
const { valid, dropped, warnings: validationWarnings } = validateResources(raw);
|
|
124
|
+
warnings.push(...validationWarnings);
|
|
125
|
+
if (dropped.length > 0) {
|
|
126
|
+
warnings.push(`${plugin.name}: dropped ${dropped.length} invalid artifact(s)`);
|
|
127
|
+
}
|
|
128
|
+
artifacts = valid;
|
|
129
|
+
}
|
|
130
|
+
if (Object.keys(resources).length === 0 && Object.keys(artifacts).length === 0) {
|
|
131
|
+
const unreadable = Object.keys(unobserved).length;
|
|
132
|
+
errors.push(unreadable > 0
|
|
133
|
+
? `${plugin.name}: nothing observed — ${unreadable} declared entity(ies) could not be read (see warnings); not snapshotting an unread environment as empty`
|
|
134
|
+
: `${plugin.name}: no valid resources or artifacts returned`);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// The deep read is a second pass, after identity is known to be readable
|
|
138
|
+
// (#1267). Keeping it separate means a lexicon with no deep reader still
|
|
139
|
+
// snapshots exactly as before, and a deep read that comes back empty
|
|
140
|
+
// downgrades the record rather than discarding an identity snapshot that
|
|
141
|
+
// was already good.
|
|
142
|
+
let properties;
|
|
143
|
+
let recordedDepth = "identity";
|
|
144
|
+
if (depth === "deep") {
|
|
145
|
+
if (!plugin.observeResourcesDeep) {
|
|
146
|
+
warnings.push(`${plugin.name}: no deep reader — recording an identity snapshot; property questions cannot be answered from it`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const observed = await observeDeep(plugin, {
|
|
150
|
+
environment,
|
|
151
|
+
buildOutput,
|
|
152
|
+
entities,
|
|
153
|
+
...(stack ? { stack } : {}),
|
|
154
|
+
...(region ? { region } : {}),
|
|
155
|
+
});
|
|
156
|
+
for (const [name, entry] of Object.entries(observed.unobserved)) {
|
|
157
|
+
warnings.push(`${plugin.name}: not observed deeply — ${formatUnobserved(name, entry)}`);
|
|
158
|
+
}
|
|
159
|
+
if (Object.keys(observed.resources).length > 0) {
|
|
160
|
+
properties = observed.resources;
|
|
161
|
+
recordedDepth = "deep";
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
warnings.push(`${plugin.name}: deep read returned no properties — recording an identity snapshot`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// What this estate depends on but does not manage (#1273), recorded so a
|
|
169
|
+
// replayed snapshot can answer the same questions a live read can (#1266).
|
|
170
|
+
// Without them a snapshot holds the managed resources and no route to the
|
|
171
|
+
// account's default VPC, so `internetFacing` is unanswerable from it —
|
|
172
|
+
// which would make `search --at` quietly weaker than `search --live`.
|
|
173
|
+
const dependencies = await collectDependencies(plugin, {
|
|
174
|
+
environment,
|
|
175
|
+
entities,
|
|
176
|
+
observed: resources,
|
|
177
|
+
stacks: stack ? [{ name: stack, ...(region ? { region } : {}) }] : [],
|
|
178
|
+
});
|
|
179
|
+
for (const message of dependencies.warnings)
|
|
180
|
+
warnings.push(message);
|
|
181
|
+
// Ambient resources (#1278) are recorded too when asked for, so a replayed
|
|
182
|
+
// snapshot can answer "which of these are unused" without a live read.
|
|
183
|
+
// Without this `search --at --ambient` filters a set that was never
|
|
184
|
+
// recorded and silently returns nothing.
|
|
185
|
+
const ambient = opts?.ambient
|
|
186
|
+
? await collectAmbient(plugin, {
|
|
187
|
+
environment,
|
|
188
|
+
kinds: opts?.ambientKinds ?? [...new Set([...entities.values()].map((e) => e.entityType))],
|
|
189
|
+
observed: resources,
|
|
190
|
+
stacks: stack ? [{ name: stack, ...(region ? { region } : {}) }] : [],
|
|
191
|
+
warnings,
|
|
192
|
+
})
|
|
193
|
+
: {};
|
|
194
|
+
const withDependencies = { ...resources, ...dependencies.resources, ...ambient };
|
|
195
|
+
const snapshot = {
|
|
196
|
+
lexicon: plugin.name,
|
|
197
|
+
environment,
|
|
198
|
+
...(stack ? { stack } : {}),
|
|
199
|
+
commit: headCommit,
|
|
200
|
+
timestamp,
|
|
201
|
+
resources: withDependencies,
|
|
202
|
+
...(dependencies.edges.length > 0 ? { edges: dependencies.edges } : {}),
|
|
203
|
+
...(stackExports && Object.keys(stackExports).length > 0 ? { stackExports } : {}),
|
|
204
|
+
...(Object.keys(unobserved).length > 0 && { unobserved }),
|
|
205
|
+
...(Object.keys(artifacts).length > 0 && { artifacts }),
|
|
206
|
+
// Only written when deep. An absent field means identity, which is what
|
|
207
|
+
// every snapshot taken before #1267 was.
|
|
208
|
+
...(recordedDepth === "deep" && { depth: recordedDepth, properties }),
|
|
209
|
+
digest,
|
|
210
|
+
};
|
|
211
|
+
snapshots.push(snapshot);
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
// A thrown read is not an empty environment — record nothing and say so
|
|
215
|
+
// (#1089). Writing a snapshot here would persist "none of this exists".
|
|
216
|
+
errors.push(`${plugin.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
217
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
218
|
+
for (const [name, entry] of Object.entries(unobservedAll(entityNames, "read-failed", message, entities))) {
|
|
219
|
+
warnings.push(`${plugin.name}: not observed — ${formatUnobserved(name, entry)}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Write all successful snapshots to git
|
|
224
|
+
let commitSha = "";
|
|
225
|
+
for (const snapshot of snapshots) {
|
|
226
|
+
const json = JSON.stringify(snapshot, sortedJsonReplacer, 2);
|
|
227
|
+
commitSha = await writeSnapshot(snapshot.environment, snapshotStorageKey(snapshot.lexicon, snapshot.stack), json, opts);
|
|
228
|
+
}
|
|
229
|
+
// Push to remote
|
|
230
|
+
if (snapshots.length > 0) {
|
|
231
|
+
await pushLifecycle(opts);
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
snapshots,
|
|
235
|
+
commit: commitSha,
|
|
236
|
+
warnings,
|
|
237
|
+
errors,
|
|
238
|
+
};
|
|
239
|
+
}
|