@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.
Files changed (928) hide show
  1. package/bin/chant +11 -0
  2. package/dist/agents/checks.js +326 -0
  3. package/dist/agents/discover.js +885 -0
  4. package/dist/agents/importer.js +17 -0
  5. package/dist/agents/index.js +12 -0
  6. package/dist/agents/types.js +19 -0
  7. package/dist/apply.js +151 -0
  8. package/dist/attrref.js +70 -0
  9. package/dist/audit/catalog.js +350 -0
  10. package/dist/audit/core.js +252 -0
  11. package/dist/audit/discover.js +633 -0
  12. package/dist/audit/fetch.js +666 -0
  13. package/dist/audit/lineage.js +91 -0
  14. package/dist/audit/nginx.js +366 -0
  15. package/dist/audit/prior-art.js +132 -0
  16. package/dist/audit/proof.js +321 -0
  17. package/dist/audit/report-html.js +194 -0
  18. package/dist/audit/report-model.js +198 -0
  19. package/dist/audit/report.js +102 -0
  20. package/dist/audit/rules-doc.js +144 -0
  21. package/dist/audit/secrets.js +405 -0
  22. package/dist/audit/terraform-state.js +140 -0
  23. package/dist/audit/wrangler.js +262 -0
  24. package/dist/behaviour-delta.js +401 -0
  25. package/dist/behaviour-engine.js +357 -0
  26. package/dist/behaviour-graph.js +83 -0
  27. package/dist/behaviour-http.js +188 -0
  28. package/dist/behaviour-kinds.js +172 -0
  29. package/dist/behaviour-overlay.js +50 -0
  30. package/dist/behaviour-predict.js +188 -0
  31. package/dist/behaviour-request.js +194 -0
  32. package/dist/behaviour.js +1325 -0
  33. package/dist/build-params.js +108 -0
  34. package/dist/build.js +668 -0
  35. package/dist/builder.js +44 -0
  36. package/dist/cdk/advise.js +30 -0
  37. package/dist/cdk/assembly.js +122 -0
  38. package/dist/cdk/graph.js +444 -0
  39. package/dist/cdk/tier-map.js +64 -0
  40. package/dist/cdk/types.js +24 -0
  41. package/dist/change-set.js +312 -0
  42. package/dist/child-project.js +21 -0
  43. package/dist/claimed-fields.js +135 -0
  44. package/dist/cli/build-options.js +70 -0
  45. package/dist/cli/build-params-cli.js +139 -0
  46. package/dist/cli/command-group.js +123 -0
  47. package/dist/cli/commands/audit-agents.js +326 -0
  48. package/dist/cli/commands/audit.js +571 -0
  49. package/dist/cli/commands/build.js +920 -0
  50. package/dist/cli/commands/carve-apply.js +153 -0
  51. package/dist/cli/commands/carve-bridge.js +201 -0
  52. package/dist/cli/commands/carve-emit.js +332 -0
  53. package/dist/cli/commands/carve-status.js +119 -0
  54. package/dist/cli/commands/carve.js +204 -0
  55. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  56. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  57. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  58. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  59. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  60. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  61. package/dist/cli/commands/check-lexicon.js +766 -0
  62. package/dist/cli/commands/describe.js +85 -0
  63. package/dist/cli/commands/diff.js +175 -0
  64. package/dist/cli/commands/doctor.js +350 -0
  65. package/dist/cli/commands/import-agents.js +155 -0
  66. package/dist/cli/commands/import.js +670 -0
  67. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  68. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  69. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  70. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  71. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  72. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  73. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  74. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  75. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  76. package/dist/cli/commands/init-lexicon.js +172 -0
  77. package/dist/cli/commands/init.js +381 -0
  78. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  79. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  80. package/dist/cli/commands/licenses.js +125 -0
  81. package/dist/cli/commands/lint.d.ts.map +1 -1
  82. package/dist/cli/commands/lint.js +948 -0
  83. package/dist/cli/commands/list.js +63 -0
  84. package/dist/cli/commands/migrate.d.ts.map +1 -1
  85. package/dist/cli/commands/migrate.js +423 -0
  86. package/dist/cli/commands/onboard.js +403 -0
  87. package/dist/cli/commands/pinned-upgrade.js +191 -0
  88. package/dist/cli/commands/update.js +194 -0
  89. package/dist/cli/commands/vendor.js +217 -0
  90. package/dist/cli/conflict-check.js +104 -0
  91. package/dist/cli/debug.js +8 -0
  92. package/dist/cli/format.js +104 -0
  93. package/dist/cli/handlers/build.js +267 -0
  94. package/dist/cli/handlers/carve-apply.js +30 -0
  95. package/dist/cli/handlers/carve-bridge.js +28 -0
  96. package/dist/cli/handlers/carve-emit.js +50 -0
  97. package/dist/cli/handlers/carve-status.js +26 -0
  98. package/dist/cli/handlers/carve.js +40 -0
  99. package/dist/cli/handlers/change-set.js +46 -0
  100. package/dist/cli/handlers/components.js +730 -0
  101. package/dist/cli/handlers/dev.js +113 -0
  102. package/dist/cli/handlers/emulator.js +233 -0
  103. package/dist/cli/handlers/explain.js +54 -0
  104. package/dist/cli/handlers/fan-out.js +422 -0
  105. package/dist/cli/handlers/gate-resume.js +275 -0
  106. package/dist/cli/handlers/generate.js +84 -0
  107. package/dist/cli/handlers/graph.js +969 -0
  108. package/dist/cli/handlers/init.js +102 -0
  109. package/dist/cli/handlers/lifecycle.js +1727 -0
  110. package/dist/cli/handlers/lint.js +62 -0
  111. package/dist/cli/handlers/migrate.js +48 -0
  112. package/dist/cli/handlers/misc.js +391 -0
  113. package/dist/cli/handlers/operator.js +1162 -0
  114. package/dist/cli/handlers/override-approve.js +102 -0
  115. package/dist/cli/handlers/pr.js +503 -0
  116. package/dist/cli/handlers/promote.js +342 -0
  117. package/dist/cli/handlers/run-generate.js +206 -0
  118. package/dist/cli/handlers/run-wave.js +66 -0
  119. package/dist/cli/handlers/run.js +1191 -0
  120. package/dist/cli/handlers/scenario.js +325 -0
  121. package/dist/cli/handlers/search.js +924 -0
  122. package/dist/cli/handlers/serve.js +32 -0
  123. package/dist/cli/handlers/vendor.js +154 -0
  124. package/dist/cli/index.js +3 -0
  125. package/dist/cli/is-entry-point.js +23 -0
  126. package/dist/cli/lsp/capabilities.js +28 -0
  127. package/dist/cli/lsp/diagnostics.js +34 -0
  128. package/dist/cli/lsp/server.js +329 -0
  129. package/dist/cli/main.d.ts.map +1 -1
  130. package/dist/cli/main.js +2540 -0
  131. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  132. package/dist/cli/mcp/op-tools.js +306 -0
  133. package/dist/cli/mcp/resource-handlers.js +258 -0
  134. package/dist/cli/mcp/resources/context.js +85 -0
  135. package/dist/cli/mcp/server.js +353 -0
  136. package/dist/cli/mcp/tools/build.js +111 -0
  137. package/dist/cli/mcp/tools/composites.js +95 -0
  138. package/dist/cli/mcp/tools/explain.js +166 -0
  139. package/dist/cli/mcp/tools/import.js +49 -0
  140. package/dist/cli/mcp/tools/lint.js +41 -0
  141. package/dist/cli/mcp/tools/scaffold.js +111 -0
  142. package/dist/cli/mcp/tools/search.js +112 -0
  143. package/dist/cli/mcp/types.js +1 -0
  144. package/dist/cli/mcp/workspace-plugins.js +91 -0
  145. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  146. package/dist/cli/mcp/workspace-tools.js +564 -0
  147. package/dist/cli/mcp-config.js +70 -0
  148. package/dist/cli/plugins.js +313 -0
  149. package/dist/cli/registry.js +23 -0
  150. package/dist/cli/reporters/stylish.js +329 -0
  151. package/dist/cli/version.js +15 -0
  152. package/dist/cli/watch.js +79 -0
  153. package/dist/codegen/bound-property-types.js +82 -0
  154. package/dist/codegen/coverage.js +119 -0
  155. package/dist/codegen/docs-file-markers.js +60 -0
  156. package/dist/codegen/docs-pages.js +115 -0
  157. package/dist/codegen/docs-rule-scanning.js +164 -0
  158. package/dist/codegen/docs-rules.js +76 -0
  159. package/dist/codegen/docs-sections.js +117 -0
  160. package/dist/codegen/docs-sidebar.js +65 -0
  161. package/dist/codegen/docs-types.js +4 -0
  162. package/dist/codegen/docs.js +356 -0
  163. package/dist/codegen/fetch.js +340 -0
  164. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  165. package/dist/codegen/generate-registry.js +71 -0
  166. package/dist/codegen/generate-runtime-index.js +56 -0
  167. package/dist/codegen/generate-typescript.js +119 -0
  168. package/dist/codegen/generate.js +115 -0
  169. package/dist/codegen/json-patch.js +141 -0
  170. package/dist/codegen/json-schema-to-ts.js +344 -0
  171. package/dist/codegen/json-schema.js +246 -0
  172. package/dist/codegen/lexicon-regen.js +412 -0
  173. package/dist/codegen/naming.js +217 -0
  174. package/dist/codegen/okf-lexicon.js +245 -0
  175. package/dist/codegen/package.js +150 -0
  176. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  177. package/dist/codegen/pinned-upgrade.js +494 -0
  178. package/dist/codegen/registry.js +60 -0
  179. package/dist/codegen/rehype-base-url.mjs +68 -0
  180. package/dist/codegen/rolling-upgrade.js +217 -0
  181. package/dist/codegen/surface-snapshot.js +537 -0
  182. package/dist/codegen/testdata/postgres-tags.json +242 -0
  183. package/dist/codegen/topo-sort.js +36 -0
  184. package/dist/codegen/typecheck.js +115 -0
  185. package/dist/codegen/validate.js +200 -0
  186. package/dist/codegen/version-bump.js +35 -0
  187. package/dist/components/auto-release.js +143 -0
  188. package/dist/components/builders.js +47 -0
  189. package/dist/components/capability-plugin-loader.js +175 -0
  190. package/dist/components/capability-plugin-schema.js +46 -0
  191. package/dist/components/capability-plugin.js +99 -0
  192. package/dist/components/capability.js +60 -0
  193. package/dist/components/changed-files.js +72 -0
  194. package/dist/components/cli-support.js +427 -0
  195. package/dist/components/component.js +120 -0
  196. package/dist/components/component.schema.json +271 -0
  197. package/dist/components/config-defaults.js +130 -0
  198. package/dist/components/deploy-units.js +60 -0
  199. package/dist/components/discover.d.ts.map +1 -1
  200. package/dist/components/discover.js +189 -0
  201. package/dist/components/driver-output.js +86 -0
  202. package/dist/components/driver.js +728 -0
  203. package/dist/components/fan-out-output.js +165 -0
  204. package/dist/components/fan-out-record.js +94 -0
  205. package/dist/components/fan-out-run.js +373 -0
  206. package/dist/components/fan-out-support.js +60 -0
  207. package/dist/components/fan-out.js +273 -0
  208. package/dist/components/gate-plan.js +41 -0
  209. package/dist/components/gated-wave-pipeline.js +46 -0
  210. package/dist/components/index.js +24 -0
  211. package/dist/components/layers.js +28 -0
  212. package/dist/components/manifest-persistence.js +108 -0
  213. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  214. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  215. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  216. package/dist/components/pilots/lambda.pilot.js +52 -0
  217. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  218. package/dist/components/pilots/project.js +12 -0
  219. package/dist/components/pr-pipeline.js +134 -0
  220. package/dist/components/pr-run.js +363 -0
  221. package/dist/components/presets/ecs-fargate.js +72 -0
  222. package/dist/components/presets/index.js +28 -0
  223. package/dist/components/presets/lambda.js +34 -0
  224. package/dist/components/presets/single-host-compose.js +41 -0
  225. package/dist/components/promote.js +549 -0
  226. package/dist/components/registry.js +34 -0
  227. package/dist/components/run-progress.js +33 -0
  228. package/dist/components/sandbox/driver.d.ts.map +1 -1
  229. package/dist/components/sandbox/driver.js +93 -0
  230. package/dist/components/sandbox/run.js +115 -0
  231. package/dist/components/starter-plugin.js +104 -0
  232. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  233. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  234. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  235. package/dist/components/verbs/bom-writer.js +287 -0
  236. package/dist/components/verbs/build-archive.js +188 -0
  237. package/dist/components/verbs/build.js +142 -0
  238. package/dist/components/verbs/cloud-executor.js +110 -0
  239. package/dist/components/verbs/component-bom.js +125 -0
  240. package/dist/components/verbs/ensure-secret.js +50 -0
  241. package/dist/components/verbs/index.js +61 -0
  242. package/dist/components/verbs/license-policy.js +75 -0
  243. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  244. package/dist/components/verbs/process-runner.js +78 -0
  245. package/dist/components/verbs/r2-sync.js +93 -0
  246. package/dist/components/verbs/reproducibility.js +62 -0
  247. package/dist/components/verbs/run-agent.js +577 -0
  248. package/dist/components/verbs/sbom-generator.js +119 -0
  249. package/dist/components/verbs/sbom.js +97 -0
  250. package/dist/components/verbs/shell.js +32 -0
  251. package/dist/components/verbs/sign.js +221 -0
  252. package/dist/components/verbs/stub.js +28 -0
  253. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  254. package/dist/components/verbs/verify.js +112 -0
  255. package/dist/components/verbs/vex.js +131 -0
  256. package/dist/components/verbs/vuln-gate.js +152 -0
  257. package/dist/components/verbs/vuln-scan.js +288 -0
  258. package/dist/components/verbs/wait-verify.js +106 -0
  259. package/dist/components/verbs/wrangler.js +179 -0
  260. package/dist/components/wave-plan.js +102 -0
  261. package/dist/composite.js +305 -0
  262. package/dist/config-import.d.ts.map +1 -1
  263. package/dist/config-import.js +22 -0
  264. package/dist/config-sandbox.js +122 -0
  265. package/dist/config-static.js +206 -0
  266. package/dist/config.js +605 -0
  267. package/dist/content-digest.js +23 -0
  268. package/dist/declarable.js +114 -0
  269. package/dist/deep-observation.js +437 -0
  270. package/dist/detectLexicon.js +54 -0
  271. package/dist/discovery/cache.js +70 -0
  272. package/dist/discovery/collect.js +208 -0
  273. package/dist/discovery/cycles.js +95 -0
  274. package/dist/discovery/entity-wire-codec.js +391 -0
  275. package/dist/discovery/entity-wire.js +42 -0
  276. package/dist/discovery/files.js +121 -0
  277. package/dist/discovery/fold-import.d.ts.map +1 -1
  278. package/dist/discovery/fold-import.js +4178 -0
  279. package/dist/discovery/fold-rank.js +292 -0
  280. package/dist/discovery/graph.js +115 -0
  281. package/dist/discovery/import.d.ts.map +1 -1
  282. package/dist/discovery/import.js +65 -0
  283. package/dist/discovery/index.js +333 -0
  284. package/dist/discovery/param-deps.js +487 -0
  285. package/dist/discovery/resolve.js +39 -0
  286. package/dist/discovery/sandbox/bundle.js +214 -0
  287. package/dist/discovery/sandbox/child-errors.js +26 -0
  288. package/dist/discovery/sandbox/config-run.js +100 -0
  289. package/dist/discovery/sandbox/config-wire.js +183 -0
  290. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  291. package/dist/discovery/sandbox/driver.js +333 -0
  292. package/dist/discovery/sandbox/fork.js +229 -0
  293. package/dist/discovery/sandbox/policy-run.js +142 -0
  294. package/dist/discovery/sandbox/policy-wire.js +152 -0
  295. package/dist/discovery/sandbox/run.js +77 -0
  296. package/dist/discovery/specifier-resolve.js +320 -0
  297. package/dist/discovery/walk.js +284 -0
  298. package/dist/effect-receipt.js +340 -0
  299. package/dist/env.js +55 -0
  300. package/dist/errors.js +62 -0
  301. package/dist/fold/fold.js +1434 -0
  302. package/dist/fold/foldable-helpers.js +229 -0
  303. package/dist/fold/subset.js +696 -0
  304. package/dist/fold-provenance.js +414 -0
  305. package/dist/gate-decision.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. 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
+ }