@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,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated-once secret materialization — the one implementation behind the
|
|
3
|
+
* `ensure-secret` capability verb (components/verbs/ensure-secret.ts) and the
|
|
4
|
+
* `ensureSecret(...)` op step builder (op/builders.ts). chant #1829, epic
|
|
5
|
+
* #1365 decisions 3 and 6.
|
|
6
|
+
*
|
|
7
|
+
* The contract is read-then-write:
|
|
8
|
+
*
|
|
9
|
+
* - Absent: mint once, through the store adapter, and report `created`.
|
|
10
|
+
* - Present: verify presence, the declared key-set, and any declared
|
|
11
|
+
* metadata, then STOP — present means done. Never mint over an existing
|
|
12
|
+
* value. Never rotate implicitly. A re-run of a whole deploy leaves the
|
|
13
|
+
* stored bytes untouched.
|
|
14
|
+
* - Mismatch: fail loudly, naming what mismatched — key names and metadata
|
|
15
|
+
* keys, never a value or a value-derived hash (#1365 decision 6).
|
|
16
|
+
*
|
|
17
|
+
* The constitutional line (../secret-provenance.ts): no code path here may
|
|
18
|
+
* hold, log, hash, or compare a secret value. That is structural, not
|
|
19
|
+
* discipline:
|
|
20
|
+
*
|
|
21
|
+
* - {@link ensureSecretMaterialization} never calls the generator. It hands
|
|
22
|
+
* the generator to the store adapter's `create`, which consumes the
|
|
23
|
+
* material as it writes. The engine's result type has no field that could
|
|
24
|
+
* carry material.
|
|
25
|
+
* - The generator produces {@link SecretMaterial}, an opaque single-use
|
|
26
|
+
* handle. The plaintext lives in a module-private WeakMap, not on the
|
|
27
|
+
* object: enumeration, `JSON.stringify`, `String(...)`, and `util.inspect`
|
|
28
|
+
* all see only a redaction marker. Only {@link consumeSecretMaterial} —
|
|
29
|
+
* meant for store adapters, at the write — yields the plaintext, exactly
|
|
30
|
+
* once; a second consume throws.
|
|
31
|
+
* - `describe` returns key names and metadata only, so the mismatch check
|
|
32
|
+
* has nothing value-shaped to compare even by accident.
|
|
33
|
+
*
|
|
34
|
+
* Store adapters are per-provider (#1830 is the k8s row); core defines only
|
|
35
|
+
* the seam.
|
|
36
|
+
*/
|
|
37
|
+
import { randomBytes } from "node:crypto";
|
|
38
|
+
// ── Opaque secret material ────────────────────────────────────────────────────
|
|
39
|
+
/** Module-private plaintext vault. Keyed by handle identity; consuming deletes. */
|
|
40
|
+
const vault = new WeakMap();
|
|
41
|
+
const REDACTED = "[secret material]";
|
|
42
|
+
/**
|
|
43
|
+
* A single-use, opaque handle to generated secret material. The plaintext is
|
|
44
|
+
* not a property of this object — it lives in a module-private WeakMap — so
|
|
45
|
+
* spreading, enumerating, stringifying, or logging the handle yields only a
|
|
46
|
+
* redaction marker. A store adapter redeems it with
|
|
47
|
+
* {@link consumeSecretMaterial} at the moment it writes; nothing else can.
|
|
48
|
+
*/
|
|
49
|
+
export class SecretMaterial {
|
|
50
|
+
constructor() { }
|
|
51
|
+
/** Wrap plaintext in an opaque handle. Call inside a generator only. */
|
|
52
|
+
static mint(plaintext) {
|
|
53
|
+
const handle = new SecretMaterial();
|
|
54
|
+
vault.set(handle, plaintext);
|
|
55
|
+
return handle;
|
|
56
|
+
}
|
|
57
|
+
toString() {
|
|
58
|
+
return REDACTED;
|
|
59
|
+
}
|
|
60
|
+
toJSON() {
|
|
61
|
+
return REDACTED;
|
|
62
|
+
}
|
|
63
|
+
/** node:util.inspect (console.log) sees the redaction marker, not the vault. */
|
|
64
|
+
[Symbol.for("nodejs.util.inspect.custom")]() {
|
|
65
|
+
return REDACTED;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Redeem a {@link SecretMaterial} handle for its plaintext — exactly once.
|
|
70
|
+
* For store adapters only, at the write to the backing store. Throws if the
|
|
71
|
+
* handle was already consumed (or was never minted here): material flows to
|
|
72
|
+
* the store exactly once and is retained nowhere.
|
|
73
|
+
*/
|
|
74
|
+
export function consumeSecretMaterial(material) {
|
|
75
|
+
const plaintext = vault.get(material);
|
|
76
|
+
if (plaintext === undefined) {
|
|
77
|
+
throw new Error("secret material already consumed — material flows to the store adapter exactly once and is never retained");
|
|
78
|
+
}
|
|
79
|
+
vault.delete(material);
|
|
80
|
+
return plaintext;
|
|
81
|
+
}
|
|
82
|
+
/** 32 bytes from the CSPRNG, base64url — the default mint. */
|
|
83
|
+
export const defaultSecretMaterialGenerator = () => SecretMaterial.mint(randomBytes(32).toString("base64url"));
|
|
84
|
+
/**
|
|
85
|
+
* The loud failure: an existing secret does not match its declared contract.
|
|
86
|
+
* `mismatches` names what differed — key names and metadata keys only.
|
|
87
|
+
* Constructing one with anything value-shaped is the reviewer's tripwire;
|
|
88
|
+
* nothing in this module can, because nothing in this module holds a value.
|
|
89
|
+
*/
|
|
90
|
+
export class SecretContractMismatchError extends Error {
|
|
91
|
+
constructor(
|
|
92
|
+
/** The secret's name. */
|
|
93
|
+
secretName,
|
|
94
|
+
/** Human-readable mismatch descriptions, naming keys — never values. */
|
|
95
|
+
mismatches) {
|
|
96
|
+
super(`secret "${secretName}" exists but does not match its declared contract: ${mismatches.join("; ")}. ` +
|
|
97
|
+
`chant never mints over or rotates an existing secret — reconcile the declaration or the stored secret explicitly.`);
|
|
98
|
+
this.secretName = secretName;
|
|
99
|
+
this.mismatches = mismatches;
|
|
100
|
+
this.name = "SecretContractMismatchError";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Ensure a `generated-once` secret exists and matches its declared contract.
|
|
105
|
+
* Read-then-write:
|
|
106
|
+
*
|
|
107
|
+
* - Absent: `store.create(name, keys, generate)` — one mint, then done.
|
|
108
|
+
* - Present and matching: no write of any kind; returns `present`.
|
|
109
|
+
* - Present and mismatching: throws {@link SecretContractMismatchError}
|
|
110
|
+
* naming the missing/unexpected key names and mismatched metadata keys.
|
|
111
|
+
*
|
|
112
|
+
* The engine never calls `generate` itself and never sees what the adapter
|
|
113
|
+
* writes; its return value carries names only.
|
|
114
|
+
*/
|
|
115
|
+
export async function ensureSecretMaterialization(store, spec, generate = defaultSecretMaterialGenerator) {
|
|
116
|
+
if (typeof spec.name !== "string" || spec.name.length === 0) {
|
|
117
|
+
throw new Error("ensureSecret: `name` must be a non-empty string");
|
|
118
|
+
}
|
|
119
|
+
if (!Array.isArray(spec.keys) || spec.keys.length === 0) {
|
|
120
|
+
throw new Error(`ensureSecret("${spec.name}"): \`keys\` must name at least one key to materialize`);
|
|
121
|
+
}
|
|
122
|
+
if (await store.exists(spec.name)) {
|
|
123
|
+
const actual = await store.describe(spec.name);
|
|
124
|
+
const mismatches = [];
|
|
125
|
+
const actualKeys = new Set(actual.keys);
|
|
126
|
+
const declaredKeys = new Set(spec.keys);
|
|
127
|
+
const missing = spec.keys.filter((k) => !actualKeys.has(k));
|
|
128
|
+
const unexpected = actual.keys.filter((k) => !declaredKeys.has(k));
|
|
129
|
+
if (missing.length > 0) {
|
|
130
|
+
mismatches.push(`missing declared key(s): ${missing.join(", ")}`);
|
|
131
|
+
}
|
|
132
|
+
if (unexpected.length > 0) {
|
|
133
|
+
mismatches.push(`undeclared key(s) present: ${unexpected.join(", ")}`);
|
|
134
|
+
}
|
|
135
|
+
for (const [key, value] of Object.entries(spec.metadata ?? {})) {
|
|
136
|
+
const actualValue = actual.metadata?.[key];
|
|
137
|
+
if (actualValue === undefined) {
|
|
138
|
+
mismatches.push(`missing declared metadata key: ${key}`);
|
|
139
|
+
}
|
|
140
|
+
else if (actualValue !== value) {
|
|
141
|
+
// Name the KEY only — metadata values stay out of the error by rule,
|
|
142
|
+
// the same line the whole module holds for secret values.
|
|
143
|
+
mismatches.push(`metadata key differs: ${key}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (mismatches.length > 0) {
|
|
147
|
+
throw new SecretContractMismatchError(spec.name, mismatches);
|
|
148
|
+
}
|
|
149
|
+
return { outcome: "present", name: spec.name, keys: spec.keys };
|
|
150
|
+
}
|
|
151
|
+
await store.create(spec.name, spec.keys, generate);
|
|
152
|
+
return { outcome: "created", name: spec.name, keys: spec.keys };
|
|
153
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret provenance vocabulary (chant #1828, epic #1365).
|
|
3
|
+
*
|
|
4
|
+
* A secret's PROVENANCE is where its value comes from — never what the value
|
|
5
|
+
* is. chant's constitutional line on secrets: no code path may hold, log,
|
|
6
|
+
* hash, or compare a secret value. This module makes that structural: the
|
|
7
|
+
* declaration types have no field that could carry material, the factory
|
|
8
|
+
* rejects material-shaped fields at both the type level (`never` fields) and
|
|
9
|
+
* at runtime (own-property check, naming only the offending KEY), and
|
|
10
|
+
* "mismatch" anywhere downstream means presence, declared key-set, and
|
|
11
|
+
* metadata — never a value or a value-derived hash (#1365 decision 6).
|
|
12
|
+
*
|
|
13
|
+
* The closed kind set:
|
|
14
|
+
*
|
|
15
|
+
* - `referenced` — the value exists out of band (a human or an external
|
|
16
|
+
* process put it where consumers read it). chant records only that the
|
|
17
|
+
* estate depends on it, which is what lets the consumed-but-unproduced
|
|
18
|
+
* check (#1382) ship as an error instead of a guess.
|
|
19
|
+
* - `from-provider` — a declared provider binding materializes it (the
|
|
20
|
+
* operator/CRD seam; `K8s::Infisical::InfisicalSecret` from #1321 is the
|
|
21
|
+
* exemplar). The declaration POINTS at that binding, it does not re-model
|
|
22
|
+
* it.
|
|
23
|
+
* - `generated-once` — minted on first materialization, then never
|
|
24
|
+
* regenerated (present means done). The declaration carries contract flags
|
|
25
|
+
* only — e.g. the declared key-set — never mint parameters holding
|
|
26
|
+
* material. `generated-once` secrets never enter the prunable set (#1365
|
|
27
|
+
* decision 5).
|
|
28
|
+
* - `committed-encrypted` — sops-style ciphertext committed in the repo,
|
|
29
|
+
* decrypted by the delivery system (Flux) straight into the target. The
|
|
30
|
+
* declaration records a repo-relative PATH to the ciphertext, never the
|
|
31
|
+
* bytes: the factory is pure and touches no filesystem, so it still folds
|
|
32
|
+
* under `--sandbox`. The bytes are read at `buildRoots()` — the one
|
|
33
|
+
* sanctioned impure seam — and emitted as a sidecar file, never as a
|
|
34
|
+
* document in the primary output. See
|
|
35
|
+
* `docs/design/committed-encrypted-sops-provenance.md`.
|
|
36
|
+
*
|
|
37
|
+
* Declarations are serializer-neutral: discovery collects them like any
|
|
38
|
+
* entity (they are Declarables), but `partitionByLexicon` (../build.ts)
|
|
39
|
+
* excludes them from every serializer partition, so no lexicon ever emits
|
|
40
|
+
* them. They are data that lint rules and lexicons READ (via
|
|
41
|
+
* {@link collectSecretDeclarations}), not output.
|
|
42
|
+
*/
|
|
43
|
+
import { DECLARABLE_MARKER } from "./declarable.js";
|
|
44
|
+
/** Every provenance kind, for exhaustiveness checks. */
|
|
45
|
+
export const SECRET_PROVENANCE_KINDS = [
|
|
46
|
+
"referenced",
|
|
47
|
+
"from-provider",
|
|
48
|
+
"generated-once",
|
|
49
|
+
"committed-encrypted",
|
|
50
|
+
];
|
|
51
|
+
/** Every encryption tool, for exhaustiveness checks. */
|
|
52
|
+
export const SECRET_ENCRYPTION_TOOLS = ["sops"];
|
|
53
|
+
/**
|
|
54
|
+
* File extensions a committed ciphertext path may carry (v1).
|
|
55
|
+
*
|
|
56
|
+
* The CLI writer round-trips every additional file through `JSON.parse` and
|
|
57
|
+
* re-emits it key-sorted when the parse succeeds
|
|
58
|
+
* (`./cli/commands/build.ts`), which would silently rewrite a `.sops.json`
|
|
59
|
+
* file and break the byte-for-byte guarantee. v1 refuses anything but YAML;
|
|
60
|
+
* the writer additionally skips the round trip for these files, so byte
|
|
61
|
+
* identity is structural rather than a happy accident of JSON.parse failing.
|
|
62
|
+
*/
|
|
63
|
+
const CIPHERTEXT_FILE_EXTENSIONS = [".yaml", ".yml"];
|
|
64
|
+
/**
|
|
65
|
+
* Patterns that mean a PRIVATE key was pasted where a public recipient
|
|
66
|
+
* belongs. Matched against `recipients` entries; the thrown message names the
|
|
67
|
+
* field and the index, never the value.
|
|
68
|
+
*/
|
|
69
|
+
const PRIVATE_KEY_MARKERS = [/AGE-SECRET-KEY-/i, /-----BEGIN [A-Z ]*PRIVATE KEY-----/];
|
|
70
|
+
/** Marker symbol identifying a secret provenance declaration. `Symbol.for` so
|
|
71
|
+
* it survives the entity-wire codec (../discovery/entity-wire-codec.ts). */
|
|
72
|
+
export const SECRET_DECLARATION_MARKER = Symbol.for("chant.secret-declaration");
|
|
73
|
+
/** The `entityType` every secret declaration carries. */
|
|
74
|
+
export const SECRET_DECLARATION_ENTITY_TYPE = "Chant::SecretProvenance";
|
|
75
|
+
const FORBIDDEN_MATERIAL_FIELDS = [
|
|
76
|
+
"value",
|
|
77
|
+
"data",
|
|
78
|
+
"stringData",
|
|
79
|
+
"material",
|
|
80
|
+
"plaintext",
|
|
81
|
+
"ciphertext",
|
|
82
|
+
];
|
|
83
|
+
/** Narrow a declaration to the committed-encrypted kind. */
|
|
84
|
+
export function isCommittedEncryptedSecret(decl) {
|
|
85
|
+
return decl.provenance === "committed-encrypted";
|
|
86
|
+
}
|
|
87
|
+
export function declareSecret(input) {
|
|
88
|
+
if (typeof input.name !== "string" || input.name.length === 0) {
|
|
89
|
+
throw new Error("declareSecret: `name` must be a non-empty string");
|
|
90
|
+
}
|
|
91
|
+
if (!SECRET_PROVENANCE_KINDS.includes(input.provenance)) {
|
|
92
|
+
throw new Error(`declareSecret("${input.name}"): unknown provenance "${String(input.provenance)}" — ` +
|
|
93
|
+
`expected one of ${SECRET_PROVENANCE_KINDS.join(", ")}`);
|
|
94
|
+
}
|
|
95
|
+
for (const field of FORBIDDEN_MATERIAL_FIELDS) {
|
|
96
|
+
if (Object.prototype.hasOwnProperty.call(input, field)) {
|
|
97
|
+
// Name the key only. Never read, log, or echo the value.
|
|
98
|
+
throw new Error(`declareSecret("${input.name}"): field "${field}" is not allowed — ` +
|
|
99
|
+
`a secret declaration records provenance, never material`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const base = {
|
|
103
|
+
[DECLARABLE_MARKER]: true,
|
|
104
|
+
[SECRET_DECLARATION_MARKER]: true,
|
|
105
|
+
lexicon: "chant",
|
|
106
|
+
entityType: SECRET_DECLARATION_ENTITY_TYPE,
|
|
107
|
+
name: input.name,
|
|
108
|
+
};
|
|
109
|
+
// Copy known fields per kind explicitly — never spread `input`, so a field
|
|
110
|
+
// that slipped past the type system still cannot land on the declaration.
|
|
111
|
+
// The top-level object stays extensible (discovery stamps logical-name and
|
|
112
|
+
// provenance symbols onto entities); the declared fields themselves are
|
|
113
|
+
// defined non-writable below, and nested structures are frozen.
|
|
114
|
+
switch (input.provenance) {
|
|
115
|
+
case "referenced": {
|
|
116
|
+
const decl = {
|
|
117
|
+
...base,
|
|
118
|
+
provenance: "referenced",
|
|
119
|
+
...(input.scope !== undefined ? { scope: input.scope } : {}),
|
|
120
|
+
};
|
|
121
|
+
return lockDeclaredFields(decl);
|
|
122
|
+
}
|
|
123
|
+
case "from-provider": {
|
|
124
|
+
if (typeof input.provider?.binding !== "string" || input.provider.binding.length === 0) {
|
|
125
|
+
throw new Error(`declareSecret("${input.name}"): from-provider requires \`provider.binding\` ` +
|
|
126
|
+
`naming the provider binding entity`);
|
|
127
|
+
}
|
|
128
|
+
const decl = {
|
|
129
|
+
...base,
|
|
130
|
+
provenance: "from-provider",
|
|
131
|
+
provider: Object.freeze({
|
|
132
|
+
binding: input.provider.binding,
|
|
133
|
+
...(input.provider.entityType !== undefined ? { entityType: input.provider.entityType } : {}),
|
|
134
|
+
}),
|
|
135
|
+
};
|
|
136
|
+
return lockDeclaredFields(decl);
|
|
137
|
+
}
|
|
138
|
+
case "generated-once": {
|
|
139
|
+
const decl = {
|
|
140
|
+
...base,
|
|
141
|
+
provenance: "generated-once",
|
|
142
|
+
...(input.keys !== undefined ? { keys: Object.freeze([...input.keys]) } : {}),
|
|
143
|
+
};
|
|
144
|
+
return lockDeclaredFields(decl);
|
|
145
|
+
}
|
|
146
|
+
case "committed-encrypted": {
|
|
147
|
+
const decl = {
|
|
148
|
+
...base,
|
|
149
|
+
provenance: "committed-encrypted",
|
|
150
|
+
file: validateCiphertextPath(input.name, input.file),
|
|
151
|
+
encryption: validateEncryption(input.name, input.encryption),
|
|
152
|
+
...(input.recipients !== undefined
|
|
153
|
+
? { recipients: Object.freeze(validateRecipients(input.name, input.recipients)) }
|
|
154
|
+
: {}),
|
|
155
|
+
...(input.keys !== undefined ? { keys: Object.freeze([...input.keys]) } : {}),
|
|
156
|
+
};
|
|
157
|
+
return lockDeclaredFields(decl);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Validate the repo-relative ciphertext path. Pure and offline — the factory
|
|
163
|
+
* never stats the file, because discovery folds project source statically
|
|
164
|
+
* under `--sandbox` and a factory that touched the filesystem would either
|
|
165
|
+
* break folding or reintroduce the trust boundary that suite defends. The
|
|
166
|
+
* file's existence and shape are checked at `buildRoots()` instead.
|
|
167
|
+
*/
|
|
168
|
+
function validateCiphertextPath(name, file) {
|
|
169
|
+
if (typeof file !== "string" || file.length === 0) {
|
|
170
|
+
throw new Error(`declareSecret("${name}"): committed-encrypted requires \`file\`, a non-empty ` +
|
|
171
|
+
`repo-relative path to the committed ciphertext`);
|
|
172
|
+
}
|
|
173
|
+
if (file.startsWith("/") || /^[A-Za-z]:[\\/]/.test(file)) {
|
|
174
|
+
throw new Error(`declareSecret("${name}"): \`file\` must be repo-relative, not absolute — got "${file}"`);
|
|
175
|
+
}
|
|
176
|
+
const segments = file.split(/[\\/]/);
|
|
177
|
+
if (segments.includes("..")) {
|
|
178
|
+
throw new Error(`declareSecret("${name}"): \`file\` must not escape the project with a ".." segment — ` +
|
|
179
|
+
`got "${file}"`);
|
|
180
|
+
}
|
|
181
|
+
const dot = file.lastIndexOf(".");
|
|
182
|
+
const extension = dot === -1 ? "" : file.slice(dot).toLowerCase();
|
|
183
|
+
if (!CIPHERTEXT_FILE_EXTENSIONS.includes(extension)) {
|
|
184
|
+
throw new Error(`declareSecret("${name}"): \`file\` must be a YAML file ` +
|
|
185
|
+
`(${CIPHERTEXT_FILE_EXTENSIONS.join(", ")}) — got "${extension || "no extension"}". ` +
|
|
186
|
+
`Other formats are not emitted byte-for-byte yet.`);
|
|
187
|
+
}
|
|
188
|
+
return file;
|
|
189
|
+
}
|
|
190
|
+
/** Validate the encryption tool, defaulting to `"sops"`. */
|
|
191
|
+
function validateEncryption(name, encryption) {
|
|
192
|
+
if (encryption === undefined)
|
|
193
|
+
return "sops";
|
|
194
|
+
if (!SECRET_ENCRYPTION_TOOLS.includes(encryption)) {
|
|
195
|
+
throw new Error(`declareSecret("${name}"): unknown encryption "${String(encryption)}" — ` +
|
|
196
|
+
`expected one of ${SECRET_ENCRYPTION_TOOLS.join(", ")}`);
|
|
197
|
+
}
|
|
198
|
+
return encryption;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Copy `recipients`, refusing a private key pasted where a public recipient
|
|
202
|
+
* belongs. The message names the field and the index — never the value, the
|
|
203
|
+
* same discipline the forbidden-material check above uses.
|
|
204
|
+
*/
|
|
205
|
+
function validateRecipients(name, recipients) {
|
|
206
|
+
const copied = [...recipients];
|
|
207
|
+
copied.forEach((recipient, index) => {
|
|
208
|
+
if (typeof recipient !== "string" || recipient.length === 0) {
|
|
209
|
+
throw new Error(`declareSecret("${name}"): \`recipients[${index}]\` must be a non-empty string`);
|
|
210
|
+
}
|
|
211
|
+
if (PRIVATE_KEY_MARKERS.some((pattern) => pattern.test(recipient))) {
|
|
212
|
+
throw new Error(`declareSecret("${name}"): \`recipients[${index}]\` looks like a PRIVATE key — ` +
|
|
213
|
+
`recipients are public identifiers (age recipients, PGP fingerprints). ` +
|
|
214
|
+
`Rotate it: it has been in a source file.`);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
return copied;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Make every declared (string-keyed) field non-writable and non-configurable
|
|
221
|
+
* without sealing the object — discovery still stamps its own symbol-keyed
|
|
222
|
+
* metadata (logical name, build provenance) onto entities, which a frozen
|
|
223
|
+
* object would reject.
|
|
224
|
+
*/
|
|
225
|
+
function lockDeclaredFields(decl) {
|
|
226
|
+
for (const key of Object.keys(decl)) {
|
|
227
|
+
Object.defineProperty(decl, key, { writable: false, configurable: false });
|
|
228
|
+
}
|
|
229
|
+
return decl;
|
|
230
|
+
}
|
|
231
|
+
/** Type guard for a secret provenance declaration. */
|
|
232
|
+
export function isSecretDeclaration(value) {
|
|
233
|
+
return (typeof value === "object" &&
|
|
234
|
+
value !== null &&
|
|
235
|
+
SECRET_DECLARATION_MARKER in value &&
|
|
236
|
+
value[SECRET_DECLARATION_MARKER] === true);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Extract the secret declarations from a discovered entity map — the read
|
|
240
|
+
* surface for lint rules (#1382) and lexicon materializers (#1830). Keyed by
|
|
241
|
+
* entity name (export name), the same key `DiscoveryResult.entities` uses.
|
|
242
|
+
*/
|
|
243
|
+
export function collectSecretDeclarations(entities) {
|
|
244
|
+
const out = new Map();
|
|
245
|
+
for (const [name, entity] of entities) {
|
|
246
|
+
if (isSecretDeclaration(entity))
|
|
247
|
+
out.set(name, entity);
|
|
248
|
+
}
|
|
249
|
+
return out;
|
|
250
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic recursive value walker for lexicon serializers.
|
|
3
|
+
*
|
|
4
|
+
* Implements the dispatch chain: null → AttrRef → Intrinsic → Declarable → Array → Object,
|
|
5
|
+
* delegating format-specific behavior to a SerializerVisitor.
|
|
6
|
+
*/
|
|
7
|
+
import { isPropertyDeclarable } from "./declarable.js";
|
|
8
|
+
import { isHeldElsewhere } from "./held-elsewhere.js";
|
|
9
|
+
import { INTRINSIC_MARKER } from "./intrinsic.js";
|
|
10
|
+
import { isAttrRefLike } from "./utils.js";
|
|
11
|
+
/**
|
|
12
|
+
* The attribute an `{__attrRef}` envelope names. A fold writes the envelope
|
|
13
|
+
* with the property it read (`db.Endpoint_Address`), and the property's own
|
|
14
|
+
* AttrRef carries the attribute (`Endpoint.Address`); they differ when the
|
|
15
|
+
* attribute has a dot. The envelope's name is kept when the entity or
|
|
16
|
+
* property is not found.
|
|
17
|
+
*/
|
|
18
|
+
function envelopeAttribute(entityName, property, entityNames) {
|
|
19
|
+
for (const [entity, name] of entityNames) {
|
|
20
|
+
if (name !== entityName)
|
|
21
|
+
continue;
|
|
22
|
+
const held = entity[property];
|
|
23
|
+
return isAttrRefLike(held) ? held.attribute : property;
|
|
24
|
+
}
|
|
25
|
+
return property;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Recursively walk a value, converting AttrRefs, Intrinsics, Declarables,
|
|
29
|
+
* arrays, and objects using the provided visitor.
|
|
30
|
+
*/
|
|
31
|
+
export function walkValue(value, entityNames, visitor) {
|
|
32
|
+
if (value === null || value === undefined) {
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
// A `heldElsewhere()` marker (#2162) is never written to the applied
|
|
36
|
+
// payload — the provider defaults the field once at actual creation, and
|
|
37
|
+
// whoever the declaration names as holder owns it from there. Every apply
|
|
38
|
+
// this synthesizes therefore omits the field entirely, not only the
|
|
39
|
+
// first: re-asserting even the field's own value on a later apply would
|
|
40
|
+
// fight whatever the holder wrote in between. Checked first, ahead of
|
|
41
|
+
// every other dispatch branch below — a held marker is never an AttrRef,
|
|
42
|
+
// an Intrinsic, or authored Declarable data.
|
|
43
|
+
if (isHeldElsewhere(value))
|
|
44
|
+
return undefined;
|
|
45
|
+
// Handle AttrRef
|
|
46
|
+
if (isAttrRefLike(value)) {
|
|
47
|
+
const name = value.getLogicalName();
|
|
48
|
+
if (!name) {
|
|
49
|
+
throw new Error(`Cannot serialize AttrRef for attribute "${value.attribute}": logical name not set`);
|
|
50
|
+
}
|
|
51
|
+
return visitor.attrRef(name, value.attribute);
|
|
52
|
+
}
|
|
53
|
+
// Handle Intrinsics — walk the toJSON() result to resolve any embedded AttrRef markers
|
|
54
|
+
if (typeof value === "object" && value !== null && INTRINSIC_MARKER in value) {
|
|
55
|
+
if ("toJSON" in value && typeof value.toJSON === "function") {
|
|
56
|
+
return walkValue(value.toJSON(), entityNames, visitor);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Handle Declarable references
|
|
60
|
+
if (typeof value === "object" && value !== null && "entityType" in value) {
|
|
61
|
+
const decl = value;
|
|
62
|
+
if (isPropertyDeclarable(decl)) {
|
|
63
|
+
return visitor.propertyDeclarable(decl, (v) => walkValue(v, entityNames, visitor));
|
|
64
|
+
}
|
|
65
|
+
const name = entityNames.get(decl);
|
|
66
|
+
if (name) {
|
|
67
|
+
return visitor.resourceRef(name);
|
|
68
|
+
}
|
|
69
|
+
// A resource-kind Declarable constructed inline rather than exported as
|
|
70
|
+
// its own top-level entity (e.g. K8s `new PersistentVolumeClaim({...})`
|
|
71
|
+
// embedded directly in a StatefulSet's `volumeClaimTemplates`) has no
|
|
72
|
+
// logical name to Ref — it was never a key in `entities`, so
|
|
73
|
+
// resolveAttrRefs() never assigns one. Falling through to the generic
|
|
74
|
+
// "object" branch below would walk the Declarable's own enumerable
|
|
75
|
+
// properties, which for a Declarable are its self-referencing attribute
|
|
76
|
+
// accessors (AttrRef instances whose parent is the Declarable itself,
|
|
77
|
+
// still unresolved) — never its authored `.props`. That either threw
|
|
78
|
+
// "logical name not set" (when the resource type declares any
|
|
79
|
+
// attributes) or silently serialized as `{}` (when it doesn't), instead
|
|
80
|
+
// of the embedded spec the caller wrote. Embed its own props inline
|
|
81
|
+
// instead, exactly like a property-kind Declarable already does.
|
|
82
|
+
return visitor.propertyDeclarable(decl, (v) => walkValue(v, entityNames, visitor));
|
|
83
|
+
}
|
|
84
|
+
// Handle arrays. A held marker element is filtered out before recursing —
|
|
85
|
+
// `walkValue` would return `undefined` for it too, but leaving it in the
|
|
86
|
+
// array would emit a hole (`[a, null, b]`) rather than omitting it.
|
|
87
|
+
if (Array.isArray(value)) {
|
|
88
|
+
return value
|
|
89
|
+
.filter((item) => !isHeldElsewhere(item))
|
|
90
|
+
.map((item) => walkValue(item, entityNames, visitor));
|
|
91
|
+
}
|
|
92
|
+
// Handle serialized AttrRef envelopes (produced by AttrRef.toJSON() inside intrinsics)
|
|
93
|
+
if (typeof value === "object" && "__attrRef" in value) {
|
|
94
|
+
const ref = value.__attrRef;
|
|
95
|
+
return visitor.attrRef(ref.entity, envelopeAttribute(ref.entity, ref.attribute, entityNames));
|
|
96
|
+
}
|
|
97
|
+
// Handle objects
|
|
98
|
+
if (typeof value === "object") {
|
|
99
|
+
const result = {};
|
|
100
|
+
for (const [key, val] of Object.entries(value)) {
|
|
101
|
+
// A held marker key is omitted entirely (#2162), not set to
|
|
102
|
+
// `undefined` — the two read differently to a YAML emitter, and only
|
|
103
|
+
// omission is "the provider never hears about this field".
|
|
104
|
+
if (isHeldElsewhere(val))
|
|
105
|
+
continue;
|
|
106
|
+
const outKey = key;
|
|
107
|
+
result[outKey] = walkValue(val, entityNames, visitor);
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/sort.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BuildError } from "./errors.js";
|
|
2
|
+
import { detectCycles } from "./discovery/cycles.js";
|
|
3
|
+
/**
|
|
4
|
+
* Performs a topological sort on a dependency graph
|
|
5
|
+
* @param dependencies - Record where keys are entity names and values are arrays of their dependencies
|
|
6
|
+
* @returns Array of entity names in topological order (dependencies appear before dependents)
|
|
7
|
+
* @throws {BuildError} If a cycle is detected in the dependency graph
|
|
8
|
+
*/
|
|
9
|
+
export function topologicalSort(dependencies) {
|
|
10
|
+
// Check for cycles first
|
|
11
|
+
const cycles = detectCycles(dependencies);
|
|
12
|
+
if (cycles.length > 0) {
|
|
13
|
+
const cycleStr = cycles[0].join(" -> ");
|
|
14
|
+
throw new BuildError(cycles[0][0], `Circular dependency detected: ${cycleStr}`);
|
|
15
|
+
}
|
|
16
|
+
const sorted = [];
|
|
17
|
+
const visited = new Set();
|
|
18
|
+
const visiting = new Set();
|
|
19
|
+
/**
|
|
20
|
+
* DFS helper for topological sort
|
|
21
|
+
* @param node - Current node being visited
|
|
22
|
+
*/
|
|
23
|
+
function visit(node) {
|
|
24
|
+
if (visited.has(node)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
visiting.add(node);
|
|
28
|
+
const deps = dependencies[node] || [];
|
|
29
|
+
for (const dep of deps) {
|
|
30
|
+
if (!visited.has(dep)) {
|
|
31
|
+
visit(dep);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
visiting.delete(node);
|
|
35
|
+
visited.add(node);
|
|
36
|
+
sorted.push(node);
|
|
37
|
+
}
|
|
38
|
+
// Visit all nodes
|
|
39
|
+
for (const node of Object.keys(dependencies)) {
|
|
40
|
+
if (!visited.has(node)) {
|
|
41
|
+
visit(node);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return sorted;
|
|
45
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack Output — marks a value for cross-stack export.
|
|
3
|
+
*
|
|
4
|
+
* When a child project declares `stackOutput(ref)`, the serializer emits
|
|
5
|
+
* it into the template's Outputs section. The parent can then reference
|
|
6
|
+
* it via `nestedStack().outputs.name`.
|
|
7
|
+
*/
|
|
8
|
+
import { DECLARABLE_MARKER, isDeclarable } from "./declarable.js";
|
|
9
|
+
import { isIntrinsic } from "./intrinsic.js";
|
|
10
|
+
import { isAttrRefLike } from "./utils.js";
|
|
11
|
+
/**
|
|
12
|
+
* Marker symbol for stack output identification.
|
|
13
|
+
*/
|
|
14
|
+
export const STACK_OUTPUT_MARKER = Symbol.for("chant.stackOutput");
|
|
15
|
+
/** Find the first AttrRef or directly-referenced Declarable anywhere inside a
|
|
16
|
+
* value (walking intrinsics/objects/arrays), so a wrapping intrinsic can
|
|
17
|
+
* still borrow its source's lexicon. Duck-type, not `instanceof` (chant
|
|
18
|
+
* #1137): a lexicon built against a separate copy of `@intentius/chant`
|
|
19
|
+
* produces AttrRefs/Declarables that fail `instanceof` here but carry the
|
|
20
|
+
* same shape (`isDeclarable`'s `Symbol.for` marker is already dual-copy-safe
|
|
21
|
+
* on its own) — missing one would make the walk recurse into its own
|
|
22
|
+
* (unhelpful) fields instead of stopping on it, silently failing to find the
|
|
23
|
+
* anchor. */
|
|
24
|
+
function findAnchor(value, seen = new Set()) {
|
|
25
|
+
if (value === null || typeof value !== "object" || seen.has(value))
|
|
26
|
+
return undefined;
|
|
27
|
+
if (isAttrRefLike(value))
|
|
28
|
+
return { kind: "attrRef", ref: value };
|
|
29
|
+
if (isDeclarable(value))
|
|
30
|
+
return { kind: "declarable", entity: value };
|
|
31
|
+
seen.add(value);
|
|
32
|
+
const children = Array.isArray(value) ? value : Object.values(value);
|
|
33
|
+
for (const child of children) {
|
|
34
|
+
const found = findAnchor(child, seen);
|
|
35
|
+
if (found)
|
|
36
|
+
return found;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
/** Derive the lexicon an anchor belongs to: an AttrRef borrows its (deref'd)
|
|
41
|
+
* parent's `.lexicon`; a directly-referenced Declarable reports its own. */
|
|
42
|
+
function anchorLexicon(anchor) {
|
|
43
|
+
if (!anchor)
|
|
44
|
+
return "unknown";
|
|
45
|
+
if (anchor.kind === "declarable")
|
|
46
|
+
return anchor.entity.lexicon;
|
|
47
|
+
const parent = anchor.ref.parent.deref();
|
|
48
|
+
return parent && typeof parent.lexicon === "string"
|
|
49
|
+
? parent.lexicon
|
|
50
|
+
: "unknown";
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Type guard for StackOutput.
|
|
54
|
+
*/
|
|
55
|
+
export function isStackOutput(value) {
|
|
56
|
+
return (typeof value === "object" &&
|
|
57
|
+
value !== null &&
|
|
58
|
+
STACK_OUTPUT_MARKER in value &&
|
|
59
|
+
value[STACK_OUTPUT_MARKER] === true);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a stack output that exports an attribute reference for cross-stack use.
|
|
63
|
+
*
|
|
64
|
+
* @param ref - The AttrRef to export (e.g. `vpc.vpcId`)
|
|
65
|
+
* @param options - Optional description for the output
|
|
66
|
+
* @returns A StackOutput Declarable
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { stackOutput } from "@intentius/chant";
|
|
71
|
+
* import { vpc, subnet } from "./vpc";
|
|
72
|
+
*
|
|
73
|
+
* export const vpcId = stackOutput(vpc.vpcId);
|
|
74
|
+
* export const subnetId = stackOutput(subnet.subnetId, {
|
|
75
|
+
* description: "Primary subnet ID",
|
|
76
|
+
* });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export function stackOutput(ref, options) {
|
|
80
|
+
// Duck-type, not `instanceof` (chant #1137): AttrRef also implements
|
|
81
|
+
// Intrinsic (a global-symbol marker), so `isIntrinsic(ref)` alone already
|
|
82
|
+
// happens to accept a foreign-copy AttrRef here — this check would not
|
|
83
|
+
// misfire even with the raw `instanceof` left in. It is converted anyway
|
|
84
|
+
// so the guard's own logic states the invariant explicitly ("ref must be
|
|
85
|
+
// AttrRef-like or Intrinsic") rather than relying on that coincidence,
|
|
86
|
+
// matching the anchor selection right below it, which does misbehave.
|
|
87
|
+
if (typeof ref !== "string" && !isAttrRefLike(ref) && !isIntrinsic(ref)) {
|
|
88
|
+
throw new Error("stackOutput(ref): ref must be an attribute reference, an intrinsic wrapping one, or a literal string");
|
|
89
|
+
}
|
|
90
|
+
if (typeof ref === "string" && !options?.lexicon) {
|
|
91
|
+
throw new Error("stackOutput(literal): a literal output has no entity to derive its lexicon from — pass options.lexicon");
|
|
92
|
+
}
|
|
93
|
+
// Derive lexicon from the referenced entity — for a bare AttrRef, its parent;
|
|
94
|
+
// for an intrinsic (Join etc.), the first AttrRef or directly-referenced
|
|
95
|
+
// Declarable nested inside it (chant #1152: `Ref(param)`/`Ref(resource)`
|
|
96
|
+
// wrap the entity itself, not one of its attributes). A foreign-copy
|
|
97
|
+
// AttrRef/Declarable failing raw `instanceof` here would fall to
|
|
98
|
+
// `findAnchor`, which (before its own #1137 fix) would also miss it —
|
|
99
|
+
// silently anchoring on nothing and recording `lexicon: "unknown"`.
|
|
100
|
+
const anchor = typeof ref === "string" ? undefined : isAttrRefLike(ref) ? { kind: "attrRef", ref } : findAnchor(ref);
|
|
101
|
+
const lexicon = options?.lexicon ?? anchorLexicon(anchor);
|
|
102
|
+
const output = {
|
|
103
|
+
[STACK_OUTPUT_MARKER]: true,
|
|
104
|
+
[DECLARABLE_MARKER]: true,
|
|
105
|
+
lexicon,
|
|
106
|
+
entityType: "chant:output",
|
|
107
|
+
kind: "output",
|
|
108
|
+
sourceRef: ref,
|
|
109
|
+
description: options?.description,
|
|
110
|
+
exportName: options?.exportName,
|
|
111
|
+
condition: options?.condition,
|
|
112
|
+
...(options?.name !== undefined ? { name: options.name } : {}),
|
|
113
|
+
};
|
|
114
|
+
return output;
|
|
115
|
+
}
|