@hominis/fireforge 0.45.0 → 0.46.1

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 (662) hide show
  1. package/CHANGELOG.md +409 -446
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +21 -15
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +46 -0
  6. package/dist/src/cli-usage-error.js +81 -0
  7. package/dist/src/cli.d.ts +7 -2
  8. package/dist/src/cli.js +47 -47
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +3 -4
  11. package/dist/src/commands/build.js +27 -17
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +19 -0
  14. package/dist/src/commands/destructive-decision.js +31 -0
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -10
  17. package/dist/src/commands/doctor-check-core.js +0 -8
  18. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  20. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  21. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  22. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  23. package/dist/src/commands/doctor-furnace.js +22 -22
  24. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
  25. package/dist/src/commands/doctor-orphaned-harness.js +14 -23
  26. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  27. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  28. package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
  29. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  30. package/dist/src/commands/doctor-source-pin.js +14 -14
  31. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  32. package/dist/src/commands/doctor-working-tree.js +3 -3
  33. package/dist/src/commands/doctor.d.ts +3 -1
  34. package/dist/src/commands/doctor.js +15 -16
  35. package/dist/src/commands/download.js +50 -37
  36. package/dist/src/commands/export-all.js +29 -12
  37. package/dist/src/commands/export-flow.d.ts +5 -5
  38. package/dist/src/commands/export-flow.js +29 -59
  39. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  40. package/dist/src/commands/export-placement-conflicts.js +12 -12
  41. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  42. package/dist/src/commands/export-placement-gate.js +7 -13
  43. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  44. package/dist/src/commands/export-placement-policy.js +4 -6
  45. package/dist/src/commands/export-shared.d.ts +51 -32
  46. package/dist/src/commands/export-shared.js +17 -32
  47. package/dist/src/commands/export.js +14 -5
  48. package/dist/src/commands/furnace/apply.js +16 -16
  49. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  50. package/dist/src/commands/furnace/authoring-config.js +19 -0
  51. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  52. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  54. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  55. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  56. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  57. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  58. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  59. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  60. package/dist/src/commands/furnace/create-browser-test.js +7 -12
  61. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  62. package/dist/src/commands/furnace/create-dry-run.js +6 -9
  63. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  64. package/dist/src/commands/furnace/create-features.js +2 -2
  65. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  66. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  67. package/dist/src/commands/furnace/create-templates.d.ts +31 -15
  68. package/dist/src/commands/furnace/create-templates.js +20 -19
  69. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  70. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  71. package/dist/src/commands/furnace/create.d.ts +1 -1
  72. package/dist/src/commands/furnace/create.js +35 -29
  73. package/dist/src/commands/furnace/deploy.js +15 -6
  74. package/dist/src/commands/furnace/diff.js +7 -7
  75. package/dist/src/commands/furnace/index.js +1 -1
  76. package/dist/src/commands/furnace/init.js +17 -16
  77. package/dist/src/commands/furnace/list.js +2 -2
  78. package/dist/src/commands/furnace/override.d.ts +1 -1
  79. package/dist/src/commands/furnace/override.js +43 -34
  80. package/dist/src/commands/furnace/preview.js +17 -17
  81. package/dist/src/commands/furnace/refresh.js +15 -7
  82. package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
  83. package/dist/src/commands/furnace/remove-mutations.js +19 -19
  84. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  85. package/dist/src/commands/furnace/remove-state.js +1 -1
  86. package/dist/src/commands/furnace/remove.js +4 -8
  87. package/dist/src/commands/furnace/rename-browser-test.js +10 -15
  88. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  89. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  90. package/dist/src/commands/furnace/rename.js +36 -36
  91. package/dist/src/commands/furnace/scan.js +3 -3
  92. package/dist/src/commands/furnace/status.js +19 -16
  93. package/dist/src/commands/furnace/sync.js +6 -6
  94. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  95. package/dist/src/commands/furnace/test-file-name.js +39 -0
  96. package/dist/src/commands/furnace/validate.js +11 -12
  97. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  98. package/dist/src/commands/furnace/validation-output.js +3 -8
  99. package/dist/src/commands/import.js +22 -29
  100. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  101. package/dist/src/commands/lint-per-patch.js +27 -12
  102. package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
  103. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  104. package/dist/src/commands/lint-report.d.ts +3 -3
  105. package/dist/src/commands/lint-report.js +4 -4
  106. package/dist/src/commands/lint.d.ts +5 -4
  107. package/dist/src/commands/lint.js +36 -36
  108. package/dist/src/commands/manifest.d.ts +4 -4
  109. package/dist/src/commands/manifest.js +1 -1
  110. package/dist/src/commands/package.js +4 -6
  111. package/dist/src/commands/patch/compact.d.ts +2 -2
  112. package/dist/src/commands/patch/compact.js +19 -20
  113. package/dist/src/commands/patch/delete.d.ts +1 -1
  114. package/dist/src/commands/patch/delete.js +23 -33
  115. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  116. package/dist/src/commands/patch/entry-projection.js +24 -0
  117. package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
  118. package/dist/src/commands/patch/lint-ignore.js +33 -44
  119. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  120. package/dist/src/commands/patch/move-files-create.js +29 -15
  121. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  122. package/dist/src/commands/patch/move-files-into.js +41 -37
  123. package/dist/src/commands/patch/move-files.js +5 -14
  124. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  125. package/dist/src/commands/patch/rename.d.ts +4 -4
  126. package/dist/src/commands/patch/rename.js +35 -49
  127. package/dist/src/commands/patch/reorder.js +35 -48
  128. package/dist/src/commands/patch/split-plan.d.ts +7 -8
  129. package/dist/src/commands/patch/split-plan.js +10 -13
  130. package/dist/src/commands/patch/split.d.ts +2 -2
  131. package/dist/src/commands/patch/split.js +50 -48
  132. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  133. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  134. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  135. package/dist/src/commands/patch/staged-dependency.js +22 -28
  136. package/dist/src/commands/patch/tier.d.ts +2 -2
  137. package/dist/src/commands/patch/tier.js +20 -30
  138. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  139. package/dist/src/commands/patch-rename-map.js +36 -0
  140. package/dist/src/commands/pending-resolution.d.ts +15 -0
  141. package/dist/src/commands/pending-resolution.js +25 -0
  142. package/dist/src/commands/re-export-adjacent.d.ts +25 -3
  143. package/dist/src/commands/re-export-adjacent.js +40 -24
  144. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  145. package/dist/src/commands/re-export-bulk-scan.js +23 -27
  146. package/dist/src/commands/re-export-drift.d.ts +10 -10
  147. package/dist/src/commands/re-export-drift.js +33 -33
  148. package/dist/src/commands/re-export-files.d.ts +2 -3
  149. package/dist/src/commands/re-export-files.js +52 -44
  150. package/dist/src/commands/re-export-lint.d.ts +29 -30
  151. package/dist/src/commands/re-export-lint.js +36 -29
  152. package/dist/src/commands/re-export-options.d.ts +1 -1
  153. package/dist/src/commands/re-export-options.js +1 -1
  154. package/dist/src/commands/re-export-register.d.ts +1 -1
  155. package/dist/src/commands/re-export-register.js +1 -1
  156. package/dist/src/commands/re-export-scan.d.ts +1 -1
  157. package/dist/src/commands/re-export-scan.js +12 -9
  158. package/dist/src/commands/re-export-single.d.ts +23 -4
  159. package/dist/src/commands/re-export-single.js +39 -31
  160. package/dist/src/commands/re-export.js +35 -17
  161. package/dist/src/commands/rebase/abort.js +9 -14
  162. package/dist/src/commands/rebase/continue.js +20 -19
  163. package/dist/src/commands/rebase/index.d.ts +1 -1
  164. package/dist/src/commands/rebase/index.js +5 -5
  165. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  166. package/dist/src/commands/rebase/patch-loop.js +20 -24
  167. package/dist/src/commands/register.js +5 -5
  168. package/dist/src/commands/reset.js +1 -1
  169. package/dist/src/commands/resolve.d.ts +2 -2
  170. package/dist/src/commands/resolve.js +21 -13
  171. package/dist/src/commands/run.d.ts +0 -13
  172. package/dist/src/commands/run.js +38 -51
  173. package/dist/src/commands/setup-support.d.ts +16 -4
  174. package/dist/src/commands/setup-support.js +20 -20
  175. package/dist/src/commands/setup.js +4 -10
  176. package/dist/src/commands/source.js +9 -2
  177. package/dist/src/commands/status-check.d.ts +3 -3
  178. package/dist/src/commands/status-check.js +6 -6
  179. package/dist/src/commands/status-json.d.ts +14 -13
  180. package/dist/src/commands/status-json.js +9 -8
  181. package/dist/src/commands/status-output.d.ts +3 -3
  182. package/dist/src/commands/status-output.js +5 -5
  183. package/dist/src/commands/status-ownership.d.ts +3 -3
  184. package/dist/src/commands/status-ownership.js +3 -3
  185. package/dist/src/commands/status.js +25 -26
  186. package/dist/src/commands/test-build-phase.d.ts +3 -3
  187. package/dist/src/commands/test-build-phase.js +48 -24
  188. package/dist/src/commands/test-diagnose.d.ts +1 -1
  189. package/dist/src/commands/test-diagnose.js +20 -20
  190. package/dist/src/commands/test-modes.d.ts +4 -4
  191. package/dist/src/commands/test-modes.js +4 -5
  192. package/dist/src/commands/test-register.js +5 -3
  193. package/dist/src/commands/test-run.d.ts +11 -11
  194. package/dist/src/commands/test-run.js +40 -33
  195. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  196. package/dist/src/commands/test-stale-gate.js +17 -17
  197. package/dist/src/commands/test-verdict.d.ts +19 -5
  198. package/dist/src/commands/test-verdict.js +26 -11
  199. package/dist/src/commands/test.d.ts +3 -3
  200. package/dist/src/commands/test.js +73 -36
  201. package/dist/src/commands/token-coverage.js +3 -3
  202. package/dist/src/commands/token-list.d.ts +26 -0
  203. package/dist/src/commands/token-list.js +153 -0
  204. package/dist/src/commands/token.js +26 -10
  205. package/dist/src/commands/tree.js +26 -21
  206. package/dist/src/commands/typecheck.d.ts +6 -6
  207. package/dist/src/commands/typecheck.js +16 -16
  208. package/dist/src/commands/verify.d.ts +3 -3
  209. package/dist/src/commands/verify.js +10 -10
  210. package/dist/src/commands/watch.js +11 -11
  211. package/dist/src/commands/wire.js +17 -16
  212. package/dist/src/core/ast-utils.d.ts +7 -7
  213. package/dist/src/core/ast-utils.js +8 -8
  214. package/dist/src/core/branding.d.ts +5 -12
  215. package/dist/src/core/branding.js +6 -5
  216. package/dist/src/core/browser-wire.d.ts +1 -1
  217. package/dist/src/core/browser-wire.js +10 -7
  218. package/dist/src/core/build-audit-platform.d.ts +32 -3
  219. package/dist/src/core/build-audit-platform.js +153 -13
  220. package/dist/src/core/build-audit-registration.d.ts +5 -5
  221. package/dist/src/core/build-audit-registration.js +10 -9
  222. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  223. package/dist/src/core/build-audit-resolve.js +6 -6
  224. package/dist/src/core/build-audit-skip.d.ts +57 -0
  225. package/dist/src/core/build-audit-skip.js +112 -0
  226. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  227. package/dist/src/core/build-audit-transforms.js +3 -3
  228. package/dist/src/core/build-audit.d.ts +21 -8
  229. package/dist/src/core/build-audit.js +142 -40
  230. package/dist/src/core/build-baseline-types.d.ts +19 -18
  231. package/dist/src/core/build-baseline-types.js +1 -1
  232. package/dist/src/core/build-baseline.d.ts +48 -31
  233. package/dist/src/core/build-baseline.js +20 -43
  234. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  235. package/dist/src/core/build-jar-escalation.js +18 -17
  236. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  237. package/dist/src/core/build-overwrite-guard.js +14 -14
  238. package/dist/src/core/build-prepare.d.ts +4 -12
  239. package/dist/src/core/build-prepare.js +22 -26
  240. package/dist/src/core/config-mutate.js +4 -4
  241. package/dist/src/core/config-paths.d.ts +2 -6
  242. package/dist/src/core/config-paths.js +4 -2
  243. package/dist/src/core/config-state.d.ts +0 -6
  244. package/dist/src/core/config-state.js +3 -21
  245. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  246. package/dist/src/core/config-validate-build-audit.js +80 -0
  247. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  248. package/dist/src/core/config-validate-file-size.js +3 -3
  249. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  250. package/dist/src/core/config-validate-patch-policy.js +3 -3
  251. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  252. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  253. package/dist/src/core/config-validate.js +22 -12
  254. package/dist/src/core/config.d.ts +12 -12
  255. package/dist/src/core/config.js +21 -25
  256. package/dist/src/core/coverage-extend.d.ts +16 -16
  257. package/dist/src/core/coverage-extend.js +20 -20
  258. package/dist/src/core/destructive.d.ts +14 -14
  259. package/dist/src/core/destructive.js +9 -9
  260. package/dist/src/core/diff-hunks.d.ts +2 -2
  261. package/dist/src/core/diff-hunks.js +7 -7
  262. package/dist/src/core/discard-baseline.d.ts +10 -10
  263. package/dist/src/core/discard-baseline.js +22 -23
  264. package/dist/src/core/display-state.d.ts +11 -11
  265. package/dist/src/core/display-state.js +12 -12
  266. package/dist/src/core/engine-changes.d.ts +2 -2
  267. package/dist/src/core/engine-changes.js +2 -2
  268. package/dist/src/core/engine-precondition.d.ts +5 -13
  269. package/dist/src/core/engine-precondition.js +5 -10
  270. package/dist/src/core/engine-session-lock.d.ts +18 -18
  271. package/dist/src/core/engine-session-lock.js +50 -54
  272. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  273. package/dist/src/core/export-moved-code-shape.js +10 -10
  274. package/dist/src/core/file-lock-owner.d.ts +103 -0
  275. package/dist/src/core/file-lock-owner.js +259 -0
  276. package/dist/src/core/file-lock.d.ts +14 -19
  277. package/dist/src/core/file-lock.js +90 -128
  278. package/dist/src/core/firefox-cache.d.ts +13 -1
  279. package/dist/src/core/firefox-cache.js +61 -36
  280. package/dist/src/core/firefox-download.d.ts +15 -0
  281. package/dist/src/core/firefox-download.js +38 -22
  282. package/dist/src/core/firefox-extract.d.ts +8 -7
  283. package/dist/src/core/firefox-extract.js +45 -27
  284. package/dist/src/core/firefox.d.ts +34 -36
  285. package/dist/src/core/firefox.js +13 -44
  286. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  287. package/dist/src/core/furnace-apply-dry-run.js +2 -8
  288. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  289. package/dist/src/core/furnace-apply-ftl.js +8 -8
  290. package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
  291. package/dist/src/core/furnace-apply-helpers.js +28 -39
  292. package/dist/src/core/furnace-apply-output.js +1 -1
  293. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  294. package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
  295. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  296. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  297. package/dist/src/core/furnace-apply.d.ts +4 -4
  298. package/dist/src/core/furnace-apply.js +50 -29
  299. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  300. package/dist/src/core/furnace-checksum-utils.js +5 -5
  301. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  302. package/dist/src/core/furnace-config-custom.js +2 -2
  303. package/dist/src/core/furnace-config-order.js +1 -1
  304. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  305. package/dist/src/core/furnace-config-tokens.js +3 -3
  306. package/dist/src/core/furnace-config-validate.js +2 -2
  307. package/dist/src/core/furnace-config.d.ts +5 -5
  308. package/dist/src/core/furnace-config.js +40 -53
  309. package/dist/src/core/furnace-constants.d.ts +6 -6
  310. package/dist/src/core/furnace-constants.js +9 -8
  311. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  312. package/dist/src/core/furnace-css-fragments.js +11 -11
  313. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  314. package/dist/src/core/furnace-dir-entry.js +21 -0
  315. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  316. package/dist/src/core/furnace-jsconfig.js +22 -20
  317. package/dist/src/core/furnace-operation.d.ts +22 -19
  318. package/dist/src/core/furnace-operation.js +38 -34
  319. package/dist/src/core/furnace-precondition.d.ts +10 -10
  320. package/dist/src/core/furnace-precondition.js +8 -8
  321. package/dist/src/core/furnace-refresh.d.ts +18 -6
  322. package/dist/src/core/furnace-refresh.js +5 -8
  323. package/dist/src/core/furnace-registration-ast.d.ts +2 -3
  324. package/dist/src/core/furnace-registration-ast.js +9 -12
  325. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  326. package/dist/src/core/furnace-registration-remove.js +6 -6
  327. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  328. package/dist/src/core/furnace-registration-validate.js +2 -2
  329. package/dist/src/core/furnace-registration.d.ts +7 -6
  330. package/dist/src/core/furnace-registration.js +29 -36
  331. package/dist/src/core/furnace-rollback.d.ts +1 -1
  332. package/dist/src/core/furnace-rollback.js +5 -5
  333. package/dist/src/core/furnace-scanner.js +3 -6
  334. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  335. package/dist/src/core/furnace-stale-export.js +16 -15
  336. package/dist/src/core/furnace-staleness.d.ts +2 -2
  337. package/dist/src/core/furnace-staleness.js +2 -2
  338. package/dist/src/core/furnace-state-persist.d.ts +12 -12
  339. package/dist/src/core/furnace-state-persist.js +10 -10
  340. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  341. package/dist/src/core/furnace-step-errors.js +6 -6
  342. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  343. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  344. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  345. package/dist/src/core/furnace-validate-registration.js +18 -20
  346. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  347. package/dist/src/core/furnace-validate-structure.js +4 -4
  348. package/dist/src/core/furnace-validate.js +9 -9
  349. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  350. package/dist/src/core/furnace-version-drift.js +5 -5
  351. package/dist/src/core/git-base.d.ts +6 -4
  352. package/dist/src/core/git-base.js +29 -7
  353. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  354. package/dist/src/core/git-diff-new-file.js +119 -0
  355. package/dist/src/core/git-diff.d.ts +13 -13
  356. package/dist/src/core/git-diff.js +121 -189
  357. package/dist/src/core/git-file-ops.d.ts +6 -13
  358. package/dist/src/core/git-file-ops.js +11 -35
  359. package/dist/src/core/git-readonly-index.d.ts +12 -14
  360. package/dist/src/core/git-readonly-index.js +12 -16
  361. package/dist/src/core/git-status.d.ts +9 -2
  362. package/dist/src/core/git-status.js +23 -11
  363. package/dist/src/core/git.d.ts +3 -9
  364. package/dist/src/core/git.js +28 -57
  365. package/dist/src/core/harness-orphans.d.ts +17 -17
  366. package/dist/src/core/harness-orphans.js +28 -27
  367. package/dist/src/core/history-log.d.ts +19 -0
  368. package/dist/src/core/history-log.js +29 -0
  369. package/dist/src/core/license-headers.d.ts +19 -18
  370. package/dist/src/core/license-headers.js +29 -28
  371. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  372. package/dist/src/core/mach-build-artifacts.js +23 -23
  373. package/dist/src/core/mach-error-hints.d.ts +5 -10
  374. package/dist/src/core/mach-error-hints.js +14 -14
  375. package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
  376. package/dist/src/core/mach-known-noise-filter.js +57 -56
  377. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  378. package/dist/src/core/mach-mozconfig.js +17 -16
  379. package/dist/src/core/mach-python.d.ts +3 -0
  380. package/dist/src/core/mach-python.js +13 -7
  381. package/dist/src/core/mach-resource-shim.d.ts +24 -12
  382. package/dist/src/core/mach-resource-shim.js +124 -21
  383. package/dist/src/core/mach.d.ts +59 -73
  384. package/dist/src/core/mach.js +47 -115
  385. package/dist/src/core/marionette-port.d.ts +15 -30
  386. package/dist/src/core/marionette-port.js +46 -89
  387. package/dist/src/core/marionette-preflight.d.ts +6 -6
  388. package/dist/src/core/marionette-preflight.js +32 -50
  389. package/dist/src/core/markdown-table.d.ts +9 -9
  390. package/dist/src/core/markdown-table.js +14 -14
  391. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  392. package/dist/src/core/mochitest-server-port.js +17 -17
  393. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  394. package/dist/src/core/module-resolution-preflight.js +11 -11
  395. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  396. package/dist/src/core/moz-manifest-helpers.js +7 -7
  397. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  398. package/dist/src/core/moz-manifest-register.js +2 -2
  399. package/dist/src/core/moz-manifest-rules.js +46 -42
  400. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  401. package/dist/src/core/ownership-table.d.ts +5 -5
  402. package/dist/src/core/ownership-table.js +7 -7
  403. package/dist/src/core/parser-fallback.d.ts +3 -3
  404. package/dist/src/core/parser-fallback.js +3 -3
  405. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  406. package/dist/src/core/patch-apply-fuzz.js +13 -13
  407. package/dist/src/core/patch-apply.d.ts +13 -14
  408. package/dist/src/core/patch-apply.js +36 -42
  409. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  410. package/dist/src/core/patch-export-coverage.js +1 -30
  411. package/dist/src/core/patch-export-update.d.ts +21 -4
  412. package/dist/src/core/patch-export-update.js +7 -6
  413. package/dist/src/core/patch-export.d.ts +20 -30
  414. package/dist/src/core/patch-export.js +55 -77
  415. package/dist/src/core/patch-files.d.ts +0 -4
  416. package/dist/src/core/patch-files.js +0 -11
  417. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  418. package/dist/src/core/patch-identifier-suggest.js +4 -4
  419. package/dist/src/core/patch-lint-binary.d.ts +12 -18
  420. package/dist/src/core/patch-lint-cache.d.ts +18 -2
  421. package/dist/src/core/patch-lint-cache.js +16 -19
  422. package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
  423. package/dist/src/core/patch-lint-checkjs.js +78 -64
  424. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  425. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  426. package/dist/src/core/patch-lint-creators.d.ts +5 -9
  427. package/dist/src/core/patch-lint-creators.js +3 -3
  428. package/dist/src/core/patch-lint-cross.d.ts +27 -19
  429. package/dist/src/core/patch-lint-cross.js +67 -110
  430. package/dist/src/core/patch-lint-css.d.ts +1 -1
  431. package/dist/src/core/patch-lint-css.js +15 -11
  432. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  433. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  434. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  435. package/dist/src/core/patch-lint-diff.js +4 -4
  436. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  437. package/dist/src/core/patch-lint-file-size.js +6 -6
  438. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  439. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  440. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  441. package/dist/src/core/patch-lint-jsdoc.js +46 -46
  442. package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
  443. package/dist/src/core/patch-lint-module-registration.js +1 -1
  444. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  445. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  446. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  447. package/dist/src/core/patch-lint-observer.js +7 -7
  448. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  449. package/dist/src/core/patch-lint-ownership.js +6 -6
  450. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  451. package/dist/src/core/patch-lint-prettier.js +7 -7
  452. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  453. package/dist/src/core/patch-lint-queue-types.js +12 -0
  454. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  455. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  456. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  457. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  458. package/dist/src/core/patch-lint.d.ts +41 -35
  459. package/dist/src/core/patch-lint.js +52 -49
  460. package/dist/src/core/patch-lock.d.ts +1 -1
  461. package/dist/src/core/patch-lock.js +11 -11
  462. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  463. package/dist/src/core/patch-manifest-consistency.js +16 -17
  464. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  465. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  466. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  467. package/dist/src/core/patch-manifest-io.js +35 -34
  468. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  469. package/dist/src/core/patch-manifest-query.js +4 -4
  470. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  471. package/dist/src/core/patch-manifest-resolve.js +7 -7
  472. package/dist/src/core/patch-manifest-validate.js +3 -3
  473. package/dist/src/core/patch-manifest.d.ts +2 -2
  474. package/dist/src/core/patch-manifest.js +2 -2
  475. package/dist/src/core/patch-parse.d.ts +32 -21
  476. package/dist/src/core/patch-parse.js +40 -15
  477. package/dist/src/core/patch-policy.js +15 -27
  478. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  479. package/dist/src/core/patch-registration-refs.js +7 -7
  480. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  481. package/dist/src/core/patch-source-metadata.js +0 -4
  482. package/dist/src/core/patch-transform.d.ts +8 -16
  483. package/dist/src/core/patch-transform.js +13 -23
  484. package/dist/src/core/process-cpu-time.d.ts +1 -1
  485. package/dist/src/core/process-cpu-time.js +6 -6
  486. package/dist/src/core/rebase-session.d.ts +9 -15
  487. package/dist/src/core/rebase-session.js +13 -25
  488. package/dist/src/core/register-browser-content.js +3 -2
  489. package/dist/src/core/register-browser-test.js +2 -1
  490. package/dist/src/core/register-module.js +2 -1
  491. package/dist/src/core/register-result.d.ts +1 -1
  492. package/dist/src/core/register-result.js +1 -1
  493. package/dist/src/core/register-scaffold.d.ts +2 -2
  494. package/dist/src/core/register-scaffold.js +8 -7
  495. package/dist/src/core/register-shared-css.d.ts +3 -3
  496. package/dist/src/core/register-shared-css.js +6 -5
  497. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  498. package/dist/src/core/register-xpcshell-test.js +2 -2
  499. package/dist/src/core/run-log-redact.d.ts +38 -0
  500. package/dist/src/core/run-log-redact.js +69 -0
  501. package/dist/src/core/run-log.d.ts +21 -10
  502. package/dist/src/core/run-log.js +76 -27
  503. package/dist/src/core/shared-ftl.d.ts +2 -2
  504. package/dist/src/core/shared-ftl.js +6 -6
  505. package/dist/src/core/signal-critical.d.ts +2 -2
  506. package/dist/src/core/signal-critical.js +4 -6
  507. package/dist/src/core/smoke-patterns.d.ts +5 -6
  508. package/dist/src/core/smoke-patterns.js +15 -20
  509. package/dist/src/core/state-file.d.ts +15 -4
  510. package/dist/src/core/state-file.js +14 -1
  511. package/dist/src/core/status-binary.d.ts +8 -8
  512. package/dist/src/core/status-binary.js +12 -12
  513. package/dist/src/core/status-classify.d.ts +17 -17
  514. package/dist/src/core/status-classify.js +13 -12
  515. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  516. package/dist/src/core/test-changed-prefs.js +40 -25
  517. package/dist/src/core/test-harness-crash.d.ts +39 -39
  518. package/dist/src/core/test-harness-crash.js +69 -69
  519. package/dist/src/core/test-harness-output.d.ts +7 -7
  520. package/dist/src/core/test-harness-output.js +7 -7
  521. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  522. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  523. package/dist/src/core/test-path-scope.d.ts +8 -8
  524. package/dist/src/core/test-path-scope.js +11 -11
  525. package/dist/src/core/test-stale-check.d.ts +22 -23
  526. package/dist/src/core/test-stale-check.js +31 -30
  527. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  528. package/dist/src/core/test-stale-symlink.js +1 -1
  529. package/dist/src/core/test-stall-triage.d.ts +9 -9
  530. package/dist/src/core/test-stall-triage.js +22 -22
  531. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  532. package/dist/src/core/test-xpcshell-retry.js +14 -11
  533. package/dist/src/core/token-category.d.ts +35 -2
  534. package/dist/src/core/token-category.js +67 -58
  535. package/dist/src/core/token-coverage.js +4 -5
  536. package/dist/src/core/token-dark-mode.d.ts +9 -9
  537. package/dist/src/core/token-dark-mode.js +13 -25
  538. package/dist/src/core/token-docs.d.ts +1 -1
  539. package/dist/src/core/token-inventory.d.ts +56 -0
  540. package/dist/src/core/token-inventory.js +109 -0
  541. package/dist/src/core/token-manager.d.ts +4 -4
  542. package/dist/src/core/token-manager.js +22 -22
  543. package/dist/src/core/token-scaffold.d.ts +4 -4
  544. package/dist/src/core/token-scaffold.js +4 -4
  545. package/dist/src/core/token-variant.d.ts +14 -14
  546. package/dist/src/core/token-variant.js +52 -53
  547. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  548. package/dist/src/core/toolchain-preflight.js +23 -23
  549. package/dist/src/core/tree-cow.d.ts +3 -5
  550. package/dist/src/core/tree-cow.js +8 -8
  551. package/dist/src/core/tree-guard.d.ts +3 -3
  552. package/dist/src/core/tree-guard.js +23 -23
  553. package/dist/src/core/tree-store.d.ts +15 -15
  554. package/dist/src/core/tree-store.js +39 -38
  555. package/dist/src/core/typecheck-shim.d.ts +16 -15
  556. package/dist/src/core/typecheck-shim.js +26 -25
  557. package/dist/src/core/typecheck.d.ts +12 -12
  558. package/dist/src/core/typecheck.js +33 -33
  559. package/dist/src/core/wire-destroy.d.ts +2 -2
  560. package/dist/src/core/wire-destroy.js +5 -5
  561. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  562. package/dist/src/core/wire-dom-fragment.js +12 -23
  563. package/dist/src/core/wire-init.d.ts +2 -2
  564. package/dist/src/core/wire-init.js +7 -7
  565. package/dist/src/core/wire-subscript.d.ts +1 -1
  566. package/dist/src/core/wire-subscript.js +3 -3
  567. package/dist/src/core/wire-utils.d.ts +9 -9
  568. package/dist/src/core/wire-utils.js +16 -28
  569. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  570. package/dist/src/core/xpcshell-appdir.js +28 -30
  571. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  572. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  573. package/dist/src/errors/base.d.ts +69 -16
  574. package/dist/src/errors/base.js +95 -26
  575. package/dist/src/errors/build.d.ts +6 -6
  576. package/dist/src/errors/build.js +26 -34
  577. package/dist/src/errors/codes.d.ts +10 -10
  578. package/dist/src/errors/codes.js +10 -10
  579. package/dist/src/errors/config.d.ts +0 -14
  580. package/dist/src/errors/config.js +13 -34
  581. package/dist/src/errors/download.d.ts +13 -0
  582. package/dist/src/errors/download.js +53 -24
  583. package/dist/src/errors/furnace.d.ts +2 -2
  584. package/dist/src/errors/furnace.js +8 -9
  585. package/dist/src/errors/git.d.ts +9 -9
  586. package/dist/src/errors/git.js +21 -31
  587. package/dist/src/errors/patch.d.ts +3 -3
  588. package/dist/src/errors/patch.js +11 -13
  589. package/dist/src/errors/rebase.d.ts +1 -1
  590. package/dist/src/errors/rebase.js +8 -8
  591. package/dist/src/errors/run.d.ts +1 -1
  592. package/dist/src/errors/run.js +1 -1
  593. package/dist/src/index.d.ts +4 -4
  594. package/dist/src/index.js +4 -4
  595. package/dist/src/types/commands/options.d.ts +155 -200
  596. package/dist/src/types/commands/patches.d.ts +19 -19
  597. package/dist/src/types/commands/project.d.ts +3 -3
  598. package/dist/src/types/config.d.ts +52 -19
  599. package/dist/src/types/furnace.d.ts +17 -17
  600. package/dist/src/types/index.d.ts +0 -1
  601. package/dist/src/types/json.d.ts +3 -3
  602. package/dist/src/types/json.js +2 -2
  603. package/dist/src/types/typecheck.d.ts +3 -3
  604. package/dist/src/utils/assert.d.ts +4 -16
  605. package/dist/src/utils/assert.js +7 -24
  606. package/dist/src/utils/build-info.d.ts +6 -6
  607. package/dist/src/utils/build-info.js +6 -6
  608. package/dist/src/utils/child-env.d.ts +7 -6
  609. package/dist/src/utils/child-env.js +5 -5
  610. package/dist/src/utils/concurrency.d.ts +2 -2
  611. package/dist/src/utils/concurrency.js +2 -2
  612. package/dist/src/utils/elapsed.js +10 -1
  613. package/dist/src/utils/errors.d.ts +8 -8
  614. package/dist/src/utils/errors.js +8 -8
  615. package/dist/src/utils/fs.d.ts +1 -1
  616. package/dist/src/utils/fs.js +15 -20
  617. package/dist/src/utils/hash.d.ts +12 -0
  618. package/dist/src/utils/hash.js +16 -0
  619. package/dist/src/utils/line-dispatch.d.ts +15 -0
  620. package/dist/src/utils/line-dispatch.js +48 -0
  621. package/dist/src/utils/logger.d.ts +4 -4
  622. package/dist/src/utils/logger.js +11 -11
  623. package/dist/src/utils/machine-output.js +2 -2
  624. package/dist/src/utils/options.d.ts +14 -20
  625. package/dist/src/utils/options.js +26 -27
  626. package/dist/src/utils/package-root.js +5 -14
  627. package/dist/src/utils/paths.d.ts +4 -4
  628. package/dist/src/utils/paths.js +4 -4
  629. package/dist/src/utils/platform.d.ts +0 -4
  630. package/dist/src/utils/process-group.d.ts +10 -9
  631. package/dist/src/utils/process-group.js +37 -36
  632. package/dist/src/utils/process.d.ts +70 -55
  633. package/dist/src/utils/process.js +129 -179
  634. package/dist/src/utils/ps-duration.d.ts +4 -4
  635. package/dist/src/utils/ps-duration.js +9 -9
  636. package/dist/src/utils/regex.d.ts +4 -4
  637. package/dist/src/utils/regex.js +7 -7
  638. package/dist/src/utils/sleep.d.ts +26 -0
  639. package/dist/src/utils/sleep.js +31 -0
  640. package/dist/src/utils/stdio-drain.d.ts +7 -7
  641. package/dist/src/utils/stdio-drain.js +8 -8
  642. package/dist/src/utils/validation.d.ts +12 -49
  643. package/dist/src/utils/validation.js +26 -36
  644. package/docs/README.md +2 -2
  645. package/docs/configuration.md +163 -69
  646. package/docs/exit-codes.md +66 -49
  647. package/docs/furnace.md +20 -19
  648. package/docs/lifecycle-invariants.md +414 -247
  649. package/docs/machine-output.md +58 -34
  650. package/docs/patch-workflow.md +48 -44
  651. package/docs/run-logs.md +72 -28
  652. package/docs/testing.md +105 -98
  653. package/docs/verification-trees.md +23 -22
  654. package/package.json +7 -6
  655. package/dist/src/commands/rebase.d.ts +0 -4
  656. package/dist/src/commands/rebase.js +0 -5
  657. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  658. package/dist/src/core/patch-artifact-normalize.js +0 -24
  659. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  660. package/dist/src/core/patch-lint-reexports.js +0 -8
  661. package/dist/src/core/wire-targets.d.ts +0 -7
  662. package/dist/src/core/wire-targets.js +0 -8
@@ -1,28 +1,27 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  import { join } from 'node:path';
3
- import { getProjectPaths } from '../core/config.js';
4
3
  import { appendHistory, confirmDestructive, } from '../core/destructive.js';
5
4
  import { enforceFreshFurnaceSources } from '../core/furnace-stale-export.js';
6
5
  import { getDiffForFilesAgainstHead } from '../core/git-diff.js';
7
6
  import { listTrackedInHead } from '../core/git-file-ops.js';
8
7
  import { extractAffectedFiles } from '../core/patch-apply.js';
9
8
  import { updatePatchAndMetadata } from '../core/patch-export.js';
10
- import { buildModifiedFileAdditionsFromDiff, buildPatchQueueContext, formatPatchLintIssue, lintPatchQueue, } from '../core/patch-lint.js';
9
+ import { buildPatchQueueContext, formatPatchLintIssue, lintPatchQueue, } from '../core/patch-lint.js';
11
10
  import { computeProjectedLintRegressions } from '../core/patch-lint-projection.js';
12
11
  import { loadPatchesManifest } from '../core/patch-manifest.js';
13
12
  import { buildProjectedManifest, enforcePatchPolicy } from '../core/patch-policy.js';
14
- import { buildNewFileTextProjection } from '../core/patch-transform.js';
15
13
  import { InvalidArgumentError } from '../errors/base.js';
16
14
  import { pathExists } from '../utils/fs.js';
17
15
  import { info, outro, success, warn } from '../utils/logger.js';
18
16
  import { runPatchLint } from './export-shared.js';
17
+ import { projectEntryBody } from './patch/entry-projection.js';
19
18
  /**
20
19
  * Computes the effective `tier` and `lintIgnore` carrying both the patch's
21
20
  * existing values and the CLI flag overrides.
22
21
  *
23
- * Tier resolution: the CLI flag takes precedence; the patch's existing tier
22
+ * Tier resolution: the CLI flag takes precedence. The patch's existing tier
24
23
  * is the fallback. Lint-ignore resolution: union of the patch's existing list
25
- * and the CLI flag values, de-duplicated; an empty result returns `undefined`
24
+ * and the CLI flag values, de-duplicated. An empty result returns `undefined`
26
25
  * so the caller can drop the field rather than write an empty array.
27
26
  */
28
27
  function resolveEffectiveTierAndLintIgnore(target, options) {
@@ -42,17 +41,11 @@ function resolveEffectiveTierAndLintIgnore(target, options) {
42
41
  */
43
42
  async function runProjectedCrossPatchLint(patchesDir, targetFilename, projectedDiff) {
44
43
  const baseCtx = await buildPatchQueueContext(patchesDir);
45
- const projectedNewFiles = buildNewFileTextProjection(projectedDiff);
46
- const projectedModifiedFileAdditions = buildModifiedFileAdditionsFromDiff(projectedDiff);
44
+ const projection = projectEntryBody(projectedDiff);
47
45
  const projectedEntries = baseCtx.entries.map((entry) => {
48
46
  if (entry.filename !== targetFilename)
49
47
  return entry;
50
- return {
51
- ...entry,
52
- diff: projectedDiff,
53
- newFiles: projectedNewFiles,
54
- modifiedFileAdditions: projectedModifiedFileAdditions,
55
- };
48
+ return { ...entry, ...projection };
56
49
  });
57
50
  const baselineIssues = lintPatchQueue(baseCtx).filter((i) => i.severity === 'error');
58
51
  const projectedIssues = lintPatchQueue({ entries: projectedEntries }).filter((i) => i.severity === 'error');
@@ -117,7 +110,7 @@ async function confirmFilesModeProjection(args) {
117
110
  title: `Re-export ${target.filename} with --files`,
118
111
  summary,
119
112
  // A captured deletion still needs the confirmation: the patch will now
120
- // REMOVE those files wherever it is applied, which is the same class of
113
+ // remove those files wherever it is applied, which is the same class of
121
114
  // consequence as shrinking the scope.
122
115
  yes: removed.length === 0 && deletedFiles.length === 0 ? true : options.yes === true,
123
116
  dryRun: isDryRun,
@@ -129,13 +122,13 @@ async function confirmFilesModeProjection(args) {
129
122
  * Splits the requested paths into what can be diffed and what is a deletion.
130
123
  *
131
124
  * A path absent from disk is one of two very different things, and
132
- * collapsing them is what made a DELETION impossible to capture.
125
+ * collapsing them is what made a deletion impossible to capture.
133
126
  *
134
127
  * Tracked in HEAD: a deletion. `git diff HEAD -- <path>` renders it as a
135
- * proper `deleted file mode` section, so it STAYS in the diff scope. (The
136
- * comment this replaces claimed the diff "would fail" on any missing path —
137
- * true only for the never-tracked case.) Dropping these produced the
138
- * dangerous shape: a re-export that reported success while writing a patch
128
+ * proper `deleted file mode` section, so it stays in the diff scope. (The
129
+ * comment this replaces claimed the diff "would fail" on any missing path,
130
+ * which is true only for the never-tracked case.) Dropping these produced
131
+ * the dangerous shape: a re-export that reported success while writing a patch
139
132
  * whose own file list claimed a path it did not restore, so a fresh clone
140
133
  * would apply it and resurrect exactly what the change meant to remove.
141
134
  *
@@ -192,8 +185,8 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
192
185
  throw new InvalidArgumentError('reExportFilesInPlace called with no --files.', '--files');
193
186
  }
194
187
  const requested = [...new Set(filesOption)].sort();
195
- // Stale-furnace-source gate: same refusal as the generic re-export path —
196
- // the projected diff would capture stale deployed copies.
188
+ // Stale-furnace-source gate: same refusal as the generic re-export path,
189
+ // since the projected diff would capture stale deployed copies.
197
190
  await enforceFreshFurnaceSources(paths.root, requested, options.allowStaleFurnace === true, 're-export');
198
191
  const removed = target.filesAffected.filter((f) => !requested.includes(f));
199
192
  const added = requested.filter((f) => !target.filesAffected.includes(f));
@@ -210,12 +203,11 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
210
203
  }
211
204
  const actualProjectedFiles = extractAffectedFiles(projectedDiff);
212
205
  const actualProjectedSet = new Set(actualProjectedFiles);
213
- // Domain is the FULL requested list, not the diffable subset. When the
206
+ // Domain is the full requested list, not the diffable subset. When the
214
207
  // subset was used, any path filtered out upstream was invisible to this
215
- // check by construction — which is exactly how a dropped deletion slipped
216
- // through while the run reported success. A patch that does not do what
217
- // its own file list claims is the one property a manifest must never get
218
- // wrong, so an explicitly named path that produced no hunk is a refusal.
208
+ // check, which is how a dropped deletion slipped through while the run
209
+ // reported success. A patch must do what its own file list claims, so an
210
+ // explicitly named path that produced no hunk is a refusal.
219
211
  const noDiffFiles = requested.filter((file) => !actualProjectedSet.has(file));
220
212
  if (noDiffFiles.length > 0) {
221
213
  throw new InvalidArgumentError(`Refusing to re-export ${target.filename} with --files because ${noDiffFiles.length} requested path${noDiffFiles.length === 1 ? '' : 's'} produced no diff hunks (${noDiffFiles.join(', ')}). ` +
@@ -235,7 +227,16 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
235
227
  const patchQueueCtx = (await pathExists(paths.patches))
236
228
  ? await buildPatchQueueContext(paths.patches)
237
229
  : undefined;
238
- await runPatchLint(paths.engine, actualProjectedFiles, projectedDiff, config, options.skipLint, patchQueueCtx, ignoreChecks, effectiveTier);
230
+ await runPatchLint({
231
+ engineDir: paths.engine,
232
+ filesAffected: actualProjectedFiles,
233
+ diffContent: projectedDiff,
234
+ config,
235
+ skipLint: options.skipLint,
236
+ patchQueueCtx,
237
+ ignoreChecks,
238
+ patchTier: effectiveTier,
239
+ });
239
240
  const conflicts = await runProjectedCrossPatchLint(paths.patches, target.filename, projectedDiff);
240
241
  const filesUpdates = buildFilesModeMetadataUpdates(actualProjectedFiles, options, effectiveLintIgnore, flagIgnoreSet);
241
242
  const manifest = await loadPatchesManifest(paths.patches);
@@ -273,23 +274,30 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
273
274
  // as the mutation (via the onCommitted hook) so two concurrent re-exports
274
275
  // cannot interleave records and a crash between mutation and append cannot
275
276
  // orphan the audit trail.
276
- await updatePatchAndMetadata(paths.patches, target.filename, projectedDiff, filesUpdates, async () => {
277
- await appendHistory(paths.patches, {
278
- operation: 're-export-files',
279
- args: {
280
- filename: target.filename,
281
- files: actualProjectedFiles,
282
- previousFiles: target.filesAffected,
283
- deletionsCaptured: deletedFiles,
284
- },
285
- ...(options.yes === true ? { yes: true } : {}),
286
- ...(options.forceUnsafe === true ? { unsafeOverride: true } : {}),
287
- result: 'ok',
288
- });
289
- }, {
290
- config,
291
- command: 're-export --files',
292
- forceUnsafe: options.forceUnsafe === true,
277
+ await updatePatchAndMetadata({
278
+ patchesDir: paths.patches,
279
+ filename: target.filename,
280
+ newContent: projectedDiff,
281
+ updates: filesUpdates,
282
+ onCommitted: async () => {
283
+ await appendHistory(paths.patches, {
284
+ operation: 're-export-files',
285
+ args: {
286
+ filename: target.filename,
287
+ files: actualProjectedFiles,
288
+ previousFiles: target.filesAffected,
289
+ deletionsCaptured: deletedFiles,
290
+ },
291
+ ...(options.yes === true ? { yes: true } : {}),
292
+ ...(options.forceUnsafe === true ? { unsafeOverride: true } : {}),
293
+ result: 'ok',
294
+ });
295
+ },
296
+ policyGate: {
297
+ config,
298
+ command: 're-export --files',
299
+ forceUnsafe: options.forceUnsafe === true,
300
+ },
293
301
  });
294
302
  success(`Re-exported ${target.filename}`);
295
303
  outro('Re-export complete');
@@ -1,41 +1,40 @@
1
1
  /**
2
2
  * Hoisted + cached lint context for `re-export`.
3
3
  *
4
- * Rebuilding the whole patch-queue context AND a fresh queue-wide checkJs
4
+ * Rebuilding the whole patch-queue context and a fresh queue-wide checkJs
5
5
  * TypeScript program for every patch costs tens of seconds of fixed setup
6
6
  * per patch, so an N-patch re-export pays it N times. This module:
7
7
  *
8
- * - builds the queue context and the {@link PerRunCheckJs} program
9
- * controller ONCE per invocation (`buildReExportLintContext`) and slices
10
- * per-patch findings out of it;
11
- * - reuses the existing per-patch lint RESULT cache
12
- * (`.fireforge/lint-cache/per-patch-v1.json`) across invocations —
8
+ * - Builds the queue context and the {@link PerRunCheckJs} program
9
+ * controller once per invocation (`buildReExportLintContext`) and slices
10
+ * per-patch findings out of it.
11
+ * - Reuses the existing per-patch lint result cache
12
+ * (`.fireforge/lint-cache/per-patch-v1.json`) across invocations, since
13
13
  * re-export lints the identical input `lint --per-patch` does (the fresh
14
14
  * `git diff HEAD` of the owned files), and the key already hashes engine
15
15
  * HEAD, per-file content, patch body, config, shims, and ownership, so a
16
- * repeat single re-export is a warm hit. `--no-cache` opts out; run-level
17
- * checkJs globals are never cached and are emitted once per invocation;
18
- * - keeps the in-memory queue context honest after each write
16
+ * repeat single re-export is a warm hit. `--no-cache` opts out. Run-level
17
+ * checkJs globals are never cached and are emitted once per invocation.
18
+ * - Keeps the in-memory queue context honest after each write
19
19
  * (`refreshQueueCtxEntry`), so later iterations of an `--all` run lint
20
20
  * against the just-refreshed body instead of the stale one.
21
21
  */
22
- import { getProjectPaths, loadConfig } from '../core/config.js';
23
22
  import { type PatchQueueContext } from '../core/patch-lint.js';
24
23
  import { type PerPatchLintCacheFile } from '../core/patch-lint-cache.js';
25
24
  import type { PatchLintIssue, PatchMetadata } from '../types/commands/index.js';
26
- import type { FireForgeConfig } from '../types/config.js';
25
+ import type { FireForgeConfig, ProjectPaths } from '../types/config.js';
27
26
  import { type PerRunCheckJs } from './lint-per-run-checkjs.js';
28
27
  /** Per-invocation lint context, built once and threaded through the loop. */
29
28
  export interface ReExportLintContext {
30
29
  projectRoot: string;
31
- paths: ReturnType<typeof getProjectPaths>;
30
+ paths: ProjectPaths;
32
31
  config: FireForgeConfig;
33
- /** Whole-queue context, built WITH config so the forward-import hints
34
- * match `lint --per-patch`; undefined when no patches dir. */
32
+ /** Whole-queue context, built with config so the forward-import hints
33
+ * match `lint --per-patch`. Undefined when no patches dir. */
35
34
  patchQueueCtx: PatchQueueContext | undefined;
36
- /** Queue-wide checkJs controller; undefined when checkJs is off. */
35
+ /** Queue-wide checkJs controller. Undefined when checkJs is off. */
37
36
  checkJs: PerRunCheckJs | undefined;
38
- /** Per-patch result cache; undefined under `--no-cache`. */
37
+ /** Per-patch result cache. Undefined under `--no-cache`. */
39
38
  cache: PerPatchLintCacheFile | undefined;
40
39
  engineHeadSha: string | undefined;
41
40
  cacheDirty: boolean;
@@ -44,7 +43,7 @@ export interface ReExportLintContext {
44
43
  globalsEmitted: boolean;
45
44
  }
46
45
  /** Builds the once-per-invocation lint context. */
47
- export declare function buildReExportLintContext(projectRoot: string, paths: ReturnType<typeof getProjectPaths>, config: Awaited<ReturnType<typeof loadConfig>>, noCache: boolean): Promise<ReExportLintContext>;
46
+ export declare function buildReExportLintContext(projectRoot: string, paths: ProjectPaths, config: FireForgeConfig, noCache: boolean): Promise<ReExportLintContext>;
48
47
  /** Fresh lint payload carried to the post-write cache store. */
49
48
  export interface ReExportLintResult {
50
49
  issues: PatchLintIssue[];
@@ -54,20 +53,20 @@ export interface ReExportLintResult {
54
53
  lintIgnore: string[];
55
54
  }
56
55
  /**
57
- * Lints one re-exported patch body using the hoisted context: cache hit →
58
- * replay the stored issues through the shared reporter (returns `null`);
59
- * miss → lint with the queue-wide program's pre-attributed slices (or a
56
+ * Lints one re-exported patch body using the hoisted context. A cache hit
57
+ * replays the stored issues through the shared reporter and returns `null`.
58
+ * A miss lints with the queue-wide program's pre-attributed slices (or a
60
59
  * per-patch build when the fresh diff creates files the hoisted program
61
- * never saw — the `--scan` adoption case) and return the payload for
60
+ * never saw, the `--scan` adoption case) and returns the payload for
62
61
  * {@link storeReExportLintResult}. Throws exactly like `runPatchLint` on
63
62
  * errors (unless `skipLint`).
64
63
  *
65
- * The cache key is built over the PROJECTED metadata (current
64
+ * The cache key is built over the projected metadata (current
66
65
  * filesAffected, merged lintIgnore, effective tier) so `--tier` /
67
- * `--lint-ignore` flags change the key. The entry itself is stored AFTER
68
- * the body write (the key hashes the on-disk `.patch` file, which this
69
- * very run is about to rewrite — a pre-write store could never match a
70
- * later run).
66
+ * `--lint-ignore` flags change the key. The entry itself is stored after
67
+ * the body write, because the key hashes the on-disk `.patch` file that
68
+ * this very run is about to rewrite, so a pre-write store could never
69
+ * match a later run.
71
70
  */
72
71
  export declare function lintReExportedPatch(args: {
73
72
  lintCtx: ReExportLintContext;
@@ -80,16 +79,16 @@ export declare function lintReExportedPatch(args: {
80
79
  patchTier?: 'branding';
81
80
  }): Promise<ReExportLintResult | null>;
82
81
  /**
83
- * Stores a fresh lint result AFTER the body write, keying against the
84
- * just-written `.patch` file and the refreshed queue context — the state
85
- * a later identical invocation will observe (call
82
+ * Stores a fresh lint result after the body write, keying against the
83
+ * just-written `.patch` file and the refreshed queue context, which is the
84
+ * state a later identical invocation will observe (call
86
85
  * {@link refreshQueueCtxEntry} first).
87
86
  */
88
87
  export declare function storeReExportLintResult(lintCtx: ReExportLintContext, patchFilename: string, projectedMetadata: PatchMetadata, existingFiles: string[], result: ReExportLintResult): Promise<void>;
89
88
  /**
90
89
  * Refreshes the in-memory queue entry for a just-rewritten patch so later
91
90
  * iterations (and later cache keys) lint against the new body instead of
92
- * the stale one. The on-disk write is the authority; this mirrors it.
91
+ * the stale one. The on-disk write is the authority. This mirrors it.
93
92
  */
94
93
  export declare function refreshQueueCtxEntry(lintCtx: ReExportLintContext, patchFilename: string, diffContent: string): void;
95
94
  /** Persists cache writes and reports reuse, once after the loop. */
@@ -2,25 +2,24 @@
2
2
  /**
3
3
  * Hoisted + cached lint context for `re-export`.
4
4
  *
5
- * Rebuilding the whole patch-queue context AND a fresh queue-wide checkJs
5
+ * Rebuilding the whole patch-queue context and a fresh queue-wide checkJs
6
6
  * TypeScript program for every patch costs tens of seconds of fixed setup
7
7
  * per patch, so an N-patch re-export pays it N times. This module:
8
8
  *
9
- * - builds the queue context and the {@link PerRunCheckJs} program
10
- * controller ONCE per invocation (`buildReExportLintContext`) and slices
11
- * per-patch findings out of it;
12
- * - reuses the existing per-patch lint RESULT cache
13
- * (`.fireforge/lint-cache/per-patch-v1.json`) across invocations —
9
+ * - Builds the queue context and the {@link PerRunCheckJs} program
10
+ * controller once per invocation (`buildReExportLintContext`) and slices
11
+ * per-patch findings out of it.
12
+ * - Reuses the existing per-patch lint result cache
13
+ * (`.fireforge/lint-cache/per-patch-v1.json`) across invocations, since
14
14
  * re-export lints the identical input `lint --per-patch` does (the fresh
15
15
  * `git diff HEAD` of the owned files), and the key already hashes engine
16
16
  * HEAD, per-file content, patch body, config, shims, and ownership, so a
17
- * repeat single re-export is a warm hit. `--no-cache` opts out; run-level
18
- * checkJs globals are never cached and are emitted once per invocation;
19
- * - keeps the in-memory queue context honest after each write
17
+ * repeat single re-export is a warm hit. `--no-cache` opts out. Run-level
18
+ * checkJs globals are never cached and are emitted once per invocation.
19
+ * - Keeps the in-memory queue context honest after each write
20
20
  * (`refreshQueueCtxEntry`), so later iterations of an `--all` run lint
21
21
  * against the just-refreshed body instead of the stale one.
22
22
  */
23
- import { getProjectPaths, loadConfig } from '../core/config.js';
24
23
  import { buildPatchQueueContext, countNonBinaryDiffLines, detectNewFilesInDiff, lintExportedPatch, resolvePatchSizeTier, } from '../core/patch-lint.js';
25
24
  import { buildPerPatchLintCacheKey, getCachedPerPatchLintIssues, getPerPatchLintCacheHeadSha, loadPerPatchLintCache, savePerPatchLintCache, setCachedPerPatchLintIssues, } from '../core/patch-lint-cache.js';
26
25
  import { invalidateNewFileCreatorsCache } from '../core/patch-lint-cross.js';
@@ -63,26 +62,26 @@ function checkJsFilesInDiff(diffContent, checkJs) {
63
62
  return files;
64
63
  }
65
64
  /**
66
- * Lints one re-exported patch body using the hoisted context: cache hit →
67
- * replay the stored issues through the shared reporter (returns `null`);
68
- * miss → lint with the queue-wide program's pre-attributed slices (or a
65
+ * Lints one re-exported patch body using the hoisted context. A cache hit
66
+ * replays the stored issues through the shared reporter and returns `null`.
67
+ * A miss lints with the queue-wide program's pre-attributed slices (or a
69
68
  * per-patch build when the fresh diff creates files the hoisted program
70
- * never saw — the `--scan` adoption case) and return the payload for
69
+ * never saw, the `--scan` adoption case) and returns the payload for
71
70
  * {@link storeReExportLintResult}. Throws exactly like `runPatchLint` on
72
71
  * errors (unless `skipLint`).
73
72
  *
74
- * The cache key is built over the PROJECTED metadata (current
73
+ * The cache key is built over the projected metadata (current
75
74
  * filesAffected, merged lintIgnore, effective tier) so `--tier` /
76
- * `--lint-ignore` flags change the key. The entry itself is stored AFTER
77
- * the body write (the key hashes the on-disk `.patch` file, which this
78
- * very run is about to rewrite — a pre-write store could never match a
79
- * later run).
75
+ * `--lint-ignore` flags change the key. The entry itself is stored after
76
+ * the body write, because the key hashes the on-disk `.patch` file that
77
+ * this very run is about to rewrite, so a pre-write store could never
78
+ * match a later run.
80
79
  */
81
80
  export async function lintReExportedPatch(args) {
82
81
  const { lintCtx, patch, projectedMetadata, existingFiles, diffContent } = args;
83
82
  const { paths, config, patchQueueCtx, checkJs, cache } = lintCtx;
84
- // Tier notice, identical to runPatchLint's head — surfaced on both the
85
- // cached and fresh paths so the governing tier is never silent.
83
+ // Tier notice, identical to runPatchLint's head. It is surfaced on both
84
+ // the cached and fresh paths so the governing tier is never silent.
86
85
  const tierDecision = resolvePatchSizeTier(existingFiles, args.patchTier);
87
86
  if (tierDecision.tier === 'branding') {
88
87
  info(tierDecision.source === 'explicit'
@@ -127,8 +126,8 @@ export async function lintReExportedPatch(args) {
127
126
  }
128
127
  else {
129
128
  // Fresh `--scan` adoption created checkJs-relevant files the hoisted
130
- // program has never seen — fall back to a per-patch build with the
131
- // usual report scope so nothing is silently unchecked.
129
+ // program has never seen, so fall back to a per-patch build with the
130
+ // usual report scope and nothing is silently unchecked.
132
131
  lintOptions.checkJsReportScope = resolvePatchOwnedSysMjs(detectNewFilesInDiff(diffContent));
133
132
  }
134
133
  }
@@ -150,9 +149,9 @@ export async function lintReExportedPatch(args) {
150
149
  };
151
150
  }
152
151
  /**
153
- * Stores a fresh lint result AFTER the body write, keying against the
154
- * just-written `.patch` file and the refreshed queue context — the state
155
- * a later identical invocation will observe (call
152
+ * Stores a fresh lint result after the body write, keying against the
153
+ * just-written `.patch` file and the refreshed queue context, which is the
154
+ * state a later identical invocation will observe (call
156
155
  * {@link refreshQueueCtxEntry} first).
157
156
  */
158
157
  export async function storeReExportLintResult(lintCtx, patchFilename, projectedMetadata, existingFiles, result) {
@@ -169,13 +168,21 @@ export async function storeReExportLintResult(lintCtx, patchFilename, projectedM
169
168
  queueContext: patchQueueCtx,
170
169
  ...(lintCtx.engineHeadSha === undefined ? {} : { engineHeadSha: lintCtx.engineHeadSha }),
171
170
  });
172
- setCachedPerPatchLintIssues(cache, patchFilename, cacheKey, result.issues, result.suppressed, result.lineCount, result.lintIgnore);
171
+ setCachedPerPatchLintIssues({
172
+ cache,
173
+ patchFilename,
174
+ key: cacheKey,
175
+ issues: result.issues,
176
+ suppressed: result.suppressed,
177
+ lineCount: result.lineCount,
178
+ lintIgnore: result.lintIgnore,
179
+ });
173
180
  lintCtx.cacheDirty = true;
174
181
  }
175
182
  /**
176
183
  * Refreshes the in-memory queue entry for a just-rewritten patch so later
177
184
  * iterations (and later cache keys) lint against the new body instead of
178
- * the stale one. The on-disk write is the authority; this mirrors it.
185
+ * the stale one. The on-disk write is the authority. This mirrors it.
179
186
  */
180
187
  export function refreshQueueCtxEntry(lintCtx, patchFilename, diffContent) {
181
188
  const ctx = lintCtx.patchQueueCtx;
@@ -191,7 +198,7 @@ export function refreshQueueCtxEntry(lintCtx, patchFilename, diffContent) {
191
198
  const modifiedFileAdditions = new Map();
192
199
  for (const [file, lines] of addedLinesByFile) {
193
200
  if (newFilePaths.has(file)) {
194
- // A created file's content IS its added lines.
201
+ // A created file's content is its added lines.
195
202
  newFiles.set(file, lines.join('\n'));
196
203
  }
197
204
  else {
@@ -11,7 +11,7 @@ export interface NormalizedReExportArguments {
11
11
  * `re-export <patch> --files`. Commander's `--files <paths>` consumes one
12
12
  * comma-separated value, so `re-export 006-x --files a/b.js c/d.js` parks
13
13
  * `c/d.js` in the positional patches and fails with "--files operates on
14
- * exactly one target patch" — pointing at the wrong argument. When every
14
+ * exactly one target patch", pointing at the wrong argument. When every
15
15
  * positional beyond the first looks like a file path, fold them into the
16
16
  * file list.
17
17
  */
@@ -14,7 +14,7 @@ function looksLikeFilePath(value) {
14
14
  * `re-export <patch> --files`. Commander's `--files <paths>` consumes one
15
15
  * comma-separated value, so `re-export 006-x --files a/b.js c/d.js` parks
16
16
  * `c/d.js` in the positional patches and fails with "--files operates on
17
- * exactly one target patch" — pointing at the wrong argument. When every
17
+ * exactly one target patch", pointing at the wrong argument. When every
18
18
  * positional beyond the first looks like a file path, fold them into the
19
19
  * file list.
20
20
  */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Split out of `re-export.ts`, which was otherwise over the per-file line
5
5
  * cap. The split direction matches the existing `re-export-scan.ts` /
6
- * `re-export-options.ts` boundary; folding `re-export-files.ts` back into
6
+ * `re-export-options.ts` boundary. Folding `re-export-files.ts` back into
7
7
  * the orchestrator would go the wrong way.
8
8
  */
9
9
  import { Command } from 'commander';
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Split out of `re-export.ts`, which was otherwise over the per-file line
6
6
  * cap. The split direction matches the existing `re-export-scan.ts` /
7
- * `re-export-options.ts` boundary; folding `re-export-files.ts` back into
7
+ * `re-export-options.ts` boundary. Folding `re-export-files.ts` back into
8
8
  * the orchestrator would go the wrong way.
9
9
  */
10
10
  import { Command, Option } from 'commander';
@@ -30,7 +30,7 @@ export declare function confirmBroadScanAdditions(args: {
30
30
  }): Promise<boolean>;
31
31
  /**
32
32
  * Refuses scan adoptions whose candidate files import modules created by
33
- * LATER patches. Modeled on the `re-export --files` cross-patch
33
+ * later patches. Modeled on the `re-export --files` cross-patch
34
34
  * projection: the candidates' diffs are projected into the adopting
35
35
  * patch's queue entry, the queue lint runs baseline vs projection, and
36
36
  * only forward-import regressions attributable to the candidates block.
@@ -6,6 +6,7 @@ import { listTrackedInHead } from '../core/git-file-ops.js';
6
6
  import { getModifiedFilesInDir, getUntrackedFilesInDir } from '../core/git-status.js';
7
7
  import { extractAffectedFiles } from '../core/patch-apply.js';
8
8
  import { buildModifiedFileAdditionsFromDiff, buildPatchQueueContext, lintPatchQueue, } from '../core/patch-lint.js';
9
+ import { detectNewFilesInDiff } from '../core/patch-lint-diff.js';
9
10
  import { computeProjectedLintRegressions } from '../core/patch-lint-projection.js';
10
11
  import { getClaimedFiles } from '../core/patch-manifest.js';
11
12
  import { buildNewFileTextProjection } from '../core/patch-transform.js';
@@ -56,10 +57,10 @@ async function scanPatchFiles(args) {
56
57
  discoveredFiles.add(f);
57
58
  }
58
59
  // Git pathspecs recurse, so a claimed file in a shallow directory would
59
- // sweep entire subtrees into the candidate set — with several patches
60
+ // sweep entire subtrees into the candidate set: with several patches
60
61
  // sharing a parent directory, every unmanaged file in the tree gets
61
62
  // offered to whichever patch is scanned first. Constrain the broad scan
62
- // to the patch's exact directory footprint; deeper paths need an
63
+ // to the patch's exact directory footprint. Deeper paths need an
63
64
  // explicit --scan-file / --scan-files assignment.
64
65
  const parentDirSet = new Set(parentDirs);
65
66
  const currentSet = new Set(currentFilesAffected);
@@ -77,7 +78,7 @@ async function scanPatchFilesTargeted(args) {
77
78
  // Phase-split for bounded concurrency: the sync claimed-by-others check
78
79
  // first (first offender in argument order, as before), then pooled
79
80
  // existence probes with the refusal chosen by ordered iteration so the
80
- // FIRST missing file in argument order is named deterministically.
81
+ // first missing file in argument order is named deterministically.
81
82
  for (const file of scanFiles) {
82
83
  if (claimedByOthers.has(file)) {
83
84
  throw new InvalidArgumentError(`--scan-file path is already claimed by another patch: ${file}`, '--scan-file');
@@ -98,12 +99,12 @@ async function scanPatchFilesTargeted(args) {
98
99
  return reportScanResult(currentFilesAffected, patchFilename, isDryRun, added.sort(), removed);
99
100
  }
100
101
  /**
101
- * Paths that have genuinely left the patch's ownership: absent from disk AND
102
+ * Paths that have genuinely left the patch's ownership: absent from disk and
102
103
  * untracked in engine HEAD.
103
104
  *
104
- * An absent path that IS tracked in HEAD is a DELETION, not a de-ownership.
105
+ * An absent path that is tracked in HEAD is a deletion, not a de-ownership.
105
106
  * The diff carries it as a `deleted file mode` section, so it must stay in
106
- * `filesAffected` — pruning it desynchronises the manifest from the patch
107
+ * `filesAffected`. Pruning it desynchronises the manifest from the patch
107
108
  * body in the direction that hurts: the body says "delete this file", the
108
109
  * file list says the patch has nothing to do with it.
109
110
  */
@@ -135,14 +136,14 @@ export async function confirmBroadScanAdditions(args) {
135
136
  if (isDryRun || yes || !scanAdditionsNeedConfirmation(added))
136
137
  return true;
137
138
  const dirCount = new Set(added.map((f) => dirname(f))).size;
138
- warn(`${patchFilename}: --scan would add ${String(added.length)} file(s) that span ${String(dirCount)} director${dirCount === 1 ? 'y' : 'ies'}. ` +
139
+ warn(`${patchFilename}: --scan would add ${added.length} file(s) that span ${dirCount} director${dirCount === 1 ? 'y' : 'ies'}. ` +
139
140
  'Broad scans can silently pull adjacent features into a patch — review the diff before continuing.');
140
141
  if (!isInteractive) {
141
142
  throw new GeneralError(`Refusing to broaden "${patchFilename}" via --scan in non-interactive mode. ` +
142
143
  'Pass --yes to acknowledge the expansion, or run with --dry-run first to review.');
143
144
  }
144
145
  const confirmed = await confirm({
145
- message: `Proceed and broaden ${patchFilename} with ${String(added.length)} newly discovered file(s)?`,
146
+ message: `Proceed and broaden ${patchFilename} with ${added.length} newly discovered file(s)?`,
146
147
  initialValue: false,
147
148
  });
148
149
  if (isCancel(confirmed) || !confirmed) {
@@ -160,7 +161,7 @@ function scanAdditionsNeedConfirmation(added) {
160
161
  }
161
162
  /**
162
163
  * Refuses scan adoptions whose candidate files import modules created by
163
- * LATER patches. Modeled on the `re-export --files` cross-patch
164
+ * later patches. Modeled on the `re-export --files` cross-patch
164
165
  * projection: the candidates' diffs are projected into the adopting
165
166
  * patch's queue entry, the queue lint runs baseline vs projection, and
166
167
  * only forward-import regressions attributable to the candidates block.
@@ -177,6 +178,7 @@ export async function assertScanAdoptionsHaveNoForwardImports(args) {
177
178
  if (!candidateDiff.trim())
178
179
  return;
179
180
  const candidateNewFiles = buildNewFileTextProjection(candidateDiff);
181
+ const candidateCreations = detectNewFilesInDiff(candidateDiff);
180
182
  const candidateAdditions = buildModifiedFileAdditionsFromDiff(candidateDiff);
181
183
  const baseCtx = await buildPatchQueueContext(patchesDir);
182
184
  const projectedEntries = baseCtx.entries.map((entry) => {
@@ -186,6 +188,7 @@ export async function assertScanAdoptionsHaveNoForwardImports(args) {
186
188
  ...entry,
187
189
  diff: `${entry.diff}\n${candidateDiff}`,
188
190
  newFiles: new Map([...entry.newFiles, ...candidateNewFiles]),
191
+ createdFiles: new Set([...entry.createdFiles, ...candidateCreations]),
189
192
  modifiedFileAdditions: new Map([...entry.modifiedFileAdditions, ...candidateAdditions]),
190
193
  };
191
194
  });
@@ -4,17 +4,36 @@
4
4
  * loop calls {@link reExportSinglePatchWithIndexLockRetry} per selected
5
5
  * patch.
6
6
  */
7
- import { getProjectPaths } from '../core/config.js';
8
7
  import type { PatchesManifest, PatchMetadata, ReExportOptions } from '../types/commands/index.js';
9
- import type { FireForgeConfig } from '../types/config.js';
8
+ import type { FireForgeConfig, ProjectPaths } from '../types/config.js';
10
9
  import type { AdjacentUnmanagedContext } from './re-export-adjacent.js';
11
10
  import type { ForeignDriftContext } from './re-export-drift.js';
12
11
  import { type ReExportLintContext } from './re-export-lint.js';
12
+ export interface ReExportSinglePatchArgs {
13
+ /** Manifest row for the patch being refreshed. */
14
+ patch: PatchMetadata;
15
+ /** Resolved project paths. */
16
+ paths: ProjectPaths;
17
+ /** Patch queue manifest as loaded by the orchestrator. */
18
+ manifest: PatchesManifest;
19
+ /** Effective re-export options for this patch. */
20
+ options: ReExportOptions;
21
+ /** Whether the run is a dry run. */
22
+ isDryRun: boolean;
23
+ /** Project configuration. */
24
+ config: FireForgeConfig;
25
+ /** Adjacent-unmanaged-file reporting context. */
26
+ adjacentCtx: AdjacentUnmanagedContext;
27
+ /** Foreign-drift reporting context. */
28
+ driftCtx: ForeignDriftContext;
29
+ /** Per-patch lint context, including the shared lint cache. */
30
+ lintCtx: ReExportLintContext;
31
+ }
13
32
  /**
14
33
  * Retries a single patch re-export exactly once when the failure is
15
34
  * transient git `index.lock` contention (an external git process holding
16
35
  * the engine repo's index). The retry re-enters `reExportSinglePatch`
17
- * from the top, so it re-reads clean state; a second lock failure
36
+ * from the top, so it re-reads clean state. A second lock failure
18
37
  * propagates to the loop's honest "N of M" accounting.
19
38
  */
20
- export declare function reExportSinglePatchWithIndexLockRetry(patch: PatchMetadata, paths: ReturnType<typeof getProjectPaths>, manifest: PatchesManifest, options: ReExportOptions, isDryRun: boolean, config: FireForgeConfig, adjacentCtx: AdjacentUnmanagedContext, driftCtx: ForeignDriftContext, lintCtx: ReExportLintContext): Promise<boolean>;
39
+ export declare function reExportSinglePatchWithIndexLockRetry(args: ReExportSinglePatchArgs): Promise<boolean>;