@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,11 +1,10 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge patch lint-ignore <name>` — adds, removes, or clears entries
3
+ * `fireforge patch lint-ignore <name>`: adds, removes, or clears entries
4
4
  * in `PatchMetadata.lintIgnore` without rewriting the `.patch` file body.
5
5
  *
6
6
  * Companion to `fireforge re-export <name> --lint-ignore <id>` (which is
7
- * append-only). Existence is justified by the cases re-export cannot
8
- * express:
7
+ * append-only). It exists for the cases re-export cannot express:
9
8
  * - Removing a single entry without dropping the rest of the list.
10
9
  * - Clearing the entire list when the operator wants the rule(s) to
11
10
  * start firing again.
@@ -16,23 +15,24 @@
16
15
  * `--clear` must be supplied per invocation. The read-modify-write
17
16
  * happens inside the patch directory lock via {@link mutatePatchMetadata}
18
17
  * so a concurrent writer cannot interleave between the read and the
19
- * write — important when an operator scripts repeated invocations or
18
+ * write, which matters when an operator scripts repeated invocations or
20
19
  * runs `--add` and `--remove` back-to-back.
21
20
  */
22
21
  import { Command } from 'commander';
23
- import { appendHistory, confirmDestructive } from '../../core/destructive.js';
22
+ import { confirmDestructive } from '../../core/destructive.js';
23
+ import { appendHistoryBestEffort } from '../../core/history-log.js';
24
24
  import { mutatePatchMetadata } from '../../core/patch-export.js';
25
25
  import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
26
- import { toError } from '../../utils/errors.js';
27
26
  import { info, intro, outro, warn } from '../../utils/logger.js';
28
27
  import { addWaitLockOption, resolveWaitLockSeconds, stringListOption, } from '../../utils/options.js';
28
+ import { proceedAfterDecision } from '../destructive-decision.js';
29
29
  import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
30
30
  /**
31
31
  * Printed whenever `--add` lands a new check id. The waiver this command
32
32
  * writes turns per-patch lint green immediately, but consumer projects
33
- * commonly audit lintIgnore lists against a reviewed allow-map — discovering
34
- * that the map also needs updating otherwise costs a full downstream gate
35
- * run.
33
+ * commonly audit lintIgnore lists against a reviewed allow-map, and
34
+ * discovering that the map also needs updating otherwise costs a full
35
+ * downstream gate run.
36
36
  */
37
37
  const LINT_IGNORE_REVIEW_WARNING = "This lint waiver is subject to the project's patch-policy review process. " +
38
38
  'Downstream policy audits that mirror lintIgnore lists in a reviewed allow-map ' +
@@ -65,7 +65,7 @@ function applyMode(existing, mode, values) {
65
65
  * `info()` / dry-run / history args. Exported for unit-testing the
66
66
  * message format directly without mocking the logger transport.
67
67
  */
68
- export function describeChange(before, after, mode, values) {
68
+ function describeChange(before, after, mode, values) {
69
69
  const beforeSet = new Set(before);
70
70
  const afterSet = new Set(after);
71
71
  if (mode === 'clear') {
@@ -102,8 +102,8 @@ export async function patchLintIgnoreCommand(projectRoot, identifier, options =
102
102
  const isDryRun = options.dryRun === true;
103
103
  intro(isDryRun ? 'FireForge patch lint-ignore (dry run)' : 'FireForge patch lint-ignore');
104
104
  // Mode mutex: exactly one mode per invocation. Combinations like
105
- // `--add foo --remove bar` are rejected — an operator who needs both
106
- // runs the command twice (clearer audit trail) and `--clear` plus a
105
+ // `--add foo --remove bar` are rejected: an operator who needs both
106
+ // runs the command twice (clearer audit trail), and `--clear` plus a
107
107
  // mode is contradictory.
108
108
  const adding = (options.add?.length ?? 0) > 0;
109
109
  const removing = (options.remove?.length ?? 0) > 0;
@@ -122,8 +122,8 @@ export async function patchLintIgnoreCommand(projectRoot, identifier, options =
122
122
  // Destructive-operation contract (docs/lifecycle-invariants.md): manifest
123
123
  // metadata mutations get summary + dry-run + confirmation/--yes + history
124
124
  // uniformly. Accepting --yes without ever prompting makes the flag appear
125
- // only in the history record — and suppressing lint findings is precisely
126
- // the mutation an operator should consciously approve.
125
+ // only in the history record, and suppressing lint findings is the kind
126
+ // of mutation an operator should approve consciously.
127
127
  const currentList = target.lintIgnore ?? [];
128
128
  const projectedList = applyMode(currentList, mode, values) ?? [];
129
129
  const addsNewIds = mode === 'add' && projectedList.length > currentList.length;
@@ -135,30 +135,24 @@ export async function patchLintIgnoreCommand(projectRoot, identifier, options =
135
135
  yes: options.yes === true,
136
136
  dryRun: isDryRun,
137
137
  });
138
- if (decision === 'dry-run') {
139
- if (addsNewIds) {
140
- warn(LINT_IGNORE_REVIEW_WARNING);
141
- }
142
- outro('Dry run complete — no changes made');
143
- return;
138
+ if (decision === 'dry-run' && addsNewIds) {
139
+ warn(LINT_IGNORE_REVIEW_WARNING);
144
140
  }
145
- if (decision === 'declined') {
146
- outro('Cancelled — no changes made');
141
+ if (!proceedAfterDecision(decision, 'Cancelled — no changes made'))
147
142
  return;
148
- }
149
143
  const result = await mutatePatchMetadata(paths.patches, target.filename, (existing) => {
150
144
  const next = applyMode(existing.lintIgnore ?? [], mode, values);
151
145
  // Either set the new list when non-empty or unset the field
152
146
  // entirely. The mutation API splits these to keep the
153
- // exactOptionalPropertyTypes contract clean — only set values land
147
+ // exactOptionalPropertyTypes contract clean: only set values land
154
148
  // in the typed `Partial<PatchMetadata>`, and the unset list is
155
149
  // applied via `delete` after spread.
156
150
  return next !== undefined ? { set: { lintIgnore: next } } : { unset: ['lintIgnore'] };
157
151
  }, { waitLockSeconds: resolveWaitLockSeconds(options.waitLock), command: 'patch lint-ignore' });
158
152
  if (!result) {
159
153
  // Race: target vanished between the manifest read above and the
160
- // locked mutate. Surfacing as a hard error rather than a silent
161
- // no-op — the operator's intent did not land.
154
+ // locked mutate. Surfaced as a hard error rather than a silent
155
+ // no-op, because the operator's intent did not land.
162
156
  throw new GeneralError(`Patch ${target.filename} disappeared from the manifest during the update. Re-run after investigating.`);
163
157
  }
164
158
  const existing = result.before.lintIgnore ?? [];
@@ -167,23 +161,18 @@ export async function patchLintIgnoreCommand(projectRoot, identifier, options =
167
161
  if (mode === 'add' && projected.length > existing.length) {
168
162
  warn(LINT_IGNORE_REVIEW_WARNING);
169
163
  }
170
- try {
171
- await appendHistory(paths.patches, {
172
- operation: 'patch-lint-ignore',
173
- args: {
174
- filename: target.filename,
175
- mode,
176
- values: [...values],
177
- before: existing,
178
- after: projected,
179
- },
180
- ...(options.yes === true ? { yes: true } : {}),
181
- result: 'ok',
182
- });
183
- }
184
- catch (historyError) {
185
- warn(`History log append failed after patch lint-ignore committed (${target.filename}): ${toError(historyError).message}`);
186
- }
164
+ await appendHistoryBestEffort(paths.patches, {
165
+ operation: 'patch-lint-ignore',
166
+ args: {
167
+ filename: target.filename,
168
+ mode,
169
+ values: [...values],
170
+ before: existing,
171
+ after: projected,
172
+ },
173
+ ...(options.yes === true ? { yes: true } : {}),
174
+ result: 'ok',
175
+ }, `patch lint-ignore committed (${target.filename})`);
187
176
  outro('Patch lint-ignore complete');
188
177
  }
189
178
  /**
@@ -205,7 +194,7 @@ export function registerPatchLintIgnore(parent, context) {
205
194
  addWaitLockOption(command).action(withErrorHandling(async (name, options) => {
206
195
  // Commander defaults `--add`/`--remove` to `[]` so they appear in
207
196
  // the options object even when unused. Strip empty arrays so
208
- // `pickDefined` sees them as absent — otherwise the mode-count
197
+ // `pickDefined` sees them as absent. Otherwise the mode-count
209
198
  // mutex would treat zero-length arrays as a present mode.
210
199
  const normalized = {};
211
200
  if (options.add !== undefined && options.add.length > 0)
@@ -1,12 +1,12 @@
1
1
  /**
2
- * `fireforge patch move-files <from> <to> --create --order <n>` — creates
2
+ * `fireforge patch move-files <from> <to> --create --order <n>` creates
3
3
  * the target patch at the requested sparse order and moves the files into it
4
4
  * as one transaction. This is the transactional bootstrap of a split:
5
5
  * without it, moving files into a not-yet-existing patch requires a manual
6
6
  * shrink-then-export dance with hand-repointed staged-dependency owners.
7
7
  *
8
8
  * Mirrors `patch split` end-to-end (same planning, projection lint, policy
9
- * enforcement, and locked commit); the `<to>` argument becomes the new
9
+ * enforcement, and locked commit). The `<to>` argument becomes the new
10
10
  * patch's name/slug the way `split --name` does.
11
11
  */
12
12
  import type { PatchMoveFilesOptions } from '../../types/commands/index.js';
@@ -1,13 +1,13 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge patch move-files <from> <to> --create --order <n>` — creates
3
+ * `fireforge patch move-files <from> <to> --create --order <n>` creates
4
4
  * the target patch at the requested sparse order and moves the files into it
5
5
  * as one transaction. This is the transactional bootstrap of a split:
6
6
  * without it, moving files into a not-yet-existing patch requires a manual
7
7
  * shrink-then-export dance with hand-repointed staged-dependency owners.
8
8
  *
9
9
  * Mirrors `patch split` end-to-end (same planning, projection lint, policy
10
- * enforcement, and locked commit); the `<to>` argument becomes the new
10
+ * enforcement, and locked commit). The `<to>` argument becomes the new
11
11
  * patch's name/slug the way `split --name` does.
12
12
  */
13
13
  import { getProjectPaths, loadConfig } from '../../core/config.js';
@@ -15,10 +15,12 @@ import { assertConfirmationAvailable, confirmDestructive } from '../../core/dest
15
15
  import { formatPatchNotFoundError } from '../../core/patch-identifier-suggest.js';
16
16
  import { buildPatchQueueContext } from '../../core/patch-lint.js';
17
17
  import { loadPatchesManifest, resolvePatchIdentifier } from '../../core/patch-manifest.js';
18
+ import { formatPatchOrder } from '../../core/patch-parse.js';
18
19
  import { enforcePatchPolicy } from '../../core/patch-policy.js';
19
20
  import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
20
21
  import { info, intro, outro, success } from '../../utils/logger.js';
21
22
  import { normalizePatchDisplayName } from '../../utils/validation.js';
23
+ import { proceedAfterDecision } from '../destructive-decision.js';
22
24
  import { resolvePlacementPlan } from '../export-flow.js';
23
25
  import { runPatchLint } from '../export-shared.js';
24
26
  import { commitPatchSplit } from './split.js';
@@ -31,7 +33,7 @@ export async function patchMoveFilesCreateCommand(projectRoot, fromIdentifier, n
31
33
  intro(options.dryRun === true
32
34
  ? 'FireForge patch move-files --create (dry run)'
33
35
  : 'FireForge patch move-files --create');
34
- // Refuse a prompt-less run BEFORE the diff/lint work, not after it.
36
+ // Refuse a prompt-less run before the diff/lint work, not after it.
35
37
  assertConfirmationAvailable('patch move-files --create', options);
36
38
  const paths = getProjectPaths(projectRoot);
37
39
  const config = await loadConfig(projectRoot);
@@ -65,7 +67,7 @@ export async function patchMoveFilesCreateCommand(projectRoot, fromIdentifier, n
65
67
  const placementOptions = { order: options.order };
66
68
  const placement = await resolvePlacementPlan(paths.patches, placementOptions, category, newPatchName, config);
67
69
  // The filename slug pipeline (resolvePlacementPlan above) strips redundant
68
- // category prefixes; the manifest display name must agree with the bare-slug
70
+ // category prefixes. The manifest display name must agree with the bare-slug
69
71
  // naming policy, exactly as `export --name` already does.
70
72
  const displayName = normalizePatchDisplayName(newPatchName, category);
71
73
  if (displayName !== newPatchName) {
@@ -91,12 +93,30 @@ export async function patchMoveFilesCreateCommand(projectRoot, fromIdentifier, n
91
93
  // The whole-queue context (built once, with the config so it carries the
92
94
  // same patch-policy shape as the committed `lint --per-patch` gate) makes
93
95
  // cross-patch `resource:///` imports and sibling head.js harness roots
94
- // resolve exactly as they will after the move lands — without it the
96
+ // resolve exactly as they will after the move lands. Without it the
95
97
  // projection lint is blind.
96
98
  const patchQueueCtx = await buildPatchQueueContext(paths.patches, config);
97
99
  const ignoreChecks = source.lintIgnore ? new Set(source.lintIgnore) : undefined;
98
- await runPatchLint(paths.engine, remainingFiles, remainingDiff, config, options.skipLint, patchQueueCtx, ignoreChecks, source.tier);
99
- await runPatchLint(paths.engine, movedFiles, movedDiff, config, options.skipLint, patchQueueCtx, ignoreChecks, source.tier);
100
+ await runPatchLint({
101
+ engineDir: paths.engine,
102
+ filesAffected: remainingFiles,
103
+ diffContent: remainingDiff,
104
+ config,
105
+ skipLint: options.skipLint,
106
+ patchQueueCtx,
107
+ ignoreChecks,
108
+ patchTier: source.tier,
109
+ });
110
+ await runPatchLint({
111
+ engineDir: paths.engine,
112
+ filesAffected: movedFiles,
113
+ diffContent: movedDiff,
114
+ config,
115
+ skipLint: options.skipLint,
116
+ patchQueueCtx,
117
+ ignoreChecks,
118
+ patchTier: source.tier,
119
+ });
100
120
  const { conflicts, stagedDependencyAdditions } = runProjectedSplitLint(plan, patchQueueCtx);
101
121
  plan.stagedDependencyAdditions = stagedDependencyAdditions;
102
122
  const newMetadata = buildNewPatchMetadata(plan, config);
@@ -118,16 +138,10 @@ export async function patchMoveFilesCreateCommand(projectRoot, fromIdentifier, n
118
138
  unsafeOverride: options.forceUnsafe === true,
119
139
  conflicts,
120
140
  });
121
- if (decision === 'dry-run') {
122
- outro('Dry run complete — no changes made');
141
+ if (!proceedAfterDecision(decision, 'Move cancelled'))
123
142
  return;
124
- }
125
- if (decision === 'declined') {
126
- outro('Move cancelled');
127
- return;
128
- }
129
143
  await commitPatchSplit(paths.patches, plan, newMetadata, options, config);
130
- success(`Created ${placement.newFilename} (order ${String(placement.insertionOrder).padStart(3, '0')}) ` +
144
+ success(`Created ${placement.newFilename} (order ${formatPatchOrder(placement.insertionOrder)}) ` +
131
145
  `and moved ${plan.movedFiles.length} file(s) out of ${source.filename}`);
132
146
  if (plan.ownerRewrites.length > 0) {
133
147
  info(`Re-pointed staged-dependency owners in: ${plan.ownerRewrites.join(', ')}`);
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Transactional file-ownership move into an EXISTING patch.
2
+ * Transactional file-ownership move into an existing patch.
3
3
  *
4
4
  * A preview-only `patch move-files <from> <to>` prints two
5
5
  * `re-export --files` commands whose real execution costs three further
6
6
  * refusals (`--allow-shrink`, `--yes`, and a projected
7
- * `duplicate-new-file-creation` unless the SHRINK lands first — while the
7
+ * `duplicate-new-file-creation` unless the shrink lands first, while the
8
8
  * printed plan lists the grow first). This module performs the same
9
9
  * shrink→grow as one transaction under the patch-directory lock with
10
10
  * rollback, mirroring `patch split` / `move-files --create`.
@@ -1,11 +1,11 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Transactional file-ownership move into an EXISTING patch.
3
+ * Transactional file-ownership move into an existing patch.
4
4
  *
5
5
  * A preview-only `patch move-files <from> <to>` prints two
6
6
  * `re-export --files` commands whose real execution costs three further
7
7
  * refusals (`--allow-shrink`, `--yes`, and a projected
8
- * `duplicate-new-file-creation` unless the SHRINK lands first — while the
8
+ * `duplicate-new-file-creation` unless the shrink lands first, while the
9
9
  * printed plan lists the grow first). This module performs the same
10
10
  * shrink→grow as one transaction under the patch-directory lock with
11
11
  * rollback, mirroring `patch split` / `move-files --create`.
@@ -15,24 +15,21 @@
15
15
  * the worktree.
16
16
  */
17
17
  import { join } from 'node:path';
18
- import { appendHistory, assertConfirmationAvailable, confirmDestructive, } from '../../core/destructive.js';
19
- import { normalizePatchArtifact } from '../../core/patch-artifact-normalize.js';
20
- import { buildModifiedFileAdditionsFromDiff, buildPatchQueueContext, collectForwardImportEdges, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
18
+ import { assertConfirmationAvailable, confirmDestructive, } from '../../core/destructive.js';
19
+ import { appendHistoryBestEffort } from '../../core/history-log.js';
20
+ import { buildPatchQueueContext, collectForwardImportEdges, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
21
21
  import { computeProjectedLintRegressions } from '../../core/patch-lint-projection.js';
22
22
  import { withPatchDirectoryLock } from '../../core/patch-lock.js';
23
23
  import { loadPatchesManifest, savePatchesManifest, validatePatchesManifest, } from '../../core/patch-manifest.js';
24
- import { buildNewFileTextProjection } from '../../core/patch-transform.js';
25
24
  import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
26
25
  import { toError } from '../../utils/errors.js';
27
26
  import { readText, writeText } from '../../utils/fs.js';
28
27
  import { info, outro, success, warn } from '../../utils/logger.js';
29
28
  import { resolveWaitLockSeconds } from '../../utils/options.js';
29
+ import { proceedAfterDecision } from '../destructive-decision.js';
30
30
  import { runPatchLint } from '../export-shared.js';
31
+ import { projectEntryBody } from './entry-projection.js';
31
32
  import { buildSplitDiff, findOwnerRewriteHolders, mergeStagedForwardImports, rewriteSplitOwners, } from './split-plan.js';
32
- function projectEntryBody(diff) {
33
- const newFiles = buildNewFileTextProjection(diff);
34
- return { diff, newFiles, modifiedFileAdditions: buildModifiedFileAdditionsFromDiff(diff) };
35
- }
36
33
  /**
37
34
  * Projects the post-move queue through cross-patch lint, auto-declaring the
38
35
  * forward edges the move introduces into the target (an importer that used
@@ -121,9 +118,9 @@ async function commitMoveInto(patchesDir, plan, waitLockSeconds) {
121
118
  let sourceWritten = false;
122
119
  let targetWritten = false;
123
120
  try {
124
- await writeText(sourcePath, normalizePatchArtifact(plan.sourceDiff));
121
+ await writeText(sourcePath, plan.sourceDiff);
125
122
  sourceWritten = true;
126
- await writeText(targetPath, normalizePatchArtifact(plan.targetDiff));
123
+ await writeText(targetPath, plan.targetDiff);
127
124
  targetWritten = true;
128
125
  const updatedPatches = manifest.patches.map((patch) => {
129
126
  let updated = rewriteSplitOwners(patch, plan.source.filename, movedSet, plan.target.filename);
@@ -140,21 +137,16 @@ async function commitMoveInto(patchesDir, plan, waitLockSeconds) {
140
137
  });
141
138
  const updated = validatePatchesManifest({ ...manifest, patches: updatedPatches });
142
139
  await savePatchesManifest(patchesDir, updated);
143
- try {
144
- await appendHistory(patchesDir, {
145
- operation: 'patch-move-files',
146
- args: {
147
- source: plan.source.filename,
148
- target: plan.target.filename,
149
- files: plan.movedFiles,
150
- ownerRewrites: plan.ownerRewrites,
151
- },
152
- result: 'ok',
153
- });
154
- }
155
- catch (historyError) {
156
- warn(`History log append failed after patch move-files committed: ${toError(historyError).message}`);
157
- }
140
+ await appendHistoryBestEffort(patchesDir, {
141
+ operation: 'patch-move-files',
142
+ args: {
143
+ source: plan.source.filename,
144
+ target: plan.target.filename,
145
+ files: plan.movedFiles,
146
+ ownerRewrites: plan.ownerRewrites,
147
+ },
148
+ result: 'ok',
149
+ }, `patch move-files committed`);
158
150
  }
159
151
  catch (error) {
160
152
  if (targetWritten) {
@@ -190,7 +182,7 @@ async function commitMoveInto(patchesDir, plan, waitLockSeconds) {
190
182
  */
191
183
  export async function runMoveFilesInto(args) {
192
184
  const { enginePath, patchesDir, source, target, files, sourceAfter, targetAfter, options } = args;
193
- // Refuse a prompt-less run BEFORE the diff/lint work, not after it.
185
+ // Refuse a prompt-less run before the diff/lint work, not after it.
194
186
  assertConfirmationAvailable('patch move-files', options);
195
187
  const sourceDiff = await buildSplitDiff(enginePath, sourceAfter, 'remaining', source.filename);
196
188
  const targetDiff = await buildSplitDiff(enginePath, targetAfter, 'moved', target.filename);
@@ -199,8 +191,26 @@ export async function runMoveFilesInto(args) {
199
191
  // parity) resolves cross-patch imports and sibling head.js harness roots
200
192
  // instead of linting each projected body blind.
201
193
  const patchQueueCtx = await buildPatchQueueContext(patchesDir, args.config);
202
- await runPatchLint(enginePath, sourceAfter, sourceDiff, args.config, options.skipLint, patchQueueCtx, source.lintIgnore ? new Set(source.lintIgnore) : undefined, source.tier);
203
- await runPatchLint(enginePath, targetAfter, targetDiff, args.config, options.skipLint, patchQueueCtx, target.lintIgnore ? new Set(target.lintIgnore) : undefined, target.tier);
194
+ await runPatchLint({
195
+ engineDir: enginePath,
196
+ filesAffected: sourceAfter,
197
+ diffContent: sourceDiff,
198
+ config: args.config,
199
+ skipLint: options.skipLint,
200
+ patchQueueCtx,
201
+ ignoreChecks: source.lintIgnore ? new Set(source.lintIgnore) : undefined,
202
+ patchTier: source.tier,
203
+ });
204
+ await runPatchLint({
205
+ engineDir: enginePath,
206
+ filesAffected: targetAfter,
207
+ diffContent: targetDiff,
208
+ config: args.config,
209
+ skipLint: options.skipLint,
210
+ patchQueueCtx,
211
+ ignoreChecks: target.lintIgnore ? new Set(target.lintIgnore) : undefined,
212
+ patchTier: target.tier,
213
+ });
204
214
  const manifest = await loadPatchesManifest(patchesDir);
205
215
  const plan = {
206
216
  source,
@@ -231,14 +241,8 @@ export async function runMoveFilesInto(args) {
231
241
  unsafeOverride: options.forceUnsafe === true,
232
242
  conflicts,
233
243
  });
234
- if (decision === 'dry-run') {
235
- outro('Dry run complete — no changes made');
236
- return;
237
- }
238
- if (decision === 'declined') {
239
- outro('Move cancelled');
244
+ if (!proceedAfterDecision(decision, 'Move cancelled'))
240
245
  return;
241
- }
242
246
  await commitMoveInto(patchesDir, plan, resolveWaitLockSeconds(options.waitLock));
243
247
  success(`Moved ${files.length} file(s) from ${source.filename} to ${target.filename}`);
244
248
  if (plan.ownerRewrites.length > 0) {
@@ -13,13 +13,10 @@ import { loadPatchesManifest, resolvePatchIdentifier } from '../../core/patch-ma
13
13
  import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
14
14
  import { pathExists } from '../../utils/fs.js';
15
15
  import { info, intro, note, warn } from '../../utils/logger.js';
16
- import { addWaitLockOption, commanderArgParser, pickDefined } from '../../utils/options.js';
16
+ import { addWaitLockOption, commanderArgParser, pickDefined, stringListOption, } from '../../utils/options.js';
17
+ import { parsePositiveIntegerFlag } from '../../utils/validation.js';
17
18
  import { patchMoveFilesCreateCommand } from './move-files-create.js';
18
19
  import { runMoveFilesInto } from './move-files-into.js';
19
- function collectOption(value, previous) {
20
- previous.push(value);
21
- return previous;
22
- }
23
20
  function normalizeFileList(files) {
24
21
  const cleaned = (files ?? []).map((file) => file.trim()).filter((file) => file.length > 0);
25
22
  return [...new Set(cleaned)].sort((left, right) => left.localeCompare(right));
@@ -131,7 +128,7 @@ export async function patchMoveFilesCommand(projectRoot, fromIdentifier, toIdent
131
128
  note(formatFiles(targetAfter), `${target.filename} files after move`);
132
129
  // Manual fallback (e.g. when the worktree cannot carry both patches'
133
130
  // content right now): the equivalent re-export choreography, in
134
- // EXECUTABLE order — the shrink must land before the grow, or the
131
+ // executable order. The shrink must land before the grow, or the
135
132
  // projected cross-patch lint refuses the pair with
136
133
  // duplicate-new-file-creation.
137
134
  const applySource = formatReExportCommand(source.filename, sourceAfter, [
@@ -165,15 +162,9 @@ export function registerPatchMoveFiles(parent, context) {
165
162
  .command('move-files <from> <to>')
166
163
  .description('Preview the re-export commands needed to move file ownership between patches, ' +
167
164
  'or create the target patch and move the files in one transaction with --create --order <n>.')
168
- .option('--file <path>', 'File path relative to engine/ to move (repeatable)', collectOption, [])
165
+ .option('--file <path>', 'File path relative to engine/ to move (repeatable)', ...stringListOption())
169
166
  .option('--create', 'Create <to> as a new patch and move the files into it (requires --order)')
170
- .option('--order <n>', 'Exact sparse order for the created patch (only valid with --create)', commanderArgParser((raw) => {
171
- const n = Number.parseInt(raw, 10);
172
- if (!Number.isInteger(n) || n <= 0) {
173
- throw new InvalidArgumentError(`--order must be a positive integer, got "${raw}".`, '--order');
174
- }
175
- return n;
176
- }))
167
+ .option('--order <n>', 'Exact sparse order for the created patch (only valid with --create)', commanderArgParser((raw) => parsePositiveIntegerFlag('--order', raw)))
177
168
  .option('--category <category>', "Category for the created patch (default: the source patch's)")
178
169
  .option('-d, --description <desc>', 'Description for the created patch')
179
170
  .option('--dry-run', 'Show what would happen without writing')
@@ -10,7 +10,7 @@ import type { ProjectPaths } from '../../types/config.js';
10
10
  export interface PatchQueueContext {
11
11
  /** Project paths resolved from the project root. */
12
12
  paths: ProjectPaths;
13
- /** The loaded manifest; guaranteed to contain at least one patch. */
13
+ /** The loaded manifest, guaranteed to contain at least one patch. */
14
14
  manifest: PatchesManifest;
15
15
  }
16
16
  /**
@@ -1,14 +1,14 @@
1
1
  /**
2
- * `fireforge patch rename <name>` — relabels a patch's filename, manifest
2
+ * `fireforge patch rename <name>`: relabels a patch's filename, manifest
3
3
  * `name`, and (optionally) `description` without rewriting the `.patch` file
4
4
  * body.
5
5
  *
6
6
  * Companion to `re-export --files <subset>`. Re-export shrinks the body and
7
7
  * `filesAffected` but leaves the patch's identity describing the pre-shrink
8
8
  * scope. The only alternative for that drift is `delete` + re-export, which
9
- * briefly removes the patch from the queue — any forward-import dependent
10
- * then refuses the re-export until the deleted patch's siblings are
11
- * rewritten.
9
+ * briefly removes the patch from the queue, and any forward-import
10
+ * dependent then refuses the re-export until the deleted patch's siblings
11
+ * are rewritten.
12
12
  *
13
13
  * The filename rename and the manifest mutation happen under the patch
14
14
  * directory lock so concurrent exports cannot allocate the new filename, and