@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
@@ -1,14 +1,16 @@
1
- // SPDX-License-Identifier: EUPL-1.2
1
+ import { InvalidArgumentError as CommanderInvalidArgumentError } from 'commander';
2
+ import { GeneralError, InvalidArgumentError } from '../errors/base.js';
3
+ import { toError } from './errors.js';
2
4
  /**
3
5
  * Filters an object to only include keys whose values are not undefined.
4
- * Designed for use with exactOptionalPropertyTypes — the result can be
6
+ * Designed for use with exactOptionalPropertyTypes: the result can be
5
7
  * spread into typed option objects without assigning undefined to optional
6
8
  * properties.
7
9
  *
8
10
  * Constrained to `object`, not `Record<string, unknown>`: a named interface
9
11
  * has no index signature, so the narrower constraint rejects exactly the
10
12
  * annotations this helper is most useful with. Nothing in the body needs the
11
- * index signature — the key walk goes through `Object.keys`.
13
+ * index signature, since the key walk goes through `Object.keys`.
12
14
  *
13
15
  * @param obj - Object to filter
14
16
  * @returns The same object with every `undefined`-valued key removed
@@ -22,15 +24,12 @@ export function pickDefined(obj) {
22
24
  }
23
25
  return result;
24
26
  }
25
- import { InvalidArgumentError as CommanderInvalidArgumentError } from 'commander';
26
- import { GeneralError, InvalidArgumentError } from '../errors/base.js';
27
- import { toError } from './errors.js';
28
27
  /**
29
28
  * Wraps an option-argument parser so its failures surface through
30
29
  * commander's own invalid-argument channel.
31
30
  *
32
31
  * Commander only treats errors whose `code` is `'commander.invalidArgument'`
33
- * as argument-validation failures; anything else re-throws out of
32
+ * as argument-validation failures. Anything else re-throws out of
34
33
  * `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
35
34
  * bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
36
35
  * That covers a plain Error, a `GeneralError`, and even a FireForge
@@ -88,12 +87,12 @@ function parseWaitLockSeconds(raw) {
88
87
  * The standing wait budget from {@link WAIT_LOCK_ENV_VAR}, or undefined when
89
88
  * it is unset or empty.
90
89
  *
91
- * Exists because a wait budget is a property of the SESSION, not of the
90
+ * Exists because a wait budget is a property of the session, not of the
92
91
  * invocation: a checkout worked by several concurrent agent sessions has a
93
92
  * held lock as its normal state, and an unattended loop would otherwise have
94
- * to thread `--wait-lock` through every command it issues — the one place
95
- * it is easiest to forget, and the failure only shows up once the loop has
96
- * already produced a tail of refusals.
93
+ * to thread `--wait-lock` through every command it issues. That is the one
94
+ * place it is easiest to forget, and the failure only shows up once the loop
95
+ * has already produced a tail of refusals.
97
96
  *
98
97
  * An unusable value is a usage error rather than a silent fall-back to
99
98
  * fail-fast: the operator set it precisely because they did not want to
@@ -106,7 +105,7 @@ function waitLockSecondsFromEnv() {
106
105
  }
107
106
  const parsed = parseWaitLockSeconds(raw);
108
107
  if (parsed === undefined) {
109
- throw new InvalidArgumentError(`${WAIT_LOCK_ENV_VAR} must be an integer in ${String(MIN_WAIT_LOCK_SECONDS)}..${String(MAX_WAIT_LOCK_SECONDS)} (got "${raw}")`, WAIT_LOCK_ENV_VAR);
108
+ throw new InvalidArgumentError(`${WAIT_LOCK_ENV_VAR} must be an integer in ${MIN_WAIT_LOCK_SECONDS}..${MAX_WAIT_LOCK_SECONDS} (got "${raw}")`, WAIT_LOCK_ENV_VAR);
110
109
  }
111
110
  return parsed;
112
111
  }
@@ -125,8 +124,8 @@ function waitLockSecondsFromEnv() {
125
124
  * Accepts the raw string too, so it doubles as the option's arg parser (wrap
126
125
  * with {@link commanderArgParser} so failures surface through commander's
127
126
  * invalid-argument channel). In that role the value is never `undefined`, so
128
- * the environment fallback cannot leak into flag PARSING — only into flag
129
- * ABSENCE, which is where it belongs.
127
+ * the environment fallback cannot leak into flag parsing, only into flag
128
+ * absence, which is where it belongs.
130
129
  */
131
130
  export function resolveWaitLockSeconds(value) {
132
131
  if (value === undefined || value === false) {
@@ -140,25 +139,25 @@ export function resolveWaitLockSeconds(value) {
140
139
  }
141
140
  const parsed = parseWaitLockSeconds(value);
142
141
  if (parsed === undefined) {
143
- throw new GeneralError(`--wait-lock must be an integer in ${String(MIN_WAIT_LOCK_SECONDS)}..${String(MAX_WAIT_LOCK_SECONDS)} (got "${value}")`);
142
+ throw new GeneralError(`--wait-lock must be an integer in ${MIN_WAIT_LOCK_SECONDS}..${MAX_WAIT_LOCK_SECONDS} (got "${value}")`);
144
143
  }
145
144
  return parsed;
146
145
  }
147
146
  /**
148
- * The session-wide wait budget in MILLISECONDS, or undefined when none is
147
+ * The session-wide wait budget in milliseconds, or undefined when none is
149
148
  * set. Sourced from {@link WAIT_LOCK_ENV_VAR} only.
150
149
  *
151
- * Exists for the SECONDARY locks a command takes after the one its
150
+ * Exists for the secondary locks a command takes after the one its
152
151
  * `--wait-lock` flag was threaded to. A furnace mutation takes the engine
153
- * session lock and then `.fireforge/furnace.lock`; only the first had a
152
+ * session lock and then `.fireforge/furnace.lock`. Only the first had a
154
153
  * budget, so a contended deploy died on the file lock's fixed 30 s while
155
154
  * its operator believed a much larger budget was in force. Threading the
156
- * flag reaches the three furnace commands that declare it — this reaches
155
+ * flag reaches the three furnace commands that declare it. This reaches
157
156
  * the twelve that do not (`create`, `remove`, `rename`, `refresh`, `scan`,
158
157
  * `override`, `chrome-doc`, …), which have no flag to thread but are just
159
158
  * as contended.
160
159
  *
161
- * Deliberately env-only: a flag belongs to one invocation and is passed
160
+ * Env-only: a flag belongs to one invocation and is passed
162
161
  * explicitly where it applies, while the environment is exactly the place a
163
162
  * session-wide default is expressed. An explicit budget at a call site
164
163
  * always wins over this.
@@ -170,12 +169,12 @@ export function sessionWaitLockMs() {
170
169
  return seconds === undefined ? undefined : seconds * 1000;
171
170
  }
172
171
  /**
173
- * Registers `--wait-lock [seconds]` on a command that takes NO lock, so a
172
+ * Registers `--wait-lock [seconds]` on a command that takes no lock, so a
174
173
  * scripted sequence can blanket-append the flag without hitting a usage
175
- * error — a command that rejects it with "unknown option" kills the whole
174
+ * error. A command that rejects it with "unknown option" kills the whole
176
175
  * sequence with a usage error instead of a lock message.
177
176
  *
178
- * The flag is accepted and ignored here — never silently repurposed — and
177
+ * The flag is accepted and ignored here, never silently repurposed, and
179
178
  * the help text says so, so nobody reads its presence as evidence that this
180
179
  * command waits for anything.
181
180
  *
@@ -191,7 +190,7 @@ function addAcceptedWaitLockOption(command) {
191
190
  * CLI wiring to add the accept-and-ignore variant only where the honoring
192
191
  * one is absent.
193
192
  */
194
- export function hasWaitLockOption(command) {
193
+ function hasWaitLockOption(command) {
195
194
  return command.options.some((option) => option.long === '--wait-lock');
196
195
  }
197
196
  /**
@@ -210,12 +209,12 @@ export function ensureWaitLockOptionEverywhere(command) {
210
209
  * Registers the shared `--wait-lock [seconds]` flag on a lock-taking
211
210
  * command (the engine session lock for engine-mutating commands, the patch
212
211
  * directory lock for queue-mutating ones). The parsed option value is `true`
213
- * for the bare flag or a validated integer; feed it through
212
+ * for the bare flag or a validated integer. Feed it through
214
213
  * {@link resolveWaitLockSeconds} at the call site to obtain the
215
214
  * `waitLockSeconds` for `withEngineSessionLock`/`withPatchDirectoryLock`.
216
215
  *
217
- * A command can take MORE than one lock — a furnace mutation takes the
218
- * engine session lock and then `.fireforge/furnace.lock` — and the budget
216
+ * A command can take more than one lock (a furnace mutation takes the
217
+ * engine session lock and then `.fireforge/furnace.lock`) and the budget
219
218
  * has to reach all of them or the flag is a half-truth. The secondary locks
220
219
  * read the session budget through {@link sessionWaitLockMs} rather than
221
220
  * having it threaded to every call site.
@@ -3,21 +3,12 @@ import { readFileSync } from 'node:fs';
3
3
  import { dirname, join } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import { getNodeErrorCode, toError } from './errors.js';
6
+ import { parseObject } from './parse.js';
6
7
  import { isObject } from './validation.js';
7
- function validatePackageMetadata(data, filePath) {
8
- if (typeof data !== 'object' || data === null) {
9
- throw new Error(`Invalid package metadata in ${filePath}: expected an object`);
10
- }
11
- const name = 'name' in data ? data.name : undefined;
12
- const version = 'version' in data ? data.version : undefined;
13
- if (typeof name !== 'string' || typeof version !== 'string') {
14
- throw new Error(`Invalid package metadata in ${filePath}: expected string "name" and "version" fields`);
15
- }
16
- return { name, version, bin: 'bin' in data ? data.bin : undefined };
17
- }
18
8
  function readPackageMetadata(filePath) {
19
9
  const raw = readFileSync(filePath, 'utf-8');
20
- return validatePackageMetadata(JSON.parse(raw), filePath);
10
+ const parsed = parseObject(JSON.parse(raw), 'package.json');
11
+ return { name: parsed.string('name'), version: parsed.string('version'), bin: parsed.raw('bin') };
21
12
  }
22
13
  let cachedPackageRoot;
23
14
  /**
@@ -45,8 +36,8 @@ export function getPackageRoot() {
45
36
  }
46
37
  }
47
38
  catch (error) {
48
- // Absent package.json: keep walking. A package.json that EXISTS but
49
- // fails to parse is a different animal — walking past it could bind
39
+ // Absent package.json: keep walking. A package.json that exists but
40
+ // fails to parse is a different case: walking past it could bind
50
41
  // to a wrong ancestor package (any parent exposing bin.fireforge) or
51
42
  // end in the unhelpful generic "could not locate" error, hiding the
52
43
  // actual syntax problem.
@@ -7,13 +7,13 @@ export declare function normalizePathSlashes(path: string): string;
7
7
  * (`browser/base/content/foo.js`).
8
8
  *
9
9
  * The match is case-insensitive because default macOS and Windows
10
- * filesystems treat `Engine/` and `engine/` as the same directory; a literal
11
- * lowercase-only check leaves `mach` and the manifest writers resolving
12
- * against a wrongly-cased prefix. Leading whitespace is ignored so
10
+ * filesystems treat `Engine/` and `engine/` as the same directory. A
11
+ * literal lowercase-only check leaves `mach` and the manifest writers
12
+ * resolving against a wrongly-cased prefix. Leading whitespace is ignored so
13
13
  * tab-completed inputs do not slip past the strip.
14
14
  *
15
15
  * The return value is trimmed of that leading whitespace when the prefix
16
- * matched, and otherwise passed through verbatim — callers that care about
16
+ * matched, and otherwise passed through verbatim. Callers that care about
17
17
  * internal whitespace can trim on their side.
18
18
  *
19
19
  * @param filePath Path as provided by the user
@@ -21,13 +21,13 @@ export function normalizePathSlashes(path) {
21
21
  * (`browser/base/content/foo.js`).
22
22
  *
23
23
  * The match is case-insensitive because default macOS and Windows
24
- * filesystems treat `Engine/` and `engine/` as the same directory; a literal
25
- * lowercase-only check leaves `mach` and the manifest writers resolving
26
- * against a wrongly-cased prefix. Leading whitespace is ignored so
24
+ * filesystems treat `Engine/` and `engine/` as the same directory. A
25
+ * literal lowercase-only check leaves `mach` and the manifest writers
26
+ * resolving against a wrongly-cased prefix. Leading whitespace is ignored so
27
27
  * tab-completed inputs do not slip past the strip.
28
28
  *
29
29
  * The return value is trimmed of that leading whitespace when the prefix
30
- * matched, and otherwise passed through verbatim — callers that care about
30
+ * matched, and otherwise passed through verbatim. Callers that care about
31
31
  * internal whitespace can trim on their side.
32
32
  *
33
33
  * @param filePath Path as provided by the user
@@ -2,10 +2,6 @@
2
2
  * Supported operating system platforms.
3
3
  */
4
4
  export type Platform = 'darwin' | 'linux' | 'win32';
5
- /**
6
- * Supported CPU architectures.
7
- */
8
- export type Arch = 'x64' | 'arm64';
9
5
  /**
10
6
  * Gets the current operating system platform.
11
7
  * @throws Error if running on an unsupported platform
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * Process-group kill and post-run sweep helpers for the exec layer. Split
3
- * out of `process.ts` to keep that file within the per-file line budget;
4
- * deliberately spawn-based (not `exec`-based) so the two modules do not
5
- * import each other cyclically.
3
+ * out of `process.ts` to keep that file within the per-file line budget.
4
+ * Spawn-based rather than `exec`-based so the two modules do not import
5
+ * each other cyclically.
6
6
  */
7
7
  import { type ChildProcess } from 'node:child_process';
8
8
  /**
9
- * Sends `signal` to the child's whole tree: the process GROUP on POSIX
10
- * (negative-PID kill — reaches mach → python → firefox → content-process
11
- * chains), or a `taskkill /T /F` tree kill plus a direct `child.kill`
12
- * fallback on Windows. No-ops once the direct child has exited (group
9
+ * Sends `signal` to the child's whole tree: the process group on POSIX
10
+ * (negative-PID kill, which reaches mach → python → firefox →
11
+ * content-process chains), or a `taskkill /T /F` tree kill plus a direct
12
+ * `child.kill` fallback on Windows. No-ops once the direct child has exited (group
13
13
  * survivors after exit are the post-run sweep's job, not this function's).
14
14
  *
15
15
  * A failed group kill falls through to a direct `child.kill` on POSIX too:
@@ -19,7 +19,7 @@ import { type ChildProcess } from 'node:child_process';
19
19
  */
20
20
  export declare function killProcessTree(child: ChildProcess, signal: NodeJS.Signals, usesProcessGroup: boolean): void;
21
21
  /** One process still alive in a swept group. */
22
- export interface ProcessGroupSurvivor {
22
+ interface ProcessGroupSurvivor {
23
23
  /** PID, or -1 when pgrep was unavailable and only a liveness probe ran. */
24
24
  pid: number;
25
25
  /** Command line (pgrep -lf output), best-effort. */
@@ -30,9 +30,10 @@ export interface ProcessGroupSurvivor {
30
30
  * the PID of a child started with `detached: true`): lists survivors,
31
31
  * SIGTERMs the group, waits a short grace, escalates to SIGKILL, and warns
32
32
  * about anything that still refuses to die. POSIX only (no-op on win32).
33
- * The only kill target is `-pgid` — never anything outside the group.
33
+ * The only kill target is `-pgid`, never anything outside the group.
34
34
  * A healthy run costs exactly one `pgrep`.
35
35
  */
36
36
  export declare function sweepProcessGroup(pgid: number, graceMs?: number): Promise<{
37
37
  survivors: ProcessGroupSurvivor[];
38
38
  }>;
39
+ export {};
@@ -1,18 +1,19 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
3
  * Process-group kill and post-run sweep helpers for the exec layer. Split
4
- * out of `process.ts` to keep that file within the per-file line budget;
5
- * deliberately spawn-based (not `exec`-based) so the two modules do not
6
- * import each other cyclically.
4
+ * out of `process.ts` to keep that file within the per-file line budget.
5
+ * Spawn-based rather than `exec`-based so the two modules do not import
6
+ * each other cyclically.
7
7
  */
8
8
  import { spawn } from 'node:child_process';
9
9
  import { getNodeErrorCode } from './errors.js';
10
10
  import { verbose, warn } from './logger.js';
11
+ import { sleep } from './sleep.js';
11
12
  /**
12
- * Sends `signal` to the child's whole tree: the process GROUP on POSIX
13
- * (negative-PID kill — reaches mach → python → firefox → content-process
14
- * chains), or a `taskkill /T /F` tree kill plus a direct `child.kill`
15
- * fallback on Windows. No-ops once the direct child has exited (group
13
+ * Sends `signal` to the child's whole tree: the process group on POSIX
14
+ * (negative-PID kill, which reaches mach → python → firefox →
15
+ * content-process chains), or a `taskkill /T /F` tree kill plus a direct
16
+ * `child.kill` fallback on Windows. No-ops once the direct child has exited (group
16
17
  * survivors after exit are the post-run sweep's job, not this function's).
17
18
  *
18
19
  * A failed group kill falls through to a direct `child.kill` on POSIX too:
@@ -37,19 +38,19 @@ export function killProcessTree(child, signal, usesProcessGroup) {
37
38
  catch {
38
39
  // ESRCH/EPERM: the group is gone, or was never created because the
39
40
  // platform ignored `detached`. Signal the direct child rather than
40
- // doing nothing — it may well still be alive. Without this
41
+ // doing nothing, since it may well still be alive. Without this
41
42
  // fall-through a failed group kill left the child running.
42
43
  child.kill(signal);
43
44
  }
44
45
  }
45
46
  else {
46
- // No process group on Windows — taskkill /T walks the descendant
47
+ // No process group on Windows, so taskkill /T walks the descendant
47
48
  // tree instead. Always forced (/F): there is no SIGTERM analogue,
48
49
  // so the grace window only exists on POSIX.
49
50
  spawn('taskkill', ['/pid', String(targetPid), '/T', '/F'], {
50
51
  stdio: 'ignore',
51
52
  }).on('error', () => {
52
- // taskkill unavailable — nothing more we can do beyond the
53
+ // taskkill unavailable, so nothing more we can do beyond the
53
54
  // direct-child kill below.
54
55
  });
55
56
  child.kill(signal);
@@ -61,18 +62,6 @@ export function killProcessTree(child, signal, usesProcessGroup) {
61
62
  }
62
63
  const SWEEP_GRACE_MS = 2000;
63
64
  const MULTIPROCESSING_WORKER_PATTERN = /multiprocessing\.(?:spawn|forkserver)|resource_tracker/;
64
- function sweepDelay(ms) {
65
- // Deliberately ref'd (no unref()): this promise is AWAITED between the
66
- // group SIGTERM and the post-grace re-list/SIGKILL escalation, from a
67
- // child 'close' handler after the signal forwarder is disposed — with an
68
- // unref'd timer nothing kept the event loop alive, so Node could exit
69
- // mid-grace and skip the escalation entirely. Healthy runs never reach
70
- // this function (sweepProcessGroup early-returns on zero survivors), so
71
- // the ref never holds a clean exit open.
72
- return new Promise((resolve) => {
73
- setTimeout(resolve, ms);
74
- });
75
- }
76
65
  /**
77
66
  * Minimal spawn-based pgrep runner. exitCode -1 means pgrep itself was
78
67
  * unavailable or errored (distinct from exit 1 = "no matches").
@@ -115,10 +104,10 @@ async function listGroupSurvivors(pgid) {
115
104
  return [{ pid: -1, command: 'unknown (pgrep unavailable; group still has live members)' }];
116
105
  }
117
106
  catch (error) {
118
- // Same errno semantics as `isProcessAlive` (which cannot be called here —
119
- // it probes a single positive pid): only ESRCH proves the group is gone.
120
- // EPERM means it exists under another uid, and an unrecognized failure is
121
- // not evidence of absence — report survivors in both cases.
107
+ // Same errno semantics as `isProcessAlive` (which cannot be called here,
108
+ // since it probes a single positive pid): only ESRCH proves the group is
109
+ // gone. EPERM means it exists under another uid, and an unrecognized
110
+ // failure is not evidence of absence, so report survivors in both cases.
122
111
  if (getNodeErrorCode(error) === 'ESRCH')
123
112
  return [];
124
113
  return [{ pid: -1, command: 'unknown (pgrep unavailable; group liveness probe denied)' }];
@@ -130,7 +119,7 @@ function describeSurvivors(list) {
130
119
  const tag = MULTIPROCESSING_WORKER_PATTERN.test(s.command)
131
120
  ? ' [multiprocessing worker — the known busy-spin orphan shape]'
132
121
  : '';
133
- return `PID ${String(s.pid)}: ${s.command}${tag}`;
122
+ return `PID ${s.pid}: ${s.command}${tag}`;
134
123
  })
135
124
  .join('; ');
136
125
  }
@@ -139,7 +128,7 @@ function describeSurvivors(list) {
139
128
  * the PID of a child started with `detached: true`): lists survivors,
140
129
  * SIGTERMs the group, waits a short grace, escalates to SIGKILL, and warns
141
130
  * about anything that still refuses to die. POSIX only (no-op on win32).
142
- * The only kill target is `-pgid` — never anything outside the group.
131
+ * The only kill target is `-pgid`, never anything outside the group.
143
132
  * A healthy run costs exactly one `pgrep`.
144
133
  */
145
134
  export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
@@ -148,17 +137,23 @@ export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
148
137
  const survivors = await listGroupSurvivors(pgid);
149
138
  if (survivors.length === 0)
150
139
  return { survivors };
151
- warn(`Harness process group ${String(pgid)} left ${String(survivors.length)} surviving ` +
140
+ warn(`Harness process group ${pgid} left ${survivors.length} surviving ` +
152
141
  `process(es) after exit — reaping the group. ${describeSurvivors(survivors)}`);
153
142
  try {
154
143
  process.kill(-pgid, 'SIGTERM');
155
144
  }
156
145
  catch {
157
- // The group vanished between the listing and the signal — nothing left to
158
- // escalate against, so report the survivors collected so far.
146
+ // The group vanished between the listing and the signal, so there is
147
+ // nothing left to escalate against. Report the survivors collected so far.
159
148
  return { survivors };
160
149
  }
161
- await sweepDelay(graceMs);
150
+ // Ref'd (sleep's default): this wait sits between the group
151
+ // SIGTERM and the post-grace re-list/SIGKILL escalation, awaited from a
152
+ // child 'close' handler after the signal forwarder is disposed. With an
153
+ // unref'd timer nothing keeps the event loop alive, so Node could exit
154
+ // mid-grace and skip the escalation entirely. Healthy runs never reach
155
+ // here (sweepProcessGroup early-returns on zero survivors).
156
+ await sleep(graceMs);
162
157
  let remaining = await listGroupSurvivors(pgid);
163
158
  if (remaining.length > 0) {
164
159
  try {
@@ -169,18 +164,24 @@ export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
169
164
  // nothing to signal.
170
165
  return { survivors };
171
166
  }
172
- await sweepDelay(Math.min(200, graceMs));
167
+ // Ref'd (sleep's default): this wait sits between the group
168
+ // SIGTERM and the post-grace re-list/SIGKILL escalation, awaited from a
169
+ // child 'close' handler after the signal forwarder is disposed. With an
170
+ // unref'd timer nothing keeps the event loop alive, so Node could exit
171
+ // mid-grace and skip the escalation entirely. Healthy runs never reach
172
+ // here (sweepProcessGroup early-returns on zero survivors).
173
+ await sleep(Math.min(200, graceMs));
173
174
  remaining = await listGroupSurvivors(pgid);
174
175
  if (remaining.length > 0) {
175
- warn(`Process group ${String(pgid)} still has survivors after SIGKILL: ${describeSurvivors(remaining)}. ` +
176
+ warn(`Process group ${pgid} still has survivors after SIGKILL: ${describeSurvivors(remaining)}. ` +
176
177
  'Inspect manually (ps -axo pid,ppid,time,command) and kill by PID.');
177
178
  }
178
179
  else {
179
- verbose(`Process group ${String(pgid)} reaped after SIGKILL escalation.`);
180
+ verbose(`Process group ${pgid} reaped after SIGKILL escalation.`);
180
181
  }
181
182
  }
182
183
  else {
183
- verbose(`Process group ${String(pgid)} reaped cleanly with SIGTERM.`);
184
+ verbose(`Process group ${pgid} reaped cleanly with SIGTERM.`);
184
185
  }
185
186
  return { survivors };
186
187
  }