@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,571 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant audit` — run chant's security, correctness, and best-practice checks against an existing repo's
|
|
3
|
+
* pipeline YAML and emit a tiered report. Does not require a chant project;
|
|
4
|
+
* it reads `.github/workflows`, `.gitlab-ci.yml`, and `.forgejo/workflows`
|
|
5
|
+
* directly and runs the real post-synth checks via the audit core.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
8
|
+
import { dirname, join, resolve } from "path";
|
|
9
|
+
import { auditFiles } from "../../audit/core.js";
|
|
10
|
+
import { AUDIT_LEXICONS, classifyFiles, loadAuditPlugins, unclaimedFiles, walkCandidates } from "../../audit/discover.js";
|
|
11
|
+
import { RULE_CATALOG, resolveAuditCatalog } from "../../audit/catalog.js";
|
|
12
|
+
import { scanForSecrets, parseSecretsConfig } from "../../audit/secrets.js";
|
|
13
|
+
import { auditWranglerConfigs } from "../../audit/wrangler.js";
|
|
14
|
+
import { auditNginxConfigs } from "../../audit/nginx.js";
|
|
15
|
+
import { auditTerraformState } from "../../audit/terraform-state.js";
|
|
16
|
+
import { workspaceMemberDirs } from "../../discovery/walk.js";
|
|
17
|
+
import { renderMarkdown } from "../../audit/report.js";
|
|
18
|
+
import { renderHtml } from "../../audit/report-html.js";
|
|
19
|
+
import { buildReportJson, REPORT_SCHEMA_VERSION } from "../../audit/report-model.js";
|
|
20
|
+
import { fetchRepoFiles, resolveActionSha, resolveImageDigest, resolveRepoCommit, parseRepoUrl, FetchError } from "../../audit/fetch.js";
|
|
21
|
+
import { extractUnpinnedActions, extractUnpinnedImages } from "../../audit/proof.js";
|
|
22
|
+
import { formatWarning } from "../format.js";
|
|
23
|
+
import { lexiconPackagesToInstall, lexiconSourceLabel, pathLexiconMap, recordedLexiconModules } from "../../lexicon-module.js";
|
|
24
|
+
import { readConfigFieldsStatically, readLexiconDeclarationsStatically, unknownPathLexiconsNotice } from "../../config-static.js";
|
|
25
|
+
import { findProjectConfigPastFragments } from "../../config.js";
|
|
26
|
+
/** Exit code when the audit had no lexicons to look with. Distinct from 1 (findings / failure). */
|
|
27
|
+
export const NO_LEXICONS_EXIT_CODE = 2;
|
|
28
|
+
/**
|
|
29
|
+
* What to tell the user about lexicons that did not load: an `npm i` line for
|
|
30
|
+
* the package-backed ones, and the declared path for any lexicon
|
|
31
|
+
* `chant.config.ts` names by path (#2520), which has no package to install
|
|
32
|
+
* (chant#2578).
|
|
33
|
+
*/
|
|
34
|
+
function missingLexiconRemedy(names, paths) {
|
|
35
|
+
const parts = [];
|
|
36
|
+
const pkgs = lexiconPackagesToInstall(names, paths);
|
|
37
|
+
if (pkgs.length > 0)
|
|
38
|
+
parts.push(`npm i ${pkgs.join(" ")}`);
|
|
39
|
+
for (const name of names) {
|
|
40
|
+
if (paths.has(name))
|
|
41
|
+
parts.push(`${name} is declared by path: ${lexiconSourceLabel(name, process.cwd(), paths)}`);
|
|
42
|
+
}
|
|
43
|
+
return parts.join("; ");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The rule ids the audited project enables with `lint.rules` (anything but
|
|
47
|
+
* `"off"`), read from its config without running it, the way the audit reads
|
|
48
|
+
* its lexicon paths. Only a check marked `auditOptIn` consults this (#3190).
|
|
49
|
+
* A config that cannot be read statically enables nothing.
|
|
50
|
+
*/
|
|
51
|
+
export function readEnabledRules(path) {
|
|
52
|
+
const enabled = new Set();
|
|
53
|
+
try {
|
|
54
|
+
const read = readConfigFieldsStatically(findProjectConfigPastFragments(path).dir, ["lint"]);
|
|
55
|
+
const rules = read.status === "read" ? read.fields.lint?.rules : undefined;
|
|
56
|
+
if (typeof rules !== "object" || rules === null)
|
|
57
|
+
return enabled;
|
|
58
|
+
for (const [id, value] of Object.entries(rules)) {
|
|
59
|
+
const severity = Array.isArray(value) ? value[0] : value;
|
|
60
|
+
if (severity !== "off")
|
|
61
|
+
enabled.add(id);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// an unreadable config enables nothing
|
|
66
|
+
}
|
|
67
|
+
return enabled;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* chant#2589 — the lexicons a local target's chant.config declares by path,
|
|
71
|
+
* with any recorded earlier in this process. The config is read statically
|
|
72
|
+
* (../../config-static.ts) and never evaluated, and the paths are not
|
|
73
|
+
* recorded for the loaders: audit names them in its messages, but never
|
|
74
|
+
* imports a project's lexicon module. `notice` is set when the config's
|
|
75
|
+
* `lexicons` could not be read that way.
|
|
76
|
+
*/
|
|
77
|
+
export function auditPathLexicons(target, isUrl) {
|
|
78
|
+
const paths = recordedLexiconModules();
|
|
79
|
+
if (isUrl)
|
|
80
|
+
return { paths };
|
|
81
|
+
const read = readLexiconDeclarationsStatically(resolve(target));
|
|
82
|
+
if (read.status === "read") {
|
|
83
|
+
for (const [name, path] of pathLexiconMap(read.entries, dirname(read.configPath)))
|
|
84
|
+
paths.set(name, path);
|
|
85
|
+
}
|
|
86
|
+
return { paths, notice: unknownPathLexiconsNotice(read) };
|
|
87
|
+
}
|
|
88
|
+
/** Missing audit lexicons the unclaimed files pointed at, in first-seen order. */
|
|
89
|
+
function wantedLexicons(unclaimed) {
|
|
90
|
+
return [...new Set(unclaimed.map((u) => u.lexicon))];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The exact one-liner that gives a bare `npx @intentius/chant audit` the
|
|
94
|
+
* lexicons it needs. Every wanted lexicon is a `-p` package so npx puts all of
|
|
95
|
+
* them on the same resolution path.
|
|
96
|
+
*/
|
|
97
|
+
export function installLine(lexicons, target, paths = recordedLexiconModules()) {
|
|
98
|
+
// chant#2578 — a lexicon declared by path has no package for npx to fetch.
|
|
99
|
+
const pkgs = ["@intentius/chant", ...lexiconPackagesToInstall(lexicons, paths)];
|
|
100
|
+
return `npx ${pkgs.map((p) => `-p ${p}`).join(" ")} chant audit ${target}`;
|
|
101
|
+
}
|
|
102
|
+
/** One-line coverage hint for the partial case: some lexicons loaded, others wanted by files on disk. */
|
|
103
|
+
function missingLexiconHint(unclaimed, paths) {
|
|
104
|
+
const wanted = wantedLexicons(unclaimed);
|
|
105
|
+
if (wanted.length === 0)
|
|
106
|
+
return undefined;
|
|
107
|
+
const n = unclaimed.length;
|
|
108
|
+
return `${n} file${n === 1 ? " looks" : "s look"} like ${wanted.join("/")} but ${wanted.length === 1 ? "that lexicon is" : "those lexicons are"} not installed, so ${n === 1 ? "it was" : "they were"} skipped` +
|
|
109
|
+
` (${missingLexiconRemedy(wanted, paths)}).`;
|
|
110
|
+
}
|
|
111
|
+
/** Human-readable diagnostic for the zero-lexicon case. */
|
|
112
|
+
function renderNoLexicons(target, unclaimed, paths, truncated) {
|
|
113
|
+
const lines = [];
|
|
114
|
+
lines.push(`chant audit had nothing to look with: no audit lexicon is installed, so nothing under ${target} was inspected.`);
|
|
115
|
+
lines.push("This is not a clean result. Detection and checks live in the lexicon packages.");
|
|
116
|
+
if (truncated)
|
|
117
|
+
lines.push("", `Note: ${truncationNote(truncated, target)}`);
|
|
118
|
+
const wanted = wantedLexicons(unclaimed);
|
|
119
|
+
if (unclaimed.length > 0) {
|
|
120
|
+
lines.push("", "Files that wanted a lexicon:");
|
|
121
|
+
for (const u of unclaimed) {
|
|
122
|
+
lines.push(` ${u.path} -> ${u.lexicon}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
lines.push("", "No file under the target looked like CI, Kubernetes, Helm, Docker, CloudFormation, ARM, Config Connector, fountain, or Terraform either.");
|
|
127
|
+
}
|
|
128
|
+
lines.push("", "Run it with the lexicons those files need:");
|
|
129
|
+
const lexicons = wanted.length > 0 ? wanted : [...AUDIT_LEXICONS];
|
|
130
|
+
lines.push(` ${installLine(lexicons, target, paths)}`);
|
|
131
|
+
// chant#2589 — a lexicon declared by path is left out of the line above.
|
|
132
|
+
for (const name of lexicons) {
|
|
133
|
+
if (paths.has(name))
|
|
134
|
+
lines.push(` (${name} is declared by path: ${lexiconSourceLabel(name, process.cwd(), paths)})`);
|
|
135
|
+
}
|
|
136
|
+
return lines.join("\n");
|
|
137
|
+
}
|
|
138
|
+
/** Machine-readable form of the zero-lexicon diagnostic (`status: "no-lexicons"`). */
|
|
139
|
+
function renderNoLexiconsJson(target, unclaimed, paths, truncated) {
|
|
140
|
+
const wanted = wantedLexicons(unclaimed);
|
|
141
|
+
return JSON.stringify({
|
|
142
|
+
schemaVersion: REPORT_SCHEMA_VERSION,
|
|
143
|
+
tool: { name: "chant-audit" },
|
|
144
|
+
status: "no-lexicons",
|
|
145
|
+
target,
|
|
146
|
+
summary: { total: 0 },
|
|
147
|
+
findings: [],
|
|
148
|
+
unclaimed,
|
|
149
|
+
missingLexicons: wanted,
|
|
150
|
+
install: installLine(wanted.length > 0 ? wanted : [...AUDIT_LEXICONS], target, paths),
|
|
151
|
+
truncated,
|
|
152
|
+
}, null, 2);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Select the fetch token for a repo host. Tokens are host-specific — a GitHub
|
|
156
|
+
* PAT sent to GitLab/Codeberg is rejected (401) — so we never cross hosts.
|
|
157
|
+
*/
|
|
158
|
+
export function tokenForHost(url, env = process.env) {
|
|
159
|
+
let host;
|
|
160
|
+
try {
|
|
161
|
+
host = new URL(url).hostname;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
switch (host) {
|
|
167
|
+
case "gitlab.com":
|
|
168
|
+
return env.GITLAB_TOKEN ?? env.CHANT_AUDIT_GITLAB_TOKEN;
|
|
169
|
+
case "codeberg.org":
|
|
170
|
+
return env.CODEBERG_TOKEN ?? env.CHANT_AUDIT_CODEBERG_TOKEN;
|
|
171
|
+
case "github.com":
|
|
172
|
+
return env.GITHUB_TOKEN ?? env.CHANT_AUDIT_GITHUB_TOKEN;
|
|
173
|
+
default:
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** GitHub token used for action-SHA resolution (always queries api.github.com). */
|
|
178
|
+
function githubToken(env = process.env) {
|
|
179
|
+
return env.GITHUB_TOKEN ?? env.CHANT_AUDIT_GITHUB_TOKEN;
|
|
180
|
+
}
|
|
181
|
+
function isMergeWorthy(f, catalog = RULE_CATALOG) {
|
|
182
|
+
return catalog[f.checkId]?.tier === "merge-worthy";
|
|
183
|
+
}
|
|
184
|
+
function exitCodeFor(findings, failOn, catalog = RULE_CATALOG) {
|
|
185
|
+
if (failOn === "merge-worthy")
|
|
186
|
+
return findings.some((f) => isMergeWorthy(f, catalog)) ? 1 : 0;
|
|
187
|
+
if (failOn === "warning") {
|
|
188
|
+
return findings.some((f) => f.severity === "error" || f.severity === "warning") ? 1 : 0;
|
|
189
|
+
}
|
|
190
|
+
if (failOn === "error")
|
|
191
|
+
return findings.some((f) => f.severity === "error") ? 1 : 0;
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
function sarifLevel(sev) {
|
|
195
|
+
return sev === "error" ? "error" : sev === "warning" ? "warning" : "note";
|
|
196
|
+
}
|
|
197
|
+
/** `.chant-audit.json`'s `secrets` section at the local target root, if present (tolerant of a missing/malformed file). */
|
|
198
|
+
function readLocalSecretsConfig(root) {
|
|
199
|
+
const file = join(root, ".chant-audit.json");
|
|
200
|
+
if (!existsSync(file))
|
|
201
|
+
return {};
|
|
202
|
+
try {
|
|
203
|
+
return parseSecretsConfig(readFileSync(file, "utf-8"));
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return {};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Merge the local `.chant-audit.json` config under any explicitly-passed options (options win). */
|
|
210
|
+
function resolveSecretsOptions(fileConfig, explicit) {
|
|
211
|
+
return {
|
|
212
|
+
entropyThreshold: explicit?.entropyThreshold ?? fileConfig.entropyThreshold,
|
|
213
|
+
entropyMinLength: explicit?.entropyMinLength ?? fileConfig.entropyMinLength,
|
|
214
|
+
allow: [...(fileConfig.allow ?? []), ...(explicit?.allow ?? [])],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/** Coverage caveats about what the audit could and couldn't see. */
|
|
218
|
+
export function coverageNotes(inputs) {
|
|
219
|
+
const notes = [];
|
|
220
|
+
const withIncludes = inputs.filter((i) => i.lexicon === "gitlab" && /^include:/m.test(i.content)).length;
|
|
221
|
+
if (withIncludes > 0) {
|
|
222
|
+
notes.push(`${withIncludes} GitLab pipeline${withIncludes === 1 ? " uses" : "s use"} \`include:\` — included files are not fetched, so findings cover the root file only.`);
|
|
223
|
+
}
|
|
224
|
+
return notes;
|
|
225
|
+
}
|
|
226
|
+
function renderStylish(findings, scanned, notes, catalog = RULE_CATALOG) {
|
|
227
|
+
const lines = [];
|
|
228
|
+
for (const note of notes)
|
|
229
|
+
lines.push(`Note: ${note}`);
|
|
230
|
+
if (notes.length > 0)
|
|
231
|
+
lines.push("");
|
|
232
|
+
const mw = findings.filter((f) => isMergeWorthy(f, catalog));
|
|
233
|
+
const ro = findings.filter((f) => !isMergeWorthy(f, catalog));
|
|
234
|
+
lines.push(`Audited ${scanned.length} file${scanned.length === 1 ? "" : "s"} — ` +
|
|
235
|
+
`${findings.length} finding${findings.length === 1 ? "" : "s"} ` +
|
|
236
|
+
`(${mw.length} merge-worthy, ${ro.length} report-only).`);
|
|
237
|
+
const section = (title, list) => {
|
|
238
|
+
if (list.length === 0)
|
|
239
|
+
return;
|
|
240
|
+
lines.push("", title);
|
|
241
|
+
for (const f of list) {
|
|
242
|
+
const loc = f.line ? `${f.file}:${f.line}` : f.file;
|
|
243
|
+
// A `missing` finding (chant #2113) has nothing present to anchor
|
|
244
|
+
// `entity` to. The whole point is that `f.missing.kind` does not
|
|
245
|
+
// exist in `f.missing.scope`, so it renders that absence directly
|
|
246
|
+
// instead of falling back to `entity` (which such a check rarely sets).
|
|
247
|
+
const where = f.missing
|
|
248
|
+
? `${loc} (missing ${f.missing.kind} in ${f.missing.scope})`
|
|
249
|
+
: f.entity
|
|
250
|
+
? `${loc} (${f.entity})`
|
|
251
|
+
: loc;
|
|
252
|
+
const title = catalog[f.checkId]?.title ?? f.checkId;
|
|
253
|
+
lines.push(` [${f.checkId}] ${f.severity} ${where} — ${title}`);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
section("Merge-worthy:", mw);
|
|
257
|
+
section("Report-only:", ro);
|
|
258
|
+
return lines.join("\n");
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* SARIF (2.1.0) export (#442). Rule-level metadata — category (the finding
|
|
262
|
+
* "dimension": security/correctness/best-practice) and remediation — is
|
|
263
|
+
* carried in the property bag / `help` block since SARIF's core schema has no
|
|
264
|
+
* dedicated slot for either; `tier` is per-result (a `RuleMeta` fact looked up
|
|
265
|
+
* per finding) so consumers can triage merge-worthy vs. report-only without a
|
|
266
|
+
* second catalog lookup.
|
|
267
|
+
*/
|
|
268
|
+
function renderSarif(findings, catalog = RULE_CATALOG) {
|
|
269
|
+
const ruleIds = [...new Set(findings.map((f) => f.checkId))].sort();
|
|
270
|
+
const rules = ruleIds.map((id) => {
|
|
271
|
+
const m = catalog[id];
|
|
272
|
+
return {
|
|
273
|
+
id,
|
|
274
|
+
name: m?.title ?? id,
|
|
275
|
+
shortDescription: { text: m?.title ?? id },
|
|
276
|
+
...(m?.remediation ? { help: { text: m.remediation } } : {}),
|
|
277
|
+
helpUri: m?.authority?.[0]?.url,
|
|
278
|
+
// `priorArt` credits the upstream tools whose rules check the same thing
|
|
279
|
+
// (audit/prior-art.ts) — tool key, upstream rule id, doc URL, relation.
|
|
280
|
+
...(m?.category || m?.lineage?.length
|
|
281
|
+
? {
|
|
282
|
+
properties: {
|
|
283
|
+
...(m?.category ? { category: m.category, dimension: m.category } : {}),
|
|
284
|
+
...(m?.lineage?.length ? { priorArt: m.lineage } : {}),
|
|
285
|
+
},
|
|
286
|
+
}
|
|
287
|
+
: {}),
|
|
288
|
+
};
|
|
289
|
+
});
|
|
290
|
+
const results = findings.map((f) => {
|
|
291
|
+
const tier = catalog[f.checkId]?.tier;
|
|
292
|
+
const properties = { ...(tier ? { tier } : {}), ...(f.missing ? { missing: f.missing } : {}) };
|
|
293
|
+
return {
|
|
294
|
+
ruleId: f.checkId,
|
|
295
|
+
level: sarifLevel(f.severity),
|
|
296
|
+
message: { text: f.message },
|
|
297
|
+
locations: [
|
|
298
|
+
{
|
|
299
|
+
physicalLocation: {
|
|
300
|
+
artifactLocation: { uri: f.file },
|
|
301
|
+
...(f.line ? { region: { startLine: f.line } } : {}),
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
],
|
|
305
|
+
// `f.missing` (chant #2113) is Snyk policy-engine's "missing-resource"
|
|
306
|
+
// archetype: nothing at `f.file` actually declares the absent thing, so
|
|
307
|
+
// there is no line to point SARIF's region at either. `missing` rides
|
|
308
|
+
// in the property bag (SARIF's core schema has no dedicated slot for an
|
|
309
|
+
// absence finding) rather than pretending a region exists.
|
|
310
|
+
...(Object.keys(properties).length > 0 ? { properties } : {}),
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
return JSON.stringify({
|
|
314
|
+
$schema: "https://json.schemastore.org/sarif-2.1.0.json",
|
|
315
|
+
version: "2.1.0",
|
|
316
|
+
runs: [{ tool: { driver: { name: "chant-audit", informationUri: "https://intentius.io/chant/", rules } }, results }],
|
|
317
|
+
}, null, 2);
|
|
318
|
+
}
|
|
319
|
+
/** Build a provenance snapshot of what was audited (for the HTML report). */
|
|
320
|
+
async function buildSnapshot(options, files, isUrl) {
|
|
321
|
+
let host;
|
|
322
|
+
let repo;
|
|
323
|
+
let commit;
|
|
324
|
+
if (isUrl) {
|
|
325
|
+
try {
|
|
326
|
+
host = new URL(options.path).hostname;
|
|
327
|
+
const parsed = parseRepoUrl(options.path);
|
|
328
|
+
repo = `${parsed.owner}/${parsed.repo}`;
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
// leave host/repo undefined
|
|
332
|
+
}
|
|
333
|
+
commit = await resolveRepoCommit(options.path, { token: options.token ?? tokenForHost(options.path), fetchImpl: options.fetchImpl });
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
host = "local";
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
target: options.path,
|
|
340
|
+
host,
|
|
341
|
+
repo,
|
|
342
|
+
commit,
|
|
343
|
+
files,
|
|
344
|
+
generatedAt: options.now ?? new Date().toISOString(),
|
|
345
|
+
toolVersion: options.toolVersion ?? "0.0.0",
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** The flag that raises the local walk's file limit, named wherever a truncated scan is reported. */
|
|
349
|
+
export const MAX_FILES_FLAG = "--max-files";
|
|
350
|
+
/** The truncation a walk reports, or undefined for a whole scan. */
|
|
351
|
+
export function walkTruncation(walk) {
|
|
352
|
+
return walk.truncated ? { limit: walk.maxFiles, flag: MAX_FILES_FLAG } : undefined;
|
|
353
|
+
}
|
|
354
|
+
/** The text-report note for a truncated scan. */
|
|
355
|
+
export function truncationNote(t, target) {
|
|
356
|
+
return (`The scan of ${target} stopped at ${t.limit} files, so part of the tree was not audited. ` +
|
|
357
|
+
`The limit counts every file the walk reaches, not only the ones it audits. Raise it with ${t.flag} <n>.`);
|
|
358
|
+
}
|
|
359
|
+
/** Run the audit and produce a rendered result. */
|
|
360
|
+
export async function auditCommand(options) {
|
|
361
|
+
const format = options.format ?? "stylish";
|
|
362
|
+
const tier = options.tier ?? "all";
|
|
363
|
+
const failOn = options.failOn ?? "none";
|
|
364
|
+
const isUrl = /^https?:\/\//.test(options.path);
|
|
365
|
+
// chant#2589 — path lexicons the target declares, read without running its config.
|
|
366
|
+
const pathLexicons = auditPathLexicons(options.path, isUrl);
|
|
367
|
+
// Detection lives in the lexicon plugins (each one's `detectTemplate`), so a
|
|
368
|
+
// lexicon that isn't installed can't claim its files. Every branch below
|
|
369
|
+
// therefore also computes which candidate files looked like they wanted an
|
|
370
|
+
// absent lexicon, so "nothing found" and "had nothing to look with" never
|
|
371
|
+
// render the same way (#1623).
|
|
372
|
+
const plugins = options.plugins ?? (await loadAuditPlugins());
|
|
373
|
+
let candidates;
|
|
374
|
+
let truncated;
|
|
375
|
+
if (isUrl) {
|
|
376
|
+
try {
|
|
377
|
+
// Fetch the whole repo's candidate files (all lexicons, not just CI) and
|
|
378
|
+
// run them through the same classifier the local path uses (#420).
|
|
379
|
+
candidates = await fetchRepoFiles(options.path, {
|
|
380
|
+
token: options.token ?? tokenForHost(options.path),
|
|
381
|
+
fetchImpl: options.fetchImpl,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
const msg = err instanceof FetchError ? err.message : err instanceof Error ? err.message : String(err);
|
|
386
|
+
return { success: false, output: "", findings: [], scanned: [], exitCode: 1, error: msg };
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
if (!existsSync(options.path)) {
|
|
391
|
+
return { success: false, output: "", findings: [], scanned: [], exitCode: 1, error: `Path not found: ${options.path}` };
|
|
392
|
+
}
|
|
393
|
+
// One walk, plugin-delegated detection. CI (path), Dockerfiles (name), and
|
|
394
|
+
// Helm charts (bundle) are special-cased by the classifier since content
|
|
395
|
+
// shape alone can't disambiguate them.
|
|
396
|
+
// Workspace members leave the root's audit only when a declaration exists
|
|
397
|
+
// (#2525 rule 3); without one this is a few existsSync calls (#2527).
|
|
398
|
+
const excludeDirs = await workspaceMemberDirs(options.path);
|
|
399
|
+
const walk = walkCandidates(options.path, { maxFiles: options.maxFiles, excludeDirs });
|
|
400
|
+
candidates = walk.files;
|
|
401
|
+
truncated = walkTruncation(walk);
|
|
402
|
+
}
|
|
403
|
+
// Every format but SARIF states a truncated scan in the report itself
|
|
404
|
+
// (#2528). SARIF has no slot chant fills for it, so there it goes to stderr.
|
|
405
|
+
const warnings = truncated && format === "sarif" ? [{ message: truncationNote(truncated, options.path) }] : [];
|
|
406
|
+
if (pathLexicons.notice !== undefined)
|
|
407
|
+
warnings.push({ message: pathLexicons.notice });
|
|
408
|
+
const withWarnings = warnings.length > 0 ? { warnings } : {};
|
|
409
|
+
// A local target hands its directory to the classifier, so an input whose
|
|
410
|
+
// path names a directory carries the directory itself (#2217): terraform's
|
|
411
|
+
// parse-to-graph follows a root module's local `module` calls from there. A
|
|
412
|
+
// URL target has no local tree, and never fetches `.tf` in the first place.
|
|
413
|
+
const inputs = classifyFiles(candidates, plugins, isUrl ? {} : { baseDir: options.path });
|
|
414
|
+
const unclaimed = unclaimedFiles(candidates, inputs, plugins);
|
|
415
|
+
const scanned = inputs.map((i) => i.path);
|
|
416
|
+
// Secrets detection (#443) is independent of lexicon: it scans every
|
|
417
|
+
// candidate file's raw text, not just the ones a lexicon claimed, and runs
|
|
418
|
+
// even when no lexicon is installed at all. `.chant-audit.json` at a local
|
|
419
|
+
// target's root supplies the entropy threshold / allowlist; a URL target
|
|
420
|
+
// has no local config file to read.
|
|
421
|
+
const secretsConfig = isUrl ? {} : readLocalSecretsConfig(options.path);
|
|
422
|
+
const secretsFindings = scanForSecrets(candidates, resolveSecretsOptions(secretsConfig, options.secretsScan));
|
|
423
|
+
// Wrangler config audit (#446) is likewise lexicon-independent: it scans
|
|
424
|
+
// every candidate file for `wrangler.toml` by its own detector, not through
|
|
425
|
+
// `classifyFiles`/an installed lexicon package (no such package exists —
|
|
426
|
+
// this format ships only a detector and checks, per the issue's scope).
|
|
427
|
+
const wranglerFindings = auditWranglerConfigs(candidates);
|
|
428
|
+
// nginx config audit (#1979) — same lexicon-independent shape as wrangler:
|
|
429
|
+
// its own path detector plus a parsed-content marker check (a `.conf` in a
|
|
430
|
+
// shared directory name like conf.d/ only counts once it parses as nginx).
|
|
431
|
+
const nginxFindings = auditNginxConfigs(candidates);
|
|
432
|
+
// TF023 (#2110) — committed Terraform state. Lexicon-independent for the
|
|
433
|
+
// same reason the three above are: it reads the discovered paths, not a
|
|
434
|
+
// parsed root module, so it fires with or without the terraform lexicon.
|
|
435
|
+
const terraformStateFindings = auditTerraformState(candidates);
|
|
436
|
+
if (plugins.length === 0) {
|
|
437
|
+
const output = format === "json"
|
|
438
|
+
? renderNoLexiconsJson(options.path, unclaimed, pathLexicons.paths, truncated)
|
|
439
|
+
: renderNoLexicons(options.path, unclaimed, pathLexicons.paths, truncated);
|
|
440
|
+
return { success: true, status: "no-lexicons", output, findings: [...secretsFindings, ...wranglerFindings, ...nginxFindings, ...terraformStateFindings], scanned: [], unclaimed, exitCode: NO_LEXICONS_EXIT_CODE, stream: format === "json" ? "stdout" : "stderr", ...withWarnings };
|
|
441
|
+
}
|
|
442
|
+
const missingLexiconNote = missingLexiconHint(unclaimed, pathLexicons.paths);
|
|
443
|
+
if (inputs.length === 0 && secretsFindings.length === 0 && wranglerFindings.length === 0 && nginxFindings.length === 0 && terraformStateFindings.length === 0) {
|
|
444
|
+
let output = `No auditable files found under ${options.path}.${missingLexiconNote ? ` ${missingLexiconNote}` : ""}`;
|
|
445
|
+
if (truncated)
|
|
446
|
+
output += `\n\nNote: ${truncationNote(truncated, options.path)}`;
|
|
447
|
+
return { success: true, status: "ok", output, findings: [], scanned: [], unclaimed, exitCode: 0, ...withWarnings };
|
|
448
|
+
}
|
|
449
|
+
let findings = [];
|
|
450
|
+
// chant #2111: mutated in place by `auditFiles` so its inline (`# chant-
|
|
451
|
+
// ignore*`) suppressed count reaches the summary without changing
|
|
452
|
+
// `auditFiles`'s `AuditFinding[]` return type; see `SuppressionStats`'s doc.
|
|
453
|
+
const suppressionStats = { count: 0 };
|
|
454
|
+
if (inputs.length > 0) {
|
|
455
|
+
try {
|
|
456
|
+
findings = await auditFiles(inputs, {
|
|
457
|
+
checksProvider: options.checksProvider,
|
|
458
|
+
suppressionStats,
|
|
459
|
+
...(isUrl ? {} : { enabledRules: readEnabledRules(options.path) }),
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
catch (err) {
|
|
463
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
464
|
+
return { success: false, output: "", findings: [], scanned, exitCode: 1, error: msg };
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
findings = [...findings, ...secretsFindings, ...wranglerFindings, ...nginxFindings, ...terraformStateFindings];
|
|
468
|
+
// Resolve the audit catalog once, aggregating the audited lexicons' own
|
|
469
|
+
// metadata over core's static catalog (#687). The lexicons are already loaded
|
|
470
|
+
// by `auditFiles` above, so this is cheap. Core's static catalog (always
|
|
471
|
+
// included) carries the SEC* secrets rules, so they resolve even when
|
|
472
|
+
// `inputs` claimed nothing.
|
|
473
|
+
const catalog = await resolveAuditCatalog([...new Set(inputs.map((i) => i.lexicon))]);
|
|
474
|
+
if (tier === "merge-worthy")
|
|
475
|
+
findings = findings.filter((f) => isMergeWorthy(f, catalog));
|
|
476
|
+
const notes = coverageNotes(inputs);
|
|
477
|
+
if (truncated)
|
|
478
|
+
notes.unshift(truncationNote(truncated, options.path));
|
|
479
|
+
if (missingLexiconNote)
|
|
480
|
+
notes.push(missingLexiconNote);
|
|
481
|
+
if (suppressionStats.count > 0) {
|
|
482
|
+
notes.push(`${suppressionStats.count} finding${suppressionStats.count === 1 ? "" : "s"} suppressed via inline chant-ignore comments.`);
|
|
483
|
+
}
|
|
484
|
+
// Diff-bearing renderers (markdown, html) need action SHAs / image digests
|
|
485
|
+
// resolved up front (sync maps so rendering stays synchronous).
|
|
486
|
+
let resolveSha;
|
|
487
|
+
let resolveDigest;
|
|
488
|
+
if (isUrl && (format === "markdown" || format === "html")) {
|
|
489
|
+
// Action SHAs always resolve against api.github.com, so use the GitHub
|
|
490
|
+
// token regardless of which host the repo lives on.
|
|
491
|
+
const token = githubToken();
|
|
492
|
+
const refs = new Map();
|
|
493
|
+
const images = new Set();
|
|
494
|
+
for (const inp of inputs) {
|
|
495
|
+
for (const a of extractUnpinnedActions(inp.content))
|
|
496
|
+
refs.set(`${a.action}@${a.ref}`, a);
|
|
497
|
+
for (const img of extractUnpinnedImages(inp.content))
|
|
498
|
+
images.add(img);
|
|
499
|
+
}
|
|
500
|
+
const [resolvedShas, resolvedDigests] = await Promise.all([
|
|
501
|
+
Promise.all([...refs.values()].map(async (a) => {
|
|
502
|
+
const sha = await resolveActionSha(a.action, a.ref, { token, fetchImpl: options.fetchImpl });
|
|
503
|
+
return [`${a.action}@${a.ref}`, sha];
|
|
504
|
+
})),
|
|
505
|
+
Promise.all([...images].map(async (img) => {
|
|
506
|
+
const digest = await resolveImageDigest(img, { fetchImpl: options.fetchImpl });
|
|
507
|
+
return [img, digest];
|
|
508
|
+
})),
|
|
509
|
+
]);
|
|
510
|
+
const shaMap = new Map();
|
|
511
|
+
for (const [key, sha] of resolvedShas)
|
|
512
|
+
if (sha)
|
|
513
|
+
shaMap.set(key, sha);
|
|
514
|
+
if (shaMap.size > 0)
|
|
515
|
+
resolveSha = (action, ref) => shaMap.get(`${action}@${ref}`);
|
|
516
|
+
const digestMap = new Map();
|
|
517
|
+
for (const [img, digest] of resolvedDigests)
|
|
518
|
+
if (digest)
|
|
519
|
+
digestMap.set(img, digest);
|
|
520
|
+
if (digestMap.size > 0)
|
|
521
|
+
resolveDigest = (img) => digestMap.get(img);
|
|
522
|
+
}
|
|
523
|
+
const files = inputs.map((i) => ({ path: i.path, content: i.content }));
|
|
524
|
+
let output;
|
|
525
|
+
switch (format) {
|
|
526
|
+
case "json": {
|
|
527
|
+
const snapshot = await buildSnapshot(options, scanned, isUrl);
|
|
528
|
+
output = JSON.stringify(buildReportJson(findings, { snapshot, toolVersion: options.toolVersion, catalog, unclaimed, truncated }), null, 2);
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
case "sarif":
|
|
532
|
+
output = renderSarif(findings, catalog);
|
|
533
|
+
break;
|
|
534
|
+
case "markdown":
|
|
535
|
+
output = renderMarkdown(findings, { target: options.path, files, resolveSha, resolveDigest, notes, catalog });
|
|
536
|
+
break;
|
|
537
|
+
case "html": {
|
|
538
|
+
const snapshot = await buildSnapshot(options, scanned, isUrl);
|
|
539
|
+
output = renderHtml(findings, { files, resolveSha, resolveDigest, notes, snapshot, theme: options.theme, template: options.template, catalog, truncated });
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
default:
|
|
543
|
+
output = renderStylish(findings, scanned, notes, catalog);
|
|
544
|
+
}
|
|
545
|
+
const exitCode = exitCodeFor(findings, failOn, catalog);
|
|
546
|
+
if (options.output) {
|
|
547
|
+
try {
|
|
548
|
+
writeFileSync(options.output, output);
|
|
549
|
+
}
|
|
550
|
+
catch (err) {
|
|
551
|
+
return { success: false, output, findings, scanned, exitCode: 1, error: `Failed to write ${options.output}: ${err instanceof Error ? err.message : String(err)}` };
|
|
552
|
+
}
|
|
553
|
+
return { success: true, status: "ok", output, findings, scanned, unclaimed, exitCode, wroteTo: options.output, suppressedCount: suppressionStats.count, ...withWarnings };
|
|
554
|
+
}
|
|
555
|
+
return { success: true, status: "ok", output, findings, scanned, unclaimed, exitCode, suppressedCount: suppressionStats.count, ...withWarnings };
|
|
556
|
+
}
|
|
557
|
+
/** Print an audit result to stdout, and its warnings to stderr. */
|
|
558
|
+
export function printAuditResult(result) {
|
|
559
|
+
if (!result.success) {
|
|
560
|
+
console.error(result.error ?? "Audit failed");
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
if (result.wroteTo)
|
|
564
|
+
console.error(`Wrote report to ${result.wroteTo}`);
|
|
565
|
+
else if (result.stream === "stderr")
|
|
566
|
+
console.error(result.output);
|
|
567
|
+
else
|
|
568
|
+
console.log(result.output);
|
|
569
|
+
for (const w of result.warnings ?? [])
|
|
570
|
+
console.error(formatWarning(w));
|
|
571
|
+
}
|