@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
@@ -9,14 +9,14 @@ import { isNewFileInPatch, parseDiffSections, parseHunksForFile } from './patch-
9
9
  /**
10
10
  * Extracts the complete file content from a "new file" patch given a raw
11
11
  * diff string already in memory. Callers with a patch file path should
12
- * prefer {@link extractNewFileContent}; this helper exists for code paths
12
+ * prefer {@link extractNewFileContent}. This helper exists for code paths
13
13
  * that already hold the diff (e.g. the in-flight export planner) and do
14
14
  * not want to round-trip through the filesystem.
15
15
  *
16
16
  * @param diff - Raw unified-diff content
17
17
  * @param targetFile - Optional target file to scope extraction to
18
18
  * @returns The file content that the patch would create
19
- * @throws PatchError for binary sections — a `GIT binary patch` payload is
19
+ * @throws PatchError for binary sections. A `GIT binary patch` payload is
20
20
  * base85 (whose alphabet includes `+`), so "extract the + lines" would
21
21
  * silently write garbage text over a binary target. Callers must treat
22
22
  * binary new-file conflicts as unresolvable rather than auto-resolving.
@@ -37,7 +37,7 @@ export function extractNewFileContentFromDiff(diff, targetFile) {
37
37
  */
38
38
  function contentFromSections(sections) {
39
39
  // An empty new file is a legitimate git diff: `new file mode` with no
40
- // hunks at all. It must extract as '' — the historical line-walker
40
+ // hunks at all. It must extract as '': the historical line-walker
41
41
  // returned '\n' for it, creating a one-byte file that failed checksum
42
42
  // and drift comparisons against the truly empty file the patch creates.
43
43
  const hunks = sections.flatMap((section) => section.hunks);
@@ -61,15 +61,15 @@ function contentFromSections(sections) {
61
61
  return hasNoNewlineMarker ? result : result + '\n';
62
62
  }
63
63
  /**
64
- * Projects every TEXT new file a diff creates into a path → content map, for
64
+ * Projects every text new file a diff creates into a path → content map, for
65
65
  * the cross-patch lint projections that build a synthetic patch-queue entry.
66
66
  *
67
- * Binary new files are SKIPPED rather than refused. The map feeds only the
68
- * forward-import rule, which scans content for import statements — a binary
69
- * blob authors none, so omitting it contributes exactly what including it
70
- * would. Refusing instead (which is what
67
+ * Binary new files are skipped rather than refused. The map feeds only the
68
+ * forward-import rule, which scans content for import statements, and a
69
+ * binary blob authors none, so omitting it contributes exactly what
70
+ * including it would. Refusing instead (which is what
71
71
  * {@link extractNewFileContentFromDiff} correctly does for a caller that
72
- * named ONE file) made vendoring a new binary impossible: every projection
72
+ * named one file) made vendoring a new binary impossible: every projection
73
73
  * site fed it every detected new file, so `export --order`, `re-export
74
74
  * --scan --scan-file`, `patch move-files-into` and `patch split` all died on
75
75
  * a file the export half had just written a valid `GIT binary patch` for.
@@ -101,16 +101,6 @@ export async function extractNewFileContent(patchPath, targetFile) {
101
101
  const content = await readText(patchPath);
102
102
  return extractNewFileContentFromDiff(content, targetFile);
103
103
  }
104
- /**
105
- * Applies a patch's changes to content.
106
- * @param content - Original content (null for new files)
107
- * @param patchPath - Path to the patch file
108
- * @param targetFile - The file path within the patch
109
- * @returns Modified content
110
- */
111
- export async function applyPatchToContent(content, patchPath, targetFile) {
112
- return applyPatchTextToContent(content, await readText(patchPath), targetFile);
113
- }
114
104
  /**
115
105
  * Applies an already-read patch body to content. Batched callers that hold
116
106
  * many (patch, file) pairs use this to read each patch body once instead of
@@ -144,7 +134,7 @@ export function applyPatchTextToContent(content, patchContent, targetFile) {
144
134
  // The "no newline at end" marker applies to the last hunk in file order
145
135
  // (highest oldStart), which is the *first* hunk in our reverse-sorted array.
146
136
  // We read the new-side flag because the output we produce corresponds to
147
- // the new side; asymmetric diffs (old lacks newline, new has one — or
137
+ // the new side. Asymmetric diffs (old lacks newline, new has one, or
148
138
  // vice versa) would otherwise disagree with `git apply`.
149
139
  const lastHunkNoNewline = sortedHunks[0]?.noNewlineAtEndNew ?? false;
150
140
  for (const hunk of sortedHunks) {
@@ -168,10 +158,10 @@ export function applyPatchTextToContent(content, patchContent, targetFile) {
168
158
  throw new PatchError(`Patch hunk header mismatch for ${targetFile}: header says ${hunk.oldCount} old lines but body has ${actualOldCount}`, targetFile);
169
159
  }
170
160
  // Replace the old lines with new lines. Unified-diff convention: for a
171
- // pure-insertion hunk (`@@ -N,0 +M,k @@`), N names the line BEFORE the
172
- // insertion point, so content is spliced at index N (after line N) —
161
+ // pure-insertion hunk (`@@ -N,0 +M,k @@`), N names the line before the
162
+ // insertion point, so content is spliced at index N (after line N).
173
163
  // `N - 1` inserted one line too early, and `@@ -0,0` (insert at top of
174
- // file) produced splice(-1, …), which inserts before the LAST element.
164
+ // file) produced splice(-1, …), which inserts before the last element.
175
165
  const startIndex = hunk.oldCount === 0 ? hunk.oldStart : hunk.oldStart - 1;
176
166
  // Verify context lines match before applying
177
167
  let verifyIndex = startIndex;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Best-effort: a missing `ps`, an exited process, or an unparseable field
5
5
  * yields `undefined`, which callers must render as "unknown" rather than as
6
- * zero — reporting a live build as having used no CPU would invert the very
6
+ * zero. Reporting a live build as having used no CPU would invert the very
7
7
  * diagnosis this exists for.
8
8
  *
9
9
  * @param pid - Process to inspect
@@ -3,12 +3,12 @@
3
3
  * Accumulated-CPU-time probe for a single PID.
4
4
  *
5
5
  * Exists to answer the one question `kill(pid, 0)` cannot: a lock holder
6
- * that EXISTS may still be wedged. A downstream fork running five concurrent
7
- * sessions on one checkout diagnosed exactly this by hand — "a holder at
8
- * near-zero CPU is hung, not working" — after a queue stalled behind a
6
+ * that exists may still be wedged. A downstream fork running five concurrent
7
+ * sessions on one checkout diagnosed exactly this by hand ("a holder at
8
+ * near-zero CPU is hung, not working") after a queue stalled behind a
9
9
  * command that had consumed 0.3 s of CPU in eleven minutes.
10
10
  *
11
- * It is reported as EVIDENCE, never as a verdict. A legitimately slow holder
11
+ * It is reported as evidence, never as a verdict. A legitimately slow holder
12
12
  * can also sit at low CPU while blocked on I/O or on a child process, so
13
13
  * nothing keys a refusal, a kill, or a lock steal off this number.
14
14
  */
@@ -19,7 +19,7 @@ import { parsePsDuration } from '../utils/ps-duration.js';
19
19
  *
20
20
  * Best-effort: a missing `ps`, an exited process, or an unparseable field
21
21
  * yields `undefined`, which callers must render as "unknown" rather than as
22
- * zero — reporting a live build as having used no CPU would invert the very
22
+ * zero. Reporting a live build as having used no CPU would invert the very
23
23
  * diagnosis this exists for.
24
24
  *
25
25
  * @param pid - Process to inspect
@@ -34,7 +34,7 @@ export async function readProcessCpuSeconds(pid) {
34
34
  '-NoProfile',
35
35
  '-NonInteractive',
36
36
  '-Command',
37
- `(Get-Process -Id ${String(pid)} -ErrorAction SilentlyContinue).CPU`,
37
+ `(Get-Process -Id ${pid} -ErrorAction SilentlyContinue).CPU`,
38
38
  ]);
39
39
  const seconds = Number.parseFloat(result.stdout.trim());
40
40
  return Number.isFinite(seconds) ? seconds : undefined;
@@ -12,11 +12,11 @@ export type RebasePatchStatus = 'pending' | 'applied-clean' | 'applied-fuzz' | '
12
12
  * A discriminated union on `status`, so a payload can only be present on the
13
13
  * status it belongs to. A flat-optionals shape makes
14
14
  * `{ status: 'resolved', error, conflictingFiles }` representable, and
15
- * `rebase --continue` will write it — flipping the status without clearing
15
+ * `rebase --continue` will write it, flipping the status without clearing
16
16
  * the failure payload, then persisting that to the session file.
17
17
  *
18
- * The on-disk validator (`isValidPatchEntry`) is deliberately NOT tightened
19
- * to match. The session file carries no schema version, so a stricter
18
+ * The on-disk validator (`isValidPatchEntry`) is not tightened to
19
+ * match, on purpose. The session file carries no schema version, so a stricter
20
20
  * validator would reject an older file mid-rebase, where the only remedies
21
21
  * discard the operator's in-progress conflict resolution. Instead
22
22
  * {@link normalizeEntry} drops payload that does not belong to the status on
@@ -52,14 +52,16 @@ export interface RebaseSession {
52
52
  /** Index of the next patch to process (resume point). */
53
53
  currentIndex: number;
54
54
  }
55
+ /** Absolute path of the session file, for messages that must name it. */
56
+ export declare function getRebaseSessionPath(projectRoot: string): string;
55
57
  /**
56
58
  * Outcome of reading the session file, following the {@link LockOwner}
57
59
  * discriminated-union form rather than collapsing three states into `null`.
58
60
  *
59
61
  * Distinguishing `present: false` from `present: true, valid: false` is
60
- * load-bearing. Collapsing both to `null` while reporting liveness from
62
+ * important. Collapsing both to `null` while reporting liveness from
61
63
  * `pathExists` alone wedges the operator in a closed cycle: `rebase` says
62
- * "already in progress — use --continue or --abort", and both of those say
64
+ * "already in progress, use --continue or --abort", and both of those say
63
65
  * "no rebase session in progress", with no CLI path deleting the file and no
64
66
  * message naming it.
65
67
  */
@@ -74,8 +76,6 @@ export type RebaseSessionRead = {
74
76
  valid: false;
75
77
  reason: string;
76
78
  };
77
- /** Absolute path of the session file, for messages that must name it. */
78
- export declare function getRebaseSessionPath(projectRoot: string): string;
79
79
  /**
80
80
  * Reads the session file, reporting absent, valid, and corrupt as three
81
81
  * distinct outcomes. Never throws for a malformed file: `readJson` calls
@@ -86,16 +86,10 @@ export declare function getRebaseSessionPath(projectRoot: string): string;
86
86
  * that read mean `absent`. A pathExists pre-probe both races deletion (a
87
87
  * file removed between probe and read misreports an absent session as
88
88
  * corrupt) and swallows EACCES (an unreadable `.fireforge/` misreports a
89
- * session as absent) — the same failure `readTreeMarker` avoids for tree
90
- * markers.
89
+ * session as absent). It is the same failure `readTreeMarker` avoids for
90
+ * tree markers.
91
91
  */
92
92
  export declare function readRebaseSession(projectRoot: string): Promise<RebaseSessionRead>;
93
- /**
94
- * Loads an existing rebase session, or returns `null` when none exists or the
95
- * file on disk is unusable. Callers that must tell those two apart — every
96
- * command that reports to an operator — should use {@link readRebaseSession}.
97
- */
98
- export declare function tryReadRebaseSession(projectRoot: string): Promise<RebaseSession | null>;
99
93
  /**
100
94
  * Persists a rebase session atomically.
101
95
  */
@@ -13,7 +13,8 @@ import { getProjectPaths } from './config-paths.js';
13
13
  import { createSiblingLockPath, withFileLock } from './file-lock.js';
14
14
  // ── Helpers ──
15
15
  const SESSION_FILENAME = 'rebase-session.json';
16
- function sessionPath(projectRoot) {
16
+ /** Absolute path of the session file, for messages that must name it. */
17
+ export function getRebaseSessionPath(projectRoot) {
17
18
  return join(getProjectPaths(projectRoot).fireforgeDir, SESSION_FILENAME);
18
19
  }
19
20
  const REBASE_PATCH_STATUSES = [
@@ -28,9 +29,9 @@ const REBASE_PATCH_STATUSES = [
28
29
  /**
29
30
  * Drops payload that does not belong to an entry's status.
30
31
  *
31
- * Applied on read so a session written by an older FireForge — where
32
+ * Applied on read so a session written by an older FireForge, where
32
33
  * `rebase --continue` left `error`/`conflictingFiles` on a now-`resolved`
33
- * entry — loads cleanly and is corrected, instead of being refused by a
34
+ * entry, loads cleanly and is corrected, instead of being refused by a
34
35
  * stricter validator mid-rebase.
35
36
  *
36
37
  * @param entry - A structurally valid entry, possibly carrying stale payload
@@ -73,28 +74,28 @@ function isValidOptionalProduct(value) {
73
74
  }
74
75
  /**
75
76
  * Validates a session file against the shape the rebase commands actually
76
- * consume — not merely against broad field types.
77
+ * consume, not merely against broad field types.
77
78
  *
78
79
  * A looser predicate that checks six `typeof`s and nothing else admits
79
80
  * sessions the resume path then acts on. `patches: [null]` reaches
80
81
  * `patch-loop.ts`, which reads `.filename` off each entry and hands it to
81
82
  * `stampPatchVersions`. A `currentIndex` of `NaN` (legal for
82
83
  * `typeof === 'number'`) makes the resume loop run zero iterations and
83
- * report success; a negative one indexes out of range in `continue.ts`.
84
+ * report success. A negative one indexes out of range in `continue.ts`.
84
85
  * `toVersion: ""` passes `isString` and is stamped verbatim onto every
85
86
  * Furnace override's `baseVersion`. `fromProduct`/`toProduct` go unchecked
86
87
  * despite being typed `FirefoxProduct`.
87
88
  *
88
89
  * The session file is written only by `rebase/index.ts` from validated CLI
89
90
  * and config values, so every one of these is a corrupt-file or hand-edit
90
- * case — which is exactly what this predicate exists to catch.
91
+ * case, which is exactly what this predicate exists to catch.
91
92
  */
92
93
  function isValidSession(data) {
93
94
  if (!isObject(data))
94
95
  return false;
95
96
  if (!isString(data['startedAt']) || Number.isNaN(Date.parse(data['startedAt'])))
96
97
  return false;
97
- // 4 is git's own minimum abbreviation length; 40/64 are full SHA-1/SHA-256.
98
+ // 4 is git's own minimum abbreviation length. 40/64 are full SHA-1/SHA-256.
98
99
  if (!isString(data['preRebaseCommit']) || !/^[0-9a-f]{4,64}$/i.test(data['preRebaseCommit'])) {
99
100
  return false;
100
101
  }
@@ -116,10 +117,6 @@ function isValidSession(data) {
116
117
  return false;
117
118
  return currentIndex >= 0 && currentIndex <= patches.length;
118
119
  }
119
- /** Absolute path of the session file, for messages that must name it. */
120
- export function getRebaseSessionPath(projectRoot) {
121
- return sessionPath(projectRoot);
122
- }
123
120
  /**
124
121
  * Reads the session file, reporting absent, valid, and corrupt as three
125
122
  * distinct outcomes. Never throws for a malformed file: `readJson` calls
@@ -130,11 +127,11 @@ export function getRebaseSessionPath(projectRoot) {
130
127
  * that read mean `absent`. A pathExists pre-probe both races deletion (a
131
128
  * file removed between probe and read misreports an absent session as
132
129
  * corrupt) and swallows EACCES (an unreadable `.fireforge/` misreports a
133
- * session as absent) — the same failure `readTreeMarker` avoids for tree
134
- * markers.
130
+ * session as absent). It is the same failure `readTreeMarker` avoids for
131
+ * tree markers.
135
132
  */
136
133
  export async function readRebaseSession(projectRoot) {
137
- const path = sessionPath(projectRoot);
134
+ const path = getRebaseSessionPath(projectRoot);
138
135
  let data;
139
136
  try {
140
137
  data = await readJson(path);
@@ -159,20 +156,11 @@ export async function readRebaseSession(projectRoot) {
159
156
  session: { ...data, patches: data.patches.map(normalizeEntry) },
160
157
  };
161
158
  }
162
- /**
163
- * Loads an existing rebase session, or returns `null` when none exists or the
164
- * file on disk is unusable. Callers that must tell those two apart — every
165
- * command that reports to an operator — should use {@link readRebaseSession}.
166
- */
167
- export async function tryReadRebaseSession(projectRoot) {
168
- const result = await readRebaseSession(projectRoot);
169
- return result.present && result.valid ? result.session : null;
170
- }
171
159
  /**
172
160
  * Persists a rebase session atomically.
173
161
  */
174
162
  export async function saveRebaseSession(projectRoot, session) {
175
- const path = sessionPath(projectRoot);
163
+ const path = getRebaseSessionPath(projectRoot);
176
164
  await withFileLock(createSiblingLockPath(path, '.rebase-session.lock'), async () => {
177
165
  await writeJson(path, session);
178
166
  });
@@ -181,7 +169,7 @@ export async function saveRebaseSession(projectRoot, session) {
181
169
  * Removes the rebase session file.
182
170
  */
183
171
  export async function clearRebaseSession(projectRoot) {
184
- const path = sessionPath(projectRoot);
172
+ const path = getRebaseSessionPath(projectRoot);
185
173
  if (await pathExists(path)) {
186
174
  await removeFile(path);
187
175
  }
@@ -5,6 +5,7 @@
5
5
  import { join } from 'node:path';
6
6
  import { GeneralError } from '../errors/base.js';
7
7
  import { pathExists, readText, writeText } from '../utils/fs.js';
8
+ import { normalizePathSlashes } from '../utils/paths.js';
8
9
  import { insertJarMnEntry } from './moz-manifest-helpers.js';
9
10
  /**
10
11
  * Tokenizer-based implementation for browser content registration.
@@ -30,8 +31,8 @@ export async function registerBrowserContent(engineDir, fileName, after, sourceP
30
31
  if (!(await pathExists(manifestPath))) {
31
32
  throw new GeneralError(`Manifest not found: ${manifest}`);
32
33
  }
33
- const source = (sourcePath ?? `content/${fileName}`).replace(/\\/g, '/');
34
- const entry = ` content/browser/${fileName} (${source})`.replace(/\\/g, '/');
34
+ const source = normalizePathSlashes(sourcePath ?? `content/${fileName}`);
35
+ const entry = normalizePathSlashes(` content/browser/${fileName} (${source})`);
35
36
  const content = await readText(manifestPath);
36
37
  // Idempotency check
37
38
  if (content.includes(`content/browser/${fileName}`)) {
@@ -5,6 +5,7 @@
5
5
  import { join } from 'node:path';
6
6
  import { GeneralError } from '../errors/base.js';
7
7
  import { pathExists, readText, writeText } from '../utils/fs.js';
8
+ import { normalizePathSlashes } from '../utils/paths.js';
8
9
  import { insertMozBuildListEntry } from './moz-manifest-helpers.js';
9
10
  /**
10
11
  * Tokenizer-based implementation for test manifest registration.
@@ -28,7 +29,7 @@ export async function registerTestManifest(engineDir, testDir, dryRun = false) {
28
29
  if (!(await pathExists(manifestPath))) {
29
30
  throw new GeneralError(`Manifest not found: ${manifest}`);
30
31
  }
31
- const entry = ` "content/test/${testDir}/browser.toml",`.replace(/\\/g, '/');
32
+ const entry = normalizePathSlashes(` "content/test/${testDir}/browser.toml",`);
32
33
  const content = await readText(manifestPath);
33
34
  // Idempotency check
34
35
  if (content.includes(`content/test/${testDir}/browser.toml`)) {
@@ -5,6 +5,7 @@
5
5
  import { join } from 'node:path';
6
6
  import { GeneralError } from '../errors/base.js';
7
7
  import { pathExists, readText, writeText } from '../utils/fs.js';
8
+ import { normalizePathSlashes } from '../utils/paths.js';
8
9
  import { insertMozBuildListEntry } from './moz-manifest-helpers.js';
9
10
  import { scaffoldModuleMozBuild } from './register-scaffold.js';
10
11
  /**
@@ -41,7 +42,7 @@ export async function registerFireForgeModule(engineDir, fileName, moduleDir, dr
41
42
  }
42
43
  throw new GeneralError(`Manifest not found: ${manifest}. Pass --create-manifest to scaffold it and wire the parent DIRS entry.`);
43
44
  }
44
- const entry = ` "${fileName}",`.replace(/\\/g, '/');
45
+ const entry = normalizePathSlashes(` "${fileName}",`);
45
46
  const content = await readText(manifestPath);
46
47
  // Idempotency check
47
48
  if (content.includes(`"${fileName}"`)) {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Shared result shape for manifest registration operations, split out of
3
3
  * the `manifest-register.ts` barrel so the `register-*` leaf modules can
4
- * import it without importing the barrel that re-exports them — that
4
+ * import it without importing the barrel that re-exports them. That
5
5
  * type-only back-edge made the registration dependency graph cyclic.
6
6
  */
7
7
  /**
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Shared result shape for manifest registration operations, split out of
4
4
  * the `manifest-register.ts` barrel so the `register-*` leaf modules can
5
- * import it without importing the barrel that re-exports them — that
5
+ * import it without importing the barrel that re-exports them. That
6
6
  * type-only back-edge made the registration dependency graph cyclic.
7
7
  */
8
8
  export {};
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * - creating a directory `moz.build` (license header + the requested list
9
9
  * directive) and wiring the parent chain's `DIRS` entries up to the
10
- * nearest existing moz.build;
10
+ * nearest existing moz.build.
11
11
  * - wiring an `XPCSHELL_TESTS_MANIFESTS` entry for a (possibly freshly
12
12
  * created) `xpcshell.toml` into the nearest existing moz.build.
13
13
  *
@@ -33,7 +33,7 @@ export declare function upsertMozBuildListEntry(content: string, directive: stri
33
33
  * Ensures every parent directory between `childRelDir` and the nearest
34
34
  * existing moz.build carries a `DIRS` entry pointing at the next segment
35
35
  * down, creating intermediate moz.build files as needed. Walks upward
36
- * from the child's parent; throws when no moz.build exists anywhere up
36
+ * from the child's parent. Throws when no moz.build exists anywhere up
37
37
  * to the engine root (an engine checkout always has one at the root, so
38
38
  * this indicates a bogus path).
39
39
  */
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * - creating a directory `moz.build` (license header + the requested list
10
10
  * directive) and wiring the parent chain's `DIRS` entries up to the
11
- * nearest existing moz.build;
11
+ * nearest existing moz.build.
12
12
  * - wiring an `XPCSHELL_TESTS_MANIFESTS` entry for a (possibly freshly
13
13
  * created) `xpcshell.toml` into the nearest existing moz.build.
14
14
  *
@@ -19,12 +19,13 @@
19
19
  import { dirname, join } from 'node:path';
20
20
  import { GeneralError } from '../errors/base.js';
21
21
  import { pathExists, readText, writeText } from '../utils/fs.js';
22
+ import { normalizePathSlashes } from '../utils/paths.js';
22
23
  import { getLicenseHeader } from './license-headers.js';
23
24
  import { findAlphabeticalMozBuildPosition } from './moz-manifest-helpers.js';
24
25
  import { tokenizeMozBuildList } from './moz-manifest-tokenizers.js';
25
26
  /**
26
27
  * moz.build files use Firefox's canonical MPL-2.0 hash-comment header
27
- * regardless of the fork's own project license — they live in the engine
28
+ * regardless of the fork's own project license. They live in the engine
28
29
  * tree among upstream MPL files.
29
30
  */
30
31
  function mozBuildHeader() {
@@ -57,14 +58,14 @@ export function upsertMozBuildListEntry(content, directive, value) {
57
58
  * Ensures every parent directory between `childRelDir` and the nearest
58
59
  * existing moz.build carries a `DIRS` entry pointing at the next segment
59
60
  * down, creating intermediate moz.build files as needed. Walks upward
60
- * from the child's parent; throws when no moz.build exists anywhere up
61
+ * from the child's parent. Throws when no moz.build exists anywhere up
61
62
  * to the engine root (an engine checkout always has one at the root, so
62
63
  * this indicates a bogus path).
63
64
  */
64
65
  export async function ensureParentDirsWiring(engineDir, childRelDir, dryRun) {
65
66
  const actions = [];
66
67
  let childName = childRelDir.split('/').at(-1) ?? childRelDir;
67
- let parentRel = dirname(childRelDir).replace(/\\/g, '/');
68
+ let parentRel = normalizePathSlashes(dirname(childRelDir));
68
69
  for (;;) {
69
70
  if (parentRel === '.' || parentRel === '' || parentRel === '/') {
70
71
  throw new GeneralError(`No moz.build found in any parent of ${childRelDir} up to the engine root; ` +
@@ -90,7 +91,7 @@ export async function ensureParentDirsWiring(engineDir, childRelDir, dryRun) {
90
91
  await writeText(parentManifestPath, scaffold);
91
92
  actions.push({ manifest: parentManifestRel, change: `created with DIRS += ["${childName}"]` });
92
93
  childName = parentRel.split('/').at(-1) ?? parentRel;
93
- parentRel = dirname(parentRel).replace(/\\/g, '/');
94
+ parentRel = normalizePathSlashes(dirname(parentRel));
94
95
  }
95
96
  }
96
97
  /**
@@ -122,7 +123,7 @@ export async function scaffoldModuleMozBuild(engineDir, moduleDir, fileName, dry
122
123
  * entry already exists).
123
124
  */
124
125
  export async function ensureXpcshellManifestWiring(engineDir, manifestRelPath, dryRun) {
125
- let dirRel = dirname(manifestRelPath).replace(/\\/g, '/');
126
+ let dirRel = normalizePathSlashes(dirname(manifestRelPath));
126
127
  for (;;) {
127
128
  if (dirRel === '.' || dirRel === '' || dirRel === '/') {
128
129
  throw new GeneralError(`No moz.build found in any parent of ${manifestRelPath} up to the engine root; ` +
@@ -140,6 +141,6 @@ export async function ensureXpcshellManifestWiring(engineDir, manifestRelPath, d
140
141
  await writeText(mozBuildPath, updated);
141
142
  return [{ manifest: mozBuildRel, change: `XPCSHELL_TESTS_MANIFESTS += ["${relEntry}"]` }];
142
143
  }
143
- dirRel = dirname(dirRel).replace(/\\/g, '/');
144
+ dirRel = normalizePathSlashes(dirname(dirRel));
144
145
  }
145
146
  }
@@ -12,7 +12,7 @@ import type { RegisterResult } from './register-result.js';
12
12
  * freshly registered file at the wrong column and produces avoidable
13
13
  * formatting churn, since adjacent Firefox entries are typically padded to a
14
14
  * wider column. Returns `undefined` when no existing entries provide an
15
- * alignment signal — callers fall back to the four-space default.
15
+ * alignment signal. Callers fall back to the four-space default.
16
16
  */
17
17
  export declare function measureSourceColumn(content: string): number | undefined;
18
18
  /**
@@ -30,7 +30,7 @@ export declare function buildEntry(name: string, sourceColumn: number | undefine
30
30
  * skin/classic/browser/{name}.css (../shared/{name}.css)
31
31
  *
32
32
  * The gap between target and source is sized to align with adjacent
33
- * entries when the manifest already uses a wider column; falls back to
34
- * a four-space minimum otherwise.
33
+ * entries when the manifest already uses a wider column. It falls back
34
+ * to a four-space minimum otherwise.
35
35
  */
36
36
  export declare function registerSharedCSS(engineDir: string, fileName: string, after?: string, dryRun?: boolean): Promise<RegisterResult>;
@@ -5,6 +5,7 @@
5
5
  import { basename, join } from 'node:path';
6
6
  import { GeneralError } from '../errors/base.js';
7
7
  import { pathExists, readText, writeText } from '../utils/fs.js';
8
+ import { normalizePathSlashes } from '../utils/paths.js';
8
9
  import { insertJarMnEntry } from './moz-manifest-helpers.js';
9
10
  /**
10
11
  * Tokenizer-based implementation for shared CSS registration.
@@ -29,7 +30,7 @@ const MIN_SOURCE_GAP = 4;
29
30
  * freshly registered file at the wrong column and produces avoidable
30
31
  * formatting churn, since adjacent Firefox entries are typically padded to a
31
32
  * wider column. Returns `undefined` when no existing entries provide an
32
- * alignment signal — callers fall back to the four-space default.
33
+ * alignment signal. Callers fall back to the four-space default.
33
34
  */
34
35
  export function measureSourceColumn(content) {
35
36
  const lines = content.split('\n');
@@ -65,7 +66,7 @@ export function buildEntry(name, sourceColumn) {
65
66
  const minColumn = target.length + MIN_SOURCE_GAP;
66
67
  const column = sourceColumn !== undefined && sourceColumn >= minColumn ? sourceColumn : minColumn;
67
68
  const padding = ' '.repeat(column - target.length);
68
- return `${target}${padding}(../shared/${name}.css)`.replace(/\\/g, '/');
69
+ return normalizePathSlashes(`${target}${padding}(../shared/${name}.css)`);
69
70
  }
70
71
  /**
71
72
  * Registers a CSS file in browser/themes/shared/jar.inc.mn.
@@ -74,8 +75,8 @@ export function buildEntry(name, sourceColumn) {
74
75
  * skin/classic/browser/{name}.css (../shared/{name}.css)
75
76
  *
76
77
  * The gap between target and source is sized to align with adjacent
77
- * entries when the manifest already uses a wider column; falls back to
78
- * a four-space minimum otherwise.
78
+ * entries when the manifest already uses a wider column. It falls back
79
+ * to a four-space minimum otherwise.
79
80
  */
80
81
  export async function registerSharedCSS(engineDir, fileName, after, dryRun = false) {
81
82
  const manifest = 'browser/themes/shared/jar.inc.mn';
@@ -89,7 +90,7 @@ export async function registerSharedCSS(engineDir, fileName, after, dryRun = fal
89
90
  const entry = buildEntry(name, sourceColumn);
90
91
  // Idempotency check. `furnace chrome-doc create` writes its CSS as a
91
92
  // `content/browser/<name>.css` entry rather than the canonical
92
- // `skin/classic/browser/<name>.css` form `register` produces; recognise
93
+ // `skin/classic/browser/<name>.css` form `register` produces. Recognise
93
94
  // both shapes so a follow-up `register` invocation against an
94
95
  // already-chrome-doc-registered file reports `skipped` instead of
95
96
  // appending a duplicate `skin/classic/browser/...` row.
@@ -2,8 +2,8 @@
2
2
  * xpcshell test-file registration. Without it, xpcshell test files (e.g.
3
3
  * `<module-dir>/test/unit/test_*.js`) are rejected by `fireforge register`
4
4
  * as "Unknown file pattern". This writer inserts the `["test_*.js"]` section
5
- * into the directory's `xpcshell.toml` (alphabetically, idempotently) and —
6
- * with `--create-manifest` — creates the manifest and wires
5
+ * into the directory's `xpcshell.toml` (alphabetically, idempotently). With
6
+ * `--create-manifest` it also creates the manifest and wires
7
7
  * `XPCSHELL_TESTS_MANIFESTS` into the nearest moz.build.
8
8
  */
9
9
  import type { RegisterResult } from './register-result.js';
@@ -3,8 +3,8 @@
3
3
  * xpcshell test-file registration. Without it, xpcshell test files (e.g.
4
4
  * `<module-dir>/test/unit/test_*.js`) are rejected by `fireforge register`
5
5
  * as "Unknown file pattern". This writer inserts the `["test_*.js"]` section
6
- * into the directory's `xpcshell.toml` (alphabetically, idempotently) and —
7
- * with `--create-manifest` — creates the manifest and wires
6
+ * into the directory's `xpcshell.toml` (alphabetically, idempotently). With
7
+ * `--create-manifest` it also creates the manifest and wires
8
8
  * `XPCSHELL_TESTS_MANIFESTS` into the nearest moz.build.
9
9
  */
10
10
  import { join } from 'node:path';
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Conservative secret redaction for the run-log FILE tee.
3
+ *
4
+ * A run log is a complete copy of mach's output, and mach echoes its
5
+ * environment in places (configure summaries, `mach env`, harness
6
+ * diagnostics that print the command line). The terminal already showed
7
+ * every byte to the operator who ran it. The file, by contrast, is retained
8
+ * twenty deep and gets attached to bug reports. So the file gets a narrow
9
+ * masking pass and the terminal does not.
10
+ *
11
+ * Minimal and pattern-based. See {@link redactRunLogText} for the exact
12
+ * contract. It is a seatbelt against the common accidental leak, not a
13
+ * guarantee that a log is free of secrets.
14
+ */
15
+ /**
16
+ * Masks the obvious secret shapes in run-log text, line by line.
17
+ *
18
+ * Redacted:
19
+ * - the value of an env-style assignment `KEY=value` whose KEY matches
20
+ * `/(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i`. The value up to the
21
+ * next whitespace, or a whole quoted string, becomes `KEY=<redacted>`.
22
+ * The `--flag=value` and `-DNAME=value` spellings of the same shape are
23
+ * covered (`--password=x` → `--password=<redacted>`).
24
+ * - the credential of an `Authorization:` header (`Bearer`, `Basic` and
25
+ * `Token` schemes keep the scheme word, and anything else masks the
26
+ * whole value).
27
+ *
28
+ * Not redacted: secrets that appear without one of those key names or
29
+ * headers (a bare token in a URL query string, a space-separated
30
+ * `--password foo` CLI argument, JSON `"token": "..."` fields, cookies).
31
+ * Line structure and every other byte pass through unchanged. `\n`, `\r\n`
32
+ * and lone `\r` all delimit lines, so carriage-return-repainted progress
33
+ * output is masked per repaint.
34
+ *
35
+ * @param text - One or more complete lines
36
+ * @returns The same text with masked values
37
+ */
38
+ export declare function redactRunLogText(text: string): string;