@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,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The box checks, WSP121 and WSP122 (#2726).
|
|
3
|
+
*
|
|
4
|
+
* A member whose entry has a `box` block is a box, or holds a box's
|
|
5
|
+
* declarations. A box holds no credential: each capability it needs outside
|
|
6
|
+
* itself (inference, Fountain, a third-party API) is reached through a
|
|
7
|
+
* broker, a runtime such as a lobby or a door, which holds the credential
|
|
8
|
+
* and enforces the scope the block declares. chant only states and checks
|
|
9
|
+
* this; it never runs a broker (ws-052).
|
|
10
|
+
*
|
|
11
|
+
* | Id | Code | Fails when |
|
|
12
|
+
* |---|---|---|
|
|
13
|
+
* | WSP121 | `box-credential-declared` | a file in the box member's directory carries a literal secret (fixed) |
|
|
14
|
+
* | WSP122 | `box-capability-unbrokered` | a capability in the block names no broker |
|
|
15
|
+
*
|
|
16
|
+
* WSP121 reads the member's files from the tree checked, so it works under
|
|
17
|
+
* `--at`, and runs no member code. A literal secret is either a value with a
|
|
18
|
+
* well-known credential shape (an AWS key id, a GitHub or Slack token, an
|
|
19
|
+
* `sk-` key, private key material), wherever it sits, or a literal string
|
|
20
|
+
* where a credential goes: under a key named like one (`API_KEY`, `token`,
|
|
21
|
+
* `credential`, `password`, ...), or the `value` of a `{ key, value }` vault
|
|
22
|
+
* secret. A reference is never one: `${VAR}` and `$VAR`, a secret-manager
|
|
23
|
+
* reference (`op://`, `bws://`, `infisical://`), a `{{...}}` template
|
|
24
|
+
* placeholder, and any expression, such as `process.env.X`, that is not a
|
|
25
|
+
* string literal. WSP121 is fixed: a credential in a box's files is in git.
|
|
26
|
+
*
|
|
27
|
+
* WSP123 and WSP124, box isolation (#2727), are in `./box-isolation.ts` and
|
|
28
|
+
* listed here after these two.
|
|
29
|
+
*
|
|
30
|
+
* WSP125 (`box-fountain-callback-undeclared`, #2780) is the one credential a
|
|
31
|
+
* box gets without asking. fountain v0.21.0 gives every persistent sandbox a
|
|
32
|
+
* callback token scoped to its owner (`FOUNTAIN_TOKEN`, `sandbox_api_access:
|
|
33
|
+
* owner`), and a fountain `Box` is always persistent, so its member's block
|
|
34
|
+
* has to say so: the capability `fountain-callback`, brokered by `fountain`,
|
|
35
|
+
* with scope `owner`. It is named apart from `fountain`, the API access a
|
|
36
|
+
* lobby may broker for the same box. A member builds a Box when one of its TypeScript or JavaScript files
|
|
37
|
+
* imports `Box` from `@intentius/chant-lexicon-fountain` and calls it, read as
|
|
38
|
+
* syntax and never run. Upstream, managoat/fountain#2497 asks for a way to run
|
|
39
|
+
* a persistent agent with no callback token.
|
|
40
|
+
*
|
|
41
|
+
* WSP126 (`box-intent-unknown`) and WSP127 (`box-intent-unconstrained`), #2850,
|
|
42
|
+
* read the decision record a box block names as its intent (`box-intent.ts`).
|
|
43
|
+
* WSP126 fails when no record of a declared kind named decision has the id.
|
|
44
|
+
* WSP127 warns when the record's constrains names no member or path of this
|
|
45
|
+
* workspace at all: no `member:` entry for a declared member and no `path:`
|
|
46
|
+
* entry at, above or inside one's directory. It need not reach the box's own
|
|
47
|
+
* member: the decision an intent names can constrain the member whose app the
|
|
48
|
+
* box runs, on a workspace where the box block sits on a different member,
|
|
49
|
+
* the box's steward (studio's template, #2857). Both read the working
|
|
50
|
+
* tree's records, so neither runs under `--at`.
|
|
51
|
+
*/
|
|
52
|
+
import * as ts from "typescript";
|
|
53
|
+
import { constrainsWorkspace } from "../box-intent.js";
|
|
54
|
+
import { joinPath, skippedDir } from "../tree.js";
|
|
55
|
+
import { BOX_ISOLATION_CHECKS } from "./box-isolation.js";
|
|
56
|
+
/** The read contract's codes for the box findings, carried as `code` on each. */
|
|
57
|
+
export const BOX_FINDING_CODES = [
|
|
58
|
+
"box-credential-declared",
|
|
59
|
+
"box-capability-unbrokered",
|
|
60
|
+
"box-isolation-collision",
|
|
61
|
+
"box-isolation-literal",
|
|
62
|
+
"box-fountain-callback-undeclared",
|
|
63
|
+
"box-intent-unknown",
|
|
64
|
+
"box-intent-unconstrained",
|
|
65
|
+
];
|
|
66
|
+
export const WSP_BOX_CREDENTIAL = "WSP121";
|
|
67
|
+
export const WSP_BOX_UNBROKERED = "WSP122";
|
|
68
|
+
export const WSP_BOX_FOUNTAIN_CALLBACK = "WSP125";
|
|
69
|
+
export const WSP_BOX_INTENT_UNKNOWN = "WSP126";
|
|
70
|
+
export const WSP_BOX_INTENT_UNCONSTRAINED = "WSP127";
|
|
71
|
+
/** The fountain lexicon's package, whose `Box` composite runs a persistent sandbox. */
|
|
72
|
+
const FOUNTAIN_LEXICON = "@intentius/chant-lexicon-fountain";
|
|
73
|
+
/**
|
|
74
|
+
* The capability a box block declares for fountain's callback token (#2780).
|
|
75
|
+
* The fountain lexicon exports the same value as `BOX_FOUNTAIN_CALLBACK_CAPABILITY`.
|
|
76
|
+
*/
|
|
77
|
+
export const FOUNTAIN_CALLBACK_CAPABILITY = { name: "fountain-callback", broker: "fountain", scope: ["owner"] };
|
|
78
|
+
/**
|
|
79
|
+
* The first call of the fountain lexicon's `Box` in a TypeScript or
|
|
80
|
+
* JavaScript file, read as syntax and never run: `Box` imported by name
|
|
81
|
+
* (aliased or not) and called, or called through a namespace import. Any
|
|
82
|
+
* other `Box` is not the composite.
|
|
83
|
+
*/
|
|
84
|
+
export function fountainBoxCall(text, file, kind) {
|
|
85
|
+
if (!text.includes(FOUNTAIN_LEXICON))
|
|
86
|
+
return undefined;
|
|
87
|
+
const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, kind);
|
|
88
|
+
const names = new Set();
|
|
89
|
+
const namespaces = new Set();
|
|
90
|
+
for (const stmt of source.statements) {
|
|
91
|
+
if (!ts.isImportDeclaration(stmt) || !ts.isStringLiteral(stmt.moduleSpecifier))
|
|
92
|
+
continue;
|
|
93
|
+
const from = stmt.moduleSpecifier.text;
|
|
94
|
+
if (from !== FOUNTAIN_LEXICON && !from.startsWith(`${FOUNTAIN_LEXICON}/`))
|
|
95
|
+
continue;
|
|
96
|
+
const bindings = stmt.importClause?.namedBindings;
|
|
97
|
+
if (!bindings)
|
|
98
|
+
continue;
|
|
99
|
+
if (ts.isNamespaceImport(bindings))
|
|
100
|
+
namespaces.add(bindings.name.text);
|
|
101
|
+
else
|
|
102
|
+
for (const el of bindings.elements)
|
|
103
|
+
if ((el.propertyName ?? el.name).text === "Box")
|
|
104
|
+
names.add(el.name.text);
|
|
105
|
+
}
|
|
106
|
+
if (names.size === 0 && namespaces.size === 0)
|
|
107
|
+
return undefined;
|
|
108
|
+
let found;
|
|
109
|
+
const visit = (node) => {
|
|
110
|
+
if (found)
|
|
111
|
+
return;
|
|
112
|
+
if (ts.isCallExpression(node)) {
|
|
113
|
+
const callee = node.expression;
|
|
114
|
+
if ((ts.isIdentifier(callee) && names.has(callee.text)) ||
|
|
115
|
+
(ts.isPropertyAccessExpression(callee) &&
|
|
116
|
+
callee.name.text === "Box" &&
|
|
117
|
+
ts.isIdentifier(callee.expression) &&
|
|
118
|
+
namespaces.has(callee.expression.text))) {
|
|
119
|
+
found = node;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
ts.forEachChild(node, visit);
|
|
124
|
+
};
|
|
125
|
+
visit(source);
|
|
126
|
+
if (!found)
|
|
127
|
+
return undefined;
|
|
128
|
+
const { line, character } = source.getLineAndCharacterOfPosition(found.getStart(source));
|
|
129
|
+
return { line: line + 1, column: character + 1 };
|
|
130
|
+
}
|
|
131
|
+
/** Values whose shape alone says they are a credential. The list FTN001 uses, plus Anthropic keys. */
|
|
132
|
+
export const CREDENTIAL_SHAPES = [
|
|
133
|
+
{ pattern: /\bAKIA[0-9A-Z]{16}\b/, label: "an AWS access key id" },
|
|
134
|
+
{ pattern: /\b(?:ghp|gho|ghs|ghu)_[A-Za-z0-9]{20,}/, label: "a GitHub token" },
|
|
135
|
+
{ pattern: /\bgithub_pat_[A-Za-z0-9_]{20,}/, label: "a GitHub fine-grained token" },
|
|
136
|
+
{ pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}/, label: "an Anthropic API key" },
|
|
137
|
+
{ pattern: /\bsk-[A-Za-z0-9_-]{20,}/, label: "a secret API key (sk-)" },
|
|
138
|
+
{ pattern: /\bftn_[A-Za-z0-9]{16,}/, label: "a Fountain API key" },
|
|
139
|
+
{ pattern: /\bxox[baprs]-[A-Za-z0-9-]{10,}/, label: "a Slack token" },
|
|
140
|
+
{ pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----/, label: "private key material" },
|
|
141
|
+
];
|
|
142
|
+
/** Secret-manager references a value may be instead of the secret. */
|
|
143
|
+
export const SECRET_REFERENCE_SCHEMES = ["op://", "bws://", "infisical://"];
|
|
144
|
+
/**
|
|
145
|
+
* A key whose value is a credential: `API_KEY`, `GITHUB_TOKEN`, `apiKey`,
|
|
146
|
+
* `token`, `credential`, `password`, `AWS_SECRET_ACCESS_KEY`. A key that
|
|
147
|
+
* names where a secret is (`secretKey`, `TOKEN_FILE`, `tokenHash`) is not.
|
|
148
|
+
*/
|
|
149
|
+
const CREDENTIAL_KEY = /(?:^|[_-])(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?|PRIVATE_?KEY|ACCESS_?KEY)$|^(?:apiKey|token|secret|password|credentials?|privateKey|accessKey|authToken)$|[a-z](?:ApiKey|Token|Secret|Password|Credentials?|PrivateKey|AccessKey)$/i;
|
|
150
|
+
/** Whether `key` names a credential. Exported for tests. */
|
|
151
|
+
export function isCredentialKey(key) {
|
|
152
|
+
return CREDENTIAL_KEY.test(key);
|
|
153
|
+
}
|
|
154
|
+
/** Whether `value` refers to a secret rather than being one. Exported for tests. */
|
|
155
|
+
export function isSecretReference(value) {
|
|
156
|
+
const v = value.trim();
|
|
157
|
+
if (v === "")
|
|
158
|
+
return true;
|
|
159
|
+
if (v.includes("${"))
|
|
160
|
+
return true;
|
|
161
|
+
// $VAR, $1, $(command): the shell fills it in.
|
|
162
|
+
if (v.startsWith("$"))
|
|
163
|
+
return true;
|
|
164
|
+
if (/^\{\{[^}]*\}\}$/.test(v))
|
|
165
|
+
return true;
|
|
166
|
+
return SECRET_REFERENCE_SCHEMES.some((s) => v.startsWith(s));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Whether a value under a credential key says where a secret is rather than
|
|
170
|
+
* being one: a path (`~/box/llm-token`, `/run/secrets/token`), a URL, or an
|
|
171
|
+
* environment variable's name (`GIT_TOKEN`).
|
|
172
|
+
*/
|
|
173
|
+
function namesWhereSecretIs(value) {
|
|
174
|
+
const v = value.trim();
|
|
175
|
+
return /^(?:\/|~|\.\.?\/)/.test(v) || /^[a-z][a-z0-9+.-]*:\/\//i.test(v) || /^[A-Z][A-Z0-9_]*$/.test(v);
|
|
176
|
+
}
|
|
177
|
+
/** The credential shape `value` has, or undefined. */
|
|
178
|
+
export function credentialShape(value) {
|
|
179
|
+
return CREDENTIAL_SHAPES.find((s) => s.pattern.test(value))?.label;
|
|
180
|
+
}
|
|
181
|
+
const CODE_EXTENSIONS = {
|
|
182
|
+
".ts": ts.ScriptKind.TS,
|
|
183
|
+
".mts": ts.ScriptKind.TS,
|
|
184
|
+
".cts": ts.ScriptKind.TS,
|
|
185
|
+
".tsx": ts.ScriptKind.TSX,
|
|
186
|
+
".js": ts.ScriptKind.JS,
|
|
187
|
+
".mjs": ts.ScriptKind.JS,
|
|
188
|
+
".cjs": ts.ScriptKind.JS,
|
|
189
|
+
".jsx": ts.ScriptKind.JSX,
|
|
190
|
+
".json": ts.ScriptKind.JSON,
|
|
191
|
+
".jsonc": ts.ScriptKind.JSON,
|
|
192
|
+
};
|
|
193
|
+
const PROSE_EXTENSIONS = new Set([".md", ".mdx", ".txt", ".html", ".rst"]);
|
|
194
|
+
/** Files larger than this are not read: a box's declarations are small, and a large file is data or a build. */
|
|
195
|
+
const MAX_FILE_BYTES = 1024 * 1024;
|
|
196
|
+
function propertyName(name) {
|
|
197
|
+
if (!name)
|
|
198
|
+
return undefined;
|
|
199
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNoSubstitutionTemplateLiteral(name))
|
|
200
|
+
return name.text;
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
const isStringLiteral = (n) => ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n);
|
|
204
|
+
/**
|
|
205
|
+
* The literal secrets in a TypeScript, JavaScript or JSON file, read as
|
|
206
|
+
* syntax and never run.
|
|
207
|
+
*/
|
|
208
|
+
export function literalSecretsInCode(text, file, kind) {
|
|
209
|
+
const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, kind);
|
|
210
|
+
const out = [];
|
|
211
|
+
const at = (node, what) => {
|
|
212
|
+
const { line, character } = source.getLineAndCharacterOfPosition(node.getStart(source));
|
|
213
|
+
out.push({ line: line + 1, column: character + 1, what });
|
|
214
|
+
};
|
|
215
|
+
const reported = new Set();
|
|
216
|
+
const visit = (node) => {
|
|
217
|
+
if (isStringLiteral(node) && !reported.has(node)) {
|
|
218
|
+
const shape = credentialShape(node.text);
|
|
219
|
+
if (shape && !isSecretReference(node.text)) {
|
|
220
|
+
reported.add(node);
|
|
221
|
+
at(node, shape);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (ts.isPropertyAssignment(node) && isStringLiteral(node.initializer) && !reported.has(node.initializer)) {
|
|
225
|
+
const key = propertyName(node.name);
|
|
226
|
+
const value = node.initializer.text;
|
|
227
|
+
// A value with a credential's shape is reported by that shape, below.
|
|
228
|
+
if (key !== undefined && !isSecretReference(value) && !namesWhereSecretIs(value) && credentialShape(value) === undefined) {
|
|
229
|
+
if (isCredentialKey(key)) {
|
|
230
|
+
reported.add(node.initializer);
|
|
231
|
+
at(node.initializer, `a literal value for ${key}`);
|
|
232
|
+
}
|
|
233
|
+
else if (key === "value" && ts.isObjectLiteralExpression(node.parent) && isVaultSecret(node.parent)) {
|
|
234
|
+
reported.add(node.initializer);
|
|
235
|
+
at(node.initializer, `a literal vault secret value for ${vaultSecretKey(node.parent) ?? "a key"}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
ts.forEachChild(node, visit);
|
|
240
|
+
};
|
|
241
|
+
visit(source);
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
244
|
+
/** `{ key, value }` with nothing else but a description: the shape of a vault secret. */
|
|
245
|
+
function isVaultSecret(obj) {
|
|
246
|
+
const names = obj.properties.map((p) => (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p) ? propertyName(p.name) : undefined));
|
|
247
|
+
return names.includes("key") && names.includes("value") && names.every((n) => n === "key" || n === "value" || n === "description");
|
|
248
|
+
}
|
|
249
|
+
function vaultSecretKey(obj) {
|
|
250
|
+
for (const p of obj.properties) {
|
|
251
|
+
if (ts.isPropertyAssignment(p) && propertyName(p.name) === "key" && isStringLiteral(p.initializer))
|
|
252
|
+
return p.initializer.text;
|
|
253
|
+
}
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
/** `KEY=value`, `export KEY=value` or `KEY: value`, the value optionally quoted. */
|
|
257
|
+
const ASSIGNMENT = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_.-]*)\s*[=:]\s*(["']?)([^"'\s#]+)\2\s*(?:#.*)?$/;
|
|
258
|
+
/**
|
|
259
|
+
* The literal secrets in any other text file, such as a shell script, an
|
|
260
|
+
* env file or YAML: a credential shape anywhere, or a line assigning a
|
|
261
|
+
* literal to a credential-named key.
|
|
262
|
+
*/
|
|
263
|
+
export function literalSecretsInText(text, assignments = true) {
|
|
264
|
+
const out = [];
|
|
265
|
+
text.split(/\r?\n/).forEach((lineText, i) => {
|
|
266
|
+
for (const { pattern, label } of CREDENTIAL_SHAPES) {
|
|
267
|
+
const m = pattern.exec(lineText);
|
|
268
|
+
if (m && !isSecretReference(m[0])) {
|
|
269
|
+
out.push({ line: i + 1, column: m.index + 1, what: label });
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const a = assignments ? ASSIGNMENT.exec(lineText) : null;
|
|
274
|
+
if (a && isCredentialKey(a[1]) && !isSecretReference(a[3]) && !namesWhereSecretIs(a[3])) {
|
|
275
|
+
out.push({ line: i + 1, column: lineText.indexOf(a[3]) + 1, what: `a literal value for ${a[1]}` });
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
return out;
|
|
279
|
+
}
|
|
280
|
+
function extension(path) {
|
|
281
|
+
const base = path.slice(path.lastIndexOf("/") + 1);
|
|
282
|
+
const dot = base.lastIndexOf(".");
|
|
283
|
+
return dot > 0 ? base.slice(dot).toLowerCase() : "";
|
|
284
|
+
}
|
|
285
|
+
/** The literal secrets in one file, or none when the file is binary or too large. */
|
|
286
|
+
export function literalSecretsInFile(text, path) {
|
|
287
|
+
if (text.length > MAX_FILE_BYTES || text.includes("\0"))
|
|
288
|
+
return [];
|
|
289
|
+
const kind = CODE_EXTENSIONS[extension(path)];
|
|
290
|
+
if (kind !== undefined)
|
|
291
|
+
return literalSecretsInCode(text, path, kind);
|
|
292
|
+
// Prose says "Token: ..." without meaning one, so only a credential's shape counts there.
|
|
293
|
+
return literalSecretsInText(text, !PROSE_EXTENSIONS.has(extension(path)));
|
|
294
|
+
}
|
|
295
|
+
/** Every file under `dir` in `tree`, skipping node_modules and dot-directories, sorted. */
|
|
296
|
+
function filesUnder(tree, dir) {
|
|
297
|
+
const out = [];
|
|
298
|
+
const walk = (d) => {
|
|
299
|
+
for (const e of tree.list(d) ?? []) {
|
|
300
|
+
const p = joinPath(d, e.name);
|
|
301
|
+
if (e.type === "dir") {
|
|
302
|
+
if (!skippedDir(e.name))
|
|
303
|
+
walk(p);
|
|
304
|
+
}
|
|
305
|
+
else
|
|
306
|
+
out.push(p);
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
walk(dir);
|
|
310
|
+
return out.sort();
|
|
311
|
+
}
|
|
312
|
+
const boxMembers = (ctx) => ctx.declaration.members.filter((m) => m.box !== null);
|
|
313
|
+
export const BOX_CHECKS = [
|
|
314
|
+
{
|
|
315
|
+
id: WSP_BOX_CREDENTIAL,
|
|
316
|
+
name: "box-credential-declared",
|
|
317
|
+
description: "A box holds no credential: no file in a box member's directory carries a literal secret, in its declarations, an env or a vault's defaults. Variable references and secret-manager references (op://, bws://, infisical://) are not secrets.",
|
|
318
|
+
severity: "error",
|
|
319
|
+
configurable: false,
|
|
320
|
+
check(ctx) {
|
|
321
|
+
const out = [];
|
|
322
|
+
for (const m of boxMembers(ctx)) {
|
|
323
|
+
const dir = m.dir === "." ? "" : m.dir;
|
|
324
|
+
if (ctx.tree.stat(dir) !== "dir")
|
|
325
|
+
continue;
|
|
326
|
+
for (const path of filesUnder(ctx.tree, dir)) {
|
|
327
|
+
let text;
|
|
328
|
+
try {
|
|
329
|
+
text = ctx.tree.read(path);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
for (const s of literalSecretsInFile(text, path)) {
|
|
335
|
+
out.push({
|
|
336
|
+
checkId: this.id,
|
|
337
|
+
severity: this.severity,
|
|
338
|
+
code: "box-credential-declared",
|
|
339
|
+
message: `box-credential-declared: ${path} holds ${s.what}, and member ${m.name} is a box, which holds no credential; replace it with a \${VAR} or secret-manager reference, or declare the capability as brokered in the member's box block`,
|
|
340
|
+
entity: m.name,
|
|
341
|
+
pointer: m.box.pointer,
|
|
342
|
+
treeFile: path,
|
|
343
|
+
line: s.line,
|
|
344
|
+
column: s.column,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return out;
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
id: WSP_BOX_UNBROKERED,
|
|
354
|
+
name: "box-capability-unbrokered",
|
|
355
|
+
description: "Every capability a box declares names the broker that holds its credential and enforces its scope.",
|
|
356
|
+
severity: "error",
|
|
357
|
+
configurable: true,
|
|
358
|
+
check(ctx) {
|
|
359
|
+
const out = [];
|
|
360
|
+
for (const m of boxMembers(ctx)) {
|
|
361
|
+
for (const c of m.box.capabilities) {
|
|
362
|
+
if (c.broker !== null)
|
|
363
|
+
continue;
|
|
364
|
+
out.push({
|
|
365
|
+
checkId: this.id,
|
|
366
|
+
severity: this.severity,
|
|
367
|
+
code: "box-capability-unbrokered",
|
|
368
|
+
message: `box-capability-unbrokered: member ${m.name}'s box needs ${c.name} and names no broker for it, so the box would hold its credential; set broker to the runtime that holds it, such as the lobby`,
|
|
369
|
+
entity: m.name,
|
|
370
|
+
pointer: c.pointer,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return out;
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
// Box isolation (#2727), WSP123 and WSP124.
|
|
378
|
+
...BOX_ISOLATION_CHECKS,
|
|
379
|
+
{
|
|
380
|
+
id: WSP_BOX_FOUNTAIN_CALLBACK,
|
|
381
|
+
name: "box-fountain-callback-undeclared",
|
|
382
|
+
description: "A box member that builds a fountain Box declares the callback token fountain gives its persistent sandbox: the fountain-callback capability, brokered by fountain, with scope owner.",
|
|
383
|
+
severity: "error",
|
|
384
|
+
configurable: true,
|
|
385
|
+
check(ctx) {
|
|
386
|
+
const out = [];
|
|
387
|
+
const want = FOUNTAIN_CALLBACK_CAPABILITY;
|
|
388
|
+
const expected = `{ "name": "${want.name}", "broker": "${want.broker}", "scope": ["${want.scope[0]}"] }`;
|
|
389
|
+
for (const m of boxMembers(ctx)) {
|
|
390
|
+
const dir = m.dir === "." ? "" : m.dir;
|
|
391
|
+
if (ctx.tree.stat(dir) !== "dir")
|
|
392
|
+
continue;
|
|
393
|
+
let at;
|
|
394
|
+
for (const path of filesUnder(ctx.tree, dir)) {
|
|
395
|
+
const kind = CODE_EXTENSIONS[extension(path)];
|
|
396
|
+
if (kind === undefined || kind === ts.ScriptKind.JSON)
|
|
397
|
+
continue;
|
|
398
|
+
let text;
|
|
399
|
+
try {
|
|
400
|
+
text = ctx.tree.read(path);
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
if (text.length > MAX_FILE_BYTES)
|
|
406
|
+
continue;
|
|
407
|
+
const call = fountainBoxCall(text, path, kind);
|
|
408
|
+
if (call) {
|
|
409
|
+
at = { path, call };
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (!at)
|
|
414
|
+
continue;
|
|
415
|
+
const declared = m.box.capabilities.find((c) => c.name === want.name);
|
|
416
|
+
if (declared && declared.broker === want.broker && declared.scope.includes(want.scope[0]))
|
|
417
|
+
continue;
|
|
418
|
+
const why = !declared
|
|
419
|
+
? "the member's box block does not declare it"
|
|
420
|
+
: declared.broker !== want.broker
|
|
421
|
+
? `the box block's ${want.name} capability names the broker ${declared.broker ?? "(none)"}, but fountain hands this token to the sandbox itself`
|
|
422
|
+
: `the box block's ${want.name} capability has scope [${declared.scope.join(", ")}], not ${want.scope[0]}`;
|
|
423
|
+
out.push({
|
|
424
|
+
checkId: this.id,
|
|
425
|
+
severity: this.severity,
|
|
426
|
+
code: "box-fountain-callback-undeclared",
|
|
427
|
+
message: `box-fountain-callback-undeclared: member ${m.name} builds a fountain Box (${at.path}), and fountain v0.21.0 gives a persistent box's sandbox ` +
|
|
428
|
+
`a callback token scoped to its owner (FOUNTAIN_TOKEN); ${why}. Declare ${expected} in the box block ` +
|
|
429
|
+
`(managoat/fountain#2497 tracks running without it)`,
|
|
430
|
+
entity: m.name,
|
|
431
|
+
pointer: declared?.pointer ?? m.box.pointer,
|
|
432
|
+
treeFile: at.path,
|
|
433
|
+
line: at.call.line,
|
|
434
|
+
column: at.call.column,
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
return out;
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
id: WSP_BOX_INTENT_UNKNOWN,
|
|
442
|
+
name: "box-intent-unknown",
|
|
443
|
+
description: "The intent a box block names is the id of a decision record: a record of a declared kind named decision.",
|
|
444
|
+
severity: "error",
|
|
445
|
+
configurable: true,
|
|
446
|
+
check(ctx) {
|
|
447
|
+
const out = [];
|
|
448
|
+
for (const i of ctx.facts?.boxIntents ?? []) {
|
|
449
|
+
if (i.record)
|
|
450
|
+
continue;
|
|
451
|
+
out.push({
|
|
452
|
+
checkId: this.id,
|
|
453
|
+
severity: this.severity,
|
|
454
|
+
code: "box-intent-unknown",
|
|
455
|
+
message: `box-intent-unknown: member ${i.member}'s box names the intent ${i.id}, and ${i.why}; propose the decision with chant workspace records new, or fix the id`,
|
|
456
|
+
entity: i.member,
|
|
457
|
+
pointer: i.pointer,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
return out;
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
id: WSP_BOX_INTENT_UNCONSTRAINED,
|
|
465
|
+
name: "box-intent-unconstrained",
|
|
466
|
+
description: "The decision record a box names as its intent constrains a member or path of this workspace: member:<a declared member's name>, or a path: entry at, above or inside a declared member's directory. It need not be the box's own member: a box one member runs can be what a decision about another member constrains.",
|
|
467
|
+
severity: "warning",
|
|
468
|
+
configurable: true,
|
|
469
|
+
check(ctx) {
|
|
470
|
+
const out = [];
|
|
471
|
+
const members = ctx.declaration.members;
|
|
472
|
+
for (const i of ctx.facts?.boxIntents ?? []) {
|
|
473
|
+
if (!i.record)
|
|
474
|
+
continue;
|
|
475
|
+
if (i.record.constrains.some((c) => constrainsWorkspace(c, members)))
|
|
476
|
+
continue;
|
|
477
|
+
out.push({
|
|
478
|
+
checkId: this.id,
|
|
479
|
+
severity: this.severity,
|
|
480
|
+
code: "box-intent-unconstrained",
|
|
481
|
+
message: `box-intent-unconstrained: member ${i.member}'s box names the intent ${i.id} (${i.record.path}), whose constrains ` +
|
|
482
|
+
(i.record.constrains.length === 0 ? "is empty" : `names ${i.record.constrains.join(", ")}`) +
|
|
483
|
+
`, and none of it is a member or path of this workspace; add member:<name> for the member the intent is about, or a path: entry at, above or inside a member's directory`,
|
|
484
|
+
entity: i.member,
|
|
485
|
+
pointer: i.pointer,
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
return out;
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
];
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The diagram checks, WSP131 to WSP133 (#2764).
|
|
3
|
+
*
|
|
4
|
+
* A declared diagram names a source and a render, pinned to the renderer
|
|
5
|
+
* its render was made with. chant never runs a renderer (ws-052), on a read
|
|
6
|
+
* path or here: these checks read the declaration and the tree checked
|
|
7
|
+
* only, and a render's drift is caught by comparing a recorded content hash,
|
|
8
|
+
* never by re-rendering the source.
|
|
9
|
+
*
|
|
10
|
+
* | Id | Code | Fails when |
|
|
11
|
+
* |---|---|---|
|
|
12
|
+
* | WSP131 | `diagram-source-missing` | a diagram names a source, and it does not exist in the tree read |
|
|
13
|
+
* | WSP132 | `diagram-render-missing` | a diagram's render does not exist in the tree read |
|
|
14
|
+
* | WSP133 | `diagram-render-drift` | a diagram records a `sourceHash`, and the source's bytes now hash to something else |
|
|
15
|
+
*
|
|
16
|
+
* A mermaid or excalidraw diagram may name no render (a reader such as hud
|
|
17
|
+
* draws it from its source, with the pinned library): WSP132 then has nothing to
|
|
18
|
+
* check, and WSP133, when the entry records a sourceHash, pins the source
|
|
19
|
+
* itself, so an edit to it fails until the hash is updated.
|
|
20
|
+
*
|
|
21
|
+
* WSP133 is opt-in per diagram: without a recorded `sourceHash` there is
|
|
22
|
+
* nothing to compare, so the entry is silently not checked for drift. A
|
|
23
|
+
* declaration records one by hashing the source when it commits a fresh
|
|
24
|
+
* render, the way a decision's evidence pins a file by hash
|
|
25
|
+
* (`../record-assets.ts`). Comparing that one recorded hash against the
|
|
26
|
+
* source in the tree read is cheap and deterministic, unlike shelling out to
|
|
27
|
+
* the pinned renderer and diffing its output, which chant does nowhere.
|
|
28
|
+
*/
|
|
29
|
+
import { sha256Hex } from "../../content-digest.js";
|
|
30
|
+
import { declaredDiagrams } from "../declaration.js";
|
|
31
|
+
/** The read contract's codes for the diagram findings, carried as `code` on each. */
|
|
32
|
+
export const DIAGRAM_FINDING_CODES = ["diagram-source-missing", "diagram-render-missing", "diagram-render-drift"];
|
|
33
|
+
export const WSP_DIAGRAM_SOURCE_MISSING = "WSP131";
|
|
34
|
+
export const WSP_DIAGRAM_RENDER_MISSING = "WSP132";
|
|
35
|
+
export const WSP_DIAGRAM_RENDER_DRIFT = "WSP133";
|
|
36
|
+
const where = (d) => (d.member === null ? "the workspace's own" : `member ${d.member}'s`);
|
|
37
|
+
function diagramFinding(check, d, field, code, message) {
|
|
38
|
+
return {
|
|
39
|
+
checkId: check.id,
|
|
40
|
+
severity: check.severity,
|
|
41
|
+
code,
|
|
42
|
+
message: `${code}: ${message}`,
|
|
43
|
+
entity: d.member ?? undefined,
|
|
44
|
+
pointer: `${d.pointer}/${field}`,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export const DIAGRAM_CHECKS = [
|
|
48
|
+
{
|
|
49
|
+
id: WSP_DIAGRAM_SOURCE_MISSING,
|
|
50
|
+
name: "diagram-source-missing",
|
|
51
|
+
description: "A diagram's source file, when it names one, exists in the tree read.",
|
|
52
|
+
severity: "error",
|
|
53
|
+
configurable: true,
|
|
54
|
+
check(ctx) {
|
|
55
|
+
const out = [];
|
|
56
|
+
for (const d of declaredDiagrams(ctx.declaration)) {
|
|
57
|
+
if (d.source === null || ctx.tree.stat(d.source) === "file")
|
|
58
|
+
continue;
|
|
59
|
+
out.push(diagramFinding(this, d, "source", "diagram-source-missing", `${where(d)} diagram ${d.name} names the source ${d.source}, which does not exist${ctx.tree.label}`));
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: WSP_DIAGRAM_RENDER_MISSING,
|
|
66
|
+
name: "diagram-render-missing",
|
|
67
|
+
description: "A diagram's render, when it names one, exists in the tree read. Only a mermaid or excalidraw diagram may name none.",
|
|
68
|
+
severity: "error",
|
|
69
|
+
configurable: true,
|
|
70
|
+
check(ctx) {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const d of declaredDiagrams(ctx.declaration)) {
|
|
73
|
+
if (d.render === null || ctx.tree.stat(d.render) === "file")
|
|
74
|
+
continue;
|
|
75
|
+
out.push(diagramFinding(this, d, "render", "diagram-render-missing", `${where(d)} diagram ${d.name} names the render ${d.render}, which does not exist${ctx.tree.label}`));
|
|
76
|
+
}
|
|
77
|
+
return out;
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: WSP_DIAGRAM_RENDER_DRIFT,
|
|
82
|
+
name: "diagram-render-drift",
|
|
83
|
+
description: "A diagram that records a sourceHash is unchanged since its render was made: the source's bytes still hash to it. Runs no renderer.",
|
|
84
|
+
severity: "error",
|
|
85
|
+
configurable: true,
|
|
86
|
+
check(ctx) {
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const d of declaredDiagrams(ctx.declaration)) {
|
|
89
|
+
if (d.sourceHash === null || d.source === null)
|
|
90
|
+
continue;
|
|
91
|
+
if (ctx.tree.stat(d.source) !== "file")
|
|
92
|
+
continue; // diagram-source-missing already reports it
|
|
93
|
+
const bytes = ctx.tree.bytes ? ctx.tree.bytes(d.source) : Buffer.from(ctx.tree.read(d.source), "utf-8");
|
|
94
|
+
const actual = sha256Hex(bytes);
|
|
95
|
+
if (actual === d.sourceHash)
|
|
96
|
+
continue;
|
|
97
|
+
const since = d.render === null ? "its sourceHash was recorded" : `${d.render} was rendered from it`;
|
|
98
|
+
const fix = d.render === null ? "update sourceHash" : "rerun the renderer and commit the result, or update sourceHash";
|
|
99
|
+
out.push(diagramFinding(this, d, "sourceHash", "diagram-render-drift", `${where(d)} diagram ${d.name}'s source ${d.source} changed since ${since}: recorded sourceHash ${d.sourceHash.slice(0, 12)} does not match the source's current hash ${actual.slice(0, 12)}${ctx.tree.label}; ${fix}`));
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
];
|