@hominis/fireforge 0.43.1 → 0.44.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 (478) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +3 -3
  3. package/dist/bin/fireforge.d.ts +4 -9
  4. package/dist/bin/fireforge.js +42 -40
  5. package/dist/build-info.json +4 -4
  6. package/dist/src/cli.js +74 -8
  7. package/dist/src/commands/bootstrap.js +17 -20
  8. package/dist/src/commands/build.js +25 -32
  9. package/dist/src/commands/config.js +34 -41
  10. package/dist/src/commands/discard.js +8 -9
  11. package/dist/src/commands/doctor-check-core.d.ts +13 -18
  12. package/dist/src/commands/doctor-check-core.js +8 -35
  13. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  14. package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
  15. package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
  16. package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
  17. package/dist/src/commands/doctor-furnace-jar.js +7 -9
  18. package/dist/src/commands/doctor-furnace.js +21 -24
  19. package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
  20. package/dist/src/commands/doctor-orphaned-harness.js +18 -44
  21. package/dist/src/commands/doctor-patch-manifest.d.ts +8 -0
  22. package/dist/src/commands/doctor-patch-manifest.js +155 -0
  23. package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
  24. package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
  25. package/dist/src/commands/doctor-working-tree.d.ts +10 -12
  26. package/dist/src/commands/doctor-working-tree.js +11 -18
  27. package/dist/src/commands/doctor.d.ts +1 -1
  28. package/dist/src/commands/doctor.js +64 -96
  29. package/dist/src/commands/download.js +32 -48
  30. package/dist/src/commands/export-all.js +29 -33
  31. package/dist/src/commands/export-flow.js +6 -6
  32. package/dist/src/commands/export-placement-conflicts.js +10 -9
  33. package/dist/src/commands/export-placement-gate.js +5 -5
  34. package/dist/src/commands/export-shared.d.ts +30 -33
  35. package/dist/src/commands/export-shared.js +45 -43
  36. package/dist/src/commands/export.js +21 -27
  37. package/dist/src/commands/furnace/apply.js +14 -23
  38. package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
  39. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
  40. package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
  41. package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
  42. package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
  43. package/dist/src/commands/furnace/chrome-doc.js +31 -41
  44. package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
  45. package/dist/src/commands/furnace/create-browser-test.js +8 -8
  46. package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
  47. package/dist/src/commands/furnace/create-mochikit.js +8 -9
  48. package/dist/src/commands/furnace/create-readback.d.ts +12 -13
  49. package/dist/src/commands/furnace/create-readback.js +12 -13
  50. package/dist/src/commands/furnace/create-templates.d.ts +22 -28
  51. package/dist/src/commands/furnace/create-templates.js +35 -30
  52. package/dist/src/commands/furnace/create-xpcshell.js +2 -2
  53. package/dist/src/commands/furnace/create.js +33 -23
  54. package/dist/src/commands/furnace/deploy.js +16 -24
  55. package/dist/src/commands/furnace/diff.js +15 -10
  56. package/dist/src/commands/furnace/init.js +33 -36
  57. package/dist/src/commands/furnace/override.js +23 -25
  58. package/dist/src/commands/furnace/preview.js +47 -67
  59. package/dist/src/commands/furnace/refresh.js +12 -16
  60. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
  61. package/dist/src/commands/furnace/remove-mutations.js +14 -17
  62. package/dist/src/commands/furnace/remove-state.js +1 -1
  63. package/dist/src/commands/furnace/remove.js +33 -38
  64. package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
  65. package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
  66. package/dist/src/commands/furnace/rename.js +59 -69
  67. package/dist/src/commands/furnace/scan.js +19 -33
  68. package/dist/src/commands/furnace/status.js +12 -9
  69. package/dist/src/commands/furnace/sync.js +9 -16
  70. package/dist/src/commands/furnace/validate.js +20 -20
  71. package/dist/src/commands/import.js +48 -37
  72. package/dist/src/commands/lint-per-patch.js +15 -10
  73. package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
  74. package/dist/src/commands/lint-per-run-checkjs.js +13 -13
  75. package/dist/src/commands/lint-report.js +6 -7
  76. package/dist/src/commands/lint.d.ts +15 -16
  77. package/dist/src/commands/lint.js +86 -102
  78. package/dist/src/commands/package.js +6 -11
  79. package/dist/src/commands/patch/compact.js +1 -1
  80. package/dist/src/commands/patch/delete.js +24 -33
  81. package/dist/src/commands/patch/index.d.ts +5 -6
  82. package/dist/src/commands/patch/index.js +10 -12
  83. package/dist/src/commands/patch/lint-ignore.js +14 -13
  84. package/dist/src/commands/patch/move-files-create.d.ts +6 -6
  85. package/dist/src/commands/patch/move-files-create.js +8 -8
  86. package/dist/src/commands/patch/move-files-into.d.ts +6 -6
  87. package/dist/src/commands/patch/move-files-into.js +8 -8
  88. package/dist/src/commands/patch/patch-context.d.ts +2 -3
  89. package/dist/src/commands/patch/patch-context.js +2 -3
  90. package/dist/src/commands/patch/rename.d.ts +10 -11
  91. package/dist/src/commands/patch/rename.js +11 -12
  92. package/dist/src/commands/patch/reorder.js +8 -9
  93. package/dist/src/commands/patch/split-plan.js +1 -1
  94. package/dist/src/commands/patch/split.d.ts +8 -10
  95. package/dist/src/commands/patch/split.js +9 -11
  96. package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
  97. package/dist/src/commands/patch/staged-dependency.js +7 -3
  98. package/dist/src/commands/patch/tier.d.ts +9 -9
  99. package/dist/src/commands/patch/tier.js +18 -15
  100. package/dist/src/commands/re-export-adjacent.js +9 -8
  101. package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
  102. package/dist/src/commands/re-export-bulk-scan.js +22 -21
  103. package/dist/src/commands/re-export-drift.js +10 -10
  104. package/dist/src/commands/re-export-files.d.ts +6 -7
  105. package/dist/src/commands/re-export-files.js +34 -44
  106. package/dist/src/commands/re-export-lint.d.ts +10 -13
  107. package/dist/src/commands/re-export-lint.js +16 -14
  108. package/dist/src/commands/re-export-options.d.ts +6 -6
  109. package/dist/src/commands/re-export-options.js +6 -6
  110. package/dist/src/commands/re-export-register.d.ts +4 -10
  111. package/dist/src/commands/re-export-register.js +5 -11
  112. package/dist/src/commands/re-export-scan.js +1 -1
  113. package/dist/src/commands/re-export-single.d.ts +3 -3
  114. package/dist/src/commands/re-export-single.js +33 -25
  115. package/dist/src/commands/re-export.js +13 -21
  116. package/dist/src/commands/rebase/abort.js +3 -3
  117. package/dist/src/commands/rebase/confirm.js +2 -1
  118. package/dist/src/commands/rebase/continue.d.ts +1 -1
  119. package/dist/src/commands/rebase/continue.js +14 -9
  120. package/dist/src/commands/rebase/index.js +11 -11
  121. package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
  122. package/dist/src/commands/rebase/patch-loop.js +60 -39
  123. package/dist/src/commands/rebase/summary.js +1 -1
  124. package/dist/src/commands/register.js +5 -7
  125. package/dist/src/commands/reset.js +2 -1
  126. package/dist/src/commands/resolve.d.ts +16 -13
  127. package/dist/src/commands/resolve.js +30 -33
  128. package/dist/src/commands/run.js +33 -35
  129. package/dist/src/commands/setup-support.js +15 -19
  130. package/dist/src/commands/setup.js +13 -9
  131. package/dist/src/commands/status-check.d.ts +6 -6
  132. package/dist/src/commands/status-json.d.ts +6 -6
  133. package/dist/src/commands/status-json.js +5 -0
  134. package/dist/src/commands/status-output.d.ts +5 -5
  135. package/dist/src/commands/status-output.js +6 -6
  136. package/dist/src/commands/status-ownership.d.ts +16 -14
  137. package/dist/src/commands/status-ownership.js +16 -14
  138. package/dist/src/commands/status.js +42 -34
  139. package/dist/src/commands/test-build-phase.js +26 -13
  140. package/dist/src/commands/test-diagnose.js +44 -44
  141. package/dist/src/commands/test-register.js +1 -0
  142. package/dist/src/commands/test-run.d.ts +14 -16
  143. package/dist/src/commands/test-run.js +21 -13
  144. package/dist/src/commands/test-stale-gate.d.ts +15 -16
  145. package/dist/src/commands/test-stale-gate.js +15 -16
  146. package/dist/src/commands/test-verdict.d.ts +20 -3
  147. package/dist/src/commands/test-verdict.js +30 -0
  148. package/dist/src/commands/test.js +83 -76
  149. package/dist/src/commands/token-coverage.js +3 -4
  150. package/dist/src/commands/token.js +16 -18
  151. package/dist/src/commands/tree.js +47 -31
  152. package/dist/src/commands/typecheck.d.ts +10 -12
  153. package/dist/src/commands/typecheck.js +24 -27
  154. package/dist/src/commands/verify.js +13 -15
  155. package/dist/src/commands/watch.js +21 -23
  156. package/dist/src/commands/wire.js +52 -62
  157. package/dist/src/core/ast-utils.d.ts +8 -7
  158. package/dist/src/core/ast-utils.js +8 -7
  159. package/dist/src/core/branding.d.ts +9 -14
  160. package/dist/src/core/branding.js +7 -11
  161. package/dist/src/core/browser-wire.d.ts +1 -1
  162. package/dist/src/core/browser-wire.js +14 -19
  163. package/dist/src/core/build-audit-platform.js +25 -33
  164. package/dist/src/core/build-audit-registration.js +17 -25
  165. package/dist/src/core/build-audit-resolve.d.ts +15 -17
  166. package/dist/src/core/build-audit-resolve.js +39 -36
  167. package/dist/src/core/build-audit-transforms.js +18 -19
  168. package/dist/src/core/build-audit.js +28 -42
  169. package/dist/src/core/build-baseline-types.d.ts +29 -35
  170. package/dist/src/core/build-baseline.d.ts +5 -4
  171. package/dist/src/core/build-baseline.js +14 -14
  172. package/dist/src/core/build-overwrite-guard.d.ts +7 -14
  173. package/dist/src/core/build-overwrite-guard.js +17 -27
  174. package/dist/src/core/build-prepare.d.ts +2 -2
  175. package/dist/src/core/build-prepare.js +8 -9
  176. package/dist/src/core/config-mutate.js +20 -19
  177. package/dist/src/core/config-state.js +12 -4
  178. package/dist/src/core/config-validate.js +8 -5
  179. package/dist/src/core/config.d.ts +5 -8
  180. package/dist/src/core/config.js +7 -16
  181. package/dist/src/core/coverage-extend.d.ts +15 -13
  182. package/dist/src/core/coverage-extend.js +15 -13
  183. package/dist/src/core/destructive.d.ts +31 -9
  184. package/dist/src/core/destructive.js +29 -26
  185. package/dist/src/core/diff-hunks.js +10 -12
  186. package/dist/src/core/discard-baseline.d.ts +8 -8
  187. package/dist/src/core/discard-baseline.js +16 -15
  188. package/dist/src/core/display-state.d.ts +12 -14
  189. package/dist/src/core/display-state.js +12 -14
  190. package/dist/src/core/engine-changes.d.ts +2 -4
  191. package/dist/src/core/engine-changes.js +2 -4
  192. package/dist/src/core/engine-precondition.d.ts +28 -13
  193. package/dist/src/core/engine-precondition.js +25 -10
  194. package/dist/src/core/engine-session-lock.d.ts +47 -21
  195. package/dist/src/core/engine-session-lock.js +168 -33
  196. package/dist/src/core/export-moved-code-shape.d.ts +10 -10
  197. package/dist/src/core/export-moved-code-shape.js +10 -10
  198. package/dist/src/core/file-lock.d.ts +62 -5
  199. package/dist/src/core/file-lock.js +196 -59
  200. package/dist/src/core/firefox-cache.js +1 -3
  201. package/dist/src/core/firefox-extract.js +10 -14
  202. package/dist/src/core/firefox.d.ts +7 -5
  203. package/dist/src/core/firefox.js +4 -5
  204. package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
  205. package/dist/src/core/furnace-apply-dry-run.js +3 -2
  206. package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
  207. package/dist/src/core/furnace-apply-ftl.js +16 -13
  208. package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
  209. package/dist/src/core/furnace-apply-helpers.js +30 -21
  210. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
  211. package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
  212. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
  213. package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
  214. package/dist/src/core/furnace-apply.d.ts +5 -8
  215. package/dist/src/core/furnace-apply.js +19 -24
  216. package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
  217. package/dist/src/core/furnace-checksum-utils.js +16 -0
  218. package/dist/src/core/furnace-config.d.ts +21 -30
  219. package/dist/src/core/furnace-config.js +32 -54
  220. package/dist/src/core/furnace-constants.d.ts +8 -0
  221. package/dist/src/core/furnace-constants.js +10 -2
  222. package/dist/src/core/furnace-css-fragments.d.ts +5 -5
  223. package/dist/src/core/furnace-css-fragments.js +5 -5
  224. package/dist/src/core/furnace-jsconfig.d.ts +11 -12
  225. package/dist/src/core/furnace-jsconfig.js +11 -12
  226. package/dist/src/core/furnace-marker.d.ts +7 -8
  227. package/dist/src/core/furnace-marker.js +7 -8
  228. package/dist/src/core/furnace-operation.d.ts +31 -0
  229. package/dist/src/core/furnace-operation.js +54 -17
  230. package/dist/src/core/furnace-precondition.d.ts +61 -0
  231. package/dist/src/core/furnace-precondition.js +67 -0
  232. package/dist/src/core/furnace-registration-remove.d.ts +5 -6
  233. package/dist/src/core/furnace-registration-remove.js +6 -7
  234. package/dist/src/core/furnace-registration-validate.d.ts +13 -0
  235. package/dist/src/core/furnace-registration-validate.js +20 -1
  236. package/dist/src/core/furnace-registration.d.ts +5 -6
  237. package/dist/src/core/furnace-registration.js +10 -12
  238. package/dist/src/core/furnace-rollback.js +7 -7
  239. package/dist/src/core/furnace-scanner.d.ts +1 -0
  240. package/dist/src/core/furnace-scanner.js +1 -2
  241. package/dist/src/core/furnace-stale-export.d.ts +10 -10
  242. package/dist/src/core/furnace-stale-export.js +10 -10
  243. package/dist/src/core/furnace-state-persist.d.ts +6 -8
  244. package/dist/src/core/furnace-state-persist.js +6 -8
  245. package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
  246. package/dist/src/core/furnace-validate-accessibility.js +310 -1
  247. package/dist/src/core/furnace-validate-compatibility.js +141 -1
  248. package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
  249. package/dist/src/core/furnace-validate-helpers.js +0 -491
  250. package/dist/src/core/furnace-validate-registration.d.ts +7 -0
  251. package/dist/src/core/furnace-validate-registration.js +115 -41
  252. package/dist/src/core/furnace-validate.d.ts +16 -0
  253. package/dist/src/core/furnace-validate.js +188 -145
  254. package/dist/src/core/furnace-version-drift.d.ts +10 -11
  255. package/dist/src/core/furnace-version-drift.js +10 -11
  256. package/dist/src/core/git-base.d.ts +21 -9
  257. package/dist/src/core/git-base.js +24 -9
  258. package/dist/src/core/git-diff.d.ts +20 -9
  259. package/dist/src/core/git-diff.js +148 -63
  260. package/dist/src/core/git-file-ops.d.ts +19 -19
  261. package/dist/src/core/git-file-ops.js +19 -19
  262. package/dist/src/core/git-readonly-index.d.ts +53 -19
  263. package/dist/src/core/git-readonly-index.js +75 -31
  264. package/dist/src/core/git-status.d.ts +5 -6
  265. package/dist/src/core/git-status.js +5 -6
  266. package/dist/src/core/git.d.ts +9 -10
  267. package/dist/src/core/git.js +57 -71
  268. package/dist/src/core/license-headers.d.ts +17 -23
  269. package/dist/src/core/license-headers.js +17 -23
  270. package/dist/src/core/mach-build-artifacts.d.ts +9 -9
  271. package/dist/src/core/mach-build-artifacts.js +57 -19
  272. package/dist/src/core/mach-error-hints.js +42 -29
  273. package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
  274. package/dist/src/core/mach-known-noise-filter.js +18 -20
  275. package/dist/src/core/mach-mozconfig.d.ts +14 -0
  276. package/dist/src/core/mach-mozconfig.js +30 -0
  277. package/dist/src/core/mach-resource-shim.d.ts +43 -58
  278. package/dist/src/core/mach-resource-shim.js +50 -67
  279. package/dist/src/core/mach.d.ts +37 -41
  280. package/dist/src/core/mach.js +50 -51
  281. package/dist/src/core/marionette-port.d.ts +36 -1
  282. package/dist/src/core/marionette-port.js +96 -31
  283. package/dist/src/core/marionette-preflight.d.ts +8 -12
  284. package/dist/src/core/marionette-preflight.js +86 -52
  285. package/dist/src/core/mochitest-server-port.d.ts +42 -0
  286. package/dist/src/core/mochitest-server-port.js +119 -0
  287. package/dist/src/core/module-resolution-preflight.d.ts +9 -11
  288. package/dist/src/core/module-resolution-preflight.js +9 -11
  289. package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
  290. package/dist/src/core/moz-manifest-helpers.js +163 -0
  291. package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
  292. package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
  293. package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
  294. package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
  295. package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
  296. package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
  297. package/dist/src/core/ownership-table.d.ts +14 -16
  298. package/dist/src/core/ownership-table.js +14 -16
  299. package/dist/src/core/parser-fallback.d.ts +15 -1
  300. package/dist/src/core/parser-fallback.js +22 -3
  301. package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
  302. package/dist/src/core/patch-apply-fuzz.js +15 -18
  303. package/dist/src/core/patch-apply.d.ts +13 -34
  304. package/dist/src/core/patch-apply.js +16 -76
  305. package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
  306. package/dist/src/core/patch-artifact-normalize.js +13 -15
  307. package/dist/src/core/patch-export-metadata.d.ts +12 -2
  308. package/dist/src/core/patch-export-metadata.js +13 -4
  309. package/dist/src/core/patch-export-update.d.ts +13 -1
  310. package/dist/src/core/patch-export-update.js +25 -8
  311. package/dist/src/core/patch-export.d.ts +15 -8
  312. package/dist/src/core/patch-export.js +10 -11
  313. package/dist/src/core/patch-files.d.ts +5 -6
  314. package/dist/src/core/patch-files.js +5 -6
  315. package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
  316. package/dist/src/core/patch-identifier-suggest.js +14 -19
  317. package/dist/src/core/patch-lint-binary.d.ts +51 -0
  318. package/dist/src/core/patch-lint-binary.js +39 -0
  319. package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
  320. package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
  321. package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
  322. package/dist/src/core/patch-lint-checkjs.js +41 -20
  323. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
  324. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
  325. package/dist/src/core/patch-lint-creators.d.ts +8 -8
  326. package/dist/src/core/patch-lint-creators.js +8 -8
  327. package/dist/src/core/patch-lint-cross.d.ts +17 -20
  328. package/dist/src/core/patch-lint-cross.js +16 -16
  329. package/dist/src/core/patch-lint-css.d.ts +3 -5
  330. package/dist/src/core/patch-lint-css.js +17 -22
  331. package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
  332. package/dist/src/core/patch-lint-diff-tag.js +14 -16
  333. package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
  334. package/dist/src/core/patch-lint-jsdoc.js +26 -19
  335. package/dist/src/core/patch-lint-mozbuild.js +20 -20
  336. package/dist/src/core/patch-lint-observer.d.ts +7 -7
  337. package/dist/src/core/patch-lint-observer.js +7 -7
  338. package/dist/src/core/patch-lint.d.ts +38 -29
  339. package/dist/src/core/patch-lint.js +89 -121
  340. package/dist/src/core/patch-lock.d.ts +1 -1
  341. package/dist/src/core/patch-lock.js +45 -9
  342. package/dist/src/core/patch-manifest-consistency.d.ts +57 -6
  343. package/dist/src/core/patch-manifest-consistency.js +111 -40
  344. package/dist/src/core/patch-manifest-files-affected.d.ts +43 -0
  345. package/dist/src/core/patch-manifest-files-affected.js +77 -0
  346. package/dist/src/core/patch-manifest-io.js +14 -18
  347. package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
  348. package/dist/src/core/patch-manifest-resolve.js +9 -12
  349. package/dist/src/core/patch-manifest-validate.d.ts +6 -1
  350. package/dist/src/core/patch-manifest-validate.js +25 -13
  351. package/dist/src/core/patch-manifest.d.ts +2 -1
  352. package/dist/src/core/patch-manifest.js +2 -1
  353. package/dist/src/core/patch-parse.d.ts +24 -13
  354. package/dist/src/core/patch-parse.js +19 -14
  355. package/dist/src/core/patch-policy.d.ts +2 -2
  356. package/dist/src/core/patch-policy.js +2 -2
  357. package/dist/src/core/patch-registration-refs.d.ts +7 -8
  358. package/dist/src/core/patch-registration-refs.js +9 -9
  359. package/dist/src/core/process-cpu-time.d.ts +12 -0
  360. package/dist/src/core/process-cpu-time.js +52 -0
  361. package/dist/src/core/rebase-session.d.ts +38 -26
  362. package/dist/src/core/rebase-session.js +55 -28
  363. package/dist/src/core/register-browser-content.js +9 -74
  364. package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
  365. package/dist/src/core/register-module.js +10 -43
  366. package/dist/src/core/register-scaffold.d.ts +8 -8
  367. package/dist/src/core/register-scaffold.js +10 -10
  368. package/dist/src/core/register-shared-css.d.ts +9 -12
  369. package/dist/src/core/register-shared-css.js +17 -87
  370. package/dist/src/core/register-xpcshell-test.d.ts +6 -7
  371. package/dist/src/core/register-xpcshell-test.js +7 -8
  372. package/dist/src/core/shared-ftl.js +12 -4
  373. package/dist/src/core/state-file.d.ts +45 -0
  374. package/dist/src/core/state-file.js +34 -0
  375. package/dist/src/core/status-binary.d.ts +18 -11
  376. package/dist/src/core/status-binary.js +19 -12
  377. package/dist/src/core/status-classify.d.ts +30 -36
  378. package/dist/src/core/status-classify.js +21 -26
  379. package/dist/src/core/test-changed-prefs.d.ts +30 -0
  380. package/dist/src/core/test-changed-prefs.js +78 -0
  381. package/dist/src/core/test-harness-crash.d.ts +25 -63
  382. package/dist/src/core/test-harness-crash.js +121 -142
  383. package/dist/src/core/test-harness-signature.d.ts +18 -0
  384. package/dist/src/core/test-harness-signature.js +13 -0
  385. package/dist/src/core/test-path-scope.d.ts +12 -15
  386. package/dist/src/core/test-path-scope.js +15 -18
  387. package/dist/src/core/test-stale-check.d.ts +17 -17
  388. package/dist/src/core/test-stale-check.js +50 -43
  389. package/dist/src/core/test-stall-triage.d.ts +51 -0
  390. package/dist/src/core/test-stall-triage.js +126 -0
  391. package/dist/src/core/token-category.js +66 -14
  392. package/dist/src/core/token-coverage.js +9 -9
  393. package/dist/src/core/token-dark-mode.d.ts +9 -11
  394. package/dist/src/core/token-dark-mode.js +29 -13
  395. package/dist/src/core/token-docs.d.ts +2 -0
  396. package/dist/src/core/token-docs.js +3 -1
  397. package/dist/src/core/token-manager.d.ts +10 -2
  398. package/dist/src/core/token-manager.js +17 -8
  399. package/dist/src/core/token-scaffold.d.ts +7 -7
  400. package/dist/src/core/token-scaffold.js +7 -7
  401. package/dist/src/core/token-variant.d.ts +4 -4
  402. package/dist/src/core/token-variant.js +28 -6
  403. package/dist/src/core/toolchain-preflight.d.ts +20 -21
  404. package/dist/src/core/toolchain-preflight.js +28 -31
  405. package/dist/src/core/tree-guard.js +12 -2
  406. package/dist/src/core/tree-store.d.ts +41 -27
  407. package/dist/src/core/tree-store.js +68 -43
  408. package/dist/src/core/typecheck-shim.d.ts +23 -24
  409. package/dist/src/core/typecheck-shim.js +23 -24
  410. package/dist/src/core/typecheck.js +15 -9
  411. package/dist/src/core/wire-destroy.d.ts +3 -3
  412. package/dist/src/core/wire-destroy.js +7 -15
  413. package/dist/src/core/wire-dom-fragment.d.ts +9 -17
  414. package/dist/src/core/wire-dom-fragment.js +11 -44
  415. package/dist/src/core/wire-init.d.ts +2 -3
  416. package/dist/src/core/wire-init.js +8 -19
  417. package/dist/src/core/wire-subscript.d.ts +2 -3
  418. package/dist/src/core/wire-subscript.js +4 -13
  419. package/dist/src/core/wire-utils.d.ts +7 -8
  420. package/dist/src/core/wire-utils.js +7 -8
  421. package/dist/src/core/xpcshell-appdir.d.ts +38 -45
  422. package/dist/src/core/xpcshell-appdir.js +38 -45
  423. package/dist/src/errors/base.d.ts +37 -16
  424. package/dist/src/errors/base.js +37 -16
  425. package/dist/src/errors/build.d.ts +13 -1
  426. package/dist/src/errors/build.js +14 -2
  427. package/dist/src/errors/codes.d.ts +16 -0
  428. package/dist/src/errors/codes.js +16 -0
  429. package/dist/src/errors/furnace.d.ts +4 -4
  430. package/dist/src/errors/git.d.ts +6 -10
  431. package/dist/src/errors/git.js +6 -10
  432. package/dist/src/errors/patch.d.ts +7 -7
  433. package/dist/src/errors/patch.js +7 -7
  434. package/dist/src/errors/rebase.d.ts +4 -4
  435. package/dist/src/errors/rebase.js +4 -4
  436. package/dist/src/index.d.ts +7 -1
  437. package/dist/src/index.js +5 -0
  438. package/dist/src/types/commands/index.d.ts +2 -2
  439. package/dist/src/types/commands/options.d.ts +111 -70
  440. package/dist/src/types/commands/patches.d.ts +24 -34
  441. package/dist/src/types/commands/project.d.ts +5 -34
  442. package/dist/src/types/config.d.ts +25 -23
  443. package/dist/src/types/config.js +6 -1
  444. package/dist/src/types/furnace.d.ts +37 -13
  445. package/dist/src/types/furnace.js +19 -1
  446. package/dist/src/types/index.d.ts +3 -3
  447. package/dist/src/utils/build-info.d.ts +7 -8
  448. package/dist/src/utils/build-info.js +12 -11
  449. package/dist/src/utils/errors.d.ts +6 -8
  450. package/dist/src/utils/errors.js +6 -8
  451. package/dist/src/utils/logger.d.ts +27 -10
  452. package/dist/src/utils/logger.js +28 -16
  453. package/dist/src/utils/machine-output.d.ts +12 -0
  454. package/dist/src/utils/machine-output.js +33 -0
  455. package/dist/src/utils/options.d.ts +31 -14
  456. package/dist/src/utils/options.js +86 -30
  457. package/dist/src/utils/paths.d.ts +10 -8
  458. package/dist/src/utils/paths.js +10 -8
  459. package/dist/src/utils/platform.d.ts +0 -25
  460. package/dist/src/utils/platform.js +1 -42
  461. package/dist/src/utils/process-group.d.ts +9 -4
  462. package/dist/src/utils/process-group.js +19 -5
  463. package/dist/src/utils/process.d.ts +42 -7
  464. package/dist/src/utils/process.js +44 -17
  465. package/dist/src/utils/ps-duration.d.ts +31 -0
  466. package/dist/src/utils/ps-duration.js +70 -0
  467. package/dist/src/utils/regex.d.ts +9 -10
  468. package/dist/src/utils/regex.js +9 -10
  469. package/dist/src/utils/validation.d.ts +58 -28
  470. package/dist/src/utils/validation.js +60 -33
  471. package/package.json +3 -3
  472. package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
  473. package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
  474. package/dist/src/core/manifest-helpers.d.ts +0 -38
  475. package/dist/src/core/manifest-helpers.js +0 -120
  476. /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
  477. /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
  478. /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
@@ -4,34 +4,29 @@
4
4
  *
5
5
  * `moz.build` files commonly wrap entries in conditional blocks like
6
6
  * `if CONFIG["MAKENSISU"]:` (Windows-only stubinstaller) or
7
- * `if CONFIG["OS_TARGET"] == "Darwin":` (macOS-only artwork). On a host
8
- * that does not match the gate, the wrapped files are never processed
9
- * by the build, so they cannot appear under `dist/`. Without this
10
- * detection, the audit fires a "missing packaged artifact" warning for
11
- * every gated file on every off-platform build — pure noise.
7
+ * `if CONFIG["OS_TARGET"] == "Darwin":` (macOS-only artwork). On a host that
8
+ * does not match the gate, the wrapped files are never processed by the
9
+ * build, so they cannot appear under `dist/` — without this detection the
10
+ * audit warns about every gated file on every off-platform build.
12
11
  *
13
12
  * Two gate sources are consulted, in order:
14
13
  * 1. Python-style `if CONFIG[...]:` blocks in the owning `moz.build`.
15
- * 2. Path-convention gates — certain directory fragments are packaged
16
- * by platform-specific Makefile.in / NSIS recipes that FireForge
17
- * does not parse, so a file living under `browser/installer/windows/`
18
- * or any `/stubinstaller/` subtree is Windows-only regardless of
19
- * what its nearest moz.build says. (The branding stubinstaller CSS
20
- * is the motivating case: referenced from
21
- * `browser/installer/windows/Makefile.in` / `nsis/stub.nsh` with no
22
- * `if CONFIG[…]:` in any moz.build ancestor.)
14
+ * 2. Path-convention gates — certain directory fragments are packaged by
15
+ * platform-specific Makefile.in / NSIS recipes that FireForge does not
16
+ * parse, so a file under `browser/installer/windows/` or any
17
+ * `/stubinstaller/` subtree is Windows-only regardless of what its
18
+ * nearest moz.build says.
23
19
  *
24
- * The detection is intentionally lightweight: we walk up from the
25
- * source file looking for the closest `moz.build`, scan it for an
26
- * occurrence of the source basename inside an `if CONFIG[...]:` block,
27
- * and check whether the gate expression matches the host platform.
28
- * The path-convention pass kicks in only when no moz.build gate is
29
- * found, so an explicit moz.build gate always wins.
20
+ * The detection is intentionally lightweight: walk up from the source file
21
+ * to the closest `moz.build`, scan it for the source basename inside an
22
+ * `if CONFIG[...]:` block, and check whether the gate matches the host. The
23
+ * path-convention pass runs only when no moz.build gate is found, so an
24
+ * explicit gate always wins.
30
25
  *
31
- * This is best-effort. False negatives (we miss a gate and warn anyway)
32
- * are tolerable — the audit is warn-only. False positives (we wrongly
33
- * skip a gated file that should ship on this host) are not, so the
34
- * detection errs toward NOT skipping when uncertain.
26
+ * Best-effort by design. False negatives (missing a gate and warning anyway)
27
+ * are tolerable — the audit is warn-only. False positives (skipping a file
28
+ * that should ship on this host) are not, so it errs toward NOT skipping
29
+ * when uncertain.
35
30
  */
36
31
  import { dirname, join } from 'node:path';
37
32
  import { pathExists, readText } from '../utils/fs.js';
@@ -144,17 +139,14 @@ export function findEnclosingGate(content, basename) {
144
139
  }
145
140
  /**
146
141
  * Path-convention gates: directories whose files are packaged by
147
- * platform-specific build recipes (NSIS stub installer, DMG creation,
148
- * Linux installer scripts) that live outside the moz.build graph. A
149
- * file under any of these fragments is platform-restricted regardless
150
- * of what its nearest `moz.build` says.
142
+ * platform-specific build recipes (NSIS stub installer, DMG creation, Linux
143
+ * installer scripts) that live outside the moz.build graph. A file under any
144
+ * of these fragments is platform-restricted regardless of what its nearest
145
+ * `moz.build` says.
151
146
  *
152
- * `stubinstaller/` is the Windows NSIS stub installer asset tree. It
153
- * is referenced from `browser/installer/windows/Makefile.in` (via
154
- * `FILES` / `_WIDGET_FILES` lists) and `nsis/stub.nsh`, never through
155
- * an `if CONFIG[…]:` block an ancestor moz.build exposes. Without
156
- * this path-level gate, the audit warns on every touched branding
157
- * stubinstaller CSS on every non-Windows build.
147
+ * `stubinstaller/` is the Windows NSIS stub installer asset tree, referenced
148
+ * from `browser/installer/windows/Makefile.in` and `nsis/stub.nsh` rather
149
+ * than through any `if CONFIG[…]:` block an ancestor moz.build exposes.
158
150
  */
159
151
  const PATH_GATES = [
160
152
  { fragment: '/stubinstaller/', platform: 'win32', label: 'path convention: /stubinstaller/' },
@@ -3,33 +3,25 @@
3
3
  * Registration-aware artifact resolution for the post-build dist-tree audit.
4
4
  *
5
5
  * The basename-plus-similarity heuristic in `build-audit-resolve.ts` cannot
6
- * distinguish two unrelated files that share a source basename. Motivating
7
- * case: one fork registers `content/mybrowser.js` in `browser/base/jar.mn`
8
- * (packaged under `chrome/browser/content/browser/mybrowser.js`) while an
9
- * unrelated patch registers a `mybrowser.js` pref file under
10
- * `browser/defaults/preferences/`. The basename walker surfaces both
11
- * candidates, `scoreCandidate` awards them an equal trailing-overlap score
12
- * (basename only, no meaningful mid-path match), and whichever the
13
- * directory walk hits first wins — frequently the wrong one.
6
+ * distinguish two unrelated files that share a source basename: one fork
7
+ * registers `content/mybrowser.js` in `browser/base/jar.mn` (packaged under
8
+ * `chrome/browser/content/browser/mybrowser.js`) while an unrelated patch
9
+ * registers a `mybrowser.js` pref file under `browser/defaults/preferences/`.
10
+ * The basename walker surfaces both, `scoreCandidate` awards them an equal
11
+ * trailing-overlap score, and whichever the directory walk hits first wins.
14
12
  *
15
- * This module anchors resolution to the `(source)` reference inside
16
- * `jar.mn`. For a source under audit we walk its ancestor directories for
17
- * an owning `jar.mn`, find the entry whose `(source)` resolves to our
18
- * path, and expose both the target path recorded in the entry and the
19
- * manifest that owns it. Callers in `build-audit.ts` prefer candidates
20
- * whose absolute dist-tree path ends with the registered target, and
21
- * report an unambiguous "registered but not packaged" miss when no such
22
- * candidate exists — rather than falling through to the heuristic which
23
- * would pick an unrelated same-basename file.
13
+ * This module anchors resolution to the `(source)` reference inside `jar.mn`.
14
+ * For a source under audit it walks the ancestor directories for an owning
15
+ * `jar.mn`, finds the entry whose `(source)` resolves to that path, and
16
+ * exposes both the registered target and the manifest that owns it. Callers
17
+ * prefer candidates whose dist-tree path ends with the registered target and
18
+ * report an unambiguous "registered but not packaged" miss when none exists.
24
19
  *
25
- * Fallback semantics: when no jar.mn registration is found, the caller
26
- * is expected to use the similarity heuristic. Registration wins when it
27
- * exists; the heuristic fills the gap for sources registered through
28
- * moz.build (`FINAL_TARGET_FILES`, `JS_PREFERENCE_FILES`, etc.) or
29
- * `package-manifest.in` entries, which this module intentionally does
30
- * not parse — supporting every Firefox registration surface would bloat
31
- * the audit, and the heuristic's remaining weak case (unrelated same-
32
- * basename hits) is surfaced to the operator in the warning copy.
20
+ * When no jar.mn registration is found, the caller falls back to the
21
+ * similarity heuristic — which covers sources registered through moz.build
22
+ * (`FINAL_TARGET_FILES`, `JS_PREFERENCE_FILES`) or `package-manifest.in`.
23
+ * Parsing every Firefox registration surface would bloat the audit, and the
24
+ * heuristic's weak case is surfaced to the operator in the warning copy.
33
25
  */
34
26
  import { basename, dirname, join, relative, sep } from 'node:path';
35
27
  import { pathExists, readText } from '../utils/fs.js';
@@ -27,29 +27,27 @@ export declare function countTrailingSegmentMatches(a: string, b: string): numbe
27
27
  /**
28
28
  * Path segments too common to identify an artifact on their own.
29
29
  *
30
- * Shared deliberately: this set governs two halves of ONE decision, and the
31
- * halves disagreed before 0.41.0. `scoreCandidate` (selection) used an
32
- * 11-entry copy while `isConfidentMatch` (confirmation, in `build-audit.ts`)
33
- * used a 17-entry one, so a source path containing `test`, `tests`, `unit`,
34
- * `common`, `xpcshell` or `mochitest` earned a +1 selection bonus for a
35
- * segment that confirmation then rejected as meaningless — the chosen
36
- * artifact could never be confirmed. The union is authoritative; any addition
37
- * must apply to both halves, which is now automatic.
30
+ * Shared deliberately: this set governs two halves of ONE decision —
31
+ * `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
32
+ * `build-audit.ts`). When the halves kept separate copies they disagreed,
33
+ * so a source path could earn a selection bonus for a segment that
34
+ * confirmation then rejected as meaningless, leaving the chosen artifact
35
+ * unconfirmable. Any addition must apply to both halves, which is now
36
+ * automatic.
38
37
  */
39
38
  export declare const GENERIC_PATH_SEGMENTS: ReadonlySet<string>;
40
39
  /**
41
40
  * Computes a score for `candidatePath` relative to `sourcePath`. Higher
42
- * scores win. Score = trailing-segment match count, with a bonus when
43
- * the candidate's path contains a meaningful intermediate segment from
44
- * the source (e.g. `branding`, the branding dir name itself, etc.).
41
+ * scores win. Score = trailing-segment match count, with a bonus when the
42
+ * candidate's path contains a meaningful intermediate segment from the
43
+ * source (e.g. `branding`, or the branding dir name itself).
45
44
  *
46
- * The bonus exists because Firefox packaging often re-roots files: a
47
- * source `branding/<name>/content/aboutDialog.css` lands at
45
+ * The bonus exists because Firefox packaging often re-roots files: a source
46
+ * `branding/<name>/content/aboutDialog.css` lands at
48
47
  * `chrome/browser/content/branding/aboutDialog.css` — only the basename
49
- * trails-match, but the `branding` segment moved into the middle of
50
- * the candidate path. Without the bonus, that candidate would tie with
51
- * the unrelated `chrome/browser/content/browser/aboutDialog.css` and
52
- * the audit would pick whichever the directory walk hit first.
48
+ * trails-match, but the `branding` segment moved into the middle of the
49
+ * candidate path. Without the bonus that candidate ties with the unrelated
50
+ * `chrome/browser/content/browser/aboutDialog.css`.
53
51
  *
54
52
  * @param sourcePath Engine-relative POSIX path
55
53
  * @param candidatePath Absolute path under the dist tree
@@ -2,28 +2,25 @@
2
2
  /*
3
3
  * Path-resolution helpers for the post-build dist-tree audit.
4
4
  *
5
- * Resolves the expected on-disk artifact location for a given engine
6
- * source path. The previous implementation matched purely by basename and
7
- * suffered three classes of false positive:
5
+ * Resolves the expected on-disk artifact location for a given engine source
6
+ * path. Matching purely by basename produces three classes of false
7
+ * positive, each of which these helpers exist to avoid:
8
8
  *
9
- * 1. A branding override (e.g. `engine/browser/branding/<name>/content/aboutDialog.css`)
10
- * shipped at `chrome/browser/content/branding/aboutDialog.css` would
11
- * get matched against the unrelated upstream
12
- * `chrome/browser/content/browser/aboutDialog.css`.
13
- * 2. Test files (`browser_*.js`, `test_*.js`) live under `_tests/`, not
14
- * `dist/`, so every registered test was reported as missing.
9
+ * 1. A branding override (`engine/browser/branding/<name>/content/
10
+ * aboutDialog.css`, shipped at `chrome/browser/content/branding/
11
+ * aboutDialog.css`) matching the unrelated upstream
12
+ * `chrome/browser/content/browser/aboutDialog.css`. Handled by ranking
13
+ * same-basename candidates on shared trailing path segments.
14
+ * 2. Test files (`browser_*.js`, `test_*.js`) living under `_tests/`, not
15
+ * `dist/`. Handled by routing test paths to a separate resolver.
15
16
  * 3. Build inputs (`jar.mn`, `moz.build`, `Makefile.in`, `moz.configure`)
16
- * never appear under `dist/` — they are consumed, not packaged.
17
- *
18
- * The helpers below address (1) by ranking same-basename candidates by
19
- * how many trailing path segments they share with the source, and (2) by
20
- * routing test paths to a separate `_tests/`-aware resolver.
21
- *
22
- * (3) is handled in `build-audit.ts` via `isPackageablePath`.
17
+ * that are consumed rather than packaged. Handled in `build-audit.ts`
18
+ * via `isPackageablePath`.
23
19
  */
24
20
  import { readdir } from 'node:fs/promises';
25
21
  import { basename, join } from 'node:path';
26
22
  import { pathExists } from '../utils/fs.js';
23
+ import { normalizePathSlashes } from '../utils/paths.js';
27
24
  /** Maximum directory depth to traverse when scanning a tree root. */
28
25
  const MAX_SCAN_DEPTH = 12;
29
26
  /**
@@ -58,11 +55,19 @@ export function isTestPath(sourcePath) {
58
55
  return false;
59
56
  }
60
57
  /**
61
- * Splits a POSIX path into segments, dropping empties.
62
- * @param path POSIX-separated path
58
+ * Splits a path into segments, dropping empties.
59
+ *
60
+ * Separators are normalized first because the candidates come from `join()`
61
+ * over a `readdir` walk of the dist tree: on Windows those carry backslashes,
62
+ * which a `/`-only split collapses into a SINGLE segment. Every candidate then
63
+ * scores the same, so the trailing-overlap heuristic that disambiguates
64
+ * same-basename artifacts (`branding/…/aboutDialog.css` versus
65
+ * `browser/…/aboutDialog.css`) silently picks an arbitrary one.
66
+ *
67
+ * @param path Path in either separator style
63
68
  */
64
69
  function pathSegments(path) {
65
- return path.split('/').filter(Boolean);
70
+ return normalizePathSlashes(path).split('/').filter(Boolean);
66
71
  }
67
72
  /**
68
73
  * Counts how many trailing segments two paths share. Used to score
@@ -89,14 +94,13 @@ export function countTrailingSegmentMatches(a, b) {
89
94
  /**
90
95
  * Path segments too common to identify an artifact on their own.
91
96
  *
92
- * Shared deliberately: this set governs two halves of ONE decision, and the
93
- * halves disagreed before 0.41.0. `scoreCandidate` (selection) used an
94
- * 11-entry copy while `isConfidentMatch` (confirmation, in `build-audit.ts`)
95
- * used a 17-entry one, so a source path containing `test`, `tests`, `unit`,
96
- * `common`, `xpcshell` or `mochitest` earned a +1 selection bonus for a
97
- * segment that confirmation then rejected as meaningless — the chosen
98
- * artifact could never be confirmed. The union is authoritative; any addition
99
- * must apply to both halves, which is now automatic.
97
+ * Shared deliberately: this set governs two halves of ONE decision —
98
+ * `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
99
+ * `build-audit.ts`). When the halves kept separate copies they disagreed,
100
+ * so a source path could earn a selection bonus for a segment that
101
+ * confirmation then rejected as meaningless, leaving the chosen artifact
102
+ * unconfirmable. Any addition must apply to both halves, which is now
103
+ * automatic.
100
104
  */
101
105
  export const GENERIC_PATH_SEGMENTS = new Set([
102
106
  'content',
@@ -119,17 +123,16 @@ export const GENERIC_PATH_SEGMENTS = new Set([
119
123
  ]);
120
124
  /**
121
125
  * Computes a score for `candidatePath` relative to `sourcePath`. Higher
122
- * scores win. Score = trailing-segment match count, with a bonus when
123
- * the candidate's path contains a meaningful intermediate segment from
124
- * the source (e.g. `branding`, the branding dir name itself, etc.).
126
+ * scores win. Score = trailing-segment match count, with a bonus when the
127
+ * candidate's path contains a meaningful intermediate segment from the
128
+ * source (e.g. `branding`, or the branding dir name itself).
125
129
  *
126
- * The bonus exists because Firefox packaging often re-roots files: a
127
- * source `branding/<name>/content/aboutDialog.css` lands at
130
+ * The bonus exists because Firefox packaging often re-roots files: a source
131
+ * `branding/<name>/content/aboutDialog.css` lands at
128
132
  * `chrome/browser/content/branding/aboutDialog.css` — only the basename
129
- * trails-match, but the `branding` segment moved into the middle of
130
- * the candidate path. Without the bonus, that candidate would tie with
131
- * the unrelated `chrome/browser/content/browser/aboutDialog.css` and
132
- * the audit would pick whichever the directory walk hit first.
133
+ * trails-match, but the `branding` segment moved into the middle of the
134
+ * candidate path. Without the bonus that candidate ties with the unrelated
135
+ * `chrome/browser/content/browser/aboutDialog.css`.
133
136
  *
134
137
  * @param sourcePath Engine-relative POSIX path
135
138
  * @param candidatePath Absolute path under the dist tree
@@ -2,29 +2,28 @@
2
2
  /*
3
3
  * Known source→packaging path transforms for the post-build dist-tree audit.
4
4
  *
5
- * Motivating case: a source at `engine/browser/base/content/foo.js` ships
6
- * under `chrome/browser/content/browser/foo.js`. If an unrelated patch
7
- * registers a different `foo.js` elsewhere in the tree (e.g. a pref file
8
- * under `browser/defaults/preferences/foo.js`), the basename walker
9
- * surfaces both candidates, `scoreCandidate` awards them an identical
10
- * trailing-overlap score (basename only; every intermediate segment is
11
- * in the generic list), and whichever the directory walk hits first wins.
12
- * The heuristic then declares the chosen candidate "not structurally
13
- * related" and reports the correctly-packaged chrome resource as missing.
5
+ * A source at `engine/browser/base/content/foo.js` ships under
6
+ * `chrome/browser/content/browser/foo.js`. If an unrelated patch registers a
7
+ * different `foo.js` elsewhere (say a pref file under
8
+ * `browser/defaults/preferences/`), the basename walker surfaces both, and
9
+ * `scoreCandidate` awards them an identical trailing-overlap score because
10
+ * every intermediate segment is in the generic list. The heuristic then
11
+ * declares the winner "not structurally related" and reports the
12
+ * correctly-packaged chrome resource as missing.
14
13
  *
15
- * The transforms below anchor resolution to the well-known subtree→chrome
16
- * conventions used by upstream mozilla-central jar.mn. When a source
17
- * matches one of these prefixes, a candidate whose absolute path ends
18
- * with the implied chrome suffix is treated as a confident match — the
19
- * scorer never runs and the structural-relation check is bypassed.
14
+ * The transforms below anchor resolution to the subtree→chrome conventions
15
+ * upstream mozilla-central jar.mn uses. A candidate whose path ends with the
16
+ * implied chrome suffix is a confident match: the scorer never runs and the
17
+ * structural-relation check is bypassed.
20
18
  *
21
- * Scope is intentionally narrow: only subtrees whose packaging target is
22
- * stable across every fork we know about. A fork that reroutes a known
23
- * subtree can still win by adding `(source)` annotations in its own
24
- * `jar.mn`, which `resolveArtifactByRegistration` consults first.
19
+ * Scope is intentionally narrow — only subtrees whose packaging target is
20
+ * stable across forks. A fork that reroutes a known subtree can still win by
21
+ * adding `(source)` annotations in its own `jar.mn`, which
22
+ * `resolveArtifactByRegistration` consults first.
25
23
  */
26
24
  import { basename, sep } from 'node:path';
27
25
  import { findAllByBasename } from './build-audit-resolve.js';
26
+ import { WIDGETS_DIR } from './furnace-constants.js';
28
27
  /**
29
28
  * Table of `prefix → chrome-suffix` transforms. Each rule names an
30
29
  * engine-relative subtree prefix and produces the expected dist-tree
@@ -38,7 +37,7 @@ const KNOWN_TRANSFORMS = [
38
37
  build: (rest) => `chrome/browser/content/browser/${rest}`,
39
38
  },
40
39
  {
41
- prefix: 'toolkit/content/widgets/',
40
+ prefix: `${WIDGETS_DIR}/`,
42
41
  build: (rest) => `chrome/toolkit/content/global/elements/${rest}`,
43
42
  },
44
43
  {
@@ -6,7 +6,7 @@
6
6
  * but never registered in moz.build, jar.mn, or package-manifest.in, so
7
7
  * the mach build reports success but the packaged bundle carries stale
8
8
  * or missing content. A fork-specific pref file that was never registered
9
- * for packaging is the motivating case.
9
+ * for packaging is the canonical case.
10
10
  *
11
11
  * The audit is best-effort and warn-only:
12
12
  * - It enumerates engine files changed since the previous build baseline
@@ -33,7 +33,7 @@
33
33
  * segment overlap so a branding override does not get matched
34
34
  * against an unrelated upstream file with the same basename.
35
35
  */
36
- import { stat } from 'node:fs/promises';
36
+ import { readdir, stat } from 'node:fs/promises';
37
37
  import { basename, join } from 'node:path';
38
38
  import { pathExists } from '../utils/fs.js';
39
39
  import { info, verbose, warn } from '../utils/logger.js';
@@ -59,13 +59,11 @@ const PACKAGEABLE_PATH_FRAGMENTS = ['/app/profile/', '/chrome/', '/locales/'];
59
59
  /** Directories that are build artifacts, not source — never audited. */
60
60
  const IGNORE_PATH_FRAGMENTS = ['obj-', 'node_modules/', '.git/', '.cargo/', '.mozbuild/'];
61
61
  /**
62
- * Basenames that are build-system inputs, not packaged artifacts.
63
- * `jar.mn` is consumed to produce chrome registrations; `moz.build` /
64
- * `moz.configure` / `Makefile.in` feed the build backend; none of them
65
- * ship in the bundle. Auditing them produced a guaranteed false
66
- * positive on every edit (nothing under dist/ ever has these names),
67
- * and a worse failure mode when an unrelated upstream `moz.build`
68
- * coincidentally exists at e.g. `MyBrowser.app/Contents/moz.build` and
62
+ * Basenames that are build-system inputs, not packaged artifacts. `jar.mn`
63
+ * is consumed to produce chrome registrations; `moz.build` / `moz.configure`
64
+ * / `Makefile.in` feed the build backend; none ship in the bundle. Auditing
65
+ * them guarantees a false positive on every edit, and worse, an unrelated
66
+ * upstream `moz.build` sitting at e.g. `MyBrowser.app/Contents/moz.build`
69
67
  * gets matched as a "stale artifact" of an entirely different file.
70
68
  */
71
69
  const BUILD_INPUT_BASENAMES = new Set([
@@ -92,13 +90,11 @@ export function isPackageablePath(sourcePath) {
92
90
  if (BUILD_INPUT_BASENAMES.has(basename(sourcePath)))
93
91
  return false;
94
92
  // `.inc.xhtml` fragments are consumed via `#include` from a registered
95
- // chrome document and resolved at packaging time — they never ship as
96
- // a standalone packaged artifact. 2026-04-21 eval (Finding #11):
97
- // `fireforge build --ui` after `wire --dom` flagged the wired
98
- // `*.inc.xhtml` as "missing packaged artifact" even though
99
- // `register` correctly refuses to register it and the operator
100
- // followed the documented workflow. Mirror the same carve-out the
101
- // register rules apply.
93
+ // chrome document and resolved at packaging time — they never ship as a
94
+ // standalone packaged artifact, so auditing them flags a wired
95
+ // `*.inc.xhtml` as "missing packaged artifact" even though `register`
96
+ // correctly refuses to register it. Mirror the carve-out the register
97
+ // rules apply.
102
98
  if (sourcePath.endsWith('.inc.xhtml'))
103
99
  return false;
104
100
  for (const ext of PACKAGEABLE_EXTENSIONS) {
@@ -132,7 +128,6 @@ export function isXpcomManifestPath(sourcePath) {
132
128
  * one-or-none.
133
129
  */
134
130
  async function resolveDistRoot(engineDir) {
135
- const { readdir } = await import('node:fs/promises');
136
131
  let entries;
137
132
  try {
138
133
  entries = await readdir(engineDir);
@@ -156,7 +151,6 @@ async function resolveDistRoot(engineDir) {
156
151
  * Returns undefined when no obj dir exists yet.
157
152
  */
158
153
  async function resolveTestsRoot(engineDir) {
159
- const { readdir } = await import('node:fs/promises');
160
154
  let entries;
161
155
  try {
162
156
  entries = await readdir(engineDir);
@@ -207,18 +201,17 @@ function searchRootsFor(source, distRoot, testsRoot) {
207
201
  }
208
202
  /**
209
203
  * Minimum trailing-segment overlap required for a same-basename dist/
210
- * candidate to count as "the packaged artifact" of a source. The
211
- * basename always trail-matches (count 1), so a threshold of 2 requires
212
- * the immediate parent directory to also agree. Candidates that only
213
- * share the basename are classified as missing — warning the operator
214
- * to check registration — rather than emitting a misleading stale
215
- * comparison against an unrelated file of the same name.
204
+ * candidate to count as "the packaged artifact" of a source. The basename
205
+ * always trail-matches (count 1), so a threshold of 2 requires the immediate
206
+ * parent directory to agree too. Candidates sharing only the basename are
207
+ * classified as missing — warning the operator to check registration —
208
+ * rather than emitting a misleading stale comparison against an unrelated
209
+ * file of the same name.
216
210
  *
217
- * Cross-tree re-rooting cases (e.g. `branding/<name>/content/foo.css`
218
- * landing at `chrome/<area>/content/branding/foo.css`) bypass this
219
- * floor because `scoreCandidate` awards a non-generic-segment bonus
220
- * that lifts the confidence regardless of trailing overlap; those are
221
- * detected below in `isConfidentMatch`.
211
+ * Cross-tree re-rooting (e.g. `branding/<name>/content/foo.css` landing at
212
+ * `chrome/<area>/content/branding/foo.css`) bypasses this floor:
213
+ * `scoreCandidate` awards a non-generic-segment bonus that lifts confidence
214
+ * regardless of trailing overlap. See `isConfidentMatch` below.
222
215
  */
223
216
  const MIN_TRAILING_SEGMENT_OVERLAP = 2;
224
217
  /**
@@ -285,11 +278,8 @@ async function auditSinglePath(source, ctx) {
285
278
  const roots = searchRootsFor(source, ctx.distRoot, ctx.testsRoot);
286
279
  // Registration-aware resolution first: a `jar.mn` entry whose `(source)`
287
280
  // references this file is authoritative over the basename-similarity
288
- // heuristic. The motivating case is a fork that adds `content/foo.js`
289
- // in `browser/base/jar.mn` while an unrelated patch registers a pref
290
- // file of the same basename elsewhere — the heuristic cannot
291
- // distinguish them, so the audit falsely reports "missing" against the
292
- // correctly-packaged file.
281
+ // heuristic, which cannot distinguish a fork's `content/foo.js` from an
282
+ // unrelated pref file of the same basename elsewhere in the tree.
293
283
  const registered = await resolveArtifactByRegistration(ctx.engineDir, source, roots);
294
284
  if (registered) {
295
285
  return evaluateArtifactMtime(source, registered.artifact, sourceMtime, { registered: true });
@@ -305,14 +295,10 @@ async function auditSinglePath(source, ctx) {
305
295
  // source under `browser/base/content/` (or another prefix whose chrome
306
296
  // target is stable across forks) is matched against its expected
307
297
  // `chrome/...` suffix rather than whichever same-basename candidate the
308
- // directory walk happened to hit first. Motivating case: a source at
309
- // `engine/browser/base/content/foo.js` whose correctly-packaged artifact
310
- // lives at `chrome/browser/content/browser/foo.js` but which an unrelated
311
- // patch also placed under `browser/defaults/preferences/foo.js`; every
312
- // intermediate segment of the source is in the scorer's generic list,
313
- // so `resolveBestArtifact` picks whichever hit first and `isConfidentMatch`
314
- // rejects every candidate, classifying the correctly-packaged file as
315
- // "missing" even though packaging had landed it.
298
+ // directory walk happened to hit first. Every intermediate segment of such
299
+ // a source is in the scorer's generic list, so `resolveBestArtifact` picks
300
+ // arbitrarily and `isConfidentMatch` then rejects every candidate,
301
+ // classifying a correctly-packaged file as "missing".
316
302
  const byTransform = await resolveArtifactByKnownTransform(source, roots);
317
303
  if (byTransform) {
318
304
  return evaluateArtifactMtime(source, byTransform, sourceMtime, { registered: true });
@@ -23,18 +23,16 @@ export interface BuildBaseline {
23
23
  */
24
24
  binaryName: string;
25
25
  /**
26
- * Content hash per packageable engine path that was dirty at build
27
- * time (modified-against-HEAD or untracked). Used by
28
- * `checkStaleBuildForTest` to distinguish "this file's content was
29
- * already in `dist/` when the build completed" from "this file has
30
- * been edited since". Missing on baselines written before 0.16.0; the
31
- * stale-check falls back to the path-only comparison in that case,
32
- * so older baselines retain their existing behavior.
26
+ * Content hash per packageable engine path that was dirty at build time
27
+ * (modified-against-HEAD or untracked). Used by `checkStaleBuildForTest`
28
+ * to distinguish "this file's content was already in `dist/` when the
29
+ * build completed" from "this file has been edited since". When absent,
30
+ * the stale-check falls back to a path-only comparison.
33
31
  *
34
- * Keys are engine-relative POSIX paths. Values are hex-encoded
35
- * SHA-256 digests of the file contents at the moment the baseline
36
- * was recorded, or {@link DELETED_FILE_FINGERPRINT} when the successful
37
- * build observed a tracked deletion.
32
+ * Keys are engine-relative POSIX paths. Values are hex-encoded SHA-256
33
+ * digests of the file contents at the moment the baseline was recorded,
34
+ * or {@link DELETED_FILE_FINGERPRINT} when the successful build observed
35
+ * a tracked deletion.
38
36
  */
39
37
  packageableFingerprints?: Record<string, string>;
40
38
  /**
@@ -50,9 +48,7 @@ export interface BuildBaseline {
50
48
  * an `--allow-stale-build` run over uncovered paths is refused rather
51
49
  * than dispatched into a hang.
52
50
  *
53
- * Missing on baselines written before 0.37.0 — only `fireforge build`
54
- * wrote baselines then, so "full" is the honest historical value and the
55
- * stale-check treats an absent field as full coverage.
51
+ * An absent field is treated as full coverage.
56
52
  *
57
53
  * The record is project-scoped, which is also per-obj-dir: multi-objdir
58
54
  * checkouts are refused up-front (`AmbiguousBuildArtifactsError`), so at
@@ -62,26 +58,25 @@ export interface BuildBaseline {
62
58
  * general — every baseline write refreshes `packageableFingerprints` for
63
59
  * ALL dirty packageable paths, so a blind union would whitewash an
64
60
  * earlier scope's edited fixtures while `obj-*`/`_tests/` still holds its
65
- * stale staging; coverage therefore REPLACES by default.
61
+ * stale staging. Coverage therefore REPLACES by default.
66
62
  *
67
- * The one exception is `test --build --extend-coverage`, which
68
- * unions only after proving the previous record's anchor still holds:
69
- * same engine HEAD, same {@link BuildBaseline.mozconfigHash}, and every
70
- * previously fingerprinted path byte-identical — i.e. the wholesale
71
- * fingerprint refresh is a no-op for everything the earlier scope's
72
- * staging depended on. Any divergence refuses fail-closed. See
73
- * `src/core/coverage-extend.ts`, which also documents the one boundary
74
- * that guard does not cover (dirty non-packageable fixtures).
63
+ * The one exception is `test --build --extend-coverage`, which unions only
64
+ * after proving the previous record's anchor still holds: same engine
65
+ * HEAD, same {@link BuildBaseline.mozconfigHash}, and every previously
66
+ * fingerprinted path byte-identical — i.e. the wholesale fingerprint
67
+ * refresh is a no-op for everything the earlier scope's staging depended
68
+ * on. Any divergence refuses fail-closed. See `src/core/coverage-extend.ts`
69
+ * for the one boundary that guard does not cover (dirty non-packageable
70
+ * fixtures).
75
71
  */
76
72
  testPackagingCoverage?: TestPackagingCoverage;
77
73
  /**
78
74
  * Hex-encoded SHA-256 of `engine/mozconfig` as it stood for this build.
79
75
  * Recorded because the mozconfig is REGENERATED from project-side
80
- * `configs/*.mozconfig` templates plus `fireforge.json` on every build,
81
- * so `engineHeadSha` does not cover it: two builds at the same engine SHA
82
- * can configure differently. Consumed by the `--extend-coverage` anchor.
83
- * Missing on pre-0.41.0 baselines, which `--extend-coverage` refuses
84
- * (one plain build re-records it).
76
+ * `configs/*.mozconfig` templates plus `fireforge.json` on every build, so
77
+ * `engineHeadSha` does not cover it: two builds at the same engine SHA can
78
+ * configure differently. Consumed by the `--extend-coverage` anchor, which
79
+ * refuses when the field is absent (one plain build re-records it).
85
80
  */
86
81
  mozconfigHash?: string;
87
82
  /**
@@ -89,18 +84,17 @@ export interface BuildBaseline {
89
84
  * the last FULL-coverage build plus content fingerprints of the
90
85
  * `components.conf` manifests that were dirty at that moment. Written
91
86
  * fresh only on FULL-coverage baseline writes (`fireforge build`,
92
- * `build --ui`, path-less `test --build`); a scoped `test --build`
93
- * carries the previous record forward verbatim, because `mach build
94
- * faster` does not rebake `components.conf` registrations into the
95
- * compiled table. Missing on pre-0.38.0 baselines — the
96
- * static-components stale check degrades to "fresh" in that case.
87
+ * `build --ui`, path-less `test --build`); a scoped `test --build` carries
88
+ * the previous record forward verbatim, because `mach build faster` does
89
+ * not rebake `components.conf` registrations into the compiled table. When
90
+ * absent, the static-components stale check degrades to "fresh".
97
91
  */
98
92
  staticComponentsBaseline?: StaticComponentsBaseline;
99
93
  /**
100
94
  * Invocation shape that recorded this baseline (`'fireforge build'`,
101
95
  * `'fireforge build --ui'`, `'fireforge test --build [paths]'`).
102
- * Informational — surfaced by `fireforge status --test-coverage`.
103
- * Missing on pre-0.39.0 baselines; render as "unknown".
96
+ * Informational — surfaced by `fireforge status --test-coverage`. Render
97
+ * as "unknown" when absent.
104
98
  */
105
99
  recordedBy?: string;
106
100
  }
@@ -36,6 +36,7 @@ export declare function readBuildBaseline(projectRoot: string): Promise<BuildBas
36
36
  * engine HEAD SHA (or an empty string when the engine has no HEAD yet) and
37
37
  * the current binaryName. Caller is responsible for only invoking this
38
38
  * after the build exit code was zero.
39
+ *
39
40
  * @param projectRoot - Root directory of the project
40
41
  * @param engineDir - Path to the engine directory
41
42
  * @param binaryName - Current `binaryName` from fireforge.json
@@ -51,9 +52,9 @@ export declare function readBuildBaseline(projectRoot: string): Promise<BuildBas
51
52
  * @param staticComponentsHandling - `'auto'` (default) refreshes the
52
53
  * static-components anchor whenever the coverage claim is `'full'` or
53
54
  * absent. `'refresh'` records it even for a scoped coverage claim whose
54
- * implementation escalated to a full build. `'carry-forward'` always keeps the previous anchor: needed by
55
- * `--extend-coverage`, whose union can EVALUATE to `'full'`
56
- * while the build that produced it was still a scoped `mach build
57
- * faster` that did not rebake the compiled table.
55
+ * implementation escalated to a full build. `'carry-forward'` always
56
+ * keeps the previous anchor: needed by `--extend-coverage`, whose union
57
+ * can EVALUATE to `'full'` while the build that produced it was still a
58
+ * scoped `mach build faster` that did not rebake the compiled table.
58
59
  */
59
60
  export declare function writeBuildBaseline(projectRoot: string, engineDir: string, binaryName: string, testPackagingCoverage?: TestPackagingCoverage, previousBaseline?: BuildBaseline, recordedBy?: string, staticComponentsHandling?: 'auto' | 'refresh' | 'carry-forward'): Promise<void>;