@intentius/chant 0.124.13 → 0.124.15

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 (991) 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.d.ts +6 -0
  35. package/dist/build.d.ts.map +1 -1
  36. package/dist/build.js +669 -0
  37. package/dist/builder.js +44 -0
  38. package/dist/cdk/advise.js +30 -0
  39. package/dist/cdk/assembly.js +122 -0
  40. package/dist/cdk/graph.js +444 -0
  41. package/dist/cdk/tier-map.js +64 -0
  42. package/dist/cdk/types.js +24 -0
  43. package/dist/change-set.d.ts +24 -2
  44. package/dist/change-set.d.ts.map +1 -1
  45. package/dist/change-set.js +361 -0
  46. package/dist/child-project.js +21 -0
  47. package/dist/ci-jobs.d.ts +227 -0
  48. package/dist/ci-jobs.d.ts.map +1 -0
  49. package/dist/ci-jobs.js +448 -0
  50. package/dist/claimed-fields.js +135 -0
  51. package/dist/cli/build-options.js +70 -0
  52. package/dist/cli/build-params-cli.js +139 -0
  53. package/dist/cli/command-group.js +123 -0
  54. package/dist/cli/commands/audit-agents.js +326 -0
  55. package/dist/cli/commands/audit.js +571 -0
  56. package/dist/cli/commands/build.js +920 -0
  57. package/dist/cli/commands/carve-apply.js +153 -0
  58. package/dist/cli/commands/carve-bridge.js +201 -0
  59. package/dist/cli/commands/carve-emit.js +332 -0
  60. package/dist/cli/commands/carve-status.js +119 -0
  61. package/dist/cli/commands/carve.js +204 -0
  62. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  63. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  64. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  65. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  66. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  67. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  68. package/dist/cli/commands/check-lexicon.js +766 -0
  69. package/dist/cli/commands/describe.js +85 -0
  70. package/dist/cli/commands/diff.js +175 -0
  71. package/dist/cli/commands/doctor.js +350 -0
  72. package/dist/cli/commands/import-agents.js +155 -0
  73. package/dist/cli/commands/import.js +670 -0
  74. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  75. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  76. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  77. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  78. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  79. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  80. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  81. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  82. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  83. package/dist/cli/commands/init-lexicon.js +172 -0
  84. package/dist/cli/commands/init.js +381 -0
  85. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  86. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  87. package/dist/cli/commands/licenses.js +125 -0
  88. package/dist/cli/commands/lint.d.ts.map +1 -1
  89. package/dist/cli/commands/lint.js +948 -0
  90. package/dist/cli/commands/list.js +63 -0
  91. package/dist/cli/commands/migrate.d.ts.map +1 -1
  92. package/dist/cli/commands/migrate.js +423 -0
  93. package/dist/cli/commands/onboard.js +403 -0
  94. package/dist/cli/commands/pinned-upgrade.js +191 -0
  95. package/dist/cli/commands/update.js +194 -0
  96. package/dist/cli/commands/vendor.js +217 -0
  97. package/dist/cli/conflict-check.js +104 -0
  98. package/dist/cli/debug.js +8 -0
  99. package/dist/cli/format.js +104 -0
  100. package/dist/cli/handlers/build.js +267 -0
  101. package/dist/cli/handlers/carve-apply.js +30 -0
  102. package/dist/cli/handlers/carve-bridge.js +28 -0
  103. package/dist/cli/handlers/carve-emit.js +50 -0
  104. package/dist/cli/handlers/carve-status.js +26 -0
  105. package/dist/cli/handlers/carve.js +40 -0
  106. package/dist/cli/handlers/change-set.js +46 -0
  107. package/dist/cli/handlers/components.js +730 -0
  108. package/dist/cli/handlers/dev.js +113 -0
  109. package/dist/cli/handlers/emulator.js +233 -0
  110. package/dist/cli/handlers/explain.js +54 -0
  111. package/dist/cli/handlers/fan-out.js +422 -0
  112. package/dist/cli/handlers/gate-resume.js +275 -0
  113. package/dist/cli/handlers/generate.js +84 -0
  114. package/dist/cli/handlers/graph.js +969 -0
  115. package/dist/cli/handlers/init.js +102 -0
  116. package/dist/cli/handlers/lifecycle.js +1727 -0
  117. package/dist/cli/handlers/lint.js +62 -0
  118. package/dist/cli/handlers/migrate.js +48 -0
  119. package/dist/cli/handlers/misc.js +391 -0
  120. package/dist/cli/handlers/operator.js +1162 -0
  121. package/dist/cli/handlers/override-approve.js +102 -0
  122. package/dist/cli/handlers/pr.js +503 -0
  123. package/dist/cli/handlers/promote.js +342 -0
  124. package/dist/cli/handlers/run-generate.js +206 -0
  125. package/dist/cli/handlers/run-wave.js +66 -0
  126. package/dist/cli/handlers/run.js +1191 -0
  127. package/dist/cli/handlers/scenario.js +325 -0
  128. package/dist/cli/handlers/search.js +924 -0
  129. package/dist/cli/handlers/serve.js +32 -0
  130. package/dist/cli/handlers/vendor.js +154 -0
  131. package/dist/cli/index.js +3 -0
  132. package/dist/cli/is-entry-point.js +23 -0
  133. package/dist/cli/lsp/capabilities.js +28 -0
  134. package/dist/cli/lsp/diagnostics.js +34 -0
  135. package/dist/cli/lsp/server.js +329 -0
  136. package/dist/cli/main.d.ts.map +1 -1
  137. package/dist/cli/main.js +2540 -0
  138. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  139. package/dist/cli/mcp/op-tools.js +306 -0
  140. package/dist/cli/mcp/resource-handlers.js +258 -0
  141. package/dist/cli/mcp/resources/context.js +85 -0
  142. package/dist/cli/mcp/server.js +353 -0
  143. package/dist/cli/mcp/tools/build.js +111 -0
  144. package/dist/cli/mcp/tools/composites.js +95 -0
  145. package/dist/cli/mcp/tools/explain.js +166 -0
  146. package/dist/cli/mcp/tools/import.js +49 -0
  147. package/dist/cli/mcp/tools/lint.js +41 -0
  148. package/dist/cli/mcp/tools/scaffold.js +111 -0
  149. package/dist/cli/mcp/tools/search.js +112 -0
  150. package/dist/cli/mcp/types.js +1 -0
  151. package/dist/cli/mcp/workspace-plugins.js +91 -0
  152. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  153. package/dist/cli/mcp/workspace-tools.js +564 -0
  154. package/dist/cli/mcp-config.js +70 -0
  155. package/dist/cli/plugins.js +313 -0
  156. package/dist/cli/registry.js +23 -0
  157. package/dist/cli/reporters/stylish.js +329 -0
  158. package/dist/cli/version.js +15 -0
  159. package/dist/cli/watch.js +79 -0
  160. package/dist/codegen/bound-property-types.js +82 -0
  161. package/dist/codegen/coverage.js +119 -0
  162. package/dist/codegen/docs-file-markers.js +60 -0
  163. package/dist/codegen/docs-pages.js +115 -0
  164. package/dist/codegen/docs-rule-scanning.js +164 -0
  165. package/dist/codegen/docs-rules.js +76 -0
  166. package/dist/codegen/docs-sections.js +117 -0
  167. package/dist/codegen/docs-sidebar.js +65 -0
  168. package/dist/codegen/docs-types.js +4 -0
  169. package/dist/codegen/docs.js +356 -0
  170. package/dist/codegen/fetch.js +340 -0
  171. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  172. package/dist/codegen/generate-registry.js +71 -0
  173. package/dist/codegen/generate-runtime-index.js +56 -0
  174. package/dist/codegen/generate-typescript.js +119 -0
  175. package/dist/codegen/generate.js +115 -0
  176. package/dist/codegen/json-patch.js +141 -0
  177. package/dist/codegen/json-schema-to-ts.js +344 -0
  178. package/dist/codegen/json-schema.js +246 -0
  179. package/dist/codegen/lexicon-regen.js +412 -0
  180. package/dist/codegen/naming.js +217 -0
  181. package/dist/codegen/okf-lexicon.js +245 -0
  182. package/dist/codegen/package.js +150 -0
  183. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  184. package/dist/codegen/pinned-upgrade.js +494 -0
  185. package/dist/codegen/registry.js +60 -0
  186. package/dist/codegen/rehype-base-url.mjs +68 -0
  187. package/dist/codegen/rolling-upgrade.js +217 -0
  188. package/dist/codegen/surface-snapshot.js +537 -0
  189. package/dist/codegen/testdata/postgres-tags.json +242 -0
  190. package/dist/codegen/topo-sort.js +36 -0
  191. package/dist/codegen/typecheck.js +115 -0
  192. package/dist/codegen/validate.js +200 -0
  193. package/dist/codegen/version-bump.js +35 -0
  194. package/dist/components/auto-release.js +143 -0
  195. package/dist/components/builders.js +47 -0
  196. package/dist/components/capability-plugin-loader.js +175 -0
  197. package/dist/components/capability-plugin-schema.js +46 -0
  198. package/dist/components/capability-plugin.js +99 -0
  199. package/dist/components/capability.js +60 -0
  200. package/dist/components/changed-files.js +72 -0
  201. package/dist/components/cli-support.js +427 -0
  202. package/dist/components/component.js +120 -0
  203. package/dist/components/component.schema.json +271 -0
  204. package/dist/components/config-defaults.js +130 -0
  205. package/dist/components/deploy-units.js +60 -0
  206. package/dist/components/discover.d.ts.map +1 -1
  207. package/dist/components/discover.js +189 -0
  208. package/dist/components/driver-output.js +86 -0
  209. package/dist/components/driver.js +728 -0
  210. package/dist/components/fan-out-output.js +165 -0
  211. package/dist/components/fan-out-record.js +94 -0
  212. package/dist/components/fan-out-run.js +373 -0
  213. package/dist/components/fan-out-support.js +60 -0
  214. package/dist/components/fan-out.js +273 -0
  215. package/dist/components/gate-plan.js +41 -0
  216. package/dist/components/gated-wave-pipeline.js +46 -0
  217. package/dist/components/index.js +24 -0
  218. package/dist/components/layers.js +28 -0
  219. package/dist/components/manifest-persistence.js +108 -0
  220. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  221. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  222. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  223. package/dist/components/pilots/lambda.pilot.js +52 -0
  224. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  225. package/dist/components/pilots/project.js +12 -0
  226. package/dist/components/pr-pipeline.d.ts.map +1 -1
  227. package/dist/components/pr-pipeline.js +135 -0
  228. package/dist/components/pr-run.js +363 -0
  229. package/dist/components/presets/ecs-fargate.js +72 -0
  230. package/dist/components/presets/index.js +28 -0
  231. package/dist/components/presets/lambda.js +34 -0
  232. package/dist/components/presets/single-host-compose.js +41 -0
  233. package/dist/components/promote.js +549 -0
  234. package/dist/components/registry.js +34 -0
  235. package/dist/components/run-progress.js +33 -0
  236. package/dist/components/sandbox/driver.d.ts.map +1 -1
  237. package/dist/components/sandbox/driver.js +93 -0
  238. package/dist/components/sandbox/run.js +115 -0
  239. package/dist/components/starter-plugin.js +104 -0
  240. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  241. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  242. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  243. package/dist/components/verbs/bom-writer.js +287 -0
  244. package/dist/components/verbs/build-archive.js +188 -0
  245. package/dist/components/verbs/build.js +142 -0
  246. package/dist/components/verbs/cloud-executor.js +110 -0
  247. package/dist/components/verbs/component-bom.js +125 -0
  248. package/dist/components/verbs/ensure-secret.js +50 -0
  249. package/dist/components/verbs/index.js +61 -0
  250. package/dist/components/verbs/license-policy.js +75 -0
  251. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  252. package/dist/components/verbs/process-runner.js +78 -0
  253. package/dist/components/verbs/r2-sync.js +93 -0
  254. package/dist/components/verbs/reproducibility.js +62 -0
  255. package/dist/components/verbs/run-agent.js +577 -0
  256. package/dist/components/verbs/sbom-generator.js +119 -0
  257. package/dist/components/verbs/sbom.js +97 -0
  258. package/dist/components/verbs/shell.js +32 -0
  259. package/dist/components/verbs/sign.js +221 -0
  260. package/dist/components/verbs/stub.js +28 -0
  261. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  262. package/dist/components/verbs/verify.js +112 -0
  263. package/dist/components/verbs/vex.js +131 -0
  264. package/dist/components/verbs/vuln-gate.js +152 -0
  265. package/dist/components/verbs/vuln-scan.js +288 -0
  266. package/dist/components/verbs/wait-verify.js +106 -0
  267. package/dist/components/verbs/wrangler.js +179 -0
  268. package/dist/components/wave-plan.js +102 -0
  269. package/dist/composite.d.ts +10 -2
  270. package/dist/composite.d.ts.map +1 -1
  271. package/dist/composite.js +313 -0
  272. package/dist/config-import.d.ts.map +1 -1
  273. package/dist/config-import.js +22 -0
  274. package/dist/config-sandbox.js +122 -0
  275. package/dist/config-static.js +206 -0
  276. package/dist/config.js +605 -0
  277. package/dist/content-digest.js +23 -0
  278. package/dist/declarable.js +114 -0
  279. package/dist/deep-observation.js +437 -0
  280. package/dist/detectLexicon.js +54 -0
  281. package/dist/discovery/cache.js +70 -0
  282. package/dist/discovery/collect.d.ts +2 -1
  283. package/dist/discovery/collect.d.ts.map +1 -1
  284. package/dist/discovery/collect.js +223 -0
  285. package/dist/discovery/cycles.js +95 -0
  286. package/dist/discovery/entity-wire-codec.js +391 -0
  287. package/dist/discovery/entity-wire.js +42 -0
  288. package/dist/discovery/files.js +121 -0
  289. package/dist/discovery/fold-import.d.ts.map +1 -1
  290. package/dist/discovery/fold-import.js +4073 -0
  291. package/dist/discovery/fold-rank.js +292 -0
  292. package/dist/discovery/graph.js +115 -0
  293. package/dist/discovery/host-composite.d.ts +35 -0
  294. package/dist/discovery/host-composite.d.ts.map +1 -0
  295. package/dist/discovery/host-composite.js +93 -0
  296. package/dist/discovery/import.d.ts.map +1 -1
  297. package/dist/discovery/import.js +65 -0
  298. package/dist/discovery/index.d.ts +9 -0
  299. package/dist/discovery/index.d.ts.map +1 -1
  300. package/dist/discovery/index.js +333 -0
  301. package/dist/discovery/param-deps.js +487 -0
  302. package/dist/discovery/resolve.js +39 -0
  303. package/dist/discovery/sandbox/bundle.js +214 -0
  304. package/dist/discovery/sandbox/child-errors.js +26 -0
  305. package/dist/discovery/sandbox/config-run.js +100 -0
  306. package/dist/discovery/sandbox/config-wire.js +183 -0
  307. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  308. package/dist/discovery/sandbox/driver.js +333 -0
  309. package/dist/discovery/sandbox/fork.js +229 -0
  310. package/dist/discovery/sandbox/policy-run.js +142 -0
  311. package/dist/discovery/sandbox/policy-wire.js +152 -0
  312. package/dist/discovery/sandbox/run.js +77 -0
  313. package/dist/discovery/specifier-resolve.js +320 -0
  314. package/dist/discovery/walk.js +284 -0
  315. package/dist/effect-receipt.js +340 -0
  316. package/dist/env.js +55 -0
  317. package/dist/errors.js +62 -0
  318. package/dist/fold/fold.js +1434 -0
  319. package/dist/fold/foldable-helpers.js +229 -0
  320. package/dist/fold/subset.js +696 -0
  321. package/dist/fold-provenance.js +414 -0
  322. package/dist/gate-decision.d.ts +20 -9
  323. package/dist/gate-decision.d.ts.map +1 -1
  324. package/dist/gate-decision.js +313 -0
  325. package/dist/gate-resume-run.js +154 -0
  326. package/dist/gated-waves.js +165 -0
  327. package/dist/governance.js +43 -0
  328. package/dist/graph-declared.js +45 -0
  329. package/dist/graph-detail.js +207 -0
  330. package/dist/graph-dot.js +54 -0
  331. package/dist/graph-effective.js +107 -0
  332. package/dist/graph-ir.js +623 -0
  333. package/dist/graph-layout.js +184 -0
  334. package/dist/graph-lens.js +105 -0
  335. package/dist/graph-mermaid.js +83 -0
  336. package/dist/graph-ops.js +39 -0
  337. package/dist/graph-refs.js +156 -0
  338. package/dist/held-elsewhere.js +87 -0
  339. package/dist/identity.js +251 -0
  340. package/dist/import/base-parser.js +34 -0
  341. package/dist/import/embedded.js +255 -0
  342. package/dist/import/generator.js +1 -0
  343. package/dist/import/ir-utils.js +85 -0
  344. package/dist/import/parser-options.js +45 -0
  345. package/dist/import/parser.js +1 -0
  346. package/dist/index.js +118 -0
  347. package/dist/intrinsic-interpolation.js +73 -0
  348. package/dist/intrinsic.js +31 -0
  349. package/dist/join-key.js +35 -0
  350. package/dist/kubectl-context.js +150 -0
  351. package/dist/lexicon-config.js +58 -0
  352. package/dist/lexicon-integrity.js +47 -0
  353. package/dist/lexicon-manifest.js +70 -0
  354. package/dist/lexicon-module.d.ts.map +1 -1
  355. package/dist/lexicon-module.js +241 -0
  356. package/dist/lexicon-output.js +218 -0
  357. package/dist/lexicon-plugin-helpers.js +104 -0
  358. package/dist/lexicon-schema.js +136 -0
  359. package/dist/lexicon.js +130 -0
  360. package/dist/lifecycle/affected.js +224 -0
  361. package/dist/lifecycle/assert-live.js +110 -0
  362. package/dist/lifecycle/build-ledger-store.js +160 -0
  363. package/dist/lifecycle/build-ledger.js +155 -0
  364. package/dist/lifecycle/change-set.js +356 -0
  365. package/dist/lifecycle/converge-ledger.js +161 -0
  366. package/dist/lifecycle/deep-diff.js +233 -0
  367. package/dist/lifecycle/deep-observe.js +147 -0
  368. package/dist/lifecycle/digest.js +143 -0
  369. package/dist/lifecycle/disruption.js +135 -0
  370. package/dist/lifecycle/gate-applied.js +113 -0
  371. package/dist/lifecycle/gate-audit.d.ts +69 -2
  372. package/dist/lifecycle/gate-audit.d.ts.map +1 -1
  373. package/dist/lifecycle/gate-audit.js +415 -0
  374. package/dist/lifecycle/gate-ledger-select.js +89 -0
  375. package/dist/lifecycle/gate-ledger.d.ts +24 -0
  376. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  377. package/dist/lifecycle/gate-ledger.js +201 -0
  378. package/dist/lifecycle/gate-origin.js +117 -0
  379. package/dist/lifecycle/gate-pending.js +58 -0
  380. package/dist/lifecycle/git.js +1182 -0
  381. package/dist/lifecycle/identity.js +58 -0
  382. package/dist/lifecycle/index.js +26 -0
  383. package/dist/lifecycle/lease.js +283 -0
  384. package/dist/lifecycle/ledger-port.js +1 -0
  385. package/dist/lifecycle/legacy-digest.js +91 -0
  386. package/dist/lifecycle/live-diff.js +274 -0
  387. package/dist/lifecycle/local-note.js +15 -0
  388. package/dist/lifecycle/member-ledger.js +122 -0
  389. package/dist/lifecycle/observation-baseline.js +155 -0
  390. package/dist/lifecycle/observe.js +375 -0
  391. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  392. package/dist/lifecycle/override-ledger.js +54 -0
  393. package/dist/lifecycle/plan-digest.js +110 -0
  394. package/dist/lifecycle/plan-ledger.js +129 -0
  395. package/dist/lifecycle/receipt-plan.js +192 -0
  396. package/dist/lifecycle/release-ledger.js +155 -0
  397. package/dist/lifecycle/release-read.js +64 -0
  398. package/dist/lifecycle/replay.js +193 -0
  399. package/dist/lifecycle/rollback.js +102 -0
  400. package/dist/lifecycle/run-ledger.js +183 -0
  401. package/dist/lifecycle/scenario-eval.js +204 -0
  402. package/dist/lifecycle/scenario.js +214 -0
  403. package/dist/lifecycle/snapshot.js +239 -0
  404. package/dist/lifecycle/status.js +447 -0
  405. package/dist/lifecycle/symptoms.js +117 -0
  406. package/dist/lifecycle/teardown.js +255 -0
  407. package/dist/lifecycle/types.js +1 -0
  408. package/dist/lifecycle/unobserved-gate.js +33 -0
  409. package/dist/lifecycle/wave-plans.js +68 -0
  410. package/dist/lifecycle/work-item-id.js +36 -0
  411. package/dist/lifecycle/work-lease.js +393 -0
  412. package/dist/lint/component-checks.js +87 -0
  413. package/dist/lint/config.js +483 -0
  414. package/dist/lint/declarative.js +122 -0
  415. package/dist/lint/discover.d.ts.map +1 -1
  416. package/dist/lint/discover.js +138 -0
  417. package/dist/lint/engine.js +246 -0
  418. package/dist/lint/knowledge-checks.js +64 -0
  419. package/dist/lint/named-checks.js +22 -0
  420. package/dist/lint/output-checks.js +87 -0
  421. package/dist/lint/output-docs.js +163 -0
  422. package/dist/lint/parser.js +33 -0
  423. package/dist/lint/pipeline-change-gate.js +70 -0
  424. package/dist/lint/policy-import.d.ts +1 -1
  425. package/dist/lint/policy-import.d.ts.map +1 -1
  426. package/dist/lint/policy-import.js +62 -0
  427. package/dist/lint/policy-sandbox.js +86 -0
  428. package/dist/lint/policy.js +122 -0
  429. package/dist/lint/post-synth.js +87 -0
  430. package/dist/lint/presets/relaxed.json +26 -0
  431. package/dist/lint/presets/strict.json +24 -24
  432. package/dist/lint/receipt-checks.js +83 -0
  433. package/dist/lint/rule-loader.d.ts.map +1 -1
  434. package/dist/lint/rule-loader.js +89 -0
  435. package/dist/lint/rule-registry.js +86 -0
  436. package/dist/lint/rule.js +1 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  441. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  442. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  443. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  444. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  445. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  446. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  447. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  448. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  449. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  450. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  451. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  452. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  453. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  454. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  455. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  456. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  457. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  458. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  459. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  460. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  461. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  462. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  463. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  464. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  465. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  466. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  467. package/dist/lint/rules/comp/index.js +33 -0
  468. package/dist/lint/rules/comp/support.js +129 -0
  469. package/dist/lint/rules/composite-scope.js +51 -0
  470. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  471. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  472. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  473. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  474. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  475. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  476. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  477. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  478. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  479. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  480. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  481. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  482. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  483. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  484. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  485. package/dist/lint/rules/export-required.js +115 -0
  486. package/dist/lint/rules/file-declarable-limit.js +88 -0
  487. package/dist/lint/rules/flat-declarations.js +62 -0
  488. package/dist/lint/rules/index.js +90 -0
  489. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  490. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  491. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  492. package/dist/lint/rules/no-string-ref.js +59 -0
  493. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  494. package/dist/lint/rules/no-unused-declarable.js +142 -0
  495. package/dist/lint/rules/op/index.js +28 -0
  496. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  497. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  498. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  499. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  500. package/dist/lint/rules/op/support.js +11 -0
  501. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  502. package/dist/lint/rules/property-kind.js +56 -0
  503. package/dist/lint/rules/single-concern-file.js +71 -0
  504. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  505. package/dist/lint/selectors.js +168 -0
  506. package/dist/lint/suppressions.js +129 -0
  507. package/dist/lint/typescript.js +17 -0
  508. package/dist/live-endpoint.js +113 -0
  509. package/dist/live-read-session.js +76 -0
  510. package/dist/lsp/lexicon-providers.js +163 -0
  511. package/dist/lsp/types.js +5 -0
  512. package/dist/managed-fields.js +293 -0
  513. package/dist/mcp/types.js +4 -0
  514. package/dist/notify-verify.js +0 -1
  515. package/dist/notify.js +0 -1
  516. package/dist/notify.schema.json +72 -0
  517. package/dist/observation.js +266 -0
  518. package/dist/okf-read.js +134 -0
  519. package/dist/okf.js +275 -0
  520. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  521. package/dist/op/activities/activity-contracts.d.ts +1 -1
  522. package/dist/op/activities/activity-contracts.js +313 -0
  523. package/dist/op/activities/apply.js +582 -0
  524. package/dist/op/activities/build.js +18 -0
  525. package/dist/op/activities/change-coverage.js +40 -0
  526. package/dist/op/activities/change-set.d.ts +8 -3
  527. package/dist/op/activities/change-set.d.ts.map +1 -1
  528. package/dist/op/activities/change-set.js +67 -0
  529. package/dist/op/activities/converge.js +492 -0
  530. package/dist/op/activities/decide.js +211 -0
  531. package/dist/op/activities/env-teardown.js +110 -0
  532. package/dist/op/activities/factory.js +591 -0
  533. package/dist/op/activities/forge-pull-request.js +82 -0
  534. package/dist/op/activities/gh-host.js +78 -0
  535. package/dist/op/activities/guard-validate.js +165 -0
  536. package/dist/op/activities/http-check.js +40 -0
  537. package/dist/op/activities/index.js +59 -0
  538. package/dist/op/activities/lexicon-upgrade.js +629 -0
  539. package/dist/op/activities/lifecycle.js +109 -0
  540. package/dist/op/activities/pipeline-audit.js +147 -0
  541. package/dist/op/activities/policy.js +26 -0
  542. package/dist/op/activities/predict-behaviour.js +341 -0
  543. package/dist/op/activities/propose-upgrade.js +165 -0
  544. package/dist/op/activities/reconcile.d.ts +28 -16
  545. package/dist/op/activities/reconcile.d.ts.map +1 -1
  546. package/dist/op/activities/reconcile.js +1011 -0
  547. package/dist/op/activities/shell.js +118 -0
  548. package/dist/op/activities/source-release.js +97 -0
  549. package/dist/op/activities/source-rollback.js +165 -0
  550. package/dist/op/activities/teardown.js +17 -0
  551. package/dist/op/activities/util.js +6 -0
  552. package/dist/op/activities/wait.js +51 -0
  553. package/dist/op/activities/work-evidence.js +35 -0
  554. package/dist/op/activities/workflow-audit.js +133 -0
  555. package/dist/op/activity-contract-registry.js +106 -0
  556. package/dist/op/activity-contract.js +232 -0
  557. package/dist/op/activity-failure.js +31 -0
  558. package/dist/op/activity-profiles.js +129 -0
  559. package/dist/op/activity-registry.js +105 -0
  560. package/dist/op/activity-runtime.js +28 -0
  561. package/dist/op/builders.d.ts +1 -1
  562. package/dist/op/builders.d.ts.map +1 -1
  563. package/dist/op/builders.js +801 -0
  564. package/dist/op/change-signal.js +118 -0
  565. package/dist/op/composites/apply-op.js +151 -0
  566. package/dist/op/composites/behaviour-op.js +65 -0
  567. package/dist/op/composites/converge-op.js +141 -0
  568. package/dist/op/composites/index.js +19 -0
  569. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  570. package/dist/op/composites/pipeline-audit-op.js +50 -0
  571. package/dist/op/composites/reconcile-op.js +84 -0
  572. package/dist/op/composites/watch-op.js +69 -0
  573. package/dist/op/composites/workflow-audit-op.js +57 -0
  574. package/dist/op/converge-rule.js +205 -0
  575. package/dist/op/cron.js +146 -0
  576. package/dist/op/decide-backend.js +181 -0
  577. package/dist/op/decide-config.js +68 -0
  578. package/dist/op/decide-read-inputs.js +141 -0
  579. package/dist/op/discover.d.ts.map +1 -1
  580. package/dist/op/discover.js +213 -0
  581. package/dist/op/duration.js +21 -0
  582. package/dist/op/emulator-freshness.js +80 -0
  583. package/dist/op/emulator-lifecycle.js +269 -0
  584. package/dist/op/factory.js +83 -0
  585. package/dist/op/gate-approval.js +172 -0
  586. package/dist/op/gate-name.js +86 -0
  587. package/dist/op/gate-plan-context.js +167 -0
  588. package/dist/op/gate-point-run.js +67 -0
  589. package/dist/op/gate-point.js +111 -0
  590. package/dist/op/gate-resume-plan.js +155 -0
  591. package/dist/op/gate-resume.js +31 -0
  592. package/dist/op/gate-review.js +290 -0
  593. package/dist/op/gate-run-locator.js +85 -0
  594. package/dist/op/gate-summary.js +100 -0
  595. package/dist/op/gate-wait.js +56 -0
  596. package/dist/op/gate.js +449 -0
  597. package/dist/op/generate-pipeline.js +124 -0
  598. package/dist/op/index.js +51 -0
  599. package/dist/op/lifecycle-receipt-store.js +45 -0
  600. package/dist/op/local-executor.js +1164 -0
  601. package/dist/op/local-output.js +140 -0
  602. package/dist/op/op-ir.js +317 -0
  603. package/dist/op/op-verb-class.js +131 -0
  604. package/dist/op/op-waves-notify.js +136 -0
  605. package/dist/op/op-waves-run.d.ts +1 -1
  606. package/dist/op/op-waves-run.d.ts.map +1 -1
  607. package/dist/op/op-waves-run.js +1657 -0
  608. package/dist/op/op-waves.js +409 -0
  609. package/dist/op/operator.js +743 -0
  610. package/dist/op/receipt-store.js +94 -0
  611. package/dist/op/resource.js +23 -0
  612. package/dist/op/run-context.js +28 -0
  613. package/dist/op/run-live.js +256 -0
  614. package/dist/op/runtime.js +21 -0
  615. package/dist/op/runtimes/local.js +195 -0
  616. package/dist/op/source-archive.js +131 -0
  617. package/dist/op/step-output-ref.js +397 -0
  618. package/dist/op/steward-beside.js +169 -0
  619. package/dist/op/steward-points.js +138 -0
  620. package/dist/op/steward-turn.js +59 -0
  621. package/dist/op/steward.js +317 -0
  622. package/dist/op/types.js +25 -0
  623. package/dist/op/work-lease-decl.js +81 -0
  624. package/dist/op/work-lease-run.js +393 -0
  625. package/dist/override-gate.js +284 -0
  626. package/dist/owner-chain.js +74 -0
  627. package/dist/ownership.js +92 -0
  628. package/dist/params.js +61 -0
  629. package/dist/plan-summary.js +711 -0
  630. package/dist/point-decision.js +211 -0
  631. package/dist/pr-forge.js +810 -0
  632. package/dist/pr-loop.js +203 -0
  633. package/dist/project-codegen.js +191 -0
  634. package/dist/project-root.js +74 -0
  635. package/dist/project-validation.js +50 -0
  636. package/dist/provenance.js +157 -0
  637. package/dist/pseudo-parameter.js +40 -0
  638. package/dist/reconcile.js +450 -0
  639. package/dist/resource-attributes.js +33 -0
  640. package/dist/runtime-adapter.js +77 -0
  641. package/dist/runtime.js +66 -0
  642. package/dist/secret-materialization.js +153 -0
  643. package/dist/secret-provenance.js +250 -0
  644. package/dist/serializer-walker.js +112 -0
  645. package/dist/serializer.js +1 -0
  646. package/dist/sort.js +45 -0
  647. package/dist/stack-output.js +115 -0
  648. package/dist/telemetry-attribution.js +149 -0
  649. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  650. package/dist/terraform/adopt-state.js +40 -0
  651. package/dist/terraform/aws-resources.js +384 -0
  652. package/dist/terraform/bridge.js +204 -0
  653. package/dist/terraform/carve-provider.js +155 -0
  654. package/dist/terraform/carve.js +138 -0
  655. package/dist/terraform/data-source-shape.js +57 -0
  656. package/dist/terraform/emit-source.js +36 -0
  657. package/dist/terraform/excise.js +123 -0
  658. package/dist/terraform/graduate.js +128 -0
  659. package/dist/terraform/graph.js +435 -0
  660. package/dist/terraform/hcl2json.js +60 -0
  661. package/dist/terraform/manifest.js +149 -0
  662. package/dist/terraform/parse.js +81 -0
  663. package/dist/terraform/providers/aws.js +146 -0
  664. package/dist/terraform/providers/gcp.js +294 -0
  665. package/dist/terraform/providers/index.js +17 -0
  666. package/dist/terraform/providers/kubernetes.js +253 -0
  667. package/dist/terraform/score.js +151 -0
  668. package/dist/terraform/state.js +67 -0
  669. package/dist/terraform/tier-map.js +74 -0
  670. package/dist/terraform/types.js +13 -0
  671. package/dist/terraform/unified-diff.js +132 -0
  672. package/dist/testing.js +295 -0
  673. package/dist/toml-emit.js +153 -0
  674. package/dist/toml-parse.js +355 -0
  675. package/dist/toml-utils.js +60 -0
  676. package/dist/toml.js +428 -0
  677. package/dist/ts-loader.d.ts +46 -0
  678. package/dist/ts-loader.d.ts.map +1 -0
  679. package/dist/ts-loader.js +103 -0
  680. package/dist/types.js +1 -0
  681. package/dist/utils.js +61 -0
  682. package/dist/validation.js +20 -0
  683. package/dist/vendor/js-yaml-load.js +1662 -0
  684. package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
  685. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  686. package/dist/workspace/__fixtures__/contract-repo.js +119 -0
  687. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  688. package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
  689. package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
  690. package/dist/workspace/__fixtures__/sessions.js +91 -0
  691. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  692. package/dist/workspace/agent-cli.js +99 -0
  693. package/dist/workspace/agent.schema.json +390 -0
  694. package/dist/workspace/answers-ledger.js +89 -0
  695. package/dist/workspace/box-cli.js +142 -0
  696. package/dist/workspace/box-factory-write.js +196 -0
  697. package/dist/workspace/box-factory-write.schema.json +342 -0
  698. package/dist/workspace/box-factory.js +88 -0
  699. package/dist/workspace/box-intent.js +126 -0
  700. package/dist/workspace/box-isolation.js +169 -0
  701. package/dist/workspace/box-listing-write.schema.json +204 -0
  702. package/dist/workspace/box-listing.js +298 -0
  703. package/dist/workspace/box-publish.js +352 -0
  704. package/dist/workspace/box-publish.schema.json +498 -0
  705. package/dist/workspace/box-services.js +39 -0
  706. package/dist/workspace/broker-protocol.js +359 -0
  707. package/dist/workspace/broker-protocol.schema.json +228 -0
  708. package/dist/workspace/change-set.schema.json +462 -0
  709. package/dist/workspace/changes-cli.js +56 -0
  710. package/dist/workspace/changes.js +446 -0
  711. package/dist/workspace/changes.schema.json +642 -0
  712. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  713. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  714. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  715. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  716. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  717. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  718. package/dist/workspace/chant-migrations.js +113 -0
  719. package/dist/workspace/check.schema.json +433 -0
  720. package/dist/workspace/checks/box-isolation.js +62 -0
  721. package/dist/workspace/checks/boxes.js +491 -0
  722. package/dist/workspace/checks/diagrams.js +104 -0
  723. package/dist/workspace/checks/generated.js +419 -0
  724. package/dist/workspace/checks/ledgers.js +212 -0
  725. package/dist/workspace/checks/links.js +191 -0
  726. package/dist/workspace/checks/live.js +100 -0
  727. package/dist/workspace/checks/pipelines.js +188 -0
  728. package/dist/workspace/checks/records.js +169 -0
  729. package/dist/workspace/checks.js +426 -0
  730. package/dist/workspace/ci-green-cli.js +125 -0
  731. package/dist/workspace/ci-green-forge.js +83 -0
  732. package/dist/workspace/ci-green-workflow.d.ts +3 -1
  733. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  734. package/dist/workspace/ci-green-workflow.js +202 -0
  735. package/dist/workspace/ci-green.js +325 -0
  736. package/dist/workspace/ci-last-green.schema.json +158 -0
  737. package/dist/workspace/class-data.d.ts +84 -0
  738. package/dist/workspace/class-data.d.ts.map +1 -0
  739. package/dist/workspace/class-data.js +238 -0
  740. package/dist/workspace/compose-graph.js +235 -0
  741. package/dist/workspace/compose-reports.js +146 -0
  742. package/dist/workspace/composites.js +264 -0
  743. package/dist/workspace/composites.schema.json +617 -0
  744. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  745. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  746. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  747. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  748. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  749. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  750. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  751. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  752. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  753. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  754. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  755. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  756. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  757. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  758. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  759. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  760. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  761. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  762. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  763. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  764. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  765. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  766. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  767. package/dist/workspace/conformance/broker.js +736 -0
  768. package/dist/workspace/conformance/index.js +673 -0
  769. package/dist/workspace/conformance/vitest.js +108 -0
  770. package/dist/workspace/conformance/writer.js +1080 -0
  771. package/dist/workspace/decide.js +879 -0
  772. package/dist/workspace/decision-points.schema.json +135 -135
  773. package/dist/workspace/declaration-write-cli.js +74 -0
  774. package/dist/workspace/declaration-write.js +238 -0
  775. package/dist/workspace/declaration.js +938 -0
  776. package/dist/workspace/declaration.schema.json +1413 -1413
  777. package/dist/workspace/declared-kinds.js +106 -0
  778. package/dist/workspace/environments.js +164 -0
  779. package/dist/workspace/evidence.schema.json +279 -0
  780. package/dist/workspace/export-cli.js +185 -0
  781. package/dist/workspace/export.js +499 -0
  782. package/dist/workspace/factory-rules.js +175 -0
  783. package/dist/workspace/generated-files.js +92 -0
  784. package/dist/workspace/glob.js +45 -0
  785. package/dist/workspace/graph-cache.js +352 -0
  786. package/dist/workspace/graph-cli.js +348 -0
  787. package/dist/workspace/graph.schema.json +1338 -0
  788. package/dist/workspace/identity-gate-rule.js +75 -0
  789. package/dist/workspace/identity.js +126 -0
  790. package/dist/workspace/import.js +283 -0
  791. package/dist/workspace/init.js +620 -0
  792. package/dist/workspace/intent-cli.js +263 -0
  793. package/dist/workspace/intent-joins.js +201 -0
  794. package/dist/workspace/intent-record.js +352 -0
  795. package/dist/workspace/intent-record.schema.json +864 -0
  796. package/dist/workspace/intent.js +1582 -0
  797. package/dist/workspace/intent.schema.json +2420 -0
  798. package/dist/workspace/json-edit.js +221 -0
  799. package/dist/workspace/jsonc.js +235 -0
  800. package/dist/workspace/kind-readers.js +103 -0
  801. package/dist/workspace/kinds.d.ts +3 -7
  802. package/dist/workspace/kinds.d.ts.map +1 -1
  803. package/dist/workspace/kinds.js +553 -0
  804. package/dist/workspace/lexicon-symbols.js +112 -0
  805. package/dist/workspace/lineage-adopt-cli.js +102 -0
  806. package/dist/workspace/lineage-adopt.js +360 -0
  807. package/dist/workspace/lineage-check.js +282 -0
  808. package/dist/workspace/lineage-cli.js +121 -0
  809. package/dist/workspace/lineage-hash-index.js +284 -0
  810. package/dist/workspace/lineage-init.js +507 -0
  811. package/dist/workspace/lineage-lock.js +387 -0
  812. package/dist/workspace/lineage-merge.js +45 -0
  813. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  814. package/dist/workspace/lineage-migrations.js +329 -0
  815. package/dist/workspace/lineage-provenance.js +36 -0
  816. package/dist/workspace/lineage-update.js +138 -0
  817. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  818. package/dist/workspace/lineage-upgrade.js +889 -0
  819. package/dist/workspace/lineage-vendor.js +171 -0
  820. package/dist/workspace/lineage-version.js +128 -0
  821. package/dist/workspace/lineage-versions.js +275 -0
  822. package/dist/workspace/links.js +330 -0
  823. package/dist/workspace/ls-generated.js +95 -0
  824. package/dist/workspace/ls.js +277 -0
  825. package/dist/workspace/ls.schema.json +333 -0
  826. package/dist/workspace/member-commands.js +508 -0
  827. package/dist/workspace/member-handles.js +216 -0
  828. package/dist/workspace/member-pipeline.js +258 -0
  829. package/dist/workspace/member-run.js +117 -0
  830. package/dist/workspace/member-write.schema.json +193 -0
  831. package/dist/workspace/nested-graph.js +156 -0
  832. package/dist/workspace/nesting.js +38 -0
  833. package/dist/workspace/patch.js +301 -0
  834. package/dist/workspace/patch.schema.json +321 -0
  835. package/dist/workspace/pin-cli.js +55 -0
  836. package/dist/workspace/pin-integrity.js +100 -0
  837. package/dist/workspace/plan-summary.schema.json +155 -0
  838. package/dist/workspace/point-answer.schema.json +129 -129
  839. package/dist/workspace/points-cli.js +291 -0
  840. package/dist/workspace/points-write.schema.json +660 -0
  841. package/dist/workspace/points.js +521 -0
  842. package/dist/workspace/points.schema.json +916 -0
  843. package/dist/workspace/pr-report.schema.json +108 -0
  844. package/dist/workspace/principal-classes.d.ts +4 -11
  845. package/dist/workspace/principal-classes.d.ts.map +1 -1
  846. package/dist/workspace/principal-classes.js +162 -0
  847. package/dist/workspace/reason-codes.js +326 -0
  848. package/dist/workspace/record-assets.js +151 -0
  849. package/dist/workspace/record-decided.js +105 -0
  850. package/dist/workspace/record-sessions.js +96 -0
  851. package/dist/workspace/record-source.js +114 -0
  852. package/dist/workspace/records-amend.schema.json +284 -0
  853. package/dist/workspace/records-checkout.js +76 -0
  854. package/dist/workspace/records-cli.js +707 -0
  855. package/dist/workspace/records-close.js +116 -0
  856. package/dist/workspace/records-close.schema.json +278 -0
  857. package/dist/workspace/records-new.schema.json +202 -0
  858. package/dist/workspace/records-review.schema.json +367 -0
  859. package/dist/workspace/records-since.js +317 -0
  860. package/dist/workspace/records-since.schema.json +218 -0
  861. package/dist/workspace/records-write.js +1229 -0
  862. package/dist/workspace/records.js +1345 -0
  863. package/dist/workspace/records.schema.json +604 -0
  864. package/dist/workspace/reference-kinds/app/package.json +10 -0
  865. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  866. package/dist/workspace/returns.js +303 -0
  867. package/dist/workspace/root-refusal.js +75 -0
  868. package/dist/workspace/run-statement.schema.json +622 -0
  869. package/dist/workspace/runs-cli.js +584 -0
  870. package/dist/workspace/runs-write.schema.json +994 -0
  871. package/dist/workspace/runs.js +708 -0
  872. package/dist/workspace/runs.schema.json +1257 -0
  873. package/dist/workspace/runtimes.js +76 -0
  874. package/dist/workspace/session-kinds.js +83 -0
  875. package/dist/workspace/signers.schema.json +206 -0
  876. package/dist/workspace/source-block.js +125 -0
  877. package/dist/workspace/squash.js +177 -0
  878. package/dist/workspace/status-gates.js +162 -0
  879. package/dist/workspace/status-stewards.js +330 -0
  880. package/dist/workspace/status.js +514 -0
  881. package/dist/workspace/status.schema.json +998 -0
  882. package/dist/workspace/steward-index.js +191 -0
  883. package/dist/workspace/symbols.js +188 -0
  884. package/dist/workspace/template-manifest.js +227 -0
  885. package/dist/workspace/template-pins.js +115 -0
  886. package/dist/workspace/trailer-joins.js +65 -0
  887. package/dist/workspace/trailers.js +111 -0
  888. package/dist/workspace/tree.js +136 -0
  889. package/dist/workspace/trust/attestor.js +63 -0
  890. package/dist/workspace/trust/dsse.js +108 -0
  891. package/dist/workspace/trust/evidence-cli.js +175 -0
  892. package/dist/workspace/trust/evidence.js +161 -0
  893. package/dist/workspace/trust/gate-seal.js +226 -0
  894. package/dist/workspace/trust/policy.js +190 -0
  895. package/dist/workspace/trust/provenance.js +180 -0
  896. package/dist/workspace/trust/rotation.js +298 -0
  897. package/dist/workspace/trust/run-commits.js +101 -0
  898. package/dist/workspace/trust/run-statement.js +182 -0
  899. package/dist/workspace/trust/seal.js +272 -0
  900. package/dist/workspace/trust/signers-cli.js +152 -0
  901. package/dist/workspace/trust/ssh-commit.js +178 -0
  902. package/dist/workspace/trust/test-repo.js +118 -0
  903. package/dist/workspace/trust/trust-files.js +193 -0
  904. package/dist/workspace/trust/verify-cli.js +63 -0
  905. package/dist/workspace/trust/verify.js +192 -0
  906. package/dist/workspace/which-chant.js +141 -0
  907. package/dist/workspace/wip-cli.js +95 -0
  908. package/dist/workspace/wip-write.schema.json +504 -0
  909. package/dist/workspace/wip.js +631 -0
  910. package/dist/workspace/wip.schema.json +334 -0
  911. package/dist/workspace/work-cli.js +448 -0
  912. package/dist/workspace/work-evidence.js +122 -0
  913. package/dist/workspace/work-evidence.schema.json +222 -0
  914. package/dist/workspace/work-history.schema.json +421 -0
  915. package/dist/workspace/work-lease.schema.json +246 -0
  916. package/dist/workspace/work-size.js +77 -0
  917. package/dist/workspace/work.js +283 -0
  918. package/dist/workspace/workspace-kinds.schema.json +259 -259
  919. package/dist/workspace/workspace-principals.schema.json +53 -53
  920. package/dist/workspace/write-lock-cli.js +105 -0
  921. package/dist/workspace/write-lock.js +424 -0
  922. package/dist/workspace/write-lock.schema.json +172 -0
  923. package/dist/workspace/write-scope.js +484 -0
  924. package/dist/yaml.js +459 -0
  925. package/package.json +2 -2
  926. package/src/build.ts +8 -0
  927. package/src/change-set.test.ts +48 -0
  928. package/src/change-set.ts +52 -2
  929. package/src/ci-jobs.test.ts +49 -0
  930. package/src/ci-jobs.ts +515 -0
  931. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  932. package/src/cli/commands/lint.ts +3 -0
  933. package/src/cli/commands/migrate.ts +2 -0
  934. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  935. package/src/cli/main.ts +121 -27
  936. package/src/cli/mcp/workspace-tools.ts +1 -1
  937. package/src/codegen/pinned-upgrade.ts +2 -0
  938. package/src/components/discover.ts +2 -0
  939. package/src/components/pr-pipeline.ts +3 -2
  940. package/src/components/sandbox/driver.ts +3 -1
  941. package/src/composite.ts +15 -3
  942. package/src/config-import.ts +3 -0
  943. package/src/discovery/collect.ts +15 -1
  944. package/src/discovery/fold-build-parity.test.ts +71 -0
  945. package/src/discovery/fold-import.ts +25 -127
  946. package/src/discovery/fold-project-provenance.test.ts +21 -4
  947. package/src/discovery/host-composite.ts +101 -0
  948. package/src/discovery/import.ts +2 -0
  949. package/src/discovery/index.ts +11 -1
  950. package/src/discovery/sandbox/driver.ts +3 -1
  951. package/src/gate-decision-bundle.test.ts +5 -4
  952. package/src/gate-decision-identity.test.ts +59 -6
  953. package/src/gate-decision.ts +81 -21
  954. package/src/lexicon-module.ts +3 -0
  955. package/src/lifecycle/gate-audit.test.ts +55 -1
  956. package/src/lifecycle/gate-audit.ts +116 -3
  957. package/src/lifecycle/gate-ledger.test.ts +20 -1
  958. package/src/lifecycle/gate-ledger.ts +33 -1
  959. package/src/lint/config.ts +1 -1
  960. package/src/lint/discover.ts +28 -8
  961. package/src/lint/policy-import.ts +4 -1
  962. package/src/lint/rule-loader.ts +2 -0
  963. package/src/op/activities/activity-contracts.ts +1 -1
  964. package/src/op/activities/change-set.ts +11 -3
  965. package/src/op/activities/lexicon-upgrade.test.ts +2 -0
  966. package/src/op/activities/reconcile.test.ts +62 -2
  967. package/src/op/activities/reconcile.ts +46 -22
  968. package/src/op/builders.ts +1 -1
  969. package/src/op/discover.ts +3 -0
  970. package/src/op/op-waves-run.ts +4 -3
  971. package/src/op/op-waves.test.ts +2 -0
  972. package/src/op/work-lease-run.test.ts +12 -4
  973. package/src/ts-loader.test.ts +23 -0
  974. package/src/ts-loader.ts +122 -0
  975. package/src/workspace/__fixtures__/contract-repo.ts +17 -1
  976. package/src/workspace/__fixtures__/sessions.ts +3 -3
  977. package/src/workspace/change-set.schema.json +5 -3
  978. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  979. package/src/workspace/ci-green-workflow.test.ts +4 -4
  980. package/src/workspace/ci-green-workflow.ts +5 -2
  981. package/src/workspace/class-data.test.ts +64 -0
  982. package/src/workspace/class-data.ts +236 -0
  983. package/src/workspace/declaration.ts +1 -1
  984. package/src/workspace/kinds.ts +7 -36
  985. package/src/workspace/lineage-migrations.ts +2 -0
  986. package/src/workspace/points.ts +1 -1
  987. package/src/workspace/principal-classes.ts +12 -95
  988. package/src/workspace/records-formats.test.ts +7 -2
  989. package/src/workspace/records-sessions-write.test.ts +3 -3
  990. package/src/workspace/status-contract.e2e.test.ts +37 -0
  991. package/src/workspace/status-contract.test.ts +23 -21
@@ -0,0 +1,165 @@
1
+ /**
2
+ * The installed CLI runs compiled JS with plain node (#3878). This packs core
3
+ * (its prepack builds dist/) and the render lexicon the way a release does,
4
+ * installs both into a scratch project with npm, and runs the package's own
5
+ * `bin/chant`.
6
+ *
7
+ * Each run is traced through a load hook that NODE_OPTIONS hands to the CLI's
8
+ * node, so the test can say what loaded: none of chant's TypeScript source,
9
+ * ever, and tsx only for a command that imports TypeScript (here the
10
+ * lexicon and the project source).
11
+ *
12
+ * End to end because it packs, installs from the registry and spawns the CLI.
13
+ */
14
+
15
+ import { execFileSync, spawnSync } from "node:child_process";
16
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
17
+ import { tmpdir } from "node:os";
18
+ import { join, resolve } from "node:path";
19
+ import { afterAll, beforeAll, describe, expect, test } from "vitest";
20
+
21
+ const coreRoot = resolve(import.meta.dirname, "..", "..");
22
+ const renderRoot = resolve(coreRoot, "..", "..", "lexicons", "render");
23
+ const version = (JSON.parse(readFileSync(join(coreRoot, "package.json"), "utf-8")) as { version: string }).version;
24
+
25
+ let scratch: string;
26
+ let project: string;
27
+ let waves: string;
28
+ let chant: string;
29
+ let tracer: string;
30
+
31
+ const TRACER = `
32
+ import { registerHooks } from "node:module";
33
+ import { appendFileSync } from "node:fs";
34
+ const out = process.env.CHANT_TRACE_OUT;
35
+ const seen = { chantSrc: 0, chantDist: 0, tsx: 0 };
36
+ registerHooks({
37
+ load(url, context, next) {
38
+ if (url.includes("/@intentius/chant/src/")) seen.chantSrc++;
39
+ else if (url.includes("/@intentius/chant/dist/")) seen.chantDist++;
40
+ else if (url.includes("/node_modules/tsx/")) seen.tsx++;
41
+ return next(url, context);
42
+ },
43
+ });
44
+ process.on("exit", () => { if (out) appendFileSync(out, JSON.stringify(seen) + "\\n"); });
45
+ `;
46
+
47
+ function pack(dir: string, ignoreScripts = false): string {
48
+ const args = ["pack", "--json", "--pack-destination", scratch, ...(ignoreScripts ? ["--ignore-scripts"] : [])];
49
+ const packed = JSON.parse(execFileSync("npm", args, { cwd: dir, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] })) as { filename: string }[];
50
+ return join(scratch, packed[0].filename);
51
+ }
52
+
53
+ interface Run {
54
+ status: number | null;
55
+ stdout: string;
56
+ stderr: string;
57
+ loaded: { chantSrc: number; chantDist: number; tsx: number };
58
+ }
59
+
60
+ function run(cwd: string, args: string[]): Run {
61
+ const traceOut = join(scratch, `trace-${Math.random().toString(36).slice(2)}.jsonl`);
62
+ const env: NodeJS.ProcessEnv = { ...process.env, NODE_OPTIONS: `--import ${tracer}`, CHANT_TRACE_OUT: traceOut };
63
+ delete env.CHANT_ENV;
64
+ const result = spawnSync(chant, args, { cwd, env, encoding: "utf-8" });
65
+ const lines = readFileSync(traceOut, "utf-8").trim().split("\n");
66
+ return { status: result.status, stdout: result.stdout, stderr: result.stderr, loaded: JSON.parse(lines[0]!) as Run["loaded"] };
67
+ }
68
+
69
+ beforeAll(() => {
70
+ scratch = mkdtempSync(join(tmpdir(), "chant-compiled-cli-"));
71
+ tracer = join(scratch, "trace.mjs");
72
+ writeFileSync(tracer, TRACER);
73
+ const core = pack(coreRoot);
74
+ // The lexicon's prepack regenerates it from upstream specs; the checkout's
75
+ // generated source and dist are what this test needs, so pack them as they are.
76
+ const render = pack(renderRoot, true);
77
+
78
+ project = join(scratch, "project");
79
+ mkdirSync(join(project, "src"), { recursive: true });
80
+ writeFileSync(join(project, "package.json"), JSON.stringify({ name: "compiled-cli-e2e", private: true, type: "module" }));
81
+ execFileSync("npm", ["install", "--no-audit", "--no-fund", "--prefer-offline", core, render], { cwd: project, stdio: "ignore" });
82
+ writeFileSync(join(project, "chant.config.ts"), `import type { ChantConfig } from "@intentius/chant";\nexport default { lexicons: ["render"] } satisfies ChantConfig;\n`);
83
+ writeFileSync(
84
+ join(project, "src", "infra.ts"),
85
+ `import { Postgres, Render } from "@intentius/chant-lexicon-render";\n` +
86
+ `export const db = new Postgres({ name: "e2e-db", plan: "free", version: "16", region: Render.Region });\n`,
87
+ );
88
+ chant = join(project, "node_modules", ".bin", "chant");
89
+
90
+ // A waves spec whose plan writes a fixed digest and whose apply does nothing,
91
+ // in a repository with the history `run wave` reads its gate policy from.
92
+ waves = join(scratch, "waves");
93
+ mkdirSync(waves);
94
+ writeFileSync(join(waves, "plan.mjs"), `import { writeFileSync } from "node:fs";\nwriteFileSync(process.argv[3], JSON.stringify({ planDigest: "sha256:" + "a".repeat(64) }));\n`);
95
+ writeFileSync(
96
+ join(waves, "waves.json"),
97
+ JSON.stringify({
98
+ name: "smoke",
99
+ op: "smoke",
100
+ plan: ["node", "plan.mjs", "{target}", "{plan}"],
101
+ apply: ["node", "-e", "0", "{target}", "{plan}"],
102
+ waves: [{ name: "dev", runs: [{ target: "dev" }], gate: "never" }],
103
+ }),
104
+ );
105
+ const git = (...args: string[]) => execFileSync("git", ["-c", "user.email=e2e@chant", "-c", "user.name=e2e", ...args], { cwd: waves, stdio: "ignore" });
106
+ git("init", "-q", "-b", "main");
107
+ git("add", "-A");
108
+ git("commit", "-qm", "spec");
109
+ writeFileSync(join(waves, ".gitignore"), ".chant/\n");
110
+ git("add", "-A");
111
+ git("commit", "-qm", "ignore");
112
+ }, 600_000);
113
+
114
+ afterAll(() => {
115
+ if (scratch) rmSync(scratch, { recursive: true, force: true });
116
+ });
117
+
118
+ describe("the installed chant CLI (#3878)", () => {
119
+ test("--version runs compiled JS and loads no TypeScript loader", () => {
120
+ const r = run(project, ["--version"]);
121
+ expect(r.status, r.stderr).toBe(0);
122
+ expect(r.stdout.trim()).toBe(version);
123
+ expect(r.loaded.chantDist).toBeGreaterThan(0);
124
+ expect(r.loaded).toMatchObject({ chantSrc: 0, tsx: 0 });
125
+ });
126
+
127
+ test("run wave plans and applies a wave without loading tsx", () => {
128
+ const r = run(waves, ["run", "wave", "--spec", "waves.json", "--wave", "1", "--json"]);
129
+ expect(r.status, r.stderr).toBe(0);
130
+ expect(JSON.parse(r.stdout)).toMatchObject({ exitCode: 0 });
131
+ expect(r.loaded).toMatchObject({ chantSrc: 0, tsx: 0 });
132
+ });
133
+
134
+ test("build loads the TypeScript lexicon and project through tsx, against the one compiled core", () => {
135
+ const r = run(project, ["build", "src", "-o", "out/render.json"]);
136
+ expect(r.status, r.stderr).toBe(0);
137
+ const built = JSON.parse(readFileSync(join(project, "out", "render.json"), "utf-8")) as Record<string, { body?: { name?: string } }>;
138
+ expect(built.db?.body?.name).toBe("e2e-db");
139
+ expect(r.loaded.tsx).toBeGreaterThan(0);
140
+ expect(r.loaded.chantSrc).toBe(0);
141
+ });
142
+
143
+ test("lint passes on the project", () => {
144
+ const r = run(project, ["lint", "src"]);
145
+ expect(r.status, r.stdout + r.stderr).toBe(0);
146
+ expect(r.loaded.chantSrc).toBe(0);
147
+ });
148
+
149
+ test("build --sandbox bundles chant's source for the sandboxed child", () => {
150
+ writeFileSync(
151
+ join(project, "src", "made.ts"),
152
+ `import { Postgres, Render } from "@intentius/chant-lexicon-render";\n` +
153
+ `function make(name: string) { const n = [1, 2].map((i) => i * 2).length; return new Postgres({ name: name + n, plan: "free", version: "16", region: Render.Region }); }\n` +
154
+ `export const made = make("made");\n`,
155
+ );
156
+ try {
157
+ const r = run(project, ["build", "src", "--sandbox", "-o", "out/sandbox.json"]);
158
+ expect(r.status, r.stderr).toBe(0);
159
+ const built = JSON.parse(readFileSync(join(project, "out", "sandbox.json"), "utf-8")) as Record<string, { body?: { name?: string } }>;
160
+ expect(built.made?.body?.name).toBe("made2");
161
+ } finally {
162
+ rmSync(join(project, "src", "made.ts"));
163
+ }
164
+ });
165
+ });
package/src/cli/main.ts CHANGED
@@ -3,7 +3,6 @@
3
3
  import { resolve } from "node:path";
4
4
  import { isEntryPoint } from "./is-entry-point";
5
5
  import { formatSuccess, formatError } from "./format";
6
- import { loadPlugins, resolveProjectLexicons } from "./plugins";
7
6
  import { resolveCommand, type CommandDef, type ParsedArgs } from "./registry";
8
7
  import { loadChantConfigUpward } from "../config";
9
8
  import { findProjectRoot, findWorkspaceRoot } from "../project-root";
@@ -14,34 +13,118 @@ import { armSandboxConfigEvaluation } from "../config-sandbox";
14
13
  import { armSandboxPolicyExecution } from "../lint/policy-import";
15
14
  import { ENV_VAR, unknownEnvError } from "../env";
16
15
  import { initRuntime } from "../runtime-adapter";
17
- import { runBuild } from "./handlers/build";
18
- import { runLint } from "./handlers/lint";
19
- import { runDevGenerate, runDevPublish, runDevOnboard, runDevCheckLexicon, runDevSurfaceDiff, runDevPinnedUpgrade, runDevRollingUpgrade, runDevUnknown } from "./handlers/dev";
20
- import { runServeLsp, runServeMcp, runServeUnknown } from "./handlers/serve";
21
- import { runInit, runInitLexicon } from "./handlers/init";
22
- import { runList, runDescribe, runImport, runAudit, runUpdate, runDoctor } from "./handlers/misc";
23
- import { runVendor } from "./handlers/vendor";
24
- import { runMigrate } from "./handlers/migrate";
25
- import { runCarveAdvise, runCarveUnknown } from "./handlers/carve";
26
- import { runCarveEmit } from "./handlers/carve-emit";
27
- import { runCarveBridge } from "./handlers/carve-bridge";
28
- import { runCarveApply } from "./handlers/carve-apply";
29
- import { runCarveStatus } from "./handlers/carve-status";
30
- import { runLifecycleSnapshot, runLifecycleShow, runLifecycleDiff, runLifecycleRollback, runLifecyclePlan, runLifecycleAffected, runLifecycleLog, runLifecycleTeardown, runLifecycleWhoami, runLifecycleUnknown } from "./handlers/lifecycle";
31
- import { runComponentsStatus, runComponentsReleaseRecord, runComponentsExport, runComponentsUnknown } from "./handlers/components";
32
- import { runComponentsFanOut } from "./handlers/fan-out";
33
- import { runComponentsPromote, runComponentsRollback, runComponentsRedeploy } from "./handlers/promote";
34
- import { runScenarioCheck, runScenarioUnknown } from "./handlers/scenario";
35
- import { runGraph } from "./handlers/graph";
36
- import { runExplain } from "./handlers/explain";
37
- import { runSearch } from "./handlers/search";
38
- import { runOp, runOpList, runOpStatus, runOpApprove, runOpSignalRenamed, runOpCancel, runOpLog } from "./handlers/run";
39
- import { runOpWaveCommand } from "./handlers/run-wave";
40
- import { runOperator, runOperatorStatus, runOperatorLog, runApprove } from "./handlers/operator";
41
- import { runEmulator, formatEmulatorHelp } from "./handlers/emulator";
16
+ import { installCompiledCli } from "../ts-loader";
42
17
  import { splitJoinedFlags, dispatchCommandGroup, collectCommandGroups, formatCommandGroupsHelp, type CommandGroup } from "./command-group";
43
18
  import type { LexiconPlugin } from "../lexicon";
44
19
 
20
+ /**
21
+ * #3878 — each command's handler module loads when that command runs, not on
22
+ * every start: together they pull in most of chant (the TypeScript compiler
23
+ * among it), and `chant --version` or `chant run wave` need almost none of it.
24
+ */
25
+ type Handler = CommandDef["handler"];
26
+ const handlerModules = new Map<Handler, () => Promise<unknown>>();
27
+ function lazyHandler<M>(load: () => Promise<M>, pick: (module: M) => Handler): Handler {
28
+ const handler: Handler = async (ctx) => pick(await load())(ctx);
29
+ handlerModules.set(handler, load);
30
+ return handler;
31
+ }
32
+ const buildHandlers = () => import("./handlers/build");
33
+ const runBuild = lazyHandler(buildHandlers, (m) => m.runBuild);
34
+ const lintHandlers = () => import("./handlers/lint");
35
+ const runLint = lazyHandler(lintHandlers, (m) => m.runLint);
36
+ const devHandlers = () => import("./handlers/dev");
37
+ const runDevGenerate = lazyHandler(devHandlers, (m) => m.runDevGenerate);
38
+ const runDevPublish = lazyHandler(devHandlers, (m) => m.runDevPublish);
39
+ const runDevOnboard = lazyHandler(devHandlers, (m) => m.runDevOnboard);
40
+ const runDevCheckLexicon = lazyHandler(devHandlers, (m) => m.runDevCheckLexicon);
41
+ const runDevSurfaceDiff = lazyHandler(devHandlers, (m) => m.runDevSurfaceDiff);
42
+ const runDevPinnedUpgrade = lazyHandler(devHandlers, (m) => m.runDevPinnedUpgrade);
43
+ const runDevRollingUpgrade = lazyHandler(devHandlers, (m) => m.runDevRollingUpgrade);
44
+ const runDevUnknown = lazyHandler(devHandlers, (m) => m.runDevUnknown);
45
+ const serveHandlers = () => import("./handlers/serve");
46
+ const runServeLsp = lazyHandler(serveHandlers, (m) => m.runServeLsp);
47
+ const runServeMcp = lazyHandler(serveHandlers, (m) => m.runServeMcp);
48
+ const runServeUnknown = lazyHandler(serveHandlers, (m) => m.runServeUnknown);
49
+ const initHandlers = () => import("./handlers/init");
50
+ const runInit = lazyHandler(initHandlers, (m) => m.runInit);
51
+ const runInitLexicon = lazyHandler(initHandlers, (m) => m.runInitLexicon);
52
+ const miscHandlers = () => import("./handlers/misc");
53
+ const runList = lazyHandler(miscHandlers, (m) => m.runList);
54
+ const runDescribe = lazyHandler(miscHandlers, (m) => m.runDescribe);
55
+ const runImport = lazyHandler(miscHandlers, (m) => m.runImport);
56
+ const runAudit = lazyHandler(miscHandlers, (m) => m.runAudit);
57
+ const runUpdate = lazyHandler(miscHandlers, (m) => m.runUpdate);
58
+ const runDoctor = lazyHandler(miscHandlers, (m) => m.runDoctor);
59
+ const vendorHandlers = () => import("./handlers/vendor");
60
+ const runVendor = lazyHandler(vendorHandlers, (m) => m.runVendor);
61
+ const migrateHandlers = () => import("./handlers/migrate");
62
+ const runMigrate = lazyHandler(migrateHandlers, (m) => m.runMigrate);
63
+ const carveHandlers = () => import("./handlers/carve");
64
+ const runCarveAdvise = lazyHandler(carveHandlers, (m) => m.runCarveAdvise);
65
+ const runCarveUnknown = lazyHandler(carveHandlers, (m) => m.runCarveUnknown);
66
+ const carveEmitHandlers = () => import("./handlers/carve-emit");
67
+ const runCarveEmit = lazyHandler(carveEmitHandlers, (m) => m.runCarveEmit);
68
+ const carveBridgeHandlers = () => import("./handlers/carve-bridge");
69
+ const runCarveBridge = lazyHandler(carveBridgeHandlers, (m) => m.runCarveBridge);
70
+ const carveApplyHandlers = () => import("./handlers/carve-apply");
71
+ const runCarveApply = lazyHandler(carveApplyHandlers, (m) => m.runCarveApply);
72
+ const carveStatusHandlers = () => import("./handlers/carve-status");
73
+ const runCarveStatus = lazyHandler(carveStatusHandlers, (m) => m.runCarveStatus);
74
+ const lifecycleHandlers = () => import("./handlers/lifecycle");
75
+ const runLifecycleSnapshot = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleSnapshot);
76
+ const runLifecycleShow = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleShow);
77
+ const runLifecycleDiff = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleDiff);
78
+ const runLifecycleRollback = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleRollback);
79
+ const runLifecyclePlan = lazyHandler(lifecycleHandlers, (m) => m.runLifecyclePlan);
80
+ const runLifecycleAffected = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleAffected);
81
+ const runLifecycleLog = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleLog);
82
+ const runLifecycleTeardown = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleTeardown);
83
+ const runLifecycleWhoami = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleWhoami);
84
+ const runLifecycleUnknown = lazyHandler(lifecycleHandlers, (m) => m.runLifecycleUnknown);
85
+ const componentsHandlers = () => import("./handlers/components");
86
+ const runComponentsStatus = lazyHandler(componentsHandlers, (m) => m.runComponentsStatus);
87
+ const runComponentsReleaseRecord = lazyHandler(componentsHandlers, (m) => m.runComponentsReleaseRecord);
88
+ const runComponentsExport = lazyHandler(componentsHandlers, (m) => m.runComponentsExport);
89
+ const runComponentsUnknown = lazyHandler(componentsHandlers, (m) => m.runComponentsUnknown);
90
+ const fanOutHandlers = () => import("./handlers/fan-out");
91
+ const runComponentsFanOut = lazyHandler(fanOutHandlers, (m) => m.runComponentsFanOut);
92
+ const promoteHandlers = () => import("./handlers/promote");
93
+ const runComponentsPromote = lazyHandler(promoteHandlers, (m) => m.runComponentsPromote);
94
+ const runComponentsRollback = lazyHandler(promoteHandlers, (m) => m.runComponentsRollback);
95
+ const runComponentsRedeploy = lazyHandler(promoteHandlers, (m) => m.runComponentsRedeploy);
96
+ const scenarioHandlers = () => import("./handlers/scenario");
97
+ const runScenarioCheck = lazyHandler(scenarioHandlers, (m) => m.runScenarioCheck);
98
+ const runScenarioUnknown = lazyHandler(scenarioHandlers, (m) => m.runScenarioUnknown);
99
+ const graphHandlers = () => import("./handlers/graph");
100
+ const runGraph = lazyHandler(graphHandlers, (m) => m.runGraph);
101
+ const explainHandlers = () => import("./handlers/explain");
102
+ const runExplain = lazyHandler(explainHandlers, (m) => m.runExplain);
103
+ const searchHandlers = () => import("./handlers/search");
104
+ const runSearch = lazyHandler(searchHandlers, (m) => m.runSearch);
105
+ const runHandlers = () => import("./handlers/run");
106
+ const runOp = lazyHandler(runHandlers, (m) => m.runOp);
107
+ const runOpList = lazyHandler(runHandlers, (m) => m.runOpList);
108
+ const runOpStatus = lazyHandler(runHandlers, (m) => m.runOpStatus);
109
+ const runOpApprove = lazyHandler(runHandlers, (m) => m.runOpApprove);
110
+ const runOpSignalRenamed = lazyHandler(runHandlers, (m) => m.runOpSignalRenamed);
111
+ const runOpCancel = lazyHandler(runHandlers, (m) => m.runOpCancel);
112
+ const runOpLog = lazyHandler(runHandlers, (m) => m.runOpLog);
113
+ const runWaveHandlers = () => import("./handlers/run-wave");
114
+ const runOpWaveCommand = lazyHandler(runWaveHandlers, (m) => m.runOpWaveCommand);
115
+ const operatorHandlers = () => import("./handlers/operator");
116
+ const runOperator = lazyHandler(operatorHandlers, (m) => m.runOperator);
117
+ const runOperatorStatus = lazyHandler(operatorHandlers, (m) => m.runOperatorStatus);
118
+ const runOperatorLog = lazyHandler(operatorHandlers, (m) => m.runOperatorLog);
119
+ const runApprove = lazyHandler(operatorHandlers, (m) => m.runApprove);
120
+ const emulatorHandlers = () => import("./handlers/emulator");
121
+ const runEmulator = lazyHandler(emulatorHandlers, (m) => m.runEmulator);
122
+
123
+ /** The lexicon plugin loader, which imports the lint, fold and build machinery: loaded when a command needs plugins (#3878). */
124
+ const loadPlugins: typeof import("./plugins").loadPlugins = async (...a) => (await import("./plugins")).loadPlugins(...a);
125
+ const resolveProjectLexicons: typeof import("./plugins").resolveProjectLexicons = async (...a) =>
126
+ (await import("./plugins")).resolveProjectLexicons(...a);
127
+
45
128
  /**
46
129
  * Long-form flags that are pure booleans in {@link parseArgs} — their branch
47
130
  * below sets a field to `true` and never consumes a following array element.
@@ -2002,6 +2085,9 @@ export const commandRegistry: CommandDef[] = [
2002
2085
  * Main entry point
2003
2086
  */
2004
2087
  async function main(): Promise<void> {
2088
+ // #3878 — run from dist/ with plain node, TypeScript loads only when
2089
+ // something imports it. A no-op from source.
2090
+ installCompiledCli();
2005
2091
  const rawArgv = process.argv.slice(2);
2006
2092
 
2007
2093
  let args: ParsedArgs;
@@ -2035,7 +2121,7 @@ async function main(): Promise<void> {
2035
2121
  // ports and sign-in each configured lexicon's emulator uses, not the
2036
2122
  // global command list it used to print.
2037
2123
  if (args.help && args.command === "emulator") {
2038
- console.log(formatEmulatorHelp(await loadPluginsBestEffort().catch(() => [])));
2124
+ console.log((await emulatorHandlers()).formatEmulatorHelp(await loadPluginsBestEffort().catch(() => [])));
2039
2125
  await flushAndExit(0);
2040
2126
  return;
2041
2127
  }
@@ -2080,6 +2166,14 @@ async function main(): Promise<void> {
2080
2166
  // command gets no `--env` check against the declared environments either.
2081
2167
  const earlyMatch = resolveCommand(args, commandRegistry);
2082
2168
  const runsNoConfig = earlyMatch != null && commandRunsNoConfig(earlyMatch.def, args);
2169
+ // #3878 — load the command's own modules (and the plugin loader, when it
2170
+ // needs plugins) before anything imports TypeScript: once a chant.config.ts
2171
+ // has registered tsx, every module after it is resolved and loaded through
2172
+ // tsx's hooks, which costs far more than plain node.
2173
+ await Promise.all([
2174
+ earlyMatch ? handlerModules.get(earlyMatch.def.handler)?.() : undefined,
2175
+ earlyMatch?.def.requiresPlugins ? import("./plugins") : undefined,
2176
+ ]);
2083
2177
  const projectPath0 = resolve(args.path === "." ? "." : args.path);
2084
2178
  let loadedConfig;
2085
2179
  try {
@@ -51,7 +51,7 @@ const AGENT_ENV = "CHANT_AGENT";
51
51
  export type ChantCommand = string[];
52
52
 
53
53
  /**
54
- * The chant this process runs as: node with the same flags (the tsx loader
54
+ * The chant this process runs as: node with the same flags (from source, the tsx loader
55
55
  * `bin/chant` registers) and the same entry script.
56
56
  */
57
57
  export function ownChantCommand(): ChantCommand {
@@ -29,6 +29,7 @@ import { regenLexicon, type RegenResult } from "./lexicon-regen";
29
29
  import { fetchWithRetry } from "./fetch";
30
30
  import { isLexiconPlugin, type UpstreamPin } from "../lexicon";
31
31
  import { importLexiconPackage } from "../lexicon-module";
32
+ import { ensureTypeScriptLoader } from "../ts-loader";
32
33
 
33
34
  // ── Public types ──────────────────────────────────────────────────────
34
35
 
@@ -251,6 +252,7 @@ export async function loadUpstreamPins(lexicon: LexiconId, lexiconDir?: string):
251
252
  const entry = lexiconDir ? lexiconEntry(lexiconDir) : null;
252
253
  if (entry) {
253
254
  try {
255
+ ensureTypeScriptLoader();
254
256
  const pins = pinsOf((await import(pathToFileURL(entry).href)) as Record<string, unknown>);
255
257
  if (pins.length > 0) return pins;
256
258
  } catch {
@@ -50,6 +50,7 @@ import { setBuildParams } from "../params";
50
50
  import { hasDiscoveryMarkerSync } from "../discovery/files";
51
51
  import { resolveDiscoveryGlobs } from "../config";
52
52
  import { walkDiscovery, workspaceMemberDirs } from "../discovery/walk";
53
+ import { ensureTypeScriptLoader } from "../ts-loader";
53
54
 
54
55
  /** One discovered component, paired with the file it was exported from. */
55
56
  export interface DiscoveredComponent {
@@ -212,6 +213,7 @@ async function importAndCollectComponents(
212
213
  // `filePath` (e.g. from `chant build --components --generate`, which passes
213
214
  // a bare "." path) would otherwise be treated by `import()` as a bare
214
215
  // package specifier and fail with "Cannot find package 'x.component.ts'".
216
+ ensureTypeScriptLoader();
215
217
  const exports = await import(pathToFileURL(resolve(filePath)).href);
216
218
  modules.push({ file: filePath, exports });
217
219
  } catch (err) {
@@ -38,6 +38,7 @@
38
38
 
39
39
  import type { ForgeKind } from "../pr-forge";
40
40
  import { PR_APPLY_GATE } from "../pr-loop";
41
+ import { CI_IMAGE, GITHUB_JOB_TOKEN } from "../ci-jobs";
41
42
 
42
43
  /** Where both jobs write their reports, kept as a CI artifact. */
43
44
  export const PR_LOOP_REPORT_DIR = ".chant/pr";
@@ -55,7 +56,7 @@ export const PR_APPLY_RECORD = ".chant/pr-resume/pr-apply.json";
55
56
  * `PR_LOOP_SETUP` adds OpenTofu on top of it. A caller who sets `image`
56
57
  * brings both and gets no setup lines.
57
58
  */
58
- export const PR_LOOP_IMAGE = "node:22";
59
+ export const PR_LOOP_IMAGE = CI_IMAGE;
59
60
 
60
61
  /** Installs OpenTofu into `PR_LOOP_IMAGE`. */
61
62
  export const PR_LOOP_SETUP = [
@@ -113,7 +114,7 @@ export function prLoopJobs(forge: ForgeKind, env: string, options: PrLoopPipelin
113
114
  ...(member ? ["--member", member] : []),
114
115
  ];
115
116
  const github = forge !== "gitlab";
116
- const token: Record<string, string> = github ? { GITHUB_TOKEN: "${{ github.token }}" } : {};
117
+ const token: Record<string, string> = github ? { GITHUB_TOKEN: GITHUB_JOB_TOKEN } : {};
117
118
  return [
118
119
  {
119
120
  jobName: "plan",
@@ -1,6 +1,7 @@
1
1
  import { join, resolve } from "node:path";
2
2
  import { params as currentBuildParams } from "../../params";
3
3
  import { sendFunctionSource } from "../../discovery/sandbox/driver";
4
+ import { chantSourceDir } from "../../ts-loader";
4
5
 
5
6
  /**
6
7
  * chant #1051 — generates the source of the "driver" module that runs INSIDE
@@ -25,7 +26,8 @@ import { sendFunctionSource } from "../../discovery/sandbox/driver";
25
26
  * for the full identity-correctness argument).
26
27
  */
27
28
 
28
- const HERE = import.meta.dirname;
29
+ // #3878: the TypeScript source, also when this module runs compiled from dist/.
30
+ const HERE = chantSourceDir(import.meta.url);
29
31
  const COMPONENTS_DIR = join(HERE, "..");
30
32
 
31
33
  /** Absolute paths to chant's OWN trusted modules the generated driver imports — resolved relative to THIS file's own location on disk, exactly like `../../discovery/sandbox/driver.ts` does for the entity path (works whether chant runs from the monorepo or a consumer's `node_modules`). */
package/src/composite.ts CHANGED
@@ -115,11 +115,23 @@ export class CompositeRegistry {
115
115
  * });
116
116
  * export const storage = SecureStorage({ name: "data" });
117
117
  * ```
118
+ *
119
+ * `D` (chant#3787) lets a lexicon give the definition a more precise call
120
+ * signature than `(props: P) => M`, such as a generic one whose members' types
121
+ * depend on the literal props it is called with. It is a type only: the value
122
+ * is the same definition, and `D` must still be a `CompositeDefinition<P, M>`,
123
+ * so an intersection with the precise signature first is the usual form. It
124
+ * is passed as a type argument rather than by casting the result, because the
125
+ * fold recognizes a composite by its `export const X = Composite(...)` shape.
118
126
  */
119
- export function Composite<P, M extends CompositeFactoryMembers = CompositeMembers>(
127
+ export function Composite<
128
+ P,
129
+ M extends CompositeFactoryMembers = CompositeMembers,
130
+ D extends CompositeDefinition<P, M> = CompositeDefinition<P, M>,
131
+ >(
120
132
  factory: (props: P) => M,
121
133
  name?: string,
122
- ): CompositeDefinition<P, M> {
134
+ ): D {
123
135
  const id = Symbol();
124
136
  const compositeName = name ?? "anonymous";
125
137
 
@@ -163,7 +175,7 @@ export function Composite<P, M extends CompositeFactoryMembers = CompositeMember
163
175
 
164
176
  CompositeRegistry.register(definition as CompositeDefinition<unknown>);
165
177
 
166
- return definition;
178
+ return definition as D;
167
179
  }
168
180
 
169
181
  /** Non-enumerable, symbol-keyed: invisible to serializers, spreads and comparisons, like provenance. */
@@ -1,5 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { join } from "node:path";
3
+ import { ensureTypeScriptLoader } from "./ts-loader";
3
4
 
4
5
  /**
5
6
  * The single place chant evaluates a project's `chant.config.ts` **in the CLI's
@@ -29,6 +30,7 @@ export type ConfigModuleNamespace = Record<string, unknown>;
29
30
  * evaluate the file once — the behavior `loadChantConfig` has always had.
30
31
  */
31
32
  export async function importConfigModule(configPath: string): Promise<ConfigModuleNamespace> {
33
+ ensureTypeScriptLoader();
32
34
  return (await import(configPath)) as ConfigModuleNamespace;
33
35
  }
34
36
 
@@ -39,5 +41,6 @@ export async function importConfigModule(configPath: string): Promise<ConfigModu
39
41
  */
40
42
  export function requireConfigModule(configPath: string, dir: string): ConfigModuleNamespace {
41
43
  const req = createRequire(join(dir, "package.json"));
44
+ ensureTypeScriptLoader();
42
45
  return req(configPath) as ConfigModuleNamespace;
43
46
  }
@@ -4,6 +4,7 @@ import { isCompositeInstance, expandComposite, compositeOfMember } from "../comp
4
4
  import { isLexiconOutput } from "../lexicon-output";
5
5
  import { DiscoveryError } from "../errors";
6
6
  import { setProvenance, type EntityProvenance } from "../provenance";
7
+ import { expandHostComposite, hostCompositeName } from "./host-composite";
7
8
 
8
9
  /**
9
10
  * The entity key for an export. `export default` is per-module — the `Op` pattern
@@ -119,6 +120,18 @@ function enumerateEntries(
119
120
  provenance: { sourceFile: file, compositeInstance: name },
120
121
  });
121
122
  }
123
+ } else if (hostCompositeName(value) !== undefined) {
124
+ // chant#3612 — a host composite instance the fold resolved, expanded
125
+ // here rather than by one caller, so `build()` and `foldProject`
126
+ // report the same entities for it. See ./host-composite.ts.
127
+ for (const [expandedName, entity] of expandHostComposite(name, value as Record<string, unknown>)) {
128
+ entries.push({
129
+ bareKey: expandedName,
130
+ value: entity,
131
+ file,
132
+ provenance: { sourceFile: file, compositeInstance: name },
133
+ });
134
+ }
122
135
  } else if (isLexiconOutput(value)) {
123
136
  // LexiconOutput is not a Declarable but build() expects to find them in
124
137
  // the entities map so it can collect and pass them to serializers.
@@ -133,7 +146,8 @@ function enumerateEntries(
133
146
  /**
134
147
  * Collects all declarable entities from imported modules.
135
148
  * CompositeInstance exports are expanded into individual entities
136
- * with `{exportName}_{memberName}` naming.
149
+ * with `{exportName}_{memberName}` naming, and so are host composite
150
+ * instances the fold resolved (chant#3612, ./host-composite.ts).
137
151
  * LexiconOutput exports are also collected so that build() can
138
152
  * extract them and pass them to the serializer.
139
153
  *
@@ -0,0 +1,71 @@
1
+ /**
2
+ * chant#3612 — `build()` and `foldProject` report the same entities, under the
3
+ * same names, with the same provenance, for projects that use composites.
4
+ *
5
+ * The two share `collectEntities` and `foldProvenanceOfEntities`; what could
6
+ * still differ is what each hands them. These fixtures are real examples, one
7
+ * per lexicon whose composites a project calls, built the way `chant build`
8
+ * builds them (fold on, the plugins' intrinsics, the lexicon names).
9
+ */
10
+ import { describe, test, expect, beforeAll } from "vitest";
11
+ import { join, resolve, dirname } from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { build } from "../build";
14
+ import { foldProject, type FoldProvenance } from "../index";
15
+ import { findInfraFiles } from "./files";
16
+ import { loadPlugins, resolveProjectLexicons } from "../cli/plugins";
17
+ import type { LexiconPlugin } from "../lexicon";
18
+
19
+ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../../..");
20
+
21
+ const FIXTURES = [
22
+ "lexicons/aws/examples/fargate-alb",
23
+ "lexicons/aws/examples/lambda-function",
24
+ "lexicons/aws/examples/multi-service-alb",
25
+ "lexicons/k8s/examples/batch-workers",
26
+ "lexicons/k8s/examples/web-platform",
27
+ "lexicons/sql/examples/postgres-composites",
28
+ ];
29
+
30
+ describe("build() and foldProject agree on composite-using projects (chant#3612)", () => {
31
+ // Loading a lexicon (aws's generated barrel above all) is the slow part, and
32
+ // it is not what the tests measure, so it happens once, up front.
33
+ const pluginsOf = new Map<string, LexiconPlugin[]>();
34
+ beforeAll(async () => {
35
+ for (const fixture of FIXTURES) {
36
+ const project = join(repoRoot, fixture);
37
+ pluginsOf.set(fixture, await loadPlugins(await resolveProjectLexicons(project)));
38
+ }
39
+ }, 60_000);
40
+
41
+ test.each(FIXTURES)("%s", async (fixture) => {
42
+ const src = join(repoRoot, fixture, "src");
43
+ const plugins = pluginsOf.get(fixture)!;
44
+ const intrinsics = plugins.flatMap((p) => p.intrinsics?.() ?? []);
45
+ const lexicons = plugins.map((p) => p.name);
46
+
47
+ const built = await build(src, plugins.map((p) => p.serializer), undefined, { fold: true, intrinsics, lexicons });
48
+ expect(built.errors).toEqual([]);
49
+
50
+ const files = await findInfraFiles(src);
51
+ const verdicts = await foldProject(files, intrinsics, { lexicons });
52
+ // Same verdict per file. A file that runs (a `chant.config.ts` in `src`)
53
+ // has no fold provenance in foldProject, so it is left out of both sides.
54
+ const mode = new Map(built.foldDecisions.map((d) => [d.file, d.mode]));
55
+ const folded: FoldProvenance = {};
56
+ for (const [file, verdict] of verdicts) {
57
+ expect({ file, verdict: verdict.verdict }).toEqual({ file, verdict: mode.get(file) });
58
+ Object.assign(folded, verdict.foldProvenance);
59
+ }
60
+ const foldedFiles = new Set(files.filter((file) => verdicts.get(file)!.verdict === "fold"));
61
+ expect(foldedFiles.size).toBeGreaterThan(0);
62
+ const fromBuild = Object.fromEntries(
63
+ Object.entries(built.foldProvenance).filter(([, record]) => foldedFiles.has(record.sourceFile ?? "")),
64
+ );
65
+
66
+ // The fixture has to exercise a composite, or the comparison proves nothing.
67
+ expect(Object.values(fromBuild).some((record) => record.composite !== undefined)).toBe(true);
68
+ expect(Object.keys(folded).sort()).toEqual(Object.keys(fromBuild).sort());
69
+ expect(folded).toEqual(fromBuild);
70
+ });
71
+ });