@hominis/fireforge 0.45.0 → 0.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/CHANGELOG.md +409 -446
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +21 -15
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +46 -0
  6. package/dist/src/cli-usage-error.js +81 -0
  7. package/dist/src/cli.d.ts +7 -2
  8. package/dist/src/cli.js +47 -47
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +3 -4
  11. package/dist/src/commands/build.js +27 -17
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +19 -0
  14. package/dist/src/commands/destructive-decision.js +31 -0
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -10
  17. package/dist/src/commands/doctor-check-core.js +0 -8
  18. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  20. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  21. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  22. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  23. package/dist/src/commands/doctor-furnace.js +22 -22
  24. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
  25. package/dist/src/commands/doctor-orphaned-harness.js +14 -23
  26. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  27. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  28. package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
  29. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  30. package/dist/src/commands/doctor-source-pin.js +14 -14
  31. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  32. package/dist/src/commands/doctor-working-tree.js +3 -3
  33. package/dist/src/commands/doctor.d.ts +3 -1
  34. package/dist/src/commands/doctor.js +15 -16
  35. package/dist/src/commands/download.js +50 -37
  36. package/dist/src/commands/export-all.js +29 -12
  37. package/dist/src/commands/export-flow.d.ts +5 -5
  38. package/dist/src/commands/export-flow.js +29 -59
  39. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  40. package/dist/src/commands/export-placement-conflicts.js +12 -12
  41. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  42. package/dist/src/commands/export-placement-gate.js +7 -13
  43. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  44. package/dist/src/commands/export-placement-policy.js +4 -6
  45. package/dist/src/commands/export-shared.d.ts +51 -32
  46. package/dist/src/commands/export-shared.js +17 -32
  47. package/dist/src/commands/export.js +14 -5
  48. package/dist/src/commands/furnace/apply.js +16 -16
  49. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  50. package/dist/src/commands/furnace/authoring-config.js +19 -0
  51. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  52. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  54. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  55. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  56. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  57. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  58. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  59. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  60. package/dist/src/commands/furnace/create-browser-test.js +7 -12
  61. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  62. package/dist/src/commands/furnace/create-dry-run.js +6 -9
  63. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  64. package/dist/src/commands/furnace/create-features.js +2 -2
  65. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  66. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  67. package/dist/src/commands/furnace/create-templates.d.ts +31 -15
  68. package/dist/src/commands/furnace/create-templates.js +20 -19
  69. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  70. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  71. package/dist/src/commands/furnace/create.d.ts +1 -1
  72. package/dist/src/commands/furnace/create.js +35 -29
  73. package/dist/src/commands/furnace/deploy.js +15 -6
  74. package/dist/src/commands/furnace/diff.js +7 -7
  75. package/dist/src/commands/furnace/index.js +1 -1
  76. package/dist/src/commands/furnace/init.js +17 -16
  77. package/dist/src/commands/furnace/list.js +2 -2
  78. package/dist/src/commands/furnace/override.d.ts +1 -1
  79. package/dist/src/commands/furnace/override.js +43 -34
  80. package/dist/src/commands/furnace/preview.js +17 -17
  81. package/dist/src/commands/furnace/refresh.js +15 -7
  82. package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
  83. package/dist/src/commands/furnace/remove-mutations.js +19 -19
  84. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  85. package/dist/src/commands/furnace/remove-state.js +1 -1
  86. package/dist/src/commands/furnace/remove.js +4 -8
  87. package/dist/src/commands/furnace/rename-browser-test.js +10 -15
  88. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  89. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  90. package/dist/src/commands/furnace/rename.js +36 -36
  91. package/dist/src/commands/furnace/scan.js +3 -3
  92. package/dist/src/commands/furnace/status.js +19 -16
  93. package/dist/src/commands/furnace/sync.js +6 -6
  94. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  95. package/dist/src/commands/furnace/test-file-name.js +39 -0
  96. package/dist/src/commands/furnace/validate.js +11 -12
  97. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  98. package/dist/src/commands/furnace/validation-output.js +3 -8
  99. package/dist/src/commands/import.js +22 -29
  100. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  101. package/dist/src/commands/lint-per-patch.js +27 -12
  102. package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
  103. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  104. package/dist/src/commands/lint-report.d.ts +3 -3
  105. package/dist/src/commands/lint-report.js +4 -4
  106. package/dist/src/commands/lint.d.ts +5 -4
  107. package/dist/src/commands/lint.js +36 -36
  108. package/dist/src/commands/manifest.d.ts +4 -4
  109. package/dist/src/commands/manifest.js +1 -1
  110. package/dist/src/commands/package.js +4 -6
  111. package/dist/src/commands/patch/compact.d.ts +2 -2
  112. package/dist/src/commands/patch/compact.js +19 -20
  113. package/dist/src/commands/patch/delete.d.ts +1 -1
  114. package/dist/src/commands/patch/delete.js +23 -33
  115. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  116. package/dist/src/commands/patch/entry-projection.js +24 -0
  117. package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
  118. package/dist/src/commands/patch/lint-ignore.js +33 -44
  119. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  120. package/dist/src/commands/patch/move-files-create.js +29 -15
  121. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  122. package/dist/src/commands/patch/move-files-into.js +41 -37
  123. package/dist/src/commands/patch/move-files.js +5 -14
  124. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  125. package/dist/src/commands/patch/rename.d.ts +4 -4
  126. package/dist/src/commands/patch/rename.js +35 -49
  127. package/dist/src/commands/patch/reorder.js +35 -48
  128. package/dist/src/commands/patch/split-plan.d.ts +7 -8
  129. package/dist/src/commands/patch/split-plan.js +10 -13
  130. package/dist/src/commands/patch/split.d.ts +2 -2
  131. package/dist/src/commands/patch/split.js +50 -48
  132. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  133. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  134. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  135. package/dist/src/commands/patch/staged-dependency.js +22 -28
  136. package/dist/src/commands/patch/tier.d.ts +2 -2
  137. package/dist/src/commands/patch/tier.js +20 -30
  138. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  139. package/dist/src/commands/patch-rename-map.js +36 -0
  140. package/dist/src/commands/pending-resolution.d.ts +15 -0
  141. package/dist/src/commands/pending-resolution.js +25 -0
  142. package/dist/src/commands/re-export-adjacent.d.ts +25 -3
  143. package/dist/src/commands/re-export-adjacent.js +40 -24
  144. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  145. package/dist/src/commands/re-export-bulk-scan.js +23 -27
  146. package/dist/src/commands/re-export-drift.d.ts +10 -10
  147. package/dist/src/commands/re-export-drift.js +33 -33
  148. package/dist/src/commands/re-export-files.d.ts +2 -3
  149. package/dist/src/commands/re-export-files.js +52 -44
  150. package/dist/src/commands/re-export-lint.d.ts +29 -30
  151. package/dist/src/commands/re-export-lint.js +36 -29
  152. package/dist/src/commands/re-export-options.d.ts +1 -1
  153. package/dist/src/commands/re-export-options.js +1 -1
  154. package/dist/src/commands/re-export-register.d.ts +1 -1
  155. package/dist/src/commands/re-export-register.js +1 -1
  156. package/dist/src/commands/re-export-scan.d.ts +1 -1
  157. package/dist/src/commands/re-export-scan.js +12 -9
  158. package/dist/src/commands/re-export-single.d.ts +23 -4
  159. package/dist/src/commands/re-export-single.js +39 -31
  160. package/dist/src/commands/re-export.js +35 -17
  161. package/dist/src/commands/rebase/abort.js +9 -14
  162. package/dist/src/commands/rebase/continue.js +20 -19
  163. package/dist/src/commands/rebase/index.d.ts +1 -1
  164. package/dist/src/commands/rebase/index.js +5 -5
  165. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  166. package/dist/src/commands/rebase/patch-loop.js +20 -24
  167. package/dist/src/commands/register.js +5 -5
  168. package/dist/src/commands/reset.js +1 -1
  169. package/dist/src/commands/resolve.d.ts +2 -2
  170. package/dist/src/commands/resolve.js +21 -13
  171. package/dist/src/commands/run.d.ts +0 -13
  172. package/dist/src/commands/run.js +38 -51
  173. package/dist/src/commands/setup-support.d.ts +16 -4
  174. package/dist/src/commands/setup-support.js +20 -20
  175. package/dist/src/commands/setup.js +4 -10
  176. package/dist/src/commands/source.js +9 -2
  177. package/dist/src/commands/status-check.d.ts +3 -3
  178. package/dist/src/commands/status-check.js +6 -6
  179. package/dist/src/commands/status-json.d.ts +14 -13
  180. package/dist/src/commands/status-json.js +9 -8
  181. package/dist/src/commands/status-output.d.ts +3 -3
  182. package/dist/src/commands/status-output.js +5 -5
  183. package/dist/src/commands/status-ownership.d.ts +3 -3
  184. package/dist/src/commands/status-ownership.js +3 -3
  185. package/dist/src/commands/status.js +25 -26
  186. package/dist/src/commands/test-build-phase.d.ts +3 -3
  187. package/dist/src/commands/test-build-phase.js +48 -24
  188. package/dist/src/commands/test-diagnose.d.ts +1 -1
  189. package/dist/src/commands/test-diagnose.js +20 -20
  190. package/dist/src/commands/test-modes.d.ts +4 -4
  191. package/dist/src/commands/test-modes.js +4 -5
  192. package/dist/src/commands/test-register.js +5 -3
  193. package/dist/src/commands/test-run.d.ts +11 -11
  194. package/dist/src/commands/test-run.js +40 -33
  195. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  196. package/dist/src/commands/test-stale-gate.js +17 -17
  197. package/dist/src/commands/test-verdict.d.ts +19 -5
  198. package/dist/src/commands/test-verdict.js +26 -11
  199. package/dist/src/commands/test.d.ts +3 -3
  200. package/dist/src/commands/test.js +73 -36
  201. package/dist/src/commands/token-coverage.js +3 -3
  202. package/dist/src/commands/token-list.d.ts +26 -0
  203. package/dist/src/commands/token-list.js +153 -0
  204. package/dist/src/commands/token.js +26 -10
  205. package/dist/src/commands/tree.js +26 -21
  206. package/dist/src/commands/typecheck.d.ts +6 -6
  207. package/dist/src/commands/typecheck.js +16 -16
  208. package/dist/src/commands/verify.d.ts +3 -3
  209. package/dist/src/commands/verify.js +10 -10
  210. package/dist/src/commands/watch.js +11 -11
  211. package/dist/src/commands/wire.js +17 -16
  212. package/dist/src/core/ast-utils.d.ts +7 -7
  213. package/dist/src/core/ast-utils.js +8 -8
  214. package/dist/src/core/branding.d.ts +5 -12
  215. package/dist/src/core/branding.js +6 -5
  216. package/dist/src/core/browser-wire.d.ts +1 -1
  217. package/dist/src/core/browser-wire.js +10 -7
  218. package/dist/src/core/build-audit-platform.d.ts +32 -3
  219. package/dist/src/core/build-audit-platform.js +153 -13
  220. package/dist/src/core/build-audit-registration.d.ts +5 -5
  221. package/dist/src/core/build-audit-registration.js +10 -9
  222. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  223. package/dist/src/core/build-audit-resolve.js +6 -6
  224. package/dist/src/core/build-audit-skip.d.ts +57 -0
  225. package/dist/src/core/build-audit-skip.js +112 -0
  226. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  227. package/dist/src/core/build-audit-transforms.js +3 -3
  228. package/dist/src/core/build-audit.d.ts +21 -8
  229. package/dist/src/core/build-audit.js +142 -40
  230. package/dist/src/core/build-baseline-types.d.ts +19 -18
  231. package/dist/src/core/build-baseline-types.js +1 -1
  232. package/dist/src/core/build-baseline.d.ts +48 -31
  233. package/dist/src/core/build-baseline.js +20 -43
  234. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  235. package/dist/src/core/build-jar-escalation.js +18 -17
  236. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  237. package/dist/src/core/build-overwrite-guard.js +14 -14
  238. package/dist/src/core/build-prepare.d.ts +4 -12
  239. package/dist/src/core/build-prepare.js +22 -26
  240. package/dist/src/core/config-mutate.js +4 -4
  241. package/dist/src/core/config-paths.d.ts +2 -6
  242. package/dist/src/core/config-paths.js +4 -2
  243. package/dist/src/core/config-state.d.ts +0 -6
  244. package/dist/src/core/config-state.js +3 -21
  245. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  246. package/dist/src/core/config-validate-build-audit.js +80 -0
  247. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  248. package/dist/src/core/config-validate-file-size.js +3 -3
  249. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  250. package/dist/src/core/config-validate-patch-policy.js +3 -3
  251. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  252. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  253. package/dist/src/core/config-validate.js +22 -12
  254. package/dist/src/core/config.d.ts +12 -12
  255. package/dist/src/core/config.js +21 -25
  256. package/dist/src/core/coverage-extend.d.ts +16 -16
  257. package/dist/src/core/coverage-extend.js +20 -20
  258. package/dist/src/core/destructive.d.ts +14 -14
  259. package/dist/src/core/destructive.js +9 -9
  260. package/dist/src/core/diff-hunks.d.ts +2 -2
  261. package/dist/src/core/diff-hunks.js +7 -7
  262. package/dist/src/core/discard-baseline.d.ts +10 -10
  263. package/dist/src/core/discard-baseline.js +22 -23
  264. package/dist/src/core/display-state.d.ts +11 -11
  265. package/dist/src/core/display-state.js +12 -12
  266. package/dist/src/core/engine-changes.d.ts +2 -2
  267. package/dist/src/core/engine-changes.js +2 -2
  268. package/dist/src/core/engine-precondition.d.ts +5 -13
  269. package/dist/src/core/engine-precondition.js +5 -10
  270. package/dist/src/core/engine-session-lock.d.ts +18 -18
  271. package/dist/src/core/engine-session-lock.js +50 -54
  272. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  273. package/dist/src/core/export-moved-code-shape.js +10 -10
  274. package/dist/src/core/file-lock-owner.d.ts +103 -0
  275. package/dist/src/core/file-lock-owner.js +259 -0
  276. package/dist/src/core/file-lock.d.ts +14 -19
  277. package/dist/src/core/file-lock.js +90 -128
  278. package/dist/src/core/firefox-cache.d.ts +13 -1
  279. package/dist/src/core/firefox-cache.js +61 -36
  280. package/dist/src/core/firefox-download.d.ts +15 -0
  281. package/dist/src/core/firefox-download.js +38 -22
  282. package/dist/src/core/firefox-extract.d.ts +8 -7
  283. package/dist/src/core/firefox-extract.js +45 -27
  284. package/dist/src/core/firefox.d.ts +34 -36
  285. package/dist/src/core/firefox.js +13 -44
  286. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  287. package/dist/src/core/furnace-apply-dry-run.js +2 -8
  288. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  289. package/dist/src/core/furnace-apply-ftl.js +8 -8
  290. package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
  291. package/dist/src/core/furnace-apply-helpers.js +28 -39
  292. package/dist/src/core/furnace-apply-output.js +1 -1
  293. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  294. package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
  295. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  296. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  297. package/dist/src/core/furnace-apply.d.ts +4 -4
  298. package/dist/src/core/furnace-apply.js +50 -29
  299. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  300. package/dist/src/core/furnace-checksum-utils.js +5 -5
  301. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  302. package/dist/src/core/furnace-config-custom.js +2 -2
  303. package/dist/src/core/furnace-config-order.js +1 -1
  304. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  305. package/dist/src/core/furnace-config-tokens.js +3 -3
  306. package/dist/src/core/furnace-config-validate.js +2 -2
  307. package/dist/src/core/furnace-config.d.ts +5 -5
  308. package/dist/src/core/furnace-config.js +40 -53
  309. package/dist/src/core/furnace-constants.d.ts +6 -6
  310. package/dist/src/core/furnace-constants.js +9 -8
  311. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  312. package/dist/src/core/furnace-css-fragments.js +11 -11
  313. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  314. package/dist/src/core/furnace-dir-entry.js +21 -0
  315. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  316. package/dist/src/core/furnace-jsconfig.js +22 -20
  317. package/dist/src/core/furnace-operation.d.ts +22 -19
  318. package/dist/src/core/furnace-operation.js +38 -34
  319. package/dist/src/core/furnace-precondition.d.ts +10 -10
  320. package/dist/src/core/furnace-precondition.js +8 -8
  321. package/dist/src/core/furnace-refresh.d.ts +18 -6
  322. package/dist/src/core/furnace-refresh.js +5 -8
  323. package/dist/src/core/furnace-registration-ast.d.ts +2 -3
  324. package/dist/src/core/furnace-registration-ast.js +9 -12
  325. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  326. package/dist/src/core/furnace-registration-remove.js +6 -6
  327. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  328. package/dist/src/core/furnace-registration-validate.js +2 -2
  329. package/dist/src/core/furnace-registration.d.ts +7 -6
  330. package/dist/src/core/furnace-registration.js +29 -36
  331. package/dist/src/core/furnace-rollback.d.ts +1 -1
  332. package/dist/src/core/furnace-rollback.js +5 -5
  333. package/dist/src/core/furnace-scanner.js +3 -6
  334. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  335. package/dist/src/core/furnace-stale-export.js +16 -15
  336. package/dist/src/core/furnace-staleness.d.ts +2 -2
  337. package/dist/src/core/furnace-staleness.js +2 -2
  338. package/dist/src/core/furnace-state-persist.d.ts +12 -12
  339. package/dist/src/core/furnace-state-persist.js +10 -10
  340. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  341. package/dist/src/core/furnace-step-errors.js +6 -6
  342. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  343. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  344. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  345. package/dist/src/core/furnace-validate-registration.js +18 -20
  346. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  347. package/dist/src/core/furnace-validate-structure.js +4 -4
  348. package/dist/src/core/furnace-validate.js +9 -9
  349. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  350. package/dist/src/core/furnace-version-drift.js +5 -5
  351. package/dist/src/core/git-base.d.ts +6 -4
  352. package/dist/src/core/git-base.js +29 -7
  353. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  354. package/dist/src/core/git-diff-new-file.js +119 -0
  355. package/dist/src/core/git-diff.d.ts +13 -13
  356. package/dist/src/core/git-diff.js +121 -189
  357. package/dist/src/core/git-file-ops.d.ts +6 -13
  358. package/dist/src/core/git-file-ops.js +11 -35
  359. package/dist/src/core/git-readonly-index.d.ts +12 -14
  360. package/dist/src/core/git-readonly-index.js +12 -16
  361. package/dist/src/core/git-status.d.ts +9 -2
  362. package/dist/src/core/git-status.js +23 -11
  363. package/dist/src/core/git.d.ts +3 -9
  364. package/dist/src/core/git.js +28 -57
  365. package/dist/src/core/harness-orphans.d.ts +17 -17
  366. package/dist/src/core/harness-orphans.js +28 -27
  367. package/dist/src/core/history-log.d.ts +19 -0
  368. package/dist/src/core/history-log.js +29 -0
  369. package/dist/src/core/license-headers.d.ts +19 -18
  370. package/dist/src/core/license-headers.js +29 -28
  371. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  372. package/dist/src/core/mach-build-artifacts.js +23 -23
  373. package/dist/src/core/mach-error-hints.d.ts +5 -10
  374. package/dist/src/core/mach-error-hints.js +14 -14
  375. package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
  376. package/dist/src/core/mach-known-noise-filter.js +57 -56
  377. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  378. package/dist/src/core/mach-mozconfig.js +17 -16
  379. package/dist/src/core/mach-python.d.ts +3 -0
  380. package/dist/src/core/mach-python.js +13 -7
  381. package/dist/src/core/mach-resource-shim.d.ts +24 -12
  382. package/dist/src/core/mach-resource-shim.js +124 -21
  383. package/dist/src/core/mach.d.ts +59 -73
  384. package/dist/src/core/mach.js +47 -115
  385. package/dist/src/core/marionette-port.d.ts +15 -30
  386. package/dist/src/core/marionette-port.js +46 -89
  387. package/dist/src/core/marionette-preflight.d.ts +6 -6
  388. package/dist/src/core/marionette-preflight.js +32 -50
  389. package/dist/src/core/markdown-table.d.ts +9 -9
  390. package/dist/src/core/markdown-table.js +14 -14
  391. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  392. package/dist/src/core/mochitest-server-port.js +17 -17
  393. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  394. package/dist/src/core/module-resolution-preflight.js +11 -11
  395. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  396. package/dist/src/core/moz-manifest-helpers.js +7 -7
  397. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  398. package/dist/src/core/moz-manifest-register.js +2 -2
  399. package/dist/src/core/moz-manifest-rules.js +46 -42
  400. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  401. package/dist/src/core/ownership-table.d.ts +5 -5
  402. package/dist/src/core/ownership-table.js +7 -7
  403. package/dist/src/core/parser-fallback.d.ts +3 -3
  404. package/dist/src/core/parser-fallback.js +3 -3
  405. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  406. package/dist/src/core/patch-apply-fuzz.js +13 -13
  407. package/dist/src/core/patch-apply.d.ts +13 -14
  408. package/dist/src/core/patch-apply.js +36 -42
  409. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  410. package/dist/src/core/patch-export-coverage.js +1 -30
  411. package/dist/src/core/patch-export-update.d.ts +21 -4
  412. package/dist/src/core/patch-export-update.js +7 -6
  413. package/dist/src/core/patch-export.d.ts +20 -30
  414. package/dist/src/core/patch-export.js +55 -77
  415. package/dist/src/core/patch-files.d.ts +0 -4
  416. package/dist/src/core/patch-files.js +0 -11
  417. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  418. package/dist/src/core/patch-identifier-suggest.js +4 -4
  419. package/dist/src/core/patch-lint-binary.d.ts +12 -18
  420. package/dist/src/core/patch-lint-cache.d.ts +18 -2
  421. package/dist/src/core/patch-lint-cache.js +16 -19
  422. package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
  423. package/dist/src/core/patch-lint-checkjs.js +78 -64
  424. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  425. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  426. package/dist/src/core/patch-lint-creators.d.ts +5 -9
  427. package/dist/src/core/patch-lint-creators.js +3 -3
  428. package/dist/src/core/patch-lint-cross.d.ts +27 -19
  429. package/dist/src/core/patch-lint-cross.js +67 -110
  430. package/dist/src/core/patch-lint-css.d.ts +1 -1
  431. package/dist/src/core/patch-lint-css.js +15 -11
  432. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  433. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  434. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  435. package/dist/src/core/patch-lint-diff.js +4 -4
  436. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  437. package/dist/src/core/patch-lint-file-size.js +6 -6
  438. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  439. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  440. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  441. package/dist/src/core/patch-lint-jsdoc.js +46 -46
  442. package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
  443. package/dist/src/core/patch-lint-module-registration.js +1 -1
  444. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  445. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  446. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  447. package/dist/src/core/patch-lint-observer.js +7 -7
  448. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  449. package/dist/src/core/patch-lint-ownership.js +6 -6
  450. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  451. package/dist/src/core/patch-lint-prettier.js +7 -7
  452. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  453. package/dist/src/core/patch-lint-queue-types.js +12 -0
  454. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  455. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  456. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  457. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  458. package/dist/src/core/patch-lint.d.ts +41 -35
  459. package/dist/src/core/patch-lint.js +52 -49
  460. package/dist/src/core/patch-lock.d.ts +1 -1
  461. package/dist/src/core/patch-lock.js +11 -11
  462. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  463. package/dist/src/core/patch-manifest-consistency.js +16 -17
  464. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  465. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  466. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  467. package/dist/src/core/patch-manifest-io.js +35 -34
  468. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  469. package/dist/src/core/patch-manifest-query.js +4 -4
  470. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  471. package/dist/src/core/patch-manifest-resolve.js +7 -7
  472. package/dist/src/core/patch-manifest-validate.js +3 -3
  473. package/dist/src/core/patch-manifest.d.ts +2 -2
  474. package/dist/src/core/patch-manifest.js +2 -2
  475. package/dist/src/core/patch-parse.d.ts +32 -21
  476. package/dist/src/core/patch-parse.js +40 -15
  477. package/dist/src/core/patch-policy.js +15 -27
  478. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  479. package/dist/src/core/patch-registration-refs.js +7 -7
  480. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  481. package/dist/src/core/patch-source-metadata.js +0 -4
  482. package/dist/src/core/patch-transform.d.ts +8 -16
  483. package/dist/src/core/patch-transform.js +13 -23
  484. package/dist/src/core/process-cpu-time.d.ts +1 -1
  485. package/dist/src/core/process-cpu-time.js +6 -6
  486. package/dist/src/core/rebase-session.d.ts +9 -15
  487. package/dist/src/core/rebase-session.js +13 -25
  488. package/dist/src/core/register-browser-content.js +3 -2
  489. package/dist/src/core/register-browser-test.js +2 -1
  490. package/dist/src/core/register-module.js +2 -1
  491. package/dist/src/core/register-result.d.ts +1 -1
  492. package/dist/src/core/register-result.js +1 -1
  493. package/dist/src/core/register-scaffold.d.ts +2 -2
  494. package/dist/src/core/register-scaffold.js +8 -7
  495. package/dist/src/core/register-shared-css.d.ts +3 -3
  496. package/dist/src/core/register-shared-css.js +6 -5
  497. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  498. package/dist/src/core/register-xpcshell-test.js +2 -2
  499. package/dist/src/core/run-log-redact.d.ts +38 -0
  500. package/dist/src/core/run-log-redact.js +69 -0
  501. package/dist/src/core/run-log.d.ts +21 -10
  502. package/dist/src/core/run-log.js +76 -27
  503. package/dist/src/core/shared-ftl.d.ts +2 -2
  504. package/dist/src/core/shared-ftl.js +6 -6
  505. package/dist/src/core/signal-critical.d.ts +2 -2
  506. package/dist/src/core/signal-critical.js +4 -6
  507. package/dist/src/core/smoke-patterns.d.ts +5 -6
  508. package/dist/src/core/smoke-patterns.js +15 -20
  509. package/dist/src/core/state-file.d.ts +15 -4
  510. package/dist/src/core/state-file.js +14 -1
  511. package/dist/src/core/status-binary.d.ts +8 -8
  512. package/dist/src/core/status-binary.js +12 -12
  513. package/dist/src/core/status-classify.d.ts +17 -17
  514. package/dist/src/core/status-classify.js +13 -12
  515. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  516. package/dist/src/core/test-changed-prefs.js +40 -25
  517. package/dist/src/core/test-harness-crash.d.ts +39 -39
  518. package/dist/src/core/test-harness-crash.js +69 -69
  519. package/dist/src/core/test-harness-output.d.ts +7 -7
  520. package/dist/src/core/test-harness-output.js +7 -7
  521. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  522. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  523. package/dist/src/core/test-path-scope.d.ts +8 -8
  524. package/dist/src/core/test-path-scope.js +11 -11
  525. package/dist/src/core/test-stale-check.d.ts +22 -23
  526. package/dist/src/core/test-stale-check.js +31 -30
  527. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  528. package/dist/src/core/test-stale-symlink.js +1 -1
  529. package/dist/src/core/test-stall-triage.d.ts +9 -9
  530. package/dist/src/core/test-stall-triage.js +22 -22
  531. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  532. package/dist/src/core/test-xpcshell-retry.js +14 -11
  533. package/dist/src/core/token-category.d.ts +35 -2
  534. package/dist/src/core/token-category.js +67 -58
  535. package/dist/src/core/token-coverage.js +4 -5
  536. package/dist/src/core/token-dark-mode.d.ts +9 -9
  537. package/dist/src/core/token-dark-mode.js +13 -25
  538. package/dist/src/core/token-docs.d.ts +1 -1
  539. package/dist/src/core/token-inventory.d.ts +56 -0
  540. package/dist/src/core/token-inventory.js +109 -0
  541. package/dist/src/core/token-manager.d.ts +4 -4
  542. package/dist/src/core/token-manager.js +22 -22
  543. package/dist/src/core/token-scaffold.d.ts +4 -4
  544. package/dist/src/core/token-scaffold.js +4 -4
  545. package/dist/src/core/token-variant.d.ts +14 -14
  546. package/dist/src/core/token-variant.js +52 -53
  547. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  548. package/dist/src/core/toolchain-preflight.js +23 -23
  549. package/dist/src/core/tree-cow.d.ts +3 -5
  550. package/dist/src/core/tree-cow.js +8 -8
  551. package/dist/src/core/tree-guard.d.ts +3 -3
  552. package/dist/src/core/tree-guard.js +23 -23
  553. package/dist/src/core/tree-store.d.ts +15 -15
  554. package/dist/src/core/tree-store.js +39 -38
  555. package/dist/src/core/typecheck-shim.d.ts +16 -15
  556. package/dist/src/core/typecheck-shim.js +26 -25
  557. package/dist/src/core/typecheck.d.ts +12 -12
  558. package/dist/src/core/typecheck.js +33 -33
  559. package/dist/src/core/wire-destroy.d.ts +2 -2
  560. package/dist/src/core/wire-destroy.js +5 -5
  561. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  562. package/dist/src/core/wire-dom-fragment.js +12 -23
  563. package/dist/src/core/wire-init.d.ts +2 -2
  564. package/dist/src/core/wire-init.js +7 -7
  565. package/dist/src/core/wire-subscript.d.ts +1 -1
  566. package/dist/src/core/wire-subscript.js +3 -3
  567. package/dist/src/core/wire-utils.d.ts +9 -9
  568. package/dist/src/core/wire-utils.js +16 -28
  569. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  570. package/dist/src/core/xpcshell-appdir.js +28 -30
  571. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  572. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  573. package/dist/src/errors/base.d.ts +69 -16
  574. package/dist/src/errors/base.js +95 -26
  575. package/dist/src/errors/build.d.ts +6 -6
  576. package/dist/src/errors/build.js +26 -34
  577. package/dist/src/errors/codes.d.ts +10 -10
  578. package/dist/src/errors/codes.js +10 -10
  579. package/dist/src/errors/config.d.ts +0 -14
  580. package/dist/src/errors/config.js +13 -34
  581. package/dist/src/errors/download.d.ts +13 -0
  582. package/dist/src/errors/download.js +53 -24
  583. package/dist/src/errors/furnace.d.ts +2 -2
  584. package/dist/src/errors/furnace.js +8 -9
  585. package/dist/src/errors/git.d.ts +9 -9
  586. package/dist/src/errors/git.js +21 -31
  587. package/dist/src/errors/patch.d.ts +3 -3
  588. package/dist/src/errors/patch.js +11 -13
  589. package/dist/src/errors/rebase.d.ts +1 -1
  590. package/dist/src/errors/rebase.js +8 -8
  591. package/dist/src/errors/run.d.ts +1 -1
  592. package/dist/src/errors/run.js +1 -1
  593. package/dist/src/index.d.ts +4 -4
  594. package/dist/src/index.js +4 -4
  595. package/dist/src/types/commands/options.d.ts +155 -200
  596. package/dist/src/types/commands/patches.d.ts +19 -19
  597. package/dist/src/types/commands/project.d.ts +3 -3
  598. package/dist/src/types/config.d.ts +52 -19
  599. package/dist/src/types/furnace.d.ts +17 -17
  600. package/dist/src/types/index.d.ts +0 -1
  601. package/dist/src/types/json.d.ts +3 -3
  602. package/dist/src/types/json.js +2 -2
  603. package/dist/src/types/typecheck.d.ts +3 -3
  604. package/dist/src/utils/assert.d.ts +4 -16
  605. package/dist/src/utils/assert.js +7 -24
  606. package/dist/src/utils/build-info.d.ts +6 -6
  607. package/dist/src/utils/build-info.js +6 -6
  608. package/dist/src/utils/child-env.d.ts +7 -6
  609. package/dist/src/utils/child-env.js +5 -5
  610. package/dist/src/utils/concurrency.d.ts +2 -2
  611. package/dist/src/utils/concurrency.js +2 -2
  612. package/dist/src/utils/elapsed.js +10 -1
  613. package/dist/src/utils/errors.d.ts +8 -8
  614. package/dist/src/utils/errors.js +8 -8
  615. package/dist/src/utils/fs.d.ts +1 -1
  616. package/dist/src/utils/fs.js +15 -20
  617. package/dist/src/utils/hash.d.ts +12 -0
  618. package/dist/src/utils/hash.js +16 -0
  619. package/dist/src/utils/line-dispatch.d.ts +15 -0
  620. package/dist/src/utils/line-dispatch.js +48 -0
  621. package/dist/src/utils/logger.d.ts +4 -4
  622. package/dist/src/utils/logger.js +11 -11
  623. package/dist/src/utils/machine-output.js +2 -2
  624. package/dist/src/utils/options.d.ts +14 -20
  625. package/dist/src/utils/options.js +26 -27
  626. package/dist/src/utils/package-root.js +5 -14
  627. package/dist/src/utils/paths.d.ts +4 -4
  628. package/dist/src/utils/paths.js +4 -4
  629. package/dist/src/utils/platform.d.ts +0 -4
  630. package/dist/src/utils/process-group.d.ts +10 -9
  631. package/dist/src/utils/process-group.js +37 -36
  632. package/dist/src/utils/process.d.ts +70 -55
  633. package/dist/src/utils/process.js +129 -179
  634. package/dist/src/utils/ps-duration.d.ts +4 -4
  635. package/dist/src/utils/ps-duration.js +9 -9
  636. package/dist/src/utils/regex.d.ts +4 -4
  637. package/dist/src/utils/regex.js +7 -7
  638. package/dist/src/utils/sleep.d.ts +26 -0
  639. package/dist/src/utils/sleep.js +31 -0
  640. package/dist/src/utils/stdio-drain.d.ts +7 -7
  641. package/dist/src/utils/stdio-drain.js +8 -8
  642. package/dist/src/utils/validation.d.ts +12 -49
  643. package/dist/src/utils/validation.js +26 -36
  644. package/docs/README.md +2 -2
  645. package/docs/configuration.md +163 -69
  646. package/docs/exit-codes.md +66 -49
  647. package/docs/furnace.md +20 -19
  648. package/docs/lifecycle-invariants.md +414 -247
  649. package/docs/machine-output.md +58 -34
  650. package/docs/patch-workflow.md +48 -44
  651. package/docs/run-logs.md +72 -28
  652. package/docs/testing.md +105 -98
  653. package/docs/verification-trees.md +23 -22
  654. package/package.json +7 -6
  655. package/dist/src/commands/rebase.d.ts +0 -4
  656. package/dist/src/commands/rebase.js +0 -5
  657. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  658. package/dist/src/core/patch-artifact-normalize.js +0 -24
  659. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  660. package/dist/src/core/patch-lint-reexports.js +0 -8
  661. package/dist/src/core/wire-targets.d.ts +0 -7
  662. package/dist/src/core/wire-targets.js +0 -8
@@ -1,15 +1,15 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge patch rename <name>` — relabels a patch's filename, manifest
3
+ * `fireforge patch rename <name>`: relabels a patch's filename, manifest
4
4
  * `name`, and (optionally) `description` without rewriting the `.patch` file
5
5
  * body.
6
6
  *
7
7
  * Companion to `re-export --files <subset>`. Re-export shrinks the body and
8
8
  * `filesAffected` but leaves the patch's identity describing the pre-shrink
9
9
  * scope. The only alternative for that drift is `delete` + re-export, which
10
- * briefly removes the patch from the queue — any forward-import dependent
11
- * then refuses the re-export until the deleted patch's siblings are
12
- * rewritten.
10
+ * briefly removes the patch from the queue, and any forward-import
11
+ * dependent then refuses the re-export until the deleted patch's siblings
12
+ * are rewritten.
13
13
  *
14
14
  * The filename rename and the manifest mutation happen under the patch
15
15
  * directory lock so concurrent exports cannot allocate the new filename, and
@@ -19,7 +19,8 @@ import { rename as fsRename } from 'node:fs/promises';
19
19
  import { join } from 'node:path';
20
20
  import { Command } from 'commander';
21
21
  import { loadConfig } from '../../core/config.js';
22
- import { appendHistory, confirmDestructive } from '../../core/destructive.js';
22
+ import { confirmDestructive } from '../../core/destructive.js';
23
+ import { appendHistoryBestEffort } from '../../core/history-log.js';
23
24
  import { patchNameSlug } from '../../core/patch-export.js';
24
25
  import { buildPatchQueueContext, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
25
26
  import { withPatchDirectoryLock } from '../../core/patch-lock.js';
@@ -30,6 +31,8 @@ import { toError } from '../../utils/errors.js';
30
31
  import { pathExists } from '../../utils/fs.js';
31
32
  import { info, intro, outro, warn } from '../../utils/logger.js';
32
33
  import { addWaitLockOption, commanderArgParser, pickDefined, resolveWaitLockSeconds, } from '../../utils/options.js';
34
+ import { parsePositiveIntegerFlag } from '../../utils/validation.js';
35
+ import { proceedAfterDecision } from '../destructive-decision.js';
33
36
  import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
34
37
  import { projectReorder } from './reorder.js';
35
38
  /**
@@ -51,7 +54,7 @@ function splitPatchFilename(filename) {
51
54
  * renames the `.patch` file on disk (when applicable), writes the
52
55
  * updated manifest, and appends a history entry. Filesystem rename
53
56
  * happens before the manifest save so an interrupted run never leaves
54
- * the manifest pointing at a missing file; a manifest-save failure
57
+ * the manifest pointing at a missing file. A manifest-save failure
55
58
  * rolls the filesystem rename back.
56
59
  */
57
60
  async function commitRenameUnderLock(input) {
@@ -76,7 +79,7 @@ async function commitRenameUnderLock(input) {
76
79
  if (orderChanging && input.newOrder !== undefined) {
77
80
  const orderHolder = fresh.patches.find((p) => p.order === input.newOrder && p.filename !== target.filename);
78
81
  if (orderHolder) {
79
- throw new InvalidArgumentError(`Order ${String(input.newOrder)} was claimed by ${orderHolder.filename} concurrently. Pick an unused order, or use "fireforge patch reorder" to renumber siblings.`, '--order');
82
+ throw new InvalidArgumentError(`Order ${input.newOrder} was claimed by ${orderHolder.filename} concurrently. Pick an unused order, or use "fireforge patch reorder" to renumber siblings.`, '--order');
80
83
  }
81
84
  }
82
85
  let oldPath;
@@ -99,7 +102,7 @@ async function commitRenameUnderLock(input) {
99
102
  ...(descriptionChanging ? { description: newDescription ?? '' } : {}),
100
103
  };
101
104
  // Staged-dependency owners on other patches reference the old
102
- // filename; remap them so forward-import declarations survive the
105
+ // filename. Remap them so forward-import declarations survive the
103
106
  // rename instead of dangling.
104
107
  const ownerLookup = (old) => old === target.filename ? newFilename : undefined;
105
108
  fresh.patches = fresh.patches.map((p) => rewriteStagedDependencyOwners(p, ownerLookup));
@@ -136,28 +139,23 @@ async function commitRenameUnderLock(input) {
136
139
  else {
137
140
  await savePatchesManifest(patchesDir, fresh);
138
141
  }
139
- try {
140
- await appendHistory(patchesDir, {
141
- operation: 'patch-rename',
142
- args: {
143
- oldFilename: target.filename,
144
- newFilename,
145
- oldName: target.name,
146
- newName,
147
- ...(descriptionChanging ? { oldDescription: target.description, newDescription } : {}),
148
- ...(orderChanging ? { oldOrder: target.order, newOrder: input.newOrder } : {}),
149
- ...(categoryChanging
150
- ? { oldCategory: target.category, newCategory: input.newCategory }
151
- : {}),
152
- },
153
- ...(input.yes === true ? { yes: true } : {}),
154
- ...(input.forceUnsafe === true ? { unsafeOverride: true } : {}),
155
- result: 'ok',
156
- });
157
- }
158
- catch (historyError) {
159
- warn(`History log append failed after patch rename committed (${newFilename}): ${toError(historyError).message}`);
160
- }
142
+ await appendHistoryBestEffort(patchesDir, {
143
+ operation: 'patch-rename',
144
+ args: {
145
+ oldFilename: target.filename,
146
+ newFilename,
147
+ oldName: target.name,
148
+ newName,
149
+ ...(descriptionChanging ? { oldDescription: target.description, newDescription } : {}),
150
+ ...(orderChanging ? { oldOrder: target.order, newOrder: input.newOrder } : {}),
151
+ ...(categoryChanging
152
+ ? { oldCategory: target.category, newCategory: input.newCategory }
153
+ : {}),
154
+ },
155
+ ...(input.yes === true ? { yes: true } : {}),
156
+ ...(input.forceUnsafe === true ? { unsafeOverride: true } : {}),
157
+ result: 'ok',
158
+ }, `patch rename committed (${newFilename})`);
161
159
  }, { waitLockSeconds: input.waitLockSeconds, command: 'patch rename' });
162
160
  }
163
161
  /** Validates the flags and resolves the new filename/identity fields. */
@@ -184,7 +182,7 @@ function resolveRenamePlan(target, options, config) {
184
182
  if (newSlug === '') {
185
183
  throw new InvalidArgumentError('--to must contain at least one alphanumeric character after sanitisation.', 'patch rename');
186
184
  }
187
- // Preserve the ordinal's zero-padding width; a wider order simply
185
+ // Preserve the ordinal's zero-padding width. A wider order simply
188
186
  // prints unpadded-longer.
189
187
  const newOrdinalStr = options.order !== undefined
190
188
  ? String(options.order).padStart(split.ordinalStr.length, '0')
@@ -205,7 +203,7 @@ function resolveRenamePlan(target, options, config) {
205
203
  }
206
204
  /**
207
205
  * Pre-flight refusals: order collision (with a pointer to the verb that
208
- * renumbers siblings — `--order` means "this exact unused sparse slot",
206
+ * renumbers siblings, and `--order` means "this exact unused sparse slot",
209
207
  * mirroring `export --order`), projected cross-patch lint on an order
210
208
  * change (forward imports resolve by queue position), and the
211
209
  * filename collision. The authoritative collision checks run again inside
@@ -215,14 +213,14 @@ async function assertRenamePreconditions(patchesDir, manifest, target, plan, opt
215
213
  if (plan.orderChanging && options.order !== undefined) {
216
214
  const holder = manifest.patches.find((p) => p.order === options.order && p.filename !== target.filename);
217
215
  if (holder) {
218
- throw new InvalidArgumentError(`Order ${String(options.order)} is already used by ${holder.filename}. Pick an unused order, or use "fireforge patch reorder ${target.filename} --to ${String(options.order)}" to renumber siblings.`, '--order');
216
+ throw new InvalidArgumentError(`Order ${options.order} is already used by ${holder.filename}. Pick an unused order, or use "fireforge patch reorder ${target.filename} --to ${options.order}" to renumber siblings.`, '--order');
219
217
  }
220
218
  if (options.forceUnsafe !== true) {
221
219
  const baseCtx = await buildPatchQueueContext(patchesDir, config);
222
220
  const projected = projectReorder(baseCtx, new Map([[target.filename, { newFilename: plan.newFilename, newOrder: options.order }]]));
223
221
  const projectedErrors = lintPatchQueue(projected).filter((i) => i.severity === 'error');
224
222
  if (projectedErrors.length > 0) {
225
- throw new InvalidArgumentError(`Refusing to run patch rename: the order change would introduce ${String(projectedErrors.length)} cross-patch lint error(s):\n ${projectedErrors
223
+ throw new InvalidArgumentError(`Refusing to run patch rename: the order change would introduce ${projectedErrors.length} cross-patch lint error(s):\n ${projectedErrors
226
224
  .map(formatPatchLintIssue)
227
225
  .join('\n ')}\nPass --force-unsafe to override.`, '--force-unsafe');
228
226
  }
@@ -248,7 +246,7 @@ function buildRenameSummary(target, plan, options) {
248
246
  summary.push(`description: "${target.description || '(none)'}" → "${options.description ?? '(none)'}"`);
249
247
  }
250
248
  if (plan.orderChanging && options.order !== undefined) {
251
- summary.push(`order: ${String(target.order)} → ${String(options.order)}`);
249
+ summary.push(`order: ${target.order} → ${options.order}`);
252
250
  }
253
251
  if (plan.categoryChanging) {
254
252
  summary.push(`category: ${target.category} → ${plan.newCategory}`);
@@ -309,14 +307,8 @@ export async function patchRenameCommand(projectRoot, identifier, options = {})
309
307
  dryRun: isDryRun,
310
308
  conflicts: null,
311
309
  });
312
- if (decision === 'dry-run') {
313
- outro('Dry run complete — no changes made');
314
- return;
315
- }
316
- if (decision === 'declined') {
317
- outro('Rename cancelled');
310
+ if (!proceedAfterDecision(decision, 'Rename cancelled'))
318
311
  return;
319
- }
320
312
  await commitRenameUnderLock({
321
313
  patchesDir: paths.patches,
322
314
  target,
@@ -356,13 +348,7 @@ export function registerPatchRename(parent, context) {
356
348
  .description('Rename a patch: filename, manifest name, category, order, and/or description update in one transaction without rewriting the .patch body.')
357
349
  .option('--to <new-name>', 'New human-readable name, category-prefixed slug, or full filename stem (normalised into the filename slug)')
358
350
  .option('--category <category>', 'New category for the patch (validated against configured categories); rewrites the filename prefix and manifest row in one transaction')
359
- .option('--order <n>', 'Move the patch to this exact unused order; refuses on collision — use "patch reorder" to renumber siblings', commanderArgParser((raw) => {
360
- const n = Number.parseInt(raw, 10);
361
- if (!Number.isInteger(n) || n <= 0) {
362
- throw new InvalidArgumentError(`--order must be a positive integer, got "${raw}".`, '--order');
363
- }
364
- return n;
365
- }))
351
+ .option('--order <n>', 'Move the patch to this exact unused order; refuses on collision — use "patch reorder" to renumber siblings', commanderArgParser((raw) => parsePositiveIntegerFlag('--order', raw)))
366
352
  .option('-d, --description <text>', 'Replacement description (omit to leave description unchanged)')
367
353
  .option('--dry-run', 'Show what would change without writing')
368
354
  .option('-y, --yes', 'Skip confirmation prompt (required for non-TTY)')
@@ -10,16 +10,18 @@
10
10
  */
11
11
  import { Command, Option } from 'commander';
12
12
  import { loadConfig } from '../../core/config.js';
13
- import { appendHistory, confirmDestructive, } from '../../core/destructive.js';
13
+ import { confirmDestructive, } from '../../core/destructive.js';
14
+ import { appendHistoryBestEffort } from '../../core/history-log.js';
14
15
  import { buildPatchQueueContext, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
15
16
  import { withPatchDirectoryLock } from '../../core/patch-lock.js';
16
17
  import { loadPatchesManifest, renumberPatchesInManifest, resolvePatchIdentifier, rewriteStagedDependencyOwners, } from '../../core/patch-manifest.js';
17
18
  import { applyRenameMapToManifest, enforcePatchPolicy } from '../../core/patch-policy.js';
18
19
  import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
19
- import { toError } from '../../utils/errors.js';
20
- import { info, intro, outro, warn } from '../../utils/logger.js';
20
+ import { info, intro, outro } from '../../utils/logger.js';
21
21
  import { addWaitLockOption, commanderArgParser, pickDefined, resolveWaitLockSeconds, } from '../../utils/options.js';
22
22
  import { parsePositiveIntegerFlag } from '../../utils/validation.js';
23
+ import { proceedAfterDecision } from '../destructive-decision.js';
24
+ import { getSortedRenameEntries, renameMapsEqual } from '../patch-rename-map.js';
23
25
  import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
24
26
  /** Zero-pads an ordinal number to the given width. */
25
27
  function padOrder(value, width) {
@@ -39,10 +41,10 @@ export function rebuildFilenameForOrder(existing, newOrder) {
39
41
  * blocks the destination slot is renumbered, so intentional gaps left by
40
42
  * prior `patch delete` calls survive the reorder.
41
43
  *
42
- * Algorithm: remove target from the sorted list, then cascade: if any
43
- * patch sits at the destination order, bump it to order+1; if that
44
- * collides with the next patch, bump that one too; continue until a free
45
- * slot is reached. The direction is symmetric — moving a patch earlier
44
+ * Algorithm: remove target from the sorted list, then cascade. If any
45
+ * patch sits at the destination order, bump it to order+1. If that
46
+ * collides with the next patch, bump that one too. Continue until a free
47
+ * slot is reached. The direction is symmetric: moving a patch earlier
46
48
  * and moving it later both reduce to "find a free slot at destination by
47
49
  * shifting the contiguous conflicting run upward".
48
50
  */
@@ -60,7 +62,7 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
60
62
  if (clampedDest === target.order)
61
63
  return renames;
62
64
  // Build a mutable order-for-each map so cascading bumps compose. Keys are
63
- // filenames; values start as current order and get rewritten as bumps
65
+ // filenames. Values start as current order and get rewritten as bumps
64
66
  // propagate. Only patches whose value changes end up in the rename map.
65
67
  const currentOrder = new Map();
66
68
  for (const patch of withoutTarget)
@@ -68,7 +70,7 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
68
70
  // Cascade from the destination: while any surviving patch occupies the
69
71
  // slot we want, bump it to slot+1 and advance. Patches are processed in
70
72
  // ascending order so each bump's collision (if any) is with the immediate
71
- // successor in the sort — no back-tracking needed.
73
+ // successor in the sort, so no back-tracking is needed.
72
74
  let slot = clampedDest;
73
75
  for (const patch of withoutTarget) {
74
76
  const order = currentOrder.get(patch.filename);
@@ -98,25 +100,6 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
98
100
  });
99
101
  return renames;
100
102
  }
101
- function getSortedRenameEntries(renameMap) {
102
- return Array.from(renameMap.entries()).sort((a, b) => a[1].newOrder - b[1].newOrder);
103
- }
104
- function renameMapsEqual(left, right) {
105
- const leftEntries = getSortedRenameEntries(left);
106
- const rightEntries = getSortedRenameEntries(right);
107
- if (leftEntries.length !== rightEntries.length) {
108
- return false;
109
- }
110
- return leftEntries.every(([leftFilename, leftEntry], index) => {
111
- const rightTuple = rightEntries[index];
112
- if (!rightTuple)
113
- return false;
114
- const [rightFilename, rightEntry] = rightTuple;
115
- return (leftFilename === rightFilename &&
116
- leftEntry.newFilename === rightEntry.newFilename &&
117
- leftEntry.newOrder === rightEntry.newOrder);
118
- });
119
- }
120
103
  /**
121
104
  * Applies a rename map to a {@link PatchQueueContext} so cross-patch lint
122
105
  * can run against the projected state without touching disk. Exported for
@@ -126,7 +109,7 @@ export function projectReorder(base, renameMap) {
126
109
  const ownerLookup = (oldFilename) => renameMap.get(oldFilename)?.newFilename;
127
110
  const projectedEntries = base.entries.map((entry) => {
128
111
  // Project staged-dependency owner references through the rename map on
129
- // every entry — owners point at *other* patches' filenames, so a
112
+ // every entry. Owners point at other patches' filenames, so a
130
113
  // projection that skips non-renamed entries would lint against stale
131
114
  // owners and report false forward-import regressions.
132
115
  const metadata = entry.metadata
@@ -159,7 +142,7 @@ function resolveDestination(target, manifestPatches, options) {
159
142
  // integers, but the function is reachable from tests that may pass
160
143
  // `{ to: NaN }` directly.
161
144
  if (!Number.isInteger(options.to) || options.to <= 0) {
162
- throw new InvalidArgumentError(`--to must be a positive integer, got ${String(options.to)}.`, '--to');
145
+ throw new InvalidArgumentError(`--to must be a positive integer, got ${options.to}.`, '--to');
163
146
  }
164
147
  return { destinationOrder: options.to, anchorFilename: undefined };
165
148
  }
@@ -169,7 +152,7 @@ function resolveDestination(target, manifestPatches, options) {
169
152
  throw new InvalidArgumentError(`--before anchor "${options.before}" not found.`, '--before');
170
153
  }
171
154
  // Reject self-reference. `--before <target>` resolves to the target's
172
- // current order, so computeRenameMap would take its no-op branch — but
155
+ // current order, so computeRenameMap would take its no-op branch, but
173
156
  // that masks a user-facing typo or scripted mistake instead of
174
157
  // surfacing it. The symmetric `--after` case is worse (mutates the
175
158
  // queue), so both reject for consistency.
@@ -195,7 +178,14 @@ function resolveDestination(target, manifestPatches, options) {
195
178
  }
196
179
  return { destinationOrder: anchor.order + 1, anchorFilename: anchor.filename };
197
180
  }
198
- async function commitReorderPlan(patchesDir, target, renameMap, anchorFilename, options, config, buildHistoryEntry) {
181
+ /**
182
+ * Re-validates the reorder against the freshly-loaded manifest and commits
183
+ * it, all under the patch directory lock.
184
+ *
185
+ * @param commitOptions - See {@link CommitReorderPlanOptions}
186
+ */
187
+ async function commitReorderPlan(commitOptions) {
188
+ const { patchesDir, target, renameMap, anchorFilename, options, config, buildHistoryEntry } = commitOptions;
199
189
  await withPatchDirectoryLock(patchesDir, async () => {
200
190
  const currentManifest = await loadPatchesManifest(patchesDir);
201
191
  if (!currentManifest || currentManifest.patches.length === 0) {
@@ -248,12 +238,7 @@ async function commitReorderPlan(patchesDir, target, renameMap, anchorFilename,
248
238
  // permissions) is warned but not re-thrown: the mutation has already
249
239
  // succeeded and is not reversible, so surfacing it as a command
250
240
  // failure would mislead.
251
- try {
252
- await appendHistory(patchesDir, buildHistoryEntry(currentRenameMap));
253
- }
254
- catch (historyError) {
255
- warn(`History log append failed after patch reorder committed: ${toError(historyError).message}`);
256
- }
241
+ await appendHistoryBestEffort(patchesDir, buildHistoryEntry(currentRenameMap), `patch reorder committed`);
257
242
  }, { waitLockSeconds: resolveWaitLockSeconds(options.waitLock), command: 'patch reorder' });
258
243
  }
259
244
  /**
@@ -290,7 +275,7 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
290
275
  return;
291
276
  }
292
277
  // Project the reorder through cross-patch lint. Forward-import violations
293
- // that are introduced *by* the reorder become hard refusals.
278
+ // that the reorder itself introduces become hard refusals.
294
279
  const baseCtx = await buildPatchQueueContext(paths.patches);
295
280
  const projected = projectReorder(baseCtx, renameMap);
296
281
  const projectedIssues = lintPatchQueue(projected);
@@ -329,16 +314,10 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
329
314
  unsafeOverride: options.forceUnsafe === true,
330
315
  conflicts,
331
316
  });
332
- if (decision === 'dry-run') {
333
- outro('Dry run complete — no changes made');
334
- return;
335
- }
336
- if (decision === 'declined') {
337
- outro('Reorder cancelled');
317
+ if (!proceedAfterDecision(decision, 'Reorder cancelled'))
338
318
  return;
339
- }
340
319
  // The history entry is built inside commitReorderPlan (still under the
341
- // lock) from the *final* rename map, not the pre-confirmation one, so
320
+ // lock) from the final rename map rather than the pre-confirmation one, so
342
321
  // the destinationOrder and renames mirror what actually landed on disk.
343
322
  const buildHistoryEntry = (finalRenameMap) => {
344
323
  const finalEntries = getSortedRenameEntries(finalRenameMap);
@@ -359,7 +338,15 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
359
338
  result: 'ok',
360
339
  };
361
340
  };
362
- await commitReorderPlan(paths.patches, target, renameMap, anchorFilename, options, config, buildHistoryEntry);
341
+ await commitReorderPlan({
342
+ patchesDir: paths.patches,
343
+ target,
344
+ renameMap,
345
+ anchorFilename,
346
+ options,
347
+ config,
348
+ buildHistoryEntry,
349
+ });
363
350
  info(`Reordered ${renameMap.size} patch(es).`);
364
351
  outro('Reorder complete');
365
352
  }
@@ -3,13 +3,12 @@
3
3
  * construction from the worktree, staged-dependency owner-rewrite
4
4
  * discovery, cross-patch lint projection, and policy-manifest projection.
5
5
  * Split out of `split.ts` to keep both files within the per-file line
6
- * budget; consumed only by the split command.
6
+ * budget. It is consumed only by the split command.
7
7
  */
8
8
  import { type ConflictReport } from '../../core/destructive.js';
9
- import { buildPatchQueueContext } from '../../core/patch-lint.js';
10
- import { buildProjectedManifest } from '../../core/patch-policy.js';
9
+ import type { PatchQueueContext } from '../../core/patch-lint-cross.js';
11
10
  import type { PatchStagedForwardImport } from '../../types/commands/index.js';
12
- import type { PatchCategory, PatchMetadata } from '../../types/commands/index.js';
11
+ import type { PatchCategory, PatchesManifest, PatchMetadata } from '../../types/commands/index.js';
13
12
  import type { FireForgeConfig } from '../../types/config.js';
14
13
  import { type PlacementPlan } from '../export-flow.js';
15
14
  /** Everything the commit step needs, computed and confirmed up front. */
@@ -34,7 +33,7 @@ export interface SplitPlan {
34
33
  /**
35
34
  * Staged forward-import declarations the split introduces, keyed by the
36
35
  * importing patch's post-rename filename. These are the new forward edges
37
- * from existing patches into the freshly-created patch (owner known); they
36
+ * from existing patches into the freshly-created patch (owner known). They
38
37
  * are injected into the projected lint so dry-run matches the real gate,
39
38
  * and persisted on commit so the real per-patch gate stays clean.
40
39
  */
@@ -68,7 +67,7 @@ export declare function mergeStagedForwardImports(patch: PatchMetadata, decls: r
68
67
  * patch are auto-declared (and the declarations returned) so the projection
69
68
  * matches the real per-patch gate the split leaves behind.
70
69
  */
71
- export declare function runProjectedSplitLint(plan: SplitPlan, baseCtx: Awaited<ReturnType<typeof buildPatchQueueContext>>): {
70
+ export declare function runProjectedSplitLint(plan: SplitPlan, baseCtx: PatchQueueContext): {
72
71
  conflicts: ConflictReport | null;
73
72
  stagedDependencyAdditions: Map<string, PatchStagedForwardImport[]>;
74
73
  };
@@ -76,14 +75,14 @@ export declare function runProjectedSplitLint(plan: SplitPlan, baseCtx: Awaited<
76
75
  export declare function projectSplitManifest(manifest: {
77
76
  version: 1;
78
77
  patches: PatchMetadata[];
79
- }, plan: SplitPlan, newMetadata: PatchMetadata): ReturnType<typeof buildProjectedManifest>;
78
+ }, plan: SplitPlan, newMetadata: PatchMetadata): PatchesManifest;
80
79
  /**
81
80
  * Builds the manifest row for the patch created by a split, carrying the
82
81
  * source's provenance (product, version, category) onto the new patch.
83
82
  */
84
83
  export declare function buildNewPatchMetadata(plan: SplitPlan, config: FireForgeConfig): PatchMetadata;
85
84
  /**
86
- * Renders the operator-facing summary lines for a planned split — the text
85
+ * Renders the operator-facing summary lines for a planned split: the text
87
86
  * shown by `--dry-run` and by the destructive-operation confirmation prompt.
88
87
  */
89
88
  export declare function buildSplitSummary(plan: SplitPlan): string[];
@@ -4,22 +4,22 @@
4
4
  * construction from the worktree, staged-dependency owner-rewrite
5
5
  * discovery, cross-patch lint projection, and policy-manifest projection.
6
6
  * Split out of `split.ts` to keep both files within the per-file line
7
- * budget; consumed only by the split command.
7
+ * budget. It is consumed only by the split command.
8
8
  */
9
9
  import { join } from 'node:path';
10
10
  import {} from '../../core/destructive.js';
11
11
  import { getDiffForFilesAgainstHead } from '../../core/git-diff.js';
12
12
  import { extractAffectedFiles } from '../../core/patch-apply.js';
13
- import { buildModifiedFileAdditionsFromDiff, buildPatchQueueContext, collectForwardImportEdges, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
13
+ import { collectForwardImportEdges, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
14
14
  import { computeProjectedLintRegressions } from '../../core/patch-lint-projection.js';
15
15
  import { rewriteStagedDependencyOwners } from '../../core/patch-manifest.js';
16
16
  import { applyRenameMapToManifest, buildProjectedManifest } from '../../core/patch-policy.js';
17
17
  import { buildPatchSourceMetadata } from '../../core/patch-source-metadata.js';
18
- import { buildNewFileTextProjection } from '../../core/patch-transform.js';
19
18
  import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
20
19
  import { pathExists } from '../../utils/fs.js';
21
20
  import { warn } from '../../utils/logger.js';
22
21
  import {} from '../export-flow.js';
22
+ import { projectEntryBody } from './entry-projection.js';
23
23
  /**
24
24
  * Refuses the split unless the source patch currently owns every requested
25
25
  * file. Splitting out a file the source does not own would produce a new patch
@@ -81,10 +81,6 @@ export function rewriteSplitOwners(patch, sourceFilename, movedSet, newFilename)
81
81
  },
82
82
  };
83
83
  }
84
- function buildEntryProjection(diff) {
85
- const newFiles = buildNewFileTextProjection(diff);
86
- return { diff, newFiles, modifiedFileAdditions: buildModifiedFileAdditionsFromDiff(diff) };
87
- }
88
84
  /** Builds the projected post-split queue entries (renumber + shrunken source + new patch). */
89
85
  function buildProjectedSplitEntries(baseCtx, plan) {
90
86
  const movedSet = new Set(plan.movedFiles);
@@ -101,13 +97,13 @@ function buildProjectedSplitEntries(baseCtx, plan) {
101
97
  : { ...entry, metadata };
102
98
  if (entry.filename !== plan.source.filename)
103
99
  return base;
104
- return { ...base, ...buildEntryProjection(plan.remainingDiff) };
100
+ return { ...base, ...projectEntryBody(plan.remainingDiff) };
105
101
  });
106
102
  entries.push({
107
103
  filename: plan.placement.newFilename,
108
104
  order: plan.placement.insertionOrder,
109
105
  metadata: null,
110
- ...buildEntryProjection(plan.movedDiff),
106
+ ...projectEntryBody(plan.movedDiff),
111
107
  });
112
108
  entries.sort((a, b) => a.order - b.order || a.filename.localeCompare(b.filename));
113
109
  return entries;
@@ -115,11 +111,12 @@ function buildProjectedSplitEntries(baseCtx, plan) {
115
111
  /**
116
112
  * Computes the staged forward-import declarations the split introduces:
117
113
  * forward edges from existing patches into the freshly-created patch (its
118
- * `creates` files are the moved files; the owner is the new patch, so it is
119
- * known). Keyed by the importing patch's projected (post-rename) filename.
114
+ * `creates` files are the moved files, and the owner is the new patch, so
115
+ * it is known). Keyed by the importing patch's projected (post-rename)
116
+ * filename.
120
117
  *
121
118
  * These edges did not exist before the split (importer and imported file
122
- * lived in the same patch), so they have no declaration yet — without this
119
+ * lived in the same patch), so they have no declaration yet. Without this
123
120
  * the projected lint flags them while the real per-patch gate would resolve
124
121
  * them once declared. Auto-declaring keeps the two in lock-step and lets a
125
122
  * sound split read as sound.
@@ -237,7 +234,7 @@ export function buildNewPatchMetadata(plan, config) {
237
234
  };
238
235
  }
239
236
  /**
240
- * Renders the operator-facing summary lines for a planned split — the text
237
+ * Renders the operator-facing summary lines for a planned split: the text
241
238
  * shown by `--dry-run` and by the destructive-operation confirmation prompt.
242
239
  */
243
240
  export function buildSplitSummary(plan) {
@@ -1,11 +1,11 @@
1
1
  /**
2
- * `fireforge patch split <source> --files <p...> --name <n>` — moves files
2
+ * `fireforge patch split <source> --files <p...> --name <n>` moves files
3
3
  * out of an existing patch into a brand-new patch as one transaction.
4
4
  *
5
5
  * Splitting a patch whose files have inbound forward-imports otherwise
6
6
  * requires a precise manual order: re-point each staged-dependency owner at
7
7
  * a not-yet-created patch, shrink the source via
8
- * `re-export --files --allow-shrink`, then `export --order` — any other
8
+ * `re-export --files --allow-shrink`, then `export --order`. Any other
9
9
  * order refuses or needs `--force-unsafe`. Split performs the shrink, the
10
10
  * new-patch creation, and the dependent owner rewrites under one
11
11
  * patch-directory lock with rollback, validating only the final projection.