@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
@@ -4,25 +4,25 @@
4
4
  * There are exactly two sanctioned ways checksums land in
5
5
  * furnace-state.json:
6
6
  *
7
- * 1. The BATCH path inside `applyAllComponents` (persistState: true), which
8
- * replaces `appliedChecksums` wholesale — correct only when the run
9
- * covered every component.
10
- * 2. The per-component MERGE in this module, which rewrites only the
7
+ * 1. The batch path inside `applyAllComponents` (persistState: true), which
8
+ * replaces `appliedChecksums` wholesale. That is correct only when the
9
+ * run covered every component.
10
+ * 2. The per-component merge in this module, which rewrites only the
11
11
  * `<type>/<name>/…` keys of the component that was applied.
12
12
  *
13
- * Every targeted (named) apply/deploy MUST use path 2 with
13
+ * Every targeted (named) apply/deploy must use path 2 with
14
14
  * `persistState: false`. Routing a named run through the batch path wipes
15
15
  * every other component's checksum state: the batch loops filter to the
16
16
  * named component, so the wholesale replace persists a state file containing
17
17
  * only that component. Downstream, `diffDeletedFiles` and
18
18
  * `findOrphanedEngineFiles` both key on `appliedChecksums`, so the wiped
19
- * components' stale engine files become undetectable by apply AND by
19
+ * components' stale engine files become undetectable by apply and by
20
20
  * `furnace validate`.
21
21
  */
22
22
  import { type ApplyAllComponentsResult } from './furnace-apply.js';
23
- import { type getFurnacePaths } from './furnace-config.js';
23
+ import { type FurnacePaths } from './furnace-config.js';
24
24
  /**
25
- * Counts applied entries that carry at least one BLOCKING step error
25
+ * Counts applied entries that carry at least one blocking step error
26
26
  * (advisory step errors are warnings and never fail a run).
27
27
  */
28
28
  export declare function getStepFailureCount(result: ApplyAllComponentsResult): number;
@@ -33,7 +33,7 @@ export declare function getStepFailureCount(result: ApplyAllComponentsResult): n
33
33
  * Named runs are atomic: if any apply step fails, the rollback journal
34
34
  * restores the engine to its pre-run state and this helper returns `false`
35
35
  * so state is not touched. The conditions must stay in lock-step with the
36
- * rollback trigger in `applyAllComponents` — both read step errors, so a
36
+ * rollback trigger in `applyAllComponents`: both read step errors, so a
37
37
  * future refactor cannot drift them apart and accidentally persist partial
38
38
  * state.
39
39
  */
@@ -43,7 +43,7 @@ export declare function shouldPersistSingleComponentState(result: ApplyAllCompon
43
43
  *
44
44
  * Guards against future refactors that might reorder or misroute the
45
45
  * applied[] array: a named run persists state under a single component
46
- * name, so the first applied entry MUST be that component. Persisting a
46
+ * name, so the first applied entry must be that component. Persisting a
47
47
  * different component's checksums would cause the next status/apply run to
48
48
  * mis-report health for both components involved.
49
49
  *
@@ -55,7 +55,7 @@ export declare function getPersistableAppliedEntry(commandLabel: string, name: s
55
55
  };
56
56
  /**
57
57
  * Persists checksum state for a successfully applied named component by
58
- * MERGING its `<type>/<name>/…` keys into the existing state — never
58
+ * merging its `<type>/<name>/…` keys into the existing state rather than
59
59
  * replacing the whole map.
60
60
  *
61
61
  * @param projectRoot - Root directory of the project
@@ -65,4 +65,4 @@ export declare function getPersistableAppliedEntry(commandLabel: string, name: s
65
65
  export declare function persistSingleComponentState(projectRoot: string, appliedEntry: {
66
66
  name: string;
67
67
  type: 'override' | 'custom';
68
- }, furnacePaths: ReturnType<typeof getFurnacePaths>): Promise<void>;
68
+ }, furnacePaths: FurnacePaths): Promise<void>;
@@ -5,19 +5,19 @@
5
5
  * There are exactly two sanctioned ways checksums land in
6
6
  * furnace-state.json:
7
7
  *
8
- * 1. The BATCH path inside `applyAllComponents` (persistState: true), which
9
- * replaces `appliedChecksums` wholesale — correct only when the run
10
- * covered every component.
11
- * 2. The per-component MERGE in this module, which rewrites only the
8
+ * 1. The batch path inside `applyAllComponents` (persistState: true), which
9
+ * replaces `appliedChecksums` wholesale. That is correct only when the
10
+ * run covered every component.
11
+ * 2. The per-component merge in this module, which rewrites only the
12
12
  * `<type>/<name>/…` keys of the component that was applied.
13
13
  *
14
- * Every targeted (named) apply/deploy MUST use path 2 with
14
+ * Every targeted (named) apply/deploy must use path 2 with
15
15
  * `persistState: false`. Routing a named run through the batch path wipes
16
16
  * every other component's checksum state: the batch loops filter to the
17
17
  * named component, so the wholesale replace persists a state file containing
18
18
  * only that component. Downstream, `diffDeletedFiles` and
19
19
  * `findOrphanedEngineFiles` both key on `appliedChecksums`, so the wiped
20
- * components' stale engine files become undetectable by apply AND by
20
+ * components' stale engine files become undetectable by apply and by
21
21
  * `furnace validate`.
22
22
  */
23
23
  import { join } from 'node:path';
@@ -26,7 +26,7 @@ import { computeComponentChecksums, prefixChecksums, } from './furnace-apply.js'
26
26
  import { updateFurnaceState } from './furnace-config.js';
27
27
  import { countEntriesWithBlockingStepErrors } from './furnace-step-errors.js';
28
28
  /**
29
- * Counts applied entries that carry at least one BLOCKING step error
29
+ * Counts applied entries that carry at least one blocking step error
30
30
  * (advisory step errors are warnings and never fail a run).
31
31
  */
32
32
  export function getStepFailureCount(result) {
@@ -39,7 +39,7 @@ export function getStepFailureCount(result) {
39
39
  * Named runs are atomic: if any apply step fails, the rollback journal
40
40
  * restores the engine to its pre-run state and this helper returns `false`
41
41
  * so state is not touched. The conditions must stay in lock-step with the
42
- * rollback trigger in `applyAllComponents` — both read step errors, so a
42
+ * rollback trigger in `applyAllComponents`: both read step errors, so a
43
43
  * future refactor cannot drift them apart and accidentally persist partial
44
44
  * state.
45
45
  */
@@ -57,7 +57,7 @@ export function shouldPersistSingleComponentState(result, isDryRun) {
57
57
  *
58
58
  * Guards against future refactors that might reorder or misroute the
59
59
  * applied[] array: a named run persists state under a single component
60
- * name, so the first applied entry MUST be that component. Persisting a
60
+ * name, so the first applied entry must be that component. Persisting a
61
61
  * different component's checksums would cause the next status/apply run to
62
62
  * mis-report health for both components involved.
63
63
  *
@@ -87,7 +87,7 @@ export function getPersistableAppliedEntry(commandLabel, name, appliedEntry) {
87
87
  }
88
88
  /**
89
89
  * Persists checksum state for a successfully applied named component by
90
- * MERGING its `<type>/<name>/…` keys into the existing state — never
90
+ * merging its `<type>/<name>/…` keys into the existing state rather than
91
91
  * replacing the whole map.
92
92
  *
93
93
  * @param projectRoot - Root directory of the project
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Shared predicates over {@link StepError} lists.
3
3
  *
4
- * Step errors come in two severities: BLOCKING (the default — the apply is
5
- * considered failed, triggers rollback and a non-zero exit) and ADVISORY
6
- * (`advisory: true` — reported as a warning, never blocks; used by the
7
- * `.ftl` helpers whose contract is graceful degradation). Every gate that
8
- * decides rollback/failure must count only blocking errors; every reporter
9
- * should still surface advisory ones. This module is a leaf (types-only
4
+ * Step errors come in two severities: blocking (the default: the apply is
5
+ * considered failed, triggers rollback and a non-zero exit) and advisory
6
+ * (`advisory: true`, which is reported as a warning, never blocks, and is
7
+ * used by the `.ftl` helpers whose contract is graceful degradation). Every
8
+ * gate that decides rollback/failure must count only blocking errors, and
9
+ * every reporter should still surface advisory ones. This module is a leaf (types-only
10
10
  * imports) so both `furnace-apply.ts` and its callers can share the
11
11
  * predicates without import cycles.
12
12
  */
@@ -2,12 +2,12 @@
2
2
  /**
3
3
  * Shared predicates over {@link StepError} lists.
4
4
  *
5
- * Step errors come in two severities: BLOCKING (the default — the apply is
6
- * considered failed, triggers rollback and a non-zero exit) and ADVISORY
7
- * (`advisory: true` — reported as a warning, never blocks; used by the
8
- * `.ftl` helpers whose contract is graceful degradation). Every gate that
9
- * decides rollback/failure must count only blocking errors; every reporter
10
- * should still surface advisory ones. This module is a leaf (types-only
5
+ * Step errors come in two severities: blocking (the default: the apply is
6
+ * considered failed, triggers rollback and a non-zero exit) and advisory
7
+ * (`advisory: true`, which is reported as a warning, never blocks, and is
8
+ * used by the `.ftl` helpers whose contract is graceful degradation). Every
9
+ * gate that decides rollback/failure must count only blocking errors, and
10
+ * every reporter should still surface advisory ones. This module is a leaf (types-only
11
11
  * imports) so both `furnace-apply.ts` and its callers can share the
12
12
  * predicates without import cycles.
13
13
  */
@@ -81,7 +81,7 @@ function hasPositiveTabindex(content) {
81
81
  * Collects `[start, end)` spans of `<label>…</label>` elements whose content
82
82
  * includes actual label text. Labels cannot nest per HTML, so the non-greedy
83
83
  * inner match is sound. A span qualifies only when the inner content minus
84
- * tags still contains non-whitespace — an empty or tag-only wrapper provides
84
+ * tags still contains non-whitespace. An empty or tag-only wrapper provides
85
85
  * no accessible name. A `${…}` Lit binding counts as label text: dynamic
86
86
  * (usually localized) text is a legitimate accessible name.
87
87
  */
@@ -132,12 +132,12 @@ function hasTemplateKeyboardHandler(content) {
132
132
  }
133
133
  /**
134
134
  * Native HTML elements that dispatch `click` on Enter and Space via the
135
- * platform. Attaching `@click` to these is NOT a keyboard-a11y bug because
136
- * the browser already handles the keyboard activation path — a duplicate
135
+ * platform. Attaching `@click` to these is not a keyboard-a11y bug, because
136
+ * the browser already handles the keyboard activation path. A duplicate
137
137
  * `@keydown`/`@keypress` handler would usually double-fire the action.
138
138
  *
139
- * `<a>` is accepted only when an `href` attribute is present; bare `<a>` is
140
- * non-interactive and is treated as synthetic.
139
+ * `<a>` is accepted only when an `href` attribute is present. A bare `<a>`
140
+ * is non-interactive and is treated as synthetic.
141
141
  */
142
142
  const NATIVE_CLICK_INTERACTIVE_TAGS = new Set([
143
143
  'button',
@@ -178,7 +178,7 @@ function isKeyboardCoveredByComposition(customConfig) {
178
178
  * *synthetic* interactive element (e.g. `<div @click>`), which lacks native
179
179
  * keyboard activation and therefore needs an explicit key handler for
180
180
  * Enter/Space. Returns false when every `@click` handler sits on a native
181
- * interactive element — those already fire `click` on keyboard activation.
181
+ * interactive element. Those already fire `click` on keyboard activation.
182
182
  */
183
183
  function hasTemplateClickOnSyntheticInteractive(content) {
184
184
  const pattern = /@click\s*=\s*\$\{/g;
@@ -219,7 +219,7 @@ function isClickOnSyntheticInteractive(content, clickIndex) {
219
219
  return true;
220
220
  const tagName = tagMatch[1].toLowerCase();
221
221
  if (tagName === 'a') {
222
- // Bare <a> (no href) is non-interactive; require a keyboard handler.
222
+ // Bare <a> (no href) is non-interactive, so require a keyboard handler.
223
223
  // Look forward from the tag open for the closing `>` and scan the
224
224
  // attribute text in between for an href attribute.
225
225
  const tagEnd = content.indexOf('>', tagOpenIndex);
@@ -236,20 +236,20 @@ const SYMBOL_ONLY_ASCII = '+-*=<>|/\\^~@#&!?%';
236
236
  * Reports whether `text` is decoration (arrows, maths, emoji, bare
237
237
  * punctuation) rather than user-facing prose that needs localizing.
238
238
  *
239
- * The letter/number/mark test comes first and is script-agnostic — a rule
239
+ * The letter/number/mark test comes first and is script-agnostic. A rule
240
240
  * keyed on `code > 0xff` would classify every code point above U+00FF as a
241
241
  * symbol, exempting all CJK, Cyrillic, Greek, Arabic, Hebrew, Devanagari and
242
- * Thai text from a **localization** validator.
242
+ * Thai text from a localization validator.
243
243
  *
244
- * Combining marks are deliberately NOT counted as text: the check is an
244
+ * Combining marks are not counted as text: the check is an
245
245
  * `every()`, so a script's base letters already disqualify the string, and
246
246
  * treating marks as text would flag emoji carrying a variation selector
247
- * (U+FE0F is category Mn — `⚙️` is U+2699 + U+FE0F).
247
+ * (U+FE0F is category Mn, and `⚙️` is U+2699 + U+FE0F).
248
248
  *
249
- * High code points that are not letters — emoji, arrows, CJK punctuation —
249
+ * High code points that are not letters (emoji, arrows, CJK punctuation)
250
250
  * stay exempt, which is the rule's intent.
251
251
  *
252
- * A handful of emoji are ALSO Unicode letters, and the letter test alone
252
+ * A handful of emoji are also Unicode letters, and the letter test alone
253
253
  * gets them wrong: U+2139 (`ℹ`, the base of the common `ℹ️`) is category Ll,
254
254
  * so `\p{L}` would classify an info badge as prose needing localization.
255
255
  * Non-ASCII code points carrying `Emoji` are therefore read as symbols
@@ -335,7 +335,7 @@ function hasFlaggedTextInLitTemplates(content) {
335
335
  return false;
336
336
  }
337
337
  function hasFlaggedTextInDomAssignment(content) {
338
- // `<expr>.textContent = "abc"` and `<expr>.innerHTML = "abc"` — these are
338
+ // `<expr>.textContent = "abc"` and `<expr>.innerHTML = "abc"`: these are
339
339
  // user-visible render paths. Template-literal RHS is excluded (usually
340
340
  // dynamic), matching the `${` guard used elsewhere in this helper.
341
341
  const assignPattern = /\.(?:textContent|innerHTML)\s*=\s*(["'])((?:\\.|(?!\1).)*)\1/g;
@@ -170,7 +170,7 @@ function hasCustomElementDefineCall(mjsContent) {
170
170
  /**
171
171
  * Detects whether the module's `customElements.define(...)` call includes a
172
172
  * literal `extends:` option (third argument). That shape is the marker for
173
- * a customized built-in element — the class extends a specific
173
+ * a customized built-in element: the class extends a specific
174
174
  * `HTMLxxxElement` rather than the autonomous `MozLitElement` path.
175
175
  *
176
176
  * Firefox's own widgets use this pattern for toolkit anchors (e.g.
@@ -193,24 +193,24 @@ function hasCustomElementExtendsOption(mjsContent) {
193
193
  *
194
194
  * Two shapes are accepted:
195
195
  *
196
- * 1. Autonomous custom element: `class X extends MozLitElement` — the
196
+ * 1. Autonomous custom element: `class X extends MozLitElement`, the
197
197
  * default FireForge pattern for fork-authored components and most
198
198
  * toolkit widgets.
199
199
  * 2. Customized built-in: `class X extends HTML<Something>Element` paired
200
200
  * with a `customElements.define(..., ..., { extends: "<tagname>" })`
201
201
  * call. Firefox's `moz-support-link`, `moz-button-group` tabbing
202
- * widgets, and a handful of other toolkit components use this form;
202
+ * widgets, and a handful of other toolkit components use this form.
203
203
  * `furnace override` of those components writes the original source
204
204
  * verbatim and the validator must not reject them.
205
205
  *
206
- * A class that extends a plain `HTMLElement` WITHOUT a `extends:` option
207
- * is still rejected — that's the legitimate `not-moz-lit-element` case
206
+ * A class that extends a plain `HTMLElement` without an `extends:` option
207
+ * is still rejected. That is the legitimate `not-moz-lit-element` case
208
208
  * the rule was originally designed to catch.
209
209
  */
210
210
  function classExtendsMozLitElement(mjsContent) {
211
211
  const hasClassDeclaration = /class\s+\w+\s+extends\s+/.test(mjsContent);
212
212
  if (!hasClassDeclaration) {
213
- // No class declaration — skip this check since the component may use a
213
+ // No class declaration, so skip this check since the component may use a
214
214
  // different pattern (e.g. function-based). Other validators will catch
215
215
  // structural issues.
216
216
  return true;
@@ -218,8 +218,8 @@ function classExtendsMozLitElement(mjsContent) {
218
218
  if (/class\s+\w+\s+extends\s+MozLitElement\b/.test(mjsContent)) {
219
219
  return true;
220
220
  }
221
- // Customized built-in: extend a specific HTMLxxxElement AND the define
222
- // call carries an `extends:` option. Both halves are required — a class
221
+ // Customized built-in: extend a specific HTMLxxxElement and the define
222
+ // call carries an `extends:` option. Both halves are required: a class
223
223
  // that extends `HTMLAnchorElement` without the matching define option is
224
224
  // almost certainly an author mistake, and a define call with `extends:`
225
225
  // without a matching class is unreachable.
@@ -243,7 +243,7 @@ function collectCssVariableReferences(cssContent) {
243
243
  return referencedVariables;
244
244
  }
245
245
  /**
246
- * Collects CSS custom property *declarations* — names appearing on the
246
+ * Collects CSS custom property *declarations*, i.e. names appearing on the
247
247
  * left-hand side of a `--name:` declaration. Used to auto-exempt
248
248
  * component-local runtime variables from the token-prefix check: if the
249
249
  * component both declares and consumes a variable in its own CSS file, it
@@ -44,10 +44,10 @@ export declare function withRegistrationValidationCache<T>(body: () => Promise<T
44
44
  *
45
45
  * Scan set is the union of (a) the configured `tokenHostDocuments` (or
46
46
  * the upstream default when unset) and (b) any `browser/base/content/*.xhtml`
47
- * document that references `tagName` — the auto-detection path catches
47
+ * document that references `tagName`. The auto-detection path catches
48
48
  * forks that mount components from a replacement chrome document without
49
49
  * having configured `tokenHostDocuments`. The warning fires only when
50
- * NONE of the documents in the final scan set link the tokens CSS.
50
+ * none of the documents in the final scan set link the tokens CSS.
51
51
  */
52
52
  export declare function validateTokenLink(componentDir: string, tagName: string, root: string, tokenPrefix?: string, tokenHostDocuments?: string[]): Promise<ValidationIssue[]>;
53
53
  /**
@@ -1,9 +1,9 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { createHash } from 'node:crypto';
3
2
  import { readdir } from 'node:fs/promises';
4
3
  import { join } from 'node:path';
5
4
  import { toError } from '../utils/errors.js';
6
5
  import { pathExists, readText } from '../utils/fs.js';
6
+ import { sha256Hex } from '../utils/hash.js';
7
7
  import { warn } from '../utils/logger.js';
8
8
  import { escapeRegex, stripJsComments } from '../utils/regex.js';
9
9
  import { getProjectPaths, loadConfig } from './config.js';
@@ -94,7 +94,7 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
94
94
  // Check target directory
95
95
  const targetDir = join(engineDir, config.targetPath);
96
96
  status.targetExists = await pathExists(targetDir);
97
- // Compare files (sourceExists is guaranteed true — we early-returned above)
97
+ // Compare files (sourceExists is guaranteed true, we early-returned above)
98
98
  if (status.targetExists) {
99
99
  const entries = await readdir(componentDir, { withFileTypes: true });
100
100
  for (const entry of entries) {
@@ -110,7 +110,7 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
110
110
  continue;
111
111
  }
112
112
  // Deploy writes CSS-with-include-directives in fragment-expanded form,
113
- // so the drift oracle must compare the *expanded* source — otherwise a
113
+ // so the drift oracle must compare the *expanded* source. Otherwise a
114
114
  // freshly deployed component would read as permanently drifted, and a
115
115
  // fragment edit would never read as drifted at all.
116
116
  let srcContent = await readText(srcPath);
@@ -119,8 +119,8 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
119
119
  srcContent = (await expandCssFragments(srcContent, furnacePaths.sharedDir)).expanded;
120
120
  }
121
121
  catch {
122
- // Missing fragment: validate reports it as `missing-fragment`;
123
- // for drift purposes fall back to the raw source so the compare
122
+ // Missing fragment: validate reports it as `missing-fragment`.
123
+ // For drift purposes fall back to the raw source so the compare
124
124
  // still happens deterministically.
125
125
  }
126
126
  }
@@ -129,8 +129,8 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
129
129
  // comparisons hashed raw bytes, so on a CRLF checkout `furnace status`
130
130
  // and `furnace validate` reported drift for files apply had just
131
131
  // decided were identical.
132
- const srcHash = createHash('sha256').update(normalizeForChecksum(srcContent)).digest('hex');
133
- const destHash = createHash('sha256').update(normalizeForChecksum(destContent)).digest('hex');
132
+ const srcHash = sha256Hex(normalizeForChecksum(srcContent));
133
+ const destHash = sha256Hex(normalizeForChecksum(destContent));
134
134
  if (srcHash !== destHash) {
135
135
  status.driftedFiles.push(entry.name);
136
136
  status.filesInSync = false;
@@ -155,10 +155,8 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
155
155
  else {
156
156
  const srcContent = await readText(ftlSrc);
157
157
  const destContent = await readText(ftlDest);
158
- const srcHash = createHash('sha256').update(normalizeForChecksum(srcContent)).digest('hex');
159
- const destHash = createHash('sha256')
160
- .update(normalizeForChecksum(destContent))
161
- .digest('hex');
158
+ const srcHash = sha256Hex(normalizeForChecksum(srcContent));
159
+ const destHash = sha256Hex(normalizeForChecksum(destContent));
162
160
  if (srcHash !== destHash) {
163
161
  status.driftedFiles.push(ftlName);
164
162
  status.filesInSync = false;
@@ -177,7 +175,7 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
177
175
  const cePath = join(engineDir, CUSTOM_ELEMENTS_JS);
178
176
  if (await pathExists(cePath)) {
179
177
  const ceContent = await readText(cePath);
180
- // Structure-aware check shared with the ADD path — a bare substring
178
+ // Structure-aware check shared with the add path. A bare substring
181
179
  // test counted any mention of the tag (a leftover comment, an
182
180
  // unrelated string) as "registered", masking genuinely missing
183
181
  // registrations from both validate and the re-apply drift oracle.
@@ -269,7 +267,7 @@ const AUTO_DETECT_HOST_DIR = 'browser/base/content';
269
267
  * This catches a fork that mounts a custom element from its own top-level
270
268
  * chrome document (e.g. `mybrowser.xhtml`) without setting
271
269
  * `tokenHostDocuments`: scanning only the stock `browser.xhtml` would miss
272
- * the tokens CSS link in the ACTUAL host document and false-fire the
270
+ * the tokens CSS link in the actual host document and false-fire the
273
271
  * warning.
274
272
  *
275
273
  * @param engineDir Absolute engine root.
@@ -282,7 +280,7 @@ const AUTO_DETECT_HOST_DIR = 'browser/base/content';
282
280
  * `validateAllComponents` walks every component, and re-parsing
283
281
  * `fireforge.json` plus re-scanning every `.xhtml` under the chrome-document
284
282
  * directory per component is one config parse and one full directory read
285
- * PER COMPONENT, for work that depends only on the project and the engine.
283
+ * per component, for work that depends only on the project and the engine.
286
284
  *
287
285
  * Keyed by root/engine dir and cleared by
288
286
  * {@link resetRegistrationValidationCaches} at the start of each run, so a
@@ -293,9 +291,9 @@ const chromeDocumentCache = new Map();
293
291
  /**
294
292
  * Whether a batch validation is in flight.
295
293
  *
296
- * The caches are consulted ONLY while this is set. Outside a batch — a direct
294
+ * The caches are consulted only while this is set. Outside a batch (a direct
297
295
  * `validateComponent` call from `furnace status`, from apply's consistency
298
- * check, or from a test — every read goes to disk, so a caller that mutates
296
+ * check, or from a test) every read goes to disk, so a caller that mutates
299
297
  * the engine between calls can never be served a stale document.
300
298
  */
301
299
  let batchInFlight = false;
@@ -358,7 +356,7 @@ async function loadChromeDocuments(engineDir) {
358
356
  return documents;
359
357
  }
360
358
  async function autoDetectTokenHostDocuments(engineDir, tagName, already) {
361
- // Reads the directory ONCE per run rather than once per component: only the
359
+ // Reads the directory once per run rather than once per component: only the
362
360
  // tag being searched for differs between components.
363
361
  const documents = await loadChromeDocuments(engineDir);
364
362
  const alreadySet = new Set(already);
@@ -379,10 +377,10 @@ async function autoDetectTokenHostDocuments(engineDir, tagName, already) {
379
377
  *
380
378
  * Scan set is the union of (a) the configured `tokenHostDocuments` (or
381
379
  * the upstream default when unset) and (b) any `browser/base/content/*.xhtml`
382
- * document that references `tagName` — the auto-detection path catches
380
+ * document that references `tagName`. The auto-detection path catches
383
381
  * forks that mount components from a replacement chrome document without
384
382
  * having configured `tokenHostDocuments`. The warning fires only when
385
- * NONE of the documents in the final scan set link the tokens CSS.
383
+ * none of the documents in the final scan set link the tokens CSS.
386
384
  */
387
385
  export async function validateTokenLink(componentDir, tagName, root, tokenPrefix, tokenHostDocuments) {
388
386
  const issues = [];
@@ -483,7 +481,7 @@ export async function runPostApplyConsistencyChecks(root, config, result, ftlDir
483
481
  }
484
482
  }
485
483
  catch {
486
- // Consistency check is best-effort; failures here should not block apply
484
+ // Consistency check is best-effort. Failures here should not block apply
487
485
  }
488
486
  }
489
487
  }
@@ -2,7 +2,7 @@ import type { ComponentType, CustomComponentConfig, ValidationIssue } from '../t
2
2
  /**
3
3
  * Returns true when file content carries unresolved three-way-merge
4
4
  * conflict markers (as left behind by `furnace refresh`). Shared between
5
- * the structure validator and `furnace sync`'s pre-apply gate — both must
5
+ * the structure validator and `furnace sync`'s pre-apply gate. Both must
6
6
  * agree on what "conflicted" means so a file that validate flags can never
7
7
  * slip through sync into the engine.
8
8
  */
@@ -5,7 +5,7 @@ import { pathExists, readText } from '../utils/fs.js';
5
5
  /**
6
6
  * Returns true when file content carries unresolved three-way-merge
7
7
  * conflict markers (as left behind by `furnace refresh`). Shared between
8
- * the structure validator and `furnace sync`'s pre-apply gate — both must
8
+ * the structure validator and `furnace sync`'s pre-apply gate. Both must
9
9
  * agree on what "conflicted" means so a file that validate flags can never
10
10
  * slip through sync into the engine.
11
11
  */
@@ -37,7 +37,7 @@ export async function validateStructure(componentDir, tagName, type, customConfi
37
37
  message: `Required file ${tagName}.mjs not found.`,
38
38
  });
39
39
  }
40
- // .css should exist — except for library components (base class + helpers,
40
+ // .css should exist, except for library components (base class + helpers,
41
41
  // no element of their own), which render nothing and need no stylesheet.
42
42
  if (!(await pathExists(cssPath)) && customConfig?.kind !== 'library') {
43
43
  issues.push({
@@ -52,8 +52,8 @@ export async function validateStructure(componentDir, tagName, type, customConfi
52
52
  // localization payload is empty, which is hard to spot in review.
53
53
  //
54
54
  // Components that declare `sharedFtl` participate in a pre-existing
55
- // feature-scoped bundle, so there is no per-component .ftl to require —
56
- // the shared file is owned by whoever authored the feature bundle.
55
+ // feature-scoped bundle, so there is no per-component .ftl to require.
56
+ // The shared file is owned by whoever authored the feature bundle.
57
57
  if (type === 'custom' && customConfig?.localized && !customConfig.sharedFtl) {
58
58
  const ftlPath = join(componentDir, `${tagName}.ftl`);
59
59
  if (!(await pathExists(ftlPath))) {
@@ -61,8 +61,8 @@ export async function validateComponent(componentDir, tagName, type, config, roo
61
61
  if (root) {
62
62
  issues.push(...(await validateTokenLink(componentDir, tagName, root, config?.tokenPrefix, config?.tokenHostDocuments)));
63
63
  }
64
- // CSS fragment checks: missing fragment files are structural errors;
65
- // stale deployed expansions are drift the next deploy refreshes.
64
+ // CSS fragment checks: missing fragment files are structural errors.
65
+ // Stale deployed expansions are drift the next deploy refreshes.
66
66
  if (type === 'custom') {
67
67
  const furnacePaths = getFurnacePaths(root ?? join(componentDir, '..', '..', '..'));
68
68
  const engineTargetDir = root && config?.custom[tagName]
@@ -81,7 +81,7 @@ export async function validateComponent(componentDir, tagName, type, config, roo
81
81
  // When root is provided and this is a custom component with registration,
82
82
  // also run registration pattern and jar.mn validation for this component.
83
83
  // Skipped when an outer orchestrator (validateAllComponents) will run the
84
- // aggregate versions itself; otherwise the same issues are reported twice.
84
+ // aggregate versions itself. Otherwise the same issues are reported twice.
85
85
  if (root && config && type === 'custom' && !options?.skipAggregateChecks) {
86
86
  const customConfig = config.custom[tagName];
87
87
  if (customConfig?.register) {
@@ -183,7 +183,7 @@ export async function validateAllComponents(root) {
183
183
  continue;
184
184
  }
185
185
  // Pass root so that per-component token link validation runs.
186
- // Skip registration/jar.mn checks inside validateComponent — the aggregate
186
+ // Skip registration/jar.mn checks inside validateComponent. The aggregate
187
187
  // validators below run them exactly once across all components, which both
188
188
  // surfaces cross-component issues and avoids double-counting.
189
189
  const issues = await validateComponent(componentDir, name, 'custom', config, root, {
@@ -209,7 +209,7 @@ export async function validateAllComponents(root) {
209
209
  // `furnace create --with-tests --xpcshell` scaffolds a test directory at
210
210
  // `browser/base/content/test/<binary>-xpcshell/<name>/`. A leftover
211
211
  // scaffold whose `<name>` is not in furnace.json is almost always the
212
- // aftermath of an incomplete `furnace remove` or `rename`; flag it as an
212
+ // aftermath of an incomplete `furnace remove` or `rename`. Flag it as an
213
213
  // `orphan-xpcshell-scaffold` error so operators delete or re-create the
214
214
  // scaffold instead of discovering the mismatch at test run time. A
215
215
  // missing engine or scaffold parent directory degrades silently, so this
@@ -224,14 +224,14 @@ export async function validateAllComponents(root) {
224
224
  }
225
225
  }
226
226
  catch {
227
- // Validation degrades gracefully — the absence of an engine
227
+ // Validation degrades gracefully: the absence of an engine
228
228
  // directory, permission denial reading the scaffold tree, or any
229
229
  // other transient fs issue should never cascade into false
230
230
  // "orphan" reports.
231
231
  }
232
232
  // jsconfig chrome-module paths drift: when `typecheckJsconfig` is
233
- // configured, deploy maintains a paths mapping per deployed module file;
234
- // missing or stale entries mean typed cross-module imports are silently
233
+ // configured, deploy maintains a paths mapping per deployed module file.
234
+ // Missing or stale entries mean typed cross-module imports are silently
235
235
  // degrading to `any` in the consumer's typecheck.
236
236
  if (config.typecheckJsconfig) {
237
237
  try {
@@ -256,7 +256,7 @@ export async function validateAllComponents(root) {
256
256
  }
257
257
  catch {
258
258
  // Drift detection must not break validation when the jsconfig is
259
- // missing or unparsable — deploy reports those cases with guidance.
259
+ // missing or unparsable. Deploy reports those cases with guidance.
260
260
  }
261
261
  }
262
262
  return results;
@@ -5,19 +5,19 @@
5
5
  * Overrides are forks of Firefox source files taken at a specific point in
6
6
  * time. If Firefox moves forward and the override's `baseVersion` is not
7
7
  * refreshed, the override may apply against a file whose upstream shape has
8
- * changed — the single biggest silent failure mode for furnace.
8
+ * changed, which is the single biggest silent failure mode for furnace.
9
9
  *
10
10
  * Deliberately pure and string-only: no I/O, and no parsing of Firefox
11
11
  * version components. String equality is sufficient because `fireforge.json`
12
12
  * stores a canonical version string (e.g. `"140.9.0esr"`) and overrides are
13
13
  * created with exactly that string copied from
14
- * `forgeConfig.firefox.version`. Any mismatch is worth surfacing — even
14
+ * `forgeConfig.firefox.version`. Any mismatch is worth surfacing: even
15
15
  * "140.0" vs "140.9.0esr" is a real drift signal.
16
16
  *
17
- * The result GATES apply/deploy: both warn and then FAIL without --force
17
+ * The result gates apply/deploy: both warn and then fail without --force
18
18
  * (see furnaceApplyCommand / furnaceDeployCommand), and `furnace sync`
19
19
  * re-checks it after refresh before applying. Status reports drift alongside
20
- * the component overview. Keep this doc in sync with the gates — it is not
20
+ * the component overview. Keep this doc in sync with the gates. It is not
21
21
  * advisory.
22
22
  */
23
23
  import type { FurnaceConfig } from '../types/furnace.js';
@@ -35,7 +35,7 @@ export interface OverrideVersionDrift {
35
35
  /**
36
36
  * Classifies how severe a version drift is by comparing the numeric
37
37
  * components of the two version strings. Falls back to `'major'` when
38
- * either version is unparseable — this ensures that unusual version
38
+ * either version is unparseable. This ensures that unusual version
39
39
  * formats surface with the highest visibility rather than being silently
40
40
  * downgraded.
41
41
  */
@@ -6,19 +6,19 @@
6
6
  * Overrides are forks of Firefox source files taken at a specific point in
7
7
  * time. If Firefox moves forward and the override's `baseVersion` is not
8
8
  * refreshed, the override may apply against a file whose upstream shape has
9
- * changed — the single biggest silent failure mode for furnace.
9
+ * changed, which is the single biggest silent failure mode for furnace.
10
10
  *
11
11
  * Deliberately pure and string-only: no I/O, and no parsing of Firefox
12
12
  * version components. String equality is sufficient because `fireforge.json`
13
13
  * stores a canonical version string (e.g. `"140.9.0esr"`) and overrides are
14
14
  * created with exactly that string copied from
15
- * `forgeConfig.firefox.version`. Any mismatch is worth surfacing — even
15
+ * `forgeConfig.firefox.version`. Any mismatch is worth surfacing: even
16
16
  * "140.0" vs "140.9.0esr" is a real drift signal.
17
17
  *
18
- * The result GATES apply/deploy: both warn and then FAIL without --force
18
+ * The result gates apply/deploy: both warn and then fail without --force
19
19
  * (see furnaceApplyCommand / furnaceDeployCommand), and `furnace sync`
20
20
  * re-checks it after refresh before applying. Status reports drift alongside
21
- * the component overview. Keep this doc in sync with the gates — it is not
21
+ * the component overview. Keep this doc in sync with the gates. It is not
22
22
  * advisory.
23
23
  */
24
24
  /**
@@ -39,7 +39,7 @@ function parseVersionComponents(version) {
39
39
  /**
40
40
  * Classifies how severe a version drift is by comparing the numeric
41
41
  * components of the two version strings. Falls back to `'major'` when
42
- * either version is unparseable — this ensures that unusual version
42
+ * either version is unparseable. This ensures that unusual version
43
43
  * formats surface with the highest visibility rather than being silently
44
44
  * downgraded.
45
45
  */