@intentius/chant 0.124.12 → 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.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- 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.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- 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.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.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.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- 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.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- 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 +36 -6
- 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/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -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/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -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/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- 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 +5 -30
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #3862: `identityGateAdmissionAt` judges an `identity.gates` approval from a
|
|
3
|
+
* bare clone at a base commit as chant's `gateAdmission(cwd, gate, base)`
|
|
4
|
+
* does: the seal against the signers at base, and the class against the role
|
|
5
|
+
* grants at base. Each fixture is judged both ways and the answers compared,
|
|
6
|
+
* reasons included.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { afterAll, afterEach, beforeAll, describe, expect, test } from "vitest";
|
|
10
|
+
import {
|
|
11
|
+
admitApprover,
|
|
12
|
+
CORE_CLASSES,
|
|
13
|
+
decideGateApproval,
|
|
14
|
+
GATE_SEAL_NAMESPACE,
|
|
15
|
+
gateSealPayload,
|
|
16
|
+
identityGateAdmissionAt,
|
|
17
|
+
type GateResolutionRecord,
|
|
18
|
+
} from "./gate-decision";
|
|
19
|
+
import { gateAdmission } from "./workspace/identity";
|
|
20
|
+
import { hasSshKeygen, TestRepo, type Key } from "./workspace/trust/test-repo";
|
|
21
|
+
import { evaluateGate, memoryGateLedgerPort } from "./op/gate";
|
|
22
|
+
|
|
23
|
+
const D1 = "sha256:" + "a".repeat(64);
|
|
24
|
+
const GATES = { ship: {}, deploy: { class: "human" }, release: { class: "runner" }, ops: { class: "operator" } };
|
|
25
|
+
const NAMES = [...Object.keys(GATES), "undeclared"];
|
|
26
|
+
|
|
27
|
+
describe.skipIf(!hasSshKeygen)("identity.gates read at base, as chant reads it", () => {
|
|
28
|
+
const repos: TestRepo[] = [];
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
while (repos.length) repos.pop()!.cleanup();
|
|
31
|
+
});
|
|
32
|
+
// Keys and seals are made once, by ssh-keygen, and shared by every fixture.
|
|
33
|
+
let signer: TestRepo;
|
|
34
|
+
let k: Record<"alice" | "bob" | "carol" | "mallory", Key>;
|
|
35
|
+
const sigs = new Map<string, string>();
|
|
36
|
+
beforeAll(() => {
|
|
37
|
+
signer = new TestRepo("3862-keys");
|
|
38
|
+
k = { alice: signer.key("alice"), bob: signer.key("bob"), carol: signer.key("carol"), mallory: signer.key("mallory") };
|
|
39
|
+
});
|
|
40
|
+
afterAll(() => signer.cleanup());
|
|
41
|
+
const sign = (key: Key, payload: Buffer): string => {
|
|
42
|
+
const id = `${key.name}\n${payload.toString("utf-8")}`;
|
|
43
|
+
if (!sigs.has(id)) sigs.set(id, signer.sshSign(key, payload, GATE_SEAL_NAMESPACE));
|
|
44
|
+
return sigs.get(id)!;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function setup(files: (k: Record<string, Key>) => Record<string, string>, declaration: Record<string, unknown> = {}) {
|
|
48
|
+
const r = new TestRepo("3862-identity");
|
|
49
|
+
repos.push(r);
|
|
50
|
+
r.write("chant.workspace.json", JSON.stringify({ name: "acme", schema: 1, members: [], identity: { gates: GATES }, ...declaration }));
|
|
51
|
+
for (const [path, text] of Object.entries(files(k))) r.write(path, text);
|
|
52
|
+
const base = r.commit("base");
|
|
53
|
+
// The change being applied lists mallory and makes alice a runner; neither counts at base.
|
|
54
|
+
r.write(".chant/allowed_signers", `alice ${k.alice.pub}\nbob ${k.bob.pub}\nmallory ${k.mallory.pub}\n`);
|
|
55
|
+
r.write(".chant/trust.json", JSON.stringify({ schema: 1, roles: { runner: ["alice", "bob"] } }));
|
|
56
|
+
r.commit("widens the policy");
|
|
57
|
+
const approval = (gate: string, resolvedBy: string, extra: Partial<GateResolutionRecord> = {}): GateResolutionRecord => ({
|
|
58
|
+
version: 1, op: "web", gate, resolvedBy, timestamp: "2026-10-11T11:00:00.000Z", planDigest: D1, ...extra,
|
|
59
|
+
});
|
|
60
|
+
const seal = (a: GateResolutionRecord, key: Key, signer = a.resolvedBy): GateResolutionRecord => ({
|
|
61
|
+
...a,
|
|
62
|
+
seal: { signer, key: "k", signature: sign(key, gateSealPayload(a)) },
|
|
63
|
+
});
|
|
64
|
+
const made = new Map<string, GateResolutionRecord[]>();
|
|
65
|
+
const approvals = (gate: string): GateResolutionRecord[] => made.get(gate) ?? (made.set(gate, approvalsOf(gate)), made.get(gate)!);
|
|
66
|
+
const approvalsOf = (gate: string): GateResolutionRecord[] => [
|
|
67
|
+
approval(gate, "alice"),
|
|
68
|
+
seal(approval(gate, "alice"), k.alice),
|
|
69
|
+
seal(approval(gate, "BOB "), k.bob, "bob"),
|
|
70
|
+
seal(approval(gate, "mallory"), k.mallory),
|
|
71
|
+
seal(approval(gate, "carol"), k.carol),
|
|
72
|
+
seal(approval(gate, "alice"), k.bob),
|
|
73
|
+
seal(approval(gate, "alice"), k.alice, "bob"),
|
|
74
|
+
{ ...approval(gate, "alice"), seal: { signer: "alice" } as unknown as GateResolutionRecord["seal"] },
|
|
75
|
+
{ ...seal(approval(gate, "alice"), k.alice), planDigest: "sha256:" + "b".repeat(64) },
|
|
76
|
+
];
|
|
77
|
+
return { r, base, approvals };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Every approval of every gate, judged by both readers: the pairs, and the reasons gate-decision gave. */
|
|
81
|
+
function judgeBoth(r: TestRepo, base: string, approvals: (gate: string) => GateResolutionRecord[]) {
|
|
82
|
+
const ours: Record<string, (string | null)[] | null> = {};
|
|
83
|
+
for (const gate of NAMES) {
|
|
84
|
+
const here = identityGateAdmissionAt(r.dir, base, gate);
|
|
85
|
+
const chant = gateAdmission(r.dir, gate, base);
|
|
86
|
+
expect(here === null, gate).toBe(chant === null);
|
|
87
|
+
if (here === null || chant === null) {
|
|
88
|
+
ours[gate] = null;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
expect(here.requirement).toEqual({ gate, class: chant.requirement.class });
|
|
92
|
+
const reasons = approvals(gate).map((a) => here.refuses(a));
|
|
93
|
+
expect(reasons, gate).toEqual(approvals(gate).map((a) => chant.refuses(a)));
|
|
94
|
+
ours[gate] = reasons;
|
|
95
|
+
}
|
|
96
|
+
return ours;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
test("signers, role grants and classes at base, approval by approval", () => {
|
|
100
|
+
const { r, base, approvals } = setup((k) => ({
|
|
101
|
+
".chant/allowed_signers": `alice ${k.alice.pub}\nbob ${k.bob.pub}\ncarol namespaces="git" ${k.carol.pub}\n`,
|
|
102
|
+
".chant/trust.json": JSON.stringify({ schema: 1, roles: { runner: ["Bob"] } }),
|
|
103
|
+
}));
|
|
104
|
+
const ours = judgeBoth(r, base, approvals);
|
|
105
|
+
expect(ours.undeclared).toBeNull();
|
|
106
|
+
const passed = (gate: string) => ours[gate]!.flatMap((reason, i) => (reason === null ? [i] : []));
|
|
107
|
+
// Any signer: alice and bob, each with their own key. Not mallory (listed after base), not carol (no chant-gate namespace).
|
|
108
|
+
expect(passed("ship")).toEqual([1, 2]);
|
|
109
|
+
// human: alice; bob holds the runner role at base.
|
|
110
|
+
expect(passed("deploy")).toEqual([1]);
|
|
111
|
+
expect(ours.deploy![2]).toMatch(/^BOB is not in the class human that gate deploy needs/);
|
|
112
|
+
// runner: bob, by the grant at base; alice's grant comes after base.
|
|
113
|
+
expect(passed("release")).toEqual([2]);
|
|
114
|
+
expect(ours.release![1]).toBe("alice is not in the class runner that gate release needs: no role grant at base puts them there");
|
|
115
|
+
// operator: no pinned package supplies it.
|
|
116
|
+
expect(passed("ops")).toEqual([]);
|
|
117
|
+
expect(ours.ops![1]).toMatch(/names the class operator, which no pinned package supplies, .*known classes: human, agent, runner, service/);
|
|
118
|
+
expect(ours.ship![0]).toBe("the approval by alice is not signed; gate ship needs chant approve --sign");
|
|
119
|
+
expect(ours.ship![3]).toBe("mallory has no key in .chant/allowed_signers at base, so the seal can't count");
|
|
120
|
+
expect(ours.ship![4]).toMatch(/^the seal does not verify for carol against \.chant\/allowed_signers at base/);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("a signers path trust.json names", () => {
|
|
124
|
+
const named = setup((k) => ({
|
|
125
|
+
".chant/trust.json": JSON.stringify({ schema: 1, signers: "ops/signers", roles: { runner: ["alice"] } }),
|
|
126
|
+
"ops/signers": `alice ${k.alice.pub}\n`,
|
|
127
|
+
}));
|
|
128
|
+
expect(judgeBoth(named.r, named.base, named.approvals).release![1]).toBeNull();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("no signers file at base, and a trust.json chant refuses", () => {
|
|
132
|
+
const none = setup(() => ({ "README.md": "x\n" }));
|
|
133
|
+
expect(judgeBoth(none.r, none.base, none.approvals).ship![1]).toBe("gate ship needs a signed approval, and there is no signers file (.chant/allowed_signers) at base to check one against");
|
|
134
|
+
|
|
135
|
+
const invalid = setup((k) => ({
|
|
136
|
+
".chant/trust.json": JSON.stringify({ schema: 1, roles: { Admin: ["alice"] } }),
|
|
137
|
+
".chant/allowed_signers": `alice ${k.alice.pub}\n`,
|
|
138
|
+
}));
|
|
139
|
+
expect(judgeBoth(invalid.r, invalid.base, invalid.approvals).ship![1]).toMatch(/no signers file/);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("a domain class the caller read from a pin, and a pin this reader does not load", () => {
|
|
143
|
+
const { r, base, approvals } = setup(
|
|
144
|
+
(k) => ({ ".chant/allowed_signers": `alice ${k.alice.pub}\n`, ".chant/trust.json": JSON.stringify({ schema: 1, roles: { operator: ["alice"] } }) }),
|
|
145
|
+
{ pins: [{ package: "@acme/ops-classes", version: "1.0.0" }] },
|
|
146
|
+
);
|
|
147
|
+
const unread = identityGateAdmissionAt(r.dir, base, "ops")!;
|
|
148
|
+
expect(unread.refuses(approvals("ops")[1])).toMatch(/is not a core class, and this reader does not load the classes the pinned packages in chant\.workspace\.json at base supply/);
|
|
149
|
+
const read = identityGateAdmissionAt(r.dir, base, "ops", { classes: [{ name: "operator", role: "operator" }] })!;
|
|
150
|
+
expect(read.refuses(approvals("ops")[1])).toBeNull();
|
|
151
|
+
expect(read.refuses(approvals("ops")[0])).toMatch(/not signed/);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test("passed to decideGateApproval as refuses, it counts what chant's wave gate counts", async () => {
|
|
155
|
+
const { r, base, approvals } = setup((k) => ({
|
|
156
|
+
".chant/allowed_signers": `alice ${k.alice.pub}\nbob ${k.bob.pub}\n`,
|
|
157
|
+
".chant/trust.json": JSON.stringify({ schema: 1, roles: { runner: ["bob"] } }),
|
|
158
|
+
}));
|
|
159
|
+
const here = identityGateAdmissionAt(r.dir, base, "release")!;
|
|
160
|
+
const chant = gateAdmission(r.dir, "release", base)!;
|
|
161
|
+
for (const resolutions of [approvals("release").slice(0, 2), approvals("release")]) {
|
|
162
|
+
const decided = decideGateApproval({ ledger: { pending: [], resolutions }, gate: "release", planDigest: D1, refuses: here.refuses, now: "2026-10-11T12:00:00.000Z" });
|
|
163
|
+
const port = { ...memoryGateLedgerPort({ pending: [], resolutions }), approvalRule: async () => chant };
|
|
164
|
+
const check = await evaluateGate(port, { op: "web", gate: "release", planDigest: D1, now: "2026-10-11T12:00:00.000Z" });
|
|
165
|
+
expect(decided.status === "approved" && decided.via === "ledger" ? decided.resolution : null).toEqual(check.satisfied ? check.resolution : null);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
describe("admitApprover", () => {
|
|
171
|
+
test("is the rule gateAdmission judges by: a class it does not know refuses before the seal is read", () => {
|
|
172
|
+
const rule = { gate: "ship", class: "operator", signers: { signersPath: ".chant/allowed_signers", active: false, signers: [] }, roles: {}, classes: CORE_CLASSES };
|
|
173
|
+
expect(admitApprover(rule, { op: "web", gate: "ship", resolvedBy: "alice", timestamp: "t" })).toMatch(/no pinned package supplies/);
|
|
174
|
+
expect(admitApprover({ ...rule, class: null }, { op: "web", gate: "ship", resolvedBy: "alice", timestamp: "t" })).toMatch(/no signers file/);
|
|
175
|
+
});
|
|
176
|
+
});
|
package/src/gate-decision.ts
CHANGED
|
@@ -16,6 +16,12 @@
|
|
|
16
16
|
* approving review, when its head planned this digest
|
|
17
17
|
* ({@link reviewApproval}).
|
|
18
18
|
*
|
|
19
|
+
* A gate the declaration at base names under `identity.gates` counts only a
|
|
20
|
+
* sealed approval from its class: {@link identityGateAdmissionAt} reads that
|
|
21
|
+
* rule from a bare clone at base and judges by `admitApprover`, the function
|
|
22
|
+
* chant's `gateAdmission` judges by (#3862); pass its `refuses` to
|
|
23
|
+
* {@link decideGateApproval}.
|
|
24
|
+
*
|
|
19
25
|
* With `spend` (#3784), an approval a wave already applied under is spent and
|
|
20
26
|
* counts for nothing, as terragucci's wave gate has it: the caller hands in
|
|
21
27
|
* the lines of `_gates/<op>/applied.jsonl` ({@link parseAppliedGateLines}).
|
|
@@ -36,7 +42,7 @@ import {
|
|
|
36
42
|
} from "./lifecycle/gate-ledger-select";
|
|
37
43
|
import { samePlanDigest } from "./lifecycle/plan-digest";
|
|
38
44
|
import { isApprovalSpent, type AppliedGateRecord } from "./lifecycle/gate-applied";
|
|
39
|
-
import { gateSealRefusal, type GateSigners } from "./workspace/trust/gate-seal";
|
|
45
|
+
import { gateSealRefusal, type GateSigners, type SealedGateApproval } from "./workspace/trust/gate-seal";
|
|
40
46
|
import {
|
|
41
47
|
DEFAULT_SIGNERS_PATH,
|
|
42
48
|
TRUST_CONFIG_PATH,
|
|
@@ -44,6 +50,7 @@ import {
|
|
|
44
50
|
trustConfigProblems,
|
|
45
51
|
} from "./workspace/trust/trust-files";
|
|
46
52
|
import { parseJsonText } from "./workspace/jsonc";
|
|
53
|
+
import { CORE_CLASSES, admitApprover, type ClassGrant, type GateAdmissionRule } from "./workspace/identity-gate-rule";
|
|
47
54
|
import type { GateResolutionRecord, PendingGateRecord } from "./lifecycle/gate-ledger";
|
|
48
55
|
import type { MergedReview } from "./op/gate-review";
|
|
49
56
|
import type { GateApprovalSource } from "./op/op-waves";
|
|
@@ -75,6 +82,14 @@ export {
|
|
|
75
82
|
type SignerSet,
|
|
76
83
|
} from "./workspace/trust/trust-files";
|
|
77
84
|
export type { GateResolutionRecord, PendingGateRecord } from "./lifecycle/gate-ledger";
|
|
85
|
+
export {
|
|
86
|
+
CORE_CLASSES,
|
|
87
|
+
admitApprover,
|
|
88
|
+
grantedClasses,
|
|
89
|
+
type ClassGrant,
|
|
90
|
+
type GateAdmissionRule,
|
|
91
|
+
type PrincipalClass,
|
|
92
|
+
} from "./workspace/identity-gate-rule";
|
|
78
93
|
export {
|
|
79
94
|
appliedGateApplies,
|
|
80
95
|
appliedGatePath,
|
|
@@ -117,17 +132,12 @@ export function baseCommit(repo: string): string {
|
|
|
117
132
|
return parent;
|
|
118
133
|
}
|
|
119
134
|
|
|
120
|
-
/**
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
* trust.json that is not valid (`trustConfigProblems`) turns attestation
|
|
124
|
-
* off, as it does in chant, so a sealed gate passes nothing. `base` is a
|
|
125
|
-
* commit the repository holds, such as {@link baseCommit}'s answer.
|
|
126
|
-
*/
|
|
127
|
-
export function gateSignersAt(repo: string, base: string): GateSigners {
|
|
128
|
-
const off = (problems: string[]): GateSigners => ({ base, signersPath: DEFAULT_SIGNERS_PATH, active: false, signers: [], problems });
|
|
135
|
+
/** The signers and role grants at `base`, as chant's trust policy reads them. */
|
|
136
|
+
function trustAt(repo: string, base: string): { signers: GateSigners; roles: Record<string, string[]> } {
|
|
137
|
+
const off = (problems: string[]) => ({ signers: { base, signersPath: DEFAULT_SIGNERS_PATH, active: false, signers: [], problems }, roles: {} });
|
|
129
138
|
const configText = showAt(repo, base, TRUST_CONFIG_PATH);
|
|
130
139
|
let signersPath = DEFAULT_SIGNERS_PATH;
|
|
140
|
+
let roles: Record<string, string[]> = {};
|
|
131
141
|
if (configText !== undefined) {
|
|
132
142
|
let raw: unknown;
|
|
133
143
|
try {
|
|
@@ -138,9 +148,21 @@ export function gateSignersAt(repo: string, base: string): GateSigners {
|
|
|
138
148
|
const problems = trustConfigProblems(raw);
|
|
139
149
|
if (problems.length > 0) return off([`${TRUST_CONFIG_PATH} is invalid: ${problems.join("; ")}`]);
|
|
140
150
|
signersPath = (raw as { signers?: string }).signers ?? DEFAULT_SIGNERS_PATH;
|
|
151
|
+
roles = (raw as { roles?: Record<string, string[]> }).roles ?? {};
|
|
141
152
|
}
|
|
142
153
|
const text = showAt(repo, base, signersPath);
|
|
143
|
-
return { base, signersPath, active: text !== undefined, signers: text === undefined ? [] : parseAllowedSigners(text).signers, problems: [] };
|
|
154
|
+
return { signers: { base, signersPath, active: text !== undefined, signers: text === undefined ? [] : parseAllowedSigners(text).signers, problems: [] }, roles };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The signers at `base`: the file `.chant/trust.json` names there, else
|
|
159
|
+
* `.chant/allowed_signers`, read as chant's trust policy reads it. A
|
|
160
|
+
* trust.json that is not valid (`trustConfigProblems`) turns attestation
|
|
161
|
+
* off, as it does in chant, so a sealed gate passes nothing. `base` is a
|
|
162
|
+
* commit the repository holds, such as {@link baseCommit}'s answer.
|
|
163
|
+
*/
|
|
164
|
+
export function gateSignersAt(repo: string, base: string): GateSigners {
|
|
165
|
+
return trustAt(repo, base).signers;
|
|
144
166
|
}
|
|
145
167
|
|
|
146
168
|
/** A gate the declaration at base names under `identity.gates`, and the principal class its signer must be in, if any. */
|
|
@@ -149,23 +171,79 @@ export interface IdentityGate {
|
|
|
149
171
|
class: string | null;
|
|
150
172
|
}
|
|
151
173
|
|
|
152
|
-
/**
|
|
153
|
-
|
|
154
|
-
* `identity.gates`: each counts only a sealed approval, from its class when
|
|
155
|
-
* it names one. chant checks the class against the role grants at base; this
|
|
156
|
-
* reads the names. Empty when there is no declaration at base. Throws when
|
|
157
|
-
* the declaration there cannot be parsed, since the gate cannot be decided.
|
|
158
|
-
*/
|
|
159
|
-
export function identityGatesAt(repo: string, base: string): IdentityGate[] {
|
|
174
|
+
/** The declaration at `base`, parsed, or null when there is none. Throws when it cannot be parsed. */
|
|
175
|
+
function declarationAt(repo: string, base: string): { file: string; value: unknown } | null {
|
|
160
176
|
for (const file of ["chant.workspace.json", "chant.workspace.jsonc"]) {
|
|
161
177
|
const text = showAt(repo, base, file);
|
|
162
178
|
if (text === undefined) continue;
|
|
163
179
|
const parsed = parseJsonText(text, { jsonc: file.endsWith(".jsonc") });
|
|
164
180
|
if (!parsed.ok) throw new Error(`${file} at base is not valid JSON (${parsed.message}), so the gate cannot be decided`);
|
|
165
|
-
|
|
166
|
-
return Object.entries(gates).map(([gate, entry]) => ({ gate, class: typeof entry?.class === "string" ? entry.class : null }));
|
|
181
|
+
return { file, value: parsed.value };
|
|
167
182
|
}
|
|
168
|
-
return
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function identityGatesOf(declaration: unknown): IdentityGate[] {
|
|
187
|
+
const gates = (declaration as { identity?: { gates?: Record<string, { class?: unknown } | null> } } | null)?.identity?.gates ?? {};
|
|
188
|
+
return Object.entries(gates).map(([gate, entry]) => ({ gate, class: typeof entry?.class === "string" ? entry.class : null }));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* The gates `chant.workspace.json` (or `.jsonc`) at `base` names under
|
|
193
|
+
* `identity.gates`: each counts only a sealed approval, from its class when
|
|
194
|
+
* it names one. {@link identityGateAdmissionAt} judges an approval by one.
|
|
195
|
+
* Empty when there is no declaration at base. Throws when the declaration
|
|
196
|
+
* there cannot be parsed, since the gate cannot be decided.
|
|
197
|
+
*/
|
|
198
|
+
export function identityGatesAt(repo: string, base: string): IdentityGate[] {
|
|
199
|
+
const declaration = declarationAt(repo, base);
|
|
200
|
+
return declaration === null ? [] : identityGatesOf(declaration.value);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** An `identity.gates` gate at base, and the judge for its approvals. */
|
|
204
|
+
export interface IdentityGateAdmission {
|
|
205
|
+
requirement: IdentityGate;
|
|
206
|
+
/** Why `approval` does not count toward the gate, or null when it does. Pass it to {@link decideGateApproval} as `refuses`. */
|
|
207
|
+
refuses(approval: SealedGateApproval): string | null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* The `identity.gates` rule for `gate` at `base`, or null when the
|
|
212
|
+
* declaration there names none: what chant's `gateAdmission(cwd, gate, base)`
|
|
213
|
+
* answers, read from a bare clone. An approval counts when its seal verifies
|
|
214
|
+
* for its approver against the signers at base and, when the gate names a
|
|
215
|
+
* class, the role grants in `.chant/trust.json` at base put the approver in
|
|
216
|
+
* it. Both judge with the same function ({@link admitApprover}).
|
|
217
|
+
*
|
|
218
|
+
* The classes are the four core ones, then `classes`, the domain classes the
|
|
219
|
+
* caller read from the pinned packages (`./workspace-principals`), in pin
|
|
220
|
+
* order. This reader loads no package. A gate whose class is in neither
|
|
221
|
+
* refuses every approval, and when the declaration at base pins anything the
|
|
222
|
+
* reason says the pins were not read, since one of them may supply it.
|
|
223
|
+
* Throws when the declaration at base cannot be parsed.
|
|
224
|
+
*/
|
|
225
|
+
export function identityGateAdmissionAt(
|
|
226
|
+
repo: string,
|
|
227
|
+
base: string,
|
|
228
|
+
gate: string,
|
|
229
|
+
opts: { classes?: readonly ClassGrant[] } = {},
|
|
230
|
+
): IdentityGateAdmission | null {
|
|
231
|
+
const declaration = declarationAt(repo, base);
|
|
232
|
+
const requirement = declaration === null ? undefined : identityGatesOf(declaration.value).find((g) => g.gate === gate);
|
|
233
|
+
if (!requirement) return null;
|
|
234
|
+
const { signers, roles } = trustAt(repo, base);
|
|
235
|
+
const pins = (declaration!.value as { pins?: unknown }).pins;
|
|
236
|
+
const rule: GateAdmissionRule = {
|
|
237
|
+
gate,
|
|
238
|
+
class: requirement.class,
|
|
239
|
+
signers,
|
|
240
|
+
roles,
|
|
241
|
+
classes: [...CORE_CLASSES, ...(opts.classes ?? [])],
|
|
242
|
+
...(Array.isArray(pins) && pins.length > 0
|
|
243
|
+
? { unknownClass: `is not a core class, and this reader does not load the classes the pinned packages in ${declaration!.file} at base supply` }
|
|
244
|
+
: {}),
|
|
245
|
+
};
|
|
246
|
+
return { requirement, refuses: (a) => admitApprover(rule, a) };
|
|
169
247
|
}
|
|
170
248
|
|
|
171
249
|
// ── pr-review ────────────────────────────────────────────────────────────
|
package/src/lexicon-module.ts
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
import { createRequire } from "node:module";
|
|
28
28
|
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
29
29
|
import { pathToFileURL } from "node:url";
|
|
30
|
+
import { ensureTypeScriptLoader } from "./ts-loader";
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
33
|
* One `lexicons` entry: a package-backed name, or a name plus the module that
|
|
@@ -179,6 +180,7 @@ export async function importLexiconModule(name: string): Promise<Record<string,
|
|
|
179
180
|
const path = modulePaths.get(name);
|
|
180
181
|
if (path === undefined) return undefined;
|
|
181
182
|
try {
|
|
183
|
+
ensureTypeScriptLoader();
|
|
182
184
|
return (await import(path)) as Record<string, unknown>;
|
|
183
185
|
} catch (err) {
|
|
184
186
|
throw new Error(
|
|
@@ -259,6 +261,7 @@ export function resolveFromProject(spec: string, fromDir: string = process.cwd()
|
|
|
259
261
|
*/
|
|
260
262
|
export async function importLexiconPackage(spec: string, fromDir: string = process.cwd()): Promise<Record<string, unknown>> {
|
|
261
263
|
try {
|
|
264
|
+
ensureTypeScriptLoader();
|
|
262
265
|
return (await import(spec)) as Record<string, unknown>;
|
|
263
266
|
} catch (err) {
|
|
264
267
|
const pkg = packageNameOf(spec);
|
|
@@ -45,6 +45,7 @@ import { isNeverOverMcpGateOp } from "../op/gate-name";
|
|
|
45
45
|
import { sortedJsonReplacer } from "../utils";
|
|
46
46
|
import { currentGateOrigin, type GateOrigin } from "./gate-origin";
|
|
47
47
|
import type { GateApprover, GatePolicyDecision, ResolvedGateApproval } from "../op/gate-approval";
|
|
48
|
+
import type { GateApprovalSource } from "../op/op-waves";
|
|
48
49
|
import type { GateRunLocator } from "../op/gate-run-locator";
|
|
49
50
|
import { readBlobFromPath, readPathSha, readBlobBySha, writeBlobToPath, RefCASConflictError } from "./git";
|
|
50
51
|
|
|
@@ -288,6 +289,13 @@ export interface PendingGateRecord {
|
|
|
288
289
|
* the run produced, and `chant operator status` to show quorum progress.
|
|
289
290
|
*/
|
|
290
291
|
approval?: ResolvedGateApproval;
|
|
292
|
+
/**
|
|
293
|
+
* The approval mode an Op wave asked under (#3861): `ledger`, `pr-review` or
|
|
294
|
+
* `sealed`, as read at base. It says which approvals count for the gate, so a
|
|
295
|
+
* reader (behold, gate-audit) decides under the mode the wave used rather
|
|
296
|
+
* than inferring it from config. Not the quorum block in `approval`.
|
|
297
|
+
*/
|
|
298
|
+
approvalMode?: GateApprovalSource;
|
|
291
299
|
/**
|
|
292
300
|
* The open question this gate waits on, on a gate that asks a decision
|
|
293
301
|
* point (#3170). It is answered with `chant workspace points answer <id>`,
|
package/src/lint/config.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { Severity, RuleConfig } from "./rule";
|
|
|
6
6
|
import type { PostSynthDiagnostic } from "./post-synth";
|
|
7
7
|
import { moduleDir, getRuntime } from "../runtime-adapter";
|
|
8
8
|
import { canonicalRuleId, type RuleMeta } from "../audit/catalog";
|
|
9
|
-
import strictPreset from "./presets/strict.json";
|
|
9
|
+
import strictPreset from "./presets/strict.json" with { type: "json" };
|
|
10
10
|
|
|
11
11
|
// chant #1117 — the upward config-discovery walk moved to a shared module
|
|
12
12
|
// (`../project-root`) so `chant build`/`lint.policies` use the identical walk
|
package/src/lint/discover.ts
CHANGED
|
@@ -10,17 +10,35 @@ import { join } from "path";
|
|
|
10
10
|
import { createRequire } from "module";
|
|
11
11
|
import type { LintRule } from "./rule";
|
|
12
12
|
import type { PostSynthCheck } from "./post-synth";
|
|
13
|
+
import { ensureTypeScriptLoader } from "../ts-loader";
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
let cjsTypeScript = false;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Register tsx so createRequire can load TypeScript files in Node.js ESM
|
|
19
|
+
* context. Does nothing when tsx is not available; then only pre-compiled .js
|
|
20
|
+
* files can be require()'d.
|
|
21
|
+
*
|
|
22
|
+
* From source this runs when the module loads, as it always has: vitest and
|
|
23
|
+
* the source CLI rely on tsx's CommonJS hook being in place from then on. The
|
|
24
|
+
* compiled CLI imports this module on every start and most commands read no
|
|
25
|
+
* rule directory, so there it waits for the first one (#3878).
|
|
26
|
+
*/
|
|
27
|
+
function registerTypeScriptRequire(): void {
|
|
28
|
+
if (cjsTypeScript) return;
|
|
29
|
+
cjsTypeScript = true;
|
|
30
|
+
if (ensureTypeScriptLoader()) return;
|
|
31
|
+
try {
|
|
32
|
+
const _req = createRequire(import.meta.url);
|
|
33
|
+
const { register } = _req("tsx/cjs/api") as { register: () => void };
|
|
34
|
+
register();
|
|
35
|
+
} catch {
|
|
36
|
+
// tsx not available; only pre-compiled .js files can be require()'d
|
|
37
|
+
}
|
|
22
38
|
}
|
|
23
39
|
|
|
40
|
+
if (!import.meta.url.endsWith(".js")) registerTypeScriptRequire();
|
|
41
|
+
|
|
24
42
|
/**
|
|
25
43
|
* Discover lint rules from a directory.
|
|
26
44
|
*
|
|
@@ -32,6 +50,7 @@ try {
|
|
|
32
50
|
* @param importMetaUrl - The caller's import.meta.url (for createRequire)
|
|
33
51
|
*/
|
|
34
52
|
export function discoverLintRules(dir: string, importMetaUrl: string): LintRule[] {
|
|
53
|
+
registerTypeScriptRequire();
|
|
35
54
|
const require = createRequire(importMetaUrl);
|
|
36
55
|
const rules: LintRule[] = [];
|
|
37
56
|
|
|
@@ -62,6 +81,7 @@ export function discoverLintRules(dir: string, importMetaUrl: string): LintRule[
|
|
|
62
81
|
* @param importMetaUrl - The caller's import.meta.url (for createRequire)
|
|
63
82
|
*/
|
|
64
83
|
export function discoverPostSynthChecks(dir: string, importMetaUrl: string): PostSynthCheck[] {
|
|
84
|
+
registerTypeScriptRequire();
|
|
65
85
|
const require = createRequire(importMetaUrl);
|
|
66
86
|
const checks: PostSynthCheck[] = [];
|
|
67
87
|
|
|
@@ -17,12 +17,14 @@
|
|
|
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.
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
+
import { ensureTypeScriptLoader } from "../ts-loader";
|
|
27
|
+
|
|
26
28
|
/** Whether this process must run project policy modules inside the sandbox boundary instead of here. */
|
|
27
29
|
let armed = false;
|
|
28
30
|
|
|
@@ -66,5 +68,6 @@ export async function importPolicyModule(policyPath: string): Promise<PolicyModu
|
|
|
66
68
|
`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).`,
|
|
67
69
|
);
|
|
68
70
|
}
|
|
71
|
+
ensureTypeScriptLoader();
|
|
69
72
|
return (await import(policyPath)) as PolicyModuleNamespace;
|
|
70
73
|
}
|
package/src/lint/rule-loader.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readdirSync, existsSync } from "fs";
|
|
2
2
|
import { dirname, join, resolve } from "path";
|
|
3
3
|
import type { LintRule } from "./rule";
|
|
4
|
+
import { ensureTypeScriptLoader } from "../ts-loader";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Type guard to check if a value conforms to the LintRule interface.
|
|
@@ -82,6 +83,7 @@ export async function loadLocalRules(projectDir: string): Promise<LintRule[]> {
|
|
|
82
83
|
const filePath = resolve(rulesDir, file);
|
|
83
84
|
let mod: Record<string, unknown>;
|
|
84
85
|
try {
|
|
86
|
+
ensureTypeScriptLoader();
|
|
85
87
|
mod = await import(filePath);
|
|
86
88
|
} catch (err) {
|
|
87
89
|
throw new Error(
|
package/src/op/discover.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { walkDiscovery, workspaceMemberDirs } from "../discovery/walk";
|
|
|
6
6
|
import { hasDiscoveryMarkerSync } from "../discovery/files";
|
|
7
7
|
import { resolveDiscoveryGlobs } from "../config";
|
|
8
8
|
import { isStewardDeclaration, type StewardDeclaration } from "./steward";
|
|
9
|
+
import { ensureTypeScriptLoader } from "../ts-loader";
|
|
9
10
|
|
|
10
11
|
export interface DiscoveredOp {
|
|
11
12
|
config: OpConfig;
|
|
@@ -150,6 +151,7 @@ export async function discoverOps(opts?: { cwd?: string }): Promise<OpDiscoveryR
|
|
|
150
151
|
|
|
151
152
|
for (const filePath of files) {
|
|
152
153
|
try {
|
|
154
|
+
ensureTypeScriptLoader();
|
|
153
155
|
const mod = (await import(filePath)) as Record<string, unknown>;
|
|
154
156
|
const exported = opsExportedBy(mod);
|
|
155
157
|
|
|
@@ -220,6 +222,7 @@ export async function discoverStewards(opts?: { cwd?: string }): Promise<Steward
|
|
|
220
222
|
for (const filePath of files) {
|
|
221
223
|
let mod: Record<string, unknown>;
|
|
222
224
|
try {
|
|
225
|
+
ensureTypeScriptLoader();
|
|
223
226
|
mod = (await import(filePath)) as Record<string, unknown>;
|
|
224
227
|
} catch (err) {
|
|
225
228
|
errors.push(`${filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -254,6 +254,7 @@ describe("a wave gate that asks a decision point (#3836)", () => {
|
|
|
254
254
|
members,
|
|
255
255
|
description: "wave 1 of 1: vpc, nat",
|
|
256
256
|
neverOverMcp: true,
|
|
257
|
+
approvalMode: "ledger",
|
|
257
258
|
answer: { point: "prod-apply" },
|
|
258
259
|
});
|
|
259
260
|
expect(waiting.decision?.pendingFact).toMatchObject({ commit: "c".repeat(40), neverOverMcp: true });
|
package/src/op/op-waves-run.ts
CHANGED
|
@@ -130,7 +130,7 @@ export interface OpWavePlansFile {
|
|
|
130
130
|
/** Pending-fact keys chant writes itself, which a plans file's `pending` may not set (#3821). */
|
|
131
131
|
export const OP_WAVE_PENDING_RESERVED = [
|
|
132
132
|
"version", "kind", "op", "gate", "timestamp", "expiresAt", "planDigest", "runId", "url", "resume",
|
|
133
|
-
"environment", "origin", "neverOverMcp", "approval", "answer",
|
|
133
|
+
"environment", "origin", "neverOverMcp", "approval", "approvalMode", "answer",
|
|
134
134
|
] as const;
|
|
135
135
|
|
|
136
136
|
/** What chant writes to `{runs}` for a wave-level command or a hook (#3762). */
|
|
@@ -1068,7 +1068,7 @@ async function settleOtherGate(ctx: WaveContext, hold: OtherGateHold): Promise<O
|
|
|
1068
1068
|
description: hold.request.description ?? `wave ${k} (${wave.name}) of ${spec.name} is held on it by ${hold.label}`,
|
|
1069
1069
|
now,
|
|
1070
1070
|
// #3839: the wave a hold belongs to, as a field, whatever the hook's own description says.
|
|
1071
|
-
fields: { ...hold.request.pending, wave: { number: k, name: wave.name, op: spec.name } },
|
|
1071
|
+
fields: { ...hold.request.pending, approvalMode: rules.approval, wave: { number: k, name: wave.name, op: spec.name } },
|
|
1072
1072
|
...(neverOverMcp ? { neverOverMcp: true } : {}),
|
|
1073
1073
|
});
|
|
1074
1074
|
const base = { op, gate: hold.request.gate, digest: hold.request.digest, hook: hold.label };
|
|
@@ -1633,7 +1633,8 @@ async function settleGate(options: RunOpWaveOptions, ctx: WaveContext, decision:
|
|
|
1633
1633
|
description: (typeof decision.pending?.description === "string" ? decision.pending.description : undefined) ?? `wave ${k} (${wave.name}): ${members.length} run${members.length === 1 ? "" : "s"}, gate ${policy}, approval ${approval}${held}`,
|
|
1634
1634
|
now,
|
|
1635
1635
|
...(spent ? { spent } : {}),
|
|
1636
|
-
|
|
1636
|
+
// #3861: the approval mode the wave asked under, for readers deciding which approvals count.
|
|
1637
|
+
fields: { ...decision.pending, approvalMode: approval },
|
|
1637
1638
|
...(decision.neverOverMcp ? { neverOverMcp: true } : {}),
|
|
1638
1639
|
});
|
|
1639
1640
|
if (check.satisfied) {
|
|
@@ -1697,7 +1698,7 @@ async function settlePointGate(options: RunOpWaveOptions, ctx: WaveContext, deci
|
|
|
1697
1698
|
planDigest: digest,
|
|
1698
1699
|
...(options.now ? { now: options.now } : {}),
|
|
1699
1700
|
// #3863: the plans file's pending fields and the spec's neverOverMcp, as settleGate passes them.
|
|
1700
|
-
...
|
|
1701
|
+
fields: { ...decision.pending, approvalMode: decision.approval },
|
|
1701
1702
|
...(decision.neverOverMcp ? { neverOverMcp: true } : {}),
|
|
1702
1703
|
});
|
|
1703
1704
|
if (check.satisfied) {
|
package/src/op/op-waves.test.ts
CHANGED
|
@@ -739,8 +739,22 @@ describe("a product's wave gate moved onto the waves (#3821)", () => {
|
|
|
739
739
|
const result = await runOpWave({ spec: tg, specFile: "waves.json", wave: 1, cwd: h.cwd, exec: h.exec, show: () => ({ sha: "b".repeat(40), text: JSON.stringify({ ...tg, neverOverMcp: true }) }), gates });
|
|
740
740
|
expect(result.exitCode).toBe(3);
|
|
741
741
|
expect(gates.appended[0]).toMatchObject({ commit: "c".repeat(40), members, description: "wave 1 of 3: vpc, dns, nat", neverOverMcp: true, gate: "wave-1", op: "tf-apply" });
|
|
742
|
+
// #3861: the approval mode the wave asked under, and a plans file may not set it.
|
|
743
|
+
expect(gates.appended[0]).toMatchObject({ approvalMode: "ledger" });
|
|
742
744
|
h.done();
|
|
743
745
|
|
|
746
|
+
const mode = harness(plans, { pending: { approvalMode: "sealed" } });
|
|
747
|
+
await expect(runOpWave({ spec: tg, specFile: "waves.json", wave: 1, cwd: mode.cwd, exec: mode.exec, show: mode.show, gates: memoryGateLedgerPort() })).rejects.toThrow(/sets approvalMode, which chant writes itself/);
|
|
748
|
+
mode.done();
|
|
749
|
+
|
|
750
|
+
// A sealed spec at base records "sealed".
|
|
751
|
+
const sealedSpec: OpWavesSpec = { ...tg, waves: [{ ...tg.waves[0]!, approval: "sealed" }] };
|
|
752
|
+
const sh = harness(plans, {}, sealedSpec);
|
|
753
|
+
const sealedGates = memoryGateLedgerPort();
|
|
754
|
+
await runOpWave({ spec: sealedSpec, specFile: "waves.json", wave: 1, cwd: sh.cwd, exec: sh.exec, show: () => ({ sha: "b".repeat(40), text: JSON.stringify(sealedSpec) }), gates: sealedGates });
|
|
755
|
+
expect(sealedGates.appended[0]).toMatchObject({ approvalMode: "sealed" });
|
|
756
|
+
sh.done();
|
|
757
|
+
|
|
744
758
|
const bad = harness(plans, { pending: { gate: "other" } });
|
|
745
759
|
await expect(runOpWave({ spec: tg, specFile: "waves.json", wave: 1, cwd: bad.cwd, exec: bad.exec, show: bad.show, gates: memoryGateLedgerPort() })).rejects.toThrow(/sets gate, which chant writes itself/);
|
|
746
760
|
bad.done();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { join, sep } from "node:path";
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
import { describe, expect, test } from "vitest";
|
|
4
|
+
import { chantSourceDir, ensureTypeScriptLoader } from "./ts-loader";
|
|
5
|
+
|
|
6
|
+
describe("ts-loader (#3878)", () => {
|
|
7
|
+
const pkg = join(sep, "x", "node_modules", "@intentius", "chant");
|
|
8
|
+
|
|
9
|
+
test("chantSourceDir maps a compiled module's directory to its source directory", () => {
|
|
10
|
+
const url = pathToFileURL(join(pkg, "dist", "discovery", "sandbox", "driver.js")).href;
|
|
11
|
+
expect(chantSourceDir(url)).toBe(join(pkg, "src", "discovery", "sandbox"));
|
|
12
|
+
expect(chantSourceDir(pathToFileURL(join(pkg, "dist", "params.js")).href)).toBe(join(pkg, "src"));
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test("chantSourceDir leaves a source module's directory alone", () => {
|
|
16
|
+
const url = pathToFileURL(join(pkg, "src", "discovery", "sandbox", "driver.ts")).href;
|
|
17
|
+
expect(chantSourceDir(url)).toBe(join(pkg, "src", "discovery", "sandbox"));
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("from source, the TypeScript loader is already there and nothing is registered", () => {
|
|
21
|
+
expect(ensureTypeScriptLoader()).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|