@hominis/fireforge 0.46.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 (606) hide show
  1. package/CHANGELOG.md +381 -498
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +17 -17
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +9 -9
  6. package/dist/src/cli-usage-error.js +12 -12
  7. package/dist/src/cli.d.ts +3 -2
  8. package/dist/src/cli.js +29 -28
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +2 -2
  11. package/dist/src/commands/build.js +12 -11
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +4 -4
  14. package/dist/src/commands/destructive-decision.js +4 -4
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -4
  17. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  18. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  20. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  21. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  22. package/dist/src/commands/doctor-furnace.js +22 -22
  23. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
  24. package/dist/src/commands/doctor-orphaned-harness.js +10 -11
  25. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  26. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  27. package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
  28. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  29. package/dist/src/commands/doctor-source-pin.js +14 -14
  30. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  31. package/dist/src/commands/doctor-working-tree.js +3 -3
  32. package/dist/src/commands/doctor.d.ts +2 -2
  33. package/dist/src/commands/doctor.js +9 -9
  34. package/dist/src/commands/download.js +15 -13
  35. package/dist/src/commands/export-all.js +8 -8
  36. package/dist/src/commands/export-flow.d.ts +5 -5
  37. package/dist/src/commands/export-flow.js +14 -14
  38. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  39. package/dist/src/commands/export-placement-conflicts.js +9 -9
  40. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  41. package/dist/src/commands/export-placement-gate.js +5 -5
  42. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  43. package/dist/src/commands/export-placement-policy.js +1 -1
  44. package/dist/src/commands/export-shared.d.ts +10 -10
  45. package/dist/src/commands/export-shared.js +13 -13
  46. package/dist/src/commands/export.js +4 -4
  47. package/dist/src/commands/furnace/apply.js +16 -16
  48. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  49. package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
  50. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  51. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  52. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  54. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  55. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  56. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  57. package/dist/src/commands/furnace/create-browser-test.js +4 -4
  58. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  59. package/dist/src/commands/furnace/create-dry-run.js +4 -4
  60. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  61. package/dist/src/commands/furnace/create-features.js +2 -2
  62. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  63. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  64. package/dist/src/commands/furnace/create-templates.d.ts +14 -14
  65. package/dist/src/commands/furnace/create-templates.js +18 -18
  66. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  67. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  68. package/dist/src/commands/furnace/create.d.ts +1 -1
  69. package/dist/src/commands/furnace/create.js +10 -10
  70. package/dist/src/commands/furnace/deploy.js +4 -4
  71. package/dist/src/commands/furnace/diff.js +7 -7
  72. package/dist/src/commands/furnace/index.js +1 -1
  73. package/dist/src/commands/furnace/init.js +15 -15
  74. package/dist/src/commands/furnace/list.js +2 -2
  75. package/dist/src/commands/furnace/override.d.ts +1 -1
  76. package/dist/src/commands/furnace/override.js +15 -15
  77. package/dist/src/commands/furnace/preview.js +17 -17
  78. package/dist/src/commands/furnace/refresh.js +6 -6
  79. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
  80. package/dist/src/commands/furnace/remove-mutations.js +19 -18
  81. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  82. package/dist/src/commands/furnace/remove-state.js +1 -1
  83. package/dist/src/commands/furnace/remove.js +2 -2
  84. package/dist/src/commands/furnace/rename-browser-test.js +9 -8
  85. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  86. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  87. package/dist/src/commands/furnace/rename.js +9 -9
  88. package/dist/src/commands/furnace/scan.js +3 -3
  89. package/dist/src/commands/furnace/status.js +7 -7
  90. package/dist/src/commands/furnace/sync.js +6 -6
  91. package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
  92. package/dist/src/commands/furnace/test-file-name.js +2 -2
  93. package/dist/src/commands/furnace/validate.js +11 -12
  94. package/dist/src/commands/import.js +20 -20
  95. package/dist/src/commands/lint-per-patch.js +8 -8
  96. package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
  97. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  98. package/dist/src/commands/lint-report.d.ts +3 -3
  99. package/dist/src/commands/lint-report.js +4 -4
  100. package/dist/src/commands/lint.d.ts +3 -3
  101. package/dist/src/commands/lint.js +35 -35
  102. package/dist/src/commands/manifest.d.ts +4 -4
  103. package/dist/src/commands/package.js +2 -2
  104. package/dist/src/commands/patch/compact.d.ts +2 -2
  105. package/dist/src/commands/patch/compact.js +8 -8
  106. package/dist/src/commands/patch/delete.d.ts +1 -1
  107. package/dist/src/commands/patch/delete.js +8 -8
  108. package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
  109. package/dist/src/commands/patch/lint-ignore.js +14 -15
  110. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  111. package/dist/src/commands/patch/move-files-create.js +5 -5
  112. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  113. package/dist/src/commands/patch/move-files-into.js +3 -3
  114. package/dist/src/commands/patch/move-files.js +1 -1
  115. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  116. package/dist/src/commands/patch/rename.d.ts +4 -4
  117. package/dist/src/commands/patch/rename.js +8 -8
  118. package/dist/src/commands/patch/reorder.js +10 -10
  119. package/dist/src/commands/patch/split-plan.d.ts +3 -3
  120. package/dist/src/commands/patch/split-plan.js +6 -5
  121. package/dist/src/commands/patch/split.d.ts +2 -2
  122. package/dist/src/commands/patch/split.js +5 -5
  123. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  124. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  125. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  126. package/dist/src/commands/patch/staged-dependency.js +6 -6
  127. package/dist/src/commands/patch/tier.d.ts +2 -2
  128. package/dist/src/commands/patch/tier.js +5 -5
  129. package/dist/src/commands/patch-rename-map.d.ts +1 -1
  130. package/dist/src/commands/patch-rename-map.js +1 -1
  131. package/dist/src/commands/pending-resolution.d.ts +5 -5
  132. package/dist/src/commands/pending-resolution.js +5 -5
  133. package/dist/src/commands/re-export-adjacent.d.ts +3 -3
  134. package/dist/src/commands/re-export-adjacent.js +8 -8
  135. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  136. package/dist/src/commands/re-export-bulk-scan.js +17 -17
  137. package/dist/src/commands/re-export-drift.d.ts +10 -10
  138. package/dist/src/commands/re-export-drift.js +29 -29
  139. package/dist/src/commands/re-export-files.js +14 -15
  140. package/dist/src/commands/re-export-lint.d.ts +26 -26
  141. package/dist/src/commands/re-export-lint.js +27 -27
  142. package/dist/src/commands/re-export-options.d.ts +1 -1
  143. package/dist/src/commands/re-export-options.js +1 -1
  144. package/dist/src/commands/re-export-register.d.ts +1 -1
  145. package/dist/src/commands/re-export-register.js +1 -1
  146. package/dist/src/commands/re-export-scan.d.ts +1 -1
  147. package/dist/src/commands/re-export-scan.js +7 -7
  148. package/dist/src/commands/re-export-single.d.ts +1 -1
  149. package/dist/src/commands/re-export-single.js +20 -20
  150. package/dist/src/commands/re-export.js +7 -6
  151. package/dist/src/commands/rebase/abort.js +6 -6
  152. package/dist/src/commands/rebase/continue.js +8 -7
  153. package/dist/src/commands/rebase/index.d.ts +1 -1
  154. package/dist/src/commands/rebase/index.js +3 -3
  155. package/dist/src/commands/rebase/patch-loop.js +18 -17
  156. package/dist/src/commands/register.js +5 -5
  157. package/dist/src/commands/reset.js +1 -1
  158. package/dist/src/commands/resolve.d.ts +2 -2
  159. package/dist/src/commands/resolve.js +3 -3
  160. package/dist/src/commands/run.js +26 -26
  161. package/dist/src/commands/setup-support.js +4 -4
  162. package/dist/src/commands/setup.js +1 -1
  163. package/dist/src/commands/source.js +1 -1
  164. package/dist/src/commands/status-check.d.ts +3 -3
  165. package/dist/src/commands/status-check.js +4 -4
  166. package/dist/src/commands/status-json.d.ts +14 -13
  167. package/dist/src/commands/status-json.js +9 -8
  168. package/dist/src/commands/status-output.d.ts +3 -3
  169. package/dist/src/commands/status-output.js +3 -3
  170. package/dist/src/commands/status-ownership.d.ts +3 -3
  171. package/dist/src/commands/status-ownership.js +3 -3
  172. package/dist/src/commands/status.js +22 -22
  173. package/dist/src/commands/test-build-phase.d.ts +1 -1
  174. package/dist/src/commands/test-build-phase.js +17 -17
  175. package/dist/src/commands/test-diagnose.d.ts +1 -1
  176. package/dist/src/commands/test-diagnose.js +20 -20
  177. package/dist/src/commands/test-modes.d.ts +2 -2
  178. package/dist/src/commands/test-modes.js +4 -4
  179. package/dist/src/commands/test-run.d.ts +11 -11
  180. package/dist/src/commands/test-run.js +15 -15
  181. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  182. package/dist/src/commands/test-stale-gate.js +13 -13
  183. package/dist/src/commands/test-verdict.d.ts +6 -6
  184. package/dist/src/commands/test-verdict.js +11 -11
  185. package/dist/src/commands/test.d.ts +3 -3
  186. package/dist/src/commands/test.js +36 -36
  187. package/dist/src/commands/token-coverage.js +3 -3
  188. package/dist/src/commands/token-list.js +5 -5
  189. package/dist/src/commands/token.js +9 -9
  190. package/dist/src/commands/tree.js +19 -19
  191. package/dist/src/commands/typecheck.d.ts +6 -6
  192. package/dist/src/commands/typecheck.js +7 -7
  193. package/dist/src/commands/verify.d.ts +3 -3
  194. package/dist/src/commands/verify.js +10 -10
  195. package/dist/src/commands/watch.js +11 -11
  196. package/dist/src/commands/wire.js +13 -13
  197. package/dist/src/core/ast-utils.d.ts +7 -7
  198. package/dist/src/core/ast-utils.js +8 -8
  199. package/dist/src/core/branding.d.ts +5 -5
  200. package/dist/src/core/branding.js +3 -3
  201. package/dist/src/core/browser-wire.d.ts +1 -1
  202. package/dist/src/core/browser-wire.js +4 -4
  203. package/dist/src/core/build-audit-platform.d.ts +6 -6
  204. package/dist/src/core/build-audit-platform.js +26 -26
  205. package/dist/src/core/build-audit-registration.d.ts +5 -5
  206. package/dist/src/core/build-audit-registration.js +7 -7
  207. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  208. package/dist/src/core/build-audit-resolve.js +6 -6
  209. package/dist/src/core/build-audit-skip.d.ts +8 -8
  210. package/dist/src/core/build-audit-skip.js +12 -12
  211. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  212. package/dist/src/core/build-audit-transforms.js +3 -3
  213. package/dist/src/core/build-audit.d.ts +8 -8
  214. package/dist/src/core/build-audit.js +39 -37
  215. package/dist/src/core/build-baseline-types.d.ts +19 -18
  216. package/dist/src/core/build-baseline-types.js +1 -1
  217. package/dist/src/core/build-baseline.d.ts +8 -8
  218. package/dist/src/core/build-baseline.js +14 -14
  219. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  220. package/dist/src/core/build-jar-escalation.js +15 -15
  221. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  222. package/dist/src/core/build-overwrite-guard.js +13 -13
  223. package/dist/src/core/build-prepare.d.ts +4 -4
  224. package/dist/src/core/build-prepare.js +16 -15
  225. package/dist/src/core/config-mutate.js +4 -4
  226. package/dist/src/core/config-state.js +2 -2
  227. package/dist/src/core/config-validate-build-audit.js +3 -3
  228. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  229. package/dist/src/core/config-validate-file-size.js +2 -2
  230. package/dist/src/core/config-validate.js +8 -9
  231. package/dist/src/core/config.d.ts +10 -10
  232. package/dist/src/core/config.js +10 -10
  233. package/dist/src/core/coverage-extend.d.ts +16 -16
  234. package/dist/src/core/coverage-extend.js +16 -16
  235. package/dist/src/core/destructive.d.ts +14 -14
  236. package/dist/src/core/destructive.js +9 -9
  237. package/dist/src/core/diff-hunks.d.ts +2 -2
  238. package/dist/src/core/diff-hunks.js +7 -7
  239. package/dist/src/core/discard-baseline.d.ts +10 -10
  240. package/dist/src/core/discard-baseline.js +15 -16
  241. package/dist/src/core/display-state.d.ts +11 -11
  242. package/dist/src/core/display-state.js +12 -12
  243. package/dist/src/core/engine-changes.d.ts +2 -2
  244. package/dist/src/core/engine-changes.js +2 -2
  245. package/dist/src/core/engine-precondition.d.ts +4 -4
  246. package/dist/src/core/engine-precondition.js +2 -2
  247. package/dist/src/core/engine-session-lock.d.ts +18 -18
  248. package/dist/src/core/engine-session-lock.js +37 -37
  249. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  250. package/dist/src/core/export-moved-code-shape.js +8 -8
  251. package/dist/src/core/file-lock-owner.d.ts +11 -11
  252. package/dist/src/core/file-lock-owner.js +18 -18
  253. package/dist/src/core/file-lock.d.ts +12 -12
  254. package/dist/src/core/file-lock.js +52 -39
  255. package/dist/src/core/firefox-cache.d.ts +1 -1
  256. package/dist/src/core/firefox-cache.js +10 -10
  257. package/dist/src/core/firefox-download.d.ts +3 -3
  258. package/dist/src/core/firefox-download.js +6 -6
  259. package/dist/src/core/firefox-extract.d.ts +2 -2
  260. package/dist/src/core/firefox-extract.js +13 -13
  261. package/dist/src/core/firefox.d.ts +5 -5
  262. package/dist/src/core/firefox.js +8 -8
  263. package/dist/src/core/furnace-apply-dry-run.js +1 -1
  264. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  265. package/dist/src/core/furnace-apply-ftl.js +8 -8
  266. package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
  267. package/dist/src/core/furnace-apply-helpers.js +21 -21
  268. package/dist/src/core/furnace-apply-output.js +1 -1
  269. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  270. package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
  271. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  272. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  273. package/dist/src/core/furnace-apply.d.ts +3 -3
  274. package/dist/src/core/furnace-apply.js +22 -21
  275. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  276. package/dist/src/core/furnace-checksum-utils.js +5 -5
  277. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  278. package/dist/src/core/furnace-config-custom.js +2 -2
  279. package/dist/src/core/furnace-config-order.js +1 -1
  280. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  281. package/dist/src/core/furnace-config-tokens.js +3 -3
  282. package/dist/src/core/furnace-config-validate.js +2 -2
  283. package/dist/src/core/furnace-config.d.ts +4 -4
  284. package/dist/src/core/furnace-config.js +18 -18
  285. package/dist/src/core/furnace-constants.d.ts +6 -6
  286. package/dist/src/core/furnace-constants.js +6 -6
  287. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  288. package/dist/src/core/furnace-css-fragments.js +11 -11
  289. package/dist/src/core/furnace-dir-entry.d.ts +1 -1
  290. package/dist/src/core/furnace-dir-entry.js +1 -1
  291. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  292. package/dist/src/core/furnace-jsconfig.js +22 -20
  293. package/dist/src/core/furnace-operation.d.ts +21 -20
  294. package/dist/src/core/furnace-operation.js +36 -34
  295. package/dist/src/core/furnace-precondition.d.ts +10 -10
  296. package/dist/src/core/furnace-precondition.js +8 -8
  297. package/dist/src/core/furnace-refresh.js +2 -2
  298. package/dist/src/core/furnace-registration-ast.d.ts +2 -2
  299. package/dist/src/core/furnace-registration-ast.js +9 -9
  300. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  301. package/dist/src/core/furnace-registration-remove.js +6 -6
  302. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  303. package/dist/src/core/furnace-registration-validate.js +2 -2
  304. package/dist/src/core/furnace-registration.d.ts +5 -5
  305. package/dist/src/core/furnace-registration.js +7 -7
  306. package/dist/src/core/furnace-rollback.d.ts +1 -1
  307. package/dist/src/core/furnace-rollback.js +5 -5
  308. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  309. package/dist/src/core/furnace-stale-export.js +16 -15
  310. package/dist/src/core/furnace-staleness.d.ts +2 -2
  311. package/dist/src/core/furnace-staleness.js +2 -2
  312. package/dist/src/core/furnace-state-persist.d.ts +10 -10
  313. package/dist/src/core/furnace-state-persist.js +10 -10
  314. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  315. package/dist/src/core/furnace-step-errors.js +6 -6
  316. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  317. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  318. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  319. package/dist/src/core/furnace-validate-registration.js +13 -13
  320. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  321. package/dist/src/core/furnace-validate-structure.js +4 -4
  322. package/dist/src/core/furnace-validate.js +9 -9
  323. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  324. package/dist/src/core/furnace-version-drift.js +5 -5
  325. package/dist/src/core/git-base.d.ts +4 -4
  326. package/dist/src/core/git-base.js +9 -9
  327. package/dist/src/core/git-diff-new-file.d.ts +4 -4
  328. package/dist/src/core/git-diff-new-file.js +8 -8
  329. package/dist/src/core/git-diff.d.ts +4 -4
  330. package/dist/src/core/git-diff.js +35 -34
  331. package/dist/src/core/git-file-ops.d.ts +6 -6
  332. package/dist/src/core/git-file-ops.js +7 -7
  333. package/dist/src/core/git-readonly-index.d.ts +12 -12
  334. package/dist/src/core/git-readonly-index.js +12 -12
  335. package/dist/src/core/git-status.d.ts +4 -4
  336. package/dist/src/core/git-status.js +4 -4
  337. package/dist/src/core/git.d.ts +3 -3
  338. package/dist/src/core/git.js +14 -14
  339. package/dist/src/core/harness-orphans.d.ts +17 -17
  340. package/dist/src/core/harness-orphans.js +20 -20
  341. package/dist/src/core/history-log.d.ts +3 -3
  342. package/dist/src/core/history-log.js +3 -3
  343. package/dist/src/core/license-headers.d.ts +19 -18
  344. package/dist/src/core/license-headers.js +29 -28
  345. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  346. package/dist/src/core/mach-build-artifacts.js +23 -23
  347. package/dist/src/core/mach-error-hints.d.ts +5 -5
  348. package/dist/src/core/mach-error-hints.js +13 -13
  349. package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
  350. package/dist/src/core/mach-known-noise-filter.js +53 -50
  351. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  352. package/dist/src/core/mach-mozconfig.js +15 -15
  353. package/dist/src/core/mach-python.d.ts +2 -1
  354. package/dist/src/core/mach-python.js +4 -3
  355. package/dist/src/core/mach-resource-shim.d.ts +12 -12
  356. package/dist/src/core/mach-resource-shim.js +20 -20
  357. package/dist/src/core/mach.d.ts +23 -23
  358. package/dist/src/core/mach.js +36 -36
  359. package/dist/src/core/marionette-port.d.ts +15 -13
  360. package/dist/src/core/marionette-port.js +34 -31
  361. package/dist/src/core/marionette-preflight.d.ts +6 -6
  362. package/dist/src/core/marionette-preflight.js +23 -23
  363. package/dist/src/core/markdown-table.d.ts +9 -9
  364. package/dist/src/core/markdown-table.js +14 -14
  365. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  366. package/dist/src/core/mochitest-server-port.js +14 -14
  367. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  368. package/dist/src/core/module-resolution-preflight.js +11 -11
  369. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  370. package/dist/src/core/moz-manifest-helpers.js +7 -7
  371. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  372. package/dist/src/core/moz-manifest-register.js +2 -2
  373. package/dist/src/core/moz-manifest-rules.js +11 -11
  374. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  375. package/dist/src/core/ownership-table.d.ts +5 -5
  376. package/dist/src/core/ownership-table.js +7 -7
  377. package/dist/src/core/parser-fallback.d.ts +3 -3
  378. package/dist/src/core/parser-fallback.js +3 -3
  379. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  380. package/dist/src/core/patch-apply-fuzz.js +9 -9
  381. package/dist/src/core/patch-apply.d.ts +9 -9
  382. package/dist/src/core/patch-apply.js +30 -30
  383. package/dist/src/core/patch-export-update.d.ts +4 -4
  384. package/dist/src/core/patch-export-update.js +3 -3
  385. package/dist/src/core/patch-export.d.ts +10 -10
  386. package/dist/src/core/patch-export.js +13 -13
  387. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  388. package/dist/src/core/patch-identifier-suggest.js +4 -4
  389. package/dist/src/core/patch-lint-binary.d.ts +7 -7
  390. package/dist/src/core/patch-lint-cache.d.ts +2 -2
  391. package/dist/src/core/patch-lint-cache.js +13 -13
  392. package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
  393. package/dist/src/core/patch-lint-checkjs.js +42 -41
  394. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  395. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  396. package/dist/src/core/patch-lint-creators.d.ts +3 -3
  397. package/dist/src/core/patch-lint-creators.js +3 -3
  398. package/dist/src/core/patch-lint-cross.d.ts +13 -13
  399. package/dist/src/core/patch-lint-cross.js +21 -21
  400. package/dist/src/core/patch-lint-css.d.ts +1 -1
  401. package/dist/src/core/patch-lint-css.js +5 -5
  402. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  403. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  404. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  405. package/dist/src/core/patch-lint-diff.js +4 -4
  406. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  407. package/dist/src/core/patch-lint-file-size.js +3 -3
  408. package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
  409. package/dist/src/core/patch-lint-forward-registration.js +12 -12
  410. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  411. package/dist/src/core/patch-lint-jsdoc.js +11 -11
  412. package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
  413. package/dist/src/core/patch-lint-module-registration.js +1 -1
  414. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  415. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  416. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  417. package/dist/src/core/patch-lint-observer.js +7 -7
  418. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  419. package/dist/src/core/patch-lint-ownership.js +6 -6
  420. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  421. package/dist/src/core/patch-lint-prettier.js +6 -6
  422. package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
  423. package/dist/src/core/patch-lint-queue-types.js +1 -1
  424. package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
  425. package/dist/src/core/patch-lint-staged-registration.js +6 -6
  426. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  427. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  428. package/dist/src/core/patch-lint.d.ts +27 -26
  429. package/dist/src/core/patch-lint.js +48 -46
  430. package/dist/src/core/patch-lock.d.ts +1 -1
  431. package/dist/src/core/patch-lock.js +8 -8
  432. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  433. package/dist/src/core/patch-manifest-consistency.js +16 -17
  434. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  435. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  436. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  437. package/dist/src/core/patch-manifest-io.js +27 -27
  438. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  439. package/dist/src/core/patch-manifest-query.js +4 -4
  440. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  441. package/dist/src/core/patch-manifest-resolve.js +7 -7
  442. package/dist/src/core/patch-manifest-validate.js +3 -3
  443. package/dist/src/core/patch-manifest.d.ts +2 -2
  444. package/dist/src/core/patch-manifest.js +2 -2
  445. package/dist/src/core/patch-parse.d.ts +14 -14
  446. package/dist/src/core/patch-parse.js +16 -16
  447. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  448. package/dist/src/core/patch-registration-refs.js +7 -7
  449. package/dist/src/core/patch-transform.d.ts +8 -8
  450. package/dist/src/core/patch-transform.js +13 -13
  451. package/dist/src/core/process-cpu-time.d.ts +1 -1
  452. package/dist/src/core/process-cpu-time.js +5 -5
  453. package/dist/src/core/rebase-session.d.ts +7 -7
  454. package/dist/src/core/rebase-session.js +8 -8
  455. package/dist/src/core/register-result.d.ts +1 -1
  456. package/dist/src/core/register-result.js +1 -1
  457. package/dist/src/core/register-scaffold.d.ts +2 -2
  458. package/dist/src/core/register-scaffold.js +3 -3
  459. package/dist/src/core/register-shared-css.d.ts +3 -3
  460. package/dist/src/core/register-shared-css.js +4 -4
  461. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  462. package/dist/src/core/register-xpcshell-test.js +2 -2
  463. package/dist/src/core/run-log-redact.d.ts +12 -12
  464. package/dist/src/core/run-log-redact.js +16 -16
  465. package/dist/src/core/run-log.d.ts +9 -9
  466. package/dist/src/core/run-log.js +14 -14
  467. package/dist/src/core/shared-ftl.d.ts +2 -2
  468. package/dist/src/core/shared-ftl.js +6 -6
  469. package/dist/src/core/signal-critical.d.ts +2 -2
  470. package/dist/src/core/signal-critical.js +2 -2
  471. package/dist/src/core/smoke-patterns.d.ts +5 -5
  472. package/dist/src/core/smoke-patterns.js +9 -9
  473. package/dist/src/core/state-file.d.ts +3 -3
  474. package/dist/src/core/status-binary.d.ts +8 -8
  475. package/dist/src/core/status-binary.js +12 -12
  476. package/dist/src/core/status-classify.d.ts +17 -17
  477. package/dist/src/core/status-classify.js +11 -11
  478. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  479. package/dist/src/core/test-changed-prefs.js +15 -15
  480. package/dist/src/core/test-harness-crash.d.ts +39 -39
  481. package/dist/src/core/test-harness-crash.js +67 -67
  482. package/dist/src/core/test-harness-output.d.ts +7 -7
  483. package/dist/src/core/test-harness-output.js +7 -7
  484. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  485. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  486. package/dist/src/core/test-path-scope.d.ts +8 -8
  487. package/dist/src/core/test-path-scope.js +11 -11
  488. package/dist/src/core/test-stale-check.d.ts +22 -21
  489. package/dist/src/core/test-stale-check.js +29 -28
  490. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  491. package/dist/src/core/test-stale-symlink.js +1 -1
  492. package/dist/src/core/test-stall-triage.d.ts +9 -9
  493. package/dist/src/core/test-stall-triage.js +22 -22
  494. package/dist/src/core/token-category.d.ts +4 -4
  495. package/dist/src/core/token-category.js +13 -12
  496. package/dist/src/core/token-coverage.js +4 -5
  497. package/dist/src/core/token-dark-mode.d.ts +9 -9
  498. package/dist/src/core/token-dark-mode.js +11 -11
  499. package/dist/src/core/token-docs.d.ts +1 -1
  500. package/dist/src/core/token-inventory.d.ts +6 -6
  501. package/dist/src/core/token-inventory.js +7 -7
  502. package/dist/src/core/token-manager.d.ts +3 -3
  503. package/dist/src/core/token-manager.js +21 -21
  504. package/dist/src/core/token-scaffold.d.ts +4 -4
  505. package/dist/src/core/token-scaffold.js +4 -4
  506. package/dist/src/core/token-variant.d.ts +14 -14
  507. package/dist/src/core/token-variant.js +32 -32
  508. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  509. package/dist/src/core/toolchain-preflight.js +22 -22
  510. package/dist/src/core/tree-cow.d.ts +3 -3
  511. package/dist/src/core/tree-cow.js +6 -6
  512. package/dist/src/core/tree-guard.d.ts +3 -3
  513. package/dist/src/core/tree-guard.js +23 -23
  514. package/dist/src/core/tree-store.d.ts +15 -15
  515. package/dist/src/core/tree-store.js +35 -33
  516. package/dist/src/core/typecheck-shim.d.ts +16 -15
  517. package/dist/src/core/typecheck-shim.js +26 -25
  518. package/dist/src/core/typecheck.d.ts +12 -12
  519. package/dist/src/core/typecheck.js +31 -31
  520. package/dist/src/core/wire-destroy.d.ts +2 -2
  521. package/dist/src/core/wire-destroy.js +5 -5
  522. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  523. package/dist/src/core/wire-dom-fragment.js +6 -6
  524. package/dist/src/core/wire-init.d.ts +2 -2
  525. package/dist/src/core/wire-init.js +7 -7
  526. package/dist/src/core/wire-subscript.d.ts +1 -1
  527. package/dist/src/core/wire-subscript.js +3 -3
  528. package/dist/src/core/wire-utils.d.ts +9 -9
  529. package/dist/src/core/wire-utils.js +11 -11
  530. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  531. package/dist/src/core/xpcshell-appdir.js +26 -26
  532. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  533. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  534. package/dist/src/errors/base.d.ts +22 -21
  535. package/dist/src/errors/base.js +22 -21
  536. package/dist/src/errors/build.d.ts +6 -6
  537. package/dist/src/errors/build.js +6 -6
  538. package/dist/src/errors/codes.d.ts +10 -10
  539. package/dist/src/errors/codes.js +10 -10
  540. package/dist/src/errors/furnace.d.ts +2 -2
  541. package/dist/src/errors/git.d.ts +1 -1
  542. package/dist/src/errors/git.js +1 -1
  543. package/dist/src/errors/patch.d.ts +3 -3
  544. package/dist/src/errors/patch.js +3 -3
  545. package/dist/src/errors/rebase.d.ts +1 -1
  546. package/dist/src/errors/rebase.js +1 -1
  547. package/dist/src/errors/run.d.ts +1 -1
  548. package/dist/src/errors/run.js +1 -1
  549. package/dist/src/index.d.ts +4 -4
  550. package/dist/src/index.js +4 -4
  551. package/dist/src/types/commands/options.d.ts +86 -85
  552. package/dist/src/types/commands/patches.d.ts +19 -19
  553. package/dist/src/types/commands/project.d.ts +3 -3
  554. package/dist/src/types/config.d.ts +24 -23
  555. package/dist/src/types/furnace.d.ts +17 -17
  556. package/dist/src/types/json.d.ts +3 -3
  557. package/dist/src/types/json.js +2 -2
  558. package/dist/src/types/typecheck.d.ts +3 -3
  559. package/dist/src/utils/assert.d.ts +1 -1
  560. package/dist/src/utils/assert.js +6 -6
  561. package/dist/src/utils/build-info.d.ts +5 -5
  562. package/dist/src/utils/build-info.js +6 -6
  563. package/dist/src/utils/child-env.d.ts +5 -5
  564. package/dist/src/utils/child-env.js +5 -5
  565. package/dist/src/utils/concurrency.d.ts +2 -2
  566. package/dist/src/utils/concurrency.js +2 -2
  567. package/dist/src/utils/elapsed.js +1 -1
  568. package/dist/src/utils/errors.d.ts +8 -8
  569. package/dist/src/utils/errors.js +8 -8
  570. package/dist/src/utils/fs.d.ts +1 -1
  571. package/dist/src/utils/fs.js +8 -8
  572. package/dist/src/utils/line-dispatch.d.ts +3 -3
  573. package/dist/src/utils/line-dispatch.js +5 -5
  574. package/dist/src/utils/logger.d.ts +4 -4
  575. package/dist/src/utils/logger.js +11 -11
  576. package/dist/src/utils/machine-output.js +2 -2
  577. package/dist/src/utils/options.d.ts +13 -13
  578. package/dist/src/utils/options.js +20 -20
  579. package/dist/src/utils/package-root.js +2 -2
  580. package/dist/src/utils/paths.d.ts +4 -4
  581. package/dist/src/utils/paths.js +4 -4
  582. package/dist/src/utils/process-group.d.ts +8 -8
  583. package/dist/src/utils/process-group.js +19 -19
  584. package/dist/src/utils/process.d.ts +34 -33
  585. package/dist/src/utils/process.js +20 -19
  586. package/dist/src/utils/ps-duration.d.ts +4 -4
  587. package/dist/src/utils/ps-duration.js +6 -6
  588. package/dist/src/utils/regex.d.ts +4 -4
  589. package/dist/src/utils/regex.js +7 -7
  590. package/dist/src/utils/sleep.d.ts +7 -7
  591. package/dist/src/utils/sleep.js +7 -7
  592. package/dist/src/utils/stdio-drain.d.ts +7 -7
  593. package/dist/src/utils/stdio-drain.js +8 -8
  594. package/dist/src/utils/validation.d.ts +11 -12
  595. package/dist/src/utils/validation.js +20 -21
  596. package/docs/README.md +2 -2
  597. package/docs/configuration.md +120 -114
  598. package/docs/exit-codes.md +63 -58
  599. package/docs/furnace.md +20 -19
  600. package/docs/lifecycle-invariants.md +412 -251
  601. package/docs/machine-output.md +33 -32
  602. package/docs/patch-workflow.md +48 -45
  603. package/docs/run-logs.md +62 -58
  604. package/docs/testing.md +101 -101
  605. package/docs/verification-trees.md +23 -22
  606. package/package.json +2 -2
@@ -23,7 +23,7 @@ const GIT_INDEX_LOCK_RETRY_MS = 300;
23
23
  * Retries a single patch re-export exactly once when the failure is
24
24
  * transient git `index.lock` contention (an external git process holding
25
25
  * the engine repo's index). The retry re-enters `reExportSinglePatch`
26
- * from the top, so it re-reads clean state; a second lock failure
26
+ * from the top, so it re-reads clean state. A second lock failure
27
27
  * propagates to the loop's honest "N of M" accounting.
28
28
  */
29
29
  export async function reExportSinglePatchWithIndexLockRetry(args) {
@@ -53,10 +53,10 @@ async function reExportSinglePatch(args) {
53
53
  ...(options.scanFiles !== undefined ? { scanFiles: options.scanFiles } : {}),
54
54
  });
55
55
  // Forward-import gate at adoption time (runs in dry-run too): refuse
56
- // to adopt unmanaged files that import modules created by LATER
57
- // patches — the after-the-fact lint failure this leaves behind is the
58
- // field-reported footgun. Applies to broad --scan, --scan-file, and
59
- // the --scan-files bulk assignments alike.
56
+ // to adopt unmanaged files that import modules created by later
57
+ // patches, because the after-the-fact lint failure this leaves behind
58
+ // is the field-reported footgun. Applies to broad --scan, --scan-file,
59
+ // and the --scan-files bulk assignments alike.
60
60
  await assertScanAdoptionsHaveNoForwardImports({
61
61
  patchesDir: paths.patches,
62
62
  engineDir: paths.engine,
@@ -82,7 +82,7 @@ async function reExportSinglePatch(args) {
82
82
  // When neither `--scan` nor `--files` is set and some of the manifest's
83
83
  // claimed files no longer exist on disk, the re-export silently writes a
84
84
  // refreshed body whose filesAffected still names the vanished paths.
85
- // That is the documented contract, but it is also a footgun — a later
85
+ // That is the documented contract, but it is also a footgun: a later
86
86
  // `verify` then fails on manifest-consistency with no obvious trigger.
87
87
  // Emit one advisory warning up-front when the drift is cheap to detect,
88
88
  // so the operator can re-run with `--scan` or `--files` before the stale
@@ -92,9 +92,9 @@ async function reExportSinglePatch(args) {
92
92
  return false;
93
93
  }
94
94
  // --- Explicit file-subset path ---
95
- // When --files is given, the target filesAffected is authoritative — drop
95
+ // When --files is given, the target filesAffected is authoritative: drop
96
96
  // anything not in the list, add anything new. This is the surgical repair
97
- // primitive that replaces hand-editing patches.json; the user has already
97
+ // primitive that replaces hand-editing patches.json. The user has already
98
98
  // acknowledged via confirmDestructive (done in the caller) that any drop
99
99
  // is intentional.
100
100
  if (options.files !== undefined) {
@@ -109,16 +109,16 @@ async function reExportSinglePatch(args) {
109
109
  }
110
110
  // Stale-furnace-source gate: re-export captures deployed engine copies, so
111
111
  // a component source edited after the last furnace apply would land in the
112
- // patch as its OLD deployed content. Refuse (or warn under
112
+ // patch as its old deployed content. Refuse (or warn under
113
113
  // --allow-stale-furnace) before diffing. Runs in dry-run too so the failure
114
114
  // surfaces early.
115
115
  await enforceFreshFurnaceSources(paths.root, currentFilesAffected, options.allowStaleFurnace === true, 're-export');
116
116
  const absentFiles = await findMissingFiles(paths.engine, currentFilesAffected);
117
- // A path absent from disk but tracked in engine HEAD is a DELETION, and
117
+ // A path absent from disk but tracked in engine HEAD is a deletion, and
118
118
  // `git diff HEAD` renders it as a real `deleted file mode` section. Only
119
119
  // a never-tracked path has nothing to diff. Skipping both alike meant a
120
120
  // retired file quietly left the patch body while staying in its file
121
- // list — the patch then claimed a file it could not restore.
121
+ // list, so the patch then claimed a file it could not restore.
122
122
  const trackedAbsent = await listTrackedInHead(paths.engine, absentFiles);
123
123
  const deletedFiles = absentFiles.filter((f) => trackedAbsent.has(f));
124
124
  const untrackedAbsent = absentFiles.filter((f) => !trackedAbsent.has(f));
@@ -148,9 +148,9 @@ async function reExportSinglePatch(args) {
148
148
  }
149
149
  // Foreign-drift preview + optional hard stop: show which
150
150
  // payload lines are about to enter the body that the old body did not
151
- // carry — the case where a concurrent session's uncommitted edits in
152
- // OWNED files would be silently absorbed. Always previews (including
153
- // dry-run and --scan); refuses only under --refuse-foreign-drift.
151
+ // carry, the case where a concurrent session's uncommitted edits in
152
+ // owned files would be silently absorbed. Always previews (including
153
+ // dry-run and --scan). Refuses only under --refuse-foreign-drift.
154
154
  if (await reportForeignDrift({
155
155
  patch,
156
156
  patchesDir: paths.patches,
@@ -167,7 +167,7 @@ async function reExportSinglePatch(args) {
167
167
  command: 're-export',
168
168
  forceUnsafe: options.forceUnsafe === true,
169
169
  });
170
- // Lint against the ONCE-per-invocation hoisted context (queue context +
170
+ // Lint against the once-per-invocation hoisted context (queue context +
171
171
  // queue-wide checkJs program + per-patch result cache) instead of
172
172
  // rebuilding ~37 s of setup for every patch in the loop.
173
173
  const projectedMetadata = { ...patch, ...updates };
@@ -213,8 +213,8 @@ async function reExportSinglePatch(args) {
213
213
  * directory lock (a split write would let a concurrent queue mutation
214
214
  * leave body and `filesAffected` disagreeing), then keeps the run's
215
215
  * in-memory state honest: the queue context entry is refreshed and the
216
- * fresh lint result is stored keyed against the just-written body — the
217
- * state a repeat invocation will observe — and the in-memory
216
+ * fresh lint result is stored keyed against the just-written body (the
217
+ * state a repeat invocation will observe), and the in-memory
218
218
  * manifest row mirrors the on-disk write for later loop iterations
219
219
  * (notably `--all --scan`, where `getClaimedFiles` reads this manifest).
220
220
  */
@@ -246,8 +246,8 @@ async function commitRefreshedPatch(args) {
246
246
  };
247
247
  }
248
248
  }
249
- // A bulk run refreshes every patch; saying "Re-exported" for one whose body
250
- // did not move buries the patches that DID move. The run still counts this
249
+ // A bulk run refreshes every patch. Saying "Re-exported" for one whose body
250
+ // did not move buries the patches that did move. The run still counts this
251
251
  // patch as successfully refreshed, so `--stamp` completeness is unaffected.
252
252
  if (bodyChanged) {
253
253
  success(`Re-exported ${patch.filename}`);
@@ -258,7 +258,7 @@ async function commitRefreshedPatch(args) {
258
258
  }
259
259
  /**
260
260
  * Threads the patch's own `lintIgnore` list through so the per-patch
261
- * suppression honoured by export/export-all is also honoured here — a
261
+ * suppression honoured by export/export-all is also honoured here. A
262
262
  * re-export could otherwise not refresh an advisory-noisy but intentional
263
263
  * patch without the blunt `--skip-lint`. The paired `patch.tier` threads the
264
264
  * explicit branding-threshold opt-in the same way. The CLI flags `--tier`
@@ -26,15 +26,16 @@ async function resolveSelectedPatches(patches, options, manifest) {
26
26
  for (const identifier of patches) {
27
27
  const match = resolvePatchIdentifier(identifier, manifest.patches);
28
28
  if (!match) {
29
- // Suggest, never dump: a wrong guess would otherwise print the
30
- // whole ~300-entry manifest, burying the error it was reporting.
29
+ // Suggest close matches instead of dumping the queue: a wrong guess
30
+ // would otherwise print the whole ~300-entry manifest, burying the
31
+ // error it was reporting.
31
32
  throw new InvalidArgumentError(formatPatchNotFoundError(identifier, manifest.patches), identifier);
32
33
  }
33
34
  selectedPatches.push(match);
34
35
  }
35
36
  return selectedPatches;
36
37
  }
37
- // No patches specified — prompt or error
38
+ // No patches specified: prompt or error
38
39
  const isInteractive = stdioIsInteractive();
39
40
  if (!isInteractive) {
40
41
  throw new InvalidArgumentError('Specify patch identifiers or use --all in non-interactive mode.\n\n' +
@@ -176,7 +177,7 @@ export async function reExportCommand(projectRoot, patches, options) {
176
177
  }
177
178
  // `--stamp` only fires on a run where every selected patch refreshed
178
179
  // cleanly. A partial success would leave some patches with a stale body
179
- // but a new version — the opposite of the "what I tested, what the
180
+ // but a new version, the opposite of the "what I tested, what the
180
181
  // manifest says" invariant `sourceEsrVersion` exists to record. A
181
182
  // non-empty `reExportedFilenames` with fewer entries than `selectedPatches`
182
183
  // means a lint failure or missing-file skip landed somewhere in the loop,
@@ -214,7 +215,7 @@ function buildForeignDriftContext(options) {
214
215
  /**
215
216
  * Names `--expect-unmanaged` paths that were never met this run. A typo'd
216
217
  * carve-out silently leaves the refusal armed for the path it was meant to
217
- * admit — and, worse, reads as an approval that is in force when it is not.
218
+ * admit, and reads as an approval that is in force when it is not.
218
219
  * A warning rather than a refusal: an approved path legitimately goes unmet
219
220
  * when the reviewed file has since been adopted into a patch, which is the
220
221
  * outcome the carve-out exists to be retired by.
@@ -271,7 +272,7 @@ function throwRunLevelRefusals(adjacentCtx, driftCtx, progress) {
271
272
  * Prints the end-of-run summary and enforces the exit contract: a partial run
272
273
  * exits non-zero by default. "Re-exported 2 of 3" printing with exit 0 lets a
273
274
  * partial refresh ride an `&&` chain as success. The summary still prints
274
- * first so the honest "N of M" accounting stays visible; the throw then
275
+ * first so the honest "N of M" accounting stays visible. The throw then
275
276
  * carries the failed/skipped breakdown. Dry-run included: a preview
276
277
  * reporting that the real run would partially fail must not read as a passing
277
278
  * preview in scripts.
@@ -15,9 +15,9 @@ import { confirmDirtyEngineReset } from './confirm.js';
15
15
  */
16
16
  export async function handleAbort(projectRoot, yes) {
17
17
  intro('FireForge Rebase — Abort');
18
- // Abort is the escape hatch, so it deliberately does NOT require a *valid*
19
- // session — only that one is present. Nothing below reads the session
20
- // object (the restore works off `paths.engine` and `resetChanges`), and an
18
+ // Abort is the escape hatch, so it does not require a valid session, only
19
+ // that one is present. Nothing below reads the session object (the restore
20
+ // works off `paths.engine` and `resetChanges`), and an
21
21
  // `if (!session) throw` would refuse to run against a corrupt file, which
22
22
  // is the only thing that could have cleared it.
23
23
  const read = await readRebaseSession(projectRoot);
@@ -40,8 +40,8 @@ export async function handleAbort(projectRoot, yes) {
40
40
  return;
41
41
  }
42
42
  const s = spinner('Restoring engine to pre-rebase state...');
43
- // Step 1: git reset. If this fails, the rebase session MUST stay on disk
44
- // so the user can retry the abort — resetChanges is the only irreversible
43
+ // Step 1: git reset. If this fails, the rebase session must stay on disk
44
+ // so the user can retry the abort: resetChanges is the only irreversible
45
45
  // operation in this handler and everything downstream assumes it ran.
46
46
  try {
47
47
  await resetChanges(paths.engine);
@@ -59,7 +59,7 @@ export async function handleAbort(projectRoot, yes) {
59
59
  await clearAppliedFurnaceState(projectRoot);
60
60
  // Step 3: clear pending resolution transactionally.
61
61
  await clearPendingResolution(projectRoot);
62
- // Step 4: clear the rebase session LAST so a failure in any prior step
62
+ // Step 4: clear the rebase session last so a failure in any prior step
63
63
  // preserves the session on disk and a retry of --abort can succeed.
64
64
  await clearRebaseSession(projectRoot);
65
65
  success('Rebase aborted and session cleared.');
@@ -21,7 +21,7 @@ import { runPatchLoop } from './patch-loop.js';
21
21
  */
22
22
  export async function handleContinue(projectRoot, maxFuzz, waitLockSeconds) {
23
23
  intro('FireForge Rebase — Continue');
24
- // A present-but-unreadable session is NOT "no session in progress" — that
24
+ // A present-but-unreadable session is not "no session in progress". That
25
25
  // conflation is what made a corrupt file unrecoverable. Name the file and
26
26
  // point at --abort, which can now clear it.
27
27
  const read = await readRebaseSession(projectRoot);
@@ -34,10 +34,10 @@ export async function handleContinue(projectRoot, maxFuzz, waitLockSeconds) {
34
34
  const paths = getProjectPaths(projectRoot);
35
35
  // Special case: every patch has already applied but a previous run failed
36
36
  // somewhere in the post-apply work (re-export, version stamping). In that
37
- // state currentIndex is past the end of the queue; jumping straight back
37
+ // state currentIndex is past the end of the queue. Jumping straight back
38
38
  // into runPatchLoop replays the no-op apply loop and re-attempts the
39
- // post-apply pipeline. Without this branch the user would be stuck —
40
- // there is no failed patch to resolve, but the session is still active.
39
+ // post-apply pipeline. Without this branch the user would be stuck: there
40
+ // is no failed patch to resolve, but the session is still active.
41
41
  if (session.currentIndex >= session.patches.length) {
42
42
  info('All patches already applied; retrying post-apply re-export and version stamping.');
43
43
  await runPatchLoop(projectRoot, session, paths, maxFuzz, waitLockSeconds);
@@ -99,9 +99,10 @@ export async function handleContinue(projectRoot, maxFuzz, waitLockSeconds) {
99
99
  // clear is held until both writes land, matching the guarantee the apply
100
100
  // loop in patch-loop.ts provides.
101
101
  await runInSignalCriticalSection(`rebase-continue:${currentPatch.filename}`, async () => {
102
- // Replaced, not mutated: flipping `status` in place leaves the
103
- // failure's `error` and `conflictingFiles` on a now-resolved entry, and
104
- // persist that to the session file. The union makes it impossible.
102
+ // The entry is replaced rather than mutated. Flipping `status` in place
103
+ // would leave the failure's `error` and `conflictingFiles` on a
104
+ // now-resolved entry and persist that to the session file. The union
105
+ // type rules that out.
105
106
  session.patches[session.currentIndex] = {
106
107
  filename: currentPatch.filename,
107
108
  status: 'resolved',
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `fireforge rebase` — semi-automated Firefox source version upgrade.
2
+ * `fireforge rebase`: semi-automated Firefox source version upgrade.
3
3
  *
4
4
  * Orchestrates the full patch-rebase workflow:
5
5
  * 1. Reset engine to baseline
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge rebase` — semi-automated Firefox source version upgrade.
3
+ * `fireforge rebase`: semi-automated Firefox source version upgrade.
4
4
  *
5
5
  * Orchestrates the full patch-rebase workflow:
6
6
  * 1. Reset engine to baseline
@@ -33,7 +33,7 @@ async function handleFreshStart(projectRoot, options) {
33
33
  const isDryRun = options.dryRun === true;
34
34
  const maxFuzz = options.maxFuzz ?? 3;
35
35
  intro(isDryRun ? 'FireForge Rebase (dry run)' : 'FireForge Rebase');
36
- // One read decides liveness AND validity: a pathExists pre-probe here left
36
+ // One read decides liveness and validity: a pathExists pre-probe here left
37
37
  // a window where the file vanished between probe and read, reporting
38
38
  // "already in progress" with no session on disk.
39
39
  const existing = await readRebaseSession(projectRoot);
@@ -93,7 +93,7 @@ async function handleFreshStart(projectRoot, options) {
93
93
  const resetSpinner = spinner('Resetting engine to baseline...');
94
94
  await resetChanges(paths.engine);
95
95
  resetSpinner.stop('Engine reset to baseline');
96
- // Clear Furnace state — the engine no longer contains deployed components.
96
+ // Clear Furnace state: the engine no longer contains deployed components.
97
97
  await clearAppliedFurnaceState(projectRoot);
98
98
  // Create rebase session
99
99
  const allPatches = await discoverPatches(paths.patches);
@@ -26,8 +26,8 @@ import { printSummary } from './summary.js';
26
26
  /**
27
27
  * Builds the session entry for a patch-apply outcome.
28
28
  *
29
- * Constructing a whole entry rather than assigning fields is what the
30
- * discriminated union buys: a status can never be flipped while the previous
29
+ * The entry is constructed whole rather than assigned field by field, so the
30
+ * discriminated union stops a status being flipped while the previous
31
31
  * status's payload stays behind, which is how
32
32
  * `{ status: 'resolved', error, conflictingFiles }` reaches the session file.
33
33
  *
@@ -68,9 +68,10 @@ export async function runPatchLoop(projectRoot, session, paths, maxFuzz, waitLoc
68
68
  const patchFile = allPatches.find((p) => p.filename === entry.filename);
69
69
  if (!patchFile) {
70
70
  warn(`Patch file not found for ${entry.filename}, skipping.`);
71
- // Replaced, not mutated: the entry is a discriminated union, so a status
72
- // change is a new value rather than a field assignment. That is what
73
- // stops a status flip stranding the previous status's payload.
71
+ // The entry is replaced rather than mutated: it is a discriminated
72
+ // union, so a status change is a new value rather than a field
73
+ // assignment, and a status flip cannot strand the previous status's
74
+ // payload.
74
75
  session.patches[i] = { filename: entry.filename, status: 'skipped' };
75
76
  session.currentIndex = i + 1;
76
77
  await saveRebaseSession(projectRoot, session);
@@ -101,9 +102,9 @@ export async function runPatchLoop(projectRoot, session, paths, maxFuzz, waitLoc
101
102
  }
102
103
  else {
103
104
  // Set pendingResolution in state for visibility. Kept outside the
104
- // critical section — it is advisory UX, not a correctness invariant,
105
- // and its absence would at most cause `fireforge status` to omit the
106
- // pending-conflict hint until the next state write.
105
+ // critical section, since it is advisory UX rather than a correctness
106
+ // invariant, and its absence would at most cause `fireforge status`
107
+ // to omit the pending-conflict hint until the next state write.
107
108
  await updateState(projectRoot, (current) => ({
108
109
  ...current,
109
110
  pendingResolution: {
@@ -145,7 +146,7 @@ export async function runPatchLoop(projectRoot, session, paths, maxFuzz, waitLoc
145
146
  s.stop('All patches applied');
146
147
  // Re-export all successfully applied patches. Failures here mean the
147
148
  // engine has been rebased onto the new Firefox version but some .patch
148
- // files were not refreshed — the queue would lie about what version each
149
+ // files were not refreshed, so the queue would lie about what version each
149
150
  // patch was tested against if we proceeded to stamp. Refuse to claim
150
151
  // success and leave the session in place so the user can recover via
151
152
  // `fireforge rebase --continue` after fixing the underlying cause.
@@ -164,7 +165,7 @@ export async function runPatchLoop(projectRoot, session, paths, maxFuzz, waitLoc
164
165
  `still describe the pre-rebase source. Re-export them manually (e.g. ` +
165
166
  `"fireforge re-export") and verify the overlapping hunks before the next import.`);
166
167
  }
167
- // Stamp versions — only for patches whose .patch file now actually
168
+ // Stamp versions, only for patches whose .patch file now actually
168
169
  // reflects the new source (overlap-skipped ones keep their old stamp so
169
170
  // the queue does not lie about what each patch was tested against).
170
171
  const overlapSkippedSet = new Set(overlapSkipped);
@@ -177,19 +178,19 @@ export async function runPatchLoop(projectRoot, session, paths, maxFuzz, waitLoc
177
178
  }
178
179
  // Stamp every Furnace override's `baseVersion` to match the rebased
179
180
  // Firefox source version. Without it, a successful source bump leaves
180
- // overrides in a doctor-failing drift state — each still claiming the
181
- // pre-rebase source as its baseline — and every subsequent
181
+ // overrides in a doctor-failing drift state, each still claiming the
182
+ // pre-rebase source as its baseline, and every subsequent
182
183
  // `fireforge doctor` fails `Furnace component validation`. The stamp is
183
184
  // unconditional per the helper's contract: rebase already succeeded on
184
185
  // the patch side, so the operator is committing to the new source
185
- // baseline; per-component health checking stays with
186
+ // baseline. Per-component health checking stays with
186
187
  // `fireforge furnace validate` / `doctor --repair-furnace`.
187
188
  //
188
189
  // "Unconditional" means unconditional on component health, not on the
189
190
  // value: `stampFurnaceOverrideBaseVersions` assigns and persists whatever
190
191
  // string it is handed, so a session whose `toVersion` is not a real
191
192
  // Firefox version would rewrite every override's baseline to that value.
192
- // `isValidSession` rejects such a session at read time; this refuses to
193
+ // `isValidSession` rejects such a session at read time. This refuses to
193
194
  // persist it even if a future caller reaches here another way.
194
195
  if (!isValidFirefoxVersion(session.toVersion)) {
195
196
  throw new RebaseError(`Refusing to stamp Furnace override baseVersion(s): the rebase session's target version ` +
@@ -220,13 +221,13 @@ async function reExportAppliedPatches(session, paths, waitLockSeconds) {
220
221
  const manifest = await loadPatchesManifest(paths.patches);
221
222
  if (!manifest)
222
223
  return { failures, overlapSkipped };
223
- // Re-export writes `getDiffForFilesAgainstHead(files)` — the CUMULATIVE
224
+ // Re-export writes `getDiffForFilesAgainstHead(files)`, the cumulative
224
225
  // diff of those files. For a file claimed by two patches (a supported
225
- // `--allow-overlap` queue), that diff contains BOTH patches' hunks, so
226
+ // `--allow-overlap` queue), that diff contains both patches' hunks, so
226
227
  // rewriting each patch with it would duplicate the shared file's hunks
227
228
  // into every owner: the very next import then fails or silently
228
229
  // double-materialises. Refuse to auto-re-export any patch whose files
229
- // overlap another patch; the operator re-exports those manually where
230
+ // overlap another patch. The operator re-exports those manually where
230
231
  // per-patch attribution is possible.
231
232
  const fileOwners = new Map();
232
233
  for (const patch of manifest.patches) {
@@ -17,8 +17,8 @@ import { stripEnginePrefix } from '../utils/paths.js';
17
17
  */
18
18
  export async function registerCommand(projectRoot, filePath, options = {}) {
19
19
  intro('Register');
20
- // --after is matched as a substring against existing manifest lines;
21
- // guard against control characters / line terminators that would either
20
+ // --after is matched as a substring against existing manifest lines.
21
+ // Guard against control characters / line terminators that would either
22
22
  // break the match logic or, worse, inject a second line if the value
23
23
  // is ever echoed back to a manifest writer. Null bytes are explicitly
24
24
  // rejected to mirror the hardening already applied to other user-
@@ -31,7 +31,7 @@ export async function registerCommand(projectRoot, filePath, options = {}) {
31
31
  }
32
32
  }
33
33
  // Accept either repo-root-relative (`engine/browser/...`) or
34
- // engine-relative (`browser/...`) inputs — operators frequently paste
34
+ // engine-relative (`browser/...`) inputs. Operators frequently paste
35
35
  // the former from the output of tab completion or `git status`, and
36
36
  // the mismatch used to produce a "File not found" error that named
37
37
  // the original path with no hint that dropping `engine/` would fix it.
@@ -49,8 +49,8 @@ export async function registerCommand(projectRoot, filePath, options = {}) {
49
49
  });
50
50
  if (options.dryRun) {
51
51
  // Dry-run must surface the idempotency decision too. Always saying
52
- // "Would register" — even when the rule already knows the entry is
53
- // present — makes automation read the plan as "work to do" while the
52
+ // "Would register", even when the rule already knows the entry is
53
+ // present, makes automation read the plan as "work to do" while the
54
54
  // following real run reports "Already registered".
55
55
  if (result.skipped) {
56
56
  info(`[dry-run] Already registered: ${engineRelativePath} in ${result.manifest}`);
@@ -70,7 +70,7 @@ export async function resetCommand(projectRoot, options) {
70
70
  await clearAppliedFurnaceState(projectRoot);
71
71
  s.stop('Changes reset');
72
72
  // The reset may have moved components.conf away from what the last full
73
- // build compiled in — surface that now instead of at the next test
73
+ // build compiled in, so surface that now instead of at the next test
74
74
  // refusal.
75
75
  await warnIfStaticComponentsStale(projectRoot, paths.engine);
76
76
  outro('Working tree restored to clean state');
@@ -15,7 +15,7 @@ export interface ResolveCommandOptions {
15
15
  * and the command proceeds straight to the patch-refresh + state-clear
16
16
  * path.
17
17
  *
18
- * The guard without `--yes` is preserved — running `resolve` with no TTY
18
+ * The guard without `--yes` is preserved: running `resolve` with no TTY
19
19
  * and no `--yes` still refuses, so an accidental pipe-into invocation does
20
20
  * not silently commit whatever the engine happens to contain.
21
21
  */
@@ -29,7 +29,7 @@ export interface ResolveCommandOptions {
29
29
  /**
30
30
  * Runs the resolve command to fix broken patches.
31
31
  * @param projectRoot - Root directory of the project
32
- * @param options - Optional flags; see {@link ResolveCommandOptions}.
32
+ * @param options - Optional flags. See {@link ResolveCommandOptions}.
33
33
  */
34
34
  export declare function resolveCommand(projectRoot: string, options?: ResolveCommandOptions): Promise<void>;
35
35
  /** Registers the resolve command on the CLI program. */
@@ -20,7 +20,7 @@ import { clearPendingResolution } from './pending-resolution.js';
20
20
  /**
21
21
  * Runs the resolve command to fix broken patches.
22
22
  * @param projectRoot - Root directory of the project
23
- * @param options - Optional flags; see {@link ResolveCommandOptions}.
23
+ * @param options - Optional flags. See {@link ResolveCommandOptions}.
24
24
  */
25
25
  export async function resolveCommand(projectRoot, options = {}) {
26
26
  intro('FireForge Resolve');
@@ -37,7 +37,7 @@ export async function resolveCommand(projectRoot, options = {}) {
37
37
  // Non-interactive mode requires an explicit `--yes`: the operator is
38
38
  // asserting the manual merge is complete and the refreshed diff is the one
39
39
  // to record. Without it, an accidental pipe or CI shell could commit
40
- // whatever the engine currently contains — but an unconditional TTY
40
+ // whatever the engine currently contains, but an unconditional TTY
41
41
  // refusal dead-ends a scripted recovery flow.
42
42
  if (!stdioIsInteractive() && !options.yes) {
43
43
  throw new GeneralError('Cannot run "fireforge resolve" in non-interactive mode. Use a terminal with TTY support, or pass "--yes" to skip the interactive confirmation once the manual merge is complete.');
@@ -64,7 +64,7 @@ export async function resolveCommand(projectRoot, options = {}) {
64
64
  // Refuse to proceed if the patch file was deleted between the conflict
65
65
  // and the resolve. Without this check, `updatePatchAndMetadata` would
66
66
  // throw a less actionable "patch file is missing" error from inside
67
- // the lock; the explicit precondition lets us point the user at the
67
+ // the lock. The explicit precondition lets us point the user at the
68
68
  // exact recovery path.
69
69
  const patchPath = join(paths.patches, patchFilename);
70
70
  if (!(await pathExists(patchPath))) {
@@ -25,10 +25,10 @@ const SMOKE_UNALLOWED_PREVIEW_MAX = 10;
25
25
  * Cleans the dev profile to prevent stale-state startup failures.
26
26
  *
27
27
  * Removes two things:
28
- * 1. **startupCache/** — Firefox caches compiled chrome JS bytecode here.
28
+ * 1. `startupCache/`: Firefox caches compiled chrome JS bytecode here.
29
29
  * When chrome scripts change between builds, the stale cache causes silent
30
30
  * crashes on startup.
31
- * 2. **.parentlock** — A zero-byte lock file that persists if the previous
31
+ * 2. `.parentlock`: a zero-byte lock file that persists if the previous
32
32
  * session was killed (Ctrl-C, crash, `kill`). Firefox checks this on
33
33
  * startup and silently exits if it exists, assuming another instance owns
34
34
  * the profile.
@@ -74,13 +74,13 @@ export async function runCommand(projectRoot, options = {}) {
74
74
  remediation: "Run 'fireforge build' first, then rerun 'fireforge run'.",
75
75
  requireExisting: true,
76
76
  });
77
- // `hasBuildArtifacts` only checks for an `obj-*/dist/` directory; a build
77
+ // `hasBuildArtifacts` only checks for an `obj-*/dist/` directory. A build
78
78
  // that configured but has not yet produced the launchable binary passes
79
79
  // that check, and `mach run` then fails on the missing binary path.
80
80
  // `hasRunnableBundle` narrows the probe to the actual executable so
81
81
  // `fireforge run` refuses with a targeted message before handing control
82
82
  // to mach. `fireforge watch` stays permissive and surfaces the same
83
- // information as a banner suffix; watch exists to drive rebuilds of
83
+ // information as a banner suffix. Watch exists to drive rebuilds of
84
84
  // partially-built trees, so blocking there would defeat it.
85
85
  if (buildCheck.objDir) {
86
86
  const config = await loadConfig(projectRoot);
@@ -104,12 +104,12 @@ export async function runCommand(projectRoot, options = {}) {
104
104
  info('Launching browser...\n');
105
105
  const exitCode = await run(paths.engine, options.headless ? ['--headless'] : []);
106
106
  // Exit-code whitelist:
107
- // 0 — clean shutdown
108
- // 130 — SIGINT (Ctrl+C), user-initiated termination
109
- // 143 — SIGTERM, graceful-shutdown termination
110
- // SIGKILL (137) and other signal-induced codes are intentionally NOT
111
- // whitelisted: those indicate abnormal termination the operator should
112
- // see surface as a build-time error.
107
+ // 0: clean shutdown
108
+ // 130: SIGINT (Ctrl+C), user-initiated termination
109
+ // 143: SIGTERM, graceful-shutdown termination
110
+ // SIGKILL (137) and other signal-induced codes are not whitelisted: those
111
+ // indicate abnormal termination the operator should see surface as a
112
+ // build-time error.
113
113
  if (exitCode !== 0 && exitCode !== 130 && exitCode !== 143) {
114
114
  throw new BuildError(`Browser exited with code ${exitCode}`, 'mach run');
115
115
  }
@@ -141,7 +141,7 @@ async function runSmokeExit(engineDir, options) {
141
141
  }
142
142
  const smokeTimeoutMs = smokeExit * 1000;
143
143
  if (smokeTimeoutMs < SMOKE_COLD_START_THRESHOLD_MS) {
144
- // Not an error — cold starts just tend to exceed the window. Surfacing
144
+ // Not an error. Cold starts just tend to exceed the window. Surfacing
145
145
  // the hint here instead of failing lets agents run shorter windows
146
146
  // intentionally (e.g. warm-cache smoke checks).
147
147
  verbose(`Smoke window is ${smokeExit}s; cold starts on slow machines often exceed 30s.`);
@@ -153,9 +153,9 @@ async function runSmokeExit(engineDir, options) {
153
153
  // createWriteStream opens the fd asynchronously, so ENOENT / EACCES /
154
154
  // EISDIR / EROFS surface as an 'error' event *after* the constructor
155
155
  // returns. Without a listener Node re-throws as uncaughtException and
156
- // kills the CLI mid-smoke-run — orphaning the mach → python → firefox
156
+ // kills the CLI mid-smoke-run, orphaning the mach → python → firefox
157
157
  // tree because the deadline timer never fires. Swallow the event into a
158
- // warning so the smoke run still terminates cleanly; subsequent mirror
158
+ // warning so the smoke run still terminates cleanly. Subsequent mirror
159
159
  // writes on the errored stream are silent no-ops.
160
160
  captureStream?.on('error', (err) => {
161
161
  warn(`--capture-console stream error: ${err.message}`);
@@ -171,10 +171,10 @@ async function runSmokeExit(engineDir, options) {
171
171
  const sink = stream === 'stdout' ? process.stdout : process.stderr;
172
172
  sink.write(`${line}\n`);
173
173
  // Count allowlist hits up-front, regardless of error-pattern match.
174
- // Incrementing only when the line ALSO matches an error pattern makes an
174
+ // Incrementing only when the line also matches an error pattern makes an
175
175
  // allowlist regex that visibly matches `console.warn: RSLoader:` report 0
176
- // hits, because `console.warn:` is not a smoke error class — confusing
177
- // for operators tuning their allowlist. Two numbers are surfaced: the
176
+ // hits, because `console.warn:` is not a smoke error class, which
177
+ // confuses operators tuning their allowlist. Two numbers are surfaced: the
178
178
  // total set of allowlisted lines (what the operator sees in the console)
179
179
  // and the subset that were error-class (what the smoke exit contract
180
180
  // cares about). The exit contract itself is unchanged.
@@ -193,8 +193,8 @@ async function runSmokeExit(engineDir, options) {
193
193
  findings.push({ stream, line });
194
194
  };
195
195
  // A headed smoke window on a developer desktop absorbs live input: a human
196
- // interacting with the window mid-run can trigger console errors — a
197
- // password-manager import scan probing an unreadable profile dir, say —
196
+ // interacting with the window mid-run can trigger console errors (a
197
+ // password-manager import scan probing an unreadable profile dir, say)
198
198
  // that fail the smoke run looking like a product regression. CI hosts (CI
199
199
  // env var set) are assumed display-free and unattended, so the notice
200
200
  // stays quiet there.
@@ -238,7 +238,7 @@ async function runSmokeExit(engineDir, options) {
238
238
  throw new SmokeRunError(`Smoke run observed ${findings.length} unallowed console error(s).`, ExitCode.SMOKE_EXIT_FAILURE);
239
239
  }
240
240
  if (result.timedOut) {
241
- // Clean window — SIGTERM from us. Treat as success.
241
+ // Clean window: SIGTERM came from us. Treat as success.
242
242
  return;
243
243
  }
244
244
  if (result.exitCode === 0 || result.exitCode === 130 || result.exitCode === 143) {
@@ -248,9 +248,9 @@ async function runSmokeExit(engineDir, options) {
248
248
  }
249
249
  /**
250
250
  * Compiles the active allowlist from `--console-allow` CLI values and
251
- * the optional `--console-allow-file`. Fails fast on a bad regex —
252
- * better to surface the typo at parse time than to silently let it
253
- * match nothing and turn every allowed hit into a smoke failure.
251
+ * the optional `--console-allow-file`. Fails fast on a bad regex, so the
252
+ * typo surfaces at parse time instead of silently matching nothing and
253
+ * turning every allowed hit into a smoke failure.
254
254
  */
255
255
  async function buildAllowlist(options) {
256
256
  const allow = [];
@@ -286,7 +286,7 @@ function reportSmokeSummary(args) {
286
286
  info('');
287
287
  info(`Smoke run complete: ${seconds}s elapsed of ${windowSeconds}s window${suffix}`);
288
288
  info(` Unallowed errors: ${args.findings.length}`);
289
- // The "suppressed errors" count is what the exit contract cares about — the
289
+ // The "suppressed errors" count is what the exit contract cares about: the
290
290
  // subset of allowlisted hits that would otherwise have been tallied as
291
291
  // findings. The "all allowlisted lines" count answers the operator's mental
292
292
  // model ("my --console-allow pattern matched N console lines"), without
@@ -294,9 +294,9 @@ function reportSmokeSummary(args) {
294
294
  info(` Allowlisted error hits (suppressed): ${args.allowlistedErrorHits}`);
295
295
  info(` Allowlisted lines total: ${args.allowlistedTotalHits}`);
296
296
  info(` Child exit code: ${args.exitCode}`);
297
- // Per-entry attribution: first-match credit per line, with
298
- // zero-hit entries always visible — an allowlist entry whose suppressed
299
- // shape changed upstream is only detectable as a 0× row.
297
+ // Per-entry attribution: first-match credit per line, with zero-hit
298
+ // entries always visible, since an allowlist entry whose suppressed shape
299
+ // changed upstream is only detectable as a 0× row.
300
300
  if (args.allowlist.length > 0) {
301
301
  info(' Allowlist attribution (first matching entry per line):');
302
302
  args.allowlist.forEach((entry, index) => {
@@ -27,7 +27,7 @@ function renderLicenseTemplate(license, template, vendor, now = new Date()) {
27
27
  */
28
28
  export function resolveFirefoxProduct(value, field) {
29
29
  // Matches the sibling `resolveProjectLicense`, which already delegates to
30
- // its guard. The `||` chain this replaced spelled the member list twice —
30
+ // its guard. The `||` chain this replaced spelled the member list twice,
31
31
  // once as the predicate and once in the message.
32
32
  if (typeof value === 'string' && isValidFirefoxProduct(value)) {
33
33
  return value;
@@ -194,7 +194,7 @@ function finalizePromptedSetupInputs(project) {
194
194
  // Project names that contain no ASCII alphanumerics (e.g. "----", "漢字",
195
195
  // emoji-only) collapse to an empty sanitised slug, which would silently
196
196
  // produce an invalid `appId` ("org..browser") and an empty `binaryName`.
197
- // Refuse to derive defaults from such names — the user must supply
197
+ // Refuse to derive defaults from such names. The user must supply
198
198
  // explicit appId / binaryName values instead.
199
199
  const explicitAppId = typeof project.appId === 'string' ? project.appId.trim() : '';
200
200
  const explicitBinaryName = typeof project.binaryName === 'string' ? project.binaryName.trim() : '';
@@ -270,7 +270,7 @@ export function buildSetupConfig(inputs) {
270
270
  /**
271
271
  * Creates or updates the root `package.json` so its `license` field matches
272
272
  * the project license selected during setup. When the file already exists
273
- * ONLY the `license` field is touched — preserving `name`, `description`,
273
+ * only the `license` field is touched, preserving `name`, `description`,
274
274
  * `dependencies`, `scripts`, and every other author-editorial field. Without
275
275
  * this sync, a `fireforge setup --force` that picks a new license leaves the
276
276
  * old one in `package.json`, so the two files describe different projects.
@@ -296,7 +296,7 @@ async function syncRootPackageJson(projectRoot, license) {
296
296
  }
297
297
  catch {
298
298
  // Malformed package.json is the operator's editorial responsibility to
299
- // repair; rewriting it would risk clobbering hand-authored content that
299
+ // repair. Rewriting it would risk clobbering hand-authored content that
300
300
  // the parser happens to reject. Leave the file alone and rely on the
301
301
  // doctor / lint paths that already surface invalid JSON.
302
302
  return;