@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,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets & credential detection (#443) — a finding family that is
|
|
3
|
+
* independent of lexicon. Every other finding family in this directory reads
|
|
4
|
+
* a specific CI dialect's structure (a GitHub Actions `steps:` array, a
|
|
5
|
+
* GitLab `variables:` block); this one scans the raw text of any file the
|
|
6
|
+
* audit already reads for shapes that look like a live credential, no matter
|
|
7
|
+
* what kind of file it lives in.
|
|
8
|
+
*
|
|
9
|
+
* Three layers, cheapest/highest-precision first:
|
|
10
|
+
* 1. Well-known provider prefixes (AWS `AKIA…`, GitHub `ghp_…`, Slack
|
|
11
|
+
* `xox…`, Google `AIza…`, Stripe `sk_live_…`) — near-zero false-positive
|
|
12
|
+
* rate because the shape is a vendor-documented constant.
|
|
13
|
+
* 2. Structural shapes (a PEM private-key block, a `scheme://user:pass@host`
|
|
14
|
+
* connection string) — still high precision.
|
|
15
|
+
* 3. A generic high-entropy-string heuristic as the catch-all for anything
|
|
16
|
+
* that doesn't match a known shape. This is the noisy layer, so it only
|
|
17
|
+
* fires on tokens with real character-class diversity, skips pure-hex
|
|
18
|
+
* runs (git SHAs, checksums), and defaults to a conservative threshold
|
|
19
|
+
* that callers can tune.
|
|
20
|
+
*
|
|
21
|
+
* Pure: no fs, no network, no Node-only global. Safe to run in the Workers
|
|
22
|
+
* runtime the hosted audit service uses (epic #350's edge constraint) as well
|
|
23
|
+
* as the CLI.
|
|
24
|
+
*
|
|
25
|
+
* Redaction is the load-bearing guarantee here, not an afterthought: nothing
|
|
26
|
+
* this module returns — message, entity, or any other field on the
|
|
27
|
+
* `AuditFinding` — ever contains the matched secret text. Callers get the
|
|
28
|
+
* rule id, a human label for the kind of secret, the file/line location, and
|
|
29
|
+
* a non-reversible fingerprint of the value (for the allowlist below) —
|
|
30
|
+
* never the value itself. See `secrets.test.ts`'s redaction-guarantee test.
|
|
31
|
+
*/
|
|
32
|
+
const DEFAULT_ENTROPY_THRESHOLD = 4.0;
|
|
33
|
+
const DEFAULT_ENTROPY_MIN_LENGTH = 24;
|
|
34
|
+
// ── Redaction-safe fingerprinting ───────────────────────────────────────
|
|
35
|
+
/**
|
|
36
|
+
* A short fingerprint of a secret value (two intertwined 32-bit hash
|
|
37
|
+
* accumulators, 16 hex chars). Lets an allowlist entry — or a report —
|
|
38
|
+
* reference "this exact occurrence" without ever storing or displaying the
|
|
39
|
+
* secret itself. Not a cryptographic digest (no `crypto` dependency, so this
|
|
40
|
+
* stays pure/edge-safe); it only needs to key an allowlist entry, not resist
|
|
41
|
+
* a determined attacker who already suspects the plaintext.
|
|
42
|
+
*/
|
|
43
|
+
export function fingerprintSecret(value) {
|
|
44
|
+
let h1 = 0x811c9dc5;
|
|
45
|
+
let h2 = 0x9e3779b9;
|
|
46
|
+
for (let i = 0; i < value.length; i++) {
|
|
47
|
+
const c = value.charCodeAt(i);
|
|
48
|
+
h1 ^= c;
|
|
49
|
+
h1 = Math.imul(h1, 0x01000193);
|
|
50
|
+
h2 ^= c;
|
|
51
|
+
h2 = Math.imul(h2, 0x85ebca6b);
|
|
52
|
+
h2 = (h2 << 13) | (h2 >>> 19);
|
|
53
|
+
}
|
|
54
|
+
return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0");
|
|
55
|
+
}
|
|
56
|
+
// ── Inline ignore marker ────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Inline suppression marker: a comment containing `chant-audit-ignore`,
|
|
59
|
+
* optionally scoped to one or more rule ids (`chant-audit-ignore: SEC001`,
|
|
60
|
+
* `chant-audit-ignore SEC001,SEC010`). Bare (no rule ids) suppresses every
|
|
61
|
+
* secrets finding on the line. Works in any comment syntax (`#`, `//`, etc.)
|
|
62
|
+
* since only the marker text is matched, not the comment delimiter.
|
|
63
|
+
*
|
|
64
|
+
* Checked against the finding's own line AND the line immediately above it —
|
|
65
|
+
* a PEM block's `-----BEGIN…-----` line can't carry a trailing comment
|
|
66
|
+
* without corrupting the key, so the marker goes on the line before it.
|
|
67
|
+
*/
|
|
68
|
+
const IGNORE_MARKER_RE = /chant-audit-ignore(?:[:=]?\s*([A-Za-z0-9,\s-]+))?/i;
|
|
69
|
+
function parseIgnoreMarker(line) {
|
|
70
|
+
const m = line.match(IGNORE_MARKER_RE);
|
|
71
|
+
if (!m)
|
|
72
|
+
return undefined;
|
|
73
|
+
const raw = m[1]?.trim();
|
|
74
|
+
if (!raw)
|
|
75
|
+
return { all: true, ids: new Set() };
|
|
76
|
+
const ids = raw
|
|
77
|
+
.split(/[,\s]+/)
|
|
78
|
+
.map((s) => s.trim().toUpperCase())
|
|
79
|
+
.filter(Boolean);
|
|
80
|
+
return ids.length === 0 ? { all: true, ids: new Set() } : { all: false, ids: new Set(ids) };
|
|
81
|
+
}
|
|
82
|
+
function isIgnoredByMarker(lines, lineIdx0, ruleId) {
|
|
83
|
+
for (const idx of [lineIdx0, lineIdx0 - 1]) {
|
|
84
|
+
if (idx < 0 || idx >= lines.length)
|
|
85
|
+
continue;
|
|
86
|
+
const marker = parseIgnoreMarker(lines[idx]);
|
|
87
|
+
if (marker && (marker.all || marker.ids.has(ruleId)))
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// ── Config allowlist ────────────────────────────────────────────────────
|
|
93
|
+
function isAllowed(allow, f) {
|
|
94
|
+
return allow.some((a) => {
|
|
95
|
+
if (!a.ruleId && !a.fingerprint)
|
|
96
|
+
return false; // `file` alone never allows everything in a file
|
|
97
|
+
if (a.ruleId && a.ruleId !== f.ruleId)
|
|
98
|
+
return false;
|
|
99
|
+
if (a.fingerprint && a.fingerprint !== f.fingerprint)
|
|
100
|
+
return false;
|
|
101
|
+
if (a.file && a.file !== f.file && !f.file.endsWith(`/${a.file}`))
|
|
102
|
+
return false;
|
|
103
|
+
return true;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Parse a `.chant-audit.json`-style config's `secrets` section (or a flat
|
|
108
|
+
* object with the same shape) into scan options. Pure — a caller reads the
|
|
109
|
+
* file (CLI: fs; hosted: an already-fetched file), this only parses the
|
|
110
|
+
* text. Tolerant: malformed/missing content yields no options rather than
|
|
111
|
+
* throwing.
|
|
112
|
+
*/
|
|
113
|
+
export function parseSecretsConfig(content) {
|
|
114
|
+
let json;
|
|
115
|
+
try {
|
|
116
|
+
json = JSON.parse(content);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return {};
|
|
120
|
+
}
|
|
121
|
+
const root = json && typeof json === "object" ? json : {};
|
|
122
|
+
const sec = root.secrets && typeof root.secrets === "object" ? root.secrets : root;
|
|
123
|
+
const opts = {};
|
|
124
|
+
if (typeof sec.entropyThreshold === "number")
|
|
125
|
+
opts.entropyThreshold = sec.entropyThreshold;
|
|
126
|
+
if (typeof sec.entropyMinLength === "number")
|
|
127
|
+
opts.entropyMinLength = sec.entropyMinLength;
|
|
128
|
+
if (Array.isArray(sec.allow)) {
|
|
129
|
+
opts.allow = sec.allow
|
|
130
|
+
.filter((a) => !!a && typeof a === "object")
|
|
131
|
+
.map((a) => ({
|
|
132
|
+
ruleId: typeof a.ruleId === "string" ? a.ruleId : undefined,
|
|
133
|
+
file: typeof a.file === "string" ? a.file : undefined,
|
|
134
|
+
fingerprint: typeof a.fingerprint === "string" ? a.fingerprint : undefined,
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
return opts;
|
|
138
|
+
}
|
|
139
|
+
// ── Shannon entropy ─────────────────────────────────────────────────────
|
|
140
|
+
/**
|
|
141
|
+
* Shannon entropy in bits per character. Exported so a lexicon's own
|
|
142
|
+
* secret-shape heuristic can score a candidate on the same scale this
|
|
143
|
+
* module's SEC010 catch-all uses (the terraform lexicon's
|
|
144
|
+
* `lint/secret-shape.ts`, #2110) instead of inventing a second one.
|
|
145
|
+
*/
|
|
146
|
+
export function shannonEntropy(s) {
|
|
147
|
+
const freq = new Map();
|
|
148
|
+
for (const ch of s)
|
|
149
|
+
freq.set(ch, (freq.get(ch) ?? 0) + 1);
|
|
150
|
+
let entropy = 0;
|
|
151
|
+
for (const count of freq.values()) {
|
|
152
|
+
const p = count / s.length;
|
|
153
|
+
entropy -= p * Math.log2(p);
|
|
154
|
+
}
|
|
155
|
+
return entropy;
|
|
156
|
+
}
|
|
157
|
+
// ── Placeholder / low-signal exclusions ─────────────────────────────────
|
|
158
|
+
const PLACEHOLDER_RE = /example|placeholder|dummy|changeme|change-me|redacted|sample|fixme|todo|xxxxxxxx|your[-_]?(api[-_]?)?(key|token|secret)|fake[-_]?(key|token|secret)|test[-_]?(key|token|secret)/i;
|
|
159
|
+
/**
|
|
160
|
+
* Cheap, format-agnostic "this doesn't look like a real secret" filter.
|
|
161
|
+
* Exported for the same reason {@link shannonEntropy} is: the placeholder
|
|
162
|
+
* vocabulary a scanner has to ignore (`changeme`, `example`, `your-api-key`,
|
|
163
|
+
* a run of one repeated character) is the same wherever the candidate came
|
|
164
|
+
* from, and a second copy of this list would drift from this one.
|
|
165
|
+
*/
|
|
166
|
+
export function looksLikePlaceholder(value) {
|
|
167
|
+
if (PLACEHOLDER_RE.test(value))
|
|
168
|
+
return true;
|
|
169
|
+
const uniq = new Set(value.toLowerCase()).size;
|
|
170
|
+
if (value.length > 8 && uniq <= 2)
|
|
171
|
+
return true; // e.g. "0000000000000000"
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
function connStringHasPlaceholderCreds(match) {
|
|
175
|
+
const m = match.match(/:\/\/([^:@/\s]+):([^@/\s]+)@/);
|
|
176
|
+
if (!m)
|
|
177
|
+
return false;
|
|
178
|
+
const bland = /^(user(name)?|admin|root|pass(word)?|changeme|example|test|dummy|guest|secret)$/i;
|
|
179
|
+
return bland.test(m[1]) && bland.test(m[2]);
|
|
180
|
+
}
|
|
181
|
+
const DETECTORS = [
|
|
182
|
+
{
|
|
183
|
+
ruleId: "SEC001",
|
|
184
|
+
kind: "AWS access key ID",
|
|
185
|
+
severity: "error",
|
|
186
|
+
regex: /\b(?:AKIA|ABIA|ACCA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA)[A-Z0-9]{16}\b/g,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
ruleId: "SEC002",
|
|
190
|
+
kind: "AWS secret access key",
|
|
191
|
+
severity: "error",
|
|
192
|
+
regex: /\baws_secret_access_key\s*[:=]\s*['"]?([A-Za-z0-9/+]{40})['"]?/gi,
|
|
193
|
+
extract: (m) => m[1],
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
ruleId: "SEC003",
|
|
197
|
+
kind: "GitHub token",
|
|
198
|
+
severity: "error",
|
|
199
|
+
regex: /\bgh[pousr]_[A-Za-z0-9]{36,255}\b/g,
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
ruleId: "SEC004",
|
|
203
|
+
kind: "Slack token",
|
|
204
|
+
severity: "error",
|
|
205
|
+
regex: /\bxox[baprs]-[0-9A-Za-z-]{10,72}\b/g,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
ruleId: "SEC005",
|
|
209
|
+
kind: "Google API key",
|
|
210
|
+
severity: "error",
|
|
211
|
+
regex: /\bAIza[0-9A-Za-z\-_]{35}\b/g,
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
ruleId: "SEC006",
|
|
215
|
+
kind: "Stripe live secret key",
|
|
216
|
+
severity: "error",
|
|
217
|
+
regex: /\b(?:sk|rk)_live_[0-9A-Za-z]{24,}\b/g,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
ruleId: "SEC007",
|
|
221
|
+
kind: "PEM private key block",
|
|
222
|
+
severity: "error",
|
|
223
|
+
regex: /-----BEGIN ((?:RSA|EC|DSA|OPENSSH|ENCRYPTED|PGP) PRIVATE KEY|PRIVATE KEY)-----[\s\S]*?-----END \1-----/g,
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
ruleId: "SEC008",
|
|
227
|
+
kind: "Bearer/authorization token",
|
|
228
|
+
severity: "warning",
|
|
229
|
+
regex: /\b[Bb]earer\s+([A-Za-z0-9\-_.~+/]{20,}={0,2})/g,
|
|
230
|
+
extract: (m) => m[1],
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
ruleId: "SEC009",
|
|
234
|
+
kind: "Credentials embedded in a connection string",
|
|
235
|
+
severity: "error",
|
|
236
|
+
regex: /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|ftp|sftp|ldap|sqlserver|jdbc:[a-z]+):\/\/[^\s'"/:@]+:[^\s'"/@]+@[^\s'"/]+/gi,
|
|
237
|
+
extraFilter: (full) => !connStringHasPlaceholderCreds(full),
|
|
238
|
+
},
|
|
239
|
+
];
|
|
240
|
+
/** The high-entropy catch-all's rule id (kept distinct so callers can special-case it). */
|
|
241
|
+
export const ENTROPY_RULE_ID = "SEC010";
|
|
242
|
+
const HEX_ONLY_RE = /^[0-9a-f]+$/i;
|
|
243
|
+
/**
|
|
244
|
+
* A `word-word-word`/`word/word` slug reads as a dashed/slashed identifier —
|
|
245
|
+
* a model id (`anthropic/claude-sonnet-4-6`), an npm package spec, a docker
|
|
246
|
+
* image ref — not a secret: a real random secret's `-`/`_`/`/` runs don't
|
|
247
|
+
* line up with dictionary-shaped alphabetic chunks. Requires at least two
|
|
248
|
+
* separators so a single hyphen (common inside genuine tokens) doesn't
|
|
249
|
+
* trigger it.
|
|
250
|
+
*/
|
|
251
|
+
export function looksLikeIdentifierSlug(value) {
|
|
252
|
+
const parts = value.split(/[-_/]/).filter(Boolean);
|
|
253
|
+
if (parts.length < 3)
|
|
254
|
+
return false;
|
|
255
|
+
const wordy = parts.filter((p) => /^[a-zA-Z]+$/.test(p) && p.length >= 3).length;
|
|
256
|
+
return wordy / parts.length >= 0.5;
|
|
257
|
+
}
|
|
258
|
+
/** At least 3 of {lower, upper, digit, symbol} present — cuts plain-word / all-hex false positives. */
|
|
259
|
+
function hasClassDiversity(value) {
|
|
260
|
+
let classes = 0;
|
|
261
|
+
if (/[a-z]/.test(value))
|
|
262
|
+
classes++;
|
|
263
|
+
if (/[A-Z]/.test(value))
|
|
264
|
+
classes++;
|
|
265
|
+
if (/[0-9]/.test(value))
|
|
266
|
+
classes++;
|
|
267
|
+
if (/[^A-Za-z0-9]/.test(value))
|
|
268
|
+
classes++;
|
|
269
|
+
return classes >= 3;
|
|
270
|
+
}
|
|
271
|
+
// ── Line-number lookup ───────────────────────────────────────────────────
|
|
272
|
+
function lineStarts(content) {
|
|
273
|
+
const starts = [0];
|
|
274
|
+
for (let i = 0; i < content.length; i++)
|
|
275
|
+
if (content[i] === "\n")
|
|
276
|
+
starts.push(i + 1);
|
|
277
|
+
return starts;
|
|
278
|
+
}
|
|
279
|
+
function lineNumberFor(starts, index) {
|
|
280
|
+
let lo = 0;
|
|
281
|
+
let hi = starts.length - 1;
|
|
282
|
+
let ans = 0;
|
|
283
|
+
while (lo <= hi) {
|
|
284
|
+
const mid = (lo + hi) >> 1;
|
|
285
|
+
if (starts[mid] <= index) {
|
|
286
|
+
ans = mid;
|
|
287
|
+
lo = mid + 1;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
hi = mid - 1;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return ans + 1; // 1-based
|
|
294
|
+
}
|
|
295
|
+
// ── Scan ──────────────────────────────────────────────────────────────────
|
|
296
|
+
/**
|
|
297
|
+
* Scan a set of files for likely secrets/credentials. Pure with respect to
|
|
298
|
+
* the filesystem and network. Findings never carry the matched value —
|
|
299
|
+
* only its rule id, kind, file/line, and a redaction-safe fingerprint.
|
|
300
|
+
*/
|
|
301
|
+
/**
|
|
302
|
+
* Machine-generated dependency lockfiles. Skipped entirely: they are wall-to-
|
|
303
|
+
* wall content-integrity hashes (`sha512-…` and friends), which the entropy
|
|
304
|
+
* heuristic reads as hundreds of "possible secrets" per file — a single
|
|
305
|
+
* `package-lock.json` produced 438 merge-worthy SEC010 findings on the first
|
|
306
|
+
* repo that dogfooded this at `--fail-on merge-worthy`. Integrity hashes are
|
|
307
|
+
* public by construction, a credential does not live in a lockfile, and no
|
|
308
|
+
* other scanner reads them.
|
|
309
|
+
*/
|
|
310
|
+
const LOCKFILE_NAMES = new Set([
|
|
311
|
+
"package-lock.json",
|
|
312
|
+
"npm-shrinkwrap.json",
|
|
313
|
+
"yarn.lock",
|
|
314
|
+
"pnpm-lock.yaml",
|
|
315
|
+
"bun.lock",
|
|
316
|
+
"deno.lock",
|
|
317
|
+
"Cargo.lock",
|
|
318
|
+
"poetry.lock",
|
|
319
|
+
"uv.lock",
|
|
320
|
+
"Pipfile.lock",
|
|
321
|
+
"composer.lock",
|
|
322
|
+
"Gemfile.lock",
|
|
323
|
+
"go.sum",
|
|
324
|
+
"flake.lock",
|
|
325
|
+
]);
|
|
326
|
+
/** Is this a dependency lockfile the secrets scan should skip? */
|
|
327
|
+
export function isLockfilePath(path) {
|
|
328
|
+
const name = path.split("/").pop() ?? path;
|
|
329
|
+
return LOCKFILE_NAMES.has(name);
|
|
330
|
+
}
|
|
331
|
+
export function scanForSecrets(files, opts = {}) {
|
|
332
|
+
const entropyThreshold = opts.entropyThreshold ?? DEFAULT_ENTROPY_THRESHOLD;
|
|
333
|
+
const entropyMinLength = opts.entropyMinLength ?? DEFAULT_ENTROPY_MIN_LENGTH;
|
|
334
|
+
const allow = opts.allow ?? [];
|
|
335
|
+
const entropyRe = new RegExp(`[A-Za-z0-9_\\-+/=]{${entropyMinLength},}`, "g");
|
|
336
|
+
const findings = [];
|
|
337
|
+
for (const file of files) {
|
|
338
|
+
if (!file.content)
|
|
339
|
+
continue;
|
|
340
|
+
if (isLockfilePath(file.path))
|
|
341
|
+
continue;
|
|
342
|
+
const lines = file.content.split("\n");
|
|
343
|
+
const starts = lineStarts(file.content);
|
|
344
|
+
const claimed = [];
|
|
345
|
+
// `claimed` marks text a pattern detector already matched, so the entropy
|
|
346
|
+
// catch-all doesn't re-flag the same value under SEC010 — regardless of
|
|
347
|
+
// whether the pattern-detector's own finding gets suppressed below. An
|
|
348
|
+
// ignored/allowed PEM block, for instance, must not have its base64 body
|
|
349
|
+
// re-flagged as a fresh "high-entropy string" (that would defeat the
|
|
350
|
+
// suppression, not just duplicate it).
|
|
351
|
+
const emit = (ruleId, kind, severity, index, length, secretValue) => {
|
|
352
|
+
const lineNo = lineNumberFor(starts, index);
|
|
353
|
+
if (isIgnoredByMarker(lines, lineNo - 1, ruleId))
|
|
354
|
+
return;
|
|
355
|
+
const fingerprint = fingerprintSecret(secretValue);
|
|
356
|
+
if (isAllowed(allow, { ruleId, file: file.path, fingerprint }))
|
|
357
|
+
return;
|
|
358
|
+
findings.push({
|
|
359
|
+
checkId: ruleId,
|
|
360
|
+
severity,
|
|
361
|
+
message: `Likely secret detected: ${kind} at ${file.path}:${lineNo} (value redacted, ${secretValue.length} chars, fingerprint ${fingerprint}). Remove it from source and rotate the credential.`,
|
|
362
|
+
file: file.path,
|
|
363
|
+
lexicon: "secrets",
|
|
364
|
+
entity: kind,
|
|
365
|
+
line: lineNo,
|
|
366
|
+
fingerprint,
|
|
367
|
+
});
|
|
368
|
+
};
|
|
369
|
+
for (const d of DETECTORS) {
|
|
370
|
+
for (const m of file.content.matchAll(d.regex)) {
|
|
371
|
+
const full = m[0];
|
|
372
|
+
const secretValue = d.extract ? d.extract(m) : full;
|
|
373
|
+
if (!secretValue)
|
|
374
|
+
continue;
|
|
375
|
+
if (looksLikePlaceholder(secretValue))
|
|
376
|
+
continue;
|
|
377
|
+
if (d.extraFilter && !d.extraFilter(full))
|
|
378
|
+
continue;
|
|
379
|
+
const index = m.index ?? 0;
|
|
380
|
+
claimed.push([index, index + full.length]);
|
|
381
|
+
emit(d.ruleId, d.kind, d.severity, index, full.length, secretValue);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
for (const m of file.content.matchAll(entropyRe)) {
|
|
385
|
+
const value = m[0];
|
|
386
|
+
const start = m.index ?? 0;
|
|
387
|
+
const end = start + value.length;
|
|
388
|
+
if (claimed.some(([s, e]) => start < e && end > s))
|
|
389
|
+
continue; // already assessed by a pattern detector
|
|
390
|
+
if (HEX_ONLY_RE.test(value))
|
|
391
|
+
continue; // likely a git SHA / checksum, not a secret
|
|
392
|
+
if (!hasClassDiversity(value))
|
|
393
|
+
continue;
|
|
394
|
+
if (looksLikePlaceholder(value))
|
|
395
|
+
continue;
|
|
396
|
+
if (looksLikeIdentifierSlug(value))
|
|
397
|
+
continue; // a model id / package spec / image ref, not a secret
|
|
398
|
+
const entropy = shannonEntropy(value);
|
|
399
|
+
if (entropy < entropyThreshold)
|
|
400
|
+
continue;
|
|
401
|
+
emit(ENTROPY_RULE_ID, `high-entropy string (~${entropy.toFixed(2)} bits/char)`, "warning", start, value.length, value);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return findings;
|
|
405
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TF023 (#2110): Terraform state, or the `.terraform/` working directory,
|
|
3
|
+
* committed to the repository.
|
|
4
|
+
*
|
|
5
|
+
* Every other rule in the TF family is a post-synth check over a parsed root
|
|
6
|
+
* module, contributed by the terraform lexicon. This one is not about HCL at
|
|
7
|
+
* all: the finding is that a path exists in version control, so there is
|
|
8
|
+
* nothing for `chant build` to check and nothing for the lexicon's parser to
|
|
9
|
+
* read. It therefore takes the shape `secrets.ts` established and `wrangler.ts`
|
|
10
|
+
* and `nginx.ts` copied, a path detector plus a check over the discovered file
|
|
11
|
+
* list, called from the audit CLI beside `scanForSecrets`, with its catalog
|
|
12
|
+
* entry in core's own `RULE_CATALOG` (./catalog.ts) rather than a lexicon's.
|
|
13
|
+
* It runs whether or not the terraform lexicon is installed.
|
|
14
|
+
*
|
|
15
|
+
* A state file is a committed secret store: it records every attribute of every
|
|
16
|
+
* managed resource, including the ones providers mark sensitive, in plaintext
|
|
17
|
+
* JSON. `.terraform/` is milder (providers and vendored modules) but is still
|
|
18
|
+
* hundreds of megabytes of machine-generated content, and it can hold a
|
|
19
|
+
* `terraform.tfstate` of its own for the workspace-local backend.
|
|
20
|
+
*
|
|
21
|
+
* Pure: no fs, no network, no Node-only global, so it is Workers-safe (epic #350). The
|
|
22
|
+
* walk that decides which paths reach here is `discover.ts`'s
|
|
23
|
+
* `collectCandidates`, which is also where a locally ignored path is dropped:
|
|
24
|
+
* see `isTerraformStatePath` there and `gitignoreCoversTerraformState` below.
|
|
25
|
+
* The root `.gitignore` and every nested one on the way to the path can drop
|
|
26
|
+
* it (`nestedGitignoreCovering`, #2528).
|
|
27
|
+
*/
|
|
28
|
+
/** `terraform.tfstate`, `terraform.tfstate.backup`, and any other `*.tfstate`. */
|
|
29
|
+
export function isTerraformStateFile(path) {
|
|
30
|
+
const name = path.split("/").pop() ?? path;
|
|
31
|
+
return /\.tfstate(\.backup)?$/i.test(name);
|
|
32
|
+
}
|
|
33
|
+
/** The `.terraform` working directory itself, or anything inside it. */
|
|
34
|
+
export function isTerraformWorkDir(path) {
|
|
35
|
+
const parts = path.split("/");
|
|
36
|
+
return parts.includes(".terraform");
|
|
37
|
+
}
|
|
38
|
+
/** Either of the two shapes TF023 reports. */
|
|
39
|
+
export function isTerraformStatePath(path) {
|
|
40
|
+
return isTerraformStateFile(path) || isTerraformWorkDir(path);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Does a `.gitignore` body already exclude Terraform state? Deliberately
|
|
44
|
+
* narrow: it recognises the handful of patterns the style guide's own
|
|
45
|
+
* `.gitignore` section and `github/gitignore`'s `Terraform.gitignore` use
|
|
46
|
+
* (`*.tfstate`, `*.tfstate.*`, `.terraform/`, `.terraform*`, with an optional
|
|
47
|
+
* leading slash or a leading double-star), not the whole gitignore grammar. A repository that
|
|
48
|
+
* writes something more exotic gets a finding it can suppress; the alternative,
|
|
49
|
+
* a partial gitignore engine, would be wrong in quieter ways.
|
|
50
|
+
*
|
|
51
|
+
* Used by the local walk only (`discover.ts`), where "on disk" and "tracked by
|
|
52
|
+
* git" are different questions and nearly every Terraform working tree has an
|
|
53
|
+
* ignored `.terraform/` in it. A fetched repository's file list is already
|
|
54
|
+
* exactly the tracked files, so nothing filters it.
|
|
55
|
+
*/
|
|
56
|
+
function escapeRegExp(literal) {
|
|
57
|
+
return literal.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
58
|
+
}
|
|
59
|
+
export function gitignoreCoversTerraformState(gitignore, path) {
|
|
60
|
+
const name = path.split("/").pop() ?? path;
|
|
61
|
+
for (const raw of gitignore.split("\n")) {
|
|
62
|
+
const line = raw.trim();
|
|
63
|
+
if (line === "" || line.startsWith("#") || line.startsWith("!"))
|
|
64
|
+
continue;
|
|
65
|
+
const pattern = line.replace(/^\*\*\//, "").replace(/^\//, "").replace(/\/$/, "");
|
|
66
|
+
if (pattern === "" || pattern.includes("/"))
|
|
67
|
+
continue;
|
|
68
|
+
// `*` matches within one path segment, as git's own glob does. The pattern
|
|
69
|
+
// is compared against the file's own name and against every segment of its
|
|
70
|
+
// path, which is what makes `.terraform/` match `infra/prod/.terraform`.
|
|
71
|
+
const re = new RegExp(`^${pattern.split("*").map(escapeRegExp).join("[^/]*")}$`);
|
|
72
|
+
if (re.test(name) || path.split("/").some((segment) => re.test(segment)))
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The nearest directory strictly between a TF023 path and the scan root whose
|
|
79
|
+
* `.gitignore` covers that path, or undefined. Each `.gitignore` is matched
|
|
80
|
+
* against the path relative to its own directory, the way git scopes it, with
|
|
81
|
+
* the same narrow matcher as the root one. `readGitignore` takes a directory
|
|
82
|
+
* relative to the scan root and returns its `.gitignore` body, if any.
|
|
83
|
+
*
|
|
84
|
+
* The local walk drops a TF023 path this returns a directory for, as it drops
|
|
85
|
+
* one the root `.gitignore` covers (#2528).
|
|
86
|
+
*/
|
|
87
|
+
export function nestedGitignoreCovering(path, readGitignore) {
|
|
88
|
+
const parts = path.split("/");
|
|
89
|
+
for (let depth = parts.length - 1; depth > 0; depth--) {
|
|
90
|
+
const dir = parts.slice(0, depth).join("/");
|
|
91
|
+
const body = readGitignore(dir);
|
|
92
|
+
if (body !== undefined && gitignoreCoversTerraformState(body, parts.slice(depth).join("/")))
|
|
93
|
+
return dir;
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Report TF023 for every committed state file and `.terraform/` directory in
|
|
99
|
+
* the file list. One finding per path, and one for the `.terraform` directory
|
|
100
|
+
* as a whole rather than per file inside it: a vendored provider binary is not
|
|
101
|
+
* a separate finding from the directory that holds it.
|
|
102
|
+
*/
|
|
103
|
+
export function auditTerraformState(files) {
|
|
104
|
+
const findings = [];
|
|
105
|
+
const workDirs = new Set();
|
|
106
|
+
for (const file of files) {
|
|
107
|
+
if (isTerraformWorkDir(file.path)) {
|
|
108
|
+
const parts = file.path.split("/");
|
|
109
|
+
const dir = parts.slice(0, parts.indexOf(".terraform") + 1).join("/");
|
|
110
|
+
if (workDirs.has(dir))
|
|
111
|
+
continue;
|
|
112
|
+
workDirs.add(dir);
|
|
113
|
+
findings.push({
|
|
114
|
+
checkId: "TF023",
|
|
115
|
+
severity: "warning",
|
|
116
|
+
message: `\`${dir}\` is committed to the repository. Terraform's working directory holds downloaded ` +
|
|
117
|
+
"providers and vendored child modules, and the local backend keeps its state there too. " +
|
|
118
|
+
"Delete it from version control and add `.terraform/` to .gitignore.",
|
|
119
|
+
file: dir,
|
|
120
|
+
lexicon: "terraform",
|
|
121
|
+
entity: ".terraform",
|
|
122
|
+
});
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (!isTerraformStateFile(file.path))
|
|
126
|
+
continue;
|
|
127
|
+
findings.push({
|
|
128
|
+
checkId: "TF023",
|
|
129
|
+
severity: "error",
|
|
130
|
+
message: `\`${file.path}\` is committed to the repository. A state file records every attribute of every ` +
|
|
131
|
+
"managed resource in plaintext, including the ones providers mark sensitive, so a committed " +
|
|
132
|
+
"state file is a committed secret store. Remove it from version control, add `*.tfstate` and " +
|
|
133
|
+
"`*.tfstate.backup` to .gitignore, move the state to a remote backend, and rotate anything it held.",
|
|
134
|
+
file: file.path,
|
|
135
|
+
lexicon: "terraform",
|
|
136
|
+
entity: file.path.split("/").pop() ?? file.path,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return findings;
|
|
140
|
+
}
|