@intentius/chant 0.124.13 → 0.124.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/lexicon-module.ts +3 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +1 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `chant workspace status` reads of a project's stewards and Ops
|
|
3
|
+
* (#3636), kept per tree so a status doesn't import every `*.op.ts` file
|
|
4
|
+
* each time it runs.
|
|
5
|
+
*
|
|
6
|
+
* Discovery (`../op/discover.ts`) has to import the Op modules, and an Op
|
|
7
|
+
* module may do work when it is imported: run git, read files, even start
|
|
8
|
+
* another chant. Status needs only plain fields of what it finds: each
|
|
9
|
+
* steward's name, file, form, vault, capabilities and Ops, and of each Op
|
|
10
|
+
* its name, schedule, labels, work lease kind and `changesCheckout`. The
|
|
11
|
+
* first status on a tree discovers them and writes that index to
|
|
12
|
+
* `<cache dir>/workspace-stewards/<checkout>/<key>.json`; later ones read
|
|
13
|
+
* it back, until the tree changes. The cache dir is the one the graph cache
|
|
14
|
+
* uses (`./graph-cache.ts`): `$CHANT_CACHE_DIR`, else
|
|
15
|
+
* `$XDG_CACHE_HOME/chant`, else `~/.cache/chant`, outside the workspace,
|
|
16
|
+
* since a read never changes the workspace it reads.
|
|
17
|
+
*
|
|
18
|
+
* The tree is the checkout's `HEAD` tree plus every changed or untracked
|
|
19
|
+
* file `git status` lists (its path and contents), and the chant version,
|
|
20
|
+
* so a commit, an edit or a new file anywhere in the checkout discovers
|
|
21
|
+
* again. Files git ignores (`node_modules`) are not part of it. An index is
|
|
22
|
+
* only written when every Op file imported, so an import that failed is
|
|
23
|
+
* tried again by the next status. `CHANT_STEWARD_INDEX=0` turns the index
|
|
24
|
+
* off, for an Op module whose declaration depends on more than its tree.
|
|
25
|
+
*/
|
|
26
|
+
import { execFile } from "node:child_process";
|
|
27
|
+
import { createHash } from "node:crypto";
|
|
28
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
29
|
+
import { homedir } from "node:os";
|
|
30
|
+
import { dirname, join, resolve } from "node:path";
|
|
31
|
+
import { promisify } from "node:util";
|
|
32
|
+
import { CHANT_VERSION } from "../cli/version.js";
|
|
33
|
+
import { discoverOps, discoverStewards } from "../op/discover.js";
|
|
34
|
+
import { stewardBesideOf } from "../op/steward.js";
|
|
35
|
+
const execFileAsync = promisify(execFile);
|
|
36
|
+
/** Bumped when the index's shape changes, so an older index is never read. */
|
|
37
|
+
const INDEX_FORMAT = 1;
|
|
38
|
+
/** Where the indexes of the checkout at `top` live, and the checkout's real path. */
|
|
39
|
+
function indexDir(top, env = process.env) {
|
|
40
|
+
const base = env.CHANT_CACHE_DIR || join(env.XDG_CACHE_HOME || join(homedir(), ".cache"), "chant");
|
|
41
|
+
let checkout = resolve(top);
|
|
42
|
+
try {
|
|
43
|
+
checkout = realpathSync(checkout);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Keyed on the path as given.
|
|
47
|
+
}
|
|
48
|
+
return { dir: join(base, "workspace-stewards", createHash("sha256").update(checkout).digest("hex").slice(0, 16)), checkout };
|
|
49
|
+
}
|
|
50
|
+
/** How many indexes a checkout keeps: the newest, by when they were written. */
|
|
51
|
+
const KEPT = 32;
|
|
52
|
+
function indexOp(op) {
|
|
53
|
+
return {
|
|
54
|
+
name: op.name,
|
|
55
|
+
schedule: op.schedule ? { cron: op.schedule.cron } : null,
|
|
56
|
+
...(op.labels ? { labels: { ...op.labels } } : {}),
|
|
57
|
+
workLease: op.workLease ? { kind: op.workLease.kind ?? null } : null,
|
|
58
|
+
changesCheckout: op.changesCheckout === true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Discover the stewards and Ops under `memberDir`, importing every Op file. Throws as `discoverStewards` does. */
|
|
62
|
+
export async function discoverStewardIndex(memberDir) {
|
|
63
|
+
const { stewards, errors, conflicts } = await discoverStewards({ cwd: memberDir });
|
|
64
|
+
const listed = [...stewards.values()].map(({ declaration, filePath }) => ({
|
|
65
|
+
name: declaration.name,
|
|
66
|
+
filePath,
|
|
67
|
+
ops: declaration.ops.map(indexOp),
|
|
68
|
+
beside: stewardBesideOf(declaration).map((b) => ({ op: b.op, ready: b.ready !== null && b.ready !== undefined })),
|
|
69
|
+
form: { default: declaration.form.default, environments: { ...declaration.form.environments } },
|
|
70
|
+
capabilities: Array.isArray(declaration.capabilities) ? [...declaration.capabilities] : [],
|
|
71
|
+
vault: typeof declaration.vault === "string" ? declaration.vault : null,
|
|
72
|
+
}));
|
|
73
|
+
let otherOps = null;
|
|
74
|
+
// Only a project with a steward has waits to look for among its other Ops.
|
|
75
|
+
if (listed.length > 0) {
|
|
76
|
+
const declared = new Set(listed.flatMap((s) => s.ops.map((op) => op.name)));
|
|
77
|
+
try {
|
|
78
|
+
otherOps = [...(await discoverOps({ cwd: memberDir })).ops.values()].map((d) => indexOp(d.config)).filter((op) => !declared.has(op.name));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
otherOps = null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { stewards: listed, errors, conflicts, otherOps };
|
|
85
|
+
}
|
|
86
|
+
async function git(args, cwd) {
|
|
87
|
+
// A read: `git status` must not take the index lock from a writer.
|
|
88
|
+
const env = { ...process.env, GIT_OPTIONAL_LOCKS: "0" };
|
|
89
|
+
const { stdout } = await execFileAsync("git", args, { cwd, env, maxBuffer: 64 * 1024 * 1024 });
|
|
90
|
+
return stdout;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The key of the tree `memberDir` is in: its `HEAD` tree, each changed or
|
|
94
|
+
* untracked file's path and contents, the chant version and `memberDir`.
|
|
95
|
+
* Null outside a checkout, or when git can't say.
|
|
96
|
+
*/
|
|
97
|
+
export async function treeKey(memberDir) {
|
|
98
|
+
try {
|
|
99
|
+
const top = (await git(["rev-parse", "--show-toplevel"], memberDir)).trim();
|
|
100
|
+
const head = (await git(["rev-parse", "--verify", "--quiet", "HEAD^{tree}"], top).catch(() => "")).trim();
|
|
101
|
+
const changed = (await git(["status", "--porcelain=v1", "-z", "--untracked-files=all", "--no-renames"], top))
|
|
102
|
+
.split("\0")
|
|
103
|
+
.filter((e) => e.length > 3)
|
|
104
|
+
.map((e) => e.slice(3))
|
|
105
|
+
.sort();
|
|
106
|
+
const h = createHash("sha256");
|
|
107
|
+
h.update(`${INDEX_FORMAT}\0${CHANT_VERSION}\0${resolve(memberDir)}\0${head}\0`);
|
|
108
|
+
for (const path of changed) {
|
|
109
|
+
h.update(`${path}\0`);
|
|
110
|
+
try {
|
|
111
|
+
const full = join(top, path);
|
|
112
|
+
h.update(statSync(full).isFile() ? readFileSync(full) : "dir");
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
h.update("gone");
|
|
116
|
+
}
|
|
117
|
+
h.update("\0");
|
|
118
|
+
}
|
|
119
|
+
return { key: h.digest("hex"), ...indexDir(top) };
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Remove all but the {@link KEPT} newest indexes of this checkout, and the
|
|
127
|
+
* indexes of checkouts that are gone (each directory names its checkout in
|
|
128
|
+
* its `checkout` file).
|
|
129
|
+
*/
|
|
130
|
+
function prune(dir) {
|
|
131
|
+
const files = readdirSync(dir)
|
|
132
|
+
.filter((f) => f.endsWith(".json"))
|
|
133
|
+
.map((f) => ({ f, at: statSync(join(dir, f)).mtimeMs }))
|
|
134
|
+
.sort((a, b) => b.at - a.at);
|
|
135
|
+
for (const { f } of files.slice(KEPT))
|
|
136
|
+
rmSync(join(dir, f), { force: true });
|
|
137
|
+
const parent = dirname(dir);
|
|
138
|
+
for (const other of readdirSync(parent)) {
|
|
139
|
+
const at = join(parent, other);
|
|
140
|
+
if (at === dir)
|
|
141
|
+
continue;
|
|
142
|
+
try {
|
|
143
|
+
if (!existsSync(readFileSync(join(at, "checkout"), "utf-8")))
|
|
144
|
+
rmSync(at, { recursive: true, force: true });
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// No checkout file, or being written: left alone.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function isIndex(v) {
|
|
152
|
+
const i = v;
|
|
153
|
+
return !!i && Array.isArray(i.stewards) && Array.isArray(i.errors) && Array.isArray(i.conflicts) && (i.otherOps === null || Array.isArray(i.otherOps));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The stewards and Ops under `memberDir`: from the index for its tree when
|
|
157
|
+
* there is one, else discovered and indexed. Throws as `discoverStewards`
|
|
158
|
+
* does.
|
|
159
|
+
*/
|
|
160
|
+
export async function readStewardIndex(memberDir, deps = {}) {
|
|
161
|
+
const discover = deps.discover ?? discoverStewardIndex;
|
|
162
|
+
if (process.env.CHANT_STEWARD_INDEX === "0")
|
|
163
|
+
return discover(memberDir);
|
|
164
|
+
const tree = await treeKey(memberDir);
|
|
165
|
+
if (!tree)
|
|
166
|
+
return discover(memberDir);
|
|
167
|
+
const file = join(tree.dir, `${tree.key}.json`);
|
|
168
|
+
try {
|
|
169
|
+
const kept = JSON.parse(readFileSync(file, "utf-8"));
|
|
170
|
+
if (isIndex(kept))
|
|
171
|
+
return kept;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// None yet, or unreadable: discover.
|
|
175
|
+
}
|
|
176
|
+
const index = await discover(memberDir);
|
|
177
|
+
if (index.errors.length === 0) {
|
|
178
|
+
try {
|
|
179
|
+
mkdirSync(tree.dir, { recursive: true });
|
|
180
|
+
writeFileSync(join(tree.dir, "checkout"), tree.checkout);
|
|
181
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
182
|
+
writeFileSync(tmp, JSON.stringify(index));
|
|
183
|
+
renameSync(tmp, file);
|
|
184
|
+
prune(tree.dir);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// A cache dir that can't be written: status still works, discovering each time.
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return index;
|
|
191
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol regions for the intent walk (#3034): `graph --intent <path>#<symbol>`
|
|
3
|
+
* names a function, class, method, type or constant instead of a line range,
|
|
4
|
+
* because a line range means something else once the file is edited.
|
|
5
|
+
*
|
|
6
|
+
* A resolver turns a symbol into its current lines in the tree read, and the
|
|
7
|
+
* walk follows those lines through history as it follows any line range
|
|
8
|
+
* (`git log -L`). Resolvers are chosen by file extension. Core ships one for
|
|
9
|
+
* TypeScript and JavaScript, parsed with the TypeScript compiler chant already
|
|
10
|
+
* depends on. A lexicon can contribute more through its plugin's
|
|
11
|
+
* `symbolResolvers()` (#3313), which the intent walk loads for a file in a
|
|
12
|
+
* member that configures the lexicon (`lexicon-symbols.ts`); core's resolver
|
|
13
|
+
* stays the one for `.ts` and `.js`. A file with no resolver is refused with
|
|
14
|
+
* `intent-symbol-unsupported`, and a line range still works for it.
|
|
15
|
+
*
|
|
16
|
+
* A symbol is a name, or a dotted path through classes, namespaces,
|
|
17
|
+
* interfaces, enums and object literals bound to a constant, such as
|
|
18
|
+
* `createApp` or `Server.listen`. A bare name is looked up among the
|
|
19
|
+
* file's top-level declarations first, then among every nested one; when it
|
|
20
|
+
* matches more than one declaration it is refused as ambiguous, with the
|
|
21
|
+
* qualified names that would pick one. The lines run from the declaration's
|
|
22
|
+
* doc comment, when it has one, to its last line.
|
|
23
|
+
*/
|
|
24
|
+
import * as ts from "typescript";
|
|
25
|
+
// ── TypeScript and JavaScript ────────────────────────────────────────────────
|
|
26
|
+
function scriptKind(path) {
|
|
27
|
+
if (/\.tsx$/.test(path))
|
|
28
|
+
return ts.ScriptKind.TSX;
|
|
29
|
+
if (/\.jsx$/.test(path))
|
|
30
|
+
return ts.ScriptKind.JSX;
|
|
31
|
+
if (/\.[cm]?js$/.test(path))
|
|
32
|
+
return ts.ScriptKind.JS;
|
|
33
|
+
return ts.ScriptKind.TS;
|
|
34
|
+
}
|
|
35
|
+
function nameText(name) {
|
|
36
|
+
if (!name)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (ts.isIdentifier(name) || ts.isPrivateIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name))
|
|
39
|
+
return name.text;
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const typescriptResolver = {
|
|
43
|
+
language: "TypeScript and JavaScript",
|
|
44
|
+
extensions: [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"],
|
|
45
|
+
declarations(path, text) {
|
|
46
|
+
const sf = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, scriptKind(path));
|
|
47
|
+
const out = [];
|
|
48
|
+
const lineOf = (pos) => sf.getLineAndCharacterOfPosition(pos).line + 1;
|
|
49
|
+
// The span: from the doc comment (or the statement holding a lone variable) to the node's end.
|
|
50
|
+
const push = (qualified, kind, node) => {
|
|
51
|
+
out.push({ qualified, kind, lines: { start: lineOf(node.getStart(sf, true)), end: lineOf(node.getEnd()) } });
|
|
52
|
+
};
|
|
53
|
+
const visitMembers = (prefix, members) => {
|
|
54
|
+
for (const m of members) {
|
|
55
|
+
const name = nameText(m.name);
|
|
56
|
+
if (name === undefined) {
|
|
57
|
+
if (ts.isConstructorDeclaration(m))
|
|
58
|
+
push(`${prefix}.constructor`, "method", m);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const q = `${prefix}.${name}`;
|
|
62
|
+
if (ts.isMethodDeclaration(m) || ts.isMethodSignature(m) || ts.isGetAccessorDeclaration(m) || ts.isSetAccessorDeclaration(m))
|
|
63
|
+
push(q, "method", m);
|
|
64
|
+
else if (ts.isPropertyDeclaration(m) || ts.isPropertySignature(m)) {
|
|
65
|
+
push(q, "property", m);
|
|
66
|
+
if (ts.isPropertyDeclaration(m) && m.initializer)
|
|
67
|
+
visitValue(q, m.initializer);
|
|
68
|
+
}
|
|
69
|
+
else if (ts.isEnumMember(m))
|
|
70
|
+
push(q, "member", m);
|
|
71
|
+
else if (ts.isPropertyAssignment(m)) {
|
|
72
|
+
push(q, "property", m);
|
|
73
|
+
visitValue(q, m.initializer);
|
|
74
|
+
}
|
|
75
|
+
else if (ts.isShorthandPropertyAssignment(m))
|
|
76
|
+
push(q, "property", m);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
// A class expression or object literal bound to a name has members of its own.
|
|
80
|
+
const visitValue = (prefix, value) => {
|
|
81
|
+
let v = value;
|
|
82
|
+
while (ts.isParenthesizedExpression(v) || ts.isAsExpression(v) || ts.isSatisfiesExpression(v))
|
|
83
|
+
v = v.expression;
|
|
84
|
+
if (ts.isClassExpression(v))
|
|
85
|
+
visitMembers(prefix, v.members);
|
|
86
|
+
else if (ts.isObjectLiteralExpression(v))
|
|
87
|
+
visitMembers(prefix, v.properties);
|
|
88
|
+
};
|
|
89
|
+
const visitStatements = (prefix, statements) => {
|
|
90
|
+
const q = (name) => (prefix ? `${prefix}.${name}` : name);
|
|
91
|
+
for (const s of statements) {
|
|
92
|
+
if (ts.isFunctionDeclaration(s) && s.name)
|
|
93
|
+
push(q(s.name.text), "function", s);
|
|
94
|
+
else if (ts.isClassDeclaration(s) && s.name) {
|
|
95
|
+
push(q(s.name.text), "class", s);
|
|
96
|
+
visitMembers(q(s.name.text), s.members);
|
|
97
|
+
}
|
|
98
|
+
else if (ts.isInterfaceDeclaration(s)) {
|
|
99
|
+
push(q(s.name.text), "interface", s);
|
|
100
|
+
visitMembers(q(s.name.text), s.members);
|
|
101
|
+
}
|
|
102
|
+
else if (ts.isTypeAliasDeclaration(s))
|
|
103
|
+
push(q(s.name.text), "type", s);
|
|
104
|
+
else if (ts.isEnumDeclaration(s)) {
|
|
105
|
+
push(q(s.name.text), "enum", s);
|
|
106
|
+
visitMembers(q(s.name.text), s.members);
|
|
107
|
+
}
|
|
108
|
+
else if (ts.isModuleDeclaration(s)) {
|
|
109
|
+
const name = nameText(s.name);
|
|
110
|
+
if (name === undefined)
|
|
111
|
+
continue;
|
|
112
|
+
push(q(name), "namespace", s);
|
|
113
|
+
let body = s.body;
|
|
114
|
+
let inner = q(name);
|
|
115
|
+
while (body && ts.isModuleDeclaration(body)) {
|
|
116
|
+
inner = `${inner}.${nameText(body.name)}`;
|
|
117
|
+
body = body.body;
|
|
118
|
+
}
|
|
119
|
+
if (body && ts.isModuleBlock(body))
|
|
120
|
+
visitStatements(inner, body.statements);
|
|
121
|
+
}
|
|
122
|
+
else if (ts.isVariableStatement(s)) {
|
|
123
|
+
const lone = s.declarationList.declarations.length === 1;
|
|
124
|
+
for (const d of s.declarationList.declarations) {
|
|
125
|
+
const name = nameText(d.name);
|
|
126
|
+
if (name === undefined)
|
|
127
|
+
continue;
|
|
128
|
+
// A lone declaration takes its statement's lines, so `export const x = ...` and its doc comment are in the region.
|
|
129
|
+
push(q(name), "variable", lone ? s : d);
|
|
130
|
+
if (d.initializer)
|
|
131
|
+
visitValue(q(name), d.initializer);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (ts.isExportAssignment(s) && !s.isExportEquals) {
|
|
135
|
+
push(q("default"), "variable", s);
|
|
136
|
+
visitValue(q("default"), s.expression);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
visitStatements("", sf.statements);
|
|
141
|
+
return out;
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
/** The resolvers core ships, chosen by the file's extension. */
|
|
145
|
+
export const SYMBOL_RESOLVERS = [typescriptResolver];
|
|
146
|
+
/**
|
|
147
|
+
* The resolver for a path, or undefined when none reads its language. Core's
|
|
148
|
+
* resolvers come first, so a lexicon's never takes `.ts` or `.js` from them;
|
|
149
|
+
* among `extra`, the first that names the extension wins.
|
|
150
|
+
*/
|
|
151
|
+
export function symbolResolverFor(path, extra = []) {
|
|
152
|
+
const lower = path.toLowerCase();
|
|
153
|
+
return [...SYMBOL_RESOLVERS, ...extra].find((r) => r.extensions.some((e) => lower.endsWith(e.toLowerCase())));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Resolve `symbol` in the file `path` holding `text`: its current lines, or
|
|
157
|
+
* why it can't be. `extra` are the resolvers a lexicon contributed for the
|
|
158
|
+
* file's member (#3313).
|
|
159
|
+
*/
|
|
160
|
+
export function resolveSymbol(path, text, symbol, extra = []) {
|
|
161
|
+
const resolver = symbolResolverFor(path, extra);
|
|
162
|
+
if (!resolver) {
|
|
163
|
+
const known = [...new Set([...SYMBOL_RESOLVERS, ...extra].flatMap((r) => r.extensions))].join(", ");
|
|
164
|
+
return { ok: false, reason: "unsupported", message: `${path} has no symbol resolver: symbols resolve in ${known} files. Give a line range, ${path}:<start>-<end>, instead`, candidates: [] };
|
|
165
|
+
}
|
|
166
|
+
const all = resolver.declarations(path, text);
|
|
167
|
+
const exact = all.filter((d) => d.qualified === symbol);
|
|
168
|
+
// A name declared twice at one path, such as an overload or a merged declaration, is one region from the first to the last.
|
|
169
|
+
if (exact.length > 0) {
|
|
170
|
+
const start = Math.min(...exact.map((d) => d.lines.start));
|
|
171
|
+
const end = Math.max(...exact.map((d) => d.lines.end));
|
|
172
|
+
return { ok: true, declaration: { qualified: symbol, kind: exact[0].kind, lines: { start, end } } };
|
|
173
|
+
}
|
|
174
|
+
const nested = [...new Set(all.filter((d) => d.qualified.endsWith(`.${symbol}`)).map((d) => d.qualified))];
|
|
175
|
+
if (nested.length === 1)
|
|
176
|
+
return resolveSymbol(path, text, nested[0], extra);
|
|
177
|
+
if (nested.length > 1) {
|
|
178
|
+
return { ok: false, reason: "ambiguous", message: `${symbol} names ${nested.length} declarations in ${path}: ${nested.join(", ")}. Give the qualified name`, candidates: nested };
|
|
179
|
+
}
|
|
180
|
+
const top = [...new Set(all.filter((d) => !d.qualified.includes(".")).map((d) => d.qualified))];
|
|
181
|
+
const shown = top.slice(0, 20);
|
|
182
|
+
return {
|
|
183
|
+
ok: false,
|
|
184
|
+
reason: "unknown",
|
|
185
|
+
message: `${path} declares no ${symbol}${top.length > 0 ? `; its top-level declarations are ${shown.join(", ")}${top.length > shown.length ? `, and ${top.length - shown.length} more` : ""}` : ", and no top-level declaration a resolver reads"}`,
|
|
186
|
+
candidates: shown,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template parameters (#2627, #2524 D9): `chant.template.json` at a
|
|
3
|
+
* template's root declares the parameters `chant init --from` takes and the
|
|
4
|
+
* files they are substituted into.
|
|
5
|
+
*
|
|
6
|
+
* ```json
|
|
7
|
+
* {
|
|
8
|
+
* "parameters": {
|
|
9
|
+
* "name": { "type": "string", "default": "Reference app", "pattern": "^[A-Za-z0-9][A-Za-z0-9 ._-]*$" }
|
|
10
|
+
* },
|
|
11
|
+
* "files": ["app/src/server.mjs"]
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* A listed file carries `{{chant:<name>}}` where the value goes. The `chant:`
|
|
16
|
+
* prefix keeps the placeholder apart from TypeScript template literals
|
|
17
|
+
* (`${x}`), GitHub and Forgejo expressions (`${{ x }}`) and Handlebars or
|
|
18
|
+
* Mustache (`{{x}}`), so a template can hold any of those in a listed file.
|
|
19
|
+
* Only listed files are substituted, the value is inserted as written, and a
|
|
20
|
+
* placeholder naming an undeclared parameter is an error in the template.
|
|
21
|
+
*
|
|
22
|
+
* The manifest is JSON and read as data: no template code runs at init or
|
|
23
|
+
* upgrade. It is template metadata, like `.chant/migrations/`, so it is not
|
|
24
|
+
* copied into the project. The values used are recorded in the lineage's
|
|
25
|
+
* `parameters`, and `chant workspace upgrade` substitutes them again into both
|
|
26
|
+
* the merge base and the target version, so an unedited file carrying a value
|
|
27
|
+
* still has its recorded hash.
|
|
28
|
+
*
|
|
29
|
+
* A parameter marked `hostBound` holds a value that differs per host, such
|
|
30
|
+
* as the domain a hosted service serves the app on. Its value is recorded in
|
|
31
|
+
* `parameters` like any other, and the lineage also records, under
|
|
32
|
+
* `hostBound`, the files whose template text carries it, so `chant workspace
|
|
33
|
+
* export` can switch the value for the export and `import` can switch it
|
|
34
|
+
* back without fetching the template (#2552).
|
|
35
|
+
*/
|
|
36
|
+
import { posix } from "node:path";
|
|
37
|
+
import { z } from "zod";
|
|
38
|
+
import { LockError } from "./lineage-lock.js";
|
|
39
|
+
import { MIGRATIONS_DIR } from "./lineage-migrations.js";
|
|
40
|
+
/** The manifest's path, relative to the template's root (the `#<member>` directory, when one is given). */
|
|
41
|
+
export const TEMPLATE_MANIFEST = "chant.template.json";
|
|
42
|
+
const PARAM_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
43
|
+
/** `{{chant:<name>}}`. */
|
|
44
|
+
const PLACEHOLDER = /\{\{chant:([A-Za-z_][A-Za-z0-9_]*)\}\}/g;
|
|
45
|
+
export function placeholder(name) {
|
|
46
|
+
return `{{chant:${name}}}`;
|
|
47
|
+
}
|
|
48
|
+
const ParameterSchema = z
|
|
49
|
+
.object({
|
|
50
|
+
type: z.literal("string"),
|
|
51
|
+
default: z.string().optional(),
|
|
52
|
+
/** A regular expression every value must match, checked before substitution. */
|
|
53
|
+
pattern: z.string().optional(),
|
|
54
|
+
/** The value differs per host (#2524 D9): export and import switch it (#2552). */
|
|
55
|
+
hostBound: z.boolean().optional(),
|
|
56
|
+
description: z.string().optional(),
|
|
57
|
+
})
|
|
58
|
+
.strict();
|
|
59
|
+
const ManifestSchema = z
|
|
60
|
+
.object({
|
|
61
|
+
$comment: z.string().optional(),
|
|
62
|
+
parameters: z.record(z.string(), ParameterSchema),
|
|
63
|
+
files: z.array(z.string().min(1)),
|
|
64
|
+
})
|
|
65
|
+
.strict();
|
|
66
|
+
function has(obj, key) {
|
|
67
|
+
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
68
|
+
}
|
|
69
|
+
export class TemplateParameterError extends LockError {
|
|
70
|
+
constructor() {
|
|
71
|
+
super(...arguments);
|
|
72
|
+
this.name = "TemplateParameterError";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read the manifest from a template's files, or null when it has none.
|
|
77
|
+
* Throws on a manifest that is not valid JSON or does not match the schema.
|
|
78
|
+
*/
|
|
79
|
+
export function readManifest(files) {
|
|
80
|
+
const data = files.get(TEMPLATE_MANIFEST);
|
|
81
|
+
if (!data)
|
|
82
|
+
return null;
|
|
83
|
+
let raw;
|
|
84
|
+
try {
|
|
85
|
+
raw = JSON.parse(data.toString("utf-8"));
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw new TemplateParameterError(`${TEMPLATE_MANIFEST} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
89
|
+
}
|
|
90
|
+
const parsed = ManifestSchema.safeParse(raw);
|
|
91
|
+
if (!parsed.success) {
|
|
92
|
+
throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: ${parsed.error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
93
|
+
}
|
|
94
|
+
const manifest = parsed.data;
|
|
95
|
+
for (const [name, p] of Object.entries(manifest.parameters)) {
|
|
96
|
+
if (!PARAM_NAME.test(name)) {
|
|
97
|
+
throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: parameter name "${name}" is not a letter or _ followed by letters, digits or _`);
|
|
98
|
+
}
|
|
99
|
+
if (p.pattern !== undefined) {
|
|
100
|
+
try {
|
|
101
|
+
new RegExp(p.pattern, "u");
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: parameters.${name}.pattern is not a regular expression`);
|
|
105
|
+
}
|
|
106
|
+
if (p.default !== undefined)
|
|
107
|
+
checkValue(name, p, p.default, "its default");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const f of manifest.files) {
|
|
111
|
+
const norm = posix.normalize(f);
|
|
112
|
+
if (norm !== f || f.startsWith("/") || f.startsWith("../") || f === TEMPLATE_MANIFEST || f.startsWith(`${MIGRATIONS_DIR}/`)) {
|
|
113
|
+
throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: files lists "${f}", which is not a normalised path to a template file`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return manifest;
|
|
117
|
+
}
|
|
118
|
+
function checkValue(name, p, value, what) {
|
|
119
|
+
if (p.pattern !== undefined && !new RegExp(p.pattern, "u").test(value)) {
|
|
120
|
+
throw new TemplateParameterError(`parameter ${name}: ${what} ${JSON.stringify(value)} does not match ${p.pattern}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Parse `--param name=value` arguments (split at the first `=`). A name given
|
|
125
|
+
* twice is refused rather than silently taking the last value.
|
|
126
|
+
*/
|
|
127
|
+
export function parseParamArgs(args) {
|
|
128
|
+
const out = {};
|
|
129
|
+
for (const arg of args) {
|
|
130
|
+
const eq = arg.indexOf("=");
|
|
131
|
+
if (eq <= 0)
|
|
132
|
+
throw new TemplateParameterError(`--param ${arg}: expected <name>=<value>`);
|
|
133
|
+
const name = arg.slice(0, eq);
|
|
134
|
+
if (has(out, name))
|
|
135
|
+
throw new TemplateParameterError(`--param ${name} is given twice`);
|
|
136
|
+
out[name] = arg.slice(eq + 1);
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
function declaredList(manifest) {
|
|
141
|
+
const names = manifest ? Object.keys(manifest.parameters).sort() : [];
|
|
142
|
+
return names.length > 0 ? `declared: ${names.join(", ")}` : "the template declares none";
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The value of every declared parameter: the given value, or the default.
|
|
146
|
+
* Refuses an undeclared name (listing the declared ones), a parameter with no
|
|
147
|
+
* value and no default, and a value that does not match its pattern.
|
|
148
|
+
*/
|
|
149
|
+
export function resolveParameters(manifest, given) {
|
|
150
|
+
const declared = manifest?.parameters ?? {};
|
|
151
|
+
const unknown = Object.keys(given).filter((n) => !has(declared, n)).sort();
|
|
152
|
+
if (unknown.length > 0) {
|
|
153
|
+
throw new TemplateParameterError(`unknown parameter${unknown.length > 1 ? "s" : ""} ${unknown.join(", ")} (${declaredList(manifest)})`);
|
|
154
|
+
}
|
|
155
|
+
const values = {};
|
|
156
|
+
const missing = [];
|
|
157
|
+
for (const name of Object.keys(declared).sort()) {
|
|
158
|
+
const p = declared[name];
|
|
159
|
+
const value = has(given, name) ? given[name] : p.default;
|
|
160
|
+
if (value === undefined) {
|
|
161
|
+
missing.push(name);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
checkValue(name, p, value, has(given, name) ? "the value" : "its default");
|
|
165
|
+
values[name] = value;
|
|
166
|
+
}
|
|
167
|
+
if (missing.length > 0) {
|
|
168
|
+
throw new TemplateParameterError(`parameter${missing.length > 1 ? "s" : ""} ${missing.join(", ")} ${missing.length > 1 ? "have" : "has"} no default; pass ${missing.map((n) => `--param ${n}=<value>`).join(" ")}`);
|
|
169
|
+
}
|
|
170
|
+
return values;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The template's files as the project gets them: the manifest removed, and
|
|
174
|
+
* each listed file with its placeholders replaced. A listed file that is
|
|
175
|
+
* missing, or a placeholder naming no declared parameter, is refused.
|
|
176
|
+
*/
|
|
177
|
+
export function substituteParameters(files, manifest, values) {
|
|
178
|
+
const out = new Map(files);
|
|
179
|
+
out.delete(TEMPLATE_MANIFEST);
|
|
180
|
+
if (!manifest)
|
|
181
|
+
return out;
|
|
182
|
+
for (const path of manifest.files) {
|
|
183
|
+
const data = out.get(path);
|
|
184
|
+
if (!data)
|
|
185
|
+
throw new TemplateParameterError(`${TEMPLATE_MANIFEST} lists ${path}, which is not in the template`);
|
|
186
|
+
const text = data.toString("utf-8");
|
|
187
|
+
const replaced = text.replace(PLACEHOLDER, (_m, name) => {
|
|
188
|
+
if (!has(values, name)) {
|
|
189
|
+
throw new TemplateParameterError(`${path} has ${placeholder(name)}, but ${TEMPLATE_MANIFEST} declares no parameter ${name}`);
|
|
190
|
+
}
|
|
191
|
+
return values[name];
|
|
192
|
+
});
|
|
193
|
+
if (replaced !== text)
|
|
194
|
+
out.set(path, Buffer.from(replaced, "utf-8"));
|
|
195
|
+
}
|
|
196
|
+
return out;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The values an upgrade substitutes into a version of the template: the
|
|
200
|
+
* recorded value of every parameter that version declares, and the default of
|
|
201
|
+
* one it adds. A recorded parameter the version no longer declares is dropped.
|
|
202
|
+
*/
|
|
203
|
+
export function carryParameters(manifest, recorded) {
|
|
204
|
+
const declared = manifest?.parameters ?? {};
|
|
205
|
+
const given = {};
|
|
206
|
+
for (const [name, value] of Object.entries(recorded)) {
|
|
207
|
+
if (has(declared, name) && typeof value === "string")
|
|
208
|
+
given[name] = value;
|
|
209
|
+
}
|
|
210
|
+
return resolveParameters(manifest, given);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* The host-bound parameters of a template (#2552), each with the listed files
|
|
214
|
+
* whose text carries its placeholder. Undefined when the template declares none.
|
|
215
|
+
*/
|
|
216
|
+
export function hostBoundFiles(files, manifest) {
|
|
217
|
+
if (!manifest)
|
|
218
|
+
return undefined;
|
|
219
|
+
const names = Object.keys(manifest.parameters).filter((n) => manifest.parameters[n].hostBound === true).sort();
|
|
220
|
+
if (names.length === 0)
|
|
221
|
+
return undefined;
|
|
222
|
+
const out = {};
|
|
223
|
+
for (const name of names) {
|
|
224
|
+
out[name] = manifest.files.filter((f) => files.get(f)?.toString("utf-8").includes(placeholder(name))).sort();
|
|
225
|
+
}
|
|
226
|
+
return out;
|
|
227
|
+
}
|