@hominis/fireforge 0.43.1 → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +3 -3
  3. package/dist/bin/fireforge.d.ts +4 -9
  4. package/dist/bin/fireforge.js +42 -40
  5. package/dist/build-info.json +4 -4
  6. package/dist/src/cli.js +74 -8
  7. package/dist/src/commands/bootstrap.js +17 -20
  8. package/dist/src/commands/build.js +25 -32
  9. package/dist/src/commands/config.js +34 -41
  10. package/dist/src/commands/discard.js +8 -9
  11. package/dist/src/commands/doctor-check-core.d.ts +13 -18
  12. package/dist/src/commands/doctor-check-core.js +8 -35
  13. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  14. package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
  15. package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
  16. package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
  17. package/dist/src/commands/doctor-furnace-jar.js +7 -9
  18. package/dist/src/commands/doctor-furnace.js +21 -24
  19. package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
  20. package/dist/src/commands/doctor-orphaned-harness.js +18 -44
  21. package/dist/src/commands/doctor-patch-manifest.d.ts +8 -0
  22. package/dist/src/commands/doctor-patch-manifest.js +155 -0
  23. package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
  24. package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
  25. package/dist/src/commands/doctor-working-tree.d.ts +10 -12
  26. package/dist/src/commands/doctor-working-tree.js +11 -18
  27. package/dist/src/commands/doctor.d.ts +1 -1
  28. package/dist/src/commands/doctor.js +64 -96
  29. package/dist/src/commands/download.js +32 -48
  30. package/dist/src/commands/export-all.js +29 -33
  31. package/dist/src/commands/export-flow.js +6 -6
  32. package/dist/src/commands/export-placement-conflicts.js +10 -9
  33. package/dist/src/commands/export-placement-gate.js +5 -5
  34. package/dist/src/commands/export-shared.d.ts +30 -33
  35. package/dist/src/commands/export-shared.js +45 -43
  36. package/dist/src/commands/export.js +21 -27
  37. package/dist/src/commands/furnace/apply.js +14 -23
  38. package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
  39. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
  40. package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
  41. package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
  42. package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
  43. package/dist/src/commands/furnace/chrome-doc.js +31 -41
  44. package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
  45. package/dist/src/commands/furnace/create-browser-test.js +8 -8
  46. package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
  47. package/dist/src/commands/furnace/create-mochikit.js +8 -9
  48. package/dist/src/commands/furnace/create-readback.d.ts +12 -13
  49. package/dist/src/commands/furnace/create-readback.js +12 -13
  50. package/dist/src/commands/furnace/create-templates.d.ts +22 -28
  51. package/dist/src/commands/furnace/create-templates.js +35 -30
  52. package/dist/src/commands/furnace/create-xpcshell.js +2 -2
  53. package/dist/src/commands/furnace/create.js +33 -23
  54. package/dist/src/commands/furnace/deploy.js +16 -24
  55. package/dist/src/commands/furnace/diff.js +15 -10
  56. package/dist/src/commands/furnace/init.js +33 -36
  57. package/dist/src/commands/furnace/override.js +23 -25
  58. package/dist/src/commands/furnace/preview.js +47 -67
  59. package/dist/src/commands/furnace/refresh.js +12 -16
  60. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
  61. package/dist/src/commands/furnace/remove-mutations.js +14 -17
  62. package/dist/src/commands/furnace/remove-state.js +1 -1
  63. package/dist/src/commands/furnace/remove.js +33 -38
  64. package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
  65. package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
  66. package/dist/src/commands/furnace/rename.js +59 -69
  67. package/dist/src/commands/furnace/scan.js +19 -33
  68. package/dist/src/commands/furnace/status.js +12 -9
  69. package/dist/src/commands/furnace/sync.js +9 -16
  70. package/dist/src/commands/furnace/validate.js +20 -20
  71. package/dist/src/commands/import.js +48 -37
  72. package/dist/src/commands/lint-per-patch.js +15 -10
  73. package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
  74. package/dist/src/commands/lint-per-run-checkjs.js +13 -13
  75. package/dist/src/commands/lint-report.js +6 -7
  76. package/dist/src/commands/lint.d.ts +15 -16
  77. package/dist/src/commands/lint.js +86 -102
  78. package/dist/src/commands/package.js +6 -11
  79. package/dist/src/commands/patch/compact.js +1 -1
  80. package/dist/src/commands/patch/delete.js +24 -33
  81. package/dist/src/commands/patch/index.d.ts +5 -6
  82. package/dist/src/commands/patch/index.js +10 -12
  83. package/dist/src/commands/patch/lint-ignore.js +14 -13
  84. package/dist/src/commands/patch/move-files-create.d.ts +6 -6
  85. package/dist/src/commands/patch/move-files-create.js +8 -8
  86. package/dist/src/commands/patch/move-files-into.d.ts +6 -6
  87. package/dist/src/commands/patch/move-files-into.js +8 -8
  88. package/dist/src/commands/patch/patch-context.d.ts +2 -3
  89. package/dist/src/commands/patch/patch-context.js +2 -3
  90. package/dist/src/commands/patch/rename.d.ts +10 -11
  91. package/dist/src/commands/patch/rename.js +11 -12
  92. package/dist/src/commands/patch/reorder.js +8 -9
  93. package/dist/src/commands/patch/split-plan.js +1 -1
  94. package/dist/src/commands/patch/split.d.ts +8 -10
  95. package/dist/src/commands/patch/split.js +9 -11
  96. package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
  97. package/dist/src/commands/patch/staged-dependency.js +7 -3
  98. package/dist/src/commands/patch/tier.d.ts +9 -9
  99. package/dist/src/commands/patch/tier.js +18 -15
  100. package/dist/src/commands/re-export-adjacent.js +9 -8
  101. package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
  102. package/dist/src/commands/re-export-bulk-scan.js +22 -21
  103. package/dist/src/commands/re-export-drift.js +10 -10
  104. package/dist/src/commands/re-export-files.d.ts +6 -7
  105. package/dist/src/commands/re-export-files.js +34 -44
  106. package/dist/src/commands/re-export-lint.d.ts +10 -13
  107. package/dist/src/commands/re-export-lint.js +16 -14
  108. package/dist/src/commands/re-export-options.d.ts +6 -6
  109. package/dist/src/commands/re-export-options.js +6 -6
  110. package/dist/src/commands/re-export-register.d.ts +4 -10
  111. package/dist/src/commands/re-export-register.js +5 -11
  112. package/dist/src/commands/re-export-scan.js +1 -1
  113. package/dist/src/commands/re-export-single.d.ts +3 -3
  114. package/dist/src/commands/re-export-single.js +33 -25
  115. package/dist/src/commands/re-export.js +13 -21
  116. package/dist/src/commands/rebase/abort.js +3 -3
  117. package/dist/src/commands/rebase/confirm.js +2 -1
  118. package/dist/src/commands/rebase/continue.d.ts +1 -1
  119. package/dist/src/commands/rebase/continue.js +14 -9
  120. package/dist/src/commands/rebase/index.js +11 -11
  121. package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
  122. package/dist/src/commands/rebase/patch-loop.js +60 -39
  123. package/dist/src/commands/rebase/summary.js +1 -1
  124. package/dist/src/commands/register.js +5 -7
  125. package/dist/src/commands/reset.js +2 -1
  126. package/dist/src/commands/resolve.d.ts +16 -13
  127. package/dist/src/commands/resolve.js +30 -33
  128. package/dist/src/commands/run.js +33 -35
  129. package/dist/src/commands/setup-support.js +15 -19
  130. package/dist/src/commands/setup.js +13 -9
  131. package/dist/src/commands/status-check.d.ts +6 -6
  132. package/dist/src/commands/status-json.d.ts +6 -6
  133. package/dist/src/commands/status-json.js +5 -0
  134. package/dist/src/commands/status-output.d.ts +5 -5
  135. package/dist/src/commands/status-output.js +6 -6
  136. package/dist/src/commands/status-ownership.d.ts +16 -14
  137. package/dist/src/commands/status-ownership.js +16 -14
  138. package/dist/src/commands/status.js +42 -34
  139. package/dist/src/commands/test-build-phase.js +26 -13
  140. package/dist/src/commands/test-diagnose.js +44 -44
  141. package/dist/src/commands/test-register.js +1 -0
  142. package/dist/src/commands/test-run.d.ts +14 -16
  143. package/dist/src/commands/test-run.js +21 -13
  144. package/dist/src/commands/test-stale-gate.d.ts +15 -16
  145. package/dist/src/commands/test-stale-gate.js +15 -16
  146. package/dist/src/commands/test-verdict.d.ts +20 -3
  147. package/dist/src/commands/test-verdict.js +30 -0
  148. package/dist/src/commands/test.js +83 -76
  149. package/dist/src/commands/token-coverage.js +3 -4
  150. package/dist/src/commands/token.js +16 -18
  151. package/dist/src/commands/tree.js +47 -31
  152. package/dist/src/commands/typecheck.d.ts +10 -12
  153. package/dist/src/commands/typecheck.js +24 -27
  154. package/dist/src/commands/verify.js +13 -15
  155. package/dist/src/commands/watch.js +21 -23
  156. package/dist/src/commands/wire.js +52 -62
  157. package/dist/src/core/ast-utils.d.ts +8 -7
  158. package/dist/src/core/ast-utils.js +8 -7
  159. package/dist/src/core/branding.d.ts +9 -14
  160. package/dist/src/core/branding.js +7 -11
  161. package/dist/src/core/browser-wire.d.ts +1 -1
  162. package/dist/src/core/browser-wire.js +14 -19
  163. package/dist/src/core/build-audit-platform.js +25 -33
  164. package/dist/src/core/build-audit-registration.js +17 -25
  165. package/dist/src/core/build-audit-resolve.d.ts +15 -17
  166. package/dist/src/core/build-audit-resolve.js +39 -36
  167. package/dist/src/core/build-audit-transforms.js +18 -19
  168. package/dist/src/core/build-audit.js +28 -42
  169. package/dist/src/core/build-baseline-types.d.ts +29 -35
  170. package/dist/src/core/build-baseline.d.ts +5 -4
  171. package/dist/src/core/build-baseline.js +14 -14
  172. package/dist/src/core/build-overwrite-guard.d.ts +7 -14
  173. package/dist/src/core/build-overwrite-guard.js +17 -27
  174. package/dist/src/core/build-prepare.d.ts +2 -2
  175. package/dist/src/core/build-prepare.js +8 -9
  176. package/dist/src/core/config-mutate.js +20 -19
  177. package/dist/src/core/config-state.js +12 -4
  178. package/dist/src/core/config-validate.js +8 -5
  179. package/dist/src/core/config.d.ts +5 -8
  180. package/dist/src/core/config.js +7 -16
  181. package/dist/src/core/coverage-extend.d.ts +15 -13
  182. package/dist/src/core/coverage-extend.js +15 -13
  183. package/dist/src/core/destructive.d.ts +31 -9
  184. package/dist/src/core/destructive.js +29 -26
  185. package/dist/src/core/diff-hunks.js +10 -12
  186. package/dist/src/core/discard-baseline.d.ts +8 -8
  187. package/dist/src/core/discard-baseline.js +16 -15
  188. package/dist/src/core/display-state.d.ts +12 -14
  189. package/dist/src/core/display-state.js +12 -14
  190. package/dist/src/core/engine-changes.d.ts +2 -4
  191. package/dist/src/core/engine-changes.js +2 -4
  192. package/dist/src/core/engine-precondition.d.ts +28 -13
  193. package/dist/src/core/engine-precondition.js +25 -10
  194. package/dist/src/core/engine-session-lock.d.ts +47 -21
  195. package/dist/src/core/engine-session-lock.js +168 -33
  196. package/dist/src/core/export-moved-code-shape.d.ts +10 -10
  197. package/dist/src/core/export-moved-code-shape.js +10 -10
  198. package/dist/src/core/file-lock.d.ts +62 -5
  199. package/dist/src/core/file-lock.js +196 -59
  200. package/dist/src/core/firefox-cache.js +1 -3
  201. package/dist/src/core/firefox-extract.js +10 -14
  202. package/dist/src/core/firefox.d.ts +7 -5
  203. package/dist/src/core/firefox.js +4 -5
  204. package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
  205. package/dist/src/core/furnace-apply-dry-run.js +3 -2
  206. package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
  207. package/dist/src/core/furnace-apply-ftl.js +16 -13
  208. package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
  209. package/dist/src/core/furnace-apply-helpers.js +30 -21
  210. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
  211. package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
  212. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
  213. package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
  214. package/dist/src/core/furnace-apply.d.ts +5 -8
  215. package/dist/src/core/furnace-apply.js +19 -24
  216. package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
  217. package/dist/src/core/furnace-checksum-utils.js +16 -0
  218. package/dist/src/core/furnace-config.d.ts +21 -30
  219. package/dist/src/core/furnace-config.js +32 -54
  220. package/dist/src/core/furnace-constants.d.ts +8 -0
  221. package/dist/src/core/furnace-constants.js +10 -2
  222. package/dist/src/core/furnace-css-fragments.d.ts +5 -5
  223. package/dist/src/core/furnace-css-fragments.js +5 -5
  224. package/dist/src/core/furnace-jsconfig.d.ts +11 -12
  225. package/dist/src/core/furnace-jsconfig.js +11 -12
  226. package/dist/src/core/furnace-marker.d.ts +7 -8
  227. package/dist/src/core/furnace-marker.js +7 -8
  228. package/dist/src/core/furnace-operation.d.ts +31 -0
  229. package/dist/src/core/furnace-operation.js +54 -17
  230. package/dist/src/core/furnace-precondition.d.ts +61 -0
  231. package/dist/src/core/furnace-precondition.js +67 -0
  232. package/dist/src/core/furnace-registration-remove.d.ts +5 -6
  233. package/dist/src/core/furnace-registration-remove.js +6 -7
  234. package/dist/src/core/furnace-registration-validate.d.ts +13 -0
  235. package/dist/src/core/furnace-registration-validate.js +20 -1
  236. package/dist/src/core/furnace-registration.d.ts +5 -6
  237. package/dist/src/core/furnace-registration.js +10 -12
  238. package/dist/src/core/furnace-rollback.js +7 -7
  239. package/dist/src/core/furnace-scanner.d.ts +1 -0
  240. package/dist/src/core/furnace-scanner.js +1 -2
  241. package/dist/src/core/furnace-stale-export.d.ts +10 -10
  242. package/dist/src/core/furnace-stale-export.js +10 -10
  243. package/dist/src/core/furnace-state-persist.d.ts +6 -8
  244. package/dist/src/core/furnace-state-persist.js +6 -8
  245. package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
  246. package/dist/src/core/furnace-validate-accessibility.js +310 -1
  247. package/dist/src/core/furnace-validate-compatibility.js +141 -1
  248. package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
  249. package/dist/src/core/furnace-validate-helpers.js +0 -491
  250. package/dist/src/core/furnace-validate-registration.d.ts +7 -0
  251. package/dist/src/core/furnace-validate-registration.js +115 -41
  252. package/dist/src/core/furnace-validate.d.ts +16 -0
  253. package/dist/src/core/furnace-validate.js +188 -145
  254. package/dist/src/core/furnace-version-drift.d.ts +10 -11
  255. package/dist/src/core/furnace-version-drift.js +10 -11
  256. package/dist/src/core/git-base.d.ts +21 -9
  257. package/dist/src/core/git-base.js +24 -9
  258. package/dist/src/core/git-diff.d.ts +20 -9
  259. package/dist/src/core/git-diff.js +148 -63
  260. package/dist/src/core/git-file-ops.d.ts +19 -19
  261. package/dist/src/core/git-file-ops.js +19 -19
  262. package/dist/src/core/git-readonly-index.d.ts +53 -19
  263. package/dist/src/core/git-readonly-index.js +75 -31
  264. package/dist/src/core/git-status.d.ts +5 -6
  265. package/dist/src/core/git-status.js +5 -6
  266. package/dist/src/core/git.d.ts +9 -10
  267. package/dist/src/core/git.js +57 -71
  268. package/dist/src/core/license-headers.d.ts +17 -23
  269. package/dist/src/core/license-headers.js +17 -23
  270. package/dist/src/core/mach-build-artifacts.d.ts +9 -9
  271. package/dist/src/core/mach-build-artifacts.js +57 -19
  272. package/dist/src/core/mach-error-hints.js +42 -29
  273. package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
  274. package/dist/src/core/mach-known-noise-filter.js +18 -20
  275. package/dist/src/core/mach-mozconfig.d.ts +14 -0
  276. package/dist/src/core/mach-mozconfig.js +30 -0
  277. package/dist/src/core/mach-resource-shim.d.ts +43 -58
  278. package/dist/src/core/mach-resource-shim.js +50 -67
  279. package/dist/src/core/mach.d.ts +37 -41
  280. package/dist/src/core/mach.js +50 -51
  281. package/dist/src/core/marionette-port.d.ts +36 -1
  282. package/dist/src/core/marionette-port.js +96 -31
  283. package/dist/src/core/marionette-preflight.d.ts +8 -12
  284. package/dist/src/core/marionette-preflight.js +86 -52
  285. package/dist/src/core/mochitest-server-port.d.ts +42 -0
  286. package/dist/src/core/mochitest-server-port.js +119 -0
  287. package/dist/src/core/module-resolution-preflight.d.ts +9 -11
  288. package/dist/src/core/module-resolution-preflight.js +9 -11
  289. package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
  290. package/dist/src/core/moz-manifest-helpers.js +163 -0
  291. package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
  292. package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
  293. package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
  294. package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
  295. package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
  296. package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
  297. package/dist/src/core/ownership-table.d.ts +14 -16
  298. package/dist/src/core/ownership-table.js +14 -16
  299. package/dist/src/core/parser-fallback.d.ts +15 -1
  300. package/dist/src/core/parser-fallback.js +22 -3
  301. package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
  302. package/dist/src/core/patch-apply-fuzz.js +15 -18
  303. package/dist/src/core/patch-apply.d.ts +13 -34
  304. package/dist/src/core/patch-apply.js +16 -76
  305. package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
  306. package/dist/src/core/patch-artifact-normalize.js +13 -15
  307. package/dist/src/core/patch-export-metadata.d.ts +12 -2
  308. package/dist/src/core/patch-export-metadata.js +13 -4
  309. package/dist/src/core/patch-export-update.d.ts +13 -1
  310. package/dist/src/core/patch-export-update.js +25 -8
  311. package/dist/src/core/patch-export.d.ts +15 -8
  312. package/dist/src/core/patch-export.js +10 -11
  313. package/dist/src/core/patch-files.d.ts +5 -6
  314. package/dist/src/core/patch-files.js +5 -6
  315. package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
  316. package/dist/src/core/patch-identifier-suggest.js +14 -19
  317. package/dist/src/core/patch-lint-binary.d.ts +51 -0
  318. package/dist/src/core/patch-lint-binary.js +39 -0
  319. package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
  320. package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
  321. package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
  322. package/dist/src/core/patch-lint-checkjs.js +41 -20
  323. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
  324. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
  325. package/dist/src/core/patch-lint-creators.d.ts +8 -8
  326. package/dist/src/core/patch-lint-creators.js +8 -8
  327. package/dist/src/core/patch-lint-cross.d.ts +17 -20
  328. package/dist/src/core/patch-lint-cross.js +16 -16
  329. package/dist/src/core/patch-lint-css.d.ts +3 -5
  330. package/dist/src/core/patch-lint-css.js +17 -22
  331. package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
  332. package/dist/src/core/patch-lint-diff-tag.js +14 -16
  333. package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
  334. package/dist/src/core/patch-lint-jsdoc.js +26 -19
  335. package/dist/src/core/patch-lint-mozbuild.js +20 -20
  336. package/dist/src/core/patch-lint-observer.d.ts +7 -7
  337. package/dist/src/core/patch-lint-observer.js +7 -7
  338. package/dist/src/core/patch-lint.d.ts +38 -29
  339. package/dist/src/core/patch-lint.js +89 -121
  340. package/dist/src/core/patch-lock.d.ts +1 -1
  341. package/dist/src/core/patch-lock.js +45 -9
  342. package/dist/src/core/patch-manifest-consistency.d.ts +57 -6
  343. package/dist/src/core/patch-manifest-consistency.js +111 -40
  344. package/dist/src/core/patch-manifest-files-affected.d.ts +43 -0
  345. package/dist/src/core/patch-manifest-files-affected.js +77 -0
  346. package/dist/src/core/patch-manifest-io.js +14 -18
  347. package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
  348. package/dist/src/core/patch-manifest-resolve.js +9 -12
  349. package/dist/src/core/patch-manifest-validate.d.ts +6 -1
  350. package/dist/src/core/patch-manifest-validate.js +25 -13
  351. package/dist/src/core/patch-manifest.d.ts +2 -1
  352. package/dist/src/core/patch-manifest.js +2 -1
  353. package/dist/src/core/patch-parse.d.ts +24 -13
  354. package/dist/src/core/patch-parse.js +19 -14
  355. package/dist/src/core/patch-policy.d.ts +2 -2
  356. package/dist/src/core/patch-policy.js +2 -2
  357. package/dist/src/core/patch-registration-refs.d.ts +7 -8
  358. package/dist/src/core/patch-registration-refs.js +9 -9
  359. package/dist/src/core/process-cpu-time.d.ts +12 -0
  360. package/dist/src/core/process-cpu-time.js +52 -0
  361. package/dist/src/core/rebase-session.d.ts +38 -26
  362. package/dist/src/core/rebase-session.js +55 -28
  363. package/dist/src/core/register-browser-content.js +9 -74
  364. package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
  365. package/dist/src/core/register-module.js +10 -43
  366. package/dist/src/core/register-scaffold.d.ts +8 -8
  367. package/dist/src/core/register-scaffold.js +10 -10
  368. package/dist/src/core/register-shared-css.d.ts +9 -12
  369. package/dist/src/core/register-shared-css.js +17 -87
  370. package/dist/src/core/register-xpcshell-test.d.ts +6 -7
  371. package/dist/src/core/register-xpcshell-test.js +7 -8
  372. package/dist/src/core/shared-ftl.js +12 -4
  373. package/dist/src/core/state-file.d.ts +45 -0
  374. package/dist/src/core/state-file.js +34 -0
  375. package/dist/src/core/status-binary.d.ts +18 -11
  376. package/dist/src/core/status-binary.js +19 -12
  377. package/dist/src/core/status-classify.d.ts +30 -36
  378. package/dist/src/core/status-classify.js +21 -26
  379. package/dist/src/core/test-changed-prefs.d.ts +30 -0
  380. package/dist/src/core/test-changed-prefs.js +78 -0
  381. package/dist/src/core/test-harness-crash.d.ts +25 -63
  382. package/dist/src/core/test-harness-crash.js +121 -142
  383. package/dist/src/core/test-harness-signature.d.ts +18 -0
  384. package/dist/src/core/test-harness-signature.js +13 -0
  385. package/dist/src/core/test-path-scope.d.ts +12 -15
  386. package/dist/src/core/test-path-scope.js +15 -18
  387. package/dist/src/core/test-stale-check.d.ts +17 -17
  388. package/dist/src/core/test-stale-check.js +50 -43
  389. package/dist/src/core/test-stall-triage.d.ts +51 -0
  390. package/dist/src/core/test-stall-triage.js +126 -0
  391. package/dist/src/core/token-category.js +66 -14
  392. package/dist/src/core/token-coverage.js +9 -9
  393. package/dist/src/core/token-dark-mode.d.ts +9 -11
  394. package/dist/src/core/token-dark-mode.js +29 -13
  395. package/dist/src/core/token-docs.d.ts +2 -0
  396. package/dist/src/core/token-docs.js +3 -1
  397. package/dist/src/core/token-manager.d.ts +10 -2
  398. package/dist/src/core/token-manager.js +17 -8
  399. package/dist/src/core/token-scaffold.d.ts +7 -7
  400. package/dist/src/core/token-scaffold.js +7 -7
  401. package/dist/src/core/token-variant.d.ts +4 -4
  402. package/dist/src/core/token-variant.js +28 -6
  403. package/dist/src/core/toolchain-preflight.d.ts +20 -21
  404. package/dist/src/core/toolchain-preflight.js +28 -31
  405. package/dist/src/core/tree-guard.js +12 -2
  406. package/dist/src/core/tree-store.d.ts +41 -27
  407. package/dist/src/core/tree-store.js +68 -43
  408. package/dist/src/core/typecheck-shim.d.ts +23 -24
  409. package/dist/src/core/typecheck-shim.js +23 -24
  410. package/dist/src/core/typecheck.js +15 -9
  411. package/dist/src/core/wire-destroy.d.ts +3 -3
  412. package/dist/src/core/wire-destroy.js +7 -15
  413. package/dist/src/core/wire-dom-fragment.d.ts +9 -17
  414. package/dist/src/core/wire-dom-fragment.js +11 -44
  415. package/dist/src/core/wire-init.d.ts +2 -3
  416. package/dist/src/core/wire-init.js +8 -19
  417. package/dist/src/core/wire-subscript.d.ts +2 -3
  418. package/dist/src/core/wire-subscript.js +4 -13
  419. package/dist/src/core/wire-utils.d.ts +7 -8
  420. package/dist/src/core/wire-utils.js +7 -8
  421. package/dist/src/core/xpcshell-appdir.d.ts +38 -45
  422. package/dist/src/core/xpcshell-appdir.js +38 -45
  423. package/dist/src/errors/base.d.ts +37 -16
  424. package/dist/src/errors/base.js +37 -16
  425. package/dist/src/errors/build.d.ts +13 -1
  426. package/dist/src/errors/build.js +14 -2
  427. package/dist/src/errors/codes.d.ts +16 -0
  428. package/dist/src/errors/codes.js +16 -0
  429. package/dist/src/errors/furnace.d.ts +4 -4
  430. package/dist/src/errors/git.d.ts +6 -10
  431. package/dist/src/errors/git.js +6 -10
  432. package/dist/src/errors/patch.d.ts +7 -7
  433. package/dist/src/errors/patch.js +7 -7
  434. package/dist/src/errors/rebase.d.ts +4 -4
  435. package/dist/src/errors/rebase.js +4 -4
  436. package/dist/src/index.d.ts +7 -1
  437. package/dist/src/index.js +5 -0
  438. package/dist/src/types/commands/index.d.ts +2 -2
  439. package/dist/src/types/commands/options.d.ts +111 -70
  440. package/dist/src/types/commands/patches.d.ts +24 -34
  441. package/dist/src/types/commands/project.d.ts +5 -34
  442. package/dist/src/types/config.d.ts +25 -23
  443. package/dist/src/types/config.js +6 -1
  444. package/dist/src/types/furnace.d.ts +37 -13
  445. package/dist/src/types/furnace.js +19 -1
  446. package/dist/src/types/index.d.ts +3 -3
  447. package/dist/src/utils/build-info.d.ts +7 -8
  448. package/dist/src/utils/build-info.js +12 -11
  449. package/dist/src/utils/errors.d.ts +6 -8
  450. package/dist/src/utils/errors.js +6 -8
  451. package/dist/src/utils/logger.d.ts +27 -10
  452. package/dist/src/utils/logger.js +28 -16
  453. package/dist/src/utils/machine-output.d.ts +12 -0
  454. package/dist/src/utils/machine-output.js +33 -0
  455. package/dist/src/utils/options.d.ts +31 -14
  456. package/dist/src/utils/options.js +86 -30
  457. package/dist/src/utils/paths.d.ts +10 -8
  458. package/dist/src/utils/paths.js +10 -8
  459. package/dist/src/utils/platform.d.ts +0 -25
  460. package/dist/src/utils/platform.js +1 -42
  461. package/dist/src/utils/process-group.d.ts +9 -4
  462. package/dist/src/utils/process-group.js +19 -5
  463. package/dist/src/utils/process.d.ts +42 -7
  464. package/dist/src/utils/process.js +44 -17
  465. package/dist/src/utils/ps-duration.d.ts +31 -0
  466. package/dist/src/utils/ps-duration.js +70 -0
  467. package/dist/src/utils/regex.d.ts +9 -10
  468. package/dist/src/utils/regex.js +9 -10
  469. package/dist/src/utils/validation.d.ts +58 -28
  470. package/dist/src/utils/validation.js +60 -33
  471. package/package.json +3 -3
  472. package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
  473. package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
  474. package/dist/src/core/manifest-helpers.d.ts +0 -38
  475. package/dist/src/core/manifest-helpers.js +0 -120
  476. /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
  477. /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
  478. /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
@@ -48,6 +48,22 @@ export declare const ExitCode: {
48
48
  * missing profile, etc.).
49
49
  */
50
50
  readonly SMOKE_LAUNCH_FAILURE: 13;
51
+ /**
52
+ * A `fireforge test` run produced a harness result that cannot be trusted
53
+ * — `engine/` moved (or became unprobeable) while the tests ran. Distinct
54
+ * from BUILD_ERROR because the two are opposites: a 5 is a suite that
55
+ * FAILED, a 14 is a suite whose result was THROWN AWAY. A consumer should
56
+ * re-run a 14 (after settling the writers) and must not report it as red.
57
+ */
58
+ readonly INCONCLUSIVE: 14;
59
+ /**
60
+ * A lock wait expired: the run never started, because another FireForge
61
+ * process held the lock for the whole budget. Distinct from GENERAL_ERROR
62
+ * because nothing about the request was wrong — a consumer should re-queue
63
+ * it, with a larger `--wait-lock` budget, rather than treat it as a
64
+ * failure of the work it asked for.
65
+ */
66
+ readonly LOCK_TIMEOUT: 15;
51
67
  /**
52
68
  * The user cancelled an interactive prompt. 130 = 128 + SIGINT, the
53
69
  * conventional "interrupted by the user" code — scripts and CI can tell
@@ -49,6 +49,22 @@ export const ExitCode = {
49
49
  * missing profile, etc.).
50
50
  */
51
51
  SMOKE_LAUNCH_FAILURE: 13,
52
+ /**
53
+ * A `fireforge test` run produced a harness result that cannot be trusted
54
+ * — `engine/` moved (or became unprobeable) while the tests ran. Distinct
55
+ * from BUILD_ERROR because the two are opposites: a 5 is a suite that
56
+ * FAILED, a 14 is a suite whose result was THROWN AWAY. A consumer should
57
+ * re-run a 14 (after settling the writers) and must not report it as red.
58
+ */
59
+ INCONCLUSIVE: 14,
60
+ /**
61
+ * A lock wait expired: the run never started, because another FireForge
62
+ * process held the lock for the whole budget. Distinct from GENERAL_ERROR
63
+ * because nothing about the request was wrong — a consumer should re-queue
64
+ * it, with a larger `--wait-lock` budget, rather than treat it as a
65
+ * failure of the work it asked for.
66
+ */
67
+ LOCK_TIMEOUT: 15,
52
68
  /**
53
69
  * The user cancelled an interactive prompt. 130 = 128 + SIGINT, the
54
70
  * conventional "interrupted by the user" code — scripts and CI can tell
@@ -8,10 +8,10 @@ export declare class FurnaceError extends FireForgeError {
8
8
  constructor(message: string, component?: string | undefined, cause?: Error, options?: {
9
9
  /**
10
10
  * Suppresses the "run furnace validate" advice line. Set by callers
11
- * whose message already tells the user to run validate (or that ARE
12
- * the validate command) — an explicit flag, because the previous
13
- * `message.includes('furnace validate')` sniffing dropped the advice
14
- * from any error that merely MENTIONED the command.
11
+ * whose message already tells the user to run validate, or that ARE
12
+ * the validate command. An explicit flag rather than sniffing the
13
+ * message for `furnace validate`, which drops the advice from any
14
+ * error that merely MENTIONS the command.
15
15
  */
16
16
  omitValidateAdvice?: boolean;
17
17
  });
@@ -48,17 +48,13 @@ export declare class GitIndexLockError extends GitError {
48
48
  */
49
49
  export declare function isGitIndexLockConflict(error: unknown): boolean;
50
50
  /**
51
- * Error thrown when `git add` (monolithic or chunked) exceeds the
52
- * configured timeout while indexing the Firefox source tree.
51
+ * Error thrown when `git add` (monolithic or chunked) exceeds the configured
52
+ * timeout while indexing the Firefox source tree.
53
53
  *
54
- * 2026-04-24 eval Finding 10: a 140.10.0esr bump on a previously-working
55
- * 140.9.0esr workspace aborted after ~854s with a generic
56
- * `AbortError: The operation was aborted`. The root cause was the
57
- * `git add` timeout firing, but the surfaced error was indistinguishable
58
- * from any other AbortError and gave the operator no actionable
59
- * direction. This typed error carries the elapsed budget and the
60
- * environment-variable override so the recovery path is
61
- * self-documenting.
54
+ * A bare `AbortError: The operation was aborted` after ~15 minutes is
55
+ * indistinguishable from any other AbortError and gives the operator no
56
+ * actionable direction. This typed error carries the elapsed budget and the
57
+ * environment-variable override so the recovery path is self-documenting.
62
58
  */
63
59
  export declare class GitIndexingTimeoutError extends GitError {
64
60
  readonly phase: 'monolithic' | 'chunked';
@@ -114,17 +114,13 @@ export function isGitIndexLockConflict(error) {
114
114
  /(unable to create|another git process seems to be running|file exists|locked)/i.test(error.message));
115
115
  }
116
116
  /**
117
- * Error thrown when `git add` (monolithic or chunked) exceeds the
118
- * configured timeout while indexing the Firefox source tree.
117
+ * Error thrown when `git add` (monolithic or chunked) exceeds the configured
118
+ * timeout while indexing the Firefox source tree.
119
119
  *
120
- * 2026-04-24 eval Finding 10: a 140.10.0esr bump on a previously-working
121
- * 140.9.0esr workspace aborted after ~854s with a generic
122
- * `AbortError: The operation was aborted`. The root cause was the
123
- * `git add` timeout firing, but the surfaced error was indistinguishable
124
- * from any other AbortError and gave the operator no actionable
125
- * direction. This typed error carries the elapsed budget and the
126
- * environment-variable override so the recovery path is
127
- * self-documenting.
120
+ * A bare `AbortError: The operation was aborted` after ~15 minutes is
121
+ * indistinguishable from any other AbortError and gives the operator no
122
+ * actionable direction. This typed error carries the elapsed budget and the
123
+ * environment-variable override so the recovery path is self-documenting.
128
124
  */
129
125
  export class GitIndexingTimeoutError extends GitError {
130
126
  phase;
@@ -2,13 +2,13 @@ import { FireForgeError } from './base.js';
2
2
  /**
3
3
  * Error thrown when `patches.json` exists but cannot be parsed or validated.
4
4
  *
5
- * This must be a HARD error on every mutating path. The historical behavior
6
- * collapsed "corrupt" into "absent" (`loadPatchesManifest` returned null for
7
- * both), so the next `fireforge export` would rebuild the manifest containing
8
- * only the new patch — silently destroying every other patch's metadata
9
- * (tiers, descriptions, lintIgnore, staged dependencies) — and a failed
10
- * export's rollback would then delete `patches.json` outright because the
11
- * "before" state looked absent (2026-07-05 review, finding H2).
5
+ * This must be a HARD error on every mutating path. Collapsing "corrupt"
6
+ * into "absent" — a `loadPatchesManifest` that returns null for both — makes
7
+ * the next `fireforge export` rebuild the manifest containing only the new
8
+ * patch, silently destroying every other patch's metadata (tiers,
9
+ * descriptions, lintIgnore, staged dependencies); a failed export's rollback
10
+ * then deletes `patches.json` outright, because the "before" state looked
11
+ * absent.
12
12
  */
13
13
  export declare class PatchManifestCorruptError extends FireForgeError {
14
14
  readonly manifestPath: string;
@@ -4,13 +4,13 @@ import { ExitCode } from './codes.js';
4
4
  /**
5
5
  * Error thrown when `patches.json` exists but cannot be parsed or validated.
6
6
  *
7
- * This must be a HARD error on every mutating path. The historical behavior
8
- * collapsed "corrupt" into "absent" (`loadPatchesManifest` returned null for
9
- * both), so the next `fireforge export` would rebuild the manifest containing
10
- * only the new patch — silently destroying every other patch's metadata
11
- * (tiers, descriptions, lintIgnore, staged dependencies) — and a failed
12
- * export's rollback would then delete `patches.json` outright because the
13
- * "before" state looked absent (2026-07-05 review, finding H2).
7
+ * This must be a HARD error on every mutating path. Collapsing "corrupt"
8
+ * into "absent" — a `loadPatchesManifest` that returns null for both — makes
9
+ * the next `fireforge export` rebuild the manifest containing only the new
10
+ * patch, silently destroying every other patch's metadata (tiers,
11
+ * descriptions, lintIgnore, staged dependencies); a failed export's rollback
12
+ * then deletes `patches.json` outright, because the "before" state looked
13
+ * absent.
14
14
  */
15
15
  export class PatchManifestCorruptError extends FireForgeError {
16
16
  manifestPath;
@@ -21,11 +21,11 @@ export declare class NoRebaseSessionError extends RebaseError {
21
21
  /**
22
22
  * Thrown when the session file exists but cannot be used.
23
23
  *
24
- * This case had no error of its own before 0.41.0 and was reported as
24
+ * Without an error of its own, this case is reported as
25
25
  * {@link NoRebaseSessionError} by `--continue`/`--abort` while `rebase`
26
- * reported {@link RebaseSessionExistsError} — a closed cycle in which each
27
- * command pointed at the other two. The message names the file so an operator
28
- * always has a way out, and `--abort` now clears a corrupt session rather than
26
+ * reports {@link RebaseSessionExistsError} — a closed cycle in which each
27
+ * command points at the other two. The message names the file so an operator
28
+ * always has a way out, and `--abort` clears a corrupt session rather than
29
29
  * refusing to run against one.
30
30
  */
31
31
  export declare class CorruptRebaseSessionError extends RebaseError {
@@ -35,11 +35,11 @@ export class NoRebaseSessionError extends RebaseError {
35
35
  /**
36
36
  * Thrown when the session file exists but cannot be used.
37
37
  *
38
- * This case had no error of its own before 0.41.0 and was reported as
38
+ * Without an error of its own, this case is reported as
39
39
  * {@link NoRebaseSessionError} by `--continue`/`--abort` while `rebase`
40
- * reported {@link RebaseSessionExistsError} — a closed cycle in which each
41
- * command pointed at the other two. The message names the file so an operator
42
- * always has a way out, and `--abort` now clears a corrupt session rather than
40
+ * reports {@link RebaseSessionExistsError} — a closed cycle in which each
41
+ * command points at the other two. The message names the file so an operator
42
+ * always has a way out, and `--abort` clears a corrupt session rather than
43
43
  * refusing to run against one.
44
44
  */
45
45
  export class CorruptRebaseSessionError extends RebaseError {
@@ -8,9 +8,15 @@
8
8
  * but may change between minor versions until 1.0 is released. Pin to an
9
9
  * exact version if you depend on the programmatic API.
10
10
  *
11
+ * **What belongs here:** a type earns a place on this surface only if it is
12
+ * reachable from the signature of an exported VALUE — i.e. a consumer needs
13
+ * it to name an argument or a return. Everything else stays internal to
14
+ * `src/types/`.
15
+ *
11
16
  * @packageDocumentation
12
17
  */
13
18
  export { loadConfig, validateConfig } from './core/config.js';
19
+ export type { ApplyAllComponentsResult } from './core/furnace-apply.js';
14
20
  export { applyAllComponents } from './core/furnace-apply.js';
15
21
  export { ensureFurnaceConfig, loadFurnaceConfig, loadFurnaceState, saveFurnaceState, validateFurnaceConfig, } from './core/furnace-config.js';
16
22
  export { validateAllComponents, validateComponent } from './core/furnace-validate.js';
@@ -20,4 +26,4 @@ export type { AddTokenOptions, AddTokenResult, TokenMode } from './core/token-ma
20
26
  export { addToken, getTokensCssPath, validateTokenAdd } from './core/token-manager.js';
21
27
  export { CancellationError, CommandError, FireForgeError, GeneralError, InvalidArgumentError, ResolutionError, } from './errors/base.js';
22
28
  export { ExitCode } from './errors/codes.js';
23
- export type { ApplyResult, BuildConfig, BuildMode, BuildOptions, ComponentType, CustomComponentConfig, DiscardOptions, DoctorCheck, DownloadOptions, DryRunAction, ExportOptions, FireForgeConfig, FireForgeState, FirefoxConfig, FirefoxProduct, FurnaceConfig, FurnaceCreateOptions, FurnaceOverrideOptions, FurnaceRemoveOptions, FurnaceState, GlobalOptions, ImportOptions, ImportSummary, OverrideComponentConfig, OverrideType, PackageOptions, PatchCategory, PatchesManifest, PatchInfo, PatchLintIssue, PatchMetadata, PatchResult, ProjectLicense, ProjectPaths, ProjectStatus, ReExportOptions, RegistrationStatus, ResetOptions, RunOptions, ScannedComponent, SetupOptions, StepError, SyncResult, TestOptions, TokenCoverageFileEntry, TokenCoverageReport, ValidationIssue, WireConfig, } from './types/index.js';
29
+ export type { ApplyResult, BuildConfig, ComponentType, CustomComponentConfig, DryRunAction, FireForgeConfig, FirefoxConfig, FirefoxProduct, FurnaceConfig, FurnaceState, OverrideComponentConfig, OverrideType, ProjectLicense, StepError, ValidationIssue, WireConfig, } from './types/index.js';
package/dist/src/index.js CHANGED
@@ -9,6 +9,11 @@
9
9
  * but may change between minor versions until 1.0 is released. Pin to an
10
10
  * exact version if you depend on the programmatic API.
11
11
  *
12
+ * **What belongs here:** a type earns a place on this surface only if it is
13
+ * reachable from the signature of an exported VALUE — i.e. a consumer needs
14
+ * it to name an argument or a return. Everything else stays internal to
15
+ * `src/types/`.
16
+ *
12
17
  * @packageDocumentation
13
18
  */
14
19
  export { loadConfig, validateConfig } from './core/config.js';
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Re-exports all command-related types from focused sub-modules.
3
3
  */
4
- export type { BuildOptions, DiscardOptions, DoctorOptions, DownloadOptions, ExportOptions, FurnaceApplyOptions, FurnaceCreateOptions, FurnaceDeployOptions, FurnaceOverrideOptions, FurnacePreviewOptions, FurnaceRefreshOptions, FurnaceRemoveOptions, FurnaceSyncOptions, FurnaceValidateOptions, GlobalOptions, ImportOptions, LintCommandOptions, PackageOptions, PatchCompactOptions, PatchDeleteOptions, PatchLintIgnoreOptions, PatchMoveFilesOptions, PatchRenameOptions, PatchReorderOptions, PatchSplitOptions, PatchStagedDependencyOptions, PatchTierOptions, RebaseOptions, ReExportOptions, RegisterOptions, ResetOptions, RunOptions, SetupOptions, SourceSetOptions, StatusOptions, TestOptions, TokenAddOptions, WireOptions, } from './options.js';
4
+ export type { BuildOptions, DiscardOptions, DoctorOptions, DownloadOptions, ExportOptions, FurnaceApplyOptions, FurnaceCreateOptions, FurnaceDeployOptions, FurnaceOverrideOptions, FurnacePreviewOptions, FurnaceRefreshOptions, FurnaceRemoveOptions, FurnaceSyncOptions, FurnaceValidateOptions, ImportOptions, LintCommandOptions, PackageOptions, PatchCompactOptions, PatchDeleteOptions, PatchLintIgnoreOptions, PatchMoveFilesOptions, PatchRenameOptions, PatchReorderOptions, PatchSplitOptions, PatchStagedDependencyOptions, PatchTierOptions, RebaseOptions, ReExportOptions, RegisterOptions, ResetOptions, RunOptions, SetupOptions, SourceSetOptions, StatusOptions, TestOptions, TokenAddOptions, WireOptions, } from './options.js';
5
5
  export type { ImportSummary, PatchCategory, PatchesManifest, PatchInfo, PatchLintIssue, PatchMetadata, PatchResult, PatchStagedDependencies, PatchStagedForwardImport, PatchStagedRegistration, } from './patches.js';
6
- export type { DoctorCheck, ProjectStatus, TokenCoverageFileEntry, TokenCoverageReport, } from './project.js';
6
+ export type { DoctorCheck, TokenCoverageFileEntry, TokenCoverageReport } from './project.js';
@@ -68,8 +68,8 @@ export interface BuildOptions {
68
68
  rewriteMozinfo?: boolean;
69
69
  /**
70
70
  * Refuse the build (rather than warn) when it would overwrite engine
71
- * content recorded in neither a patch body nor the pristine baseline
72
- *. The default is a loud warning, because an interactive
71
+ * content recorded in neither a patch body nor the pristine baseline.
72
+ * The default is a loud warning, because an interactive
73
73
  * operator often means to discard the drift; a scripted gate on a
74
74
  * multi-session checkout wants the hard stop.
75
75
  */
@@ -170,8 +170,7 @@ export interface ResetOptions {
170
170
  export interface DiscardOptions {
171
171
  /**
172
172
  * Restore to pristine upstream (HEAD) instead of the patch-applied
173
- * baseline; deletes patch-created files (the pre-0.39.0 semantics —
174
- *).
173
+ * baseline, deleting patch-created files.
175
174
  */
176
175
  toUpstream?: boolean;
177
176
  /** Show what would be discarded without doing it */
@@ -190,6 +189,11 @@ export interface PackageOptions {
190
189
  * Options for the import command.
191
190
  */
192
191
  export interface ImportOptions {
192
+ /**
193
+ * Answer the engine-drift prompt non-interactively. Unlike `force`,
194
+ * this does NOT waive the patch-integrity gate.
195
+ */
196
+ yes?: boolean;
193
197
  /** Specific patches to apply (by name) */
194
198
  patches?: string[];
195
199
  /** Continue applying patches even if one fails */
@@ -272,13 +276,10 @@ export interface ReExportOptions {
272
276
  */
273
277
  tier?: 'branding';
274
278
  /**
275
- * Lint check IDs to suppress, **appended** (union) to the patch's
276
- * existing `lintIgnore` list. De-duplicated. Mutually exclusive with
277
- * `--all`. To remove an entry or clear the list entirely, use the
278
- * `fireforge patch lint-ignore` subcommand (which has explicit
279
- * `--add` / `--remove` / `--clear` modes); re-export's append-only
280
- * semantics match the operator's most common intent ("I want this
281
- * patch to also suppress X").
279
+ * Lint check IDs to suppress, **appended** (union) to the patch's existing
280
+ * `lintIgnore` list. De-duplicated. Mutually exclusive with `--all`. To
281
+ * remove an entry or clear the list, use `fireforge patch lint-ignore`,
282
+ * which has explicit `--add` / `--remove` / `--clear` modes.
282
283
  */
283
284
  lintIgnore?: string[];
284
285
  /**
@@ -298,10 +299,9 @@ export interface ReExportOptions {
298
299
  */
299
300
  refuseAdjacentUnmanaged?: boolean;
300
301
  /**
301
- * Bypass per-patch lint result cache reads AND writes for this
302
- * invocation (`--no-cache`). The cache is what makes a repeat
303
- * re-export of an unchanged patch skip the checkJs program build
304
- * entirely.
302
+ * Bypass per-patch lint result cache reads AND writes for this invocation
303
+ * (`--no-cache`). The cache is what lets a repeat re-export of an unchanged
304
+ * patch skip the checkJs program build entirely.
305
305
  */
306
306
  noCache?: boolean;
307
307
  /**
@@ -317,9 +317,9 @@ export interface ReExportOptions {
317
317
  * Engine-relative files whose drift is EXPECTED (`--expect`, repeatable;
318
318
  * requires `--refuse-foreign-drift`). The content-based drift detector
319
319
  * cannot tell the exporting session's own slice edits from another
320
- * session's, so a real slice export under the refusal flag
321
- * names its intended files here: drift confined to expected files
322
- * proceeds, drift anywhere else still refuses.
320
+ * session's, so a slice export under the refusal flag names its intended
321
+ * files here: drift confined to expected files proceeds, drift anywhere
322
+ * else still refuses.
323
323
  */
324
324
  expect?: string[];
325
325
  }
@@ -329,6 +329,11 @@ export interface ReExportOptions {
329
329
  * `.patch` file body — the manifest is the only thing that changes.
330
330
  */
331
331
  export interface PatchTierOptions {
332
+ /**
333
+ * Seconds to wait for the patch directory lock. This command mutates patch
334
+ * metadata under that lock.
335
+ */
336
+ waitLock?: number | boolean;
332
337
  /** Force the named tier on the patch. Only `"branding"` is recognised. */
333
338
  tier?: 'branding';
334
339
  /** Remove the `tier` override entirely, restoring auto-detection. */
@@ -344,6 +349,11 @@ export interface PatchTierOptions {
344
349
  * be set per invocation.
345
350
  */
346
351
  export interface PatchLintIgnoreOptions {
352
+ /**
353
+ * Seconds to wait for the patch directory lock. This command mutates patch
354
+ * metadata under that lock.
355
+ */
356
+ waitLock?: number | boolean;
347
357
  /** Lint check IDs to add to the patch's `lintIgnore` list (union, de-duped). */
348
358
  add?: string[];
349
359
  /** Lint check IDs to remove from the patch's `lintIgnore` list. */
@@ -361,6 +371,11 @@ export interface PatchLintIgnoreOptions {
361
371
  * declarations, or clear all staged dependencies from the patch.
362
372
  */
363
373
  export interface PatchStagedDependencyOptions {
374
+ /**
375
+ * Seconds to wait for the patch directory lock. This command mutates patch
376
+ * metadata under that lock.
377
+ */
378
+ waitLock?: number | boolean;
364
379
  /** Add a staged dependency declaration. */
365
380
  add?: boolean;
366
381
  /** Remove matching staged dependency declarations. */
@@ -455,6 +470,11 @@ export interface PatchMoveFilesOptions {
455
470
  * Options for the rebase command.
456
471
  */
457
472
  export interface RebaseOptions {
473
+ /**
474
+ * Seconds to wait for the patch directory lock. The rebase loop rewrites
475
+ * patch bodies under that lock.
476
+ */
477
+ waitLock?: number | boolean;
458
478
  /** Resume a previously interrupted rebase session */
459
479
  continue?: boolean;
460
480
  /** Cancel the current rebase session and restore engine */
@@ -525,20 +545,29 @@ export interface TestOptions {
525
545
  * Run the scoped pre-test build (packaging exactly the requested paths,
526
546
  * MIXED harnesses allowed) and exit without dispatching tests. One
527
547
  * ~10-minute build then covers both an xpcshell and a browser-chrome
528
- * half of a slice; run each harness afterwards without `--build`
529
- *. Emits `FIREFORGE-VERDICT: PASS` on success.
548
+ * half of a slice; run each harness afterwards without `--build`.
549
+ * Emits `FIREFORGE-VERDICT: PASS` on success.
530
550
  */
531
551
  buildOnly?: boolean;
532
552
  /**
533
553
  * Union the paths this build packages onto the recorded coverage claim
534
- * instead of REPLACING it, so successive scoped builds
535
- * accumulate and an earlier slice's build-less runs stay covered. Valid
536
- * only with `--build`/`--build-only` and explicit paths. Refused
537
- * fail-closed unless the build anchor is unchanged: same engine HEAD,
538
- * same `engine/mozconfig`, and every previously fingerprinted packageable
539
- * file byte-identical. See `src/core/coverage-extend.ts`.
554
+ * instead of REPLACING it, so successive scoped builds accumulate and an
555
+ * earlier slice's build-less runs stay covered. Valid only with
556
+ * `--build`/`--build-only` and explicit paths. Refused fail-closed unless
557
+ * the build anchor is unchanged: same engine HEAD, same `engine/mozconfig`,
558
+ * and every previously fingerprinted packageable file byte-identical. See
559
+ * `src/core/coverage-extend.ts`.
540
560
  */
541
561
  extendCoverage?: boolean;
562
+ /**
563
+ * Forwarded to the PRE-TEST build: refuse (rather than warn) when that
564
+ * build would overwrite engine content recorded in neither a patch body
565
+ * nor the pristine baseline. Same meaning as `fireforge build`'s flag of
566
+ * the same name — a scripted `test --build` is exactly the shape the
567
+ * multi-session hazard shows up in, and until now it was the one shape
568
+ * that could not arm the refusal. Valid only with `--build`/`--build-only`.
569
+ */
570
+ refuseUnexportedDrift?: boolean;
542
571
  /** Forward mach's pathless auto-selection mode. Valid only with no explicit paths. */
543
572
  auto?: boolean;
544
573
  /**
@@ -591,7 +620,7 @@ export interface TestOptions {
591
620
  * single-suite run auto-selects. Escape hatch for the rare case where a
592
621
  * suite-specific command misbehaves; on a healthy host the generic command
593
622
  * is equivalent. The default (auto suite dispatch) skips the mozlog
594
- * resource monitor that crashes `mach test` on a broken host (E1).
623
+ * resource monitor that crashes `mach test` on a broken host.
595
624
  */
596
625
  genericMachTest?: boolean;
597
626
  /**
@@ -804,13 +833,11 @@ export interface PatchDeleteOptions {
804
833
  waitLock?: number | boolean;
805
834
  }
806
835
  /**
807
- * Options for the `fireforge patch rename` subcommand. Updates the
808
- * patch's filename, manifest `name`, and (optionally) `description`
809
- * atomically without rewriting the `.patch` file body. Companion to
810
- * `re-export --files` for the case where the body is already correct
811
- * but the patch's identity (filename + description) describes a
812
- * pre-shrink scope; before this verb existed the only workaround was
813
- * `delete` + re-export, which briefly dropped the patch from the queue.
836
+ * Options for the `fireforge patch rename` subcommand. Updates the patch's
837
+ * filename, manifest `name`, and (optionally) `description` atomically
838
+ * without rewriting the `.patch` file body. Companion to `re-export --files`
839
+ * for the case where the body is already correct but the patch's identity
840
+ * describes a pre-shrink scope.
814
841
  */
815
842
  export interface PatchRenameOptions {
816
843
  /**
@@ -915,9 +942,9 @@ export interface StatusOptions {
915
942
  * `ownership` block — the flat path→owning-patch rows plus
916
943
  * managed/unmanaged/conflict counts — so a gate reads ownership,
917
944
  * classification, and the check verdict from ONE scan instead of three
918
- * back-to-back `status` invocations. A modifier, not a mode:
919
- * exit semantics are unchanged, so ownership conflicts still fail only
920
- * the human `--ownership` mode. Refused without `--json`.
945
+ * back-to-back `status` invocations. A modifier, not a mode: exit
946
+ * semantics are unchanged, so ownership conflicts still fail only the
947
+ * human `--ownership` mode. Refused without `--json`.
921
948
  */
922
949
  includeOwnership?: boolean;
923
950
  /**
@@ -955,7 +982,35 @@ export interface TokenAddOptions {
955
982
  * Options for the doctor command.
956
983
  */
957
984
  export interface DoctorOptions {
985
+ /**
986
+ * Seconds to wait for the patch directory lock. This command can mutate
987
+ * the patch manifest under that lock.
988
+ */
989
+ waitLock?: number | boolean;
990
+ /**
991
+ * Rebuild patches.json from the on-disk patch files, preserving every
992
+ * field the patch bodies cannot express. Refused when patches.json exists
993
+ * but cannot be parsed, unless `allowMetadataLoss` is also set.
994
+ */
958
995
  repairPatchesManifest?: boolean;
996
+ /**
997
+ * Repair only the `filesAffected` lists that disagree with their patch
998
+ * body. Narrower than `repairPatchesManifest`: it rewrites one field on the
999
+ * drifted rows and leaves every other row byte-identical, and it needs no
1000
+ * project config, so it works on a project whose fireforge.json is broken.
1001
+ */
1002
+ repairFilesAffected?: boolean;
1003
+ /**
1004
+ * Accept the whole-manifest metadata reinvention that rebuilding an
1005
+ * unparseable patches.json implies. Only meaningful with
1006
+ * `repairPatchesManifest`.
1007
+ */
1008
+ allowMetadataLoss?: boolean;
1009
+ /**
1010
+ * Project what a requested repair would change and write nothing. Refused
1011
+ * without a repair flag rather than accepted as a silent no-op.
1012
+ */
1013
+ dryRun?: boolean;
959
1014
  /**
960
1015
  * Clear a stale `pendingResolution` marker, but only after the same
961
1016
  * read-only queue health checks used by `fireforge verify` report no
@@ -976,13 +1031,6 @@ export interface DoctorOptions {
976
1031
  /** Run extra post-rebase checks for common Firefox registration surfaces. */
977
1032
  postRebaseAudit?: boolean;
978
1033
  }
979
- /**
980
- * Global CLI options available to all commands.
981
- */
982
- export interface GlobalOptions {
983
- /** Enable verbose/debug output */
984
- verbose?: boolean;
985
- }
986
1034
  /** Options controlling how the lint command filters and tags its output. */
987
1035
  export interface LintCommandOptions {
988
1036
  /**
@@ -995,38 +1043,31 @@ export interface LintCommandOptions {
995
1043
  since?: string;
996
1044
  /**
997
1045
  * When set together with {@link since}, scope the exit code to issues
998
- * tagged `introduced`. Cumulative pre-existing errors still print (so
999
- * the operator can still see the full queue state) but do not fail
1000
- * lint. Motivating case: a branch whose diff is clean but whose repo
1001
- * already carries unrelated `raw-color` / license-header errors from
1002
- * older patches. Without this flag, CI treats the clean branch as
1003
- * failing; with it, a branch "breaks the build" only when its own diff
1004
- * introduced a new error.
1046
+ * tagged `introduced`. Cumulative pre-existing errors still print, so the
1047
+ * operator sees the full queue state, but do not fail lint. This is for a
1048
+ * branch whose own diff is clean but whose repo carries unrelated
1049
+ * `raw-color` / license-header errors from older patches.
1005
1050
  *
1006
- * Requires {@link since}: without a revision to diff against there is
1007
- * no distinction between introduced and cumulative, so the flag is
1008
- * rejected up-front rather than silently ignored.
1051
+ * Requires {@link since}: without a revision to diff against there is no
1052
+ * distinction between introduced and cumulative, so the flag is rejected
1053
+ * up-front rather than silently ignored.
1009
1054
  */
1010
1055
  onlyIntroduced?: boolean;
1011
1056
  /**
1012
- * Lint each patch in the queue as its own isolated diff, rather than
1013
- * the aggregate `git diff HEAD` across all applied patches.
1057
+ * Lint each patch in the queue as its own isolated diff, rather than the
1058
+ * aggregate `git diff HEAD` across all applied patches.
1014
1059
  *
1015
- * Motivating case: running `fireforge lint` (no args) on a repo where
1016
- * `fireforge import` or `fireforge rebase` has just applied the full
1017
- * patch queue produces an aggregate diff (every patch's changes
1018
- * summed). The patch-size advisory rules (`large-patch-lines`,
1019
- * `large-patch-files`) then fire against the sum — e.g. "Patch is
1020
- * 37529 lines" on a queue of 22 individually-fine patches — which
1021
- * reads as a task-specific regression when it is really an artefact
1022
- * of the aggregation. `--per-patch` rescopes the diff to each patch's
1023
- * own `filesAffected`, honours the patch's own `lintIgnore`, and runs
1024
- * the cross-patch rules once over the whole queue so queue-level
1025
- * findings (duplicate creations, forward imports) still surface.
1060
+ * On a repo where `import` or `rebase` has just applied the full queue,
1061
+ * the aggregate diff sums every patch's changes, and the patch-size
1062
+ * advisory rules (`large-patch-lines`, `large-patch-files`) fire against
1063
+ * that sum — "Patch is 37529 lines" for a queue of individually-fine
1064
+ * patches. `--per-patch` rescopes the diff to each patch's own
1065
+ * `filesAffected`, honours the patch's own `lintIgnore`, and runs the
1066
+ * cross-patch rules once over the whole queue so queue-level findings
1067
+ * still surface.
1026
1068
  *
1027
- * Positional file arguments change meaning under this flag: they are
1028
- * PATCH selectors resolved like {@link patches} entries, not engine
1029
- * file paths.
1069
+ * Positional file arguments change meaning under this flag: they are PATCH
1070
+ * selectors resolved like {@link patches} entries, not engine file paths.
1030
1071
  */
1031
1072
  perPatch?: boolean;
1032
1073
  /**
@@ -68,49 +68,39 @@ export interface PatchMetadata {
68
68
  /** Array of file paths affected by this patch */
69
69
  filesAffected: string[];
70
70
  /**
71
- * Optional per-patch list of lint check IDs to suppress when this patch
72
- * is the target of `export`, `export-all`, or `re-export`. Exists for
73
- * the class of patch that is advisory-noisy by nature — a cohesive
74
- * branding bundle, a localised-resource pack, an auto-generated
75
- * manifest — where the generic `large-patch-lines` / `large-patch-files`
76
- * thresholds do not apply but `--skip-lint` (which silences *all*
77
- * errors, not just the one that does not apply) is too coarse a hammer.
71
+ * Optional per-patch list of lint check IDs to suppress when this patch is
72
+ * the target of `export`, `export-all`, or `re-export`. Exists for the
73
+ * class of patch that is advisory-noisy by nature — a cohesive branding
74
+ * bundle, a localised-resource pack, an auto-generated manifest — where
75
+ * the generic `large-patch-lines` / `large-patch-files` thresholds do not
76
+ * apply but `--skip-lint`, which silences every error rather than the one
77
+ * that does not apply, is too coarse.
78
78
  *
79
- * Previously the only escape hatches were `--skip-lint` (blunt) or the
80
- * full `rebase` flow (refreshes the same patch through a code path that
81
- * silently skips `runPatchLint` — an asymmetry that forced operators
82
- * through a multi-minute Firefox source re-download just to refresh
83
- * one patch body).
84
- *
85
- * Values are free-form check IDs (e.g. `"large-patch-lines"`,
86
- * `"large-patch-files"`). Checks not listed here still run normally.
87
- * An entry for an unknown check ID is a no-op — the patch metadata
88
- * documents the *intent* to suppress even if the check is later
89
- * renamed or removed.
79
+ * Values are free-form check IDs (e.g. `"large-patch-lines"`). Checks not
80
+ * listed here still run normally. An entry for an unknown check ID is a
81
+ * no-op — the metadata documents the intent to suppress even if the check
82
+ * is later renamed or removed.
90
83
  */
91
84
  lintIgnore?: string[];
92
85
  /**
93
86
  * Optional per-patch threshold-tier override for the `large-patch-lines`
94
87
  * rule. Exists for branding patches that must touch a small number of
95
88
  * cross-cutting registration files alongside `browser/branding/<name>/`
96
- * (notably `browser/moz.configure` to register the new branding flavor
97
- * with the top-level configure). The narrow auto-detect allowlist in
98
- * `isBrandingOnlyPatch` covers the canonical shape, but a fork whose
99
- * branding patch also touches an unlisted sibling (for example a
100
- * `browser/themes/<name>/` override or a vendor-specific icon
101
- * resource) falls through to the general tier and trips the hard
102
- * limit on what is legitimately one branding diff.
89
+ * (notably `browser/moz.configure`, which registers the new branding
90
+ * flavor with the top-level configure). The narrow auto-detect allowlist
91
+ * in `isBrandingOnlyPatch` covers the canonical shape; a fork whose
92
+ * branding patch also touches an unlisted sibling falls through to the
93
+ * general tier and trips the hard limit on what is legitimately one
94
+ * branding diff.
103
95
  *
104
- * Declaring `tier: "branding"` here forces the branding thresholds
105
- * (notice 8000 / warning 18000 / error 30000 lines, ≤60 files)
106
- * regardless of `filesAffected`. The tier is the weaker claim than
107
- * test — a patch of all-tests still lands in the test tier even if
108
- * this field is set, because the test-tier thresholds are already
109
- * more permissive and a test that is also branding-shaped is
110
- * vanishingly rare.
96
+ * Declaring `tier: "branding"` forces the branding thresholds (notice
97
+ * 8000 / warning 18000 / error 30000 lines, ≤60 files) regardless of
98
+ * `filesAffected`. It is the weaker claim than test: an all-tests patch
99
+ * stays in the test tier even with this set, because those thresholds are
100
+ * already more permissive.
111
101
  *
112
- * Only `"branding"` is currently recognised. Unknown values are
113
- * rejected by the manifest validator, not silently stripped.
102
+ * Only `"branding"` is recognised. Unknown values are rejected by the
103
+ * manifest validator, not silently stripped.
114
104
  */
115
105
  tier?: 'branding';
116
106
  /**