@hominis/fireforge 0.45.0 → 0.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/CHANGELOG.md +409 -446
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +21 -15
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +46 -0
  6. package/dist/src/cli-usage-error.js +81 -0
  7. package/dist/src/cli.d.ts +7 -2
  8. package/dist/src/cli.js +47 -47
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +3 -4
  11. package/dist/src/commands/build.js +27 -17
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +19 -0
  14. package/dist/src/commands/destructive-decision.js +31 -0
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -10
  17. package/dist/src/commands/doctor-check-core.js +0 -8
  18. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  20. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  21. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  22. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  23. package/dist/src/commands/doctor-furnace.js +22 -22
  24. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
  25. package/dist/src/commands/doctor-orphaned-harness.js +14 -23
  26. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  27. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  28. package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
  29. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  30. package/dist/src/commands/doctor-source-pin.js +14 -14
  31. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  32. package/dist/src/commands/doctor-working-tree.js +3 -3
  33. package/dist/src/commands/doctor.d.ts +3 -1
  34. package/dist/src/commands/doctor.js +15 -16
  35. package/dist/src/commands/download.js +50 -37
  36. package/dist/src/commands/export-all.js +29 -12
  37. package/dist/src/commands/export-flow.d.ts +5 -5
  38. package/dist/src/commands/export-flow.js +29 -59
  39. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  40. package/dist/src/commands/export-placement-conflicts.js +12 -12
  41. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  42. package/dist/src/commands/export-placement-gate.js +7 -13
  43. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  44. package/dist/src/commands/export-placement-policy.js +4 -6
  45. package/dist/src/commands/export-shared.d.ts +51 -32
  46. package/dist/src/commands/export-shared.js +17 -32
  47. package/dist/src/commands/export.js +14 -5
  48. package/dist/src/commands/furnace/apply.js +16 -16
  49. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  50. package/dist/src/commands/furnace/authoring-config.js +19 -0
  51. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  52. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  54. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  55. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  56. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  57. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  58. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  59. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  60. package/dist/src/commands/furnace/create-browser-test.js +7 -12
  61. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  62. package/dist/src/commands/furnace/create-dry-run.js +6 -9
  63. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  64. package/dist/src/commands/furnace/create-features.js +2 -2
  65. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  66. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  67. package/dist/src/commands/furnace/create-templates.d.ts +31 -15
  68. package/dist/src/commands/furnace/create-templates.js +20 -19
  69. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  70. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  71. package/dist/src/commands/furnace/create.d.ts +1 -1
  72. package/dist/src/commands/furnace/create.js +35 -29
  73. package/dist/src/commands/furnace/deploy.js +15 -6
  74. package/dist/src/commands/furnace/diff.js +7 -7
  75. package/dist/src/commands/furnace/index.js +1 -1
  76. package/dist/src/commands/furnace/init.js +17 -16
  77. package/dist/src/commands/furnace/list.js +2 -2
  78. package/dist/src/commands/furnace/override.d.ts +1 -1
  79. package/dist/src/commands/furnace/override.js +43 -34
  80. package/dist/src/commands/furnace/preview.js +17 -17
  81. package/dist/src/commands/furnace/refresh.js +15 -7
  82. package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
  83. package/dist/src/commands/furnace/remove-mutations.js +19 -19
  84. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  85. package/dist/src/commands/furnace/remove-state.js +1 -1
  86. package/dist/src/commands/furnace/remove.js +4 -8
  87. package/dist/src/commands/furnace/rename-browser-test.js +10 -15
  88. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  89. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  90. package/dist/src/commands/furnace/rename.js +36 -36
  91. package/dist/src/commands/furnace/scan.js +3 -3
  92. package/dist/src/commands/furnace/status.js +19 -16
  93. package/dist/src/commands/furnace/sync.js +6 -6
  94. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  95. package/dist/src/commands/furnace/test-file-name.js +39 -0
  96. package/dist/src/commands/furnace/validate.js +11 -12
  97. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  98. package/dist/src/commands/furnace/validation-output.js +3 -8
  99. package/dist/src/commands/import.js +22 -29
  100. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  101. package/dist/src/commands/lint-per-patch.js +27 -12
  102. package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
  103. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  104. package/dist/src/commands/lint-report.d.ts +3 -3
  105. package/dist/src/commands/lint-report.js +4 -4
  106. package/dist/src/commands/lint.d.ts +5 -4
  107. package/dist/src/commands/lint.js +36 -36
  108. package/dist/src/commands/manifest.d.ts +4 -4
  109. package/dist/src/commands/manifest.js +1 -1
  110. package/dist/src/commands/package.js +4 -6
  111. package/dist/src/commands/patch/compact.d.ts +2 -2
  112. package/dist/src/commands/patch/compact.js +19 -20
  113. package/dist/src/commands/patch/delete.d.ts +1 -1
  114. package/dist/src/commands/patch/delete.js +23 -33
  115. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  116. package/dist/src/commands/patch/entry-projection.js +24 -0
  117. package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
  118. package/dist/src/commands/patch/lint-ignore.js +33 -44
  119. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  120. package/dist/src/commands/patch/move-files-create.js +29 -15
  121. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  122. package/dist/src/commands/patch/move-files-into.js +41 -37
  123. package/dist/src/commands/patch/move-files.js +5 -14
  124. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  125. package/dist/src/commands/patch/rename.d.ts +4 -4
  126. package/dist/src/commands/patch/rename.js +35 -49
  127. package/dist/src/commands/patch/reorder.js +35 -48
  128. package/dist/src/commands/patch/split-plan.d.ts +7 -8
  129. package/dist/src/commands/patch/split-plan.js +10 -13
  130. package/dist/src/commands/patch/split.d.ts +2 -2
  131. package/dist/src/commands/patch/split.js +50 -48
  132. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  133. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  134. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  135. package/dist/src/commands/patch/staged-dependency.js +22 -28
  136. package/dist/src/commands/patch/tier.d.ts +2 -2
  137. package/dist/src/commands/patch/tier.js +20 -30
  138. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  139. package/dist/src/commands/patch-rename-map.js +36 -0
  140. package/dist/src/commands/pending-resolution.d.ts +15 -0
  141. package/dist/src/commands/pending-resolution.js +25 -0
  142. package/dist/src/commands/re-export-adjacent.d.ts +25 -3
  143. package/dist/src/commands/re-export-adjacent.js +40 -24
  144. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  145. package/dist/src/commands/re-export-bulk-scan.js +23 -27
  146. package/dist/src/commands/re-export-drift.d.ts +10 -10
  147. package/dist/src/commands/re-export-drift.js +33 -33
  148. package/dist/src/commands/re-export-files.d.ts +2 -3
  149. package/dist/src/commands/re-export-files.js +52 -44
  150. package/dist/src/commands/re-export-lint.d.ts +29 -30
  151. package/dist/src/commands/re-export-lint.js +36 -29
  152. package/dist/src/commands/re-export-options.d.ts +1 -1
  153. package/dist/src/commands/re-export-options.js +1 -1
  154. package/dist/src/commands/re-export-register.d.ts +1 -1
  155. package/dist/src/commands/re-export-register.js +1 -1
  156. package/dist/src/commands/re-export-scan.d.ts +1 -1
  157. package/dist/src/commands/re-export-scan.js +12 -9
  158. package/dist/src/commands/re-export-single.d.ts +23 -4
  159. package/dist/src/commands/re-export-single.js +39 -31
  160. package/dist/src/commands/re-export.js +35 -17
  161. package/dist/src/commands/rebase/abort.js +9 -14
  162. package/dist/src/commands/rebase/continue.js +20 -19
  163. package/dist/src/commands/rebase/index.d.ts +1 -1
  164. package/dist/src/commands/rebase/index.js +5 -5
  165. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  166. package/dist/src/commands/rebase/patch-loop.js +20 -24
  167. package/dist/src/commands/register.js +5 -5
  168. package/dist/src/commands/reset.js +1 -1
  169. package/dist/src/commands/resolve.d.ts +2 -2
  170. package/dist/src/commands/resolve.js +21 -13
  171. package/dist/src/commands/run.d.ts +0 -13
  172. package/dist/src/commands/run.js +38 -51
  173. package/dist/src/commands/setup-support.d.ts +16 -4
  174. package/dist/src/commands/setup-support.js +20 -20
  175. package/dist/src/commands/setup.js +4 -10
  176. package/dist/src/commands/source.js +9 -2
  177. package/dist/src/commands/status-check.d.ts +3 -3
  178. package/dist/src/commands/status-check.js +6 -6
  179. package/dist/src/commands/status-json.d.ts +14 -13
  180. package/dist/src/commands/status-json.js +9 -8
  181. package/dist/src/commands/status-output.d.ts +3 -3
  182. package/dist/src/commands/status-output.js +5 -5
  183. package/dist/src/commands/status-ownership.d.ts +3 -3
  184. package/dist/src/commands/status-ownership.js +3 -3
  185. package/dist/src/commands/status.js +25 -26
  186. package/dist/src/commands/test-build-phase.d.ts +3 -3
  187. package/dist/src/commands/test-build-phase.js +48 -24
  188. package/dist/src/commands/test-diagnose.d.ts +1 -1
  189. package/dist/src/commands/test-diagnose.js +20 -20
  190. package/dist/src/commands/test-modes.d.ts +4 -4
  191. package/dist/src/commands/test-modes.js +4 -5
  192. package/dist/src/commands/test-register.js +5 -3
  193. package/dist/src/commands/test-run.d.ts +11 -11
  194. package/dist/src/commands/test-run.js +40 -33
  195. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  196. package/dist/src/commands/test-stale-gate.js +17 -17
  197. package/dist/src/commands/test-verdict.d.ts +19 -5
  198. package/dist/src/commands/test-verdict.js +26 -11
  199. package/dist/src/commands/test.d.ts +3 -3
  200. package/dist/src/commands/test.js +73 -36
  201. package/dist/src/commands/token-coverage.js +3 -3
  202. package/dist/src/commands/token-list.d.ts +26 -0
  203. package/dist/src/commands/token-list.js +153 -0
  204. package/dist/src/commands/token.js +26 -10
  205. package/dist/src/commands/tree.js +26 -21
  206. package/dist/src/commands/typecheck.d.ts +6 -6
  207. package/dist/src/commands/typecheck.js +16 -16
  208. package/dist/src/commands/verify.d.ts +3 -3
  209. package/dist/src/commands/verify.js +10 -10
  210. package/dist/src/commands/watch.js +11 -11
  211. package/dist/src/commands/wire.js +17 -16
  212. package/dist/src/core/ast-utils.d.ts +7 -7
  213. package/dist/src/core/ast-utils.js +8 -8
  214. package/dist/src/core/branding.d.ts +5 -12
  215. package/dist/src/core/branding.js +6 -5
  216. package/dist/src/core/browser-wire.d.ts +1 -1
  217. package/dist/src/core/browser-wire.js +10 -7
  218. package/dist/src/core/build-audit-platform.d.ts +32 -3
  219. package/dist/src/core/build-audit-platform.js +153 -13
  220. package/dist/src/core/build-audit-registration.d.ts +5 -5
  221. package/dist/src/core/build-audit-registration.js +10 -9
  222. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  223. package/dist/src/core/build-audit-resolve.js +6 -6
  224. package/dist/src/core/build-audit-skip.d.ts +57 -0
  225. package/dist/src/core/build-audit-skip.js +112 -0
  226. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  227. package/dist/src/core/build-audit-transforms.js +3 -3
  228. package/dist/src/core/build-audit.d.ts +21 -8
  229. package/dist/src/core/build-audit.js +142 -40
  230. package/dist/src/core/build-baseline-types.d.ts +19 -18
  231. package/dist/src/core/build-baseline-types.js +1 -1
  232. package/dist/src/core/build-baseline.d.ts +48 -31
  233. package/dist/src/core/build-baseline.js +20 -43
  234. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  235. package/dist/src/core/build-jar-escalation.js +18 -17
  236. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  237. package/dist/src/core/build-overwrite-guard.js +14 -14
  238. package/dist/src/core/build-prepare.d.ts +4 -12
  239. package/dist/src/core/build-prepare.js +22 -26
  240. package/dist/src/core/config-mutate.js +4 -4
  241. package/dist/src/core/config-paths.d.ts +2 -6
  242. package/dist/src/core/config-paths.js +4 -2
  243. package/dist/src/core/config-state.d.ts +0 -6
  244. package/dist/src/core/config-state.js +3 -21
  245. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  246. package/dist/src/core/config-validate-build-audit.js +80 -0
  247. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  248. package/dist/src/core/config-validate-file-size.js +3 -3
  249. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  250. package/dist/src/core/config-validate-patch-policy.js +3 -3
  251. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  252. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  253. package/dist/src/core/config-validate.js +22 -12
  254. package/dist/src/core/config.d.ts +12 -12
  255. package/dist/src/core/config.js +21 -25
  256. package/dist/src/core/coverage-extend.d.ts +16 -16
  257. package/dist/src/core/coverage-extend.js +20 -20
  258. package/dist/src/core/destructive.d.ts +14 -14
  259. package/dist/src/core/destructive.js +9 -9
  260. package/dist/src/core/diff-hunks.d.ts +2 -2
  261. package/dist/src/core/diff-hunks.js +7 -7
  262. package/dist/src/core/discard-baseline.d.ts +10 -10
  263. package/dist/src/core/discard-baseline.js +22 -23
  264. package/dist/src/core/display-state.d.ts +11 -11
  265. package/dist/src/core/display-state.js +12 -12
  266. package/dist/src/core/engine-changes.d.ts +2 -2
  267. package/dist/src/core/engine-changes.js +2 -2
  268. package/dist/src/core/engine-precondition.d.ts +5 -13
  269. package/dist/src/core/engine-precondition.js +5 -10
  270. package/dist/src/core/engine-session-lock.d.ts +18 -18
  271. package/dist/src/core/engine-session-lock.js +50 -54
  272. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  273. package/dist/src/core/export-moved-code-shape.js +10 -10
  274. package/dist/src/core/file-lock-owner.d.ts +103 -0
  275. package/dist/src/core/file-lock-owner.js +259 -0
  276. package/dist/src/core/file-lock.d.ts +14 -19
  277. package/dist/src/core/file-lock.js +90 -128
  278. package/dist/src/core/firefox-cache.d.ts +13 -1
  279. package/dist/src/core/firefox-cache.js +61 -36
  280. package/dist/src/core/firefox-download.d.ts +15 -0
  281. package/dist/src/core/firefox-download.js +38 -22
  282. package/dist/src/core/firefox-extract.d.ts +8 -7
  283. package/dist/src/core/firefox-extract.js +45 -27
  284. package/dist/src/core/firefox.d.ts +34 -36
  285. package/dist/src/core/firefox.js +13 -44
  286. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  287. package/dist/src/core/furnace-apply-dry-run.js +2 -8
  288. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  289. package/dist/src/core/furnace-apply-ftl.js +8 -8
  290. package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
  291. package/dist/src/core/furnace-apply-helpers.js +28 -39
  292. package/dist/src/core/furnace-apply-output.js +1 -1
  293. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  294. package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
  295. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  296. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  297. package/dist/src/core/furnace-apply.d.ts +4 -4
  298. package/dist/src/core/furnace-apply.js +50 -29
  299. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  300. package/dist/src/core/furnace-checksum-utils.js +5 -5
  301. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  302. package/dist/src/core/furnace-config-custom.js +2 -2
  303. package/dist/src/core/furnace-config-order.js +1 -1
  304. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  305. package/dist/src/core/furnace-config-tokens.js +3 -3
  306. package/dist/src/core/furnace-config-validate.js +2 -2
  307. package/dist/src/core/furnace-config.d.ts +5 -5
  308. package/dist/src/core/furnace-config.js +40 -53
  309. package/dist/src/core/furnace-constants.d.ts +6 -6
  310. package/dist/src/core/furnace-constants.js +9 -8
  311. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  312. package/dist/src/core/furnace-css-fragments.js +11 -11
  313. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  314. package/dist/src/core/furnace-dir-entry.js +21 -0
  315. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  316. package/dist/src/core/furnace-jsconfig.js +22 -20
  317. package/dist/src/core/furnace-operation.d.ts +22 -19
  318. package/dist/src/core/furnace-operation.js +38 -34
  319. package/dist/src/core/furnace-precondition.d.ts +10 -10
  320. package/dist/src/core/furnace-precondition.js +8 -8
  321. package/dist/src/core/furnace-refresh.d.ts +18 -6
  322. package/dist/src/core/furnace-refresh.js +5 -8
  323. package/dist/src/core/furnace-registration-ast.d.ts +2 -3
  324. package/dist/src/core/furnace-registration-ast.js +9 -12
  325. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  326. package/dist/src/core/furnace-registration-remove.js +6 -6
  327. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  328. package/dist/src/core/furnace-registration-validate.js +2 -2
  329. package/dist/src/core/furnace-registration.d.ts +7 -6
  330. package/dist/src/core/furnace-registration.js +29 -36
  331. package/dist/src/core/furnace-rollback.d.ts +1 -1
  332. package/dist/src/core/furnace-rollback.js +5 -5
  333. package/dist/src/core/furnace-scanner.js +3 -6
  334. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  335. package/dist/src/core/furnace-stale-export.js +16 -15
  336. package/dist/src/core/furnace-staleness.d.ts +2 -2
  337. package/dist/src/core/furnace-staleness.js +2 -2
  338. package/dist/src/core/furnace-state-persist.d.ts +12 -12
  339. package/dist/src/core/furnace-state-persist.js +10 -10
  340. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  341. package/dist/src/core/furnace-step-errors.js +6 -6
  342. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  343. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  344. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  345. package/dist/src/core/furnace-validate-registration.js +18 -20
  346. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  347. package/dist/src/core/furnace-validate-structure.js +4 -4
  348. package/dist/src/core/furnace-validate.js +9 -9
  349. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  350. package/dist/src/core/furnace-version-drift.js +5 -5
  351. package/dist/src/core/git-base.d.ts +6 -4
  352. package/dist/src/core/git-base.js +29 -7
  353. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  354. package/dist/src/core/git-diff-new-file.js +119 -0
  355. package/dist/src/core/git-diff.d.ts +13 -13
  356. package/dist/src/core/git-diff.js +121 -189
  357. package/dist/src/core/git-file-ops.d.ts +6 -13
  358. package/dist/src/core/git-file-ops.js +11 -35
  359. package/dist/src/core/git-readonly-index.d.ts +12 -14
  360. package/dist/src/core/git-readonly-index.js +12 -16
  361. package/dist/src/core/git-status.d.ts +9 -2
  362. package/dist/src/core/git-status.js +23 -11
  363. package/dist/src/core/git.d.ts +3 -9
  364. package/dist/src/core/git.js +28 -57
  365. package/dist/src/core/harness-orphans.d.ts +17 -17
  366. package/dist/src/core/harness-orphans.js +28 -27
  367. package/dist/src/core/history-log.d.ts +19 -0
  368. package/dist/src/core/history-log.js +29 -0
  369. package/dist/src/core/license-headers.d.ts +19 -18
  370. package/dist/src/core/license-headers.js +29 -28
  371. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  372. package/dist/src/core/mach-build-artifacts.js +23 -23
  373. package/dist/src/core/mach-error-hints.d.ts +5 -10
  374. package/dist/src/core/mach-error-hints.js +14 -14
  375. package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
  376. package/dist/src/core/mach-known-noise-filter.js +57 -56
  377. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  378. package/dist/src/core/mach-mozconfig.js +17 -16
  379. package/dist/src/core/mach-python.d.ts +3 -0
  380. package/dist/src/core/mach-python.js +13 -7
  381. package/dist/src/core/mach-resource-shim.d.ts +24 -12
  382. package/dist/src/core/mach-resource-shim.js +124 -21
  383. package/dist/src/core/mach.d.ts +59 -73
  384. package/dist/src/core/mach.js +47 -115
  385. package/dist/src/core/marionette-port.d.ts +15 -30
  386. package/dist/src/core/marionette-port.js +46 -89
  387. package/dist/src/core/marionette-preflight.d.ts +6 -6
  388. package/dist/src/core/marionette-preflight.js +32 -50
  389. package/dist/src/core/markdown-table.d.ts +9 -9
  390. package/dist/src/core/markdown-table.js +14 -14
  391. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  392. package/dist/src/core/mochitest-server-port.js +17 -17
  393. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  394. package/dist/src/core/module-resolution-preflight.js +11 -11
  395. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  396. package/dist/src/core/moz-manifest-helpers.js +7 -7
  397. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  398. package/dist/src/core/moz-manifest-register.js +2 -2
  399. package/dist/src/core/moz-manifest-rules.js +46 -42
  400. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  401. package/dist/src/core/ownership-table.d.ts +5 -5
  402. package/dist/src/core/ownership-table.js +7 -7
  403. package/dist/src/core/parser-fallback.d.ts +3 -3
  404. package/dist/src/core/parser-fallback.js +3 -3
  405. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  406. package/dist/src/core/patch-apply-fuzz.js +13 -13
  407. package/dist/src/core/patch-apply.d.ts +13 -14
  408. package/dist/src/core/patch-apply.js +36 -42
  409. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  410. package/dist/src/core/patch-export-coverage.js +1 -30
  411. package/dist/src/core/patch-export-update.d.ts +21 -4
  412. package/dist/src/core/patch-export-update.js +7 -6
  413. package/dist/src/core/patch-export.d.ts +20 -30
  414. package/dist/src/core/patch-export.js +55 -77
  415. package/dist/src/core/patch-files.d.ts +0 -4
  416. package/dist/src/core/patch-files.js +0 -11
  417. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  418. package/dist/src/core/patch-identifier-suggest.js +4 -4
  419. package/dist/src/core/patch-lint-binary.d.ts +12 -18
  420. package/dist/src/core/patch-lint-cache.d.ts +18 -2
  421. package/dist/src/core/patch-lint-cache.js +16 -19
  422. package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
  423. package/dist/src/core/patch-lint-checkjs.js +78 -64
  424. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  425. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  426. package/dist/src/core/patch-lint-creators.d.ts +5 -9
  427. package/dist/src/core/patch-lint-creators.js +3 -3
  428. package/dist/src/core/patch-lint-cross.d.ts +27 -19
  429. package/dist/src/core/patch-lint-cross.js +67 -110
  430. package/dist/src/core/patch-lint-css.d.ts +1 -1
  431. package/dist/src/core/patch-lint-css.js +15 -11
  432. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  433. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  434. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  435. package/dist/src/core/patch-lint-diff.js +4 -4
  436. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  437. package/dist/src/core/patch-lint-file-size.js +6 -6
  438. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  439. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  440. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  441. package/dist/src/core/patch-lint-jsdoc.js +46 -46
  442. package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
  443. package/dist/src/core/patch-lint-module-registration.js +1 -1
  444. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  445. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  446. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  447. package/dist/src/core/patch-lint-observer.js +7 -7
  448. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  449. package/dist/src/core/patch-lint-ownership.js +6 -6
  450. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  451. package/dist/src/core/patch-lint-prettier.js +7 -7
  452. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  453. package/dist/src/core/patch-lint-queue-types.js +12 -0
  454. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  455. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  456. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  457. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  458. package/dist/src/core/patch-lint.d.ts +41 -35
  459. package/dist/src/core/patch-lint.js +52 -49
  460. package/dist/src/core/patch-lock.d.ts +1 -1
  461. package/dist/src/core/patch-lock.js +11 -11
  462. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  463. package/dist/src/core/patch-manifest-consistency.js +16 -17
  464. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  465. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  466. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  467. package/dist/src/core/patch-manifest-io.js +35 -34
  468. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  469. package/dist/src/core/patch-manifest-query.js +4 -4
  470. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  471. package/dist/src/core/patch-manifest-resolve.js +7 -7
  472. package/dist/src/core/patch-manifest-validate.js +3 -3
  473. package/dist/src/core/patch-manifest.d.ts +2 -2
  474. package/dist/src/core/patch-manifest.js +2 -2
  475. package/dist/src/core/patch-parse.d.ts +32 -21
  476. package/dist/src/core/patch-parse.js +40 -15
  477. package/dist/src/core/patch-policy.js +15 -27
  478. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  479. package/dist/src/core/patch-registration-refs.js +7 -7
  480. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  481. package/dist/src/core/patch-source-metadata.js +0 -4
  482. package/dist/src/core/patch-transform.d.ts +8 -16
  483. package/dist/src/core/patch-transform.js +13 -23
  484. package/dist/src/core/process-cpu-time.d.ts +1 -1
  485. package/dist/src/core/process-cpu-time.js +6 -6
  486. package/dist/src/core/rebase-session.d.ts +9 -15
  487. package/dist/src/core/rebase-session.js +13 -25
  488. package/dist/src/core/register-browser-content.js +3 -2
  489. package/dist/src/core/register-browser-test.js +2 -1
  490. package/dist/src/core/register-module.js +2 -1
  491. package/dist/src/core/register-result.d.ts +1 -1
  492. package/dist/src/core/register-result.js +1 -1
  493. package/dist/src/core/register-scaffold.d.ts +2 -2
  494. package/dist/src/core/register-scaffold.js +8 -7
  495. package/dist/src/core/register-shared-css.d.ts +3 -3
  496. package/dist/src/core/register-shared-css.js +6 -5
  497. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  498. package/dist/src/core/register-xpcshell-test.js +2 -2
  499. package/dist/src/core/run-log-redact.d.ts +38 -0
  500. package/dist/src/core/run-log-redact.js +69 -0
  501. package/dist/src/core/run-log.d.ts +21 -10
  502. package/dist/src/core/run-log.js +76 -27
  503. package/dist/src/core/shared-ftl.d.ts +2 -2
  504. package/dist/src/core/shared-ftl.js +6 -6
  505. package/dist/src/core/signal-critical.d.ts +2 -2
  506. package/dist/src/core/signal-critical.js +4 -6
  507. package/dist/src/core/smoke-patterns.d.ts +5 -6
  508. package/dist/src/core/smoke-patterns.js +15 -20
  509. package/dist/src/core/state-file.d.ts +15 -4
  510. package/dist/src/core/state-file.js +14 -1
  511. package/dist/src/core/status-binary.d.ts +8 -8
  512. package/dist/src/core/status-binary.js +12 -12
  513. package/dist/src/core/status-classify.d.ts +17 -17
  514. package/dist/src/core/status-classify.js +13 -12
  515. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  516. package/dist/src/core/test-changed-prefs.js +40 -25
  517. package/dist/src/core/test-harness-crash.d.ts +39 -39
  518. package/dist/src/core/test-harness-crash.js +69 -69
  519. package/dist/src/core/test-harness-output.d.ts +7 -7
  520. package/dist/src/core/test-harness-output.js +7 -7
  521. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  522. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  523. package/dist/src/core/test-path-scope.d.ts +8 -8
  524. package/dist/src/core/test-path-scope.js +11 -11
  525. package/dist/src/core/test-stale-check.d.ts +22 -23
  526. package/dist/src/core/test-stale-check.js +31 -30
  527. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  528. package/dist/src/core/test-stale-symlink.js +1 -1
  529. package/dist/src/core/test-stall-triage.d.ts +9 -9
  530. package/dist/src/core/test-stall-triage.js +22 -22
  531. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  532. package/dist/src/core/test-xpcshell-retry.js +14 -11
  533. package/dist/src/core/token-category.d.ts +35 -2
  534. package/dist/src/core/token-category.js +67 -58
  535. package/dist/src/core/token-coverage.js +4 -5
  536. package/dist/src/core/token-dark-mode.d.ts +9 -9
  537. package/dist/src/core/token-dark-mode.js +13 -25
  538. package/dist/src/core/token-docs.d.ts +1 -1
  539. package/dist/src/core/token-inventory.d.ts +56 -0
  540. package/dist/src/core/token-inventory.js +109 -0
  541. package/dist/src/core/token-manager.d.ts +4 -4
  542. package/dist/src/core/token-manager.js +22 -22
  543. package/dist/src/core/token-scaffold.d.ts +4 -4
  544. package/dist/src/core/token-scaffold.js +4 -4
  545. package/dist/src/core/token-variant.d.ts +14 -14
  546. package/dist/src/core/token-variant.js +52 -53
  547. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  548. package/dist/src/core/toolchain-preflight.js +23 -23
  549. package/dist/src/core/tree-cow.d.ts +3 -5
  550. package/dist/src/core/tree-cow.js +8 -8
  551. package/dist/src/core/tree-guard.d.ts +3 -3
  552. package/dist/src/core/tree-guard.js +23 -23
  553. package/dist/src/core/tree-store.d.ts +15 -15
  554. package/dist/src/core/tree-store.js +39 -38
  555. package/dist/src/core/typecheck-shim.d.ts +16 -15
  556. package/dist/src/core/typecheck-shim.js +26 -25
  557. package/dist/src/core/typecheck.d.ts +12 -12
  558. package/dist/src/core/typecheck.js +33 -33
  559. package/dist/src/core/wire-destroy.d.ts +2 -2
  560. package/dist/src/core/wire-destroy.js +5 -5
  561. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  562. package/dist/src/core/wire-dom-fragment.js +12 -23
  563. package/dist/src/core/wire-init.d.ts +2 -2
  564. package/dist/src/core/wire-init.js +7 -7
  565. package/dist/src/core/wire-subscript.d.ts +1 -1
  566. package/dist/src/core/wire-subscript.js +3 -3
  567. package/dist/src/core/wire-utils.d.ts +9 -9
  568. package/dist/src/core/wire-utils.js +16 -28
  569. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  570. package/dist/src/core/xpcshell-appdir.js +28 -30
  571. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  572. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  573. package/dist/src/errors/base.d.ts +69 -16
  574. package/dist/src/errors/base.js +95 -26
  575. package/dist/src/errors/build.d.ts +6 -6
  576. package/dist/src/errors/build.js +26 -34
  577. package/dist/src/errors/codes.d.ts +10 -10
  578. package/dist/src/errors/codes.js +10 -10
  579. package/dist/src/errors/config.d.ts +0 -14
  580. package/dist/src/errors/config.js +13 -34
  581. package/dist/src/errors/download.d.ts +13 -0
  582. package/dist/src/errors/download.js +53 -24
  583. package/dist/src/errors/furnace.d.ts +2 -2
  584. package/dist/src/errors/furnace.js +8 -9
  585. package/dist/src/errors/git.d.ts +9 -9
  586. package/dist/src/errors/git.js +21 -31
  587. package/dist/src/errors/patch.d.ts +3 -3
  588. package/dist/src/errors/patch.js +11 -13
  589. package/dist/src/errors/rebase.d.ts +1 -1
  590. package/dist/src/errors/rebase.js +8 -8
  591. package/dist/src/errors/run.d.ts +1 -1
  592. package/dist/src/errors/run.js +1 -1
  593. package/dist/src/index.d.ts +4 -4
  594. package/dist/src/index.js +4 -4
  595. package/dist/src/types/commands/options.d.ts +155 -200
  596. package/dist/src/types/commands/patches.d.ts +19 -19
  597. package/dist/src/types/commands/project.d.ts +3 -3
  598. package/dist/src/types/config.d.ts +52 -19
  599. package/dist/src/types/furnace.d.ts +17 -17
  600. package/dist/src/types/index.d.ts +0 -1
  601. package/dist/src/types/json.d.ts +3 -3
  602. package/dist/src/types/json.js +2 -2
  603. package/dist/src/types/typecheck.d.ts +3 -3
  604. package/dist/src/utils/assert.d.ts +4 -16
  605. package/dist/src/utils/assert.js +7 -24
  606. package/dist/src/utils/build-info.d.ts +6 -6
  607. package/dist/src/utils/build-info.js +6 -6
  608. package/dist/src/utils/child-env.d.ts +7 -6
  609. package/dist/src/utils/child-env.js +5 -5
  610. package/dist/src/utils/concurrency.d.ts +2 -2
  611. package/dist/src/utils/concurrency.js +2 -2
  612. package/dist/src/utils/elapsed.js +10 -1
  613. package/dist/src/utils/errors.d.ts +8 -8
  614. package/dist/src/utils/errors.js +8 -8
  615. package/dist/src/utils/fs.d.ts +1 -1
  616. package/dist/src/utils/fs.js +15 -20
  617. package/dist/src/utils/hash.d.ts +12 -0
  618. package/dist/src/utils/hash.js +16 -0
  619. package/dist/src/utils/line-dispatch.d.ts +15 -0
  620. package/dist/src/utils/line-dispatch.js +48 -0
  621. package/dist/src/utils/logger.d.ts +4 -4
  622. package/dist/src/utils/logger.js +11 -11
  623. package/dist/src/utils/machine-output.js +2 -2
  624. package/dist/src/utils/options.d.ts +14 -20
  625. package/dist/src/utils/options.js +26 -27
  626. package/dist/src/utils/package-root.js +5 -14
  627. package/dist/src/utils/paths.d.ts +4 -4
  628. package/dist/src/utils/paths.js +4 -4
  629. package/dist/src/utils/platform.d.ts +0 -4
  630. package/dist/src/utils/process-group.d.ts +10 -9
  631. package/dist/src/utils/process-group.js +37 -36
  632. package/dist/src/utils/process.d.ts +70 -55
  633. package/dist/src/utils/process.js +129 -179
  634. package/dist/src/utils/ps-duration.d.ts +4 -4
  635. package/dist/src/utils/ps-duration.js +9 -9
  636. package/dist/src/utils/regex.d.ts +4 -4
  637. package/dist/src/utils/regex.js +7 -7
  638. package/dist/src/utils/sleep.d.ts +26 -0
  639. package/dist/src/utils/sleep.js +31 -0
  640. package/dist/src/utils/stdio-drain.d.ts +7 -7
  641. package/dist/src/utils/stdio-drain.js +8 -8
  642. package/dist/src/utils/validation.d.ts +12 -49
  643. package/dist/src/utils/validation.js +26 -36
  644. package/docs/README.md +2 -2
  645. package/docs/configuration.md +163 -69
  646. package/docs/exit-codes.md +66 -49
  647. package/docs/furnace.md +20 -19
  648. package/docs/lifecycle-invariants.md +414 -247
  649. package/docs/machine-output.md +58 -34
  650. package/docs/patch-workflow.md +48 -44
  651. package/docs/run-logs.md +72 -28
  652. package/docs/testing.md +105 -98
  653. package/docs/verification-trees.md +23 -22
  654. package/package.json +7 -6
  655. package/dist/src/commands/rebase.d.ts +0 -4
  656. package/dist/src/commands/rebase.js +0 -5
  657. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  658. package/dist/src/core/patch-artifact-normalize.js +0 -24
  659. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  660. package/dist/src/core/patch-lint-reexports.js +0 -8
  661. package/dist/src/core/wire-targets.d.ts +0 -7
  662. package/dist/src/core/wire-targets.js +0 -8
@@ -19,6 +19,20 @@ export declare abstract class FireForgeError extends Error {
19
19
  */
20
20
  get userMessage(): string;
21
21
  }
22
+ /**
23
+ * Renders the trailing "To fix this:" block shared by every FireForge error
24
+ * that offers remedies.
25
+ *
26
+ * Numbering is derived from the array rather than written into each string.
27
+ * Several classes vary their advice by context (`FurnaceError` drops the
28
+ * validate step, `ChecksumMismatchError` adds a Developer Edition note), and
29
+ * hand-numbered branches had to renumber every later step by hand, one
30
+ * conditional away from printing "2." twice.
31
+ *
32
+ * @param steps - The remedy lines, in order, without their numbers
33
+ * @returns The block, starting with the blank-line separator
34
+ */
35
+ export declare function remedies(steps: readonly string[]): string;
22
36
  /**
23
37
  * General error for unexpected failures.
24
38
  */
@@ -26,7 +40,26 @@ export declare class GeneralError extends FireForgeError {
26
40
  readonly code: 1;
27
41
  }
28
42
  /**
29
- * Raised when one of FireForge's own internal invariants did not hold —
43
+ * A `fireforge test` preflight gate that refused before any harness ran.
44
+ *
45
+ * Exists to carry a `note`, not to change behaviour: it keeps
46
+ * {@link ExitCode.GENERAL_ERROR}, so `docs/exit-codes.md` and every CI
47
+ * consumer keying on the exit status are untouched. The note is a stable
48
+ * kebab-case refusal class that the `FIREFORGE-VERDICT:` line reports as an
49
+ * additive `note=` key. Without it every preflight refusal reached an
50
+ * unattended reader as the single token `reason=preflight`, which covers
51
+ * everything from a missing build to a peer's packaging record, so the one
52
+ * line that survives a truncating pipe could not say which gate fired.
53
+ */
54
+ export declare class PreflightRefusalError extends GeneralError {
55
+ /** Stable refusal class, e.g. `stale-browser`. */
56
+ readonly note: string;
57
+ constructor(message: string,
58
+ /** Stable refusal class, e.g. `stale-browser`. */
59
+ note: string);
60
+ }
61
+ /**
62
+ * Raised when one of FireForge's own internal invariants did not hold:
30
63
  * the failure of a runtime assertion from `src/utils/assert.ts`.
31
64
  *
32
65
  * Dedicated subclass (rather than raw GeneralError) because an invariant
@@ -35,12 +68,12 @@ export declare class GeneralError extends FireForgeError {
35
68
  * fix. That difference is worth carrying all the way to the exit status
36
69
  * (see {@link ExitCode.INTERNAL_ERROR}) so a CI job can escalate it
37
70
  * instead of retrying it, and it is the one error class the CLI boundary
38
- * prints a stack trace for — the stack is the report.
71
+ * prints a stack trace for, since the stack is the report.
39
72
  *
40
73
  * Assertions exist so that a violated invariant stops the run at the
41
74
  * first inconsistency instead of continuing to write. In the mutating
42
75
  * paths that means the surrounding rollback journal restores the engine
43
- * before this reaches the operator; see `docs/lifecycle-invariants.md`.
76
+ * before this reaches the operator. See `docs/lifecycle-invariants.md`.
44
77
  */
45
78
  export declare class InternalInvariantError extends FireForgeError {
46
79
  readonly code: 11;
@@ -48,7 +81,7 @@ export declare class InternalInvariantError extends FireForgeError {
48
81
  }
49
82
  /**
50
83
  * Raised when a legacy regex/brace-depth fallback parser decides it
51
- * cannot safely perform its mutation — e.g. because a block it expected
84
+ * cannot safely perform its mutation, e.g. because a block it expected
52
85
  * to walk never closes, because the inserted result fails a round-trip
53
86
  * brace balance check, or because an expected pattern is missing.
54
87
  *
@@ -80,9 +113,10 @@ export declare class InvalidArgumentError extends FireForgeError {
80
113
  *
81
114
  * Every `exec*` helper in `src/utils/process.ts` rejects with this type
82
115
  * instead of Node's bare `AbortError: The operation was aborted`, which
83
- * carries no command name, no elapsed time, and no hint that a timeout —
84
- * not the command — was responsible. See {@link GitIndexingTimeoutError} in
85
- * errors/git.ts for the git-specific variant.
116
+ * carries no command name, no elapsed time, and no hint that a timeout
117
+ * (rather than the command) was responsible. See
118
+ * {@link GitIndexingTimeoutError} in errors/git.ts for the git-specific
119
+ * variant.
86
120
  */
87
121
  export declare class ExecTimeoutError extends FireForgeError {
88
122
  /** Executable that was spawned (argv[0]). */
@@ -92,14 +126,33 @@ export declare class ExecTimeoutError extends FireForgeError {
92
126
  /** Timeout that elapsed, in milliseconds. */
93
127
  readonly timeoutMs: number;
94
128
  readonly code: 1;
129
+ /** Standard output captured before the deadline fired (empty when the exec path does not capture). */
130
+ readonly stdout: string;
131
+ /** Standard error captured before the deadline fired (empty when the exec path does not capture). */
132
+ readonly stderr: string;
133
+ /** True when either captured stream was cut off at the exec layer's collector cap. */
134
+ readonly outputTruncated: boolean;
95
135
  constructor(
96
136
  /** Executable that was spawned (argv[0]). */
97
137
  command: string,
98
138
  /** Arguments the executable was spawned with. */
99
139
  args: readonly string[],
100
140
  /** Timeout that elapsed, in milliseconds. */
101
- timeoutMs: number, cause?: unknown);
141
+ timeoutMs: number, cause?: unknown, output?: ExecTimeoutOutput);
102
142
  get userMessage(): string;
143
+ /**
144
+ * The last few lines the command printed before it was killed, so an
145
+ * operator can see what it was doing (a `git add -A` stuck on one path,
146
+ * a build step that hung) instead of a bare budget number. It prefers
147
+ * stderr and falls back to stdout when stderr is silent.
148
+ */
149
+ private outputTailForUser;
150
+ }
151
+ /** Output captured before an exec timeout fired. See {@link ExecTimeoutError}. */
152
+ export interface ExecTimeoutOutput {
153
+ stdout: string;
154
+ stderr: string;
155
+ truncated: boolean;
103
156
  }
104
157
  /**
105
158
  * Error thrown when a file-lock wait times out because another process holds
@@ -108,12 +161,12 @@ export declare class ExecTimeoutError extends FireForgeError {
108
161
  * Dedicated subclass so the CLI boundary renders lock contention as the
109
162
  * one-line reason-first/remedy-second refusal it is. As a plain `Error` it
110
163
  * is treated by `withErrorHandling` as an internal failure and printed with
111
- * a five-frame stack — a correct refusal that looks like a crash.
164
+ * a five-frame stack: a correct refusal that looks like a crash.
112
165
  *
113
166
  * Exit code 15, not 1: the run never started. A script that retries on
114
167
  * failure wants to re-queue this one, not treat it as a failure of the work
115
168
  * it asked for. Every lock in FireForge shares the class and therefore the
116
- * code — the fact is the same whichever lock was contended.
169
+ * code, because the fact is the same whichever lock was contended.
117
170
  */
118
171
  export declare class LockContentionError extends FireForgeError {
119
172
  readonly code: 15;
@@ -125,19 +178,19 @@ export declare class LockContentionError extends FireForgeError {
125
178
  *
126
179
  * Dedicated subclass for its exit code alone: as a `GeneralError` this
127
180
  * refusal exited 1 beside real test failures' 5, and a summary line reading
128
- * `FAIL — exit 1` next to `FAIL — exit 5` invites treating them as the same
129
- * kind of fact. They are opposites — one suite failed, the other's result
130
- * was discarded — and only a distinct code makes "unknown, re-run"
181
+ * `FAIL, exit 1` next to `FAIL, exit 5` invites treating them as the same
182
+ * kind of fact. They are opposites (one suite failed, the other's result
183
+ * was discarded) and only a distinct code makes "unknown, re-run"
131
184
  * mechanically separable from "red".
132
185
  */
133
186
  export declare class InconclusiveVerdictError extends FireForgeError {
134
187
  readonly code: 14;
135
188
  }
136
189
  /**
137
- * Error thrown when the user INTERRUPTS an interactive prompt — Esc or
190
+ * Error thrown when the user interrupts an interactive prompt: Esc or
138
191
  * Ctrl+C, i.e. `isCancel(...)`.
139
192
  *
140
- * Not for a prompt the operator deliberately answered "no" to: 130 is
193
+ * Not for a prompt the operator answered "no" to: 130 is
141
194
  * 128+SIGINT, which claims an interrupt. A declined confirmation is a
142
195
  * successful run that chose not to proceed, and exits 0.
143
196
  */
@@ -156,7 +209,7 @@ export declare class ResolutionError extends FireForgeError {
156
209
  * without calling process.exit() from shared library code.
157
210
  *
158
211
  * The user-visible error message has already been logged by the time this
159
- * is thrown — the entrypoint only needs to read `.exitCode` and terminate.
212
+ * is thrown. The entrypoint only needs to read `.exitCode` and terminate.
160
213
  */
161
214
  export declare class CommandError extends Error {
162
215
  readonly exitCode: ExitCode;
@@ -17,10 +17,11 @@ export class FireForgeError extends Error {
17
17
  if (cause !== undefined) {
18
18
  this.cause = cause;
19
19
  }
20
- // Maintains proper stack trace in V8 environments
21
- if (typeof Error.captureStackTrace === 'function') {
22
- Error.captureStackTrace(this, this.constructor);
23
- }
20
+ // Trims the constructor frames off the stack. `engines` pins Node >= 22,
21
+ // so the V8-only `captureStackTrace` is always present. The former
22
+ // `typeof === 'function'` guard was an unreachable branch that coverage
23
+ // could never close.
24
+ Error.captureStackTrace(this, this.constructor);
24
25
  }
25
26
  /**
26
27
  * User-friendly error message with context and suggested fixes.
@@ -30,6 +31,22 @@ export class FireForgeError extends Error {
30
31
  return this.message;
31
32
  }
32
33
  }
34
+ /**
35
+ * Renders the trailing "To fix this:" block shared by every FireForge error
36
+ * that offers remedies.
37
+ *
38
+ * Numbering is derived from the array rather than written into each string.
39
+ * Several classes vary their advice by context (`FurnaceError` drops the
40
+ * validate step, `ChecksumMismatchError` adds a Developer Edition note), and
41
+ * hand-numbered branches had to renumber every later step by hand, one
42
+ * conditional away from printing "2." twice.
43
+ *
44
+ * @param steps - The remedy lines, in order, without their numbers
45
+ * @returns The block, starting with the blank-line separator
46
+ */
47
+ export function remedies(steps) {
48
+ return `\n\nTo fix this:\n${steps.map((step, index) => ` ${index + 1}. ${step}`).join('\n')}`;
49
+ }
33
50
  /**
34
51
  * General error for unexpected failures.
35
52
  */
@@ -37,7 +54,28 @@ export class GeneralError extends FireForgeError {
37
54
  code = ExitCode.GENERAL_ERROR;
38
55
  }
39
56
  /**
40
- * Raised when one of FireForge's own internal invariants did not hold —
57
+ * A `fireforge test` preflight gate that refused before any harness ran.
58
+ *
59
+ * Exists to carry a `note`, not to change behaviour: it keeps
60
+ * {@link ExitCode.GENERAL_ERROR}, so `docs/exit-codes.md` and every CI
61
+ * consumer keying on the exit status are untouched. The note is a stable
62
+ * kebab-case refusal class that the `FIREFORGE-VERDICT:` line reports as an
63
+ * additive `note=` key. Without it every preflight refusal reached an
64
+ * unattended reader as the single token `reason=preflight`, which covers
65
+ * everything from a missing build to a peer's packaging record, so the one
66
+ * line that survives a truncating pipe could not say which gate fired.
67
+ */
68
+ export class PreflightRefusalError extends GeneralError {
69
+ note;
70
+ constructor(message,
71
+ /** Stable refusal class, e.g. `stale-browser`. */
72
+ note) {
73
+ super(message);
74
+ this.note = note;
75
+ }
76
+ }
77
+ /**
78
+ * Raised when one of FireForge's own internal invariants did not hold:
41
79
  * the failure of a runtime assertion from `src/utils/assert.ts`.
42
80
  *
43
81
  * Dedicated subclass (rather than raw GeneralError) because an invariant
@@ -46,12 +84,12 @@ export class GeneralError extends FireForgeError {
46
84
  * fix. That difference is worth carrying all the way to the exit status
47
85
  * (see {@link ExitCode.INTERNAL_ERROR}) so a CI job can escalate it
48
86
  * instead of retrying it, and it is the one error class the CLI boundary
49
- * prints a stack trace for — the stack is the report.
87
+ * prints a stack trace for, since the stack is the report.
50
88
  *
51
89
  * Assertions exist so that a violated invariant stops the run at the
52
90
  * first inconsistency instead of continuing to write. In the mutating
53
91
  * paths that means the surrounding rollback journal restores the engine
54
- * before this reaches the operator; see `docs/lifecycle-invariants.md`.
92
+ * before this reaches the operator. See `docs/lifecycle-invariants.md`.
55
93
  */
56
94
  export class InternalInvariantError extends FireForgeError {
57
95
  code = ExitCode.INTERNAL_ERROR;
@@ -69,7 +107,7 @@ export class InternalInvariantError extends FireForgeError {
69
107
  }
70
108
  /**
71
109
  * Raised when a legacy regex/brace-depth fallback parser decides it
72
- * cannot safely perform its mutation — e.g. because a block it expected
110
+ * cannot safely perform its mutation, e.g. because a block it expected
73
111
  * to walk never closes, because the inserted result fails a round-trip
74
112
  * brace balance check, or because an expected pattern is missing.
75
113
  *
@@ -102,11 +140,9 @@ export class InvalidArgumentError extends FireForgeError {
102
140
  this.argument = argument;
103
141
  }
104
142
  get userMessage() {
105
- let msg = `Invalid Argument: ${this.message}`;
106
- if (this.argument) {
107
- msg += `\n\nArgument: ${this.argument}`;
108
- }
109
- return msg;
143
+ return this.argument
144
+ ? `Invalid Argument: ${this.message}\n\nArgument: ${this.argument}`
145
+ : `Invalid Argument: ${this.message}`;
110
146
  }
111
147
  }
112
148
  /**
@@ -114,33 +150,66 @@ export class InvalidArgumentError extends FireForgeError {
114
150
  *
115
151
  * Every `exec*` helper in `src/utils/process.ts` rejects with this type
116
152
  * instead of Node's bare `AbortError: The operation was aborted`, which
117
- * carries no command name, no elapsed time, and no hint that a timeout —
118
- * not the command — was responsible. See {@link GitIndexingTimeoutError} in
119
- * errors/git.ts for the git-specific variant.
153
+ * carries no command name, no elapsed time, and no hint that a timeout
154
+ * (rather than the command) was responsible. See
155
+ * {@link GitIndexingTimeoutError} in errors/git.ts for the git-specific
156
+ * variant.
120
157
  */
121
158
  export class ExecTimeoutError extends FireForgeError {
122
159
  command;
123
160
  args;
124
161
  timeoutMs;
125
162
  code = ExitCode.GENERAL_ERROR;
163
+ /** Standard output captured before the deadline fired (empty when the exec path does not capture). */
164
+ stdout;
165
+ /** Standard error captured before the deadline fired (empty when the exec path does not capture). */
166
+ stderr;
167
+ /** True when either captured stream was cut off at the exec layer's collector cap. */
168
+ outputTruncated;
126
169
  constructor(
127
170
  /** Executable that was spawned (argv[0]). */
128
171
  command,
129
172
  /** Arguments the executable was spawned with. */
130
173
  args,
131
174
  /** Timeout that elapsed, in milliseconds. */
132
- timeoutMs, cause) {
175
+ timeoutMs, cause, output) {
133
176
  super(`Command timed out after ${Math.round(timeoutMs / 1000)}s: ${[command, ...args].join(' ')}`, cause);
134
177
  this.command = command;
135
178
  this.args = args;
136
179
  this.timeoutMs = timeoutMs;
180
+ this.stdout = output?.stdout ?? '';
181
+ this.stderr = output?.stderr ?? '';
182
+ this.outputTruncated = output?.truncated ?? false;
137
183
  }
138
184
  get userMessage() {
139
185
  return (`${this.message}\n\n` +
140
186
  'The command was killed because it exceeded its time budget, not because it failed on its own. ' +
141
- 'If the host is just slow or loaded, re-running may succeed.');
187
+ 'If the host is just slow or loaded, re-running may succeed.' +
188
+ this.outputTailForUser());
189
+ }
190
+ /**
191
+ * The last few lines the command printed before it was killed, so an
192
+ * operator can see what it was doing (a `git add -A` stuck on one path,
193
+ * a build step that hung) instead of a bare budget number. It prefers
194
+ * stderr and falls back to stdout when stderr is silent.
195
+ */
196
+ outputTailForUser() {
197
+ const source = this.stderr.trim().length > 0 ? this.stderr : this.stdout;
198
+ const lines = source
199
+ .trimEnd()
200
+ .split(/\r?\n/)
201
+ .filter((line) => line.length > 0);
202
+ if (lines.length === 0)
203
+ return '';
204
+ const tail = lines.slice(-EXEC_TIMEOUT_TAIL_LINES);
205
+ const label = this.stderr.trim().length > 0 ? 'stderr' : 'stdout';
206
+ const omitted = lines.length > tail.length ? ` (last ${tail.length} of ${lines.length} lines)` : '';
207
+ const truncatedNote = this.outputTruncated ? ' [captured output was truncated]' : '';
208
+ return `\n\nOutput before the timeout (${label}${omitted})${truncatedNote}:\n${tail.map((line) => ` ${line}`).join('\n')}`;
142
209
  }
143
210
  }
211
+ /** How many trailing output lines {@link ExecTimeoutError.userMessage} shows. */
212
+ const EXEC_TIMEOUT_TAIL_LINES = 20;
144
213
  /**
145
214
  * Error thrown when a file-lock wait times out because another process holds
146
215
  * the lock.
@@ -148,12 +217,12 @@ export class ExecTimeoutError extends FireForgeError {
148
217
  * Dedicated subclass so the CLI boundary renders lock contention as the
149
218
  * one-line reason-first/remedy-second refusal it is. As a plain `Error` it
150
219
  * is treated by `withErrorHandling` as an internal failure and printed with
151
- * a five-frame stack — a correct refusal that looks like a crash.
220
+ * a five-frame stack: a correct refusal that looks like a crash.
152
221
  *
153
222
  * Exit code 15, not 1: the run never started. A script that retries on
154
223
  * failure wants to re-queue this one, not treat it as a failure of the work
155
224
  * it asked for. Every lock in FireForge shares the class and therefore the
156
- * code — the fact is the same whichever lock was contended.
225
+ * code, because the fact is the same whichever lock was contended.
157
226
  */
158
227
  export class LockContentionError extends FireForgeError {
159
228
  code = ExitCode.LOCK_TIMEOUT;
@@ -165,19 +234,19 @@ export class LockContentionError extends FireForgeError {
165
234
  *
166
235
  * Dedicated subclass for its exit code alone: as a `GeneralError` this
167
236
  * refusal exited 1 beside real test failures' 5, and a summary line reading
168
- * `FAIL — exit 1` next to `FAIL — exit 5` invites treating them as the same
169
- * kind of fact. They are opposites — one suite failed, the other's result
170
- * was discarded — and only a distinct code makes "unknown, re-run"
237
+ * `FAIL, exit 1` next to `FAIL, exit 5` invites treating them as the same
238
+ * kind of fact. They are opposites (one suite failed, the other's result
239
+ * was discarded) and only a distinct code makes "unknown, re-run"
171
240
  * mechanically separable from "red".
172
241
  */
173
242
  export class InconclusiveVerdictError extends FireForgeError {
174
243
  code = ExitCode.INCONCLUSIVE;
175
244
  }
176
245
  /**
177
- * Error thrown when the user INTERRUPTS an interactive prompt — Esc or
246
+ * Error thrown when the user interrupts an interactive prompt: Esc or
178
247
  * Ctrl+C, i.e. `isCancel(...)`.
179
248
  *
180
- * Not for a prompt the operator deliberately answered "no" to: 130 is
249
+ * Not for a prompt the operator answered "no" to: 130 is
181
250
  * 128+SIGINT, which claims an interrupt. A declined confirmation is a
182
251
  * successful run that chose not to proceed, and exits 0.
183
252
  */
@@ -198,7 +267,7 @@ export class ResolutionError extends FireForgeError {
198
267
  * without calling process.exit() from shared library code.
199
268
  *
200
269
  * The user-visible error message has already been logged by the time this
201
- * is thrown — the entrypoint only needs to read `.exitCode` and terminate.
270
+ * is thrown. The entrypoint only needs to read `.exitCode` and terminate.
202
271
  */
203
272
  export class CommandError extends Error {
204
273
  exitCode;
@@ -10,19 +10,19 @@ export declare class BuildError extends FireForgeError {
10
10
  get userMessage(): string;
11
11
  }
12
12
  /**
13
- * A test SUITE went red — assertions failed, or sharded runs did not all
14
- * pass. Distinct from its {@link BuildError} parent only in what it TELLS
15
- * the operator, deliberately not in its exit code: `docs/exit-codes.md`
13
+ * A test suite went red: assertions failed, or sharded runs did not all
14
+ * pass. Distinct from its {@link BuildError} parent only in what it tells
15
+ * the operator, and not in its exit code: `docs/exit-codes.md`
16
16
  * documents 5 as "a suite that FAILED", and consumers key CI on it.
17
17
  *
18
- * The parent's remedies are all build remedies — "check the build output",
19
- * "fireforge bootstrap", "delete obj-* directories" — and none of them apply
18
+ * The parent's remedies are all build remedies ("check the build output",
19
+ * "fireforge bootstrap", "delete obj-* directories") and none of them apply
20
20
  * to a failing assertion. Worse, the first points at the wrong half of the
21
21
  * log, which is exactly the half a `tail` keeps. Ground truth for a test red
22
22
  * is the harness's own output, so the remedies here name the failing tests,
23
23
  * the `FIREFORGE-VERDICT:` line, and the run log that survives a pipe.
24
24
  *
25
- * Note that `machineErrorCode` derives the `--json` error code from the class
25
+ * `machineErrorCode` derives the `--json` error code from the class
26
26
  * name, so this reports as `test-failure` rather than `build`.
27
27
  */
28
28
  export declare class TestFailureError extends BuildError {
@@ -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,31 +12,29 @@ 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
+ ]));
24
22
  }
25
23
  }
26
24
  /**
27
- * A test SUITE went red — assertions failed, or sharded runs did not all
28
- * pass. Distinct from its {@link BuildError} parent only in what it TELLS
29
- * the operator, deliberately not in its exit code: `docs/exit-codes.md`
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, and not in its exit code: `docs/exit-codes.md`
30
28
  * documents 5 as "a suite that FAILED", and consumers key CI on it.
31
29
  *
32
- * The parent's remedies are all build remedies — "check the build output",
33
- * "fireforge bootstrap", "delete obj-* directories" — and none of them apply
30
+ * The parent's remedies are all build remedies ("check the build output",
31
+ * "fireforge bootstrap", "delete obj-* directories") and none of them apply
34
32
  * to a failing assertion. Worse, the first points at the wrong half of the
35
33
  * log, which is exactly the half a `tail` keeps. Ground truth for a test red
36
34
  * is the harness's own output, so the remedies here name the failing tests,
37
35
  * the `FIREFORGE-VERDICT:` line, and the run log that survives a pipe.
38
36
  *
39
- * Note that `machineErrorCode` derives the `--json` error code from the class
37
+ * `machineErrorCode` derives the `--json` error code from the class
40
38
  * name, so this reports as `test-failure` rather than `build`.
41
39
  */
42
40
  export class TestFailureError extends BuildError {
@@ -52,24 +50,18 @@ export class TestFailureError extends BuildError {
52
50
  this.logPath = logPath;
53
51
  }
54
52
  get userMessage() {
55
- let msg = `Test Failure: ${this.message}`;
56
- if (this.command) {
57
- msg += `\n\nCommand: ${this.command}`;
58
- }
59
- if (this.failureBlocks) {
60
- msg += `\n\n${this.failureBlocks}`;
61
- }
62
- msg += '\n\nTo fix this:\n';
63
- msg += this.failureBlocks
64
- ? ' 1. Fix the failing assertions listed above, then re-run just those test paths\n'
65
- : ' 1. Find the TEST-UNEXPECTED-FAIL lines in the output above — they name what broke\n';
66
- msg +=
67
- ' 2. Read the "FIREFORGE-VERDICT:" line for the run\'s ground truth (checks, unexpected)\n';
68
- msg +=
69
- this.logPath !== undefined
70
- ? ` 3. The complete raw output is at ${this.logPath} — it survives a piped/tailed terminal`
71
- : ' 3. Re-run without piping the output, so the failure lines are not cut off by "tail"';
72
- return msg;
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
+ ]));
73
65
  }
74
66
  }
75
67
  /**
@@ -26,7 +26,7 @@ export declare const ExitCode: {
26
26
  /** Patch conflict resolution error */
27
27
  readonly RESOLUTION_ERROR: 10;
28
28
  /**
29
- * An internal invariant did not hold — a bug in FireForge itself, not a
29
+ * An internal invariant did not hold: a bug in FireForge itself, not a
30
30
  * user or environment failure. Distinct from GENERAL_ERROR because the
31
31
  * two call for opposite responses: a GENERAL_ERROR usually means the
32
32
  * operator must change something (fix a config, free a lock, retry), and
@@ -43,30 +43,30 @@ export declare const ExitCode: {
43
43
  readonly SMOKE_EXIT_FAILURE: 12;
44
44
  /**
45
45
  * `fireforge run --smoke-exit` saw the browser exit with a non-clean
46
- * status before the smoke window elapsed — a launch-side failure that
47
- * did NOT surface as a console error line (crash before console wiring,
48
- * missing profile, etc.).
46
+ * status before the smoke window elapsed. This is a launch-side failure
47
+ * that did not surface as a console error line (crash before console
48
+ * wiring, missing profile, etc.).
49
49
  */
50
50
  readonly SMOKE_LAUNCH_FAILURE: 13;
51
51
  /**
52
- * A `fireforge test` run produced a harness result that cannot be trusted
53
- * — `engine/` moved (or became unprobeable) while the tests ran. Distinct
54
- * from BUILD_ERROR because the two are opposites: a 5 is a suite that
55
- * FAILED, a 14 is a suite whose result was THROWN AWAY. A consumer should
52
+ * A `fireforge test` run produced a harness result that cannot be
53
+ * trusted: `engine/` moved (or became unprobeable) while the tests ran.
54
+ * Distinct from BUILD_ERROR because the two are opposites: a 5 is a suite
55
+ * that failed, a 14 is a suite whose result was thrown away. A consumer should
56
56
  * re-run a 14 (after settling the writers) and must not report it as red.
57
57
  */
58
58
  readonly INCONCLUSIVE: 14;
59
59
  /**
60
60
  * A lock wait expired: the run never started, because another FireForge
61
61
  * process held the lock for the whole budget. Distinct from GENERAL_ERROR
62
- * because nothing about the request was wrong — a consumer should re-queue
62
+ * because nothing about the request was wrong. A consumer should re-queue
63
63
  * it, with a larger `--wait-lock` budget, rather than treat it as a
64
64
  * failure of the work it asked for.
65
65
  */
66
66
  readonly LOCK_TIMEOUT: 15;
67
67
  /**
68
68
  * The user cancelled an interactive prompt. 130 = 128 + SIGINT, the
69
- * conventional "interrupted by the user" code — scripts and CI can tell
69
+ * conventional "interrupted by the user" code, so scripts and CI can tell
70
70
  * a deliberate cancellation apart from a real failure (GENERAL_ERROR).
71
71
  */
72
72
  readonly USER_CANCELLED: 130;
@@ -27,7 +27,7 @@ export const ExitCode = {
27
27
  /** Patch conflict resolution error */
28
28
  RESOLUTION_ERROR: 10,
29
29
  /**
30
- * An internal invariant did not hold — a bug in FireForge itself, not a
30
+ * An internal invariant did not hold: a bug in FireForge itself, not a
31
31
  * user or environment failure. Distinct from GENERAL_ERROR because the
32
32
  * two call for opposite responses: a GENERAL_ERROR usually means the
33
33
  * operator must change something (fix a config, free a lock, retry), and
@@ -44,30 +44,30 @@ export const ExitCode = {
44
44
  SMOKE_EXIT_FAILURE: 12,
45
45
  /**
46
46
  * `fireforge run --smoke-exit` saw the browser exit with a non-clean
47
- * status before the smoke window elapsed — a launch-side failure that
48
- * did NOT surface as a console error line (crash before console wiring,
49
- * missing profile, etc.).
47
+ * status before the smoke window elapsed. This is a launch-side failure
48
+ * that did not surface as a console error line (crash before console
49
+ * wiring, missing profile, etc.).
50
50
  */
51
51
  SMOKE_LAUNCH_FAILURE: 13,
52
52
  /**
53
- * A `fireforge test` run produced a harness result that cannot be trusted
54
- * — `engine/` moved (or became unprobeable) while the tests ran. Distinct
55
- * from BUILD_ERROR because the two are opposites: a 5 is a suite that
56
- * FAILED, a 14 is a suite whose result was THROWN AWAY. A consumer should
53
+ * A `fireforge test` run produced a harness result that cannot be
54
+ * trusted: `engine/` moved (or became unprobeable) while the tests ran.
55
+ * Distinct from BUILD_ERROR because the two are opposites: a 5 is a suite
56
+ * that failed, a 14 is a suite whose result was thrown away. A consumer should
57
57
  * re-run a 14 (after settling the writers) and must not report it as red.
58
58
  */
59
59
  INCONCLUSIVE: 14,
60
60
  /**
61
61
  * A lock wait expired: the run never started, because another FireForge
62
62
  * process held the lock for the whole budget. Distinct from GENERAL_ERROR
63
- * because nothing about the request was wrong — a consumer should re-queue
63
+ * because nothing about the request was wrong. A consumer should re-queue
64
64
  * it, with a larger `--wait-lock` budget, rather than treat it as a
65
65
  * failure of the work it asked for.
66
66
  */
67
67
  LOCK_TIMEOUT: 15,
68
68
  /**
69
69
  * The user cancelled an interactive prompt. 130 = 128 + SIGINT, the
70
- * conventional "interrupted by the user" code — scripts and CI can tell
70
+ * conventional "interrupted by the user" code, so scripts and CI can tell
71
71
  * a deliberate cancellation apart from a real failure (GENERAL_ERROR).
72
72
  */
73
73
  USER_CANCELLED: 130,
@@ -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
- }