@hominis/fireforge 0.43.1 → 0.44.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 (478) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +3 -3
  3. package/dist/bin/fireforge.d.ts +4 -9
  4. package/dist/bin/fireforge.js +42 -40
  5. package/dist/build-info.json +4 -4
  6. package/dist/src/cli.js +74 -8
  7. package/dist/src/commands/bootstrap.js +17 -20
  8. package/dist/src/commands/build.js +25 -32
  9. package/dist/src/commands/config.js +34 -41
  10. package/dist/src/commands/discard.js +8 -9
  11. package/dist/src/commands/doctor-check-core.d.ts +13 -18
  12. package/dist/src/commands/doctor-check-core.js +8 -35
  13. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  14. package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
  15. package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
  16. package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
  17. package/dist/src/commands/doctor-furnace-jar.js +7 -9
  18. package/dist/src/commands/doctor-furnace.js +21 -24
  19. package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
  20. package/dist/src/commands/doctor-orphaned-harness.js +18 -44
  21. package/dist/src/commands/doctor-patch-manifest.d.ts +8 -0
  22. package/dist/src/commands/doctor-patch-manifest.js +155 -0
  23. package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
  24. package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
  25. package/dist/src/commands/doctor-working-tree.d.ts +10 -12
  26. package/dist/src/commands/doctor-working-tree.js +11 -18
  27. package/dist/src/commands/doctor.d.ts +1 -1
  28. package/dist/src/commands/doctor.js +64 -96
  29. package/dist/src/commands/download.js +32 -48
  30. package/dist/src/commands/export-all.js +29 -33
  31. package/dist/src/commands/export-flow.js +6 -6
  32. package/dist/src/commands/export-placement-conflicts.js +10 -9
  33. package/dist/src/commands/export-placement-gate.js +5 -5
  34. package/dist/src/commands/export-shared.d.ts +30 -33
  35. package/dist/src/commands/export-shared.js +45 -43
  36. package/dist/src/commands/export.js +21 -27
  37. package/dist/src/commands/furnace/apply.js +14 -23
  38. package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
  39. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
  40. package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
  41. package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
  42. package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
  43. package/dist/src/commands/furnace/chrome-doc.js +31 -41
  44. package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
  45. package/dist/src/commands/furnace/create-browser-test.js +8 -8
  46. package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
  47. package/dist/src/commands/furnace/create-mochikit.js +8 -9
  48. package/dist/src/commands/furnace/create-readback.d.ts +12 -13
  49. package/dist/src/commands/furnace/create-readback.js +12 -13
  50. package/dist/src/commands/furnace/create-templates.d.ts +22 -28
  51. package/dist/src/commands/furnace/create-templates.js +35 -30
  52. package/dist/src/commands/furnace/create-xpcshell.js +2 -2
  53. package/dist/src/commands/furnace/create.js +33 -23
  54. package/dist/src/commands/furnace/deploy.js +16 -24
  55. package/dist/src/commands/furnace/diff.js +15 -10
  56. package/dist/src/commands/furnace/init.js +33 -36
  57. package/dist/src/commands/furnace/override.js +23 -25
  58. package/dist/src/commands/furnace/preview.js +47 -67
  59. package/dist/src/commands/furnace/refresh.js +12 -16
  60. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
  61. package/dist/src/commands/furnace/remove-mutations.js +14 -17
  62. package/dist/src/commands/furnace/remove-state.js +1 -1
  63. package/dist/src/commands/furnace/remove.js +33 -38
  64. package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
  65. package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
  66. package/dist/src/commands/furnace/rename.js +59 -69
  67. package/dist/src/commands/furnace/scan.js +19 -33
  68. package/dist/src/commands/furnace/status.js +12 -9
  69. package/dist/src/commands/furnace/sync.js +9 -16
  70. package/dist/src/commands/furnace/validate.js +20 -20
  71. package/dist/src/commands/import.js +48 -37
  72. package/dist/src/commands/lint-per-patch.js +15 -10
  73. package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
  74. package/dist/src/commands/lint-per-run-checkjs.js +13 -13
  75. package/dist/src/commands/lint-report.js +6 -7
  76. package/dist/src/commands/lint.d.ts +15 -16
  77. package/dist/src/commands/lint.js +86 -102
  78. package/dist/src/commands/package.js +6 -11
  79. package/dist/src/commands/patch/compact.js +1 -1
  80. package/dist/src/commands/patch/delete.js +24 -33
  81. package/dist/src/commands/patch/index.d.ts +5 -6
  82. package/dist/src/commands/patch/index.js +10 -12
  83. package/dist/src/commands/patch/lint-ignore.js +14 -13
  84. package/dist/src/commands/patch/move-files-create.d.ts +6 -6
  85. package/dist/src/commands/patch/move-files-create.js +8 -8
  86. package/dist/src/commands/patch/move-files-into.d.ts +6 -6
  87. package/dist/src/commands/patch/move-files-into.js +8 -8
  88. package/dist/src/commands/patch/patch-context.d.ts +2 -3
  89. package/dist/src/commands/patch/patch-context.js +2 -3
  90. package/dist/src/commands/patch/rename.d.ts +10 -11
  91. package/dist/src/commands/patch/rename.js +11 -12
  92. package/dist/src/commands/patch/reorder.js +8 -9
  93. package/dist/src/commands/patch/split-plan.js +1 -1
  94. package/dist/src/commands/patch/split.d.ts +8 -10
  95. package/dist/src/commands/patch/split.js +9 -11
  96. package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
  97. package/dist/src/commands/patch/staged-dependency.js +7 -3
  98. package/dist/src/commands/patch/tier.d.ts +9 -9
  99. package/dist/src/commands/patch/tier.js +18 -15
  100. package/dist/src/commands/re-export-adjacent.js +9 -8
  101. package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
  102. package/dist/src/commands/re-export-bulk-scan.js +22 -21
  103. package/dist/src/commands/re-export-drift.js +10 -10
  104. package/dist/src/commands/re-export-files.d.ts +6 -7
  105. package/dist/src/commands/re-export-files.js +34 -44
  106. package/dist/src/commands/re-export-lint.d.ts +10 -13
  107. package/dist/src/commands/re-export-lint.js +16 -14
  108. package/dist/src/commands/re-export-options.d.ts +6 -6
  109. package/dist/src/commands/re-export-options.js +6 -6
  110. package/dist/src/commands/re-export-register.d.ts +4 -10
  111. package/dist/src/commands/re-export-register.js +5 -11
  112. package/dist/src/commands/re-export-scan.js +1 -1
  113. package/dist/src/commands/re-export-single.d.ts +3 -3
  114. package/dist/src/commands/re-export-single.js +33 -25
  115. package/dist/src/commands/re-export.js +13 -21
  116. package/dist/src/commands/rebase/abort.js +3 -3
  117. package/dist/src/commands/rebase/confirm.js +2 -1
  118. package/dist/src/commands/rebase/continue.d.ts +1 -1
  119. package/dist/src/commands/rebase/continue.js +14 -9
  120. package/dist/src/commands/rebase/index.js +11 -11
  121. package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
  122. package/dist/src/commands/rebase/patch-loop.js +60 -39
  123. package/dist/src/commands/rebase/summary.js +1 -1
  124. package/dist/src/commands/register.js +5 -7
  125. package/dist/src/commands/reset.js +2 -1
  126. package/dist/src/commands/resolve.d.ts +16 -13
  127. package/dist/src/commands/resolve.js +30 -33
  128. package/dist/src/commands/run.js +33 -35
  129. package/dist/src/commands/setup-support.js +15 -19
  130. package/dist/src/commands/setup.js +13 -9
  131. package/dist/src/commands/status-check.d.ts +6 -6
  132. package/dist/src/commands/status-json.d.ts +6 -6
  133. package/dist/src/commands/status-json.js +5 -0
  134. package/dist/src/commands/status-output.d.ts +5 -5
  135. package/dist/src/commands/status-output.js +6 -6
  136. package/dist/src/commands/status-ownership.d.ts +16 -14
  137. package/dist/src/commands/status-ownership.js +16 -14
  138. package/dist/src/commands/status.js +42 -34
  139. package/dist/src/commands/test-build-phase.js +26 -13
  140. package/dist/src/commands/test-diagnose.js +44 -44
  141. package/dist/src/commands/test-register.js +1 -0
  142. package/dist/src/commands/test-run.d.ts +14 -16
  143. package/dist/src/commands/test-run.js +21 -13
  144. package/dist/src/commands/test-stale-gate.d.ts +15 -16
  145. package/dist/src/commands/test-stale-gate.js +15 -16
  146. package/dist/src/commands/test-verdict.d.ts +20 -3
  147. package/dist/src/commands/test-verdict.js +30 -0
  148. package/dist/src/commands/test.js +83 -76
  149. package/dist/src/commands/token-coverage.js +3 -4
  150. package/dist/src/commands/token.js +16 -18
  151. package/dist/src/commands/tree.js +47 -31
  152. package/dist/src/commands/typecheck.d.ts +10 -12
  153. package/dist/src/commands/typecheck.js +24 -27
  154. package/dist/src/commands/verify.js +13 -15
  155. package/dist/src/commands/watch.js +21 -23
  156. package/dist/src/commands/wire.js +52 -62
  157. package/dist/src/core/ast-utils.d.ts +8 -7
  158. package/dist/src/core/ast-utils.js +8 -7
  159. package/dist/src/core/branding.d.ts +9 -14
  160. package/dist/src/core/branding.js +7 -11
  161. package/dist/src/core/browser-wire.d.ts +1 -1
  162. package/dist/src/core/browser-wire.js +14 -19
  163. package/dist/src/core/build-audit-platform.js +25 -33
  164. package/dist/src/core/build-audit-registration.js +17 -25
  165. package/dist/src/core/build-audit-resolve.d.ts +15 -17
  166. package/dist/src/core/build-audit-resolve.js +39 -36
  167. package/dist/src/core/build-audit-transforms.js +18 -19
  168. package/dist/src/core/build-audit.js +28 -42
  169. package/dist/src/core/build-baseline-types.d.ts +29 -35
  170. package/dist/src/core/build-baseline.d.ts +5 -4
  171. package/dist/src/core/build-baseline.js +14 -14
  172. package/dist/src/core/build-overwrite-guard.d.ts +7 -14
  173. package/dist/src/core/build-overwrite-guard.js +17 -27
  174. package/dist/src/core/build-prepare.d.ts +2 -2
  175. package/dist/src/core/build-prepare.js +8 -9
  176. package/dist/src/core/config-mutate.js +20 -19
  177. package/dist/src/core/config-state.js +12 -4
  178. package/dist/src/core/config-validate.js +8 -5
  179. package/dist/src/core/config.d.ts +5 -8
  180. package/dist/src/core/config.js +7 -16
  181. package/dist/src/core/coverage-extend.d.ts +15 -13
  182. package/dist/src/core/coverage-extend.js +15 -13
  183. package/dist/src/core/destructive.d.ts +31 -9
  184. package/dist/src/core/destructive.js +29 -26
  185. package/dist/src/core/diff-hunks.js +10 -12
  186. package/dist/src/core/discard-baseline.d.ts +8 -8
  187. package/dist/src/core/discard-baseline.js +16 -15
  188. package/dist/src/core/display-state.d.ts +12 -14
  189. package/dist/src/core/display-state.js +12 -14
  190. package/dist/src/core/engine-changes.d.ts +2 -4
  191. package/dist/src/core/engine-changes.js +2 -4
  192. package/dist/src/core/engine-precondition.d.ts +28 -13
  193. package/dist/src/core/engine-precondition.js +25 -10
  194. package/dist/src/core/engine-session-lock.d.ts +47 -21
  195. package/dist/src/core/engine-session-lock.js +168 -33
  196. package/dist/src/core/export-moved-code-shape.d.ts +10 -10
  197. package/dist/src/core/export-moved-code-shape.js +10 -10
  198. package/dist/src/core/file-lock.d.ts +62 -5
  199. package/dist/src/core/file-lock.js +196 -59
  200. package/dist/src/core/firefox-cache.js +1 -3
  201. package/dist/src/core/firefox-extract.js +10 -14
  202. package/dist/src/core/firefox.d.ts +7 -5
  203. package/dist/src/core/firefox.js +4 -5
  204. package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
  205. package/dist/src/core/furnace-apply-dry-run.js +3 -2
  206. package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
  207. package/dist/src/core/furnace-apply-ftl.js +16 -13
  208. package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
  209. package/dist/src/core/furnace-apply-helpers.js +30 -21
  210. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
  211. package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
  212. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
  213. package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
  214. package/dist/src/core/furnace-apply.d.ts +5 -8
  215. package/dist/src/core/furnace-apply.js +19 -24
  216. package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
  217. package/dist/src/core/furnace-checksum-utils.js +16 -0
  218. package/dist/src/core/furnace-config.d.ts +21 -30
  219. package/dist/src/core/furnace-config.js +32 -54
  220. package/dist/src/core/furnace-constants.d.ts +8 -0
  221. package/dist/src/core/furnace-constants.js +10 -2
  222. package/dist/src/core/furnace-css-fragments.d.ts +5 -5
  223. package/dist/src/core/furnace-css-fragments.js +5 -5
  224. package/dist/src/core/furnace-jsconfig.d.ts +11 -12
  225. package/dist/src/core/furnace-jsconfig.js +11 -12
  226. package/dist/src/core/furnace-marker.d.ts +7 -8
  227. package/dist/src/core/furnace-marker.js +7 -8
  228. package/dist/src/core/furnace-operation.d.ts +31 -0
  229. package/dist/src/core/furnace-operation.js +54 -17
  230. package/dist/src/core/furnace-precondition.d.ts +61 -0
  231. package/dist/src/core/furnace-precondition.js +67 -0
  232. package/dist/src/core/furnace-registration-remove.d.ts +5 -6
  233. package/dist/src/core/furnace-registration-remove.js +6 -7
  234. package/dist/src/core/furnace-registration-validate.d.ts +13 -0
  235. package/dist/src/core/furnace-registration-validate.js +20 -1
  236. package/dist/src/core/furnace-registration.d.ts +5 -6
  237. package/dist/src/core/furnace-registration.js +10 -12
  238. package/dist/src/core/furnace-rollback.js +7 -7
  239. package/dist/src/core/furnace-scanner.d.ts +1 -0
  240. package/dist/src/core/furnace-scanner.js +1 -2
  241. package/dist/src/core/furnace-stale-export.d.ts +10 -10
  242. package/dist/src/core/furnace-stale-export.js +10 -10
  243. package/dist/src/core/furnace-state-persist.d.ts +6 -8
  244. package/dist/src/core/furnace-state-persist.js +6 -8
  245. package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
  246. package/dist/src/core/furnace-validate-accessibility.js +310 -1
  247. package/dist/src/core/furnace-validate-compatibility.js +141 -1
  248. package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
  249. package/dist/src/core/furnace-validate-helpers.js +0 -491
  250. package/dist/src/core/furnace-validate-registration.d.ts +7 -0
  251. package/dist/src/core/furnace-validate-registration.js +115 -41
  252. package/dist/src/core/furnace-validate.d.ts +16 -0
  253. package/dist/src/core/furnace-validate.js +188 -145
  254. package/dist/src/core/furnace-version-drift.d.ts +10 -11
  255. package/dist/src/core/furnace-version-drift.js +10 -11
  256. package/dist/src/core/git-base.d.ts +21 -9
  257. package/dist/src/core/git-base.js +24 -9
  258. package/dist/src/core/git-diff.d.ts +20 -9
  259. package/dist/src/core/git-diff.js +148 -63
  260. package/dist/src/core/git-file-ops.d.ts +19 -19
  261. package/dist/src/core/git-file-ops.js +19 -19
  262. package/dist/src/core/git-readonly-index.d.ts +53 -19
  263. package/dist/src/core/git-readonly-index.js +75 -31
  264. package/dist/src/core/git-status.d.ts +5 -6
  265. package/dist/src/core/git-status.js +5 -6
  266. package/dist/src/core/git.d.ts +9 -10
  267. package/dist/src/core/git.js +57 -71
  268. package/dist/src/core/license-headers.d.ts +17 -23
  269. package/dist/src/core/license-headers.js +17 -23
  270. package/dist/src/core/mach-build-artifacts.d.ts +9 -9
  271. package/dist/src/core/mach-build-artifacts.js +57 -19
  272. package/dist/src/core/mach-error-hints.js +42 -29
  273. package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
  274. package/dist/src/core/mach-known-noise-filter.js +18 -20
  275. package/dist/src/core/mach-mozconfig.d.ts +14 -0
  276. package/dist/src/core/mach-mozconfig.js +30 -0
  277. package/dist/src/core/mach-resource-shim.d.ts +43 -58
  278. package/dist/src/core/mach-resource-shim.js +50 -67
  279. package/dist/src/core/mach.d.ts +37 -41
  280. package/dist/src/core/mach.js +50 -51
  281. package/dist/src/core/marionette-port.d.ts +36 -1
  282. package/dist/src/core/marionette-port.js +96 -31
  283. package/dist/src/core/marionette-preflight.d.ts +8 -12
  284. package/dist/src/core/marionette-preflight.js +86 -52
  285. package/dist/src/core/mochitest-server-port.d.ts +42 -0
  286. package/dist/src/core/mochitest-server-port.js +119 -0
  287. package/dist/src/core/module-resolution-preflight.d.ts +9 -11
  288. package/dist/src/core/module-resolution-preflight.js +9 -11
  289. package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
  290. package/dist/src/core/moz-manifest-helpers.js +163 -0
  291. package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
  292. package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
  293. package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
  294. package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
  295. package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
  296. package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
  297. package/dist/src/core/ownership-table.d.ts +14 -16
  298. package/dist/src/core/ownership-table.js +14 -16
  299. package/dist/src/core/parser-fallback.d.ts +15 -1
  300. package/dist/src/core/parser-fallback.js +22 -3
  301. package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
  302. package/dist/src/core/patch-apply-fuzz.js +15 -18
  303. package/dist/src/core/patch-apply.d.ts +13 -34
  304. package/dist/src/core/patch-apply.js +16 -76
  305. package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
  306. package/dist/src/core/patch-artifact-normalize.js +13 -15
  307. package/dist/src/core/patch-export-metadata.d.ts +12 -2
  308. package/dist/src/core/patch-export-metadata.js +13 -4
  309. package/dist/src/core/patch-export-update.d.ts +13 -1
  310. package/dist/src/core/patch-export-update.js +25 -8
  311. package/dist/src/core/patch-export.d.ts +15 -8
  312. package/dist/src/core/patch-export.js +10 -11
  313. package/dist/src/core/patch-files.d.ts +5 -6
  314. package/dist/src/core/patch-files.js +5 -6
  315. package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
  316. package/dist/src/core/patch-identifier-suggest.js +14 -19
  317. package/dist/src/core/patch-lint-binary.d.ts +51 -0
  318. package/dist/src/core/patch-lint-binary.js +39 -0
  319. package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
  320. package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
  321. package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
  322. package/dist/src/core/patch-lint-checkjs.js +41 -20
  323. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
  324. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
  325. package/dist/src/core/patch-lint-creators.d.ts +8 -8
  326. package/dist/src/core/patch-lint-creators.js +8 -8
  327. package/dist/src/core/patch-lint-cross.d.ts +17 -20
  328. package/dist/src/core/patch-lint-cross.js +16 -16
  329. package/dist/src/core/patch-lint-css.d.ts +3 -5
  330. package/dist/src/core/patch-lint-css.js +17 -22
  331. package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
  332. package/dist/src/core/patch-lint-diff-tag.js +14 -16
  333. package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
  334. package/dist/src/core/patch-lint-jsdoc.js +26 -19
  335. package/dist/src/core/patch-lint-mozbuild.js +20 -20
  336. package/dist/src/core/patch-lint-observer.d.ts +7 -7
  337. package/dist/src/core/patch-lint-observer.js +7 -7
  338. package/dist/src/core/patch-lint.d.ts +38 -29
  339. package/dist/src/core/patch-lint.js +89 -121
  340. package/dist/src/core/patch-lock.d.ts +1 -1
  341. package/dist/src/core/patch-lock.js +45 -9
  342. package/dist/src/core/patch-manifest-consistency.d.ts +57 -6
  343. package/dist/src/core/patch-manifest-consistency.js +111 -40
  344. package/dist/src/core/patch-manifest-files-affected.d.ts +43 -0
  345. package/dist/src/core/patch-manifest-files-affected.js +77 -0
  346. package/dist/src/core/patch-manifest-io.js +14 -18
  347. package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
  348. package/dist/src/core/patch-manifest-resolve.js +9 -12
  349. package/dist/src/core/patch-manifest-validate.d.ts +6 -1
  350. package/dist/src/core/patch-manifest-validate.js +25 -13
  351. package/dist/src/core/patch-manifest.d.ts +2 -1
  352. package/dist/src/core/patch-manifest.js +2 -1
  353. package/dist/src/core/patch-parse.d.ts +24 -13
  354. package/dist/src/core/patch-parse.js +19 -14
  355. package/dist/src/core/patch-policy.d.ts +2 -2
  356. package/dist/src/core/patch-policy.js +2 -2
  357. package/dist/src/core/patch-registration-refs.d.ts +7 -8
  358. package/dist/src/core/patch-registration-refs.js +9 -9
  359. package/dist/src/core/process-cpu-time.d.ts +12 -0
  360. package/dist/src/core/process-cpu-time.js +52 -0
  361. package/dist/src/core/rebase-session.d.ts +38 -26
  362. package/dist/src/core/rebase-session.js +55 -28
  363. package/dist/src/core/register-browser-content.js +9 -74
  364. package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
  365. package/dist/src/core/register-module.js +10 -43
  366. package/dist/src/core/register-scaffold.d.ts +8 -8
  367. package/dist/src/core/register-scaffold.js +10 -10
  368. package/dist/src/core/register-shared-css.d.ts +9 -12
  369. package/dist/src/core/register-shared-css.js +17 -87
  370. package/dist/src/core/register-xpcshell-test.d.ts +6 -7
  371. package/dist/src/core/register-xpcshell-test.js +7 -8
  372. package/dist/src/core/shared-ftl.js +12 -4
  373. package/dist/src/core/state-file.d.ts +45 -0
  374. package/dist/src/core/state-file.js +34 -0
  375. package/dist/src/core/status-binary.d.ts +18 -11
  376. package/dist/src/core/status-binary.js +19 -12
  377. package/dist/src/core/status-classify.d.ts +30 -36
  378. package/dist/src/core/status-classify.js +21 -26
  379. package/dist/src/core/test-changed-prefs.d.ts +30 -0
  380. package/dist/src/core/test-changed-prefs.js +78 -0
  381. package/dist/src/core/test-harness-crash.d.ts +25 -63
  382. package/dist/src/core/test-harness-crash.js +121 -142
  383. package/dist/src/core/test-harness-signature.d.ts +18 -0
  384. package/dist/src/core/test-harness-signature.js +13 -0
  385. package/dist/src/core/test-path-scope.d.ts +12 -15
  386. package/dist/src/core/test-path-scope.js +15 -18
  387. package/dist/src/core/test-stale-check.d.ts +17 -17
  388. package/dist/src/core/test-stale-check.js +50 -43
  389. package/dist/src/core/test-stall-triage.d.ts +51 -0
  390. package/dist/src/core/test-stall-triage.js +126 -0
  391. package/dist/src/core/token-category.js +66 -14
  392. package/dist/src/core/token-coverage.js +9 -9
  393. package/dist/src/core/token-dark-mode.d.ts +9 -11
  394. package/dist/src/core/token-dark-mode.js +29 -13
  395. package/dist/src/core/token-docs.d.ts +2 -0
  396. package/dist/src/core/token-docs.js +3 -1
  397. package/dist/src/core/token-manager.d.ts +10 -2
  398. package/dist/src/core/token-manager.js +17 -8
  399. package/dist/src/core/token-scaffold.d.ts +7 -7
  400. package/dist/src/core/token-scaffold.js +7 -7
  401. package/dist/src/core/token-variant.d.ts +4 -4
  402. package/dist/src/core/token-variant.js +28 -6
  403. package/dist/src/core/toolchain-preflight.d.ts +20 -21
  404. package/dist/src/core/toolchain-preflight.js +28 -31
  405. package/dist/src/core/tree-guard.js +12 -2
  406. package/dist/src/core/tree-store.d.ts +41 -27
  407. package/dist/src/core/tree-store.js +68 -43
  408. package/dist/src/core/typecheck-shim.d.ts +23 -24
  409. package/dist/src/core/typecheck-shim.js +23 -24
  410. package/dist/src/core/typecheck.js +15 -9
  411. package/dist/src/core/wire-destroy.d.ts +3 -3
  412. package/dist/src/core/wire-destroy.js +7 -15
  413. package/dist/src/core/wire-dom-fragment.d.ts +9 -17
  414. package/dist/src/core/wire-dom-fragment.js +11 -44
  415. package/dist/src/core/wire-init.d.ts +2 -3
  416. package/dist/src/core/wire-init.js +8 -19
  417. package/dist/src/core/wire-subscript.d.ts +2 -3
  418. package/dist/src/core/wire-subscript.js +4 -13
  419. package/dist/src/core/wire-utils.d.ts +7 -8
  420. package/dist/src/core/wire-utils.js +7 -8
  421. package/dist/src/core/xpcshell-appdir.d.ts +38 -45
  422. package/dist/src/core/xpcshell-appdir.js +38 -45
  423. package/dist/src/errors/base.d.ts +37 -16
  424. package/dist/src/errors/base.js +37 -16
  425. package/dist/src/errors/build.d.ts +13 -1
  426. package/dist/src/errors/build.js +14 -2
  427. package/dist/src/errors/codes.d.ts +16 -0
  428. package/dist/src/errors/codes.js +16 -0
  429. package/dist/src/errors/furnace.d.ts +4 -4
  430. package/dist/src/errors/git.d.ts +6 -10
  431. package/dist/src/errors/git.js +6 -10
  432. package/dist/src/errors/patch.d.ts +7 -7
  433. package/dist/src/errors/patch.js +7 -7
  434. package/dist/src/errors/rebase.d.ts +4 -4
  435. package/dist/src/errors/rebase.js +4 -4
  436. package/dist/src/index.d.ts +7 -1
  437. package/dist/src/index.js +5 -0
  438. package/dist/src/types/commands/index.d.ts +2 -2
  439. package/dist/src/types/commands/options.d.ts +111 -70
  440. package/dist/src/types/commands/patches.d.ts +24 -34
  441. package/dist/src/types/commands/project.d.ts +5 -34
  442. package/dist/src/types/config.d.ts +25 -23
  443. package/dist/src/types/config.js +6 -1
  444. package/dist/src/types/furnace.d.ts +37 -13
  445. package/dist/src/types/furnace.js +19 -1
  446. package/dist/src/types/index.d.ts +3 -3
  447. package/dist/src/utils/build-info.d.ts +7 -8
  448. package/dist/src/utils/build-info.js +12 -11
  449. package/dist/src/utils/errors.d.ts +6 -8
  450. package/dist/src/utils/errors.js +6 -8
  451. package/dist/src/utils/logger.d.ts +27 -10
  452. package/dist/src/utils/logger.js +28 -16
  453. package/dist/src/utils/machine-output.d.ts +12 -0
  454. package/dist/src/utils/machine-output.js +33 -0
  455. package/dist/src/utils/options.d.ts +31 -14
  456. package/dist/src/utils/options.js +86 -30
  457. package/dist/src/utils/paths.d.ts +10 -8
  458. package/dist/src/utils/paths.js +10 -8
  459. package/dist/src/utils/platform.d.ts +0 -25
  460. package/dist/src/utils/platform.js +1 -42
  461. package/dist/src/utils/process-group.d.ts +9 -4
  462. package/dist/src/utils/process-group.js +19 -5
  463. package/dist/src/utils/process.d.ts +42 -7
  464. package/dist/src/utils/process.js +44 -17
  465. package/dist/src/utils/ps-duration.d.ts +31 -0
  466. package/dist/src/utils/ps-duration.js +70 -0
  467. package/dist/src/utils/regex.d.ts +9 -10
  468. package/dist/src/utils/regex.js +9 -10
  469. package/dist/src/utils/validation.d.ts +58 -28
  470. package/dist/src/utils/validation.js +60 -33
  471. package/package.json +3 -3
  472. package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
  473. package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
  474. package/dist/src/core/manifest-helpers.d.ts +0 -38
  475. package/dist/src/core/manifest-helpers.js +0 -120
  476. /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
  477. /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
  478. /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
@@ -0,0 +1,67 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ /**
3
+ * Shared precondition ladder for the Furnace command family: engine exists,
4
+ * `furnace.json` exists.
5
+ *
6
+ * Kept separate from the `GeneralError` ladder in `engine-precondition.ts`
7
+ * because the error CLASS is load-bearing here, not cosmetic: `FurnaceError`
8
+ * carries its own `userMessage` and exit code 9, so a helper raising
9
+ * `GeneralError` would silently change both.
10
+ *
11
+ * Deliberately NOT routed through this helper — each informs rather than
12
+ * refuses, and each says so at its own site: `furnace list`,
13
+ * `furnace status`, `furnace init`, and `verify`. `furnace validate`
14
+ * refusing is the intended line between inspecting and validating.
15
+ */
16
+ import { FurnaceError } from '../errors/furnace.js';
17
+ import { pathExists } from '../utils/fs.js';
18
+ import { getProjectPaths } from './config-paths.js';
19
+ import { furnaceConfigExists, loadFurnaceConfig } from './furnace-config.js';
20
+ /**
21
+ * Asserts that a specific engine directory exists, raising a `FurnaceError`.
22
+ *
23
+ * The path-taking form, for core helpers that already hold `engineDir` and
24
+ * have no project root to derive it from.
25
+ *
26
+ * @param engineDir - Absolute path to the engine checkout
27
+ * @param options - Optional message tailoring
28
+ */
29
+ export async function assertFurnaceEngineDirReady(engineDir, options = {}) {
30
+ if (!(await pathExists(engineDir))) {
31
+ throw new FurnaceError(`Engine directory not found. Run "fireforge download" first${options.engineMissingSuffix ?? '.'}`);
32
+ }
33
+ }
34
+ /**
35
+ * Asserts that the engine checkout exists, raising a `FurnaceError`.
36
+ *
37
+ * The engine rung on its own, for the Furnace commands that scaffold or
38
+ * mutate component sources without needing `furnace.json` to exist yet.
39
+ *
40
+ * @param projectRoot - Project root directory
41
+ * @param options - Optional message tailoring
42
+ * @returns Resolved project paths, so callers do not re-derive them
43
+ */
44
+ export async function assertFurnaceEngineReady(projectRoot, options = {}) {
45
+ const paths = getProjectPaths(projectRoot);
46
+ await assertFurnaceEngineDirReady(paths.engine, options);
47
+ return { paths };
48
+ }
49
+ /**
50
+ * Asserts the full Furnace ladder — engine checkout, then `furnace.json` —
51
+ * and returns the loaded config so callers do not read it a second time.
52
+ *
53
+ * @param projectRoot - Project root directory
54
+ * @param options - Optional message tailoring
55
+ * @returns Resolved project paths and the loaded furnace config
56
+ */
57
+ export async function assertFurnaceReady(projectRoot, options = {}) {
58
+ const { paths } = await assertFurnaceEngineReady(projectRoot, options);
59
+ // `loadFurnaceConfig` refuses on its own with a fuller message, but the
60
+ // probe stays: it produces the shorter, action-first refusal the command
61
+ // layer has always shown for "you have not set Furnace up yet", which is a
62
+ // different situation from "your furnace.json is unreadable".
63
+ if (!(await furnaceConfigExists(projectRoot))) {
64
+ throw new FurnaceError('No furnace.json found. Run "fireforge furnace create" or "fireforge furnace override" to get started.');
65
+ }
66
+ return { paths, config: await loadFurnaceConfig(projectRoot) };
67
+ }
@@ -2,16 +2,15 @@
2
2
  * Removal of custom element registrations from customElements.js.
3
3
  *
4
4
  * Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
5
- * locate and delete registration entries. The earlier implementation walked
6
- * the file line-by-line with a 20-line scan bound for bracket matching, which
7
- * only worked against Firefox's stock formatting and silently failed on any
8
- * hand-reformatted customElements.js. AST-based bracket matching is format-
9
- * agnostic by construction.
5
+ * locate and delete registration entries. A line-by-line scan with a bounded
6
+ * bracket match only works against Firefox's stock formatting and fails
7
+ * silently on a hand-reformatted customElements.js; AST-based bracket
8
+ * matching is format-agnostic by construction.
10
9
  *
11
10
  * Contract:
12
11
  * - Idempotent: if the tag is not registered, the file is left unchanged.
13
12
  * - Non-destructive on parse failure: if customElements.js cannot be parsed,
14
- * the file is left untouched rather than fall through to a line-based
13
+ * the file is left untouched rather than falling through to a line-based
15
14
  * heuristic that could delete the wrong range.
16
15
  * - Two registration shapes are recognised:
17
16
  * (A) Standalone statement:
@@ -3,16 +3,15 @@
3
3
  * Removal of custom element registrations from customElements.js.
4
4
  *
5
5
  * Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
6
- * locate and delete registration entries. The earlier implementation walked
7
- * the file line-by-line with a 20-line scan bound for bracket matching, which
8
- * only worked against Firefox's stock formatting and silently failed on any
9
- * hand-reformatted customElements.js. AST-based bracket matching is format-
10
- * agnostic by construction.
6
+ * locate and delete registration entries. A line-by-line scan with a bounded
7
+ * bracket match only works against Firefox's stock formatting and fails
8
+ * silently on a hand-reformatted customElements.js; AST-based bracket
9
+ * matching is format-agnostic by construction.
11
10
  *
12
11
  * Contract:
13
12
  * - Idempotent: if the tag is not registered, the file is left unchanged.
14
13
  * - Non-destructive on parse failure: if customElements.js cannot be parsed,
15
- * the file is left untouched rather than fall through to a line-based
14
+ * the file is left untouched rather than falling through to a line-based
16
15
  * heuristic that could delete the wrong range.
17
16
  * - Two registration shapes are recognised:
18
17
  * (A) Standalone statement:
@@ -32,7 +31,7 @@ import { CUSTOM_ELEMENTS_JS } from './furnace-constants.js';
32
31
  * to (and including) the next newline. This keeps the surrounding file
33
32
  * layout stable: deleting a list entry should not leave a dangling comma
34
33
  * behind, and deleting an expression statement should not leave a blank
35
- * line where the statement used to be.
34
+ * line where the statement stood.
36
35
  */
37
36
  function expandRemovalRange(content, start, end) {
38
37
  let expandedEnd = end;
@@ -21,6 +21,19 @@ export declare const CUSTOM_ELEMENT_TAG_RULES = "must be lowercase, start with a
21
21
  * @throws FurnaceError if the tag name is invalid
22
22
  */
23
23
  export declare function validateTagName(tagName: string): void;
24
+ /**
25
+ * Returns why `tagName` is invalid, or `undefined` when it is fine.
26
+ *
27
+ * The message-returning half of {@link validateTagName}, for callers that
28
+ * must not throw — specifically clack `validate` callbacks, which expect a
29
+ * returned string and re-prompt on it. Passing the THROWING form to one
30
+ * makes an invalid tag name escape clack's validation loop as a
31
+ * `FurnaceError`, killing the prompt instead of showing the rule inline.
32
+ *
33
+ * @param tagName - Candidate custom element tag name
34
+ * @returns The rule violation, or undefined when the name is valid
35
+ */
36
+ export declare function describeTagNameProblem(tagName: string): string | undefined;
24
37
  /**
25
38
  * Validates that a registration entry landed in the correct block
26
39
  * (Pattern A = loadSubScript, Pattern B = DOMContentLoaded/importESModule).
@@ -24,9 +24,28 @@ export const CUSTOM_ELEMENT_TAG_RULES = 'must be lowercase, start with a letter,
24
24
  * @throws FurnaceError if the tag name is invalid
25
25
  */
26
26
  export function validateTagName(tagName) {
27
+ const problem = describeTagNameProblem(tagName);
28
+ if (problem !== undefined) {
29
+ throw new FurnaceError(problem, tagName);
30
+ }
31
+ }
32
+ /**
33
+ * Returns why `tagName` is invalid, or `undefined` when it is fine.
34
+ *
35
+ * The message-returning half of {@link validateTagName}, for callers that
36
+ * must not throw — specifically clack `validate` callbacks, which expect a
37
+ * returned string and re-prompt on it. Passing the THROWING form to one
38
+ * makes an invalid tag name escape clack's validation loop as a
39
+ * `FurnaceError`, killing the prompt instead of showing the rule inline.
40
+ *
41
+ * @param tagName - Candidate custom element tag name
42
+ * @returns The rule violation, or undefined when the name is valid
43
+ */
44
+ export function describeTagNameProblem(tagName) {
27
45
  if (!CUSTOM_ELEMENT_TAG_PATTERN.test(tagName)) {
28
- throw new FurnaceError(`Invalid tag name "${tagName}": ${CUSTOM_ELEMENT_TAG_RULES}`, tagName);
46
+ return `Invalid tag name "${tagName}": ${CUSTOM_ELEMENT_TAG_RULES}`;
29
47
  }
48
+ return undefined;
30
49
  }
31
50
  /**
32
51
  * Validates that a registration entry landed in the correct block
@@ -81,12 +81,11 @@ export interface StaleJarMnEntry {
81
81
  line: string;
82
82
  }
83
83
  /**
84
- * Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)`
85
- * whose workspace source file no longer exists (0.34.0 field report: a
86
- * renamed component helper left the old line pointing at a deleted file,
87
- * and every build failed at packaging). Only tags in `managedTags`
88
- * (furnace-managed custom components) are inspected so upstream lines are
89
- * never touched.
84
+ * Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)` whose
85
+ * workspace source file no longer exists — a renamed component helper
86
+ * otherwise leaves the old line pointing at a deleted file and every build
87
+ * fails at packaging. Only tags in `managedTags` (furnace-managed custom
88
+ * components) are inspected, so upstream lines are never touched.
90
89
  */
91
90
  export declare function findStaleJarMnEntries(engineDir: string, customDir: string, managedTags: readonly string[]): Promise<StaleJarMnEntry[]>;
92
91
  /**
@@ -223,12 +223,11 @@ export async function removeJarMnEntries(engineDir, tagName) {
223
223
  const lines = content.split('\n');
224
224
  // Match by the SOURCE MAPPING segment `(widgets/<tagName>/...)` so every
225
225
  // line the component registered is removed regardless of the target
226
- // basename — a helper `.mjs` whose name does not start with the tag
227
- // (e.g. a renamed `foo-utils.mjs`) used to survive the remove pass and
228
- // leave a stale registration that broke packaging (0.34.0 field
229
- // report). The legacy target-path match is kept as an OR for lines
230
- // written by older FireForge versions without a source mapping. Word
231
- // boundaries keep "moz-card" from matching "moz-card-group".
226
+ // basename — a helper `.mjs` whose name does not start with the tag (e.g.
227
+ // a renamed `foo-utils.mjs`) otherwise survives the remove pass and leaves
228
+ // a stale registration that breaks packaging. The legacy target-path match
229
+ // is kept as an OR for lines written before the source mapping existed.
230
+ // Word boundaries keep "moz-card" from matching "moz-card-group".
232
231
  const sourcePattern = new RegExp(`\\(widgets/${escapeRegex(tagName)}/`);
233
232
  const legacyTargetPattern = new RegExp(`content/global/elements/${escapeRegex(tagName)}\\.`);
234
233
  const filtered = lines.filter((line) => !sourcePattern.test(line) && !legacyTargetPattern.test(line));
@@ -239,12 +238,11 @@ export async function removeJarMnEntries(engineDir, tagName) {
239
238
  }
240
239
  const WIDGET_SOURCE_MAPPING_PATTERN = /\(widgets\/([^/)]+)\/([^)]+)\)/;
241
240
  /**
242
- * Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)`
243
- * whose workspace source file no longer exists (0.34.0 field report: a
244
- * renamed component helper left the old line pointing at a deleted file,
245
- * and every build failed at packaging). Only tags in `managedTags`
246
- * (furnace-managed custom components) are inspected so upstream lines are
247
- * never touched.
241
+ * Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)` whose
242
+ * workspace source file no longer exists — a renamed component helper
243
+ * otherwise leaves the old line pointing at a deleted file and every build
244
+ * fails at packaging. Only tags in `managedTags` (furnace-managed custom
245
+ * components) are inspected, so upstream lines are never touched.
248
246
  */
249
247
  export async function findStaleJarMnEntries(engineDir, customDir, managedTags) {
250
248
  const filePath = join(engineDir, JAR_MN);
@@ -92,14 +92,14 @@ async function restoreFile(filePath, snapshot) {
92
92
  return;
93
93
  }
94
94
  await mkdir(dirname(filePath), { recursive: true });
95
- // Write to a sibling temp file and atomically rename it over the target.
96
- // A direct writeFile would race with any in-flight write by the body (e.g. a
95
+ // Write to a sibling temp file and atomically rename it over the target. A
96
+ // direct writeFile would race with any in-flight write by the body (e.g. a
97
97
  // signal-handler-driven rollback landing on top of a still-running
98
- // `writeFile('corrupted')` from the body), producing interleaved byte
99
- // sequences like `"pristined"` where the first 8 bytes come from the
100
- // rollback write and the trailing byte from the body write. rename(2) is
101
- // atomic within a filesystem, so either the body's write or the rollback's
102
- // rename wins outright and the target is never left in a hybrid state.
98
+ // `writeFile('corrupted')`), producing interleaved byte sequences like
99
+ // `"pristined"` where the first 8 bytes come from the rollback write and
100
+ // the trailing byte from the body write. rename(2) is atomic within a
101
+ // filesystem, so either write wins outright and the target is never left
102
+ // in a hybrid state.
103
103
  const tempPath = `${filePath}.rollback-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
104
104
  try {
105
105
  await writeFile(tempPath, snapshot.content ?? new Uint8Array());
@@ -1,4 +1,5 @@
1
1
  import type { ScannedComponent } from '../types/furnace.js';
2
+ /** Path to the widgets directory within the engine source tree */
2
3
  /**
3
4
  * Additional Firefox source directories known to contain MozLitElement
4
5
  * components. Used by `--deep` scan mode to discover components beyond
@@ -6,9 +6,8 @@ import { toError } from '../utils/errors.js';
6
6
  import { pathExists, readText } from '../utils/fs.js';
7
7
  import { verbose, warn } from '../utils/logger.js';
8
8
  import { asEstree, getNodeSource, parseScript, walkAST } from './ast-utils.js';
9
- import { CUSTOM_ELEMENTS_JS, FTL_DIR } from './furnace-constants.js';
9
+ import { CUSTOM_ELEMENTS_JS, FTL_DIR, WIDGETS_DIR } from './furnace-constants.js';
10
10
  /** Path to the widgets directory within the engine source tree */
11
- const WIDGETS_DIR = 'toolkit/content/widgets';
12
11
  /**
13
12
  * Additional Firefox source directories known to contain MozLitElement
14
13
  * components. Used by `--deep` scan mode to discover components beyond
@@ -2,21 +2,21 @@
2
2
  * Stale-furnace-source gate for `fireforge patch export` / `re-export`.
3
3
  *
4
4
  * Exports capture the DEPLOYED engine copies of furnace-managed files, not
5
- * the `components/` sources. Editing a component source and re-exporting
6
- * its owning patch WITHOUT an intervening `furnace deploy`/`apply` silently
5
+ * the `components/` sources. Editing a component source and re-exporting its
6
+ * owning patch WITHOUT an intervening `furnace deploy`/`apply` silently
7
7
  * exports the stale deployed copy — per-patch lint then flags the old line
8
- * count and the patch body lags the source. This gate detects that
9
- * sequence by comparing component source directories against the checksums
10
- * recorded at the last apply (`FurnaceState.appliedChecksums`) — the same
11
- * signal `warnIfFurnaceStale` uses for run/watch — and refuses the export
12
- * unless the operator passes `--allow-stale-furnace`.
8
+ * count and the patch body lags the source. This gate detects that sequence
9
+ * by comparing component source directories against the checksums recorded
10
+ * at the last apply (`FurnaceState.appliedChecksums`) — the same signal
11
+ * `warnIfFurnaceStale` uses for run/watch — and refuses the export unless
12
+ * the operator passes `--allow-stale-furnace`.
13
13
  *
14
14
  * Checksum-based on purpose: git checkouts and `furnace refresh` churn
15
15
  * mtimes without content changes, so an mtime comparison would misfire.
16
16
  *
17
- * Probe failures (broken furnace config, missing state) degrade to a
18
- * verbose log and an empty result — a broken furnace setup must never
19
- * block non-furnace patch work.
17
+ * Probe failures (broken furnace config, missing state) degrade to a verbose
18
+ * log and an empty result — a broken furnace setup must never block
19
+ * non-furnace patch work.
20
20
  */
21
21
  /** One furnace component whose source drifted from its deployed copy. */
22
22
  export interface StaleFurnaceComponent {
@@ -3,21 +3,21 @@
3
3
  * Stale-furnace-source gate for `fireforge patch export` / `re-export`.
4
4
  *
5
5
  * Exports capture the DEPLOYED engine copies of furnace-managed files, not
6
- * the `components/` sources. Editing a component source and re-exporting
7
- * its owning patch WITHOUT an intervening `furnace deploy`/`apply` silently
6
+ * the `components/` sources. Editing a component source and re-exporting its
7
+ * owning patch WITHOUT an intervening `furnace deploy`/`apply` silently
8
8
  * exports the stale deployed copy — per-patch lint then flags the old line
9
- * count and the patch body lags the source. This gate detects that
10
- * sequence by comparing component source directories against the checksums
11
- * recorded at the last apply (`FurnaceState.appliedChecksums`) — the same
12
- * signal `warnIfFurnaceStale` uses for run/watch — and refuses the export
13
- * unless the operator passes `--allow-stale-furnace`.
9
+ * count and the patch body lags the source. This gate detects that sequence
10
+ * by comparing component source directories against the checksums recorded
11
+ * at the last apply (`FurnaceState.appliedChecksums`) — the same signal
12
+ * `warnIfFurnaceStale` uses for run/watch — and refuses the export unless
13
+ * the operator passes `--allow-stale-furnace`.
14
14
  *
15
15
  * Checksum-based on purpose: git checkouts and `furnace refresh` churn
16
16
  * mtimes without content changes, so an mtime comparison would misfire.
17
17
  *
18
- * Probe failures (broken furnace config, missing state) degrade to a
19
- * verbose log and an empty result — a broken furnace setup must never
20
- * block non-furnace patch work.
18
+ * Probe failures (broken furnace config, missing state) degrade to a verbose
19
+ * log and an empty result — a broken furnace setup must never block
20
+ * non-furnace patch work.
21
21
  */
22
22
  import { GeneralError } from '../errors/base.js';
23
23
  import { toError } from '../utils/errors.js';
@@ -4,22 +4,20 @@
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),
8
- * which replaces `appliedChecksums` wholesale — correct only when the
9
- * run covered every component.
7
+ * 1. The BATCH path inside `applyAllComponents` (persistState: true), which
8
+ * replaces `appliedChecksums` wholesale — correct only when the run
9
+ * covered every component.
10
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
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
- * named component, so the wholesale replace persists a state file
17
- * containing only that component. Downstream, `diffDeletedFiles` and
16
+ * named component, so the wholesale replace persists a state file containing
17
+ * only that component. Downstream, `diffDeletedFiles` and
18
18
  * `findOrphanedEngineFiles` both key on `appliedChecksums`, so the wiped
19
19
  * components' stale engine files become undetectable by apply AND by
20
- * `furnace validate` (2026-07-05 review, finding F1 — `furnace apply
21
- * <name>` had exactly this bug while `furnace deploy <name>` documented
22
- * and avoided it).
20
+ * `furnace validate`.
23
21
  */
24
22
  import { type ApplyAllComponentsResult } from './furnace-apply.js';
25
23
  import { type getFurnacePaths } from './furnace-config.js';
@@ -5,22 +5,20 @@
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),
9
- * which replaces `appliedChecksums` wholesale — correct only when the
10
- * run covered every component.
8
+ * 1. The BATCH path inside `applyAllComponents` (persistState: true), which
9
+ * replaces `appliedChecksums` wholesale — correct only when the run
10
+ * covered every component.
11
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
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
- * named component, so the wholesale replace persists a state file
18
- * containing only that component. Downstream, `diffDeletedFiles` and
17
+ * named component, so the wholesale replace persists a state file containing
18
+ * only that component. Downstream, `diffDeletedFiles` and
19
19
  * `findOrphanedEngineFiles` both key on `appliedChecksums`, so the wiped
20
20
  * components' stale engine files become undetectable by apply AND by
21
- * `furnace validate` (2026-07-05 review, finding F1 — `furnace apply
22
- * <name>` had exactly this bug while `furnace deploy <name>` documented
23
- * and avoided it).
21
+ * `furnace validate`.
24
22
  */
25
23
  import { join } from 'node:path';
26
24
  import { FurnaceError } from '../errors/furnace.js';
@@ -3,6 +3,8 @@ import type { CustomComponentConfig, ValidationIssue } from '../types/furnace.js
3
3
  * Validates accessibility patterns in a component's .mjs file.
4
4
  * Checks for ARIA roles, keyboard handlers, l10n, and focus delegation.
5
5
  *
6
+ * @param componentDir - Directory holding the component's sources
7
+ * @param tagName - Custom element tag name, used to locate `<tagName>.mjs`
6
8
  * @param customConfig - When the component is custom, its matching entry
7
9
  * from `furnace.json`. Used to skip the `no-keyboard-handler` warning
8
10
  * when the component declares keyboard coverage either explicitly
@@ -11,3 +13,23 @@ import type { CustomComponentConfig, ValidationIssue } from '../types/furnace.js
11
13
  * without config in scope can continue to call without changes.
12
14
  */
13
15
  export declare function validateAccessibility(componentDir: string, tagName: string, customConfig?: CustomComponentConfig): Promise<ValidationIssue[]>;
16
+ /**
17
+ * Detects hardcoded user-visible template text that should usually be
18
+ * localized.
19
+ *
20
+ * Scoped to three positive contexts rather than scanning the whole file,
21
+ * because a bare `>…<` regex catches JS comparisons (`if (x > 0 && y <
22
+ * 100)`), diagnostic strings (`console.error("Failed <id> lookup")`), and
23
+ * identifier literals that are never shown to a user. Only matches that
24
+ * actually enter a UI render path count:
25
+ *
26
+ * 1. Content inside a Lit `` html`…` `` tagged template literal.
27
+ * 2. The string literal on the RHS of `.textContent = "…"` or
28
+ * `.innerHTML = "…"`.
29
+ * 3. The string literal assigned to an XUL-widget `label=`,
30
+ * `title=`, or `tooltiptext=` attribute when constructing DOM in JS.
31
+ *
32
+ * A file-wide `// furnace-ignore: hardcoded-text` comment suppresses all
33
+ * findings (matches the pre-existing escape hatch).
34
+ */
35
+ export declare function containsHardcodedTemplateText(content: string): boolean;