@hominis/fireforge 0.44.4 → 0.46.0

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 (378) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/dist/bin/fireforge.js +6 -0
  3. package/dist/build-info.json +4 -4
  4. package/dist/src/cli-usage-error.d.ts +46 -0
  5. package/dist/src/cli-usage-error.js +81 -0
  6. package/dist/src/cli.d.ts +5 -1
  7. package/dist/src/cli.js +20 -21
  8. package/dist/src/commands/bootstrap.js +1 -2
  9. package/dist/src/commands/build.js +15 -6
  10. package/dist/src/commands/destructive-decision.d.ts +19 -0
  11. package/dist/src/commands/destructive-decision.js +31 -0
  12. package/dist/src/commands/doctor-check-core.d.ts +0 -6
  13. package/dist/src/commands/doctor-check-core.js +0 -8
  14. package/dist/src/commands/doctor-orphaned-harness.d.ts +0 -6
  15. package/dist/src/commands/doctor-orphaned-harness.js +4 -12
  16. package/dist/src/commands/doctor-post-rebase-audit.js +1 -1
  17. package/dist/src/commands/doctor-source-pin.d.ts +29 -0
  18. package/dist/src/commands/doctor-source-pin.js +81 -0
  19. package/dist/src/commands/doctor.d.ts +2 -0
  20. package/dist/src/commands/doctor.js +9 -8
  21. package/dist/src/commands/download.js +35 -24
  22. package/dist/src/commands/export-all.js +21 -4
  23. package/dist/src/commands/export-flow.js +15 -60
  24. package/dist/src/commands/export-placement-conflicts.js +3 -3
  25. package/dist/src/commands/export-placement-gate.js +2 -8
  26. package/dist/src/commands/export-placement-policy.js +3 -5
  27. package/dist/src/commands/export-shared.d.ts +42 -23
  28. package/dist/src/commands/export-shared.js +4 -19
  29. package/dist/src/commands/export.js +10 -1
  30. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  31. package/dist/src/commands/furnace/authoring-config.js +19 -0
  32. package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
  33. package/dist/src/commands/furnace/create-browser-test.js +3 -8
  34. package/dist/src/commands/furnace/create-dry-run.js +2 -5
  35. package/dist/src/commands/furnace/create-templates.d.ts +17 -1
  36. package/dist/src/commands/furnace/create-templates.js +2 -1
  37. package/dist/src/commands/furnace/create.js +25 -19
  38. package/dist/src/commands/furnace/deploy.js +11 -2
  39. package/dist/src/commands/furnace/init.js +2 -1
  40. package/dist/src/commands/furnace/override.js +28 -19
  41. package/dist/src/commands/furnace/refresh.js +9 -1
  42. package/dist/src/commands/furnace/remove-mutations.d.ts +6 -7
  43. package/dist/src/commands/furnace/remove-mutations.js +0 -1
  44. package/dist/src/commands/furnace/remove.js +2 -6
  45. package/dist/src/commands/furnace/rename-browser-test.js +1 -7
  46. package/dist/src/commands/furnace/rename.js +29 -29
  47. package/dist/src/commands/furnace/status.js +12 -9
  48. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  49. package/dist/src/commands/furnace/test-file-name.js +39 -0
  50. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  51. package/dist/src/commands/furnace/validation-output.js +3 -8
  52. package/dist/src/commands/import.js +2 -9
  53. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  54. package/dist/src/commands/lint-per-patch.js +19 -4
  55. package/dist/src/commands/lint-per-run-checkjs.d.ts +2 -2
  56. package/dist/src/commands/lint.d.ts +2 -1
  57. package/dist/src/commands/lint.js +1 -1
  58. package/dist/src/commands/manifest.js +1 -1
  59. package/dist/src/commands/package.js +2 -4
  60. package/dist/src/commands/patch/compact.js +14 -15
  61. package/dist/src/commands/patch/delete.js +15 -25
  62. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  63. package/dist/src/commands/patch/entry-projection.js +24 -0
  64. package/dist/src/commands/patch/lint-ignore.d.ts +0 -8
  65. package/dist/src/commands/patch/lint-ignore.js +19 -29
  66. package/dist/src/commands/patch/move-files-create.js +24 -10
  67. package/dist/src/commands/patch/move-files-into.js +38 -37
  68. package/dist/src/commands/patch/move-files.js +4 -13
  69. package/dist/src/commands/patch/rename.js +27 -41
  70. package/dist/src/commands/patch/reorder.js +25 -38
  71. package/dist/src/commands/patch/split-plan.d.ts +4 -5
  72. package/dist/src/commands/patch/split-plan.js +4 -11
  73. package/dist/src/commands/patch/split.js +45 -43
  74. package/dist/src/commands/patch/staged-dependency.js +16 -22
  75. package/dist/src/commands/patch/tier.js +15 -25
  76. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  77. package/dist/src/commands/patch-rename-map.js +36 -0
  78. package/dist/src/commands/pending-resolution.d.ts +15 -0
  79. package/dist/src/commands/pending-resolution.js +25 -0
  80. package/dist/src/commands/re-export-adjacent.d.ts +32 -2
  81. package/dist/src/commands/re-export-adjacent.js +51 -10
  82. package/dist/src/commands/re-export-bulk-scan.js +6 -10
  83. package/dist/src/commands/re-export-drift.d.ts +8 -0
  84. package/dist/src/commands/re-export-drift.js +65 -4
  85. package/dist/src/commands/re-export-files.d.ts +2 -3
  86. package/dist/src/commands/re-export-files.js +38 -32
  87. package/dist/src/commands/re-export-lint.d.ts +3 -4
  88. package/dist/src/commands/re-export-lint.js +9 -2
  89. package/dist/src/commands/re-export-options.js +19 -5
  90. package/dist/src/commands/re-export-register.js +5 -1
  91. package/dist/src/commands/re-export-scan.js +8 -8
  92. package/dist/src/commands/re-export-single.d.ts +22 -3
  93. package/dist/src/commands/re-export-single.js +19 -11
  94. package/dist/src/commands/re-export.js +44 -27
  95. package/dist/src/commands/rebase/abort.js +3 -8
  96. package/dist/src/commands/rebase/continue.js +12 -12
  97. package/dist/src/commands/rebase/index.js +2 -2
  98. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  99. package/dist/src/commands/rebase/patch-loop.js +2 -7
  100. package/dist/src/commands/resolve.js +18 -10
  101. package/dist/src/commands/run.d.ts +0 -13
  102. package/dist/src/commands/run.js +12 -25
  103. package/dist/src/commands/setup-support.d.ts +16 -4
  104. package/dist/src/commands/setup-support.js +16 -16
  105. package/dist/src/commands/setup.js +3 -9
  106. package/dist/src/commands/source.js +8 -1
  107. package/dist/src/commands/status-check.js +2 -2
  108. package/dist/src/commands/status-output.js +2 -2
  109. package/dist/src/commands/status.js +3 -4
  110. package/dist/src/commands/test-build-phase.d.ts +2 -2
  111. package/dist/src/commands/test-build-phase.js +33 -8
  112. package/dist/src/commands/test-diagnose.js +14 -5
  113. package/dist/src/commands/test-modes.d.ts +2 -2
  114. package/dist/src/commands/test-modes.js +0 -1
  115. package/dist/src/commands/test-register.js +6 -3
  116. package/dist/src/commands/test-run.js +29 -21
  117. package/dist/src/commands/test-stale-gate.js +8 -5
  118. package/dist/src/commands/test-verdict.d.ts +16 -2
  119. package/dist/src/commands/test-verdict.js +18 -3
  120. package/dist/src/commands/test.js +51 -7
  121. package/dist/src/commands/token-list.d.ts +26 -0
  122. package/dist/src/commands/token-list.js +153 -0
  123. package/dist/src/commands/token.js +17 -1
  124. package/dist/src/commands/tree.js +7 -2
  125. package/dist/src/commands/typecheck.js +9 -9
  126. package/dist/src/commands/wire.js +4 -3
  127. package/dist/src/core/branding.d.ts +0 -7
  128. package/dist/src/core/branding.js +3 -2
  129. package/dist/src/core/browser-wire.js +6 -3
  130. package/dist/src/core/build-audit-platform.d.ts +29 -0
  131. package/dist/src/core/build-audit-platform.js +140 -0
  132. package/dist/src/core/build-audit-registration.js +3 -2
  133. package/dist/src/core/build-audit-skip.d.ts +57 -0
  134. package/dist/src/core/build-audit-skip.js +112 -0
  135. package/dist/src/core/build-audit.d.ts +15 -2
  136. package/dist/src/core/build-audit.js +154 -12
  137. package/dist/src/core/build-baseline.d.ts +45 -28
  138. package/dist/src/core/build-baseline.js +6 -29
  139. package/dist/src/core/build-jar-escalation.d.ts +64 -0
  140. package/dist/src/core/build-jar-escalation.js +128 -0
  141. package/dist/src/core/build-overwrite-guard.js +1 -1
  142. package/dist/src/core/build-prepare.d.ts +5 -2
  143. package/dist/src/core/build-prepare.js +34 -6
  144. package/dist/src/core/config-paths.d.ts +2 -6
  145. package/dist/src/core/config-paths.js +4 -2
  146. package/dist/src/core/config-state.d.ts +0 -6
  147. package/dist/src/core/config-state.js +1 -19
  148. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  149. package/dist/src/core/config-validate-build-audit.js +80 -0
  150. package/dist/src/core/config-validate-file-size.d.ts +12 -0
  151. package/dist/src/core/config-validate-file-size.js +65 -0
  152. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  153. package/dist/src/core/config-validate-patch-policy.js +3 -3
  154. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  155. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  156. package/dist/src/core/config-validate.js +20 -3
  157. package/dist/src/core/config.d.ts +2 -2
  158. package/dist/src/core/config.js +11 -15
  159. package/dist/src/core/coverage-extend.js +4 -4
  160. package/dist/src/core/discard-baseline.js +7 -7
  161. package/dist/src/core/engine-precondition.d.ts +1 -9
  162. package/dist/src/core/engine-precondition.js +3 -8
  163. package/dist/src/core/engine-session-lock.js +13 -17
  164. package/dist/src/core/export-moved-code-shape.js +2 -2
  165. package/dist/src/core/file-lock-owner.d.ts +103 -0
  166. package/dist/src/core/file-lock-owner.js +259 -0
  167. package/dist/src/core/file-lock.d.ts +2 -7
  168. package/dist/src/core/file-lock.js +40 -91
  169. package/dist/src/core/firefox-cache.d.ts +13 -1
  170. package/dist/src/core/firefox-cache.js +59 -34
  171. package/dist/src/core/firefox-download.d.ts +15 -0
  172. package/dist/src/core/firefox-download.js +37 -21
  173. package/dist/src/core/firefox-extract.d.ts +6 -5
  174. package/dist/src/core/firefox-extract.js +36 -18
  175. package/dist/src/core/firefox.d.ts +30 -32
  176. package/dist/src/core/firefox.js +5 -36
  177. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  178. package/dist/src/core/furnace-apply-dry-run.js +1 -7
  179. package/dist/src/core/furnace-apply-helpers.d.ts +0 -11
  180. package/dist/src/core/furnace-apply-helpers.js +8 -19
  181. package/dist/src/core/furnace-apply-overwrite-warn.js +4 -2
  182. package/dist/src/core/furnace-apply.d.ts +1 -1
  183. package/dist/src/core/furnace-apply.js +30 -10
  184. package/dist/src/core/furnace-config.d.ts +1 -1
  185. package/dist/src/core/furnace-config.js +23 -36
  186. package/dist/src/core/furnace-constants.js +3 -2
  187. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  188. package/dist/src/core/furnace-dir-entry.js +21 -0
  189. package/dist/src/core/furnace-operation.d.ts +2 -0
  190. package/dist/src/core/furnace-operation.js +3 -1
  191. package/dist/src/core/furnace-refresh.d.ts +18 -6
  192. package/dist/src/core/furnace-refresh.js +3 -6
  193. package/dist/src/core/furnace-registration-ast.d.ts +0 -1
  194. package/dist/src/core/furnace-registration-ast.js +0 -3
  195. package/dist/src/core/furnace-registration.d.ts +2 -1
  196. package/dist/src/core/furnace-registration.js +22 -29
  197. package/dist/src/core/furnace-scanner.js +3 -6
  198. package/dist/src/core/furnace-state-persist.d.ts +2 -2
  199. package/dist/src/core/furnace-validate-registration.js +5 -7
  200. package/dist/src/core/git-base.d.ts +3 -1
  201. package/dist/src/core/git-base.js +25 -3
  202. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  203. package/dist/src/core/git-diff-new-file.js +119 -0
  204. package/dist/src/core/git-diff.d.ts +9 -9
  205. package/dist/src/core/git-diff.js +88 -157
  206. package/dist/src/core/git-file-ops.d.ts +0 -7
  207. package/dist/src/core/git-file-ops.js +4 -28
  208. package/dist/src/core/git-readonly-index.d.ts +0 -2
  209. package/dist/src/core/git-readonly-index.js +0 -4
  210. package/dist/src/core/git-status.d.ts +7 -0
  211. package/dist/src/core/git-status.js +21 -9
  212. package/dist/src/core/git.d.ts +0 -6
  213. package/dist/src/core/git.js +14 -43
  214. package/dist/src/core/harness-orphans.d.ts +73 -0
  215. package/dist/src/core/harness-orphans.js +187 -0
  216. package/dist/src/core/history-log.d.ts +19 -0
  217. package/dist/src/core/history-log.js +29 -0
  218. package/dist/src/core/mach-error-hints.d.ts +0 -5
  219. package/dist/src/core/mach-error-hints.js +1 -1
  220. package/dist/src/core/mach-known-noise-filter.d.ts +25 -3
  221. package/dist/src/core/mach-known-noise-filter.js +31 -10
  222. package/dist/src/core/mach-mozconfig.js +2 -1
  223. package/dist/src/core/mach-python.d.ts +2 -0
  224. package/dist/src/core/mach-python.js +12 -7
  225. package/dist/src/core/mach-resource-shim.d.ts +13 -1
  226. package/dist/src/core/mach-resource-shim.js +112 -9
  227. package/dist/src/core/mach.d.ts +46 -53
  228. package/dist/src/core/mach.js +31 -83
  229. package/dist/src/core/marionette-port.d.ts +0 -17
  230. package/dist/src/core/marionette-port.js +12 -58
  231. package/dist/src/core/marionette-preflight.js +9 -27
  232. package/dist/src/core/mochitest-server-port.js +3 -3
  233. package/dist/src/core/moz-manifest-rules.js +37 -33
  234. package/dist/src/core/patch-apply-fuzz.js +4 -4
  235. package/dist/src/core/patch-apply.d.ts +4 -5
  236. package/dist/src/core/patch-apply.js +55 -32
  237. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  238. package/dist/src/core/patch-export-coverage.js +1 -30
  239. package/dist/src/core/patch-export-update.d.ts +18 -1
  240. package/dist/src/core/patch-export-update.js +4 -3
  241. package/dist/src/core/patch-export.d.ts +11 -21
  242. package/dist/src/core/patch-export.js +44 -66
  243. package/dist/src/core/patch-files.d.ts +0 -4
  244. package/dist/src/core/patch-files.js +0 -11
  245. package/dist/src/core/patch-lint-binary.d.ts +6 -12
  246. package/dist/src/core/patch-lint-cache.d.ts +17 -1
  247. package/dist/src/core/patch-lint-cache.js +3 -6
  248. package/dist/src/core/patch-lint-checkjs.d.ts +33 -16
  249. package/dist/src/core/patch-lint-checkjs.js +43 -25
  250. package/dist/src/core/patch-lint-creators.d.ts +2 -6
  251. package/dist/src/core/patch-lint-cross.d.ts +16 -8
  252. package/dist/src/core/patch-lint-cross.js +49 -92
  253. package/dist/src/core/patch-lint-css.js +10 -6
  254. package/dist/src/core/patch-lint-file-size.d.ts +52 -0
  255. package/dist/src/core/patch-lint-file-size.js +53 -0
  256. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  257. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  258. package/dist/src/core/patch-lint-jsdoc.js +36 -36
  259. package/dist/src/core/patch-lint-module-registration.d.ts +2 -8
  260. package/dist/src/core/patch-lint-prettier.d.ts +36 -0
  261. package/dist/src/core/patch-lint-prettier.js +126 -0
  262. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  263. package/dist/src/core/patch-lint-queue-types.js +12 -0
  264. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  265. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  266. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +106 -0
  267. package/dist/src/core/patch-lint-unmanaged-companion.js +214 -0
  268. package/dist/src/core/patch-lint.d.ts +14 -9
  269. package/dist/src/core/patch-lint.js +27 -27
  270. package/dist/src/core/patch-lock.js +3 -3
  271. package/dist/src/core/patch-manifest-io.js +8 -7
  272. package/dist/src/core/patch-parse.d.ts +19 -8
  273. package/dist/src/core/patch-parse.js +25 -0
  274. package/dist/src/core/patch-policy.js +15 -27
  275. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  276. package/dist/src/core/patch-source-metadata.js +0 -4
  277. package/dist/src/core/patch-transform.d.ts +21 -8
  278. package/dist/src/core/patch-transform.js +38 -10
  279. package/dist/src/core/process-cpu-time.js +1 -1
  280. package/dist/src/core/rebase-session.d.ts +2 -8
  281. package/dist/src/core/rebase-session.js +5 -17
  282. package/dist/src/core/register-browser-content.js +3 -2
  283. package/dist/src/core/register-browser-test.js +2 -1
  284. package/dist/src/core/register-module.js +2 -1
  285. package/dist/src/core/register-scaffold.js +5 -4
  286. package/dist/src/core/register-shared-css.js +2 -1
  287. package/dist/src/core/run-log-redact.d.ts +38 -0
  288. package/dist/src/core/run-log-redact.js +69 -0
  289. package/dist/src/core/run-log.d.ts +13 -2
  290. package/dist/src/core/run-log.js +67 -18
  291. package/dist/src/core/signal-critical.js +2 -4
  292. package/dist/src/core/smoke-patterns.d.ts +0 -1
  293. package/dist/src/core/smoke-patterns.js +18 -11
  294. package/dist/src/core/state-file.d.ts +12 -1
  295. package/dist/src/core/state-file.js +14 -1
  296. package/dist/src/core/status-classify.js +2 -1
  297. package/dist/src/core/test-changed-prefs.js +26 -11
  298. package/dist/src/core/test-harness-crash.js +61 -48
  299. package/dist/src/core/test-harness-verdict-notes.d.ts +55 -0
  300. package/dist/src/core/test-harness-verdict-notes.js +48 -0
  301. package/dist/src/core/test-stale-check.d.ts +23 -8
  302. package/dist/src/core/test-stale-check.js +77 -4
  303. package/dist/src/core/test-stall-triage.js +37 -19
  304. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  305. package/dist/src/core/test-xpcshell-retry.js +14 -11
  306. package/dist/src/core/token-category.d.ts +33 -0
  307. package/dist/src/core/token-category.js +56 -48
  308. package/dist/src/core/token-dark-mode.js +2 -14
  309. package/dist/src/core/token-inventory.d.ts +56 -0
  310. package/dist/src/core/token-inventory.js +109 -0
  311. package/dist/src/core/token-manager.d.ts +1 -1
  312. package/dist/src/core/token-manager.js +1 -1
  313. package/dist/src/core/token-variant.js +21 -22
  314. package/dist/src/core/toolchain-preflight.js +1 -1
  315. package/dist/src/core/tree-cow.d.ts +0 -2
  316. package/dist/src/core/tree-cow.js +2 -2
  317. package/dist/src/core/tree-store.js +4 -5
  318. package/dist/src/core/typecheck.js +2 -2
  319. package/dist/src/core/wire-dom-fragment.js +6 -17
  320. package/dist/src/core/wire-utils.js +5 -17
  321. package/dist/src/core/xpcshell-appdir.js +2 -4
  322. package/dist/src/errors/base.d.ts +53 -1
  323. package/dist/src/errors/base.js +79 -11
  324. package/dist/src/errors/build.d.ts +28 -0
  325. package/dist/src/errors/build.js +51 -10
  326. package/dist/src/errors/config.d.ts +0 -14
  327. package/dist/src/errors/config.js +13 -34
  328. package/dist/src/errors/download.d.ts +13 -0
  329. package/dist/src/errors/download.js +53 -24
  330. package/dist/src/errors/furnace.js +8 -9
  331. package/dist/src/errors/git.d.ts +8 -8
  332. package/dist/src/errors/git.js +20 -30
  333. package/dist/src/errors/patch.js +8 -10
  334. package/dist/src/errors/rebase.js +7 -7
  335. package/dist/src/types/commands/options.d.ts +96 -123
  336. package/dist/src/types/commands/patches.d.ts +17 -6
  337. package/dist/src/types/config.d.ts +75 -2
  338. package/dist/src/types/index.d.ts +0 -1
  339. package/dist/src/utils/assert.d.ts +3 -15
  340. package/dist/src/utils/assert.js +1 -18
  341. package/dist/src/utils/build-info.d.ts +1 -1
  342. package/dist/src/utils/child-env.d.ts +2 -1
  343. package/dist/src/utils/elapsed.js +10 -1
  344. package/dist/src/utils/fs.d.ts +4 -2
  345. package/dist/src/utils/fs.js +11 -14
  346. package/dist/src/utils/hash.d.ts +12 -0
  347. package/dist/src/utils/hash.js +16 -0
  348. package/dist/src/utils/line-dispatch.d.ts +15 -0
  349. package/dist/src/utils/line-dispatch.js +48 -0
  350. package/dist/src/utils/options.d.ts +1 -7
  351. package/dist/src/utils/options.js +6 -7
  352. package/dist/src/utils/package-root.js +3 -12
  353. package/dist/src/utils/platform.d.ts +0 -4
  354. package/dist/src/utils/process-group.d.ts +2 -1
  355. package/dist/src/utils/process-group.js +20 -19
  356. package/dist/src/utils/process.d.ts +40 -26
  357. package/dist/src/utils/process.js +115 -166
  358. package/dist/src/utils/ps-duration.js +3 -3
  359. package/dist/src/utils/sleep.d.ts +26 -0
  360. package/dist/src/utils/sleep.js +31 -0
  361. package/dist/src/utils/validation.d.ts +2 -38
  362. package/dist/src/utils/validation.js +7 -16
  363. package/docs/configuration.md +136 -1
  364. package/docs/exit-codes.md +34 -20
  365. package/docs/lifecycle-invariants.md +18 -12
  366. package/docs/machine-output.md +31 -8
  367. package/docs/patch-workflow.md +2 -1
  368. package/docs/run-logs.md +44 -4
  369. package/docs/testing.md +70 -11
  370. package/package.json +8 -7
  371. package/dist/src/commands/rebase.d.ts +0 -4
  372. package/dist/src/commands/rebase.js +0 -5
  373. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  374. package/dist/src/core/patch-artifact-normalize.js +0 -24
  375. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  376. package/dist/src/core/patch-lint-reexports.js +0 -8
  377. package/dist/src/core/wire-targets.d.ts +0 -7
  378. package/dist/src/core/wire-targets.js +0 -8
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { FireForgeError } from './base.js';
2
+ import { FireForgeError, remedies } from './base.js';
3
3
  import { ExitCode } from './codes.js';
4
4
  /**
5
5
  * Error thrown when a build operation fails.
@@ -12,15 +12,56 @@ export class BuildError extends FireForgeError {
12
12
  this.command = command;
13
13
  }
14
14
  get userMessage() {
15
- let msg = `Build Error: ${this.message}`;
16
- if (this.command) {
17
- msg += `\n\nCommand: ${this.command}`;
18
- }
19
- msg += '\n\nTo fix this:\n';
20
- msg += ' 1. Check the build output above for specific errors\n';
21
- msg += ' 2. Ensure all dependencies are installed with "fireforge bootstrap"\n';
22
- msg += ' 3. Try a clean build by deleting obj-* directories';
23
- return msg;
15
+ return (`Build Error: ${this.message}` +
16
+ (this.command ? `\n\nCommand: ${this.command}` : '') +
17
+ remedies([
18
+ 'Check the build output above for specific errors',
19
+ 'Ensure all dependencies are installed with "fireforge bootstrap"',
20
+ 'Try a clean build by deleting obj-* directories',
21
+ ]));
22
+ }
23
+ }
24
+ /**
25
+ * A test SUITE went red — assertions failed, or sharded runs did not all
26
+ * pass. Distinct from its {@link BuildError} parent only in what it TELLS
27
+ * the operator, deliberately not in its exit code: `docs/exit-codes.md`
28
+ * documents 5 as "a suite that FAILED", and consumers key CI on it.
29
+ *
30
+ * The parent's remedies are all build remedies — "check the build output",
31
+ * "fireforge bootstrap", "delete obj-* directories" — and none of them apply
32
+ * to a failing assertion. Worse, the first points at the wrong half of the
33
+ * log, which is exactly the half a `tail` keeps. Ground truth for a test red
34
+ * is the harness's own output, so the remedies here name the failing tests,
35
+ * the `FIREFORGE-VERDICT:` line, and the run log that survives a pipe.
36
+ *
37
+ * Note that `machineErrorCode` derives the `--json` error code from the class
38
+ * name, so this reports as `test-failure` rather than `build`.
39
+ */
40
+ export class TestFailureError extends BuildError {
41
+ failureBlocks;
42
+ logPath;
43
+ constructor(message, command,
44
+ /** Rendered TEST-UNEXPECTED blocks, when the verdict carried any. */
45
+ failureBlocks,
46
+ /** The run's complete raw log, when one was opened. */
47
+ logPath) {
48
+ super(message, command);
49
+ this.failureBlocks = failureBlocks;
50
+ this.logPath = logPath;
51
+ }
52
+ get userMessage() {
53
+ return (`Test Failure: ${this.message}` +
54
+ (this.command ? `\n\nCommand: ${this.command}` : '') +
55
+ (this.failureBlocks ? `\n\n${this.failureBlocks}` : '') +
56
+ remedies([
57
+ this.failureBlocks
58
+ ? 'Fix the failing assertions listed above, then re-run just those test paths'
59
+ : 'Find the TEST-UNEXPECTED-FAIL lines in the output above — they name what broke',
60
+ 'Read the "FIREFORGE-VERDICT:" line for the run\'s ground truth (checks, unexpected)',
61
+ this.logPath !== undefined
62
+ ? `The complete raw output is at ${this.logPath} — it survives a piped/tailed terminal`
63
+ : 'Re-run without piping the output, so the failure lines are not cut off by "tail"',
64
+ ]));
24
65
  }
25
66
  }
26
67
  /**
@@ -15,17 +15,3 @@ export declare class ConfigNotFoundError extends ConfigError {
15
15
  constructor(configPath: string);
16
16
  get userMessage(): string;
17
17
  }
18
- /**
19
- * Error thrown when a required field is missing from config.
20
- */
21
- export declare class MissingFieldError extends ConfigError {
22
- constructor(field: string);
23
- }
24
- /**
25
- * Error thrown when a field has an invalid value.
26
- */
27
- export declare class InvalidFieldError extends ConfigError {
28
- readonly expectedType: string;
29
- readonly actualValue: unknown;
30
- constructor(field: string, expectedType: string, actualValue: unknown);
31
- }
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { FireForgeError } from './base.js';
2
+ import { FireForgeError, remedies } from './base.js';
3
3
  import { ExitCode } from './codes.js';
4
4
  /**
5
5
  * Error thrown when configuration is missing or invalid.
@@ -12,15 +12,13 @@ export class ConfigError extends FireForgeError {
12
12
  this.field = field;
13
13
  }
14
14
  get userMessage() {
15
- let msg = `Configuration Error: ${this.message}`;
16
- if (this.field) {
17
- msg += `\n\nField: ${this.field}`;
18
- }
19
- msg += '\n\nTo fix this:\n';
20
- msg += ' 1. Check your fireforge.json file for errors\n';
21
- msg += ' 2. Run "fireforge setup" to create a new configuration\n';
22
- msg += ' 3. See the documentation for the expected format';
23
- return msg;
15
+ return (`Configuration Error: ${this.message}` +
16
+ (this.field ? `\n\nField: ${this.field}` : '') +
17
+ remedies([
18
+ 'Check your fireforge.json file for errors',
19
+ 'Run "fireforge setup" to create a new configuration',
20
+ 'See the documentation for the expected format',
21
+ ]));
24
22
  }
25
23
  }
26
24
  /**
@@ -32,29 +30,10 @@ export class ConfigNotFoundError extends ConfigError {
32
30
  }
33
31
  get userMessage() {
34
32
  return (`Configuration Error: ${this.message}\n\n` +
35
- 'This directory does not appear to be a FireForge project.\n\n' +
36
- 'To fix this:\n' +
37
- ' 1. Navigate to your project root directory\n' +
38
- ' 2. Run "fireforge setup" to initialize a new project');
39
- }
40
- }
41
- /**
42
- * Error thrown when a required field is missing from config.
43
- */
44
- export class MissingFieldError extends ConfigError {
45
- constructor(field) {
46
- super(`Required field "${field}" is missing from fireforge.json`, field);
47
- }
48
- }
49
- /**
50
- * Error thrown when a field has an invalid value.
51
- */
52
- export class InvalidFieldError extends ConfigError {
53
- expectedType;
54
- actualValue;
55
- constructor(field, expectedType, actualValue) {
56
- super(`Field "${field}" has invalid value. Expected ${expectedType}, got ${typeof actualValue}`, field);
57
- this.expectedType = expectedType;
58
- this.actualValue = actualValue;
33
+ 'This directory does not appear to be a FireForge project.' +
34
+ remedies([
35
+ 'Navigate to your project root directory',
36
+ 'Run "fireforge setup" to initialize a new project',
37
+ ]));
59
38
  }
60
39
  }
@@ -19,6 +19,19 @@ export declare class ChecksumMismatchError extends DownloadError {
19
19
  constructor(product: FirefoxProduct, expectedSha256: string, actualSha256: string, url: string);
20
20
  get userMessage(): string;
21
21
  }
22
+ /**
23
+ * Error thrown when the default integrity check cannot obtain Mozilla's
24
+ * published SHA-256 for a freshly downloaded archive (checksum file
25
+ * unreachable, malformed, or not listing the archive) and no operator pin
26
+ * or explicit opt-out allows the download to be trusted on TLS alone.
27
+ */
28
+ export declare class ChecksumUnavailableError extends DownloadError {
29
+ readonly product: FirefoxProduct;
30
+ readonly checksumsUrl: string;
31
+ readonly reason: string;
32
+ constructor(product: FirefoxProduct, checksumsUrl: string, reason: string, url: string);
33
+ get userMessage(): string;
34
+ }
22
35
  /**
23
36
  * Error thrown when extraction of the downloaded archive fails.
24
37
  */
@@ -1,4 +1,4 @@
1
- import { FireForgeError } from './base.js';
1
+ import { FireForgeError, remedies } from './base.js';
2
2
  import { ExitCode } from './codes.js';
3
3
  /**
4
4
  * Error thrown when Firefox source download fails.
@@ -11,15 +11,13 @@ export class DownloadError extends FireForgeError {
11
11
  this.url = url;
12
12
  }
13
13
  get userMessage() {
14
- let msg = `Download Error: ${this.message}`;
15
- if (this.url) {
16
- msg += `\n\nURL: ${this.url}`;
17
- }
18
- msg += '\n\nTo fix this:\n';
19
- msg += ' 1. Check your internet connection\n';
20
- msg += ' 2. Verify the Firefox version in fireforge.json is valid\n';
21
- msg += ' 3. Try again with "fireforge download --force"';
22
- return msg;
14
+ return (`Download Error: ${this.message}` +
15
+ (this.url ? `\n\nURL: ${this.url}` : '') +
16
+ remedies([
17
+ 'Check your internet connection',
18
+ 'Verify the Firefox version in fireforge.json is valid',
19
+ 'Try again with "fireforge download --force"',
20
+ ]));
23
21
  }
24
22
  }
25
23
  /**
@@ -36,23 +34,54 @@ export class ChecksumMismatchError extends DownloadError {
36
34
  this.actualSha256 = actualSha256;
37
35
  }
38
36
  get userMessage() {
39
- let msg = `Download Error: Firefox source archive checksum mismatch.\n\n` +
37
+ return (`Download Error: Firefox source archive checksum mismatch.\n\n` +
40
38
  `Product: ${this.product}\n` +
41
39
  `URL: ${this.url}\n` +
42
40
  `Expected SHA-256: ${this.expectedSha256}\n` +
43
- `Actual SHA-256: ${this.actualSha256}`;
44
- msg += '\n\nTo fix this:\n';
45
- msg += ' 1. Verify firefox.product, firefox.version, and firefox.sha256 in fireforge.json\n';
46
- msg += ' 2. Compare the pinned hash with Mozilla SHA256SUMMARY for the resolved archive\n';
47
- if (this.product === 'firefox-devedition') {
48
- msg +=
49
- ' 3. Developer Edition archives should resolve under https://archive.mozilla.org/pub/devedition/releases/\n';
50
- msg += ' 4. Re-run "fireforge download --force" after correcting the source settings';
51
- }
52
- else {
53
- msg += ' 3. Re-run "fireforge download --force" after correcting the source settings';
54
- }
55
- return msg;
41
+ `Actual SHA-256: ${this.actualSha256}` +
42
+ remedies([
43
+ 'Verify firefox.product, firefox.version, and firefox.sha256 in fireforge.json',
44
+ 'Compare the pinned hash with Mozilla SHA256SUMMARY for the resolved archive',
45
+ ...(this.product === 'firefox-devedition'
46
+ ? [
47
+ 'Developer Edition archives should resolve under https://archive.mozilla.org/pub/devedition/releases/',
48
+ ]
49
+ : []),
50
+ 'Re-run "fireforge download --force" after correcting the source settings',
51
+ ]));
52
+ }
53
+ }
54
+ /**
55
+ * Error thrown when the default integrity check cannot obtain Mozilla's
56
+ * published SHA-256 for a freshly downloaded archive (checksum file
57
+ * unreachable, malformed, or not listing the archive) and no operator pin
58
+ * or explicit opt-out allows the download to be trusted on TLS alone.
59
+ */
60
+ export class ChecksumUnavailableError extends DownloadError {
61
+ product;
62
+ checksumsUrl;
63
+ reason;
64
+ constructor(product, checksumsUrl, reason, url) {
65
+ super(`Could not verify archive against published SHA256SUMS: ${reason}`, url);
66
+ this.product = product;
67
+ this.checksumsUrl = checksumsUrl;
68
+ this.reason = reason;
69
+ }
70
+ get userMessage() {
71
+ return (`Download Error: Firefox source archive integrity could not be verified.\n\n` +
72
+ `Product: ${this.product}\n` +
73
+ `Archive: ${this.url ?? ''}\n` +
74
+ `Checksums: ${this.checksumsUrl}\n` +
75
+ `Reason: ${this.reason}\n\n` +
76
+ 'The archive was downloaded but discarded: without the published digest it would be ' +
77
+ 'trusted on TLS alone, and it becomes the git baseline every patch is built on.\n\n' +
78
+ 'To fix this:\n' +
79
+ ' 1. Check connectivity to archive.mozilla.org (a captive portal or proxy may be ' +
80
+ 'answering the SHA256SUMS request) and retry\n' +
81
+ ' 2. Or pin the archive digest: set firefox.sha256 in fireforge.json ' +
82
+ '(from the release SHA256SUMS, obtained out of band)\n' +
83
+ ' 3. Or, for an offline mirror you trust, set firefox.allowUnverifiedDownload: true ' +
84
+ 'in fireforge.json to accept the download with a warning');
56
85
  }
57
86
  }
58
87
  /**
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { FireForgeError } from './base.js';
2
+ import { FireForgeError, remedies } from './base.js';
3
3
  import { ExitCode } from './codes.js';
4
4
  /**
5
5
  * Error thrown when a furnace component operation fails.
@@ -15,15 +15,14 @@ export class FurnaceError extends FireForgeError {
15
15
  }
16
16
  omitValidateAdvice;
17
17
  get userMessage() {
18
- let msg = this.component
18
+ const head = this.component
19
19
  ? `Furnace Error (${this.component}): ${this.message}`
20
20
  : `Furnace Error: ${this.message}`;
21
- msg += '\n\nTo fix this:\n';
22
- msg += ' 1. Check the error message above for specifics\n';
23
- if (!this.omitValidateAdvice) {
24
- msg += ' 2. Run "fireforge furnace validate" to diagnose issues\n';
25
- }
26
- msg += ` ${this.omitValidateAdvice ? '2' : '3'}. Use "fireforge doctor --repair-furnace" if state is inconsistent`;
27
- return msg;
21
+ return (head +
22
+ remedies([
23
+ 'Check the error message above for specifics',
24
+ ...(this.omitValidateAdvice ? [] : ['Run "fireforge furnace validate" to diagnose issues']),
25
+ 'Use "fireforge doctor --repair-furnace" if state is inconsistent',
26
+ ]));
28
27
  }
29
28
  }
@@ -1,17 +1,24 @@
1
1
  import { FireForgeError } from './base.js';
2
+ import { ExitCode } from './codes.js';
2
3
  /**
3
4
  * Error thrown when a git operation fails.
4
5
  */
5
6
  export declare class GitError extends FireForgeError {
6
7
  readonly command?: string | undefined;
7
- readonly code: 4;
8
+ readonly code: ExitCode;
8
9
  constructor(message: string, command?: string | undefined, cause?: Error);
9
10
  get userMessage(): string;
10
11
  }
11
12
  /**
12
13
  * Error thrown when git is not installed.
14
+ *
15
+ * MISSING_DEPENDENCY, not GIT_ERROR: the fact is "a required tool is
16
+ * absent", the same fact `PythonNotFoundError` and `MachNotFoundError`
17
+ * report, and a consumer should install something rather than inspect a
18
+ * repository.
13
19
  */
14
20
  export declare class GitNotFoundError extends GitError {
21
+ readonly code: 7;
15
22
  constructor();
16
23
  get userMessage(): string;
17
24
  }
@@ -23,13 +30,6 @@ export declare class PatchApplyError extends GitError {
23
30
  constructor(patchPath: string, cause?: Error);
24
31
  get userMessage(): string;
25
32
  }
26
- /**
27
- * Error thrown when the repository is in a dirty state.
28
- */
29
- export declare class DirtyRepositoryError extends GitError {
30
- constructor();
31
- get userMessage(): string;
32
- }
33
33
  /**
34
34
  * Error thrown when a stale git index lock blocks repository initialization.
35
35
  */
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { FireForgeError } from './base.js';
2
+ import { FireForgeError, remedies } from './base.js';
3
3
  import { ExitCode } from './codes.js';
4
4
  /**
5
5
  * Error thrown when a git operation fails.
@@ -12,21 +12,25 @@ export class GitError extends FireForgeError {
12
12
  this.command = command;
13
13
  }
14
14
  get userMessage() {
15
- let msg = `Git Error: ${this.message}`;
16
- if (this.command) {
17
- msg += `\n\nCommand: git ${this.command}`;
18
- }
19
- msg += '\n\nTo fix this:\n';
20
- msg += ' 1. Ensure git is installed and in your PATH\n';
21
- msg += ' 2. Check if the repository is in a valid state\n';
22
- msg += ' 3. Try running "fireforge reset" to start fresh';
23
- return msg;
15
+ return (`Git Error: ${this.message}` +
16
+ (this.command ? `\n\nCommand: git ${this.command}` : '') +
17
+ remedies([
18
+ 'Ensure git is installed and in your PATH',
19
+ 'Check if the repository is in a valid state',
20
+ 'Try running "fireforge reset" to start fresh',
21
+ ]));
24
22
  }
25
23
  }
26
24
  /**
27
25
  * Error thrown when git is not installed.
26
+ *
27
+ * MISSING_DEPENDENCY, not GIT_ERROR: the fact is "a required tool is
28
+ * absent", the same fact `PythonNotFoundError` and `MachNotFoundError`
29
+ * report, and a consumer should install something rather than inspect a
30
+ * repository.
28
31
  */
29
32
  export class GitNotFoundError extends GitError {
33
+ code = ExitCode.MISSING_DEPENDENCY;
30
34
  constructor() {
31
35
  super('Git is not installed or not found in PATH');
32
36
  }
@@ -50,26 +54,12 @@ export class PatchApplyError extends GitError {
50
54
  get userMessage() {
51
55
  return (`Git Error: Failed to apply patch.\n\n` +
52
56
  `Patch: ${this.patchPath}\n\n` +
53
- 'This usually means the patch conflicts with existing changes.\n\n' +
54
- 'To fix this:\n' +
55
- ' 1. Check if the Firefox version matches the patch\n' +
56
- ' 2. Use "fireforge reset" to start with clean source\n' +
57
- ' 3. Update the patch to match the current Firefox version');
58
- }
59
- }
60
- /**
61
- * Error thrown when the repository is in a dirty state.
62
- */
63
- export class DirtyRepositoryError extends GitError {
64
- constructor() {
65
- super('Repository has uncommitted changes');
66
- }
67
- get userMessage() {
68
- return ('Git Error: The Firefox source has uncommitted changes.\n\n' +
69
- 'To fix this:\n' +
70
- ' 1. Export your changes with "fireforge export"\n' +
71
- ' 2. Use "fireforge reset" to restore clean state\n' +
72
- ' 3. Then run "fireforge import" to reapply patches');
57
+ 'This usually means the patch conflicts with existing changes.' +
58
+ remedies([
59
+ 'Check if the Firefox version matches the patch',
60
+ 'Use "fireforge reset" to start with clean source',
61
+ 'Update the patch to match the current Firefox version',
62
+ ]));
73
63
  }
74
64
  }
75
65
  /**
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { FireForgeError } from './base.js';
2
+ import { FireForgeError, remedies } from './base.js';
3
3
  import { ExitCode } from './codes.js';
4
4
  /**
5
5
  * Error thrown when `patches.json` exists but cannot be parsed or validated.
@@ -41,14 +41,12 @@ export class PatchError extends FireForgeError {
41
41
  this.patchName = patchName;
42
42
  }
43
43
  get userMessage() {
44
- let msg = `Patch Error: ${this.message}`;
45
- if (this.patchName) {
46
- msg += `\n\nPatch: ${this.patchName}`;
47
- }
48
- msg += '\n\nTo fix this:\n';
49
- msg += ' 1. Check if the patch is compatible with the Firefox version\n';
50
- msg += ' 2. Use "fireforge reset" to start with clean source\n';
51
- msg += ' 3. Update the patch for the current Firefox version';
52
- return msg;
44
+ return (`Patch Error: ${this.message}` +
45
+ (this.patchName ? `\n\nPatch: ${this.patchName}` : '') +
46
+ remedies([
47
+ 'Check if the patch is compatible with the Firefox version',
48
+ 'Use "fireforge reset" to start with clean source',
49
+ 'Update the patch for the current Firefox version',
50
+ ]));
53
51
  }
54
52
  }
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { FireForgeError } from './base.js';
2
+ import { FireForgeError, remedies } from './base.js';
3
3
  import { ExitCode } from './codes.js';
4
4
  /**
5
5
  * Base error for rebase operations.
@@ -7,12 +7,12 @@ import { ExitCode } from './codes.js';
7
7
  export class RebaseError extends FireForgeError {
8
8
  code = ExitCode.PATCH_ERROR;
9
9
  get userMessage() {
10
- let msg = `Rebase Error: ${this.message}`;
11
- msg += '\n\nTo fix this:\n';
12
- msg += ' 1. Check the error message above for specifics\n';
13
- msg += ' 2. Use "fireforge rebase --continue" to resume an interrupted rebase\n';
14
- msg += ' 3. Use "fireforge rebase --abort" to cancel and restore engine state';
15
- return msg;
10
+ return (`Rebase Error: ${this.message}` +
11
+ remedies([
12
+ 'Check the error message above for specifics',
13
+ 'Use "fireforge rebase --continue" to resume an interrupted rebase',
14
+ 'Use "fireforge rebase --abort" to cancel and restore engine state',
15
+ ]));
16
16
  }
17
17
  }
18
18
  /**