@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,12 +1,12 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge patch split <source> --files <p...> --name <n>` — moves files
3
+ * `fireforge patch split <source> --files <p...> --name <n>` moves files
4
4
  * out of an existing patch into a brand-new patch as one transaction.
5
5
  *
6
6
  * Splitting a patch whose files have inbound forward-imports otherwise
7
7
  * requires a precise manual order: re-point each staged-dependency owner at
8
8
  * a not-yet-created patch, shrink the source via
9
- * `re-export --files --allow-shrink`, then `export --order` — any other
9
+ * `re-export --files --allow-shrink`, then `export --order`. Any other
10
10
  * order refuses or needs `--force-unsafe`. Split performs the shrink, the
11
11
  * new-patch creation, and the dependent owner rewrites under one
12
12
  * patch-directory lock with rollback, validating only the final projection.
@@ -18,8 +18,8 @@
18
18
  import { join } from 'node:path';
19
19
  import { Command } from 'commander';
20
20
  import { getProjectPaths, loadConfig } from '../../core/config.js';
21
- import { appendHistory, assertConfirmationAvailable, confirmDestructive, } from '../../core/destructive.js';
22
- import { normalizePatchArtifact } from '../../core/patch-artifact-normalize.js';
21
+ import { assertConfirmationAvailable, confirmDestructive } from '../../core/destructive.js';
22
+ import { appendHistoryBestEffort } from '../../core/history-log.js';
23
23
  import { formatPatchNotFoundError } from '../../core/patch-identifier-suggest.js';
24
24
  import { buildPatchQueueContext } from '../../core/patch-lint.js';
25
25
  import { withPatchDirectoryLock } from '../../core/patch-lock.js';
@@ -30,7 +30,8 @@ import { toError } from '../../utils/errors.js';
30
30
  import { readText, removeFile, writeText } from '../../utils/fs.js';
31
31
  import { info, intro, outro, success, warn } from '../../utils/logger.js';
32
32
  import { addWaitLockOption, commanderArgParser, pickDefined, resolveWaitLockSeconds, } from '../../utils/options.js';
33
- import { normalizePatchDisplayName } from '../../utils/validation.js';
33
+ import { normalizePatchDisplayName, parsePositiveIntegerFlag } from '../../utils/validation.js';
34
+ import { proceedAfterDecision } from '../destructive-decision.js';
34
35
  import { placementPlansEqual, resolvePlacementPlan } from '../export-flow.js';
35
36
  import { runPatchLint } from '../export-shared.js';
36
37
  import { assertSourceOwnsFiles, buildNewPatchMetadata, buildSplitDiff, buildSplitSummary, findOwnerRewriteHolders, mergeStagedForwardImports, projectSplitManifest, rewriteSplitOwners, runProjectedSplitLint, } from './split-plan.js';
@@ -68,9 +69,9 @@ export async function commitPatchSplit(patchesDir, plan, newMetadata, options, c
68
69
  await renumberPatchesInManifest(patchesDir, plan.placement.renameMap);
69
70
  renumberApplied = true;
70
71
  }
71
- await writeText(newPatchPath, normalizePatchArtifact(plan.movedDiff));
72
+ await writeText(newPatchPath, plan.movedDiff);
72
73
  newPatchWritten = true;
73
- await writeText(sourcePathAfter, normalizePatchArtifact(plan.remainingDiff));
74
+ await writeText(sourcePathAfter, plan.remainingDiff);
74
75
  sourceRewritten = true;
75
76
  const fresh = await loadPatchesManifest(patchesDir);
76
77
  if (!fresh)
@@ -91,31 +92,26 @@ export async function commitPatchSplit(patchesDir, plan, newMetadata, options, c
91
92
  updatedPatches.sort((a, b) => a.order - b.order || a.filename.localeCompare(b.filename));
92
93
  const updated = validatePatchesManifest({ ...fresh, patches: updatedPatches });
93
94
  await savePatchesManifest(patchesDir, updated);
94
- try {
95
- await appendHistory(patchesDir, {
96
- operation: 'patch-split',
97
- args: {
98
- source: effectiveSourceFilename,
99
- newFilename: plan.placement.newFilename,
100
- order: plan.placement.insertionOrder,
101
- files: plan.movedFiles,
102
- ownerRewrites: plan.ownerRewrites,
103
- renames: [...plan.placement.renameMap.entries()].map(([from, entry]) => ({
104
- from,
105
- to: entry.newFilename,
106
- })),
107
- },
108
- ...(options.yes === true ? { yes: true } : {}),
109
- ...(options.forceUnsafe === true ? { unsafeOverride: true } : {}),
110
- result: 'ok',
111
- });
112
- }
113
- catch (historyError) {
114
- warn(`History log append failed after patch split committed: ${toError(historyError).message}`);
115
- }
95
+ await appendHistoryBestEffort(patchesDir, {
96
+ operation: 'patch-split',
97
+ args: {
98
+ source: effectiveSourceFilename,
99
+ newFilename: plan.placement.newFilename,
100
+ order: plan.placement.insertionOrder,
101
+ files: plan.movedFiles,
102
+ ownerRewrites: plan.ownerRewrites,
103
+ renames: [...plan.placement.renameMap.entries()].map(([from, entry]) => ({
104
+ from,
105
+ to: entry.newFilename,
106
+ })),
107
+ },
108
+ ...(options.yes === true ? { yes: true } : {}),
109
+ ...(options.forceUnsafe === true ? { unsafeOverride: true } : {}),
110
+ result: 'ok',
111
+ }, `patch split committed`);
116
112
  }
117
113
  catch (error) {
118
- // Reverse-order rollback; each step warns on its own failure so the
114
+ // Reverse-order rollback. Each step warns on its own failure so the
119
115
  // original error stays visible.
120
116
  if (sourceRewritten) {
121
117
  try {
@@ -164,7 +160,7 @@ export async function commitPatchSplit(patchesDir, plan, newMetadata, options, c
164
160
  */
165
161
  export async function patchSplitCommand(projectRoot, sourceId, options) {
166
162
  intro(options.dryRun ? 'FireForge patch split (dry run)' : 'FireForge patch split');
167
- // Refuse a prompt-less run BEFORE the diff/lint work, not after it.
163
+ // Refuse a prompt-less run before doing the diff/lint work.
168
164
  assertConfirmationAvailable('patch split', options);
169
165
  const paths = getProjectPaths(projectRoot);
170
166
  const config = await loadConfig(projectRoot);
@@ -197,7 +193,7 @@ export async function patchSplitCommand(projectRoot, sourceId, options) {
197
193
  (options.order === undefined && options.before === undefined ? source.filename : undefined),
198
194
  });
199
195
  const placement = await resolvePlacementPlan(paths.patches, placementOptions, category, options.name, config);
200
- // The filename slug pipeline strips redundant category prefixes; the
196
+ // The filename slug pipeline strips redundant category prefixes. The
201
197
  // manifest display name must agree with the bare-slug naming policy,
202
198
  // exactly as `export --name` already does.
203
199
  const displayName = normalizePatchDisplayName(options.name, category);
@@ -226,8 +222,26 @@ export async function patchSplitCommand(projectRoot, sourceId, options) {
226
222
  // instead of linting each projected body blind.
227
223
  const patchQueueCtx = await buildPatchQueueContext(paths.patches, config);
228
224
  const ignoreChecks = source.lintIgnore ? new Set(source.lintIgnore) : undefined;
229
- await runPatchLint(paths.engine, remainingFiles, remainingDiff, config, options.skipLint, patchQueueCtx, ignoreChecks, source.tier);
230
- await runPatchLint(paths.engine, movedFiles, movedDiff, config, options.skipLint, patchQueueCtx, ignoreChecks, source.tier);
225
+ await runPatchLint({
226
+ engineDir: paths.engine,
227
+ filesAffected: remainingFiles,
228
+ diffContent: remainingDiff,
229
+ config,
230
+ skipLint: options.skipLint,
231
+ patchQueueCtx,
232
+ ignoreChecks,
233
+ patchTier: source.tier,
234
+ });
235
+ await runPatchLint({
236
+ engineDir: paths.engine,
237
+ filesAffected: movedFiles,
238
+ diffContent: movedDiff,
239
+ config,
240
+ skipLint: options.skipLint,
241
+ patchQueueCtx,
242
+ ignoreChecks,
243
+ patchTier: source.tier,
244
+ });
231
245
  const { conflicts, stagedDependencyAdditions } = runProjectedSplitLint(plan, patchQueueCtx);
232
246
  plan.stagedDependencyAdditions = stagedDependencyAdditions;
233
247
  const newMetadata = buildNewPatchMetadata(plan, config);
@@ -246,14 +260,8 @@ export async function patchSplitCommand(projectRoot, sourceId, options) {
246
260
  unsafeOverride: options.forceUnsafe === true,
247
261
  conflicts,
248
262
  });
249
- if (decision === 'dry-run') {
250
- outro('Dry run complete — no changes made');
251
- return;
252
- }
253
- if (decision === 'declined') {
254
- outro('Split cancelled');
263
+ if (!proceedAfterDecision(decision, 'Split cancelled'))
255
264
  return;
256
- }
257
265
  await commitPatchSplit(paths.patches, plan, newMetadata, options, config);
258
266
  success(`Split ${source.filename}: ${placement.newFilename} now owns ${plan.movedFiles.length} file(s)`);
259
267
  if (plan.ownerRewrites.length > 0) {
@@ -273,13 +281,7 @@ export function registerPatchSplit(parent, context) {
273
281
  .requiredOption('--name <name>', 'Name for the new patch')
274
282
  .option('--category <category>', "Category for the new patch (default: the source patch's)")
275
283
  .option('--description <desc>', 'Description for the new patch')
276
- .option('--order <n>', 'Exact sparse order for the new patch', commanderArgParser((raw) => {
277
- const n = Number.parseInt(raw, 10);
278
- if (!Number.isInteger(n) || n <= 0) {
279
- throw new InvalidArgumentError(`--order must be a positive integer, got "${raw}".`, '--order');
280
- }
281
- return n;
282
- }))
284
+ .option('--order <n>', 'Exact sparse order for the new patch', commanderArgParser((raw) => parsePositiveIntegerFlag('--order', raw)))
283
285
  .option('--before <patch>', 'Place the new patch before this patch')
284
286
  .option('--after <patch>', 'Place the new patch after this patch (default: the source patch)')
285
287
  .option('--dry-run', 'Show what would happen without writing')
@@ -7,7 +7,7 @@ interface StagedDependencyShape {
7
7
  }
8
8
  /**
9
9
  * Validates the `--add` declaration fields against the loaded queue.
10
- * Throws on a clear flag mixup; warns (only) when `--owner` is
10
+ * Throws on a clear flag mixup. Warns (only) when `--owner` is
11
11
  * well-formed but absent from the queue, because the owner may
12
12
  * legitimately be exported moments later and renumbering rewrites owners.
13
13
  */
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Shape validation for `patch staged-dependency --add`.
4
4
  *
5
- * `--creates`/`--file` take engine-relative FILE paths and `--owner` takes a
6
- * patch FILENAME. Accepting all three as arbitrary strings lets a
5
+ * `--creates`/`--file` take engine-relative file paths, while `--owner`
6
+ * takes a patch filename. Accepting all three as arbitrary strings lets a
7
7
  * `--creates <patch-name>` mixup produce a declaration nothing can ever
8
8
  * discharge, surfacing only later as a `staged-dependency-unused` warning.
9
9
  * Refusals here fire only on a clear patch-name shape (slash-free values
@@ -28,7 +28,7 @@ function refusePatchShapedPath(flag, value, role, queuePatches) {
28
28
  }
29
29
  /**
30
30
  * Validates the `--add` declaration fields against the loaded queue.
31
- * Throws on a clear flag mixup; warns (only) when `--owner` is
31
+ * Throws on a clear flag mixup. Warns (only) when `--owner` is
32
32
  * well-formed but absent from the queue, because the owner may
33
33
  * legitimately be exported moments later and renumbering rewrites owners.
34
34
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `fireforge patch staged-dependency <name>` — edits
2
+ * `fireforge patch staged-dependency <name>` edits
3
3
  * PatchMetadata.stagedDependencies without rewriting the .patch body.
4
4
  */
5
5
  import { Command } from 'commander';
@@ -1,14 +1,13 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge patch staged-dependency <name>` — edits
3
+ * `fireforge patch staged-dependency <name>` edits
4
4
  * PatchMetadata.stagedDependencies without rewriting the .patch body.
5
5
  */
6
6
  import { Command } from 'commander';
7
- import { appendHistory } from '../../core/destructive.js';
7
+ import { appendHistoryBestEffort } from '../../core/history-log.js';
8
8
  import { mutatePatchMetadata } from '../../core/patch-export.js';
9
9
  import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
10
- import { toError } from '../../utils/errors.js';
11
- import { info, intro, outro, warn } from '../../utils/logger.js';
10
+ import { info, intro, outro } from '../../utils/logger.js';
12
11
  import { addWaitLockOption, resolveWaitLockSeconds } from '../../utils/options.js';
13
12
  import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
14
13
  import { validateStagedDependencyAdd } from './staged-dependency-validate.js';
@@ -86,7 +85,7 @@ function requireRegistrationOptions(options) {
86
85
  /**
87
86
  * Resolves the `--remove` target for forward-imports:
88
87
  * `--file` + `--specifier` suffice when they identify at most one staged
89
- * entry — `--creates` is inferred from a unique match, an ambiguous match
88
+ * entry. `--creates` is inferred from a unique match, an ambiguous match
90
89
  * refuses with the candidate list, and no match falls through to the
91
90
  * honest "no staged forward-import matched" summary.
92
91
  */
@@ -113,7 +112,7 @@ function resolveImportRemovalTarget(options, staged) {
113
112
  const list = candidates
114
113
  .map((entry) => ` - ${dependencyLabel('import', importView(entry))}`)
115
114
  .join('\n');
116
- throw new GeneralError(`--remove matches ${String(candidates.length)} staged forward-imports on this patch; ` +
115
+ throw new GeneralError(`--remove matches ${candidates.length} staged forward-imports on this patch; ` +
117
116
  `pass --creates to pick one:\n${list}`);
118
117
  }
119
118
  return { file, specifier, creates: '(no match)' };
@@ -142,7 +141,7 @@ function resolveRegistrationRemovalTarget(options, staged) {
142
141
  const list = candidates
143
142
  .map((entry) => ` - ${dependencyLabel('registration', registrationView(entry))}`)
144
143
  .join('\n');
145
- throw new GeneralError(`--remove matches ${String(candidates.length)} staged registrations on this patch; ` +
144
+ throw new GeneralError(`--remove matches ${candidates.length} staged registrations on this patch; ` +
146
145
  `pass --creates to pick one:\n${list}`);
147
146
  }
148
147
  return { file, line, creates: '(no match)' };
@@ -218,7 +217,7 @@ export async function patchStagedDependencyCommand(projectRoot, identifier, opti
218
217
  intro(isDryRun ? 'FireForge patch staged-dependency (dry run)' : 'FireForge patch staged-dependency');
219
218
  const mode = modeFromOptions(options);
220
219
  const kind = kindFromOptions(options);
221
- // The patch queue loads BEFORE the declaration fields resolve so
220
+ // The patch queue loads before the declaration fields resolve so
222
221
  // `--remove` can infer `--creates` from the target patch's staged
223
222
  // entries.
224
223
  const { paths, manifest } = await requirePatchQueue(projectRoot);
@@ -233,9 +232,9 @@ export async function patchStagedDependencyCommand(projectRoot, identifier, opti
233
232
  : mode === 'add'
234
233
  ? requireRegistrationOptions(options)
235
234
  : resolveRegistrationRemovalTarget(options, targetPatch.stagedDependencies);
236
- // Shape-check --add declarations against the loaded queue:
237
- // a patch-name-shaped --creates/--file is refused HERE instead of
238
- // surfacing later as an undischargeable staged-dependency-unused.
235
+ // Shape-check --add declarations against the loaded queue: a
236
+ // patch-name-shaped --creates/--file is refused now instead of surfacing
237
+ // later as an undischargeable staged-dependency-unused.
239
238
  if (mode === 'add') {
240
239
  const added = importDependency ?? registrationDependency;
241
240
  if (added !== undefined) {
@@ -280,23 +279,18 @@ export async function patchStagedDependencyCommand(projectRoot, identifier, opti
280
279
  const before = result.before.stagedDependencies;
281
280
  const after = result.after.stagedDependencies;
282
281
  info(`${targetPatch.filename}: ${describeStagedDependencyChange(countStagedEntries(before), countStagedEntries(after), mode, kind, target)}.`);
283
- try {
284
- await appendHistory(paths.patches, {
285
- operation: 'patch-staged-dependency',
286
- args: {
287
- filename: targetPatch.filename,
288
- mode,
289
- kind,
290
- before: before ?? {},
291
- after: after ?? {},
292
- },
293
- ...(options.yes === true ? { yes: true } : {}),
294
- result: 'ok',
295
- });
296
- }
297
- catch (historyError) {
298
- warn(`History log append failed after patch staged-dependency committed (${targetPatch.filename}): ${toError(historyError).message}`);
299
- }
282
+ await appendHistoryBestEffort(paths.patches, {
283
+ operation: 'patch-staged-dependency',
284
+ args: {
285
+ filename: targetPatch.filename,
286
+ mode,
287
+ kind,
288
+ before: before ?? {},
289
+ after: after ?? {},
290
+ },
291
+ ...(options.yes === true ? { yes: true } : {}),
292
+ result: 'ok',
293
+ }, `patch staged-dependency committed (${targetPatch.filename})`);
300
294
  outro('Patch staged-dependency complete');
301
295
  }
302
296
  /**
@@ -1,9 +1,9 @@
1
1
  /**
2
- * `fireforge patch tier <name>` — sets or clears `PatchMetadata.tier` on a
2
+ * `fireforge patch tier <name>` sets or clears `PatchMetadata.tier` on a
3
3
  * single patch without rewriting the `.patch` file body.
4
4
  *
5
5
  * Companion to `fireforge re-export <name> --tier <tier>`. Re-export is the
6
- * right tool when the patch body itself needs regenerating; this subcommand
6
+ * right tool when the patch body itself needs regenerating. This subcommand
7
7
  * covers the metadata-only adjustment, where the operator has discovered
8
8
  * (from a `lint --per-patch` warning, say) that the threshold-tier override
9
9
  * should be set but the patch body is already correct. Avoiding the
@@ -1,10 +1,10 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * `fireforge patch tier <name>` — sets or clears `PatchMetadata.tier` on a
3
+ * `fireforge patch tier <name>` sets or clears `PatchMetadata.tier` on a
4
4
  * single patch without rewriting the `.patch` file body.
5
5
  *
6
6
  * Companion to `fireforge re-export <name> --tier <tier>`. Re-export is the
7
- * right tool when the patch body itself needs regenerating; this subcommand
7
+ * right tool when the patch body itself needs regenerating. This subcommand
8
8
  * covers the metadata-only adjustment, where the operator has discovered
9
9
  * (from a `lint --per-patch` warning, say) that the threshold-tier override
10
10
  * should be set but the patch body is already correct. Avoiding the
@@ -15,12 +15,13 @@
15
15
  * `--clear` must be supplied per invocation.
16
16
  */
17
17
  import { Command, Option } from 'commander';
18
- import { appendHistory, confirmDestructive } from '../../core/destructive.js';
18
+ import { confirmDestructive } from '../../core/destructive.js';
19
+ import { appendHistoryBestEffort } from '../../core/history-log.js';
19
20
  import { updatePatchMetadata } from '../../core/patch-export.js';
20
21
  import { InvalidArgumentError } from '../../errors/base.js';
21
- import { toError } from '../../utils/errors.js';
22
- import { info, intro, outro, warn } from '../../utils/logger.js';
22
+ import { info, intro, outro } from '../../utils/logger.js';
23
23
  import { addWaitLockOption, pickDefined, resolveWaitLockSeconds } from '../../utils/options.js';
24
+ import { proceedAfterDecision } from '../destructive-decision.js';
24
25
  import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
25
26
  /**
26
27
  * Runs the `patch tier` command: updates `PatchMetadata.tier` on the
@@ -34,8 +35,8 @@ export async function patchTierCommand(projectRoot, identifier, options = {}) {
34
35
  const isDryRun = options.dryRun === true;
35
36
  intro(isDryRun ? 'FireForge patch tier (dry run)' : 'FireForge patch tier');
36
37
  // Mode mutex: a single invocation either sets or clears the tier.
37
- // Combining both is ambiguous — the operator's intent is not obvious
38
- // and silently picking one would mask the typo.
38
+ // Combining both is ambiguous: the operator's intent is not obvious and
39
+ // silently picking one would mask the typo.
39
40
  const setting = options.tier !== undefined;
40
41
  const clearing = options.clear === true;
41
42
  if (setting && clearing) {
@@ -71,16 +72,10 @@ export async function patchTierCommand(projectRoot, identifier, options = {}) {
71
72
  yes: options.yes === true,
72
73
  dryRun: isDryRun,
73
74
  });
74
- if (decision === 'dry-run') {
75
- outro('Dry run complete — no changes made');
75
+ if (!proceedAfterDecision(decision, 'Cancelled — no changes made'))
76
76
  return;
77
- }
78
- if (decision === 'declined') {
79
- outro('Cancelled — no changes made');
80
- return;
81
- }
82
77
  // Single write under the patch directory lock (delegated inside
83
- // updatePatchMetadata). Setting routes through `updates`; clearing
78
+ // updatePatchMetadata). Setting routes through `updates`. Clearing
84
79
  // routes through `unsetFields` so TypeScript's exact optional types
85
80
  // do not have to carry an explicit `undefined` on the `tier` field.
86
81
  if (after !== undefined) {
@@ -92,21 +87,16 @@ export async function patchTierCommand(projectRoot, identifier, options = {}) {
92
87
  else {
93
88
  await updatePatchMetadata(paths.patches, target.filename, {}, ['tier']);
94
89
  }
95
- try {
96
- await appendHistory(paths.patches, {
97
- operation: 'patch-tier',
98
- args: {
99
- filename: target.filename,
100
- ...(before !== undefined ? { before } : {}),
101
- ...(after !== undefined ? { after } : {}),
102
- },
103
- ...(options.yes === true ? { yes: true } : {}),
104
- result: 'ok',
105
- });
106
- }
107
- catch (historyError) {
108
- warn(`History log append failed after patch tier committed (${target.filename}): ${toError(historyError).message}`);
109
- }
90
+ await appendHistoryBestEffort(paths.patches, {
91
+ operation: 'patch-tier',
92
+ args: {
93
+ filename: target.filename,
94
+ ...(before !== undefined ? { before } : {}),
95
+ ...(after !== undefined ? { after } : {}),
96
+ },
97
+ ...(options.yes === true ? { yes: true } : {}),
98
+ result: 'ok',
99
+ }, `patch tier committed (${target.filename})`);
110
100
  info(`${target.filename}: ${action}.`);
111
101
  outro('Patch tier complete');
112
102
  }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Structural equality for patch rename maps, shared by the placement-mode
3
+ * export preview/commit check (`export-flow.ts`) and `patch reorder`'s
4
+ * under-lock drift check. Both previously carried a byte-identical copy of
5
+ * the sorted-entries comparison. One helper keeps the two commit gates from
6
+ * drifting.
7
+ */
8
+ import type { PatchRenameEntry } from '../core/patch-manifest.js';
9
+ /**
10
+ * Rename-map entries ordered by target order, so previews, history entries
11
+ * and equality checks all walk the queue in its final on-disk order.
12
+ */
13
+ export declare function getSortedRenameEntries(renameMap: Map<string, PatchRenameEntry>): Array<[string, PatchRenameEntry]>;
14
+ /**
15
+ * Compares two rename maps entry by entry after sorting both by target
16
+ * order. Equal when every (current filename, new filename, new order)
17
+ * triple matches positionally.
18
+ */
19
+ export declare function renameMapsEqual(left: Map<string, PatchRenameEntry>, right: Map<string, PatchRenameEntry>): boolean;
@@ -0,0 +1,36 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ /**
3
+ * Structural equality for patch rename maps, shared by the placement-mode
4
+ * export preview/commit check (`export-flow.ts`) and `patch reorder`'s
5
+ * under-lock drift check. Both previously carried a byte-identical copy of
6
+ * the sorted-entries comparison. One helper keeps the two commit gates from
7
+ * drifting.
8
+ */
9
+ /**
10
+ * Rename-map entries ordered by target order, so previews, history entries
11
+ * and equality checks all walk the queue in its final on-disk order.
12
+ */
13
+ export function getSortedRenameEntries(renameMap) {
14
+ return Array.from(renameMap.entries()).sort((a, b) => a[1].newOrder - b[1].newOrder);
15
+ }
16
+ /**
17
+ * Compares two rename maps entry by entry after sorting both by target
18
+ * order. Equal when every (current filename, new filename, new order)
19
+ * triple matches positionally.
20
+ */
21
+ export function renameMapsEqual(left, right) {
22
+ const leftEntries = getSortedRenameEntries(left);
23
+ const rightEntries = getSortedRenameEntries(right);
24
+ if (leftEntries.length !== rightEntries.length) {
25
+ return false;
26
+ }
27
+ return leftEntries.every(([leftFilename, leftEntry], index) => {
28
+ const rightTuple = rightEntries[index];
29
+ if (!rightTuple)
30
+ return false;
31
+ const [rightFilename, rightEntry] = rightTuple;
32
+ return (leftFilename === rightFilename &&
33
+ leftEntry.newFilename === rightEntry.newFilename &&
34
+ leftEntry.newOrder === rightEntry.newOrder);
35
+ });
36
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Clears `pendingResolution` from `state.json` transactionally.
3
+ *
4
+ * Five commands (`doctor --clear-resolution`, `resolve`, `rebase --continue`,
5
+ * `rebase --abort`, and the rebase patch loop) had each copied the same
6
+ * spread-then-`delete` updater. The clear routes through `updateState` instead
7
+ * of a load/modify/save pair so the updater runs inside the state-file lock
8
+ * against the freshest on-disk state: a concurrent write to an unrelated key
9
+ * (`buildMode`, `baseCommit`) is then not clobbered by a stale reload. Keeping
10
+ * it in one place stops the copies from drifting apart.
11
+ *
12
+ * A no-op when nothing is pending, so callers need no guard of their own.
13
+ * @param projectRoot - Project root holding `.fireforge/state.json`.
14
+ */
15
+ export declare function clearPendingResolution(projectRoot: string): Promise<void>;
@@ -0,0 +1,25 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ import { updateState } from '../core/config.js';
3
+ /**
4
+ * Clears `pendingResolution` from `state.json` transactionally.
5
+ *
6
+ * Five commands (`doctor --clear-resolution`, `resolve`, `rebase --continue`,
7
+ * `rebase --abort`, and the rebase patch loop) had each copied the same
8
+ * spread-then-`delete` updater. The clear routes through `updateState` instead
9
+ * of a load/modify/save pair so the updater runs inside the state-file lock
10
+ * against the freshest on-disk state: a concurrent write to an unrelated key
11
+ * (`buildMode`, `baseCommit`) is then not clobbered by a stale reload. Keeping
12
+ * it in one place stops the copies from drifting apart.
13
+ *
14
+ * A no-op when nothing is pending, so callers need no guard of their own.
15
+ * @param projectRoot - Project root holding `.fireforge/state.json`.
16
+ */
17
+ export async function clearPendingResolution(projectRoot) {
18
+ await updateState(projectRoot, (current) => {
19
+ if (!current.pendingResolution)
20
+ return current;
21
+ const next = { ...current };
22
+ delete next.pendingResolution;
23
+ return next;
24
+ });
25
+ }
@@ -1,5 +1,5 @@
1
- import type { getProjectPaths } from '../core/config.js';
2
1
  import type { PatchesManifest, PatchMetadata } from '../types/commands/index.js';
2
+ import type { ProjectPaths } from '../types/config.js';
3
3
  /**
4
4
  * Shared per-run context for the adjacency advisory: the classification
5
5
  * inputs computed once by `reExportCommand`, plus the collection of
@@ -18,24 +18,46 @@ export interface AdjacentUnmanagedContext {
18
18
  approvedUnmanaged: ReadonlySet<string>;
19
19
  /** Approved paths actually met this run, so unused ones can be surfaced. */
20
20
  approvedSeen: Set<string>;
21
+ /**
22
+ * Offenders collected across the loop. `files` stays the bare paths that
23
+ * downstream consumers already read. `anchored` carries the same entries
24
+ * with the owned directory that made each one adjacent, so the run-level
25
+ * refusal can name the anchor without re-deriving it.
26
+ */
21
27
  refusals: {
22
28
  patchFilename: string;
23
29
  files: string[];
30
+ anchored: string[];
24
31
  }[];
25
32
  }
26
33
  /** Returns the subset of `files` that no longer exist under `engineDir`. */
27
34
  export declare function findMissingFiles(engineDir: string, files: readonly string[]): Promise<string[]>;
35
+ /**
36
+ * One unmanaged file and the owned directory that made it adjacent.
37
+ *
38
+ * The anchor is what an unattended run could not previously recover: the
39
+ * notice named the offending file and the patch, but not which of the
40
+ * patch's owned locations the file sits beside, so triaging a refusal on a
41
+ * patch that owns files in several directories meant re-deriving the
42
+ * adjacency by hand from the manifest.
43
+ */
44
+ export interface AdjacentUnmanagedFile {
45
+ /** Engine-relative path of the unmanaged file. */
46
+ file: string;
47
+ /** Directory holding at least one file this patch owns. */
48
+ anchorDir: string;
49
+ }
28
50
  /**
29
51
  * Emits the scan-less advisory for one patch: missing manifest files and
30
52
  * unmanaged files adjacent to the patch's ownership. When
31
53
  * `--refuse-adjacent-unmanaged` is set and any unmanaged adjacent file
32
- * exists, records the patch into `ctx.refusals` and returns true — the
54
+ * exists, records the patch into `ctx.refusals` and returns true. The
33
55
  * caller then skips the write for this patch and converts the collection
34
56
  * into one run-level non-zero refusal after the loop.
35
57
  */
36
58
  export declare function reportAdjacentUnmanagedFiles(args: {
37
59
  patch: PatchMetadata;
38
- paths: ReturnType<typeof getProjectPaths>;
60
+ paths: ProjectPaths;
39
61
  manifest: PatchesManifest;
40
62
  currentFilesAffected: readonly string[];
41
63
  ctx: AdjacentUnmanagedContext;