@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
@@ -34,13 +34,24 @@ export interface PatchQueueEntry {
34
34
  * are not indexed here.
35
35
  */
36
36
  newFiles: Map<string, string>;
37
+ /**
38
+ * Every path this patch creates, whatever the body kind: text, a
39
+ * reconstructable `GIT binary patch`, or a payload-less
40
+ * `Binary files … differ` stub. `newFiles` is text-only by design (a
41
+ * binary authors no imports, so the import rules gain nothing from it and
42
+ * `extractNewFileContent` correctly refuses to decode one), but "does a
43
+ * later patch create this path" is a question about existence after apply,
44
+ * not about content, and answering it from `newFiles` made every binary
45
+ * creation invisible to the staged-registration rules.
46
+ */
47
+ createdFiles: Set<string>;
37
48
  /**
38
49
  * Map from existing-file path → concatenated added lines from the patch's
39
50
  * hunks against that file (joined with `\n`). Populated for files the
40
51
  * patch *modifies* (i.e. paths that show up in the diff without a
41
52
  * `new file mode` marker). The forward-import rule and `patch delete`
42
53
  * dependency scan use this to detect imports added into pre-existing
43
- * files — a failure mode the newFiles map cannot represent because it
54
+ * files, a failure mode the newFiles map cannot represent because it
44
55
  * only tracks creations.
45
56
  */
46
57
  modifiedFileAdditions: Map<string, string>;
@@ -49,7 +60,7 @@ export interface PatchQueueEntry {
49
60
  * Queue-wide context passed to cross-patch lint rules.
50
61
  *
51
62
  * "Projected" means rules receive a potentially hypothetical view of the
52
- * queue — the caller may have already applied a planned delete, reorder, or
63
+ * queue: the caller may have already applied a planned delete, reorder, or
53
64
  * re-export to the entries before calling the rule. This lets
54
65
  * `patch reorder`, `patch delete`, `export --order`, and `re-export --files`
55
66
  * run the same cross-patch checks they would hit on a real run, without
@@ -73,7 +84,7 @@ export interface PatchQueueContext {
73
84
  * Reads manifest metadata best-effort: if the manifest is missing or a patch
74
85
  * file has no metadata entry, the context still populates the entry from the
75
86
  * filename prefix so cross-patch rules can operate on a drift state. (A
76
- * separate consistency check — see `patches verify` — is responsible for
87
+ * separate consistency check, see `patches verify`, is responsible for
77
88
  * reporting the drift as its own error.)
78
89
  *
79
90
  * @param patchesDir - Path to the patches directory
@@ -100,22 +111,19 @@ export declare function isForwardImportableFile(path: string): boolean;
100
111
  *
101
112
  * Intentionally conservative. Catches:
102
113
  * - `import ... from "specifier"` (ES module static imports)
103
- * - `import "specifier"` (side-effect imports — the `from`
114
+ * - `import "specifier"` (side-effect imports, where the `from`
104
115
  * clause is optional in the regex)
105
116
  * - `import("specifier")` (dynamic imports)
106
117
  * - ChromeUtils.importESModule("specifier")
107
118
  * - ChromeUtils.defineESModuleGetters(obj, { Name: "specifier", ... })
108
119
  *
109
- * Returns the raw specifier strings — callers should take the leaf basename
120
+ * Returns the raw specifier strings. Callers should take the leaf basename
110
121
  * to match against the newFileIndex, because we do not resolve `resource://`
111
122
  * URLs to engine file paths.
112
- */
113
- export declare function extractImportSpecifiers(source: string): string[];
114
- /**
115
- * Internal form of {@link extractImportSpecifiers} that also returns the
116
- * (0-indexed) line number where each specifier was found. Used by the
117
- * forward-import rule so it can correlate specifiers against the
118
- * ignore-marker line set and skip suppressed matches.
123
+ *
124
+ * Also returns the (0-indexed) line number where each specifier was found, so
125
+ * the forward-import rule can correlate specifiers against the ignore-marker
126
+ * line set and skip suppressed matches.
119
127
  */
120
128
  export interface ExtractedSpecifier {
121
129
  specifier: string;
@@ -123,7 +131,7 @@ export interface ExtractedSpecifier {
123
131
  }
124
132
  /**
125
133
  * Returns import specifiers plus 0-indexed line numbers, preserving the
126
- * same matching behavior as {@link extractImportSpecifiers}.
134
+ * same matching behavior as {@link extractImportSpecifiersWithLines}.
127
135
  */
128
136
  export declare function extractImportSpecifiersWithLines(source: string): ExtractedSpecifier[];
129
137
  /**
@@ -154,19 +162,19 @@ export declare function findForwardImportIgnoreLines(source: string): Set<number
154
162
  * Cross-patch lint rule: a patch imports a module that a later patch is
155
163
  * responsible for creating.
156
164
  *
157
- * Deliberately conservative — `resource://` URLs are not resolved to engine
165
+ * Conservative by design: `resource://` URLs are not resolved to engine
158
166
  * file paths. Instead a cross-queue index of newly-created files is built,
159
167
  * keyed by basename, and imports whose leaf matches an entry owned by a
160
168
  * later-ordered patch are flagged. False positives from unrelated basename
161
- * collisions (two directories both creating `Helper.sys.mjs`) are possible;
162
- * the README documents the limitation and the inline ignore marker above is
169
+ * collisions (two directories both creating `Helper.sys.mjs`) are possible.
170
+ * The README documents the limitation and the inline ignore marker above is
163
171
  * the escape hatch.
164
172
  *
165
173
  * Rules out:
166
174
  * - Imports whose leaf matches a newly-created file in the *same* or an
167
175
  * *earlier* patch (legitimate use).
168
176
  * - Imports whose leaf is not in the new-file index at all (pre-existing
169
- * engine file — not our concern).
177
+ * engine file, not our concern).
170
178
  * - Imports on a line suppressed by the ignore marker.
171
179
  */
172
180
  /** One discovered forward-import edge: a site importing a later-created file. */
@@ -196,8 +204,8 @@ export declare function collectForwardImportEdges(ctx: PatchQueueContext): Forwa
196
204
  * Cross-patch lint rule: flag imports of a module a later-ordered patch is
197
205
  * responsible for creating, unless the patch declares an exact staged
198
206
  * forward-import for it. Also warns on staged-dependency declarations that
199
- * never matched (stale). Matching is conservative — by basename, not by
200
- * resolving `resource://`/`chrome://` URLs — with an inline ignore marker as
207
+ * never matched (stale). Matching is conservative: by basename, not by
208
+ * resolving `resource://`/`chrome://` URLs, with an inline ignore marker as
201
209
  * an escape hatch for unrelated basename collisions.
202
210
  */
203
211
  export declare function lintPatchQueueForwardImports(ctx: PatchQueueContext): PatchLintIssue[];
@@ -19,7 +19,9 @@ import { discoverPatches } from './patch-files.js';
19
19
  import { lintPatchQueueBinaryBodies } from './patch-lint-binary.js';
20
20
  import { collectNewFileCreatorsByPath } from './patch-lint-creators.js';
21
21
  import { detectNewFilesInDiff, extractAddedLinesPerFile } from './patch-lint-diff.js';
22
+ import { lintPatchQueueForwardRegistrations } from './patch-lint-forward-registration.js';
22
23
  import { lintPatchQueueModuleRegistrations } from './patch-lint-module-registration.js';
24
+ import { describeRegistrationFailure, findStagedRegistrationFailure, isLaterOwner, quoteRegistrationLine, } from './patch-lint-staged-registration.js';
23
25
  import { loadPatchesManifest } from './patch-manifest-io.js';
24
26
  import { categoryRangeForOrder, categoryRangeLabel } from './patch-policy.js';
25
27
  import { extractNewFileContent } from './patch-transform.js';
@@ -30,7 +32,7 @@ import { extractNewFileContent } from './patch-transform.js';
30
32
  * Reads manifest metadata best-effort: if the manifest is missing or a patch
31
33
  * file has no metadata entry, the context still populates the entry from the
32
34
  * filename prefix so cross-patch rules can operate on a drift state. (A
33
- * separate consistency check — see `patches verify` — is responsible for
35
+ * separate consistency check, see `patches verify`, is responsible for
34
36
  * reporting the drift as its own error.)
35
37
  *
36
38
  * @param patchesDir - Path to the patches directory
@@ -61,7 +63,7 @@ export async function buildPatchQueueContext(patchesDir, config) {
61
63
  // Added-line content for every file the patch modifies but does not
62
64
  // create. Fed to the forward-import rule so imports introduced into
63
65
  // pre-existing files are checked too, not only imports in brand-new
64
- // files. We deliberately skip paths in newFilePaths — those are
66
+ // files. Paths in newFilePaths are skipped on purpose: they are
65
67
  // already covered by the newFiles map, which carries full content
66
68
  // rather than only the added lines.
67
69
  const addedLinesByFile = extractAddedLinesPerFile(diff);
@@ -77,6 +79,9 @@ export async function buildPatchQueueContext(patchesDir, config) {
77
79
  metadata: metadataByFilename.get(patch.filename) ?? null,
78
80
  diff,
79
81
  newFiles,
82
+ // Straight from the detector, before the text-extraction filter above
83
+ // drops the bodies it cannot decode.
84
+ createdFiles: newFilePaths,
80
85
  modifiedFileAdditions,
81
86
  });
82
87
  }
@@ -86,7 +91,7 @@ export async function buildPatchQueueContext(patchesDir, config) {
86
91
  }
87
92
  // The creators map (split out of `lintPatchQueueDuplicateCreations` so
88
93
  // `status --ownership` can consume the structured data) lives in
89
- // `patch-lint-creators.ts` with its per-context memoisation;
94
+ // `patch-lint-creators.ts` with its per-context memoisation. It is
90
95
  // re-exported here so callers keep importing from `patch-lint.ts`.
91
96
  export { collectNewFileCreatorsByPath, invalidateNewFileCreatorsCache, } from './patch-lint-creators.js';
92
97
  /**
@@ -125,24 +130,6 @@ const FORWARD_IMPORTABLE_EXTENSIONS = ['.mjs', '.sys.mjs', '.js', '.jsm'];
125
130
  export function isForwardImportableFile(path) {
126
131
  return FORWARD_IMPORTABLE_EXTENSIONS.some((ext) => path.endsWith(ext));
127
132
  }
128
- /**
129
- * Regex-level extractor for module specifiers in ES module / subscript files.
130
- *
131
- * Intentionally conservative. Catches:
132
- * - `import ... from "specifier"` (ES module static imports)
133
- * - `import "specifier"` (side-effect imports — the `from`
134
- * clause is optional in the regex)
135
- * - `import("specifier")` (dynamic imports)
136
- * - ChromeUtils.importESModule("specifier")
137
- * - ChromeUtils.defineESModuleGetters(obj, { Name: "specifier", ... })
138
- *
139
- * Returns the raw specifier strings — callers should take the leaf basename
140
- * to match against the newFileIndex, because we do not resolve `resource://`
141
- * URLs to engine file paths.
142
- */
143
- export function extractImportSpecifiers(source) {
144
- return extractImportSpecifiersWithLines(source).map((item) => item.specifier);
145
- }
146
133
  function buildLineOffsets(source) {
147
134
  const offsets = [0];
148
135
  for (let i = 0; i < source.length; i++) {
@@ -181,7 +168,7 @@ function collectGetterSpecifiers(stripped, results, offsetToLine) {
181
168
  const openParen = stripped.indexOf('(', match.index);
182
169
  if (openParen === -1)
183
170
  continue;
184
- // Walk to the first top-level `{` inside the call — the start of
171
+ // Walk to the first top-level `{` inside the call, the start of
185
172
  // the getter-map object literal. Bail if we reach the closing `)`
186
173
  // first (no object literal argument given).
187
174
  let depthParen = 1;
@@ -236,14 +223,14 @@ function collectGetterSpecifiers(stripped, results, offsetToLine) {
236
223
  }
237
224
  /**
238
225
  * Returns import specifiers plus 0-indexed line numbers, preserving the
239
- * same matching behavior as {@link extractImportSpecifiers}.
226
+ * same matching behavior as {@link extractImportSpecifiersWithLines}.
240
227
  */
241
228
  export function extractImportSpecifiersWithLines(source) {
242
229
  // stripJsComments replaces comment bodies with space runs of equal
243
230
  // length, preserving character offsets. That lets us match against
244
231
  // the stripped source (so we do not match `import` tokens inside
245
232
  // block comments or string literals) while still reporting line
246
- // numbers based on the ORIGINAL source, which is what the
233
+ // numbers based on the original source, which is what the
247
234
  // ignore-marker scan walks.
248
235
  const stripped = stripJsComments(source);
249
236
  const results = [];
@@ -260,7 +247,7 @@ export function extractImportSpecifiersWithLines(source) {
260
247
  if (match[1])
261
248
  results.push({ specifier: match[1], line: offsetToLine(match.index) });
262
249
  }
263
- // ChromeUtils.importESModule("resource://...") — Firefox single-module import
250
+ // ChromeUtils.importESModule("resource://...") is a Firefox single-module import
264
251
  const chromeUtilsPattern = /ChromeUtils\.importESModule\s*\(\s*["']([^"']+)["']/g;
265
252
  while ((match = chromeUtilsPattern.exec(stripped)) !== null) {
266
253
  if (match[1])
@@ -270,14 +257,14 @@ export function extractImportSpecifiersWithLines(source) {
270
257
  return results;
271
258
  }
272
259
  /**
273
- * Bare `Name: "url"` property lines added inside a PRE-EXISTING
274
- * `defineESModuleGetters` (or `XPCOMUtils` lazy-getter) map. Applied ONLY to
260
+ * Bare `Name: "url"` property lines added inside a pre-existing
261
+ * `defineESModuleGetters` (or `XPCOMUtils` lazy-getter) map. Applied only to
275
262
  * `modifiedFileAdditions`: a patch that inserts one property into an
276
263
  * existing getter object never carries the `defineESModuleGetters(` opener
277
264
  * in its added lines, so the balanced-brace walk in
278
265
  * {@link extractImportSpecifiersWithLines} cannot see it. The
279
266
  * URL-scheme restriction keeps ordinary object literals
280
- * (`label: "Foo.sys.mjs"`) out; the leaf-extension filter downstream does
267
+ * (`label: "Foo.sys.mjs"`) out. The leaf-extension filter downstream does
281
268
  * the rest.
282
269
  */
283
270
  const BARE_GETTER_PROPERTY_LINE = /^\s*(?:["'])?[A-Za-z_$][\w$]*(?:["'])?\s*:\s*["']((?:resource|chrome|moz-src):\/\/[^"']+)["']\s*,?\s*$/;
@@ -290,8 +277,8 @@ function extractBareGetterSpecifiers(source) {
290
277
  const stripped = stripJsComments(source);
291
278
  const results = [];
292
279
  const lines = stripped.split('\n');
293
- for (let i = 0; i < lines.length; i++) {
294
- const match = BARE_GETTER_PROPERTY_LINE.exec(lines[i] ?? '');
280
+ for (const [i, line] of lines.entries()) {
281
+ const match = BARE_GETTER_PROPERTY_LINE.exec(line);
295
282
  if (match?.[1])
296
283
  results.push({ specifier: match[1], line: i });
297
284
  }
@@ -323,9 +310,8 @@ export const FORWARD_IMPORT_IGNORE_MARKER = 'fireforge-ignore: forward-import';
323
310
  export function findForwardImportIgnoreLines(source) {
324
311
  const lines = source.split('\n');
325
312
  const ignored = new Set();
326
- for (let i = 0; i < lines.length; i++) {
327
- const line = lines[i];
328
- if (line && line.includes(FORWARD_IMPORT_IGNORE_MARKER)) {
313
+ for (const [i, line] of lines.entries()) {
314
+ if (line.includes(FORWARD_IMPORT_IGNORE_MARKER)) {
329
315
  ignored.add(i);
330
316
  ignored.add(i + 1);
331
317
  }
@@ -348,36 +334,51 @@ function findMatchingStagedDependency(entry, sitePath, specifier, laterOwners) {
348
334
  laterOwners.some((owner) => owner.fullPath === dependency.creates &&
349
335
  (dependency.owner === undefined || dependency.owner === owner.filename)));
350
336
  }
351
- /**
352
- * Later-in-apply-order predicate shared by the forward-import scan and the
353
- * registration validation: strictly higher ordinal, or same ordinal with a
354
- * lexicographically later filename (the apply loop's tiebreak).
355
- */
356
- function isLaterOwner(owner, entry) {
357
- return (owner.order > entry.order || (owner.order === entry.order && owner.filename > entry.filename));
358
- }
359
- /** Builds the basename → later-creators index used by the forward-import scan. */
360
- function buildNewFileIndex(ctx) {
361
- const newFileIndex = new Map();
337
+ /** Builds a basename → creators index from one path set per entry. */
338
+ function buildCreatorIndex(ctx, pathsOf) {
339
+ const index = new Map();
362
340
  for (const entry of ctx.entries) {
363
- for (const fullPath of entry.newFiles.keys()) {
341
+ for (const fullPath of pathsOf(entry)) {
364
342
  const leaf = basename(fullPath);
365
- let owners = newFileIndex.get(leaf);
343
+ let owners = index.get(leaf);
366
344
  if (!owners) {
367
345
  owners = [];
368
- newFileIndex.set(leaf, owners);
346
+ index.set(leaf, owners);
369
347
  }
370
348
  owners.push({ filename: entry.filename, order: entry.order, fullPath });
371
349
  }
372
350
  }
373
- return newFileIndex;
351
+ return index;
352
+ }
353
+ /**
354
+ * Basename → later-creators index for the forward-IMPORT scan.
355
+ *
356
+ * Keyed on `newFiles`: this index answers "which patch creates
357
+ * the module this specifier resolves to", and a binary is not a module.
358
+ */
359
+ function buildNewFileIndex(ctx) {
360
+ return buildCreatorIndex(ctx, (entry) => entry.newFiles.keys());
361
+ }
362
+ /**
363
+ * Basename → creators index for the staged-REGISTRATION rules.
364
+ *
365
+ * Keyed on `createdFiles`, which includes binary creations. A registration
366
+ * (`support-files`, a jar.mn line, an actor entry) points at a file that
367
+ * must exist after apply. Whether its body was text or a `GIT binary patch`
368
+ * has nothing to do with it. Resolving this from `newFiles` made a declared
369
+ * dependency on a binary fixture report `creates-unresolved`, so the
370
+ * declaration read as stale on every lint run and removing it changed
371
+ * nothing either. The failure was symmetric and therefore invisible.
372
+ */
373
+ function buildCreatedFileIndex(ctx) {
374
+ return buildCreatorIndex(ctx, (entry) => entry.createdFiles);
374
375
  }
375
376
  /**
376
377
  * Visits every forward-import site (an import whose leaf is created by a
377
378
  * later-ordered patch). Shared by {@link lintPatchQueueForwardImports} (which
378
379
  * resolves/reports each) and {@link collectForwardImportEdges} (which returns
379
380
  * them structurally). We scan a created file's full body and a modified
380
- * file's added lines only — flagging imports *this patch introduces*, not
381
+ * file's added lines only, so it flags imports *this patch introduces*, not
381
382
  * pre-existing HEAD imports that happen to collide with a later-created file.
382
383
  */
383
384
  function eachForwardImportSite(ctx, newFileIndex, visit) {
@@ -388,10 +389,10 @@ function eachForwardImportSite(ctx, newFileIndex, visit) {
388
389
  if (includeBareGetterLines) {
389
390
  // Dedupe by (specifier, line): a patch that adds the whole getter
390
391
  // call carries both the opener (found by the balanced walk) and the
391
- // property line (found here) — report each site once.
392
- const seen = new Set(sites.map((site) => `${site.specifier}|${String(site.line)}`));
392
+ // property line (found here), so report each site once.
393
+ const seen = new Set(sites.map((site) => `${site.specifier}|${site.line}`));
393
394
  for (const extra of extractBareGetterSpecifiers(content)) {
394
- if (!seen.has(`${extra.specifier}|${String(extra.line)}`))
395
+ if (!seen.has(`${extra.specifier}|${extra.line}`))
395
396
  sites.push(extra);
396
397
  }
397
398
  }
@@ -447,12 +448,13 @@ export function collectForwardImportEdges(ctx) {
447
448
  * Cross-patch lint rule: flag imports of a module a later-ordered patch is
448
449
  * responsible for creating, unless the patch declares an exact staged
449
450
  * forward-import for it. Also warns on staged-dependency declarations that
450
- * never matched (stale). Matching is conservative — by basename, not by
451
- * resolving `resource://`/`chrome://` URLs — with an inline ignore marker as
451
+ * never matched (stale). Matching is conservative: by basename, not by
452
+ * resolving `resource://`/`chrome://` URLs, with an inline ignore marker as
452
453
  * an escape hatch for unrelated basename collisions.
453
454
  */
454
455
  export function lintPatchQueueForwardImports(ctx) {
455
456
  const newFileIndex = buildNewFileIndex(ctx);
457
+ const createdFileIndex = buildCreatedFileIndex(ctx);
456
458
  const issues = [];
457
459
  const usedStagedDeclarations = new Set();
458
460
  eachForwardImportSite(ctx, newFileIndex, (entry, sitePath, specifier, cleaned, laterOwners) => {
@@ -468,11 +470,11 @@ export function lintPatchQueueForwardImports(ctx) {
468
470
  .map((o) => `${o.filename}:${o.fullPath}`)
469
471
  .sort((a, b) => a.localeCompare(b))
470
472
  .join(',');
471
- // Lowest ordinal that lands AFTER every later-ordered creator —
473
+ // Lowest ordinal that lands after every later-ordered creator. It
472
474
  // turns the operator's "guess and re-run" loop into a single shot
473
475
  // when the only fix is reordering. When patchPolicy is available and
474
476
  // that ordinal falls outside the importing patch's category range,
475
- // `patch reorder` would refuse it — suppress the hint and point at
477
+ // `patch reorder` would refuse it, so suppress the hint and point at
476
478
  // the staged-dependency remedy instead.
477
479
  const suggestedOrder = Math.max(...laterOwners.map((o) => o.order)) + 1;
478
480
  const category = entry.metadata?.category ?? /^\d+-([a-z]+)-/.exec(entry.filename)?.[1];
@@ -524,14 +526,14 @@ export function lintPatchQueueForwardImports(ctx) {
524
526
  }
525
527
  // Registration-kind declarations: a jar.mn packaging line,
526
528
  // customElements registration, or actor registration referencing a
527
- // later-created file. There is no import specifier to match — the
529
+ // later-created file. There is no import specifier to match. The
528
530
  // declaration is "used" when the declared line (whitespace-trimmed)
529
- // appears among the lines this patch adds to the declaring file AND its
531
+ // appears among the lines this patch adds to the declaring file and its
530
532
  // `creates` resolves to a file a later-ordered patch actually creates
531
- // (with `owner`, when set, naming that patch) — mirroring
533
+ // (with `owner`, when set, naming that patch), mirroring
532
534
  // findMatchingStagedDependency for the import kind.
533
535
  for (const registration of entry.metadata?.stagedDependencies?.registrations ?? []) {
534
- const failure = findStagedRegistrationFailure(entry, registration, newFileIndex);
536
+ const failure = findStagedRegistrationFailure(entry, registration, createdFileIndex);
535
537
  if (failure === undefined)
536
538
  continue;
537
539
  issues.push({
@@ -541,62 +543,16 @@ export function lintPatchQueueForwardImports(ctx) {
541
543
  fingerprint: `staged-dependency-unused|${entry.filename}|${registration.file}|reg:${registration.line}|${registration.creates}|${registration.owner ?? ''}`,
542
544
  message: `${entry.filename} declares a staged registration in ${registration.file} ` +
543
545
  `("${registration.line}") for ${registration.creates}, but ${describeRegistrationFailure(failure)} ` +
544
- 'Remove the stale declaration with "fireforge patch staged-dependency --remove --kind registration" or update it to match the patch and queue.',
546
+ 'Remove the stale declaration with: ' +
547
+ `fireforge patch staged-dependency ${entry.filename} --remove --kind registration ` +
548
+ `--file ${registration.file} --line "${quoteRegistrationLine(registration.line)}" ` +
549
+ `--creates ${registration.creates}; or update it to match the patch and queue.`,
545
550
  severity: 'warning',
546
551
  });
547
552
  }
548
553
  }
549
554
  return issues;
550
555
  }
551
- /**
552
- * Validates one registration-kind declaration against the patch content
553
- * and the queue, mirroring {@link findMatchingStagedDependency}: the
554
- * declared line must be added by this patch, `creates` must exactly match
555
- * a file a LATER-ordered patch creates (an earlier-only creator means the
556
- * dependency is already satisfied and the declaration is stale), and
557
- * `owner`, when set, must name one of those creating patches. Returns
558
- * undefined when valid.
559
- */
560
- function findStagedRegistrationFailure(entry, registration, newFileIndex) {
561
- if (!isRegistrationLinePresent(entry, registration))
562
- return { kind: 'line-absent' };
563
- const creators = (newFileIndex.get(basename(registration.creates)) ?? []).filter((owner) => owner.fullPath === registration.creates && isLaterOwner(owner, entry));
564
- if (creators.length === 0)
565
- return { kind: 'creates-unresolved' };
566
- if (registration.owner !== undefined &&
567
- !creators.some((owner) => owner.filename === registration.owner)) {
568
- return { kind: 'owner-mismatch', creators };
569
- }
570
- return undefined;
571
- }
572
- /** Message tail for each {@link StagedRegistrationFailure} shape. */
573
- function describeRegistrationFailure(failure) {
574
- switch (failure.kind) {
575
- case 'line-absent':
576
- return 'the patch does not add that line.';
577
- case 'creates-unresolved':
578
- return ('no later-ordered patch creates that file — the declaration is stale, ' +
579
- 'or the queue order no longer stages it.');
580
- case 'owner-mismatch':
581
- return `that file is created by ${failure.creators.map((o) => o.filename).join(', ')}, not the declared owner.`;
582
- }
583
- }
584
- /**
585
- * True when the declared registration/packaging line appears (trimmed)
586
- * among the lines the patch introduces in the declaring file — either as a
587
- * newly-created file's content or as added lines to an existing file
588
- * (where jar.mn / customElements.js / actor-registration edits land).
589
- */
590
- function isRegistrationLinePresent(entry, registration) {
591
- const declared = registration.line.trim();
592
- if (declared.length === 0)
593
- return false;
594
- const introduced = [
595
- entry.newFiles.get(registration.file),
596
- entry.modifiedFileAdditions.get(registration.file),
597
- ];
598
- return introduced.some((content) => content !== undefined && content.split('\n').some((line) => line.trim() === declared));
599
- }
600
556
  /**
601
557
  * Cross-patch lint orchestrator. Runs every cross-patch rule against the
602
558
  * provided context and returns combined issues.
@@ -614,6 +570,7 @@ export function lintPatchQueue(ctx) {
614
570
  ...lintPatchQueueDuplicateCreations(ctx),
615
571
  ...lintPatchQueueForwardImports(ctx),
616
572
  ...lintPatchQueueModuleRegistrations(ctx),
573
+ ...lintPatchQueueForwardRegistrations(ctx),
617
574
  ...lintPatchQueueBinaryBodies(ctx),
618
575
  ];
619
576
  }
@@ -3,7 +3,7 @@
3
3
  * custom-property references.
4
4
  *
5
5
  * Split out of `patch-lint.ts` so each rule family stays within the
6
- * per-file line budget; `patch-lint.ts` re-exports `lintPatchedCss` so
6
+ * per-file line budget. `patch-lint.ts` re-exports `lintPatchedCss` so
7
7
  * existing callers keep importing from the single module.
8
8
  */
9
9
  import type { PatchLintIssue } from '../types/commands/index.js';
@@ -4,7 +4,7 @@
4
4
  * custom-property references.
5
5
  *
6
6
  * Split out of `patch-lint.ts` so each rule family stays within the
7
- * per-file line budget; `patch-lint.ts` re-exports `lintPatchedCss` so
7
+ * per-file line budget. `patch-lint.ts` re-exports `lintPatchedCss` so
8
8
  * existing callers keep importing from the single module.
9
9
  */
10
10
  import { join } from 'node:path';
@@ -15,7 +15,7 @@ import { hasRawCssColors } from '../utils/regex.js';
15
15
  import { loadFurnaceConfig } from './furnace-config.js';
16
16
  import { extractAddedLineNumbersPerFile, extractAddedLinesPerFile } from './patch-lint-diff.js';
17
17
  /**
18
- * Loads the furnace token-prefix lint inputs gracefully — returns
18
+ * Loads the furnace token-prefix lint inputs gracefully. Returns
19
19
  * undefined (skipping the token-prefix check) when furnace.json cannot
20
20
  * be loaded or no tokenPrefix is configured.
21
21
  */
@@ -38,7 +38,7 @@ async function loadCssTokenContext(repoDir) {
38
38
  }
39
39
  /**
40
40
  * Masks CSS block comments with spaces, preserving newlines so line
41
- * numbers stay stable. An unclosed trailing `/*` is masked to EOF —
41
+ * numbers stay stable. An unclosed trailing `/*` is masked to EOF,
42
42
  * matching how a CSS parser treats it.
43
43
  */
44
44
  function maskCssComments(source) {
@@ -60,7 +60,7 @@ const RAW_COLOR_IGNORE_MARKER = 'fireforge-ignore: raw-color-value';
60
60
  * comment spanning the context/added boundary suppresses its hex, then
61
61
  * only the patch's added line numbers are scanned. Returns undefined
62
62
  * when any added line number falls outside the on-disk file (patch not
63
- * applied / drifted) — the caller then falls back to the legacy
63
+ * applied / drifted). The caller then falls back to the legacy
64
64
  * joined-added-lines scan rather than misattributing lines.
65
65
  */
66
66
  function buildAddedLinesScanSource(rawCss, addedNumbers) {
@@ -73,14 +73,11 @@ function buildAddedLinesScanSource(rawCss, addedNumbers) {
73
73
  .map((n) => maskedLines[n - 1] ?? '')
74
74
  .join('\n');
75
75
  }
76
- /**
77
- * Raw-color check for one patched CSS file, scoped to introduced lines
78
- * when diff context is available. Pushes onto `issues`.
79
- */
80
- function checkRawColorValues(file, rawCss, addedLinesByFile, addedLineNumbersByFile, config, issues) {
76
+ function checkRawColorValues(input) {
77
+ const { file, rawCss, addedLinesByFile, addedLineNumbersByFile, config, issues } = input;
81
78
  // Check only introduced raw color values when diff context is available.
82
79
  // Skip files on the raw-color allowlist (exact path or basename match) and
83
- // auto-exempt files under `browser/branding/` — those are the fork's
80
+ // auto-exempt files under `browser/branding/`: those are the fork's
84
81
  // visual identity assets (app-about dialogs, installer pages, branded CSS
85
82
  // copied from Firefox's `unofficial` template) and belong to the
86
83
  // design-decision layer the design-token system does not govern. Without
@@ -207,7 +204,14 @@ export async function lintPatchedCss(repoDir, affectedFiles, diffContent, config
207
204
  const rawCss = await readText(filePath);
208
205
  // Strip block comments before scanning
209
206
  const cssContent = rawCss.replace(/\/\*[\s\S]*?\*\//g, '');
210
- checkRawColorValues(file, rawCss, addedLinesByFile, addedLineNumbersByFile, config, issues);
207
+ checkRawColorValues({
208
+ file,
209
+ rawCss,
210
+ addedLinesByFile,
211
+ addedLineNumbersByFile,
212
+ config,
213
+ issues,
214
+ });
211
215
  checkTokenPrefixViolations(file, cssContent, addedLinesByFile, tokenContext, issues);
212
216
  }
213
217
  return issues;
@@ -12,7 +12,7 @@ import type { PatchLintIssue } from '../types/commands/index.js';
12
12
  /**
13
13
  * Collects engine-relative paths that changed between `rev` and `HEAD`,
14
14
  * plus any workdir modifications and untracked files. An empty set means
15
- * "no diff we can prove" — downstream treats every issue as `cumulative`
15
+ * "no diff we can prove". Downstream treats every issue as `cumulative`
16
16
  * in that case (operator ran `lint --since HEAD` with no pending work).
17
17
  * @param engineDir Path to the engine git repository.
18
18
  * @param rev Git revision to diff against (e.g. `HEAD`, a branch, a SHA).
@@ -28,10 +28,10 @@ export declare const AGGREGATE_PATCH_FILE = "(patch)";
28
28
  /**
29
29
  * Annotates a list of lint issues with `introduced` / `cumulative` tags
30
30
  * based on whether the issue's file is part of the supplied diff set.
31
- * Mutates each issue in place AND returns the list for chaining.
31
+ * Mutates each issue in place and returns the list for chaining.
32
32
  *
33
- * Issues with no file (`issue.file === ''`) — e.g. cross-patch rules that
34
- * describe queue-wide state — are always `cumulative` under `--since`
33
+ * Issues with no file (`issue.file === ''`), for example cross-patch rules
34
+ * that describe queue-wide state, are always `cumulative` under `--since`
35
35
  * because they describe drift accumulated across many commits, not a single
36
36
  * current-task edit.
37
37
  *
@@ -39,7 +39,7 @@ export declare const AGGREGATE_PATCH_FILE = "(patch)";
39
39
  * synthetic placeholder that can never appear in a real `diffFiles` set.
40
40
  * Without special-casing, `large-patch-files` / `large-patch-lines` are
41
41
  * always tagged `[cumulative]` under `--only-introduced` even when the diff
42
- * IS the aggregate the rules measured, which reads as "this pre-existed" to
42
+ * is the aggregate the rules measured, which reads as "this pre-existed" to
43
43
  * an operator asking "what did this diff introduce?". The aggregate tag is
44
44
  * therefore promoted to `introduced` whenever the diff set has any content:
45
45
  * a non-empty `diffFiles` means the operator asked about a specific diff
@@ -17,7 +17,7 @@ import { getUntrackedFiles } from './git-status.js';
17
17
  /**
18
18
  * Collects engine-relative paths that changed between `rev` and `HEAD`,
19
19
  * plus any workdir modifications and untracked files. An empty set means
20
- * "no diff we can prove" — downstream treats every issue as `cumulative`
20
+ * "no diff we can prove". Downstream treats every issue as `cumulative`
21
21
  * in that case (operator ran `lint --since HEAD` with no pending work).
22
22
  * @param engineDir Path to the engine git repository.
23
23
  * @param rev Git revision to diff against (e.g. `HEAD`, a branch, a SHA).
@@ -68,10 +68,10 @@ export const AGGREGATE_PATCH_FILE = '(patch)';
68
68
  /**
69
69
  * Annotates a list of lint issues with `introduced` / `cumulative` tags
70
70
  * based on whether the issue's file is part of the supplied diff set.
71
- * Mutates each issue in place AND returns the list for chaining.
71
+ * Mutates each issue in place and returns the list for chaining.
72
72
  *
73
- * Issues with no file (`issue.file === ''`) — e.g. cross-patch rules that
74
- * describe queue-wide state — are always `cumulative` under `--since`
73
+ * Issues with no file (`issue.file === ''`), for example cross-patch rules
74
+ * that describe queue-wide state, are always `cumulative` under `--since`
75
75
  * because they describe drift accumulated across many commits, not a single
76
76
  * current-task edit.
77
77
  *
@@ -79,7 +79,7 @@ export const AGGREGATE_PATCH_FILE = '(patch)';
79
79
  * synthetic placeholder that can never appear in a real `diffFiles` set.
80
80
  * Without special-casing, `large-patch-files` / `large-patch-lines` are
81
81
  * always tagged `[cumulative]` under `--only-introduced` even when the diff
82
- * IS the aggregate the rules measured, which reads as "this pre-existed" to
82
+ * is the aggregate the rules measured, which reads as "this pre-existed" to
83
83
  * an operator asking "what did this diff introduce?". The aggregate tag is
84
84
  * therefore promoted to `introduced` whenever the diff set has any content:
85
85
  * a non-empty `diffFiles` means the operator asked about a specific diff
@@ -5,7 +5,7 @@
5
5
  * Factored out of `patch-lint.ts` so the per-patch lint body and
6
6
  * cross-patch lint body (in `patch-lint-cross.ts`) can both depend on
7
7
  * the same diff walkers without inducing a circular import. Callers
8
- * should keep importing these through `patch-lint.ts` — this file is
8
+ * should keep importing these through `patch-lint.ts`. This file is
9
9
  * an implementation detail. The actual line-walking lives in
10
10
  * `parseDiffSections` (patch-parse.ts), the codebase's single diff walker.
11
11
  */
@@ -22,8 +22,8 @@ export declare function extractAddedLinesPerFile(diffContent: string): Map<strin
22
22
  * Extracts 1-based post-patch line numbers of added lines per file from a
23
23
  * unified diff. Walking each hunk with a new-file line counter (`+` and
24
24
  * context lines advance it, `-` lines do not) lets rules that need
25
- * full-file context — e.g. comment masking across the context/added
26
- * boundary — map the patch's additions onto the applied file.
25
+ * full-file context (e.g. comment masking across the context/added
26
+ * boundary) map the patch's additions onto the applied file.
27
27
  */
28
28
  export declare function extractAddedLineNumbersPerFile(diffContent: string): Map<string, number[]>;
29
29
  /**
@@ -34,7 +34,7 @@ export declare function extractAddedLineNumbersPerFile(diffContent: string): Map
34
34
  * `buildPatchQueueContext`.
35
35
  *
36
36
  * Matches buildPatchQueueContext's algorithm exactly: skip paths that are
37
- * created by the diff — those are already covered by the `newFiles` map,
37
+ * created by the diff, since those are already covered by the `newFiles` map,
38
38
  * which carries full content rather than only the added lines.
39
39
  *
40
40
  * @param diff - Unified diff content