@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
@@ -2,21 +2,21 @@
2
2
  * Binary-aware drift classification for patch-owned files.
3
3
  *
4
4
  * The text classifier compares utf-8 decoded content against
5
- * `computePatchedContent`, which cannot apply `GIT binary patch` bodies — so
5
+ * `computePatchedContent`, which cannot apply `GIT binary patch` bodies, so
6
6
  * a binary file exported into a patch classifies as `patch-owned-drift`
7
7
  * forever, keeping the engine-clean gate permanently red with nothing
8
- * actually un-durable. A `GIT binary patch` section DOES carry the ground
8
+ * actually un-durable. A `GIT binary patch` section does carry the ground
9
9
  * truth: `git diff --binary` always records full blob hashes on the section's
10
10
  * `index <old>..<new>` line. Comparing the live file's `git hash-object`
11
11
  * against the last owning section's new-side hash settles the classification
12
12
  * exactly. Bodies without a usable hash (hand-written diffs) classify as
13
- * `binary-unsupported` — an honest "cannot compare" instead of a false "not
13
+ * `binary-unsupported`: an honest "cannot compare" instead of a false "not
14
14
  * durable".
15
15
  *
16
- * That hash is trusted ONLY when the section carries a replayable payload
16
+ * That hash is trusted only when the section carries a replayable payload
17
17
  * (`hasBinaryDelta`). A `Binary files … differ` stub carries a correct index
18
18
  * line too, so hashing against it reports `patch-backed` for a body that
19
- * cannot rebuild the file at all — precisely the dishonesty this module
19
+ * cannot rebuild the file at all, which is the dishonesty this module
20
20
  * exists to avoid. Such a body is `binary-unsupported` here, and an error
21
21
  * from the `binary-body-not-reconstructable` queue lint.
22
22
  *
@@ -40,8 +40,8 @@ export interface BinaryClassifiedFile {
40
40
  }
41
41
  /**
42
42
  * Classifies a single-owner file whose comparison is binary. Returns
43
- * `null` when the comparison is NOT binary — the live file is text and
44
- * (for deletions) the owning section is text — so the caller falls
43
+ * `null` when the comparison is not binary (the live file is text and,
44
+ * for deletions, the owning section is text), so the caller falls
45
45
  * through to the existing utf-8 content comparison unchanged.
46
46
  *
47
47
  * @param args.fileMissing - True when the porcelain status reports the
@@ -57,6 +57,6 @@ export declare function classifyBinaryOwnedFile(args: {
57
57
  matchClassification: 'patch-backed' | 'furnace';
58
58
  owner: string;
59
59
  fileMissing?: boolean;
60
- /** Batched lookup; when absent, falls back to per-file manifest queries. */
60
+ /** Batched lookup. When absent, falls back to per-file manifest queries. */
61
61
  lookup?: AffectingPatchLookup;
62
62
  }): Promise<BinaryClassifiedFile | null>;
@@ -3,21 +3,21 @@
3
3
  * Binary-aware drift classification for patch-owned files.
4
4
  *
5
5
  * The text classifier compares utf-8 decoded content against
6
- * `computePatchedContent`, which cannot apply `GIT binary patch` bodies — so
6
+ * `computePatchedContent`, which cannot apply `GIT binary patch` bodies, so
7
7
  * a binary file exported into a patch classifies as `patch-owned-drift`
8
8
  * forever, keeping the engine-clean gate permanently red with nothing
9
- * actually un-durable. A `GIT binary patch` section DOES carry the ground
9
+ * actually un-durable. A `GIT binary patch` section does carry the ground
10
10
  * truth: `git diff --binary` always records full blob hashes on the section's
11
11
  * `index <old>..<new>` line. Comparing the live file's `git hash-object`
12
12
  * against the last owning section's new-side hash settles the classification
13
13
  * exactly. Bodies without a usable hash (hand-written diffs) classify as
14
- * `binary-unsupported` — an honest "cannot compare" instead of a false "not
14
+ * `binary-unsupported`: an honest "cannot compare" instead of a false "not
15
15
  * durable".
16
16
  *
17
- * That hash is trusted ONLY when the section carries a replayable payload
17
+ * That hash is trusted only when the section carries a replayable payload
18
18
  * (`hasBinaryDelta`). A `Binary files … differ` stub carries a correct index
19
19
  * line too, so hashing against it reports `patch-backed` for a body that
20
- * cannot rebuild the file at all — precisely the dishonesty this module
20
+ * cannot rebuild the file at all, which is the dishonesty this module
21
21
  * exists to avoid. Such a body is `binary-unsupported` here, and an error
22
22
  * from the `binary-body-not-reconstructable` queue lint.
23
23
  *
@@ -35,7 +35,7 @@ import { parseDiffSections } from './patch-parse.js';
35
35
  /** Finds the LAST diff section affecting `file` across the owning patches, in queue order. */
36
36
  async function findLastAffectingSection(patchesDir, file, lookup) {
37
37
  // The lookup shares one manifest load + memoized body reads across the
38
- // whole classification batch; the fallback keeps single-file callers
38
+ // whole classification batch. The fallback keeps single-file callers
39
39
  // (and existing direct tests) working without a context.
40
40
  const patches = lookup !== undefined
41
41
  ? lookup.getAffectingPatches(file)
@@ -53,8 +53,8 @@ async function findLastAffectingSection(patchesDir, file, lookup) {
53
53
  }
54
54
  /**
55
55
  * Classifies a single-owner file whose comparison is binary. Returns
56
- * `null` when the comparison is NOT binary — the live file is text and
57
- * (for deletions) the owning section is text — so the caller falls
56
+ * `null` when the comparison is not binary (the live file is text and,
57
+ * for deletions, the owning section is text), so the caller falls
58
58
  * through to the existing utf-8 content comparison unchanged.
59
59
  *
60
60
  * @param args.fileMissing - True when the porcelain status reports the
@@ -68,8 +68,8 @@ export async function classifyBinaryOwnedFile(args) {
68
68
  classification: 'binary-unsupported',
69
69
  owner,
70
70
  });
71
- // Until the comparison is KNOWN to be binary, every failure defers to
72
- // the existing text path (`return null`) — classifying a text file as
71
+ // Until the comparison is known to be binary, every failure defers to
72
+ // the existing text path (`return null`). Classifying a text file as
73
73
  // `binary-unsupported` because a probe failed would hide real drift.
74
74
  let section;
75
75
  try {
@@ -89,12 +89,12 @@ export async function classifyBinaryOwnedFile(args) {
89
89
  try {
90
90
  if (section === undefined) {
91
91
  // Claimed in filesAffected but no diff section touches the file.
92
- // A missing file keeps the existing deletion logic; a live binary
92
+ // A missing file keeps the existing deletion logic. A live binary
93
93
  // has nothing recorded to compare against.
94
94
  return fileMissing ? null : unsupported();
95
95
  }
96
96
  if (!section.isBinary) {
97
- // Text section: deletions settle fine through the text path; a
97
+ // Text section: deletions settle fine through the text path. A
98
98
  // live binary against a text body has no comparable recording.
99
99
  return fileMissing ? null : unsupported();
100
100
  }
@@ -7,34 +7,34 @@
7
7
  */
8
8
  /**
9
9
  * Classification buckets for engine file changes:
10
- * - `patch-backed`: content matches the expected post-patch state — normal
10
+ * - `patch-backed`: content matches the expected post-patch state. Normal
11
11
  * after `fireforge import`.
12
12
  * - `patch-owned-drift`: the file is claimed by exactly one patch, but the
13
13
  * live engine content no longer matches that patch's expected post-apply
14
14
  * content. This includes furnace-prefixed paths: a path can be both
15
15
  * Furnace-managed and patch-claimed (export a deployed component, then
16
- * edit the workspace source and `furnace deploy` again — the deployed copy
17
- * now has content the patch body lacks). Checking the furnace prefix first
18
- * would bucket such files as `furnace` and report the stale patch as
19
- * owned.
20
- * - `unmanaged`: edits not explained by any patch or tool — local drift to
16
+ * edit the workspace source and `furnace deploy` again, and the deployed
17
+ * copy now has content the patch body lacks). Checking the furnace
18
+ * prefix first would bucket such files as `furnace` and report the stale
19
+ * patch as owned.
20
+ * - `unmanaged`: edits not explained by any patch or tool. Local drift to
21
21
  * export or discard.
22
22
  * - `branding`: files under tool-managed branding paths, written by
23
23
  * FireForge's branding pipeline.
24
24
  * - `furnace`: files under Furnace-managed component prefixes. When exactly
25
25
  * one patch also claims the path, this bucket asserts the live content
26
- * matches that patch's expected post-apply content — a mismatch is
26
+ * matches that patch's expected post-apply content. A mismatch is
27
27
  * reported as `patch-owned-drift` instead (see above).
28
28
  * - `conflict`: the file is claimed by two or more patches in
29
29
  * `patches.json`. The human `--ownership` mode surfaces this bucket as
30
- * `CONFLICT`; carrying the classification through the JSON pipeline lets
30
+ * `CONFLICT`. Carrying the classification through the JSON pipeline lets
31
31
  * machine consumers detect the same ownership breakage rather than seeing
32
32
  * it rolled into `unmanaged` as routine local drift.
33
33
  * - `binary-unsupported`: the file's comparison is binary and the owning
34
- * patch body records no usable blob hash to compare against — an honest
35
- * "binary — comparison unsupported" instead of a permanent false
36
- * `patch-owned-drift`. Deliberately NOT in the default `--check` fail set;
37
- * opt in with `--fail-on binary-unsupported`.
34
+ * patch body records no usable blob hash to compare against. It reports an
35
+ * honest "binary, comparison unsupported" instead of a permanent false
36
+ * `patch-owned-drift`. Not in the default `--check` fail set. Opt in
37
+ * with `--fail-on binary-unsupported`.
38
38
  */
39
39
  export type FileClassification = 'patch-backed' | 'patch-owned-drift' | 'unmanaged' | 'branding' | 'furnace' | 'conflict' | 'binary-unsupported';
40
40
  export interface StatusFile {
@@ -45,7 +45,7 @@ export interface ClassifiedFile extends StatusFile {
45
45
  classification: FileClassification;
46
46
  /**
47
47
  * Names of patch files that claim this path in `patches.json`.
48
- * Populated only when `classification === 'conflict'` — single-claim
48
+ * Populated only when `classification === 'conflict'`. Single-claim
49
49
  * patch-backed entries don't need to expose their owner because the
50
50
  * single claim is fully captured by the classification itself.
51
51
  */
@@ -54,14 +54,14 @@ export interface ClassifiedFile extends StatusFile {
54
54
  * Owning patch filename when exactly one patch claims this path
55
55
  * (patch-backed, patch-owned-drift, and single-owner furnace entries).
56
56
  * Unset for unowned, branding-generated, unowned-furnace, and conflict
57
- * entries — conflicts carry `claimedBy` instead. Exposed through
57
+ * entries. Conflicts carry `claimedBy` instead. Exposed through
58
58
  * `status --json` as the `patch` field.
59
59
  */
60
60
  owner?: string;
61
61
  }
62
62
  /**
63
63
  * Builds the file → owning-patch-filenames multimap from manifest rows.
64
- * Single source of truth for cross-patch claim detection — status
64
+ * Single source of truth for cross-patch claim detection: status
65
65
  * classification, verify's cross-claim check, and the ownership table all
66
66
  * consume this builder (they used to each rebuild it, one drift away from
67
67
  * disagreeing about what "claimed" means).
@@ -72,14 +72,14 @@ export declare function buildPatchClaims(manifestPatches: ReadonlyArray<{
72
72
  }>): Map<string, string[]>;
73
73
  /**
74
74
  * Reduces a two-character porcelain XY status to its primary code.
75
- * Single source of truth — status-output.ts renders from the same logic.
75
+ * Single source of truth, and status-output.ts renders from the same logic.
76
76
  */
77
77
  export declare function getPrimaryStatusCode(status: string): string;
78
78
  /**
79
79
  * True for the branding paths whose content FireForge generates itself
80
80
  * (configure.sh, brand.properties/ftl, browser/moz.configure). Unlike the
81
81
  * broader branding-root test, a brand-new unowned file under the branding
82
- * directory is NOT generated — it is a patch candidate and must stay
82
+ * directory is not generated: it is a patch candidate and must stay
83
83
  * visible as unmanaged (the Assets.car precedent).
84
84
  */
85
85
  export declare function isGeneratedBrandingPath(file: string, binaryName: string): boolean;
@@ -11,12 +11,13 @@ import { mapWithConcurrency } from '../utils/concurrency.js';
11
11
  import { toError } from '../utils/errors.js';
12
12
  import { readText } from '../utils/fs.js';
13
13
  import { verbose } from '../utils/logger.js';
14
+ import { normalizePathSlashes } from '../utils/paths.js';
14
15
  import { isBrandingManagedPath } from './branding.js';
15
16
  import { createPatchedContentContext } from './patch-apply.js';
16
17
  import { classifyBinaryOwnedFile } from './status-binary.js';
17
18
  /**
18
19
  * Builds the file → owning-patch-filenames multimap from manifest rows.
19
- * Single source of truth for cross-patch claim detection — status
20
+ * Single source of truth for cross-patch claim detection: status
20
21
  * classification, verify's cross-claim check, and the ownership table all
21
22
  * consume this builder (they used to each rebuild it, one drift away from
22
23
  * disagreeing about what "claimed" means).
@@ -34,7 +35,7 @@ export function buildPatchClaims(manifestPatches) {
34
35
  }
35
36
  /**
36
37
  * Reduces a two-character porcelain XY status to its primary code.
37
- * Single source of truth — status-output.ts renders from the same logic.
38
+ * Single source of truth, and status-output.ts renders from the same logic.
38
39
  */
39
40
  export function getPrimaryStatusCode(status) {
40
41
  if (status.includes('?'))
@@ -52,11 +53,11 @@ export function getPrimaryStatusCode(status) {
52
53
  * True for the branding paths whose content FireForge generates itself
53
54
  * (configure.sh, brand.properties/ftl, browser/moz.configure). Unlike the
54
55
  * broader branding-root test, a brand-new unowned file under the branding
55
- * directory is NOT generated — it is a patch candidate and must stay
56
+ * directory is not generated: it is a patch candidate and must stay
56
57
  * visible as unmanaged (the Assets.car precedent).
57
58
  */
58
59
  export function isGeneratedBrandingPath(file, binaryName) {
59
- const normalized = file.replace(/\\/g, '/');
60
+ const normalized = normalizePathSlashes(file);
60
61
  const brandingRoot = `browser/branding/${binaryName}`;
61
62
  return (normalized === 'browser/moz.configure' ||
62
63
  normalized === `${brandingRoot}/configure.sh` ||
@@ -66,15 +67,15 @@ export function isGeneratedBrandingPath(file, binaryName) {
66
67
  /**
67
68
  * Compares a single-owner file's live engine content against its owning
68
69
  * patch's expected post-apply content. `matchClassification` is what a
69
- * clean match reports — `patch-backed` for ordinary patch-claimed paths,
70
+ * clean match reports: `patch-backed` for ordinary patch-claimed paths,
70
71
  * `furnace` for furnace-prefixed paths so healthy deployed components
71
72
  * keep landing in the pinned furnace bucket. Any mismatch (including a
72
73
  * deletion the patch does not expect, or a failed comparison) reports
73
74
  * `patch-owned-drift`.
74
75
  */
75
76
  async function classifySingleOwnerFile(entry, engineDir, patchesDir, matchClassification, owner, ctx) {
76
- // Binary comparisons cannot go through the utf-8 content path below —
77
- // binary patch bodies parse to zero hunks, so the patched-content
77
+ // Binary comparisons cannot go through the utf-8 content path below.
78
+ // Binary patch bodies parse to zero hunks, so the patched-content
78
79
  // computation returned HEAD content unchanged and the comparison
79
80
  // reported `patch-owned-drift` forever. Settle by blob hash,
80
81
  // or classify explicitly as `binary-unsupported` when no hash exists.
@@ -99,7 +100,7 @@ async function classifySingleOwnerFile(entry, engineDir, patchesDir, matchClassi
99
100
  owner,
100
101
  };
101
102
  }
102
- // File exists on disk — compare actual vs expected
103
+ // File exists on disk: compare actual vs expected
103
104
  try {
104
105
  const [expected, actual] = await Promise.all([
105
106
  ctx.computePatched(entry.file),
@@ -129,7 +130,7 @@ async function classifySingleOwnerFile(entry, engineDir, patchesDir, matchClassi
129
130
  */
130
131
  export async function classifyFiles(files, engineDir, patchesDir, binaryName, furnacePrefixes) {
131
132
  // One manifest load + patch discovery + memoized body reads for the
132
- // whole batch — the previous per-file computation re-ran all three for
133
+ // whole batch. The previous per-file computation re-ran all three for
133
134
  // every dirty file (O(dirtyFiles × patches) redundant IO on a broad
134
135
  // engine edit session).
135
136
  const ctx = await createPatchedContentContext(patchesDir, engineDir);
@@ -149,14 +150,14 @@ export async function classifyFiles(files, engineDir, patchesDir, binaryName, fu
149
150
  ctx,
150
151
  };
151
152
  // Bounded pool over per-file classification (each single-owner file
152
- // spawns git); order preserved by the mapper. Per-file failures settle
153
+ // spawns git). Order preserved by the mapper. Per-file failures settle
153
154
  // inside classifySingleOwnerFile's catch, so one bad file never rejects
154
155
  // the batch.
155
156
  return mapWithConcurrency(files, CLASSIFY_CONCURRENCY, (entry) => classifyEntry(entry, deps));
156
157
  }
157
158
  /** Concurrency bound for per-file classification (matches import's guard). */
158
159
  const CLASSIFY_CONCURRENCY = 8;
159
- /** Classifies one status entry; extracted so the pool worker stays flat. */
160
+ /** Classifies one status entry. Extracted so the pool worker stays flat. */
160
161
  async function classifyEntry(entry, deps) {
161
162
  const { engineDir, patchesDir, binaryName, furnacePrefixes, patchClaims, ctx } = deps;
162
163
  const owners = patchClaims.get(entry.file);
@@ -208,7 +209,7 @@ async function classifyEntry(entry, deps) {
208
209
  if (!owners) {
209
210
  return { ...entry, classification: 'unmanaged' };
210
211
  }
211
- // File is claimed by exactly one patch — compare content.
212
+ // File is claimed by exactly one patch: compare content.
212
213
  const owner = owners[0];
213
214
  if (owner === undefined) {
214
215
  return { ...entry, classification: 'unmanaged' };
@@ -1,26 +1,26 @@
1
1
  /**
2
2
  * Recognizer for the one mochitest failure shape that is a function of run
3
- * LENGTH rather than of the code under test: the time-driven
3
+ * length rather than of the code under test: the time-driven
4
4
  * changed-preference checks.
5
5
  *
6
6
  * Separate from `test-harness-crash.ts` because it is not a crash
7
- * classification — the run failed, and the classifier's verdict is correct.
8
- * What this adds is which KIND of failure it was, which is a different
7
+ * classification. The run failed, and the classifier's verdict is correct.
8
+ * What this adds is which kind of failure it was, which is a different
9
9
  * question and one that only grows as more such shapes are recorded.
10
10
  */
11
11
  /**
12
- * Describes a failure set that consists ENTIRELY of changed-preference
12
+ * Describes a failure set that consists entirely of changed-preference
13
13
  * checks on {@link TIME_DRIVEN_PREF_NAMES}.
14
14
  *
15
- * Deliberately keyed on the pref NAMES rather than on the harness's phrasing
16
- * of its changed-preference report: the phrasing is upstream copy that has
17
- * no stable contract with us, and the names are the part that identifies the
18
- * shape. A single block that names anything else — a real assertion, a
19
- * different pref — disqualifies the whole set, because the point is to
20
- * describe a run whose every failure is this noise, never to explain away
21
- * one real failure sitting beside it.
15
+ * Keyed on the pref names rather than on the harness's phrasing of its
16
+ * changed-preference report: the phrasing is upstream copy that has no
17
+ * stable contract with us, and the names are the part that identifies the
18
+ * shape. A single block that names anything else (a real assertion, a
19
+ * different pref) disqualifies the whole set, so that this describes a run
20
+ * whose every failure is this noise, and never explains away one real
21
+ * failure sitting beside it.
22
22
  *
23
- * Pure; returns undefined when the shape does not apply.
23
+ * Pure. Returns undefined when the shape does not apply.
24
24
  *
25
25
  * @param output - Combined harness stdout+stderr
26
26
  * @returns Operator-facing explanation, or undefined
@@ -1,23 +1,23 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
3
  * Recognizer for the one mochitest failure shape that is a function of run
4
- * LENGTH rather than of the code under test: the time-driven
4
+ * length rather than of the code under test: the time-driven
5
5
  * changed-preference checks.
6
6
  *
7
7
  * Separate from `test-harness-crash.ts` because it is not a crash
8
- * classification — the run failed, and the classifier's verdict is correct.
9
- * What this adds is which KIND of failure it was, which is a different
8
+ * classification. The run failed, and the classifier's verdict is correct.
9
+ * What this adds is which kind of failure it was, which is a different
10
10
  * question and one that only grows as more such shapes are recorded.
11
11
  */
12
12
  import { collectUnexpectedFailureBlocks } from './test-harness-crash.js';
13
13
  /**
14
- * Preferences that move on their own as a function of how LONG a run takes,
14
+ * Preferences that move on their own as a function of how long a run takes,
15
15
  * not of what it tested.
16
16
  *
17
17
  * Both are time-driven: a long run crosses the cold-startup check interval
18
18
  * and the pref moves under the harness. The observable consequence is that
19
19
  * chunk length, not the change under test, decides whether the suite is
20
- * red — the same work at a smaller `--chunk` passes. FireForge cannot
20
+ * red. The same work at a smaller `--chunk` passes. FireForge cannot
21
21
  * suppress the check (it is the harness's, not ours) but it can stop the
22
22
  * pair being indistinguishable from two real assertion failures, which is
23
23
  * the whole cost of the shape.
@@ -29,23 +29,47 @@ const TIME_DRIVEN_PREF_NAMES = ['lastColdStartupCheck', 'globalprivacycontrol'];
29
29
  /** A failure block that is a changed-preference report rather than an assertion. */
30
30
  const CHANGED_PREF_BLOCK_PATTERN = /pref(?:erence)?s?\b/i;
31
31
  /**
32
- * Describes a failure set that consists ENTIRELY of changed-preference
32
+ * Describes a failure set that consists entirely of changed-preference
33
33
  * checks on {@link TIME_DRIVEN_PREF_NAMES}.
34
34
  *
35
- * Deliberately keyed on the pref NAMES rather than on the harness's phrasing
36
- * of its changed-preference report: the phrasing is upstream copy that has
37
- * no stable contract with us, and the names are the part that identifies the
38
- * shape. A single block that names anything else — a real assertion, a
39
- * different pref — disqualifies the whole set, because the point is to
40
- * describe a run whose every failure is this noise, never to explain away
41
- * one real failure sitting beside it.
35
+ * Keyed on the pref names rather than on the harness's phrasing of its
36
+ * changed-preference report: the phrasing is upstream copy that has no
37
+ * stable contract with us, and the names are the part that identifies the
38
+ * shape. A single block that names anything else (a real assertion, a
39
+ * different pref) disqualifies the whole set, so that this describes a run
40
+ * whose every failure is this noise, and never explains away one real
41
+ * failure sitting beside it.
42
42
  *
43
- * Pure; returns undefined when the shape does not apply.
43
+ * Pure. Returns undefined when the shape does not apply.
44
44
  *
45
45
  * @param output - Combined harness stdout+stderr
46
46
  * @returns Operator-facing explanation, or undefined
47
47
  */
48
48
  export function describeChangedPrefNoise(output) {
49
+ const namesSeen = matchedTimeDrivenPrefNames(output);
50
+ if (namesSeen === undefined)
51
+ return undefined;
52
+ return (`Every unexpected result in this run is a changed-preference check on ${[...namesSeen].join(' / ')}. ` +
53
+ 'Those preferences are TIME-DRIVEN: they move once a run is long enough to cross the ' +
54
+ 'cold-startup check interval, so they correlate with run LENGTH rather than with the ' +
55
+ 'change under test or with the build. The first probe is to halve the chunk size ' +
56
+ '(`--chunk 8` where a 40-row chunk tripped it) and see whether the same work passes; ' +
57
+ 'if it does, this was harness noise, not a regression. FireForge cannot forgive the ' +
58
+ 'check — it belongs to the harness — only tell you which kind of failure you are ' +
59
+ 'looking at.');
60
+ }
61
+ /** Failure blocks inspected before the changed-pref shape is abandoned. */
62
+ const CHANGED_PREF_BLOCK_LIMIT = 20;
63
+ /**
64
+ * The recognizer half of the shape, split from the formatting so a caller
65
+ * that only needs the yes/no answer does not build the ~500-character
66
+ * explanation to throw it away.
67
+ *
68
+ * @param output - Combined harness stdout+stderr
69
+ * @returns The time-driven pref names seen, or undefined when the shape does
70
+ * not apply
71
+ */
72
+ function matchedTimeDrivenPrefNames(output) {
49
73
  const blocks = collectUnexpectedFailureBlocks(output, CHANGED_PREF_BLOCK_LIMIT).filter((block) => !block.startsWith('…'));
50
74
  if (blocks.length === 0)
51
75
  return undefined;
@@ -59,20 +83,11 @@ export function describeChangedPrefNoise(output) {
59
83
  for (const name of matched)
60
84
  namesSeen.add(name);
61
85
  }
62
- return (`Every unexpected result in this run is a changed-preference check on ${[...namesSeen].join(' / ')}. ` +
63
- 'Those preferences are TIME-DRIVEN: they move once a run is long enough to cross the ' +
64
- 'cold-startup check interval, so they correlate with run LENGTH rather than with the ' +
65
- 'change under test or with the build. The first probe is to halve the chunk size ' +
66
- '(`--chunk 8` where a 40-row chunk tripped it) and see whether the same work passes; ' +
67
- 'if it does, this was harness noise, not a regression. FireForge cannot forgive the ' +
68
- 'check — it belongs to the harness — only tell you which kind of failure you are ' +
69
- 'looking at.');
86
+ return namesSeen;
70
87
  }
71
- /** Failure blocks inspected before the changed-pref shape is abandoned. */
72
- const CHANGED_PREF_BLOCK_LIMIT = 20;
73
88
  /** Short verdict-line note for the changed-preference-noise shape. */
74
89
  export function changedPrefNoiseVerdictNote(output) {
75
- return describeChangedPrefNoise(output) === undefined
90
+ return matchedTimeDrivenPrefNames(output) === undefined
76
91
  ? undefined
77
92
  : 'all unexpected results are time-driven changed-pref checks';
78
93
  }