@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
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * The guard is installed as a `fireforge_mach_guard.pth` + module pair in
15
15
  * every discovered mach virtualenv site-packages directory. A PYTHONPATH
16
- * `sitecustomize.py` is NOT sufficient on its own: mach re-execs itself into
16
+ * `sitecustomize.py` is not sufficient on its own: mach re-execs itself into
17
17
  * its private virtualenv and drops PYTHONPATH, so that route never loads.
18
18
  * `.pth` files execute at interpreter startup from the venv's own
19
19
  * site-packages, which survives the re-exec. The PYTHONPATH copy is retained
@@ -22,12 +22,12 @@
22
22
  *
23
23
  * The guard covers the whole crash family:
24
24
  * - wraps `psutil.virtual_memory` / `swap_memory` / `cpu_percent` /
25
- * `cpu_times` / `disk_io_counters` module-wide, so every call site —
25
+ * `cpu_times` / `disk_io_counters` module-wide, so every call site,
26
26
  * including the direct `psutil.virtual_memory()` in
27
- * `mozbuild.base._run_make` — degrades to a `UserWarning` and a zeroed
27
+ * `mozbuild.base._run_make`, degrades to a `UserWarning` and a zeroed
28
28
  * reading instead of aborting.
29
29
  *
30
- * The fallback must be per-function ARITY-CORRECT and reconstructible:
30
+ * The fallback must be per-function arity-correct and reconstructible:
31
31
  * mozsystemmonitor captures reading types at `__init__`
32
32
  * (`self._swap_type = type(psutil.swap_memory())`) and rebuilds each
33
33
  * collector sample via `self._swap_type(*swap_mem)`. An svmem-shaped
@@ -37,39 +37,46 @@
37
37
  * sentinel, and mach hangs forever in its atexit `waitpid`. Each wrapped
38
38
  * function therefore degrades to a zeroed instance of psutil's own result
39
39
  * namedtuple where resolvable, else a module-level guard-owned namedtuple
40
- * with the exact field order and arity for THAT function (module-level so
40
+ * with the exact field order and arity for that function (module-level so
41
41
  * readings pickle by reference across the collector pipe).
42
42
  * `_DegradedReading` remains only as a documented last resort and
43
43
  * tolerates `type(reading)(*values)` reconstruction. Guard-owned fallback
44
44
  * classes never depend on psutil internals resolving, which also makes
45
45
  * them safe when two guard copies load (PYTHONPATH `sitecustomize` in the
46
- * bootstrap phase plus the in-venv `.pth`), each with its own classes;
47
- * - guards `SystemResourceMonitor` CONSTRUCTION via an import hook:
46
+ * bootstrap phase plus the in-venv `.pth`), each with its own classes.
47
+ * - guards `SystemResourceMonitor` construction via an import hook:
48
48
  * `poll_interval` is pre-populated before the real `__init__` runs, a
49
49
  * failing `__init__` marks the instance degraded instead of raising, and
50
- * every monitor method no-ops on a degraded instance — so a
50
+ * every monitor method no-ops on a degraded instance, so a
51
51
  * partially-constructed monitor can never surface the
52
52
  * `AttributeError: poll_interval` variant. Degraded aggregate methods
53
53
  * return zeroed shapes (not `None`) where callers subscript the result
54
54
  * (`aggregate_io` → zeroed io reading, so mozbuild's `log_resource_usage`
55
- * does not die on `usage["io"].read_bytes` after a successful compile);
55
+ * does not die on `usage["io"].read_bytes` after a successful compile).
56
56
  * - suppresses the mozsystemmonitor collector child on degradation: once
57
57
  * any psutil degradation is observed in the process, monitors are kept
58
58
  * inert (`start` never spawns the collector), and a degraded transition
59
59
  * or raising `stop` best-effort terminates a live collector child and
60
60
  * drains the pipe, so a malformed sample stream cannot wedge mach's
61
- * shutdown even if a future shape mismatch slips through;
61
+ * shutdown even if a future shape mismatch slips through.
62
62
  * - wraps `mozbuild.controller.building.BuildMonitor.log_resource_usage` to
63
63
  * warn-and-continue on any exception, so end-of-build resource reporting
64
64
  * can never fail a build whose artifacts are complete.
65
65
  */
66
- import { readdir } from 'node:fs/promises';
67
- import { homedir, tmpdir } from 'node:os';
66
+ import { lstat, mkdir, readdir } from 'node:fs/promises';
67
+ import { homedir, tmpdir, userInfo } from 'node:os';
68
68
  import { delimiter, join } from 'node:path';
69
+ import { BuildError } from '../errors/build.js';
69
70
  import { toError } from '../utils/errors.js';
70
- import { ensureDir, pathExists, writeText } from '../utils/fs.js';
71
+ import { pathExists, writeText } from '../utils/fs.js';
71
72
  import { verbose } from '../utils/logger.js';
72
- /** Directory name (under the OS temp dir) holding the PYTHONPATH fallback. */
73
+ /**
74
+ * Prefix of the per-user directory (under the OS temp dir) holding the
75
+ * PYTHONPATH fallback. The uid (or, on Windows, the username) is appended:
76
+ * a fixed name under a shared `/tmp` lets any other local account pre-create
77
+ * the directory and own the `sitecustomize.py` that every mach dispatch
78
+ * then imports.
79
+ */
73
80
  const RESOURCE_SHIM_DIRNAME = 'fireforge-mach-resource-shim';
74
81
  /** Basename (sans extension) of the in-venv guard module. */
75
82
  const GUARD_MODULE_NAME = 'fireforge_mach_guard';
@@ -89,6 +96,7 @@ export const GUARD_PYTHON_SOURCE = `# Generated by FireForge - do not edit.
89
96
  # (survives mach's venv re-exec, which drops PYTHONPATH).
90
97
  import builtins
91
98
  import collections
99
+ import inspect
92
100
  import sys
93
101
  import warnings
94
102
 
@@ -369,7 +377,40 @@ def _patch_monitor_class(cls):
369
377
 
370
378
  return wrapper
371
379
 
380
+ def _wrap_unbound(name, func):
381
+ # Upstream declares record_event/record_marker as @staticmethods (and
382
+ # may declare others as @classmethods). Those take no receiver, so
383
+ # they cannot use the per-instance degraded flag and must not have one
384
+ # threaded in — see the descriptor dispatch below.
385
+ def wrapper(*args, **kwargs):
386
+ if _fireforge_host_degraded[0]:
387
+ return _monitor_degraded_result(name, args, kwargs)
388
+ try:
389
+ return func(*args, **kwargs)
390
+ except Exception as exc: # noqa: BLE001
391
+ _fireforge_degraded_notice(exc)
392
+ return _monitor_degraded_result(name, args, kwargs)
393
+
394
+ return wrapper
395
+
372
396
  for _name in _MONITOR_METHOD_NAMES:
397
+ # getattr_static returns the raw class attribute, so a staticmethod
398
+ # is still a staticmethod object here. Plain getattr would hand back
399
+ # the underlying function, and re-setting THAT on the class rebinds
400
+ # it as an instance method: the receiver is then passed through as an
401
+ # extra leading positional and every call raises
402
+ # "takes N positional arguments but N+1 were given". Re-apply the
403
+ # descriptor the attribute actually had.
404
+ try:
405
+ _raw = inspect.getattr_static(cls, _name)
406
+ except AttributeError:
407
+ continue
408
+ if isinstance(_raw, staticmethod):
409
+ setattr(cls, _name, staticmethod(_wrap_unbound(_name, _raw.__func__)))
410
+ continue
411
+ if isinstance(_raw, classmethod):
412
+ setattr(cls, _name, classmethod(_wrap_unbound(_name, _raw.__func__)))
413
+ continue
373
414
  _orig = getattr(cls, _name, None)
374
415
  if _orig is not None:
375
416
  setattr(cls, _name, _wrap_method(_name, _orig))
@@ -488,13 +529,75 @@ async function discoverMachSitePackages(engineDir) {
488
529
  return found;
489
530
  }
490
531
  /**
491
- * Writes the PYTHONPATH `sitecustomize.py` fallback into a stable
492
- * FireForge-owned temp directory and returns that directory. Idempotent —
493
- * overwriting each call keeps it in sync with this source across upgrades.
532
+ * Per-user discriminator for the shim directory name. The numeric uid on
533
+ * POSIX, read via `process.getuid` rather than `os.userInfo()`: the latter
534
+ * resolves the passwd entry and throws (`ERR_SYSTEM_ERROR`) for a uid that
535
+ * has none (`docker --user 1001:1001`, OpenShift's random uids, many CI
536
+ * agents), which would take every build and test dispatch down with a raw
537
+ * system error. On Windows there is no uid. The username is the
538
+ * discriminator, with `userInfo()` still guarded because the same lookup
539
+ * can fail there for a service account, falling back to the environment.
540
+ */
541
+ function shimDirOwner() {
542
+ const uid = process.getuid?.();
543
+ if (uid !== undefined)
544
+ return String(uid);
545
+ let username;
546
+ try {
547
+ username = userInfo().username;
548
+ }
549
+ catch {
550
+ username = process.env['USERNAME'] ?? process.env['USER'];
551
+ }
552
+ return (username ?? 'unknown-user').replace(/[^A-Za-z0-9_.-]/g, '_');
553
+ }
554
+ /** Per-user shim directory: `<tmpdir>/fireforge-mach-resource-shim-<uid>`. */
555
+ function resourceShimDir() {
556
+ return join(tmpdir(), `${RESOURCE_SHIM_DIRNAME}-${shimDirOwner()}`);
557
+ }
558
+ /**
559
+ * Refuses a shim directory that is not a private directory of the current
560
+ * user. `lstat`, not `stat`: a symlink planted at the path would otherwise
561
+ * be followed and the check would describe its target. On Windows only the
562
+ * "is a real directory" half applies. There is no POSIX owner or mode bit
563
+ * to read, and the per-user name is the isolation.
564
+ *
565
+ * @param dir - Shim directory that {@link ensureSitecustomizeFallback} created
566
+ * @throws BuildError when the directory is a symlink/file, owned by another
567
+ * uid, or group/world-writable
568
+ */
569
+ export async function assertPrivateShimDir(dir) {
570
+ const stats = await lstat(dir);
571
+ const refuse = (reason) => {
572
+ throw new BuildError(`Refusing to use mach resource shim directory ${dir}: ${reason}. ` +
573
+ 'Another local account may have planted it; remove or fix it and retry.');
574
+ };
575
+ if (!stats.isDirectory()) {
576
+ refuse('not a directory (symlink or file)');
577
+ }
578
+ if (process.platform === 'win32')
579
+ return;
580
+ const uid = process.getuid?.();
581
+ if (uid !== undefined && stats.uid !== uid) {
582
+ refuse(`owned by uid ${stats.uid}, not the current user (uid ${uid})`);
583
+ }
584
+ if ((stats.mode & 0o022) !== 0) {
585
+ refuse(`mode ${(stats.mode & 0o777).toString(8)} is group/world-writable`);
586
+ }
587
+ }
588
+ /**
589
+ * Writes the PYTHONPATH `sitecustomize.py` fallback into a per-user,
590
+ * mode-0700 FireForge-owned temp directory, verified private before the
591
+ * write, and returns that directory. Idempotent: overwriting each call
592
+ * keeps it in sync with this source across upgrades.
494
593
  */
495
594
  async function ensureSitecustomizeFallback() {
496
- const dir = join(tmpdir(), RESOURCE_SHIM_DIRNAME);
497
- await ensureDir(dir);
595
+ const dir = resourceShimDir();
596
+ // `mode` only applies when mkdir creates the directory (and is masked by
597
+ // the umask). A pre-existing one keeps whatever it had, which is exactly
598
+ // what the assertion below refuses if it is not private.
599
+ await mkdir(dir, { recursive: true, mode: 0o700 });
600
+ await assertPrivateShimDir(dir);
498
601
  await writeText(join(dir, 'sitecustomize.py'), GUARD_PYTHON_SOURCE);
499
602
  return dir;
500
603
  }
@@ -512,7 +615,7 @@ function machResourceShimEnv(shimDir, baseEnv = process.env) {
512
615
  * `fireforge_mach_guard.pth` + `fireforge_mach_guard.py` into every
513
616
  * discovered mach virtualenv site-packages (survives mach's venv re-exec),
514
617
  * plus the PYTHONPATH sitecustomize fallback for the pre-venv bootstrap
515
- * phase. Idempotent and re-run before EVERY protected dispatch (including
618
+ * phase. Idempotent and re-run before every protected dispatch (including
516
619
  * each retry) so a venv created by a crashed first attempt is guarded on
517
620
  * the next one instead of re-dying on the same wedged state.
518
621
  */
@@ -524,7 +627,7 @@ export async function installMachResourceGuard(engineDir) {
524
627
  await writeText(join(sitePackages, `${GUARD_MODULE_NAME}.pth`), `import ${GUARD_MODULE_NAME}\n`);
525
628
  }
526
629
  catch (error) {
527
- // A read-only or vanished venv must not block the dispatch; the
630
+ // A read-only or vanished venv must not block the dispatch. The
528
631
  // PYTHONPATH fallback still applies and other venvs may have taken
529
632
  // the guard.
530
633
  verbose(`Could not install mach resource guard into ${sitePackages}: ${toError(error).message}`);
@@ -2,7 +2,7 @@ import { type SmokeLineCallback, type SmokeRunResult } from '../utils/process.js
2
2
  import { type HarnessCrashSignature } from './test-harness-crash.js';
3
3
  export { attemptMozinfoRewrite, buildArtifactMismatchMessage, hasBuildArtifacts, hasRunnableBundle, } from './mach-build-artifacts.js';
4
4
  export { generateMozconfig } from './mach-mozconfig.js';
5
- export { ensurePython, resetResolvedPython } from './mach-python.js';
5
+ export { ensurePython } from './mach-python.js';
6
6
  /**
7
7
  * Ensures mach is available in the engine directory.
8
8
  * @param engineDir - Path to the engine directory
@@ -18,17 +18,17 @@ export interface MachOptions {
18
18
  /** Whether to inherit stdio (show output directly) */
19
19
  inherit?: boolean;
20
20
  /**
21
- * Collapse the KNOWN mozsystemmonitor teardown traceback to one labeled
22
- * line in the terminal ECHO (capture-only option). The captured
23
- * stdout/stderr stay raw — the harness classifier depends on the raw
21
+ * Collapse the known mozsystemmonitor teardown traceback to one labeled
22
+ * line in the terminal echo (capture-only option). The captured
23
+ * stdout/stderr stay raw, because the harness classifier depends on the raw
24
24
  * traceback. Unrecognized tracebacks always echo verbatim. Opted into by
25
25
  * the test dispatchers only.
26
26
  *
27
- * Consumed by {@link runMachCapture} ALONE. `runMachInheritCapture` accepts
28
- * it in the type and ignores it — the inherit path has no per-chunk hook,
27
+ * Consumed by {@link runMachCapture} alone. `runMachInheritCapture` accepts
28
+ * it in the type and ignores it: the inherit path has no per-chunk hook,
29
29
  * only a mirror stream that feeds the terminal and the run log the same
30
30
  * string, so filtering there would strip the traceback from the raw log
31
- * too. The build path uses the recognition NOTE instead; see
31
+ * too. The build path uses the recognition note instead. See
32
32
  * `mach-known-noise-filter.ts`.
33
33
  */
34
34
  annotateKnownTeardownNoise?: boolean;
@@ -66,12 +66,6 @@ export declare function runMachCapture(args: string[], engineDir: string, option
66
66
  * capturing stdout/stderr for post-run diagnostics.
67
67
  */
68
68
  export declare function runMachInheritCapture(args: string[], engineDir: string, options?: Omit<MachOptions, 'inherit'>): Promise<MachCommandResult>;
69
- /**
70
- * Runs mach bootstrap to install build dependencies.
71
- * @param engineDir - Path to the engine directory
72
- * @returns Exit code
73
- */
74
- export declare function bootstrap(engineDir: string): Promise<number>;
75
69
  /**
76
70
  * Runs mach bootstrap while preserving stdin and capturing the emitted output.
77
71
  * @param engineDir - Path to the engine directory
@@ -98,20 +92,20 @@ export interface ProtectedMachBuildResult extends MachCommandResult {
98
92
  }
99
93
  /**
100
94
  * The single protected path every FireForge mach build dispatch routes
101
- * through — `build`, `build --ui`, and the pre-test `--build` step all use
95
+ * through. `build`, `build --ui`, and the pre-test `--build` step all use
102
96
  * it, so no entry point is left unprotected with a different retry budget:
103
97
  *
104
- * 1. installs the resource-monitor degrade guard IN the mach virtualenvs
105
- * (plus the PYTHONPATH fallback) — re-installed before every attempt, so
98
+ * 1. installs the resource-monitor degrade guard in the mach virtualenvs
99
+ * (plus the PYTHONPATH fallback), re-installed before every attempt, so
106
100
  * a venv materialized by a crashed first attempt is guarded on the next
107
- * one instead of every retry dying on the same wedged state;
108
- * 2. spawns a fresh mach process per attempt;
109
- * 3. retries ONLY the recognized harness-crash family (resource monitor /
110
- * psutil startup tracebacks) up to the uniform budget — an ordinary
101
+ * one instead of every retry dying on the same wedged state.
102
+ * 2. spawns a fresh mach process per attempt.
103
+ * 3. retries only the recognized harness-crash family (resource monitor /
104
+ * psutil startup tracebacks) up to the uniform budget. An ordinary
111
105
  * compile error is never retried.
112
106
  *
113
107
  * The protected path never runs `mach configure`, never clobbers, and never
114
- * widens the requested build kind — a `faster` dispatch retries as
108
+ * widens the requested build kind: a `faster` dispatch retries as
115
109
  * `mach build faster`, so it cannot invalidate more of the objdir than the
116
110
  * command the operator asked for.
117
111
  */
@@ -122,8 +116,8 @@ export declare function runProtectedMachBuild(kind: ProtectedBuildKind, engineDi
122
116
  * hints are surfaced on top of the raw mach output so operators get an
123
117
  * actionable nudge alongside the cryptic mozbuild traceback. Returns the
124
118
  * captured result so the caller (e.g. `fireforge build`) can inspect the
125
- * tail for post-build diagnostics that mach prints AFTER "Your build was
126
- * successful!" — notably the stale `config.status is out of date`
119
+ * tail for post-build diagnostics that mach prints after "Your build was
120
+ * successful!", notably the stale `config.status is out of date`
127
121
  * notice that mach emits when a tool-managed edit landed on
128
122
  * `moz.configure` before the build.
129
123
  * @param engineDir - Path to the engine directory
@@ -147,13 +141,13 @@ export declare function buildUI(engineDir: string): Promise<ProtectedMachBuildRe
147
141
  *
148
142
  * Without it, a `build --ui` started while a full `build` is still in flight
149
143
  * hands off to `mach build faster` and fails almost immediately with `No
150
- * rule to make target 'XUL'` — the real problem being that the first build
144
+ * rule to make target 'XUL'`, the real problem being that the first build
151
145
  * has not yet materialised the full backend, with nothing in the low-level
152
146
  * make error pointing at the concurrent run. The lock intercepts the second
153
147
  * invocation before it touches mach, and the refusal names the PID holding
154
148
  * the lock so the operator can decide whether to wait or investigate.
155
149
  *
156
- * Stale-lock recovery: the lock stores the owner PID; a crashed build
150
+ * Stale-lock recovery: the lock stores the owner PID. A crashed build
157
151
  * (SIGINT, SIGTERM, or a kernel kill) leaves the lock dir behind but not the
158
152
  * owning process, and `withFileLock` removes the lock on the next attempt
159
153
  * when `process.kill(pid, 0)` shows the owner is gone.
@@ -191,42 +185,28 @@ export interface RunMachSmokeOptions {
191
185
  * enforces a deadline by SIGTERMing the whole process group, and returns
192
186
  * the captured output alongside a `timedOut` flag.
193
187
  *
194
- * Unlike {@link run}, this variant does NOT inherit stdio. The child
188
+ * Unlike {@link run}, this variant does not inherit stdio. The child
195
189
  * stdout/stderr are piped back through the line callbacks so the caller
196
190
  * can scan for `JavaScript error:` / `console.error:` without coupling
197
191
  * the runner to chrome-specific pattern logic.
198
192
  */
199
193
  export declare function runMachSmoke(args: string[], engineDir: string, options: RunMachSmokeOptions): Promise<SmokeRunResult>;
200
- /**
201
- * Creates a distribution package.
202
- * @param engineDir - Path to the engine directory
203
- * @returns Exit code
204
- */
205
- export declare function machPackage(engineDir: string): Promise<number>;
206
194
  /**
207
195
  * Creates a distribution package while streaming output to the terminal
208
- * and capturing the stderr tail for post-run diagnostics. Callers that
209
- * want to consult {@link explainMachError} on failure should use this
210
- * variant; the inherit-only `machPackage` above remains for callers that
211
- * just need an exit code.
196
+ * and capturing the stderr tail for post-run diagnostics, so callers can
197
+ * consult {@link explainMachError} on failure.
212
198
  *
213
199
  * @param engineDir - Path to the engine directory
214
200
  * @returns Captured mach result (stdout tail, stderr tail, exit code)
215
201
  */
216
202
  export declare function machPackageCapture(engineDir: string): Promise<MachCommandResult>;
217
- /**
218
- * Runs mach watch for auto-rebuilding.
219
- * @param engineDir - Path to the engine directory
220
- * @returns Exit code
221
- */
222
- export declare function watch(engineDir: string): Promise<number>;
223
203
  /**
224
204
  * Runs mach watch while preserving stdin and capturing emitted output.
225
205
  *
226
206
  * `env` is threaded through so the caller can prepend the resolved watchman
227
207
  * directory to PATH in a way mach inherits: `fireforge watch` can locate
228
208
  * `watchman` via `which`, but the mach subprocess spawns with the parent's
229
- * PATH only — on macOS that typically omits `/opt/homebrew/bin`, so
209
+ * PATH only, and on macOS that typically omits `/opt/homebrew/bin`, so
230
210
  * `mach watch` fails at the `watch-project` subscription step.
231
211
  *
232
212
  * @param engineDir - Path to the engine directory
@@ -238,38 +218,44 @@ export declare function watchWithOutput(engineDir: string, options?: {
238
218
  env?: Record<string, string>;
239
219
  }): Promise<MachCommandResult>;
240
220
  /**
241
- * Runs mach test with the given test paths.
242
- * @param engineDir - Path to the engine directory
243
- * @param testPaths - Test file or directory paths (relative to engine)
244
- * @param args - Additional arguments to pass to mach test
245
- * @returns Exit code
246
- */
247
- export declare function test(engineDir: string, testPaths?: string[], args?: string[]): Promise<number>;
248
- /**
249
- * Runs mach test while capturing streamed output for better diagnostics.
221
+ * Which mach test command a capturing test dispatch runs.
250
222
  *
251
- * @param engineDir - Absolute path to the engine checkout
252
- * @param testPaths - Test paths to pass to `mach test`; empty runs the default set
253
- * @param args - Extra `mach test` arguments appended after the paths
254
- * @param env - Optional extra environment variables for the mach process
255
- * (merged over `process.env` by the exec layer). Used by
256
- * `fireforge test --perf-samples` to publish the artifact-path contract.
223
+ * - `test`: the generic `mach test` (mixed/all-tests runs, or the
224
+ * `--generic-mach-test` opt-out).
225
+ * - `xpcshell-test` / `mochitest`: the suite-specific commands. Unlike the
226
+ * generic `mach test`, these degrade a broken mozlog resource monitor to a
227
+ * warning instead of crashing at startup, so `fireforge test` dispatches
228
+ * single-suite runs to them to stay resilient to the host psutil failure.
257
229
  */
258
- export declare function testWithOutput(engineDir: string, testPaths?: string[], args?: string[], env?: Record<string, string>, fullOutput?: boolean): Promise<MachCommandResult>;
230
+ export type MachTestSuiteKind = 'test' | 'xpcshell-test' | 'mochitest';
231
+ /** Options for {@link runMachTestSuite}. */
232
+ export interface MachTestSuiteOptions {
233
+ /** Absolute path to the engine checkout. */
234
+ engineDir: string;
235
+ /** Test paths to pass to the mach command. Empty runs the default set. */
236
+ testPaths?: string[];
237
+ /** Extra mach arguments appended after the paths. */
238
+ args?: string[];
239
+ /**
240
+ * Extra environment variables for the mach process (merged over
241
+ * `process.env` by the exec layer). Used by `fireforge test
242
+ * --perf-samples` to publish the artifact-path contract.
243
+ */
244
+ env?: Record<string, string> | undefined;
245
+ /**
246
+ * Pass full mozbuild verbosity through by unsetting the coding-agent
247
+ * markers that quiet it. See {@link CODING_AGENT_ENV_MARKERS}.
248
+ */
249
+ fullOutput?: boolean | undefined;
250
+ }
259
251
  /**
260
- * Runs `mach xpcshell-test` (the suite-specific xpcshell command) while
261
- * capturing output. Unlike the generic `mach test`, the suite-specific
262
- * commands degrade a broken mozlog resource monitor to a warning instead of
263
- * crashing at startup, so `fireforge test` dispatches single-suite runs here
264
- * to stay resilient to the host psutil failure.
252
+ * Runs one mach test command (`mach test` / `mach xpcshell-test` / `mach
253
+ * mochitest`) while capturing streamed output for better diagnostics. The
254
+ * three commands share every other detail of the dispatch (resource guard,
255
+ * verbosity env, teardown-noise annotation), so they share one entry point
256
+ * keyed by `kind` rather than three copies that drift.
265
257
  *
266
- * Signature mirrors {@link testWithOutput} so the two are interchangeable in
267
- * the dispatch path.
268
- */
269
- export declare function xpcshellTestWithOutput(engineDir: string, testPaths?: string[], args?: string[], env?: Record<string, string>, fullOutput?: boolean): Promise<MachCommandResult>;
270
- /**
271
- * Runs `mach mochitest` (covers browser-chrome / mochitest flavors) while
272
- * capturing output. The suite-specific counterpart to {@link testWithOutput}
273
- * for non-xpcshell single-suite runs — see {@link xpcshellTestWithOutput}.
258
+ * @param kind - Which mach command to run
259
+ * @param options - Engine checkout, test paths, extra args, env, verbosity
274
260
  */
275
- export declare function mochitestWithOutput(engineDir: string, testPaths?: string[], args?: string[], env?: Record<string, string>, fullOutput?: boolean): Promise<MachCommandResult>;
261
+ export declare function runMachTestSuite(kind: MachTestSuiteKind, options: MachTestSuiteOptions): Promise<MachCommandResult>;