@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
@@ -2,10 +2,10 @@
2
2
  * Environment construction for spawned children.
3
3
  *
4
4
  * Its own module rather than a helper inside `process.ts` only because that
5
- * file sits on a 500-line budget; the logic belongs to the exec layer.
5
+ * file sits on a 500-line budget. The logic belongs to the exec layer.
6
6
  */
7
7
  /** The `env` / `envUnset` slice of exec options this module needs. */
8
- export interface ChildEnvOptions {
8
+ interface ChildEnvOptions {
9
9
  /** Variables to add or overwrite on top of `process.env`. */
10
10
  env?: Record<string, string> | undefined;
11
11
  /** Variables to remove after the merge. */
@@ -15,16 +15,17 @@ export interface ChildEnvOptions {
15
15
  * The child's environment: `process.env`, with `env` merged over it, then
16
16
  * every `envUnset` key removed.
17
17
  *
18
- * One helper rather than five inline spreads — the removal step is easy to
18
+ * One helper rather than five inline spreads: the removal step is easy to
19
19
  * add at four of the five spawn sites and forget at the fifth, which would
20
20
  * make the option silently inert exactly where it was not tested.
21
21
  *
22
- * Removal is a real removal, not an assignment to `''`: mozbuild's
23
- * `is_running_under_coding_agent()` reads `CLAUDECODE` for its PRESENCE, so
24
- * an empty value would not unset it. `Reflect.deleteProperty` rather than
22
+ * Removal is a real removal rather than an assignment to `''`: mozbuild's
23
+ * `is_running_under_coding_agent()` reads `CLAUDECODE` only for its
24
+ * presence, so an empty value would not unset it. `Reflect.deleteProperty` rather than
25
25
  * `delete obj[key]` because the key is computed.
26
26
  *
27
27
  * @param options - Options carrying `env` / `envUnset`
28
28
  * @returns The environment to hand `spawn`
29
29
  */
30
30
  export declare function buildChildEnv(options: ChildEnvOptions): NodeJS.ProcessEnv;
31
+ export {};
@@ -3,19 +3,19 @@
3
3
  * Environment construction for spawned children.
4
4
  *
5
5
  * Its own module rather than a helper inside `process.ts` only because that
6
- * file sits on a 500-line budget; the logic belongs to the exec layer.
6
+ * file sits on a 500-line budget. The logic belongs to the exec layer.
7
7
  */
8
8
  /**
9
9
  * The child's environment: `process.env`, with `env` merged over it, then
10
10
  * every `envUnset` key removed.
11
11
  *
12
- * One helper rather than five inline spreads — the removal step is easy to
12
+ * One helper rather than five inline spreads: the removal step is easy to
13
13
  * add at four of the five spawn sites and forget at the fifth, which would
14
14
  * make the option silently inert exactly where it was not tested.
15
15
  *
16
- * Removal is a real removal, not an assignment to `''`: mozbuild's
17
- * `is_running_under_coding_agent()` reads `CLAUDECODE` for its PRESENCE, so
18
- * an empty value would not unset it. `Reflect.deleteProperty` rather than
16
+ * Removal is a real removal rather than an assignment to `''`: mozbuild's
17
+ * `is_running_under_coding_agent()` reads `CLAUDECODE` only for its
18
+ * presence, so an empty value would not unset it. `Reflect.deleteProperty` rather than
19
19
  * `delete obj[key]` because the key is computed.
20
20
  *
21
21
  * @param options - Options carrying `env` / `envUnset`
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Bounded-concurrency helpers shared by commands that fan out per-file IO
3
3
  * (status classification, import's unmanaged-dirty guard, re-export scans,
4
- * the dry-run purity guard). Kept deliberately tiny: one order-preserving
5
- * mapper, no queues, no cancellation.
4
+ * the dry-run purity guard). Kept tiny: one order-preserving mapper, no
5
+ * queues, no cancellation.
6
6
  */
7
7
  /** Maps items with at most `limit` in-flight promises. Preserves order. */
8
8
  export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Bounded-concurrency helpers shared by commands that fan out per-file IO
3
3
  * (status classification, import's unmanaged-dirty guard, re-export scans,
4
- * the dry-run purity guard). Kept deliberately tiny: one order-preserving
5
- * mapper, no queues, no cancellation.
4
+ * the dry-run purity guard). Kept tiny: one order-preserving mapper, no
5
+ * queues, no cancellation.
6
6
  */
7
7
  /** Maps items with at most `limit` in-flight promises. Preserves order. */
8
8
  export async function mapWithConcurrency(items, limit, fn) {
@@ -1,5 +1,14 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- /** Formats elapsed milliseconds for progress messages. */
2
+ /**
3
+ * Formats a duration in milliseconds as `Xm Ys`, or `Ys` under a minute.
4
+ *
5
+ * The single spelling of FireForge's elapsed-time wording: `build` and
6
+ * `package` each hand-rolled the same minute/second split, so a change to
7
+ * the format silently applied to some progress lines and not others.
8
+ *
9
+ * @param ms - Duration in milliseconds. Negative input is clamped to zero.
10
+ * @returns The duration as `Xm Ys`, or `Ys` when under one minute.
11
+ */
3
12
  function formatElapsed(ms) {
4
13
  const totalSeconds = Math.max(0, Math.round(ms / 1000));
5
14
  const minutes = Math.floor(totalSeconds / 60);
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Throwable normalisation primitives.
3
3
  *
4
- * **This module must import nothing.** It sits at the very bottom of the
5
- * dependency graph — 81 modules across `core/`, `commands/`, `utils/` and
6
- * `bin/` reach it — so it is the one place a shared helper can live and be
4
+ * This module must import nothing. It sits at the very bottom of the
5
+ * dependency graph (81 modules across `core/`, `commands/`, `utils/` and
6
+ * `bin/` reach it), so it is the one place a shared helper can live and be
7
7
  * provably cycle-immune. Adding an import here makes that whole subtree
8
8
  * reachable from every util, and any future `src/errors/*` module wanting a
9
9
  * util back (`errors/git.ts` already carries a mirrored index-lock heuristic
@@ -17,18 +17,18 @@ export declare function toError(error: unknown): Error;
17
17
  * Extracts a Node errno string (`ENOENT`, `EACCES`, `EPERM`, …) from an
18
18
  * unknown throwable, or `undefined` when the value carries no string `code`.
19
19
  *
20
- * The check is deliberately structural rather than `error instanceof Error`:
21
- * a plain object carrying `.code` — exactly the shape {@link toError} exists
22
- * to normalise — reaches errno consumers through rejected promises and
20
+ * The check is structural rather than `error instanceof Error`: a plain
21
+ * object carrying `.code` (exactly the shape {@link toError} exists to
22
+ * normalise) reaches errno consumers through rejected promises and
23
23
  * cross-realm throws, and an `instanceof Error` gate misclassifies it as "no
24
24
  * code".
25
25
  */
26
26
  export declare function getNodeErrorCode(error: unknown): string | undefined;
27
27
  /**
28
28
  * Checks whether a process with the given PID is still running, using
29
- * `kill(pid, 0)` — no signal is sent, only the existence check is performed.
29
+ * `kill(pid, 0)`: no signal is sent, only the existence check is performed.
30
30
  *
31
- * Only `ESRCH` ("no such process") means dead. **`EPERM` means ALIVE**: the
31
+ * Only `ESRCH` ("no such process") means dead. `EPERM` means alive: the
32
32
  * process exists but is owned by another uid, which happens routinely with
33
33
  * root-owned builds, `sudo`, shared CI runners and container UID mismatches.
34
34
  * Reading EPERM as dead in a predicate that gates a recursive delete removes
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * Throwable normalisation primitives.
4
4
  *
5
- * **This module must import nothing.** It sits at the very bottom of the
6
- * dependency graph — 81 modules across `core/`, `commands/`, `utils/` and
7
- * `bin/` reach it — so it is the one place a shared helper can live and be
5
+ * This module must import nothing. It sits at the very bottom of the
6
+ * dependency graph (81 modules across `core/`, `commands/`, `utils/` and
7
+ * `bin/` reach it), so it is the one place a shared helper can live and be
8
8
  * provably cycle-immune. Adding an import here makes that whole subtree
9
9
  * reachable from every util, and any future `src/errors/*` module wanting a
10
10
  * util back (`errors/git.ts` already carries a mirrored index-lock heuristic
@@ -29,9 +29,9 @@ export function toError(error) {
29
29
  * Extracts a Node errno string (`ENOENT`, `EACCES`, `EPERM`, …) from an
30
30
  * unknown throwable, or `undefined` when the value carries no string `code`.
31
31
  *
32
- * The check is deliberately structural rather than `error instanceof Error`:
33
- * a plain object carrying `.code` — exactly the shape {@link toError} exists
34
- * to normalise — reaches errno consumers through rejected promises and
32
+ * The check is structural rather than `error instanceof Error`: a plain
33
+ * object carrying `.code` (exactly the shape {@link toError} exists to
34
+ * normalise) reaches errno consumers through rejected promises and
35
35
  * cross-realm throws, and an `instanceof Error` gate misclassifies it as "no
36
36
  * code".
37
37
  */
@@ -46,9 +46,9 @@ export function getNodeErrorCode(error) {
46
46
  }
47
47
  /**
48
48
  * Checks whether a process with the given PID is still running, using
49
- * `kill(pid, 0)` — no signal is sent, only the existence check is performed.
49
+ * `kill(pid, 0)`: no signal is sent, only the existence check is performed.
50
50
  *
51
- * Only `ESRCH` ("no such process") means dead. **`EPERM` means ALIVE**: the
51
+ * Only `ESRCH` ("no such process") means dead. `EPERM` means alive: the
52
52
  * process exists but is owned by another uid, which happens routinely with
53
53
  * root-owned builds, `sudo`, shared CI runners and container UID mismatches.
54
54
  * Reading EPERM as dead in a predicate that gates a recursive delete removes
@@ -95,7 +95,7 @@ export declare function copyDir(src: string, dest: string): Promise<void>;
95
95
  * artefacts out of their listings without racing the rename.
96
96
  *
97
97
  * Intentionally anchored so a legitimately-named backup file like
98
- * `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is NOT treated
98
+ * `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is not treated
99
99
  * as one of our temps. The full shape is `.<filename>.fireforge-tmp-<pid>-<uuid>`.
100
100
  */
101
101
  export declare const FIREFORGE_TMP_PATH_PATTERN: RegExp;
@@ -3,13 +3,9 @@ import { randomUUID } from 'node:crypto';
3
3
  import { access, chmod, copyFile as fsCopyFile, lstat, mkdir, open, readdir, readFile, rename, rm, stat, statfs, } from 'node:fs/promises';
4
4
  import { basename, dirname, join } from 'node:path';
5
5
  import { getNodeErrorCode } from './errors.js';
6
+ import { sleep } from './sleep.js';
6
7
  const RETRIABLE_REMOVE_ERRORS = new Set(['ENOTEMPTY', 'EBUSY', 'EPERM']);
7
8
  const RETRIABLE_RENAME_ERRORS = new Set(['EPERM', 'EACCES', 'EBUSY']);
8
- function sleep(ms) {
9
- return new Promise((resolve) => {
10
- setTimeout(resolve, ms);
11
- });
12
- }
13
9
  /**
14
10
  * Checks if a path exists.
15
11
  * @param path - Path to check
@@ -19,8 +15,7 @@ export async function pathExists(path) {
19
15
  await access(path);
20
16
  return true;
21
17
  }
22
- catch (error) {
23
- void error;
18
+ catch {
24
19
  return false;
25
20
  }
26
21
  }
@@ -92,8 +87,7 @@ export async function isSymlink(path) {
92
87
  try {
93
88
  return (await lstat(path)).isSymbolicLink();
94
89
  }
95
- catch (error) {
96
- void error;
90
+ catch {
97
91
  return false;
98
92
  }
99
93
  }
@@ -208,9 +202,9 @@ export async function writeFileAtomic(path, content) {
208
202
  /**
209
203
  * Renames the temp file over its destination, retrying transient sharing
210
204
  * violations. On Windows, a rename onto a target that another writer is
211
- * concurrently replacing — or that an antivirus/indexer briefly holds open —
205
+ * concurrently replacing (or that an antivirus/indexer briefly holds open)
212
206
  * fails with EPERM/EACCES/EBUSY even though the same rename succeeds a moment
213
- * later; POSIX renames never hit this. Non-retriable codes and exhausted
207
+ * later. POSIX renames never hit this. Non-retriable codes and exhausted
214
208
  * budgets rethrow, so a genuine permission problem still surfaces.
215
209
  */
216
210
  async function renameWithRetries(from, to) {
@@ -234,15 +228,16 @@ async function syncParentDir(path) {
234
228
  directoryHandle = await open(dirname(path), 'r');
235
229
  await directoryHandle.sync();
236
230
  }
237
- catch (error) {
238
- void error;
231
+ catch {
232
+ // Best-effort durability: a directory that cannot be opened or fsynced
233
+ // (network mounts, Windows) must not fail the write it was protecting.
239
234
  }
240
235
  finally {
241
236
  try {
242
237
  await directoryHandle?.close();
243
238
  }
244
- catch (error) {
245
- void error;
239
+ catch {
240
+ // Nothing left to do. The handle is being discarded either way.
246
241
  }
247
242
  }
248
243
  }
@@ -277,7 +272,7 @@ export async function copyDir(src, dest) {
277
272
  * artefacts out of their listings without racing the rename.
278
273
  *
279
274
  * Intentionally anchored so a legitimately-named backup file like
280
- * `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is NOT treated
275
+ * `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is not treated
281
276
  * as one of our temps. The full shape is `.<filename>.fireforge-tmp-<pid>-<uuid>`.
282
277
  */
283
278
  export const FIREFORGE_TMP_PATH_PATTERN = /(^|\/)\.[^/]+\.fireforge-tmp-\d+-[0-9a-f-]{36}$/i;
@@ -286,8 +281,8 @@ export const FIREFORGE_TMP_PATH_PATTERN = /(^|\/)\.[^/]+\.fireforge-tmp-\d+-[0-9
286
281
  *
287
282
  * Each invocation gets its own path via PID + UUID, so concurrent writers
288
283
  * targeting the same destination never interfere with each other. Cleanup of
289
- * the temp file is the caller's responsibility on error; we intentionally do
290
- * NOT glob-delete peer temp files here to avoid racing with other writers.
284
+ * the temp file is the caller's responsibility on error. We intentionally do
285
+ * not glob-delete peer temp files here to avoid racing with other writers.
291
286
  */
292
287
  function createAtomicTempPath(path) {
293
288
  const directory = dirname(path);
@@ -311,7 +306,7 @@ function createAtomicTempPath(path) {
311
306
  export async function checkDiskSpace(path, minBytes, onLowSpace) {
312
307
  try {
313
308
  const stats = await statfs(path);
314
- // bavail = blocks available to UNPRIVILEGED users; bfree includes the
309
+ // bavail = blocks available to UNPRIVILEGED users. bfree includes the
315
310
  // root-reserved blocks (typically 5% on ext4), so it over-reported free
316
311
  // space and silently suppressed the low-space warning exactly when it
317
312
  // mattered.
@@ -326,7 +321,7 @@ export async function checkDiskSpace(path, minBytes, onLowSpace) {
326
321
  }
327
322
  catch {
328
323
  // statfs may not be available on all platforms or the path may
329
- // not exist yet — silently degrade rather than blocking the operation.
324
+ // not exist yet, so silently degrade rather than blocking the operation.
330
325
  return undefined;
331
326
  }
332
327
  }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Computes the hexadecimal SHA-256 digest of a string or buffer.
3
+ *
4
+ * Eleven sites across `src/core/` inlined the same
5
+ * `createHash('sha256').update(input).digest('hex')` chain for cache keys,
6
+ * fingerprints and content addresses. They all share this helper instead, so
7
+ * the digest algorithm and encoding are decided in exactly one place.
8
+ *
9
+ * @param input - Data to digest, as a UTF-8 string or a raw buffer.
10
+ * @returns The 64-character lowercase hexadecimal digest.
11
+ */
12
+ export declare function sha256Hex(input: string | Buffer): string;
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ import { createHash } from 'node:crypto';
3
+ /**
4
+ * Computes the hexadecimal SHA-256 digest of a string or buffer.
5
+ *
6
+ * Eleven sites across `src/core/` inlined the same
7
+ * `createHash('sha256').update(input).digest('hex')` chain for cache keys,
8
+ * fingerprints and content addresses. They all share this helper instead, so
9
+ * the digest algorithm and encoding are decided in exactly one place.
10
+ *
11
+ * @param input - Data to digest, as a UTF-8 string or a raw buffer.
12
+ * @returns The 64-character lowercase hexadecimal digest.
13
+ */
14
+ export function sha256Hex(input) {
15
+ return createHash('sha256').update(input).digest('hex');
16
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Line splitting for the smoke-run stream dispatch in `process.ts`. Kept as
3
+ * a sibling so the exec module stays within its size budget. The contract
4
+ * (terminators, partial-line cap) is documented on the function.
5
+ */
6
+ /**
7
+ * Drains complete lines from `buffer`, dispatching each to `cb`. Treats
8
+ * `\n`, `\r\n`, and lone `\r` as line terminators. The lone-`\r` case
9
+ * matters for progress-bar style output (mach, cargo) that repaints a line
10
+ * with carriage returns and never sends a newline, which otherwise
11
+ * accumulates indefinitely. A single trailing `\r` is held back since it may
12
+ * be the first half of a `\r\n` pair split across chunks. Returns the
13
+ * remaining partial line. Callers keep accumulating into it.
14
+ */
15
+ export declare function dispatchCompleteLines(buffer: string, cb: ((line: string) => void) | undefined): string;
@@ -0,0 +1,48 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ /**
3
+ * Line splitting for the smoke-run stream dispatch in `process.ts`. Kept as
4
+ * a sibling so the exec module stays within its size budget. The contract
5
+ * (terminators, partial-line cap) is documented on the function.
6
+ */
7
+ /**
8
+ * Cap on the partial-line tail kept between chunks. A child emitting one
9
+ * enormous line with no terminator (minified JS dumped to stderr, a raw
10
+ * binary blob) would otherwise grow the buffer without bound: the 50 MB cap
11
+ * guards the collector, not these line buffers. When the tail exceeds the
12
+ * cap it is dispatched as a synthetic (oversized) line so the matchers still
13
+ * see its content, then the buffer resets.
14
+ */
15
+ const MAX_PARTIAL_LINE_SIZE = 1024 * 1024;
16
+ /**
17
+ * Drains complete lines from `buffer`, dispatching each to `cb`. Treats
18
+ * `\n`, `\r\n`, and lone `\r` as line terminators. The lone-`\r` case
19
+ * matters for progress-bar style output (mach, cargo) that repaints a line
20
+ * with carriage returns and never sends a newline, which otherwise
21
+ * accumulates indefinitely. A single trailing `\r` is held back since it may
22
+ * be the first half of a `\r\n` pair split across chunks. Returns the
23
+ * remaining partial line. Callers keep accumulating into it.
24
+ */
25
+ export function dispatchCompleteLines(buffer, cb) {
26
+ let searchFrom = 0;
27
+ for (;;) {
28
+ const nl = buffer.indexOf('\n', searchFrom);
29
+ const cr = buffer.indexOf('\r', searchFrom);
30
+ const idx = nl === -1 ? cr : cr === -1 ? nl : Math.min(nl, cr);
31
+ if (idx === -1)
32
+ break;
33
+ if (buffer[idx] === '\r' && idx === buffer.length - 1) {
34
+ // Possible first half of a chunk-split \r\n, so wait for the next chunk.
35
+ break;
36
+ }
37
+ const line = buffer.slice(0, idx);
38
+ const terminatorLength = buffer[idx] === '\r' && buffer[idx + 1] === '\n' ? 2 : 1;
39
+ buffer = buffer.slice(idx + terminatorLength);
40
+ searchFrom = 0;
41
+ cb?.(line);
42
+ }
43
+ if (buffer.length > MAX_PARTIAL_LINE_SIZE) {
44
+ cb?.(buffer);
45
+ return '';
46
+ }
47
+ return buffer;
48
+ }
@@ -64,9 +64,9 @@ export declare function warn(message: string): void;
64
64
  export declare const NOTICE_PREFIX = "[FireForge] NOTICE:";
65
65
  /**
66
66
  * Logs one of FireForge's own "why this is happening / why this is slow"
67
- * explanations at WARNING severity.
67
+ * explanations at warning severity.
68
68
  *
69
- * These lines are not warnings about the operator's code — they explain a
69
+ * These lines are not warnings about the operator's code. They explain a
70
70
  * decision FireForge just made (escalating an incremental build to a full
71
71
  * one, sharding a run, skipping a step). Emitted through `info` they are
72
72
  * silently dropped by agent-facing output filters that keep only warnings
@@ -98,10 +98,10 @@ export declare function cancel(message: string): void;
98
98
  /**
99
99
  * Checks whether a prompt result represents a user cancellation.
100
100
  *
101
- * Narrows to `symbol` — clack returns its cancel sentinel as a symbol and
101
+ * Narrows to `symbol`: clack returns its cancel sentinel as a symbol and
102
102
  * `p.isCancel` is itself a type predicate. Returning plain `boolean` erases
103
103
  * that narrowing and forces `as string` / `as PatchCategory` casts across
104
- * the command modules on the *non*-cancelled branch, where the value is
104
+ * the command modules on the non-cancelled branch, where the value is
105
105
  * already known not to be the sentinel. Keep the predicate form.
106
106
  */
107
107
  export declare function isCancel(value: unknown): value is symbol;
@@ -6,11 +6,11 @@ let verboseMode = false;
6
6
  /**
7
7
  * Whether machine-output mode is active (`--json` / `--raw`).
8
8
  *
9
- * In machine mode, stdout belongs EXCLUSIVELY to the machine-readable
9
+ * In machine mode, stdout belongs exclusively to the machine-readable
10
10
  * payload: all human-facing diagnostics (intro/outro banners, info, warn,
11
11
  * error, steps, notes) are routed to stderr as plain unstyled lines.
12
- * Otherwise clack's log helpers write styled warnings to stdout *before* the
13
- * JSON body — a truncated-directory warning during `status --json` breaks
12
+ * Otherwise clack's log helpers write styled warnings to stdout before the
13
+ * JSON body, and a truncated-directory warning during `status --json` breaks
14
14
  * every `JSON.parse(stdout)` consumer.
15
15
  */
16
16
  let machineOutputMode = false;
@@ -35,11 +35,11 @@ export function isMachineOutputMode() {
35
35
  /**
36
36
  * Whether stdout is sealed behind a machine-readable final line.
37
37
  *
38
- * The `FIREFORGE-VERDICT:` contract promises that line as the run's LAST
39
- * stdout write — but emit-then-throw failure paths rethrow into
38
+ * The `FIREFORGE-VERDICT:` contract promises that line as the run's last
39
+ * stdout write, but emit-then-throw failure paths rethrow into
40
40
  * `withErrorHandling`, whose clack error/cancel rendering lands on stdout
41
41
  * in non-machine mode, displacing the verdict from the final line. The
42
- * verdict sink seals stdout the moment it writes; every later logger call
42
+ * verdict sink seals stdout the moment it writes. Every later logger call
43
43
  * routes to stderr through the same diagnostic channel machine mode uses.
44
44
  * `withErrorHandling`'s finally clears the seal (alongside machine mode).
45
45
  */
@@ -138,9 +138,9 @@ export function warn(message) {
138
138
  export const NOTICE_PREFIX = '[FireForge] NOTICE:';
139
139
  /**
140
140
  * Logs one of FireForge's own "why this is happening / why this is slow"
141
- * explanations at WARNING severity.
141
+ * explanations at warning severity.
142
142
  *
143
- * These lines are not warnings about the operator's code — they explain a
143
+ * These lines are not warnings about the operator's code. They explain a
144
144
  * decision FireForge just made (escalating an incremental build to a full
145
145
  * one, sharding a run, skipping a step). Emitted through `info` they are
146
146
  * silently dropped by agent-facing output filters that keep only warnings
@@ -196,7 +196,7 @@ export function formatErrorText(message) {
196
196
  */
197
197
  export function spinner(initialMessage) {
198
198
  if (routeToStderr()) {
199
- // Spinner progress is diagnostics; keep stdout clean for the payload.
199
+ // Spinner progress is diagnostics. Keep stdout clean for the payload.
200
200
  return {
201
201
  message: (msg) => {
202
202
  writeDiagnostic('', msg);
@@ -251,10 +251,10 @@ export function cancel(message) {
251
251
  /**
252
252
  * Checks whether a prompt result represents a user cancellation.
253
253
  *
254
- * Narrows to `symbol` — clack returns its cancel sentinel as a symbol and
254
+ * Narrows to `symbol`: clack returns its cancel sentinel as a symbol and
255
255
  * `p.isCancel` is itself a type predicate. Returning plain `boolean` erases
256
256
  * that narrowing and forces `as string` / `as PatchCategory` casts across
257
- * the command modules on the *non*-cancelled branch, where the value is
257
+ * the command modules on the non-cancelled branch, where the value is
258
258
  * already known not to be the sentinel. Keep the predicate form.
259
259
  */
260
260
  export function isCancel(value) {
@@ -11,8 +11,8 @@
11
11
  * 1. Success writes exactly one JSON document to stdout.
12
12
  * 2. Failure writes exactly one `{ schemaVersion, error, code }` document
13
13
  * to stdout, then exits non-zero.
14
- * 3. Machine mode is engaged BEFORE any output, so every diagnostic —
15
- * including one rendered later by `withErrorHandling` — routes to
14
+ * 3. Machine mode is engaged before any output, so every diagnostic,
15
+ * including one rendered later by `withErrorHandling`, routes to
16
16
  * stderr and cannot corrupt the payload.
17
17
  */
18
18
  import { CommandError } from '../errors/base.js';
@@ -1,13 +1,14 @@
1
+ import type { Command } from 'commander';
1
2
  /**
2
3
  * Filters an object to only include keys whose values are not undefined.
3
- * Designed for use with exactOptionalPropertyTypes — the result can be
4
+ * Designed for use with exactOptionalPropertyTypes: the result can be
4
5
  * spread into typed option objects without assigning undefined to optional
5
6
  * properties.
6
7
  *
7
8
  * Constrained to `object`, not `Record<string, unknown>`: a named interface
8
9
  * has no index signature, so the narrower constraint rejects exactly the
9
10
  * annotations this helper is most useful with. Nothing in the body needs the
10
- * index signature — the key walk goes through `Object.keys`.
11
+ * index signature, since the key walk goes through `Object.keys`.
11
12
  *
12
13
  * @param obj - Object to filter
13
14
  * @returns The same object with every `undefined`-valued key removed
@@ -15,13 +16,12 @@
15
16
  export declare function pickDefined<T extends object>(obj: T): {
16
17
  [K in keyof T]+?: Exclude<T[K], undefined>;
17
18
  };
18
- import type { Command } from 'commander';
19
19
  /**
20
20
  * Wraps an option-argument parser so its failures surface through
21
21
  * commander's own invalid-argument channel.
22
22
  *
23
23
  * Commander only treats errors whose `code` is `'commander.invalidArgument'`
24
- * as argument-validation failures; anything else re-throws out of
24
+ * as argument-validation failures. Anything else re-throws out of
25
25
  * `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
26
26
  * bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
27
27
  * That covers a plain Error, a `GeneralError`, and even a FireForge
@@ -62,25 +62,25 @@ export declare const WAIT_LOCK_ENV_VAR = "FIREFORGE_WAIT_LOCK";
62
62
  * Accepts the raw string too, so it doubles as the option's arg parser (wrap
63
63
  * with {@link commanderArgParser} so failures surface through commander's
64
64
  * invalid-argument channel). In that role the value is never `undefined`, so
65
- * the environment fallback cannot leak into flag PARSING — only into flag
66
- * ABSENCE, which is where it belongs.
65
+ * the environment fallback cannot leak into flag parsing, only into flag
66
+ * absence, which is where it belongs.
67
67
  */
68
68
  export declare function resolveWaitLockSeconds(value: string | number | boolean | undefined): number | undefined;
69
69
  /**
70
- * The session-wide wait budget in MILLISECONDS, or undefined when none is
70
+ * The session-wide wait budget in milliseconds, or undefined when none is
71
71
  * set. Sourced from {@link WAIT_LOCK_ENV_VAR} only.
72
72
  *
73
- * Exists for the SECONDARY locks a command takes after the one its
73
+ * Exists for the secondary locks a command takes after the one its
74
74
  * `--wait-lock` flag was threaded to. A furnace mutation takes the engine
75
- * session lock and then `.fireforge/furnace.lock`; only the first had a
75
+ * session lock and then `.fireforge/furnace.lock`. Only the first had a
76
76
  * budget, so a contended deploy died on the file lock's fixed 30 s while
77
77
  * its operator believed a much larger budget was in force. Threading the
78
- * flag reaches the three furnace commands that declare it — this reaches
78
+ * flag reaches the three furnace commands that declare it. This reaches
79
79
  * the twelve that do not (`create`, `remove`, `rename`, `refresh`, `scan`,
80
80
  * `override`, `chrome-doc`, …), which have no flag to thread but are just
81
81
  * as contended.
82
82
  *
83
- * Deliberately env-only: a flag belongs to one invocation and is passed
83
+ * Env-only: a flag belongs to one invocation and is passed
84
84
  * explicitly where it applies, while the environment is exactly the place a
85
85
  * session-wide default is expressed. An explicit budget at a call site
86
86
  * always wins over this.
@@ -88,12 +88,6 @@ export declare function resolveWaitLockSeconds(value: string | number | boolean
88
88
  * @returns The session budget in milliseconds, or undefined
89
89
  */
90
90
  export declare function sessionWaitLockMs(): number | undefined;
91
- /**
92
- * True when `command` already declares `--wait-lock` itself. Used by the
93
- * CLI wiring to add the accept-and-ignore variant only where the honoring
94
- * one is absent.
95
- */
96
- export declare function hasWaitLockOption(command: Command): boolean;
97
91
  /**
98
92
  * Recursively gives every command in the tree a `--wait-lock` flag: the
99
93
  * honoring registration where one already exists, the accept-and-ignore
@@ -104,12 +98,12 @@ export declare function ensureWaitLockOptionEverywhere(command: Command): void;
104
98
  * Registers the shared `--wait-lock [seconds]` flag on a lock-taking
105
99
  * command (the engine session lock for engine-mutating commands, the patch
106
100
  * directory lock for queue-mutating ones). The parsed option value is `true`
107
- * for the bare flag or a validated integer; feed it through
101
+ * for the bare flag or a validated integer. Feed it through
108
102
  * {@link resolveWaitLockSeconds} at the call site to obtain the
109
103
  * `waitLockSeconds` for `withEngineSessionLock`/`withPatchDirectoryLock`.
110
104
  *
111
- * A command can take MORE than one lock — a furnace mutation takes the
112
- * engine session lock and then `.fireforge/furnace.lock` — and the budget
105
+ * A command can take more than one lock (a furnace mutation takes the
106
+ * engine session lock and then `.fireforge/furnace.lock`) and the budget
113
107
  * has to reach all of them or the flag is a half-truth. The secondary locks
114
108
  * read the session budget through {@link sessionWaitLockMs} rather than
115
109
  * having it threaded to every call site.