@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
@@ -16,12 +16,12 @@ const PATCH_DIRECTORY_LOCK = '.fireforge-patches.lock';
16
16
  * session lock's progress line so operators read one shape for both locks.
17
17
  */
18
18
  function formatWaitProgressLine(waitedMs, timeoutMs, holder) {
19
- const progress = `${String(Math.round(waitedMs / 1000))}s of up to ${String(Math.round(timeoutMs / 1000))}s`;
19
+ const progress = `${Math.round(waitedMs / 1000)}s of up to ${Math.round(timeoutMs / 1000)}s`;
20
20
  if (holder === undefined) {
21
21
  return `Waiting for the FireForge patch directory lock — ${progress}.`;
22
22
  }
23
23
  const details = holder.metadata.length > 0 ? ` (${holder.metadata.join(', ')})` : '';
24
- return `Waiting for the FireForge patch directory lock held by PID ${String(holder.pid)}${details} — ${progress}.`;
24
+ return `Waiting for the FireForge patch directory lock held by PID ${holder.pid}${details} — ${progress}.`;
25
25
  }
26
26
  /**
27
27
  * Asserts that this process is inside {@link withPatchDirectoryLock} for the
@@ -34,7 +34,7 @@ function formatWaitProgressLine(waitedMs, timeoutMs, holder) {
34
34
  * is held, so an unlocked caller silently reintroduces the interleaving the
35
35
  * lock exists to prevent.
36
36
  *
37
- * Fail-open on an unreadable owner record, deliberately: `withFileLock`
37
+ * Fail-open on an unreadable owner record, on purpose: `withFileLock`
38
38
  * treats writing that record as non-fatal, so a live holder can legitimately
39
39
  * have no readable PID and asserting on its presence would fire on a lock we
40
40
  * really do hold.
@@ -47,7 +47,7 @@ export async function assertPatchDirectoryLockHeld(patchesDir, context) {
47
47
  const status = await readLockStatus(join(patchesDir, PATCH_DIRECTORY_LOCK));
48
48
  assert(status.held, () => `patch directory lock is held before ${context}`);
49
49
  assert(status.holder === undefined || status.holder.pid === process.pid, () => `patch directory lock is owned by this process before ${context} ` +
50
- `(held by PID ${String(status.holder?.pid)}, we are ${String(process.pid)})`);
50
+ `(held by PID ${status.holder?.pid}, we are ${process.pid})`);
51
51
  }
52
52
  /**
53
53
  * Runs a patch directory mutation while holding an exclusive filesystem lock.
@@ -56,7 +56,7 @@ export async function assertPatchDirectoryLockHeld(patchesDir, context) {
56
56
  export async function withPatchDirectoryLock(patchesDir, operation, options = {}) {
57
57
  const lockDir = join(patchesDir, PATCH_DIRECTORY_LOCK);
58
58
  const { waitLockSeconds, command } = options;
59
- // Tag whatever the BODY throws so the catch below can tell it apart from a
59
+ // Tag whatever the body throws so the catch below can tell it apart from a
60
60
  // lock-acquire/release failure. Narrowing by origin rather than by error
61
61
  // shape is what "the rewrap is for lock I/O" actually means: an errno test
62
62
  // would still reclassify an EACCES raised while the body writes a .patch
@@ -90,10 +90,10 @@ export async function withPatchDirectoryLock(patchesDir, operation, options = {}
90
90
  : {}),
91
91
  // Reason first, remedy second. The remedy is waiting, not deleting: bulk
92
92
  // exports/re-exports legitimately hold this lock for minutes, and
93
- // FireForge reaps genuinely stale locks on its own — advice to `rm -rf`
94
- // while a holder is alive destroys a live lock. The leading sentence is
95
- // a message contract; extend, do not reword. withFileLock appends the
96
- // holder identification.
93
+ // FireForge reaps genuinely stale locks on its own, and advice to
94
+ // `rm -rf` while a holder is alive destroys a live lock. The leading
95
+ // sentence is a message contract. Extend, do not reword. withFileLock
96
+ // appends the holder identification.
97
97
  onTimeoutMessage: `Timed out waiting for another FireForge command mutating ${patchesDir}.\n` +
98
98
  `Pass --wait-lock [seconds] to wait longer (bare --wait-lock waits up to 60 seconds). ` +
99
99
  `FireForge removes genuinely stale locks automatically; only if no other fireforge ` +
@@ -105,7 +105,7 @@ export async function withPatchDirectoryLock(patchesDir, operation, options = {}
105
105
  // reports an EACCES writing patches.json, a postcondition failure from
106
106
  // renumberPatchesInManifest, or a plain TypeError from a FireForge bug
107
107
  // as a "Patch Error" carrying three fixed remedies about Firefox-version
108
- // compatibility and `fireforge reset` — none of which apply. Worse,
108
+ // compatibility and `fireforge reset`, none of which apply. Worse,
109
109
  // src/cli.ts prints a stack only for non-FireForgeError throwables, so
110
110
  // the rewrap moves real bugs into the branch that discards their stack.
111
111
  if (bodyThrew && error === bodyFailure) {
@@ -114,7 +114,7 @@ export async function withPatchDirectoryLock(patchesDir, operation, options = {}
114
114
  if (error instanceof FireForgeError) {
115
115
  throw error;
116
116
  }
117
- // CommandError is the one class in src/errors/ that does NOT extend
117
+ // CommandError is the one class in src/errors/ that does not extend
118
118
  // FireForgeError: it is the sentinel carrying an already-rendered exit
119
119
  // code to the entrypoint. The `instanceof FireForgeError` guard above
120
120
  // misses it, so without this the exit code was replaced by PATCH_ERROR.
@@ -20,7 +20,7 @@ export declare function validatePatchesManifestConsistency(patchesDir: string):
20
20
  *
21
21
  * Drift that is only in `filesAffected` is a derived value disagreeing with
22
22
  * the diff it describes, and the narrow repair fixes exactly that. Naming the
23
- * whole-manifest rebuild for it — as this hint used to, unconditionally — puts
23
+ * whole-manifest rebuild for it (as this hint used to, unconditionally) puts
24
24
  * an operator one keystroke from rewriting every row in the manifest to
25
25
  * correct one list.
26
26
  */
@@ -30,19 +30,19 @@ export declare function recommendManifestRepair(issues: readonly PatchManifestCo
30
30
  * lists patches whose manifest entry was reconstructed from filename,
31
31
  * mtime, and diff alone (no pre-existing manifest entry to preserve).
32
32
  * These entries carry generic descriptions and mtime-based
33
- * timestamps; callers like `doctor --repair-patches-manifest` surface
33
+ * timestamps. Callers like `doctor --repair-patches-manifest` surface
34
34
  * a per-patch review warning so operators know which metadata was
35
35
  * invented vs which was restored.
36
36
  */
37
37
  export interface RebuildPatchesManifestResult {
38
38
  /**
39
39
  * Rebuilt manifest, ready to be re-applied by callers. Persisted unless
40
- * the run was a dry run — see {@link RebuildPatchesManifestResult.written}.
40
+ * the run was a dry run. See {@link RebuildPatchesManifestResult.written}.
41
41
  */
42
42
  manifest: PatchesManifest;
43
43
  /**
44
44
  * Filenames whose manifest entry had no pre-existing metadata to
45
- * preserve — every descriptive field on these entries is inferred.
45
+ * preserve. Every descriptive field on these entries is inferred.
46
46
  */
47
47
  recoveredFilenames: string[];
48
48
  /**
@@ -59,7 +59,7 @@ export interface RebuildPatchesManifestOptions extends PatchDirectoryLockOptions
59
59
  /**
60
60
  * Proceed even when patches.json exists but cannot be parsed, in which case
61
61
  * there is no existing metadata to preserve and every descriptive field on
62
- * every entry is invented. Refused without this flag — see
62
+ * every entry is invented. Refused without this flag. See
63
63
  * {@link rebuildPatchesManifest}.
64
64
  */
65
65
  allowMetadataLoss?: boolean;
@@ -69,7 +69,7 @@ export interface RebuildPatchesManifestOptions extends PatchDirectoryLockOptions
69
69
  /**
70
70
  * Rebuilds patches.json from the patch files currently present on disk.
71
71
  *
72
- * This is a MERGE, not a from-scratch rebuild: only `filesAffected` and
72
+ * This is a merge, not a from-scratch rebuild: only `filesAffected` and
73
73
  * `order` are recomputed from the patch files, and every other field on an
74
74
  * existing entry is carried forward untouched. Entries with no pre-existing
75
75
  * metadata are recovered from filename structure, patch contents, and file
@@ -82,7 +82,7 @@ export interface RebuildPatchesManifestOptions extends PatchDirectoryLockOptions
82
82
  * @param patchesDir - Path to the patches directory
83
83
  * @param fallbackSourceEsrVersion - source version to use for recovered legacy entries
84
84
  * @param options - Lock options plus `allowMetadataLoss` / `dryRun`
85
- * @returns {@link RebuildPatchesManifestResult} — the rebuilt manifest, the
85
+ * @returns {@link RebuildPatchesManifestResult}: the rebuilt manifest, the
86
86
  * filenames that were reconstructed from generic defaults, and the rows
87
87
  * dropped because their patch file is gone.
88
88
  */
@@ -86,7 +86,7 @@ export async function validatePatchesManifestConsistency(patchesDir) {
86
86
  *
87
87
  * Drift that is only in `filesAffected` is a derived value disagreeing with
88
88
  * the diff it describes, and the narrow repair fixes exactly that. Naming the
89
- * whole-manifest rebuild for it — as this hint used to, unconditionally — puts
89
+ * whole-manifest rebuild for it (as this hint used to, unconditionally) puts
90
90
  * an operator one keystroke from rewriting every row in the manifest to
91
91
  * correct one list.
92
92
  */
@@ -103,7 +103,7 @@ export function recommendManifestRepair(issues) {
103
103
  /**
104
104
  * Rebuilds patches.json from the patch files currently present on disk.
105
105
  *
106
- * This is a MERGE, not a from-scratch rebuild: only `filesAffected` and
106
+ * This is a merge, not a from-scratch rebuild: only `filesAffected` and
107
107
  * `order` are recomputed from the patch files, and every other field on an
108
108
  * existing entry is carried forward untouched. Entries with no pre-existing
109
109
  * metadata are recovered from filename structure, patch contents, and file
@@ -116,7 +116,7 @@ export function recommendManifestRepair(issues) {
116
116
  * @param patchesDir - Path to the patches directory
117
117
  * @param fallbackSourceEsrVersion - source version to use for recovered legacy entries
118
118
  * @param options - Lock options plus `allowMetadataLoss` / `dryRun`
119
- * @returns {@link RebuildPatchesManifestResult} — the rebuilt manifest, the
119
+ * @returns {@link RebuildPatchesManifestResult}: the rebuilt manifest, the
120
120
  * filenames that were reconstructed from generic defaults, and the rows
121
121
  * dropped because their patch file is gone.
122
122
  */
@@ -125,7 +125,7 @@ export async function rebuildPatchesManifest(patchesDir, fallbackSourceEsrVersio
125
125
  // patch-directory lock (invariant 2, docs/lifecycle-invariants.md):
126
126
  // manifest writes serialize on this lock, so without it a repair racing a
127
127
  // concurrent export/reorder can clobber the other writer's manifest. Not
128
- // reentrant — callers must not already hold it.
128
+ // reentrant: callers must not already hold it.
129
129
  //
130
130
  // A dry run takes the lock too: it reads the same manifest and patch bodies
131
131
  // a real run would, and a projection computed against a queue being
@@ -136,9 +136,9 @@ async function rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVers
136
136
  const manifestState = await loadPatchesManifestState(patchesDir);
137
137
  const existingEntries = new Map();
138
138
  // An unparseable manifest yields `manifest: null`, which the merge below
139
- // cannot distinguish from "no manifest at all" — every entry would be
139
+ // cannot distinguish from "no manifest at all". Every entry would be
140
140
  // treated as new and every descriptive field reinvented. `filesAffected`
141
- // is the only field a .patch body can yield; `stagedDependencies`,
141
+ // is the only field a .patch body can yield. `stagedDependencies`,
142
142
  // `lintIgnore`, `tier`, `description`, `category`, `createdAt` and the
143
143
  // source version cannot be reconstructed from a diff at all. Refuse rather
144
144
  // than write that, since the write is what makes it unrecoverable on a
@@ -187,21 +187,20 @@ async function rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVers
187
187
  // callers can warn the operator per-patch. A missing entry means every
188
188
  // descriptive field (`description`, `createdAt`, `category`) was
189
189
  // invented rather than preserved, and FireForge patch files carry no
190
- // header metadata that could carry a human description forward — so
190
+ // header metadata that could carry a human description forward, so
191
191
  // visibility is the best available, and silent overwrites of
192
192
  // human-written descriptions during a recovery run are the failure to
193
193
  // avoid.
194
194
  recoveredFilenames.push(patch.filename);
195
195
  }
196
- // The rebuild OWNS exactly two fields — `filesAffected` (recomputed from
196
+ // The rebuild owns exactly two fields: `filesAffected` (recomputed from
197
197
  // the patch body) and `order` (from the filename ordinal). Everything
198
198
  // else on an existing entry is carried forward by the spread, so a field
199
- // a .patch cannot express — `stagedDependencies`, `lintIgnore`, `tier`,
200
- // and whatever is added to PatchMetadata next — survives a repair by
201
- // construction rather than by someone remembering to list it here. It was
202
- // an enumerated literal until `stagedDependencies` was dropped from every
203
- // entry that had one, which is the failure this shape prevents from
204
- // recurring.
199
+ // a .patch cannot express (`stagedDependencies`, `lintIgnore`, `tier`,
200
+ // and whatever is added to PatchMetadata next) survives a repair without
201
+ // anyone remembering to list it here. It was an enumerated literal until
202
+ // `stagedDependencies` was dropped from every entry that had one, which
203
+ // is the failure this shape prevents from recurring.
205
204
  const rebuilt = {
206
205
  ...(existing ?? {}),
207
206
  filename: patch.filename,
@@ -228,9 +227,9 @@ async function rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVers
228
227
  patches: rebuiltPatches,
229
228
  };
230
229
  // Whatever is left in the map had a manifest row but no patch file, so the
231
- // rebuild drops it. That is the correct outcome — the file is the source of
232
- // truth — but dropping rows without naming them is indistinguishable from
233
- // never having had them.
230
+ // rebuild drops it. That is the correct outcome, since the file is the
231
+ // source of truth, but dropping rows without naming them is
232
+ // indistinguishable from never having had them.
234
233
  const droppedFilenames = [...existingEntries.keys()].sort((left, right) => left.localeCompare(right));
235
234
  if (options.dryRun === true) {
236
235
  return {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Narrow repair for `filesAffected` — the one manifest field a `.patch` body
2
+ * Narrow repair for `filesAffected`, the one manifest field a `.patch` body
3
3
  * can actually yield.
4
4
  *
5
5
  * A `files-affected-mismatch` is pure derived-value drift: the manifest's list
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Narrow repair for `filesAffected` — the one manifest field a `.patch` body
3
+ * Narrow repair for `filesAffected`, the one manifest field a `.patch` body
4
4
  * can actually yield.
5
5
  *
6
6
  * A `files-affected-mismatch` is pure derived-value drift: the manifest's list
@@ -47,7 +47,7 @@ async function repairPatchesFilesAffectedUnderLock(patchesDir, filenames, option
47
47
  const row = rowByFilename.get(filename);
48
48
  if (patchPath === undefined || !row) {
49
49
  // A missing patch file or a missing row is a different consistency
50
- // issue with a different remedy; this repair reports it rather than
50
+ // issue with a different remedy. This repair reports it rather than
51
51
  // inventing a row or deleting one.
52
52
  skippedFilenames.push(filename);
53
53
  continue;
@@ -63,7 +63,7 @@ async function repairPatchesFilesAffectedUnderLock(patchesDir, filenames, option
63
63
  return { repairs, skippedFilenames, written: false };
64
64
  }
65
65
  const correctedByFilename = new Map(repairs.map((repair) => [repair.filename, repair.after]));
66
- // Row-scoped mutation, so every untouched entry keeps its exact JSON shape —
66
+ // Row-scoped mutation, so every untouched entry keeps its exact JSON shape:
67
67
  // no re-sorted `filesAffected` lists and no reader-only fallback fields
68
68
  // serialized into rows this repair has no business touching.
69
69
  await mutatePatchRowsInManifest(patchesDir, [...correctedByFilename.keys()], (existing) => {
@@ -39,10 +39,10 @@ export declare function loadPatchesManifestState(patchesDir: string): Promise<Lo
39
39
  /**
40
40
  * Loads the patches manifest if it exists.
41
41
  *
42
- * READ-ONLY callers only: this collapses "absent" and "corrupt" into null.
43
- * Any code path that will WRITE the manifest (or delete patch files based
44
- * on its content) must use {@link loadPatchesManifestForWrite} instead —
45
- * treating a corrupt manifest as empty and then saving destroys every
42
+ * Read-only callers only: this collapses "absent" and "corrupt" into null.
43
+ * Any code path that writes the manifest (or deletes patch files based
44
+ * on its content) must use {@link loadPatchesManifestForWrite} instead.
45
+ * Treating a corrupt manifest as empty and then saving destroys every
46
46
  * existing patch's metadata.
47
47
  *
48
48
  * @param patchesDir - Path to the patches directory
@@ -52,7 +52,7 @@ export declare function loadPatchesManifest(patchesDir: string): Promise<Patches
52
52
  /**
53
53
  * Loads the patches manifest for a mutating operation.
54
54
  *
55
- * Returns null only when the manifest genuinely does not exist; a manifest
55
+ * Returns null only when the manifest genuinely does not exist. A manifest
56
56
  * that exists but fails to parse/validate throws
57
57
  * {@link PatchManifestCorruptError} so the caller aborts instead of
58
58
  * rebuilding an empty queue over the top of the corrupt file.
@@ -80,11 +80,11 @@ export declare function mutatePatchRowsInManifest(patchesDir: string, filenames:
80
80
  export declare function addPatchToManifest(patchesDir: string, metadata: PatchMetadata, removeFilenames?: string[]): Promise<void>;
81
81
  /**
82
82
  * Removes a single patch entry from the manifest by filename. Leaves the
83
- * ordinal gap in place — callers wanting to close the gap must use
83
+ * ordinal gap in place. Callers wanting to close the gap must use
84
84
  * {@link renumberPatchesInManifest} explicitly. This matches the spec: delete
85
85
  * is a row removal, not a resequencing.
86
86
  *
87
- * Not atomic with any on-disk patch file deletion; callers are expected to
87
+ * Not atomic with any on-disk patch file deletion. Callers are expected to
88
88
  * remove the .patch file separately under the same lock.
89
89
  *
90
90
  * @param patchesDir - Path to the patches directory
@@ -99,7 +99,7 @@ export declare function removePatchFromManifest(patchesDir: string, filename: st
99
99
  export interface PatchRenameEntry {
100
100
  /** New filename (e.g. `005-ui-sidebar.patch`). */
101
101
  newFilename: string;
102
- /** New numeric order — must match the prefix of `newFilename`. */
102
+ /** New numeric order. Must match the prefix of `newFilename`. */
103
103
  newOrder: number;
104
104
  }
105
105
  /**
@@ -129,7 +129,7 @@ export declare function rewriteStagedDependencyOwners(patch: PatchMetadata, rena
129
129
  * orders. Failure semantics:
130
130
  *
131
131
  * - **Phase 1 (stage)**: rolls back by renaming staged files back to
132
- * their originals. Manifest is untouched. Best-effort — a rollback
132
+ * their originals. Manifest is untouched. Best-effort: a rollback
133
133
  * rename failure is warned but not re-thrown.
134
134
  * - **Phase 2 (stage → final)**: rolls back to the pre-operation state
135
135
  * by reversing every partial step: files already at their final
@@ -138,13 +138,13 @@ export declare function rewriteStagedDependencyOwners(patch: PatchMetadata, rena
138
138
  * the rollback itself fails midway, the thrown error is augmented
139
139
  * with a description of the residue so the operator can inspect.
140
140
  * - **Phase 3 (manifest write)**: by this point all files are on disk
141
- * at their new names; a manifest write failure will roll the files
141
+ * at their new names. A manifest write failure will roll the files
142
142
  * back to their original names before re-throwing so the directory
143
143
  * and manifest stay in agreement. A rollback failure at this stage
144
144
  * is warned (manifest was never mutated) and the original error is
145
145
  * re-thrown.
146
146
  *
147
- * Does not sort the rename map for the caller — the map is the authoritative
147
+ * Does not sort the rename map for the caller. The map is the authoritative
148
148
  * plan. Entries not present in the map keep their existing filename and
149
149
  * order.
150
150
  *
@@ -154,7 +154,7 @@ export declare function rewriteStagedDependencyOwners(patch: PatchMetadata, rena
154
154
  export declare function renumberPatchesInManifest(patchesDir: string, renameMap: Map<string, PatchRenameEntry>): Promise<void>;
155
155
  /**
156
156
  * Thrown when {@link removePatchFileAndManifest} cannot complete the file
157
- * delete AND cannot restore the manifest row afterward, so the on-disk
157
+ * delete and cannot restore the manifest row afterward, so the on-disk
158
158
  * state and manifest state are known to disagree. Carries both the
159
159
  * primary delete error and the rollback error so the caller (and the
160
160
  * operator) can see the full failure chain instead of only the original
@@ -162,7 +162,7 @@ export declare function renumberPatchesInManifest(patchesDir: string, renameMap:
162
162
  *
163
163
  * Extends {@link FireForgeError} so the CLI top-level handler routes it
164
164
  * through the rich-error formatter rather than the generic unexpected-error
165
- * path; the dedicated `.name` is kept so programmatic callers and tests
165
+ * path. The dedicated `.name` is kept so programmatic callers and tests
166
166
  * can still distinguish it with `instanceof PatchDeleteRollbackError`.
167
167
  */
168
168
  export declare class PatchDeleteRollbackError extends FireForgeError {
@@ -174,7 +174,7 @@ export declare class PatchDeleteRollbackError extends FireForgeError {
174
174
  }
175
175
  /**
176
176
  * Deletes both a patch file on disk and its manifest row under the caller's
177
- * lock. This is a convenience for the `patch delete` command; callers that
177
+ * lock. This is a convenience for the `patch delete` command. Callers that
178
178
  * need different ordering (e.g. deleting the file first without touching the
179
179
  * manifest) should call the primitives separately.
180
180
  *
@@ -50,10 +50,10 @@ export async function loadPatchesManifestState(patchesDir) {
50
50
  /**
51
51
  * Loads the patches manifest if it exists.
52
52
  *
53
- * READ-ONLY callers only: this collapses "absent" and "corrupt" into null.
54
- * Any code path that will WRITE the manifest (or delete patch files based
55
- * on its content) must use {@link loadPatchesManifestForWrite} instead —
56
- * treating a corrupt manifest as empty and then saving destroys every
53
+ * Read-only callers only: this collapses "absent" and "corrupt" into null.
54
+ * Any code path that writes the manifest (or deletes patch files based
55
+ * on its content) must use {@link loadPatchesManifestForWrite} instead.
56
+ * Treating a corrupt manifest as empty and then saving destroys every
57
57
  * existing patch's metadata.
58
58
  *
59
59
  * @param patchesDir - Path to the patches directory
@@ -66,7 +66,7 @@ export async function loadPatchesManifest(patchesDir) {
66
66
  /**
67
67
  * Loads the patches manifest for a mutating operation.
68
68
  *
69
- * Returns null only when the manifest genuinely does not exist; a manifest
69
+ * Returns null only when the manifest genuinely does not exist. A manifest
70
70
  * that exists but fails to parse/validate throws
71
71
  * {@link PatchManifestCorruptError} so the caller aborts instead of
72
72
  * rebuilding an empty queue over the top of the corrupt file.
@@ -98,17 +98,18 @@ export async function mutatePatchRowsInManifest(patchesDir, filenames, mutator)
98
98
  if (!(await pathExistsStrict(manifestPath)))
99
99
  return null;
100
100
  const rawManifest = await readJson(manifestPath);
101
+ // `validatePatchesManifest` has already rejected a manifest that is not an
102
+ // object with an array of object rows (it throws the corruption error the
103
+ // caller expects), so the shape re-checks below are FireForge's own
104
+ // invariants, not input validation: failing them means the validator and
105
+ // this walker disagree about the manifest schema, which is a bug here.
101
106
  const beforeManifest = validatePatchesManifest(rawManifest);
102
- if (!isObject(rawManifest) || !isArray(rawManifest['patches'])) {
103
- throw new Error('patches.json must be a JSON object with a patches array');
104
- }
107
+ assert(isObject(rawManifest) && isArray(rawManifest['patches']), 'validated patches.json is a JSON object with a patches array');
105
108
  const filenameSet = new Set(filenames);
106
109
  if (filenameSet.size === 0)
107
110
  return [];
108
- const rawPatches = rawManifest['patches'].map((entry) => {
109
- if (!isObject(entry)) {
110
- throw new Error('patches.json patches entries must be objects');
111
- }
111
+ const rawPatches = rawManifest['patches'].map((entry, index) => {
112
+ assert(isObject(entry), () => `validated patches.json row ${index} is an object`);
112
113
  return { ...entry };
113
114
  });
114
115
  const changedIndexes = [];
@@ -174,11 +175,11 @@ export async function addPatchToManifest(patchesDir, metadata, removeFilenames)
174
175
  }
175
176
  /**
176
177
  * Removes a single patch entry from the manifest by filename. Leaves the
177
- * ordinal gap in place — callers wanting to close the gap must use
178
+ * ordinal gap in place. Callers wanting to close the gap must use
178
179
  * {@link renumberPatchesInManifest} explicitly. This matches the spec: delete
179
180
  * is a row removal, not a resequencing.
180
181
  *
181
- * Not atomic with any on-disk patch file deletion; callers are expected to
182
+ * Not atomic with any on-disk patch file deletion. Callers are expected to
182
183
  * remove the .patch file separately under the same lock.
183
184
  *
184
185
  * @param patchesDir - Path to the patches directory
@@ -209,7 +210,7 @@ export async function removePatchFromManifest(patchesDir, filename) {
209
210
  * sorted ascending (readers take manifest order as apply order without
210
211
  * re-sorting).
211
212
  *
212
- * Contiguity itself is deliberately NOT checked: `patchPolicy.ranges`
213
+ * Contiguity itself is not checked, on purpose: `patchPolicy.ranges`
213
214
  * reserves gaps on purpose, so a hole is a legitimate queue shape.
214
215
  *
215
216
  * @param patches - The manifest rows about to be written
@@ -287,7 +288,7 @@ export function rewriteStagedDependencyOwners(patch, renameLookup) {
287
288
  * orders. Failure semantics:
288
289
  *
289
290
  * - **Phase 1 (stage)**: rolls back by renaming staged files back to
290
- * their originals. Manifest is untouched. Best-effort — a rollback
291
+ * their originals. Manifest is untouched. Best-effort: a rollback
291
292
  * rename failure is warned but not re-thrown.
292
293
  * - **Phase 2 (stage → final)**: rolls back to the pre-operation state
293
294
  * by reversing every partial step: files already at their final
@@ -296,13 +297,13 @@ export function rewriteStagedDependencyOwners(patch, renameLookup) {
296
297
  * the rollback itself fails midway, the thrown error is augmented
297
298
  * with a description of the residue so the operator can inspect.
298
299
  * - **Phase 3 (manifest write)**: by this point all files are on disk
299
- * at their new names; a manifest write failure will roll the files
300
+ * at their new names. A manifest write failure will roll the files
300
301
  * back to their original names before re-throwing so the directory
301
302
  * and manifest stay in agreement. A rollback failure at this stage
302
303
  * is warned (manifest was never mutated) and the original error is
303
304
  * re-thrown.
304
305
  *
305
- * Does not sort the rename map for the caller — the map is the authoritative
306
+ * Does not sort the rename map for the caller. The map is the authoritative
306
307
  * plan. Entries not present in the map keep their existing filename and
307
308
  * order.
308
309
  *
@@ -359,7 +360,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
359
360
  await rename(join(patchesDir, staged), targetPath);
360
361
  // Postcondition assert: confirm the target actually exists on disk
361
362
  // before marking the rename complete. A silent rename failure leaves
362
- // the manifest and the filesystem disagreeing — manifest rewritten to
363
+ // the manifest and the filesystem disagreeing: manifest rewritten to
363
364
  // new filenames while the old files stay on disk. If the assert fires,
364
365
  // the Phase 2 rollback undoes prior moves before re-throwing.
365
366
  if (!(await pathExistsStrict(targetPath))) {
@@ -369,7 +370,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
369
370
  }
370
371
  }
371
372
  catch (error) {
372
- // Phase 2 rollback — reverse both the partial final-name moves and
373
+ // Phase 2 rollback: reverse both the partial final-name moves and
373
374
  // the phase-1 staging. This collapses the directory back to its
374
375
  // pre-operation filenames so the manifest (which was never
375
376
  // touched) remains consistent with what is on disk. If any
@@ -403,7 +404,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
403
404
  throw error;
404
405
  }
405
406
  // Phase 3: rewrite the manifest rows. Any entry without a rename keeps its
406
- // existing metadata; entries in the map get their filename + order
407
+ // existing metadata. Entries in the map get their filename + order
407
408
  // updated. Sort by the new order so the manifest remains ordered.
408
409
  const filenameUpdates = new Map();
409
410
  for (const [oldFilename, entry] of renameMap) {
@@ -427,13 +428,13 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
427
428
  try {
428
429
  // Phase 3 is the one write that makes the renumber visible. Every file
429
430
  // has already moved on disk, so a manifest that disagrees with the new
430
- // filenames is the worst outcome available here — the queue would apply
431
- // in an order nothing on disk reflects. The callers compute the rename
432
- // map (compact, reorder, export placement) and each maintains contiguity
433
- // on its own; this checks the property they are all supposed to produce,
434
- // at the single point where it becomes durable. Inside the try, so a
435
- // violation unwinds through the Phase 3 rollback that puts the filenames
436
- // back.
431
+ // filenames is the worst outcome available here, because the queue
432
+ // would apply in an order nothing on disk reflects. The callers compute
433
+ // the rename map (compact, reorder, export placement) and each maintains
434
+ // contiguity on its own. This checks the property they are all supposed
435
+ // to produce, at the single point where it becomes durable. Inside the
436
+ // try, so a violation unwinds through the Phase 3 rollback that puts the
437
+ // filenames back.
437
438
  assertRenumberedOrderIsWellFormed(updatedPatches);
438
439
  await savePatchesManifest(patchesDir, {
439
440
  ...manifest,
@@ -444,7 +445,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
444
445
  // Phase 3 rollback: reverse every completed rename. The manifest
445
446
  // save failed before it could be persisted, so the on-disk state
446
447
  // must match what the manifest still records. Best-effort: any
447
- // individual step that fails gets warned; the original save
448
+ // individual step that fails gets warned. The original save
448
449
  // error is always re-thrown so the caller sees the real cause.
449
450
  for (const completed of completedFinalRenames) {
450
451
  try {
@@ -459,7 +460,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
459
460
  }
460
461
  /**
461
462
  * Thrown when {@link removePatchFileAndManifest} cannot complete the file
462
- * delete AND cannot restore the manifest row afterward, so the on-disk
463
+ * delete and cannot restore the manifest row afterward, so the on-disk
463
464
  * state and manifest state are known to disagree. Carries both the
464
465
  * primary delete error and the rollback error so the caller (and the
465
466
  * operator) can see the full failure chain instead of only the original
@@ -467,7 +468,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
467
468
  *
468
469
  * Extends {@link FireForgeError} so the CLI top-level handler routes it
469
470
  * through the rich-error formatter rather than the generic unexpected-error
470
- * path; the dedicated `.name` is kept so programmatic callers and tests
471
+ * path. The dedicated `.name` is kept so programmatic callers and tests
471
472
  * can still distinguish it with `instanceof PatchDeleteRollbackError`.
472
473
  */
473
474
  export class PatchDeleteRollbackError extends FireForgeError {
@@ -489,7 +490,7 @@ export class PatchDeleteRollbackError extends FireForgeError {
489
490
  }
490
491
  /**
491
492
  * Deletes both a patch file on disk and its manifest row under the caller's
492
- * lock. This is a convenience for the `patch delete` command; callers that
493
+ * lock. This is a convenience for the `patch delete` command. Callers that
493
494
  * need different ordering (e.g. deleting the file first without touching the
494
495
  * manifest) should call the primitives separately.
495
496
  *
@@ -507,8 +508,8 @@ export class PatchDeleteRollbackError extends FireForgeError {
507
508
  export async function removePatchFileAndManifest(patchesDir, filename) {
508
509
  await assertPatchDirectoryLockHeld(patchesDir, 'deleting a patch and its manifest row');
509
510
  const patchPath = join(patchesDir, filename);
510
- // ForWrite: deleting the patch FILE while a corrupt manifest still
511
- // references it would strand the queue; abort on corruption instead.
511
+ // ForWrite: deleting the patch file while a corrupt manifest still
512
+ // references it would strand the queue. Abort on corruption instead.
512
513
  const originalManifest = await loadPatchesManifestForWrite(patchesDir);
513
514
  const removedFromManifest = await removePatchFromManifest(patchesDir, filename);
514
515
  try {
@@ -45,7 +45,7 @@ export declare function validatePatchIntegrity(patchesDir: string, engineDir: st
45
45
  *
46
46
  * Acquires the shared patch-directory lock for the read-modify-write, so a
47
47
  * concurrent export/reorder/metadata update cannot interleave with the stamp.
48
- * The lock is not reentrant — callers must NOT invoke this while already
48
+ * The lock is not reentrant: callers must not invoke this while already
49
49
  * holding {@link withPatchDirectoryLock} on the same patches directory.
50
50
  *
51
51
  * @param patchesDir - Path to the patches directory
@@ -80,9 +80,9 @@ export async function validatePatchIntegrity(patchesDir, engineDir) {
80
80
  const issues = [];
81
81
  const patches = await discoverPatches(patchesDir);
82
82
  // Collect every modification target first, then resolve HEAD existence in
83
- // ONE batched ls-tree pass (chunked for ARG_MAX). The per-file
83
+ // one batched ls-tree pass (chunked for ARG_MAX). The per-file
84
84
  // fileExistsInHead fan-out spawned one git process per (patch × target) on
85
- // every import — a 56-file branding patch alone cost ~56 spawns before a
85
+ // every import: a 56-file branding patch alone cost ~56 spawns before a
86
86
  // single patch was applied.
87
87
  const modificationTargets = [];
88
88
  for (const patch of patches) {
@@ -90,7 +90,7 @@ export async function validatePatchIntegrity(patchesDir, engineDir) {
90
90
  const patchContent = await readText(patch.path);
91
91
  const targetFiles = await getAllTargetFilesFromPatch(patch.path);
92
92
  for (const targetFile of targetFiles) {
93
- // Skip new-file sections — they don't need to exist in HEAD
93
+ // Skip new-file sections. They don't need to exist in HEAD
94
94
  if (isNewFileInPatch(patchContent, targetFile))
95
95
  continue;
96
96
  modificationTargets.push({ filename: patch.filename, targetFile });
@@ -114,7 +114,7 @@ export async function validatePatchIntegrity(patchesDir, engineDir) {
114
114
  *
115
115
  * Acquires the shared patch-directory lock for the read-modify-write, so a
116
116
  * concurrent export/reorder/metadata update cannot interleave with the stamp.
117
- * The lock is not reentrant — callers must NOT invoke this while already
117
+ * The lock is not reentrant: callers must not invoke this while already
118
118
  * holding {@link withPatchDirectoryLock} on the same patches directory.
119
119
  *
120
120
  * @param patchesDir - Path to the patches directory
@@ -2,12 +2,12 @@ import type { PatchMetadata } from '../types/commands/index.js';
2
2
  /**
3
3
  * Resolves a patch identifier to its manifest entry. Accepts:
4
4
  *
5
- * 1. An ordinal number (e.g. `2`) — matches `PatchMetadata.order`.
6
- * 2. A full filename with `.patch` suffix (e.g. `002-ui-foo.patch`) —
7
- * matches `PatchMetadata.filename`.
8
- * 3. A filename without the `.patch` suffix — the command appends it
5
+ * 1. An ordinal number (e.g. `2`), matching `PatchMetadata.order`.
6
+ * 2. A full filename with `.patch` suffix (e.g. `002-ui-foo.patch`),
7
+ * matching `PatchMetadata.filename`.
8
+ * 3. A filename without the `.patch` suffix. The command appends it
9
9
  * before matching (e.g. `002-ui-foo`).
10
- * 4. The manifest `name` field (e.g. `furnace-token-override`) — the short
10
+ * 4. The manifest `name` field (e.g. `furnace-token-override`), the short
11
11
  * logical handle the export workflow stamps onto the patch and the
12
12
  * natural identifier an operator keeps in their notes. The CLI help
13
13
  * says `<name>`, so rejecting it forces the operator to copy the full