@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
@@ -2,34 +2,57 @@
2
2
 
3
3
  # Configuration
4
4
 
5
- `fireforge.json` at the project root is the project's configuration;
5
+ `fireforge.json` at the project root holds the project's configuration, and
6
6
  `furnace.json` holds component configuration. This file covers the settings
7
- whose behaviour needs more than a schema line, plus the environment variables
7
+ whose behavior needs more than a schema line, plus the environment variables
8
8
  FireForge reads.
9
9
 
10
- ## `firefox` — the source pin
11
-
12
- `firefox.version` (with `firefox.product`, and optionally `firefox.sha256` and
13
- `firefox.candidate`) is the source pin `fireforge download` resolves an archive
14
- from. `fireforge source set` writes it.
15
-
16
- The pin lives in `fireforge.json` beside hand-maintained policy sections, which
17
- is worth knowing when reverting that file: `git checkout -- fireforge.json`
18
- after an accidental reformat also reverts an **uncommitted** pin, and the tree
19
- is then building a different version than the config claims.
20
-
21
- `fireforge doctor` reports the pin beside what the checkout actually is — the
10
+ ## `firefox`, the source pin
11
+
12
+ `firefox.version`, together with `firefox.product` and optionally
13
+ `firefox.sha256` and `firefox.candidate`, is the source pin that
14
+ `fireforge download` resolves an archive from. `fireforge source set` writes
15
+ it.
16
+
17
+ The pin lives in `fireforge.json` next to hand-maintained policy sections,
18
+ which is worth knowing when you revert that file. Running
19
+ `git checkout -- fireforge.json` after an accidental reformat also reverts an
20
+ uncommitted pin, and the tree is then building a different version than the
21
+ config claims.
22
+
23
+ ### Archive integrity: `firefox.sha256` and `firefox.allowUnverifiedDownload`
24
+
25
+ Every fresh download is checked against Mozilla's published `SHA256SUMS` for
26
+ the release. A mismatch fails the download and discards the archive. The
27
+ check also fails closed when the published digest cannot be obtained at all:
28
+ a 404, a captive portal answering with an HTML page, a dropped connection, or
29
+ a timeout. TLS alone is thin trust for the artifact that becomes the git
30
+ baseline every patch is built on, and "the checksum host was unreachable" is
31
+ exactly the condition someone positioned on the network can arrange.
32
+
33
+ - `firefox.sha256` pins the digest. It takes precedence over the published
34
+ file and is the right answer for reproducible builds and offline mirrors:
35
+ obtain it out of band, and the download verifies with no network beyond the
36
+ archive itself.
37
+ - `firefox.allowUnverifiedDownload: true` accepts a download when the
38
+ published digest is unavailable, with a loud warning. This disables the
39
+ integrity check for that case, so the archive is trusted on TLS alone. Use
40
+ it only for a mirror you already trust, and prefer pinning `sha256`
41
+ instead. A digest that is fetched and does not match is rejected either
42
+ way. The setting is ignored when `sha256` is set.
43
+
44
+ `fireforge doctor` reports the pin beside what the checkout actually is (the
22
45
  engine's own `browser/config/version.txt` and the version the last download
23
- recorded — and warns when they disagree. It is a report, not a lock: a tree
24
- may legitimately be mid-migration. `product`, `sha256` and `candidate` have no
25
- recorded counterpart on disk, so the check does not claim to have verified
26
- them.
46
+ recorded) and warns when they disagree. It is a report, not a lock, since a
47
+ tree may legitimately be mid-migration. `product`, `sha256` and `candidate`
48
+ have no recorded counterpart on disk, so the check does not claim to have
49
+ verified them.
27
50
 
28
51
  ## External toolchains
29
52
 
30
53
  Projects with generated asset prerequisites can declare opt-in
31
- `externalToolchains`. `fireforge doctor` reports missing **required** tools as
32
- errors and missing **optional** tools as warnings.
54
+ `externalToolchains`. `fireforge doctor` reports missing required tools as
55
+ errors and missing optional tools as warnings.
33
56
 
34
57
  Seasonal branding on macOS, for example, can declare Apple's Icon Composer
35
58
  tool at
@@ -38,27 +61,28 @@ plus `actool` via `xcrun`, `sips`, and `iconutil`.
38
61
 
39
62
  ## `patchLint`
40
63
 
41
- Per-patch lint type-checks plain Firefox JS against a built-in Firefox-globals
42
- shim that tracks upstream WebIDL additions per release.
64
+ Per-patch lint type-checks plain Firefox JS against a built-in
65
+ Firefox-globals shim that tracks upstream WebIDL additions per release.
43
66
 
44
- - `patchLint.checkJsExtraShim` adds members to the structured shim globals via
45
- TypeScript interface merging, e.g.
67
+ - `patchLint.checkJsExtraShim` adds members to the structured shim globals
68
+ via TypeScript interface merging, for example
46
69
  `interface ChromeUtilsShim { newApi(): any }`.
47
70
  - `patchLint.checkJsTestFiles: true` extends the pass to patch-owned test
48
- `.js` files (`browser_*` / `test_*` / `xpcshell_*` and `/test/` paths). Each
49
- is checked as its own small script-scope program against a loose built-in
50
- harness shim.
71
+ `.js` files (`browser_*`, `test_*`, `xpcshell_*`, and `/test/` paths). Each
72
+ one is checked as its own small script-scope program against a loose
73
+ built-in harness shim.
51
74
  - `patchLint.checkJsTestShim` points at a project `.d.ts` whose typed
52
- declarations (e.g. a real `TestUtils` interface) override the loose
53
- baseline, so calls to nonexistent harness members fail at export time.
54
- - `patchLint.prettier` (`'off'` | `'warning'` | `'error'`, default `'off'`)
75
+ declarations (a real `TestUtils` interface, say) override the loose
76
+ baseline, so calls to harness members that do not exist fail at export
77
+ time.
78
+ - `patchLint.prettier` (`'off'`, `'warning'` or `'error'`, default `'off'`)
55
79
  runs the project's configured Prettier over patch-owned `.sys.mjs`
56
80
  modules. It runs from inside `engine/`, so `engine/.prettierrc*` and
57
- `engine/.prettierignore` decide — the same command run from the repo root
58
- can report a false pass when the root `.prettierignore` excludes
81
+ `engine/.prettierignore` decide the outcome. The same command run from the
82
+ repo root can report a false pass when the root `.prettierignore` excludes
59
83
  `engine/`. Prettier is resolved from `engine/node_modules`, then the
60
- project's, then `npx --no-install`. **Left `'off'`, formatting is out of
61
- scope for the per-patch tier**; no other tier checks `.sys.mjs`
84
+ project's, then `npx --no-install`. Left at `'off'`, formatting is out of
85
+ scope for the per-patch tier, and no other tier checks `.sys.mjs`
62
86
  formatting either.
63
87
  - `patchLint.fileSizeThresholds` tunes the `file-too-large` line counts per
64
88
  file class:
@@ -75,11 +99,11 @@ shim that tracks upstream WebIDL additions per release.
75
99
  ```
76
100
 
77
101
  Every field is optional and merges over the defaults (general
78
- `500/750/900`, test `1200/1400/1600`). The merged triple must satisfy
79
- `notice <= warning <= error`, which is validated at config load. Note that
80
- under the recommended gate posture `--max-warnings 0` the `warning` band is
81
- a hard failure, not a soft limit — which is what these thresholds exist to
82
- let you move.
102
+ `500/750/900`, test `1200/1400/1600`). The merged triple has to satisfy
103
+ `notice <= warning <= error`, which is validated at config load. Under
104
+ the recommended gate posture `--max-warnings 0`, the `warning` band
105
+ is a hard failure rather than a soft limit, which is what these thresholds
106
+ exist to let you move.
83
107
 
84
108
  ## `patchPolicy`
85
109
 
@@ -91,61 +115,131 @@ gaps does not move a patch out of the band its category owns.
91
115
  `test.canaryPath` and `test.canaryTimeoutSeconds` supply the defaults for
92
116
  `fireforge test --canary`. See [`testing.md`](testing.md).
93
117
 
118
+ ## `buildAudit`
119
+
120
+ The post-build packaging audit is warn-only. Most of what it would otherwise
121
+ report as "missing packaged artifact" is classified away from the structure
122
+ of the tree itself: an unselected `--with-branding` tree read from the
123
+ generated `engine/mozconfig`, a directory reached only through a
124
+ platform-gated `DIRS +=` in an ancestor `moz.build`, a Storybook
125
+ `*.stories.mjs`. One case cannot be derived from the tree: a source that is
126
+ deliberately never packaged, such as a type-only mirror whose header says it
127
+ is never loaded. Declare those:
128
+
129
+ ```json
130
+ {
131
+ "buildAudit": {
132
+ "unpackaged": [
133
+ {
134
+ "path": "browser/base/content/hominis-tile-host-types.js",
135
+ "reason": "Type-only mirror of the tile host, never loaded, and no jar.mn entry by design."
136
+ }
137
+ ]
138
+ }
139
+ }
140
+ ```
141
+
142
+ - `path` is engine-relative. A `*` may glob within one path segment. `**` is
143
+ refused, because a subtree carve-out is how a reviewed exception quietly
144
+ becomes a blanket one.
145
+ - `reason` is required and must be non-empty. This is the one audit class
146
+ FireForge cannot verify against the tree, so the declaration is the
147
+ evidence. By the time someone reads it, an unexplained carve-out is
148
+ indistinguishable from a mistake.
149
+ - Admitted paths are listed in the audit output, never silenced. The notice
150
+ reads `admitted as unpackaged by buildAudit.unpackaged "<path>"` followed
151
+ by the declared reason.
152
+ - A declared path that does resolve to a packaged artifact is reported as a
153
+ stale carve-out rather than suppressed, because the declaration asserts a
154
+ fact about the tree that is no longer true.
155
+ - A declaration matching nothing that changed in a given run says nothing.
156
+ Unlike `--expect-unmanaged`, whose unmet entries are reported because it is
157
+ a per-invocation flag list, this is a standing list checked only against
158
+ the files that happened to change, so "not met" is the normal case.
159
+
160
+ The `Packaged:` summary line names each non-zero skip class with its count,
161
+ so a run that dismissed four unselected-branding files reads differently from
162
+ one that dismissed four unregistered sources.
163
+
94
164
  ## Design tokens
95
165
 
96
- Tokens are managed with `fireforge token add`.
166
+ Tokens are managed with `fireforge token add`. `fireforge token list` and
167
+ `fireforge token show` report what is already there.
97
168
 
98
169
  - `--create-category` declares a new category banner and inserts the token in
99
- one step. It is incompatible with `--variant`; author the category with the
100
- base token first, then add each variant.
170
+ one step. It cannot be combined with `--variant`: author the category with
171
+ the base token first, then add each variant.
101
172
  - `--category` is required for a base declaration and optional under
102
173
  `--variant`, where the declaration is routed into a `:root<selector>` block
103
174
  and never into a category section. It is still validated when supplied.
104
175
  - `--variant` takes the same selector grammar the block matcher understands:
105
- one attribute fragment (`[data-private]`, `[data-skin=precision]`), a run of
106
- them (`[data-skin=precision][data-theme=dark]`), and an optional pseudo-class
107
- tail (`[data-skin=precision]:not([data-private])`). Names and values must be
108
- identifier-safe, and `=value` is normalized to `="value"`. A variant naming a
109
- qualifier matches only a block carrying that qualifier; one without a
110
- qualifier still matches a qualified block, and the write says so.
176
+ one attribute fragment (`[data-private]`, `[data-skin=precision]`), a run
177
+ of them (`[data-skin=precision][data-theme=dark]`), and an optional
178
+ pseudo-class tail (`[data-skin=precision]:not([data-private])`). Names and
179
+ values must be identifier-safe, and `=value` is normalized to `="value"`. A
180
+ variant naming a qualifier matches only a block carrying that qualifier.
181
+ One without a qualifier still matches a qualified block, and the write says
182
+ so.
111
183
  - `--mode override` mirrors into both `:root[data-theme="dark"]` and
112
184
  `:root[data-theme="light"]`. A qualified block such as
113
185
  `:root[data-theme="light"]:not([data-private])` is matched and written
114
- through, with a warning naming the selector — the qualifier is
115
- semantically load-bearing, but silently skipping half the mirror is the
116
- worse failure.
186
+ through, with a warning naming the selector. The qualifier carries meaning,
187
+ but silently skipping half the mirror is the worse failure.
117
188
  - A token already present in the target block is reported with its location
118
- (`already exists in :root[…] (line N), unchanged`) rather than a bare
189
+ (`already exists in :root[…] (line N), unchanged`) rather than as a bare
119
190
  no-op.
120
191
 
192
+ ### Reading the token file
193
+
194
+ `token add --category` refuses a category that the tokens CSS does not
195
+ declare, so `token list` exists to name the categories without you
196
+ hand-parsing a `= Category =` banner out of the file.
197
+
198
+ - `fireforge token list [--category <name>] [--json]` reports each category
199
+ banner with the tokens declared under it, in file order. Declarations above
200
+ the first banner are reported under `(no category)` rather than dropped,
201
+ and a banner with no tokens is still listed, since `token add` accepts it.
202
+ An unknown `--category` is refused by naming the ones that exist, because a
203
+ filter that printed nothing would read as "this category is empty".
204
+ - `fireforge token show <token-name> [--json]` reports the owning category
205
+ and the value the token takes in every block that declares it: the base
206
+ `:root`, the dark `@media` mirror, and each `:root[variant]`, with the line
207
+ of each. The leading `--` is optional, and if you include it, pass the `--`
208
+ separator first (`fireforge token show -- --my-token`).
209
+
210
+ Only the base `:root` block owns a token, so `token list` reports it once.
211
+ The dark and variant blocks mirror it and appear in `token show`.
212
+
121
213
  ## Smoke runs
122
214
 
123
215
  For unattended smoke checks, `fireforge run --smoke-exit <s> --headless`
124
216
  launches the browser headless. A headed smoke window on a shared desktop
125
- absorbs live input, which contaminates the console capture — headed non-CI
126
- launches print a warning saying so. Exit codes 12 and 13 separate a console
127
- regression from a launch failure; see [`exit-codes.md`](exit-codes.md).
217
+ absorbs live input, which contaminates the console capture, so headed
218
+ non-CI launches print a warning saying so. Exit codes 12 and 13 separate a
219
+ console regression from a launch failure. See
220
+ [`exit-codes.md`](exit-codes.md).
128
221
 
129
222
  ## Lock waits
130
223
 
131
- Every FireForge command that mutates the engine takes the engine-session lock,
132
- and some take a second subsystem lock as well. Contention fails fast after
133
- about a second by default.
224
+ Every FireForge command that mutates the engine takes the engine-session
225
+ lock, and some take a second subsystem lock as well. Contention fails fast
226
+ after about a second by default.
134
227
 
135
- `--wait-lock [seconds]` (bare flag = 60, valid 1–3600) replaces that with a
136
- bounded wait, and the budget covers **every** lock the command takes — for
137
- `furnace apply`/`deploy`/`sync` that means the furnace lock as well as the
138
- engine-session lock. While waiting, a progress line roughly every 5 seconds
139
- identifies the holder by PID, command and start time.
228
+ `--wait-lock [seconds]` (bare flag means 60, valid range 1 to 3600) replaces
229
+ that with a bounded wait, and the budget covers every lock the command takes.
230
+ For `furnace apply`, `deploy` and `sync` that means the furnace lock as well
231
+ as the engine-session lock. While waiting, a progress line roughly every 5
232
+ seconds identifies the holder by PID, command and start time.
140
233
 
141
234
  Commands that take no lock accept `--wait-lock` and ignore it, so a scripted
142
- sequence can blanket-append the flag without a usage error killing the run.
235
+ sequence can append the flag everywhere without a usage error killing the
236
+ run.
143
237
 
144
238
  `FIREFORGE_WAIT_LOCK=<seconds>` applies the same budget to every command in a
145
239
  session, using the same bounds as the flag. It is the only way to give a
146
240
  budget to the furnace mutators that declare no flag (`create`, `remove`,
147
- `rename`, `refresh`, `scan`, `override`, `chrome-doc`, …). An explicit
148
- `--wait-lock` always wins.
241
+ `rename`, `refresh`, `scan`, `override`, `chrome-doc`, and the rest). An
242
+ explicit `--wait-lock` always wins.
149
243
 
150
244
  `fireforge status --lock` reports the current holder and queue depth.
151
245
 
@@ -153,11 +247,11 @@ budget to the furnace mutators that declare no flag (`create`, `remove`,
153
247
 
154
248
  | Variable | Effect |
155
249
  | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
156
- | `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1–3600). See above. |
250
+ | `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1 to 3600). See above. |
157
251
  | `FIREFORGE_MAX_UNTRACKED_FILES` | Per-directory cap when expanding collapsed untracked directories in `status` (default 5000). A non-positive value warns and is ignored. |
158
252
  | `FIREFORGE_GIT_ADD_TIMEOUT_MS` | Timeout for the monolithic `git add -A` baseline pass (default 10 min). For slow or loaded filesystems. |
159
253
  | `FIREFORGE_GIT_ADD_CHUNK_TIMEOUT_MS` | Timeout for the chunked `git add -- <dir>` fallback (default 30 min). Paired with the above. |
160
254
 
161
- `CLAUDECODE` is read by mozbuild, not by FireForge, and `fireforge test
162
- --full-output` unsets it for test dispatches only — see
255
+ `CLAUDECODE` is read by mozbuild, not by FireForge. `fireforge test
256
+ --full-output` unsets it for test dispatches only. See
163
257
  [`testing.md`](testing.md#output-verbosity).
@@ -2,64 +2,81 @@
2
2
 
3
3
  # Exit codes (internal)
4
4
 
5
- The exit code is the machine-readable half of the CLI's contract: a script
6
- branches on it, and CI decides whether to retry or escalate. The values live
7
- in `src/errors/codes.ts`; this file is the operator-facing statement of what
8
- they mean and which class produces each.
5
+ The exit code is the machine-readable half of the CLI's contract. A script
6
+ branches on it, and CI uses it to decide whether to retry or escalate. The
7
+ values live in `src/errors/codes.ts`. This file says what they mean and
8
+ which error class produces each one.
9
9
 
10
- | Code | Name | Meaning | Produced by |
11
- | ---: | ---------------------- | ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- |
12
- | 0 | `SUCCESS` | Completed. Also a run that prompted and the operator declined — declining is a successful run that chose not to proceed. | — |
13
- | 1 | `GENERAL_ERROR` | Unspecified failure the operator must act on. | `GeneralError`, `ParserFallbackError` |
14
- | 2 | `CONFIG_ERROR` | `fireforge.json` missing or invalid. | `ConfigError` and subclasses |
15
- | 3 | `DOWNLOAD_ERROR` | Could not download or extract Firefox source. | `DownloadError` and subclasses |
16
- | 4 | `GIT_ERROR` | A git operation failed. | `GitError` and subclasses |
17
- | 5 | `BUILD_ERROR` | `mach build` failed, or a test suite went red. | `BuildError` and subclasses, `TestFailureError` |
18
- | 6 | `PATCH_ERROR` | A patch failed to apply, or the patch queue could not be mutated. | `PatchError` |
19
- | 7 | `MISSING_DEPENDENCY` | A required tool (python3, git, tar) was not found. | `PythonNotFoundError`, `GitNotFoundError`, `MachNotFoundError` |
20
- | 8 | `INVALID_ARGUMENT` | The flags were wrong. Usage problem, not an environment one. | `InvalidArgumentError` |
21
- | 9 | `FURNACE_ERROR` | A Furnace component operation failed. | `FurnaceError` |
22
- | 10 | `RESOLUTION_ERROR` | Conflict resolution failed. | `ResolutionError` |
23
- | 11 | `INTERNAL_ERROR` | A FireForge invariant did not hold. **A bug in FireForge**, not something the operator can fix. | `InternalInvariantError` |
24
- | 12 | `SMOKE_EXIT_FAILURE` | `run --smoke-exit` saw unallowed console errors in the smoke window. | `SmokeRunError` |
25
- | 13 | `SMOKE_LAUNCH_FAILURE` | `run --smoke-exit` saw a non-clean browser exit before the window elapsed. | `SmokeRunError` |
26
- | 14 | `INCONCLUSIVE` | A test run's verdict was thrown away: `engine/` moved while the harness ran. **Not red** — re-run it. | `InconclusiveVerdictError` |
27
- | 15 | `LOCK_TIMEOUT` | A lock wait expired, so the run never started. Re-queue it, with a larger `--wait-lock`. | `LockContentionError` |
28
- | 130 | `USER_CANCELLED` | The operator INTERRUPTED a prompt (Esc / Ctrl+C). 128 + SIGINT. | `CancellationError` |
10
+ | Code | Name | Meaning | Produced by |
11
+ | ---: | ---------------------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
12
+ | 0 | `SUCCESS` | Completed. Also a run that prompted and the operator declined: declining is a successful run that chose not to proceed. | (none) |
13
+ | 1 | `GENERAL_ERROR` | Unspecified failure the operator has to act on. | `GeneralError` (and `PreflightRefusalError`), `ParserFallbackError`, `ExecTimeoutError` |
14
+ | 2 | `CONFIG_ERROR` | `fireforge.json` missing or invalid. | `ConfigError` and subclasses |
15
+ | 3 | `DOWNLOAD_ERROR` | Could not download or extract Firefox source. | `DownloadError` and subclasses |
16
+ | 4 | `GIT_ERROR` | A git operation failed. | `GitError` and subclasses, except `GitNotFoundError` |
17
+ | 5 | `BUILD_ERROR` | `mach build` failed, or a test suite went red. | `BuildError` and subclasses, `TestFailureError` |
18
+ | 6 | `PATCH_ERROR` | A patch failed to apply, or the patch queue could not be mutated. | `PatchError`, `PatchManifestCorruptError`, `RebaseError` and subclasses |
19
+ | 7 | `MISSING_DEPENDENCY` | A required tool (python3, git, tar) was not found. | `PythonNotFoundError`, `GitNotFoundError`, `MachNotFoundError` |
20
+ | 8 | `INVALID_ARGUMENT` | The flags were wrong. A usage problem, not an environment one. | `InvalidArgumentError`, plus commander usage errors (unknown command or option, missing argument) |
21
+ | 9 | `FURNACE_ERROR` | A Furnace component operation failed. | `FurnaceError` |
22
+ | 10 | `RESOLUTION_ERROR` | Conflict resolution failed. | `ResolutionError` |
23
+ | 11 | `INTERNAL_ERROR` | A FireForge invariant did not hold. This is a bug in FireForge, not something the operator can fix. | `InternalInvariantError` |
24
+ | 12 | `SMOKE_EXIT_FAILURE` | `run --smoke-exit` saw console errors that were not allowed in the smoke window. | `SmokeRunError` |
25
+ | 13 | `SMOKE_LAUNCH_FAILURE` | `run --smoke-exit` saw the browser exit uncleanly before the window elapsed. | `SmokeRunError` |
26
+ | 14 | `INCONCLUSIVE` | A test run's verdict was thrown away because `engine/` moved while the harness ran. This is not red. Re-run it. | `InconclusiveVerdictError` |
27
+ | 15 | `LOCK_TIMEOUT` | A lock wait expired, so the run never started. Re-queue it with a larger `--wait-lock`. | `LockContentionError` |
28
+ | 130 | `USER_CANCELLED` | The operator interrupted a prompt (Esc or Ctrl+C). 128 + SIGINT. | `CancellationError` |
29
+
30
+ Usage errors that commander detects itself (an unknown command, an unknown
31
+ or malformed option, a missing required argument) never reach a command
32
+ action. Before 0.46.0 commander terminated the process with its own exit 1
33
+ and printed no refusal envelope under `--json`. `createProgram` now installs
34
+ commander's `exitOverride()`, and the entry point maps the resulting
35
+ `CommanderError` to `INVALID_ARGUMENT` (8) with the standard envelope on
36
+ stdout. `--help` and `--version` take the same path and still exit 0, and so
37
+ does a command group invoked without a subcommand (`fireforge`,
38
+ `fireforge tree`): commander prints the group's help and the entry point
39
+ treats that as informational rather than as a wrong flag. That matches the
40
+ exit 0 that `patch`, `token` and `furnace` give through their own help
41
+ action.
29
42
 
30
43
  ## The three distinctions that matter for CI
31
44
 
32
- **Retry vs escalate.** `GENERAL_ERROR` usually means the operator must change
33
- something and a retry may help. `INTERNAL_ERROR` means nothing they could
34
- change would have helped — escalate it, do not retry.
45
+ **Retry or escalate.** `GENERAL_ERROR` usually means the operator has to
46
+ change something, and a retry may then help. `INTERNAL_ERROR` means nothing
47
+ they could change would have helped. Escalate it, do not retry.
48
+
49
+ **Red, never ran, or thrown away.** These are three different facts, and
50
+ before 0.44.0 two of them shared exit 1.
51
+
52
+ - `BUILD_ERROR` (5) is a suite that failed. Since 0.45.0 it is thrown as
53
+ `TestFailureError`, which keeps the code but carries test remedies rather
54
+ than build ones (`--json` reports it as `test-failure`).
55
+ - `LOCK_TIMEOUT` (15) is a run that never started, because another FireForge
56
+ process held the lock for the whole budget. Nothing about the request was
57
+ wrong, so re-queue it.
58
+ - `INCONCLUSIVE` (14) is a suite whose result was discarded because
59
+ `engine/` moved underneath it. The code may be perfectly green, so
60
+ reporting it as red is wrong.
35
61
 
36
- **Red vs never-ran vs thrown-away.** These are three different facts and,
37
- before 0.44.0, two of them shared exit 1. `BUILD_ERROR` (5) is a suite that
38
- FAILED — thrown as `TestFailureError` since 0.45.0, which keeps the code but
39
- carries test remedies rather than build ones (`--json` reports it as
40
- `test-failure`). `LOCK_TIMEOUT` (15) is a run that never started, because another
41
- FireForge process held the lock for the whole budget — nothing about the
42
- request was wrong, so re-queue it. `INCONCLUSIVE` (14) is a suite whose
43
- result was DISCARDED, because `engine/` moved underneath it — the code may
44
- be perfectly green, and reporting it as red is wrong. A summary line reading
45
- `FAIL — exit 1` beside `FAIL — exit 5` invited treating opposites as the same
46
- kind of fact; the codes now separate them mechanically. The
47
- `FIREFORGE-VERDICT:` line's `reason=` key carries the same distinction for
48
- humans.
62
+ A summary line reading `FAIL - exit 1` beside `FAIL - exit 5` invited
63
+ treating opposite facts as the same kind of thing. The codes now separate
64
+ them. The `FIREFORGE-VERDICT:` line's `reason=` key carries the same
65
+ distinction for humans.
49
66
 
50
- Note that `LockContentionError` backs every lock in FireForge — engine
51
- session, patch directory, build, furnace — so all four now exit 15. That is
52
- deliberate: the fact is the same whichever lock was contended.
67
+ `LockContentionError` backs every lock in FireForge (engine session, patch
68
+ directory, build, furnace), so all four exit 15. That is intentional: the
69
+ fact is the same whichever lock was contended.
53
70
 
54
- **Interrupted vs declined.** Before 0.44.0 both a Ctrl+C and a deliberate
55
- "no" at a confirmation returned the same value and exited 0, so a script
56
- could not tell them apart. They are now distinct: an interrupt raises
57
- `CancellationError` and exits **130**; a declined confirmation returns
58
- normally and exits **0**, because the run did what it was asked and the
59
- answer was no.
71
+ **Interrupted or declined.** Before 0.44.0 a Ctrl+C and a deliberate "no" at
72
+ a confirmation both returned the same value and exited 0, so a script could
73
+ not tell them apart. They are now distinct: an interrupt raises
74
+ `CancellationError` and exits 130, and a declined confirmation returns
75
+ normally and exits 0, because the run did what it was asked and the answer
76
+ was no.
60
77
 
61
78
  ## Adding a code
62
79
 
63
80
  New codes go in `src/errors/codes.ts` with a comment saying what a consumer
64
- should DO differently on seeing it — if the answer is "nothing different from
81
+ should do differently on seeing it. If the answer is "nothing different from
65
82
  an existing code", it does not need one. Add a row here in the same change.
package/docs/furnace.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  # Furnace components
4
4
 
5
- Furnace is FireForge's answer to UI components. It tracks stock widgets,
5
+ Furnace is how FireForge handles UI components. It tracks stock widgets,
6
6
  creates new fork-owned widgets, and overrides existing ones. The files still
7
- land inside the Firefox source directory and end up as part of the regular
8
- patches to export.
7
+ land inside the Firefox source directory and end up in the regular patches
8
+ you export.
9
9
 
10
10
  ```bash
11
11
  npx fireforge furnace scan
@@ -20,38 +20,39 @@ npx fireforge furnace preview
20
20
 
21
21
  ## Shared CSS fragments
22
22
 
23
- Cross-widget CSS can be single-sourced. Place the fragment in
24
- `components/shared/` and reference it from a widget stylesheet with a
23
+ CSS used by more than one widget can live in a single file. Put the fragment
24
+ in `components/shared/` and reference it from a widget stylesheet with a
25
25
  comment:
26
26
 
27
27
  ```css
28
28
  /* @fireforge-include base-button.css */
29
29
  ```
30
30
 
31
- `deploy` expands it into the deployed copy only, so editing the fragment
32
- surfaces as component drift until the next deploy.
31
+ `deploy` expands the fragment into the deployed copy only, so editing the
32
+ fragment shows up as component drift until the next deploy.
33
33
 
34
34
  ## Typed cross-module imports
35
35
 
36
36
  For multi-file components, set `furnace.json#typecheckJsconfig` to a
37
37
  consumer-owned jsconfig. `deploy` then maintains `compilerOptions.paths`
38
- entries mapping each deployed
38
+ entries that map each deployed
39
39
  `chrome://global/content/elements/<file>.mjs` URL to its workspace source.
40
40
 
41
- Entries are recognized as Furnace-managed by containment in the components
42
- workspace, so a hand-written entry is preserved and a managed entry whose
43
- helper was deleted is pruned.
41
+ An entry counts as Furnace-managed if it is contained in the components
42
+ workspace. A hand-written entry is therefore preserved, and a managed entry
43
+ whose helper was deleted is pruned.
44
44
 
45
45
  ## Safety
46
46
 
47
- Every furnace mutation runs through `runFurnaceMutation`: a per-root lock, a
48
- rollback journal restored on both a signal and a thrown error, and a
49
- `pendingRepair` marker that blocks further mutations when a rollback was
50
- incomplete — cleared with `fireforge doctor --repair-furnace`. The full
51
- contract, including which commands take which locks, is in
47
+ Every furnace mutation runs through `runFurnaceMutation`, which gives it a
48
+ per-root lock, a rollback journal restored on both a signal and a thrown
49
+ error, and a `pendingRepair` marker that blocks further mutations when a
50
+ rollback was incomplete. Clear the marker with
51
+ `fireforge doctor --repair-furnace`. The full contract, including which
52
+ commands take which locks, is in
52
53
  [`lifecycle-invariants.md`](lifecycle-invariants.md).
53
54
 
54
- `apply`, `deploy` and `sync` accept `--wait-lock [seconds]`, whose budget
55
- covers **both** locks they take. The twelve mutators without the flag pick up
56
- a session budget from `FIREFORGE_WAIT_LOCK`; see
55
+ `apply`, `deploy` and `sync` accept `--wait-lock [seconds]`, and that budget
56
+ covers both locks they take. The twelve mutators without the flag pick up a
57
+ session budget from `FIREFORGE_WAIT_LOCK`. See
57
58
  [`configuration.md`](configuration.md#lock-waits).