@intentius/chant 0.124.13 → 0.124.15
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.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -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.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -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.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -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.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -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.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -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 +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -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.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -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.d.ts +1 -1
- 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.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -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.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -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.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- 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 +462 -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.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -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.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -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/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- 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/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- 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/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
|
@@ -0,0 +1,948 @@
|
|
|
1
|
+
import { resolve, relative, dirname } from "path";
|
|
2
|
+
import { readFileSync, writeFileSync, readdirSync } from "fs";
|
|
3
|
+
import { runLint, parseDisableComments } from "../../lint/engine.js";
|
|
4
|
+
import { loadPlugin, loadPlugins, resolveProjectLexicons } from "../plugins.js";
|
|
5
|
+
import { findInfraFiles, detectLexicons } from "../../index.js";
|
|
6
|
+
import { formatStylish, formatJson, formatSarif } from "../reporters/stylish.js";
|
|
7
|
+
import { loadLocalRules } from "../../lint/rule-loader.js";
|
|
8
|
+
import { loadCoreRules } from "../../lint/rules/index.js";
|
|
9
|
+
import { loadComponentChecks } from "../../lint/rules/comp/index.js";
|
|
10
|
+
import { runComponentChecks } from "../../lint/component-checks.js";
|
|
11
|
+
import { buildCapabilityRegistry } from "../../components/capability-plugin-loader.js";
|
|
12
|
+
import { coreOpChecks } from "../../lint/rules/op/index.js";
|
|
13
|
+
import { loadActivityContracts } from "../../op/activity-contract-registry.js";
|
|
14
|
+
import { runPostSynthChecks } from "../../lint/post-synth.js";
|
|
15
|
+
import { rule } from "../../lint/declarative.js";
|
|
16
|
+
import { watchDirectory, formatTimestamp, formatChangedFiles } from "../watch.js";
|
|
17
|
+
import { formatError, formatInfo } from "../format.js";
|
|
18
|
+
import { hasDiscoveryMarkerSync, isSourceFileName } from "../../discovery/files.js";
|
|
19
|
+
import { walkDiscovery, workspaceMemberDirs } from "../../discovery/walk.js";
|
|
20
|
+
import { buildParamValues, resolveBuildParams } from "../../build-params.js";
|
|
21
|
+
import { setBuildParams } from "../../params.js";
|
|
22
|
+
import { isNoLexiconDetected } from "../../detectLexicon.js";
|
|
23
|
+
import { build } from "../../build.js";
|
|
24
|
+
import { loadChantConfigUpward, resolveOwnershipEnv, resolveOwnershipMarker } from "../../config.js";
|
|
25
|
+
import { resolveBuildModes, resolveProjectBuildOptions } from "../build-options.js";
|
|
26
|
+
import { resolveTelemetryAttribution } from "../../telemetry-attribution.js";
|
|
27
|
+
import { applyConfiguredPreset, applyConfiguredSeverity, resolvePresetIds } from "../../lint/config.js";
|
|
28
|
+
import { applyInlineSuppressions } from "../../lint/suppressions.js";
|
|
29
|
+
import { getProvenance } from "../../provenance.js";
|
|
30
|
+
import { runLexiconPostSynthChecks } from "./build.js";
|
|
31
|
+
import { armSandboxPolicyExecution, runProjectPolicies } from "../../lint/policy-sandbox.js";
|
|
32
|
+
import { ensureTypeScriptLoader } from "../../ts-loader.js";
|
|
33
|
+
// Import config loader
|
|
34
|
+
import { loadConfig, resolveRulesForFile, resolveConfiguredSeverity, findProjectRoot } from "../../lint/config.js";
|
|
35
|
+
import { loadChantConfig, resolveKnowledgeDir, resolveDiscoveryGlobs } from "../../config.js";
|
|
36
|
+
import { findProjectConfig } from "../../project-root.js";
|
|
37
|
+
import { loadOkfBundle } from "../../okf-read.js";
|
|
38
|
+
/**
|
|
39
|
+
* Type guard to check if a value conforms to the LintRule interface.
|
|
40
|
+
*/
|
|
41
|
+
export function isLintRule(value) {
|
|
42
|
+
return (typeof value === "object" &&
|
|
43
|
+
value !== null &&
|
|
44
|
+
"id" in value &&
|
|
45
|
+
typeof value.id === "string" &&
|
|
46
|
+
"severity" in value &&
|
|
47
|
+
"category" in value &&
|
|
48
|
+
"check" in value &&
|
|
49
|
+
typeof value.check === "function");
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load custom lint rules from plugin files.
|
|
53
|
+
* Each plugin file is dynamically imported and all exports conforming to LintRule are collected.
|
|
54
|
+
*
|
|
55
|
+
* chant #1051 — this (and `loadLocalRules`, `../../lint/rule-loader.ts`, for
|
|
56
|
+
* `.chant/rules/*.ts`) is unconditional project-source `import()` with no
|
|
57
|
+
* `--sandbox` equivalent, the same class of gap #1051 closes for
|
|
58
|
+
* `discoverComponents`. Deliberately NOT sandboxed here, and not a "decide by
|
|
59
|
+
* omission": a `LintRule` is not a one-shot data producer like `Component`/
|
|
60
|
+
* `Declarable` — its `check(context)` is a function the rule engine invokes
|
|
61
|
+
* inline, once per linted file, for the whole `chant lint` run. There is no
|
|
62
|
+
* cheap "collect once, JSON-serialize the result, hand it back" shape the way
|
|
63
|
+
* there is for a `Component` (plain JSON) or an entity (a wire codec) —
|
|
64
|
+
* `check` has to keep running as live JS in whichever process calls it. A
|
|
65
|
+
* shallow fix that sandboxed only the *import* step (mirroring
|
|
66
|
+
* `discoverComponents`) would give a false sense of safety: it would close
|
|
67
|
+
* off "malicious top-level module code" but leave `check()`'s own executable
|
|
68
|
+
* body — the dominant part of a rule's attack surface, since it runs for
|
|
69
|
+
* every file, every lint invocation — entirely unsandboxed regardless. A real
|
|
70
|
+
* fix needs either the AST/`ts.SourceFile` itself to cross the sandbox
|
|
71
|
+
* boundary or the whole custom-rule evaluation to run inside the child; both
|
|
72
|
+
* are materially harder, separate design problems from this issue's `Component`
|
|
73
|
+
* fix and are tracked separately (chant #1052).
|
|
74
|
+
*/
|
|
75
|
+
export async function loadPluginRules(plugins, configDir) {
|
|
76
|
+
const pluginRules = new Map();
|
|
77
|
+
for (const pluginPath of plugins) {
|
|
78
|
+
const resolved = resolve(configDir, pluginPath);
|
|
79
|
+
let mod;
|
|
80
|
+
try {
|
|
81
|
+
ensureTypeScriptLoader();
|
|
82
|
+
mod = await import(resolved);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
throw new Error(`Failed to load plugin "${pluginPath}": ${err instanceof Error ? err.message : String(err)}`);
|
|
86
|
+
}
|
|
87
|
+
for (const value of Object.values(mod)) {
|
|
88
|
+
if (isLintRule(value)) {
|
|
89
|
+
pluginRules.set(value.id, value);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return pluginRules;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The diagnostic id `chant lint` reports a lexicon it could not resolve under
|
|
97
|
+
* (chant #2222).
|
|
98
|
+
*
|
|
99
|
+
* Deliberately outside the COR/EVL/COMP/OPS families: those are *rules*, each
|
|
100
|
+
* with a `check()` the engine runs per file, a documented page, a configurable
|
|
101
|
+
* severity and a `chant-disable` escape hatch. This is none of those. It is
|
|
102
|
+
* the lint run reporting that it could not assemble the rule set the project
|
|
103
|
+
* asked for, so it is not silenceable through `rules: { ... : "off" }` or a
|
|
104
|
+
* disable comment. Silencing it would put back the exact "green on a broken
|
|
105
|
+
* project" this id exists to prevent.
|
|
106
|
+
*/
|
|
107
|
+
export const LEXICON_RESOLUTION_RULE_ID = "LEX001";
|
|
108
|
+
/**
|
|
109
|
+
* Turn a lexicon-resolution failure into the error diagnostic `chant lint`
|
|
110
|
+
* reports it as. The message is the underlying error's own, unwrapped, so it
|
|
111
|
+
* is character-for-character what `chant build` prints after `error: ` for the
|
|
112
|
+
* same project (`loadPluginsOrExit`, ../main.ts): one failure, one wording.
|
|
113
|
+
*
|
|
114
|
+
* Attributed to the project's `chant.config.*` where there is one, since that
|
|
115
|
+
* is the file that names the lexicon; to the project root otherwise.
|
|
116
|
+
*/
|
|
117
|
+
function lexiconResolutionDiagnostic(projectRoot, error) {
|
|
118
|
+
return {
|
|
119
|
+
file: findProjectConfig(projectRoot).configPath ?? projectRoot,
|
|
120
|
+
line: 1,
|
|
121
|
+
column: 1,
|
|
122
|
+
ruleId: LEXICON_RESOLUTION_RULE_ID,
|
|
123
|
+
severity: "error",
|
|
124
|
+
message: error.message,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The diagnostic id `chant lint` reports a lint target that does not build
|
|
129
|
+
* under (chant #3750). The lexicons' post-synth checks read a build result, so
|
|
130
|
+
* when the build fails they cannot run; this says so instead of letting the
|
|
131
|
+
* lint pass in silence. Like {@link LEXICON_RESOLUTION_RULE_ID} it is not a
|
|
132
|
+
* rule: it has no severity setting and no disable form. The message is the
|
|
133
|
+
* build's own.
|
|
134
|
+
*/
|
|
135
|
+
export const BUILD_FAILURE_RULE_ID = "LEX002";
|
|
136
|
+
/**
|
|
137
|
+
* The plugins of lexicons that the project's source imports from and that are not in `configured`, for their
|
|
138
|
+
* property-kind class names (#3184). A package that is not installed, or that fails to load, is skipped.
|
|
139
|
+
*/
|
|
140
|
+
async function loadImportedPropertyPlugins(projectPath, configured) {
|
|
141
|
+
let imported;
|
|
142
|
+
try {
|
|
143
|
+
imported = await detectLexicons(await findInfraFiles(projectPath));
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
const plugins = [];
|
|
149
|
+
for (const name of imported) {
|
|
150
|
+
if (configured.includes(name))
|
|
151
|
+
continue;
|
|
152
|
+
try {
|
|
153
|
+
plugins.push(await loadPlugin(name));
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Not installed here; the import is the build's problem to report, not lint's.
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return plugins;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Load all lint rules: core COR/EVL rules, then lexicon plugin rules.
|
|
163
|
+
*
|
|
164
|
+
* Also returns the active lexicons' registered intrinsics (chant #1106) —
|
|
165
|
+
* gathered here because this is where the project's lexicon plugins are
|
|
166
|
+
* already resolved and loaded (`loadPlugins`), the same set `../commands/
|
|
167
|
+
* build.ts` reads `plugin.intrinsics?.()` off of for the fold path. Handed
|
|
168
|
+
* back alongside `rules` so `lintCommand` can thread it into every
|
|
169
|
+
* `runLint` call without loading plugins a second time.
|
|
170
|
+
*/
|
|
171
|
+
async function loadAllPluginRules(projectPath) {
|
|
172
|
+
const rules = new Map();
|
|
173
|
+
// Load core COR/EVL rules directly
|
|
174
|
+
for (const r of loadCoreRules()) {
|
|
175
|
+
rules.set(r.id, r);
|
|
176
|
+
}
|
|
177
|
+
// Resolve project lexicons (e.g. ["aws"]) from config or detection, then
|
|
178
|
+
// load their plugins.
|
|
179
|
+
//
|
|
180
|
+
// chant #2222: a failure in either step is handed back to `lintCommand`
|
|
181
|
+
// (which reports it as {@link LEXICON_RESOLUTION_RULE_ID}) rather than
|
|
182
|
+
// swallowed or thrown. Both steps fail on the same project state: a
|
|
183
|
+
// `chant.config.ts` that names a lexicon whose package is not installed
|
|
184
|
+
// throws out of `loadPlugins`, and one that *imports* that package throws
|
|
185
|
+
// out of `resolveProjectLexicons` before the names are ever read. Before
|
|
186
|
+
// this, the first case crashed `chant lint` with a stack trace and the
|
|
187
|
+
// second was caught here and discarded, so `chant lint` printed "No
|
|
188
|
+
// problems found" and exited 0 on a project `chant build` refuses to
|
|
189
|
+
// build. A CI job that lints before it builds reported green on a project
|
|
190
|
+
// whose lexicon was missing.
|
|
191
|
+
//
|
|
192
|
+
// The one failure that stays quiet is the one the original `catch` was
|
|
193
|
+
// written for and named in its comment: a project that declares no
|
|
194
|
+
// `lexicons` and imports none from its source files, where the detection
|
|
195
|
+
// fallback throws `NO_LEXICON_DETECTED_MESSAGE`. That project lints under
|
|
196
|
+
// the core rules alone and always has. It is told apart by the exported
|
|
197
|
+
// sentinel rather than by a string literal copied to this file, so the two
|
|
198
|
+
// cannot drift apart.
|
|
199
|
+
let lexiconNames = [];
|
|
200
|
+
let lexiconError;
|
|
201
|
+
try {
|
|
202
|
+
lexiconNames = await resolveProjectLexicons(projectPath);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
if (!isNoLexiconDetected(err)) {
|
|
206
|
+
lexiconError = err instanceof Error ? err : new Error(String(err));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Load only project lexicon plugins (no "chant" injection)
|
|
210
|
+
let plugins = [];
|
|
211
|
+
if (!lexiconError) {
|
|
212
|
+
try {
|
|
213
|
+
plugins = await loadPlugins(lexiconNames);
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
lexiconError = err instanceof Error ? err : new Error(String(err));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// chant #1106 — the same plugins' registered intrinsics (`Ref`, `GetAtt`,
|
|
220
|
+
// ...), so EVL001 can answer "does this call fold?" exactly like fold()
|
|
221
|
+
// does instead of flagging every call as a violation. A plugin's
|
|
222
|
+
// `intrinsics` is an optional extension (not every lexicon defines any),
|
|
223
|
+
// hence the guard.
|
|
224
|
+
const intrinsics = plugins.flatMap((plugin) => plugin.intrinsics?.() ?? []);
|
|
225
|
+
// chant #2957 — the class names these plugins declare property-kind, so
|
|
226
|
+
// COR001, COR004 and COR009 leave out declarables that live inside a
|
|
227
|
+
// resource (a Grafana panel inside its dashboard) instead of treating
|
|
228
|
+
// them as resources.
|
|
229
|
+
const propertyClasses = new Set(plugins.flatMap((plugin) => plugin.propertyClassNames?.() ?? []));
|
|
230
|
+
// chant #3184: a lexicon the source imports from but the config does not list (grafana in a k8s project that
|
|
231
|
+
// holds a dashboard ConfigMap, after `chant import`) still declares which of its classes are property-kind. Only
|
|
232
|
+
// those names are taken from it; its rules and intrinsics stay out, since the project did not ask for them.
|
|
233
|
+
if (!lexiconError) {
|
|
234
|
+
for (const plugin of await loadImportedPropertyPlugins(projectPath, lexiconNames)) {
|
|
235
|
+
for (const name of plugin.propertyClassNames?.() ?? [])
|
|
236
|
+
propertyClasses.add(name);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
for (const plugin of plugins) {
|
|
240
|
+
if (plugin.lintRules) {
|
|
241
|
+
for (const r of plugin.lintRules()) {
|
|
242
|
+
rules.set(r.id, r);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Compile declarative rules from plugins
|
|
246
|
+
if (plugin.declarativeRules) {
|
|
247
|
+
for (const spec of plugin.declarativeRules()) {
|
|
248
|
+
const compiled = rule(spec);
|
|
249
|
+
rules.set(compiled.id, compiled);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Load project-local rules from .chant/rules/
|
|
254
|
+
const localRules = await loadLocalRules(projectPath);
|
|
255
|
+
for (const r of localRules) {
|
|
256
|
+
rules.set(r.id, r);
|
|
257
|
+
}
|
|
258
|
+
return { rules, intrinsics, propertyClasses, plugins, ...(lexiconError ? { lexiconError } : {}) };
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Every TypeScript file `chant lint` reads under `dir`, through the one
|
|
262
|
+
* discovery walk (`../../discovery/walk.ts`, #2527): git-ignored paths
|
|
263
|
+
* (vendored trees and the like, which the project never wrote), dot-directories,
|
|
264
|
+
* `dist` and, inside a project, child projects are skipped, and so is what the
|
|
265
|
+
* project's `exclude` globs (#2519) name, unless `include` re-admits it. Test
|
|
266
|
+
* and spec files, chant-generated files and skip-marked files are left out.
|
|
267
|
+
* Symlinks are followed, as lint always did.
|
|
268
|
+
*/
|
|
269
|
+
async function getTypeScriptFiles(dir) {
|
|
270
|
+
// A missing or non-directory path fails here, as lint's own walk always did;
|
|
271
|
+
// the shared walk skips an unreadable directory in silence.
|
|
272
|
+
readdirSync(dir);
|
|
273
|
+
return walkDiscovery({
|
|
274
|
+
walker: "lint",
|
|
275
|
+
root: dir,
|
|
276
|
+
globs: await resolveDiscoveryGlobs(dir),
|
|
277
|
+
excludeDirs: await workspaceMemberDirs(dir),
|
|
278
|
+
followSymlinks: true,
|
|
279
|
+
accept: (name, full) => isSourceFileName(name) && !hasDiscoveryMarkerSync(full),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get default rules and options, optionally applying per-file overrides.
|
|
284
|
+
*
|
|
285
|
+
* `projectRoot` is where the config lives (see `findProjectRoot`); `filePath`,
|
|
286
|
+
* when given, must be relative to that root so `lint.overrides` globs
|
|
287
|
+
* (`src/lib/**`) match regardless of which subpath is being linted.
|
|
288
|
+
*/
|
|
289
|
+
function getDefaultRules(projectRoot, filePath, allRules = new Map()) {
|
|
290
|
+
const config = loadConfig(projectRoot);
|
|
291
|
+
const effectiveRules = filePath ? resolveRulesForFile(config, filePath) : config.rules;
|
|
292
|
+
const rules = [];
|
|
293
|
+
const ruleOptions = new Map();
|
|
294
|
+
for (const [ruleId, rule] of allRules) {
|
|
295
|
+
// chant #1138 — the same resolution post-synth checks and COMP* checks
|
|
296
|
+
// now go through too (`resolveConfiguredSeverity`, ../../lint/config.ts),
|
|
297
|
+
// so `lint.rules: { ID: "off" }` suppresses a rule id identically no
|
|
298
|
+
// matter which phase produced it.
|
|
299
|
+
const { severity, options } = resolveConfiguredSeverity(effectiveRules, ruleId, rule.severity);
|
|
300
|
+
// Skip rules that are explicitly turned off
|
|
301
|
+
if (severity === "off")
|
|
302
|
+
continue;
|
|
303
|
+
// Override severity from config (a no-op when the rule wasn't mentioned —
|
|
304
|
+
// `severity` is then just `rule.severity` again)
|
|
305
|
+
rules.push({ ...rule, severity });
|
|
306
|
+
// Store options if present
|
|
307
|
+
if (options) {
|
|
308
|
+
ruleOptions.set(ruleId, options);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return { rules, ruleOptions };
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Run the COMP* composition checks (#562) over the discovered `Component`
|
|
315
|
+
* graph and convert their results into plain `LintDiagnostic`s so they merge
|
|
316
|
+
* into the same `chant lint` output (stylish/json/sarif) and the same
|
|
317
|
+
* error-count gating as every COR/EVL diagnostic.
|
|
318
|
+
*
|
|
319
|
+
* These checks operate on the whole discovered component graph, not one
|
|
320
|
+
* `ts.SourceFile`, so they carry no real line/column — reported at `1:1` in
|
|
321
|
+
* the file the component was declared in (matching COR009's whole-file
|
|
322
|
+
* diagnostic convention, see ../../lint/rules/file-declarable-limit.ts).
|
|
323
|
+
* Config severity overrides (`lint.rules["COMP001"]`, including `"off"`) are
|
|
324
|
+
* honored the same way `getDefaultRules` honors them for AST rules. Only the
|
|
325
|
+
* *file-level* disable directive form (`// chant-disable` /
|
|
326
|
+
* `// chant-disable COMP004 -- reason`, anywhere in the file) is honored —
|
|
327
|
+
* `-line`/`-next-line` need an exact line to match against, which a
|
|
328
|
+
* whole-component diagnostic does not have; see
|
|
329
|
+
* docs/lint-rules/composition.mdx for this documented limitation.
|
|
330
|
+
*/
|
|
331
|
+
/**
|
|
332
|
+
* Build the registry-derived context composition checks need — the set of
|
|
333
|
+
* capability kinds registered for this project (core's starter set plus the
|
|
334
|
+
* active lexicons' leaves, e.g. `cfn-deploy` when `lexicons: ["aws"]`) and each
|
|
335
|
+
* verb's rollback disposition — so COMP005/COMP003 read real registry facts
|
|
336
|
+
* rather than hard-coding verb lists. A verb's rollback policy is its own
|
|
337
|
+
* declaration (`rollbackPolicy`), else derived: a paired `rollback` method is
|
|
338
|
+
* `"native"`, everything else `"none-by-design"`. Tolerant: any failure (an
|
|
339
|
+
* unresolvable lexicon, a config-less directory) returns `undefined` fields,
|
|
340
|
+
* letting the checks fall back to core's starter set.
|
|
341
|
+
*/
|
|
342
|
+
async function resolveRegistryContext(infraPath) {
|
|
343
|
+
try {
|
|
344
|
+
const lexicons = await resolveProjectLexicons(infraPath).catch(() => []);
|
|
345
|
+
const registry = await buildCapabilityRegistry({ lexicons });
|
|
346
|
+
const kinds = registry.kinds();
|
|
347
|
+
const rollbackPolicies = new Map();
|
|
348
|
+
for (const kind of kinds) {
|
|
349
|
+
const capability = registry.resolve(kind);
|
|
350
|
+
rollbackPolicies.set(kind, capability.rollbackPolicy ?? (capability.rollback ? "native" : "none-by-design"));
|
|
351
|
+
}
|
|
352
|
+
return { knownKinds: new Set(kinds), rollbackPolicies };
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return {};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
async function runComponentCheckDiagnostics(infraPath, sandbox, buildParams) {
|
|
359
|
+
// Discovery stays scoped to the lint arg; COMP* severity overrides come from
|
|
360
|
+
// the project-root config, same as the AST-rule pass.
|
|
361
|
+
const config = loadConfig(findProjectRoot(infraPath));
|
|
362
|
+
const checks = loadComponentChecks();
|
|
363
|
+
const allCheckIds = new Set(checks.map((c) => c.id));
|
|
364
|
+
const registryContext = await resolveRegistryContext(infraPath);
|
|
365
|
+
const raw = await runComponentChecks(infraPath, checks, registryContext, sandbox, buildParams);
|
|
366
|
+
const fileDirectivesCache = new Map();
|
|
367
|
+
const fileLevelDisable = (file, checkId) => {
|
|
368
|
+
let directives = fileDirectivesCache.get(file);
|
|
369
|
+
if (!directives) {
|
|
370
|
+
let content = "";
|
|
371
|
+
try {
|
|
372
|
+
content = readFileSync(file, "utf-8");
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
// File may be unreadable (e.g. a synthetic discovery-error path) — no directives to honor.
|
|
376
|
+
}
|
|
377
|
+
directives = parseDisableComments(content);
|
|
378
|
+
fileDirectivesCache.set(file, directives);
|
|
379
|
+
}
|
|
380
|
+
for (const directive of directives) {
|
|
381
|
+
if (directive.type !== "file")
|
|
382
|
+
continue;
|
|
383
|
+
if (!directive.ruleIds)
|
|
384
|
+
return { suppressed: true, reason: directive.reason };
|
|
385
|
+
if (directive.ruleIds.some((id) => allCheckIds.has(id) || id === "COMP000") && directive.ruleIds.includes(checkId)) {
|
|
386
|
+
return { suppressed: true, reason: directive.reason };
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return { suppressed: false };
|
|
390
|
+
};
|
|
391
|
+
const toLintDiagnostic = (d, severity) => ({
|
|
392
|
+
file: d.file,
|
|
393
|
+
line: 1,
|
|
394
|
+
column: 1,
|
|
395
|
+
ruleId: d.checkId,
|
|
396
|
+
severity,
|
|
397
|
+
message: d.message,
|
|
398
|
+
});
|
|
399
|
+
const diagnostics = [];
|
|
400
|
+
const suppressed = [];
|
|
401
|
+
for (const d of raw) {
|
|
402
|
+
// Discovery errors (COMP000) always surface at error severity — not user-configurable.
|
|
403
|
+
let severity = d.severity;
|
|
404
|
+
if (d.checkId !== "COMP000") {
|
|
405
|
+
// chant #1138 — same resolution function AST rules and post-synth
|
|
406
|
+
// checks use (`resolveConfiguredSeverity`, ../../lint/config.ts).
|
|
407
|
+
const resolved = resolveConfiguredSeverity(config.rules, d.checkId, d.severity);
|
|
408
|
+
if (resolved.severity === "off")
|
|
409
|
+
continue;
|
|
410
|
+
severity = resolved.severity;
|
|
411
|
+
}
|
|
412
|
+
const disable = fileLevelDisable(d.file, d.checkId);
|
|
413
|
+
const diagnostic = toLintDiagnostic(d, severity);
|
|
414
|
+
if (disable.suppressed) {
|
|
415
|
+
suppressed.push({ ...diagnostic, reason: disable.reason });
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
diagnostics.push(diagnostic);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return { diagnostics, suppressed };
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Run the OPS* Op-model post-synth checks (#2122, epic #2114 sub-issue 6 —
|
|
425
|
+
* OPS012/OPS013/OPS014, ported from a hosting lexicon's own
|
|
426
|
+
* TMP012/TMP013/TMP014) over every `*.op.ts` file under the lint target and
|
|
427
|
+
* merge them into the same diagnostics/suppressed lists `chant lint` already
|
|
428
|
+
* reports through, the same treatment {@link runComponentCheckDiagnostics}
|
|
429
|
+
* above gives COMP*.
|
|
430
|
+
*
|
|
431
|
+
* Deliberately scoped DOWNWARD from `infraPath` — the same scan
|
|
432
|
+
* `getTypeScriptFiles` already ran to build `files` — rather than
|
|
433
|
+
* `../../op/discover.ts`'s `discoverOps`, which walks UP to the nearest
|
|
434
|
+
* project root (or the git root, absent a config file) precisely because a
|
|
435
|
+
* real project's `ops/` convention sits outside `sourceDir`. That upward
|
|
436
|
+
* walk is right for `chant run`/`chant build`, which always operate on one
|
|
437
|
+
* whole project; it is wrong here, because `chant lint <path>` (and every
|
|
438
|
+
* fixture-scoped test that calls this file's `lintCommand`) may point at a
|
|
439
|
+
* directory with no `chant.config.*` above it short of this repo's own git
|
|
440
|
+
* root — which would make this check import every `*.op.ts` file in the
|
|
441
|
+
* entire monorepo on every such call. Scanning only under `infraPath`, like
|
|
442
|
+
* every other check in this function, keeps this check's cost proportional
|
|
443
|
+
* to the target the caller actually asked to lint.
|
|
444
|
+
*
|
|
445
|
+
* Each `*.op.ts` file's default export is imported directly and used as-is
|
|
446
|
+
* (it is already the `Declarable` `OpResource` instance `Op()` built) — no
|
|
447
|
+
* serializer and no lexicon plugin needed, since OPS012/OPS013/OPS014 only
|
|
448
|
+
* ever read `ctx.entities`, never `ctx.outputs`. That's what lets this fire
|
|
449
|
+
* even on a project with no lexicons configured at all.
|
|
450
|
+
*
|
|
451
|
+
* The project's configured lexicon NAMES are read, though (chant #2101), to
|
|
452
|
+
* resolve the activity contracts each one declares at
|
|
453
|
+
* `@intentius/chant-lexicon-<name>/op/activity-contracts`. The plugins
|
|
454
|
+
* `lintCommand` already loaded are passed in (chant #2520), so a plugin's
|
|
455
|
+
* `activityContracts()` member counts here as it does in `chant build`, and
|
|
456
|
+
* a lexicon declared by module path is covered. Without them a step calling a
|
|
457
|
+
* lexicon's activity is flagged for the absence of a contract that lexicon
|
|
458
|
+
* does declare, which is the whole point of OPS013 firing outside a build.
|
|
459
|
+
*
|
|
460
|
+
* Reported at `1:1` in the file the Op was declared in, the same whole-file
|
|
461
|
+
* convention COMP* diagnostics use — a post-synth finding carries no real
|
|
462
|
+
* line/column (../../lint/post-synth.ts's `PostSynthDiagnostic` doc) and
|
|
463
|
+
* there's no per-file disable-directive suppression for the same reason
|
|
464
|
+
* (that doc again), so this reads only `lint.rules` severity overrides, not
|
|
465
|
+
* `chant-disable` comments.
|
|
466
|
+
*/
|
|
467
|
+
async function runOpCheckDiagnostics(infraPath, files, buildParams, plugins = []) {
|
|
468
|
+
const config = loadConfig(findProjectRoot(infraPath));
|
|
469
|
+
const opFiles = files.filter((f) => f.endsWith(".op.ts"));
|
|
470
|
+
if (opFiles.length === 0)
|
|
471
|
+
return { diagnostics: [], suppressed: [] };
|
|
472
|
+
// chant #2251 — the same step `discover()` runs before it imports or folds a
|
|
473
|
+
// project file (../../discovery/index.ts): populate the shared build-time
|
|
474
|
+
// parameters object BEFORE the imports below, so an Op that takes a step
|
|
475
|
+
// argument from `params.<name>` reads the value this invocation resolved
|
|
476
|
+
// rather than `undefined`. Unconditional, so a stale value from a prior
|
|
477
|
+
// lint in the same process (a test, `--watch`) never leaks into one that
|
|
478
|
+
// resolved none.
|
|
479
|
+
setBuildParams(buildParamValues(buildParams ?? []));
|
|
480
|
+
const entities = new Map();
|
|
481
|
+
const fileByOpName = new Map();
|
|
482
|
+
for (const filePath of opFiles) {
|
|
483
|
+
try {
|
|
484
|
+
ensureTypeScriptLoader();
|
|
485
|
+
const mod = await import(filePath);
|
|
486
|
+
const entity = mod.default;
|
|
487
|
+
if (!entity || typeof entity !== "object")
|
|
488
|
+
continue;
|
|
489
|
+
const opConfig = entity.props;
|
|
490
|
+
if (!opConfig || typeof opConfig.name !== "string" || !Array.isArray(opConfig.phases))
|
|
491
|
+
continue;
|
|
492
|
+
entities.set(opConfig.name, entity);
|
|
493
|
+
fileByOpName.set(opConfig.name, filePath);
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
// A file that fails to import is somebody else's problem — a syntax
|
|
497
|
+
// error surfaces through the AST rule pass over the same file instead
|
|
498
|
+
// of crashing this one.
|
|
499
|
+
continue;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (entities.size === 0)
|
|
503
|
+
return { diagnostics: [], suppressed: [] };
|
|
504
|
+
// chant #2520 — hand over the loaded plugin objects when there are any, as
|
|
505
|
+
// `chant build` does, so a plugin's `activityContracts()` member is read
|
|
506
|
+
// here too. Names alone are the fallback when no plugin loaded.
|
|
507
|
+
const activityContracts = plugins.length > 0
|
|
508
|
+
? await loadActivityContracts(plugins)
|
|
509
|
+
: await loadActivityContracts(await resolveProjectLexicons(infraPath).catch(() => []));
|
|
510
|
+
// SYS010 (#2828) also reads `decide.backends` from the project's config.
|
|
511
|
+
// A directory whose config does not load simply has none to check.
|
|
512
|
+
const decideBackends = await loadChantConfig(findProjectRoot(infraPath))
|
|
513
|
+
.then((loaded) => loaded.config.decide?.backends)
|
|
514
|
+
.catch(() => undefined);
|
|
515
|
+
const raw = runPostSynthChecks(coreOpChecks({ decideBackends }), {
|
|
516
|
+
outputs: new Map(),
|
|
517
|
+
entities: entities,
|
|
518
|
+
warnings: [],
|
|
519
|
+
errors: [],
|
|
520
|
+
sourceFileCount: opFiles.length,
|
|
521
|
+
}, undefined, { activityContracts });
|
|
522
|
+
const diagnostics = [];
|
|
523
|
+
const suppressed = [];
|
|
524
|
+
for (const d of raw) {
|
|
525
|
+
const resolved = resolveConfiguredSeverity(config.rules, d.checkId, d.severity);
|
|
526
|
+
if (resolved.severity === "off")
|
|
527
|
+
continue;
|
|
528
|
+
diagnostics.push({
|
|
529
|
+
file: (d.entity && fileByOpName.get(d.entity)) ?? infraPath,
|
|
530
|
+
line: 1,
|
|
531
|
+
column: 1,
|
|
532
|
+
ruleId: d.checkId,
|
|
533
|
+
severity: resolved.severity,
|
|
534
|
+
message: d.message,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
return { diagnostics, suppressed };
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Run each loaded lexicon's own post-synth checks (#3750), the ones `chant
|
|
541
|
+
* build` runs after it serializes, over an in-memory build of the lint target.
|
|
542
|
+
*
|
|
543
|
+
* The build is `chant build`'s: the same `build()` call with options from the
|
|
544
|
+
* same assembler (`../build-options.ts`), and the same per-lexicon scoping of
|
|
545
|
+
* outputs (`runLexiconPostSynthChecks`, ./build.ts). Nothing is written. It
|
|
546
|
+
* builds `infraPath`, the target the caller asked to lint, never the project
|
|
547
|
+
* root above it, so `chant lint <dir>` costs a build of `<dir>` and nothing
|
|
548
|
+
* more (the same scoping {@link runOpCheckDiagnostics} documents). It is
|
|
549
|
+
* skipped outright when no loaded lexicon ships post-synth checks and the
|
|
550
|
+
* project declares no `lint.policies`, which keeps a project with no lexicon,
|
|
551
|
+
* and every core-only fixture, from building at all.
|
|
552
|
+
*
|
|
553
|
+
* The project's `lint.policies` run over the same build after the lexicons'
|
|
554
|
+
* checks (#3870), with every lexicon's output and the env, as `chant build`
|
|
555
|
+
* runs them, and sandboxed when the build is. `lint.rules` applies to their
|
|
556
|
+
* ids; a policy that does not load is reported under
|
|
557
|
+
* {@link BUILD_FAILURE_RULE_ID}.
|
|
558
|
+
*
|
|
559
|
+
* A target that does not build reports each build error under
|
|
560
|
+
* {@link BUILD_FAILURE_RULE_ID} and skips the checks. Findings go through
|
|
561
|
+
* `lint.presets`, then `lint.rules`, then inline `chant-ignore` comments, the
|
|
562
|
+
* order `chant build` applies them in. A finding carries no line (see
|
|
563
|
+
* ../../lint/post-synth.ts's `PostSynthDiagnostic`), so it is reported at
|
|
564
|
+
* `1:1` in the file that declared its entity, or at the config file (the
|
|
565
|
+
* project root without one) when it names none.
|
|
566
|
+
*/
|
|
567
|
+
async function runLexiconPostSynthDiagnostics(infraPath, plugins, buildParams, sandbox) {
|
|
568
|
+
const diagnostics = [];
|
|
569
|
+
const suppressed = [];
|
|
570
|
+
const withChecks = plugins.filter((plugin) => (plugin.postSynthChecks?.() ?? []).length > 0);
|
|
571
|
+
const projectRoot = findProjectRoot(infraPath);
|
|
572
|
+
const lintConfig = loadConfig(projectRoot);
|
|
573
|
+
if (withChecks.length === 0 && (lintConfig.policies ?? []).length === 0)
|
|
574
|
+
return { diagnostics, suppressed };
|
|
575
|
+
// Where a finding that names no declared entity is reported: the config the
|
|
576
|
+
// build loads once it is known (past a lint-only fragment), else the nearest.
|
|
577
|
+
let fallbackFile = findProjectConfig(projectRoot).configPath ?? projectRoot;
|
|
578
|
+
const buildFailure = (message, at) => ({
|
|
579
|
+
file: at?.file ?? fallbackFile,
|
|
580
|
+
line: at?.line ?? 1,
|
|
581
|
+
column: at?.column ?? 1,
|
|
582
|
+
ruleId: BUILD_FAILURE_RULE_ID,
|
|
583
|
+
severity: "error",
|
|
584
|
+
message,
|
|
585
|
+
});
|
|
586
|
+
let result;
|
|
587
|
+
let env;
|
|
588
|
+
let telemetry;
|
|
589
|
+
let configDir = infraPath;
|
|
590
|
+
let loadedConfig;
|
|
591
|
+
let policies = [];
|
|
592
|
+
try {
|
|
593
|
+
const loaded = await loadChantConfigUpward(infraPath);
|
|
594
|
+
const config = loaded.config;
|
|
595
|
+
loadedConfig = config;
|
|
596
|
+
configDir = loaded.configPath ? dirname(loaded.configPath) : infraPath;
|
|
597
|
+
if (loaded.configPath)
|
|
598
|
+
fallbackFile = loaded.configPath;
|
|
599
|
+
// The caller's parameters when it resolved them (the CLI does, from the
|
|
600
|
+
// same upward config walk); otherwise the declared defaults and `env`
|
|
601
|
+
// mappings of the config this build loads. Not lintCommand's own fallback:
|
|
602
|
+
// that one reads the config at the lint root, which may be a lint-only
|
|
603
|
+
// fragment with no `buildParams` (a `src/chant.config.json`).
|
|
604
|
+
const params = buildParams ?? resolveBuildParams(config.buildParams, { env: process.env }).provenance;
|
|
605
|
+
env = resolveOwnershipEnv(config, params);
|
|
606
|
+
policies = config.lint?.policies ?? [];
|
|
607
|
+
// #3870: a sandboxed build sandboxes the policies too, as `chant build` arms it.
|
|
608
|
+
const modes = resolveBuildModes(config, { sandbox });
|
|
609
|
+
if (modes.sandbox && policies.length > 0)
|
|
610
|
+
armSandboxPolicyExecution();
|
|
611
|
+
telemetry = await resolveTelemetryAttribution(configDir, config, env);
|
|
612
|
+
// Every lexicon the lint loaded, as `chant build` serializes with every
|
|
613
|
+
// lexicon it loaded: a check may read another lexicon's entities, and the
|
|
614
|
+
// outputs are scoped per plugin below either way.
|
|
615
|
+
result = await build(infraPath, plugins.map((plugin) => plugin.serializer), undefined, resolveProjectBuildOptions({
|
|
616
|
+
config,
|
|
617
|
+
configDir,
|
|
618
|
+
plugins,
|
|
619
|
+
modes,
|
|
620
|
+
ownership: resolveOwnershipMarker(config, params),
|
|
621
|
+
buildParams: params,
|
|
622
|
+
telemetry,
|
|
623
|
+
}));
|
|
624
|
+
}
|
|
625
|
+
catch (err) {
|
|
626
|
+
diagnostics.push(buildFailure(err instanceof Error ? err.message : String(err)));
|
|
627
|
+
return { diagnostics, suppressed };
|
|
628
|
+
}
|
|
629
|
+
if (result.errors.length > 0) {
|
|
630
|
+
const seen = new Set();
|
|
631
|
+
for (const error of result.errors) {
|
|
632
|
+
const at = error;
|
|
633
|
+
const key = `${at.file ?? ""}:${at.line ?? ""}:${error.message}`;
|
|
634
|
+
if (seen.has(key))
|
|
635
|
+
continue;
|
|
636
|
+
seen.add(key);
|
|
637
|
+
diagnostics.push(buildFailure(error.message, at));
|
|
638
|
+
}
|
|
639
|
+
return { diagnostics, suppressed };
|
|
640
|
+
}
|
|
641
|
+
const activityContracts = await loadActivityContracts(plugins);
|
|
642
|
+
const fileOf = (entity) => {
|
|
643
|
+
const declared = entity ? result.entities.get(entity) : undefined;
|
|
644
|
+
return (declared && getProvenance(declared)?.sourceFile) || fallbackFile;
|
|
645
|
+
};
|
|
646
|
+
const toLint = (d) => ({
|
|
647
|
+
file: fileOf(d.entity),
|
|
648
|
+
line: 1,
|
|
649
|
+
column: 1,
|
|
650
|
+
ruleId: d.checkId,
|
|
651
|
+
severity: d.severity,
|
|
652
|
+
message: `${d.entity ? `[${d.entity}] ` : ""}${d.message}`,
|
|
653
|
+
});
|
|
654
|
+
for (const { plugin, diagnostics: raw } of runLexiconPostSynthChecks(withChecks, result, env, { activityContracts, telemetry, projectDir: configDir, ...(loadedConfig ? { projectConfig: loadedConfig } : {}) })) {
|
|
655
|
+
const presetIds = resolvePresetIds(plugin.lintPresets?.(), lintConfig.presets?.[plugin.name] ?? "recommended");
|
|
656
|
+
const afterPreset = applyConfiguredPreset(raw, presetIds, lintConfig.rules).diagnostics;
|
|
657
|
+
const afterConfig = applyConfiguredSeverity(afterPreset, lintConfig.rules).diagnostics;
|
|
658
|
+
const inline = applyInlineSuppressions(afterConfig, result.entities, lintConfig.rules);
|
|
659
|
+
for (const d of inline.diagnostics)
|
|
660
|
+
diagnostics.push(toLint(d));
|
|
661
|
+
for (const d of inline.suppressed)
|
|
662
|
+
suppressed.push({ ...toLint(d), reason: "chant-ignore" });
|
|
663
|
+
for (const m of inline.meta) {
|
|
664
|
+
diagnostics.push({ file: m.file, line: m.line, column: 1, ruleId: m.checkId, severity: m.severity, message: m.message });
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
// #3870: the project's `lint.policies`, over the same build, as `chant
|
|
668
|
+
// build` runs them: every lexicon's output at once, with the env, and
|
|
669
|
+
// `lint.rules` applied to their ids.
|
|
670
|
+
if (policies.length > 0) {
|
|
671
|
+
let raw;
|
|
672
|
+
try {
|
|
673
|
+
raw = await runProjectPolicies({ policies, configDir, buildResult: result, env });
|
|
674
|
+
}
|
|
675
|
+
catch (err) {
|
|
676
|
+
diagnostics.push(buildFailure(err instanceof Error ? err.message : String(err)));
|
|
677
|
+
return { diagnostics, suppressed };
|
|
678
|
+
}
|
|
679
|
+
const configured = applyConfiguredSeverity(raw, lintConfig.rules);
|
|
680
|
+
for (const d of configured.diagnostics)
|
|
681
|
+
diagnostics.push(toLint(d));
|
|
682
|
+
}
|
|
683
|
+
return { diagnostics, suppressed };
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Apply fixes to a file
|
|
687
|
+
*/
|
|
688
|
+
function applyFixes(filePath, fixes) {
|
|
689
|
+
if (fixes.length === 0)
|
|
690
|
+
return;
|
|
691
|
+
let content = readFileSync(filePath, "utf-8");
|
|
692
|
+
// Sort fixes by position descending so we can apply from end to start
|
|
693
|
+
const sortedFixes = [...fixes].sort((a, b) => b.range[0] - a.range[0]);
|
|
694
|
+
for (const fix of sortedFixes) {
|
|
695
|
+
content = content.slice(0, fix.range[0]) + fix.replacement + content.slice(fix.range[1]);
|
|
696
|
+
}
|
|
697
|
+
writeFileSync(filePath, content);
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Execute the lint command
|
|
701
|
+
*/
|
|
702
|
+
export async function lintCommand(options) {
|
|
703
|
+
const infraPath = resolve(options.path);
|
|
704
|
+
// Config, rules, and lexicons anchor on the project root so a scoped lint
|
|
705
|
+
// (`chant lint src`, the `graph --format ir` gate) still sees `lint.overrides`
|
|
706
|
+
// and the declared lexicons; only the file scan stays scoped to `infraPath`.
|
|
707
|
+
const projectRoot = findProjectRoot(infraPath);
|
|
708
|
+
const config = loadConfig(projectRoot);
|
|
709
|
+
const hasOverrides = config.overrides && config.overrides.length > 0;
|
|
710
|
+
// chant #1221 — the project's chant.config slice for config-aware rules
|
|
711
|
+
// (COR021 reads `environments` + `ownership`), threaded into every
|
|
712
|
+
// runLint() call below via LintContext.projectConfig. Best-effort: a
|
|
713
|
+
// directory with no project config lints with those rules silent.
|
|
714
|
+
let projectConfig;
|
|
715
|
+
// chant #1866 — the loaded OKF knowledge bundle, threaded into
|
|
716
|
+
// `formatStylish` below so its suppressed section can resolve `okf:`
|
|
717
|
+
// citations. Best-effort like `projectConfig` above (same
|
|
718
|
+
// `loadChantConfig` call): a directory with no chant config, or no
|
|
719
|
+
// `knowledge/` bundle, lints with citations rendering unresolved rather
|
|
720
|
+
// than a failure — `loadOkfBundle` already treats a missing directory as
|
|
721
|
+
// an empty bundle.
|
|
722
|
+
let knowledgeBundle;
|
|
723
|
+
/**
|
|
724
|
+
* chant #2249 — this invocation's build-time parameters, falling back to
|
|
725
|
+
* the project's own declared `buildParams` when the caller passed none.
|
|
726
|
+
*
|
|
727
|
+
* `chant lint` resolves them in ./handlers/lint.ts (#2251) because only
|
|
728
|
+
* the CLI knows about `--param`/`--params-file`, and passes them here. An
|
|
729
|
+
* in-process caller has no such flags to read, and before this fell
|
|
730
|
+
* through to the empty parameter object: the OPS* checks import each
|
|
731
|
+
* `*.op.ts`, an Op taking a step argument from `params.<name>` read
|
|
732
|
+
* `undefined` at module load, and OPS012 reported the activity contract
|
|
733
|
+
* violated for source `chant lint` on the command line passes. That made
|
|
734
|
+
* `lintCommand` disagree with its own CLI (the root-examples gate,
|
|
735
|
+
* `handleLint` over MCP, test-utils' example harness). Resolving the
|
|
736
|
+
* declared defaults + `env` mappings here is what the command line
|
|
737
|
+
* already gets; anything a flag would override still arrives in
|
|
738
|
+
* `options.buildParams` and wins. Best-effort like `projectConfig`:
|
|
739
|
+
* `resolveBuildParams` collects failures per parameter without throwing,
|
|
740
|
+
* and the ones that did resolve are still better than none.
|
|
741
|
+
*/
|
|
742
|
+
let buildParams = options.buildParams;
|
|
743
|
+
try {
|
|
744
|
+
const chantConfig = (await loadChantConfig(projectRoot)).config;
|
|
745
|
+
projectConfig = chantConfig;
|
|
746
|
+
knowledgeBundle = await loadOkfBundle(resolveKnowledgeDir(chantConfig, projectRoot));
|
|
747
|
+
buildParams ?? (buildParams = resolveBuildParams(chantConfig.buildParams, { env: process.env }).provenance);
|
|
748
|
+
}
|
|
749
|
+
catch {
|
|
750
|
+
projectConfig = undefined;
|
|
751
|
+
knowledgeBundle = undefined;
|
|
752
|
+
}
|
|
753
|
+
// Load all rules from lexicon plugins (core "chant" + lexicon-specific)
|
|
754
|
+
const loaded = await loadAllPluginRules(projectRoot);
|
|
755
|
+
let allRules = loaded.rules;
|
|
756
|
+
// chant #1106 — the active lexicons' registered intrinsics, threaded into
|
|
757
|
+
// every runLint() call below so EVL001 answers exactly like fold() does
|
|
758
|
+
// for a registered, opted-in call (`Ref(...)`, `GetAtt(...)`) instead of
|
|
759
|
+
// flagging it. Computed once here regardless of which branch below runs,
|
|
760
|
+
// same as `allRules`.
|
|
761
|
+
const intrinsics = loaded.intrinsics;
|
|
762
|
+
const propertyClasses = loaded.propertyClasses;
|
|
763
|
+
// Merge in any config-level plugin rules (custom .ts rule files)
|
|
764
|
+
if (config.plugins && config.plugins.length > 0) {
|
|
765
|
+
const pluginRules = await loadPluginRules(config.plugins, projectRoot);
|
|
766
|
+
allRules = new Map([...allRules, ...pluginRules]);
|
|
767
|
+
}
|
|
768
|
+
// Get all TypeScript files, through the one discovery walk (#2527)
|
|
769
|
+
const files = await getTypeScriptFiles(infraPath);
|
|
770
|
+
// Run lint — use per-file rules when overrides are present
|
|
771
|
+
let diagnostics;
|
|
772
|
+
let suppressed = [];
|
|
773
|
+
if (options.rules) {
|
|
774
|
+
const result = await runLint(files, options.rules, undefined, intrinsics, projectConfig, propertyClasses);
|
|
775
|
+
diagnostics = result.diagnostics;
|
|
776
|
+
suppressed = result.suppressed;
|
|
777
|
+
}
|
|
778
|
+
else if (hasOverrides) {
|
|
779
|
+
diagnostics = [];
|
|
780
|
+
for (const file of files) {
|
|
781
|
+
const relativePath = relative(projectRoot, file);
|
|
782
|
+
const { rules: fileRules, ruleOptions } = getDefaultRules(projectRoot, relativePath, allRules);
|
|
783
|
+
const result = await runLint([file], fileRules, ruleOptions, intrinsics, projectConfig, propertyClasses);
|
|
784
|
+
diagnostics.push(...result.diagnostics);
|
|
785
|
+
suppressed.push(...result.suppressed);
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
else {
|
|
789
|
+
const { rules, ruleOptions } = getDefaultRules(projectRoot, undefined, allRules);
|
|
790
|
+
const result = await runLint(files, rules, ruleOptions, intrinsics, projectConfig, propertyClasses);
|
|
791
|
+
diagnostics = result.diagnostics;
|
|
792
|
+
suppressed = result.suppressed;
|
|
793
|
+
}
|
|
794
|
+
// Run the COMP* composition checks (#562) over the discovered `Component`
|
|
795
|
+
// graph and merge them into the same diagnostics/suppressed lists — a
|
|
796
|
+
// structurally distinct check family (whole-project, post-discovery,
|
|
797
|
+
// see ../../lint/component-checks.ts) but the same `chant lint` output and
|
|
798
|
+
// the same error-severity gating as every COR/EVL diagnostic.
|
|
799
|
+
const componentResult = await runComponentCheckDiagnostics(infraPath, options.sandbox, buildParams);
|
|
800
|
+
diagnostics.push(...componentResult.diagnostics);
|
|
801
|
+
suppressed.push(...componentResult.suppressed);
|
|
802
|
+
// Run the OPS* Op-model post-synth checks (#2122) over every `*.op.ts`
|
|
803
|
+
// file under the lint target — see runOpCheckDiagnostics's doc for why
|
|
804
|
+
// this needs no lexicon or build to fire.
|
|
805
|
+
const opResult = await runOpCheckDiagnostics(infraPath, files, buildParams, loaded.plugins);
|
|
806
|
+
diagnostics.push(...opResult.diagnostics);
|
|
807
|
+
suppressed.push(...opResult.suppressed);
|
|
808
|
+
// Apply fixes if requested
|
|
809
|
+
if (options.fix) {
|
|
810
|
+
// Group fixes by file
|
|
811
|
+
const fixesByFile = new Map();
|
|
812
|
+
for (const diag of diagnostics) {
|
|
813
|
+
if (diag.fix) {
|
|
814
|
+
const existing = fixesByFile.get(diag.file) ?? [];
|
|
815
|
+
existing.push(diag.fix);
|
|
816
|
+
fixesByFile.set(diag.file, existing);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
// Apply fixes to each file
|
|
820
|
+
for (const [file, fixes] of fixesByFile) {
|
|
821
|
+
applyFixes(file, fixes);
|
|
822
|
+
}
|
|
823
|
+
// Re-lint after fixes to get updated diagnostics
|
|
824
|
+
if (options.rules) {
|
|
825
|
+
const postResult = await runLint(files, options.rules, undefined, intrinsics, projectConfig, propertyClasses);
|
|
826
|
+
diagnostics = postResult.diagnostics;
|
|
827
|
+
suppressed = postResult.suppressed;
|
|
828
|
+
}
|
|
829
|
+
else if (hasOverrides) {
|
|
830
|
+
diagnostics = [];
|
|
831
|
+
suppressed = [];
|
|
832
|
+
for (const file of files) {
|
|
833
|
+
const relativePath = relative(projectRoot, file);
|
|
834
|
+
const { rules: fileRules, ruleOptions } = getDefaultRules(projectRoot, relativePath, allRules);
|
|
835
|
+
const postResult = await runLint([file], fileRules, ruleOptions, intrinsics, projectConfig, propertyClasses);
|
|
836
|
+
diagnostics.push(...postResult.diagnostics);
|
|
837
|
+
suppressed.push(...postResult.suppressed);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
else {
|
|
841
|
+
const { rules, ruleOptions } = getDefaultRules(projectRoot, undefined, allRules);
|
|
842
|
+
const postResult = await runLint(files, rules, ruleOptions, intrinsics, projectConfig, propertyClasses);
|
|
843
|
+
diagnostics = postResult.diagnostics;
|
|
844
|
+
suppressed = postResult.suppressed;
|
|
845
|
+
}
|
|
846
|
+
// COMP* checks have no `.fix` (nothing above could have touched a
|
|
847
|
+
// `*.component.ts` file on their behalf), but a fix applied to another
|
|
848
|
+
// rule could still be in the same file a component was discovered from —
|
|
849
|
+
// re-run for consistency with the AST re-lint above.
|
|
850
|
+
const postComponentResult = await runComponentCheckDiagnostics(infraPath, options.sandbox, buildParams);
|
|
851
|
+
diagnostics.push(...postComponentResult.diagnostics);
|
|
852
|
+
suppressed.push(...postComponentResult.suppressed);
|
|
853
|
+
// OPS* checks have no `.fix` either; re-run for the same consistency
|
|
854
|
+
// reason as the COMP* re-run just above.
|
|
855
|
+
const postOpResult = await runOpCheckDiagnostics(infraPath, files, buildParams, loaded.plugins);
|
|
856
|
+
diagnostics.push(...postOpResult.diagnostics);
|
|
857
|
+
suppressed.push(...postOpResult.suppressed);
|
|
858
|
+
}
|
|
859
|
+
// chant #3750: each lexicon's own post-synth checks, over an in-memory
|
|
860
|
+
// build of the lint target. Run once, after any `--fix` above, so it sees
|
|
861
|
+
// the source as fixed; a post-synth finding has no fix of its own. Skipped
|
|
862
|
+
// when a lexicon failed to resolve, which LEX001 below already reports.
|
|
863
|
+
if (!loaded.lexiconError && options.postSynth !== false) {
|
|
864
|
+
const lexiconResult = await runLexiconPostSynthDiagnostics(infraPath, loaded.plugins, options.buildParams, options.sandbox);
|
|
865
|
+
diagnostics.push(...lexiconResult.diagnostics);
|
|
866
|
+
suppressed.push(...lexiconResult.suppressed);
|
|
867
|
+
}
|
|
868
|
+
// chant #2222: a lexicon the project declared but this run could not
|
|
869
|
+
// resolve. Appended here, after the `--fix` re-lint block above has finished
|
|
870
|
+
// reassigning `diagnostics`, so it survives every path; it is a property of
|
|
871
|
+
// the run, not of any file a fix could touch.
|
|
872
|
+
if (loaded.lexiconError) {
|
|
873
|
+
diagnostics.push(lexiconResolutionDiagnostic(projectRoot, loaded.lexiconError));
|
|
874
|
+
}
|
|
875
|
+
// Count errors and warnings
|
|
876
|
+
let errorCount = 0;
|
|
877
|
+
let warningCount = 0;
|
|
878
|
+
for (const diag of diagnostics) {
|
|
879
|
+
if (diag.severity === "error") {
|
|
880
|
+
errorCount++;
|
|
881
|
+
}
|
|
882
|
+
else if (diag.severity === "warning") {
|
|
883
|
+
warningCount++;
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
// Collect all loaded rules for SARIF enrichment
|
|
887
|
+
const allLoadedRules = options.rules
|
|
888
|
+
? options.rules
|
|
889
|
+
: [...allRules.values()];
|
|
890
|
+
// Format output
|
|
891
|
+
let output;
|
|
892
|
+
switch (options.format) {
|
|
893
|
+
case "json":
|
|
894
|
+
output = formatJson(diagnostics);
|
|
895
|
+
break;
|
|
896
|
+
case "sarif":
|
|
897
|
+
output = formatSarif(diagnostics, allLoadedRules, suppressed);
|
|
898
|
+
break;
|
|
899
|
+
case "stylish":
|
|
900
|
+
default:
|
|
901
|
+
output = formatStylish(diagnostics, suppressed, knowledgeBundle);
|
|
902
|
+
break;
|
|
903
|
+
}
|
|
904
|
+
return {
|
|
905
|
+
success: errorCount === 0,
|
|
906
|
+
errorCount,
|
|
907
|
+
warningCount,
|
|
908
|
+
diagnostics,
|
|
909
|
+
output,
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* Print lint result to console
|
|
914
|
+
*/
|
|
915
|
+
export function printLintResult(result) {
|
|
916
|
+
if (result.output) {
|
|
917
|
+
console.log(result.output);
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Run lint in watch mode. Runs an initial lint, then watches for changes
|
|
922
|
+
* and triggers re-lints. Returns a cleanup function.
|
|
923
|
+
*/
|
|
924
|
+
export function lintCommandWatch(options, onReLint) {
|
|
925
|
+
const infraPath = resolve(options.path);
|
|
926
|
+
console.error(formatInfo(`[${formatTimestamp()}] Watching for changes...`));
|
|
927
|
+
// Run initial lint
|
|
928
|
+
lintCommand(options).then((result) => {
|
|
929
|
+
printLintResult(result);
|
|
930
|
+
onReLint?.(result);
|
|
931
|
+
console.error(formatInfo(`[${formatTimestamp()}] Waiting for changes...`));
|
|
932
|
+
});
|
|
933
|
+
// Watch for changes and trigger re-lints
|
|
934
|
+
const cleanup = watchDirectory(infraPath, async (changedFiles) => {
|
|
935
|
+
console.error("");
|
|
936
|
+
console.error(formatInfo(`[${formatTimestamp()}] Changes detected: ${formatChangedFiles(changedFiles, infraPath)}`));
|
|
937
|
+
try {
|
|
938
|
+
const result = await lintCommand(options);
|
|
939
|
+
printLintResult(result);
|
|
940
|
+
onReLint?.(result);
|
|
941
|
+
}
|
|
942
|
+
catch (err) {
|
|
943
|
+
console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
|
|
944
|
+
}
|
|
945
|
+
console.error(formatInfo(`[${formatTimestamp()}] Waiting for changes...`));
|
|
946
|
+
});
|
|
947
|
+
return cleanup;
|
|
948
|
+
}
|