@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
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * Matches any of:
14
14
  * 1. `setElementCreationCallback("tag"` / `setElementCreationCallback('tag'`
15
- * 2. Single-line array entry: `["tag", "..."]` — column 0 only, comments allowed after
15
+ * 2. Single-line array entry: `["tag", "..."]` (column 0 only, comments allowed after)
16
16
  * 3. Multi-line array entry: `"tag",` on its own line, optional trailing `//` comment
17
17
  */
18
18
  export declare function isTagAlreadyRegistered(content: string, tagName: string): boolean;
@@ -28,7 +28,6 @@ export interface RegistrationWriteOptions {
28
28
  */
29
29
  markerComment?: string;
30
30
  }
31
- export { removeCustomElementRegistration } from './furnace-registration-remove.js';
32
31
  /**
33
32
  * Adds a custom element registration entry to customElements.js.
34
33
  *
@@ -39,7 +38,7 @@ export { removeCustomElementRegistration } from './furnace-registration-remove.j
39
38
  * ```
40
39
  *
41
40
  * New entries are inserted in alphabetical order relative to existing entries.
42
- * This operation is idempotent — if the tag is already registered the file is
41
+ * This operation is idempotent: if the tag is already registered the file is
43
42
  * left unchanged.
44
43
  *
45
44
  * @param engineDir - Path to the Firefox engine source root
@@ -23,7 +23,7 @@ import { validateRegistrationPlacement, validateTagName } from './furnace-regist
23
23
  *
24
24
  * Matches any of:
25
25
  * 1. `setElementCreationCallback("tag"` / `setElementCreationCallback('tag'`
26
- * 2. Single-line array entry: `["tag", "..."]` — column 0 only, comments allowed after
26
+ * 2. Single-line array entry: `["tag", "..."]` (column 0 only, comments allowed after)
27
27
  * 3. Multi-line array entry: `"tag",` on its own line, optional trailing `//` comment
28
28
  */
29
29
  export function isTagAlreadyRegistered(content, tagName) {
@@ -46,9 +46,6 @@ function formatMarkerSuffix(markerComment) {
46
46
  return '';
47
47
  return ` // ${markerComment}:`;
48
48
  }
49
- // Re-export from split modules so existing import sites continue working
50
- export { removeCustomElementRegistration } from './furnace-registration-remove.js';
51
- // Re-export constants so existing import sites continue working
52
49
  // ---------------------------------------------------------------------------
53
50
  // Helpers
54
51
  // ---------------------------------------------------------------------------
@@ -237,8 +234,8 @@ function addRegistrationAST(content, tagName, modulePath, isESModule, markerComm
237
234
  * fails. Finds the last existing `["tag", "path"],` line in the appropriate
238
235
  * block and inserts the new entry after it in alphabetical order.
239
236
  *
240
- * This is intentionally less precise than the AST approach — it does not
241
- * validate indentation or multi-line format — but it is robust against
237
+ * This is intentionally less precise than the AST approach (it does not
238
+ * validate indentation or multi-line format), but it is robust against
242
239
  * upstream syntax changes that break the parser.
243
240
  */
244
241
  function addRegistrationRegexFallback(content, tagName, modulePath, isESModule, markerComment) {
@@ -300,7 +297,7 @@ function hasRecognizableRegistrationLoop(content) {
300
297
  * ```
301
298
  *
302
299
  * New entries are inserted in alphabetical order relative to existing entries.
303
- * This operation is idempotent — if the tag is already registered the file is
300
+ * This operation is idempotent: if the tag is already registered the file is
304
301
  * left unchanged.
305
302
  *
306
303
  * @param engineDir - Path to the Firefox engine source root
@@ -315,13 +312,13 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
315
312
  const content = await readText(filePath);
316
313
  // Idempotency: check column-0 of each array entry rather than a literal
317
314
  // substring match. A previous apply may have written this entry with
318
- // trailing marker comments (see `options.markerComment`); matching on the
315
+ // trailing marker comments (see `options.markerComment`). Matching on the
319
316
  // full line would then miss it and insert a duplicate on re-apply, which
320
317
  // throws NotSupportedError at every window-load.
321
318
  if (isTagAlreadyRegistered(content, tagName)) {
322
319
  return;
323
320
  }
324
- // Validate upfront — tag name errors must not fall through to the regex fallback.
321
+ // Validate upfront. Tag name errors must not fall through to the regex fallback.
325
322
  validateTagName(tagName);
326
323
  const isESModule = modulePath.endsWith('.mjs');
327
324
  // Cheap pre-flight: the AST walker assumes the file contains at least one
@@ -329,7 +326,7 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
329
326
  // right-hand side, and (for ESM tags) at least one such loop inside a
330
327
  // `document.addEventListener("DOMContentLoaded", ...)` block. If either
331
328
  // assumption is violated the AST path errors with a confusing
332
- // "Could not find DOMContentLoaded block" message — fail fast here with
329
+ // "Could not find DOMContentLoaded block" message, so fail fast here with
333
330
  // actionable guidance instead.
334
331
  if (!hasRecognizableRegistrationLoop(content)) {
335
332
  throw new FurnaceError(`${CUSTOM_ELEMENTS_JS} does not contain a recognizable registration loop; refusing to mutate. ` +
@@ -345,7 +342,7 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
345
342
  }
346
343
  catch (error) {
347
344
  if (error instanceof FurnaceError) {
348
- // AST structural errors (missing DOMContentLoaded block, etc.) — try regex fallback
345
+ // AST structural errors (missing DOMContentLoaded block, etc.): try regex fallback
349
346
  warn(`AST-based registration failed for ${tagName}: ${error.message}. ` +
350
347
  'Falling back to regex-based insertion. Please report this so the AST parser can be updated.');
351
348
  try {
@@ -399,7 +396,7 @@ export async function validateCustomElementRegistration(engineDir, tagName, modu
399
396
  addRegistrationAST(content, tagName, modulePath, isESModule);
400
397
  }
401
398
  catch {
402
- // Validation only — if AST fails, try regex to see if the entry could be placed
399
+ // Validation only: if AST fails, try regex to see if the entry could be placed
403
400
  addRegistrationRegexFallback(content, tagName, modulePath, isESModule);
404
401
  }
405
402
  }
@@ -4,8 +4,8 @@
4
4
  * Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
5
5
  * locate and delete registration entries. A line-by-line scan with a bounded
6
6
  * bracket match only works against Firefox's stock formatting and fails
7
- * silently on a hand-reformatted customElements.js; AST-based bracket
8
- * matching is format-agnostic by construction.
7
+ * silently on a hand-reformatted customElements.js. AST-based bracket
8
+ * matching does not depend on the file's formatting.
9
9
  *
10
10
  * Contract:
11
11
  * - Idempotent: if the tag is not registered, the file is left unchanged.
@@ -23,10 +23,10 @@
23
23
  /**
24
24
  * Removes a custom element registration from customElements.js.
25
25
  *
26
- * This operation is idempotent — if the tag is not registered or the file
26
+ * This operation is idempotent: if the tag is not registered or the file
27
27
  * does not exist, nothing happens. If the file exists but cannot be parsed,
28
28
  * the file is left unchanged rather than fall back to a line-based
29
- * heuristic; a corrupted customElements.js is a doctor problem, not
29
+ * heuristic. A corrupted customElements.js is a doctor problem, not
30
30
  * something `furnace remove` should "helpfully" edit around.
31
31
  *
32
32
  * @param engineDir - Path to the Firefox engine source root
@@ -5,8 +5,8 @@
5
5
  * Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
6
6
  * locate and delete registration entries. A line-by-line scan with a bounded
7
7
  * bracket match only works against Firefox's stock formatting and fails
8
- * silently on a hand-reformatted customElements.js; AST-based bracket
9
- * matching is format-agnostic by construction.
8
+ * silently on a hand-reformatted customElements.js. AST-based bracket
9
+ * matching does not depend on the file's formatting.
10
10
  *
11
11
  * Contract:
12
12
  * - Idempotent: if the tag is not registered, the file is left unchanged.
@@ -49,7 +49,7 @@ function expandRemovalRange(content, start, end) {
49
49
  }
50
50
  // Consume a trailing inline comment up to end-of-line so we do not leave
51
51
  // the comment marooned on its own line. A leading inline comment is left
52
- // alone — it may belong to the next entry.
52
+ // alone, because it may belong to the next entry.
53
53
  while (expandedEnd < content.length &&
54
54
  (content[expandedEnd] === ' ' || content[expandedEnd] === '\t')) {
55
55
  expandedEnd++;
@@ -88,7 +88,7 @@ function expandRemovalRange(content, start, end) {
88
88
  }
89
89
  /**
90
90
  * Returns true if `node` represents a `[tag, module]` entry inside a
91
- * registration array — i.e. an `ArrayExpression` whose first element is a
91
+ * registration array, i.e. an `ArrayExpression` whose first element is a
92
92
  * string literal equal to `tagName`. Callers still have to verify the
93
93
  * parent is the outer registration array so we do not accidentally delete
94
94
  * an arbitrary user-owned `["moz-card", ...]` literal elsewhere in the file.
@@ -176,10 +176,10 @@ function collectRemovalRanges(ast, content, tagName) {
176
176
  /**
177
177
  * Removes a custom element registration from customElements.js.
178
178
  *
179
- * This operation is idempotent — if the tag is not registered or the file
179
+ * This operation is idempotent: if the tag is not registered or the file
180
180
  * does not exist, nothing happens. If the file exists but cannot be parsed,
181
181
  * the file is left unchanged rather than fall back to a line-based
182
- * heuristic; a corrupted customElements.js is a doctor problem, not
182
+ * heuristic. A corrupted customElements.js is a doctor problem, not
183
183
  * something `furnace remove` should "helpfully" edit around.
184
184
  *
185
185
  * @param engineDir - Path to the Firefox engine source root
@@ -25,8 +25,8 @@ export declare function validateTagName(tagName: string): void;
25
25
  * Returns why `tagName` is invalid, or `undefined` when it is fine.
26
26
  *
27
27
  * The message-returning half of {@link validateTagName}, for callers that
28
- * must not throw — specifically clack `validate` callbacks, which expect a
29
- * returned string and re-prompt on it. Passing the THROWING form to one
28
+ * must not throw, specifically clack `validate` callbacks, which expect a
29
+ * returned string and re-prompt on it. Passing the throwing form to one
30
30
  * makes an invalid tag name escape clack's validation loop as a
31
31
  * `FurnaceError`, killing the prompt instead of showing the rule inline.
32
32
  *
@@ -33,8 +33,8 @@ export function validateTagName(tagName) {
33
33
  * Returns why `tagName` is invalid, or `undefined` when it is fine.
34
34
  *
35
35
  * The message-returning half of {@link validateTagName}, for callers that
36
- * must not throw — specifically clack `validate` callbacks, which expect a
37
- * returned string and re-prompt on it. Passing the THROWING form to one
36
+ * must not throw, specifically clack `validate` callbacks, which expect a
37
+ * returned string and re-prompt on it. Passing the throwing form to one
38
38
  * makes an invalid tag name escape clack's validation loop as a
39
39
  * `FurnaceError`, killing the prompt instead of showing the rule inline.
40
40
  *
@@ -1,4 +1,5 @@
1
- export { addCustomElementRegistration, removeCustomElementRegistration, validateCustomElementRegistration, } from './furnace-registration-ast.js';
1
+ export { addCustomElementRegistration, validateCustomElementRegistration, } from './furnace-registration-ast.js';
2
+ export { removeCustomElementRegistration } from './furnace-registration-remove.js';
2
3
  /**
3
4
  * Adds jar.mn entries that map chrome:// URIs to on-disk paths for a
4
5
  * component's files.
@@ -16,7 +17,7 @@ export { addCustomElementRegistration, removeCustomElementRegistration, validate
16
17
  * `content/global/elements/` line. Falls back to 3 spaces when no
17
18
  * reference line exists.
18
19
  * - **Insertion point**: identified by existing lines matching the regex
19
- * `^\s+content\/global\/elements\/([^.]+)\.` — new entries are inserted
20
+ * `^\s+content\/global\/elements\/([^.]+)\.`. New entries are inserted
20
21
  * in alphabetical order relative to these.
21
22
  * - **Fallback**: if no `content/global/elements/` line exists (empty
22
23
  * project), looks for any `content/global/` line and inserts after it.
@@ -41,7 +42,7 @@ export declare function addJarMnEntries(engineDir: string, tagName: string, file
41
42
  * does not resolve at runtime, so the generated `--localized` component
42
43
  * silently ships broken l10n.
43
44
  *
44
- * Degrades gracefully — if the locale jar.mn (e.g. `toolkit/locales/jar.mn`)
45
+ * Degrades gracefully: if the locale jar.mn (e.g. `toolkit/locales/jar.mn`)
45
46
  * does not exist, returns 0 rather than throwing, so a custom fork without a
46
47
  * standard locales package can still apply a localized component.
47
48
  *
@@ -58,13 +59,13 @@ export declare function addJarMnEntries(engineDir: string, tagName: string, file
58
59
  export declare function addLocaleFtlJarMnEntry(engineDir: string, jarMnRelPath: string, tagName: string, chromeSubPath: string): Promise<number>;
59
60
  /**
60
61
  * Removes a locale jar.mn entry previously written by `addLocaleFtlJarMnEntry`.
61
- * Idempotent — if the entry is absent or the file is missing, nothing happens.
62
+ * Idempotent: if the entry is absent or the file is missing, nothing happens.
62
63
  */
63
64
  export declare function removeLocaleFtlJarMnEntry(engineDir: string, jarMnRelPath: string, tagName: string, chromeSubPath: string): Promise<void>;
64
65
  /**
65
66
  * Removes all jar.mn entries for a given tag name.
66
67
  *
67
- * This operation is idempotent — if no entries exist or the file is missing,
68
+ * This operation is idempotent: if no entries exist or the file is missing,
68
69
  * nothing happens.
69
70
  *
70
71
  * @param engineDir - Path to the Firefox engine source root
@@ -82,7 +83,7 @@ export interface StaleJarMnEntry {
82
83
  }
83
84
  /**
84
85
  * Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)` whose
85
- * workspace source file no longer exists — a renamed component helper
86
+ * workspace source file no longer exists. A renamed component helper
86
87
  * otherwise leaves the old line pointing at a deleted file and every build
87
88
  * fails at packaging. Only tags in `managedTags` (furnace-managed custom
88
89
  * components) are inspected, so upstream lines are never touched.
@@ -2,22 +2,31 @@
2
2
  import { join } from 'node:path';
3
3
  import { FurnaceError } from '../errors/furnace.js';
4
4
  import { pathExists, readText, writeText } from '../utils/fs.js';
5
+ /**
6
+ * Returns the leading whitespace of the first line matching `pattern`, whose
7
+ * first capture group must be that indentation. `undefined` when no line
8
+ * matches, so callers can chain progressively looser patterns before falling
9
+ * back to a convention default.
10
+ */
11
+ function detectIndent(lines, pattern) {
12
+ for (const line of lines) {
13
+ const match = pattern.exec(line);
14
+ if (match?.[1])
15
+ return match[1];
16
+ }
17
+ return undefined;
18
+ }
5
19
  /**
6
20
  * Detects the indentation used by existing `content/global/elements/` lines
7
21
  * in jar.mn. Falls back to 3 spaces (the historical Firefox convention) when
8
22
  * no reference line is found.
9
23
  */
10
24
  function detectJarMnIndent(lines) {
11
- for (const line of lines) {
12
- const match = /^(\s+)content\/global\/elements\//.exec(line);
13
- if (match?.[1]) {
14
- return match[1];
15
- }
16
- }
17
- return ' ';
25
+ return detectIndent(lines, /^(\s+)content\/global\/elements\//) ?? ' ';
18
26
  }
19
27
  // Re-export everything from the AST module so existing imports keep working
20
- export { addCustomElementRegistration, removeCustomElementRegistration, validateCustomElementRegistration, } from './furnace-registration-ast.js';
28
+ export { addCustomElementRegistration, validateCustomElementRegistration, } from './furnace-registration-ast.js';
29
+ export { removeCustomElementRegistration } from './furnace-registration-remove.js';
21
30
  import { escapeRegex } from '../utils/regex.js';
22
31
  import { JAR_MN } from './furnace-constants.js';
23
32
  /**
@@ -37,7 +46,7 @@ import { JAR_MN } from './furnace-constants.js';
37
46
  * `content/global/elements/` line. Falls back to 3 spaces when no
38
47
  * reference line exists.
39
48
  * - **Insertion point**: identified by existing lines matching the regex
40
- * `^\s+content\/global\/elements\/([^.]+)\.` — new entries are inserted
49
+ * `^\s+content\/global\/elements\/([^.]+)\.`. New entries are inserted
41
50
  * in alphabetical order relative to these.
42
51
  * - **Fallback**: if no `content/global/elements/` line exists (empty
43
52
  * project), looks for any `content/global/` line and inserts after it.
@@ -72,10 +81,7 @@ export async function addJarMnEntries(engineDir, tagName, files) {
72
81
  // Find insertion point among existing content/global/elements/ lines
73
82
  const elementLinePattern = /^\s+content\/global\/elements\/([^.]+)\./;
74
83
  let insertIndex = -1;
75
- for (let i = 0; i < lines.length; i++) {
76
- const line = lines[i];
77
- if (line === undefined)
78
- continue;
84
+ for (const [i, line] of lines.entries()) {
79
85
  const match = elementLinePattern.exec(line);
80
86
  if (match) {
81
87
  const existingTag = match[1] ?? '';
@@ -116,7 +122,7 @@ export async function addJarMnEntries(engineDir, tagName, files) {
116
122
  * does not resolve at runtime, so the generated `--localized` component
117
123
  * silently ships broken l10n.
118
124
  *
119
- * Degrades gracefully — if the locale jar.mn (e.g. `toolkit/locales/jar.mn`)
125
+ * Degrades gracefully: if the locale jar.mn (e.g. `toolkit/locales/jar.mn`)
120
126
  * does not exist, returns 0 rather than throwing, so a custom fork without a
121
127
  * standard locales package can still apply a localized component.
122
128
  *
@@ -148,10 +154,7 @@ export async function addLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName, c
148
154
  const newEntry = `${indent}locale/@AB_CD@/${chromeSubPath}/${ftlFile} (%${chromeSubPath}/${ftlFile})`;
149
155
  const sectionPattern = new RegExp(`^(\\s+)locale\\/(?:@AB_CD@|[a-zA-Z-]+)\\/${escapedChrome}\\/([^.\\s]+)\\.ftl`);
150
156
  let insertIndex = -1;
151
- for (let i = 0; i < lines.length; i++) {
152
- const line = lines[i];
153
- if (line === undefined)
154
- continue;
157
+ for (const [i, line] of lines.entries()) {
155
158
  const match = sectionPattern.exec(line);
156
159
  if (match) {
157
160
  const existingTag = match[2] ?? '';
@@ -174,23 +177,13 @@ export async function addLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName, c
174
177
  /** Detects locale jar.mn indentation by sampling an existing matching entry. */
175
178
  function detectLocaleJarMnIndent(lines, chromeSubPath) {
176
179
  const escapedChrome = escapeRegex(chromeSubPath);
177
- const pattern = new RegExp(`^(\\s+)locale\\/(?:@AB_CD@|[a-zA-Z-]+)\\/${escapedChrome}\\/`);
178
- for (const line of lines) {
179
- const match = pattern.exec(line);
180
- if (match?.[1])
181
- return match[1];
182
- }
183
- // Fall back to detecting any existing `locale/...` indent before giving up.
184
- for (const line of lines) {
185
- const match = /^(\s+)locale\//.exec(line);
186
- if (match?.[1])
187
- return match[1];
188
- }
189
- return ' ';
180
+ const exact = new RegExp(`^(\\s+)locale\\/(?:@AB_CD@|[a-zA-Z-]+)\\/${escapedChrome}\\/`);
181
+ // Fall back to any existing `locale/...` indent before giving up.
182
+ return detectIndent(lines, exact) ?? detectIndent(lines, /^(\s+)locale\//) ?? ' ';
190
183
  }
191
184
  /**
192
185
  * Removes a locale jar.mn entry previously written by `addLocaleFtlJarMnEntry`.
193
- * Idempotent — if the entry is absent or the file is missing, nothing happens.
186
+ * Idempotent: if the entry is absent or the file is missing, nothing happens.
194
187
  */
195
188
  export async function removeLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName, chromeSubPath) {
196
189
  const filePath = join(engineDir, jarMnRelPath);
@@ -208,7 +201,7 @@ export async function removeLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName
208
201
  /**
209
202
  * Removes all jar.mn entries for a given tag name.
210
203
  *
211
- * This operation is idempotent — if no entries exist or the file is missing,
204
+ * This operation is idempotent: if no entries exist or the file is missing,
212
205
  * nothing happens.
213
206
  *
214
207
  * @param engineDir - Path to the Firefox engine source root
@@ -221,9 +214,9 @@ export async function removeJarMnEntries(engineDir, tagName) {
221
214
  }
222
215
  let content = await readText(filePath);
223
216
  const lines = content.split('\n');
224
- // Match by the SOURCE MAPPING segment `(widgets/<tagName>/...)` so every
217
+ // Match by the source mapping segment `(widgets/<tagName>/...)` so every
225
218
  // line the component registered is removed regardless of the target
226
- // basename — a helper `.mjs` whose name does not start with the tag (e.g.
219
+ // basename. A helper `.mjs` whose name does not start with the tag (e.g.
227
220
  // a renamed `foo-utils.mjs`) otherwise survives the remove pass and leaves
228
221
  // a stale registration that breaks packaging. The legacy target-path match
229
222
  // is kept as an OR for lines written before the source mapping existed.
@@ -239,7 +232,7 @@ export async function removeJarMnEntries(engineDir, tagName) {
239
232
  const WIDGET_SOURCE_MAPPING_PATTERN = /\(widgets\/([^/)]+)\/([^)]+)\)/;
240
233
  /**
241
234
  * Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)` whose
242
- * workspace source file no longer exists — a renamed component helper
235
+ * workspace source file no longer exists. A renamed component helper
243
236
  * otherwise leaves the old line pointing at a deleted file and every build
244
237
  * fails at packaging. Only tags in `managedTags` (furnace-managed custom
245
238
  * components) are inspected, so upstream lines are never touched.
@@ -16,7 +16,7 @@ export declare function recordCreatedDir(journal: RollbackJournal, dirPath: stri
16
16
  /**
17
17
  * Recursively snapshots every file under a directory tree so a later rollback
18
18
  * can restore deleted files. Skips symlinks to avoid following them out of the
19
- * tree. The directory itself is not recorded as "created" — callers that
19
+ * tree. The directory itself is not recorded as "created", so callers that
20
20
  * intend to delete and restore the directory should record it explicitly.
21
21
  *
22
22
  * Safe to call on a missing path: it returns without recording anything.
@@ -20,7 +20,7 @@ export function recordCreatedDir(journal, dirPath) {
20
20
  /**
21
21
  * Recursively snapshots every file under a directory tree so a later rollback
22
22
  * can restore deleted files. Skips symlinks to avoid following them out of the
23
- * tree. The directory itself is not recorded as "created" — callers that
23
+ * tree. The directory itself is not recorded as "created", so callers that
24
24
  * intend to delete and restore the directory should record it explicitly.
25
25
  *
26
26
  * Safe to call on a missing path: it returns without recording anything.
@@ -49,9 +49,9 @@ export async function snapshotFile(journal, filePath) {
49
49
  // Journal keys are the paths rollback will later write back to, and the
50
50
  // restore runs from whatever cwd the process happens to be in by then. A
51
51
  // relative key would therefore restore somewhere other than where the
52
- // snapshot was taken — silently, and only on the failure path where nobody
53
- // is watching. Every caller composes an absolute path already; this keeps
54
- // it that way.
52
+ // snapshot was taken, silently, and only on the failure path where nobody
53
+ // is watching. Every caller composes an absolute path already, and this
54
+ // keeps it that way.
55
55
  assert(isAbsolute(filePath), () => `snapshot path is absolute (got "${filePath}")`);
56
56
  if (journal.files.has(filePath)) {
57
57
  return;
@@ -149,7 +149,7 @@ export async function restoreRollbackJournal(journal) {
149
149
  // Directory removal is only safe once every file is back where it belongs:
150
150
  // a created directory may hold a restored file, and removing it recursively
151
151
  // would undo the restore we just performed. The throw above is what
152
- // normally enforces this; the assertion names it so a future early-return
152
+ // normally enforces this. The assertion names it so a future early-return
153
153
  // or error-swallowing edit cannot quietly reach the rm loop with failures
154
154
  // outstanding.
155
155
  assert(errors.length === 0, 'all journal files restored before created directories are removed');
@@ -1,9 +1,9 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { createHash } from 'node:crypto';
3
2
  import { readdir } from 'node:fs/promises';
4
3
  import { join } from 'node:path';
5
4
  import { toError } from '../utils/errors.js';
6
5
  import { pathExists, readText } from '../utils/fs.js';
6
+ import { sha256Hex } from '../utils/hash.js';
7
7
  import { verbose, warn } from '../utils/logger.js';
8
8
  import { asEstree, getNodeSource, parseScript, walkAST } from './ast-utils.js';
9
9
  import { CUSTOM_ELEMENTS_JS, FTL_DIR, WIDGETS_DIR } from './furnace-constants.js';
@@ -48,7 +48,7 @@ export async function scanCustomElementsRegistrations(engineDir) {
48
48
  return registrations;
49
49
  }
50
50
  const content = await readText(filePath);
51
- const contentHash = createHash('sha256').update(content).digest('hex');
51
+ const contentHash = sha256Hex(content);
52
52
  // Return cached result if file hasn't changed since last parse.
53
53
  if (registrationCache && registrationCache.hash === contentHash) {
54
54
  return new Map(registrationCache.registrations);
@@ -121,10 +121,7 @@ export async function scanCustomElementsRegistrations(engineDir) {
121
121
  'Results may be incomplete — run "fireforge furnace validate" to verify registration consistency.');
122
122
  verbose(`Scanner regex fallback activated due to parse error: ${reason}`);
123
123
  const lines = content.split('\n');
124
- for (let i = 0; i < lines.length; i++) {
125
- const line = lines[i];
126
- if (line === undefined)
127
- continue;
124
+ for (const [i, line] of lines.entries()) {
128
125
  const callbackMatch = /setElementCreationCallback\(\s*"([^"]+)"/.exec(line);
129
126
  if (!callbackMatch?.[1])
130
127
  continue;
@@ -1,46 +1,46 @@
1
1
  /**
2
2
  * Stale-furnace-source gate for `fireforge patch export` / `re-export`.
3
3
  *
4
- * Exports capture the DEPLOYED engine copies of furnace-managed files, not
4
+ * Exports capture the deployed engine copies of furnace-managed files, not
5
5
  * the `components/` sources. Editing a component source and re-exporting its
6
- * owning patch WITHOUT an intervening `furnace deploy`/`apply` silently
7
- * exports the stale deployed copy — per-patch lint then flags the old line
6
+ * owning patch without an intervening `furnace deploy`/`apply` silently
7
+ * exports the stale deployed copy: per-patch lint then flags the old line
8
8
  * count and the patch body lags the source. This gate detects that sequence
9
9
  * by comparing component source directories against the checksums recorded
10
- * at the last apply (`FurnaceState.appliedChecksums`) — the same signal
11
- * `warnIfFurnaceStale` uses for run/watch — and refuses the export unless
10
+ * at the last apply (`FurnaceState.appliedChecksums`), the same signal
11
+ * `warnIfFurnaceStale` uses for run/watch, and refuses the export unless
12
12
  * the operator passes `--allow-stale-furnace`.
13
13
  *
14
14
  * Checksum-based on purpose: git checkouts and `furnace refresh` churn
15
15
  * mtimes without content changes, so an mtime comparison would misfire.
16
16
  *
17
17
  * Probe failures (broken furnace config, missing state) degrade to a verbose
18
- * log and an empty result — a broken furnace setup must never block
18
+ * log and an empty result. A broken furnace setup must never block
19
19
  * non-furnace patch work.
20
20
  */
21
21
  /** One furnace component whose source drifted from its deployed copy. */
22
22
  export interface StaleFurnaceComponent {
23
23
  /** Component name (furnace.json key). */
24
24
  name: string;
25
- /** Component flavor — resolves the source directory root. */
25
+ /** Component flavor, which resolves the source directory root. */
26
26
  type: 'custom' | 'override';
27
27
  /** Engine-relative deployed prefix (`/`-terminated) the component owns. */
28
28
  prefix: string;
29
29
  }
30
30
  /**
31
31
  * Returns the furnace components whose deployed engine copies the given
32
- * files fall under AND whose `components/` sources have changed since the
32
+ * files fall under and whose `components/` sources have changed since the
33
33
  * last apply. Empty when furnace is not configured, never applied, or the
34
34
  * probe fails.
35
35
  *
36
36
  * Files are attributed per component: the custom `targetPath` / override
37
- * `basePath` prefixes, plus — for a localized non-sharedFtl custom
38
- * component — its exact deployed `<ftlDir>/<name>.ftl` file (the shared
39
- * FTL dir as a whole stays unclaimed; sibling files there belong to other
40
- * components). `sharedFtl` bundles are NOT furnace-deployed (apply only
41
- * prunes a dangling per-widget jar.mn line), so they have no deployed copy
42
- * to go stale and get no candidate by design. The storybook stories prefix
43
- * is likewise skipped.
37
+ * `basePath` prefixes, plus, for a localized non-sharedFtl custom
38
+ * component, its exact deployed `<ftlDir>/<name>.ftl` file (the shared
39
+ * FTL dir as a whole stays unclaimed, because sibling files there belong
40
+ * to other components). `sharedFtl` bundles are not furnace-deployed (apply
41
+ * only prunes a dangling per-widget jar.mn line), so they have no deployed
42
+ * copy to go stale and get no candidate by design. The storybook stories
43
+ * prefix is likewise skipped.
44
44
  *
45
45
  * @param projectRoot - Project root directory
46
46
  * @param files - Engine-relative paths the export will capture
@@ -49,7 +49,8 @@ export declare function findStaleFurnaceComponentsForFiles(projectRoot: string,
49
49
  /**
50
50
  * Gate helper for export/re-export: refuses (or, with `allow`, warns) when
51
51
  * any exported file belongs to a furnace component whose source changed
52
- * since the last apply — the export would capture the stale deployed copy.
52
+ * since the last apply, where the export would capture the stale deployed
53
+ * copy.
53
54
  *
54
55
  * @param projectRoot - Project root directory
55
56
  * @param files - Engine-relative paths the export will capture
@@ -2,21 +2,21 @@
2
2
  /**
3
3
  * Stale-furnace-source gate for `fireforge patch export` / `re-export`.
4
4
  *
5
- * Exports capture the DEPLOYED engine copies of furnace-managed files, not
5
+ * Exports capture the deployed engine copies of furnace-managed files, not
6
6
  * the `components/` sources. Editing a component source and re-exporting its
7
- * owning patch WITHOUT an intervening `furnace deploy`/`apply` silently
8
- * exports the stale deployed copy — per-patch lint then flags the old line
7
+ * owning patch without an intervening `furnace deploy`/`apply` silently
8
+ * exports the stale deployed copy: per-patch lint then flags the old line
9
9
  * count and the patch body lags the source. This gate detects that sequence
10
10
  * by comparing component source directories against the checksums recorded
11
- * at the last apply (`FurnaceState.appliedChecksums`) — the same signal
12
- * `warnIfFurnaceStale` uses for run/watch — and refuses the export unless
11
+ * at the last apply (`FurnaceState.appliedChecksums`), the same signal
12
+ * `warnIfFurnaceStale` uses for run/watch, and refuses the export unless
13
13
  * the operator passes `--allow-stale-furnace`.
14
14
  *
15
15
  * Checksum-based on purpose: git checkouts and `furnace refresh` churn
16
16
  * mtimes without content changes, so an mtime comparison would misfire.
17
17
  *
18
18
  * Probe failures (broken furnace config, missing state) degrade to a verbose
19
- * log and an empty result — a broken furnace setup must never block
19
+ * log and an empty result. A broken furnace setup must never block
20
20
  * non-furnace patch work.
21
21
  */
22
22
  import { GeneralError } from '../errors/base.js';
@@ -28,18 +28,18 @@ import { furnaceConfigExists, getFurnacePaths, loadFurnaceConfig, loadFurnaceSta
28
28
  import { resolveFtlDir } from './furnace-constants.js';
29
29
  /**
30
30
  * Returns the furnace components whose deployed engine copies the given
31
- * files fall under AND whose `components/` sources have changed since the
31
+ * files fall under and whose `components/` sources have changed since the
32
32
  * last apply. Empty when furnace is not configured, never applied, or the
33
33
  * probe fails.
34
34
  *
35
35
  * Files are attributed per component: the custom `targetPath` / override
36
- * `basePath` prefixes, plus — for a localized non-sharedFtl custom
37
- * component — its exact deployed `<ftlDir>/<name>.ftl` file (the shared
38
- * FTL dir as a whole stays unclaimed; sibling files there belong to other
39
- * components). `sharedFtl` bundles are NOT furnace-deployed (apply only
40
- * prunes a dangling per-widget jar.mn line), so they have no deployed copy
41
- * to go stale and get no candidate by design. The storybook stories prefix
42
- * is likewise skipped.
36
+ * `basePath` prefixes, plus, for a localized non-sharedFtl custom
37
+ * component, its exact deployed `<ftlDir>/<name>.ftl` file (the shared
38
+ * FTL dir as a whole stays unclaimed, because sibling files there belong
39
+ * to other components). `sharedFtl` bundles are not furnace-deployed (apply
40
+ * only prunes a dangling per-widget jar.mn line), so they have no deployed
41
+ * copy to go stale and get no candidate by design. The storybook stories
42
+ * prefix is likewise skipped.
43
43
  *
44
44
  * @param projectRoot - Project root directory
45
45
  * @param files - Engine-relative paths the export will capture
@@ -97,7 +97,8 @@ export async function findStaleFurnaceComponentsForFiles(projectRoot, files) {
97
97
  /**
98
98
  * Gate helper for export/re-export: refuses (or, with `allow`, warns) when
99
99
  * any exported file belongs to a furnace component whose source changed
100
- * since the last apply — the export would capture the stale deployed copy.
100
+ * since the last apply, where the export would capture the stale deployed
101
+ * copy.
101
102
  *
102
103
  * @param projectRoot - Project root directory
103
104
  * @param files - Engine-relative paths the export will capture
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Furnace staleness advisory — shared between `fireforge run` and
2
+ * Furnace staleness advisory, shared between `fireforge run` and
3
3
  * `fireforge watch`. Both commands launch the built browser without
4
4
  * first running `furnace apply`, so this helper surfaces a warning when
5
5
  * component files have drifted from the last-applied checksums and the
@@ -11,7 +11,7 @@
11
11
  /**
12
12
  * Emits a warning when any tracked override or custom component has
13
13
  * changed on disk since the last apply. Safe to call from any build-time
14
- * command that does not auto-apply — a failure inside the probe is
14
+ * command that does not auto-apply. A failure inside the probe is
15
15
  * downgraded to a verbose log and the caller continues.
16
16
  */
17
17
  export declare function warnIfFurnaceStale(projectRoot: string): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Furnace staleness advisory — shared between `fireforge run` and
3
+ * Furnace staleness advisory, shared between `fireforge run` and
4
4
  * `fireforge watch`. Both commands launch the built browser without
5
5
  * first running `furnace apply`, so this helper surfaces a warning when
6
6
  * component files have drifted from the last-applied checksums and the
@@ -16,7 +16,7 @@ import { furnaceConfigExists, getFurnacePaths, loadFurnaceConfig, loadFurnaceSta
16
16
  /**
17
17
  * Emits a warning when any tracked override or custom component has
18
18
  * changed on disk since the last apply. Safe to call from any build-time
19
- * command that does not auto-apply — a failure inside the probe is
19
+ * command that does not auto-apply. A failure inside the probe is
20
20
  * downgraded to a verbose log and the caller continues.
21
21
  */
22
22
  export async function warnIfFurnaceStale(projectRoot) {