@hominis/fireforge 0.45.0 → 0.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/CHANGELOG.md +409 -446
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +21 -15
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +46 -0
  6. package/dist/src/cli-usage-error.js +81 -0
  7. package/dist/src/cli.d.ts +7 -2
  8. package/dist/src/cli.js +47 -47
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +3 -4
  11. package/dist/src/commands/build.js +27 -17
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +19 -0
  14. package/dist/src/commands/destructive-decision.js +31 -0
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -10
  17. package/dist/src/commands/doctor-check-core.js +0 -8
  18. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  20. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  21. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  22. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  23. package/dist/src/commands/doctor-furnace.js +22 -22
  24. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
  25. package/dist/src/commands/doctor-orphaned-harness.js +14 -23
  26. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  27. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  28. package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
  29. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  30. package/dist/src/commands/doctor-source-pin.js +14 -14
  31. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  32. package/dist/src/commands/doctor-working-tree.js +3 -3
  33. package/dist/src/commands/doctor.d.ts +3 -1
  34. package/dist/src/commands/doctor.js +15 -16
  35. package/dist/src/commands/download.js +50 -37
  36. package/dist/src/commands/export-all.js +29 -12
  37. package/dist/src/commands/export-flow.d.ts +5 -5
  38. package/dist/src/commands/export-flow.js +29 -59
  39. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  40. package/dist/src/commands/export-placement-conflicts.js +12 -12
  41. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  42. package/dist/src/commands/export-placement-gate.js +7 -13
  43. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  44. package/dist/src/commands/export-placement-policy.js +4 -6
  45. package/dist/src/commands/export-shared.d.ts +51 -32
  46. package/dist/src/commands/export-shared.js +17 -32
  47. package/dist/src/commands/export.js +14 -5
  48. package/dist/src/commands/furnace/apply.js +16 -16
  49. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  50. package/dist/src/commands/furnace/authoring-config.js +19 -0
  51. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  52. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  54. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  55. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  56. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  57. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  58. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  59. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  60. package/dist/src/commands/furnace/create-browser-test.js +7 -12
  61. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  62. package/dist/src/commands/furnace/create-dry-run.js +6 -9
  63. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  64. package/dist/src/commands/furnace/create-features.js +2 -2
  65. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  66. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  67. package/dist/src/commands/furnace/create-templates.d.ts +31 -15
  68. package/dist/src/commands/furnace/create-templates.js +20 -19
  69. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  70. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  71. package/dist/src/commands/furnace/create.d.ts +1 -1
  72. package/dist/src/commands/furnace/create.js +35 -29
  73. package/dist/src/commands/furnace/deploy.js +15 -6
  74. package/dist/src/commands/furnace/diff.js +7 -7
  75. package/dist/src/commands/furnace/index.js +1 -1
  76. package/dist/src/commands/furnace/init.js +17 -16
  77. package/dist/src/commands/furnace/list.js +2 -2
  78. package/dist/src/commands/furnace/override.d.ts +1 -1
  79. package/dist/src/commands/furnace/override.js +43 -34
  80. package/dist/src/commands/furnace/preview.js +17 -17
  81. package/dist/src/commands/furnace/refresh.js +15 -7
  82. package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
  83. package/dist/src/commands/furnace/remove-mutations.js +19 -19
  84. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  85. package/dist/src/commands/furnace/remove-state.js +1 -1
  86. package/dist/src/commands/furnace/remove.js +4 -8
  87. package/dist/src/commands/furnace/rename-browser-test.js +10 -15
  88. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  89. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  90. package/dist/src/commands/furnace/rename.js +36 -36
  91. package/dist/src/commands/furnace/scan.js +3 -3
  92. package/dist/src/commands/furnace/status.js +19 -16
  93. package/dist/src/commands/furnace/sync.js +6 -6
  94. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  95. package/dist/src/commands/furnace/test-file-name.js +39 -0
  96. package/dist/src/commands/furnace/validate.js +11 -12
  97. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  98. package/dist/src/commands/furnace/validation-output.js +3 -8
  99. package/dist/src/commands/import.js +22 -29
  100. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  101. package/dist/src/commands/lint-per-patch.js +27 -12
  102. package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
  103. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  104. package/dist/src/commands/lint-report.d.ts +3 -3
  105. package/dist/src/commands/lint-report.js +4 -4
  106. package/dist/src/commands/lint.d.ts +5 -4
  107. package/dist/src/commands/lint.js +36 -36
  108. package/dist/src/commands/manifest.d.ts +4 -4
  109. package/dist/src/commands/manifest.js +1 -1
  110. package/dist/src/commands/package.js +4 -6
  111. package/dist/src/commands/patch/compact.d.ts +2 -2
  112. package/dist/src/commands/patch/compact.js +19 -20
  113. package/dist/src/commands/patch/delete.d.ts +1 -1
  114. package/dist/src/commands/patch/delete.js +23 -33
  115. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  116. package/dist/src/commands/patch/entry-projection.js +24 -0
  117. package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
  118. package/dist/src/commands/patch/lint-ignore.js +33 -44
  119. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  120. package/dist/src/commands/patch/move-files-create.js +29 -15
  121. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  122. package/dist/src/commands/patch/move-files-into.js +41 -37
  123. package/dist/src/commands/patch/move-files.js +5 -14
  124. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  125. package/dist/src/commands/patch/rename.d.ts +4 -4
  126. package/dist/src/commands/patch/rename.js +35 -49
  127. package/dist/src/commands/patch/reorder.js +35 -48
  128. package/dist/src/commands/patch/split-plan.d.ts +7 -8
  129. package/dist/src/commands/patch/split-plan.js +10 -13
  130. package/dist/src/commands/patch/split.d.ts +2 -2
  131. package/dist/src/commands/patch/split.js +50 -48
  132. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  133. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  134. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  135. package/dist/src/commands/patch/staged-dependency.js +22 -28
  136. package/dist/src/commands/patch/tier.d.ts +2 -2
  137. package/dist/src/commands/patch/tier.js +20 -30
  138. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  139. package/dist/src/commands/patch-rename-map.js +36 -0
  140. package/dist/src/commands/pending-resolution.d.ts +15 -0
  141. package/dist/src/commands/pending-resolution.js +25 -0
  142. package/dist/src/commands/re-export-adjacent.d.ts +25 -3
  143. package/dist/src/commands/re-export-adjacent.js +40 -24
  144. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  145. package/dist/src/commands/re-export-bulk-scan.js +23 -27
  146. package/dist/src/commands/re-export-drift.d.ts +10 -10
  147. package/dist/src/commands/re-export-drift.js +33 -33
  148. package/dist/src/commands/re-export-files.d.ts +2 -3
  149. package/dist/src/commands/re-export-files.js +52 -44
  150. package/dist/src/commands/re-export-lint.d.ts +29 -30
  151. package/dist/src/commands/re-export-lint.js +36 -29
  152. package/dist/src/commands/re-export-options.d.ts +1 -1
  153. package/dist/src/commands/re-export-options.js +1 -1
  154. package/dist/src/commands/re-export-register.d.ts +1 -1
  155. package/dist/src/commands/re-export-register.js +1 -1
  156. package/dist/src/commands/re-export-scan.d.ts +1 -1
  157. package/dist/src/commands/re-export-scan.js +12 -9
  158. package/dist/src/commands/re-export-single.d.ts +23 -4
  159. package/dist/src/commands/re-export-single.js +39 -31
  160. package/dist/src/commands/re-export.js +35 -17
  161. package/dist/src/commands/rebase/abort.js +9 -14
  162. package/dist/src/commands/rebase/continue.js +20 -19
  163. package/dist/src/commands/rebase/index.d.ts +1 -1
  164. package/dist/src/commands/rebase/index.js +5 -5
  165. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  166. package/dist/src/commands/rebase/patch-loop.js +20 -24
  167. package/dist/src/commands/register.js +5 -5
  168. package/dist/src/commands/reset.js +1 -1
  169. package/dist/src/commands/resolve.d.ts +2 -2
  170. package/dist/src/commands/resolve.js +21 -13
  171. package/dist/src/commands/run.d.ts +0 -13
  172. package/dist/src/commands/run.js +38 -51
  173. package/dist/src/commands/setup-support.d.ts +16 -4
  174. package/dist/src/commands/setup-support.js +20 -20
  175. package/dist/src/commands/setup.js +4 -10
  176. package/dist/src/commands/source.js +9 -2
  177. package/dist/src/commands/status-check.d.ts +3 -3
  178. package/dist/src/commands/status-check.js +6 -6
  179. package/dist/src/commands/status-json.d.ts +14 -13
  180. package/dist/src/commands/status-json.js +9 -8
  181. package/dist/src/commands/status-output.d.ts +3 -3
  182. package/dist/src/commands/status-output.js +5 -5
  183. package/dist/src/commands/status-ownership.d.ts +3 -3
  184. package/dist/src/commands/status-ownership.js +3 -3
  185. package/dist/src/commands/status.js +25 -26
  186. package/dist/src/commands/test-build-phase.d.ts +3 -3
  187. package/dist/src/commands/test-build-phase.js +48 -24
  188. package/dist/src/commands/test-diagnose.d.ts +1 -1
  189. package/dist/src/commands/test-diagnose.js +20 -20
  190. package/dist/src/commands/test-modes.d.ts +4 -4
  191. package/dist/src/commands/test-modes.js +4 -5
  192. package/dist/src/commands/test-register.js +5 -3
  193. package/dist/src/commands/test-run.d.ts +11 -11
  194. package/dist/src/commands/test-run.js +40 -33
  195. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  196. package/dist/src/commands/test-stale-gate.js +17 -17
  197. package/dist/src/commands/test-verdict.d.ts +19 -5
  198. package/dist/src/commands/test-verdict.js +26 -11
  199. package/dist/src/commands/test.d.ts +3 -3
  200. package/dist/src/commands/test.js +73 -36
  201. package/dist/src/commands/token-coverage.js +3 -3
  202. package/dist/src/commands/token-list.d.ts +26 -0
  203. package/dist/src/commands/token-list.js +153 -0
  204. package/dist/src/commands/token.js +26 -10
  205. package/dist/src/commands/tree.js +26 -21
  206. package/dist/src/commands/typecheck.d.ts +6 -6
  207. package/dist/src/commands/typecheck.js +16 -16
  208. package/dist/src/commands/verify.d.ts +3 -3
  209. package/dist/src/commands/verify.js +10 -10
  210. package/dist/src/commands/watch.js +11 -11
  211. package/dist/src/commands/wire.js +17 -16
  212. package/dist/src/core/ast-utils.d.ts +7 -7
  213. package/dist/src/core/ast-utils.js +8 -8
  214. package/dist/src/core/branding.d.ts +5 -12
  215. package/dist/src/core/branding.js +6 -5
  216. package/dist/src/core/browser-wire.d.ts +1 -1
  217. package/dist/src/core/browser-wire.js +10 -7
  218. package/dist/src/core/build-audit-platform.d.ts +32 -3
  219. package/dist/src/core/build-audit-platform.js +153 -13
  220. package/dist/src/core/build-audit-registration.d.ts +5 -5
  221. package/dist/src/core/build-audit-registration.js +10 -9
  222. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  223. package/dist/src/core/build-audit-resolve.js +6 -6
  224. package/dist/src/core/build-audit-skip.d.ts +57 -0
  225. package/dist/src/core/build-audit-skip.js +112 -0
  226. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  227. package/dist/src/core/build-audit-transforms.js +3 -3
  228. package/dist/src/core/build-audit.d.ts +21 -8
  229. package/dist/src/core/build-audit.js +142 -40
  230. package/dist/src/core/build-baseline-types.d.ts +19 -18
  231. package/dist/src/core/build-baseline-types.js +1 -1
  232. package/dist/src/core/build-baseline.d.ts +48 -31
  233. package/dist/src/core/build-baseline.js +20 -43
  234. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  235. package/dist/src/core/build-jar-escalation.js +18 -17
  236. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  237. package/dist/src/core/build-overwrite-guard.js +14 -14
  238. package/dist/src/core/build-prepare.d.ts +4 -12
  239. package/dist/src/core/build-prepare.js +22 -26
  240. package/dist/src/core/config-mutate.js +4 -4
  241. package/dist/src/core/config-paths.d.ts +2 -6
  242. package/dist/src/core/config-paths.js +4 -2
  243. package/dist/src/core/config-state.d.ts +0 -6
  244. package/dist/src/core/config-state.js +3 -21
  245. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  246. package/dist/src/core/config-validate-build-audit.js +80 -0
  247. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  248. package/dist/src/core/config-validate-file-size.js +3 -3
  249. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  250. package/dist/src/core/config-validate-patch-policy.js +3 -3
  251. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  252. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  253. package/dist/src/core/config-validate.js +22 -12
  254. package/dist/src/core/config.d.ts +12 -12
  255. package/dist/src/core/config.js +21 -25
  256. package/dist/src/core/coverage-extend.d.ts +16 -16
  257. package/dist/src/core/coverage-extend.js +20 -20
  258. package/dist/src/core/destructive.d.ts +14 -14
  259. package/dist/src/core/destructive.js +9 -9
  260. package/dist/src/core/diff-hunks.d.ts +2 -2
  261. package/dist/src/core/diff-hunks.js +7 -7
  262. package/dist/src/core/discard-baseline.d.ts +10 -10
  263. package/dist/src/core/discard-baseline.js +22 -23
  264. package/dist/src/core/display-state.d.ts +11 -11
  265. package/dist/src/core/display-state.js +12 -12
  266. package/dist/src/core/engine-changes.d.ts +2 -2
  267. package/dist/src/core/engine-changes.js +2 -2
  268. package/dist/src/core/engine-precondition.d.ts +5 -13
  269. package/dist/src/core/engine-precondition.js +5 -10
  270. package/dist/src/core/engine-session-lock.d.ts +18 -18
  271. package/dist/src/core/engine-session-lock.js +50 -54
  272. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  273. package/dist/src/core/export-moved-code-shape.js +10 -10
  274. package/dist/src/core/file-lock-owner.d.ts +103 -0
  275. package/dist/src/core/file-lock-owner.js +259 -0
  276. package/dist/src/core/file-lock.d.ts +14 -19
  277. package/dist/src/core/file-lock.js +90 -128
  278. package/dist/src/core/firefox-cache.d.ts +13 -1
  279. package/dist/src/core/firefox-cache.js +61 -36
  280. package/dist/src/core/firefox-download.d.ts +15 -0
  281. package/dist/src/core/firefox-download.js +38 -22
  282. package/dist/src/core/firefox-extract.d.ts +8 -7
  283. package/dist/src/core/firefox-extract.js +45 -27
  284. package/dist/src/core/firefox.d.ts +34 -36
  285. package/dist/src/core/firefox.js +13 -44
  286. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  287. package/dist/src/core/furnace-apply-dry-run.js +2 -8
  288. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  289. package/dist/src/core/furnace-apply-ftl.js +8 -8
  290. package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
  291. package/dist/src/core/furnace-apply-helpers.js +28 -39
  292. package/dist/src/core/furnace-apply-output.js +1 -1
  293. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  294. package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
  295. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  296. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  297. package/dist/src/core/furnace-apply.d.ts +4 -4
  298. package/dist/src/core/furnace-apply.js +50 -29
  299. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  300. package/dist/src/core/furnace-checksum-utils.js +5 -5
  301. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  302. package/dist/src/core/furnace-config-custom.js +2 -2
  303. package/dist/src/core/furnace-config-order.js +1 -1
  304. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  305. package/dist/src/core/furnace-config-tokens.js +3 -3
  306. package/dist/src/core/furnace-config-validate.js +2 -2
  307. package/dist/src/core/furnace-config.d.ts +5 -5
  308. package/dist/src/core/furnace-config.js +40 -53
  309. package/dist/src/core/furnace-constants.d.ts +6 -6
  310. package/dist/src/core/furnace-constants.js +9 -8
  311. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  312. package/dist/src/core/furnace-css-fragments.js +11 -11
  313. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  314. package/dist/src/core/furnace-dir-entry.js +21 -0
  315. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  316. package/dist/src/core/furnace-jsconfig.js +22 -20
  317. package/dist/src/core/furnace-operation.d.ts +22 -19
  318. package/dist/src/core/furnace-operation.js +38 -34
  319. package/dist/src/core/furnace-precondition.d.ts +10 -10
  320. package/dist/src/core/furnace-precondition.js +8 -8
  321. package/dist/src/core/furnace-refresh.d.ts +18 -6
  322. package/dist/src/core/furnace-refresh.js +5 -8
  323. package/dist/src/core/furnace-registration-ast.d.ts +2 -3
  324. package/dist/src/core/furnace-registration-ast.js +9 -12
  325. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  326. package/dist/src/core/furnace-registration-remove.js +6 -6
  327. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  328. package/dist/src/core/furnace-registration-validate.js +2 -2
  329. package/dist/src/core/furnace-registration.d.ts +7 -6
  330. package/dist/src/core/furnace-registration.js +29 -36
  331. package/dist/src/core/furnace-rollback.d.ts +1 -1
  332. package/dist/src/core/furnace-rollback.js +5 -5
  333. package/dist/src/core/furnace-scanner.js +3 -6
  334. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  335. package/dist/src/core/furnace-stale-export.js +16 -15
  336. package/dist/src/core/furnace-staleness.d.ts +2 -2
  337. package/dist/src/core/furnace-staleness.js +2 -2
  338. package/dist/src/core/furnace-state-persist.d.ts +12 -12
  339. package/dist/src/core/furnace-state-persist.js +10 -10
  340. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  341. package/dist/src/core/furnace-step-errors.js +6 -6
  342. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  343. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  344. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  345. package/dist/src/core/furnace-validate-registration.js +18 -20
  346. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  347. package/dist/src/core/furnace-validate-structure.js +4 -4
  348. package/dist/src/core/furnace-validate.js +9 -9
  349. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  350. package/dist/src/core/furnace-version-drift.js +5 -5
  351. package/dist/src/core/git-base.d.ts +6 -4
  352. package/dist/src/core/git-base.js +29 -7
  353. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  354. package/dist/src/core/git-diff-new-file.js +119 -0
  355. package/dist/src/core/git-diff.d.ts +13 -13
  356. package/dist/src/core/git-diff.js +121 -189
  357. package/dist/src/core/git-file-ops.d.ts +6 -13
  358. package/dist/src/core/git-file-ops.js +11 -35
  359. package/dist/src/core/git-readonly-index.d.ts +12 -14
  360. package/dist/src/core/git-readonly-index.js +12 -16
  361. package/dist/src/core/git-status.d.ts +9 -2
  362. package/dist/src/core/git-status.js +23 -11
  363. package/dist/src/core/git.d.ts +3 -9
  364. package/dist/src/core/git.js +28 -57
  365. package/dist/src/core/harness-orphans.d.ts +17 -17
  366. package/dist/src/core/harness-orphans.js +28 -27
  367. package/dist/src/core/history-log.d.ts +19 -0
  368. package/dist/src/core/history-log.js +29 -0
  369. package/dist/src/core/license-headers.d.ts +19 -18
  370. package/dist/src/core/license-headers.js +29 -28
  371. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  372. package/dist/src/core/mach-build-artifacts.js +23 -23
  373. package/dist/src/core/mach-error-hints.d.ts +5 -10
  374. package/dist/src/core/mach-error-hints.js +14 -14
  375. package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
  376. package/dist/src/core/mach-known-noise-filter.js +57 -56
  377. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  378. package/dist/src/core/mach-mozconfig.js +17 -16
  379. package/dist/src/core/mach-python.d.ts +3 -0
  380. package/dist/src/core/mach-python.js +13 -7
  381. package/dist/src/core/mach-resource-shim.d.ts +24 -12
  382. package/dist/src/core/mach-resource-shim.js +124 -21
  383. package/dist/src/core/mach.d.ts +59 -73
  384. package/dist/src/core/mach.js +47 -115
  385. package/dist/src/core/marionette-port.d.ts +15 -30
  386. package/dist/src/core/marionette-port.js +46 -89
  387. package/dist/src/core/marionette-preflight.d.ts +6 -6
  388. package/dist/src/core/marionette-preflight.js +32 -50
  389. package/dist/src/core/markdown-table.d.ts +9 -9
  390. package/dist/src/core/markdown-table.js +14 -14
  391. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  392. package/dist/src/core/mochitest-server-port.js +17 -17
  393. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  394. package/dist/src/core/module-resolution-preflight.js +11 -11
  395. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  396. package/dist/src/core/moz-manifest-helpers.js +7 -7
  397. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  398. package/dist/src/core/moz-manifest-register.js +2 -2
  399. package/dist/src/core/moz-manifest-rules.js +46 -42
  400. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  401. package/dist/src/core/ownership-table.d.ts +5 -5
  402. package/dist/src/core/ownership-table.js +7 -7
  403. package/dist/src/core/parser-fallback.d.ts +3 -3
  404. package/dist/src/core/parser-fallback.js +3 -3
  405. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  406. package/dist/src/core/patch-apply-fuzz.js +13 -13
  407. package/dist/src/core/patch-apply.d.ts +13 -14
  408. package/dist/src/core/patch-apply.js +36 -42
  409. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  410. package/dist/src/core/patch-export-coverage.js +1 -30
  411. package/dist/src/core/patch-export-update.d.ts +21 -4
  412. package/dist/src/core/patch-export-update.js +7 -6
  413. package/dist/src/core/patch-export.d.ts +20 -30
  414. package/dist/src/core/patch-export.js +55 -77
  415. package/dist/src/core/patch-files.d.ts +0 -4
  416. package/dist/src/core/patch-files.js +0 -11
  417. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  418. package/dist/src/core/patch-identifier-suggest.js +4 -4
  419. package/dist/src/core/patch-lint-binary.d.ts +12 -18
  420. package/dist/src/core/patch-lint-cache.d.ts +18 -2
  421. package/dist/src/core/patch-lint-cache.js +16 -19
  422. package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
  423. package/dist/src/core/patch-lint-checkjs.js +78 -64
  424. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  425. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  426. package/dist/src/core/patch-lint-creators.d.ts +5 -9
  427. package/dist/src/core/patch-lint-creators.js +3 -3
  428. package/dist/src/core/patch-lint-cross.d.ts +27 -19
  429. package/dist/src/core/patch-lint-cross.js +67 -110
  430. package/dist/src/core/patch-lint-css.d.ts +1 -1
  431. package/dist/src/core/patch-lint-css.js +15 -11
  432. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  433. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  434. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  435. package/dist/src/core/patch-lint-diff.js +4 -4
  436. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  437. package/dist/src/core/patch-lint-file-size.js +6 -6
  438. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  439. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  440. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  441. package/dist/src/core/patch-lint-jsdoc.js +46 -46
  442. package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
  443. package/dist/src/core/patch-lint-module-registration.js +1 -1
  444. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  445. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  446. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  447. package/dist/src/core/patch-lint-observer.js +7 -7
  448. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  449. package/dist/src/core/patch-lint-ownership.js +6 -6
  450. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  451. package/dist/src/core/patch-lint-prettier.js +7 -7
  452. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  453. package/dist/src/core/patch-lint-queue-types.js +12 -0
  454. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  455. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  456. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  457. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  458. package/dist/src/core/patch-lint.d.ts +41 -35
  459. package/dist/src/core/patch-lint.js +52 -49
  460. package/dist/src/core/patch-lock.d.ts +1 -1
  461. package/dist/src/core/patch-lock.js +11 -11
  462. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  463. package/dist/src/core/patch-manifest-consistency.js +16 -17
  464. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  465. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  466. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  467. package/dist/src/core/patch-manifest-io.js +35 -34
  468. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  469. package/dist/src/core/patch-manifest-query.js +4 -4
  470. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  471. package/dist/src/core/patch-manifest-resolve.js +7 -7
  472. package/dist/src/core/patch-manifest-validate.js +3 -3
  473. package/dist/src/core/patch-manifest.d.ts +2 -2
  474. package/dist/src/core/patch-manifest.js +2 -2
  475. package/dist/src/core/patch-parse.d.ts +32 -21
  476. package/dist/src/core/patch-parse.js +40 -15
  477. package/dist/src/core/patch-policy.js +15 -27
  478. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  479. package/dist/src/core/patch-registration-refs.js +7 -7
  480. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  481. package/dist/src/core/patch-source-metadata.js +0 -4
  482. package/dist/src/core/patch-transform.d.ts +8 -16
  483. package/dist/src/core/patch-transform.js +13 -23
  484. package/dist/src/core/process-cpu-time.d.ts +1 -1
  485. package/dist/src/core/process-cpu-time.js +6 -6
  486. package/dist/src/core/rebase-session.d.ts +9 -15
  487. package/dist/src/core/rebase-session.js +13 -25
  488. package/dist/src/core/register-browser-content.js +3 -2
  489. package/dist/src/core/register-browser-test.js +2 -1
  490. package/dist/src/core/register-module.js +2 -1
  491. package/dist/src/core/register-result.d.ts +1 -1
  492. package/dist/src/core/register-result.js +1 -1
  493. package/dist/src/core/register-scaffold.d.ts +2 -2
  494. package/dist/src/core/register-scaffold.js +8 -7
  495. package/dist/src/core/register-shared-css.d.ts +3 -3
  496. package/dist/src/core/register-shared-css.js +6 -5
  497. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  498. package/dist/src/core/register-xpcshell-test.js +2 -2
  499. package/dist/src/core/run-log-redact.d.ts +38 -0
  500. package/dist/src/core/run-log-redact.js +69 -0
  501. package/dist/src/core/run-log.d.ts +21 -10
  502. package/dist/src/core/run-log.js +76 -27
  503. package/dist/src/core/shared-ftl.d.ts +2 -2
  504. package/dist/src/core/shared-ftl.js +6 -6
  505. package/dist/src/core/signal-critical.d.ts +2 -2
  506. package/dist/src/core/signal-critical.js +4 -6
  507. package/dist/src/core/smoke-patterns.d.ts +5 -6
  508. package/dist/src/core/smoke-patterns.js +15 -20
  509. package/dist/src/core/state-file.d.ts +15 -4
  510. package/dist/src/core/state-file.js +14 -1
  511. package/dist/src/core/status-binary.d.ts +8 -8
  512. package/dist/src/core/status-binary.js +12 -12
  513. package/dist/src/core/status-classify.d.ts +17 -17
  514. package/dist/src/core/status-classify.js +13 -12
  515. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  516. package/dist/src/core/test-changed-prefs.js +40 -25
  517. package/dist/src/core/test-harness-crash.d.ts +39 -39
  518. package/dist/src/core/test-harness-crash.js +69 -69
  519. package/dist/src/core/test-harness-output.d.ts +7 -7
  520. package/dist/src/core/test-harness-output.js +7 -7
  521. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  522. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  523. package/dist/src/core/test-path-scope.d.ts +8 -8
  524. package/dist/src/core/test-path-scope.js +11 -11
  525. package/dist/src/core/test-stale-check.d.ts +22 -23
  526. package/dist/src/core/test-stale-check.js +31 -30
  527. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  528. package/dist/src/core/test-stale-symlink.js +1 -1
  529. package/dist/src/core/test-stall-triage.d.ts +9 -9
  530. package/dist/src/core/test-stall-triage.js +22 -22
  531. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  532. package/dist/src/core/test-xpcshell-retry.js +14 -11
  533. package/dist/src/core/token-category.d.ts +35 -2
  534. package/dist/src/core/token-category.js +67 -58
  535. package/dist/src/core/token-coverage.js +4 -5
  536. package/dist/src/core/token-dark-mode.d.ts +9 -9
  537. package/dist/src/core/token-dark-mode.js +13 -25
  538. package/dist/src/core/token-docs.d.ts +1 -1
  539. package/dist/src/core/token-inventory.d.ts +56 -0
  540. package/dist/src/core/token-inventory.js +109 -0
  541. package/dist/src/core/token-manager.d.ts +4 -4
  542. package/dist/src/core/token-manager.js +22 -22
  543. package/dist/src/core/token-scaffold.d.ts +4 -4
  544. package/dist/src/core/token-scaffold.js +4 -4
  545. package/dist/src/core/token-variant.d.ts +14 -14
  546. package/dist/src/core/token-variant.js +52 -53
  547. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  548. package/dist/src/core/toolchain-preflight.js +23 -23
  549. package/dist/src/core/tree-cow.d.ts +3 -5
  550. package/dist/src/core/tree-cow.js +8 -8
  551. package/dist/src/core/tree-guard.d.ts +3 -3
  552. package/dist/src/core/tree-guard.js +23 -23
  553. package/dist/src/core/tree-store.d.ts +15 -15
  554. package/dist/src/core/tree-store.js +39 -38
  555. package/dist/src/core/typecheck-shim.d.ts +16 -15
  556. package/dist/src/core/typecheck-shim.js +26 -25
  557. package/dist/src/core/typecheck.d.ts +12 -12
  558. package/dist/src/core/typecheck.js +33 -33
  559. package/dist/src/core/wire-destroy.d.ts +2 -2
  560. package/dist/src/core/wire-destroy.js +5 -5
  561. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  562. package/dist/src/core/wire-dom-fragment.js +12 -23
  563. package/dist/src/core/wire-init.d.ts +2 -2
  564. package/dist/src/core/wire-init.js +7 -7
  565. package/dist/src/core/wire-subscript.d.ts +1 -1
  566. package/dist/src/core/wire-subscript.js +3 -3
  567. package/dist/src/core/wire-utils.d.ts +9 -9
  568. package/dist/src/core/wire-utils.js +16 -28
  569. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  570. package/dist/src/core/xpcshell-appdir.js +28 -30
  571. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  572. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  573. package/dist/src/errors/base.d.ts +69 -16
  574. package/dist/src/errors/base.js +95 -26
  575. package/dist/src/errors/build.d.ts +6 -6
  576. package/dist/src/errors/build.js +26 -34
  577. package/dist/src/errors/codes.d.ts +10 -10
  578. package/dist/src/errors/codes.js +10 -10
  579. package/dist/src/errors/config.d.ts +0 -14
  580. package/dist/src/errors/config.js +13 -34
  581. package/dist/src/errors/download.d.ts +13 -0
  582. package/dist/src/errors/download.js +53 -24
  583. package/dist/src/errors/furnace.d.ts +2 -2
  584. package/dist/src/errors/furnace.js +8 -9
  585. package/dist/src/errors/git.d.ts +9 -9
  586. package/dist/src/errors/git.js +21 -31
  587. package/dist/src/errors/patch.d.ts +3 -3
  588. package/dist/src/errors/patch.js +11 -13
  589. package/dist/src/errors/rebase.d.ts +1 -1
  590. package/dist/src/errors/rebase.js +8 -8
  591. package/dist/src/errors/run.d.ts +1 -1
  592. package/dist/src/errors/run.js +1 -1
  593. package/dist/src/index.d.ts +4 -4
  594. package/dist/src/index.js +4 -4
  595. package/dist/src/types/commands/options.d.ts +155 -200
  596. package/dist/src/types/commands/patches.d.ts +19 -19
  597. package/dist/src/types/commands/project.d.ts +3 -3
  598. package/dist/src/types/config.d.ts +52 -19
  599. package/dist/src/types/furnace.d.ts +17 -17
  600. package/dist/src/types/index.d.ts +0 -1
  601. package/dist/src/types/json.d.ts +3 -3
  602. package/dist/src/types/json.js +2 -2
  603. package/dist/src/types/typecheck.d.ts +3 -3
  604. package/dist/src/utils/assert.d.ts +4 -16
  605. package/dist/src/utils/assert.js +7 -24
  606. package/dist/src/utils/build-info.d.ts +6 -6
  607. package/dist/src/utils/build-info.js +6 -6
  608. package/dist/src/utils/child-env.d.ts +7 -6
  609. package/dist/src/utils/child-env.js +5 -5
  610. package/dist/src/utils/concurrency.d.ts +2 -2
  611. package/dist/src/utils/concurrency.js +2 -2
  612. package/dist/src/utils/elapsed.js +10 -1
  613. package/dist/src/utils/errors.d.ts +8 -8
  614. package/dist/src/utils/errors.js +8 -8
  615. package/dist/src/utils/fs.d.ts +1 -1
  616. package/dist/src/utils/fs.js +15 -20
  617. package/dist/src/utils/hash.d.ts +12 -0
  618. package/dist/src/utils/hash.js +16 -0
  619. package/dist/src/utils/line-dispatch.d.ts +15 -0
  620. package/dist/src/utils/line-dispatch.js +48 -0
  621. package/dist/src/utils/logger.d.ts +4 -4
  622. package/dist/src/utils/logger.js +11 -11
  623. package/dist/src/utils/machine-output.js +2 -2
  624. package/dist/src/utils/options.d.ts +14 -20
  625. package/dist/src/utils/options.js +26 -27
  626. package/dist/src/utils/package-root.js +5 -14
  627. package/dist/src/utils/paths.d.ts +4 -4
  628. package/dist/src/utils/paths.js +4 -4
  629. package/dist/src/utils/platform.d.ts +0 -4
  630. package/dist/src/utils/process-group.d.ts +10 -9
  631. package/dist/src/utils/process-group.js +37 -36
  632. package/dist/src/utils/process.d.ts +70 -55
  633. package/dist/src/utils/process.js +129 -179
  634. package/dist/src/utils/ps-duration.d.ts +4 -4
  635. package/dist/src/utils/ps-duration.js +9 -9
  636. package/dist/src/utils/regex.d.ts +4 -4
  637. package/dist/src/utils/regex.js +7 -7
  638. package/dist/src/utils/sleep.d.ts +26 -0
  639. package/dist/src/utils/sleep.js +31 -0
  640. package/dist/src/utils/stdio-drain.d.ts +7 -7
  641. package/dist/src/utils/stdio-drain.js +8 -8
  642. package/dist/src/utils/validation.d.ts +12 -49
  643. package/dist/src/utils/validation.js +26 -36
  644. package/docs/README.md +2 -2
  645. package/docs/configuration.md +163 -69
  646. package/docs/exit-codes.md +66 -49
  647. package/docs/furnace.md +20 -19
  648. package/docs/lifecycle-invariants.md +414 -247
  649. package/docs/machine-output.md +58 -34
  650. package/docs/patch-workflow.md +48 -44
  651. package/docs/run-logs.md +72 -28
  652. package/docs/testing.md +105 -98
  653. package/docs/verification-trees.md +23 -22
  654. package/package.json +7 -6
  655. package/dist/src/commands/rebase.d.ts +0 -4
  656. package/dist/src/commands/rebase.js +0 -5
  657. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  658. package/dist/src/core/patch-artifact-normalize.js +0 -24
  659. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  660. package/dist/src/core/patch-lint-reexports.js +0 -8
  661. package/dist/src/core/wire-targets.d.ts +0 -7
  662. package/dist/src/core/wire-targets.js +0 -8
@@ -1,27 +1,27 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
3
  * Recognizes the one shape where the undefined-identifier hint sends the
4
- * operator at the wrong remedy — and where taking that remedy would MASK a
4
+ * operator at the wrong remedy, and where taking that remedy would mask a
5
5
  * real bug.
6
6
  *
7
7
  * The shape: helpers are hoisted out of duplicated test files into a new
8
8
  * `head_settings.js` that a managed `head.js` pulls in with
9
9
  * `loadSubScript`. Until that companion is exported it belongs to no patch,
10
- * so the per-patch checkJs program — which only ever loads patch-owned
11
- * roots — cannot see any of its declarations. Every use of every hoisted
10
+ * so the per-patch checkJs program, which only ever loads patch-owned
11
+ * roots, cannot see any of its declarations. Every use of every hoisted
12
12
  * helper is then reported as `Cannot find name`, and the generic hint
13
13
  * offers three remedies of which the shim is the easiest: adding the
14
- * globals to `extraShim` makes all of the warnings disappear AND makes a
14
+ * globals to `extraShim` makes all of the warnings disappear and makes a
15
15
  * genuinely missing helper undetectable forever after.
16
16
  *
17
- * The warnings themselves are correct — the per-patch program's honest view
18
- * of a file that is in no patch. Only the advice is wrong. FireForge
19
- * already knows ownership, so when every undefined name in a file is
20
- * declared at the top level of an UNMANAGED file that a managed head loads,
21
- * it can name that file and the adoption command instead.
17
+ * The warnings themselves are correct: they are the per-patch program's
18
+ * honest view of a file that is in no patch. Only the advice is wrong.
19
+ * FireForge already knows ownership, so when every undefined name in a file
20
+ * is declared at the top level of an unmanaged file that a managed head
21
+ * loads, it can name that file and the adoption command instead.
22
22
  *
23
- * Detection is deliberately conservative on both halves: a companion must
24
- * be reachable from an actual `loadSubScript` call, and EVERY undefined
23
+ * Detection is conservative on both halves: a companion must
24
+ * be reachable from an actual `loadSubScript` call, and every undefined
25
25
  * name must resolve inside it. One unresolved name means the file may
26
26
  * genuinely be missing a helper, and the generic hint stays.
27
27
  */
@@ -34,13 +34,13 @@ import { UNDEFINED_IDENTIFIER_HINT } from './typecheck-shim.js';
34
34
  * The mochitest idiom is
35
35
  * `Services.scriptloader.loadSubScript(getRootDirectory(gTestPath) + "head_settings.js", this)`,
36
36
  * so the useful signal is the `.js` literal inside the call, not a
37
- * resolvable URL — the path half is computed at runtime.
37
+ * resolvable URL. The path half is computed at runtime.
38
38
  */
39
39
  export function findLoadSubScriptTargets(source) {
40
40
  const targets = [];
41
41
  // Scanned to the statement terminator rather than to a closing paren:
42
42
  // the idiomatic argument is itself a call (`getRootDirectory(gTestPath) +
43
- // "head_settings.js"`), so a non-greedy `\)` stops on the INNER paren and
43
+ // "head_settings.js"`), so a non-greedy `\)` stops on the inner paren and
44
44
  // never reaches the literal.
45
45
  for (const call of source.matchAll(/loadSubScript\s*\(/g)) {
46
46
  const from = call.index + call[0].length;
@@ -60,7 +60,7 @@ const CALL_SCAN_LIMIT = 400;
60
60
  * Top-level declaration names in a script-scope file.
61
61
  *
62
62
  * Regex rather than a TS program on purpose: this runs only to decide the
63
- * WORDING of a hint, the file is by definition outside every program the
63
+ * wording of a hint, the file is outside every program the
64
64
  * pass built, and a missed declaration degrades to the generic hint rather
65
65
  * than to a wrong answer. Matching is anchored at column zero so a nested
66
66
  * declaration inside a function body is not mistaken for a global.
@@ -93,8 +93,8 @@ function extractUndefinedIdentifier(message) {
93
93
  * Resolves the unmanaged companions reachable from a set of managed head
94
94
  * files, given a reader for repo-relative file content.
95
95
  *
96
- * A candidate qualifies only when it is NOT in `ownedFiles` and its content
97
- * can be read — an unreadable or absent target is simply not a companion,
96
+ * A candidate qualifies only when it is not in `ownedFiles` and its content
97
+ * can be read. An unreadable or absent target is simply not a companion,
98
98
  * and the generic hint applies.
99
99
  *
100
100
  * @param heads - Repo-relative managed head files, with their sources
@@ -129,10 +129,10 @@ export async function resolveUnmanagedCompanions(heads, ownedFiles, readFile) {
129
129
  * The replacement hint, when every undefined name resolves in one
130
130
  * unmanaged companion.
131
131
  *
132
- * States the ownership fact first (that is the diagnosis), then the
133
- * adoption command, and explicitly rules the shim OUT — the shim is what an
134
- * operator reaches for by default here, and it is the one remedy that
135
- * permanently hides a genuinely missing helper.
132
+ * States the ownership fact first (the diagnosis), then the adoption
133
+ * command, and explicitly rules the shim out. The shim is what an operator
134
+ * reaches for by default here, and it is the one remedy that permanently
135
+ * hides a genuinely missing helper.
136
136
  */
137
137
  export function formatUnmanagedCompanionHint(companion) {
138
138
  return (`(undefined identifier — every one of them is declared in ${companion.file}, which ` +
@@ -143,7 +143,7 @@ export function formatUnmanagedCompanionHint(companion) {
143
143
  `missing helper with them.)`);
144
144
  }
145
145
  /**
146
- * Picks the companion that explains EVERY undefined identifier in
146
+ * Picks the companion that explains every undefined identifier in
147
147
  * `messages`, or undefined when none does.
148
148
  *
149
149
  * @param messages - Diagnostic messages reported for one file
@@ -155,16 +155,16 @@ export function explainUndefinedIdentifiers(messages, companions) {
155
155
  .filter((name) => name !== undefined);
156
156
  if (names.length === 0)
157
157
  return undefined;
158
- // Only the undefined-identifier diagnostics are explained here; a file
159
- // carrying OTHER type errors still gets those reported untouched.
158
+ // Only the undefined-identifier diagnostics are explained here. A file
159
+ // carrying other type errors still gets those reported untouched.
160
160
  return companions.find((companion) => names.every((name) => companion.declarations.has(name)));
161
161
  }
162
162
  /**
163
- * Reads the head files in the owned test set and resolves the UNMANAGED
163
+ * Reads the head files in the owned test set and resolves the unmanaged
164
164
  * companions they pull in with `loadSubScript`. Hoisting shared helpers
165
165
  * into such a companion leaves it unowned until export, and every use of
166
166
  * every helper then reports `Cannot find name` from an honest per-patch
167
- * program — see `patch-lint-unmanaged-companion.ts` for why the generic
167
+ * program. See `patch-lint-unmanaged-companion.ts` for why the generic
168
168
  * hint is actively harmful there.
169
169
  *
170
170
  * Best-effort: an unreadable head simply contributes no companions.
@@ -195,7 +195,7 @@ export async function collectUnmanagedCompanions(repoDir, files, ownedFiles) {
195
195
  }
196
196
  /**
197
197
  * Swaps the generic undefined-identifier hint for the ownership hint when
198
- * one unmanaged companion explains EVERY undefined name in the file. Any
198
+ * one unmanaged companion explains every undefined name in the file. Any
199
199
  * other issue in the list is returned untouched.
200
200
  */
201
201
  export function retargetUnmanagedCompanionHints(issues, companions) {
@@ -2,11 +2,12 @@ import type { PatchLintIssue } from '../types/commands/index.js';
2
2
  import type { FireForgeConfig, ProjectLicense } from '../types/config.js';
3
3
  import { type CommentStyle } from './license-headers.js';
4
4
  import { lintPatchedCss } from './patch-lint-css.js';
5
- export * from './patch-lint-reexports.js';
5
+ export * from './patch-lint-cross.js';
6
+ export { buildModifiedFileAdditionsFromDiff, detectNewFilesInDiff } from './patch-lint-diff.js';
6
7
  export { lintPatchedCss };
7
8
  /**
8
- * Canonical `[check] file: message` rendering of a patch-lint issue — the
9
- * one string shape every reporter and refusal message uses, so operators
9
+ * Canonical `[check] file: message` rendering of a patch-lint issue. It is
10
+ * the one string shape every reporter and refusal message uses, so operators
10
11
  * can grep one format across lint output and refusal details.
11
12
  */
12
13
  export declare function formatPatchLintIssue(issue: Pick<PatchLintIssue, 'check' | 'file' | 'message'>): string;
@@ -37,27 +38,28 @@ export declare function hasBrowserChromeAssertion(strippedContent: string): bool
37
38
  */
38
39
  export declare function commentStyleForFile(file: string): CommentStyle | null;
39
40
  /**
40
- * Decides whether a NEW file's leading header satisfies the
41
- * `missing-license-header` rule. Single owner of the acceptance policy —
42
- * `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
41
+ * Decides whether a new file's leading header satisfies the
42
+ * `missing-license-header` rule. It is the single owner of the acceptance
43
+ * policy: `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
43
44
  * interactive export fixer) must agree, or the fixer offers to stack a
44
45
  * second header onto a file the lint already accepts.
45
46
  *
46
47
  * Accepted shapes, in order:
47
- * - the project's own header for the file's comment style;
48
- * - under `browser/branding/`, ANY recognised license header in the
48
+ * - the project's own header for the file's comment style.
49
+ * - under `browser/branding/`, any recognised license header in the
49
50
  * matching style: the setup-generated branding directory is copied from
50
51
  * Firefox's `unofficial` template and arrives with Mozilla MPL-2.0
51
- * headers — legitimate for copyright purposes (the assets are Mozilla's)
52
- * even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later;
53
- * - on an MPL-2.0 project, any recognised header in the matching style;
52
+ * headers, legitimate for copyright purposes (the assets are Mozilla's)
53
+ * even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later.
54
+ * - on an MPL-2.0 project, any recognised header in the matching style.
54
55
  * - the verbatim upstream MPL-2.0 block header (`/* … *\/`, optionally
55
- * behind a leading editor-directive comment) REGARDLESS of the project
56
+ * behind a leading editor-directive comment) regardless of the project
56
57
  * license, on any file whose comment syntax is the block form (JS and
57
58
  * CSS): a file copied from the Firefox tree legitimately keeps Mozilla's
58
59
  * header for provenance in an EUPL/GPL/0BSD project too. Only the block
59
- * form is accepted — the `// `-style MPL header is FireForge-generated,
60
- * not upstream provenance — and `hash`-style files (FTL) stay excluded
60
+ * form is accepted, because the `// `-style MPL header is
61
+ * FireForge-generated rather than upstream provenance, and `hash`-style
62
+ * files (FTL) stay excluded
61
63
  * because `/* … *\/` is not a comment there.
62
64
  *
63
65
  * @param file - Engine-relative path of the new file
@@ -87,7 +89,7 @@ export declare function lintNewFileHeaders(repoDir: string, newFiles: string[],
87
89
  * @param patchOwnedFiles - Optional set of patch-owned `.sys.mjs` paths for scoped JSDoc enforcement
88
90
  * @param patchOwnedChromeScripts - Optional set of patch-owned chrome
89
91
  * subscripts (`.js` non-`.sys.mjs`) for scoped chrome-script JSDoc
90
- * enforcement. Built by {@link resolvePatchOwnedChromeScripts}; passed
92
+ * enforcement. Built by {@link resolvePatchOwnedChromeScripts}. Passed
91
93
  * separately from `patchOwnedFiles` so the `runCheckJs` consumer (which
92
94
  * only accepts `.sys.mjs`) is not silently broadened.
93
95
  * @returns Array of lint issues
@@ -120,7 +122,7 @@ export type PatchSizeTierDecision = {
120
122
  * Decides which `large-patch-lines` threshold tier applies to a patch.
121
123
  * Exported so `runPatchLint` and the per-patch `lint` command can
122
124
  * surface the tier choice to the operator *without* depending on
123
- * `lintPatchSize`'s internal return shape — the rule itself stays a
125
+ * `lintPatchSize`'s internal return shape. The rule itself stays a
124
126
  * pure issues-array API, and the decision is computed separately for
125
127
  * the sole purpose of reporting.
126
128
  *
@@ -128,25 +130,29 @@ export type PatchSizeTierDecision = {
128
130
  * The test tier beats branding because a table-driven regression test
129
131
  * is legitimately large independent of whether the patch also claims
130
132
  * branding shape, and the test-tier thresholds are already more
131
- * permissive than branding — so "tests beat branding" is the
133
+ * permissive than branding, so "tests beat branding" is the
132
134
  * defensive-for-tests choice.
133
135
  */
134
136
  export declare function resolvePatchSizeTier(filesAffected: ReadonlyArray<string>, patchTier?: 'branding'): PatchSizeTierDecision;
135
- /**
136
- * Read-only view of the size thresholds a tier enforces.
137
- * Public-API companion to {@link resolvePatchSizeTier} /
138
- * {@link countNonBinaryDiffLines} so consumers can build waiver-freshness
139
- * checks against the SAME numbers `large-patch-lines` /
140
- * `large-patch-files` fire on instead of mirroring them.
141
- */
142
- export declare function getPatchSizeThresholds(tier: 'general' | 'test' | 'branding'): {
137
+ /** Line and file-count thresholds governing one patch-size tier. */
138
+ export interface PatchSizeThresholds {
139
+ /** Added-line counts at which notice/warning/error issues fire. */
143
140
  lines: {
144
141
  notice: number;
145
142
  warning: number;
146
143
  error: number;
147
144
  };
145
+ /** Maximum number of files a patch may touch before an issue fires. */
148
146
  maxFiles: number;
149
- };
147
+ }
148
+ /**
149
+ * Read-only view of the size thresholds a tier enforces.
150
+ * Public-API companion to {@link resolvePatchSizeTier} /
151
+ * {@link countNonBinaryDiffLines} so consumers can build waiver-freshness
152
+ * checks against the same numbers `large-patch-lines` /
153
+ * `large-patch-files` fire on instead of mirroring them.
154
+ */
155
+ export declare function getPatchSizeThresholds(tier: 'general' | 'test' | 'branding'): PatchSizeThresholds;
150
156
  /**
151
157
  * Checks patch size and emits advisory warnings.
152
158
  *
@@ -176,7 +182,7 @@ export declare function lintModifiedFileHeaders(repoDir: string, affectedFiles:
176
182
  export interface LintExportedPatchOptions {
177
183
  /**
178
184
  * Cross-patch context for ownership resolution. Present whenever the
179
- * caller has a loaded patch queue; absent for the ad-hoc single-diff
185
+ * caller has a loaded patch queue. Absent for the ad-hoc single-diff
180
186
  * paths that have no queue to resolve against.
181
187
  */
182
188
  patchQueueCtx?: import('./patch-lint-cross.js').PatchQueueContext;
@@ -192,7 +198,7 @@ export interface LintExportedPatchOptions {
192
198
  * Explicit tier override, threaded from `PatchMetadata.tier`. When
193
199
  * `"branding"` forces the branding thresholds on the
194
200
  * `large-patch-lines` rule. Callers with a per-patch manifest context
195
- * (re-export, per-patch lint) should pass this; aggregate-mode callers
201
+ * (re-export, per-patch lint) should pass this. Aggregate-mode callers
196
202
  * without a specific patch context omit it and fall through to
197
203
  * auto-detection.
198
204
  */
@@ -202,12 +208,12 @@ export interface LintExportedPatchOptions {
202
208
  * The ad-hoc `fireforge lint <files>` path passes a cross-patch file
203
209
  * list that does not correspond to a single patch, so it suppresses the
204
210
  * synthetic combined-list size check here and re-evaluates the size
205
- * rules per owning patch instead — never synthesising a phantom
211
+ * rules per owning patch instead, never synthesising a phantom
206
212
  * oversized patch from the operator's file selection.
207
213
  */
208
214
  skipPatchSize?: boolean;
209
215
  /**
210
- * Restrict checkJs diagnostics to these repo-relative files; module
216
+ * Restrict checkJs diagnostics to these repo-relative files. Module
211
217
  * resolution still spans every owned file in `patchQueueCtx`. Export and
212
218
  * re-export pass the patch under export so cross-patch `resource:///`
213
219
  * imports resolve against the whole queue while only that patch's
@@ -216,15 +222,15 @@ export interface LintExportedPatchOptions {
216
222
  checkJsReportScope?: ReadonlySet<string>;
217
223
  /**
218
224
  * Pre-computed checkJs issues for this patch. When provided, the internal
219
- * checkJs invocation is skipped and these are appended verbatim — the
225
+ * checkJs invocation is skipped and these are appended verbatim: the
220
226
  * per-patch lint path builds one queue-wide checkJs program and
221
227
  * attributes findings per patch instead of rebuilding per patch.
222
228
  */
223
229
  precomputedCheckJs?: readonly PatchLintIssue[];
224
230
  /**
225
- * Invoked with the issues DROPPED by the `ignoreChecks` waiver filter,
226
- * when any were. Suppression semantics are unchanged — the
227
- * returned issue list still excludes them — but the caller can report
231
+ * Invoked with the issues dropped by the `ignoreChecks` waiver filter,
232
+ * when any were. Suppression semantics are unchanged (the returned issue
233
+ * list still excludes them), but the caller can report
228
234
  * the measurement a waived size finding carried (per-patch NOTICE lines
229
235
  * and the `--report` JSON) instead of losing it entirely.
230
236
  */
@@ -237,7 +243,7 @@ export interface LintExportedPatchOptions {
237
243
  * @param affectedFiles - File paths (relative to repoDir) affected by the patch
238
244
  * @param diffContent - Raw unified diff string
239
245
  * @param config - Project configuration
240
- * @param options - Optional context and behaviour switches; see
246
+ * @param options - Optional context and behaviour switches. See
241
247
  * {@link LintExportedPatchOptions}. Every optional input lives here
242
248
  * rather than in a positional tail: four of the five call sites had to
243
249
  * pass `undefined` placeholders to reach the one member they wanted.
@@ -22,11 +22,12 @@ import { invokePatchLintPrettier } from './patch-lint-prettier.js';
22
22
  // The cross-patch lint infrastructure (queue context builder,
23
23
  // duplicate-creation and forward-import rules, ignore marker) lives in
24
24
  // `patch-lint-cross.ts` so the per-patch and cross-patch rule bodies each
25
- // stay within the per-file line budget. The public surface is re-exported
26
- // from `patch-lint-reexports.ts` so callers keep importing from one module.
27
- export * from './patch-lint-reexports.js';
25
+ // stay within the per-file line budget. Its surface is re-exported here so
26
+ // callers keep importing from one module.
27
+ export * from './patch-lint-cross.js';
28
+ export { buildModifiedFileAdditionsFromDiff, detectNewFilesInDiff } from './patch-lint-diff.js';
28
29
  // The CSS rule bodies live in `patch-lint-css.ts` (same per-file-budget
29
- // split as the other rule families); re-export the imported binding so
30
+ // split as the other rule families). Re-export the imported binding so
30
31
  // callers and tests keep importing `lintPatchedCss` from this module.
31
32
  export { lintPatchedCss };
32
33
  // ---------------------------------------------------------------------------
@@ -47,8 +48,8 @@ function countContentLines(content) {
47
48
  return lines.length;
48
49
  }
49
50
  /**
50
- * Canonical `[check] file: message` rendering of a patch-lint issue — the
51
- * one string shape every reporter and refusal message uses, so operators
51
+ * Canonical `[check] file: message` rendering of a patch-lint issue. It is
52
+ * the one string shape every reporter and refusal message uses, so operators
52
53
  * can grep one format across lint output and refusal details.
53
54
  */
54
55
  export function formatPatchLintIssue(issue) {
@@ -94,8 +95,8 @@ const PATCH_LINE_THRESHOLDS = {
94
95
  * `browser/branding/<name>/` subtree.
95
96
  *
96
97
  * Calibrated against a fresh-fork branding export, which lands around
97
- * 15–16k lines (localized brand.ftl across many locales + SVG path data +
98
- * copied upstream CSS). That is the MINIMUM branding diff, so it must
98
+ * 15-16k lines (localized brand.ftl across many locales + SVG path data +
99
+ * copied upstream CSS). That is the minimum branding diff, so it must
99
100
  * surface as a soft `notice` rather than a `warning`: the warning band
100
101
  * sits above it with ~13% headroom, and the error band at roughly 2× the
101
102
  * baseline, where non-branding work is probably bundled in.
@@ -110,7 +111,7 @@ const PATCH_LINE_THRESHOLDS = {
110
111
  /**
111
112
  * File-count thresholds for the `large-patch-files` rule, mirroring the tier
112
113
  * shape of {@link PATCH_LINE_THRESHOLDS}. A single warning-only threshold
113
- * per tier is intentional — file count expresses scope, not blast radius,
114
+ * per tier is intentional: file count expresses scope, not blast radius,
114
115
  * and there is no error band that would block export.
115
116
  *
116
117
  * The branding tier sits well above the typical floor because branding
@@ -121,7 +122,7 @@ const PATCH_LINE_THRESHOLDS = {
121
122
  * genuinely bloated patch.
122
123
  *
123
124
  * Test tier matches general because a test-only patch rarely touches many
124
- * files (a single regression test usually adds 1–3 fixtures); the elevation
125
+ * files (a single regression test usually adds 1-3 fixtures). The elevation
125
126
  * in {@link PATCH_LINE_THRESHOLDS.test} addresses big table-driven test
126
127
  * bodies, not file fan-out.
127
128
  */
@@ -144,10 +145,10 @@ const SPLIT_HINT = 'Consider splitting into smaller, focused patches — ' +
144
145
  * branding patches legitimately need to touch to register the new branding
145
146
  * flavor with the top-level configure. A predicate requiring every file to
146
147
  * live under `browser/branding/` drops a branding patch that also touches
147
- * `browser/moz.configure` — the canonical registration point — into the
148
+ * `browser/moz.configure` (the canonical registration point) into the
148
149
  * general lint tier.
149
150
  *
150
- * Intentionally narrow: add entries only when a genuine branding patch
151
+ * Narrow on purpose: add entries only when a genuine branding patch
151
152
  * cannot be expressed without a specific registration sibling. Pinned
152
153
  * against ESR 140.x conventions at time of writing.
153
154
  */
@@ -158,7 +159,7 @@ const BRANDING_REGISTRATION_FILES = new Set([
158
159
  /**
159
160
  * Returns true when a patch qualifies for the branding threshold tier:
160
161
  * every file lives either under `browser/branding/` or in the narrow
161
- * registration allowlist, AND the patch contains at least one file
162
+ * registration allowlist, and the patch contains at least one file
162
163
  * under `browser/branding/` (guard against a config-only patch
163
164
  * accidentally qualifying as branding).
164
165
  *
@@ -200,7 +201,7 @@ export function isTestFile(file) {
200
201
  return /^(?:browser_|test_|xpcshell_).*\.js$/.test(basename);
201
202
  }
202
203
  /**
203
- * Narrower scope than `isTestFile` — only browser-chrome test files
204
+ * Narrower scope than `isTestFile`: only browser-chrome test files
204
205
  * (`browser_*.js` under a `/test/` or `/tests/` directory). Excludes
205
206
  * `head.js` and `head_*.js` test helpers.
206
207
  */
@@ -220,28 +221,29 @@ function isBrowserChromeTestFile(file) {
220
221
  * Each alternative must sit at a call boundary: preceded by something that
221
222
  * is not an identifier character, `.`, `#`, or `-`. A plain
222
223
  * `strippedContent.includes(tok)` over `Assert.`, `ok(`, `is(`, `isnot(`,
223
- * `isDeeply(` lets any identifier merely *ending* in one satisfy the gate —
224
- * `this.axis(3)` contains `is(`, `book(` contains `ok(`,
225
- * `promiseIsDeeply(` contains `isDeeply(` — so an assertion-free smoke test
224
+ * `isDeeply(` lets any identifier merely *ending* in one satisfy the gate:
225
+ * `this.axis(3)` contains `is(`, `book(` contains `ok(`, and
226
+ * `promiseIsDeeply(` contains `isDeeply(`, so an assertion-free smoke test
226
227
  * using any such call clears the floor.
227
228
  *
228
- * The namespaced arm must name a member AND a call. Matching the namespace
229
+ * The namespaced arm must name a member and a call. Matching the namespace
229
230
  * and its dot alone re-opens the same hole from the other side:
230
231
  * `SimpleTest` is mostly *harness* API, so `SimpleTest.finish()`,
231
232
  * `SimpleTest.waitForExplicitFinish()` and `SimpleTest.requestCompleteLog()`
232
- * would each clear the floor on their own — the exact calls an
233
+ * would each clear the floor on their own, which are the exact calls an
233
234
  * assertion-free smoke test contains. The enumeration below is the
234
235
  * mochitest/xpcshell assertion surface both namespaces share, and it is what
235
236
  * the user-facing message names.
236
237
  *
237
238
  * Two qualified spellings of the bare four also count: `window.ok(...)` (the
238
- * globals ARE window properties) and an optional-chained `win?.ok(...)`;
239
- * blocking those flags tests whose only assertions are real as
240
- * assertion-free. `SpecialPowers.ok(` stays excluded — that is API surface,
239
+ * globals are window properties) and an optional-chained `win?.ok(...)`.
240
+ * Blocking those flags tests whose only assertions are real as
241
+ * assertion-free. `SpecialPowers.ok(` stays excluded: that is API surface,
241
242
  * not an assertion.
242
243
  *
243
- * Deliberately textual, not AST-based: this runs over patch bodies rather
244
- * than resolvable sources, and the surrounding rule is a floor, not a proof.
244
+ * Textual rather than AST-based, on purpose: this runs over patch bodies
245
+ * rather than resolvable sources, and the surrounding rule is a floor, not
246
+ * a proof.
245
247
  */
246
248
  const ASSERTION_MEMBERS = [
247
249
  'ok',
@@ -262,7 +264,7 @@ const ASSERTION_MEMBERS = [
262
264
  'stringContains',
263
265
  'throws',
264
266
  'rejects',
265
- // `todo`, `todo_is`, `todo_isnot`, `info`-free — todo* record an expected
267
+ // `todo`, `todo_is`, `todo_isnot`, `info`-free: todo* record an expected
266
268
  // failure, which is still a recorded assertion outcome.
267
269
  'todo',
268
270
  'todo_is',
@@ -289,27 +291,28 @@ export function commentStyleForFile(file) {
289
291
  // License header lint
290
292
  // ---------------------------------------------------------------------------
291
293
  /**
292
- * Decides whether a NEW file's leading header satisfies the
293
- * `missing-license-header` rule. Single owner of the acceptance policy —
294
- * `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
294
+ * Decides whether a new file's leading header satisfies the
295
+ * `missing-license-header` rule. It is the single owner of the acceptance
296
+ * policy: `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
295
297
  * interactive export fixer) must agree, or the fixer offers to stack a
296
298
  * second header onto a file the lint already accepts.
297
299
  *
298
300
  * Accepted shapes, in order:
299
- * - the project's own header for the file's comment style;
300
- * - under `browser/branding/`, ANY recognised license header in the
301
+ * - the project's own header for the file's comment style.
302
+ * - under `browser/branding/`, any recognised license header in the
301
303
  * matching style: the setup-generated branding directory is copied from
302
304
  * Firefox's `unofficial` template and arrives with Mozilla MPL-2.0
303
- * headers — legitimate for copyright purposes (the assets are Mozilla's)
304
- * even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later;
305
- * - on an MPL-2.0 project, any recognised header in the matching style;
305
+ * headers, legitimate for copyright purposes (the assets are Mozilla's)
306
+ * even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later.
307
+ * - on an MPL-2.0 project, any recognised header in the matching style.
306
308
  * - the verbatim upstream MPL-2.0 block header (`/* … *\/`, optionally
307
- * behind a leading editor-directive comment) REGARDLESS of the project
309
+ * behind a leading editor-directive comment) regardless of the project
308
310
  * license, on any file whose comment syntax is the block form (JS and
309
311
  * CSS): a file copied from the Firefox tree legitimately keeps Mozilla's
310
312
  * header for provenance in an EUPL/GPL/0BSD project too. Only the block
311
- * form is accepted — the `// `-style MPL header is FireForge-generated,
312
- * not upstream provenance — and `hash`-style files (FTL) stay excluded
313
+ * form is accepted, because the `// `-style MPL header is
314
+ * FireForge-generated rather than upstream provenance, and `hash`-style
315
+ * files (FTL) stay excluded
313
316
  * because `/* … *\/` is not a comment there.
314
317
  *
315
318
  * @param file - Engine-relative path of the new file
@@ -373,7 +376,7 @@ export async function lintNewFileHeaders(repoDir, newFiles, config) {
373
376
  * @param patchOwnedFiles - Optional set of patch-owned `.sys.mjs` paths for scoped JSDoc enforcement
374
377
  * @param patchOwnedChromeScripts - Optional set of patch-owned chrome
375
378
  * subscripts (`.js` non-`.sys.mjs`) for scoped chrome-script JSDoc
376
- * enforcement. Built by {@link resolvePatchOwnedChromeScripts}; passed
379
+ * enforcement. Built by {@link resolvePatchOwnedChromeScripts}. Passed
377
380
  * separately from `patchOwnedFiles` so the `runCheckJs` consumer (which
378
381
  * only accepts `.sys.mjs`) is not silently broadened.
379
382
  * @returns Array of lint issues
@@ -447,7 +450,7 @@ export async function lintPatchedJs(repoDir, affectedFiles, newFiles, config, pa
447
450
  const chromeMode = config.patchLint?.chromeScriptJsDoc;
448
451
  issues.push(...lintChromeScriptJsDocForFile(file, content, isChromeOwned, chromeMode));
449
452
  // 3b. Assertion floor for browser-chrome tests touched by this patch
450
- // (covers both newly introduced files and modified upstream tests —
453
+ // (covers both newly introduced files and modified upstream tests:
451
454
  // a patch that strips the last `Assert.equal` from an existing
452
455
  // browser_*.js silently passed under the old `isNew` gate).
453
456
  const assertionFloor = config.patchLint?.testAssertionFloor;
@@ -505,7 +508,7 @@ export function lintModificationComments(diffContent, config) {
505
508
  * Decides which `large-patch-lines` threshold tier applies to a patch.
506
509
  * Exported so `runPatchLint` and the per-patch `lint` command can
507
510
  * surface the tier choice to the operator *without* depending on
508
- * `lintPatchSize`'s internal return shape — the rule itself stays a
511
+ * `lintPatchSize`'s internal return shape. The rule itself stays a
509
512
  * pure issues-array API, and the decision is computed separately for
510
513
  * the sole purpose of reporting.
511
514
  *
@@ -513,7 +516,7 @@ export function lintModificationComments(diffContent, config) {
513
516
  * The test tier beats branding because a table-driven regression test
514
517
  * is legitimately large independent of whether the patch also claims
515
518
  * branding shape, and the test-tier thresholds are already more
516
- * permissive than branding — so "tests beat branding" is the
519
+ * permissive than branding, so "tests beat branding" is the
517
520
  * defensive-for-tests choice.
518
521
  */
519
522
  export function resolvePatchSizeTier(filesAffected, patchTier) {
@@ -530,7 +533,7 @@ export function resolvePatchSizeTier(filesAffected, patchTier) {
530
533
  * Read-only view of the size thresholds a tier enforces.
531
534
  * Public-API companion to {@link resolvePatchSizeTier} /
532
535
  * {@link countNonBinaryDiffLines} so consumers can build waiver-freshness
533
- * checks against the SAME numbers `large-patch-lines` /
536
+ * checks against the same numbers `large-patch-lines` /
534
537
  * `large-patch-files` fire on instead of mirroring them.
535
538
  */
536
539
  export function getPatchSizeThresholds(tier) {
@@ -557,7 +560,7 @@ export function lintPatchSize(filesAffected, lineCount, patchTier) {
557
560
  // thresholds because a big regression test is legitimate (table-driven
558
561
  // harnesses run into the thousands of lines). Branding patches get their
559
562
  // own tier so a first export of setup-generated branding does not fire the
560
- // general hard limit — see `PATCH_LINE_THRESHOLDS.branding` and
563
+ // general hard limit. See `PATCH_LINE_THRESHOLDS.branding` and
561
564
  // `PATCH_FILES_THRESHOLDS.branding` above. An explicit `patchTier` opt-in
562
565
  // forces branding even when `isBrandingOnlyPatch` cannot reach the patch's
563
566
  // actual shape (a branding patch that also touches a non-allowlisted
@@ -653,7 +656,7 @@ export async function lintModifiedFileHeaders(repoDir, affectedFiles, newFiles)
653
656
  * @param affectedFiles - File paths (relative to repoDir) affected by the patch
654
657
  * @param diffContent - Raw unified diff string
655
658
  * @param config - Project configuration
656
- * @param options - Optional context and behaviour switches; see
659
+ * @param options - Optional context and behaviour switches. See
657
660
  * {@link LintExportedPatchOptions}. Every optional input lives here
658
661
  * rather than in a positional tail: four of the five call sites had to
659
662
  * pass `undefined` placeholders to reach the one member they wanted.
@@ -687,7 +690,7 @@ export async function lintExportedPatch(repoDir, affectedFiles, diffContent, con
687
690
  ];
688
691
  if (options?.precomputedCheckJs) {
689
692
  // Per-patch lint built one queue-wide program and already attributed
690
- // this patch's findings — append them instead of rebuilding the program.
693
+ // this patch's findings, so append them instead of rebuilding the program.
691
694
  issues.push(...options.precomputedCheckJs);
692
695
  }
693
696
  else if (config.patchLint?.checkJs) {
@@ -704,10 +707,10 @@ export async function lintExportedPatch(repoDir, affectedFiles, diffContent, con
704
707
  }
705
708
  }
706
709
  }
707
- // Prettier over patch-owned .sys.mjs. Deliberately NOT part of the
708
- // precomputedCheckJs short-circuit: it is a separate tool with its own
709
- // gate, and a queue-wide program has no equivalent to share. Scoped to
710
- // the files THIS patch owns, run from engine/ so the engine's own config
710
+ // Prettier over patch-owned .sys.mjs. Kept out of the
711
+ // precomputedCheckJs short-circuit on purpose: it is a separate tool with
712
+ // its own gate, and a queue-wide program has no equivalent to share.
713
+ // Scoped to the files this patch owns, run from engine/ so its own config
711
714
  // and ignore file decide (see `patch-lint-prettier.ts`).
712
715
  const prettierGate = config.patchLint?.prettier ?? 'off';
713
716
  if (prettierGate !== 'off' && patchOwnedFiles.size > 0) {
@@ -716,7 +719,7 @@ export async function lintExportedPatch(repoDir, affectedFiles, diffContent, con
716
719
  }
717
720
  // Filter out ignored checks last so every rule still runs (keeps the
718
721
  // implementation uniform) but suppressed rules do not surface. We do not
719
- // reclassify severities — an ignored error simply drops, mirroring how
722
+ // reclassify severities: an ignored error simply drops, mirroring how
720
723
  // inline `fireforge-ignore: <check>` markers work in the CSS and
721
724
  // forward-import rules.
722
725
  if (ignoreChecks && ignoreChecks.size > 0) {
@@ -23,7 +23,7 @@ export interface PatchDirectoryLockOptions {
23
23
  * is held, so an unlocked caller silently reintroduces the interleaving the
24
24
  * lock exists to prevent.
25
25
  *
26
- * Fail-open on an unreadable owner record, deliberately: `withFileLock`
26
+ * Fail-open on an unreadable owner record, on purpose: `withFileLock`
27
27
  * treats writing that record as non-fatal, so a live holder can legitimately
28
28
  * have no readable PID and asserting on its presence would fire on a lock we
29
29
  * really do hold.