@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
@@ -21,7 +21,7 @@ interface StatusFile {
21
21
  *
22
22
  * Populated from three sources:
23
23
  *
24
- * 1. Every path in every patch's `filesAffected` — so managed paths show up
24
+ * 1. Every path in every patch's `filesAffected`, so managed paths show up
25
25
  * even when they are not currently modified on disk.
26
26
  * 2. Any worktree status entries not claimed by any patch (flagged as
27
27
  * `unmanaged`).
@@ -36,17 +36,17 @@ interface StatusFile {
36
36
  * `conflictReason` so the output can disambiguate.
37
37
  *
38
38
  * @param manifestPatches - Manifest rows, each with its `filesAffected`
39
- * @param worktreeFiles - Raw worktree status entries; untracked and modified
39
+ * @param worktreeFiles - Raw worktree status entries. Untracked and modified
40
40
  * both acceptable
41
41
  * @param newFileCreatorsByPath - Map produced by
42
- * {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath};
43
- * paths with a `.length > 1` owner list become duplicate-create conflicts
42
+ * {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath}.
43
+ * Paths with a `.length > 1` owner list become duplicate-create conflicts
44
44
  */
45
45
  export declare function buildOwnershipTable(manifestPatches: PatchMetadata[], worktreeFiles: StatusFile[], newFileCreatorsByPath: Map<string, string[]>, classifications?: Map<string, FileClassification>): OwnershipRow[];
46
46
  /**
47
47
  * Renders the ownership table as a GitHub-flavored Markdown pipe table.
48
48
  * Using markdown-table's own serializer would require a seed document to
49
- * graft onto, which is overkill for ad-hoc status output; the rendering
49
+ * graft onto, which is overkill for ad-hoc status output. The rendering
50
50
  * here is trivial enough to inline.
51
51
  */
52
52
  export declare function renderOwnershipTable(rows: OwnershipRow[]): void;
@@ -6,7 +6,7 @@ import { buildPatchClaims } from './status-classify.js';
6
6
  *
7
7
  * Populated from three sources:
8
8
  *
9
- * 1. Every path in every patch's `filesAffected` — so managed paths show up
9
+ * 1. Every path in every patch's `filesAffected`, so managed paths show up
10
10
  * even when they are not currently modified on disk.
11
11
  * 2. Any worktree status entries not claimed by any patch (flagged as
12
12
  * `unmanaged`).
@@ -21,11 +21,11 @@ import { buildPatchClaims } from './status-classify.js';
21
21
  * `conflictReason` so the output can disambiguate.
22
22
  *
23
23
  * @param manifestPatches - Manifest rows, each with its `filesAffected`
24
- * @param worktreeFiles - Raw worktree status entries; untracked and modified
24
+ * @param worktreeFiles - Raw worktree status entries. Untracked and modified
25
25
  * both acceptable
26
26
  * @param newFileCreatorsByPath - Map produced by
27
- * {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath};
28
- * paths with a `.length > 1` owner list become duplicate-create conflicts
27
+ * {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath}.
28
+ * Paths with a `.length > 1` owner list become duplicate-create conflicts
29
29
  */
30
30
  export function buildOwnershipTable(manifestPatches, worktreeFiles, newFileCreatorsByPath, classifications = new Map()) {
31
31
  const ownersByPath = buildPatchClaims(manifestPatches);
@@ -57,7 +57,7 @@ export function buildOwnershipTable(manifestPatches, worktreeFiles, newFileCreat
57
57
  const duplicateOwners = duplicateCreateByPath.get(path);
58
58
  const isFilesAffectedConflict = owners.length > 1;
59
59
  const isDuplicateCreateConflict = duplicateOwners !== undefined;
60
- // Prefer the filesAffected reason when both apply — it's the older
60
+ // Prefer the filesAffected reason when both apply: it's the older
61
61
  // source of drift and the operator will usually want to fix the
62
62
  // manifest rows even when the bodies also duplicate-create.
63
63
  const conflictReason = isFilesAffectedConflict
@@ -105,7 +105,7 @@ export function buildOwnershipTable(manifestPatches, worktreeFiles, newFileCreat
105
105
  * `files-affected` drift (two manifest rows claiming the same path) from
106
106
  * `duplicate-create` drift (two patches both hitting `/dev/null → b/path`
107
107
  * in their bodies) so the operator can tell at a glance which fix
108
- * applies — the former wants `re-export --files`, the latter wants
108
+ * applies. The former wants `re-export --files`, the latter wants
109
109
  * `patch delete`.
110
110
  */
111
111
  function renderConflictCell(row) {
@@ -134,7 +134,7 @@ function renderStateCell(row) {
134
134
  /**
135
135
  * Renders the ownership table as a GitHub-flavored Markdown pipe table.
136
136
  * Using markdown-table's own serializer would require a seed document to
137
- * graft onto, which is overkill for ad-hoc status output; the rendering
137
+ * graft onto, which is overkill for ad-hoc status output. The rendering
138
138
  * here is trivial enough to inline.
139
139
  */
140
140
  export function renderOwnershipTable(rows) {
@@ -14,8 +14,8 @@ export declare function consumeParserFallbackEvents(): ParserFallbackEvent[];
14
14
  *
15
15
  * Rethrows internal-invariant `GeneralError`s ("Unexpected empty …array"):
16
16
  * those are programming bugs, and retrying the legacy scanner cannot fix a
17
- * broken invariant — it just buries the stack. Everything else still falls
18
- * back, which is load-bearing: the AST path raises a raw acorn SyntaxError
17
+ * broken invariant, it just buries the stack. Everything else still falls
18
+ * back, which matters: the AST path raises a raw acorn SyntaxError
19
19
  * on chrome sources acorn cannot parse (preprocessor directives), and
20
20
  * BuildError when the file's shape is unexpected. Both are exactly what the
21
21
  * legacy scanner is here to handle.
@@ -43,7 +43,7 @@ export interface ParserResult<T> {
43
43
  * @param primary - The modern parser implementation
44
44
  * @param fallback - The legacy fallback implementation
45
45
  * @param context - File/context name used in the warning message
46
- * @param rethrowIf - Optional predicate; if it returns true for the caught
46
+ * @param rethrowIf - Optional predicate. If it returns true for the caught
47
47
  * error the error is re-thrown instead of falling back (useful for
48
48
  * domain-specific errors that should not be swallowed).
49
49
  */
@@ -19,8 +19,8 @@ export function consumeParserFallbackEvents() {
19
19
  *
20
20
  * Rethrows internal-invariant `GeneralError`s ("Unexpected empty …array"):
21
21
  * those are programming bugs, and retrying the legacy scanner cannot fix a
22
- * broken invariant — it just buries the stack. Everything else still falls
23
- * back, which is load-bearing: the AST path raises a raw acorn SyntaxError
22
+ * broken invariant, it just buries the stack. Everything else still falls
23
+ * back, which matters: the AST path raises a raw acorn SyntaxError
24
24
  * on chrome sources acorn cannot parse (preprocessor directives), and
25
25
  * BuildError when the file's shape is unexpected. Both are exactly what the
26
26
  * legacy scanner is here to handle.
@@ -42,7 +42,7 @@ export function isInternalInvariantFailure(error) {
42
42
  * @param primary - The modern parser implementation
43
43
  * @param fallback - The legacy fallback implementation
44
44
  * @param context - File/context name used in the warning message
45
- * @param rethrowIf - Optional predicate; if it returns true for the caught
45
+ * @param rethrowIf - Optional predicate. If it returns true for the caught
46
46
  * error the error is re-thrown instead of falling back (useful for
47
47
  * domain-specific errors that should not be swallowed).
48
48
  */
@@ -3,17 +3,17 @@
3
3
  *
4
4
  * Tries an exact `git apply` first, then retries with git's real
5
5
  * drift-tolerance knob: `-C<n>` (reduced context matching). `git apply` has
6
- * NO `--fuzz` option — that flag belongs to GNU `patch(1)`, and passing it
6
+ * no `--fuzz` option. That flag belongs to GNU `patch(1)`, and passing it
7
7
  * makes git exit 129 with a usage error that an escalation loop will happily
8
8
  * swallow, so every "fuzzy" attempt silently fails and patches that would
9
9
  * have applied with context drift are reported as hard conflicts. If all
10
10
  * context-reduction levels fail, falls through to `git apply --reject` so
11
11
  * the user gets `.rej` files for manual resolution.
12
12
  *
13
- * Semantics note: GNU fuzz *fuzzily matches* context; `-C<n>` *ignores*
13
+ * Semantics note: GNU fuzz *fuzzily matches* context. `-C<n>` *ignores*
14
14
  * outer context lines instead. Step k maps to `-C(3-k)` (git's default
15
15
  * context width is 3), so the final step `-C0` matches on line positions and
16
- * -/+ content alone — the rough analogue of GNU `--fuzz=3` on a 3-context
16
+ * -/+ content alone, the rough analogue of GNU `--fuzz=3` on a 3-context
17
17
  * patch.
18
18
  */
19
19
  export interface FuzzyApplyResult {
@@ -38,8 +38,8 @@ export interface FuzzyApplyResult {
38
38
  * @param maxFuzz - Maximum context-reduction steps to try (default 3,
39
39
  * 0 = exact only). Values above 3 are capped: git cannot reduce below
40
40
  * `-C0`.
41
- * @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer —
42
- * a NaN or negative value would silently skip every apply attempt
41
+ * @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer.
42
+ * A NaN or negative value would silently skip every apply attempt
43
43
  * (including the exact-match one) and fall straight through to `--reject`
44
44
  */
45
45
  export declare function applyPatchWithFuzz(patchPath: string, engineDir: string, maxFuzz?: number): Promise<FuzzyApplyResult>;
@@ -4,24 +4,24 @@
4
4
  *
5
5
  * Tries an exact `git apply` first, then retries with git's real
6
6
  * drift-tolerance knob: `-C<n>` (reduced context matching). `git apply` has
7
- * NO `--fuzz` option — that flag belongs to GNU `patch(1)`, and passing it
7
+ * no `--fuzz` option. That flag belongs to GNU `patch(1)`, and passing it
8
8
  * makes git exit 129 with a usage error that an escalation loop will happily
9
9
  * swallow, so every "fuzzy" attempt silently fails and patches that would
10
10
  * have applied with context drift are reported as hard conflicts. If all
11
11
  * context-reduction levels fail, falls through to `git apply --reject` so
12
12
  * the user gets `.rej` files for manual resolution.
13
13
  *
14
- * Semantics note: GNU fuzz *fuzzily matches* context; `-C<n>` *ignores*
14
+ * Semantics note: GNU fuzz *fuzzily matches* context. `-C<n>` *ignores*
15
15
  * outer context lines instead. Step k maps to `-C(3-k)` (git's default
16
16
  * context width is 3), so the final step `-C0` matches on line positions and
17
- * -/+ content alone — the rough analogue of GNU `--fuzz=3` on a 3-context
17
+ * -/+ content alone, the rough analogue of GNU `--fuzz=3` on a 3-context
18
18
  * patch.
19
19
  */
20
20
  import { InvalidArgumentError } from '../errors/base.js';
21
21
  import { verbose } from '../utils/logger.js';
22
22
  import { exec } from '../utils/process.js';
23
23
  import { ensureGit } from './git-base.js';
24
- /** Git's default diff context width — the ceiling for reduction steps. */
24
+ /** Git's default diff context width, the ceiling for reduction steps. */
25
25
  const GIT_DEFAULT_CONTEXT = 3;
26
26
  // ── Implementation ──
27
27
  /**
@@ -36,19 +36,19 @@ const GIT_DEFAULT_CONTEXT = 3;
36
36
  * @param maxFuzz - Maximum context-reduction steps to try (default 3,
37
37
  * 0 = exact only). Values above 3 are capped: git cannot reduce below
38
38
  * `-C0`.
39
- * @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer —
40
- * a NaN or negative value would silently skip every apply attempt
39
+ * @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer.
40
+ * A NaN or negative value would silently skip every apply attempt
41
41
  * (including the exact-match one) and fall straight through to `--reject`
42
42
  */
43
43
  export async function applyPatchWithFuzz(patchPath, engineDir, maxFuzz = 3) {
44
44
  if (!Number.isInteger(maxFuzz) || maxFuzz < 0) {
45
- throw new InvalidArgumentError(`maxFuzz must be a non-negative integer, got ${String(maxFuzz)}.`, 'maxFuzz');
45
+ throw new InvalidArgumentError(`maxFuzz must be a non-negative integer, got ${maxFuzz}.`, 'maxFuzz');
46
46
  }
47
47
  await ensureGit();
48
48
  // Try exact match first, then escalate context reduction.
49
49
  const maxSteps = Math.min(maxFuzz, GIT_DEFAULT_CONTEXT);
50
50
  for (let step = 0; step <= maxSteps; step++) {
51
- const contextArgs = step > 0 ? [`-C${String(GIT_DEFAULT_CONTEXT - step)}`] : [];
51
+ const contextArgs = step > 0 ? [`-C${GIT_DEFAULT_CONTEXT - step}`] : [];
52
52
  const check = await exec('git', ['apply', '--check', ...contextArgs, '--', patchPath], {
53
53
  cwd: engineDir,
54
54
  });
@@ -59,12 +59,12 @@ export async function applyPatchWithFuzz(patchPath, engineDir, maxFuzz = 3) {
59
59
  });
60
60
  if (apply.exitCode === 0) {
61
61
  if (step > 0) {
62
- verbose(`Patch applied with reduced context (-C${String(GIT_DEFAULT_CONTEXT - step)}): ${patchPath}`);
62
+ verbose(`Patch applied with reduced context (-C${GIT_DEFAULT_CONTEXT - step}): ${patchPath}`);
63
63
  }
64
64
  return { success: true, fuzzFactor: step };
65
65
  }
66
- // Unlikely: --check passed but apply failed; fall through to next step
67
- verbose(`git apply -C${String(GIT_DEFAULT_CONTEXT - step)} --check passed but apply failed: ${apply.stderr.trim()}`);
66
+ // Unlikely: --check passed but apply failed. Fall through to next step
67
+ verbose(`git apply -C${GIT_DEFAULT_CONTEXT - step} --check passed but apply failed: ${apply.stderr.trim()}`);
68
68
  }
69
69
  }
70
70
  // All context-reduction levels failed → generate .rej files for manual resolution
@@ -88,8 +88,8 @@ export async function applyPatchWithFuzz(patchPath, engineDir, maxFuzz = 3) {
88
88
  * Rejected hunk #1.
89
89
  *
90
90
  * The reject file is `<file>.rej` next to the target. Matching GNU
91
- * `patch(1)`'s "saving rejects to file X.rej" phrasing instead — which git
92
- * never prints — leaves `rejectFiles` always empty and the
91
+ * `patch(1)`'s "saving rejects to file X.rej" phrasing instead, which git
92
+ * never prints, leaves `rejectFiles` always empty and the
93
93
  * conflict-summary ".rej files created" hint never fires.
94
94
  */
95
95
  function extractRejectFiles(stderr) {
@@ -1,13 +1,12 @@
1
1
  /**
2
- * Patch orchestration — coordinates patch discovery, application, and validation.
2
+ * Patch orchestration. Coordinates patch discovery, application, and validation.
3
3
  * Pure parsing, content transformation, and lock management are in separate modules.
4
4
  */
5
5
  import type { ImportSummary, PatchInfo, PatchMetadata } from '../types/commands/index.js';
6
6
  export { PatchError } from '../errors/patch.js';
7
- export { countPatches, discoverPatches, getAllTargetFilesFromPatch, getTargetFileFromPatch, isNewFilePatch, } from './patch-files.js';
7
+ export { countPatches, discoverPatches } from './patch-files.js';
8
8
  export { withPatchDirectoryLock } from './patch-lock.js';
9
- export { extractAffectedFiles, extractOrder, isNewFileInPatch } from './patch-parse.js';
10
- export { applyPatchToContent, extractNewFileContent } from './patch-transform.js';
9
+ export { extractAffectedFiles } from './patch-parse.js';
11
10
  /**
12
11
  * Options for {@link applyPatchesWithContinue}.
13
12
  */
@@ -28,14 +27,14 @@ export interface ApplyPatchesOptions {
28
27
  * The identifier is one of three shapes and the three shapes must stay
29
28
  * disjoint so the operator can reason about which patch they picked:
30
29
  *
31
- * 1. **Exact filename** — `005-foo.patch`. Matches only that filename.
32
- * 2. **Filename without extension** — `005-foo`. Matches `005-foo.patch`.
33
- * 3. **Bare numeric ordinal** — `5` or `005`. Matches the patch whose
30
+ * 1. Exact filename, `005-foo.patch`. Matches only that filename.
31
+ * 2. Filename without extension, `005-foo`. Matches `005-foo.patch`.
32
+ * 3. Bare numeric ordinal, `5` or `005`. Matches the patch whose
34
33
  * order prefix parses to the same integer (so `5` and `005` both match
35
34
  * `005-foo.patch`, and `05` matches too because parseInt normalizes
36
35
  * leading zeros).
37
36
  *
38
- * A purely-numeric identifier is treated **only** as an ordinal: it does not
37
+ * A purely-numeric identifier is treated only as an ordinal: it does not
39
38
  * also match a filename that happens to literally equal the digits. That
40
39
  * would require a patch literally named `5` or `005`, which would collide
41
40
  * with the filename prefix anyway.
@@ -47,10 +46,10 @@ export declare function matchesUntilFilename(patchFilename: string, needle: stri
47
46
  * on the first failure to keep the engine directory in a clean state.
48
47
  * @param patchesDir - Path to the patches directory
49
48
  * @param engineDir - Path to the engine directory
50
- * @param optionsOrContinue - Options object, or the legacy continueOnFailure boolean
49
+ * @param options - Application options
51
50
  * @returns Import summary with all results
52
51
  */
53
- export declare function applyPatchesWithContinue(patchesDir: string, engineDir: string, optionsOrContinue?: ApplyPatchesOptions | boolean): Promise<ImportSummary>;
52
+ export declare function applyPatchesWithContinue(patchesDir: string, engineDir: string, options?: ApplyPatchesOptions): Promise<ImportSummary>;
54
53
  /**
55
54
  * Batched patched-content computation shared by status classification,
56
55
  * import's unmanaged-dirty guard, and discard baseline planning.
@@ -67,10 +66,10 @@ export interface PatchedContentContext {
67
66
  }
68
67
  /**
69
68
  * Builds a batched patched-content context that loads the manifest and
70
- * discovers patch files ONCE for many lookups, and memoizes each patch body
69
+ * discovers patch files once for many lookups, and memoizes each patch body
71
70
  * read across the batch. A per-call helper re-runs `loadPatchesManifest` +
72
- * `discoverPatches` and re-reads every affecting patch body for every file —
73
- * O(dirtyFiles × patches) redundant IO when classifying a broad engine edit
74
- * session during `status` or `import`.
71
+ * `discoverPatches` and re-reads every affecting patch body for every file,
72
+ * which is O(dirtyFiles × patches) redundant IO when classifying a broad
73
+ * engine edit session during `status` or `import`.
75
74
  */
76
75
  export declare function createPatchedContentContext(patchesDir: string, engineDir: string): Promise<PatchedContentContext>;
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Patch orchestration — coordinates patch discovery, application, and validation.
3
+ * Patch orchestration. Coordinates patch discovery, application, and validation.
4
4
  * Pure parsing, content transformation, and lock management are in separate modules.
5
5
  */
6
6
  import { lstat, readFile, readlink, realpath, rm } from 'node:fs/promises';
@@ -11,24 +11,23 @@ import { pathExists, readText, writeFileAtomic, writeText } from '../utils/fs.js
11
11
  import { verbose } from '../utils/logger.js';
12
12
  import { isContainedRelativePath } from '../utils/paths.js';
13
13
  import { applyPatchIdempotent, reversePatch } from './git.js';
14
- import { getFileContentFromHead } from './git-file-ops.js';
14
+ import { getFileContentAtRef } from './git-file-ops.js';
15
15
  import { discoverPatches } from './patch-files.js';
16
16
  import { loadPatchesManifest } from './patch-manifest.js';
17
17
  import { extractAffectedFiles, extractConflictingFiles, isNewFileInPatch, parseDiffSections, } from './patch-parse.js';
18
18
  import { applyPatchTextToContent, extractNewFileContentFromDiff } from './patch-transform.js';
19
19
  // Re-export from split modules so existing import sites continue working
20
20
  export { PatchError } from '../errors/patch.js';
21
- export { countPatches, discoverPatches, getAllTargetFilesFromPatch, getTargetFileFromPatch, isNewFilePatch, } from './patch-files.js';
21
+ export { countPatches, discoverPatches } from './patch-files.js';
22
22
  export { withPatchDirectoryLock } from './patch-lock.js';
23
- export { extractAffectedFiles, extractOrder, isNewFileInPatch } from './patch-parse.js';
24
- export { applyPatchToContent, extractNewFileContent } from './patch-transform.js';
23
+ export { extractAffectedFiles } from './patch-parse.js';
25
24
  /**
26
25
  * Applies a single patch.
27
26
  *
28
27
  * @param patch - Patch info
29
28
  * @param engineDir - Path to the engine directory
30
29
  * @param protectedFiles - Files touched by patches already applied in the
31
- * current run; the idempotent-recovery reset must not wipe them (see
30
+ * current run. The idempotent-recovery reset must not wipe them (see
32
31
  * applyPatchIdempotent). Overlapping queues (`--allow-overlap`) share files
33
32
  * between patches, and resetting a shared file to HEAD during a later
34
33
  * patch's recovery silently discards the earlier patch's changes.
@@ -59,7 +58,7 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
59
58
  // losslessly where a utf-8 decode of a binary file does not.
60
59
  const savedContents = new Map();
61
60
  // New-file sections keyed by target, so the binary discrimination below
62
- // reads the ALREADY-parsed section instead of re-scanning the body per
61
+ // reads the already-parsed section instead of re-scanning the body per
63
62
  // file.
64
63
  const newFileSections = new Map(parseDiffSections(patchContent)
65
64
  .filter((section) => section.isNewFile)
@@ -74,14 +73,14 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
74
73
  savedContents.set(file, await readFile(targetPath));
75
74
  const section = newFileSections.get(file);
76
75
  if (section?.isBinary === true) {
77
- // A binary new file cannot be resolved by writing extracted text —
78
- // the payload is base85, whose alphabet includes '+'. It does not
79
- // need to be: `git apply` decodes a `GIT binary patch` itself. So
80
- // the resolution is to REMOVE the blocking file and let the retry
81
- // below create it from the payload, which is exactly what the
82
- // text branch achieves by overwriting.
76
+ // A binary new file cannot be resolved by writing extracted
77
+ // text, because the payload is base85, whose alphabet includes
78
+ // '+'. It does not need to be: `git apply` decodes a `GIT binary
79
+ // patch` itself. So the resolution is to remove the blocking file
80
+ // and let the retry below create it from the payload, which is
81
+ // exactly what the text branch achieves by overwriting.
83
82
  if (!section.hasBinaryDelta) {
84
- // `Binary files … differ` records THAT the bytes changed and
83
+ // `Binary files … differ` records that the bytes changed and
85
84
  // carries none of them, so nothing can recreate the file. Fail
86
85
  // honestly rather than deleting a file we cannot put back.
87
86
  throw new PatchError(`Cannot resolve the new-file conflict for ${file}: the patch's binary section ` +
@@ -98,8 +97,8 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
98
97
  }
99
98
  }
100
99
  catch (extractError) {
101
- // Resolution threw for a LATER target after earlier targets were
102
- // already overwritten or removed — restore them before reporting
100
+ // Resolution threw for a later target after earlier targets were
101
+ // already overwritten or removed. Restore them before reporting
103
102
  // failure, instead of letting the exception skip the restore loop
104
103
  // entirely and crash the whole import.
105
104
  for (const [file, originalContent] of savedContents) {
@@ -112,7 +111,7 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
112
111
  await applyPatchIdempotent(patch.path, engineDir, {
113
112
  ...(protectedFiles ? { protectedFiles } : {}),
114
113
  });
115
- // Keep the originals: rollbackPatches needs them if a LATER patch
114
+ // Keep the originals: rollbackPatches needs them if a later patch
116
115
  // fails, since reverse-applying this new-file patch deletes the
117
116
  // target and would otherwise permanently discard the pre-existing
118
117
  // content (recoverable from git only if it was tracked at HEAD).
@@ -162,8 +161,8 @@ async function rollbackPatches(results, engineDir) {
162
161
  catch (rollbackError) {
163
162
  verbose(`Failed to roll back ${result.patch.filename}: ${toError(rollbackError).message}`);
164
163
  }
165
- // Reversing an auto-resolved new-file patch deletes the target; put
166
- // back the pre-existing content the auto-resolve overwrote.
164
+ // Reversing an auto-resolved new-file patch deletes the target, so
165
+ // put back the pre-existing content the auto-resolve overwrote.
167
166
  if (result.autoResolvedOriginals) {
168
167
  for (const [file, originalContent] of result.autoResolvedOriginals) {
169
168
  try {
@@ -180,7 +179,7 @@ async function rollbackPatches(results, engineDir) {
180
179
  async function validatePatchTargets(patch, affectedFiles, engineDir) {
181
180
  // realpath the engine root once so containment is checked against the
182
181
  // physical tree (the root itself may sit behind a symlink, e.g. /tmp on
183
- // macOS). An unresolvable engine dir skips the symlink checks — a missing
182
+ // macOS). An unresolvable engine dir skips the symlink checks. A missing
184
183
  // engine surfaces through `git apply --check` with a better message.
185
184
  const engineRoot = engineDir ? await realpath(engineDir).catch(() => null) : null;
186
185
  for (const file of affectedFiles) {
@@ -207,7 +206,7 @@ async function validatePatchTargets(patch, affectedFiles, engineDir) {
207
206
  * - Dangling symlink: `realpath` rejects it, but a write through the link
208
207
  * would still be created at the link target, so the target is resolved
209
208
  * against the link's (real) parent directory. The link target is taken
210
- * textually — a loop or nested dangling link fails at apply time anyway.
209
+ * textually. A loop or nested dangling link fails at apply time anyway.
211
210
  * - Not-yet-existing file: resolved against the nearest existing ancestor's
212
211
  * real path. Components below that ancestor do not exist, so they cannot
213
212
  * be symlinks and are appended verbatim.
@@ -241,14 +240,14 @@ async function resolvePatchWriteDestination(targetPath) {
241
240
  * The identifier is one of three shapes and the three shapes must stay
242
241
  * disjoint so the operator can reason about which patch they picked:
243
242
  *
244
- * 1. **Exact filename** — `005-foo.patch`. Matches only that filename.
245
- * 2. **Filename without extension** — `005-foo`. Matches `005-foo.patch`.
246
- * 3. **Bare numeric ordinal** — `5` or `005`. Matches the patch whose
243
+ * 1. Exact filename, `005-foo.patch`. Matches only that filename.
244
+ * 2. Filename without extension, `005-foo`. Matches `005-foo.patch`.
245
+ * 3. Bare numeric ordinal, `5` or `005`. Matches the patch whose
247
246
  * order prefix parses to the same integer (so `5` and `005` both match
248
247
  * `005-foo.patch`, and `05` matches too because parseInt normalizes
249
248
  * leading zeros).
250
249
  *
251
- * A purely-numeric identifier is treated **only** as an ordinal: it does not
250
+ * A purely-numeric identifier is treated only as an ordinal: it does not
252
251
  * also match a filename that happens to literally equal the digits. That
253
252
  * would require a patch literally named `5` or `005`, which would collide
254
253
  * with the filename prefix anyway.
@@ -272,23 +271,18 @@ export function matchesUntilFilename(patchFilename, needle) {
272
271
  * on the first failure to keep the engine directory in a clean state.
273
272
  * @param patchesDir - Path to the patches directory
274
273
  * @param engineDir - Path to the engine directory
275
- * @param optionsOrContinue - Options object, or the legacy continueOnFailure boolean
274
+ * @param options - Application options
276
275
  * @returns Import summary with all results
277
276
  */
278
- export async function applyPatchesWithContinue(patchesDir, engineDir, optionsOrContinue = false) {
279
- // Accept both the legacy boolean positional and the new options object so
280
- // existing call sites (tests and rebase) keep working without a rewrite.
281
- const options = typeof optionsOrContinue === 'boolean'
282
- ? { continueOnFailure: optionsOrContinue }
283
- : optionsOrContinue;
277
+ export async function applyPatchesWithContinue(patchesDir, engineDir, options = {}) {
284
278
  const continueOnFailure = options.continueOnFailure ?? false;
285
279
  const untilFilename = options.untilFilename;
286
280
  const patches = await discoverPatches(patchesDir);
287
281
  // Resolve the --until stop index up front so callers get an immediate
288
282
  // error on an unknown identifier instead of a silent no-op. Detect
289
- // ambiguity (two patches matching the same needle — should never happen
290
- // in a well-formed manifest but surfaces queue corruption loudly
291
- // instead of silently picking the first match).
283
+ // ambiguity (two patches matching the same needle). That should never
284
+ // happen in a well-formed manifest, but it surfaces queue corruption
285
+ // loudly instead of silently picking the first match.
292
286
  let stopIndex = patches.length - 1;
293
287
  if (untilFilename !== undefined) {
294
288
  const matchingIndexes = [];
@@ -320,8 +314,8 @@ export async function applyPatchesWithContinue(patchesDir, engineDir, optionsOrC
320
314
  if (!patch)
321
315
  continue;
322
316
  if (i > stopIndex) {
323
- // Patches beyond the --until cutoff are intentionally skipped. They
324
- // are not failures — record them in `skipped` so the summary still
317
+ // Patches beyond the --until cutoff are skipped on purpose. They
318
+ // are not failures. Record them in `skipped` so the summary still
325
319
  // reflects what the full queue contained.
326
320
  skipped.push(patch);
327
321
  continue;
@@ -364,11 +358,11 @@ export async function applyPatchesWithContinue(patchesDir, engineDir, optionsOrC
364
358
  }
365
359
  /**
366
360
  * Builds a batched patched-content context that loads the manifest and
367
- * discovers patch files ONCE for many lookups, and memoizes each patch body
361
+ * discovers patch files once for many lookups, and memoizes each patch body
368
362
  * read across the batch. A per-call helper re-runs `loadPatchesManifest` +
369
- * `discoverPatches` and re-reads every affecting patch body for every file —
370
- * O(dirtyFiles × patches) redundant IO when classifying a broad engine edit
371
- * session during `status` or `import`.
363
+ * `discoverPatches` and re-reads every affecting patch body for every file,
364
+ * which is O(dirtyFiles × patches) redundant IO when classifying a broad
365
+ * engine edit session during `status` or `import`.
372
366
  */
373
367
  export async function createPatchedContentContext(patchesDir, engineDir) {
374
368
  const manifest = await loadPatchesManifest(patchesDir);
@@ -406,7 +400,7 @@ export async function createPatchedContentContext(patchesDir, engineDir) {
406
400
  getAffectingPatches,
407
401
  readPatchBody,
408
402
  computePatched: async (filePath) => {
409
- let content = await getFileContentFromHead(engineDir, filePath);
403
+ let content = await getFileContentAtRef(engineDir, filePath);
410
404
  for (const patch of getAffectingPatches(filePath)) {
411
405
  content = applyPatchTextToContent(content, await readPatchBody(patch), filePath);
412
406
  }
@@ -2,15 +2,6 @@
2
2
  * Patch coverage and supersession helpers used by export planning.
3
3
  */
4
4
  import type { PatchInfo, PatchMetadata } from '../types/commands/index.js';
5
- /**
6
- * Finds patches that are completely superseded by newer patches.
7
- * A patch is superseded if all its affected files are covered by newer patches.
8
- * @param patchesDir - Path to the patches directory
9
- * @param newPatchFiles - Files affected by the new patch
10
- * @param excludeFilename - Filename to exclude from results (the new patch itself)
11
- * @returns Superseded patches
12
- */
13
- export declare function findSupersededPatches(patchesDir: string, newPatchFiles: string[], excludeFilename?: string): Promise<PatchInfo[]>;
14
5
  /**
15
6
  * Report whether a patch is fully covered by a new export, and which of its
16
7
  * files caused the coverage.
@@ -2,37 +2,8 @@
2
2
  /**
3
3
  * Patch coverage and supersession helpers used by export planning.
4
4
  */
5
- import { discoverPatches, isNewFilePatch } from './patch-apply.js';
5
+ import { discoverPatches } from './patch-apply.js';
6
6
  import { loadPatchesManifest } from './patch-manifest.js';
7
- /**
8
- * Finds patches that are completely superseded by newer patches.
9
- * A patch is superseded if all its affected files are covered by newer patches.
10
- * @param patchesDir - Path to the patches directory
11
- * @param newPatchFiles - Files affected by the new patch
12
- * @param excludeFilename - Filename to exclude from results (the new patch itself)
13
- * @returns Superseded patches
14
- */
15
- export async function findSupersededPatches(patchesDir, newPatchFiles, excludeFilename) {
16
- const manifest = await loadPatchesManifest(patchesDir);
17
- if (!manifest)
18
- return [];
19
- const patches = await discoverPatches(patchesDir);
20
- const superseded = [];
21
- for (const metadata of manifest.patches) {
22
- if (excludeFilename && metadata.filename === excludeFilename)
23
- continue;
24
- if (metadata.filesAffected.length === 1) {
25
- const affectedFile = metadata.filesAffected[0];
26
- if (affectedFile && newPatchFiles.includes(affectedFile)) {
27
- const patch = patches.find((p) => p.filename === metadata.filename);
28
- if (patch && (await isNewFilePatch(patch.path))) {
29
- superseded.push(patch);
30
- }
31
- }
32
- }
33
- }
34
- return superseded;
35
- }
36
7
  /**
37
8
  * Checks whether a patch is fully covered by a new export.
38
9
  * A patch is fully covered when every file it affects is present in the new export.
@@ -13,6 +13,22 @@ export interface UpdatePatchPolicyGate {
13
13
  command: string;
14
14
  forceUnsafe?: boolean;
15
15
  }
16
+ export interface UpdatePatchAndMetadataOptions {
17
+ /** Patch directory holding the body and `patches.json`. */
18
+ patchesDir: string;
19
+ /** Patch file to rewrite. */
20
+ filename: string;
21
+ /** New patch body. An identical body skips the write. */
22
+ newContent: string;
23
+ /** Manifest-row fields to merge into the patch's metadata. */
24
+ updates: Partial<PatchMetadata>;
25
+ /** Hook run under the lock after the mutation succeeds. */
26
+ onCommitted?: UpdatePatchCommittedHook | undefined;
27
+ /** Policy gate run against the under-lock projected manifest. */
28
+ policyGate?: UpdatePatchPolicyGate | undefined;
29
+ /** Wait budget and command name for the patch directory lock. */
30
+ lockOptions?: PatchDirectoryLockOptions | undefined;
31
+ }
16
32
  /**
17
33
  * Updates a patch file body and its manifest row under the same patch
18
34
  * directory lock. Intended for commands like `re-export --files` where the
@@ -20,13 +36,14 @@ export interface UpdatePatchPolicyGate {
20
36
  *
21
37
  * The body write is skipped when the normalized new content is byte-identical
22
38
  * to what is already on disk. A bulk `re-export --all` refreshes every patch
23
- * in the queue, including ones the working tree never touched; rewriting an
39
+ * in the queue, including ones the working tree never touched. Rewriting an
24
40
  * unchanged body churns its mtime and reports "Re-exported" for a patch
25
41
  * nothing happened to, which is exactly the noise that hides a real
26
- * unexpected rewrite in `git status`. Metadata still moves either way — only
27
- * the redundant byte-for-byte write is elided.
42
+ * unexpected rewrite in `git status`. Metadata still moves either way, and
43
+ * only the redundant byte-for-byte write is elided.
28
44
  *
45
+ * @param options - See {@link UpdatePatchAndMetadataOptions}
29
46
  * @returns True when the patch body on disk changed, false when it was
30
47
  * already byte-identical to the new content.
31
48
  */
32
- export declare function updatePatchAndMetadata(patchesDir: string, filename: string, newContent: string, updates: Partial<PatchMetadata>, onCommitted?: UpdatePatchCommittedHook, policyGate?: UpdatePatchPolicyGate, lockOptions?: PatchDirectoryLockOptions): Promise<boolean>;
49
+ export declare function updatePatchAndMetadata(options: UpdatePatchAndMetadataOptions): Promise<boolean>;
@@ -5,7 +5,6 @@ import { toError } from '../utils/errors.js';
5
5
  import { pathExists, readText, writeText } from '../utils/fs.js';
6
6
  import { warn } from '../utils/logger.js';
7
7
  import { withPatchDirectoryLock } from './patch-apply.js';
8
- import { normalizePatchArtifact } from './patch-artifact-normalize.js';
9
8
  import { loadPatchesManifestForWrite, mutatePatchRowsInManifest } from './patch-manifest.js';
10
9
  import { buildProjectedManifest, enforcePatchPolicy } from './patch-policy.js';
11
10
  /**
@@ -15,16 +14,18 @@ import { buildProjectedManifest, enforcePatchPolicy } from './patch-policy.js';
15
14
  *
16
15
  * The body write is skipped when the normalized new content is byte-identical
17
16
  * to what is already on disk. A bulk `re-export --all` refreshes every patch
18
- * in the queue, including ones the working tree never touched; rewriting an
17
+ * in the queue, including ones the working tree never touched. Rewriting an
19
18
  * unchanged body churns its mtime and reports "Re-exported" for a patch
20
19
  * nothing happened to, which is exactly the noise that hides a real
21
- * unexpected rewrite in `git status`. Metadata still moves either way — only
22
- * the redundant byte-for-byte write is elided.
20
+ * unexpected rewrite in `git status`. Metadata still moves either way, and
21
+ * only the redundant byte-for-byte write is elided.
23
22
  *
23
+ * @param options - See {@link UpdatePatchAndMetadataOptions}
24
24
  * @returns True when the patch body on disk changed, false when it was
25
25
  * already byte-identical to the new content.
26
26
  */
27
- export async function updatePatchAndMetadata(patchesDir, filename, newContent, updates, onCommitted, policyGate, lockOptions = {}) {
27
+ export async function updatePatchAndMetadata(options) {
28
+ const { patchesDir, filename, newContent, updates, onCommitted, policyGate, lockOptions = {}, } = options;
28
29
  return withPatchDirectoryLock(patchesDir, async () => {
29
30
  const manifest = await loadPatchesManifestForWrite(patchesDir);
30
31
  if (!manifest) {
@@ -49,7 +50,7 @@ export async function updatePatchAndMetadata(patchesDir, filename, newContent, u
49
50
  forceUnsafe: policyGate.forceUnsafe === true,
50
51
  });
51
52
  }
52
- const normalized = normalizePatchArtifact(newContent);
53
+ const normalized = newContent;
53
54
  const bodyChanged = normalized !== originalContent;
54
55
  let patchWritten = false;
55
56
  try {