@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
@@ -3,6 +3,61 @@
3
3
  */
4
4
  import type { FirefoxProduct, ProjectLicense } from '../config.js';
5
5
  import type { PatchCategory } from './patches.js';
6
+ /**
7
+ * `--dry-run`: print the planned change and exit without writing anything.
8
+ *
9
+ * Twenty-four option types spelled this field with five different doc
10
+ * comments for one behaviour. The contract is uniform and load-bearing (a
11
+ * dry run must perform every check the real run does and then write
12
+ * nothing), so it is stated once.
13
+ */
14
+ export interface DryRunnable {
15
+ /** Print the planned change without writing anything. */
16
+ dryRun?: boolean;
17
+ }
18
+ /**
19
+ * `--yes`: answer the confirmation prompt non-interactively.
20
+ *
21
+ * Required for non-TTY runs, where there is no prompt to answer. It waives
22
+ * the prompt only, never a safety gate. Flags that waive a refusal are
23
+ * spelled `--force*` and live on their own types.
24
+ */
25
+ export interface Confirmable {
26
+ /** Skip the confirmation prompt. Required for non-TTY runs. */
27
+ yes?: boolean;
28
+ }
29
+ /**
30
+ * `--force-unsafe`: proceed past a refusal the command would otherwise raise.
31
+ *
32
+ * Distinct from {@link Confirmable}: this waives a correctness gate (a
33
+ * projected-lint failure, a patchPolicy violation), not a prompt.
34
+ */
35
+ export interface UnsafeOverridable {
36
+ /** Bypass refusals the command would otherwise raise. */
37
+ forceUnsafe?: boolean;
38
+ }
39
+ /**
40
+ * `--wait-lock [seconds]` for commands that take the ENGINE SESSION lock.
41
+ *
42
+ * Parsed at the CLI layer (`true` for the bare flag, meaning 60 seconds) and
43
+ * consumed there to bound the wait. The command implementation ignores it.
44
+ */
45
+ export interface EngineLockWaitable {
46
+ /** Parsed `--wait-lock [seconds]` value. `true` means the 60-second default. */
47
+ waitLock?: number | boolean;
48
+ }
49
+ /**
50
+ * `--wait-lock [seconds]` for commands that mutate patch metadata under the
51
+ * PATCH DIRECTORY lock.
52
+ *
53
+ * Separate from {@link EngineLockWaitable}: the two flags share a
54
+ * spelling but bound different locks, and a reader needs to know which one a
55
+ * command contends for.
56
+ */
57
+ export interface PatchLockWaitable {
58
+ /** Wait budget for the patch directory lock (`--wait-lock [seconds]`). */
59
+ waitLock?: number | boolean;
60
+ }
6
61
  /**
7
62
  * Options for the setup command.
8
63
  */
@@ -51,7 +106,7 @@ export interface SourceSetOptions {
51
106
  /**
52
107
  * Options for the build command.
53
108
  */
54
- export interface BuildOptions {
109
+ export interface BuildOptions extends EngineLockWaitable {
55
110
  /** Fast UI-only rebuild */
56
111
  ui?: boolean;
57
112
  /** Number of parallel jobs */
@@ -70,21 +125,15 @@ export interface BuildOptions {
70
125
  * Refuse the build (rather than warn) when it would overwrite engine
71
126
  * content recorded in neither a patch body nor the pristine baseline.
72
127
  * The default is a loud warning, because an interactive
73
- * operator often means to discard the drift; a scripted gate on a
128
+ * operator often means to discard the drift. A scripted gate on a
74
129
  * multi-session checkout wants the hard stop.
75
130
  */
76
131
  refuseUnexportedDrift?: boolean;
77
- /**
78
- * Parsed `--wait-lock [seconds]` value (`true` for the bare flag, meaning
79
- * 60). Consumed at the CLI layer to bound the engine-session-lock wait;
80
- * the command implementation ignores it.
81
- */
82
- waitLock?: number | boolean;
83
132
  }
84
133
  /**
85
134
  * Options for the export command.
86
135
  */
87
- export interface ExportOptions {
136
+ export interface ExportOptions extends EngineLockWaitable {
88
137
  /** Name/description for the patch */
89
138
  name?: string;
90
139
  /** Category classification */
@@ -130,15 +179,9 @@ export interface ExportOptions {
130
179
  * another patch, because the resulting queue fails `verify` immediately.
131
180
  */
132
181
  allowOverlap?: boolean;
133
- /**
134
- * Parsed `--wait-lock [seconds]` value (`true` for the bare flag, meaning
135
- * 60). Consumed at the CLI layer to bound the engine-session-lock wait;
136
- * the command implementation ignores it.
137
- */
138
- waitLock?: number | boolean;
139
182
  /**
140
183
  * Force a tier override on the new patch's `PatchMetadata.tier`. Only
141
- * `"branding"` is currently recognised — Commander rejects other values
184
+ * `"branding"` is currently recognised. Commander rejects other values
142
185
  * before the handler runs. Use when a branding patch legitimately
143
186
  * touches a non-allowlisted sibling that `isBrandingOnlyPatch` cannot
144
187
  * reach (a fork-specific theme override under `browser/themes/<name>/`,
@@ -147,7 +190,7 @@ export interface ExportOptions {
147
190
  tier?: 'branding';
148
191
  /**
149
192
  * Lint check IDs to suppress on this patch. Writes to
150
- * `PatchMetadata.lintIgnore`. Repeatable on the CLI; each occurrence
193
+ * `PatchMetadata.lintIgnore`. Repeatable on the CLI, and each occurrence
151
194
  * appends to the list. Useful when a patch is advisory-noisy by nature
152
195
  * (a cohesive branding bundle, an auto-generated manifest) and a
153
196
  * specific check does not apply, but `--skip-lint` is too coarse a
@@ -158,16 +201,14 @@ export interface ExportOptions {
158
201
  /**
159
202
  * Options for the reset command.
160
203
  */
161
- export interface ResetOptions {
162
- /** Skip confirmation prompt */
163
- yes?: boolean;
204
+ export interface ResetOptions extends Confirmable {
164
205
  /** Show what would be reset without doing it */
165
206
  dryRun?: boolean;
166
207
  }
167
208
  /**
168
209
  * Options for the discard command.
169
210
  */
170
- export interface DiscardOptions {
211
+ export interface DiscardOptions extends Confirmable {
171
212
  /**
172
213
  * Restore to pristine upstream (HEAD) instead of the patch-applied
173
214
  * baseline, deleting patch-created files.
@@ -175,8 +216,6 @@ export interface DiscardOptions {
175
216
  toUpstream?: boolean;
176
217
  /** Show what would be discarded without doing it */
177
218
  dryRun?: boolean;
178
- /** Skip confirmation prompt */
179
- yes?: boolean;
180
219
  }
181
220
  /**
182
221
  * Options for the package command.
@@ -191,7 +230,7 @@ export interface PackageOptions {
191
230
  export interface ImportOptions {
192
231
  /**
193
232
  * Answer the engine-drift prompt non-interactively. Unlike `force`,
194
- * this does NOT waive the patch-integrity gate.
233
+ * this does not waive the patch-integrity gate.
195
234
  */
196
235
  yes?: boolean;
197
236
  /** Specific patches to apply (by name) */
@@ -212,7 +251,7 @@ export interface ImportOptions {
212
251
  /**
213
252
  * Options for the re-export command.
214
253
  */
215
- export interface ReExportOptions {
254
+ export interface ReExportOptions extends EngineLockWaitable {
216
255
  /** Re-export all patches */
217
256
  all?: boolean;
218
257
  /** Scan directories for new/removed files and update filesAffected */
@@ -226,15 +265,15 @@ export interface ReExportOptions {
226
265
  /**
227
266
  * Path to a JSON manifest containing bulk scan assignments:
228
267
  * `{ "assignments": [{ "patch": "<patch>", "files": ["path"] }] }`.
229
- * Requires `--scan`; mutually exclusive with positional patches, `--all`,
268
+ * Requires `--scan`. Mutually exclusive with positional patches, `--all`,
230
269
  * `--scan-file`, and `--files`.
231
270
  */
232
271
  scanFilesManifest?: string;
233
272
  /**
234
273
  * Restrict the re-exported patch's filesAffected to this explicit list.
235
- * Files currently in the patch but not in this list are dropped (shrink);
236
- * files in this list but not currently in the patch are added. Mutually
237
- * exclusive with `--scan` and `--all`; applies to a single target patch
274
+ * Files currently in the patch but not in this list are dropped (shrink).
275
+ * Files in this list but not currently in the patch are added. Mutually
276
+ * exclusive with `--scan` and `--all`. Applies to a single target patch
238
277
  * at a time.
239
278
  */
240
279
  files?: string[];
@@ -262,60 +301,54 @@ export interface ReExportOptions {
262
301
  * After every selected patch re-exports cleanly, stamp each re-exported
263
302
  * patch's `sourceEsrVersion` in `patches.json` to the current
264
303
  * `firefox.version` from `fireforge.json`. Opt-in because the default
265
- * contract of `re-export` is "refresh the patch body and filesAffected";
266
- * version stamping is normally a `rebase` responsibility. Use this when
304
+ * contract of `re-export` is "refresh the patch body and filesAffected".
305
+ * Version stamping is normally a `rebase` responsibility. Use this when
267
306
  * re-exporting after a manual Firefox bump that did not go through
268
307
  * `rebase`.
269
308
  */
270
309
  stamp?: boolean;
271
310
  /**
272
311
  * Force a tier override on the selected patch(es). Only `"branding"` is
273
- * currently recognised. Mutually exclusive with `--all` — mass tier
274
- * changes are virtually always footguns, since different patches in
312
+ * currently recognised. Mutually exclusive with `--all`, since mass
313
+ * tier changes are virtually always footguns: different patches in
275
314
  * the queue have different shapes.
276
315
  */
277
316
  tier?: 'branding';
278
317
  /**
279
- * Lint check IDs to suppress, **appended** (union) to the patch's existing
318
+ * Lint check IDs to suppress, appended (union) to the patch's existing
280
319
  * `lintIgnore` list. De-duplicated. Mutually exclusive with `--all`. To
281
320
  * remove an entry or clear the list, use `fireforge patch lint-ignore`,
282
321
  * which has explicit `--add` / `--remove` / `--clear` modes.
283
322
  */
284
323
  lintIgnore?: string[];
285
- /**
286
- * Parsed `--wait-lock [seconds]` value (`true` for the bare flag, meaning
287
- * 60). Consumed at the CLI layer to bound the engine-session-lock wait;
288
- * the command implementation ignores it.
289
- */
290
- waitLock?: number | boolean;
291
324
  /**
292
325
  * Refuse (non-zero exit, patch not written) a scan-less re-export when
293
326
  * unmanaged files exist adjacent to the patch's ownership, instead of
294
327
  * warning. Gate-driven workflows use this so a freshly created file
295
328
  * beside a patch's owned files cannot be silently left out of the
296
- * refreshed body. Only meaningful on the plain path — mutually
329
+ * refreshed body. Only meaningful on the plain path, and mutually
297
330
  * exclusive with `--scan` and `--files`, which set filesAffected
298
331
  * explicitly.
299
332
  */
300
333
  refuseAdjacentUnmanaged?: boolean;
301
334
  /**
302
- * Bypass per-patch lint result cache reads AND writes for this invocation
335
+ * Bypass per-patch lint result cache reads and writes for this invocation
303
336
  * (`--no-cache`). The cache is what lets a repeat re-export of an unchanged
304
337
  * patch skip the checkJs program build entirely.
305
338
  */
306
339
  noCache?: boolean;
307
340
  /**
308
341
  * Refuse (non-zero exit, patch not written) a re-export whose refreshed
309
- * body would absorb engine lines not present in the old patch body —
310
- * the multi-session guard against silently capturing another session's
311
- * uncommitted edits in files the patch already owns. The drift preview
312
- * always prints; this flag turns it into a hard stop. Mutually
342
+ * body would absorb engine lines not present in the old patch body.
343
+ * This is the multi-session guard against silently capturing another
344
+ * session's uncommitted edits in files the patch already owns. The drift preview
345
+ * always prints. This flag turns it into a hard stop. Mutually
313
346
  * exclusive with `--scan` and `--files`.
314
347
  */
315
348
  refuseForeignDrift?: boolean;
316
349
  /**
317
- * Engine-relative files whose drift is EXPECTED (`--expect`, repeatable;
318
- * requires `--refuse-foreign-drift`). The content-based drift detector
350
+ * Engine-relative files whose drift is expected (`--expect`, repeatable).
351
+ * Requires `--refuse-foreign-drift`. The content-based drift detector
319
352
  * cannot tell the exporting session's own slice edits from another
320
353
  * session's, so a slice export under the refusal flag names its intended
321
354
  * files here: drift confined to expected files proceeds, drift anywhere
@@ -323,69 +356,47 @@ export interface ReExportOptions {
323
356
  */
324
357
  expect?: string[];
325
358
  /**
326
- * Engine-relative files that are an APPROVED unmanaged exception
327
- * (`--expect-unmanaged`, repeatable; requires
328
- * `--refuse-adjacent-unmanaged`). The adjacency refusal is all-or-nothing
329
- * without it: a project with a reviewed, deliberately unmanaged path beside
330
- * a patch's ownership has to drop the flag entirely and hand-read the
331
- * notice, which is a weaker belt than the one being disarmed. Approved
332
- * paths are still LISTED — they are carved out of the refusal, not hidden.
359
+ * Engine-relative files that are an approved unmanaged exception
360
+ * (`--expect-unmanaged`, repeatable). Requires
361
+ * `--refuse-adjacent-unmanaged`. The adjacency refusal is all-or-nothing
362
+ * without it: a project with a reviewed, intentionally unmanaged path
363
+ * beside a patch's ownership has to drop the flag entirely and hand-read
364
+ * the notice, which is a weaker belt than the one being disarmed.
365
+ * Approved paths are still listed. They are carved out of the refusal
366
+ * rather than hidden.
333
367
  */
334
368
  expectUnmanaged?: string[];
335
369
  }
336
370
  /**
337
371
  * Options for the `fireforge patch tier` subcommand. Sets or clears the
338
372
  * `PatchMetadata.tier` field on a single patch without rewriting the
339
- * `.patch` file body — the manifest is the only thing that changes.
373
+ * `.patch` file body. The manifest is the only thing that changes.
340
374
  */
341
- export interface PatchTierOptions {
342
- /**
343
- * Seconds to wait for the patch directory lock. This command mutates patch
344
- * metadata under that lock.
345
- */
346
- waitLock?: number | boolean;
375
+ export interface PatchTierOptions extends Confirmable, DryRunnable, PatchLockWaitable {
347
376
  /** Force the named tier on the patch. Only `"branding"` is recognised. */
348
377
  tier?: 'branding';
349
378
  /** Remove the `tier` override entirely, restoring auto-detection. */
350
379
  clear?: boolean;
351
- /** Print the planned change without writing. */
352
- dryRun?: boolean;
353
- /** Skip the confirmation prompt (required for non-TTY). */
354
- yes?: boolean;
355
380
  }
356
381
  /**
357
382
  * Options for the `fireforge patch lint-ignore` subcommand. Modes are
358
- * mutually exclusive — exactly one of `add`, `remove`, or `clear` must
383
+ * mutually exclusive: exactly one of `add`, `remove`, or `clear` must
359
384
  * be set per invocation.
360
385
  */
361
- export interface PatchLintIgnoreOptions {
362
- /**
363
- * Seconds to wait for the patch directory lock. This command mutates patch
364
- * metadata under that lock.
365
- */
366
- waitLock?: number | boolean;
386
+ export interface PatchLintIgnoreOptions extends Confirmable, DryRunnable, PatchLockWaitable {
367
387
  /** Lint check IDs to add to the patch's `lintIgnore` list (union, de-duped). */
368
388
  add?: string[];
369
389
  /** Lint check IDs to remove from the patch's `lintIgnore` list. */
370
390
  remove?: string[];
371
391
  /** Drop the `lintIgnore` field entirely. */
372
392
  clear?: boolean;
373
- /** Print the planned change without writing. */
374
- dryRun?: boolean;
375
- /** Skip the confirmation prompt (required for non-TTY). */
376
- yes?: boolean;
377
393
  }
378
394
  /**
379
395
  * Options for the `fireforge patch staged-dependency` subcommand. Modes are
380
396
  * mutually exclusive: add a declaration, remove one or more matching
381
397
  * declarations, or clear all staged dependencies from the patch.
382
398
  */
383
- export interface PatchStagedDependencyOptions {
384
- /**
385
- * Seconds to wait for the patch directory lock. This command mutates patch
386
- * metadata under that lock.
387
- */
388
- waitLock?: number | boolean;
399
+ export interface PatchStagedDependencyOptions extends Confirmable, DryRunnable, PatchLockWaitable {
389
400
  /** Add a staged dependency declaration. */
390
401
  add?: boolean;
391
402
  /** Remove matching staged dependency declarations. */
@@ -413,20 +424,16 @@ export interface PatchStagedDependencyOptions {
413
424
  owner?: string;
414
425
  /** Optional human-readable rationale stored with the declaration. */
415
426
  reason?: string;
416
- /** Print the planned change without writing. */
417
- dryRun?: boolean;
418
- /** Skip the confirmation prompt (required for non-TTY). */
419
- yes?: boolean;
420
427
  }
421
428
  /**
422
429
  * Options for the `patch split` command.
423
430
  */
424
- export interface PatchSplitOptions {
431
+ export interface PatchSplitOptions extends Confirmable, PatchLockWaitable, UnsafeOverridable {
425
432
  /** Files to move out of the source patch (engine-relative). */
426
433
  files: string[];
427
434
  /** Name for the new patch (used in its filename slug). */
428
435
  name: string;
429
- /** Category for the new patch; defaults to the source patch's category. */
436
+ /** Category for the new patch. Defaults to the source patch's category. */
430
437
  category?: string;
431
438
  /** Description for the new patch. */
432
439
  description?: string;
@@ -438,14 +445,8 @@ export interface PatchSplitOptions {
438
445
  after?: string;
439
446
  /** Preview without writing. */
440
447
  dryRun?: boolean;
441
- /** Skip interactive confirmation (required for non-TTY). */
442
- yes?: boolean;
443
- /** Bypass projected-lint refusals. */
444
- forceUnsafe?: boolean;
445
448
  /** Skip per-patch lint of the projected bodies. */
446
449
  skipLint?: boolean;
447
- /** Wait budget for the patch directory lock (`--wait-lock [seconds]`). */
448
- waitLock?: number | boolean;
449
450
  }
450
451
  /**
451
452
  * Options for the `fireforge patch move-files` subcommand. Without
@@ -454,27 +455,21 @@ export interface PatchSplitOptions {
454
455
  * With `--create --order <n>` the target patch is created at that order
455
456
  * and the files move into it as one split-style transaction.
456
457
  */
457
- export interface PatchMoveFilesOptions {
458
+ export interface PatchMoveFilesOptions extends Confirmable, PatchLockWaitable, UnsafeOverridable {
458
459
  /** File paths relative to engine/ to move from the source patch to the target patch. */
459
460
  file?: string[];
460
461
  /** Create the target patch (transactional bootstrap of a split). Requires `order`. */
461
462
  create?: boolean;
462
463
  /** Exact sparse order for the created patch. Only valid with `create`. */
463
464
  order?: number;
464
- /** Category for the created patch; defaults to the source patch's. */
465
+ /** Category for the created patch. Defaults to the source patch's. */
465
466
  category?: string;
466
467
  /** Description for the created patch. */
467
468
  description?: string;
468
469
  /** Preview the create+move without writing. */
469
470
  dryRun?: boolean;
470
- /** Skip interactive confirmation (required for non-TTY). */
471
- yes?: boolean;
472
- /** Bypass projected-lint refusals. */
473
- forceUnsafe?: boolean;
474
471
  /** Skip per-patch lint of the projected bodies. */
475
472
  skipLint?: boolean;
476
- /** Wait budget for the patch directory lock (`--wait-lock [seconds]`). */
477
- waitLock?: number | boolean;
478
473
  }
479
474
  /**
480
475
  * Options for the rebase command.
@@ -506,15 +501,15 @@ export interface RunOptions {
506
501
  * Enable smoke-run mode. Launches the browser, streams the console,
507
502
  * sends SIGTERM to the whole process group after `smokeExit` seconds,
508
503
  * and applies the smoke exit contract:
509
- * - `0` — clean window (no unallowed error lines).
510
- * - `ExitCode.SMOKE_EXIT_FAILURE` (12) — one or more console lines
504
+ * - `0`: clean window (no unallowed error lines).
505
+ * - `ExitCode.SMOKE_EXIT_FAILURE` (12): one or more console lines
511
506
  * matched the error heuristic and were not covered by the allowlist.
512
- * - `ExitCode.SMOKE_LAUNCH_FAILURE` (13) — the browser exited with a
513
- * non-clean status before the smoke window elapsed (launch-side
514
- * failure we cannot observe as a console line — crash before console
515
- * wiring, missing profile, etc.).
507
+ * - `ExitCode.SMOKE_LAUNCH_FAILURE` (13): the browser exited with a
508
+ * non-clean status before the smoke window elapsed (a launch-side
509
+ * failure we cannot observe as a console line, such as a crash
510
+ * before console wiring, or a missing profile).
516
511
  *
517
- * POSIX only (process-group semantics do not map cleanly onto Windows);
512
+ * POSIX only (process-group semantics do not map cleanly onto Windows).
518
513
  * `runSmokeExit` rejects the flag up front on `win32`.
519
514
  */
520
515
  smokeExit?: number;
@@ -526,7 +521,7 @@ export interface RunOptions {
526
521
  consoleAllow?: string[];
527
522
  /**
528
523
  * Path to a newline-delimited allowlist regex file. Blank lines and
529
- * `#` comments are ignored; each remaining line is compiled as a
524
+ * `#` comments are ignored. Each remaining line is compiled as a
530
525
  * regex and appended to the active allowlist.
531
526
  */
532
527
  consoleAllowFile?: string;
@@ -546,7 +541,7 @@ export interface RunOptions {
546
541
  /**
547
542
  * Options for the test command.
548
543
  */
549
- export interface TestOptions {
544
+ export interface TestOptions extends EngineLockWaitable {
550
545
  /** Run tests in headless mode */
551
546
  headless?: boolean;
552
547
  /**
@@ -561,7 +556,7 @@ export interface TestOptions {
561
556
  * Run the scoped pre-test build (packaging exactly the requested paths,
562
557
  * MIXED harnesses allowed) and exit without dispatching tests. One
563
558
  * ~10-minute build then covers both an xpcshell and a browser-chrome
564
- * half of a slice; run each harness afterwards without `--build`.
559
+ * half of a slice. Run each harness afterwards without `--build`.
565
560
  * Emits `FIREFORGE-VERDICT: PASS` on success.
566
561
  */
567
562
  buildOnly?: boolean;
@@ -579,7 +574,7 @@ export interface TestOptions {
579
574
  * Forwarded to the PRE-TEST build: refuse (rather than warn) when that
580
575
  * build would overwrite engine content recorded in neither a patch body
581
576
  * nor the pristine baseline. Same meaning as `fireforge build`'s flag of
582
- * the same name — a scripted `test --build` is exactly the shape the
577
+ * the same name. A scripted `test --build` is exactly the shape the
583
578
  * multi-session hazard shows up in, and until now it was the one shape
584
579
  * that could not arm the refusal. Valid only with `--build`/`--build-only`.
585
580
  */
@@ -595,8 +590,8 @@ export interface TestOptions {
595
590
  /**
596
591
  * Extra arguments forwarded verbatim to `mach test` (repeatable). Escape
597
592
  * valve for upstream xpcshell/mochitest flags that FireForge does not
598
- * model directly. Order relative to other flags is preserved; passthrough
599
- * values appear after `--headless` if both are set.
593
+ * model directly. Order relative to other flags is preserved, and
594
+ * passthrough values appear after `--headless` if both are set.
600
595
  */
601
596
  machArg?: string[];
602
597
  /**
@@ -614,8 +609,8 @@ export interface TestOptions {
614
609
  /**
615
610
  * Terminate harness helper processes (`xpcshell` httpd, `pywebsocket`,
616
611
  * `ssltunnel`, `moz-http2`) that survived an earlier run in this
617
- * project's objdir. The census itself runs on EVERY test dispatch and is
618
- * report-only; this flag opts into the kill. Survivors slow later runs
612
+ * project's objdir. The census itself runs on every test dispatch and is
613
+ * report-only. This flag opts into the kill. Survivors slow later runs
619
614
  * without appearing in their output, so the visibility is the default and
620
615
  * the termination is the choice.
621
616
  */
@@ -624,9 +619,9 @@ export interface TestOptions {
624
619
  allowStaleBuild?: boolean;
625
620
  /**
626
621
  * Permit tests despite `components.conf` changes that only a full
627
- * `fireforge build` compiles into the StaticComponents table — the
628
- * packaged child process will resolve the OLD table. For operators who
629
- * rebuilt out-of-band and accept the risk; distinct from
622
+ * `fireforge build` compiles into the StaticComponents table. The
623
+ * packaged child process will resolve the old table. For operators who
624
+ * rebuilt out-of-band and accept the risk. Distinct from
630
625
  * `allowStaleBuild`, which only accepts stale packaged content.
631
626
  */
632
627
  allowStaleComponents?: boolean;
@@ -643,14 +638,14 @@ export interface TestOptions {
643
638
  * Force dispatch through the generic `mach test` command instead of the
644
639
  * suite-specific `mach xpcshell-test` / `mach mochitest` commands a
645
640
  * single-suite run auto-selects. Escape hatch for the rare case where a
646
- * suite-specific command misbehaves; on a healthy host the generic command
641
+ * suite-specific command misbehaves. On a healthy host the generic command
647
642
  * is equivalent. The default (auto suite dispatch) skips the mozlog
648
643
  * resource monitor that crashes `mach test` on a broken host.
649
644
  */
650
645
  genericMachTest?: boolean;
651
646
  /**
652
647
  * Commander negation flag for `--no-shard`. When false, multiple test
653
- * paths run in one combined mach invocation; by default they shard into
648
+ * paths run in one combined mach invocation. By default they shard into
654
649
  * sequential single-file harness runs with an aggregate report.
655
650
  */
656
651
  shard?: boolean;
@@ -660,19 +655,11 @@ export interface TestOptions {
660
655
  * checkers that consume a sample artifact after the run.
661
656
  */
662
657
  perfSamples?: string;
663
- /**
664
- * Parsed `--wait-lock [seconds]` value (`true` for the bare flag, meaning
665
- * 60). Consumed at the CLI layer to bound the engine-session-lock wait;
666
- * the command implementation ignores it.
667
- */
668
- waitLock?: number | boolean;
669
658
  }
670
659
  /**
671
660
  * Options for the furnace apply command.
672
661
  */
673
- export interface FurnaceApplyOptions {
674
- /** Show what would be changed without writing */
675
- dryRun?: boolean;
662
+ export interface FurnaceApplyOptions extends DryRunnable {
676
663
  /** Proceed despite baseVersion drift (stale overrides) */
677
664
  force?: boolean;
678
665
  /** Watch component directories and re-apply on changes */
@@ -694,9 +681,7 @@ export interface FurnacePreviewOptions {
694
681
  /**
695
682
  * Options for the furnace deploy command.
696
683
  */
697
- export interface FurnaceDeployOptions {
698
- /** Show what would be changed without writing */
699
- dryRun?: boolean;
684
+ export interface FurnaceDeployOptions extends DryRunnable {
700
685
  /** Proceed despite baseVersion drift (stale overrides) */
701
686
  force?: boolean;
702
687
  /** Skip the validation step (apply only, no accessibility/compatibility checks) */
@@ -711,9 +696,7 @@ export interface FurnaceDeployOptions {
711
696
  /**
712
697
  * Options for the furnace refresh command.
713
698
  */
714
- export interface FurnaceRefreshOptions {
715
- /** Show what would change without modifying files */
716
- dryRun?: boolean;
699
+ export interface FurnaceRefreshOptions extends DryRunnable {
717
700
  /** Refresh all overrides in a single batch */
718
701
  all?: boolean;
719
702
  /** Conflict resolution strategy for automated use (ours = keep local, theirs = accept upstream) */
@@ -724,9 +707,7 @@ export interface FurnaceRefreshOptions {
724
707
  /**
725
708
  * Options for the furnace sync command.
726
709
  */
727
- export interface FurnaceSyncOptions {
728
- /** Show what would change without modifying files */
729
- dryRun?: boolean;
710
+ export interface FurnaceSyncOptions extends DryRunnable {
730
711
  /** Conflict resolution strategy for three-way merge (ours = keep local, theirs = accept upstream) */
731
712
  strategy?: 'ours' | 'theirs';
732
713
  /**
@@ -753,12 +734,10 @@ export interface FurnaceOverrideOptions {
753
734
  description?: string;
754
735
  }
755
736
  /**
756
- * Options for the furnace remove command.
737
+ * Options for the furnace remove command. `--yes` is the only flag it takes,
738
+ * so the type is the confirmation mixin under a command-specific name.
757
739
  */
758
- export interface FurnaceRemoveOptions {
759
- /** Skip confirmation prompt */
760
- yes?: boolean;
761
- }
740
+ export type FurnaceRemoveOptions = Confirmable;
762
741
  /**
763
742
  * Options for the furnace create command.
764
743
  */
@@ -795,15 +774,15 @@ export interface FurnaceCreateOptions {
795
774
  * Test harness style to scaffold when `--with-tests` is set.
796
775
  *
797
776
  * - `browser-chrome` (default when `--with-tests` is set without
798
- * `--test-style`) — browser mochitest scaffold; requires a working
777
+ * `--test-style`): browser mochitest scaffold. Requires a working
799
778
  * `tabbrowser`. Prefer this for interactive chrome/widget coverage
800
779
  * (including on macOS).
801
- * - `mochikit` — opt-in MochiKit test at
780
+ * - `mochikit`: opt-in MochiKit test at
802
781
  * `engine/toolkit/content/tests/widgets/test_<tag>.html` that loads
803
782
  * the component via `chrome://global/`. Use when the top-level chrome
804
- * document lacks a `tabbrowser`; on macOS the toolkit mochitest-chrome
783
+ * document lacks a `tabbrowser`. On macOS the toolkit mochitest-chrome
805
784
  * flavor can be unreliable (long idle timeout).
806
- * - `xpcshell` — equivalent to setting `--xpcshell`; headless, storage-only.
785
+ * - `xpcshell`: equivalent to setting `--xpcshell`. Headless, storage-only.
807
786
  */
808
787
  testStyle?: 'mochikit' | 'browser-chrome' | 'xpcshell';
809
788
  /** Stock component tag names composed internally by this component */
@@ -829,7 +808,7 @@ export interface FurnaceCreateOptions {
829
808
  * Without this flag, a name that does not start with the prefix is
830
809
  * rejected before any files are written, so a prefix-mismatched
831
810
  * component cannot leave behind a half-scaffolded state. Pass this
832
- * flag only when you know the prefix mismatch is intentional — e.g.
811
+ * flag only when you know the prefix mismatch is intentional, e.g.
833
812
  * creating an experimental component whose name intentionally breaks
834
813
  * the fork's convention.
835
814
  */
@@ -865,15 +844,9 @@ export interface RegisterOptions {
865
844
  /**
866
845
  * Options for the patch delete command.
867
846
  */
868
- export interface PatchDeleteOptions {
869
- /** Skip confirmation prompt; required for non-TTY runs. */
870
- yes?: boolean;
871
- /** Print what would happen without writing anything. */
872
- dryRun?: boolean;
847
+ export interface PatchDeleteOptions extends Confirmable, DryRunnable, PatchLockWaitable {
873
848
  /** Bypass the hard refusal when later patches depend on the target. */
874
849
  forceUnsafe?: boolean;
875
- /** Wait budget for the patch directory lock (`--wait-lock [seconds]`). */
876
- waitLock?: number | boolean;
877
850
  }
878
851
  /**
879
852
  * Options for the `fireforge patch rename` subcommand. Updates the patch's
@@ -882,67 +855,49 @@ export interface PatchDeleteOptions {
882
855
  * for the case where the body is already correct but the patch's identity
883
856
  * describes a pre-shrink scope.
884
857
  */
885
- export interface PatchRenameOptions {
858
+ export interface PatchRenameOptions extends Confirmable, DryRunnable, PatchLockWaitable, UnsafeOverridable {
886
859
  /**
887
860
  * New human-readable name. Sanitised the same way `export --name`
888
861
  * sanitises into the filename slug (lowercase, non-alphanumerics
889
862
  * collapsed to `-`, length-capped). The patch's `name` field stores
890
- * the raw value; the filename uses the sanitised slug. Optional when
863
+ * the raw value. The filename uses the sanitised slug. Optional when
891
864
  * `--category`/`--order`/`--description` carry the change.
892
865
  */
893
866
  to?: string;
894
867
  /**
895
868
  * New category (validated against configured categories). Rewrites
896
- * the filename prefix and the manifest row in one transaction —
869
+ * the filename prefix and the manifest row in one transaction, so
897
870
  * recategorising no longer requires `patch delete` + fresh export.
898
871
  */
899
872
  category?: string;
900
873
  /**
901
- * Move the patch to this exact UNUSED sparse order. Collisions refuse
902
- * with a pointer to `patch reorder` (which renumbers siblings); an
874
+ * Move the patch to this exact unused sparse order. Collisions refuse
875
+ * with a pointer to `patch reorder` (which renumbers siblings). An
903
876
  * order change is projected through cross-patch lint first.
904
877
  */
905
878
  order?: number;
906
879
  /**
907
880
  * Replacement description. Omit to leave the description unchanged
908
- * (intentional — operators frequently want to relabel the slug
881
+ * (intentional: operators frequently want to relabel the slug
909
882
  * without touching the description).
910
883
  */
911
884
  description?: string;
912
- /** Print the planned change without writing. */
913
- dryRun?: boolean;
914
- /** Skip the confirmation prompt (required for non-TTY). */
915
- yes?: boolean;
916
- /** Bypass force-mode patchPolicy refusals. */
917
- forceUnsafe?: boolean;
918
- /** Wait budget for the patch directory lock (`--wait-lock [seconds]`). */
919
- waitLock?: number | boolean;
920
885
  }
921
886
  /**
922
887
  * Options for the patch reorder command.
923
888
  */
924
- export interface PatchReorderOptions {
889
+ export interface PatchReorderOptions extends PatchLockWaitable {
925
890
  to?: number;
926
891
  before?: string;
927
892
  after?: string;
928
893
  yes?: boolean;
929
894
  dryRun?: boolean;
930
895
  forceUnsafe?: boolean;
931
- /** Wait budget for the patch directory lock (`--wait-lock [seconds]`). */
932
- waitLock?: number | boolean;
933
896
  }
934
897
  /**
935
898
  * Options for the patch compact command.
936
899
  */
937
- export interface PatchCompactOptions {
938
- /** Skip confirmation prompt; required for non-TTY runs. */
939
- yes?: boolean;
940
- /** Print what would happen without writing anything. */
941
- dryRun?: boolean;
942
- /** Bypass force-mode patchPolicy refusals. */
943
- forceUnsafe?: boolean;
944
- /** Wait budget for the patch directory lock (`--wait-lock [seconds]`). */
945
- waitLock?: number | boolean;
900
+ export interface PatchCompactOptions extends Confirmable, DryRunnable, PatchLockWaitable, UnsafeOverridable {
946
901
  }
947
902
  /**
948
903
  * Options for the status command.
@@ -952,9 +907,9 @@ export interface StatusOptions {
952
907
  /**
953
908
  * Report the engine-session lock instead of file status:
954
909
  * holder pid, the command it is running, how long it has held the lock,
955
- * and how many waiters are queued behind it. Read-only — it never
910
+ * and how many waiters are queued behind it. Read-only: it never
956
911
  * acquires the lock, so it is safe to run while a build or test holds
957
- * it, which is exactly when an operator asks.
912
+ * it, which is when an operator usually asks.
958
913
  */
959
914
  lock?: boolean;
960
915
  unmanaged?: boolean;
@@ -967,7 +922,7 @@ export interface StatusOptions {
967
922
  ownership?: boolean;
968
923
  /**
969
924
  * Print the recorded test-packaging coverage of the last build baseline
970
- * (scope, timestamp, recording invocation) and exit. Read-only — the
925
+ * (scope, timestamp, recording invocation) and exit. Read-only, and the
971
926
  * counterpart to the out-of-coverage test refusal.
972
927
  */
973
928
  testCoverage?: boolean;
@@ -982,18 +937,18 @@ export interface StatusOptions {
982
937
  summary?: boolean;
983
938
  /**
984
939
  * With `--json` (and composing with `--summary`), append an additive
985
- * `ownership` block — the flat path→owning-patch rows plus
986
- * managed/unmanaged/conflict counts — so a gate reads ownership,
987
- * classification, and the check verdict from ONE scan instead of three
988
- * back-to-back `status` invocations. A modifier, not a mode: exit
989
- * semantics are unchanged, so ownership conflicts still fail only the
990
- * human `--ownership` mode. Refused without `--json`.
940
+ * `ownership` block (the flat path→owning-patch rows plus
941
+ * managed/unmanaged/conflict counts) so a gate reads ownership,
942
+ * classification, and the check verdict from one scan instead of three
943
+ * back-to-back `status` invocations. This is a modifier rather than a
944
+ * mode: exit semantics are unchanged, so ownership conflicts still fail
945
+ * only the human `--ownership` mode. Refused without `--json`.
991
946
  */
992
947
  includeOwnership?: boolean;
993
948
  /**
994
949
  * Exit non-zero when any classification in the fail policy is
995
950
  * non-empty (default policy: unmanaged, patch-owned-drift, conflict).
996
- * Composes with the default view and `--json`; refused alongside
951
+ * Composes with the default view and `--json`. Refused alongside
997
952
  * `--raw`/`--unmanaged`/`--ownership`/`--test-coverage`.
998
953
  */
999
954
  check?: boolean;
@@ -1009,7 +964,7 @@ export interface StatusOptions {
1009
964
  */
1010
965
  export interface TokenAddOptions {
1011
966
  /**
1012
- * Required for a base declaration; optional under
967
+ * Required for a base declaration. Optional under
1013
968
  * {@link TokenAddOptions.variant}, which routes into a `:root<selector>`
1014
969
  * block where no category applies.
1015
970
  */
@@ -1084,8 +1039,8 @@ export interface LintCommandOptions {
1084
1039
  /**
1085
1040
  * When set, tag each issue as `introduced` or `cumulative` based on
1086
1041
  * whether its file changed since this git revision (e.g. `HEAD`, a
1087
- * branch name, or a SHA). Issues are not filtered — the full set still
1088
- * prints — but a diff-scoped summary makes it trivial to see which
1042
+ * branch name, or a SHA). Issues are not filtered and the full set
1043
+ * still prints, but a diff-scoped summary makes it easy to see which
1089
1044
  * errors the current task introduced.
1090
1045
  */
1091
1046
  since?: string;
@@ -1108,8 +1063,8 @@ export interface LintCommandOptions {
1108
1063
  * On a repo where `import` or `rebase` has just applied the full queue,
1109
1064
  * the aggregate diff sums every patch's changes, and the patch-size
1110
1065
  * advisory rules (`large-patch-lines`, `large-patch-files`) fire against
1111
- * that sum — "Patch is 37529 lines" for a queue of individually-fine
1112
- * patches. `--per-patch` rescopes the diff to each patch's own
1066
+ * that sum, reporting "Patch is 37529 lines" for a queue of
1067
+ * individually-fine patches. `--per-patch` rescopes the diff to each patch's own
1113
1068
  * `filesAffected`, honours the patch's own `lintIgnore`, and runs the
1114
1069
  * cross-patch rules once over the whole queue so queue-level findings
1115
1070
  * still surface.
@@ -1122,7 +1077,7 @@ export interface LintCommandOptions {
1122
1077
  * Restrict `--per-patch` to a named subset of the queue (by filename,
1123
1078
  * filename ± `.patch`, or manifest `name`). Lets a change that touches a
1124
1079
  * handful of patches run the per-patch gate over just those instead of
1125
- * the full ~90-patch queue. Only valid with {@link perPatch}; queue-level
1080
+ * the full ~90-patch queue. Only valid with {@link perPatch}. Queue-level
1126
1081
  * findings (policy, cross-patch) are scoped to files the subset touches.
1127
1082
  */
1128
1083
  patches?: string[];