@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,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsed-output view for post-synth checks (chant #975).
|
|
3
|
+
*
|
|
4
|
+
* `PostSynthContext.outputs` carries raw serialized strings — a `chant build`
|
|
5
|
+
* consumer has to parse YAML/JSON itself before it can reason about
|
|
6
|
+
* structure. Every lexicon that needs this today rolls its own splitter
|
|
7
|
+
* (`parseK8sManifests` in k8s, hand-rolled `JSON.parse` in aws's
|
|
8
|
+
* `cf-refs.ts`), and each of the ~30 k8s post-synth checks reparses the same
|
|
9
|
+
* output independently. This module is the shared, parse-once primitive:
|
|
10
|
+
* `parseOutputDocs` turns `ctx.outputs` into a flat list of `OutputDoc`s,
|
|
11
|
+
* and `PostSynthContext.docs` (see `./post-synth.ts`) memoizes one call to it
|
|
12
|
+
* per build so every check — lexicon-shipped or project-authored policy —
|
|
13
|
+
* shares the same parse.
|
|
14
|
+
*
|
|
15
|
+
* `pick`/`get` are the "look at only the fields you care about" ergonomic
|
|
16
|
+
* from the issue's `,remain`-style framing — a partial, unvalidated view of
|
|
17
|
+
* an already-parsed tree, not a query DSL. Selector languages over the
|
|
18
|
+
* *source* AST stay in `./declarative.ts`; this module is output-side only.
|
|
19
|
+
*/
|
|
20
|
+
import { parseYAML } from "../yaml.js";
|
|
21
|
+
/**
|
|
22
|
+
* Parse every output in `outputs` into a flat list of `OutputDoc`s: one call,
|
|
23
|
+
* shared by every post-synth check via `PostSynthContext.docs`.
|
|
24
|
+
*
|
|
25
|
+
* Format detection is whole-source, not per-document: if the entire source
|
|
26
|
+
* parses as JSON, it is one `"json"` document (CloudFormation, most non-k8s
|
|
27
|
+
* serializers). Otherwise the source is treated as a YAML stream — split on
|
|
28
|
+
* `---` document separators — and each resulting document is parsed as YAML
|
|
29
|
+
* (`format: "yaml"`), even one that happens to also be valid JSON, since
|
|
30
|
+
* JSON is a YAML subset. `SerializerResult.files` entries (nested templates,
|
|
31
|
+
* sidecar manifests) are parsed the same way, tagged with `file`.
|
|
32
|
+
*
|
|
33
|
+
* A document that fails to parse into a non-null object/array — malformed
|
|
34
|
+
* input, or a bare scalar where a manifest was expected — is not thrown:
|
|
35
|
+
* it is included with `error` set and `value: undefined`. See `OutputDoc`.
|
|
36
|
+
*/
|
|
37
|
+
export function parseOutputDocs(outputs) {
|
|
38
|
+
const docs = [];
|
|
39
|
+
for (const [lexicon, output] of outputs) {
|
|
40
|
+
const primary = typeof output === "string" ? output : output.primary;
|
|
41
|
+
docs.push(...parseSource(primary, lexicon));
|
|
42
|
+
const files = typeof output === "string" ? undefined : output.files;
|
|
43
|
+
for (const [file, content] of Object.entries(files ?? {})) {
|
|
44
|
+
docs.push(...parseSource(content, lexicon, file));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return docs;
|
|
48
|
+
}
|
|
49
|
+
/** Split a YAML stream on `---` document-separator lines (own line, optional
|
|
50
|
+
* trailing whitespace) — including a leading separator before any content,
|
|
51
|
+
* which `"\n---\n"`-style splitting misses. Empty documents (two separators
|
|
52
|
+
* back to back, or a leading/trailing one) are dropped. */
|
|
53
|
+
function splitYamlDocuments(source) {
|
|
54
|
+
return source
|
|
55
|
+
.split(/^---[ \t]*$/m)
|
|
56
|
+
.map((doc) => doc.trim())
|
|
57
|
+
.filter((doc) => doc.length > 0);
|
|
58
|
+
}
|
|
59
|
+
/** True for a value a document is usable as — a non-null object or array.
|
|
60
|
+
* A bare scalar ("just a string") parses without error but is not a
|
|
61
|
+
* document a check can walk, so it is treated as malformed. */
|
|
62
|
+
function isUsableDoc(value) {
|
|
63
|
+
return typeof value === "object" && value !== null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse one source string (a primary output, or one `files` entry) into its
|
|
67
|
+
* `OutputDoc`s, trying whole-content JSON first and falling back to a
|
|
68
|
+
* (possibly multi-document) YAML stream. Never throws — a parse failure or
|
|
69
|
+
* an unusable result becomes a marker document with `error` set.
|
|
70
|
+
*/
|
|
71
|
+
function parseSource(source, lexicon, file) {
|
|
72
|
+
const trimmed = source.trim();
|
|
73
|
+
if (trimmed === "")
|
|
74
|
+
return [];
|
|
75
|
+
try {
|
|
76
|
+
const value = JSON.parse(trimmed);
|
|
77
|
+
if (isUsableDoc(value)) {
|
|
78
|
+
return [{ lexicon, index: 0, format: "json", value, ...(file && { file }) }];
|
|
79
|
+
}
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
lexicon,
|
|
83
|
+
index: 0,
|
|
84
|
+
format: "json",
|
|
85
|
+
value: undefined,
|
|
86
|
+
error: "parsed JSON is not an object or array",
|
|
87
|
+
...(file && { file }),
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Not whole-content JSON — fall through to the YAML stream path.
|
|
93
|
+
}
|
|
94
|
+
return splitYamlDocuments(trimmed).map((segment, index) => {
|
|
95
|
+
try {
|
|
96
|
+
const value = parseYAML(segment);
|
|
97
|
+
if (isUsableDoc(value)) {
|
|
98
|
+
return { lexicon, index, format: "yaml", value, ...(file && { file }) };
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
lexicon,
|
|
102
|
+
index,
|
|
103
|
+
format: "yaml",
|
|
104
|
+
value: undefined,
|
|
105
|
+
error: "parsed YAML document is not an object or array",
|
|
106
|
+
...(file && { file }),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
return {
|
|
111
|
+
lexicon,
|
|
112
|
+
index,
|
|
113
|
+
format: "yaml",
|
|
114
|
+
value: undefined,
|
|
115
|
+
error: err instanceof Error ? err.message : String(err),
|
|
116
|
+
...(file && { file }),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Partial typed decode — the `,remain`-style ergonomic from `ma91n/tfpolicy`:
|
|
123
|
+
* decode the fields you care about, leave everything else in place,
|
|
124
|
+
* unvalidated. Returns a shallow, top-level view of `value` narrowed to the
|
|
125
|
+
* keys named in `shape`. A key absent from `value` (or `value` not being a
|
|
126
|
+
* plain object) is simply absent from the result — no default is invented.
|
|
127
|
+
*
|
|
128
|
+
* This is NOT runtime validation: a key that IS present is copied as-is,
|
|
129
|
+
* whatever its actual shape, and cast to `T`'s declared type for that key.
|
|
130
|
+
* Use `get` for a deeper walk into one of the picked values.
|
|
131
|
+
*/
|
|
132
|
+
export function pick(value, shape) {
|
|
133
|
+
const result = {};
|
|
134
|
+
if (typeof value !== "object" || value === null)
|
|
135
|
+
return result;
|
|
136
|
+
const source = value;
|
|
137
|
+
for (const key of shape) {
|
|
138
|
+
const propertyName = key;
|
|
139
|
+
if (propertyName in source) {
|
|
140
|
+
result[propertyName] = source[propertyName];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Dotted-path getter for the common walk over a parsed doc, e.g.
|
|
147
|
+
* `get(doc.value, "spec.template.spec")`. Not a query DSL — no wildcards,
|
|
148
|
+
* no predicates, no array-flattening. An array index is just a numeric path
|
|
149
|
+
* segment (`get(value, "items.0.name")`), since JS indexes arrays by string
|
|
150
|
+
* key underneath. Returns `undefined` as soon as any segment is missing or
|
|
151
|
+
* the value at that point isn't indexable — it never throws on a bad path.
|
|
152
|
+
*/
|
|
153
|
+
export function get(value, path) {
|
|
154
|
+
if (path === "")
|
|
155
|
+
return value;
|
|
156
|
+
let current = value;
|
|
157
|
+
for (const segment of path.split(".")) {
|
|
158
|
+
if (typeof current !== "object" || current === null)
|
|
159
|
+
return undefined;
|
|
160
|
+
current = current[segment];
|
|
161
|
+
}
|
|
162
|
+
return current;
|
|
163
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
/**
|
|
4
|
+
* Parse a TypeScript file into an AST
|
|
5
|
+
* @param path - Absolute or relative path to the TypeScript file
|
|
6
|
+
* @returns Parsed TypeScript SourceFile
|
|
7
|
+
* @throws Error if the file cannot be read or parsed
|
|
8
|
+
*/
|
|
9
|
+
export function parseFile(path) {
|
|
10
|
+
let content;
|
|
11
|
+
try {
|
|
12
|
+
content = readFileSync(path, "utf-8");
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
throw new Error(`Failed to read file ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
16
|
+
}
|
|
17
|
+
const sourceFile = ts.createSourceFile(path, content, ts.ScriptTarget.Latest, true // setParentNodes
|
|
18
|
+
);
|
|
19
|
+
// Check for syntax errors (parseDiagnostics is internal but accessible)
|
|
20
|
+
const diagnostics = [
|
|
21
|
+
...sourceFile.parseDiagnostics,
|
|
22
|
+
];
|
|
23
|
+
if (diagnostics.length > 0) {
|
|
24
|
+
const errors = diagnostics
|
|
25
|
+
.map((d) => {
|
|
26
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(d.start ?? 0);
|
|
27
|
+
return `${path}:${line + 1}:${character + 1} - ${ts.flattenDiagnosticMessageText(d.messageText, "\n")}`;
|
|
28
|
+
})
|
|
29
|
+
.join("\n");
|
|
30
|
+
throw new Error(`TypeScript parsing failed:\n${errors}`);
|
|
31
|
+
}
|
|
32
|
+
return sourceFile;
|
|
33
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { STARTER_VERB_FAMILIES } from "../components/starter-plugin.js";
|
|
2
|
+
import { walkComponent } from "./rules/comp/support.js";
|
|
3
|
+
/**
|
|
4
|
+
* Fallback registry when no project registry is supplied: core's own starter
|
|
5
|
+
* verbs, the same fallback COMP005 uses for a direct unit test
|
|
6
|
+
* (`./rules/comp/comp005-capability-kind-is-noun.ts`). A real `chant lint` /
|
|
7
|
+
* gate run passes the project's resolved `knownKinds` (core's starter set
|
|
8
|
+
* plus the active lexicons' leaves) so a real project's cloud verbs are never
|
|
9
|
+
* mistaken for an out-of-registry escape hatch.
|
|
10
|
+
*/
|
|
11
|
+
const CORE_STARTER_KINDS = new Set(Object.values(STARTER_VERB_FAMILIES).flat());
|
|
12
|
+
/** Every non-gate step kind a component's composition invokes, across `deploy` and `rollback` (nested fan-out phases included, via `walkComponent`). `gate` steps are excluded — they are not a capability verb. */
|
|
13
|
+
export function componentVerbSet(component) {
|
|
14
|
+
const { steps } = walkComponent(component);
|
|
15
|
+
return new Set(steps.map((s) => s.step.kind));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Classify a single component's composition (the "cheap first cut", no
|
|
19
|
+
* before/after needed): a `shell` step trips the class unconditionally — it
|
|
20
|
+
* is the escape hatch by construction (COMP006) — and any step whose `kind`
|
|
21
|
+
* is outside `knownKinds` trips it too, since an unregistered verb is,
|
|
22
|
+
* structurally, the same kind of hole a `shell` step is: something the
|
|
23
|
+
* bounded registry does not account for.
|
|
24
|
+
*/
|
|
25
|
+
export function classifyComponentPipelineChange(component, opts) {
|
|
26
|
+
const knownKinds = opts?.knownKinds ?? CORE_STARTER_KINDS;
|
|
27
|
+
const { steps } = walkComponent(component);
|
|
28
|
+
const reasons = [];
|
|
29
|
+
for (const { step, phaseName } of steps) {
|
|
30
|
+
if (step.kind === "shell") {
|
|
31
|
+
reasons.push({ kind: "shell-step", phaseName });
|
|
32
|
+
}
|
|
33
|
+
else if (!knownKinds.has(step.kind)) {
|
|
34
|
+
reasons.push({ kind: "unregistered-verb", stepKind: step.kind, phaseName });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { pipelineChange: reasons.length > 0, reasons };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Classify a *change* to a component's composition between two revisions
|
|
41
|
+
* (#1569's "add or modify a shell step ... or the composition graph
|
|
42
|
+
* itself"): on top of `classifyComponentPipelineChange`'s single-composition
|
|
43
|
+
* check on `after`, a change also trips the class when the verb set itself
|
|
44
|
+
* changed — a verb added or removed changes what the composition can invoke,
|
|
45
|
+
* which is the routing signal even when every individual verb, before and
|
|
46
|
+
* after, is registry-clean. `before: undefined` (a brand-new component) never
|
|
47
|
+
* reports a verb-set change — there is nothing to diff against, and the
|
|
48
|
+
* single-composition check already covers a new component's own shell/
|
|
49
|
+
* unregistered-verb findings.
|
|
50
|
+
*/
|
|
51
|
+
export function classifyPipelineChange(before, after, opts) {
|
|
52
|
+
const base = classifyComponentPipelineChange(after, opts);
|
|
53
|
+
if (!before)
|
|
54
|
+
return base;
|
|
55
|
+
const beforeVerbs = componentVerbSet(before);
|
|
56
|
+
const afterVerbs = componentVerbSet(after);
|
|
57
|
+
const added = [...afterVerbs].filter((v) => !beforeVerbs.has(v)).sort();
|
|
58
|
+
const removed = [...beforeVerbs].filter((v) => !afterVerbs.has(v)).sort();
|
|
59
|
+
if (added.length === 0 && removed.length === 0)
|
|
60
|
+
return base;
|
|
61
|
+
return {
|
|
62
|
+
pipelineChange: true,
|
|
63
|
+
reasons: [...base.reasons, { kind: "verb-set-changed", added, removed }],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Evaluate a component composition change against a routing policy. Pure — no I/O. */
|
|
67
|
+
export function evaluatePipelineChangeGate(before, after, policy = "human-always", opts) {
|
|
68
|
+
const classification = classifyPipelineChange(before, after, opts);
|
|
69
|
+
return { ...classification, route: classification.pipelineChange ? policy : "none" };
|
|
70
|
+
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* the *decision* and documents the reasoning, and re-exports these three
|
|
18
18
|
* functions as its public surface) for one structural reason: `./policy.ts`
|
|
19
19
|
* needs to consult it, `./policy-sandbox.ts` needs to call `./policy.ts`, and a
|
|
20
|
-
* flag on a leaf module
|
|
20
|
+
* flag on a leaf module (its one import, `../ts-loader`, is a leaf too) breaks what would otherwise
|
|
21
21
|
* be an import cycle. It also puts the check on the narrowest possible thing —
|
|
22
22
|
* the function that actually executes project code — rather than on a caller
|
|
23
23
|
* that might forget to ask.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-import.d.ts","sourceRoot":"","sources":["../../src/lint/policy-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"policy-import.d.ts","sourceRoot":"","sources":["../../src/lint/policy-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,iEAAiE;AACjE,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,4IAA4I;AAC5I,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D;AAED,2HAA2H;AAC3H,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAQ3F"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single place chant imports a project's `lint.policies` module **in the
|
|
3
|
+
* CLI's own process** — and the flag that says it may not.
|
|
4
|
+
*
|
|
5
|
+
* The third member of the same family as `../discovery/import.ts`'s
|
|
6
|
+
* `importModule` (project source) and `../config-import.ts`'s
|
|
7
|
+
* `importConfigModule` (`chant.config.ts`): one narrow module whose only job is
|
|
8
|
+
* "execute project-authored code here", so that "did any project code run in
|
|
9
|
+
* this process?" has one place to look and one place to instrument — see
|
|
10
|
+
* `examples/sandbox-execution-boundary.e2e.test.ts`, which spies on all three.
|
|
11
|
+
*
|
|
12
|
+
* Before chant #1131 `./policy.ts` called `await import(resolved)` inline,
|
|
13
|
+
* which is why the corpus boundary gate could not see it even after #1113 put
|
|
14
|
+
* the config behind the boundary: there was nothing named to wrap.
|
|
15
|
+
*
|
|
16
|
+
* The armed flag lives here rather than in `./policy-sandbox.ts` (which owns
|
|
17
|
+
* the *decision* and documents the reasoning, and re-exports these three
|
|
18
|
+
* functions as its public surface) for one structural reason: `./policy.ts`
|
|
19
|
+
* needs to consult it, `./policy-sandbox.ts` needs to call `./policy.ts`, and a
|
|
20
|
+
* flag on a leaf module (its one import, `../ts-loader`, is a leaf too) breaks what would otherwise
|
|
21
|
+
* be an import cycle. It also puts the check on the narrowest possible thing —
|
|
22
|
+
* the function that actually executes project code — rather than on a caller
|
|
23
|
+
* that might forget to ask.
|
|
24
|
+
*/
|
|
25
|
+
import { ensureTypeScriptLoader } from "../ts-loader.js";
|
|
26
|
+
/** Whether this process must run project policy modules inside the sandbox boundary instead of here. */
|
|
27
|
+
let armed = false;
|
|
28
|
+
/**
|
|
29
|
+
* Arm sandboxed policy execution for the rest of this process. See
|
|
30
|
+
* `./policy-sandbox.ts` for what arms it and why it is a process mode rather
|
|
31
|
+
* than a threaded option. Idempotent; there is deliberately no disarm.
|
|
32
|
+
*/
|
|
33
|
+
export function armSandboxPolicyExecution() {
|
|
34
|
+
armed = true;
|
|
35
|
+
}
|
|
36
|
+
/** Whether {@link armSandboxPolicyExecution} has been called. */
|
|
37
|
+
export function isSandboxPolicyExecutionArmed() {
|
|
38
|
+
return armed;
|
|
39
|
+
}
|
|
40
|
+
/** Test-only reset — vitest gives each test file its own module registry, so this exists for suites that arm and disarm within one file. */
|
|
41
|
+
export function resetSandboxPolicyExecutionForTests() {
|
|
42
|
+
armed = false;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Import a policy module into THIS process and return its module namespace.
|
|
46
|
+
* Node's ESM registry caches it, so repeated loads within one CLI invocation
|
|
47
|
+
* evaluate the file once.
|
|
48
|
+
*
|
|
49
|
+
* Refuses while armed. Under `--sandbox` the policy modules are imported inside
|
|
50
|
+
* a child process (`../discovery/sandbox/policy-run.ts`); arriving here anyway
|
|
51
|
+
* means something is about to execute project-authored code in the CLI's own
|
|
52
|
+
* process, which is exactly what the flag promises does not happen. Falling
|
|
53
|
+
* through would make `--sandbox` mean less than it says with nothing visible to
|
|
54
|
+
* notice, so this throws instead.
|
|
55
|
+
*/
|
|
56
|
+
export async function importPolicyModule(policyPath) {
|
|
57
|
+
if (armed) {
|
|
58
|
+
throw new Error(`Refusing to import the policy module ${policyPath} into the chant process under --sandbox: it is project-authored code and must be imported inside the sandbox boundary (packages/core/src/lint/policy-sandbox.ts's runProjectPolicies).`);
|
|
59
|
+
}
|
|
60
|
+
ensureTypeScriptLoader();
|
|
61
|
+
return (await import(policyPath));
|
|
62
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { runPostSynthChecks, } from "./post-synth.js";
|
|
3
|
+
import { loadPolicyChecks } from "./policy.js";
|
|
4
|
+
import { armSandboxPolicyExecution, isSandboxPolicyExecutionArmed, resetSandboxPolicyExecutionForTests, } from "./policy-import.js";
|
|
5
|
+
/**
|
|
6
|
+
* chant #1131 — decides WHERE a project's `lint.policies` checks run.
|
|
7
|
+
*
|
|
8
|
+
* A policy is project-authored code. Every other piece of project code moved
|
|
9
|
+
* behind the `--sandbox` boundary in chant #1045 (run-fallback source), #1093
|
|
10
|
+
* (composite factories, constructors, intrinsic tags) and #1113
|
|
11
|
+
* (`chant.config.ts`), and all three had to leave this one out: the config
|
|
12
|
+
* declares its policies as *paths*, so putting the config behind the boundary
|
|
13
|
+
* did not put them there with it. `chant build` imported each policy module and
|
|
14
|
+
* called its `check` function in the CLI's own process, after discovery was
|
|
15
|
+
* over, with the CLI's filesystem, network, environment and process-spawn
|
|
16
|
+
* access. This module closes it.
|
|
17
|
+
*
|
|
18
|
+
* ## Why an armed process mode rather than a threaded option
|
|
19
|
+
*
|
|
20
|
+
* The same reason `../config-sandbox.ts` gives. `./policy.ts`'s
|
|
21
|
+
* `loadPolicyChecks` is exported from chant-core's public surface and called
|
|
22
|
+
* from more than one place (`../cli/commands/build.ts` for a build, and
|
|
23
|
+
* `evaluateProjectPolicies` for the `policyGate` Op step). Threading a
|
|
24
|
+
* `sandbox` flag to each is fail-OPEN: miss one and project code executes in
|
|
25
|
+
* the CLI process with nothing to notice. Arming the process once, before any
|
|
26
|
+
* policy is loaded, is fail-CLOSED — `loadPolicyChecks` REFUSES while armed, so
|
|
27
|
+
* a call site nobody remembered gets a loud error rather than a silent
|
|
28
|
+
* execution.
|
|
29
|
+
*
|
|
30
|
+
* ## What arms it
|
|
31
|
+
*
|
|
32
|
+
* Both ways of turning sandboxing on, unlike `../config-sandbox.ts`. That
|
|
33
|
+
* asymmetry is not an oversight: the config has a bootstrap limit (reading
|
|
34
|
+
* `build.sandbox` out of `chant.config.ts` means running it, so only the CLI
|
|
35
|
+
* flag, known before any config is touched, can cover the config's own
|
|
36
|
+
* evaluation). Policies have no such limit — they are loaded long after the
|
|
37
|
+
* config is known — so `build.sandbox: true` in a project's config sandboxes
|
|
38
|
+
* them just as `--sandbox` does, and `../cli/commands/build.ts` arms this from
|
|
39
|
+
* the RESOLVED value.
|
|
40
|
+
*
|
|
41
|
+
* There is deliberately no disarm: a security mode that can be turned off
|
|
42
|
+
* partway through a process is not one.
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* The mode itself lives on `./policy-import.ts` — the leaf module that actually
|
|
46
|
+
* performs an in-process policy import, so the refusal sits on the narrowest
|
|
47
|
+
* possible thing and `./policy.ts` can consult it without importing this file
|
|
48
|
+
* (which imports `./policy.ts`). Re-exported here because this is where the
|
|
49
|
+
* decision is documented and where callers look.
|
|
50
|
+
*
|
|
51
|
+
* `armSandboxPolicyExecution` is called from `../cli/commands/build.ts` once
|
|
52
|
+
* `build.sandbox`/`--sandbox` has resolved, and from `../cli/main.ts` off the
|
|
53
|
+
* parsed flag.
|
|
54
|
+
*/
|
|
55
|
+
export { armSandboxPolicyExecution, isSandboxPolicyExecutionArmed, resetSandboxPolicyExecutionForTests };
|
|
56
|
+
/**
|
|
57
|
+
* Run a project's organizational policy checks over a finished build and return
|
|
58
|
+
* their diagnostics. Sandboxed in a post-merge child when armed, in-process
|
|
59
|
+
* otherwise.
|
|
60
|
+
*
|
|
61
|
+
* The unarmed path is byte-for-byte what `chant build` has always done: load
|
|
62
|
+
* the modules, hand every check one `PostSynthContext`, concatenate what they
|
|
63
|
+
* return. The armed path does the same thing on the other side of a process
|
|
64
|
+
* boundary — see `../discovery/sandbox/policy-run.ts`.
|
|
65
|
+
*/
|
|
66
|
+
export async function runProjectPolicies(run) {
|
|
67
|
+
if (run.policies.length === 0)
|
|
68
|
+
return [];
|
|
69
|
+
if (!isSandboxPolicyExecutionArmed()) {
|
|
70
|
+
const checks = run.preloaded ?? (await loadPolicyChecks([...run.policies], run.configDir));
|
|
71
|
+
if (checks.length === 0)
|
|
72
|
+
return [];
|
|
73
|
+
return runPostSynthChecks(checks, run.buildResult, run.env);
|
|
74
|
+
}
|
|
75
|
+
// Dynamic, not static, for the same reason `../config-sandbox.ts` imports
|
|
76
|
+
// `../discovery/sandbox/config-run` dynamically: this pulls in `esbuild`, a
|
|
77
|
+
// large CJS package no unsandboxed build should pay to load.
|
|
78
|
+
const { runPoliciesSandboxed } = await import("../discovery/sandbox/policy-run.js");
|
|
79
|
+
const { diagnostics } = await runPoliciesSandboxed({
|
|
80
|
+
policyPaths: run.policies.map((p) => resolve(run.configDir, p)),
|
|
81
|
+
buildResult: run.buildResult,
|
|
82
|
+
env: run.env,
|
|
83
|
+
projectRoot: run.configDir,
|
|
84
|
+
});
|
|
85
|
+
return diagnostics;
|
|
86
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-authored organizational policy: loading the policy pack and evaluating
|
|
3
|
+
* it against a freshly built project. `chant build` runs policies inline; the
|
|
4
|
+
* `policyGate` Op step runs this to gate an apply on the same checks.
|
|
5
|
+
*/
|
|
6
|
+
import { resolve, dirname } from "node:path";
|
|
7
|
+
import { loadChantConfigUpward, resolveOwnershipEnv, resolveOwnershipMarker } from "../config.js";
|
|
8
|
+
import { resolveBuildParams } from "../build-params.js";
|
|
9
|
+
import { resolveProjectLexicons, loadPlugins } from "../cli/plugins.js";
|
|
10
|
+
import { resolveBuildModes, resolveProjectBuildOptions } from "../cli/build-options.js";
|
|
11
|
+
import { formatWarning } from "../cli/format.js";
|
|
12
|
+
import { build } from "../build.js";
|
|
13
|
+
import { runPostSynthChecks, isPostSynthCheck } from "./post-synth.js";
|
|
14
|
+
import { applyConfiguredSeverity } from "./config.js";
|
|
15
|
+
import { importPolicyModule, isSandboxPolicyExecutionArmed } from "./policy-import.js";
|
|
16
|
+
/**
|
|
17
|
+
* Load project policy checks (one or more `PostSynthCheck` exports) from files,
|
|
18
|
+
* **into this process**.
|
|
19
|
+
*
|
|
20
|
+
* chant #1131 — refuses while `./policy-sandbox.ts` is armed. Under `--sandbox`
|
|
21
|
+
* the policy modules are imported and their checks run inside a child process
|
|
22
|
+
* (`runProjectPolicies`); reaching this function anyway means a call site is
|
|
23
|
+
* about to execute project-authored code in the CLI's own process, which is
|
|
24
|
+
* precisely the thing the flag promises does not happen. Failing loudly is the
|
|
25
|
+
* only honest option — falling through would make `--sandbox` mean less than it
|
|
26
|
+
* says without anything visible to notice.
|
|
27
|
+
*/
|
|
28
|
+
export async function loadPolicyChecks(paths, configDir) {
|
|
29
|
+
if (isSandboxPolicyExecutionArmed()) {
|
|
30
|
+
throw new Error(`Cannot load lint.policies (${paths.join(", ")}) in the chant process under --sandbox: a policy module is project-authored code, and it must be imported inside the sandbox boundary. This is a chant bug — the caller should route through runProjectPolicies() (packages/core/src/lint/policy-sandbox.ts).`);
|
|
31
|
+
}
|
|
32
|
+
const checks = [];
|
|
33
|
+
for (const p of paths) {
|
|
34
|
+
const resolved = resolve(configDir, p);
|
|
35
|
+
let mod;
|
|
36
|
+
try {
|
|
37
|
+
mod = await importPolicyModule(resolved);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
throw new Error(`Failed to load policy "${p}": ${err instanceof Error ? err.message : String(err)}`);
|
|
41
|
+
}
|
|
42
|
+
for (const value of Object.values(mod)) {
|
|
43
|
+
if (isPostSynthCheck(value))
|
|
44
|
+
checks.push(value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return checks;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build a project and run its `lint.policies` over the resolved resources,
|
|
51
|
+
* standalone — used by the `policyGate` Op step to gate an apply on the same
|
|
52
|
+
* organizational policy `chant build` enforces. Loads the project's lexicons,
|
|
53
|
+
* builds, then runs the policy pack with `env` (explicit, else `ownership.env`).
|
|
54
|
+
*
|
|
55
|
+
* chant #2002 — "the same organizational policy `chant build` enforces" only
|
|
56
|
+
* holds if it is the same build. The build options are assembled by
|
|
57
|
+
* `../cli/build-options.ts`'s `resolveProjectBuildOptions`, the single function
|
|
58
|
+
* `chant build` also calls, rather than by a second list here; a build option
|
|
59
|
+
* added for one caller and not the other is what let a gate pass a build
|
|
60
|
+
* `chant build` fails.
|
|
61
|
+
*/
|
|
62
|
+
export async function evaluateProjectPolicies(opts) {
|
|
63
|
+
const buildPath = resolve(opts.path);
|
|
64
|
+
const lexiconNames = await resolveProjectLexicons(buildPath);
|
|
65
|
+
const plugins = await loadPlugins(lexiconNames);
|
|
66
|
+
const serializers = plugins.map((p) => p.serializer);
|
|
67
|
+
// chant #1117 — walks up from the build dir to the project root, same as
|
|
68
|
+
// `chant build` (`../cli/commands/build.ts`'s `loadChantConfigUpward`), not
|
|
69
|
+
// just the build dir's immediate parent.
|
|
70
|
+
const loaded = await loadChantConfigUpward(buildPath);
|
|
71
|
+
const config = loaded.config;
|
|
72
|
+
const configDir = loaded.configPath ? dirname(loaded.configPath) : buildPath;
|
|
73
|
+
// #1396 — `ownership.env` may reference a build parameter, so the declared
|
|
74
|
+
// parameters are resolved first (from their env mappings and defaults, the
|
|
75
|
+
// same inputs an Op step has) and the build sees them too.
|
|
76
|
+
const params = resolveBuildParams(config.buildParams, { env: process.env });
|
|
77
|
+
if (params.errors.length > 0) {
|
|
78
|
+
throw new Error(`Build parameters did not resolve — cannot evaluate policy:\n ${params.errors.join("\n ")}`);
|
|
79
|
+
}
|
|
80
|
+
const env = opts.env ?? resolveOwnershipEnv(config, params.provenance);
|
|
81
|
+
// chant #2002 — the build options come from the shared assembler
|
|
82
|
+
// (`../cli/build-options.ts`), the same one `chant build` uses, so the gate
|
|
83
|
+
// decides on the project `chant build` produces: folded by default (#1134),
|
|
84
|
+
// with the project's config reaching the serializers, and with
|
|
85
|
+
// config-declared build roots contributing their entities. Assembling a
|
|
86
|
+
// second, shorter list here is what let the two drift apart.
|
|
87
|
+
const modes = resolveBuildModes(config);
|
|
88
|
+
const warnings = [];
|
|
89
|
+
if (modes.sandbox) {
|
|
90
|
+
// Resolved, reported, and not yet honoured. Building inside the boundary
|
|
91
|
+
// needs per-execution arming (#1157) — until that lands, saying so is the
|
|
92
|
+
// difference between a known gap and a silent one.
|
|
93
|
+
warnings.push(`build.sandbox is enabled for this project, but the policy gate builds it in this process — the project's source files and its lint.policies modules execute here, unsandboxed (chant #1157). Run \`chant build --sandbox\` for a sandboxed build of the same project.`);
|
|
94
|
+
}
|
|
95
|
+
for (const warning of warnings)
|
|
96
|
+
console.error(formatWarning({ message: warning }));
|
|
97
|
+
const result = await build(buildPath, serializers, undefined, resolveProjectBuildOptions({
|
|
98
|
+
config,
|
|
99
|
+
configDir,
|
|
100
|
+
plugins,
|
|
101
|
+
modes: { fold: modes.fold, sandbox: false },
|
|
102
|
+
ownership: resolveOwnershipMarker(config, params.provenance),
|
|
103
|
+
buildParams: params.provenance,
|
|
104
|
+
}));
|
|
105
|
+
if (result.errors.length > 0) {
|
|
106
|
+
throw new Error("Build failed — cannot evaluate policy on a broken build");
|
|
107
|
+
}
|
|
108
|
+
const checks = config.lint?.policies?.length
|
|
109
|
+
? await loadPolicyChecks(config.lint.policies, configDir)
|
|
110
|
+
: [];
|
|
111
|
+
if (checks.length === 0) {
|
|
112
|
+
return { diagnostics: [], violations: [], env, suppressed: [], warnings };
|
|
113
|
+
}
|
|
114
|
+
const raw = runPostSynthChecks(checks, result, env);
|
|
115
|
+
// chant #1138 — same `lint.rules` resolution `chant build` applies
|
|
116
|
+
// (`../cli/commands/build.ts`), so a check `lint.rules` turned "off"/
|
|
117
|
+
// "warning" doesn't gate an apply here even though `chant build` no longer
|
|
118
|
+
// fails on it either, and vice versa for a check turned UP to "error".
|
|
119
|
+
const { diagnostics, suppressed } = applyConfiguredSeverity(raw, config.lint?.rules);
|
|
120
|
+
const violations = diagnostics.filter((d) => d.severity === "error");
|
|
121
|
+
return { diagnostics, violations, env, suppressed, warnings };
|
|
122
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { parseOutputDocs } from "./output-docs.js";
|
|
2
|
+
export { parseOutputDocs, pick, get } from "./output-docs.js";
|
|
3
|
+
/**
|
|
4
|
+
* Build the lazy, memoized `docs` accessor shared by `runPostSynthChecks`
|
|
5
|
+
* (below) and `@intentius/chant-test-utils`'s `createPostSynthContext` — the
|
|
6
|
+
* two places a `PostSynthContext` gets constructed. Returns a zero-arg
|
|
7
|
+
* function suitable for a `get docs()` object-literal accessor; the first
|
|
8
|
+
* call parses, every later call returns the same cached array.
|
|
9
|
+
*/
|
|
10
|
+
export function createDocsAccessor(outputs) {
|
|
11
|
+
let cached;
|
|
12
|
+
return () => {
|
|
13
|
+
if (cached === undefined) {
|
|
14
|
+
cached = parseOutputDocs(outputs);
|
|
15
|
+
}
|
|
16
|
+
return cached;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extract the primary content string from a serializer output.
|
|
21
|
+
*/
|
|
22
|
+
export function getPrimaryOutput(output) {
|
|
23
|
+
return typeof output === "string" ? output : output.primary;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract the ADDITIONAL files from a serializer output — everything
|
|
27
|
+
* {@link getPrimaryOutput} discards.
|
|
28
|
+
*
|
|
29
|
+
* Every post-synth check shipped before this one reads the primary output
|
|
30
|
+
* only, which means a sidecar file (a nested stack template, committed SOPS
|
|
31
|
+
* ciphertext) is invisible to all of them. That is the right default — the
|
|
32
|
+
* primary output is what appliers read — but a rule ABOUT a sidecar has to
|
|
33
|
+
* be able to see it, and `PostSynthContext.outputs` has carried the data all
|
|
34
|
+
* along. WK8504 (k8s) is the first caller.
|
|
35
|
+
*/
|
|
36
|
+
export function getAdditionalFiles(output) {
|
|
37
|
+
return typeof output === "string" ? {} : (output.files ?? {});
|
|
38
|
+
}
|
|
39
|
+
/** Structural type guard — used to collect project-authored policy checks. */
|
|
40
|
+
export function isPostSynthCheck(value) {
|
|
41
|
+
return (typeof value === "object" &&
|
|
42
|
+
value !== null &&
|
|
43
|
+
typeof value.id === "string" &&
|
|
44
|
+
typeof value.description === "string" &&
|
|
45
|
+
typeof value.check === "function");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Run a set of post-synthesis checks against a build result. `env` is threaded
|
|
49
|
+
* into the context so a check can branch on the current environment/stack, and
|
|
50
|
+
* `opts.activityContracts` (chant #2101) carries the build's cross-lexicon
|
|
51
|
+
* activity-contract map to the checks that validate Op steps against it.
|
|
52
|
+
* `opts.telemetry` is the build's resolved telemetry attribution, and
|
|
53
|
+
* `opts.projectDir` and `opts.projectConfig` the config the build loaded and
|
|
54
|
+
* its directory.
|
|
55
|
+
*/
|
|
56
|
+
export function runPostSynthChecks(checks, buildResult, env, opts) {
|
|
57
|
+
const getDocs = createDocsAccessor(buildResult.outputs);
|
|
58
|
+
const ctx = {
|
|
59
|
+
outputs: buildResult.outputs,
|
|
60
|
+
entities: buildResult.entities,
|
|
61
|
+
env,
|
|
62
|
+
buildResult,
|
|
63
|
+
...(opts?.activityContracts ? { activityContracts: opts.activityContracts } : {}),
|
|
64
|
+
...(opts?.telemetry ? { telemetry: opts.telemetry } : {}),
|
|
65
|
+
...(opts?.projectDir ? { projectDir: opts.projectDir } : {}),
|
|
66
|
+
...(opts?.projectConfig ? { projectConfig: opts.projectConfig } : {}),
|
|
67
|
+
get docs() {
|
|
68
|
+
return getDocs();
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
const diagnostics = [];
|
|
72
|
+
for (const check of checks) {
|
|
73
|
+
diagnostics.push(...check.check(ctx));
|
|
74
|
+
}
|
|
75
|
+
return diagnostics;
|
|
76
|
+
}
|
|
77
|
+
// chant #1138 — `applyConfiguredSeverity` (the `lint.rules` severity-override
|
|
78
|
+
// pass over a set of `PostSynthDiagnostic`s) lives in `./config.ts`, not here,
|
|
79
|
+
// even though it operates on this module's own type. This file is a leaf:
|
|
80
|
+
// every lexicon's post-synth checks import it as a real runtime module (not
|
|
81
|
+
// just for types — `getPrimaryOutput` above is a plain function several
|
|
82
|
+
// checks call directly), so it has to stay cheap to load. `./config.ts` is
|
|
83
|
+
// not cheap — it resolves built-in preset paths via the runtime adapter at
|
|
84
|
+
// module scope — and pulling that into every lexicon's check barrel merely to
|
|
85
|
+
// share one filter function is the wrong trade. `applyConfiguredSeverity`
|
|
86
|
+
// only needs this module's TYPE (`PostSynthDiagnostic`), which costs nothing
|
|
87
|
+
// at runtime, so the dependency runs the other way instead.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"rules": {
|
|
3
|
+
"COR001": "warning",
|
|
4
|
+
"COR002": "off",
|
|
5
|
+
"COR003": "off",
|
|
6
|
+
"COR004": "off",
|
|
7
|
+
"COR005": "off",
|
|
8
|
+
"COR006": "off",
|
|
9
|
+
"COR007": "off",
|
|
10
|
+
"COR008": "warning",
|
|
11
|
+
"COR009": "off",
|
|
12
|
+
"COR010": "warning",
|
|
13
|
+
"COR011": "warning",
|
|
14
|
+
"COR012": "off",
|
|
15
|
+
"COR013": "off",
|
|
16
|
+
"COR014": "off",
|
|
17
|
+
"COR015": "off",
|
|
18
|
+
"COMP001": "warning",
|
|
19
|
+
"COMP002": "warning",
|
|
20
|
+
"COMP003": "off",
|
|
21
|
+
"COMP004": "warning",
|
|
22
|
+
"COMP005": "off",
|
|
23
|
+
"COMP006": "off",
|
|
24
|
+
"COMP007": "off"
|
|
25
|
+
}
|
|
26
|
+
}
|