@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,333 @@
|
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { params as currentBuildParams } from "../../params.js";
|
|
3
|
+
import { chantSourceDir } from "../../ts-loader.js";
|
|
4
|
+
/**
|
|
5
|
+
* chant #1045 Phase 2 — generates the source of the "driver" module that runs
|
|
6
|
+
* INSIDE the sandboxed child. See `./run.ts` for the orchestration this feeds
|
|
7
|
+
* (bundle the generated source with esbuild, then spawn a permission-limited
|
|
8
|
+
* child on the bundle) and `../fold-import.ts`'s long doc comment for why
|
|
9
|
+
* every run-fallback file for a build must execute together, in one process,
|
|
10
|
+
* sharing one module graph.
|
|
11
|
+
*
|
|
12
|
+
* The driver imports each run-fallback file via a LITERAL string specifier
|
|
13
|
+
* dynamic `import()` — not a variable — so esbuild's bundler can still trace
|
|
14
|
+
* and inline it (verified: esbuild lowers a literal-specifier `import()` to a
|
|
15
|
+
* lazily-invoked local module initializer, not a runtime resolution), while
|
|
16
|
+
* keeping the SAME per-file try/catch resilience `discover()`'s own run loop
|
|
17
|
+
* has today (one file throwing at import time doesn't take down the whole
|
|
18
|
+
* batch). A literal, per-build-generated import graph is exactly what lets
|
|
19
|
+
* the whole bundle be self-contained: esbuild resolves every project file,
|
|
20
|
+
* lexicon package, and node_modules dependency transitively, ONCE, so the
|
|
21
|
+
* sandboxed child never needs to resolve a module from disk at runtime.
|
|
22
|
+
*
|
|
23
|
+
* Chant's own trusted collection/resolution/encoding step
|
|
24
|
+
* (`collectEntities`/`resolveAttrRefs`/`encodeEntitySet`) runs INSIDE the
|
|
25
|
+
* child too, after every file has been imported — this is what lets naming
|
|
26
|
+
* and AttrRef resolution happen "inside the boundary" for the run-fallback
|
|
27
|
+
* set (mirrors `discoverEntitySetJson`'s doc in `../entity-wire.ts`), so the
|
|
28
|
+
* child can hand back a fully-named, ref-resolved `EntitySetWire` rather than
|
|
29
|
+
* raw, identity-bearing module exports that couldn't cross the process
|
|
30
|
+
* boundary at all.
|
|
31
|
+
*/
|
|
32
|
+
// #3878: the TypeScript source, also when this module runs compiled from dist/.
|
|
33
|
+
const HERE = chantSourceDir(import.meta.url);
|
|
34
|
+
const DISCOVERY_DIR = join(HERE, "..");
|
|
35
|
+
/** Absolute paths to chant's OWN trusted modules the generated driver imports — always resolved relative to THIS file's own location on disk, so this works whether chant is running from the monorepo or from a consumer's `node_modules` (both route runtime resolution at `src/*.ts` — see `packages/core/package.json`'s `development`/`default` export conditions). */
|
|
36
|
+
const COLLECT_MODULE = join(DISCOVERY_DIR, "collect.ts");
|
|
37
|
+
const RESOLVE_MODULE = join(DISCOVERY_DIR, "resolve.ts");
|
|
38
|
+
// The pure codec, NOT `entity-wire.ts` — that file also exports
|
|
39
|
+
// `discoverEntitySetJson`, which pulls in `discover()` → `fold-import` →
|
|
40
|
+
// the `typescript` compiler package. See `../entity-wire.ts`'s module doc.
|
|
41
|
+
const ENTITY_WIRE_CODEC_MODULE = join(DISCOVERY_DIR, "entity-wire-codec.ts");
|
|
42
|
+
const CHILD_ERRORS_MODULE = join(HERE, "child-errors.ts");
|
|
43
|
+
const PROVENANCE_MODULE = join(dirname(DISCOVERY_DIR), "provenance.ts");
|
|
44
|
+
// chant #1113 — the config driver's serializability contract (see ./config-wire.ts).
|
|
45
|
+
const CONFIG_WIRE_MODULE = join(HERE, "config-wire.ts");
|
|
46
|
+
// chant #1131 — the policy driver's build-result decoding + diagnostics contract.
|
|
47
|
+
const POLICY_WIRE_MODULE = join(HERE, "policy-wire.ts");
|
|
48
|
+
const POST_SYNTH_MODULE = join(dirname(DISCOVERY_DIR), "lint", "post-synth.ts");
|
|
49
|
+
// chant #1108 — the shared build-time params module (../params.ts). The child
|
|
50
|
+
// process starts with its own, EMPTY copy of that module's `params` object;
|
|
51
|
+
// without re-binding, every run-fallback file imported in the child would see
|
|
52
|
+
// `params.* === undefined` while the fold path (which substitutes values in
|
|
53
|
+
// the PARENT) sees the resolved values — the exact split-brain #1064 exists
|
|
54
|
+
// to prevent. esbuild resolves a project file's own
|
|
55
|
+
// `import { params } from "@intentius/chant/params"` to this same absolute
|
|
56
|
+
// file, so the driver's `setBuildParams` call below mutates the one object
|
|
57
|
+
// every bundled import observes.
|
|
58
|
+
const PARAMS_MODULE = join(dirname(DISCOVERY_DIR), "params.ts");
|
|
59
|
+
/** Escape a value for embedding as a JS/TS source-level literal. */
|
|
60
|
+
function lit(value) {
|
|
61
|
+
return JSON.stringify(value);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* chant#2461 — the `send` every driver uses, as generated source lines.
|
|
65
|
+
*
|
|
66
|
+
* `process.send` is asynchronous: it queues the message on the IPC channel and
|
|
67
|
+
* returns. Node's contract is that the optional callback runs once the message
|
|
68
|
+
* has been written, or with an error if it could not be. Without the callback a
|
|
69
|
+
* failed send is not reported to the caller at all, so the driver could return
|
|
70
|
+
* from `main()` believing it had answered.
|
|
71
|
+
*
|
|
72
|
+
* So `send` returns a promise that settles only when the write has completed,
|
|
73
|
+
* and every call site awaits it before `main()` returns. A send that fails, or
|
|
74
|
+
* throws synchronously (a payload that cannot be serialized), writes the reason
|
|
75
|
+
* to stderr with a synchronous `writeSync` and exits 1. That way a result that
|
|
76
|
+
* never left the child cannot end as exit 0 with empty stderr, which is the
|
|
77
|
+
* signature that looks like success went missing.
|
|
78
|
+
*
|
|
79
|
+
* `before` is spliced in at the top of the function body (the run driver marks
|
|
80
|
+
* itself `reported` there).
|
|
81
|
+
*/
|
|
82
|
+
export function sendFunctionSource(before = []) {
|
|
83
|
+
return [
|
|
84
|
+
`function send(payload) {`,
|
|
85
|
+
...before.map((line) => ` ${line}`),
|
|
86
|
+
` if (typeof process.send !== "function") {`,
|
|
87
|
+
` console.log(JSON.stringify(payload));`,
|
|
88
|
+
` return Promise.resolve();`,
|
|
89
|
+
` }`,
|
|
90
|
+
` return new Promise((resolve) => {`,
|
|
91
|
+
` const lost = (err) => {`,
|
|
92
|
+
` writeSync(2, "chant: the sandboxed child could not hand its result to the parent: " +`,
|
|
93
|
+
` (err && err.message ? err.message : String(err)) + " (chant#2461)\\n");`,
|
|
94
|
+
` process.exit(1);`,
|
|
95
|
+
` };`,
|
|
96
|
+
` try {`,
|
|
97
|
+
` process.send(payload, (err) => (err ? lost(err) : resolve()));`,
|
|
98
|
+
` } catch (err) {`,
|
|
99
|
+
` lost(err);`,
|
|
100
|
+
` }`,
|
|
101
|
+
` });`,
|
|
102
|
+
`}`,
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Generate the driver module's full TypeScript source. Written to a tmp file
|
|
107
|
+
* and bundled (see `./bundle.ts`) before being handed to a sandboxed child —
|
|
108
|
+
* never executed directly by the parent process.
|
|
109
|
+
*/
|
|
110
|
+
export function generateDriverSource(options) {
|
|
111
|
+
const { files, buildRoot } = options;
|
|
112
|
+
const lines = [
|
|
113
|
+
`import { collectEntities } from ${lit(COLLECT_MODULE)};`,
|
|
114
|
+
`import { resolveAttrRefs } from ${lit(RESOLVE_MODULE)};`,
|
|
115
|
+
`import { encodeEntitySet } from ${lit(ENTITY_WIRE_CODEC_MODULE)};`,
|
|
116
|
+
`import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
|
|
117
|
+
`import { getProvenance } from ${lit(PROVENANCE_MODULE)};`,
|
|
118
|
+
`import { setBuildParams } from ${lit(PARAMS_MODULE)};`,
|
|
119
|
+
`import { writeSync } from "node:fs";`,
|
|
120
|
+
``,
|
|
121
|
+
`const BUILD_ROOT = ${lit(buildRoot)};`,
|
|
122
|
+
``,
|
|
123
|
+
// chant #1108 — a snapshot of the PARENT's resolved build-time parameter
|
|
124
|
+
// values, embedded as a literal at generation time (the parent bound them
|
|
125
|
+
// via applyBuildParams/discover() before this source was generated).
|
|
126
|
+
// Values are declared-scalar only (BuildParamValue), so JSON round-trips
|
|
127
|
+
// them exactly. Bound before any project import below.
|
|
128
|
+
`setBuildParams(${lit({ ...currentBuildParams })});`,
|
|
129
|
+
``,
|
|
130
|
+
// chant#2461 — which file was being imported when the loop drained.
|
|
131
|
+
//
|
|
132
|
+
// A project file whose module scope awaits something that never settles
|
|
133
|
+
// makes its `await import(...)` never complete. Nothing keeps the loop
|
|
134
|
+
// alive, so Node exits 0 having sent nothing, and `main().catch` never
|
|
135
|
+
// fires because an unsettled promise is not a rejection. The parent then
|
|
136
|
+
// knows only that the child vanished.
|
|
137
|
+
//
|
|
138
|
+
// The child DOES know, right up to the moment it exits. `process.on("exit")`
|
|
139
|
+
// runs synchronously, so it cannot `process.send` — that is asynchronous and
|
|
140
|
+
// the channel will never be serviced — but a synchronous `writeSync` to fd 2
|
|
141
|
+
// lands, and the parent already captures and forwards stderr.
|
|
142
|
+
`let importing;`,
|
|
143
|
+
`let reported = false;`,
|
|
144
|
+
`process.on("exit", () => {`,
|
|
145
|
+
` if (reported || importing === undefined) return;`,
|
|
146
|
+
` writeSync(2, "chant: this file's module scope never finished evaluating, so the build could not " +`,
|
|
147
|
+
` "report anything: " + importing + "\\n A top-level \`await\` that never settles does this. " +`,
|
|
148
|
+
` "Nothing is thrown, so nothing else can name it (chant#2461).\\n");`,
|
|
149
|
+
`});`,
|
|
150
|
+
``,
|
|
151
|
+
...sendFunctionSource([`reported = true;`]),
|
|
152
|
+
``,
|
|
153
|
+
// collectEntities (bundled, real DiscoveryError instances) already names
|
|
154
|
+
// the exact offending file on a same-directory duplicate — reuse that
|
|
155
|
+
// instead of reporting an empty file, which is what forwarding a bare ""
|
|
156
|
+
// through classifyChildError would otherwise do.
|
|
157
|
+
`function errFile(err) {`,
|
|
158
|
+
` return err && typeof err === "object" && typeof err.file === "string" ? err.file : "";`,
|
|
159
|
+
`}`,
|
|
160
|
+
``,
|
|
161
|
+
`async function main() {`,
|
|
162
|
+
` const modules = [];`,
|
|
163
|
+
` const errors = [];`,
|
|
164
|
+
];
|
|
165
|
+
for (const file of files) {
|
|
166
|
+
lines.push(` importing = ${lit(file)};`, ` try {`, ` const mod = await import(${lit(file)});`, ` modules.push({ file: ${lit(file)}, exports: mod });`, ` } catch (err) {`, ` errors.push(classifyChildError(${lit(file)}, err).toJSON());`, ` }`, ` importing = undefined;`);
|
|
167
|
+
}
|
|
168
|
+
lines.push(``, ` let entities = new Map();`, ` try {`, ` entities = collectEntities(modules, BUILD_ROOT);`, ` } catch (err) {`, ` errors.push(classifyChildError(errFile(err), err, "resolution").toJSON());`, ` await send({ entitySet: { entities: [] }, errors, provenanceByName: {} });`, ` return;`, ` }`, ``,
|
|
169
|
+
// Recorded BEFORE resolveAttrRefs/encode — not for the parent's own
|
|
170
|
+
// entities (it never sees this subset's raw exports at all), but so a
|
|
171
|
+
// parent-side merge collision against the fold-only set (chant#1045
|
|
172
|
+
// Phase 2 — a same-directory bare name genuinely exported twice, once
|
|
173
|
+
// folded, once run) can name the real run-fallback file instead of the
|
|
174
|
+
// entity name. See discover()'s merge step in ../index.ts.
|
|
175
|
+
` const provenanceByName = {};`, ` for (const [name, entity] of entities) {`, ` const prov = getProvenance(entity);`, ` if (prov?.sourceFile) provenanceByName[name] = prov.sourceFile;`, ` }`, ``, ` try {`, ` resolveAttrRefs(entities);`, ` } catch (err) {`, ` errors.push(classifyChildError("", err, "resolution").toJSON());`, ` }`, ``, ` let entitySet;`, ` try {`, ` entitySet = encodeEntitySet(entities);`, ` } catch (err) {`, ` errors.push(classifyChildError("", err, "resolution").toJSON());`, ` await send({ entitySet: { entities: [] }, errors, provenanceByName });`, ` return;`, ` }`, ` await send({ entitySet, errors, provenanceByName });`, `}`, ``, `main().catch((err) =>`, ` send({ entitySet: { entities: [] }, errors: [classifyChildError("", err).toJSON()], provenanceByName: {}, fatal: true }),`, `);`);
|
|
176
|
+
return lines.join("\n");
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* chant #1113 — generate the driver module that evaluates a project's
|
|
180
|
+
* `chant.config.ts` INSIDE the sandboxed child and hands back plain JSON.
|
|
181
|
+
*
|
|
182
|
+
* Same machinery as {@link generateDriverSource} above, deliberately: one
|
|
183
|
+
* literal-specifier dynamic `import()` esbuild can trace and inline, one IPC
|
|
184
|
+
* message back, `./child-errors.ts` for classification so a permission denial
|
|
185
|
+
* names the config file rather than leaking `ERR_ACCESS_DENIED`. The only
|
|
186
|
+
* difference is what crosses — a config is data, not an entity graph, so there
|
|
187
|
+
* is no naming/`AttrRef` step and no `EntitySetWire`; the child instead runs
|
|
188
|
+
* `./config-wire.ts`'s serializability scan and refuses to hand back a config
|
|
189
|
+
* that `JSON.stringify` would silently mangle.
|
|
190
|
+
*
|
|
191
|
+
* The child returns the raw module namespace's chosen export as-is — the
|
|
192
|
+
* `default ?? config ?? namespace` selection and Zod validation
|
|
193
|
+
* (`normalizeConfig`) stay in the parent, where they were, so `--sandbox`
|
|
194
|
+
* changes where the file is *evaluated* and nothing about how its result is
|
|
195
|
+
* interpreted.
|
|
196
|
+
*/
|
|
197
|
+
export function generateConfigDriverSource(configPath) {
|
|
198
|
+
return [
|
|
199
|
+
`import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
|
|
200
|
+
`import { scanConfigWireSafety } from ${lit(CONFIG_WIRE_MODULE)};`,
|
|
201
|
+
`import { writeSync } from "node:fs";`,
|
|
202
|
+
``,
|
|
203
|
+
...sendFunctionSource(),
|
|
204
|
+
``,
|
|
205
|
+
`async function main() {`,
|
|
206
|
+
` let namespace;`,
|
|
207
|
+
` try {`,
|
|
208
|
+
` namespace = await import(${lit(configPath)});`,
|
|
209
|
+
` } catch (err) {`,
|
|
210
|
+
` await send({ kind: "chant-config", ok: false, error: classifyChildError(${lit(configPath)}, err).toJSON() });`,
|
|
211
|
+
` return;`,
|
|
212
|
+
` }`,
|
|
213
|
+
``,
|
|
214
|
+
// Mirrors loadChantConfig's own selection so the scan sees exactly the
|
|
215
|
+
// object the parent will normalize. A namespace object is not a plain
|
|
216
|
+
// object; scanConfigWireSafety walks its own keys rather than rejecting it.
|
|
217
|
+
` const selected = namespace.default ?? namespace.config ?? namespace;`,
|
|
218
|
+
``,
|
|
219
|
+
` const offenders = scanConfigWireSafety(selected);`,
|
|
220
|
+
` if (offenders.length > 0) {`,
|
|
221
|
+
` await send({ kind: "chant-config", ok: false, offenders });`,
|
|
222
|
+
` return;`,
|
|
223
|
+
` }`,
|
|
224
|
+
``,
|
|
225
|
+
` let config;`,
|
|
226
|
+
` try {`,
|
|
227
|
+
// Round-trip here, not just at the IPC boundary: this is what proves the
|
|
228
|
+
// payload really is JSON before it leaves the child, and turns anything
|
|
229
|
+
// the scan somehow missed into a named error instead of a quiet drop.
|
|
230
|
+
` config = JSON.parse(JSON.stringify(selected ?? {}));`,
|
|
231
|
+
` } catch (err) {`,
|
|
232
|
+
` await send({ kind: "chant-config", ok: false, error: classifyChildError(${lit(configPath)}, err, "resolution").toJSON() });`,
|
|
233
|
+
` return;`,
|
|
234
|
+
` }`,
|
|
235
|
+
` await send({ kind: "chant-config", ok: true, config });`,
|
|
236
|
+
`}`,
|
|
237
|
+
``,
|
|
238
|
+
`main().catch((err) =>`,
|
|
239
|
+
` send({ kind: "chant-config", ok: false, error: classifyChildError(${lit(configPath)}, err).toJSON() }),`,
|
|
240
|
+
`);`,
|
|
241
|
+
].join("\n");
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* chant #1131 — generate the driver module that imports a project's
|
|
245
|
+
* `lint.policies` modules INSIDE the sandboxed child, runs their checks over
|
|
246
|
+
* the build result the parent hands it, and sends back plain
|
|
247
|
+
* `PostSynthDiagnostic`s.
|
|
248
|
+
*
|
|
249
|
+
* Same machinery again: literal-specifier dynamic `import()`s esbuild can trace
|
|
250
|
+
* and inline, `./child-errors.ts` for classification so a permission denial
|
|
251
|
+
* names the policy file, one IPC message back. Two things are specific to this
|
|
252
|
+
* one:
|
|
253
|
+
*
|
|
254
|
+
* - **It receives before it sends.** The run and config drivers are fully
|
|
255
|
+
* parameterized by their generated source; a policy check needs the finished
|
|
256
|
+
* build result, which is neither known at bundle time nor something to bake
|
|
257
|
+
* into a source literal. It arrives as one IPC message (see `./fork.ts`'s
|
|
258
|
+
* `send`). The `process.on("message", …)` registration is top-level and
|
|
259
|
+
* synchronous, so it is in place before the event loop can deliver anything
|
|
260
|
+
* — a message the parent sent before the child finished booting is queued on
|
|
261
|
+
* the channel, not lost.
|
|
262
|
+
* - **Checks run wrapped, not raw.** `runPostSynthChecks` (chant's own, from
|
|
263
|
+
* `../../lint/post-synth.ts`) is invoked ONCE over every check from every
|
|
264
|
+
* policy module, exactly as `cli/commands/build.ts` invokes it in-process —
|
|
265
|
+
* so the checks share one `PostSynthContext` and run in one order, and the
|
|
266
|
+
* diagnostics come back in the same sequence. The wrapper around each check
|
|
267
|
+
* is what makes a bad return value attributable: it scans that check's own
|
|
268
|
+
* output and throws a `PolicyWireError` naming the module the check was
|
|
269
|
+
* loaded from, rather than reporting an offending index in a merged array.
|
|
270
|
+
*/
|
|
271
|
+
export function generatePolicyDriverSource(policyPaths) {
|
|
272
|
+
const lines = [
|
|
273
|
+
`import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
|
|
274
|
+
`import { decodePolicyBuildResult, scanPolicyDiagnostics, PolicyWireError } from ${lit(POLICY_WIRE_MODULE)};`,
|
|
275
|
+
`import { runPostSynthChecks, isPostSynthCheck } from ${lit(POST_SYNTH_MODULE)};`,
|
|
276
|
+
`import { writeSync } from "node:fs";`,
|
|
277
|
+
``,
|
|
278
|
+
...sendFunctionSource(),
|
|
279
|
+
``,
|
|
280
|
+
`function fail(file, err, type) {`,
|
|
281
|
+
` if (err instanceof PolicyWireError) {`,
|
|
282
|
+
` return send({ kind: "chant-policy", ok: false, offenders: err.offenders });`,
|
|
283
|
+
` }`,
|
|
284
|
+
` return send({ kind: "chant-policy", ok: false, error: classifyChildError(file, err, type).toJSON() });`,
|
|
285
|
+
`}`,
|
|
286
|
+
``,
|
|
287
|
+
// The wrapper described in the doc above: same id/description so any
|
|
288
|
+
// chant-side reporting keyed off them is unchanged, same ctx, same return
|
|
289
|
+
// value — plus the per-check serializability scan.
|
|
290
|
+
`function guard(check, policy) {`,
|
|
291
|
+
` return {`,
|
|
292
|
+
` id: check.id,`,
|
|
293
|
+
` description: check.description,`,
|
|
294
|
+
` check(ctx) {`,
|
|
295
|
+
` const produced = check.check(ctx);`,
|
|
296
|
+
` const offenders = scanPolicyDiagnostics(produced, policy);`,
|
|
297
|
+
` if (offenders.length > 0) throw new PolicyWireError(offenders);`,
|
|
298
|
+
` return produced;`,
|
|
299
|
+
` },`,
|
|
300
|
+
` };`,
|
|
301
|
+
`}`,
|
|
302
|
+
``,
|
|
303
|
+
`async function main(request) {`,
|
|
304
|
+
` let buildResult;`,
|
|
305
|
+
` try {`,
|
|
306
|
+
` buildResult = decodePolicyBuildResult(request.buildResult);`,
|
|
307
|
+
` } catch (err) {`,
|
|
308
|
+
` await fail("", err, "resolution");`,
|
|
309
|
+
` return;`,
|
|
310
|
+
` }`,
|
|
311
|
+
``,
|
|
312
|
+
` const checks = [];`,
|
|
313
|
+
];
|
|
314
|
+
// One block per policy module, in the order `lint.policies` declares them —
|
|
315
|
+
// the same order `loadPolicyChecks` collects in, so the diagnostics sequence
|
|
316
|
+
// matches the in-process one exactly.
|
|
317
|
+
for (const policyPath of policyPaths) {
|
|
318
|
+
lines.push(` try {`, ` const mod = await import(${lit(policyPath)});`, ` for (const value of Object.values(mod)) {`, ` if (isPostSynthCheck(value)) checks.push(guard(value, ${lit(policyPath)}));`, ` }`, ` } catch (err) {`, ` await fail(${lit(policyPath)}, err, "import");`, ` return;`, ` }`);
|
|
319
|
+
}
|
|
320
|
+
lines.push(``, ` let diagnostics;`, ` try {`, ` diagnostics = runPostSynthChecks(checks, buildResult, request.env ?? undefined);`, ` } catch (err) {`, ` await fail("", err, "resolution");`, ` return;`, ` }`, ``, ` await send({ kind: "chant-policy", ok: true, diagnostics });`, `}`, ``,
|
|
321
|
+
// Registered synchronously at module top level — see the doc above on why
|
|
322
|
+
// that is what makes the parent's send-before-boot safe.
|
|
323
|
+
//
|
|
324
|
+
// Removed again as soon as the input arrives, and that is not tidiness: a
|
|
325
|
+
// `message` listener REFS the IPC channel, so leaving it registered would
|
|
326
|
+
// keep this child's event loop alive after it had already answered — and a
|
|
327
|
+
// live channel keeps the PARENT's alive too. `chant build` would not have
|
|
328
|
+
// noticed (`cli/main.ts` ends in `process.exit`); anything embedding chant
|
|
329
|
+
// as a library would have hung. `./fork.ts` kills the child on receipt as
|
|
330
|
+
// the other half of the same fix.
|
|
331
|
+
`let started = false;`, `function onRequest(request) {`, ` if (started) return;`, ` if (!request || request.kind !== "chant-policy-request") return;`, ` started = true;`, ` process.off("message", onRequest);`, ` main(request).catch((err) => fail("", err, "resolution"));`, `}`, `process.on("message", onRequest);`);
|
|
332
|
+
return lines.join("\n");
|
|
333
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { fork } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* chant #1148 — buffers arbitrary chunks and calls `emit` once per complete
|
|
4
|
+
* line, never on a chunk boundary that happens to split a line in two (a
|
|
5
|
+
* pipe makes no promise that one `write()` on the child's side arrives as one
|
|
6
|
+
* `data` event on ours). `flush()` emits whatever partial line never got a
|
|
7
|
+
* trailing newline, so the last unterminated write doesn't silently vanish
|
|
8
|
+
* when the stream ends — the same no-dropping stance this whole feature
|
|
9
|
+
* exists for.
|
|
10
|
+
*/
|
|
11
|
+
function lineBuffered(emit) {
|
|
12
|
+
let pending = "";
|
|
13
|
+
return {
|
|
14
|
+
push(chunk) {
|
|
15
|
+
pending += chunk.toString();
|
|
16
|
+
let newlineAt = pending.indexOf("\n");
|
|
17
|
+
while (newlineAt !== -1) {
|
|
18
|
+
emit(pending.slice(0, newlineAt));
|
|
19
|
+
pending = pending.slice(newlineAt + 1);
|
|
20
|
+
newlineAt = pending.indexOf("\n");
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
flush() {
|
|
24
|
+
if (pending.length > 0) {
|
|
25
|
+
emit(pending);
|
|
26
|
+
pending = "";
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fork `bundlePath` under `--permission` with a scrubbed environment, and
|
|
33
|
+
* resolve with the first IPC message that satisfies `isResponse` (or reject
|
|
34
|
+
* on crash / timeout / fork error).
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* Why a child ended without a usable result, in terms a reader can act on.
|
|
38
|
+
*
|
|
39
|
+
* chant#2461 — this used to be one sentence, `child exited before reporting
|
|
40
|
+
* results (code N, signal S)`, for three unrelated situations. The one that
|
|
41
|
+
* was observed in the wild is the hardest to read: exit code 0, empty stderr,
|
|
42
|
+
* no message. That reads like the child was cut off, and it was not: it ran
|
|
43
|
+
* to completion.
|
|
44
|
+
*
|
|
45
|
+
* The observed case turned out to be the parent's fault. A config child that
|
|
46
|
+
* sent its result and exited could have its `exit` dispatched here BEFORE its
|
|
47
|
+
* already-written `message`, and the old `exit` handler settled on the spot.
|
|
48
|
+
* The payload arrived a moment later and was ignored. Stress runs of the real
|
|
49
|
+
* `evaluateConfigSandboxed`, 24 at a time under 16 CPU hogs, lost 3 of 800 and
|
|
50
|
+
* 13 of 1500 that way. An earlier test that blocked the parent had seen
|
|
51
|
+
* `message` win 60 of 60, which is why this was ruled out for a while.
|
|
52
|
+
* {@link settleOnExitAfterChannelDrains} closes it by not reading the exit
|
|
53
|
+
* until the IPC channel has drained. Every driver also awaits its
|
|
54
|
+
* `process.send` callback and exits 1 with a stderr line if the send fails
|
|
55
|
+
* (see `./driver.ts`'s `sendFunctionSource`), so a result that never left the
|
|
56
|
+
* child cannot look like exit 0 either.
|
|
57
|
+
*
|
|
58
|
+
* With both of those in place, exit 0 with nothing on stderr and nothing
|
|
59
|
+
* received has one known cause left: an `await` that never settles.
|
|
60
|
+
* `main().catch(...)` catches a REJECTION, and a promise that never settles is
|
|
61
|
+
* not one, so if nothing keeps the loop alive Node drains it and exits 0
|
|
62
|
+
* having sent nothing. On the RUN path that is reproducible: the driver does
|
|
63
|
+
* `await import(<project file>)` per run-fallback file, module scope is
|
|
64
|
+
* arbitrary project source, and a file whose top level never settles makes
|
|
65
|
+
* that import never complete (the run driver names the file on stderr in that
|
|
66
|
+
* case). The CONFIG driver bundles to one microtask over synchronous code with
|
|
67
|
+
* no runtime imports, so on that path the cause is not known, and the message
|
|
68
|
+
* says so rather than guessing.
|
|
69
|
+
*/
|
|
70
|
+
function describeSilentExit(label, code, signal, stderrBuf, unrecognised) {
|
|
71
|
+
const stderr = stderrBuf.trim();
|
|
72
|
+
const head = `${label}: child exited before reporting results (code ${code}, signal ${signal})`;
|
|
73
|
+
if (unrecognised.length > 0) {
|
|
74
|
+
// It DID send. The parent refused the shape, which is a bug in one of them
|
|
75
|
+
// and not the child dying early.
|
|
76
|
+
const shapes = unrecognised
|
|
77
|
+
.map((m) => (m && typeof m === "object" ? `{${Object.keys(m).join(", ")}}` : typeof m))
|
|
78
|
+
.join(", ");
|
|
79
|
+
return (`${head}. It sent ${unrecognised.length} message(s) the parent did not recognise (${shapes}), ` +
|
|
80
|
+
`so the payload shape and the parent's check disagree` +
|
|
81
|
+
(stderr ? `: ${stderr}` : ""));
|
|
82
|
+
}
|
|
83
|
+
if (stderr)
|
|
84
|
+
return `${head}: ${stderr}`;
|
|
85
|
+
if (code !== 0 || signal !== null)
|
|
86
|
+
return head;
|
|
87
|
+
// Exit 0, nothing on stderr, and nothing received even after the IPC
|
|
88
|
+
// channel drained. See this function's doc for what is and is not left.
|
|
89
|
+
return (`${head}. It exited cleanly with nothing on stderr, and no message arrived even after its ` +
|
|
90
|
+
`IPC channel closed, so it never sent one: something it awaited never settled. On the run ` +
|
|
91
|
+
`path the usual cause is a project file with a top-level \`await\` that does not settle. ` +
|
|
92
|
+
`Module scope is arbitrary project source, an import of such a file never completes, and a ` +
|
|
93
|
+
`promise that never settles is not a rejection, so the driver's own \`main().catch\` does ` +
|
|
94
|
+
`not see it either. The config driver has nothing to await that can hang, and a failed ` +
|
|
95
|
+
`send exits non-zero with a reason on stderr, so on the config path this has no known ` +
|
|
96
|
+
`cause: please report it with the command that produced it (chant#2461).`);
|
|
97
|
+
}
|
|
98
|
+
/** How long {@link settleOnExitAfterChannelDrains} waits, after exit, for the IPC channel to report closed. Normally it takes well under a millisecond; this only bounds a channel that never does. */
|
|
99
|
+
const EXIT_DRAIN_GRACE_MS = 2000;
|
|
100
|
+
/**
|
|
101
|
+
* chant#2461 — call `onExit` once `child` has exited AND its IPC channel has
|
|
102
|
+
* drained, so a message the child wrote before exiting is always dispatched
|
|
103
|
+
* first.
|
|
104
|
+
*
|
|
105
|
+
* Node does not order `exit` after `message`. The child's exit and the last
|
|
106
|
+
* bytes on the IPC socket reach the parent's event loop as separate events,
|
|
107
|
+
* and under load the exit can be handled first even though the child wrote
|
|
108
|
+
* the message before it exited. Settling on `exit` alone then drops a payload
|
|
109
|
+
* that is already sitting in the socket. The channel reports `disconnect`
|
|
110
|
+
* only after it has read EOF, which comes after every message the child
|
|
111
|
+
* wrote, so waiting for it is exact.
|
|
112
|
+
*
|
|
113
|
+
* This is deliberately not `close`. `close` also waits for stdout and stderr
|
|
114
|
+
* to end, and a grandchild holding those pipes would turn a fast failure into
|
|
115
|
+
* the full timeout. The wait here is on the IPC channel alone, and is bounded
|
|
116
|
+
* by `graceMs` in case that channel never reports closed.
|
|
117
|
+
*/
|
|
118
|
+
export function settleOnExitAfterChannelDrains(child, onExit, graceMs = EXIT_DRAIN_GRACE_MS) {
|
|
119
|
+
child.on("exit", (code, signal) => {
|
|
120
|
+
let done = false;
|
|
121
|
+
let grace;
|
|
122
|
+
const finish = () => {
|
|
123
|
+
if (done)
|
|
124
|
+
return;
|
|
125
|
+
done = true;
|
|
126
|
+
if (grace !== undefined)
|
|
127
|
+
clearTimeout(grace);
|
|
128
|
+
onExit(code, signal);
|
|
129
|
+
};
|
|
130
|
+
if (!child.connected) {
|
|
131
|
+
finish();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
child.once("disconnect", finish);
|
|
135
|
+
grace = setTimeout(finish, graceMs);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
export function forkSandboxed(options, isResponse) {
|
|
139
|
+
const { bundlePath, bundleDir, projectRealpath, externalReadPaths, env, timeoutMs, label, send, outputPrefix } = options;
|
|
140
|
+
return new Promise((resolvePromise, reject) => {
|
|
141
|
+
const readAllowances = [bundleDir, projectRealpath, ...externalReadPaths].map((p) => `--allow-fs-read=${p}`);
|
|
142
|
+
const child = fork(bundlePath, [], {
|
|
143
|
+
execArgv: ["--permission", ...readAllowances],
|
|
144
|
+
env,
|
|
145
|
+
stdio: ["ignore", "pipe", "pipe", "ipc"],
|
|
146
|
+
});
|
|
147
|
+
let settled = false;
|
|
148
|
+
let stderrBuf = "";
|
|
149
|
+
/** Messages the child sent that `isResponse` refused — see the `message` handler. */
|
|
150
|
+
const unrecognised = [];
|
|
151
|
+
const timeout = setTimeout(() => {
|
|
152
|
+
if (settled)
|
|
153
|
+
return;
|
|
154
|
+
settled = true;
|
|
155
|
+
child.kill();
|
|
156
|
+
reject(new Error(`${label} timed out after ${timeoutMs}ms`));
|
|
157
|
+
}, timeoutMs);
|
|
158
|
+
if (send !== undefined) {
|
|
159
|
+
child.send(send, (err) => {
|
|
160
|
+
if (settled || !err)
|
|
161
|
+
return;
|
|
162
|
+
settled = true;
|
|
163
|
+
clearTimeout(timeout);
|
|
164
|
+
child.kill();
|
|
165
|
+
reject(new Error(`${label}: failed to send the child its input: ${err.message}`));
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// chant #1148 — forward, don't just capture. Both streams write to THIS
|
|
169
|
+
// process's stderr, prefixed and line-buffered, independent of
|
|
170
|
+
// `stderrBuf` below (which keeps accumulating raw stderr for
|
|
171
|
+
// `classifyChildError`'s use — forwarded and captured are not mutually
|
|
172
|
+
// exclusive, the same bytes feed both).
|
|
173
|
+
const forwardLine = (line) => {
|
|
174
|
+
process.stderr.write(`${outputPrefix} ${line}\n`);
|
|
175
|
+
};
|
|
176
|
+
const stdoutForwarder = lineBuffered(forwardLine);
|
|
177
|
+
const stderrForwarder = lineBuffered(forwardLine);
|
|
178
|
+
child.stdout?.on("data", (chunk) => {
|
|
179
|
+
stdoutForwarder.push(chunk);
|
|
180
|
+
});
|
|
181
|
+
child.stdout?.on("end", () => stdoutForwarder.flush());
|
|
182
|
+
child.stderr?.on("data", (chunk) => {
|
|
183
|
+
stderrBuf += chunk.toString();
|
|
184
|
+
stderrForwarder.push(chunk);
|
|
185
|
+
});
|
|
186
|
+
child.stderr?.on("end", () => stderrForwarder.flush());
|
|
187
|
+
child.on("message", (msg) => {
|
|
188
|
+
if (settled)
|
|
189
|
+
return;
|
|
190
|
+
if (!isResponse(msg)) {
|
|
191
|
+
// chant#2461 — remember it rather than dropping it. A child that sent
|
|
192
|
+
// something the parent does not recognise is a different failure from
|
|
193
|
+
// a child that sent nothing, and both used to arrive as "exited before
|
|
194
|
+
// reporting results" with no way to tell them apart.
|
|
195
|
+
unrecognised.push(msg);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
settled = true;
|
|
199
|
+
clearTimeout(timeout);
|
|
200
|
+
// chant #1131 — the child's entire job is to send this one message, so
|
|
201
|
+
// once it has arrived there is nothing left to wait for. Killing it here
|
|
202
|
+
// rather than hoping it exits on its own closes a real hang: an open
|
|
203
|
+
// handle on the child side (a `setInterval` in project source, an
|
|
204
|
+
// `http.Server` a policy started, or simply an IPC listener the driver
|
|
205
|
+
// registered to RECEIVE its input) keeps the child's event loop alive,
|
|
206
|
+
// and a live IPC channel then keeps the PARENT's alive too. `chant build`
|
|
207
|
+
// never noticed because `cli/main.ts` ends with `process.exit`; anything
|
|
208
|
+
// embedding chant as a library would have hung forever.
|
|
209
|
+
child.kill();
|
|
210
|
+
resolvePromise(msg);
|
|
211
|
+
});
|
|
212
|
+
child.on("error", (err) => {
|
|
213
|
+
if (settled)
|
|
214
|
+
return;
|
|
215
|
+
settled = true;
|
|
216
|
+
clearTimeout(timeout);
|
|
217
|
+
reject(err);
|
|
218
|
+
});
|
|
219
|
+
// chant#2461 — not `child.on("exit")`: a payload can still be in the IPC
|
|
220
|
+
// socket when the exit is handled. See settleOnExitAfterChannelDrains.
|
|
221
|
+
settleOnExitAfterChannelDrains(child, (code, signal) => {
|
|
222
|
+
if (settled)
|
|
223
|
+
return;
|
|
224
|
+
settled = true;
|
|
225
|
+
clearTimeout(timeout);
|
|
226
|
+
reject(new Error(describeSilentExit(label, code, signal, stderrBuf, unrecognised)));
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
}
|