@hominis/fireforge 0.45.0 → 0.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/CHANGELOG.md +409 -446
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +21 -15
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +46 -0
  6. package/dist/src/cli-usage-error.js +81 -0
  7. package/dist/src/cli.d.ts +7 -2
  8. package/dist/src/cli.js +47 -47
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +3 -4
  11. package/dist/src/commands/build.js +27 -17
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +19 -0
  14. package/dist/src/commands/destructive-decision.js +31 -0
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -10
  17. package/dist/src/commands/doctor-check-core.js +0 -8
  18. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  20. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  21. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  22. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  23. package/dist/src/commands/doctor-furnace.js +22 -22
  24. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
  25. package/dist/src/commands/doctor-orphaned-harness.js +14 -23
  26. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  27. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  28. package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
  29. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  30. package/dist/src/commands/doctor-source-pin.js +14 -14
  31. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  32. package/dist/src/commands/doctor-working-tree.js +3 -3
  33. package/dist/src/commands/doctor.d.ts +3 -1
  34. package/dist/src/commands/doctor.js +15 -16
  35. package/dist/src/commands/download.js +50 -37
  36. package/dist/src/commands/export-all.js +29 -12
  37. package/dist/src/commands/export-flow.d.ts +5 -5
  38. package/dist/src/commands/export-flow.js +29 -59
  39. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  40. package/dist/src/commands/export-placement-conflicts.js +12 -12
  41. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  42. package/dist/src/commands/export-placement-gate.js +7 -13
  43. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  44. package/dist/src/commands/export-placement-policy.js +4 -6
  45. package/dist/src/commands/export-shared.d.ts +51 -32
  46. package/dist/src/commands/export-shared.js +17 -32
  47. package/dist/src/commands/export.js +14 -5
  48. package/dist/src/commands/furnace/apply.js +16 -16
  49. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  50. package/dist/src/commands/furnace/authoring-config.js +19 -0
  51. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  52. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  54. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  55. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  56. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  57. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  58. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  59. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  60. package/dist/src/commands/furnace/create-browser-test.js +7 -12
  61. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  62. package/dist/src/commands/furnace/create-dry-run.js +6 -9
  63. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  64. package/dist/src/commands/furnace/create-features.js +2 -2
  65. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  66. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  67. package/dist/src/commands/furnace/create-templates.d.ts +31 -15
  68. package/dist/src/commands/furnace/create-templates.js +20 -19
  69. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  70. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  71. package/dist/src/commands/furnace/create.d.ts +1 -1
  72. package/dist/src/commands/furnace/create.js +35 -29
  73. package/dist/src/commands/furnace/deploy.js +15 -6
  74. package/dist/src/commands/furnace/diff.js +7 -7
  75. package/dist/src/commands/furnace/index.js +1 -1
  76. package/dist/src/commands/furnace/init.js +17 -16
  77. package/dist/src/commands/furnace/list.js +2 -2
  78. package/dist/src/commands/furnace/override.d.ts +1 -1
  79. package/dist/src/commands/furnace/override.js +43 -34
  80. package/dist/src/commands/furnace/preview.js +17 -17
  81. package/dist/src/commands/furnace/refresh.js +15 -7
  82. package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
  83. package/dist/src/commands/furnace/remove-mutations.js +19 -19
  84. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  85. package/dist/src/commands/furnace/remove-state.js +1 -1
  86. package/dist/src/commands/furnace/remove.js +4 -8
  87. package/dist/src/commands/furnace/rename-browser-test.js +10 -15
  88. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  89. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  90. package/dist/src/commands/furnace/rename.js +36 -36
  91. package/dist/src/commands/furnace/scan.js +3 -3
  92. package/dist/src/commands/furnace/status.js +19 -16
  93. package/dist/src/commands/furnace/sync.js +6 -6
  94. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  95. package/dist/src/commands/furnace/test-file-name.js +39 -0
  96. package/dist/src/commands/furnace/validate.js +11 -12
  97. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  98. package/dist/src/commands/furnace/validation-output.js +3 -8
  99. package/dist/src/commands/import.js +22 -29
  100. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  101. package/dist/src/commands/lint-per-patch.js +27 -12
  102. package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
  103. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  104. package/dist/src/commands/lint-report.d.ts +3 -3
  105. package/dist/src/commands/lint-report.js +4 -4
  106. package/dist/src/commands/lint.d.ts +5 -4
  107. package/dist/src/commands/lint.js +36 -36
  108. package/dist/src/commands/manifest.d.ts +4 -4
  109. package/dist/src/commands/manifest.js +1 -1
  110. package/dist/src/commands/package.js +4 -6
  111. package/dist/src/commands/patch/compact.d.ts +2 -2
  112. package/dist/src/commands/patch/compact.js +19 -20
  113. package/dist/src/commands/patch/delete.d.ts +1 -1
  114. package/dist/src/commands/patch/delete.js +23 -33
  115. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  116. package/dist/src/commands/patch/entry-projection.js +24 -0
  117. package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
  118. package/dist/src/commands/patch/lint-ignore.js +33 -44
  119. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  120. package/dist/src/commands/patch/move-files-create.js +29 -15
  121. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  122. package/dist/src/commands/patch/move-files-into.js +41 -37
  123. package/dist/src/commands/patch/move-files.js +5 -14
  124. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  125. package/dist/src/commands/patch/rename.d.ts +4 -4
  126. package/dist/src/commands/patch/rename.js +35 -49
  127. package/dist/src/commands/patch/reorder.js +35 -48
  128. package/dist/src/commands/patch/split-plan.d.ts +7 -8
  129. package/dist/src/commands/patch/split-plan.js +10 -13
  130. package/dist/src/commands/patch/split.d.ts +2 -2
  131. package/dist/src/commands/patch/split.js +50 -48
  132. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  133. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  134. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  135. package/dist/src/commands/patch/staged-dependency.js +22 -28
  136. package/dist/src/commands/patch/tier.d.ts +2 -2
  137. package/dist/src/commands/patch/tier.js +20 -30
  138. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  139. package/dist/src/commands/patch-rename-map.js +36 -0
  140. package/dist/src/commands/pending-resolution.d.ts +15 -0
  141. package/dist/src/commands/pending-resolution.js +25 -0
  142. package/dist/src/commands/re-export-adjacent.d.ts +25 -3
  143. package/dist/src/commands/re-export-adjacent.js +40 -24
  144. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  145. package/dist/src/commands/re-export-bulk-scan.js +23 -27
  146. package/dist/src/commands/re-export-drift.d.ts +10 -10
  147. package/dist/src/commands/re-export-drift.js +33 -33
  148. package/dist/src/commands/re-export-files.d.ts +2 -3
  149. package/dist/src/commands/re-export-files.js +52 -44
  150. package/dist/src/commands/re-export-lint.d.ts +29 -30
  151. package/dist/src/commands/re-export-lint.js +36 -29
  152. package/dist/src/commands/re-export-options.d.ts +1 -1
  153. package/dist/src/commands/re-export-options.js +1 -1
  154. package/dist/src/commands/re-export-register.d.ts +1 -1
  155. package/dist/src/commands/re-export-register.js +1 -1
  156. package/dist/src/commands/re-export-scan.d.ts +1 -1
  157. package/dist/src/commands/re-export-scan.js +12 -9
  158. package/dist/src/commands/re-export-single.d.ts +23 -4
  159. package/dist/src/commands/re-export-single.js +39 -31
  160. package/dist/src/commands/re-export.js +35 -17
  161. package/dist/src/commands/rebase/abort.js +9 -14
  162. package/dist/src/commands/rebase/continue.js +20 -19
  163. package/dist/src/commands/rebase/index.d.ts +1 -1
  164. package/dist/src/commands/rebase/index.js +5 -5
  165. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  166. package/dist/src/commands/rebase/patch-loop.js +20 -24
  167. package/dist/src/commands/register.js +5 -5
  168. package/dist/src/commands/reset.js +1 -1
  169. package/dist/src/commands/resolve.d.ts +2 -2
  170. package/dist/src/commands/resolve.js +21 -13
  171. package/dist/src/commands/run.d.ts +0 -13
  172. package/dist/src/commands/run.js +38 -51
  173. package/dist/src/commands/setup-support.d.ts +16 -4
  174. package/dist/src/commands/setup-support.js +20 -20
  175. package/dist/src/commands/setup.js +4 -10
  176. package/dist/src/commands/source.js +9 -2
  177. package/dist/src/commands/status-check.d.ts +3 -3
  178. package/dist/src/commands/status-check.js +6 -6
  179. package/dist/src/commands/status-json.d.ts +14 -13
  180. package/dist/src/commands/status-json.js +9 -8
  181. package/dist/src/commands/status-output.d.ts +3 -3
  182. package/dist/src/commands/status-output.js +5 -5
  183. package/dist/src/commands/status-ownership.d.ts +3 -3
  184. package/dist/src/commands/status-ownership.js +3 -3
  185. package/dist/src/commands/status.js +25 -26
  186. package/dist/src/commands/test-build-phase.d.ts +3 -3
  187. package/dist/src/commands/test-build-phase.js +48 -24
  188. package/dist/src/commands/test-diagnose.d.ts +1 -1
  189. package/dist/src/commands/test-diagnose.js +20 -20
  190. package/dist/src/commands/test-modes.d.ts +4 -4
  191. package/dist/src/commands/test-modes.js +4 -5
  192. package/dist/src/commands/test-register.js +5 -3
  193. package/dist/src/commands/test-run.d.ts +11 -11
  194. package/dist/src/commands/test-run.js +40 -33
  195. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  196. package/dist/src/commands/test-stale-gate.js +17 -17
  197. package/dist/src/commands/test-verdict.d.ts +19 -5
  198. package/dist/src/commands/test-verdict.js +26 -11
  199. package/dist/src/commands/test.d.ts +3 -3
  200. package/dist/src/commands/test.js +73 -36
  201. package/dist/src/commands/token-coverage.js +3 -3
  202. package/dist/src/commands/token-list.d.ts +26 -0
  203. package/dist/src/commands/token-list.js +153 -0
  204. package/dist/src/commands/token.js +26 -10
  205. package/dist/src/commands/tree.js +26 -21
  206. package/dist/src/commands/typecheck.d.ts +6 -6
  207. package/dist/src/commands/typecheck.js +16 -16
  208. package/dist/src/commands/verify.d.ts +3 -3
  209. package/dist/src/commands/verify.js +10 -10
  210. package/dist/src/commands/watch.js +11 -11
  211. package/dist/src/commands/wire.js +17 -16
  212. package/dist/src/core/ast-utils.d.ts +7 -7
  213. package/dist/src/core/ast-utils.js +8 -8
  214. package/dist/src/core/branding.d.ts +5 -12
  215. package/dist/src/core/branding.js +6 -5
  216. package/dist/src/core/browser-wire.d.ts +1 -1
  217. package/dist/src/core/browser-wire.js +10 -7
  218. package/dist/src/core/build-audit-platform.d.ts +32 -3
  219. package/dist/src/core/build-audit-platform.js +153 -13
  220. package/dist/src/core/build-audit-registration.d.ts +5 -5
  221. package/dist/src/core/build-audit-registration.js +10 -9
  222. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  223. package/dist/src/core/build-audit-resolve.js +6 -6
  224. package/dist/src/core/build-audit-skip.d.ts +57 -0
  225. package/dist/src/core/build-audit-skip.js +112 -0
  226. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  227. package/dist/src/core/build-audit-transforms.js +3 -3
  228. package/dist/src/core/build-audit.d.ts +21 -8
  229. package/dist/src/core/build-audit.js +142 -40
  230. package/dist/src/core/build-baseline-types.d.ts +19 -18
  231. package/dist/src/core/build-baseline-types.js +1 -1
  232. package/dist/src/core/build-baseline.d.ts +48 -31
  233. package/dist/src/core/build-baseline.js +20 -43
  234. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  235. package/dist/src/core/build-jar-escalation.js +18 -17
  236. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  237. package/dist/src/core/build-overwrite-guard.js +14 -14
  238. package/dist/src/core/build-prepare.d.ts +4 -12
  239. package/dist/src/core/build-prepare.js +22 -26
  240. package/dist/src/core/config-mutate.js +4 -4
  241. package/dist/src/core/config-paths.d.ts +2 -6
  242. package/dist/src/core/config-paths.js +4 -2
  243. package/dist/src/core/config-state.d.ts +0 -6
  244. package/dist/src/core/config-state.js +3 -21
  245. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  246. package/dist/src/core/config-validate-build-audit.js +80 -0
  247. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  248. package/dist/src/core/config-validate-file-size.js +3 -3
  249. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  250. package/dist/src/core/config-validate-patch-policy.js +3 -3
  251. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  252. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  253. package/dist/src/core/config-validate.js +22 -12
  254. package/dist/src/core/config.d.ts +12 -12
  255. package/dist/src/core/config.js +21 -25
  256. package/dist/src/core/coverage-extend.d.ts +16 -16
  257. package/dist/src/core/coverage-extend.js +20 -20
  258. package/dist/src/core/destructive.d.ts +14 -14
  259. package/dist/src/core/destructive.js +9 -9
  260. package/dist/src/core/diff-hunks.d.ts +2 -2
  261. package/dist/src/core/diff-hunks.js +7 -7
  262. package/dist/src/core/discard-baseline.d.ts +10 -10
  263. package/dist/src/core/discard-baseline.js +22 -23
  264. package/dist/src/core/display-state.d.ts +11 -11
  265. package/dist/src/core/display-state.js +12 -12
  266. package/dist/src/core/engine-changes.d.ts +2 -2
  267. package/dist/src/core/engine-changes.js +2 -2
  268. package/dist/src/core/engine-precondition.d.ts +5 -13
  269. package/dist/src/core/engine-precondition.js +5 -10
  270. package/dist/src/core/engine-session-lock.d.ts +18 -18
  271. package/dist/src/core/engine-session-lock.js +50 -54
  272. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  273. package/dist/src/core/export-moved-code-shape.js +10 -10
  274. package/dist/src/core/file-lock-owner.d.ts +103 -0
  275. package/dist/src/core/file-lock-owner.js +259 -0
  276. package/dist/src/core/file-lock.d.ts +14 -19
  277. package/dist/src/core/file-lock.js +90 -128
  278. package/dist/src/core/firefox-cache.d.ts +13 -1
  279. package/dist/src/core/firefox-cache.js +61 -36
  280. package/dist/src/core/firefox-download.d.ts +15 -0
  281. package/dist/src/core/firefox-download.js +38 -22
  282. package/dist/src/core/firefox-extract.d.ts +8 -7
  283. package/dist/src/core/firefox-extract.js +45 -27
  284. package/dist/src/core/firefox.d.ts +34 -36
  285. package/dist/src/core/firefox.js +13 -44
  286. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  287. package/dist/src/core/furnace-apply-dry-run.js +2 -8
  288. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  289. package/dist/src/core/furnace-apply-ftl.js +8 -8
  290. package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
  291. package/dist/src/core/furnace-apply-helpers.js +28 -39
  292. package/dist/src/core/furnace-apply-output.js +1 -1
  293. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  294. package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
  295. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  296. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  297. package/dist/src/core/furnace-apply.d.ts +4 -4
  298. package/dist/src/core/furnace-apply.js +50 -29
  299. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  300. package/dist/src/core/furnace-checksum-utils.js +5 -5
  301. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  302. package/dist/src/core/furnace-config-custom.js +2 -2
  303. package/dist/src/core/furnace-config-order.js +1 -1
  304. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  305. package/dist/src/core/furnace-config-tokens.js +3 -3
  306. package/dist/src/core/furnace-config-validate.js +2 -2
  307. package/dist/src/core/furnace-config.d.ts +5 -5
  308. package/dist/src/core/furnace-config.js +40 -53
  309. package/dist/src/core/furnace-constants.d.ts +6 -6
  310. package/dist/src/core/furnace-constants.js +9 -8
  311. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  312. package/dist/src/core/furnace-css-fragments.js +11 -11
  313. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  314. package/dist/src/core/furnace-dir-entry.js +21 -0
  315. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  316. package/dist/src/core/furnace-jsconfig.js +22 -20
  317. package/dist/src/core/furnace-operation.d.ts +22 -19
  318. package/dist/src/core/furnace-operation.js +38 -34
  319. package/dist/src/core/furnace-precondition.d.ts +10 -10
  320. package/dist/src/core/furnace-precondition.js +8 -8
  321. package/dist/src/core/furnace-refresh.d.ts +18 -6
  322. package/dist/src/core/furnace-refresh.js +5 -8
  323. package/dist/src/core/furnace-registration-ast.d.ts +2 -3
  324. package/dist/src/core/furnace-registration-ast.js +9 -12
  325. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  326. package/dist/src/core/furnace-registration-remove.js +6 -6
  327. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  328. package/dist/src/core/furnace-registration-validate.js +2 -2
  329. package/dist/src/core/furnace-registration.d.ts +7 -6
  330. package/dist/src/core/furnace-registration.js +29 -36
  331. package/dist/src/core/furnace-rollback.d.ts +1 -1
  332. package/dist/src/core/furnace-rollback.js +5 -5
  333. package/dist/src/core/furnace-scanner.js +3 -6
  334. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  335. package/dist/src/core/furnace-stale-export.js +16 -15
  336. package/dist/src/core/furnace-staleness.d.ts +2 -2
  337. package/dist/src/core/furnace-staleness.js +2 -2
  338. package/dist/src/core/furnace-state-persist.d.ts +12 -12
  339. package/dist/src/core/furnace-state-persist.js +10 -10
  340. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  341. package/dist/src/core/furnace-step-errors.js +6 -6
  342. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  343. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  344. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  345. package/dist/src/core/furnace-validate-registration.js +18 -20
  346. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  347. package/dist/src/core/furnace-validate-structure.js +4 -4
  348. package/dist/src/core/furnace-validate.js +9 -9
  349. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  350. package/dist/src/core/furnace-version-drift.js +5 -5
  351. package/dist/src/core/git-base.d.ts +6 -4
  352. package/dist/src/core/git-base.js +29 -7
  353. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  354. package/dist/src/core/git-diff-new-file.js +119 -0
  355. package/dist/src/core/git-diff.d.ts +13 -13
  356. package/dist/src/core/git-diff.js +121 -189
  357. package/dist/src/core/git-file-ops.d.ts +6 -13
  358. package/dist/src/core/git-file-ops.js +11 -35
  359. package/dist/src/core/git-readonly-index.d.ts +12 -14
  360. package/dist/src/core/git-readonly-index.js +12 -16
  361. package/dist/src/core/git-status.d.ts +9 -2
  362. package/dist/src/core/git-status.js +23 -11
  363. package/dist/src/core/git.d.ts +3 -9
  364. package/dist/src/core/git.js +28 -57
  365. package/dist/src/core/harness-orphans.d.ts +17 -17
  366. package/dist/src/core/harness-orphans.js +28 -27
  367. package/dist/src/core/history-log.d.ts +19 -0
  368. package/dist/src/core/history-log.js +29 -0
  369. package/dist/src/core/license-headers.d.ts +19 -18
  370. package/dist/src/core/license-headers.js +29 -28
  371. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  372. package/dist/src/core/mach-build-artifacts.js +23 -23
  373. package/dist/src/core/mach-error-hints.d.ts +5 -10
  374. package/dist/src/core/mach-error-hints.js +14 -14
  375. package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
  376. package/dist/src/core/mach-known-noise-filter.js +57 -56
  377. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  378. package/dist/src/core/mach-mozconfig.js +17 -16
  379. package/dist/src/core/mach-python.d.ts +3 -0
  380. package/dist/src/core/mach-python.js +13 -7
  381. package/dist/src/core/mach-resource-shim.d.ts +24 -12
  382. package/dist/src/core/mach-resource-shim.js +124 -21
  383. package/dist/src/core/mach.d.ts +59 -73
  384. package/dist/src/core/mach.js +47 -115
  385. package/dist/src/core/marionette-port.d.ts +15 -30
  386. package/dist/src/core/marionette-port.js +46 -89
  387. package/dist/src/core/marionette-preflight.d.ts +6 -6
  388. package/dist/src/core/marionette-preflight.js +32 -50
  389. package/dist/src/core/markdown-table.d.ts +9 -9
  390. package/dist/src/core/markdown-table.js +14 -14
  391. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  392. package/dist/src/core/mochitest-server-port.js +17 -17
  393. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  394. package/dist/src/core/module-resolution-preflight.js +11 -11
  395. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  396. package/dist/src/core/moz-manifest-helpers.js +7 -7
  397. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  398. package/dist/src/core/moz-manifest-register.js +2 -2
  399. package/dist/src/core/moz-manifest-rules.js +46 -42
  400. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  401. package/dist/src/core/ownership-table.d.ts +5 -5
  402. package/dist/src/core/ownership-table.js +7 -7
  403. package/dist/src/core/parser-fallback.d.ts +3 -3
  404. package/dist/src/core/parser-fallback.js +3 -3
  405. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  406. package/dist/src/core/patch-apply-fuzz.js +13 -13
  407. package/dist/src/core/patch-apply.d.ts +13 -14
  408. package/dist/src/core/patch-apply.js +36 -42
  409. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  410. package/dist/src/core/patch-export-coverage.js +1 -30
  411. package/dist/src/core/patch-export-update.d.ts +21 -4
  412. package/dist/src/core/patch-export-update.js +7 -6
  413. package/dist/src/core/patch-export.d.ts +20 -30
  414. package/dist/src/core/patch-export.js +55 -77
  415. package/dist/src/core/patch-files.d.ts +0 -4
  416. package/dist/src/core/patch-files.js +0 -11
  417. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  418. package/dist/src/core/patch-identifier-suggest.js +4 -4
  419. package/dist/src/core/patch-lint-binary.d.ts +12 -18
  420. package/dist/src/core/patch-lint-cache.d.ts +18 -2
  421. package/dist/src/core/patch-lint-cache.js +16 -19
  422. package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
  423. package/dist/src/core/patch-lint-checkjs.js +78 -64
  424. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  425. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  426. package/dist/src/core/patch-lint-creators.d.ts +5 -9
  427. package/dist/src/core/patch-lint-creators.js +3 -3
  428. package/dist/src/core/patch-lint-cross.d.ts +27 -19
  429. package/dist/src/core/patch-lint-cross.js +67 -110
  430. package/dist/src/core/patch-lint-css.d.ts +1 -1
  431. package/dist/src/core/patch-lint-css.js +15 -11
  432. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  433. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  434. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  435. package/dist/src/core/patch-lint-diff.js +4 -4
  436. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  437. package/dist/src/core/patch-lint-file-size.js +6 -6
  438. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  439. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  440. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  441. package/dist/src/core/patch-lint-jsdoc.js +46 -46
  442. package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
  443. package/dist/src/core/patch-lint-module-registration.js +1 -1
  444. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  445. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  446. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  447. package/dist/src/core/patch-lint-observer.js +7 -7
  448. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  449. package/dist/src/core/patch-lint-ownership.js +6 -6
  450. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  451. package/dist/src/core/patch-lint-prettier.js +7 -7
  452. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  453. package/dist/src/core/patch-lint-queue-types.js +12 -0
  454. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  455. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  456. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  457. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  458. package/dist/src/core/patch-lint.d.ts +41 -35
  459. package/dist/src/core/patch-lint.js +52 -49
  460. package/dist/src/core/patch-lock.d.ts +1 -1
  461. package/dist/src/core/patch-lock.js +11 -11
  462. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  463. package/dist/src/core/patch-manifest-consistency.js +16 -17
  464. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  465. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  466. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  467. package/dist/src/core/patch-manifest-io.js +35 -34
  468. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  469. package/dist/src/core/patch-manifest-query.js +4 -4
  470. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  471. package/dist/src/core/patch-manifest-resolve.js +7 -7
  472. package/dist/src/core/patch-manifest-validate.js +3 -3
  473. package/dist/src/core/patch-manifest.d.ts +2 -2
  474. package/dist/src/core/patch-manifest.js +2 -2
  475. package/dist/src/core/patch-parse.d.ts +32 -21
  476. package/dist/src/core/patch-parse.js +40 -15
  477. package/dist/src/core/patch-policy.js +15 -27
  478. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  479. package/dist/src/core/patch-registration-refs.js +7 -7
  480. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  481. package/dist/src/core/patch-source-metadata.js +0 -4
  482. package/dist/src/core/patch-transform.d.ts +8 -16
  483. package/dist/src/core/patch-transform.js +13 -23
  484. package/dist/src/core/process-cpu-time.d.ts +1 -1
  485. package/dist/src/core/process-cpu-time.js +6 -6
  486. package/dist/src/core/rebase-session.d.ts +9 -15
  487. package/dist/src/core/rebase-session.js +13 -25
  488. package/dist/src/core/register-browser-content.js +3 -2
  489. package/dist/src/core/register-browser-test.js +2 -1
  490. package/dist/src/core/register-module.js +2 -1
  491. package/dist/src/core/register-result.d.ts +1 -1
  492. package/dist/src/core/register-result.js +1 -1
  493. package/dist/src/core/register-scaffold.d.ts +2 -2
  494. package/dist/src/core/register-scaffold.js +8 -7
  495. package/dist/src/core/register-shared-css.d.ts +3 -3
  496. package/dist/src/core/register-shared-css.js +6 -5
  497. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  498. package/dist/src/core/register-xpcshell-test.js +2 -2
  499. package/dist/src/core/run-log-redact.d.ts +38 -0
  500. package/dist/src/core/run-log-redact.js +69 -0
  501. package/dist/src/core/run-log.d.ts +21 -10
  502. package/dist/src/core/run-log.js +76 -27
  503. package/dist/src/core/shared-ftl.d.ts +2 -2
  504. package/dist/src/core/shared-ftl.js +6 -6
  505. package/dist/src/core/signal-critical.d.ts +2 -2
  506. package/dist/src/core/signal-critical.js +4 -6
  507. package/dist/src/core/smoke-patterns.d.ts +5 -6
  508. package/dist/src/core/smoke-patterns.js +15 -20
  509. package/dist/src/core/state-file.d.ts +15 -4
  510. package/dist/src/core/state-file.js +14 -1
  511. package/dist/src/core/status-binary.d.ts +8 -8
  512. package/dist/src/core/status-binary.js +12 -12
  513. package/dist/src/core/status-classify.d.ts +17 -17
  514. package/dist/src/core/status-classify.js +13 -12
  515. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  516. package/dist/src/core/test-changed-prefs.js +40 -25
  517. package/dist/src/core/test-harness-crash.d.ts +39 -39
  518. package/dist/src/core/test-harness-crash.js +69 -69
  519. package/dist/src/core/test-harness-output.d.ts +7 -7
  520. package/dist/src/core/test-harness-output.js +7 -7
  521. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  522. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  523. package/dist/src/core/test-path-scope.d.ts +8 -8
  524. package/dist/src/core/test-path-scope.js +11 -11
  525. package/dist/src/core/test-stale-check.d.ts +22 -23
  526. package/dist/src/core/test-stale-check.js +31 -30
  527. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  528. package/dist/src/core/test-stale-symlink.js +1 -1
  529. package/dist/src/core/test-stall-triage.d.ts +9 -9
  530. package/dist/src/core/test-stall-triage.js +22 -22
  531. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  532. package/dist/src/core/test-xpcshell-retry.js +14 -11
  533. package/dist/src/core/token-category.d.ts +35 -2
  534. package/dist/src/core/token-category.js +67 -58
  535. package/dist/src/core/token-coverage.js +4 -5
  536. package/dist/src/core/token-dark-mode.d.ts +9 -9
  537. package/dist/src/core/token-dark-mode.js +13 -25
  538. package/dist/src/core/token-docs.d.ts +1 -1
  539. package/dist/src/core/token-inventory.d.ts +56 -0
  540. package/dist/src/core/token-inventory.js +109 -0
  541. package/dist/src/core/token-manager.d.ts +4 -4
  542. package/dist/src/core/token-manager.js +22 -22
  543. package/dist/src/core/token-scaffold.d.ts +4 -4
  544. package/dist/src/core/token-scaffold.js +4 -4
  545. package/dist/src/core/token-variant.d.ts +14 -14
  546. package/dist/src/core/token-variant.js +52 -53
  547. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  548. package/dist/src/core/toolchain-preflight.js +23 -23
  549. package/dist/src/core/tree-cow.d.ts +3 -5
  550. package/dist/src/core/tree-cow.js +8 -8
  551. package/dist/src/core/tree-guard.d.ts +3 -3
  552. package/dist/src/core/tree-guard.js +23 -23
  553. package/dist/src/core/tree-store.d.ts +15 -15
  554. package/dist/src/core/tree-store.js +39 -38
  555. package/dist/src/core/typecheck-shim.d.ts +16 -15
  556. package/dist/src/core/typecheck-shim.js +26 -25
  557. package/dist/src/core/typecheck.d.ts +12 -12
  558. package/dist/src/core/typecheck.js +33 -33
  559. package/dist/src/core/wire-destroy.d.ts +2 -2
  560. package/dist/src/core/wire-destroy.js +5 -5
  561. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  562. package/dist/src/core/wire-dom-fragment.js +12 -23
  563. package/dist/src/core/wire-init.d.ts +2 -2
  564. package/dist/src/core/wire-init.js +7 -7
  565. package/dist/src/core/wire-subscript.d.ts +1 -1
  566. package/dist/src/core/wire-subscript.js +3 -3
  567. package/dist/src/core/wire-utils.d.ts +9 -9
  568. package/dist/src/core/wire-utils.js +16 -28
  569. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  570. package/dist/src/core/xpcshell-appdir.js +28 -30
  571. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  572. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  573. package/dist/src/errors/base.d.ts +69 -16
  574. package/dist/src/errors/base.js +95 -26
  575. package/dist/src/errors/build.d.ts +6 -6
  576. package/dist/src/errors/build.js +26 -34
  577. package/dist/src/errors/codes.d.ts +10 -10
  578. package/dist/src/errors/codes.js +10 -10
  579. package/dist/src/errors/config.d.ts +0 -14
  580. package/dist/src/errors/config.js +13 -34
  581. package/dist/src/errors/download.d.ts +13 -0
  582. package/dist/src/errors/download.js +53 -24
  583. package/dist/src/errors/furnace.d.ts +2 -2
  584. package/dist/src/errors/furnace.js +8 -9
  585. package/dist/src/errors/git.d.ts +9 -9
  586. package/dist/src/errors/git.js +21 -31
  587. package/dist/src/errors/patch.d.ts +3 -3
  588. package/dist/src/errors/patch.js +11 -13
  589. package/dist/src/errors/rebase.d.ts +1 -1
  590. package/dist/src/errors/rebase.js +8 -8
  591. package/dist/src/errors/run.d.ts +1 -1
  592. package/dist/src/errors/run.js +1 -1
  593. package/dist/src/index.d.ts +4 -4
  594. package/dist/src/index.js +4 -4
  595. package/dist/src/types/commands/options.d.ts +155 -200
  596. package/dist/src/types/commands/patches.d.ts +19 -19
  597. package/dist/src/types/commands/project.d.ts +3 -3
  598. package/dist/src/types/config.d.ts +52 -19
  599. package/dist/src/types/furnace.d.ts +17 -17
  600. package/dist/src/types/index.d.ts +0 -1
  601. package/dist/src/types/json.d.ts +3 -3
  602. package/dist/src/types/json.js +2 -2
  603. package/dist/src/types/typecheck.d.ts +3 -3
  604. package/dist/src/utils/assert.d.ts +4 -16
  605. package/dist/src/utils/assert.js +7 -24
  606. package/dist/src/utils/build-info.d.ts +6 -6
  607. package/dist/src/utils/build-info.js +6 -6
  608. package/dist/src/utils/child-env.d.ts +7 -6
  609. package/dist/src/utils/child-env.js +5 -5
  610. package/dist/src/utils/concurrency.d.ts +2 -2
  611. package/dist/src/utils/concurrency.js +2 -2
  612. package/dist/src/utils/elapsed.js +10 -1
  613. package/dist/src/utils/errors.d.ts +8 -8
  614. package/dist/src/utils/errors.js +8 -8
  615. package/dist/src/utils/fs.d.ts +1 -1
  616. package/dist/src/utils/fs.js +15 -20
  617. package/dist/src/utils/hash.d.ts +12 -0
  618. package/dist/src/utils/hash.js +16 -0
  619. package/dist/src/utils/line-dispatch.d.ts +15 -0
  620. package/dist/src/utils/line-dispatch.js +48 -0
  621. package/dist/src/utils/logger.d.ts +4 -4
  622. package/dist/src/utils/logger.js +11 -11
  623. package/dist/src/utils/machine-output.js +2 -2
  624. package/dist/src/utils/options.d.ts +14 -20
  625. package/dist/src/utils/options.js +26 -27
  626. package/dist/src/utils/package-root.js +5 -14
  627. package/dist/src/utils/paths.d.ts +4 -4
  628. package/dist/src/utils/paths.js +4 -4
  629. package/dist/src/utils/platform.d.ts +0 -4
  630. package/dist/src/utils/process-group.d.ts +10 -9
  631. package/dist/src/utils/process-group.js +37 -36
  632. package/dist/src/utils/process.d.ts +70 -55
  633. package/dist/src/utils/process.js +129 -179
  634. package/dist/src/utils/ps-duration.d.ts +4 -4
  635. package/dist/src/utils/ps-duration.js +9 -9
  636. package/dist/src/utils/regex.d.ts +4 -4
  637. package/dist/src/utils/regex.js +7 -7
  638. package/dist/src/utils/sleep.d.ts +26 -0
  639. package/dist/src/utils/sleep.js +31 -0
  640. package/dist/src/utils/stdio-drain.d.ts +7 -7
  641. package/dist/src/utils/stdio-drain.js +8 -8
  642. package/dist/src/utils/validation.d.ts +12 -49
  643. package/dist/src/utils/validation.js +26 -36
  644. package/docs/README.md +2 -2
  645. package/docs/configuration.md +163 -69
  646. package/docs/exit-codes.md +66 -49
  647. package/docs/furnace.md +20 -19
  648. package/docs/lifecycle-invariants.md +414 -247
  649. package/docs/machine-output.md +58 -34
  650. package/docs/patch-workflow.md +48 -44
  651. package/docs/run-logs.md +72 -28
  652. package/docs/testing.md +105 -98
  653. package/docs/verification-trees.md +23 -22
  654. package/package.json +7 -6
  655. package/dist/src/commands/rebase.d.ts +0 -4
  656. package/dist/src/commands/rebase.js +0 -5
  657. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  658. package/dist/src/core/patch-artifact-normalize.js +0 -24
  659. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  660. package/dist/src/core/patch-lint-reexports.js +0 -8
  661. package/dist/src/core/wire-targets.d.ts +0 -7
  662. package/dist/src/core/wire-targets.js +0 -8
@@ -1,21 +1,14 @@
1
1
  import { FireForgeError } from '../errors/base.js';
2
2
  import type { ProjectLicense } from '../types/config.js';
3
- /**
4
- * Error thrown when branding operations fail.
5
- */
6
- export declare class BrandingError extends FireForgeError {
7
- readonly code: 6;
8
- get userMessage(): string;
9
- }
10
3
  /**
11
4
  * Error thrown when the generated `mozconfig` references a `--with-branding`
12
5
  * directory that does not match the branding tree FireForge set up. The
13
- * mismatch is a silent-corruption hazard — `mach configure` picks the value
6
+ * mismatch is a silent-corruption hazard: `mach configure` picks the value
14
7
  * from mozconfig but the scaffolded branding lives elsewhere, so the build
15
8
  * fails deep inside moz.build resolution with a confusing "path does not
16
9
  * exist" message. Surface it as an actionable preflight instead.
17
10
  *
18
- * Setup renders templates under `configs/` with `${binaryName}` baked in; a
11
+ * Setup renders templates under `configs/` with `${binaryName}` baked in. A
19
12
  * later edit to `fireforge.json`'s `binaryName` (or a re-setup without
20
13
  * re-templating) leaves those names stale while `setupBranding` keeps using
21
14
  * the current value. Both directions produce the same class of build break.
@@ -44,8 +37,8 @@ export interface BrandingConfig {
44
37
  * Project license (from fireforge.json). Used to stamp the generated
45
38
  * `configure.sh`, `brand.properties`, and `brand.ftl` files with the
46
39
  * matching header so `patch-lint` does not flag them for
47
- * `missing-license-header` when the project is not MPL-2.0. Optional;
48
- * falls back to {@link DEFAULT_LICENSE}.
40
+ * `missing-license-header` when the project is not MPL-2.0. Optional.
41
+ * Falls back to {@link DEFAULT_LICENSE}.
49
42
  */
50
43
  license?: ProjectLicense;
51
44
  }
@@ -54,7 +47,7 @@ export interface BrandingConfig {
54
47
  * `toolkit/moz.configure` composes `CFBundleIdentifier` as
55
48
  * `<--with-distribution-id>.<MOZ_MACBUNDLE_ID>` (the distribution id
56
49
  * defaults to `org.mozilla`), so branding `configure.sh` must carry only the
57
- * LEAF segment while the generated mozconfig carries the remainder as
50
+ * leaf segment while the generated mozconfig carries the remainder as
58
51
  * `--with-distribution-id`. Writing the full appId into `MOZ_MACBUNDLE_ID`
59
52
  * double-prefixes the shipped bundle id. Config validation guarantees a
60
53
  * reverse-domain id, so the split always has both halves.
@@ -4,11 +4,12 @@ import { FireForgeError } from '../errors/base.js';
4
4
  import { ExitCode } from '../errors/codes.js';
5
5
  import { copyDir, pathExists, readText, writeTextIfChanged } from '../utils/fs.js';
6
6
  import { warn } from '../utils/logger.js';
7
+ import { normalizePathSlashes } from '../utils/paths.js';
7
8
  import { DEFAULT_LICENSE, getLicenseHeader } from './license-headers.js';
8
9
  /**
9
10
  * Error thrown when branding operations fail.
10
11
  */
11
- export class BrandingError extends FireForgeError {
12
+ class BrandingError extends FireForgeError {
12
13
  code = ExitCode.PATCH_ERROR;
13
14
  get userMessage() {
14
15
  return `Branding Error: ${this.message}\n\nBranding is required to set MOZ_APP_VENDOR, MOZ_MACBUNDLE_ID, and other Firefox identity values.`;
@@ -17,12 +18,12 @@ export class BrandingError extends FireForgeError {
17
18
  /**
18
19
  * Error thrown when the generated `mozconfig` references a `--with-branding`
19
20
  * directory that does not match the branding tree FireForge set up. The
20
- * mismatch is a silent-corruption hazard — `mach configure` picks the value
21
+ * mismatch is a silent-corruption hazard: `mach configure` picks the value
21
22
  * from mozconfig but the scaffolded branding lives elsewhere, so the build
22
23
  * fails deep inside moz.build resolution with a confusing "path does not
23
24
  * exist" message. Surface it as an actionable preflight instead.
24
25
  *
25
- * Setup renders templates under `configs/` with `${binaryName}` baked in; a
26
+ * Setup renders templates under `configs/` with `${binaryName}` baked in. A
26
27
  * later edit to `fireforge.json`'s `binaryName` (or a re-setup without
27
28
  * re-templating) leaves those names stale while `setupBranding` keeps using
28
29
  * the current value. Both directions produce the same class of build break.
@@ -56,7 +57,7 @@ export class BrandingMozconfigMismatchError extends FireForgeError {
56
57
  * `toolkit/moz.configure` composes `CFBundleIdentifier` as
57
58
  * `<--with-distribution-id>.<MOZ_MACBUNDLE_ID>` (the distribution id
58
59
  * defaults to `org.mozilla`), so branding `configure.sh` must carry only the
59
- * LEAF segment while the generated mozconfig carries the remainder as
60
+ * leaf segment while the generated mozconfig carries the remainder as
60
61
  * `--with-distribution-id`. Writing the full appId into `MOZ_MACBUNDLE_ID`
61
62
  * double-prefixes the shipped bundle id. Config validation guarantees a
62
63
  * reverse-domain id, so the split always has both halves.
@@ -361,7 +362,7 @@ export async function isBrandingSetup(engineDir, config) {
361
362
  * @returns true if the path is managed by branding tooling
362
363
  */
363
364
  export function isBrandingManagedPath(file, binaryName) {
364
- const normalized = file.replace(/\\/g, '/');
365
+ const normalized = normalizePathSlashes(file);
365
366
  const brandingRoot = `browser/branding/${binaryName}`;
366
367
  return (normalized === 'browser/moz.configure' ||
367
368
  normalized === brandingRoot ||
@@ -30,7 +30,7 @@ export interface WireOptions {
30
30
  * replacement path here.
31
31
  */
32
32
  domTargetPath?: string | undefined;
33
- /** Dry run — don't write any files */
33
+ /** Dry run: don't write any files */
34
34
  dryRun?: boolean | undefined;
35
35
  /** Insert init block after the block containing this name */
36
36
  after?: string | undefined;
@@ -4,11 +4,14 @@ import { GeneralError } from '../errors/base.js';
4
4
  import { toError } from '../utils/errors.js';
5
5
  import { verbose } from '../utils/logger.js';
6
6
  import { toRootRelativePath } from '../utils/paths.js';
7
+ import { normalizePathSlashes } from '../utils/paths.js';
7
8
  import { getProjectPaths, loadConfig } from './config.js';
8
9
  import { assertSnapshotted, createRollbackJournal, restoreRollbackJournal, snapshotFile, } from './furnace-rollback.js';
9
10
  import { registerBrowserContent } from './moz-manifest-register.js';
10
- import { DEFAULT_DOM_TARGET } from './wire-dom-fragment.js';
11
- import { addDestroyToBrowserInit, addDomFragment, addInitToBrowserInit, addSubscriptToBrowserMain, } from './wire-targets.js';
11
+ import { addDestroyToBrowserInit } from './wire-destroy.js';
12
+ import { addDomFragment, DEFAULT_DOM_TARGET } from './wire-dom-fragment.js';
13
+ import { addInitToBrowserInit } from './wire-init.js';
14
+ import { addSubscriptToBrowserMain } from './wire-subscript.js';
12
15
  export const DEFAULT_BROWSER_SUBSCRIPT_DIR = 'browser/base/content';
13
16
  const BROWSER_BASE_DIR = 'browser/base';
14
17
  /**
@@ -25,7 +28,7 @@ export async function wireSubscript(root, name, options = {}) {
25
28
  // Compute jar.mn source path relative to browser/base/
26
29
  let jarMnSourcePath;
27
30
  if (subscriptDir !== DEFAULT_BROWSER_SUBSCRIPT_DIR) {
28
- const relPath = relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir)).replace(/\\/g, '/');
31
+ const relPath = normalizePathSlashes(relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir)));
29
32
  jarMnSourcePath = `${relPath}/${name}.js`;
30
33
  }
31
34
  if (options.dryRun) {
@@ -83,9 +86,9 @@ export async function wireSubscript(root, name, options = {}) {
83
86
  let initAdded = false;
84
87
  if (options.init) {
85
88
  // The snapshot above is taken when init or destroy is `!== undefined`
86
- // while these writes fire on truthiness — close, but two separate
87
- // conditions over the same file, which is exactly the pairing that
88
- // drifts when a third writer is added later.
89
+ // while these writes fire on truthiness. Close, but two separate
90
+ // conditions over the same file, and that kind of pairing drifts when
91
+ // a third writer is added later.
89
92
  assertSnapshotted(journal, join(engineDir, 'browser/base/content/browser-init.js'), 'browser wire init');
90
93
  initAdded = await addInitToBrowserInit(engineDir, options.init, options.after, marker);
91
94
  }
@@ -116,7 +119,7 @@ export async function wireSubscript(root, name, options = {}) {
116
119
  // original wire failure and the rollback failure so the operator knows
117
120
  // the engine may be in a partially-wired state that needs manual
118
121
  // attention. The original error's message is preserved so the user sees
119
- // *why* the wire failed (e.g. "Could not find insertion point in chrome
122
+ // why the wire failed (e.g. "Could not find insertion point in chrome
120
123
  // document") alongside any rollback diagnosis.
121
124
  const originalMessage = toError(error).message;
122
125
  try {
@@ -25,10 +25,10 @@ export declare function findEnclosingGate(content: string, basename: string): st
25
25
  /**
26
26
  * Determines whether the given source file is gated off on the current
27
27
  * host by an enclosing `if CONFIG[...]:` block in its owning moz.build,
28
- * OR by a path-convention rule for installer-tree subdirectories that
28
+ * or by a path-convention rule for installer-tree subdirectories that
29
29
  * are packaged via Makefile.in recipes the audit does not parse.
30
- * Returns `gatedOff: false` and no expression when no gate is found —
31
- * the file is not platform-restricted, so the caller should audit it
30
+ * Returns `gatedOff: false` and no expression when no gate is found. The
31
+ * file is not platform-restricted, so the caller should audit it
32
32
  * normally.
33
33
  *
34
34
  * @param engineDir Absolute path to the engine root
@@ -36,3 +36,32 @@ export declare function findEnclosingGate(content: string, basename: string): st
36
36
  * @returns Detection result
37
37
  */
38
38
  export declare function detectPlatformGate(engineDir: string, sourcePath: string): Promise<PlatformGateResult>;
39
+ /**
40
+ * Result of an ancestor `DIRS +=` gate lookup.
41
+ */
42
+ export interface AncestorDirsGateResult {
43
+ /** True when an ancestor's `DIRS` entry is gated off on this host. */
44
+ gatedOff: boolean;
45
+ /** The gate expression that excluded the directory. */
46
+ gateExpression?: string;
47
+ /** Engine-relative path of the `moz.build` carrying the gate. */
48
+ gateFile?: string;
49
+ }
50
+ /**
51
+ * Determines whether the source file's directory is excluded from this
52
+ * build by a gate in an ancestor `moz.build`.
53
+ *
54
+ * `detectPlatformGate` reads only the file's own nearest `moz.build`, which
55
+ * misses the common Firefox shape where the whole subtree is reached
56
+ * through a conditional `DIRS +=` one or more levels up: nothing in
57
+ * `toolkit/mozapps/defaultagent/moz.build` says "Windows only", yet none of
58
+ * it is built on macOS.
59
+ *
60
+ * Errs toward not skipping, like the rest of this module: an unreadable or
61
+ * oversized ancestor, or a directory no `DIRS` entry names, yields
62
+ * `gatedOff: false`.
63
+ *
64
+ * @param engineDir - Absolute path to the engine root
65
+ * @param sourcePath - Engine-relative POSIX path of the source file
66
+ */
67
+ export declare function detectAncestorDirsGate(engineDir: string, sourcePath: string): Promise<AncestorDirsGateResult>;
@@ -6,35 +6,36 @@
6
6
  * `if CONFIG["MAKENSISU"]:` (Windows-only stubinstaller) or
7
7
  * `if CONFIG["OS_TARGET"] == "Darwin":` (macOS-only artwork). On a host that
8
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
9
+ * build, so they cannot appear under `dist/`. Without this detection the
10
10
  * audit warns about every gated file on every off-platform build.
11
11
  *
12
12
  * Two gate sources are consulted, in order:
13
13
  * 1. Python-style `if CONFIG[...]:` blocks in the owning `moz.build`.
14
- * 2. Path-convention gates — certain directory fragments are packaged by
14
+ * 2. Path-convention gates: certain directory fragments are packaged by
15
15
  * platform-specific Makefile.in / NSIS recipes that FireForge does not
16
16
  * parse, so a file under `browser/installer/windows/` or any
17
17
  * `/stubinstaller/` subtree is Windows-only regardless of what its
18
18
  * nearest moz.build says.
19
19
  *
20
- * The detection is intentionally lightweight: walk up from the source file
20
+ * The detection is lightweight: walk up from the source file
21
21
  * to the closest `moz.build`, scan it for the source basename inside an
22
22
  * `if CONFIG[...]:` block, and check whether the gate matches the host. The
23
23
  * path-convention pass runs only when no moz.build gate is found, so an
24
24
  * explicit gate always wins.
25
25
  *
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.
26
+ * Best-effort. False negatives (missing a gate and warning anyway) are
27
+ * tolerable because the audit is warn-only. False positives (skipping a file
28
+ * that should ship on this host) are not tolerable, so it errs toward not
29
+ * skipping when uncertain.
30
30
  */
31
+ import { stat } from 'node:fs/promises';
31
32
  import { dirname, join } from 'node:path';
32
33
  import { pathExists, readText } from '../utils/fs.js';
33
34
  import { getPlatform } from '../utils/platform.js';
34
35
  import { escapeRegex } from '../utils/regex.js';
35
36
  /**
36
37
  * Tokens that uniquely identify a Windows-only `if CONFIG[...]:` block.
37
- * `MAKENSISU` is the Windows stubinstaller compiler; `OS_TARGET ==
38
+ * `MAKENSISU` is the Windows stubinstaller compiler. `OS_TARGET ==
38
39
  * "WINNT"` and `MOZ_WIDGET_TOOLKIT == "windows"` are the conventional
39
40
  * platform discriminators.
40
41
  */
@@ -52,7 +53,7 @@ function isGateOffHost(expression, host) {
52
53
  const matchesDarwin = DARWIN_ONLY_GATE_TOKENS.some((t) => expression.includes(t));
53
54
  const matchesLinux = LINUX_ONLY_GATE_TOKENS.some((t) => expression.includes(t));
54
55
  // Negation gates (`!= "WINNT"`, `not CONFIG["MAKENSISU"]`) flip the
55
- // semantics. Keep this conservative — if we cannot confidently parse
56
+ // semantics. Keep this conservative: if we cannot confidently parse
56
57
  // a negation, return false so we don't wrongly suppress a warning.
57
58
  const negated = /\bnot\b|!=/.test(expression);
58
59
  if (negated)
@@ -68,7 +69,7 @@ function isGateOffHost(expression, host) {
68
69
  /**
69
70
  * Walks from a starting directory up to (but not above) the engine root,
70
71
  * yielding the first `moz.build` encountered. Returns undefined when no
71
- * ancestor has one — typically only for files that live above any
72
+ * ancestor has one, typically only for files that live above any
72
73
  * moz.build entry point, which would not be packageable anyway.
73
74
  */
74
75
  async function findOwningMozBuild(engineDir, sourceDir) {
@@ -184,10 +185,10 @@ function findPathConventionGate(sourcePath) {
184
185
  /**
185
186
  * Determines whether the given source file is gated off on the current
186
187
  * host by an enclosing `if CONFIG[...]:` block in its owning moz.build,
187
- * OR by a path-convention rule for installer-tree subdirectories that
188
+ * or by a path-convention rule for installer-tree subdirectories that
188
189
  * are packaged via Makefile.in recipes the audit does not parse.
189
- * Returns `gatedOff: false` and no expression when no gate is found —
190
- * the file is not platform-restricted, so the caller should audit it
190
+ * Returns `gatedOff: false` and no expression when no gate is found. The
191
+ * file is not platform-restricted, so the caller should audit it
191
192
  * normally.
192
193
  *
193
194
  * @param engineDir Absolute path to the engine root
@@ -231,3 +232,142 @@ export async function detectPlatformGate(engineDir, sourcePath) {
231
232
  }
232
233
  return { gatedOff: false };
233
234
  }
235
+ /**
236
+ * Maximum ancestor levels walked looking for a gating `DIRS` entry, and the
237
+ * largest `moz.build` read while doing it. The audit runs on every build, so
238
+ * a pathological tree must not be able to make it slow. Beyond these bounds
239
+ * the walk gives up and the caller keeps today's behaviour (warn).
240
+ */
241
+ const MAX_ANCESTOR_DEPTH = 12;
242
+ const MAX_MOZ_BUILD_BYTES = 256 * 1024;
243
+ /** Matches a line that begins a `DIRS` assignment. */
244
+ const DIRS_ASSIGNMENT_PATTERN = /^\s*DIRS\s*\+?=/;
245
+ /**
246
+ * Collects the full stack of `if CONFIG[…]:` expressions enclosing the
247
+ * `DIRS` entry whose value equals `relDir`.
248
+ *
249
+ * Two differences from {@link findEnclosingGate}, both load-bearing here:
250
+ * only quoted values inside a `DIRS` assignment are considered (an
251
+ * unrelated string literal elsewhere in the file must not gate a
252
+ * directory), and every enclosing expression is returned rather than the
253
+ * innermost. Firefox nests these: `toolkit/moz.build` reaches
254
+ * `mozapps/defaultagent` inside `OS_ARCH == "WINNT"`, then a `CC_TYPE`
255
+ * test, then `MOZ_DEFAULT_BROWSER_AGENT`, and it is the outermost one that
256
+ * excludes the directory on a macOS host.
257
+ *
258
+ * @param content - `moz.build` file content
259
+ * @param relDir - Directory path relative to the `moz.build`, POSIX-separated
260
+ * @returns Enclosing gate expressions, outermost first. Empty when ungated
261
+ * or when no `DIRS` entry reaches `relDir`
262
+ */
263
+ function findDirsEntryGates(content, relDir) {
264
+ const lines = content.split('\n');
265
+ const stack = [];
266
+ let inDirs = false;
267
+ for (const line of lines) {
268
+ if (line.trim() === '')
269
+ continue;
270
+ const indent = (/^(\s*)/.exec(line)?.[1] ?? '').length;
271
+ while (stack.length > 0) {
272
+ const top = stack[stack.length - 1];
273
+ if (top && indent <= top.indent) {
274
+ stack.pop();
275
+ continue;
276
+ }
277
+ break;
278
+ }
279
+ const ifMatch = /^\s*if\s+(.+?):\s*(?:#.*)?$/.exec(line);
280
+ if (ifMatch?.[1]) {
281
+ stack.push({ indent, expression: ifMatch[1] });
282
+ inDirs = false;
283
+ continue;
284
+ }
285
+ if (DIRS_ASSIGNMENT_PATTERN.test(line)) {
286
+ // A `DIRS += [` list body continues on later lines. A single-line
287
+ // `DIRS += ["x"]` is fully handled by the match below.
288
+ inDirs = !line.includes(']');
289
+ if (dirsLineNames(line, relDir))
290
+ return stack.map((entry) => entry.expression);
291
+ continue;
292
+ }
293
+ if (inDirs) {
294
+ if (dirsLineNames(line, relDir))
295
+ return stack.map((entry) => entry.expression);
296
+ if (line.includes(']'))
297
+ inDirs = false;
298
+ }
299
+ }
300
+ return undefined;
301
+ }
302
+ /** True when `line` carries `relDir` as a quoted value. */
303
+ function dirsLineNames(line, relDir) {
304
+ const escaped = escapeRegex(relDir.replace(/\/+$/, ''));
305
+ return new RegExp(`["']${escaped}\\/?["']`).test(line);
306
+ }
307
+ /**
308
+ * Determines whether the source file's directory is excluded from this
309
+ * build by a gate in an ancestor `moz.build`.
310
+ *
311
+ * `detectPlatformGate` reads only the file's own nearest `moz.build`, which
312
+ * misses the common Firefox shape where the whole subtree is reached
313
+ * through a conditional `DIRS +=` one or more levels up: nothing in
314
+ * `toolkit/mozapps/defaultagent/moz.build` says "Windows only", yet none of
315
+ * it is built on macOS.
316
+ *
317
+ * Errs toward not skipping, like the rest of this module: an unreadable or
318
+ * oversized ancestor, or a directory no `DIRS` entry names, yields
319
+ * `gatedOff: false`.
320
+ *
321
+ * @param engineDir - Absolute path to the engine root
322
+ * @param sourcePath - Engine-relative POSIX path of the source file
323
+ */
324
+ export async function detectAncestorDirsGate(engineDir, sourcePath) {
325
+ let host;
326
+ try {
327
+ host = getPlatform();
328
+ }
329
+ catch {
330
+ return { gatedOff: false };
331
+ }
332
+ const segments = sourcePath.split('/').filter(Boolean);
333
+ // Drop the basename: the walk is over directories.
334
+ segments.pop();
335
+ const root = engineDir.replace(/[/\\]+$/, '');
336
+ const depth = Math.min(segments.length, MAX_ANCESTOR_DEPTH);
337
+ // Start at the immediate parent of the file's directory and walk up, so
338
+ // the nearest gating ancestor is found first.
339
+ for (let cut = segments.length - 1; cut >= segments.length - depth; cut -= 1) {
340
+ const ancestorSegments = segments.slice(0, cut);
341
+ const relDir = segments.slice(cut).join('/');
342
+ if (relDir === '')
343
+ continue;
344
+ const mozBuild = join(root, ...ancestorSegments, 'moz.build');
345
+ if (!(await pathExists(mozBuild)))
346
+ continue;
347
+ let content;
348
+ try {
349
+ const stats = await stat(mozBuild);
350
+ if (stats.size > MAX_MOZ_BUILD_BYTES)
351
+ continue;
352
+ content = await readText(mozBuild);
353
+ }
354
+ catch {
355
+ continue;
356
+ }
357
+ const gates = findDirsEntryGates(content, relDir);
358
+ if (gates === undefined)
359
+ continue;
360
+ const offHost = gates.find((expression) => isGateOffHost(expression, host));
361
+ if (offHost !== undefined) {
362
+ return {
363
+ gatedOff: true,
364
+ gateExpression: offHost,
365
+ gateFile: [...ancestorSegments, 'moz.build'].join('/'),
366
+ };
367
+ }
368
+ // The directory is reached from here and this host passes every gate.
369
+ // A further ancestor cannot un-reach it.
370
+ return { gatedOff: false };
371
+ }
372
+ return { gatedOff: false };
373
+ }
@@ -32,7 +32,7 @@ export declare function parseJarMnEntry(line: string): {
32
32
  /**
33
33
  * Scans a jar.mn file's contents for an entry whose source reference
34
34
  * matches `relativeSource` (POSIX, relative to the jar.mn directory).
35
- * Returns the first match; jar.mn enforces uniqueness of `(source)` in
35
+ * Returns the first match. jar.mn enforces uniqueness of `(source)` in
36
36
  * practice, so a first-match wins behaviour is adequate.
37
37
  */
38
38
  export declare function findJarMnEntryForSource(content: string, relativeSource: string): {
@@ -44,14 +44,14 @@ export declare function findJarMnEntryForSource(content: string, relativeSource:
44
44
  * the first jar.mn entry that registers the given source. Returns undefined
45
45
  * when no ancestor jar.mn claims the source.
46
46
  *
47
- * @param engineDir Absolute engine root; walk halts here.
47
+ * @param engineDir Absolute engine root. The walk halts here.
48
48
  * @param source Engine-relative POSIX source path.
49
49
  */
50
50
  export declare function findRegisteredTarget(engineDir: string, source: string): Promise<RegistrationHit | undefined>;
51
51
  /**
52
52
  * Probes the dist tree for the artifact registered against the given
53
53
  * source. Returns the matched candidate and the registration hit that
54
- * anchored it; undefined when the source has no owning jar.mn or when
54
+ * anchored it. Undefined when the source has no owning jar.mn or when
55
55
  * no same-basename candidate under the search roots ends with the
56
56
  * registered target path.
57
57
  *
@@ -69,8 +69,8 @@ export declare function findRegisteredTarget(engineDir: string, source: string):
69
69
  export declare function resolveArtifactByRegistration(engineDir: string, source: string, searchRoots: readonly string[]): Promise<RegistrationProbeResult | undefined>;
70
70
  /**
71
71
  * Returns the absolute paths of every same-basename candidate under the
72
- * given search roots. Used by the audit to enumerate ALL false-match
73
- * candidates when the heuristic fallback downgrades to "missing" — the
72
+ * given search roots. Used by the audit to enumerate all false-match
73
+ * candidates when the heuristic fallback downgrades to "missing". The
74
74
  * operator needs to see the full set, not just the scorer's pick, to
75
75
  * distinguish a registration bug from a genuine packaging drop.
76
76
  *
@@ -18,13 +18,14 @@
18
18
  * report an unambiguous "registered but not packaged" miss when none exists.
19
19
  *
20
20
  * When no jar.mn registration is found, the caller falls back to the
21
- * similarity heuristic — which covers sources registered through moz.build
21
+ * similarity heuristic, which covers sources registered through moz.build
22
22
  * (`FINAL_TARGET_FILES`, `JS_PREFERENCE_FILES`) or `package-manifest.in`.
23
23
  * Parsing every Firefox registration surface would bloat the audit, and the
24
24
  * heuristic's weak case is surfaced to the operator in the warning copy.
25
25
  */
26
26
  import { basename, dirname, join, relative, sep } from 'node:path';
27
27
  import { pathExists, readText } from '../utils/fs.js';
28
+ import { normalizePathSlashes } from '../utils/paths.js';
28
29
  import { findAllByBasename } from './build-audit-resolve.js';
29
30
  /** Ceiling on ancestor-directory hops when searching for an owning jar.mn. */
30
31
  const MAX_JAR_MN_SCAN_DEPTH = 8;
@@ -61,11 +62,11 @@ export function parseJarMnEntry(line) {
61
62
  /**
62
63
  * Scans a jar.mn file's contents for an entry whose source reference
63
64
  * matches `relativeSource` (POSIX, relative to the jar.mn directory).
64
- * Returns the first match; jar.mn enforces uniqueness of `(source)` in
65
+ * Returns the first match. jar.mn enforces uniqueness of `(source)` in
65
66
  * practice, so a first-match wins behaviour is adequate.
66
67
  */
67
68
  export function findJarMnEntryForSource(content, relativeSource) {
68
- const normalized = relativeSource.replace(/\\/g, '/');
69
+ const normalized = normalizePathSlashes(relativeSource);
69
70
  for (const line of content.split('\n')) {
70
71
  const parsed = parseJarMnEntry(line);
71
72
  if (!parsed)
@@ -80,7 +81,7 @@ export function findJarMnEntryForSource(content, relativeSource) {
80
81
  * the first jar.mn entry that registers the given source. Returns undefined
81
82
  * when no ancestor jar.mn claims the source.
82
83
  *
83
- * @param engineDir Absolute engine root; walk halts here.
84
+ * @param engineDir Absolute engine root. The walk halts here.
84
85
  * @param source Engine-relative POSIX source path.
85
86
  */
86
87
  export async function findRegisteredTarget(engineDir, source) {
@@ -97,7 +98,7 @@ export async function findRegisteredTarget(engineDir, source) {
97
98
  content = await readText(jarMn);
98
99
  }
99
100
  catch {
100
- // An unreadable jar.mn contributes no registration hints; the resolver falls
101
+ // An unreadable jar.mn contributes no registration hints. The resolver falls
101
102
  // through to its other strategies.
102
103
  content = '';
103
104
  }
@@ -121,12 +122,12 @@ export async function findRegisteredTarget(engineDir, source) {
121
122
  * independent.
122
123
  */
123
124
  function toPosix(path) {
124
- return path.split(sep).join('/');
125
+ return normalizePathSlashes(path);
125
126
  }
126
127
  /**
127
128
  * Probes the dist tree for the artifact registered against the given
128
129
  * source. Returns the matched candidate and the registration hit that
129
- * anchored it; undefined when the source has no owning jar.mn or when
130
+ * anchored it. Undefined when the source has no owning jar.mn or when
130
131
  * no same-basename candidate under the search roots ends with the
131
132
  * registered target path.
132
133
  *
@@ -161,8 +162,8 @@ export async function resolveArtifactByRegistration(engineDir, source, searchRoo
161
162
  }
162
163
  /**
163
164
  * Returns the absolute paths of every same-basename candidate under the
164
- * given search roots. Used by the audit to enumerate ALL false-match
165
- * candidates when the heuristic fallback downgrades to "missing" — the
165
+ * given search roots. Used by the audit to enumerate all false-match
166
+ * candidates when the heuristic fallback downgrades to "missing". The
166
167
  * operator needs to see the full set, not just the scorer's pick, to
167
168
  * distinguish a registration bug from a genuine packaging drop.
168
169
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Heuristic test for "this looks like a packaged-test source file" — the
2
+ * Heuristic test for "this looks like a packaged-test source file". The
3
3
  * audit routes such paths to `_tests/` instead of `dist/`. Matches
4
4
  * mochitest / xpcshell / browser-chrome conventions: any source under a
5
5
  * `/test/` or `/tests/` directory, anywhere under a `testing/` subtree
@@ -27,7 +27,7 @@ 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 —
30
+ * Shared on purpose: this set governs two halves of one decision,
31
31
  * `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
32
32
  * `build-audit.ts`). When the halves kept separate copies they disagreed,
33
33
  * so a source path could earn a selection bonus for a segment that
@@ -44,14 +44,14 @@ export declare const GENERIC_PATH_SEGMENTS: ReadonlySet<string>;
44
44
  *
45
45
  * The bonus exists because Firefox packaging often re-roots files: a source
46
46
  * `branding/<name>/content/aboutDialog.css` lands at
47
- * `chrome/browser/content/branding/aboutDialog.css` — only the basename
47
+ * `chrome/browser/content/branding/aboutDialog.css`. Only the basename
48
48
  * trails-match, but the `branding` segment moved into the middle of the
49
49
  * candidate path. Without the bonus that candidate ties with the unrelated
50
50
  * `chrome/browser/content/browser/aboutDialog.css`.
51
51
  *
52
52
  * @param sourcePath Engine-relative POSIX path
53
53
  * @param candidatePath Absolute path under the dist tree
54
- * @returns Numeric score; higher means better match
54
+ * @returns Numeric score, where higher means better match
55
55
  */
56
56
  export declare function scoreCandidate(sourcePath: string, candidatePath: string): number;
57
57
  /**
@@ -69,7 +69,7 @@ export declare function findAllByBasename(root: string, name: string, maxDepth?:
69
69
  /**
70
70
  * Resolves the best-matching artifact for a source path under one or
71
71
  * more search roots. Returns the highest-scoring candidate by trailing
72
- * segment overlap; ties go to the first-found path (deterministic via
72
+ * segment overlap. Ties go to the first-found path (deterministic via
73
73
  * the directory-walk order). Returns undefined when no candidate exists.
74
74
  *
75
75
  * @param sourcePath Engine-relative POSIX source path
@@ -24,7 +24,7 @@ import { normalizePathSlashes } from '../utils/paths.js';
24
24
  /** Maximum directory depth to traverse when scanning a tree root. */
25
25
  const MAX_SCAN_DEPTH = 12;
26
26
  /**
27
- * Heuristic test for "this looks like a packaged-test source file" — the
27
+ * Heuristic test for "this looks like a packaged-test source file". The
28
28
  * audit routes such paths to `_tests/` instead of `dist/`. Matches
29
29
  * mochitest / xpcshell / browser-chrome conventions: any source under a
30
30
  * `/test/` or `/tests/` directory, anywhere under a `testing/` subtree
@@ -59,7 +59,7 @@ export function isTestPath(sourcePath) {
59
59
  *
60
60
  * Separators are normalized first because the candidates come from `join()`
61
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
62
+ * which a `/`-only split collapses into a single segment. Every candidate then
63
63
  * scores the same, so the trailing-overlap heuristic that disambiguates
64
64
  * same-basename artifacts (`branding/…/aboutDialog.css` versus
65
65
  * `browser/…/aboutDialog.css`) silently picks an arbitrary one.
@@ -94,7 +94,7 @@ export function countTrailingSegmentMatches(a, b) {
94
94
  /**
95
95
  * Path segments too common to identify an artifact on their own.
96
96
  *
97
- * Shared deliberately: this set governs two halves of ONE decision —
97
+ * Shared on purpose: this set governs two halves of one decision,
98
98
  * `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
99
99
  * `build-audit.ts`). When the halves kept separate copies they disagreed,
100
100
  * so a source path could earn a selection bonus for a segment that
@@ -129,14 +129,14 @@ export const GENERIC_PATH_SEGMENTS = new Set([
129
129
  *
130
130
  * The bonus exists because Firefox packaging often re-roots files: a source
131
131
  * `branding/<name>/content/aboutDialog.css` lands at
132
- * `chrome/browser/content/branding/aboutDialog.css` — only the basename
132
+ * `chrome/browser/content/branding/aboutDialog.css`. Only the basename
133
133
  * trails-match, but the `branding` segment moved into the middle of the
134
134
  * candidate path. Without the bonus that candidate ties with the unrelated
135
135
  * `chrome/browser/content/browser/aboutDialog.css`.
136
136
  *
137
137
  * @param sourcePath Engine-relative POSIX path
138
138
  * @param candidatePath Absolute path under the dist tree
139
- * @returns Numeric score; higher means better match
139
+ * @returns Numeric score, where higher means better match
140
140
  */
141
141
  export function scoreCandidate(sourcePath, candidatePath) {
142
142
  const trailing = countTrailingSegmentMatches(sourcePath, candidatePath);
@@ -210,7 +210,7 @@ export async function findAllByBasename(root, name, maxDepth = MAX_SCAN_DEPTH) {
210
210
  /**
211
211
  * Resolves the best-matching artifact for a source path under one or
212
212
  * more search roots. Returns the highest-scoring candidate by trailing
213
- * segment overlap; ties go to the first-found path (deterministic via
213
+ * segment overlap. Ties go to the first-found path (deterministic via
214
214
  * the directory-walk order). Returns undefined when no candidate exists.
215
215
  *
216
216
  * @param sourcePath Engine-relative POSIX source path