@intentius/chant 0.101.0 → 0.104.0

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 (739) hide show
  1. package/dist/agents/checks.d.ts.map +1 -1
  2. package/dist/attrref.d.ts.map +1 -1
  3. package/dist/audit/core.d.ts +2 -0
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts.map +1 -1
  6. package/dist/audit/nginx.d.ts.map +1 -1
  7. package/dist/audit/prior-art.d.ts +48 -0
  8. package/dist/audit/prior-art.d.ts.map +1 -1
  9. package/dist/behaviour-kinds.d.ts.map +1 -1
  10. package/dist/builder.d.ts.map +1 -1
  11. package/dist/change-set.d.ts +232 -0
  12. package/dist/change-set.d.ts.map +1 -0
  13. package/dist/cli/commands/audit.d.ts +7 -0
  14. package/dist/cli/commands/audit.d.ts.map +1 -1
  15. package/dist/cli/commands/build.d.ts.map +1 -1
  16. package/dist/cli/commands/carve-emit.d.ts.map +1 -1
  17. package/dist/cli/commands/check-lexicon.d.ts +16 -0
  18. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  19. package/dist/cli/commands/import.d.ts +8 -0
  20. package/dist/cli/commands/import.d.ts.map +1 -1
  21. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  22. package/dist/cli/commands/init.d.ts +19 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/onboard.d.ts +9 -0
  25. package/dist/cli/commands/onboard.d.ts.map +1 -1
  26. package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
  27. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
  28. package/dist/cli/handlers/build.d.ts.map +1 -1
  29. package/dist/cli/handlers/change-set.d.ts +11 -0
  30. package/dist/cli/handlers/change-set.d.ts.map +1 -0
  31. package/dist/cli/handlers/dev.d.ts.map +1 -1
  32. package/dist/cli/handlers/fan-out.d.ts +33 -0
  33. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  34. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  35. package/dist/cli/handlers/misc.d.ts.map +1 -1
  36. package/dist/cli/handlers/operator.d.ts +16 -0
  37. package/dist/cli/handlers/operator.d.ts.map +1 -1
  38. package/dist/cli/handlers/pr.d.ts +31 -0
  39. package/dist/cli/handlers/pr.d.ts.map +1 -0
  40. package/dist/cli/handlers/run.d.ts.map +1 -1
  41. package/dist/cli/lsp/server.d.ts.map +1 -1
  42. package/dist/cli/main.d.ts.map +1 -1
  43. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  44. package/dist/cli/mcp/server.d.ts.map +1 -1
  45. package/dist/cli/mcp/tools/build.d.ts.map +1 -1
  46. package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
  47. package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
  48. package/dist/cli/mcp/tools/import.d.ts.map +1 -1
  49. package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
  50. package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
  51. package/dist/cli/mcp/tools/search.d.ts.map +1 -1
  52. package/dist/cli/mcp/workspace-tools.d.ts +4 -3
  53. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  54. package/dist/cli/registry.d.ts +74 -3
  55. package/dist/cli/registry.d.ts.map +1 -1
  56. package/dist/codegen/fetch.d.ts.map +1 -1
  57. package/dist/codegen/naming.d.ts.map +1 -1
  58. package/dist/codegen/pinned-upgrade.d.ts +67 -3
  59. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  60. package/dist/codegen/registry.d.ts.map +1 -1
  61. package/dist/components/auto-release.d.ts +16 -0
  62. package/dist/components/auto-release.d.ts.map +1 -1
  63. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  64. package/dist/components/capability.d.ts +53 -0
  65. package/dist/components/capability.d.ts.map +1 -1
  66. package/dist/components/changed-files.d.ts +31 -0
  67. package/dist/components/changed-files.d.ts.map +1 -0
  68. package/dist/components/cli-support.d.ts +9 -1
  69. package/dist/components/cli-support.d.ts.map +1 -1
  70. package/dist/components/component.d.ts +24 -0
  71. package/dist/components/component.d.ts.map +1 -1
  72. package/dist/components/deploy-units.d.ts.map +1 -1
  73. package/dist/components/driver.d.ts +13 -0
  74. package/dist/components/driver.d.ts.map +1 -1
  75. package/dist/components/fan-out-output.d.ts +6 -0
  76. package/dist/components/fan-out-output.d.ts.map +1 -1
  77. package/dist/components/fan-out-record.d.ts +41 -0
  78. package/dist/components/fan-out-record.d.ts.map +1 -0
  79. package/dist/components/fan-out-run.d.ts +65 -0
  80. package/dist/components/fan-out-run.d.ts.map +1 -1
  81. package/dist/components/fan-out-support.d.ts +2 -0
  82. package/dist/components/fan-out-support.d.ts.map +1 -1
  83. package/dist/components/fan-out.d.ts +6 -0
  84. package/dist/components/fan-out.d.ts.map +1 -1
  85. package/dist/components/gated-wave-pipeline.d.ts +50 -0
  86. package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
  87. package/dist/components/index.d.ts +1 -1
  88. package/dist/components/index.d.ts.map +1 -1
  89. package/dist/components/layers.d.ts +25 -0
  90. package/dist/components/layers.d.ts.map +1 -0
  91. package/dist/components/pr-pipeline.d.ts +61 -0
  92. package/dist/components/pr-pipeline.d.ts.map +1 -0
  93. package/dist/components/pr-run.d.ts +119 -0
  94. package/dist/components/pr-run.d.ts.map +1 -0
  95. package/dist/components/promote.d.ts.map +1 -1
  96. package/dist/components/starter-plugin.d.ts.map +1 -1
  97. package/dist/components/verbs/process-runner.d.ts.map +1 -1
  98. package/dist/components/verbs/r2-sync.d.ts.map +1 -1
  99. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  100. package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
  101. package/dist/components/verbs/shell.d.ts.map +1 -1
  102. package/dist/components/verbs/sign.d.ts.map +1 -1
  103. package/dist/components/verbs/verify.d.ts.map +1 -1
  104. package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
  105. package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
  106. package/dist/components/verbs/wrangler.d.ts.map +1 -1
  107. package/dist/components/wave-plan.d.ts +49 -0
  108. package/dist/components/wave-plan.d.ts.map +1 -0
  109. package/dist/composite.d.ts.map +1 -1
  110. package/dist/config.d.ts +19 -7
  111. package/dist/config.d.ts.map +1 -1
  112. package/dist/declarable.d.ts +16 -0
  113. package/dist/declarable.d.ts.map +1 -1
  114. package/dist/discovery/cache.d.ts.map +1 -1
  115. package/dist/discovery/fold-import.d.ts +15 -5
  116. package/dist/discovery/fold-import.d.ts.map +1 -1
  117. package/dist/discovery/param-deps.d.ts +16 -0
  118. package/dist/discovery/param-deps.d.ts.map +1 -1
  119. package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
  120. package/dist/discovery/specifier-resolve.d.ts +37 -0
  121. package/dist/discovery/specifier-resolve.d.ts.map +1 -0
  122. package/dist/errors.d.ts.map +1 -1
  123. package/dist/fold/fold.d.ts +3 -1
  124. package/dist/fold/fold.d.ts.map +1 -1
  125. package/dist/gated-waves.d.ts +147 -0
  126. package/dist/gated-waves.d.ts.map +1 -0
  127. package/dist/graph-detail.d.ts.map +1 -1
  128. package/dist/graph-ir.d.ts.map +1 -1
  129. package/dist/graph-layout.d.ts.map +1 -1
  130. package/dist/import/base-parser.d.ts.map +1 -1
  131. package/dist/import/embedded.d.ts +7 -0
  132. package/dist/import/embedded.d.ts.map +1 -1
  133. package/dist/import/parser-options.d.ts +14 -0
  134. package/dist/import/parser-options.d.ts.map +1 -0
  135. package/dist/import/parser.d.ts +17 -0
  136. package/dist/import/parser.d.ts.map +1 -1
  137. package/dist/index.d.ts +1 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/kubectl-context.d.ts.map +1 -1
  140. package/dist/lexicon-output.d.ts.map +1 -1
  141. package/dist/lexicon-schema.d.ts +3 -3
  142. package/dist/lexicon.d.ts +103 -3
  143. package/dist/lexicon.d.ts.map +1 -1
  144. package/dist/lifecycle/assert-live.d.ts.map +1 -1
  145. package/dist/lifecycle/gate-ledger.d.ts +22 -0
  146. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  147. package/dist/lifecycle/git.d.ts +46 -1
  148. package/dist/lifecycle/git.d.ts.map +1 -1
  149. package/dist/lifecycle/member-ledger.d.ts.map +1 -1
  150. package/dist/lifecycle/observe.d.ts.map +1 -1
  151. package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
  152. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  153. package/dist/lifecycle/scenario.d.ts.map +1 -1
  154. package/dist/lifecycle/status.d.ts.map +1 -1
  155. package/dist/lifecycle/work-lease.d.ts +61 -2
  156. package/dist/lifecycle/work-lease.d.ts.map +1 -1
  157. package/dist/lint/config.d.ts +8 -8
  158. package/dist/lint/engine.d.ts +6 -0
  159. package/dist/lint/engine.d.ts.map +1 -1
  160. package/dist/lint/post-synth.d.ts +18 -0
  161. package/dist/lint/post-synth.d.ts.map +1 -1
  162. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  163. package/dist/op/activities/activity-contracts.d.ts +137 -11
  164. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  165. package/dist/op/activities/apply.d.ts +79 -9
  166. package/dist/op/activities/apply.d.ts.map +1 -1
  167. package/dist/op/activities/change-set.d.ts +62 -0
  168. package/dist/op/activities/change-set.d.ts.map +1 -0
  169. package/dist/op/activities/decide.d.ts +2 -0
  170. package/dist/op/activities/decide.d.ts.map +1 -1
  171. package/dist/op/activities/factory.d.ts +137 -0
  172. package/dist/op/activities/factory.d.ts.map +1 -0
  173. package/dist/op/activities/index.d.ts +5 -1
  174. package/dist/op/activities/index.d.ts.map +1 -1
  175. package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
  176. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
  177. package/dist/op/activity-contract.d.ts +1 -1
  178. package/dist/op/activity-contract.d.ts.map +1 -1
  179. package/dist/op/activity-failure.d.ts.map +1 -1
  180. package/dist/op/activity-profiles.d.ts.map +1 -1
  181. package/dist/op/builders.d.ts +11 -0
  182. package/dist/op/builders.d.ts.map +1 -1
  183. package/dist/op/composites/apply-op.d.ts +12 -5
  184. package/dist/op/composites/apply-op.d.ts.map +1 -1
  185. package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
  186. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
  187. package/dist/op/decide-backend.d.ts +5 -1
  188. package/dist/op/decide-backend.d.ts.map +1 -1
  189. package/dist/op/decide-read-inputs.d.ts +4 -2
  190. package/dist/op/decide-read-inputs.d.ts.map +1 -1
  191. package/dist/op/emulator-lifecycle.d.ts +21 -2
  192. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  193. package/dist/op/factory.d.ts +83 -0
  194. package/dist/op/factory.d.ts.map +1 -0
  195. package/dist/op/gate-approval.d.ts +5 -1
  196. package/dist/op/gate-approval.d.ts.map +1 -1
  197. package/dist/op/gate-wait.d.ts.map +1 -1
  198. package/dist/op/gate.d.ts +19 -3
  199. package/dist/op/gate.d.ts.map +1 -1
  200. package/dist/op/index.d.ts +6 -1
  201. package/dist/op/index.d.ts.map +1 -1
  202. package/dist/op/local-executor.d.ts +6 -0
  203. package/dist/op/local-executor.d.ts.map +1 -1
  204. package/dist/op/op-ir.d.ts +2 -0
  205. package/dist/op/op-ir.d.ts.map +1 -1
  206. package/dist/op/op-verb-class.d.ts.map +1 -1
  207. package/dist/op/operator.d.ts.map +1 -1
  208. package/dist/op/run-context.d.ts +39 -0
  209. package/dist/op/run-context.d.ts.map +1 -0
  210. package/dist/op/run-live.d.ts.map +1 -1
  211. package/dist/op/runtimes/local.d.ts.map +1 -1
  212. package/dist/op/source-archive.d.ts.map +1 -1
  213. package/dist/op/steward-beside.d.ts.map +1 -1
  214. package/dist/op/steward-points.d.ts.map +1 -1
  215. package/dist/op/steward.d.ts.map +1 -1
  216. package/dist/op/types.d.ts +16 -3
  217. package/dist/op/types.d.ts.map +1 -1
  218. package/dist/op/work-lease-run.d.ts +24 -4
  219. package/dist/op/work-lease-run.d.ts.map +1 -1
  220. package/dist/plan-summary.d.ts +207 -0
  221. package/dist/plan-summary.d.ts.map +1 -0
  222. package/dist/pr-forge.d.ts +105 -0
  223. package/dist/pr-forge.d.ts.map +1 -0
  224. package/dist/pr-loop.d.ts +178 -0
  225. package/dist/pr-loop.d.ts.map +1 -0
  226. package/dist/project-root.d.ts.map +1 -1
  227. package/dist/provenance.d.ts +21 -0
  228. package/dist/provenance.d.ts.map +1 -1
  229. package/dist/pseudo-parameter.d.ts.map +1 -1
  230. package/dist/reconcile.d.ts.map +1 -1
  231. package/dist/secret-materialization.d.ts.map +1 -1
  232. package/dist/telemetry-attribution.d.ts +31 -0
  233. package/dist/telemetry-attribution.d.ts.map +1 -1
  234. package/dist/terraform/emit-source.d.ts.map +1 -1
  235. package/dist/terraform/hcl2json.d.ts +45 -0
  236. package/dist/terraform/hcl2json.d.ts.map +1 -0
  237. package/dist/terraform/parse.d.ts +4 -40
  238. package/dist/terraform/parse.d.ts.map +1 -1
  239. package/dist/testing.d.ts.map +1 -1
  240. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  241. package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
  242. package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
  243. package/dist/workspace/agent-cli.d.ts +5 -0
  244. package/dist/workspace/agent-cli.d.ts.map +1 -1
  245. package/dist/workspace/box-cli.d.ts +12 -0
  246. package/dist/workspace/box-cli.d.ts.map +1 -0
  247. package/dist/workspace/box-factory.d.ts +97 -0
  248. package/dist/workspace/box-factory.d.ts.map +1 -0
  249. package/dist/workspace/box-listing.d.ts +85 -0
  250. package/dist/workspace/box-listing.d.ts.map +1 -0
  251. package/dist/workspace/box-publish.d.ts +147 -0
  252. package/dist/workspace/box-publish.d.ts.map +1 -0
  253. package/dist/workspace/broker-protocol.d.ts +190 -0
  254. package/dist/workspace/broker-protocol.d.ts.map +1 -0
  255. package/dist/workspace/changes.d.ts.map +1 -1
  256. package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
  257. package/dist/workspace/checks/boxes.d.ts.map +1 -1
  258. package/dist/workspace/checks.d.ts +5 -0
  259. package/dist/workspace/checks.d.ts.map +1 -1
  260. package/dist/workspace/compose-graph.d.ts +10 -0
  261. package/dist/workspace/compose-graph.d.ts.map +1 -1
  262. package/dist/workspace/composites.d.ts +2 -2
  263. package/dist/workspace/composites.d.ts.map +1 -1
  264. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
  265. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
  266. package/dist/workspace/conformance/broker.d.ts +202 -0
  267. package/dist/workspace/conformance/broker.d.ts.map +1 -0
  268. package/dist/workspace/conformance/index.d.ts +68 -6
  269. package/dist/workspace/conformance/index.d.ts.map +1 -1
  270. package/dist/workspace/conformance/vitest.d.ts +19 -3
  271. package/dist/workspace/conformance/vitest.d.ts.map +1 -1
  272. package/dist/workspace/conformance/writer.d.ts +462 -0
  273. package/dist/workspace/conformance/writer.d.ts.map +1 -0
  274. package/dist/workspace/decide.d.ts +126 -12
  275. package/dist/workspace/decide.d.ts.map +1 -1
  276. package/dist/workspace/decision-points.schema.json +11 -4
  277. package/dist/workspace/declaration.d.ts +156 -4
  278. package/dist/workspace/declaration.d.ts.map +1 -1
  279. package/dist/workspace/declaration.schema.json +383 -5
  280. package/dist/workspace/environments.d.ts +36 -10
  281. package/dist/workspace/environments.d.ts.map +1 -1
  282. package/dist/workspace/factory-rules.d.ts +180 -0
  283. package/dist/workspace/factory-rules.d.ts.map +1 -0
  284. package/dist/workspace/generated-files.d.ts.map +1 -1
  285. package/dist/workspace/graph-cache.d.ts.map +1 -1
  286. package/dist/workspace/graph-cli.d.ts +2 -0
  287. package/dist/workspace/graph-cli.d.ts.map +1 -1
  288. package/dist/workspace/identity.d.ts +111 -0
  289. package/dist/workspace/identity.d.ts.map +1 -0
  290. package/dist/workspace/init.d.ts +21 -0
  291. package/dist/workspace/init.d.ts.map +1 -1
  292. package/dist/workspace/intent-cli.d.ts +7 -4
  293. package/dist/workspace/intent-cli.d.ts.map +1 -1
  294. package/dist/workspace/intent-record.d.ts +36 -2
  295. package/dist/workspace/intent-record.d.ts.map +1 -1
  296. package/dist/workspace/intent.d.ts +249 -8
  297. package/dist/workspace/intent.d.ts.map +1 -1
  298. package/dist/workspace/json-edit.d.ts +24 -0
  299. package/dist/workspace/json-edit.d.ts.map +1 -0
  300. package/dist/workspace/jsonc.d.ts +11 -0
  301. package/dist/workspace/jsonc.d.ts.map +1 -1
  302. package/dist/workspace/kinds.d.ts +66 -4
  303. package/dist/workspace/kinds.d.ts.map +1 -1
  304. package/dist/workspace/lexicon-symbols.d.ts +29 -0
  305. package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
  306. package/dist/workspace/lineage-hash-index.d.ts.map +1 -1
  307. package/dist/workspace/lineage-lock.d.ts +2 -2
  308. package/dist/workspace/lineage-lock.d.ts.map +1 -1
  309. package/dist/workspace/lineage-upgrade.d.ts +31 -2
  310. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  311. package/dist/workspace/links.d.ts.map +1 -1
  312. package/dist/workspace/point-answer.schema.json +42 -2
  313. package/dist/workspace/points-cli.d.ts +10 -3
  314. package/dist/workspace/points-cli.d.ts.map +1 -1
  315. package/dist/workspace/points.d.ts +66 -5
  316. package/dist/workspace/points.d.ts.map +1 -1
  317. package/dist/workspace/principal-classes.d.ts +114 -0
  318. package/dist/workspace/principal-classes.d.ts.map +1 -0
  319. package/dist/workspace/reason-codes.d.ts +53 -4
  320. package/dist/workspace/reason-codes.d.ts.map +1 -1
  321. package/dist/workspace/record-assets.d.ts.map +1 -1
  322. package/dist/workspace/record-sessions.d.ts +5 -7
  323. package/dist/workspace/record-sessions.d.ts.map +1 -1
  324. package/dist/workspace/records-checkout.d.ts +54 -0
  325. package/dist/workspace/records-checkout.d.ts.map +1 -0
  326. package/dist/workspace/records-cli.d.ts +34 -1
  327. package/dist/workspace/records-cli.d.ts.map +1 -1
  328. package/dist/workspace/records-close.d.ts +7 -3
  329. package/dist/workspace/records-close.d.ts.map +1 -1
  330. package/dist/workspace/records-since.d.ts.map +1 -1
  331. package/dist/workspace/records-write.d.ts +68 -7
  332. package/dist/workspace/records-write.d.ts.map +1 -1
  333. package/dist/workspace/records.d.ts +43 -9
  334. package/dist/workspace/records.d.ts.map +1 -1
  335. package/dist/workspace/runs-cli.d.ts +296 -0
  336. package/dist/workspace/runs-cli.d.ts.map +1 -0
  337. package/dist/workspace/runs.d.ts +544 -0
  338. package/dist/workspace/runs.d.ts.map +1 -0
  339. package/dist/workspace/session-kinds.d.ts +1 -1
  340. package/dist/workspace/session-kinds.d.ts.map +1 -1
  341. package/dist/workspace/source-block.d.ts +1 -1
  342. package/dist/workspace/source-block.d.ts.map +1 -1
  343. package/dist/workspace/squash.d.ts +80 -0
  344. package/dist/workspace/squash.d.ts.map +1 -0
  345. package/dist/workspace/status-gates.d.ts +17 -3
  346. package/dist/workspace/status-gates.d.ts.map +1 -1
  347. package/dist/workspace/status.d.ts +64 -0
  348. package/dist/workspace/status.d.ts.map +1 -1
  349. package/dist/workspace/symbols.d.ts +63 -0
  350. package/dist/workspace/symbols.d.ts.map +1 -0
  351. package/dist/workspace/trailer-joins.d.ts +46 -0
  352. package/dist/workspace/trailer-joins.d.ts.map +1 -0
  353. package/dist/workspace/trailers.d.ts +89 -0
  354. package/dist/workspace/trailers.d.ts.map +1 -0
  355. package/dist/workspace/trust/attestor.d.ts.map +1 -1
  356. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  357. package/dist/workspace/trust/run-commits.d.ts +46 -0
  358. package/dist/workspace/trust/run-commits.d.ts.map +1 -0
  359. package/dist/workspace/trust/run-statement.d.ts +128 -0
  360. package/dist/workspace/trust/run-statement.d.ts.map +1 -0
  361. package/dist/workspace/trust/seal.d.ts +38 -0
  362. package/dist/workspace/trust/seal.d.ts.map +1 -1
  363. package/dist/workspace/trust/test-repo.d.ts.map +1 -1
  364. package/dist/workspace/trust/verify-cli.d.ts +1 -1
  365. package/dist/workspace/trust/verify.d.ts +16 -2
  366. package/dist/workspace/trust/verify.d.ts.map +1 -1
  367. package/dist/workspace/wip-cli.d.ts +21 -0
  368. package/dist/workspace/wip-cli.d.ts.map +1 -0
  369. package/dist/workspace/wip.d.ts +268 -0
  370. package/dist/workspace/wip.d.ts.map +1 -0
  371. package/dist/workspace/work-cli.d.ts +39 -3
  372. package/dist/workspace/work-cli.d.ts.map +1 -1
  373. package/dist/workspace/work-evidence.d.ts +1 -1
  374. package/dist/workspace/work-evidence.d.ts.map +1 -1
  375. package/dist/workspace/work-size.d.ts +55 -0
  376. package/dist/workspace/work-size.d.ts.map +1 -0
  377. package/dist/workspace/work.d.ts +26 -1
  378. package/dist/workspace/work.d.ts.map +1 -1
  379. package/dist/workspace/workspace-kinds.schema.json +122 -0
  380. package/dist/workspace/workspace-principals.schema.json +60 -0
  381. package/dist/workspace/write-lock-cli.d.ts +60 -0
  382. package/dist/workspace/write-lock-cli.d.ts.map +1 -0
  383. package/dist/workspace/write-lock.d.ts +152 -0
  384. package/dist/workspace/write-lock.d.ts.map +1 -0
  385. package/dist/workspace/write-scope.d.ts +83 -19
  386. package/dist/workspace/write-scope.d.ts.map +1 -1
  387. package/dist/yaml.d.ts +21 -39
  388. package/dist/yaml.d.ts.map +1 -1
  389. package/package.json +7 -2
  390. package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
  391. package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
  392. package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
  393. package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
  394. package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
  395. package/src/__fixtures__/change-set/warden.plan.json +44 -0
  396. package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
  397. package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
  398. package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
  399. package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
  400. package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
  401. package/src/audit/core.test.ts +15 -0
  402. package/src/audit/core.ts +8 -2
  403. package/src/audit/discover.test.ts +11 -0
  404. package/src/audit/discover.ts +7 -2
  405. package/src/audit/prior-art.ts +15 -0
  406. package/src/change-set-bundle.test.ts +57 -0
  407. package/src/change-set.test.ts +215 -0
  408. package/src/change-set.ts +445 -0
  409. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
  410. package/src/cli/commands/audit-opt-in.test.ts +54 -0
  411. package/src/cli/commands/audit.ts +29 -2
  412. package/src/cli/commands/build.test.ts +19 -0
  413. package/src/cli/commands/build.ts +3 -2
  414. package/src/cli/commands/carve-emit-state.test.ts +4 -0
  415. package/src/cli/commands/carve-emit.ts +5 -19
  416. package/src/cli/commands/check-lexicon.test.ts +62 -1
  417. package/src/cli/commands/check-lexicon.ts +36 -6
  418. package/src/cli/commands/import-live.test.ts +18 -0
  419. package/src/cli/commands/import-parser-options.test.ts +133 -0
  420. package/src/cli/commands/import.ts +21 -3
  421. package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
  422. package/src/cli/commands/init.test.ts +8 -1
  423. package/src/cli/commands/init.ts +23 -8
  424. package/src/cli/commands/lint.test.ts +37 -0
  425. package/src/cli/commands/onboard.test.ts +53 -3
  426. package/src/cli/commands/onboard.ts +52 -4
  427. package/src/cli/commands/pinned-upgrade.ts +73 -33
  428. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
  429. package/src/cli/handlers/build.ts +13 -1
  430. package/src/cli/handlers/change-set.test.ts +56 -0
  431. package/src/cli/handlers/change-set.ts +44 -0
  432. package/src/cli/handlers/components.ts +2 -2
  433. package/src/cli/handlers/dev.ts +8 -6
  434. package/src/cli/handlers/fan-out.test.ts +221 -2
  435. package/src/cli/handlers/fan-out.ts +165 -75
  436. package/src/cli/handlers/graph.ts +3 -0
  437. package/src/cli/handlers/lifecycle.test.ts +67 -0
  438. package/src/cli/handlers/lifecycle.ts +6 -5
  439. package/src/cli/handlers/misc.ts +2 -0
  440. package/src/cli/handlers/operator.test.ts +21 -0
  441. package/src/cli/handlers/operator.ts +121 -6
  442. package/src/cli/handlers/pr.ts +373 -0
  443. package/src/cli/handlers/run.test.ts +111 -0
  444. package/src/cli/handlers/run.ts +86 -24
  445. package/src/cli/handlers/scenario.ts +2 -2
  446. package/src/cli/main.test.ts +21 -0
  447. package/src/cli/main.ts +246 -30
  448. package/src/cli/mcp/never-over-mcp.test.ts +101 -0
  449. package/src/cli/mcp/op-tools.ts +24 -2
  450. package/src/cli/mcp/workspace-tools.test.ts +5 -2
  451. package/src/cli/mcp/workspace-tools.ts +62 -7
  452. package/src/cli/registry.ts +74 -3
  453. package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
  454. package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
  455. package/src/codegen/pinned-upgrade.test.ts +104 -0
  456. package/src/codegen/pinned-upgrade.ts +250 -56
  457. package/src/codegen/testdata/postgres-tags.json +242 -0
  458. package/src/components/auto-release.ts +1 -1
  459. package/src/components/capability.ts +55 -0
  460. package/src/components/changed-files.ts +66 -0
  461. package/src/components/cli-support.ts +28 -5
  462. package/src/components/component.schema.json +17 -0
  463. package/src/components/component.ts +25 -0
  464. package/src/components/deploy-units.ts +3 -0
  465. package/src/components/driver.test.ts +52 -0
  466. package/src/components/driver.ts +31 -13
  467. package/src/components/fan-out-output.ts +42 -1
  468. package/src/components/fan-out-record.ts +69 -0
  469. package/src/components/fan-out-run.test.ts +17 -0
  470. package/src/components/fan-out-run.ts +304 -1
  471. package/src/components/fan-out-support.ts +3 -0
  472. package/src/components/fan-out-waves.test.ts +375 -0
  473. package/src/components/fan-out.ts +18 -17
  474. package/src/components/gated-wave-pipeline.ts +82 -0
  475. package/src/components/index.ts +1 -0
  476. package/src/components/layers.ts +30 -0
  477. package/src/components/pr-pipeline.ts +91 -0
  478. package/src/components/pr-run.test.ts +205 -0
  479. package/src/components/pr-run.ts +280 -0
  480. package/src/components/promote.ts +5 -0
  481. package/src/components/verbs/shell.test.ts +11 -0
  482. package/src/components/verbs/shell.ts +7 -3
  483. package/src/components/wave-plan.ts +124 -0
  484. package/src/config.test.ts +21 -0
  485. package/src/config.ts +15 -0
  486. package/src/declarable.test.ts +21 -0
  487. package/src/declarable.ts +19 -0
  488. package/src/discovery/fold-composite.test.ts +41 -5
  489. package/src/discovery/fold-import.test.ts +129 -0
  490. package/src/discovery/fold-import.ts +643 -131
  491. package/src/discovery/fold-package-composite.test.ts +264 -0
  492. package/src/discovery/fold-specifiers.test.ts +191 -0
  493. package/src/discovery/param-deps.test.ts +66 -1
  494. package/src/discovery/param-deps.ts +45 -0
  495. package/src/discovery/sandbox/bundle.ts +1 -1
  496. package/src/discovery/specifier-resolve.ts +344 -0
  497. package/src/fold/fold.test.ts +39 -1
  498. package/src/fold/fold.ts +83 -9
  499. package/src/fold-provenance.test.ts +140 -0
  500. package/src/gated-waves-bundle.test.ts +62 -0
  501. package/src/gated-waves.test.ts +118 -0
  502. package/src/gated-waves.ts +240 -0
  503. package/src/graph-ir.test.ts +83 -0
  504. package/src/graph-ir.ts +29 -0
  505. package/src/import/embedded.test.ts +20 -0
  506. package/src/import/embedded.ts +13 -0
  507. package/src/import/parser-options.ts +46 -0
  508. package/src/import/parser.ts +20 -0
  509. package/src/index.ts +1 -0
  510. package/src/lexicon.ts +106 -3
  511. package/src/lifecycle/gate-ledger.ts +23 -0
  512. package/src/lifecycle/git.ts +102 -16
  513. package/src/lifecycle/observe.test.ts +18 -0
  514. package/src/lifecycle/observe.ts +6 -4
  515. package/src/lifecycle/snapshot.ts +2 -2
  516. package/src/lifecycle/work-lease.test.ts +1 -1
  517. package/src/lifecycle/work-lease.ts +93 -2
  518. package/src/lint/engine.test.ts +55 -0
  519. package/src/lint/engine.ts +30 -4
  520. package/src/lint/output-docs.test.ts +59 -56
  521. package/src/lint/post-synth.test.ts +19 -0
  522. package/src/lint/post-synth.ts +19 -1
  523. package/src/meta/declared-imports.test.ts +1 -1
  524. package/src/op/activities/activity-contracts.ts +84 -0
  525. package/src/op/activities/apply.test.ts +189 -5
  526. package/src/op/activities/apply.ts +230 -8
  527. package/src/op/activities/change-set.ts +114 -0
  528. package/src/op/activities/decide.ts +3 -0
  529. package/src/op/activities/factory.ts +675 -0
  530. package/src/op/activities/index.ts +9 -0
  531. package/src/op/activities/lexicon-upgrade.test.ts +160 -6
  532. package/src/op/activities/lexicon-upgrade.ts +154 -51
  533. package/src/op/activity-contract.test.ts +21 -1
  534. package/src/op/activity-contract.ts +19 -9
  535. package/src/op/builders.ts +23 -0
  536. package/src/op/composites/apply-op.ts +12 -5
  537. package/src/op/composites/composites.test.ts +30 -3
  538. package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
  539. package/src/op/composites/lexicon-upgrade-op.ts +29 -8
  540. package/src/op/decide-backend.ts +5 -1
  541. package/src/op/decide-read-inputs.ts +33 -5
  542. package/src/op/emulator-lifecycle.test.ts +23 -0
  543. package/src/op/emulator-lifecycle.ts +52 -14
  544. package/src/op/factory.e2e.test.ts +232 -0
  545. package/src/op/factory.ts +118 -0
  546. package/src/op/gate-approval.test.ts +74 -0
  547. package/src/op/gate-approval.ts +5 -1
  548. package/src/op/gate.ts +31 -5
  549. package/src/op/index.ts +11 -1
  550. package/src/op/local-executor.test.ts +15 -0
  551. package/src/op/local-executor.ts +40 -12
  552. package/src/op/local-output.ts +1 -1
  553. package/src/op/op-ir.test.ts +9 -0
  554. package/src/op/op-ir.ts +4 -0
  555. package/src/op/op-verb-class.ts +3 -0
  556. package/src/op/operator.ts +4 -0
  557. package/src/op/run-context.test.ts +141 -0
  558. package/src/op/run-context.ts +51 -0
  559. package/src/op/runtimes/local.test.ts +14 -0
  560. package/src/op/runtimes/local.ts +2 -0
  561. package/src/op/steward-beside.ts +2 -0
  562. package/src/op/types.ts +16 -3
  563. package/src/op/work-lease-run.test.ts +47 -0
  564. package/src/op/work-lease-run.ts +76 -11
  565. package/src/plan-summary.test.ts +263 -0
  566. package/src/plan-summary.ts +845 -0
  567. package/src/pr-forge.test.ts +237 -0
  568. package/src/pr-forge.ts +332 -0
  569. package/src/pr-loop-bundle.test.ts +46 -0
  570. package/src/pr-loop.test.ts +171 -0
  571. package/src/pr-loop.ts +324 -0
  572. package/src/provenance.ts +35 -0
  573. package/src/telemetry-attribution.test.ts +23 -1
  574. package/src/telemetry-attribution.ts +51 -0
  575. package/src/terraform/hcl2json.test.ts +21 -0
  576. package/src/terraform/hcl2json.ts +81 -0
  577. package/src/terraform/parse.ts +11 -74
  578. package/src/workspace/agent-cli.ts +7 -3
  579. package/src/workspace/agent.schema.json +22 -0
  580. package/src/workspace/app-kind.test.ts +196 -0
  581. package/src/workspace/box-cli.ts +113 -0
  582. package/src/workspace/box-factory.test.ts +323 -0
  583. package/src/workspace/box-factory.ts +136 -0
  584. package/src/workspace/box-listing-write.schema.json +204 -0
  585. package/src/workspace/box-listing.test.ts +234 -0
  586. package/src/workspace/box-listing.ts +324 -0
  587. package/src/workspace/box-publish.schema.json +498 -0
  588. package/src/workspace/box-publish.test.ts +204 -0
  589. package/src/workspace/box-publish.ts +420 -0
  590. package/src/workspace/box-ship.test.ts +96 -0
  591. package/src/workspace/broker-protocol.schema.json +186 -0
  592. package/src/workspace/broker-protocol.test.ts +122 -0
  593. package/src/workspace/broker-protocol.ts +317 -0
  594. package/src/workspace/builder-tiers.test.ts +146 -0
  595. package/src/workspace/change-set.schema.json +460 -0
  596. package/src/workspace/changes.schema.json +12 -20
  597. package/src/workspace/changes.ts +4 -1
  598. package/src/workspace/chant-migrations.e2e.test.ts +17 -5
  599. package/src/workspace/checks/boxes.test.ts +5 -0
  600. package/src/workspace/checks.ts +39 -8
  601. package/src/workspace/component-environments.test.ts +105 -0
  602. package/src/workspace/compose-graph.ts +7 -0
  603. package/src/workspace/composites.schema.json +23 -4
  604. package/src/workspace/composites.test.ts +8 -8
  605. package/src/workspace/composites.ts +13 -2
  606. package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
  607. package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
  608. package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  609. package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  610. package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  611. package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  612. package/src/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  613. package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  614. package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  615. package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  616. package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  617. package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  618. package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  619. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  620. package/src/workspace/conformance/broker.test.ts +122 -0
  621. package/src/workspace/conformance/broker.ts +792 -0
  622. package/src/workspace/conformance/conformance.e2e.test.ts +36 -3
  623. package/src/workspace/conformance/index.mjs +51 -3
  624. package/src/workspace/conformance/index.ts +107 -15
  625. package/src/workspace/conformance/vitest.ts +76 -2
  626. package/src/workspace/conformance/writer-conformance.e2e.test.ts +177 -0
  627. package/src/workspace/conformance/writer.test.ts +186 -0
  628. package/src/workspace/conformance/writer.ts +1191 -0
  629. package/src/workspace/decide.test.ts +208 -4
  630. package/src/workspace/decide.ts +433 -73
  631. package/src/workspace/decision-points.schema.json +11 -4
  632. package/src/workspace/declaration.schema.json +383 -5
  633. package/src/workspace/declaration.ts +315 -10
  634. package/src/workspace/environments.ts +66 -14
  635. package/src/workspace/factory-rules.test.ts +62 -0
  636. package/src/workspace/factory-rules.ts +218 -0
  637. package/src/workspace/graph-cli.ts +6 -3
  638. package/src/workspace/graph.schema.json +314 -0
  639. package/src/workspace/identity.test.ts +219 -0
  640. package/src/workspace/identity.ts +186 -0
  641. package/src/workspace/init.ts +82 -2
  642. package/src/workspace/intent-cli.ts +84 -13
  643. package/src/workspace/intent-patch-id.test.ts +162 -0
  644. package/src/workspace/intent-record.schema.json +336 -1
  645. package/src/workspace/intent-record.ts +96 -16
  646. package/src/workspace/intent-reviews.test.ts +76 -0
  647. package/src/workspace/intent-squash.test.ts +213 -0
  648. package/src/workspace/intent-why.test.ts +274 -0
  649. package/src/workspace/intent.schema.json +950 -9
  650. package/src/workspace/intent.test.ts +11 -2
  651. package/src/workspace/intent.ts +722 -65
  652. package/src/workspace/json-edit.test.ts +121 -0
  653. package/src/workspace/json-edit.ts +142 -0
  654. package/src/workspace/jsonc.ts +20 -0
  655. package/src/workspace/kinds.ts +201 -39
  656. package/src/workspace/lexicon-symbols.test.ts +148 -0
  657. package/src/workspace/lexicon-symbols.ts +125 -0
  658. package/src/workspace/lineage-upgrade.test.ts +63 -0
  659. package/src/workspace/lineage-upgrade.ts +146 -5
  660. package/src/workspace/plan-summary.schema.json +155 -0
  661. package/src/workspace/point-answer.schema.json +42 -2
  662. package/src/workspace/points-cli.ts +42 -16
  663. package/src/workspace/points-write.schema.json +163 -4
  664. package/src/workspace/points.schema.json +157 -2
  665. package/src/workspace/points.test.ts +13 -1
  666. package/src/workspace/points.ts +118 -12
  667. package/src/workspace/pr-report.schema.json +95 -0
  668. package/src/workspace/principal-classes.test.ts +175 -0
  669. package/src/workspace/principal-classes.ts +307 -0
  670. package/src/workspace/profiles.test.ts +159 -0
  671. package/src/workspace/read-contract.test.ts +2 -2
  672. package/src/workspace/reason-codes.test.ts +23 -3
  673. package/src/workspace/reason-codes.ts +61 -4
  674. package/src/workspace/record-sessions.ts +9 -8
  675. package/src/workspace/records-amend.schema.json +80 -0
  676. package/src/workspace/records-checkout.ts +106 -0
  677. package/src/workspace/records-cli.ts +123 -17
  678. package/src/workspace/records-close.schema.json +79 -0
  679. package/src/workspace/records-close.ts +31 -7
  680. package/src/workspace/records-concurrent.e2e.test.ts +135 -0
  681. package/src/workspace/records-concurrent.test.ts +145 -0
  682. package/src/workspace/records-formats.test.ts +46 -10
  683. package/src/workspace/records-new.schema.json +9 -0
  684. package/src/workspace/records-review.schema.json +80 -0
  685. package/src/workspace/records-sessions-write.test.ts +69 -0
  686. package/src/workspace/records-sessions.test.ts +22 -0
  687. package/src/workspace/records-uncommitted.test.ts +171 -0
  688. package/src/workspace/records-write.ts +219 -30
  689. package/src/workspace/records.schema.json +88 -1
  690. package/src/workspace/records.ts +76 -8
  691. package/src/workspace/reference-kinds/app/package.json +10 -0
  692. package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  693. package/src/workspace/run-statement.schema.json +622 -0
  694. package/src/workspace/runs-cli.ts +710 -0
  695. package/src/workspace/runs-statement.test.ts +239 -0
  696. package/src/workspace/runs-write.schema.json +994 -0
  697. package/src/workspace/runs.schema.json +1257 -0
  698. package/src/workspace/runs.test.ts +281 -0
  699. package/src/workspace/runs.ts +970 -0
  700. package/src/workspace/session-kinds.ts +3 -3
  701. package/src/workspace/squash.ts +198 -0
  702. package/src/workspace/status-contract.test.ts +10 -2
  703. package/src/workspace/status-gates.ts +25 -9
  704. package/src/workspace/status.schema.json +252 -4
  705. package/src/workspace/status.ts +110 -1
  706. package/src/workspace/symbols.ts +191 -0
  707. package/src/workspace/trailer-joins.test.ts +171 -0
  708. package/src/workspace/trailer-joins.ts +82 -0
  709. package/src/workspace/trailers.ts +148 -0
  710. package/src/workspace/trust/run-commits.ts +115 -0
  711. package/src/workspace/trust/run-statement.ts +226 -0
  712. package/src/workspace/trust/seal.ts +58 -1
  713. package/src/workspace/trust/verify-cli.ts +6 -5
  714. package/src/workspace/trust/verify.ts +39 -6
  715. package/src/workspace/wip-cli.ts +97 -0
  716. package/src/workspace/wip-write.schema.json +504 -0
  717. package/src/workspace/wip.schema.json +334 -0
  718. package/src/workspace/wip.test.ts +294 -0
  719. package/src/workspace/wip.ts +753 -0
  720. package/src/workspace/work-cli.e2e.test.ts +28 -1
  721. package/src/workspace/work-cli.ts +136 -8
  722. package/src/workspace/work-evidence.schema.json +5 -0
  723. package/src/workspace/work-history.schema.json +73 -1
  724. package/src/workspace/work-history.test.ts +48 -5
  725. package/src/workspace/work-kind-fields.test.ts +154 -0
  726. package/src/workspace/work-lease.schema.json +14 -1
  727. package/src/workspace/work-size.test.ts +77 -0
  728. package/src/workspace/work-size.ts +93 -0
  729. package/src/workspace/work.ts +82 -0
  730. package/src/workspace/workspace-kinds.schema.json +122 -0
  731. package/src/workspace/workspace-principals.schema.json +60 -0
  732. package/src/workspace/write-lock-cli.ts +131 -0
  733. package/src/workspace/write-lock.schema.json +172 -0
  734. package/src/workspace/write-lock.test.ts +189 -0
  735. package/src/workspace/write-lock.ts +474 -0
  736. package/src/workspace/write-scope.test.ts +144 -3
  737. package/src/workspace/write-scope.ts +192 -45
  738. package/src/yaml.test.ts +111 -1
  739. package/src/yaml.ts +141 -549
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Symbol resolvers from a member's lexicon (#3313): `graph --intent
3
+ * path#symbol` on a file in a member whose lexicon exports a resolver.
4
+ *
5
+ * The workspace has a chant member `db` whose chant.config.json declares a
6
+ * lexicon by module path, `lexicon/plugin.mjs`, which resolves `create table`
7
+ * and `create function` statements in `.sql` files. A loader stands in for
8
+ * the plugin in the unit cases; one case loads the module path the way any
9
+ * command does.
10
+ */
11
+
12
+ import { join } from "node:path";
13
+ import { afterAll, describe, expect, test } from "vitest";
14
+ import { cleanScratch, contract, git, repo } from "./__fixtures__/contract-repo";
15
+ import { intentGraph, type IntentDocument, type RegionNode } from "./intent";
16
+ import intentSchema from "./intent.schema.json";
17
+ import { memberSymbolResolvers, type SymbolPluginLoader } from "./lexicon-symbols";
18
+ import { resolveSymbol, type SymbolDeclaration, type SymbolResolver } from "./symbols";
19
+
20
+ afterAll(cleanScratch);
21
+
22
+ const intent = contract(intentSchema);
23
+
24
+ /** A tiny SQL resolver: each `create table|function <name>` up to the line ending in `;`. */
25
+ const SQL_RESOLVER_SOURCE = `
26
+ export const sqlResolver = {
27
+ language: "SQL",
28
+ extensions: [".sql"],
29
+ declarations(path, text) {
30
+ const lines = text.split("\\n");
31
+ const out = [];
32
+ lines.forEach((line, i) => {
33
+ const m = /^create\\s+(table|function)\\s+([a-z_.]+)/i.exec(line);
34
+ if (!m) return;
35
+ let end = i;
36
+ while (end < lines.length - 1 && !lines[end].trimEnd().endsWith(";")) end++;
37
+ out.push({ qualified: m[2], kind: m[1].toLowerCase(), lines: { start: i + 1, end: end + 1 } });
38
+ });
39
+ return out;
40
+ },
41
+ };
42
+ `;
43
+
44
+ const PLUGIN = `${SQL_RESOLVER_SOURCE}
45
+ export const plugin = {
46
+ name: "sqlish",
47
+ serializer: { name: "sqlish", rulePrefix: "SQI", serialize: () => "" },
48
+ async generate() {},
49
+ async validate() {},
50
+ async coverage() {},
51
+ async package() {},
52
+ symbolResolvers: () => [sqlResolver],
53
+ };
54
+ `;
55
+
56
+ const SCHEMA = ["-- the app's schema", "create table app.users (", " id int primary key", ");", "", "create function app.touch()", " returns void as $$ select 1 $$ language sql;", ""].join("\n");
57
+
58
+ async function sqlResolver(): Promise<SymbolResolver> {
59
+ const mod = (await import(`data:text/javascript,${encodeURIComponent(SQL_RESOLVER_SOURCE)}`)) as { sqlResolver: SymbolResolver };
60
+ return mod.sqlResolver;
61
+ }
62
+
63
+ function workspace(): string {
64
+ const root = repo(
65
+ {
66
+ "chant.workspace.json": `${JSON.stringify({
67
+ name: "demo",
68
+ schema: 1,
69
+ members: [
70
+ { name: "db", dir: "db", kind: "chant" },
71
+ { name: "notes", dir: "notes", kind: "other", because: "prose" },
72
+ ],
73
+ })}\n`,
74
+ "db/chant.config.json": `${JSON.stringify({ lexicons: [{ name: "sqlish", module: "../lexicon/plugin.mjs" }] })}\n`,
75
+ "db/schema.sql": SCHEMA,
76
+ "db/main.ts": "export const x = 1;\n",
77
+ "lexicon/plugin.mjs": PLUGIN,
78
+ "notes/schema.sql": SCHEMA,
79
+ },
80
+ true,
81
+ );
82
+ git(root, "branch", "-M", "main");
83
+ return root;
84
+ }
85
+
86
+ const region = (doc: IntentDocument) => {
87
+ if ("error" in doc) throw new Error(`${doc.error.code}: ${doc.error.message}`);
88
+ return doc.nodes.find((n) => n.kind === "region") as RegionNode;
89
+ };
90
+
91
+ describe("a lexicon's symbol resolvers (#3313)", () => {
92
+ test("resolveSymbol uses an extra resolver for its extensions, and core's for .ts", async () => {
93
+ const sql = await sqlResolver();
94
+ expect(resolveSymbol("db/schema.sql", SCHEMA, "app.users", [sql])).toEqual({ ok: true, declaration: { qualified: "app.users", kind: "table", lines: { start: 2, end: 4 } } });
95
+ expect(resolveSymbol("db/schema.sql", SCHEMA, "users", [sql])).toMatchObject({ ok: true, declaration: { qualified: "app.users" } });
96
+ expect(resolveSymbol("db/schema.sql", SCHEMA, "app.users")).toMatchObject({ ok: false, reason: "unsupported" });
97
+ // A lexicon's resolver never takes .ts from core's.
98
+ const greedy: SymbolResolver = { language: "greedy", extensions: [".ts"], declarations: (): SymbolDeclaration[] => [{ qualified: "x", kind: "lie", lines: { start: 9, end: 9 } }] };
99
+ expect(resolveSymbol("a.ts", "export const x = 1;\n", "x", [greedy])).toMatchObject({ ok: true, declaration: { kind: "variable", lines: { start: 1, end: 1 } } });
100
+ });
101
+
102
+ test("graph --intent path#symbol resolves through the member's lexicon", async () => {
103
+ const root = workspace();
104
+ const sql = await sqlResolver();
105
+ const load: SymbolPluginLoader = async (name) => {
106
+ expect(name).toBe("sqlish");
107
+ return { name, symbolResolvers: () => [sql] };
108
+ };
109
+ const { doc } = await intentGraph({ cwd: root, region: "db/schema.sql#app.touch", loadLexicon: load });
110
+ intent.expectValid(doc);
111
+ expect(region(doc)).toMatchObject({ path: "db/schema.sql", lines: { start: 6, end: 7 }, member: "db", symbol: { name: "app.touch", qualified: "app.touch", kind: "function" } });
112
+ });
113
+
114
+ test("loads the lexicon the member's config declares, by module path, as any command does", async () => {
115
+ const root = workspace();
116
+ const { doc } = await intentGraph({ cwd: root, region: "db/schema.sql#app.users" });
117
+ intent.expectValid(doc);
118
+ expect(region(doc)).toMatchObject({ lines: { start: 2, end: 4 }, symbol: { qualified: "app.users", kind: "table" } });
119
+ });
120
+
121
+ test("a file in a member with no such lexicon, or whose lexicon fails, stays intent-symbol-unsupported and says why", async () => {
122
+ const root = workspace();
123
+ const other = await intentGraph({ cwd: root, region: "notes/schema.sql#app.users" });
124
+ intent.expectValid(other.doc);
125
+ expect("error" in other.doc && other.doc.error.code).toBe("intent-symbol-unsupported");
126
+ const broken = await intentGraph({
127
+ cwd: root,
128
+ region: "db/schema.sql#app.users",
129
+ loadLexicon: async () => {
130
+ throw new Error("Cannot find package");
131
+ },
132
+ });
133
+ expect("error" in broken.doc && broken.doc.error).toMatchObject({ code: "intent-symbol-unsupported", message: expect.stringContaining('lexicon "sqlish" could not be loaded: Cannot find package') });
134
+ });
135
+
136
+ test("a malformed resolver or bad declarations are dropped, not read as lines", async () => {
137
+ const root = workspace();
138
+ const got = await memberSymbolResolvers(join(root, "db"), async () => ({
139
+ symbolResolvers: () => [
140
+ { language: "bad", extensions: ["sql"], declarations: () => [] },
141
+ { language: "ok", extensions: [".sql"], declarations: () => [{ qualified: "t", kind: "table", lines: { start: 3, end: 1 } }, { qualified: "u", kind: "table", lines: { start: 1, end: 2 } }] },
142
+ ],
143
+ }));
144
+ expect(got.problems).toEqual([expect.stringContaining("not { language, extensions")]);
145
+ expect(got.resolvers).toHaveLength(1);
146
+ expect(got.resolvers[0].declarations("x.sql", "")).toEqual([{ qualified: "u", kind: "table", lines: { start: 1, end: 2 } }]);
147
+ });
148
+ });
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Symbol resolvers a member's lexicons contribute (#3313), for
3
+ * `chant workspace graph --intent <path>#<symbol>` on a file core's own
4
+ * resolver does not read (`symbols.ts`).
5
+ *
6
+ * The lexicons are the ones the member's `chant.config.ts` (or `.json`)
7
+ * names, read without running the config when it can be read statically
8
+ * (`../config-static.ts`), and by loading it as `chant run` does otherwise.
9
+ * Each is loaded as any command loads it (`loadPlugin`), and its plugin's
10
+ * `symbolResolvers()` answers. A lexicon that can't be loaded, or whose
11
+ * resolvers are malformed, contributes nothing, and the reason is kept so a
12
+ * refusal can say why the file has no resolver.
13
+ */
14
+
15
+ import { join } from "node:path";
16
+ import { lexiconNames } from "../lexicon-module";
17
+ import type { SymbolDeclaration, SymbolResolver } from "./symbols";
18
+
19
+ /** Loads a lexicon plugin by name; `loadPlugin` from the CLI unless a test swaps it. */
20
+ export type SymbolPluginLoader = (name: string) => Promise<{ name?: string; symbolResolvers?: () => unknown }>;
21
+
22
+ export interface MemberSymbolResolvers {
23
+ resolvers: SymbolResolver[];
24
+ /** Why a lexicon contributed nothing it may have meant to: its config or plugin couldn't be read, or a resolver was malformed. */
25
+ problems: string[];
26
+ }
27
+
28
+ const firstLine = (err: unknown): string => (err instanceof Error ? err.message : String(err)).split("\n")[0];
29
+
30
+ /** A resolver a plugin returned, checked: a language, extensions starting with a dot, and a declarations function. */
31
+ function checked(lexicon: string, value: unknown, problems: string[]): SymbolResolver | undefined {
32
+ const r = value as Partial<SymbolResolver> | null;
33
+ const ok =
34
+ r !== null &&
35
+ typeof r === "object" &&
36
+ typeof r.language === "string" &&
37
+ Array.isArray(r.extensions) &&
38
+ r.extensions.length > 0 &&
39
+ r.extensions.every((e) => typeof e === "string" && /^\.[^./\\]+$/.test(e)) &&
40
+ typeof r.declarations === "function";
41
+ if (!ok) {
42
+ problems.push(`lexicon "${lexicon}" returned a symbol resolver that is not { language, extensions: [".ext", ...], declarations(path, text) }`);
43
+ return undefined;
44
+ }
45
+ const declarations = r.declarations!.bind(r);
46
+ return {
47
+ language: `${r.language} (lexicon ${lexicon})`,
48
+ extensions: [...r.extensions!],
49
+ // A resolver's output is checked where it is used, so a bad entry is dropped rather than read as lines.
50
+ declarations(path: string, text: string): SymbolDeclaration[] {
51
+ const out = declarations(path, text);
52
+ if (!Array.isArray(out)) return [];
53
+ return out.filter(
54
+ (d) =>
55
+ d !== null &&
56
+ typeof d === "object" &&
57
+ typeof d.qualified === "string" &&
58
+ d.qualified !== "" &&
59
+ typeof d.kind === "string" &&
60
+ Number.isInteger(d.lines?.start) &&
61
+ Number.isInteger(d.lines?.end) &&
62
+ d.lines.start >= 1 &&
63
+ d.lines.end >= d.lines.start,
64
+ );
65
+ },
66
+ };
67
+ }
68
+
69
+ /** The lexicon names a member's config declares: read statically when it can be, else by loading the config. */
70
+ async function memberLexicons(dir: string): Promise<string[]> {
71
+ const { readLexiconDeclarationsStatically } = await import("../config-static");
72
+ const read = readLexiconDeclarationsStatically(dir);
73
+ if (read.status === "no-config") return [];
74
+ if (read.status === "read") {
75
+ const { registerLexiconDeclarations } = await import("../lexicon-module");
76
+ const { dirname } = await import("node:path");
77
+ registerLexiconDeclarations(read.entries, dirname(read.configPath));
78
+ return lexiconNames(read.entries);
79
+ }
80
+ const { loadChantConfig } = await import("../config");
81
+ const { config } = await loadChantConfig(dir);
82
+ return lexiconNames(config.lexicons ?? []);
83
+ }
84
+
85
+ /** The symbol resolvers the lexicons of the member at `dir` (on disk) contribute, in config order. */
86
+ export async function memberSymbolResolvers(dir: string, load?: SymbolPluginLoader): Promise<MemberSymbolResolvers> {
87
+ const problems: string[] = [];
88
+ let names: string[];
89
+ try {
90
+ names = await memberLexicons(dir);
91
+ } catch (err) {
92
+ return { resolvers: [], problems: [`its chant.config could not be read: ${firstLine(err)}`] };
93
+ }
94
+ const loader = load ?? ((await import("../cli/plugins")).loadPlugin as SymbolPluginLoader);
95
+ const resolvers: SymbolResolver[] = [];
96
+ for (const name of names) {
97
+ let plugin: Awaited<ReturnType<SymbolPluginLoader>>;
98
+ try {
99
+ plugin = await loader(name);
100
+ } catch (err) {
101
+ problems.push(`lexicon "${name}" could not be loaded: ${firstLine(err)}`);
102
+ continue;
103
+ }
104
+ if (typeof plugin.symbolResolvers !== "function") continue;
105
+ let listed: unknown;
106
+ try {
107
+ listed = plugin.symbolResolvers();
108
+ } catch (err) {
109
+ problems.push(`lexicon "${name}" symbolResolvers() threw: ${firstLine(err)}`);
110
+ continue;
111
+ }
112
+ if (!Array.isArray(listed)) {
113
+ problems.push(`lexicon "${name}" symbolResolvers() did not return a list`);
114
+ continue;
115
+ }
116
+ for (const r of listed) {
117
+ const ok = checked(name, r, problems);
118
+ if (ok) resolvers.push(ok);
119
+ }
120
+ }
121
+ return { resolvers, problems };
122
+ }
123
+
124
+ /** The member directory on disk for a member's `dir` under the workspace root. */
125
+ export const memberDirOnDisk = (root: string, dir: string): string => (dir === "." ? root : join(root, ...dir.split("/")));
@@ -194,6 +194,69 @@ describe("chant workspace upgrade", () => {
194
194
  expect(git(proj, ["status", "--porcelain"])).toBe("");
195
195
  });
196
196
 
197
+ describe("a CI workflow a chant member builds is rebuilt with this chant (#3244)", () => {
198
+ const WS = JSON.stringify({ name: "proj", schema: 1, members: [{ name: "delivery", dir: "delivery", kind: "chant" }] }, null, 2) + "\n";
199
+ const PKG = JSON.stringify({ name: "delivery", scripts: { "ci:build": "chant build ci --lexicon github -o ../.github/workflows/ci.yml", "ci:check": "npm run ci:build && git diff --exit-code ../.github/workflows/ci.yml", "agents": "chant build agents --lexicon fountain -o ../.studio/agents.yaml" } }, null, 2) + "\n";
200
+ const OLD = "steps:\n - uses: actions/checkout@v4\n";
201
+ const NEW = "steps:\n - uses: actions/checkout@v7\n";
202
+ /** A chant whose github lexicon now emits @v7: `build` writes NEW where -o points. */
203
+ const builds = (calls: Array<{ command: string; cwd: string; args?: readonly string[] }>, output = NEW): ChantRunner => async (command, cwd, args) => {
204
+ calls.push({ command, cwd, args });
205
+ const o = args?.indexOf("-o") ?? -1;
206
+ if (o >= 0) put(cwd, args![o + 1], output);
207
+ return { exitCode: 0, output: "" };
208
+ };
209
+
210
+ beforeEach(() => {
211
+ release("v2.0.0", { "chant.workspace.json": WS, "delivery/chant.config.ts": "export default {};\n", "delivery/package.json": PKG, ".github/workflows/ci.yml": OLD });
212
+ });
213
+
214
+ test("an upgrade to the same version puts the rebuilt workflow in the patch, and only the CI workflow", async () => {
215
+ // A box planted at v2.0.0 with the chant of then.
216
+ const port = ledger();
217
+ const staged0 = await upgradeCommand({ root: proj, to: "v2.0.0", runChant: passing, ledger: port, now: "2026-10-03T00:00:00.000Z" });
218
+ port.approve(staged0.staged!.digest, "2026-10-03T00:01:00.000Z");
219
+ expect((await upgradeCommand({ root: proj, to: "v2.0.0", runChant: passing, ledger: port, now: "2026-10-03T00:02:00.000Z" })).outcome).toBe("applied");
220
+ commitProject("at v2");
221
+ expect(read(proj, ".github/workflows/ci.yml")).toBe(OLD);
222
+
223
+ // chant is upgraded; the template is not. The workflow ci.ts builds now differs.
224
+ const calls: Array<{ command: string; cwd: string; args?: readonly string[] }> = [];
225
+ const staged = await stageUpgrade({ root: proj, to: "v2.0.0", runChant: builds(calls) });
226
+ try {
227
+ expect(staged.workflows).toEqual([{ member: "delivery", script: "ci:build", path: ".github/workflows/ci.yml", command: "chant build ci --lexicon github -o ../.github/workflows/ci.yml", status: "rebuilt" }]);
228
+ expect(calls[0]).toEqual({ command: "build", cwd: join(staged.worktreeProject, "delivery"), args: ["ci", "--lexicon", "github", "-o", "../.github/workflows/ci.yml"] });
229
+ // The agents script writes no CI workflow, so it is not run.
230
+ expect(calls.some((c) => c.args?.includes("agents"))).toBe(false);
231
+ expect(staged.changed).toBe(true);
232
+ expect(staged.changedPaths).toEqual([".github/workflows/ci.yml"]);
233
+ expect(staged.governance?.paths).toEqual([".github/workflows/ci.yml"]);
234
+ expect(read(proj, ".github/workflows/ci.yml")).toBe(OLD);
235
+ } finally {
236
+ staged.dispose();
237
+ }
238
+
239
+ // Once it is committed as built, the next upgrade finds nothing to do.
240
+ put(proj, ".github/workflows/ci.yml", NEW);
241
+ commitProject("ci:build");
242
+ const again = await stageUpgrade({ root: proj, to: "v2.0.0", runChant: builds([]) });
243
+ try {
244
+ expect(again.workflows.map((w) => w.status)).toEqual(["unchanged"]);
245
+ expect(again.changed).toBe(false);
246
+ } finally {
247
+ again.dispose();
248
+ }
249
+ });
250
+
251
+ test("a workflow that does not build fails the build check and stays as it was", async () => {
252
+ const failing: ChantRunner = async (_command, _cwd, args) => (args?.length ? { exitCode: 1, output: "cannot find @intentius/chant-lexicon-github\n" } : { exitCode: 0, output: "" });
253
+ const result = await upgradeCommand({ root: proj, to: "v2.0.0", runChant: failing });
254
+ expect(result.outcome).toBe("checks-failed");
255
+ expect(result.staged!.workflows.map((w) => w.status)).toEqual(["failed"]);
256
+ expect(result.staged!.checks).toEqual(expect.arrayContaining([expect.objectContaining({ name: "build", status: "failed", member: "delivery", detail: expect.stringMatching(/\.github\/workflows\/ci\.yml could not be rebuilt[\s\S]*cannot find/) })]));
257
+ });
258
+ });
259
+
197
260
  test("gates on the patch digest, then applies exactly the approved patch", async () => {
198
261
  release("v2.0.0", { "README.md": "starter v2\n" });
199
262
  const port = ledger();
@@ -21,6 +21,9 @@
21
21
  * 4. Merge per file (ws-005): an edited file takes the new version only when
22
22
  * every hunk merges cleanly. Otherwise it stays as it was, with one manual
23
23
  * step. The worktree never holds conflict markers.
24
+ * Then rebuild each CI workflow a chant member's package.json builds with
25
+ * `chant build ... -o <workflow>` (#3244), with the chant doing the
26
+ * upgrade, so the committed workflow follows that chant's composites.
24
27
  * 5. Check the worktree: `chant build` and `chant lint` when the project is a
25
28
  * chant project, and the lineage checks of `chant workspace check`.
26
29
  * 6. Bind the gate to the digest of the resulting patch: the pending fact and
@@ -34,7 +37,7 @@
34
37
  */
35
38
 
36
39
  import { execFileSync, spawn } from "node:child_process";
37
- import { chmodSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
40
+ import { chmodSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
38
41
  import { tmpdir } from "node:os";
39
42
  import { basename, dirname, join, relative, resolve, sep } from "node:path";
40
43
  import { computePlanDigest } from "../lifecycle/plan-digest";
@@ -64,6 +67,7 @@ import { pathsInsideNested } from "./nesting";
64
67
  import { carryParameters, readManifest, substituteParameters } from "./template-manifest";
65
68
  import { repinSubstituted, type RepinnedRecord } from "./template-pins";
66
69
  import { workingTree } from "./tree";
70
+ import { splitCommandLine } from "./checks/generated";
67
71
 
68
72
  /** The kind the patch digest is taken under, so it never collides with another kind of plan. */
69
73
  export const UPGRADE_PLAN_KIND = "workspace-upgrade";
@@ -86,22 +90,26 @@ export interface UpgradeCheck {
86
90
  member?: string;
87
91
  }
88
92
 
89
- /** Runs `chant build` or `chant lint` in a directory. */
90
- export type ChantRunner = (command: "build" | "lint", cwd: string) => Promise<{ exitCode: number; output: string }>;
93
+ /**
94
+ * Runs `chant build` or `chant lint` in a directory, with `args` after the
95
+ * command when given (a workflow rebuild's `ci --lexicon github -o <file>`,
96
+ * #3244).
97
+ */
98
+ export type ChantRunner = (command: "build" | "lint", cwd: string, args?: readonly string[]) => Promise<{ exitCode: number; output: string }>;
91
99
 
92
100
  /**
93
101
  * The default runner: this same chant, in a child process. The child sees the
94
102
  * worktree's sources and resolves packages the way the project does, since the
95
103
  * worktree sits inside the project.
96
104
  */
97
- export const spawnChant: ChantRunner = (command, cwd) =>
105
+ export const spawnChant: ChantRunner = (command, cwd, args = []) =>
98
106
  new Promise((resolvePromise, reject) => {
99
107
  const entry = process.argv[1];
100
108
  if (!entry) {
101
109
  reject(new UpgradeError("cannot find the chant entry point to run build and lint in the worktree"));
102
110
  return;
103
111
  }
104
- const child = spawn(process.execPath, [...process.execArgv, entry, command], { cwd, stdio: ["ignore", "pipe", "pipe"], env: process.env });
112
+ const child = spawn(process.execPath, [...process.execArgv, entry, command, ...args], { cwd, stdio: ["ignore", "pipe", "pipe"], env: process.env });
105
113
  const out: Buffer[] = [];
106
114
  child.stdout.on("data", (c: Buffer) => out.push(c));
107
115
  child.stderr.on("data", (c: Buffer) => out.push(c));
@@ -139,6 +147,121 @@ export interface UpgradeOptions {
139
147
  runChant?: ChantRunner;
140
148
  }
141
149
 
150
+ /**
151
+ * A CI workflow a chant member's package.json builds, and what rebuilding it
152
+ * did (#3244). `rebuilt`: the workflow chant builds now differs from the one
153
+ * committed, and the patch carries the new one. `unchanged`: it is the same.
154
+ * `failed`: the build failed, the file is left as the merge left it, and the
155
+ * upgrade's `build` check fails with the output.
156
+ */
157
+ export interface RebuiltWorkflow {
158
+ /** The chant member whose package.json script builds it. */
159
+ member: string;
160
+ /** The script's name, such as `ci:build`. */
161
+ script: string;
162
+ /** The workflow, relative to the repository root. */
163
+ path: string;
164
+ /** The command line, as the script has it. */
165
+ command: string;
166
+ status: "rebuilt" | "unchanged" | "failed";
167
+ /** The tail of the build's output, when it failed. */
168
+ detail?: string;
169
+ }
170
+
171
+ /** A CI workflow path a forge reads, relative to the repository root. The governance list's pipeline entries. */
172
+ const CI_WORKFLOW = [/(^|\/)\.github\/workflows\/[^/]+\.ya?ml$/, /(^|\/)\.forgejo\/workflows\/[^/]+\.ya?ml$/, /(^|\/)\.gitea\/workflows\/[^/]+\.ya?ml$/, /(^|\/)\.gitlab-ci\.ya?ml$/];
173
+
174
+ /**
175
+ * The CI workflows the chant members under `worktreeProject` build: each
176
+ * package.json script that is one `chant build ... -o <file>` command (no
177
+ * shell, no `&&`), whose output is a committed CI workflow inside the scope.
178
+ * The studio kit's template has `"ci:build": "chant build ci --lexicon github
179
+ * -o ../.github/workflows/ci.yml"` in delivery/, and its CI fails when the
180
+ * committed workflow differs from what ci/ci.ts builds.
181
+ */
182
+ function workflowBuilds(worktree: string, worktreeProject: string, scopeRepoPath: string): Array<{ member: string; script: string; command: string; args: string[]; abs: string; path: string }> {
183
+ const out: Array<{ member: string; script: string; command: string; args: string[]; abs: string; path: string }> = [];
184
+ for (const member of chantMemberDirs(worktreeProject)) {
185
+ const dir = member === "." ? worktreeProject : join(worktreeProject, member);
186
+ let scripts: Record<string, unknown>;
187
+ try {
188
+ scripts = (JSON.parse(readFileSync(join(dir, "package.json"), "utf-8")) as { scripts?: Record<string, unknown> }).scripts ?? {};
189
+ } catch {
190
+ continue;
191
+ }
192
+ for (const [script, line] of Object.entries(scripts)) {
193
+ if (typeof line !== "string") continue;
194
+ const words = splitCommandLine(line);
195
+ if (!words || words[0] !== "chant" || words[1] !== "build") continue;
196
+ const flag = words.findIndex((w) => w === "-o" || w === "--output");
197
+ const target = flag >= 0 ? words[flag + 1] : words.find((w) => w.startsWith("--output="))?.slice("--output=".length);
198
+ if (!target) continue;
199
+ const abs = resolve(dir, target);
200
+ const path = relative(worktree, abs).split(sep).join("/");
201
+ if (path.startsWith("../") || !CI_WORKFLOW.some((re) => re.test(path))) continue;
202
+ if (scopeRepoPath !== "." && !path.startsWith(`${scopeRepoPath}/`)) continue;
203
+ if (!existsSync(abs)) continue;
204
+ out.push({ member, script, command: line, args: words.slice(2), abs, path });
205
+ }
206
+ }
207
+ return out;
208
+ }
209
+
210
+ /**
211
+ * Rebuild the CI workflows {@link workflowBuilds} finds (#3244), each in its
212
+ * member's directory of the staging worktree with that member's node_modules
213
+ * linked in from the project. A workflow is built from the member's sources
214
+ * through the lexicon's composites, so upgrading chant can change it with no
215
+ * change to the sources (#2621 moved Checkout and SetupNode from v4 to v7),
216
+ * and a committed copy then fails the project's own ci:check. Rebuilding it
217
+ * here puts the new workflow in the patch the gate approves. The links are
218
+ * removed before the patch is taken. A build that fails leaves the file as
219
+ * the merge left it.
220
+ */
221
+ async function rebuildWorkflows(root: string, worktree: string, worktreeProject: string, scopeRepoPath: string, run: ChantRunner): Promise<RebuiltWorkflow[]> {
222
+ const builds = workflowBuilds(worktree, worktreeProject, scopeRepoPath);
223
+ if (builds.length === 0) return [];
224
+ const linked: string[] = [];
225
+ const results: RebuiltWorkflow[] = [];
226
+ try {
227
+ for (const member of new Set(builds.map((b) => b.member))) {
228
+ if (member === ".") continue;
229
+ const from = join(root, member, "node_modules");
230
+ const to = join(worktreeProject, member, "node_modules");
231
+ if (existsSync(from) && !existsSync(to) && existsSync(dirname(to))) {
232
+ symlinkSync(from, to, "dir");
233
+ linked.push(to);
234
+ }
235
+ }
236
+ for (const b of builds) {
237
+ const before = readFileSync(b.abs);
238
+ const r = await run("build", b.member === "." ? worktreeProject : join(worktreeProject, b.member), b.args);
239
+ const base = { member: b.member, script: b.script, path: b.path, command: b.command };
240
+ if (r.exitCode !== 0) {
241
+ writeFileSync(b.abs, before);
242
+ results.push({ ...base, status: "failed", detail: tail(r.output) });
243
+ continue;
244
+ }
245
+ const after = existsSync(b.abs) ? readFileSync(b.abs) : null;
246
+ if (after === null) {
247
+ writeFileSync(b.abs, before);
248
+ results.push({ ...base, status: "failed", detail: `\`${b.command}\` exited 0 and wrote no ${b.path}` });
249
+ continue;
250
+ }
251
+ results.push({ ...base, status: after.equals(before) ? "unchanged" : "rebuilt" });
252
+ }
253
+ } finally {
254
+ for (const l of linked) {
255
+ try {
256
+ if (lstatSync(l).isSymbolicLink()) unlinkSync(l);
257
+ } catch {
258
+ // Already gone.
259
+ }
260
+ }
261
+ }
262
+ return results;
263
+ }
264
+
142
265
  export interface GovernanceChange {
143
266
  /** Changed governance paths, relative to the repository root. */
144
267
  paths: string[];
@@ -166,6 +289,8 @@ export interface StagedUpgrade {
166
289
  migrations: string[];
167
290
  /** The migrations chant ships (./chant-migrations.ts) that found something to move, applied or not. */
168
291
  chantMigrations: ChantMigrationReport[];
292
+ /** The CI workflows a chant member builds, rebuilt with this chant before the patch was taken (#3244). */
293
+ workflows: RebuiltWorkflow[];
169
294
  written: string[];
170
295
  merged: string[];
171
296
  removed: string[];
@@ -694,6 +819,10 @@ export async function stageUpgrade(options: UpgradeOptions): Promise<StagedUpgra
694
819
  writeLock(worktreeProject, next);
695
820
  const lockText = renderLock(next);
696
821
 
822
+ // The CI workflows a chant member builds, rebuilt with this chant (#3244),
823
+ // before the patch is taken so the gate approves them with the rest.
824
+ const workflows = lineage.kind === "template" ? await rebuildWorkflows(root, worktree, worktreeProject, scopeRepoPath, options.runChant ?? spawnChant) : [];
825
+
697
826
  // The patch, taken before anything else runs in the worktree.
698
827
  gitOut(worktree, ["add", "-A"]);
699
828
  if (!lockTracked) gitOut(worktree, ["rm", "--cached", "-q", "--ignore-unmatch", "--", lockRepoPath]);
@@ -730,6 +859,14 @@ export async function stageUpgrade(options: UpgradeOptions): Promise<StagedUpgra
730
859
 
731
860
  // 5. Checks.
732
861
  const checks: UpgradeCheck[] = [];
862
+ for (const w of workflows.filter((w) => w.status === "failed")) {
863
+ checks.push({
864
+ name: "build",
865
+ status: "failed",
866
+ member: w.member,
867
+ detail: `${w.path} could not be rebuilt with \`${w.command}\` (the ${w.script} script), so it may differ from what this chant builds:\n${w.detail ?? ""}`,
868
+ });
869
+ }
733
870
  for (const m of chantMigrations.filter((m) => !m.applied)) {
734
871
  checks.push({
735
872
  name: "migration",
@@ -783,6 +920,7 @@ export async function stageUpgrade(options: UpgradeOptions): Promise<StagedUpgra
783
920
  ...(upstream.commit ? { commit: { ...(lineage.address?.commit ? { from: lineage.address.commit } : {}), to: upstream.commit } } : {}),
784
921
  migrations: [...plan.chain.map((m) => m.migration.id), ...chantMigrations.filter((m) => m.applied).map((m) => m.id)],
785
922
  chantMigrations,
923
+ workflows,
786
924
  written: result.written,
787
925
  merged: result.merged,
788
926
  removed: result.removed,
@@ -885,6 +1023,9 @@ export function describeStaged(staged: StagedUpgrade): string[] {
885
1023
  for (const n of m.notMoved) lines.push(` not moved: ${n.what} -> ${n.where}`);
886
1024
  for (const c of m.conflicts) lines.push(` conflict: ${at(c.path)}: ${c.reason}`);
887
1025
  }
1026
+ for (const w of staged.workflows) {
1027
+ if (w.status !== "unchanged") lines.push(` workflow ${w.status === "rebuilt" ? "rebuilt" : "not rebuilt"}: ${w.path} (${w.script}: ${w.command})`);
1028
+ }
888
1029
  for (const p of staged.written) lines.push(` updated: ${at(p)}`);
889
1030
  for (const p of staged.merged) lines.push(` merged: ${at(p)}`);
890
1031
  for (const p of staged.removed) lines.push(` removed: ${at(p)}`);