@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
@@ -1,10 +1,10 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge tree` — copy-on-write verification clones.
3
+ * `fireforge tree`: copy-on-write verification clones.
4
4
  *
5
- * Trees enable concurrent READ-MOSTLY verification (lint, typecheck, status,
5
+ * Trees enable concurrent read-mostly verification (lint, typecheck, status,
6
6
  * verify, doctor, export dry-runs) beside a busy primary tree. Exports and
7
- * every other mutation stay strictly serial in the primary — a tree's
7
+ * every other mutation stay strictly serial in the primary, because a tree's
8
8
  * patches/components are snapshots with no merge model, and the tree guard
9
9
  * (cli.ts preAction + core/tree-guard.ts) refuses mutating commands inside a
10
10
  * tree.
@@ -13,8 +13,8 @@
13
13
  * directory, rewrites its mozinfo.json to the tree, and runs `mach configure`
14
14
  * inside the tree so the remaining configure output (config.status,
15
15
  * backend.mk, Makefile, config/autoconf.mk) stops naming the primary. That is
16
- * fail-closed by design — mach objdirs embed absolute source paths, and an
17
- * unrelocated clone would silently operate against the primary — and it is
16
+ * fail-closed by design (mach objdirs embed absolute source paths, and an
17
+ * unrelocated clone would silently operate against the primary), and it is
18
18
  * what admits build-less `fireforge test` inside that tree.
19
19
  */
20
20
  import { spawn } from 'node:child_process';
@@ -61,14 +61,14 @@ async function resolveObjdirForClone(projectRoot) {
61
61
  /**
62
62
  * Runs `mach configure` inside the tree's engine so the configure-generated
63
63
  * root files (config.status, backend.mk, Makefile, config/autoconf.mk) are
64
- * regenerated against the tree's paths — the mozinfo rewrite alone leaves
64
+ * regenerated against the tree's paths. The mozinfo rewrite alone leaves
65
65
  * those naming the primary, and a build-less in-tree `test` must never
66
66
  * consult primary state. Exit code 0 is not trusted on its own: configure
67
67
  * obeys MOZCONFIG / MOZ_OBJDIR, so the postcondition is verified afterwards
68
- * via `findObjdirRelocationViolation` — the intended objdir was configured,
68
+ * via `findObjdirRelocationViolation`: the intended objdir was configured,
69
69
  * its mozinfo points into the tree, and none of those root files still
70
70
  * names the primary engine (nested Makefiles are products of the verified
71
- * config.status; `.deps` build products are out of scope — see the
71
+ * config.status, and `.deps` build products are out of scope, see the
72
72
  * checker's doc). A failure throws before `cloneTree` writes the marker,
73
73
  * so the tree is removed and `clonedObjdir` is never recorded (fail-closed).
74
74
  */
@@ -102,7 +102,7 @@ export async function treeCreateCommand(projectRoot, name, options = {}) {
102
102
  intro('FireForge Tree Create');
103
103
  assertValidTreeName(name);
104
104
  // A marker we cannot parse still means "something claims this is a tree", so
105
- // it must block nesting too — otherwise a corrupt marker is a licence to
105
+ // it must block nesting too. Otherwise a corrupt marker is a licence to
106
106
  // clone a snapshot into itself.
107
107
  const markerState = await readTreeMarker(projectRoot);
108
108
  if (markerState.kind !== 'absent') {
@@ -128,15 +128,15 @@ export async function treeCreateCommand(projectRoot, name, options = {}) {
128
128
  warn('No copy-on-write support detected — performing a full physical copy (--force-copy).');
129
129
  }
130
130
  // Courtesy fast-fail: refuse obvious no-build cases before waiting on
131
- // locks. The result is DISCARDED — a build can still start before the
131
+ // locks. The result is discarded: a build can still start before the
132
132
  // locks below are held, so only the re-resolution under the build lock
133
133
  // is authoritative for what actually gets cloned.
134
134
  if (options.withObjdir === true) {
135
135
  await resolveObjdirForClone(projectRoot);
136
136
  }
137
- // Snapshot under the PRIMARY engine-session lock so a mid-mutation
138
- // state (half-applied export, furnace deploy) is never captured; an
139
- // objdir snapshot additionally holds the primary BUILD lock, under
137
+ // Snapshot under the primary engine-session lock so a mid-mutation
138
+ // state (half-applied export, furnace deploy) is never captured. An
139
+ // objdir snapshot additionally holds the primary build lock, under
140
140
  // which the objdir is re-validated immediately before cloning so a
141
141
  // concurrent `fireforge build` can neither tear the obj-* mid-write
142
142
  // nor swap it after preflight. A failed clone (including the
@@ -183,8 +183,8 @@ export async function treeCreateCommand(projectRoot, name, options = {}) {
183
183
  export async function treeListCommand(projectRoot, options = {}) {
184
184
  if (options.json === true) {
185
185
  // stdout belongs exclusively to the JSON payload: engage machine mode so
186
- // any diagnostic — including a listTrees failure rendered later by
187
- // withErrorHandling, which also resets the mode — routes to stderr.
186
+ // any diagnostic, including a listTrees failure rendered later by
187
+ // withErrorHandling (which also resets the mode), routes to stderr.
188
188
  setMachineOutputMode(true);
189
189
  try {
190
190
  const trees = await listTrees(projectRoot);
@@ -280,17 +280,17 @@ async function treeExecCommand(projectRoot, name, args) {
280
280
  resolvePromise(code ?? 1);
281
281
  });
282
282
  }).finally(() => {
283
- // With `stdio: 'inherit'` the child owned stdout — including any
284
- // FIREFORGE-VERDICT line it emitted as its LAST stdout write. From here
283
+ // With `stdio: 'inherit'` the child owned stdout, including any
284
+ // FIREFORGE-VERDICT line it emitted as its last stdout write. From here
285
285
  // on the parent must not write stdout again, or its own refusal text
286
- // (the GeneralError below, rendered by withErrorHandling) prints AFTER
286
+ // (the GeneralError below, rendered by withErrorHandling) prints after
287
287
  // the child's verdict and breaks the "verdict is the run's last stdout
288
288
  // line" contract at the tree-exec boundary. Sealing routes the parent's
289
- // remaining output to stderr; withErrorHandling's finally clears it.
289
+ // remaining output to stderr. withErrorHandling's finally clears it.
290
290
  setStdoutSealed(true);
291
291
  });
292
292
  if (exitCode !== 0) {
293
- throw new GeneralError(`tree exec: fireforge ${args.join(' ')} exited with code ${String(exitCode)}.`);
293
+ throw new GeneralError(`tree exec: fireforge ${args.join(' ')} exited with code ${exitCode}.`);
294
294
  }
295
295
  }
296
296
  /** Registers the tree command group on the CLI program. */
@@ -298,7 +298,12 @@ export function registerTree(program, context) {
298
298
  const { getProjectRoot, withErrorHandling } = context;
299
299
  const tree = program
300
300
  .command('tree')
301
- .description('Manage copy-on-write verification clones of this project for concurrent read-mostly work (lint, typecheck, status, verify, export/re-export --dry-run; build-less test with create --with-objdir). Mutation commands are refused inside a tree.');
301
+ .description('Manage copy-on-write verification clones of this project for concurrent read-mostly work (lint, typecheck, status, verify, export/re-export --dry-run; build-less test with create --with-objdir). Mutation commands are refused inside a tree.')
302
+ // No-subcommand contract shared with `patch`/`token`/`furnace`: help on
303
+ // stdout, exit 0 (see `handleParseError` for the groups without an action).
304
+ .action(() => {
305
+ tree.outputHelp();
306
+ });
302
307
  addWaitLockOption(tree
303
308
  .command('create <name>')
304
309
  .description('Clone the project (engine included, obj-* excluded) into .fireforge/trees/<name> using filesystem copy-on-write (APFS clonefile / btrfs-XFS reflink). Refuses on filesystems without CoW support unless --force-copy explicitly accepts a full physical copy.')
@@ -1,10 +1,10 @@
1
1
  /**
2
- * `fireforge typecheck` — whole-project TypeScript type checking driven by
2
+ * `fireforge typecheck`: whole-project TypeScript type checking driven by
3
3
  * user-supplied jsconfig.json paths.
4
4
  *
5
5
  * Distinct from `patchLint.checkJs`: that pass is patch-hygiene (scoped to
6
- * patch-owned `.sys.mjs`, run automatically by `fireforge lint`); this
7
- * command is CI-grade — it runs whole projects with the user's own compiler
6
+ * patch-owned `.sys.mjs`, run automatically by `fireforge lint`). This
7
+ * command is CI-grade: it runs whole projects with the user's own compiler
8
8
  * options. The two share their Firefox-globals shim and the same
9
9
  * suppressed-diagnostic set so a file that lints clean cannot fail typecheck
10
10
  * for a reason the operator could not have inferred from the docs.
@@ -21,15 +21,15 @@ import type { TypecheckProjectResult } from '../types/typecheck.js';
21
21
  export interface TypecheckCommandOptions {
22
22
  /**
23
23
  * Override `typecheck.projects` with a single jsconfig.json path
24
- * for one-off verification. Replaces (does not augment) the config
25
- * — useful to re-run a single project after fixing one of its
24
+ * for one-off verification. Replaces (does not augment) the config,
25
+ * which is useful to re-run a single project after fixing one of its
26
26
  * issues without waiting for the full set.
27
27
  */
28
28
  project?: string;
29
29
  }
30
30
  /**
31
31
  * Resolves the project list to type-check. `--project` wins over
32
- * config; if neither is set, throws a clear error pointing at both
32
+ * config. If neither is set, throws a clear error pointing at both
33
33
  * paths to a fix (add the config field or pass --project).
34
34
  */
35
35
  export declare function resolveTypecheckProjects(configTypecheck: TypecheckConfig | undefined, override: string | undefined): TypecheckConfig;
@@ -1,11 +1,11 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge typecheck` — whole-project TypeScript type checking driven by
3
+ * `fireforge typecheck`: whole-project TypeScript type checking driven by
4
4
  * user-supplied jsconfig.json paths.
5
5
  *
6
6
  * Distinct from `patchLint.checkJs`: that pass is patch-hygiene (scoped to
7
- * patch-owned `.sys.mjs`, run automatically by `fireforge lint`); this
8
- * command is CI-grade — it runs whole projects with the user's own compiler
7
+ * patch-owned `.sys.mjs`, run automatically by `fireforge lint`). This
8
+ * command is CI-grade: it runs whole projects with the user's own compiler
9
9
  * options. The two share their Firefox-globals shim and the same
10
10
  * suppressed-diagnostic set so a file that lints clean cannot fail typecheck
11
11
  * for a reason the operator could not have inferred from the docs.
@@ -26,7 +26,7 @@ import { info, intro, outro, success, warn } from '../utils/logger.js';
26
26
  import { buildPerRunCheckJs } from './lint-per-run-checkjs.js';
27
27
  /**
28
28
  * Resolves the project list to type-check. `--project` wins over
29
- * config; if neither is set, throws a clear error pointing at both
29
+ * config. If neither is set, throws a clear error pointing at both
30
30
  * paths to a fix (add the config field or pass --project).
31
31
  */
32
32
  export function resolveTypecheckProjects(configTypecheck, override) {
@@ -57,8 +57,8 @@ export function resolveTypecheckProjects(configTypecheck, override) {
57
57
  */
58
58
  function formatIssue(projectRoot, issue) {
59
59
  const file = relativeForDisplay(projectRoot, issue.file);
60
- const codeLabel = issue.code > 0 ? ` TS${String(issue.code)}` : '';
61
- return `[${issue.project}] ${file}:${String(issue.line)}:${String(issue.column)}${codeLabel} ${issue.message}`;
60
+ const codeLabel = issue.code > 0 ? ` TS${issue.code}` : '';
61
+ return `[${issue.project}] ${file}:${issue.line}:${issue.column}${codeLabel} ${issue.message}`;
62
62
  }
63
63
  /**
64
64
  * Top-level entry point invoked by the registered Commander action.
@@ -75,7 +75,7 @@ export async function typecheckCommand(projectRoot, options) {
75
75
  }
76
76
  async function runTypecheckCommandBody(projectRoot, options) {
77
77
  // Validate project is initialised. `loadConfig` throws on missing
78
- // fireforge.json — withErrorHandling at the CLI layer renders the
78
+ // fireforge.json, and withErrorHandling at the CLI layer renders the
79
79
  // resulting `ConfigNotFoundError` cleanly, so we don't need to
80
80
  // re-wrap.
81
81
  getProjectPaths(projectRoot);
@@ -87,7 +87,7 @@ async function runTypecheckCommandBody(projectRoot, options) {
87
87
  // session never touched. Run the same reconciler `furnace deploy`/`sync`
88
88
  // use so typecheck checks against the current workspace.
89
89
  await regenerateStaleGeneratedJsconfig(projectRoot);
90
- info(`Running typecheck across ${String(cfg.projects.length)} project(s): ${cfg.projects.join(', ')}`);
90
+ info(`Running typecheck across ${cfg.projects.length} project(s): ${cfg.projects.join(', ')}`);
91
91
  const results = await runTypecheck(projectRoot, cfg);
92
92
  // Fold the EXPORT-TIME authority into this pass. Per-patch lint runs
93
93
  // checkJs over the queue's patch-owned modules in relative isolation and
@@ -101,8 +101,8 @@ async function runTypecheckCommandBody(projectRoot, options) {
101
101
  reportResults(projectRoot, results, patchIssues);
102
102
  }
103
103
  /**
104
- * Runs the per-patch-lint checkJs pass — the same program `export` and
105
- * `lint --per-patch` use — and returns its findings.
104
+ * Runs the per-patch-lint checkJs pass (the same program `export` and
105
+ * `lint --per-patch` use) and returns its findings.
106
106
  *
107
107
  * Returns an empty list when `patchLint.checkJs` is off or the project has
108
108
  * no patch queue: there is no second authority to reconcile then.
@@ -139,8 +139,8 @@ async function regenerateStaleGeneratedJsconfig(projectRoot) {
139
139
  if (!drift.changed)
140
140
  return;
141
141
  info(`Regenerating stale generated jsconfig ${furnaceConfig.typecheckJsconfig} before typecheck ` +
142
- `(+${String(drift.added.length)} added, ~${String(drift.updated.length)} updated, ` +
143
- `-${String(drift.pruned.length)} pruned).`);
142
+ `(+${drift.added.length} added, ~${drift.updated.length} updated, ` +
143
+ `-${drift.pruned.length} pruned).`);
144
144
  await syncFurnaceJsconfigPaths(projectRoot, furnaceConfig);
145
145
  }
146
146
  /**
@@ -171,10 +171,10 @@ export function reportResults(projectRoot, results, patchLintIssues = []) {
171
171
  for (const issue of errors)
172
172
  warn(formatIssue(projectRoot, issue));
173
173
  }
174
- const summary = `Typecheck: ${String(totalErrors)} error(s), ${String(totalWarnings)} warning(s) across ` +
175
- `${String(results.length)} project(s)` +
174
+ const summary = `Typecheck: ${totalErrors} error(s), ${totalWarnings} warning(s) across ` +
175
+ `${results.length} project(s)` +
176
176
  (patchLintIssues.length > 0
177
- ? ` (including ${String(patchLintIssues.length)} per-patch checkJs finding(s))`
177
+ ? ` (including ${patchLintIssues.length} per-patch checkJs finding(s))`
178
178
  : '');
179
179
  if (totalErrors === 0) {
180
180
  success(summary);
@@ -183,7 +183,7 @@ export function reportResults(projectRoot, results, patchLintIssues = []) {
183
183
  }
184
184
  info(summary);
185
185
  outro('Typecheck failed');
186
- throw new GeneralError(`Typecheck found ${String(totalErrors)} error(s) across ${String(results.length)} project(s).`);
186
+ throw new GeneralError(`Typecheck found ${totalErrors} error(s) across ${results.length} project(s).`);
187
187
  }
188
188
  /**
189
189
  * Registers the `typecheck` command on the CLI program.
@@ -1,10 +1,10 @@
1
1
  /**
2
- * `fireforge verify` — read-only fsck for the patch queue.
2
+ * `fireforge verify`: read-only fsck for the patch queue.
3
3
  *
4
4
  * Combines the manifest consistency check (orphan files, missing entries,
5
5
  * files-affected mismatch, duplicate entries) with the cross-patch lint
6
6
  * rules (duplicate /dev/null creation, forward imports). Does not run
7
- * `planExport` per patch — that is intentionally out of scope because it
7
+ * `planExport` per patch. That is out of scope because it
8
8
  * would couple verify to engine state and make the command too slow to be
9
9
  * useful as a pre-flight gate. Engine-level patch application issues are
10
10
  * still covered by the existing `fireforge doctor` and `fireforge import`
@@ -35,7 +35,7 @@ export interface PatchQueueHealth {
35
35
  export declare function collectPatchQueueHealth(projectRoot: string): Promise<PatchQueueHealth>;
36
36
  /**
37
37
  * Runs the `verify` command: manifest consistency + cross-patch lint.
38
- * Read-only; exits non-zero on any error-severity finding.
38
+ * Read-only. Exits non-zero on any error-severity finding.
39
39
  *
40
40
  * @param projectRoot - Project root directory
41
41
  */
@@ -1,11 +1,11 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge verify` — read-only fsck for the patch queue.
3
+ * `fireforge verify`: read-only fsck for the patch queue.
4
4
  *
5
5
  * Combines the manifest consistency check (orphan files, missing entries,
6
6
  * files-affected mismatch, duplicate entries) with the cross-patch lint
7
7
  * rules (duplicate /dev/null creation, forward imports). Does not run
8
- * `planExport` per patch — that is intentionally out of scope because it
8
+ * `planExport` per patch. That is out of scope because it
9
9
  * would couple verify to engine state and make the command too slow to be
10
10
  * useful as a pre-flight gate. Engine-level patch application issues are
11
11
  * still covered by the existing `fireforge doctor` and `fireforge import`
@@ -34,16 +34,16 @@ import { info, intro, outro, success, warn } from '../utils/logger.js';
34
34
  /**
35
35
  * Walks each patch body in the manifest, extracts the set of
36
36
  * component-shaped registration references it adds (widget paths
37
- * implied by jar.mn + customElements.js; FTL paths implied by locale
37
+ * implied by jar.mn + customElements.js, and FTL paths implied by locale
38
38
  * jar.mn), and confirms every reference is either created by some
39
- * patch in the queue OR present as a tracked file in engine/. Any
40
- * unreachable reference is a dangling-registration error — the patch
39
+ * patch in the queue or present as a tracked file in engine/. Any
40
+ * unreachable reference is a dangling-registration error: the patch
41
41
  * registers a file that nothing in the world supplies, which fails at
42
42
  * install time.
43
43
  */
44
44
  async function detectDanglingRegistrations(patchesDir, engineDir, patches) {
45
45
  // Aggregate the set of all paths any patch in the queue is responsible for
46
- // (per `filesAffected`). Individual patch bodies are deliberately NOT
46
+ // (per `filesAffected`). Individual patch bodies are deliberately not
47
47
  // parsed for new-file creations here: `filesAffected` is already the
48
48
  // contract manifest callers rely on, and
49
49
  // `validatePatchesManifestConsistency` has already ensured the two are in
@@ -65,7 +65,7 @@ async function detectDanglingRegistrations(patchesDir, engineDir, patches) {
65
65
  }
66
66
  catch {
67
67
  // Bad file read is surfaced by the manifest consistency check
68
- // already — skipping here avoids double-reporting the same issue.
68
+ // already. Skipping here avoids double-reporting the same issue.
69
69
  continue;
70
70
  }
71
71
  const refs = collectPatchRegistrationReferences(body);
@@ -77,7 +77,7 @@ async function detectDanglingRegistrations(patchesDir, engineDir, patches) {
77
77
  // Engine existence check: if the target file is already present in
78
78
  // engine/ (upstream Firefox ships it, or a separate baseline branch
79
79
  // has it), the registration is not dangling. "Is this tracked by git"
80
- // cannot be probed without a git round-trip; existence on disk is a
80
+ // cannot be probed without a git round-trip. Existence on disk is a
81
81
  // close-enough proxy for verify's read-only context.
82
82
  if (await pathExists(join(engineDir, ref.targetPath)))
83
83
  continue;
@@ -170,7 +170,7 @@ export async function collectPatchQueueHealth(projectRoot) {
170
170
  }
171
171
  // Engine-aware module-resolution preflight. The queue-level
172
172
  // `unregistered-system-module` rule only sees modules a patch NEWLY
173
- // CREATES; this asks the same question of the engine, so an import ADDED
173
+ // CREATES. This asks the same question of the engine, so an import ADDED
174
174
  // to an existing module is named as text instead of surfacing later as a
175
175
  // bare `xpcshell return code: -11` with zero output.
176
176
  if (await pathExists(paths.engine)) {
@@ -253,7 +253,7 @@ export async function collectPatchQueueHealth(projectRoot) {
253
253
  }
254
254
  /**
255
255
  * Runs the `verify` command: manifest consistency + cross-patch lint.
256
- * Read-only; exits non-zero on any error-severity finding.
256
+ * Read-only. Exits non-zero on any error-severity finding.
257
257
  *
258
258
  * @param projectRoot - Project root directory
259
259
  */
@@ -17,7 +17,7 @@ const WATCHMAN_PROBE_TIMEOUT_MS = 5000;
17
17
  * in PATH but cannot respond (corrupt install, server crashed mid-session,
18
18
  * permission denied on the state directory) would otherwise surface as a
19
19
  * confusing mid-watch failure. Returns the trimmed version string when
20
- * the probe succeeds; throws a {@link GeneralError} with actionable
20
+ * the probe succeeds. Throws a {@link GeneralError} with actionable
21
21
  * remediation when it does not.
22
22
  */
23
23
  async function probeWatchman() {
@@ -64,7 +64,7 @@ function hasWatchPermissionFailure(output) {
64
64
  *
65
65
  * @param exitCode - Exit code returned by `mach watch`
66
66
  * @param watchmanPath - Optional absolute path to the resolved watchman
67
- * binary; surfaced in the guidance so the operator can see whether
67
+ * binary, surfaced in the guidance so the operator can see whether
68
68
  * FireForge actually found one.
69
69
  * @returns User-facing failure guidance
70
70
  */
@@ -106,10 +106,10 @@ export async function watchCommand(projectRoot) {
106
106
  // Check if engine exists
107
107
  await assertEngineExists(paths.engine);
108
108
  // Resolve the watchman binary to an absolute path up-front so we can (a)
109
- // refuse fast when it is missing AND (b) prepend its directory to the mach
109
+ // refuse fast when it is missing and (b) prepend its directory to the mach
110
110
  // subprocess PATH. On macOS, `which watchman` from an interactive shell
111
111
  // returns `/opt/homebrew/bin/watchman`, but the Node subprocess PATH
112
- // frequently omits `/opt/homebrew/bin` — so the shell probe passes and
112
+ // frequently omits `/opt/homebrew/bin`, so the shell probe passes and
113
113
  // mach's `watch-project` call then times out on its own failed PATH
114
114
  // lookup. Threading the directory through the subprocess env fixes it.
115
115
  const watchmanPath = await findExecutable('watchman');
@@ -117,7 +117,7 @@ export async function watchCommand(projectRoot) {
117
117
  throw new GeneralError('Watch mode requires watchman to be installed and available in PATH.\n\n' +
118
118
  'Install watchman first, then rerun "fireforge watch".');
119
119
  }
120
- // Verify watchman actually responds — a binary that is in PATH but
120
+ // Verify watchman actually responds: a binary that is in PATH but
121
121
  // unable to respond (broken install, crashed server, bad state dir
122
122
  // permissions) would otherwise surface as a confusing mid-build failure
123
123
  // instead of an actionable preflight error.
@@ -125,7 +125,7 @@ export async function watchCommand(projectRoot) {
125
125
  // Check for build artifacts before starting watch
126
126
  // The mismatch rung rejects copied or relocated obj-* dirs whose mozinfo
127
127
  // metadata (topsrcdir, topobjdir, mozconfig) still points at a different
128
- // source tree; mach watch against stale metadata produces confusing errors.
128
+ // source tree. mach watch against stale metadata produces confusing errors.
129
129
  const buildCheck = await hasBuildArtifacts(paths.engine);
130
130
  assertBuildArtifacts(paths.engine, buildCheck, {
131
131
  label: 'Watch mode',
@@ -136,7 +136,7 @@ export async function watchCommand(projectRoot) {
136
136
  // Report bundle state alongside the "Using build artifacts..." banner
137
137
  // so an operator watching a mid-build tree can see why `fireforge run`
138
138
  // would refuse right now while watch is still going. Watch remains
139
- // permissive (it exists to drive rebuilds) — this is informational.
139
+ // permissive (it exists to drive rebuilds), so this is informational.
140
140
  // The `hasBuildArtifacts` check already passed at this point, so
141
141
  // `objDir` is always defined.
142
142
  const bundleCheck = buildCheck.objDir
@@ -148,7 +148,7 @@ export async function watchCommand(projectRoot) {
148
148
  info(`Using build artifacts from ${buildCheck.objDir}/${bundleSuffix}`);
149
149
  // Advisory: warn when Furnace components have drifted since the last
150
150
  // apply so the user doesn't launch watch-mode builds with stale
151
- // components baked in. Mirrors the check in `fireforge run` — without
151
+ // components baked in. Mirrors the check in `fireforge run`: without
152
152
  // it, users editing a component then running `watch` would see their
153
153
  // change never surface in the rebuilt browser.
154
154
  await warnIfFurnaceStale(projectRoot);
@@ -173,7 +173,7 @@ export async function watchCommand(projectRoot) {
173
173
  const watchmanDir = dirname(watchmanPath);
174
174
  const existingPath = process.env['PATH'] ?? '';
175
175
  const pathSegments = existingPath.split(delimiter).filter((segment) => segment.length > 0);
176
- // Both arms filter identically; the cast this replaced laundered
176
+ // Both arms filter identically. The cast this replaced laundered
177
177
  // `string | undefined` on one arm while the other built the annotated shape
178
178
  // honestly.
179
179
  const baseEnv = {};
@@ -197,8 +197,8 @@ export async function watchCommand(projectRoot) {
197
197
  }
198
198
  // On Ctrl+C the bin signal handler now waits for the mach child to shut
199
199
  // down (waitForActiveChildShutdown) before exiting, so this continuation
200
- // can run and whitelist the SIGINT exit code — though the bin may still
201
- // win the race and terminate first; both outcomes are acceptable.
200
+ // can run and whitelist the SIGINT exit code, though the bin may still
201
+ // win the race and terminate first. Both outcomes are acceptable.
202
202
  if (result.exitCode !== 0 && result.exitCode !== 130) {
203
203
  const combinedOutput = `${result.stdout}\n${result.stderr}`;
204
204
  if (hasConfigureTimeWatchmanFailure(combinedOutput)) {
@@ -1,7 +1,7 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  import { join, relative } from 'node:path';
3
3
  import { Command } from 'commander';
4
- import { DEFAULT_BROWSER_SUBSCRIPT_DIR, wireSubscript } from '../core/browser-wire.js';
4
+ import { DEFAULT_BROWSER_SUBSCRIPT_DIR, wireSubscript, } from '../core/browser-wire.js';
5
5
  import { getProjectPaths, loadConfig } from '../core/config.js';
6
6
  import { furnaceConfigExists as checkFurnaceConfigExists, loadFurnaceConfig, } from '../core/furnace-config.js';
7
7
  import { consumeParserFallbackEvents } from '../core/parser-fallback.js';
@@ -13,14 +13,15 @@ import { pathExists } from '../utils/fs.js';
13
13
  import { info, intro, outro, success, warn } from '../utils/logger.js';
14
14
  import { pickDefined } from '../utils/options.js';
15
15
  import { isContainedRelativePath, isExplicitAbsolutePath, isPathInsideRoot, stripEnginePrefix, toRootRelativePath, } from '../utils/paths.js';
16
+ import { normalizePathSlashes } from '../utils/paths.js';
16
17
  const BROWSER_BASE_DIR = 'browser/base';
17
18
  function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPath, options) {
18
19
  info('[dry-run] Would wire subscript:');
19
20
  info(` source: ${subscriptDir}/${name}.js`);
20
21
  info(` browser-main.js: loadSubScript("chrome://browser/content/${name}.js")`);
21
22
  if (options.init) {
22
- // Show the coerced form so the preview matches the emitted block —
23
- // echoing the raw input ("X.init") does not reflect that the real run
23
+ // Show the coerced form so the preview matches the emitted block.
24
+ // Echoing the raw input ("X.init") does not reflect that the real run
24
25
  // writes `X.init();` to browser-init.js.
25
26
  info(` browser-init.js: ${coerceToCall(options.init)}`);
26
27
  }
@@ -28,10 +29,10 @@ function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPa
28
29
  info(` browser-init.js onUnload(): ${coerceToCall(options.destroy)}`);
29
30
  }
30
31
  if (domFilePath) {
31
- const includePath = relative(join(engineDir, subscriptDir), join(engineDir, domFilePath)).replace(/\\/g, '/');
32
+ const includePath = normalizePathSlashes(relative(join(engineDir, subscriptDir), join(engineDir, domFilePath)));
32
33
  info(` ${domTargetPath}: #include ${includePath}`);
33
34
  }
34
- const relPath = relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir)).replace(/\\/g, '/');
35
+ const relPath = normalizePathSlashes(relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir)));
35
36
  info(` jar.mn: content/browser/${name}.js (${relPath}/${name}.js)`);
36
37
  outro('Dry run complete');
37
38
  }
@@ -41,11 +42,11 @@ function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPa
41
42
  * Preference order:
42
43
  * 1. `--target <path>` CLI flag (explicit caller intent)
43
44
  * 2. First entry of `furnace.json.tokenHostDocuments` (fork-configured
44
- * chrome doc list; already consumed by the missing-token-link
45
+ * chrome doc list, already consumed by the missing-token-link
45
46
  * validator and the doctor check)
46
47
  * 3. `browser/base/content/browser.xhtml` (upstream default)
47
48
  *
48
- * Step 2 is silent — a missing / invalid furnace.json falls through to the
49
+ * Step 2 is silent: a missing or invalid furnace.json falls through to the
49
50
  * upstream default rather than surfacing a warning, because forks that don't
50
51
  * use furnace shouldn't have to configure anything.
51
52
  */
@@ -62,7 +63,7 @@ async function resolveDomTargetPath(projectRoot, explicit) {
62
63
  }
63
64
  }
64
65
  catch {
65
- // Fall through to default — a broken furnace.json should not block
66
+ // Fall through to the default. A broken furnace.json should not block
66
67
  // the wire command. The doctor surfaces that issue separately.
67
68
  }
68
69
  }
@@ -84,7 +85,7 @@ function validateWireName(name) {
84
85
  }
85
86
  }
86
87
  /**
87
- * Asserts that the resolved chrome document both exists on disk AND exposes
88
+ * Asserts that the resolved chrome document both exists on disk and exposes
88
89
  * an insertion anchor (`#include browser-sets.inc` or `<html:body>`) that
89
90
  * `addDomFragment` can splice into. Fires in dry-run and real-run mode
90
91
  * alike, so the preview and execution agree on whether the target is
@@ -145,7 +146,7 @@ async function ensureSubscriptSourceExists(projectRoot, subscriptDir, name, dryR
145
146
  /**
146
147
  * Validates the `--dom` fragment argument and computes its engine-root-
147
148
  * relative path. Accepts absolute, repo-root-relative (`engine/...`), and
148
- * engine-relative inputs; rejects missing files and paths escaping
149
+ * engine-relative inputs. Rejects missing files and paths escaping
149
150
  * engine/. Returns undefined when `--dom` was not supplied.
150
151
  */
151
152
  async function resolveDomFragmentPath(projectRoot, dom) {
@@ -277,10 +278,10 @@ export async function wireCommand(projectRoot, name, options = {}) {
277
278
  // --after and have it forwarded unchanged to the lookup layer.
278
279
  validateWireName(options.after);
279
280
  }
280
- // Validate init/destroy expressions BEFORE the dry-run/real fork so both
281
+ // Validate init/destroy expressions before the dry-run/real fork so both
281
282
  // paths enforce the same contract. Validating only inside
282
- // `addInitToBrowserInit`/`addDestroyToBrowserInit` — the real-execution
283
- // path — lets `--dry-run --init 'void 0'` succeed and render a plausible
283
+ // `addInitToBrowserInit`/`addDestroyToBrowserInit` (the real-execution
284
+ // path) lets `--dry-run --init 'void 0'` succeed and render a plausible
284
285
  // preview even though the real run rejects the same arguments.
285
286
  if (options.init !== undefined) {
286
287
  validateWireExpression(options.init, 'init expression');
@@ -292,8 +293,8 @@ export async function wireCommand(projectRoot, name, options = {}) {
292
293
  const subscriptDir = await resolveWireSubscriptDir(projectRoot, options);
293
294
  const domFilePath = await resolveDomFragmentPath(projectRoot, options.dom);
294
295
  // Resolve the chrome document the `#include` directive will land in. Only
295
- // consulted when `--dom` is supplied — resolved here anyway so the dry-run
296
- // plan can print the target accurately.
296
+ // consulted when `--dom` is supplied, but resolved here anyway so the
297
+ // dry-run plan can print the target accurately.
297
298
  //
298
299
  // `stripEnginePrefix` is applied so
299
300
  // `--target engine/browser/base/browser.xhtml` and
@@ -316,7 +317,7 @@ export async function wireCommand(projectRoot, name, options = {}) {
316
317
  // setup scripts rely on.
317
318
  //
318
319
  // The check stays advisory rather than fatal in dry-run because
319
- // "wire first, create file after" is a legitimate use of preview — but a
320
+ // "wire first, create file after" is a legitimate use of preview. But a
320
321
  // dry-run over a typo would otherwise produce a plausible plan and the
321
322
  // real command then refuse with `Subscript file not found`. The info line
322
323
  // surfaces the mismatch in preview mode.
@@ -4,7 +4,7 @@ import { walk } from 'estree-walker';
4
4
  /**
5
5
  * An ESTree node augmented with acorn's character-offset positions.
6
6
  * At runtime `acorn.parse` produces objects that carry both the ESTree
7
- * shape *and* `start`/`end` indices, but the type system doesn't know that.
7
+ * shape and `start`/`end` indices, but the type system doesn't know that.
8
8
  * This intersection type bridges the gap so we can safely use both APIs.
9
9
  */
10
10
  export type AcornESTreeNode<T extends estree.Node = estree.Node> = T & {
@@ -12,7 +12,7 @@ export type AcornESTreeNode<T extends estree.Node = estree.Node> = T & {
12
12
  end: number;
13
13
  };
14
14
  /**
15
- * Parse JavaScript source as a **script** (not an ES module).
15
+ * Parse JavaScript source as a script, not an ES module.
16
16
  * All Mozilla chrome JS files (`browser-main.js`, `browser-init.js`,
17
17
  * `customElements.js`, etc.) are scripts that run in a privileged scope.
18
18
  *
@@ -22,7 +22,7 @@ export type AcornESTreeNode<T extends estree.Node = estree.Node> = T & {
22
22
  */
23
23
  export declare function parseScript(content: string, onComment?: acorn.Comment[]): AcornESTreeNode<estree.Program>;
24
24
  /**
25
- * Parse JavaScript source as an **ES module**.
25
+ * Parse JavaScript source as an ES module.
26
26
  * Used for `.sys.mjs` files which use static import/export syntax.
27
27
  *
28
28
  * @param content - Source text to parse
@@ -34,12 +34,12 @@ export declare function parseModule(content: string, onComment?: acorn.Comment[]
34
34
  * Convenience cast from `acorn.Node` (or the generic ESTree union returned
35
35
  * by estree-walker callbacks) to a positioned, narrowly-typed node.
36
36
  *
37
- * **Caller obligation: you must already have discriminated on `node.type`.**
38
- * This performs no runtime check — it exists to attach acorn's `start`/`end`
39
- * offsets to a node the caller has *already* narrowed, typically inside an
37
+ * Caller obligation: you must already have discriminated on `node.type`.
38
+ * This performs no runtime check. It exists to attach acorn's `start`/`end`
39
+ * offsets to a node the caller has already narrowed, typically inside an
40
40
  * `if (node.type === 'CallExpression')` branch or an equivalent walker
41
41
  * guard. Calling it on an undiscriminated node produces a value whose type
42
- * is a lie.
42
+ * is wrong.
43
43
  *
44
44
  * No runtime `type` assertion: every call site sits in the hot loop of a lint
45
45
  * or registration walker and is already post-narrowing, so the check would
@@ -6,15 +6,15 @@ import { walk } from 'estree-walker';
6
6
  * `acorn.parse` produces nodes that carry both the ESTree shape and
7
7
  * `start`/`end` offsets at runtime, but its static `acorn.Program` type is
8
8
  * nominally distinct from `estree.Program`, so the compiler cannot verify
9
- * the conversion structurally — hence the double assertion. This helper is
10
- * the single sanctioned crossing point between the two type worlds.
9
+ * the conversion structurally, hence the double assertion. This helper is the
10
+ * only sanctioned crossing point between the two types.
11
11
  */
12
12
  function toPositionedProgram(program) {
13
13
  // eslint-disable-next-line no-restricted-syntax -- the sanctioned acorn→estree bridge this rule's message points at
14
14
  return program;
15
15
  }
16
16
  /**
17
- * Parse JavaScript source as a **script** (not an ES module).
17
+ * Parse JavaScript source as a script, not an ES module.
18
18
  * All Mozilla chrome JS files (`browser-main.js`, `browser-init.js`,
19
19
  * `customElements.js`, etc.) are scripts that run in a privileged scope.
20
20
  *
@@ -32,7 +32,7 @@ export function parseScript(content, onComment) {
32
32
  return toPositionedProgram(acorn.parse(content, opts));
33
33
  }
34
34
  /**
35
- * Parse JavaScript source as an **ES module**.
35
+ * Parse JavaScript source as an ES module.
36
36
  * Used for `.sys.mjs` files which use static import/export syntax.
37
37
  *
38
38
  * @param content - Source text to parse
@@ -53,12 +53,12 @@ export function parseModule(content, onComment) {
53
53
  * Convenience cast from `acorn.Node` (or the generic ESTree union returned
54
54
  * by estree-walker callbacks) to a positioned, narrowly-typed node.
55
55
  *
56
- * **Caller obligation: you must already have discriminated on `node.type`.**
57
- * This performs no runtime check — it exists to attach acorn's `start`/`end`
58
- * offsets to a node the caller has *already* narrowed, typically inside an
56
+ * Caller obligation: you must already have discriminated on `node.type`.
57
+ * This performs no runtime check. It exists to attach acorn's `start`/`end`
58
+ * offsets to a node the caller has already narrowed, typically inside an
59
59
  * `if (node.type === 'CallExpression')` branch or an equivalent walker
60
60
  * guard. Calling it on an undiscriminated node produces a value whose type
61
- * is a lie.
61
+ * is wrong.
62
62
  *
63
63
  * No runtime `type` assertion: every call site sits in the hot loop of a lint
64
64
  * or registration walker and is already post-narrowing, so the check would