@intentius/chant 0.124.31 → 0.124.32

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 (321) hide show
  1. package/bin/chant +7 -2
  2. package/dist/cli/commands/check-lexicon-plugin.d.ts +7 -4
  3. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  4. package/dist/cli/commands/check-lexicon-plugin.js +10 -7
  5. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  6. package/dist/cli/commands/check-lexicon.js +18 -12
  7. package/dist/cli/commands/import.d.ts +10 -0
  8. package/dist/cli/commands/import.d.ts.map +1 -1
  9. package/dist/cli/commands/import.js +37 -0
  10. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  11. package/dist/cli/commands/init-lexicon/templates/project.js +4 -3
  12. package/dist/cli/commands/onboard.d.ts.map +1 -1
  13. package/dist/cli/commands/onboard.js +8 -4
  14. package/dist/cli/commands/update.d.ts.map +1 -1
  15. package/dist/cli/commands/update.js +2 -1
  16. package/dist/cli/dependencies.d.ts +18 -0
  17. package/dist/cli/dependencies.d.ts.map +1 -0
  18. package/dist/cli/dependencies.js +120 -0
  19. package/dist/cli/handlers/build.d.ts.map +1 -1
  20. package/dist/cli/handlers/build.js +23 -4
  21. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  22. package/dist/cli/handlers/fan-out.js +12 -4
  23. package/dist/cli/handlers/graph.d.ts.map +1 -1
  24. package/dist/cli/handlers/graph.js +16 -6
  25. package/dist/cli/handlers/lint.d.ts.map +1 -1
  26. package/dist/cli/handlers/lint.js +6 -0
  27. package/dist/cli/handlers/operator.d.ts +2 -2
  28. package/dist/cli/handlers/operator.js +3 -3
  29. package/dist/cli/handlers/pr.d.ts +14 -0
  30. package/dist/cli/handlers/pr.d.ts.map +1 -1
  31. package/dist/cli/handlers/pr.js +488 -32
  32. package/dist/cli/handlers/promote.d.ts.map +1 -1
  33. package/dist/cli/handlers/promote.js +3 -1
  34. package/dist/cli/handlers/run.d.ts +13 -1
  35. package/dist/cli/handlers/run.d.ts.map +1 -1
  36. package/dist/cli/handlers/run.js +38 -15
  37. package/dist/cli/main.d.ts.map +1 -1
  38. package/dist/cli/main.js +44 -16
  39. package/dist/cli/parse-args.d.ts.map +1 -1
  40. package/dist/cli/parse-args.js +15 -0
  41. package/dist/cli/registry.d.ts +13 -4
  42. package/dist/cli/registry.d.ts.map +1 -1
  43. package/dist/cli/registry.js +6 -2
  44. package/dist/codegen/generate-post-synth-barrel.js +2 -2
  45. package/dist/codegen/lexicon-regen.d.ts +4 -0
  46. package/dist/codegen/lexicon-regen.d.ts.map +1 -1
  47. package/dist/codegen/lexicon-regen.js +1 -1
  48. package/dist/codegen/pinned-upgrade.js +2 -2
  49. package/dist/components/capability.d.ts +44 -3
  50. package/dist/components/capability.d.ts.map +1 -1
  51. package/dist/components/capability.js +21 -0
  52. package/dist/components/changed-files.d.ts +7 -1
  53. package/dist/components/changed-files.d.ts.map +1 -1
  54. package/dist/components/changed-files.js +9 -1
  55. package/dist/components/driver.d.ts +38 -0
  56. package/dist/components/driver.d.ts.map +1 -1
  57. package/dist/components/driver.js +47 -6
  58. package/dist/components/fan-out-record.d.ts +6 -1
  59. package/dist/components/fan-out-record.d.ts.map +1 -1
  60. package/dist/components/fan-out-record.js +24 -0
  61. package/dist/components/fan-out-run.d.ts +20 -0
  62. package/dist/components/fan-out-run.d.ts.map +1 -1
  63. package/dist/components/fan-out-run.js +21 -1
  64. package/dist/components/pr-pipeline.d.ts +65 -2
  65. package/dist/components/pr-pipeline.d.ts.map +1 -1
  66. package/dist/components/pr-pipeline.js +107 -15
  67. package/dist/components/pr-run.d.ts +127 -29
  68. package/dist/components/pr-run.d.ts.map +1 -1
  69. package/dist/components/pr-run.js +290 -70
  70. package/dist/components/wave-plan.d.ts +5 -2
  71. package/dist/components/wave-plan.d.ts.map +1 -1
  72. package/dist/components/wave-plan.js +12 -1
  73. package/dist/discovery/fold-import.d.ts.map +1 -1
  74. package/dist/discovery/fold-import.js +16 -6
  75. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  76. package/dist/discovery/sandbox/bundle.js +6 -0
  77. package/dist/discovery/specifier-resolve.d.ts.map +1 -1
  78. package/dist/discovery/specifier-resolve.js +8 -2
  79. package/dist/fold/fold.d.ts.map +1 -1
  80. package/dist/fold/fold.js +68 -1
  81. package/dist/fold/subset.d.ts +37 -0
  82. package/dist/fold/subset.d.ts.map +1 -1
  83. package/dist/fold/subset.js +88 -0
  84. package/dist/lexicon-module.d.ts +10 -0
  85. package/dist/lexicon-module.d.ts.map +1 -1
  86. package/dist/lexicon-module.js +53 -8
  87. package/dist/lexicon-plugin-helpers.d.ts.map +1 -1
  88. package/dist/lexicon-plugin-helpers.js +6 -4
  89. package/dist/lexicon.d.ts +2 -0
  90. package/dist/lexicon.d.ts.map +1 -1
  91. package/dist/lifecycle/affected.d.ts.map +1 -1
  92. package/dist/lifecycle/affected.js +7 -1
  93. package/dist/lifecycle/release-ledger.d.ts +21 -0
  94. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  95. package/dist/lifecycle/release-ledger.js +24 -0
  96. package/dist/lifecycle/work-dir.d.ts +45 -0
  97. package/dist/lifecycle/work-dir.d.ts.map +1 -0
  98. package/dist/lifecycle/work-dir.js +78 -0
  99. package/dist/lint/discover.d.ts +17 -9
  100. package/dist/lint/discover.d.ts.map +1 -1
  101. package/dist/lint/discover.js +62 -54
  102. package/dist/module-source.d.ts +57 -0
  103. package/dist/module-source.d.ts.map +1 -0
  104. package/dist/module-source.js +104 -0
  105. package/dist/op/activities/factory.js +1 -1
  106. package/dist/op/discover.d.ts.map +1 -1
  107. package/dist/op/discover.js +13 -3
  108. package/dist/op/gate.d.ts.map +1 -1
  109. package/dist/op/gate.js +3 -0
  110. package/dist/op/op-waves-run.d.ts.map +1 -1
  111. package/dist/op/op-waves-run.js +20 -5
  112. package/dist/op/operator.d.ts +2 -2
  113. package/dist/op/operator.js +2 -2
  114. package/dist/op/steward.d.ts +6 -4
  115. package/dist/op/steward.d.ts.map +1 -1
  116. package/dist/op/steward.js +5 -3
  117. package/dist/op/work-lease-run.d.ts +20 -7
  118. package/dist/op/work-lease-run.d.ts.map +1 -1
  119. package/dist/op/work-lease-run.js +56 -12
  120. package/dist/pr-forge.d.ts +10 -0
  121. package/dist/pr-forge.d.ts.map +1 -1
  122. package/dist/pr-forge.js +39 -0
  123. package/dist/pr-loop.d.ts +141 -4
  124. package/dist/pr-loop.d.ts.map +1 -1
  125. package/dist/pr-loop.js +122 -6
  126. package/dist/pr-report-url.d.ts +2 -2
  127. package/dist/pr-report-url.d.ts.map +1 -1
  128. package/dist/pr-report-url.js +5 -5
  129. package/dist/ts-loader.d.ts +38 -4
  130. package/dist/ts-loader.d.ts.map +1 -1
  131. package/dist/ts-loader.js +190 -16
  132. package/dist/wave-runtime.mjs +208 -208
  133. package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts +34 -0
  134. package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts.map +1 -0
  135. package/dist/workspace/chant-migrations/fountain-retired-kinds.js +176 -0
  136. package/dist/workspace/chant-migrations.d.ts.map +1 -1
  137. package/dist/workspace/chant-migrations.js +2 -0
  138. package/dist/workspace/checks/boxes.d.ts +6 -6
  139. package/dist/workspace/checks/boxes.js +9 -9
  140. package/dist/workspace/ci-green-forge.d.ts +6 -4
  141. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  142. package/dist/workspace/ci-green.d.ts +28 -12
  143. package/dist/workspace/ci-green.d.ts.map +1 -1
  144. package/dist/workspace/ci-green.js +49 -21
  145. package/dist/workspace/ci-list.schema.json +12 -6
  146. package/dist/workspace/ci-report-url.d.ts +18 -0
  147. package/dist/workspace/ci-report-url.d.ts.map +1 -0
  148. package/dist/workspace/ci-report-url.js +33 -0
  149. package/dist/workspace/ci-run-index.d.ts +12 -0
  150. package/dist/workspace/ci-run-index.d.ts.map +1 -1
  151. package/dist/workspace/ci-run-index.js +6 -4
  152. package/dist/workspace/ci-run-index.schema.json +5 -3
  153. package/dist/workspace/ci-run.d.ts +75 -2
  154. package/dist/workspace/ci-run.d.ts.map +1 -1
  155. package/dist/workspace/ci-run.js +195 -53
  156. package/dist/workspace/ci-runner-key.d.ts +16 -3
  157. package/dist/workspace/ci-runner-key.d.ts.map +1 -1
  158. package/dist/workspace/ci-runner-key.js +30 -10
  159. package/dist/workspace/ci-serve.d.ts +54 -4
  160. package/dist/workspace/ci-serve.d.ts.map +1 -1
  161. package/dist/workspace/ci-serve.js +175 -26
  162. package/dist/workspace/declaration.d.ts +8 -0
  163. package/dist/workspace/declaration.d.ts.map +1 -1
  164. package/dist/workspace/declaration.js +11 -2
  165. package/dist/workspace/declaration.schema.json +7 -2
  166. package/dist/workspace/export.d.ts +1 -1
  167. package/dist/workspace/export.d.ts.map +1 -1
  168. package/dist/workspace/export.js +7 -3
  169. package/dist/workspace/ls.d.ts +6 -1
  170. package/dist/workspace/ls.d.ts.map +1 -1
  171. package/dist/workspace/ls.js +1 -0
  172. package/dist/workspace/ls.schema.json +7 -1
  173. package/dist/workspace/pin-integrity.d.ts.map +1 -1
  174. package/dist/workspace/pin-integrity.js +3 -2
  175. package/dist/workspace/pr-report.schema.json +74 -7
  176. package/dist/workspace/reason-codes.d.ts +1 -1
  177. package/dist/workspace/reason-codes.d.ts.map +1 -1
  178. package/dist/workspace/reason-codes.js +2 -2
  179. package/dist/workspace/run-event.schema.json +3 -1
  180. package/dist/workspace/status.schema.json +3 -1
  181. package/dist/workspace/write-scope.d.ts +9 -0
  182. package/dist/workspace/write-scope.d.ts.map +1 -1
  183. package/dist/workspace/write-scope.js +11 -1
  184. package/package.json +1 -1
  185. package/src/__fixtures__/pr-loop/pr-apply-wave-waiting.note.golden.md +48 -0
  186. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +3 -3
  187. package/src/cli/commands/audit.test.ts +2 -2
  188. package/src/cli/commands/check-lexicon-plugin.test.ts +9 -0
  189. package/src/cli/commands/check-lexicon-plugin.ts +11 -8
  190. package/src/cli/commands/check-lexicon.test.ts +1 -1
  191. package/src/cli/commands/check-lexicon.ts +16 -11
  192. package/src/cli/commands/import.ts +40 -0
  193. package/src/cli/commands/init-lexicon/templates/project.ts +4 -3
  194. package/src/cli/commands/init-lexicon.test.ts +8 -5
  195. package/src/cli/commands/onboard.test.ts +45 -0
  196. package/src/cli/commands/onboard.ts +8 -4
  197. package/src/cli/commands/update.test.ts +6 -0
  198. package/src/cli/commands/update.ts +4 -1
  199. package/src/cli/compiled-cli.e2e.test.ts +76 -11
  200. package/src/cli/dependencies.e2e.test.ts +101 -0
  201. package/src/cli/dependencies.test.ts +93 -0
  202. package/src/cli/dependencies.ts +122 -0
  203. package/src/cli/handlers/build.test.ts +69 -0
  204. package/src/cli/handlers/build.ts +20 -4
  205. package/src/cli/handlers/fan-out.test.ts +73 -0
  206. package/src/cli/handlers/fan-out.ts +11 -4
  207. package/src/cli/handlers/graph.test.ts +76 -0
  208. package/src/cli/handlers/graph.ts +19 -12
  209. package/src/cli/handlers/lint.test.ts +42 -0
  210. package/src/cli/handlers/lint.ts +6 -0
  211. package/src/cli/handlers/operator.ts +3 -3
  212. package/src/cli/handlers/pr-waves.test.ts +449 -0
  213. package/src/cli/handlers/pr.test.ts +134 -0
  214. package/src/cli/handlers/pr.ts +523 -31
  215. package/src/cli/handlers/promote.test.ts +26 -1
  216. package/src/cli/handlers/promote.ts +3 -2
  217. package/src/cli/handlers/run-components-exit.test.ts +99 -0
  218. package/src/cli/handlers/run-signer.test.ts +79 -0
  219. package/src/cli/handlers/run.ts +34 -16
  220. package/src/cli/main.test.ts +18 -0
  221. package/src/cli/main.ts +43 -16
  222. package/src/cli/parse-args.ts +12 -0
  223. package/src/cli/registry.ts +19 -6
  224. package/src/codegen/generate-post-synth-barrel.ts +2 -2
  225. package/src/codegen/lexicon-regen.ts +1 -1
  226. package/src/codegen/pinned-upgrade.ts +2 -2
  227. package/src/codegen/post-synth-barrel-guards.test.ts +6 -11
  228. package/src/components/capability.ts +51 -3
  229. package/src/components/changed-files.test.ts +16 -1
  230. package/src/components/changed-files.ts +9 -1
  231. package/src/components/driver.test.ts +36 -1
  232. package/src/components/driver.ts +76 -4
  233. package/src/components/fan-out-record.ts +29 -1
  234. package/src/components/fan-out-run.test.ts +35 -0
  235. package/src/components/fan-out-run.ts +40 -1
  236. package/src/components/pr-pipeline.test.ts +100 -0
  237. package/src/components/pr-pipeline.ts +132 -17
  238. package/src/components/pr-run.test.ts +323 -18
  239. package/src/components/pr-run.ts +354 -75
  240. package/src/components/wave-plan.ts +16 -4
  241. package/src/discovery/fold-host-method.test.ts +87 -0
  242. package/src/discovery/fold-import.ts +15 -5
  243. package/src/discovery/fold-package-composite.test.ts +27 -0
  244. package/src/discovery/fold-specifiers.test.ts +8 -0
  245. package/src/discovery/sandbox/bundle.ts +6 -0
  246. package/src/discovery/specifier-resolve.ts +8 -2
  247. package/src/fold/fold.test.ts +72 -0
  248. package/src/fold/fold.ts +71 -0
  249. package/src/fold/subset.test.ts +31 -0
  250. package/src/fold/subset.ts +99 -0
  251. package/src/lexicon-dist.e2e.test.ts +254 -0
  252. package/src/lexicon-module.test.ts +47 -0
  253. package/src/lexicon-module.ts +49 -7
  254. package/src/lexicon-plugin-helpers.ts +6 -4
  255. package/src/lexicon.ts +2 -0
  256. package/src/lifecycle/affected.test.ts +7 -0
  257. package/src/lifecycle/affected.ts +6 -1
  258. package/src/lifecycle/release-ledger.ts +34 -0
  259. package/src/lifecycle/work-dir.test.ts +77 -0
  260. package/src/lifecycle/work-dir.ts +82 -0
  261. package/src/lint/discover.test.ts +46 -2
  262. package/src/lint/discover.ts +55 -49
  263. package/src/module-source.test.ts +85 -0
  264. package/src/module-source.ts +112 -0
  265. package/src/op/activities/factory.ts +1 -1
  266. package/src/op/discover-root.test.ts +31 -2
  267. package/src/op/discover.ts +14 -4
  268. package/src/op/gate.test.ts +30 -0
  269. package/src/op/gate.ts +3 -0
  270. package/src/op/op-waves-run.ts +20 -5
  271. package/src/op/op-waves.test.ts +49 -0
  272. package/src/op/operator.ts +2 -2
  273. package/src/op/steward.ts +6 -4
  274. package/src/op/work-lease-run.test.ts +88 -2
  275. package/src/op/work-lease-run.ts +52 -12
  276. package/src/pr-forge-bundle.test.ts +2 -2
  277. package/src/pr-forge.test.ts +42 -0
  278. package/src/pr-forge.ts +40 -0
  279. package/src/pr-loop-bundle.test.ts +2 -1
  280. package/src/pr-loop.test.ts +117 -1
  281. package/src/pr-loop.ts +252 -10
  282. package/src/pr-report-url.ts +5 -5
  283. package/src/terraform/__fixtures__/advise.test.ts +21 -2
  284. package/src/ts-loader.test.ts +89 -1
  285. package/src/ts-loader.ts +180 -13
  286. package/src/workspace/changes.test.ts +1 -1
  287. package/src/workspace/chant-migrations/fountain-retired-kinds.test.ts +33 -0
  288. package/src/workspace/chant-migrations/fountain-retired-kinds.ts +190 -0
  289. package/src/workspace/chant-migrations.e2e.test.ts +5 -0
  290. package/src/workspace/chant-migrations.ts +2 -0
  291. package/src/workspace/checks/boxes.ts +9 -9
  292. package/src/workspace/ci-green-forge.ts +6 -4
  293. package/src/workspace/ci-green-runs.test.ts +53 -11
  294. package/src/workspace/ci-green.test.ts +1 -1
  295. package/src/workspace/ci-green.ts +50 -22
  296. package/src/workspace/ci-list.schema.json +12 -6
  297. package/src/workspace/ci-report-url.test.ts +220 -0
  298. package/src/workspace/ci-report-url.ts +33 -0
  299. package/src/workspace/ci-run-index.schema.json +5 -3
  300. package/src/workspace/ci-run-index.test.ts +42 -3
  301. package/src/workspace/ci-run-index.ts +18 -4
  302. package/src/workspace/ci-run.test.ts +185 -7
  303. package/src/workspace/ci-run.ts +224 -54
  304. package/src/workspace/ci-runner-key.test.ts +55 -17
  305. package/src/workspace/ci-runner-key.ts +36 -11
  306. package/src/workspace/ci-serve.test.ts +150 -6
  307. package/src/workspace/ci-serve.ts +169 -25
  308. package/src/workspace/declaration.schema.json +7 -2
  309. package/src/workspace/declaration.test.ts +23 -0
  310. package/src/workspace/declaration.ts +19 -3
  311. package/src/workspace/export.ts +6 -3
  312. package/src/workspace/ls.schema.json +7 -1
  313. package/src/workspace/ls.ts +7 -2
  314. package/src/workspace/pin-integrity.test.ts +5 -0
  315. package/src/workspace/pin-integrity.ts +3 -2
  316. package/src/workspace/pr-report.schema.json +74 -7
  317. package/src/workspace/reason-codes.ts +2 -2
  318. package/src/workspace/run-event.schema.json +3 -1
  319. package/src/workspace/status.schema.json +3 -1
  320. package/src/workspace/write-scope.test.ts +29 -1
  321. package/src/workspace/write-scope.ts +12 -1
package/bin/chant CHANGED
@@ -22,6 +22,11 @@ if [ -f "$MAIN_JS" ] && [ ! -f "$SCRIPT_DIR/../tsconfig.build.json" ]; then
22
22
  exec node "$MAIN_JS" "$@"
23
23
  fi
24
24
 
25
+ # From source, every chant package resolves through its `development` export
26
+ # condition to src/*.ts (#3981). A lexicon's `default` is the dist/*.js it
27
+ # publishes, which a checkout may not have built or may have built from older
28
+ # source. Child processes that reuse process.execArgv inherit the flag.
29
+ #
25
30
  # tsx is our own dependency, so register its hooks in this node process rather
26
31
  # than shelling `npx tsx`, which resolves a bin and then spawns a second node.
27
32
  # Worth ~30% of startup (#2481). Nested install first, then hoisted; npx stays
@@ -31,8 +36,8 @@ for CANDIDATE in \
31
36
  "$SCRIPT_DIR/../../../tsx/dist/loader.mjs"
32
37
  do
33
38
  if [ -f "$CANDIDATE" ]; then
34
- exec node --import "file://$CANDIDATE" "$MAIN_TS" "$@"
39
+ exec node --conditions=development --import "file://$CANDIDATE" "$MAIN_TS" "$@"
35
40
  fi
36
41
  done
37
42
 
38
- exec npx tsx "$MAIN_TS" "$@"
43
+ exec npx tsx --conditions=development "$MAIN_TS" "$@"
@@ -28,11 +28,14 @@ export interface LoadedLexicon {
28
28
  entry?: string;
29
29
  }
30
30
  /**
31
- * The module a lexicon package presents to consumers.
31
+ * The module a lexicon package presents to consumers, as its source.
32
32
  *
33
- * Tier 1 requires `exports["."].default` to be `./src/index.ts`, so that is the
34
- * first choice — it is the module core itself imports. The fallbacks keep this
35
- * usable on a lexicon that has not reached that check yet.
33
+ * Tier 1 requires `exports["."].development` to be `./src/index.ts` and
34
+ * `default` to be its compiled `./dist/index.js` (#3981). The check reads the
35
+ * lexicon's source, so `development` is the first choice: a `dist/` may be
36
+ * missing or older than the source. `default` and `main` come next, and the
37
+ * conventional paths keep this usable on a lexicon that has not reached that
38
+ * check yet.
36
39
  */
37
40
  export declare function pluginEntryFor(dir: string): string | undefined;
38
41
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"check-lexicon-plugin.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAIpE,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoB9D;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAyB5E;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,GAAG,OAAO,CAE/F;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAOvF"}
1
+ {"version":3,"file":"check-lexicon-plugin.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAIpE,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoB9D;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAyB5E;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,GAAG,OAAO,CAE/F;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAOvF"}
@@ -22,20 +22,23 @@ import { existsSync, readFileSync } from "fs";
22
22
  import { isAbsolute, join, resolve } from "path";
23
23
  import { pathToFileURL } from "url";
24
24
  import { isLexiconPlugin } from "../../lexicon.js";
25
- import { ensureTypeScriptLoader } from "../../ts-loader.js";
25
+ import { ensureTypeScriptLoaderFor } from "../../ts-loader.js";
26
26
  import { esModuleNamespace } from "../../module-interop.js";
27
27
  /**
28
- * The module a lexicon package presents to consumers.
28
+ * The module a lexicon package presents to consumers, as its source.
29
29
  *
30
- * Tier 1 requires `exports["."].default` to be `./src/index.ts`, so that is the
31
- * first choice — it is the module core itself imports. The fallbacks keep this
32
- * usable on a lexicon that has not reached that check yet.
30
+ * Tier 1 requires `exports["."].development` to be `./src/index.ts` and
31
+ * `default` to be its compiled `./dist/index.js` (#3981). The check reads the
32
+ * lexicon's source, so `development` is the first choice: a `dist/` may be
33
+ * missing or older than the source. `default` and `main` come next, and the
34
+ * conventional paths keep this usable on a lexicon that has not reached that
35
+ * check yet.
33
36
  */
34
37
  export function pluginEntryFor(dir) {
35
38
  const candidates = [];
36
39
  try {
37
40
  const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf-8"));
38
- for (const declared of [pkg.exports?.["."]?.default, pkg.main]) {
41
+ for (const declared of [pkg.exports?.["."]?.development, pkg.exports?.["."]?.default, pkg.main]) {
39
42
  if (typeof declared === "string")
40
43
  candidates.push(declared);
41
44
  }
@@ -64,7 +67,7 @@ export async function loadLexiconFromDir(dir) {
64
67
  }
65
68
  let mod;
66
69
  try {
67
- ensureTypeScriptLoader();
70
+ ensureTypeScriptLoaderFor(entry);
68
71
  mod = esModuleNamespace((await import(pathToFileURL(entry).href)));
69
72
  }
70
73
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"check-lexicon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAyBD,gEAAgE;AAChE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAIlE;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAyB/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAanC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAazE;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4mBpE;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAmDzE"}
1
+ {"version":3,"file":"check-lexicon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAyBD,gEAAgE;AAChE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAIlE;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAyB/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAanC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAazE;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAinBpE;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAmDzE"}
@@ -272,26 +272,32 @@ export async function checkLexicon(dir) {
272
272
  pass: chantVersionOk,
273
273
  detail: chantVersionDetail,
274
274
  });
275
- // chant #1067 — packaging shape ("all 11 lexicons route exports['.'].default
276
- // at ./src/index.ts and delete emitted JS in build") was real but
277
- // unenforced; a lexicon shipping differently would break consumers
278
- // silently. Cheap structural check on package.json, not a build execution.
275
+ // chant #1067 — packaging shape, real but unenforced before: a lexicon
276
+ // shipping differently would break consumers silently. Cheap structural
277
+ // check on package.json, not a build execution. #3981 — lexicons ship
278
+ // compiled JS: `default` is ./dist/index.js, `development` stays on
279
+ // ./src/index.ts for the repository's tools, and the build keeps the JS tsc
280
+ // emits (it used to delete it).
279
281
  const packageJsonRaw = readOr(join(dir, "package.json"));
280
282
  let packagingOk = false;
281
283
  let packagingDetail;
282
284
  if (packageJsonRaw) {
283
285
  try {
284
286
  const pkg = JSON.parse(packageJsonRaw);
287
+ const developmentExport = pkg.exports?.["."]?.development;
285
288
  const defaultExport = pkg.exports?.["."]?.default;
286
289
  const buildScript = pkg.scripts?.build ?? "";
287
- const exportOk = defaultExport === "./src/index.ts";
288
- const deletesEmittedJs = /-delete/.test(buildScript) && /\.js/.test(buildScript);
289
- packagingOk = exportOk && deletesEmittedJs;
290
+ const developmentOk = developmentExport === "./src/index.ts";
291
+ const defaultOk = defaultExport === "./dist/index.js";
292
+ const keepsEmittedJs = /tsconfig\.build\.json/.test(buildScript) && !/-delete/.test(buildScript);
293
+ packagingOk = developmentOk && defaultOk && keepsEmittedJs;
290
294
  const problems = [];
291
- if (!exportOk)
292
- problems.push(`exports["."].default is ${JSON.stringify(defaultExport)}, expected "./src/index.ts"`);
293
- if (!deletesEmittedJs)
294
- problems.push(`build script doesn't delete emitted .js from dist/: ${JSON.stringify(buildScript)}`);
295
+ if (!developmentOk)
296
+ problems.push(`exports["."].development is ${JSON.stringify(developmentExport)}, expected "./src/index.ts"`);
297
+ if (!defaultOk)
298
+ problems.push(`exports["."].default is ${JSON.stringify(defaultExport)}, expected "./dist/index.js"`);
299
+ if (!keepsEmittedJs)
300
+ problems.push(`build script must compile tsconfig.build.json and keep the emitted .js in dist/: ${JSON.stringify(buildScript)}`);
295
301
  packagingDetail = problems.length > 0 ? problems.join("; ") : undefined;
296
302
  }
297
303
  catch {
@@ -302,7 +308,7 @@ export async function checkLexicon(dir) {
302
308
  packagingDetail = "package.json missing or unreadable";
303
309
  }
304
310
  items.push({
305
- name: 'package.json routes exports["."].default at ./src/index.ts and deletes emitted JS in build',
311
+ name: 'package.json routes exports["."] development at ./src/index.ts and default at ./dist/index.js, and build keeps emitted JS',
306
312
  tier: 1,
307
313
  pass: packagingOk,
308
314
  detail: packagingDetail,
@@ -116,6 +116,16 @@ export interface ContentImportOptions {
116
116
  parserOptions?: string[];
117
117
  }
118
118
  export declare function importFromContent(options: ContentImportOptions): Promise<ImportResult>;
119
+ /**
120
+ * Build the source import wrote and name each error-severity post-synth
121
+ * finding that would stop `chant build` (#3605). The findings go through the
122
+ * same `lint.presets` and `lint.rules` filtering build applies, against the
123
+ * project config above `outputDir`, so a check the project turns off is not
124
+ * named. When the source does not build here (the lexicon is not installed
125
+ * beside it, or embedded content needs another lexicon's serializer), nothing
126
+ * is said: import reports what build would refuse, not why it cannot run.
127
+ */
128
+ export declare function buildErrorWarnings(plugin: LexiconPlugin, outputDir: string): Promise<string[]>;
119
129
  /**
120
130
  * Live import options — read from a running cloud/cluster instead of a file.
121
131
  */
@@ -1 +1 @@
1
- {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import.ts"],"names":[],"mappings":"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"}
@@ -395,6 +395,41 @@ async function parseWithEmbedded(parses, loaded, projectDir) {
395
395
  const embedded = new EmbeddedImports(importers);
396
396
  return { irs: parses.map((parse) => parse({ embedded })), embedded };
397
397
  }
398
+ /**
399
+ * Build the source import wrote and name each error-severity post-synth
400
+ * finding that would stop `chant build` (#3605). The findings go through the
401
+ * same `lint.presets` and `lint.rules` filtering build applies, against the
402
+ * project config above `outputDir`, so a check the project turns off is not
403
+ * named. When the source does not build here (the lexicon is not installed
404
+ * beside it, or embedded content needs another lexicon's serializer), nothing
405
+ * is said: import reports what build would refuse, not why it cannot run.
406
+ */
407
+ export async function buildErrorWarnings(plugin, outputDir) {
408
+ try {
409
+ const checks = plugin.postSynthChecks?.() ?? [];
410
+ if (checks.length === 0)
411
+ return [];
412
+ const [{ build }, { runPostSynthChecks }, { applyConfiguredPreset, applyConfiguredSeverity, resolvePresetIds }, { loadChantConfigUpward }] = await Promise.all([import("../../build.js"), import("../../lint/post-synth.js"), import("../../lint/config.js"), import("../../config.js")]);
413
+ const result = await build(outputDir, [plugin.serializer]);
414
+ if (result.errors.length > 0)
415
+ return [];
416
+ const { config } = await loadChantConfigUpward(outputDir);
417
+ const rules = config.lint?.rules;
418
+ // As build.ts runLexiconPostSynthChecks does: the plugin sees its own output only.
419
+ const output = result.outputs.get(plugin.serializer.name);
420
+ const outputs = new Map(output === undefined ? [] : [[plugin.serializer.name, output]]);
421
+ const diagnostics = runPostSynthChecks(checks, { ...result, outputs });
422
+ const presetIds = resolvePresetIds(plugin.lintPresets?.(), config.lint?.presets?.[plugin.name] ?? "recommended");
423
+ const afterPreset = applyConfiguredPreset(diagnostics, presetIds, rules).diagnostics;
424
+ return applyConfiguredSeverity(afterPreset, rules)
425
+ .diagnostics.filter((diag) => diag.severity === "error")
426
+ .map((diag) => `${diag.checkId}: ${diag.message.replace(/\.$/, "")}. chant build stops on this error; ` +
427
+ `change the generated source, or set lint.rules.${diag.checkId} to "off" in chant.config.ts.`);
428
+ }
429
+ catch {
430
+ return [];
431
+ }
432
+ }
398
433
  /** The shared tail of every template import: parse → generate → write. */
399
434
  async function parseAndWrite(plugin, content, outputDir, force, warnings, generatedFiles, lexicon, projectDir, parserOptionEntries) {
400
435
  // A lexicon can recognize a template (detectTemplate) without being able to
@@ -470,6 +505,8 @@ async function parseAndWrite(plugin, content, outputDir, force, warnings, genera
470
505
  writeFileSync(filePath, file.content);
471
506
  generatedFiles.push(file.path);
472
507
  }
508
+ // What `chant build` will refuse, said now rather than at the first build (#3605).
509
+ warnings.push(...(await buildErrorWarnings(plugin, outputDir)));
473
510
  return {
474
511
  success: true,
475
512
  generatedFiles,
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/init-lexicon/templates/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAwCxF;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAmB9C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA4BnF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA0BnH;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8BvD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAO9C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAuB7C"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/init-lexicon/templates/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAyCxF;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAmB9C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA4BnF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA0BnH;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8BvD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAO9C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAuB7C"}
@@ -12,12 +12,12 @@ export function generatePackageJson(name, names) {
12
12
  ".": {
13
13
  development: "./src/index.ts",
14
14
  types: "./dist/index.d.ts",
15
- default: "./src/index.ts",
15
+ default: "./dist/index.js",
16
16
  },
17
17
  "./*": {
18
18
  development: "./src/*.ts",
19
19
  types: "./dist/*.d.ts",
20
- default: "./src/*.ts",
20
+ default: "./dist/*.js",
21
21
  },
22
22
  "./manifest": "./dist/manifest.json",
23
23
  "./meta": "./dist/meta.json",
@@ -27,7 +27,8 @@ export function generatePackageJson(name, names) {
27
27
  generate: "npx tsx src/codegen/generate-cli.ts",
28
28
  validate: "npx tsx src/validate-cli.ts",
29
29
  docs: "npx tsx src/codegen/docs-cli.ts",
30
- build: 'tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && find dist -type f \\( -name "*.js" -o -name "*.js.map" \\) -delete',
30
+ // #3981 — the package ships the compiled dist/*.js its exports' `default` names.
31
+ build: "tsc -p tsconfig.build.json --sourceMap false && tsc-alias -p tsconfig.build.json",
31
32
  prepack: "npm run generate && npm run bundle && npm run validate && npm run build",
32
33
  bundle: "tsx src/package-cli.ts",
33
34
  },
@@ -1 +1 @@
1
- {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAwFD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAyB9E;AAuDD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoB7E;AAyFD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAqB3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAU5E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA2DrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C3F"}
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyFD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAyB9E;AAuDD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoB7E;AA4FD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAqB3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAU5E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA2DrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C3F"}
@@ -9,13 +9,14 @@ function findRepoRoot() {
9
9
  return dirname(dirname(dirname(dirname(dirname(here))))); // -> root
10
10
  }
11
11
  /**
12
- * A real prepack invocation line: a Dockerfile `RUN`, a workflow `- run:`,
13
- * or a bare line inside a `run: |` block. Comments, `echo` messages and
12
+ * A real prepack invocation line: a Dockerfile `RUN`, a workflow `- run:` or
13
+ * `run:` step key (a named step puts `run:` on its own line, #2877), or a bare
14
+ * line inside a `run: |` block. Comments, `echo` messages and
14
15
  * `$lex` / `<lex>` placeholders do not match. Matching those placeholder
15
16
  * substrings was how onboard appended duplicates to Dockerfile.smoke on
16
17
  * every run (#1678).
17
18
  */
18
- const PREPACK_LINE = /^\s*(?:RUN\s+|-\s*run:\s*)?npm run --prefix lexicons\/[a-z0-9-]+ prepack\s*$/i;
19
+ const PREPACK_LINE = /^\s*(?:RUN\s+|(?:-\s*)?run:\s*)?npm run --prefix lexicons\/[a-z0-9-]+ prepack\s*$/i;
19
20
  function isPrepackLine(line) {
20
21
  return PREPACK_LINE.test(line);
21
22
  }
@@ -212,7 +213,10 @@ function patchCiWorkflow(root, name) {
212
213
  // 2. Add a named validate step after the last "Generate and validate" step
213
214
  const displayName = name.charAt(0).toUpperCase() + name.slice(1);
214
215
  const validateStepName = `Generate and validate ${displayName} lexicon`;
215
- if (!lines.some((l) => l.includes(validateStepName))) {
216
+ // Case-insensitive: the name is built from the directory ("Github"), and an
217
+ // existing step may spell the product its own way ("GitHub", #2877).
218
+ const stepNameLower = validateStepName.toLowerCase();
219
+ if (!lines.some((l) => l.toLowerCase().includes(stepNameLower))) {
216
220
  let lastValidateRunIdx = -1;
217
221
  for (let i = 0; i < lines.length; i++) {
218
222
  if (lines[i].includes("Generate and validate")) {
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAqED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiGjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAkB5D"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAqED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAoGjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAkB5D"}
@@ -120,7 +120,8 @@ export async function updateCommand(options) {
120
120
  const pkgName = `@intentius/chant-lexicon-${lexicon}`;
121
121
  const pkgPath = resolvePackagePath(pkgName, projectDir);
122
122
  if (!pkgPath) {
123
- warnings.push(`${pkgName} not found in node_modules. Run "npm install" first.`);
123
+ // chant #3988 — update copies from node_modules and never installs.
124
+ warnings.push(`${pkgName} not found in node_modules. chant update does not install lexicons: run "npm install --save-dev ${pkgName}" first.`);
124
125
  continue;
125
126
  }
126
127
  const lexiconDestDir = join(typesDir, `lexicon-${lexicon}`);
@@ -0,0 +1,18 @@
1
+ /** A package that a failure could not import and that is not installed for the project. */
2
+ export interface UninstalledDependency {
3
+ package: string;
4
+ /** The project directory it does not resolve from. */
5
+ dir: string;
6
+ }
7
+ /** The uninstalled package `message` reports, or `undefined` when it reports none. */
8
+ export declare function uninstalledDependencyIn(message: string, projectDir: string): UninstalledDependency | undefined;
9
+ /** The dependencies message, formatted as an error with the install hint. */
10
+ export declare function formatDependenciesNotInstalled(dep: UninstalledDependency): string;
11
+ /**
12
+ * Print the dependencies message, naming the first uninstalled package, when
13
+ * any of a failure's `messages` reports one. Prints nothing and returns
14
+ * `undefined` when none does. Returns `"all"` when every message reports one,
15
+ * so a caller can drop its own wording when that wording blames the source.
16
+ */
17
+ export declare function reportUninstalledDependencies(messages: readonly string[], projectDir: string): "all" | "some" | undefined;
18
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/cli/dependencies.ts"],"names":[],"mappings":"AA0BA,2FAA2F;AAC3F,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;CACb;AA2CD,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAgB9G;AAED,6EAA6E;AAC7E,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAKjF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,UAAU,EAAE,MAAM,GACjB,KAAK,GAAG,MAAM,GAAG,SAAS,CAW5B"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * chant #4116: a failure caused by a project whose dependencies are not installed.
3
+ *
4
+ * In a clone with no node_modules, every project file that imports
5
+ * `@intentius/chant` or a lexicon package fails to load. Lint reports each one
6
+ * (LEX002, COMP000), the graph's lint gate then says the source has lint
7
+ * errors, and build prints node's own "Cannot find package" per file. The
8
+ * source is fine; the install is missing.
9
+ *
10
+ * This runs only after something has already failed, on that failure's
11
+ * messages. A project chant builds today never reaches it, whatever its
12
+ * node_modules looks like: chant resolves a lexicon from its own install first,
13
+ * and a project that imports only what it has installed loads fine. That is why
14
+ * the check is not made up front (#4118, reverted in #4125).
15
+ *
16
+ * A message counts when it is node's "Cannot find package|module '<spec>'",
17
+ * `<spec>` names a package that is `@intentius/*` or declared in the project's
18
+ * package.json, and no node_modules from the project directory up holds it. A
19
+ * typo in an import of an undeclared package keeps its message as it is.
20
+ */
21
+ import { existsSync, readFileSync } from "node:fs";
22
+ import { dirname, isAbsolute, join, resolve } from "node:path";
23
+ import { fileURLToPath } from "node:url";
24
+ import { packageNameOf } from "../lexicon-module.js";
25
+ import { formatError } from "./format.js";
26
+ const NOT_FOUND = /Cannot find (?:package|module) '([^']+)'(?: imported from (\S+))?/g;
27
+ /** True when a node_modules at `dir` or above holds `pkg`. */
28
+ function installedFrom(pkg, dir) {
29
+ for (let d = resolve(dir);; d = dirname(d)) {
30
+ if (existsSync(join(d, "node_modules", ...pkg.split("/"))))
31
+ return true;
32
+ if (dirname(d) === d)
33
+ return false;
34
+ }
35
+ }
36
+ /** The packages the nearest package.json at `dir` or above declares, in any dependency field. */
37
+ function declaredPackages(dir) {
38
+ for (let d = resolve(dir);; d = dirname(d)) {
39
+ const file = join(d, "package.json");
40
+ if (existsSync(file)) {
41
+ try {
42
+ const json = JSON.parse(readFileSync(file, "utf-8"));
43
+ const names = new Set();
44
+ for (const field of ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"]) {
45
+ const deps = json[field];
46
+ if (deps && typeof deps === "object")
47
+ for (const name of Object.keys(deps))
48
+ names.add(name);
49
+ }
50
+ return names;
51
+ }
52
+ catch {
53
+ return new Set();
54
+ }
55
+ }
56
+ if (dirname(d) === d)
57
+ return new Set();
58
+ }
59
+ }
60
+ function importerDir(importer) {
61
+ if (!importer)
62
+ return undefined;
63
+ try {
64
+ const path = importer.startsWith("file:") ? fileURLToPath(importer) : importer;
65
+ return isAbsolute(path) ? dirname(path) : undefined;
66
+ }
67
+ catch {
68
+ return undefined;
69
+ }
70
+ }
71
+ /** The uninstalled package `message` reports, or `undefined` when it reports none. */
72
+ export function uninstalledDependencyIn(message, projectDir) {
73
+ const dir = resolve(projectDir);
74
+ let declared;
75
+ for (const match of message.matchAll(NOT_FOUND)) {
76
+ const pkg = packageNameOf(match[1]);
77
+ if (pkg === undefined)
78
+ continue;
79
+ if (!pkg.startsWith("@intentius/")) {
80
+ declared ?? (declared = declaredPackages(dir));
81
+ if (!declared.has(pkg))
82
+ continue;
83
+ }
84
+ if (installedFrom(pkg, dir))
85
+ continue;
86
+ const from = importerDir(match[2]);
87
+ if (from !== undefined && installedFrom(pkg, from))
88
+ continue;
89
+ return { package: pkg, dir };
90
+ }
91
+ return undefined;
92
+ }
93
+ /** The dependencies message, formatted as an error with the install hint. */
94
+ export function formatDependenciesNotInstalled(dep) {
95
+ return formatError({
96
+ message: `dependencies not installed: ${dep.package} does not resolve from ${dep.dir}`,
97
+ hint: "run npm install (or the project's package manager)",
98
+ });
99
+ }
100
+ /**
101
+ * Print the dependencies message, naming the first uninstalled package, when
102
+ * any of a failure's `messages` reports one. Prints nothing and returns
103
+ * `undefined` when none does. Returns `"all"` when every message reports one,
104
+ * so a caller can drop its own wording when that wording blames the source.
105
+ */
106
+ export function reportUninstalledDependencies(messages, projectDir) {
107
+ let first;
108
+ let all = messages.length > 0;
109
+ for (const message of messages) {
110
+ const dep = uninstalledDependencyIn(message, projectDir);
111
+ if (dep)
112
+ first ?? (first = dep);
113
+ else
114
+ all = false;
115
+ }
116
+ if (!first)
117
+ return undefined;
118
+ console.error(formatDependenciesNotInstalled(first));
119
+ return all ? "all" : "some";
120
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/build.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA4LlD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAkJnE"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/build.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuMlD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsJnE"}
@@ -2,6 +2,7 @@ import { writeFileSync, mkdirSync } from "node:fs";
2
2
  import { dirname, resolve } from "node:path";
3
3
  import { buildCommand, buildCommandWatch, printErrors, printWarnings, resolveBuildFormat } from "../commands/build.js";
4
4
  import { formatError, formatInfo, formatSuccess, formatBold } from "../format.js";
5
+ import { reportUninstalledDependencies } from "../dependencies.js";
5
6
  import { generateComponentsPipeline } from "../../components/cli-support.js";
6
7
  import { loadChantConfigUpward } from "../../config.js";
7
8
  import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli.js";
@@ -12,13 +13,14 @@ import { resolvePromotionSource } from "../../components/promote-order.js";
12
13
  * and the branch, and with `--events-json` and `--report-url` (#4007) the
13
14
  * flags the generated jobs pass to pr-plan and pr-apply. `--pr-build` and
14
15
  * `--pr-build-command` (#4088) add the build and lint steps before both.
16
+ * `reportUrl` is `--report-url`, else the workspace's `ci.reportUrl` (#4160).
15
17
  */
16
- function prLoopOption(args) {
18
+ function prLoopOption(args, reportUrl) {
17
19
  return {
18
20
  ...(args.gate ? { gate: args.gate } : {}),
19
21
  ...(args.branch ? { branch: args.branch } : {}),
20
22
  ...(args.eventsJson ? { events: true } : {}),
21
- ...(args.reportUrl ? { reportUrl: args.reportUrl } : {}),
23
+ ...(reportUrl ? { reportUrl } : {}),
22
24
  ...(args.prBuild ? { build: true } : {}),
23
25
  ...(args.prBuildCommand ? { buildCommand: args.prBuildCommand } : {}),
24
26
  };
@@ -84,6 +86,17 @@ async function runGenerateComponents(ctx) {
84
86
  const found = findWorkspaceRoot(resolve(args.path));
85
87
  let plan;
86
88
  let memberPipeline;
89
+ // #4160: without --report-url, the declaration's ci.reportUrl. Read only inside a workspace.
90
+ let reportUrl = args.reportUrl;
91
+ if (found && args.prLoop && !reportUrl) {
92
+ try {
93
+ reportUrl = await (await import("../../workspace/ci-report-url.js")).declaredReportUrl(resolve(args.path));
94
+ }
95
+ catch (err) {
96
+ console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
97
+ return 1;
98
+ }
99
+ }
87
100
  if (found) {
88
101
  memberPipeline = await import("../../workspace/member-pipeline.js");
89
102
  try {
@@ -98,7 +111,7 @@ async function runGenerateComponents(ctx) {
98
111
  params: args.param,
99
112
  paramsFile: args.paramsFile,
100
113
  ...(args.waveGate ? { waveGate: { gate: args.waveGate, ...(args.canary?.length ? { canary: args.canary } : {}), ...(args.base ? { base: args.base } : {}) } } : {}),
101
- ...(args.prLoop ? { prLoop: prLoopOption(args) } : {}),
114
+ ...(args.prLoop ? { prLoop: prLoopOption(args, reportUrl) } : {}),
102
115
  ...(args.image ? { image: args.image } : {}),
103
116
  ...(args.beforeScript?.length ? { beforeScript: args.beforeScript } : {}),
104
117
  });
@@ -125,7 +138,7 @@ async function runGenerateComponents(ctx) {
125
138
  ? { gatedWaves: { gate: args.waveGate, ...(args.canary?.length ? { canary: args.canary } : {}), ...(args.base ? { base: args.base } : {}) } }
126
139
  : {}),
127
140
  // #3183: a plan job per pull request and an apply job per merge.
128
- ...(args.prLoop ? { prLoop: prLoopOption(args) } : {}),
141
+ ...(args.prLoop ? { prLoop: prLoopOption(args, reportUrl) } : {}),
129
142
  // #4002: the job image and the lines that install what it lacks, chant itself included.
130
143
  ...(args.image ? { image: args.image } : {}),
131
144
  ...(args.beforeScript?.length ? { beforeScript: args.beforeScript } : {}),
@@ -257,6 +270,9 @@ export async function runBuild(ctx) {
257
270
  for (const w of own)
258
271
  seenWarnings.add(w);
259
272
  printWarnings(own);
273
+ // #4116: once, before the first failing group's errors.
274
+ if (!result.success && !failed)
275
+ reportUninstalledDependencies(result.errors, resolve(args.path));
260
276
  printErrors(result.errors);
261
277
  if (!result.success)
262
278
  failed = true;
@@ -304,6 +320,9 @@ export async function runBuild(ctx) {
304
320
  warnings = warnings.filter((w) => !w.includes('No serializer found for lexicon'));
305
321
  }
306
322
  printWarnings(warnings);
323
+ // #4116: errors that are imports of uninstalled packages are led by the dependencies message.
324
+ if (!result.success)
325
+ reportUninstalledDependencies(result.errors, resolve(args.path));
307
326
  printErrors(result.errors);
308
327
  return result.success ? 0 : 1;
309
328
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fan-out.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/fan-out.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAIH,OAAO,EAA+C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAe7F,OAAO,EAAmB,KAAK,YAAY,EAAuB,MAAM,0BAA0B,CAAC;AAQnG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IACJ,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+ErE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAmV9E"}
1
+ {"version":3,"file":"fan-out.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/fan-out.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAIH,OAAO,EAA+C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAe7F,OAAO,EAAmB,KAAK,YAAY,EAAuB,MAAM,0BAA0B,CAAC;AASnG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IACJ,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+ErE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyV9E"}
@@ -67,9 +67,10 @@ import { approveCommand, gateIsSealed } from "../../op/gate.js";
67
67
  import { getHeadCommit } from "../../lifecycle/git.js";
68
68
  import { remainingFanOut } from "../../components/fan-out.js";
69
69
  import { readDeployedOutputs } from "../../components/wave-plan.js";
70
- import { deployContext } from "../../components/driver.js";
70
+ import { deployContext, failedRunExitCode } from "../../components/driver.js";
71
71
  import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli.js";
72
72
  import { formatError, formatInfo, formatWarning } from "../format.js";
73
+ import { reportUninstalledDependencies } from "../dependencies.js";
73
74
  import { FAN_OUT_GATE_OP } from "../../op/gate-name.js";
74
75
  import { resolveBuildRoot } from "./lifecycle.js";
75
76
  import { GATED_EXIT_CODE, autoReleaseRun, recordAutoReleasesForRun } from "./run.js";
@@ -220,10 +221,15 @@ export async function runComponentsFanOut(ctx) {
220
221
  catch (err) {
221
222
  // A cycle or an unknown `dependsOn` refuses here, over the whole graph and
222
223
  // before anything is selected (#2417). The message names the members.
223
- console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
224
+ const message = err instanceof Error ? err.message : String(err);
225
+ reportUninstalledDependencies([message], projectPath); // #4116
226
+ console.error(formatError({ message }));
224
227
  return 1;
225
228
  }
226
229
  if (!derived.success) {
230
+ // #4116: component files that import packages the project has not installed.
231
+ if (derived.error)
232
+ reportUninstalledDependencies([derived.error], projectPath);
227
233
  console.error(formatError({ message: derived.error ?? "Could not discover components" }));
228
234
  return 1;
229
235
  }
@@ -486,7 +492,9 @@ export async function runComponentsFanOut(ctx) {
486
492
  ...(await summaryLedgerPrefix()),
487
493
  ...(pending.environment ? { environment: pending.environment } : {}),
488
494
  });
489
- return result.status === "gated" ? GATED_EXIT_CODE : 1;
495
+ return result.status === "gated" ? GATED_EXIT_CODE : failedRunExitCode(result.results);
490
496
  }
491
- return result.status === "ok" ? 0 : 1;
497
+ // A step that refused the wave's plan because its target moved since the
498
+ // approval exits 3, the code of a wave whose plan changed (#3997).
499
+ return result.status === "ok" ? 0 : failedRunExitCode(result.results);
492
500
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/graph.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AA+H9D;;;;;;;;;GASG;AACH;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D"}
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/graph.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AA+H9D;;;;;;;;;GASG;AACH;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D"}