@intentius/chant 0.124.12 → 0.124.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.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.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +36 -6
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +5 -30
|
@@ -0,0 +1,696 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { isFoldableHelperName } from "./foldable-helpers.js";
|
|
3
|
+
import { intrinsicCallFolds, intrinsicCallFoldsEagerly } from "../lexicon.js";
|
|
4
|
+
/**
|
|
5
|
+
* subset — chant's implementation of the SHAPE layer of the TypeScript-as-Data
|
|
6
|
+
* specification (chant #1024, epic #1019).
|
|
7
|
+
*
|
|
8
|
+
* ## The specification is normative; this file implements it
|
|
9
|
+
*
|
|
10
|
+
* Since INTENTIUS/typescript-as-data#33 (2026-09-10) the subset is defined by
|
|
11
|
+
* the specification at https://github.com/INTENTIUS/typescript-as-data, not by
|
|
12
|
+
* this file. The rules this module implements are the `S-*` productions of
|
|
13
|
+
* `spec/grammar.md` §2 — S-Unwrap, S-Literal, S-Ident, S-Template, S-Tagged,
|
|
14
|
+
* S-Object (S-Prop / S-Shorthand / S-SpreadProp), S-Array, S-Member, S-Index,
|
|
15
|
+
* S-Unary, S-Binary, S-Conditional, S-New, the S-Call forms (S-CallHelper,
|
|
16
|
+
* S-CallIntrinsic, S-CallEager, S-CallMethod, S-CompositeStep) and S-Reject —
|
|
17
|
+
* and the direction rule `F-Direction` of `spec/divergence.md`: this classifier
|
|
18
|
+
* may accept what `fold()` rejects, never the reverse, outside the two named
|
|
19
|
+
* exceptions F-Exc-Lazy and F-Exc-Registry. The "environment-dependent
|
|
20
|
+
* exceptions" enumerated below are `spec/divergence.md`'s F-Div-* rows, kept
|
|
21
|
+
* here as implementation notes on WHY each resolution is out of this module's
|
|
22
|
+
* reach.
|
|
23
|
+
*
|
|
24
|
+
* Changing the subset goes spec-first: propose and land the rule there (with a
|
|
25
|
+
* fixture), then implement it here citing the identifier, then release. The
|
|
26
|
+
* provisional path for a change needed before the rule can be written: land it
|
|
27
|
+
* with the affected rule marked PROVISIONAL in this doc naming the spec issue;
|
|
28
|
+
* a provisional marker may survive at most one release, and the docs may not
|
|
29
|
+
* describe the change as supported until the rule exists. See
|
|
30
|
+
* `spec/README.md` "Ownership" and chant #2354.
|
|
31
|
+
*
|
|
32
|
+
* `fold()` ({@link "./fold"}, the enforcement layer — a construct outside
|
|
33
|
+
* this subset simply has no case there) and EVL001/EVL003
|
|
34
|
+
* ({@link "../lint/rules/evl001-non-literal-expression"},
|
|
35
|
+
* {@link "../lint/rules/evl003-dynamic-property-access"} — the pre-flight
|
|
36
|
+
* diagnostic layer) both import this module so the two can never drift
|
|
37
|
+
* apart on *which node kinds, operators, and key shapes* are foldable.
|
|
38
|
+
* Before this module existed, `fold()` and EVL001 each hand-rolled their
|
|
39
|
+
* own recursive classifier; they agreed almost everywhere but had several
|
|
40
|
+
* real, silent gaps (see git history of #1024 for the enumerated list —
|
|
41
|
+
* dynamic object-literal keys, template/tagged-template interiors, and
|
|
42
|
+
* unrestricted binary/unary operators were all accepted by EVL001 but
|
|
43
|
+
* rejected by `fold()`). This module is the fix: one classifier, two
|
|
44
|
+
* importers.
|
|
45
|
+
*
|
|
46
|
+
* Scope — this module classifies *shape* only: the syntactic kind of an
|
|
47
|
+
* expression, its operator, and (for keys) its literal-ness. It
|
|
48
|
+
* deliberately does NOT resolve bindings or perform any evaluation, because
|
|
49
|
+
* three things a full fold needs are inherently environment-dependent and
|
|
50
|
+
* cannot be recovered from shape alone.
|
|
51
|
+
*
|
|
52
|
+
* One thing it does read beyond the expression itself, since chant#2435: the
|
|
53
|
+
* enclosing file's top-level bindings, for `S-CallLocal`. A call to a
|
|
54
|
+
* project-local function is admitted by NAME (see
|
|
55
|
+
* {@link collectLocalCallables}), which is decidable from that file's syntax
|
|
56
|
+
* and needs no resolution. Before that, this module rejected all four shapes
|
|
57
|
+
* the build folds, which is the one direction `F-Direction` forbids, and it
|
|
58
|
+
* made `chant lint` report EVL001 on a file `chant build --fold` folds
|
|
59
|
+
* cleanly. The three genuinely environment-dependent cases are:
|
|
60
|
+
*
|
|
61
|
+
* 1. Identifier *resolution* — is a bare name actually a local `const`,
|
|
62
|
+
* vs. an unbound name? That needs the file's `consts` map. Both
|
|
63
|
+
* `fold()` and this module treat a bare identifier as shape-valid;
|
|
64
|
+
* `fold()` alone resolves it (and rejects if unresolved) once it has
|
|
65
|
+
* that map. A lint rule has no equivalent binding-resolution pass
|
|
66
|
+
* today, so EVL (via this module) stays permissive here — a known,
|
|
67
|
+
* intentional asymmetry, not a bug: it can only ever be a *false
|
|
68
|
+
* negative* on EVL's part (EVL passes something `fold()` might later
|
|
69
|
+
* reject for being unresolved), never the reverse.
|
|
70
|
+
*
|
|
71
|
+
* chant #1169 adds one more resolution-dependent rejection in the same
|
|
72
|
+
* direction: an identifier bound to a same-file `const x = new T(...)`,
|
|
73
|
+
* used as a VALUE. It is shape-valid here; `fold()` answers it only when
|
|
74
|
+
* its caller pre-resolved that const to the one real instance the file
|
|
75
|
+
* built (`../discovery/fold-import.ts`), and rejects otherwise, because
|
|
76
|
+
* re-folding the initializer would construct a duplicate of a resource
|
|
77
|
+
* discovery has already registered. Shape cannot see the difference, and
|
|
78
|
+
* the rejection is a fall-back-to-run, never a wrong value.
|
|
79
|
+
*
|
|
80
|
+
* chant #2328 adds another, in the same direction and for the same
|
|
81
|
+
* reason: a property or element read whose OBJECT resolves to `null` or
|
|
82
|
+
* `undefined` (`cfg.nett.vpcId`, a typo in a nested path). Running it
|
|
83
|
+
* throws a `TypeError`, so `fold()` refuses rather than answering
|
|
84
|
+
* `undefined` and letting the build carry on with the property dropped.
|
|
85
|
+
* What the object resolves to is exactly the resolution this module
|
|
86
|
+
* does not do, so `cfg.nett.vpcId` stays shape-valid here — and a
|
|
87
|
+
* genuinely optional `cfg.net?.vpcId`, which folds to `undefined`
|
|
88
|
+
* because JavaScript defines it that way, is shape-valid in both.
|
|
89
|
+
* 2. Tagged-template *tag registration* — needs a lexicon's intrinsics
|
|
90
|
+
* manifest, which isn't available to a syntax-only lint rule. `fold()`
|
|
91
|
+
* alone checks it; this module treats any tag name as shape-valid and
|
|
92
|
+
* only classifies the interpolated values.
|
|
93
|
+
* 2b. Authoring-helper *provenance* (chant #1082) — a call to a registered
|
|
94
|
+
* chant helper (`phase(...)`, `output(...)`; ./foldable-helpers.ts)
|
|
95
|
+
* folds, but only when the name is genuinely bound to an import of
|
|
96
|
+
* chant's own. That needs the module graph, which a syntax-only lint
|
|
97
|
+
* rule doesn't have. This module checks the NAME only and stays
|
|
98
|
+
* permissive; `fold()`'s bridge does the provenance check and falls the
|
|
99
|
+
* file back to run when it fails. Same direction as every other item
|
|
100
|
+
* here — a false negative for EVL, never a false positive.
|
|
101
|
+
* 2c. Intrinsic *call-form* registration (chant #1044) — a plain call to a
|
|
102
|
+
* lexicon intrinsic the lexicon opted in (`Ref(bucket)`,
|
|
103
|
+
* `Concat(a, b)`; `IntrinsicDef.foldsAsCall`, ../lexicon.ts) folds.
|
|
104
|
+
* Whether a given name is such an intrinsic is not knowable from shape,
|
|
105
|
+
* so {@link findSubsetViolation} takes the registry as an OPTIONAL
|
|
106
|
+
* parameter instead of guessing: supply it and the answer for a call is
|
|
107
|
+
* exact (fold()'s own), omit it and every call is a violation, the
|
|
108
|
+
* pre-#1044 answer.
|
|
109
|
+
*
|
|
110
|
+
* That parameter is the whole reason the call case lives here rather
|
|
111
|
+
* than only in `fold()`. This module is a shared predicate, and the
|
|
112
|
+
* point of a shared predicate is that a consumer can ask "will this
|
|
113
|
+
* fold?" without running fold — a control plane deciding whether a
|
|
114
|
+
* repository needs a sandboxed child process at all, for instance.
|
|
115
|
+
* Keeping the case out of here would make the predicate answer "no" for
|
|
116
|
+
* idiomatic `Ref(...)` source that `fold()` reduces cleanly: not a
|
|
117
|
+
* permissive gap but a systematically WRONG answer in the expensive
|
|
118
|
+
* direction, and the one direction this module is not allowed to be
|
|
119
|
+
* wrong in (see the false-negative/false-positive rule in point 1, and
|
|
120
|
+
* the flow-sensitivity note below — the single divergence in the other
|
|
121
|
+
* direction, and the one this module treats as a wart). A caller with
|
|
122
|
+
* no registry degrades to "assume it runs", which is safe and cheap to
|
|
123
|
+
* reason about.
|
|
124
|
+
*
|
|
125
|
+
* chant #1106 — EVL is no longer such a caller by default. `runLint`
|
|
126
|
+
* (../lint/engine.ts) takes the active lexicons' `IntrinsicDef[]` as a
|
|
127
|
+
* parameter and puts it on `LintContext.intrinsics`
|
|
128
|
+
* (../lint/rule.ts), and EVL001 (evl001-non-literal-expression.ts)
|
|
129
|
+
* passes it straight through to `checkObjectMember`. `chant lint`'s
|
|
130
|
+
* three CLI entry points (the `lint` command's initial pass, its
|
|
131
|
+
* `--fix` re-lint, and the LSP's per-file diagnostics) all resolve the
|
|
132
|
+
* project's lexicons and thread their intrinsics through, mirroring
|
|
133
|
+
* how `discover()` has done it for the fold path since #1039/#1105 —
|
|
134
|
+
* so `chant lint` on a real project no longer flags `Ref(...)` that
|
|
135
|
+
* `fold()` accepts. A `LintContext` built without that plumbing (a
|
|
136
|
+
* unit test constructing one directly, a consumer that hasn't
|
|
137
|
+
* resolved lexicons) still gets the pre-#1044 conservative answer —
|
|
138
|
+
* that path was never wrong, only stricter than it had to be.
|
|
139
|
+
* 3. Runtime *type* of a folded value — e.g. spreading `const n = 5`
|
|
140
|
+
* (`{...n}`) is shape-valid (`n` is a plain identifier) but `fold()`
|
|
141
|
+
* rejects it once it discovers `n` folds to a number, not an object.
|
|
142
|
+
* Only real evaluation catches this; EVL004 independently narrows
|
|
143
|
+
* spread sources to a stricter "traceable to a const" shape, which
|
|
144
|
+
* catches most real-world misuse without evaluating, but is not a
|
|
145
|
+
* full substitute.
|
|
146
|
+
*
|
|
147
|
+
* One more inherent gap, on the *value-flow* side rather than shape:
|
|
148
|
+
* `fold()` evaluates `&&`/`||`/`??` and `? :` lazily — it only folds the
|
|
149
|
+
* side/branch actually taken, exactly like the JS runtime — so an
|
|
150
|
+
* otherwise-unfoldable *untaken* branch does not reject
|
|
151
|
+
* (`false && sideEffect()` folds cleanly to `false`). This module (and so
|
|
152
|
+
* EVL) is flow-insensitive: it has no notion of "taken", so it requires
|
|
153
|
+
* every operand/branch to be shape-valid. This can only make EVL *stricter*
|
|
154
|
+
* than `fold()` (a false positive relative to fold, flagging code the
|
|
155
|
+
* folder would actually accept) — never the reverse. Making EVL
|
|
156
|
+
* flow-sensitive would mean re-implementing an evaluator inside a lint
|
|
157
|
+
* rule; out of scope here. See #1024.
|
|
158
|
+
*
|
|
159
|
+
* ## Which version of the specification this is
|
|
160
|
+
*
|
|
161
|
+
* A specification version names a set of rules and moves on its own schedule,
|
|
162
|
+
* separately from chant's releases (INTENTIUS/typescript-as-data#18). The
|
|
163
|
+
* version chant implements is {@link SPEC_VERSION}, and it is exported from
|
|
164
|
+
* `@intentius/chant`'s public entry so the specification's conformance suite
|
|
165
|
+
* can read it. A suite that finds no declaration reports the implementation as
|
|
166
|
+
* `undeclared` rather than assuming it is current, which is the right default
|
|
167
|
+
* and a useless answer to get from an implementation that does know.
|
|
168
|
+
*
|
|
169
|
+
* Raising it is part of adopting a new version of the rules, alongside the
|
|
170
|
+
* spec-first change process above: land the rule there, implement it here
|
|
171
|
+
* citing the identifier, then move this constant.
|
|
172
|
+
*/
|
|
173
|
+
/**
|
|
174
|
+
* The version of the TypeScript-as-Data specification chant implements
|
|
175
|
+
* (chant#2424).
|
|
176
|
+
*
|
|
177
|
+
* `spec/VERSION` in the specification repository carries the same string, and
|
|
178
|
+
* the conformance adapter reads this one to fill its `specVersion` field.
|
|
179
|
+
*
|
|
180
|
+
* ## Why 2.3, and what each version since 1.0 asked for (chant#2445)
|
|
181
|
+
*
|
|
182
|
+
* Raising this is the last step of adopting a rule set, so each version was
|
|
183
|
+
* checked against what chant does rather than against whether the suite is
|
|
184
|
+
* green:
|
|
185
|
+
*
|
|
186
|
+
* - **1.1** added the two profiles. Its own changelog says nothing in `full`
|
|
187
|
+
* changed, so an implementation of 1.0 implements 1.1's `full` unchanged.
|
|
188
|
+
* - **1.2** added `S-LocalFunction`, which chant already folded in both forms,
|
|
189
|
+
* and `S-CallLocal`, which chant's classifier rejected until `chant-v0.72.0`
|
|
190
|
+
* (#2435). `S-ExportDefault` is `data-host`; the profile table records it in
|
|
191
|
+
* `full` as permitted, not required.
|
|
192
|
+
* - **1.3** dropped the number from `F-Eval-CallLocal` step 2, which chant
|
|
193
|
+
* satisfies by reporting the engine's stack overflow as a fallback under
|
|
194
|
+
* `F-Depth`, and clarified `F-Eval-Ident` step 3 with the reading both
|
|
195
|
+
* implementations already had.
|
|
196
|
+
* - **1.4** added the `F-Rule-*` family, extracted from chant's own
|
|
197
|
+
* post-synthesis engine. The conformance bridge answers all five fixtures
|
|
198
|
+
* with no disagreements.
|
|
199
|
+
* - **1.5** added `F-Val-Source`, and this is the one that looks like a gap and
|
|
200
|
+
* is not. The rule says that for every value of the domain there is source in
|
|
201
|
+
* the subset whose fold is that value: a property of the subset, not a demand
|
|
202
|
+
* that an implementation ship a generator. The round trip's fidelity half is
|
|
203
|
+
* named in the specification's README as an obligation on generators and
|
|
204
|
+
* explicitly not a rule. Inventory rows `L12.1` to `L12.4` record chant's
|
|
205
|
+
* generators against it. The conformance adapter's unanswered `generate`
|
|
206
|
+
* hook is a harness capability, not a rule chant fails.
|
|
207
|
+
* - **1.6** was written from chant's behaviour and no further: `F-Call` step 7
|
|
208
|
+
* binding whatever an invoked factory returns is what chant never checked
|
|
209
|
+
* (`L8.19`), and a declarator reaching a call through a const alias is what
|
|
210
|
+
* chant resolves while refusing a call nested elsewhere (`L2.18`).
|
|
211
|
+
* - **1.7** put `F-Eval-CallLocal` before the two registered call shapes, so a
|
|
212
|
+
* call through a name the project bound is the project function's call
|
|
213
|
+
* whatever the registry says. That is what chant's whole-build fold already
|
|
214
|
+
* did, and the reason the specification moved rather than chant: probes with
|
|
215
|
+
* chant's own `output` showed the binding-first order living in
|
|
216
|
+
* `resolveCallExpression`, while `L2.11` described the expression
|
|
217
|
+
* classifier. The two were never required to share an order.
|
|
218
|
+
* - **1.8** added `ι = executing`, and chant carries it as of `0.72.3`
|
|
219
|
+
* (#2455) — `FoldProjectOptions.executing`, mutually exclusive with
|
|
220
|
+
* `sandbox`. `open` stays the default and stays strict (#2453).
|
|
221
|
+
* - **2.2** added obligations to `F-Obs-Provenance` for an implementation that
|
|
222
|
+
* claims provenance: one origin per emitted path of four kinds, the
|
|
223
|
+
* innermost writer wins, and an origin that cannot be determined is reported
|
|
224
|
+
* as unknown, never as direct. chant claims provenance, so this is the
|
|
225
|
+
* version whose obligations it takes on. 2.2 also widens two rules to what
|
|
226
|
+
* chant already did: a call-bound local exported by name (`export { x }`)
|
|
227
|
+
* resolves by F-Call as the single declarator does, and a same-file call's
|
|
228
|
+
* result read inside an F-Call argument resolves once per file (#3329).
|
|
229
|
+
* - **2.3** says a value host code produced, written at an export or into a
|
|
230
|
+
* field, has an unknown origin and never a direct one. chant reports
|
|
231
|
+
* `host-call` and `host-value` for resource fields since
|
|
232
|
+
* typescript-as-data#248. 2.3 also lets `F-Host-Composite` interpret a
|
|
233
|
+
* composite an active package publishes as TypeScript source, which chant
|
|
234
|
+
* has done since #3247, and adds fixtures for a call result read inside an
|
|
235
|
+
* argument, which chant passes since #3610.
|
|
236
|
+
*
|
|
237
|
+
* `scripts/check-docs-citations.ts` refuses to run when this constant and the
|
|
238
|
+
* rules it loads disagree, so this and the `@intentius/tsad-conformance`
|
|
239
|
+
* devDependency move together. That coupling is deliberate: it is what stops
|
|
240
|
+
* the docs being gated against a rule set nobody writes against — which is
|
|
241
|
+
* exactly what happened while this sat at `1.0` through six versions, passing
|
|
242
|
+
* because both sides were equally stale.
|
|
243
|
+
*
|
|
244
|
+
* Until chant#2470 the rules came from a commit `docs-check.yml` checked out;
|
|
245
|
+
* now they come from the published package, so bumping it is what moves this.
|
|
246
|
+
*/
|
|
247
|
+
export const SPEC_VERSION = "2.3";
|
|
248
|
+
function violation(node, message, ruleId = "EVL001") {
|
|
249
|
+
return { node, ruleId, message };
|
|
250
|
+
}
|
|
251
|
+
/** Binary operators `fold()` implements — see `fold()`'s operator switch in ./fold.ts. */
|
|
252
|
+
export const SUPPORTED_BINARY_OPERATORS = new Set([
|
|
253
|
+
ts.SyntaxKind.AmpersandAmpersandToken,
|
|
254
|
+
ts.SyntaxKind.BarBarToken,
|
|
255
|
+
ts.SyntaxKind.QuestionQuestionToken,
|
|
256
|
+
ts.SyntaxKind.PlusToken,
|
|
257
|
+
ts.SyntaxKind.MinusToken,
|
|
258
|
+
ts.SyntaxKind.AsteriskToken,
|
|
259
|
+
ts.SyntaxKind.SlashToken,
|
|
260
|
+
ts.SyntaxKind.EqualsEqualsEqualsToken,
|
|
261
|
+
ts.SyntaxKind.ExclamationEqualsEqualsToken,
|
|
262
|
+
ts.SyntaxKind.GreaterThanToken,
|
|
263
|
+
ts.SyntaxKind.LessThanToken,
|
|
264
|
+
ts.SyntaxKind.GreaterThanEqualsToken,
|
|
265
|
+
ts.SyntaxKind.LessThanEqualsToken,
|
|
266
|
+
]);
|
|
267
|
+
/** Prefix unary operators `fold()` implements: logical-not and numeric negation. */
|
|
268
|
+
export const SUPPORTED_UNARY_OPERATORS = new Set([
|
|
269
|
+
ts.SyntaxKind.ExclamationToken,
|
|
270
|
+
ts.SyntaxKind.MinusToken,
|
|
271
|
+
]);
|
|
272
|
+
/** A property name foldable without execution: identifier, string, or numeric literal (not a computed name). */
|
|
273
|
+
export function isLiteralPropertyName(node) {
|
|
274
|
+
return ts.isIdentifier(node) || ts.isStringLiteral(node) || ts.isNumericLiteral(node);
|
|
275
|
+
}
|
|
276
|
+
/** An element-access key foldable without execution: a string or numeric LITERAL only (EVL003 semantics). */
|
|
277
|
+
export function isLiteralElementKey(node) {
|
|
278
|
+
return ts.isStringLiteral(node) || ts.isNumericLiteral(node);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* A short, single-line rendering of `node`'s source text for embedding in a
|
|
282
|
+
* diagnostic message — never the raw `getText()`, which reproduces the
|
|
283
|
+
* node's ENTIRE source verbatim and can span dozens of lines for a real
|
|
284
|
+
* composite call or object literal (chant #1054: a fold fallback reason that
|
|
285
|
+
* embeds one of these buries the actual error after it, and breaks any
|
|
286
|
+
* line-oriented consumer of `[fold:run]` output). Internal whitespace
|
|
287
|
+
* (including newlines) collapses to a single space, and the result is capped
|
|
288
|
+
* to a bounded length so one pathological node can't blow out an otherwise
|
|
289
|
+
* one-line reason either.
|
|
290
|
+
*/
|
|
291
|
+
export function briefNodeText(node, maxLength = 60) {
|
|
292
|
+
const collapsed = node.getText().replace(/\s+/g, " ").trim();
|
|
293
|
+
return collapsed.length > maxLength ? `${collapsed.slice(0, maxLength - 3)}...` : collapsed;
|
|
294
|
+
}
|
|
295
|
+
// ---------------------------------------------------------------------------
|
|
296
|
+
// Project-local callables (chant#2435, spec `S-CallLocal`)
|
|
297
|
+
// ---------------------------------------------------------------------------
|
|
298
|
+
/**
|
|
299
|
+
* Every name a file binds to something a project-local call can reach.
|
|
300
|
+
*
|
|
301
|
+
* Two bindings, both of which the specification's `S-LocalFunction` names and
|
|
302
|
+
* both decidable from this file's own syntax, which is all a shape classifier
|
|
303
|
+
* has:
|
|
304
|
+
*
|
|
305
|
+
* - a top-level `function f(...) {...}`, or a `const f = (...) => ...`
|
|
306
|
+
* (a function expression counts, and parentheses / `as` / `satisfies`
|
|
307
|
+
* wrappers are unwrapped), exported or not;
|
|
308
|
+
* - a name imported from a *project* specifier, one starting `./` or `../`.
|
|
309
|
+
* A bare specifier is a package, and a package's function is not
|
|
310
|
+
* project-local.
|
|
311
|
+
*
|
|
312
|
+
* Deliberately syntax-only, and deliberately not a judgment about the callee's
|
|
313
|
+
* body. Whether the body is admissible is `S-FnBody`'s question and the fold's
|
|
314
|
+
* to answer, exactly as it already is for a call this classifier admits by
|
|
315
|
+
* name (a registered authoring helper, an opted-in intrinsic).
|
|
316
|
+
*
|
|
317
|
+
* Mirrors `collectLocalFunctions` in ../discovery/fold-import.ts, which builds
|
|
318
|
+
* the real `FoldableFunction` for each of these during a build. This one only
|
|
319
|
+
* needs the names.
|
|
320
|
+
*/
|
|
321
|
+
export function collectLocalCallables(sourceFile) {
|
|
322
|
+
const cached = localCallableCache.get(sourceFile);
|
|
323
|
+
if (cached)
|
|
324
|
+
return cached;
|
|
325
|
+
const names = new Set();
|
|
326
|
+
const unwrap = (node) => {
|
|
327
|
+
let current = node;
|
|
328
|
+
while (ts.isParenthesizedExpression(current) ||
|
|
329
|
+
ts.isAsExpression(current) ||
|
|
330
|
+
ts.isSatisfiesExpression(current)) {
|
|
331
|
+
current = current.expression;
|
|
332
|
+
}
|
|
333
|
+
return current;
|
|
334
|
+
};
|
|
335
|
+
for (const statement of sourceFile.statements) {
|
|
336
|
+
if (ts.isFunctionDeclaration(statement)) {
|
|
337
|
+
if (statement.name && statement.body)
|
|
338
|
+
names.add(statement.name.text);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
if (ts.isImportDeclaration(statement)) {
|
|
342
|
+
const specifier = statement.moduleSpecifier;
|
|
343
|
+
if (!ts.isStringLiteral(specifier) || !/^\.\.?\//.test(specifier.text))
|
|
344
|
+
continue;
|
|
345
|
+
const clause = statement.importClause;
|
|
346
|
+
// `import type { T } from "./t"` is erased before anything runs, so `T`
|
|
347
|
+
// is not something a call can reach. Both spellings are skipped: the
|
|
348
|
+
// whole-clause one and the per-specifier `import { type T }`.
|
|
349
|
+
if (!clause || clause.isTypeOnly)
|
|
350
|
+
continue;
|
|
351
|
+
if (clause.name)
|
|
352
|
+
names.add(clause.name.text);
|
|
353
|
+
const bindings = clause.namedBindings;
|
|
354
|
+
if (bindings && ts.isNamedImports(bindings)) {
|
|
355
|
+
for (const element of bindings.elements) {
|
|
356
|
+
if (!element.isTypeOnly)
|
|
357
|
+
names.add(element.name.text);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
if (!ts.isVariableStatement(statement))
|
|
363
|
+
continue;
|
|
364
|
+
if ((statement.declarationList.flags & ts.NodeFlags.Const) === 0)
|
|
365
|
+
continue;
|
|
366
|
+
for (const decl of statement.declarationList.declarations) {
|
|
367
|
+
if (!ts.isIdentifier(decl.name) || !decl.initializer)
|
|
368
|
+
continue;
|
|
369
|
+
const initializer = unwrap(decl.initializer);
|
|
370
|
+
if (ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)) {
|
|
371
|
+
names.add(decl.name.text);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
localCallableCache.set(sourceFile, names);
|
|
376
|
+
return names;
|
|
377
|
+
}
|
|
378
|
+
/** Per-file memo: the classifier asks this once per call expression, and a big file has many. */
|
|
379
|
+
const localCallableCache = new WeakMap();
|
|
380
|
+
/**
|
|
381
|
+
* The project-local callables in scope at `node`, or an empty set when the node
|
|
382
|
+
* has no file to read.
|
|
383
|
+
*
|
|
384
|
+
* The guard is not a claim that a file-less node is supported: the rejection
|
|
385
|
+
* this sits in front of renders the node with `getText()`, which needs the same
|
|
386
|
+
* parent chain. It is here so that looking the names up never becomes a *new*
|
|
387
|
+
* way for this function to fail, and so the answer for a node whose file cannot
|
|
388
|
+
* be read is the pre-#2435 one, that every call is a violation.
|
|
389
|
+
*/
|
|
390
|
+
function localCallablesAt(node) {
|
|
391
|
+
try {
|
|
392
|
+
const sourceFile = node.getSourceFile();
|
|
393
|
+
return sourceFile ? collectLocalCallables(sourceFile) : EMPTY_NAMES;
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
return EMPTY_NAMES;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
const EMPTY_NAMES = new Set();
|
|
400
|
+
// ---------------------------------------------------------------------------
|
|
401
|
+
// Shared message builders — `fold()` and `findSubsetViolation` both call
|
|
402
|
+
// these so the diagnostic text for the same violation kind is the same
|
|
403
|
+
// string, not two hand-written copies that can drift.
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
export function computedPropertyNameMessage(node) {
|
|
406
|
+
return `computed/dynamic property name not foldable: ${briefNodeText(node)}`;
|
|
407
|
+
}
|
|
408
|
+
export function dynamicElementAccessMessage(keyNode) {
|
|
409
|
+
return `dynamic property access — computed key must be a string or numeric literal: ${briefNodeText(keyNode)}`;
|
|
410
|
+
}
|
|
411
|
+
export const UNSUPPORTED_OBJECT_MEMBER_MESSAGE = "unsupported object member";
|
|
412
|
+
export const UNSUPPORTED_UNARY_MESSAGE = "unsupported unary";
|
|
413
|
+
export function unsupportedBinaryMessage(opKind) {
|
|
414
|
+
return `unsupported binary operator: ${ts.SyntaxKind[opKind]}`;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* chant #1054 — the ONE wording for "a bare function/method call used where
|
|
418
|
+
* chant needs a value it can fold." Before this, `fold()` (this message) and
|
|
419
|
+
* `../discovery/fold-import.ts`'s `resolveCallExpression` (a top-level
|
|
420
|
+
* export's own call-as-a-value check) had each grown their own hand-written
|
|
421
|
+
* copy — "function call as a value" here, "call expression as a value"
|
|
422
|
+
* there — for the identical rejection, which meant a tool grouping fallback
|
|
423
|
+
* reasons by text had to match both to avoid silently under-counting one of
|
|
424
|
+
* them. `resolveCallExpression` now calls this function directly instead of
|
|
425
|
+
* building its own string.
|
|
426
|
+
*/
|
|
427
|
+
export function callExpressionMessage(node) {
|
|
428
|
+
return `function call as a value is not foldable: ${briefNodeText(node.expression)}(...)`;
|
|
429
|
+
}
|
|
430
|
+
export function unsupportedExpressionMessage(node) {
|
|
431
|
+
return `unsupported expression: ${ts.SyntaxKind[node.kind]}`;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Classify one object-literal member (`{ a: 1 }`'s `a: 1`, `{ ...x }`'s
|
|
435
|
+
* `...x`, or a shorthand `{ a }`). Checks the key's shape before the
|
|
436
|
+
* value's, mirroring `propName()` in fold.ts, which runs before folding
|
|
437
|
+
* the value. Returns the first violation within this member, or
|
|
438
|
+
* `undefined` when it's fully in the subset.
|
|
439
|
+
*/
|
|
440
|
+
export function checkObjectMember(prop, intrinsics) {
|
|
441
|
+
if (ts.isPropertyAssignment(prop)) {
|
|
442
|
+
if (!isLiteralPropertyName(prop.name)) {
|
|
443
|
+
return violation(prop.name, computedPropertyNameMessage(prop.name));
|
|
444
|
+
}
|
|
445
|
+
return findSubsetViolation(prop.initializer, intrinsics);
|
|
446
|
+
}
|
|
447
|
+
if (ts.isShorthandPropertyAssignment(prop)) {
|
|
448
|
+
return undefined;
|
|
449
|
+
}
|
|
450
|
+
if (ts.isSpreadAssignment(prop)) {
|
|
451
|
+
return findSubsetViolation(prop.expression, intrinsics);
|
|
452
|
+
}
|
|
453
|
+
return violation(prop, UNSUPPORTED_OBJECT_MEMBER_MESSAGE);
|
|
454
|
+
}
|
|
455
|
+
/** Classify one array-literal element: a value, or a `...spread`. */
|
|
456
|
+
function checkArrayElement(el, intrinsics) {
|
|
457
|
+
if (ts.isSpreadElement(el))
|
|
458
|
+
return findSubsetViolation(el.expression, intrinsics);
|
|
459
|
+
return findSubsetViolation(el, intrinsics);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* The canonical recursive shape classifier: is `node`'s expression *shape*
|
|
463
|
+
* within the subset `fold()` can reduce? Mirrors `fold()`'s own dispatch
|
|
464
|
+
* node-kind for node-kind (see ./fold.ts) — every branch here has a
|
|
465
|
+
* matching branch there, and vice versa — but performs no
|
|
466
|
+
* resolution/evaluation (see the module doc comment for the three
|
|
467
|
+
* environment-dependent exceptions). Returns the first (deepest,
|
|
468
|
+
* `fold()`-evaluation-order) unsupported node, or `undefined` when `node`'s
|
|
469
|
+
* whole shape is foldable.
|
|
470
|
+
*
|
|
471
|
+
* The `<call>(...).step` composite-consumer idiom (`Checkout({...}).step`,
|
|
472
|
+
* every lexicon's single-action `Composite()` wrapper embedded inline in a
|
|
473
|
+
* `Job`'s `steps` array — see composites.mdx) used to be an EVL-only,
|
|
474
|
+
* MORE-permissive divergence here (chant #1544's `allowCompositeStepAccess`
|
|
475
|
+
* opt-in parameter, since removed): `fold()` had no way to invoke an
|
|
476
|
+
* arbitrary composite factory, so it fell the file back to run for this
|
|
477
|
+
* shape (documented, correct behavior, never an error) while this shared
|
|
478
|
+
* predicate had to be told to stop treating that fallback as a lint error.
|
|
479
|
+
* chant #1174 closed the divergence — `fold()` now folds exactly this shape
|
|
480
|
+
* (narrowed to the literal member name `"step"`, the one idiom actually in
|
|
481
|
+
* use) — so this classifier accepts it unconditionally, the same way it
|
|
482
|
+
* already accepts a nested `new Type(...)` unconditionally since #1169.
|
|
483
|
+
*
|
|
484
|
+
* chant #1966 adds a CallExpression whose callee is a property access —
|
|
485
|
+
* `github.actor.toString()`, `matrix("os").toString()`, `[...].join(",")` —
|
|
486
|
+
* to the same unconditional-acceptance set: whether the receiver actually
|
|
487
|
+
* folds to a value with a callable method of that name is resolution-
|
|
488
|
+
* dependent (module doc, point 1), so this classifier stays permissive and
|
|
489
|
+
* only recurses into shape.
|
|
490
|
+
*/
|
|
491
|
+
export function findSubsetViolation(node, intrinsics) {
|
|
492
|
+
if (ts.isParenthesizedExpression(node) ||
|
|
493
|
+
ts.isAsExpression(node) ||
|
|
494
|
+
ts.isSatisfiesExpression(node) ||
|
|
495
|
+
ts.isNonNullExpression(node)) {
|
|
496
|
+
return findSubsetViolation(node.expression, intrinsics);
|
|
497
|
+
}
|
|
498
|
+
if (ts.isStringLiteral(node) ||
|
|
499
|
+
ts.isNoSubstitutionTemplateLiteral(node) ||
|
|
500
|
+
ts.isNumericLiteral(node) ||
|
|
501
|
+
node.kind === ts.SyntaxKind.TrueKeyword ||
|
|
502
|
+
node.kind === ts.SyntaxKind.FalseKeyword ||
|
|
503
|
+
node.kind === ts.SyntaxKind.NullKeyword) {
|
|
504
|
+
return undefined;
|
|
505
|
+
}
|
|
506
|
+
// Identifiers (including a bare `undefined` reference, which the parser
|
|
507
|
+
// represents as an Identifier, not a keyword token) — resolution is
|
|
508
|
+
// environment-dependent, see module doc.
|
|
509
|
+
if (ts.isIdentifier(node))
|
|
510
|
+
return undefined;
|
|
511
|
+
if (ts.isTaggedTemplateExpression(node)) {
|
|
512
|
+
// Tagged-template interiors are OPAQUE to the shape classifier. A tagged
|
|
513
|
+
// template may be a registered lexicon intrinsic (e.g. Sub`...`) whose
|
|
514
|
+
// interpolations legitimately contain deploy-time intrinsic references
|
|
515
|
+
// (Ref(env), AWS.StackName, ...) — valid, but not statically foldable. EVL
|
|
516
|
+
// has no intrinsic registry at lint time (see module doc), so it cannot tell
|
|
517
|
+
// an intrinsic call from a plain one; recursing here would false-flag Ref()
|
|
518
|
+
// inside Sub`...` and break every intrinsic-using example. fold() DOES have
|
|
519
|
+
// the registry: it recurses into a *registered* tag's interior itself
|
|
520
|
+
// (foldIntrinsicValue) and rejects an unfoldable one there. So an unfoldable
|
|
521
|
+
// tagged-template interior is a documented fold/EVL divergence, not a hole.
|
|
522
|
+
return undefined;
|
|
523
|
+
}
|
|
524
|
+
if (ts.isTemplateExpression(node)) {
|
|
525
|
+
for (const span of node.templateSpans) {
|
|
526
|
+
const v = findSubsetViolation(span.expression, intrinsics);
|
|
527
|
+
if (v)
|
|
528
|
+
return v;
|
|
529
|
+
}
|
|
530
|
+
return undefined;
|
|
531
|
+
}
|
|
532
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
533
|
+
for (const prop of node.properties) {
|
|
534
|
+
const v = checkObjectMember(prop, intrinsics);
|
|
535
|
+
if (v)
|
|
536
|
+
return v;
|
|
537
|
+
}
|
|
538
|
+
return undefined;
|
|
539
|
+
}
|
|
540
|
+
if (ts.isArrayLiteralExpression(node)) {
|
|
541
|
+
for (const el of node.elements) {
|
|
542
|
+
const v = checkArrayElement(el, intrinsics);
|
|
543
|
+
if (v)
|
|
544
|
+
return v;
|
|
545
|
+
}
|
|
546
|
+
return undefined;
|
|
547
|
+
}
|
|
548
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
549
|
+
// chant #1174 — see this function's doc comment. `<call>(...).step`
|
|
550
|
+
// (any callee, any argument shape) is the composite-consumer idiom, and
|
|
551
|
+
// `fold()` now folds it too (narrowed to the literal member `"step"` —
|
|
552
|
+
// see fold.ts's PropertyAccessExpression branch).
|
|
553
|
+
if (node.name.text === "step" && ts.isCallExpression(node.expression)) {
|
|
554
|
+
return undefined;
|
|
555
|
+
}
|
|
556
|
+
return findSubsetViolation(node.expression, intrinsics);
|
|
557
|
+
}
|
|
558
|
+
if (ts.isElementAccessExpression(node)) {
|
|
559
|
+
if (!isLiteralElementKey(node.argumentExpression)) {
|
|
560
|
+
return violation(node.argumentExpression, dynamicElementAccessMessage(node.argumentExpression), "EVL003");
|
|
561
|
+
}
|
|
562
|
+
return findSubsetViolation(node.expression, intrinsics);
|
|
563
|
+
}
|
|
564
|
+
if (ts.isPrefixUnaryExpression(node)) {
|
|
565
|
+
if (!SUPPORTED_UNARY_OPERATORS.has(node.operator)) {
|
|
566
|
+
return violation(node, UNSUPPORTED_UNARY_MESSAGE);
|
|
567
|
+
}
|
|
568
|
+
return findSubsetViolation(node.operand, intrinsics);
|
|
569
|
+
}
|
|
570
|
+
if (ts.isBinaryExpression(node)) {
|
|
571
|
+
const opKind = node.operatorToken.kind;
|
|
572
|
+
if (!SUPPORTED_BINARY_OPERATORS.has(opKind)) {
|
|
573
|
+
return violation(node, unsupportedBinaryMessage(opKind));
|
|
574
|
+
}
|
|
575
|
+
// Flow-insensitive — see module doc: fold() short-circuits &&/||/?? and
|
|
576
|
+
// only evaluates the taken side; EVL requires both sides shape-valid.
|
|
577
|
+
return (findSubsetViolation(node.left, intrinsics) ??
|
|
578
|
+
findSubsetViolation(node.right, intrinsics));
|
|
579
|
+
}
|
|
580
|
+
if (ts.isConditionalExpression(node)) {
|
|
581
|
+
// Flow-insensitive — see module doc: fold() only folds the taken branch.
|
|
582
|
+
return (findSubsetViolation(node.condition, intrinsics) ??
|
|
583
|
+
findSubsetViolation(node.whenTrue, intrinsics) ??
|
|
584
|
+
findSubsetViolation(node.whenFalse, intrinsics));
|
|
585
|
+
}
|
|
586
|
+
if (ts.isNewExpression(node)) {
|
|
587
|
+
// chant #1082 — no positional assumption about which argument is the
|
|
588
|
+
// props object. `foldResource` folds every argument in source order (the
|
|
589
|
+
// props object is second in `new Parameter("String", {...})`), so every
|
|
590
|
+
// argument is classified on its own terms and nothing is rejected merely
|
|
591
|
+
// for being in the "wrong" position.
|
|
592
|
+
for (const arg of node.arguments ?? []) {
|
|
593
|
+
const v = findSubsetViolation(arg, intrinsics);
|
|
594
|
+
if (v)
|
|
595
|
+
return v;
|
|
596
|
+
}
|
|
597
|
+
return undefined;
|
|
598
|
+
}
|
|
599
|
+
if (ts.isSpreadElement(node)) {
|
|
600
|
+
return findSubsetViolation(node.expression, intrinsics);
|
|
601
|
+
}
|
|
602
|
+
if (ts.isCallExpression(node)) {
|
|
603
|
+
// chant #1082 — a call to a REGISTERED chant authoring helper folds
|
|
604
|
+
// (`phase(...)`, `output(...)`, …; see ./foldable-helpers.ts), so this
|
|
605
|
+
// classifier must accept it too or EVL001 would flag source `fold()`
|
|
606
|
+
// reduces cleanly. Name-only here, deliberately: this module classifies
|
|
607
|
+
// shape and never resolves bindings (module doc, point 1), and the
|
|
608
|
+
// provenance half of the check — is this name actually bound to an import
|
|
609
|
+
// of chant's own? — needs the module graph, which only
|
|
610
|
+
// ../discovery/fold-import.ts has. Same asymmetry as intrinsic tag
|
|
611
|
+
// registration (point 2) and in the same direction: this module can only
|
|
612
|
+
// ever be MORE permissive than `fold()`, never stricter.
|
|
613
|
+
if (ts.isIdentifier(node.expression) && isFoldableHelperName(node.expression.text)) {
|
|
614
|
+
for (const arg of node.arguments) {
|
|
615
|
+
const v = findSubsetViolation(arg, intrinsics);
|
|
616
|
+
if (v)
|
|
617
|
+
return v;
|
|
618
|
+
}
|
|
619
|
+
return undefined;
|
|
620
|
+
}
|
|
621
|
+
// chant #1044 — a plain call to a lexicon intrinsic whose lexicon opted
|
|
622
|
+
// its call form in folds too (`Ref(bucket)`, `Concat("a", b)`). Unlike
|
|
623
|
+
// the helper case above, this one is only answerable with the registry
|
|
624
|
+
// in hand, which is exactly why it is a parameter: a caller that passes
|
|
625
|
+
// `intrinsics` gets fold()'s own answer, and a caller that can't supply
|
|
626
|
+
// one (EVL, any syntax-only tool) keeps the pre-#1044 answer — every
|
|
627
|
+
// call is a violation. See the module doc, point 2c, for why the
|
|
628
|
+
// registry-less answer is the safe one to leave in place.
|
|
629
|
+
if (intrinsics &&
|
|
630
|
+
ts.isIdentifier(node.expression) &&
|
|
631
|
+
intrinsics.some((i) => i.name === node.expression.text && intrinsicCallFolds(i))) {
|
|
632
|
+
for (const arg of node.arguments) {
|
|
633
|
+
const v = findSubsetViolation(arg, intrinsics);
|
|
634
|
+
if (v)
|
|
635
|
+
return v;
|
|
636
|
+
}
|
|
637
|
+
return undefined;
|
|
638
|
+
}
|
|
639
|
+
// chant #1966 — the eager counterpart of the #1044 case above: a lexicon
|
|
640
|
+
// intrinsic registered with `foldsEagerly` instead of `foldsAsCall`
|
|
641
|
+
// ({@link intrinsicCallFoldsEagerly}, ../lexicon.ts). Same registry-gated
|
|
642
|
+
// shape, same reasoning.
|
|
643
|
+
if (intrinsics &&
|
|
644
|
+
ts.isIdentifier(node.expression) &&
|
|
645
|
+
intrinsics.some((i) => i.name === node.expression.text && intrinsicCallFoldsEagerly(i))) {
|
|
646
|
+
for (const arg of node.arguments) {
|
|
647
|
+
const v = findSubsetViolation(arg, intrinsics);
|
|
648
|
+
if (v)
|
|
649
|
+
return v;
|
|
650
|
+
}
|
|
651
|
+
return undefined;
|
|
652
|
+
}
|
|
653
|
+
// chant #1966 — a method call (`github.actor.toString()`, `[...].join(",")`,
|
|
654
|
+
// `matrix("os").toString()`): `fold()` now folds this shape unconditionally
|
|
655
|
+
// — the receiver must fold to a real value with the named method, which is
|
|
656
|
+
// resolution-dependent (module doc, point 1) and so out of reach for a
|
|
657
|
+
// syntax-only classifier, exactly the same asymmetry as `.step` above and
|
|
658
|
+
// a same-file `new` used as a value (#1169). Accepted here regardless of
|
|
659
|
+
// the intrinsics registry, unlike the two cases just above: nothing about
|
|
660
|
+
// whether a method call folds depends on a lexicon's registration.
|
|
661
|
+
if (ts.isPropertyAccessExpression(node.expression)) {
|
|
662
|
+
const v = findSubsetViolation(node.expression.expression, intrinsics);
|
|
663
|
+
if (v)
|
|
664
|
+
return v;
|
|
665
|
+
for (const arg of node.arguments) {
|
|
666
|
+
const argViolation = findSubsetViolation(arg, intrinsics);
|
|
667
|
+
if (argViolation)
|
|
668
|
+
return argViolation;
|
|
669
|
+
}
|
|
670
|
+
return undefined;
|
|
671
|
+
}
|
|
672
|
+
// chant#2435 — a call to a project-local function. `fold-import.ts` binds
|
|
673
|
+
// every top-level function a file declares (and every one it imports from
|
|
674
|
+
// a project file) before folding it, so a build folds all four shapes the
|
|
675
|
+
// issue tabulates; this classifier rejected all four. That is the one
|
|
676
|
+
// direction `F-Direction` forbids, and it made `chant lint` report EVL001
|
|
677
|
+
// on a file `chant build --fold` folds cleanly.
|
|
678
|
+
//
|
|
679
|
+
// Name-only, like the authoring-helper case above and for the same reason:
|
|
680
|
+
// this module classifies shape and never resolves bindings. Whether the
|
|
681
|
+
// callee's body is admissible is `S-FnBody`'s question, which the fold
|
|
682
|
+
// answers. The set comes from the node's own source file, so every caller
|
|
683
|
+
// gets the corrected answer without passing anything — a caller holding a
|
|
684
|
+
// synthetic node with no file keeps the old, stricter one.
|
|
685
|
+
if (ts.isIdentifier(node.expression) && localCallablesAt(node).has(node.expression.text)) {
|
|
686
|
+
for (const arg of node.arguments) {
|
|
687
|
+
const v = findSubsetViolation(arg, intrinsics);
|
|
688
|
+
if (v)
|
|
689
|
+
return v;
|
|
690
|
+
}
|
|
691
|
+
return undefined;
|
|
692
|
+
}
|
|
693
|
+
return violation(node, callExpressionMessage(node));
|
|
694
|
+
}
|
|
695
|
+
return violation(node, unsupportedExpressionMessage(node));
|
|
696
|
+
}
|