@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,766 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "fs";
|
|
2
|
+
import { join, basename } from "path";
|
|
3
|
+
import { auditIntrinsics } from "./check-lexicon-intrinsics.js";
|
|
4
|
+
import { checkExamplesBuild } from "./check-lexicon-examples.js";
|
|
5
|
+
import { auditDocsClassification, auditDocsReachability } from "./check-lexicon-docs.js";
|
|
6
|
+
import { auditMcpNames, lexiconNameFor } from "./check-lexicon-mcp.js";
|
|
7
|
+
import { loadLexiconFromDir, registers, safeList } from "./check-lexicon-plugin.js";
|
|
8
|
+
import { RULE_CATALOG } from "../../audit/catalog.js";
|
|
9
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
10
|
+
/** List .ts files in a directory, optionally excluding some basenames. */
|
|
11
|
+
function listTsFiles(dir, exclude = []) {
|
|
12
|
+
if (!existsSync(dir))
|
|
13
|
+
return [];
|
|
14
|
+
return readdirSync(dir)
|
|
15
|
+
.filter((f) => f.endsWith(".ts") && !exclude.includes(f));
|
|
16
|
+
}
|
|
17
|
+
/** Recursively find files matching a predicate. */
|
|
18
|
+
function findFiles(dir, predicate) {
|
|
19
|
+
if (!existsSync(dir))
|
|
20
|
+
return [];
|
|
21
|
+
const results = [];
|
|
22
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
23
|
+
if (entry.isDirectory()) {
|
|
24
|
+
results.push(...findFiles(join(dir, entry.name), predicate));
|
|
25
|
+
}
|
|
26
|
+
else if (predicate(entry.name)) {
|
|
27
|
+
results.push(join(dir, entry.name));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
32
|
+
/** Read a file's content, returning empty string if missing. */
|
|
33
|
+
/**
|
|
34
|
+
* Count the names in a validate.ts. Reads the entries of the exported
|
|
35
|
+
* REQUIRED_NAMES array; a lexicon with no such export falls back to counting
|
|
36
|
+
* quoted capitalised identifiers (digits allowed, e.g. K8sClusterReceiver).
|
|
37
|
+
*/
|
|
38
|
+
export function countRequiredNames(validateContent) {
|
|
39
|
+
const arr = validateContent.match(/export\s+const\s+REQUIRED_NAMES\b[^=]*=\s*\[([\s\S]*?)\]/);
|
|
40
|
+
const body = arr ? arr[1] : validateContent;
|
|
41
|
+
return (body.match(/["'][A-Z][A-Za-z0-9]*["']/g) || []).length;
|
|
42
|
+
}
|
|
43
|
+
function readOr(path) {
|
|
44
|
+
try {
|
|
45
|
+
return readFileSync(path, "utf-8");
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return "";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Count subdirectories in a directory, ignoring .gitkeep-only dirs. */
|
|
52
|
+
function countSubdirs(dir) {
|
|
53
|
+
if (!existsSync(dir))
|
|
54
|
+
return 0;
|
|
55
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
56
|
+
.filter((e) => e.isDirectory())
|
|
57
|
+
.filter((e) => {
|
|
58
|
+
const contents = readdirSync(join(dir, e.name));
|
|
59
|
+
// Ignore directories that only contain .gitkeep
|
|
60
|
+
return contents.length > 0 && !(contents.length === 1 && contents[0] === ".gitkeep");
|
|
61
|
+
})
|
|
62
|
+
.length;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* #1330 — gate on the plugin's own spec-coverage accounting.
|
|
66
|
+
*
|
|
67
|
+
* fountain's `coverage.test.ts` asserts `unaccountedKinds == []` in CI, but a
|
|
68
|
+
* lexicon-local test is a convention, not a check-lexicon contract — the same
|
|
69
|
+
* class of gap #1342 closed for LSP providers. `coverageReport()` gives core
|
|
70
|
+
* the one fact to gate on: which upstream spec kinds are neither modeled nor
|
|
71
|
+
* on the lexicon's exclusion list. A lexicon without the member passes
|
|
72
|
+
* vacuously, the same conditional shape as the docs-reachability and
|
|
73
|
+
* Diátaxis checks; a report that throws fails, for the same reason `safeList`
|
|
74
|
+
* treats a throw as worse than absence.
|
|
75
|
+
*/
|
|
76
|
+
export async function coverageReportCheck(plugin) {
|
|
77
|
+
const report = plugin?.coverageReport;
|
|
78
|
+
const hasReport = typeof report === "function";
|
|
79
|
+
let unaccounted = [];
|
|
80
|
+
let error;
|
|
81
|
+
if (hasReport) {
|
|
82
|
+
try {
|
|
83
|
+
unaccounted = (await report.call(plugin))?.unaccountedKinds ?? [];
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
error = e instanceof Error ? e.message : String(e);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
name: "coverageReport() leaves no spec kind unaccounted",
|
|
91
|
+
tier: 1,
|
|
92
|
+
pass: !hasReport || (error === undefined && unaccounted.length === 0),
|
|
93
|
+
detail: error !== undefined
|
|
94
|
+
? `threw: ${error}`
|
|
95
|
+
: unaccounted.length > 0
|
|
96
|
+
? `${unaccounted.length} unaccounted: ${unaccounted.join(", ")}`
|
|
97
|
+
: hasReport
|
|
98
|
+
? "all spec kinds accounted for"
|
|
99
|
+
: undefined,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* #3104 — how many composites a lexicon ships.
|
|
104
|
+
*
|
|
105
|
+
* This counted every `.ts` file in `src/composites/` except `index.ts`, so
|
|
106
|
+
* `catalog.ts`, `catalog.test.ts`, `composites.test.ts` and helper modules all
|
|
107
|
+
* counted: otel reported "4 composite(s)" for `NodeAgent` alone. The same rule
|
|
108
|
+
* as #1342 applies: a capability is what the plugin exposes, and a lexicon
|
|
109
|
+
* with composites exposes them through `composites()`, the catalog generated
|
|
110
|
+
* from its real exports (#2662). Ask that when it is there. Only a lexicon
|
|
111
|
+
* without it falls back to the files, and then not to tests, the catalog, the
|
|
112
|
+
* barrel or helper modules.
|
|
113
|
+
*/
|
|
114
|
+
export function countComposites(plugin, dir) {
|
|
115
|
+
if (registers(plugin, "composites")) {
|
|
116
|
+
const { items, error } = safeList(plugin.composites.bind(plugin));
|
|
117
|
+
if (error !== undefined)
|
|
118
|
+
return { count: 0, detail: `composites() threw: ${error}` };
|
|
119
|
+
const names = new Set(items.map((e) => e.name));
|
|
120
|
+
return { count: names.size, detail: `${names.size} composite(s) in composites()` };
|
|
121
|
+
}
|
|
122
|
+
const files = listTsFiles(join(dir, "src/composites"), ["index.ts", "catalog.ts", "helpers.ts", "shared.ts"])
|
|
123
|
+
.filter((f) => !f.endsWith(".test.ts") && !f.endsWith(".d.ts") && !f.endsWith("-helpers.ts"));
|
|
124
|
+
return {
|
|
125
|
+
count: files.length,
|
|
126
|
+
detail: `${files.length} composite file(s) in src/composites/; the plugin has no composites()`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* #2535 — a lexicon that supplies member kinds publishes them as data at a
|
|
131
|
+
* `./workspace-kinds` subpath (ws-031). The file must be JSON, validate as
|
|
132
|
+
* kind data, and ship in the package. A lexicon without the subpath passes
|
|
133
|
+
* vacuously, like `coverageReport()` above. The workspace module loads only
|
|
134
|
+
* here, when the check runs.
|
|
135
|
+
*/
|
|
136
|
+
export async function workspaceKindsCheck(dir) {
|
|
137
|
+
const { readPackageKinds, kindsFileShips } = await import("../../workspace/kinds.js");
|
|
138
|
+
const read = readPackageKinds(dir);
|
|
139
|
+
const problems = [...read.problems];
|
|
140
|
+
if (read.file && problems.length === 0 && !kindsFileShips(dir, read.file)) {
|
|
141
|
+
problems.push(`${basename(read.file)} is not covered by package.json "files", so the published package would not carry it`);
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
name: "Any ./workspace-kinds subpath holds valid kind data",
|
|
145
|
+
tier: 1,
|
|
146
|
+
pass: problems.length === 0,
|
|
147
|
+
detail: problems.length > 0 ? problems.join("; ") : read.file ? `${read.kinds.length} kind(s): ${read.kinds.map((k) => k.name).join(", ")}` : undefined,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// ── Check runner ─────────────────────────────────────────────────────
|
|
151
|
+
/**
|
|
152
|
+
* Run all completeness checks against a lexicon directory.
|
|
153
|
+
*/
|
|
154
|
+
export async function checkLexicon(dir) {
|
|
155
|
+
const items = [];
|
|
156
|
+
// ── Tier 1: Required ───────────────────────────────────────────
|
|
157
|
+
// #1342 — a capability is present when the plugin exposes it, not when a file
|
|
158
|
+
// with the right name sits on disk. The checks below used to be existence
|
|
159
|
+
// assertions, which is how helm shipped `src/lsp/completions.ts` and
|
|
160
|
+
// `src/lsp/hover.ts` (with tests) while registering neither provider, and
|
|
161
|
+
// passed every tier. `cli/lsp/server.ts` dispatches through the plugin
|
|
162
|
+
// members, so those files were unreachable in an editor.
|
|
163
|
+
const loaded = await loadLexiconFromDir(dir);
|
|
164
|
+
const plugin = loaded.plugin;
|
|
165
|
+
items.push({
|
|
166
|
+
name: "The package exports a LexiconPlugin",
|
|
167
|
+
tier: 1,
|
|
168
|
+
pass: plugin !== undefined,
|
|
169
|
+
detail: loaded.error ?? (loaded.entry ? `exported by ${basename(loaded.entry)}` : undefined),
|
|
170
|
+
});
|
|
171
|
+
const serializer = plugin?.serializer;
|
|
172
|
+
const serializerOk = typeof serializer?.name === "string" &&
|
|
173
|
+
typeof serializer?.rulePrefix === "string" &&
|
|
174
|
+
typeof serializer?.serialize === "function";
|
|
175
|
+
items.push({
|
|
176
|
+
name: "The plugin exposes a Serializer with a name and rule prefix",
|
|
177
|
+
tier: 1,
|
|
178
|
+
pass: serializerOk,
|
|
179
|
+
detail: serializerOk
|
|
180
|
+
? `${String(serializer?.name)} (${String(serializer?.rulePrefix)})`
|
|
181
|
+
: plugin
|
|
182
|
+
? "serializer is missing name, rulePrefix, or serialize"
|
|
183
|
+
: undefined,
|
|
184
|
+
});
|
|
185
|
+
const lintRules = safeList(plugin?.lintRules?.bind(plugin));
|
|
186
|
+
items.push({
|
|
187
|
+
name: "lintRules() returns at least 1 rule",
|
|
188
|
+
tier: 1,
|
|
189
|
+
pass: lintRules.items.length > 0,
|
|
190
|
+
detail: lintRules.error ? `threw: ${lintRules.error}` : `${lintRules.items.length} rule(s)`,
|
|
191
|
+
});
|
|
192
|
+
const postSynthChecks = safeList(plugin?.postSynthChecks?.bind(plugin));
|
|
193
|
+
items.push({
|
|
194
|
+
name: "postSynthChecks() returns at least 1 check",
|
|
195
|
+
tier: 1,
|
|
196
|
+
pass: postSynthChecks.items.length > 0,
|
|
197
|
+
detail: postSynthChecks.error
|
|
198
|
+
? `threw: ${postSynthChecks.error}`
|
|
199
|
+
: `${postSynthChecks.items.length} check(s)`,
|
|
200
|
+
});
|
|
201
|
+
// #1349 — `rulePrefix` exists so ids do not collide when several lexicons are
|
|
202
|
+
// loaded together (forgejo wraps github's rules as `WFJ-GHA0xx` for exactly
|
|
203
|
+
// that reason), and it was checked by nothing. k8s shipped five `ARGO0xx`
|
|
204
|
+
// checks outside its declared `WK8`. Core's cross-cutting ids are exempt:
|
|
205
|
+
// they belong to core, not to whichever lexicon surfaces them.
|
|
206
|
+
const declaredPrefixes = [
|
|
207
|
+
typeof serializer?.rulePrefix === "string" ? serializer.rulePrefix : "",
|
|
208
|
+
...(plugin?.serializer?.extraRulePrefixes ?? []),
|
|
209
|
+
].filter((p) => p.length > 0);
|
|
210
|
+
const allRuleIds = [
|
|
211
|
+
...lintRules.items.map((r) => r.id),
|
|
212
|
+
...postSynthChecks.items.map((c) => c.id),
|
|
213
|
+
].filter((id) => typeof id === "string");
|
|
214
|
+
const offPrefix = allRuleIds.filter((id) => !(id in RULE_CATALOG) && !declaredPrefixes.some((p) => id.startsWith(p)));
|
|
215
|
+
items.push({
|
|
216
|
+
name: "Every rule id starts with a declared rule prefix",
|
|
217
|
+
tier: 1,
|
|
218
|
+
pass: declaredPrefixes.length > 0 && offPrefix.length === 0,
|
|
219
|
+
detail: offPrefix.length > 0
|
|
220
|
+
? `${offPrefix.length} outside ${declaredPrefixes.join("/")}: ${[...new Set(offPrefix)].slice(0, 6).join(", ")}`
|
|
221
|
+
: declaredPrefixes.length > 0
|
|
222
|
+
? `${allRuleIds.length} id(s) under ${declaredPrefixes.join("/")}`
|
|
223
|
+
: "no rule prefix declared",
|
|
224
|
+
});
|
|
225
|
+
items.push({
|
|
226
|
+
name: "The plugin registers completionProvider",
|
|
227
|
+
tier: 1,
|
|
228
|
+
pass: registers(plugin, "completionProvider"),
|
|
229
|
+
});
|
|
230
|
+
items.push({
|
|
231
|
+
name: "The plugin registers hoverProvider",
|
|
232
|
+
tier: 1,
|
|
233
|
+
pass: registers(plugin, "hoverProvider"),
|
|
234
|
+
});
|
|
235
|
+
items.push({
|
|
236
|
+
name: "The plugin registers docs()",
|
|
237
|
+
tier: 1,
|
|
238
|
+
pass: registers(plugin, "docs"),
|
|
239
|
+
});
|
|
240
|
+
items.push({
|
|
241
|
+
name: "dist/manifest.json exists",
|
|
242
|
+
tier: 1,
|
|
243
|
+
pass: existsSync(join(dir, "dist/manifest.json")),
|
|
244
|
+
});
|
|
245
|
+
// chant #1067 — chantVersion was "optional, unchecked": a lexicon could
|
|
246
|
+
// declare (or omit) a core-version constraint and nothing failed. This
|
|
247
|
+
// does not validate compatibility against the running core version — that
|
|
248
|
+
// needs a live check at plugin-load time (a different tool: candidates are
|
|
249
|
+
// `loadPlugin`/`loadPlugins` in ../plugins.ts), which is a deliberate
|
|
250
|
+
// non-goal here (see PR description). It closes the narrower gap that the
|
|
251
|
+
// field can be silently absent or malformed in the shipped manifest.
|
|
252
|
+
const manifestJson = readOr(join(dir, "dist/manifest.json"));
|
|
253
|
+
let chantVersionOk = false;
|
|
254
|
+
let chantVersionDetail;
|
|
255
|
+
if (manifestJson) {
|
|
256
|
+
try {
|
|
257
|
+
const parsed = JSON.parse(manifestJson);
|
|
258
|
+
const cv = parsed.chantVersion;
|
|
259
|
+
chantVersionOk = typeof cv === "string" && /\d/.test(cv);
|
|
260
|
+
chantVersionDetail = chantVersionOk ? `chantVersion: ${cv}` : `chantVersion: ${JSON.stringify(cv)}`;
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
chantVersionDetail = "dist/manifest.json is not valid JSON";
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
chantVersionDetail = "dist/manifest.json missing or unreadable";
|
|
268
|
+
}
|
|
269
|
+
items.push({
|
|
270
|
+
name: "dist/manifest.json declares a chantVersion",
|
|
271
|
+
tier: 1,
|
|
272
|
+
pass: chantVersionOk,
|
|
273
|
+
detail: chantVersionDetail,
|
|
274
|
+
});
|
|
275
|
+
// chant #1067 — packaging shape ("all 11 lexicons route exports['.'].default
|
|
276
|
+
// at ./src/index.ts and delete emitted JS in build") was real but
|
|
277
|
+
// unenforced; a lexicon shipping differently would break consumers
|
|
278
|
+
// silently. Cheap structural check on package.json, not a build execution.
|
|
279
|
+
const packageJsonRaw = readOr(join(dir, "package.json"));
|
|
280
|
+
let packagingOk = false;
|
|
281
|
+
let packagingDetail;
|
|
282
|
+
if (packageJsonRaw) {
|
|
283
|
+
try {
|
|
284
|
+
const pkg = JSON.parse(packageJsonRaw);
|
|
285
|
+
const defaultExport = pkg.exports?.["."]?.default;
|
|
286
|
+
const buildScript = pkg.scripts?.build ?? "";
|
|
287
|
+
const exportOk = defaultExport === "./src/index.ts";
|
|
288
|
+
const deletesEmittedJs = /-delete/.test(buildScript) && /\.js/.test(buildScript);
|
|
289
|
+
packagingOk = exportOk && deletesEmittedJs;
|
|
290
|
+
const problems = [];
|
|
291
|
+
if (!exportOk)
|
|
292
|
+
problems.push(`exports["."].default is ${JSON.stringify(defaultExport)}, expected "./src/index.ts"`);
|
|
293
|
+
if (!deletesEmittedJs)
|
|
294
|
+
problems.push(`build script doesn't delete emitted .js from dist/: ${JSON.stringify(buildScript)}`);
|
|
295
|
+
packagingDetail = problems.length > 0 ? problems.join("; ") : undefined;
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
packagingDetail = "package.json is not valid JSON";
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
packagingDetail = "package.json missing or unreadable";
|
|
303
|
+
}
|
|
304
|
+
items.push({
|
|
305
|
+
name: 'package.json routes exports["."].default at ./src/index.ts and deletes emitted JS in build',
|
|
306
|
+
tier: 1,
|
|
307
|
+
pass: packagingOk,
|
|
308
|
+
detail: packagingDetail,
|
|
309
|
+
});
|
|
310
|
+
const exampleCount = countSubdirs(join(dir, "examples"));
|
|
311
|
+
items.push({
|
|
312
|
+
name: "At least 1 example in examples/",
|
|
313
|
+
tier: 1,
|
|
314
|
+
pass: exampleCount > 0,
|
|
315
|
+
detail: exampleCount > 0 ? `${exampleCount} example(s)` : undefined,
|
|
316
|
+
});
|
|
317
|
+
// chant #1067 — every shipped example must actually build. The prior
|
|
318
|
+
// checks only ever counted example directories; none tried to build one,
|
|
319
|
+
// so `lexicons/aws/examples/core-concepts` shipped with a discovery-time
|
|
320
|
+
// "Duplicate export name" error while this tool reported "All tier-1
|
|
321
|
+
// checks passed." chant #1400 — and the built output must pass the
|
|
322
|
+
// lexicon's own post-synth checks at error severity; three aws examples
|
|
323
|
+
// taught patterns (no TLS-only bucket policy, mutable ECR tags) the
|
|
324
|
+
// lexicon flags as errors. See ./check-lexicon-examples.ts.
|
|
325
|
+
const exampleBuilds = await checkExamplesBuild(dir);
|
|
326
|
+
const brokenExamples = exampleBuilds.filter((e) => !e.ok);
|
|
327
|
+
items.push({
|
|
328
|
+
name: "Every shipped example builds and passes its own post-synth checks",
|
|
329
|
+
tier: 1,
|
|
330
|
+
pass: brokenExamples.length === 0,
|
|
331
|
+
detail: brokenExamples.length > 0
|
|
332
|
+
? brokenExamples.map((e) => `${e.example}: ${e.detail}`).join(" | ")
|
|
333
|
+
: exampleBuilds.length > 0
|
|
334
|
+
? `${exampleBuilds.length} example(s) built`
|
|
335
|
+
: undefined,
|
|
336
|
+
});
|
|
337
|
+
// chant #1067 — foldability (isTag) is required and validated, not an
|
|
338
|
+
// optional flag nobody checks. #1039 shipped with it wrong in both
|
|
339
|
+
// directions (aws's Sub missing isTag; gitlab's reference() claiming
|
|
340
|
+
// isTag: true for a plain call) and nothing caught either half. See
|
|
341
|
+
// ./check-lexicon-intrinsics.ts for what "exported"/"matches" mean.
|
|
342
|
+
const intrinsicAudit = auditIntrinsics(dir);
|
|
343
|
+
const unexportedIntrinsics = intrinsicAudit.filter((i) => !i.exported);
|
|
344
|
+
items.push({
|
|
345
|
+
name: "Registered intrinsics are exported by the package",
|
|
346
|
+
tier: 1,
|
|
347
|
+
pass: unexportedIntrinsics.length === 0,
|
|
348
|
+
detail: unexportedIntrinsics.length > 0
|
|
349
|
+
? unexportedIntrinsics.map((i) => i.detail).join(" | ")
|
|
350
|
+
: intrinsicAudit.length > 0
|
|
351
|
+
? `${intrinsicAudit.length} intrinsic(s) checked`
|
|
352
|
+
: undefined,
|
|
353
|
+
});
|
|
354
|
+
const mismatchedIntrinsics = intrinsicAudit.filter((i) => !i.ok);
|
|
355
|
+
items.push({
|
|
356
|
+
name: "Registered intrinsics' isTag matches how they're authored",
|
|
357
|
+
tier: 1,
|
|
358
|
+
pass: mismatchedIntrinsics.length === 0,
|
|
359
|
+
detail: mismatchedIntrinsics.length > 0
|
|
360
|
+
? mismatchedIntrinsics.map((i) => i.detail).join(" | ")
|
|
361
|
+
: intrinsicAudit.length > 0
|
|
362
|
+
? `${intrinsicAudit.length} intrinsic(s) checked`
|
|
363
|
+
: undefined,
|
|
364
|
+
});
|
|
365
|
+
// chant #1044 — the call-form opt-in (`foldsAsCall`) admits a plain call
|
|
366
|
+
// into `fold()`, which has no general CallExpression case. Declaring it on
|
|
367
|
+
// a tagged template claims a form the intrinsic cannot be invoked in, so
|
|
368
|
+
// it fails here rather than being quietly ignored — the same reasoning as
|
|
369
|
+
// the isTag check above.
|
|
370
|
+
const badCallForm = intrinsicAudit.filter((i) => !i.callFormOk);
|
|
371
|
+
items.push({
|
|
372
|
+
name: "Registered intrinsics' foldsAsCall opt-in is only on plain calls",
|
|
373
|
+
tier: 1,
|
|
374
|
+
pass: badCallForm.length === 0,
|
|
375
|
+
detail: badCallForm.length > 0
|
|
376
|
+
? badCallForm.map((i) => i.callFormDetail).join(" | ")
|
|
377
|
+
: intrinsicAudit.length > 0
|
|
378
|
+
? `${intrinsicAudit.length} intrinsic(s) checked`
|
|
379
|
+
: undefined,
|
|
380
|
+
});
|
|
381
|
+
// #1341 — core namespaces MCP contributions, and so do the shared helpers and
|
|
382
|
+
// most lexicons, so the names agents actually saw were `gitlab:gitlab:diff`
|
|
383
|
+
// and `chant://azure/chant://lexicon/azure/catalog`. The check is on the
|
|
384
|
+
// registered name rather than the declared one: three authored forms are in
|
|
385
|
+
// use and all of them are fine, but only one registered shape is.
|
|
386
|
+
const mcpNames = await auditMcpNames(dir);
|
|
387
|
+
items.push({
|
|
388
|
+
name: "MCP tools and resources register under one well-formed namespace",
|
|
389
|
+
tier: 1,
|
|
390
|
+
pass: mcpNames.violations.length === 0,
|
|
391
|
+
detail: mcpNames.violations.length > 0
|
|
392
|
+
? mcpNames.violations.join(" | ")
|
|
393
|
+
: mcpNames.loaded
|
|
394
|
+
? `${mcpNames.checked} contribution(s) checked`
|
|
395
|
+
: "lexicon could not be loaded — not checked",
|
|
396
|
+
});
|
|
397
|
+
const hasPluginTest = findFiles(join(dir, "src"), (n) => n === "plugin.test.ts").length > 0;
|
|
398
|
+
items.push({
|
|
399
|
+
name: "plugin.test.ts exists",
|
|
400
|
+
tier: 1,
|
|
401
|
+
pass: hasPluginTest,
|
|
402
|
+
});
|
|
403
|
+
const hasSerializerTest = findFiles(join(dir, "src"), (n) => n === "serializer.test.ts").length > 0;
|
|
404
|
+
items.push({
|
|
405
|
+
name: "serializer.test.ts exists",
|
|
406
|
+
tier: 1,
|
|
407
|
+
pass: hasSerializerTest,
|
|
408
|
+
});
|
|
409
|
+
const mdxFiles = findFiles(join(dir, "docs"), (n) => n.endsWith(".mdx"));
|
|
410
|
+
items.push({
|
|
411
|
+
name: "At least 1 .mdx doc page",
|
|
412
|
+
tier: 1,
|
|
413
|
+
pass: mdxFiles.length > 0,
|
|
414
|
+
detail: mdxFiles.length > 0 ? `${mdxFiles.length} page(s)` : undefined,
|
|
415
|
+
});
|
|
416
|
+
// Counting pages says nothing about whether a reader can find them.
|
|
417
|
+
// Starlight has no auto-discovery, so a page missing from the sidebar is
|
|
418
|
+
// reachable only by direct URL (#1312).
|
|
419
|
+
const docsReach = auditDocsReachability(dir);
|
|
420
|
+
items.push({
|
|
421
|
+
name: "Every doc page is reachable from the sidebar",
|
|
422
|
+
tier: 1,
|
|
423
|
+
pass: !docsReach.hasSite || docsReach.unreachable.length === 0,
|
|
424
|
+
detail: docsReach.unreachable.length > 0
|
|
425
|
+
? `${docsReach.unreachable.length} unreachable: ${docsReach.unreachable.join(", ")}`
|
|
426
|
+
: undefined,
|
|
427
|
+
});
|
|
428
|
+
// Authored pages name their Diátaxis quadrant; the sidebar is built from
|
|
429
|
+
// it, so an untagged page cannot be placed (#1731).
|
|
430
|
+
const docsClass = auditDocsClassification(dir);
|
|
431
|
+
items.push({
|
|
432
|
+
name: "Every authored doc page has a diataxis quadrant",
|
|
433
|
+
tier: 1,
|
|
434
|
+
pass: !docsClass.hasPages || docsClass.unclassified.length === 0,
|
|
435
|
+
detail: docsClass.unclassified.length > 0
|
|
436
|
+
? `${docsClass.unclassified.length} unclassified: ${docsClass.unclassified.join(", ")}`
|
|
437
|
+
: undefined,
|
|
438
|
+
});
|
|
439
|
+
// #1330 — fountain's spec-coverage gate lived in a lexicon-local vitest
|
|
440
|
+
// assertion, a convention rather than a check-lexicon contract. The plugin
|
|
441
|
+
// now states the fact directly via `coverageReport()`.
|
|
442
|
+
items.push(await coverageReportCheck(plugin));
|
|
443
|
+
items.push(await workspaceKindsCheck(dir));
|
|
444
|
+
// ── Tier 2: Recommended ────────────────────────────────────────
|
|
445
|
+
const pluginContent = readOr(join(dir, "src/plugin.ts"));
|
|
446
|
+
// #1342 — these were a regex over plugin.ts source text, which passed on a
|
|
447
|
+
// method declared in a form the regex happened to match and on one that
|
|
448
|
+
// throws when called. Ask the plugin instead.
|
|
449
|
+
for (const method of ["mcpTools", "mcpResources", "skills", "detectTemplate", "initTemplates"]) {
|
|
450
|
+
items.push({
|
|
451
|
+
name: `The plugin registers ${method}`,
|
|
452
|
+
tier: 2,
|
|
453
|
+
pass: registers(plugin, method),
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
// #1346 — `resolveAuditCatalog` contributes nothing for a lexicon that omits
|
|
457
|
+
// the method, silently, so its checks surface in `chant audit` with no title,
|
|
458
|
+
// tier, fix kind, or category. Tier 2 rather than tier 1: the lexicon builds
|
|
459
|
+
// and lints correctly without it; what suffers is one command's output.
|
|
460
|
+
const auditCatalog = (() => {
|
|
461
|
+
try {
|
|
462
|
+
return plugin?.auditCatalog?.() ?? {};
|
|
463
|
+
}
|
|
464
|
+
catch {
|
|
465
|
+
return {};
|
|
466
|
+
}
|
|
467
|
+
})();
|
|
468
|
+
const uncatalogued = postSynthChecks.items
|
|
469
|
+
.map((c) => c.id)
|
|
470
|
+
.filter((id) => typeof id === "string" && !(id in auditCatalog) && !(id in RULE_CATALOG));
|
|
471
|
+
items.push({
|
|
472
|
+
name: "auditCatalog() covers every post-synth check",
|
|
473
|
+
tier: 2,
|
|
474
|
+
pass: uncatalogued.length === 0,
|
|
475
|
+
detail: uncatalogued.length > 0
|
|
476
|
+
? `${uncatalogued.length} without metadata: ${uncatalogued.slice(0, 6).join(", ")}`
|
|
477
|
+
: `${Object.keys(auditCatalog).length} entry/entries`,
|
|
478
|
+
});
|
|
479
|
+
// #1348 — the marker channel is a claim: declaring `reads: ["exportResources"]`
|
|
480
|
+
// while not implementing `exportResources` promises a verdict from a path
|
|
481
|
+
// that does not exist. The behavioral half lives in the observation
|
|
482
|
+
// conformance suite, which holds a declared path to a real verdict and an
|
|
483
|
+
// undeclared one to `unknown`; this is the static half.
|
|
484
|
+
const channel = plugin?.ownershipChannel;
|
|
485
|
+
const channelProblems = [];
|
|
486
|
+
if (channel) {
|
|
487
|
+
for (const path of channel.reads) {
|
|
488
|
+
if (!registers(plugin, path)) {
|
|
489
|
+
channelProblems.push(`declares a marker channel on ${path}, which the plugin does not implement`);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
const keys = channel.keys;
|
|
493
|
+
for (const key of ["managedBy", "stack", "env"]) {
|
|
494
|
+
if (typeof keys?.[key] !== "string" || keys[key].length === 0) {
|
|
495
|
+
channelProblems.push(`marker keys are missing ${key}`);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
if (channel.reads.length === 0) {
|
|
499
|
+
channelProblems.push("declares marker keys but no read path — nothing can resolve a verdict");
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
items.push({
|
|
503
|
+
name: "Any declared ownership channel names paths the plugin implements",
|
|
504
|
+
tier: 2,
|
|
505
|
+
pass: channelProblems.length === 0,
|
|
506
|
+
detail: channelProblems.length > 0
|
|
507
|
+
? channelProblems.join("; ")
|
|
508
|
+
: channel
|
|
509
|
+
? `marker on ${channel.reads.join(", ")}`
|
|
510
|
+
: "no marker channel — every verdict must be unknown",
|
|
511
|
+
});
|
|
512
|
+
// #1344 — a lexicon that reads its own `chant.config.ts` namespace should
|
|
513
|
+
// declare its shape, or a typo inside that namespace is accepted and silently
|
|
514
|
+
// ignored: `forgejo: { runnerLabel: … }` left the dialect on its defaults with
|
|
515
|
+
// nothing said. Source scan, because the read happens deep in a serializer
|
|
516
|
+
// rather than anywhere the plugin object can be asked.
|
|
517
|
+
const lexiconName = lexiconNameFor(dir);
|
|
518
|
+
const readsOwnNamespace = findFiles(join(dir, "src"), (n) => n.endsWith(".ts") && !n.endsWith(".test.ts"))
|
|
519
|
+
.some((file) => new RegExp(`config\\s*\\??\\.\\s*${lexiconName}\\b`).test(readOr(file)));
|
|
520
|
+
items.push({
|
|
521
|
+
name: "Declares a configSchema if it reads its own config namespace",
|
|
522
|
+
tier: 2,
|
|
523
|
+
pass: !readsOwnNamespace || plugin?.configSchema !== undefined,
|
|
524
|
+
detail: readsOwnNamespace
|
|
525
|
+
? plugin?.configSchema
|
|
526
|
+
? `config.${lexiconName} is declared and validated`
|
|
527
|
+
: `reads config.${lexiconName} but declares no schema — unknown keys there are silently ignored`
|
|
528
|
+
: "reads no config namespace of its own",
|
|
529
|
+
});
|
|
530
|
+
const composites = countComposites(plugin, dir);
|
|
531
|
+
items.push({
|
|
532
|
+
name: "At least 1 composite",
|
|
533
|
+
tier: 2,
|
|
534
|
+
pass: composites.count > 0,
|
|
535
|
+
detail: composites.detail,
|
|
536
|
+
});
|
|
537
|
+
items.push({
|
|
538
|
+
name: "At least 3 examples",
|
|
539
|
+
tier: 2,
|
|
540
|
+
pass: exampleCount >= 3,
|
|
541
|
+
detail: `${exampleCount} example(s)`,
|
|
542
|
+
});
|
|
543
|
+
items.push({
|
|
544
|
+
name: "src/lsp/completions.test.ts exists",
|
|
545
|
+
tier: 2,
|
|
546
|
+
pass: existsSync(join(dir, "src/lsp/completions.test.ts")),
|
|
547
|
+
});
|
|
548
|
+
items.push({
|
|
549
|
+
name: "src/lsp/hover.test.ts exists",
|
|
550
|
+
tier: 2,
|
|
551
|
+
pass: existsSync(join(dir, "src/lsp/hover.test.ts")),
|
|
552
|
+
});
|
|
553
|
+
const coverageContent = readOr(join(dir, "src/coverage.ts"));
|
|
554
|
+
items.push({
|
|
555
|
+
name: "coverage.ts is implemented",
|
|
556
|
+
tier: 2,
|
|
557
|
+
pass: !coverageContent.includes("not yet implemented"),
|
|
558
|
+
detail: coverageContent.includes("not yet implemented") ? "contains 'not yet implemented'" : undefined,
|
|
559
|
+
});
|
|
560
|
+
items.push({
|
|
561
|
+
name: "At least 8 doc pages",
|
|
562
|
+
tier: 2,
|
|
563
|
+
pass: mdxFiles.length >= 8,
|
|
564
|
+
detail: `${mdxFiles.length} page(s)`,
|
|
565
|
+
});
|
|
566
|
+
// Post-synth check count (excluding helpers, tests, and support files)
|
|
567
|
+
const postSynthCheckFiles = listTsFiles(join(dir, "src/lint/post-synth"), ["index.ts"])
|
|
568
|
+
.filter((f) => !f.endsWith(".test.ts") && !f.endsWith("-helpers.ts") && f !== "helpers.ts" && !f.startsWith("arm-") && !f.startsWith("k8s-"));
|
|
569
|
+
items.push({
|
|
570
|
+
name: "At least 15 post-synth checks",
|
|
571
|
+
tier: 2,
|
|
572
|
+
pass: postSynthCheckFiles.length >= 15,
|
|
573
|
+
detail: `${postSynthCheckFiles.length} check(s)`,
|
|
574
|
+
});
|
|
575
|
+
// Skills count
|
|
576
|
+
const skillsDir = join(dir, "src/skills");
|
|
577
|
+
const skillFiles = existsSync(skillsDir) ? readdirSync(skillsDir).filter((f) => f.endsWith(".md")) : [];
|
|
578
|
+
items.push({
|
|
579
|
+
name: "At least 3 skills",
|
|
580
|
+
tier: 2,
|
|
581
|
+
pass: skillFiles.length >= 3,
|
|
582
|
+
detail: `${skillFiles.length} skill(s)`,
|
|
583
|
+
});
|
|
584
|
+
// initTemplates count — check for template branches in plugin.ts
|
|
585
|
+
const initTemplateBranches = (pluginContent.match(/template\s*===\s*["']/g) || []).length + 1; // +1 for default
|
|
586
|
+
items.push({
|
|
587
|
+
name: "At least 3 initTemplates",
|
|
588
|
+
tier: 2,
|
|
589
|
+
pass: initTemplateBranches >= 3,
|
|
590
|
+
detail: `${initTemplateBranches} template(s)`,
|
|
591
|
+
});
|
|
592
|
+
// ── Tier 3: Thoroughness ───────────────────────────────────────
|
|
593
|
+
// Each lint rule has a test (per-file or consolidated)
|
|
594
|
+
const ruleDir = join(dir, "src/lint/rules");
|
|
595
|
+
const ruleSourceFiles = listTsFiles(ruleDir, ["index.ts"]).filter((f) => !f.endsWith(".test.ts"));
|
|
596
|
+
const ruleTestFiles = listTsFiles(ruleDir).filter((f) => f.endsWith(".test.ts"));
|
|
597
|
+
// A consolidated test file (e.g. rules.test.ts) covers all rules in the directory
|
|
598
|
+
const hasConsolidatedRuleTest = ruleTestFiles.length > 0;
|
|
599
|
+
const untestedRules = hasConsolidatedRuleTest
|
|
600
|
+
? []
|
|
601
|
+
: ruleSourceFiles.filter((f) => !ruleTestFiles.includes(f.replace(".ts", ".test.ts")));
|
|
602
|
+
items.push({
|
|
603
|
+
name: "Each lint rule has a .test.ts",
|
|
604
|
+
tier: 3,
|
|
605
|
+
pass: ruleSourceFiles.length > 0 && untestedRules.length === 0,
|
|
606
|
+
detail: untestedRules.length > 0 ? `missing: ${untestedRules.join(", ")}` : undefined,
|
|
607
|
+
});
|
|
608
|
+
// Each post-synth has a test (per-file or consolidated)
|
|
609
|
+
const postSynthDir = join(dir, "src/lint/post-synth");
|
|
610
|
+
const postSynthSourceFiles = listTsFiles(postSynthDir, ["index.ts"])
|
|
611
|
+
.filter((f) => !f.endsWith(".test.ts") && !f.endsWith("-helpers.ts") && f !== "helpers.ts");
|
|
612
|
+
const postSynthTestFiles = listTsFiles(postSynthDir).filter((f) => f.endsWith(".test.ts"));
|
|
613
|
+
// A consolidated test file (e.g. post-synth.test.ts) covers all checks in the directory
|
|
614
|
+
const hasConsolidatedPostSynthTest = postSynthTestFiles.length > 0;
|
|
615
|
+
const untestedPostSynth = hasConsolidatedPostSynthTest
|
|
616
|
+
? []
|
|
617
|
+
: postSynthSourceFiles.filter((f) => !postSynthTestFiles.includes(f.replace(".ts", ".test.ts")));
|
|
618
|
+
items.push({
|
|
619
|
+
name: "Each post-synth check has a .test.ts",
|
|
620
|
+
tier: 3,
|
|
621
|
+
pass: postSynthSourceFiles.length > 0 && untestedPostSynth.length === 0,
|
|
622
|
+
detail: untestedPostSynth.length > 0 ? `missing: ${untestedPostSynth.join(", ")}` : undefined,
|
|
623
|
+
});
|
|
624
|
+
const hasTypecheckTest = findFiles(join(dir, "src"), (n) => n === "typecheck.test.ts").length > 0;
|
|
625
|
+
items.push({
|
|
626
|
+
name: "typecheck.test.ts exists",
|
|
627
|
+
tier: 3,
|
|
628
|
+
pass: hasTypecheckTest,
|
|
629
|
+
});
|
|
630
|
+
// A round trip over a large corpus can be an end-to-end test, kept out of the unit project's
|
|
631
|
+
// per-test budget under the e2e name.
|
|
632
|
+
const hasRoundtripTest = findFiles(join(dir, "src"), (n) => n === "roundtrip.test.ts" || n === "roundtrip.e2e.test.ts").length > 0;
|
|
633
|
+
items.push({
|
|
634
|
+
name: "roundtrip.test.ts exists",
|
|
635
|
+
tier: 3,
|
|
636
|
+
pass: hasRoundtripTest,
|
|
637
|
+
});
|
|
638
|
+
items.push({
|
|
639
|
+
name: "At least 5 composites",
|
|
640
|
+
tier: 3,
|
|
641
|
+
pass: composites.count >= 5,
|
|
642
|
+
detail: composites.detail,
|
|
643
|
+
});
|
|
644
|
+
const hasActions = existsSync(join(dir, "src/actions")) &&
|
|
645
|
+
listTsFiles(join(dir, "src/actions"), ["index.ts"]).length > 0;
|
|
646
|
+
items.push({
|
|
647
|
+
name: "src/actions/ with at least 1 action",
|
|
648
|
+
tier: 3,
|
|
649
|
+
pass: hasActions,
|
|
650
|
+
});
|
|
651
|
+
// Validate required names count
|
|
652
|
+
const validateContent = readOr(join(dir, "src/validate.ts"));
|
|
653
|
+
const requiredNamesMatches = countRequiredNames(validateContent);
|
|
654
|
+
items.push({
|
|
655
|
+
name: "validate.ts checks at least 30 required names",
|
|
656
|
+
tier: 3,
|
|
657
|
+
pass: requiredNamesMatches >= 30,
|
|
658
|
+
detail: `${requiredNamesMatches} required name(s)`,
|
|
659
|
+
});
|
|
660
|
+
// Composite test file exists
|
|
661
|
+
const hasCompositeTest = existsSync(join(dir, "src/composites/composites.test.ts"));
|
|
662
|
+
items.push({
|
|
663
|
+
name: "Composite test file exists",
|
|
664
|
+
tier: 3,
|
|
665
|
+
pass: hasCompositeTest,
|
|
666
|
+
});
|
|
667
|
+
// Examples with tests (per-example or consolidated root test file)
|
|
668
|
+
const examplesDir = join(dir, "examples");
|
|
669
|
+
let examplesWithTests = 0;
|
|
670
|
+
if (existsSync(examplesDir)) {
|
|
671
|
+
// A .test.ts in the examples root directory covers all examples
|
|
672
|
+
const rootTestFiles = readdirSync(examplesDir).filter((f) => f.endsWith(".test.ts"));
|
|
673
|
+
const hasConsolidatedExampleTest = rootTestFiles.length > 0;
|
|
674
|
+
const exampleDirs = readdirSync(examplesDir, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
675
|
+
for (const entry of exampleDirs) {
|
|
676
|
+
if (hasConsolidatedExampleTest) {
|
|
677
|
+
// Consolidated test covers all non-empty example dirs
|
|
678
|
+
const contents = readdirSync(join(examplesDir, entry.name));
|
|
679
|
+
if (contents.length > 0 && !(contents.length === 1 && contents[0] === ".gitkeep")) {
|
|
680
|
+
examplesWithTests++;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
else {
|
|
684
|
+
const exampleTests = findFiles(join(examplesDir, entry.name), (n) => n.endsWith(".test.ts"));
|
|
685
|
+
if (exampleTests.length > 0)
|
|
686
|
+
examplesWithTests++;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
items.push({
|
|
691
|
+
name: "At least 5 examples with tests",
|
|
692
|
+
tier: 3,
|
|
693
|
+
pass: examplesWithTests >= 5,
|
|
694
|
+
detail: `${examplesWithTests} example(s) with tests`,
|
|
695
|
+
});
|
|
696
|
+
const tier1Pass = items.filter((i) => i.tier === 1).every((i) => i.pass);
|
|
697
|
+
return { items, tier1Pass };
|
|
698
|
+
}
|
|
699
|
+
// ── Output formatting ────────────────────────────────────────────────
|
|
700
|
+
const COLORS = {
|
|
701
|
+
green: "\x1b[32m",
|
|
702
|
+
yellow: "\x1b[33m",
|
|
703
|
+
gray: "\x1b[90m",
|
|
704
|
+
red: "\x1b[31m",
|
|
705
|
+
reset: "\x1b[0m",
|
|
706
|
+
bold: "\x1b[1m",
|
|
707
|
+
};
|
|
708
|
+
function useColors() {
|
|
709
|
+
return !process.env.NO_COLOR && process.stdout.isTTY !== false;
|
|
710
|
+
}
|
|
711
|
+
function c(text, code) {
|
|
712
|
+
return useColors() ? `${code}${text}${COLORS.reset}` : text;
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* Print the check result as a colored table or JSON.
|
|
716
|
+
*/
|
|
717
|
+
export function printCheckResult(result, json) {
|
|
718
|
+
if (json) {
|
|
719
|
+
console.log(JSON.stringify(result, null, 2));
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
const tierLabels = {
|
|
723
|
+
1: "required",
|
|
724
|
+
2: "recommended",
|
|
725
|
+
3: "thoroughness",
|
|
726
|
+
};
|
|
727
|
+
for (const tier of [1, 2, 3]) {
|
|
728
|
+
const tierItems = result.items.filter((i) => i.tier === tier);
|
|
729
|
+
if (tierItems.length === 0)
|
|
730
|
+
continue;
|
|
731
|
+
const passCount = tierItems.filter((i) => i.pass).length;
|
|
732
|
+
const label = tierLabels[tier];
|
|
733
|
+
console.log("");
|
|
734
|
+
console.log(c(`Tier ${tier} — ${label} (${passCount}/${tierItems.length})`, COLORS.bold));
|
|
735
|
+
for (const item of tierItems) {
|
|
736
|
+
let icon;
|
|
737
|
+
let nameColor;
|
|
738
|
+
if (item.pass) {
|
|
739
|
+
icon = c("PASS", COLORS.green);
|
|
740
|
+
nameColor = COLORS.green;
|
|
741
|
+
}
|
|
742
|
+
else if (tier === 1) {
|
|
743
|
+
icon = c("FAIL", COLORS.red);
|
|
744
|
+
nameColor = COLORS.red;
|
|
745
|
+
}
|
|
746
|
+
else if (tier === 2) {
|
|
747
|
+
icon = c("WARN", COLORS.yellow);
|
|
748
|
+
nameColor = COLORS.yellow;
|
|
749
|
+
}
|
|
750
|
+
else {
|
|
751
|
+
icon = c("INFO", COLORS.gray);
|
|
752
|
+
nameColor = COLORS.gray;
|
|
753
|
+
}
|
|
754
|
+
const detail = item.detail ? c(` (${item.detail})`, COLORS.gray) : "";
|
|
755
|
+
console.log(` ${icon} ${c(item.name, nameColor)}${detail}`);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
console.log("");
|
|
759
|
+
if (result.tier1Pass) {
|
|
760
|
+
console.log(c("All tier-1 checks passed.", COLORS.green));
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
const failures = result.items.filter((i) => i.tier === 1 && !i.pass);
|
|
764
|
+
console.log(c(`${failures.length} tier-1 check(s) failed.`, COLORS.red));
|
|
765
|
+
}
|
|
766
|
+
}
|