@intentius/chant 0.124.13 → 0.124.14

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