@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
@@ -20,9 +20,9 @@ import { pickDefined } from '../utils/options.js';
20
20
  /**
21
21
  * Errno codes for filesystem-level failures against the working file.
22
22
  * These are safe to fall through as "unmanaged" because they describe the
23
- * *state of the engine directory*, not the integrity of the patch stack.
24
- * Manifest / patch-parse / PatchError failures do NOT match this set and
25
- * are re-thrown so the root cause surfaces instead of being silently
23
+ * state of the engine directory rather than the integrity of the patch
24
+ * stack. Manifest / patch-parse / PatchError failures do not match this set
25
+ * and are re-thrown so the root cause surfaces instead of being silently
26
26
  * reclassified as a spurious dirty file.
27
27
  */
28
28
  const SAFE_IO_FALLBACK_CODES = new Set(['ENOENT', 'EACCES', 'EPERM', 'EISDIR', 'EBUSY']);
@@ -48,7 +48,7 @@ async function getUnmanagedDirtyFiles(engineDir, patchesDir, dirtyFiles) {
48
48
  }
49
49
  catch (error) {
50
50
  // PatchError, manifest corruption, and patch-parse failures are
51
- // *structural* problems with the patch stack — masking them as
51
+ // structural problems with the patch stack. Masking them as an
52
52
  // "unmanaged dirty file" would let the user `--force` past a real
53
53
  // root cause (e.g. "patch 003 missing from manifest") and compound
54
54
  // the corruption. Only swallow the pure-IO fallback cases where
@@ -91,7 +91,7 @@ async function checkUncommittedPatchFiles(engineDir, patchesDir, forceImport) {
91
91
  // already carries the patch's effects. The import below still
92
92
  // re-applies each patch (a no-op for files whose contents already
93
93
  // match), so phrase the line as "no resync needed" rather than
94
- // "patches already applied" — the latter contradicts the "Applied N
94
+ // "patches already applied". The latter contradicts the "Applied N
95
95
  // patch(es)" summary `applyPatchesWithContinue` prints next.
96
96
  info('Patch-touched files already match the stored patch stack — no engine resync needed before re-applying.');
97
97
  }
@@ -160,7 +160,7 @@ async function checkEngineDrift(engineDir, baseCommit, forceImport, acceptPrompt
160
160
  const currentHead = await getHead(engineDir);
161
161
  if (currentHead === baseCommit)
162
162
  return true;
163
- // `--yes` and `--force` both answer this prompt; only `--force` also
163
+ // `--yes` and `--force` both answer this prompt. Only `--force` also
164
164
  // waives the patch-integrity gate further down.
165
165
  const promptAnswered = forceImport || acceptPrompts;
166
166
  if (!stdioIsInteractive()) {
@@ -193,7 +193,7 @@ async function checkEngineDrift(engineDir, baseCommit, forceImport, acceptPrompt
193
193
  * without the `.patch` suffix (matching `applyPatchesWithContinue`'s
194
194
  * `untilFilename` resolver).
195
195
  *
196
- * Returns an empty set when no match is found — the caller treats that as
196
+ * Returns an empty set when no match is found. The caller treats that as
197
197
  * "no scope filter applies" so the import behaves identically to an
198
198
  * unrecognised `--until` target (which `applyPatchesWithContinue` will
199
199
  * later surface as a normal error).
@@ -202,11 +202,11 @@ function buildUntilFilenameSet(patches, until) {
202
202
  const set = new Set();
203
203
  if (until === undefined)
204
204
  return set;
205
- // Resolve the identifier with the SAME matcher the apply loop uses
206
- // (`matchesUntilFilename` accepts filenames, extension-less names, AND
205
+ // Resolve the identifier with the same matcher the apply loop uses
206
+ // (`matchesUntilFilename` accepts filenames, extension-less names, and
207
207
  // bare ordinals). A filename-only match makes `import --until 5` produce
208
- // an EMPTY scope set — the UI previews "0 patches", the integrity gates
209
- // filter every in-range issue away — and the apply loop then applies
208
+ // an empty scope set: the UI previews "0 patches", the integrity gates
209
+ // filter every in-range issue away, and the apply loop then applies
210
210
  // patches 1..5 anyway.
211
211
  const target = patches.find((p) => matchesUntilFilename(p.filename, until));
212
212
  if (!target)
@@ -228,8 +228,8 @@ async function assertScopedManifestConsistency(patchesDir, untilFilenameSet, unt
228
228
  const manifestConsistencyIssues = await validatePatchesManifestConsistency(patchesDir);
229
229
  const scopedManifestIssues = until !== undefined
230
230
  ? manifestConsistencyIssues.filter((issue) =>
231
- // Global (manifest-level) issues have no specific filename to scope
232
- // against — a missing or unparseable patches.json blocks any
231
+ // Global (manifest-level) issues have no specific filename to
232
+ // scope against: a missing or unparseable patches.json blocks any
233
233
  // import. Per-patch issues only block when the patch is in scope.
234
234
  issue.code === 'manifest-missing' ||
235
235
  issue.code === 'manifest-invalid' ||
@@ -249,7 +249,7 @@ async function assertScopedManifestConsistency(patchesDir, untilFilenameSet, unt
249
249
  /**
250
250
  * Prints advisory version-compatibility warnings for every in-scope patch
251
251
  * whose recorded source version differs meaningfully from the configured
252
- * Firefox version. Advisory only — never blocks the import.
252
+ * Firefox version. Advisory only. Never blocks the import.
253
253
  */
254
254
  async function warnVersionCompatibility(projectRoot, manifest, untilFilenameSet, until) {
255
255
  if (!manifest)
@@ -269,7 +269,7 @@ async function warnVersionCompatibility(projectRoot, manifest, untilFilenameSet,
269
269
  }
270
270
  /**
271
271
  * Patch-integrity gate: surfaces orphaned-modification issues scoped to
272
- * the `--until` range and decides whether the import may proceed —
272
+ * the `--until` range and decides whether the import may proceed.
273
273
  * `--force` continues with a warning, non-TTY refuses loudly, and an
274
274
  * interactive operator is prompted. Returns false when the import should
275
275
  * stop (the cancel outro has been printed).
@@ -413,8 +413,8 @@ export async function importCommand(projectRoot, options = {}) {
413
413
  success(` ${result.patch.filename}${suffix}`);
414
414
  }
415
415
  // The re-applied queue may have moved components.conf away from what
416
- // the last full build compiled in — surface that now instead of at the
417
- // next test refusal.
416
+ // the last full build compiled in, so surface that now instead of at
417
+ // the next test refusal.
418
418
  await warnIfStaticComponentsStale(projectRoot, paths.engine);
419
419
  outro('All patches applied successfully!');
420
420
  }
@@ -432,21 +432,14 @@ export function registerImport(program, { getProjectRoot, withErrorHandling }) {
432
432
  .description('Apply patches from the patches directory')
433
433
  .option('--continue', 'Continue applying patches even if one fails')
434
434
  .option('-f, --force', 'Proceed despite engine drift and overwrite unmanaged changes in patch-touched files')
435
- // NOT an alias of --force. `--force` waives two orthogonal things: the
436
- // drift prompt AND the patch-integrity gate. `--yes` waives only the
435
+ // Not an alias of --force. `--force` waives two orthogonal things: the
436
+ // drift prompt and the patch-integrity gate. `--yes` waives only the
437
437
  // prompt, so a scripted import can run unattended while the integrity
438
- // refusal stays armed — which is the guard you actually want in CI.
438
+ // refusal stays armed, which is the guard you want in CI.
439
439
  .option('-y, --yes', 'Answer the drift prompt non-interactively. Unlike --force, this does NOT waive the patch-integrity gate.')
440
- .option('--until <patch>', 'Apply patches only up to and including this patch (alias: --stop-at)')
441
- .option('--stop-at <patch>', 'Alias for --until')
440
+ .option('--until <patch>', 'Apply patches only up to and including this patch')
442
441
  .option('--dry-run', 'Preview which patches would be applied without modifying the engine')
443
442
  .action(withErrorHandling(async (options) => {
444
- // Accept both spellings; --until wins when both are passed.
445
- const merged = { ...options };
446
- if (merged.until === undefined && merged.stopAt !== undefined) {
447
- merged.until = merged.stopAt;
448
- }
449
- delete merged.stopAt;
450
- await importCommand(getProjectRoot(), pickDefined(merged));
443
+ await importCommand(getProjectRoot(), pickDefined(options));
451
444
  }));
452
445
  }
@@ -1,5 +1,5 @@
1
- import { getProjectPaths } from '../core/config.js';
2
1
  import type { LintCommandOptions } from '../types/commands/index.js';
2
+ import type { ProjectPaths } from '../types/config.js';
3
3
  /**
4
4
  * Lints each patch in the queue as its own isolated diff, honouring
5
5
  * per-patch `lintIgnore` entries. Cross-patch rules still run once over
@@ -7,4 +7,4 @@ import type { LintCommandOptions } from '../types/commands/index.js';
7
7
  * With `options.patches` set, only the named subset is linted (and the
8
8
  * queue-level findings are scoped to files those patches touch).
9
9
  */
10
- export declare function lintPerPatch(projectRoot: string, paths: ReturnType<typeof getProjectPaths>, options?: LintCommandOptions): Promise<void>;
10
+ export declare function lintPerPatch(projectRoot: string, paths: ProjectPaths, options?: LintCommandOptions): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  import { join } from 'node:path';
3
- import { getProjectPaths, loadConfig } from '../core/config.js';
3
+ import { loadConfig } from '../core/config.js';
4
4
  import { getDiffForFilesAgainstHead } from '../core/git-diff.js';
5
5
  import { withPrivateGitIndex } from '../core/git-readonly-index.js';
6
6
  import { buildPatchQueueContext, countNonBinaryDiffLines, formatPatchLintIssue, lintExportedPatch, lintPatchQueue, resolvePatchSizeTier, } from '../core/patch-lint.js';
@@ -28,7 +28,7 @@ function emitTierNotice(filename, files, tier) {
28
28
  /**
29
29
  * Lints one queued patch against its own isolated diff, reusing the cache entry
30
30
  * when the cache key matches. Returns the outcome and the patch's (unprefixed)
31
- * issues without touching shared state — the orchestrator applies the tier
31
+ * issues without touching shared state. The orchestrator applies the tier
32
32
  * notice, issue prefixing, and cache write in patch order after the pool
33
33
  * drains, so the bounded concurrency cannot reorder output. Returns `skipped`
34
34
  * (no files present / empty diff), `cached`, or `linted`.
@@ -135,8 +135,8 @@ const SUPPRESSED_SIZE_CHECKS = new Set([
135
135
  * Applies the per-patch results in patch order so the bounded concurrency
136
136
  * cannot reorder output: emits each tier notice, the once-only run-level
137
137
  * checkJs errors (before the first freshly linted patch's issues), the
138
- * filename-prefixed issue rows, and the cache writes — all in the same sequence
139
- * a serial run produced. Returns the run tallies.
138
+ * filename-prefixed issue rows, and the cache writes, all in the same
139
+ * sequence a serial run produced. Returns the run tallies.
140
140
  */
141
141
  async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
142
142
  const totals = {
@@ -158,8 +158,8 @@ async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
158
158
  }
159
159
  emitTierNotice(patch.filename, result.existingFiles, patch.tier);
160
160
  // Run-level checkJs errors are emitted once, before the first
161
- // non-skipped patch's own issues — matching the serial emit point.
162
- // Deliberately NOT gated on `result.usedCheckJs`: global findings are
161
+ // non-skipped patch's own issues, matching the serial emit point.
162
+ // Not gated on `result.usedCheckJs`: global findings are
163
163
  // run-level and never cached, so gating drops them entirely on an
164
164
  // all-cache-hit run and lets a warm run report fewer errors than a cold
165
165
  // one. PerRunCheckJs builds its program lazily, so the cost only
@@ -169,13 +169,21 @@ async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
169
169
  issues.push(...(await checkJs.getGlobal()));
170
170
  }
171
171
  if (result.cacheWrite && cache) {
172
- setCachedPerPatchLintIssues(cache, patch.filename, result.cacheWrite.key, result.rawIssues, result.suppressedIssues, result.lineCount, result.cacheWrite.lintIgnore);
172
+ setCachedPerPatchLintIssues({
173
+ cache,
174
+ patchFilename: patch.filename,
175
+ key: result.cacheWrite.key,
176
+ issues: result.rawIssues,
177
+ suppressed: result.suppressedIssues,
178
+ lineCount: result.lineCount,
179
+ lintIgnore: result.cacheWrite.lintIgnore,
180
+ });
173
181
  totals.cacheDirty = true;
174
182
  }
175
183
  for (const issue of result.rawIssues) {
176
184
  issues.push({ ...issue, file: `${patch.filename} :: ${issue.file}` });
177
185
  }
178
- // A waived size finding still reports its MEASUREMENT: the finding stays
186
+ // A waived size finding still reports its measurement: the finding stays
179
187
  // suppressed (no exit-code / --max-warnings effect) but the current count
180
188
  // is readable from the tool that enforces it, so a waiver's cited size
181
189
  // can be calibrated without hand-measuring.
@@ -267,7 +275,7 @@ function reportPerPatchOutcome(issues, linted, skipped, options) {
267
275
  /**
268
276
  * Resolves the `--patches <name…>` subset filter against the manifest,
269
277
  * matching each requested name tolerantly (exact filename, filename ±
270
- * `.patch`, or the manifest `name` field). Throws listing the available
278
+ * `.patch`, the bare order number, or the manifest `name` field). Throws listing the available
271
279
  * patches when a requested name matches none, so a typo fails loud rather
272
280
  * than silently linting nothing.
273
281
  */
@@ -278,7 +286,14 @@ function selectPatchSubset(manifest, requested) {
278
286
  .filter((entry) => entry.length > 0);
279
287
  const patchAliases = (p) => {
280
288
  const aliases = new Set([p.filename, p.filename.replace(/\.patch$/, ''), p.name]);
289
+ // The bare order number, both as the manifest records it and as the
290
+ // filename spells it (`2` and `002`). The refusal message offers stems,
291
+ // and an operator reading `102-ui-canvas-tiles.patch` in a lint finding
292
+ // reaches for `102` first.
293
+ aliases.add(String(p.order));
281
294
  const match = /^(\d+)-([a-z]+)-(.+)\.patch$/.exec(p.filename);
295
+ if (match?.[1])
296
+ aliases.add(match[1]);
282
297
  if (match?.[2] && match[3]) {
283
298
  aliases.add(`${match[2]}-${match[3]}`);
284
299
  aliases.add(match[3]);
@@ -296,7 +311,7 @@ function selectPatchSubset(manifest, requested) {
296
311
  if (found.length === 0) {
297
312
  const available = manifest.patches.map((p) => p.filename).join(', ');
298
313
  throw new GeneralError(`No patch in the queue matches "${name}". In --per-patch mode, positional arguments ` +
299
- `and --patches select patches (filename, stem, manifest name, or slug) — not engine ` +
314
+ `and --patches select patches (filename, stem, order number, manifest name, or slug) — not engine ` +
300
315
  `files; drop --per-patch to lint engine paths. Available patches: ${available}`);
301
316
  }
302
317
  for (const p of found) {
@@ -316,7 +331,7 @@ function selectPatchSubset(manifest, requested) {
316
331
  * queue-level findings are scoped to files those patches touch).
317
332
  */
318
333
  export async function lintPerPatch(projectRoot, paths, options = {}) {
319
- // Read-only to the operator, an index WRITER to git: the per-patch diffs
334
+ // Read-only to the operator, but an index writer to git: the per-patch diffs
320
335
  // run `git diff HEAD` (and, for untracked binaries, a real stage/unstage
321
336
  // pair) against the primary checkout. A private index absorbs all of it
322
337
  // so a concurrent `fireforge test` still gets an evidential verdict.
@@ -364,7 +379,7 @@ async function lintPerPatchInner(projectRoot, paths, options = {}) {
364
379
  });
365
380
  }
366
381
  // With `--patches`, the checkJs program roots at only the subset's owned
367
- // files — the full queue stays resolvable, so a cold subset run costs the
382
+ // files. The full queue stays resolvable, so a cold subset run costs the
368
383
  // subset's import closure instead of the whole queue.
369
384
  const checkJs = buildPerRunCheckJs(projectRoot, paths, config, ctx, isSubset ? subsetNames : undefined);
370
385
  // Lint patches concurrently, then apply every side effect in patch order so
@@ -3,27 +3,26 @@
3
3
  * `re-export`.
4
4
  *
5
5
  * The dominant fixed cost of patch lint is one `ts.createProgram` over the
6
- * queue's patch-owned `.sys.mjs` files — tens of seconds on a large queue.
7
- * This controller builds that program at most ONCE per command invocation
6
+ * queue's patch-owned `.sys.mjs` files, tens of seconds on a large queue.
7
+ * This controller builds that program at most once per command invocation
8
8
  * (lazily, promise-memoised) and lets callers slice per-patch findings out of
9
9
  * the grouped result. Three levers keep the cost paid only when it buys
10
10
  * something:
11
11
  *
12
- * - **Lazy build**: nothing is built until the first cache miss asks.
13
- * - **Root scoping** (`rootScopePatches`): with `--patches <subset>` the
14
- * program's roots are only the subset's owned files; the full queue stays
12
+ * - Lazy build: nothing is built until the first cache miss asks.
13
+ * - Root scoping (`rootScopePatches`): with `--patches <subset>` the
14
+ * program's roots are only the subset's owned files. The full queue stays
15
15
  * resolvable, so cross-patch imports type-check identically while
16
16
  * unrelated files are never parsed.
17
- * - **Warm-run probe**: run-level ("global") checkJs findings come only from
18
- * a missing `typescript` package or an unreadable shim — never from the
19
- * built program — so an all-cache-hit run satisfies "warm never reports
20
- * less than cold" via `probeCheckJsGlobalIssues` instead of building
21
- * anything.
17
+ * - Warm-run probe: run-level ("global") checkJs findings come only from a
18
+ * missing `typescript` package or an unreadable shim, never from the built
19
+ * program, so an all-cache-hit run satisfies "warm never reports less than
20
+ * cold" via `probeCheckJsGlobalIssues` instead of building anything.
22
21
  */
23
- import type { getProjectPaths, loadConfig } from '../core/config.js';
24
22
  import { type GroupedCheckJsResult } from '../core/patch-lint-checkjs.js';
25
23
  import type { PatchQueueContext } from '../core/patch-lint-cross.js';
26
24
  import type { PatchLintIssue } from '../types/commands/index.js';
25
+ import type { FireForgeConfig, ProjectPaths } from '../types/config.js';
27
26
  /**
28
27
  * Queue-wide checkJs program built once per run and sliced per patch, so a
29
28
  * single type regression surfaces once against its owning patch instead of
@@ -32,7 +31,7 @@ import type { PatchLintIssue } from '../types/commands/index.js';
32
31
  export interface PerRunCheckJs {
33
32
  /** Patch filename → the checkJs-relevant files that patch creates. */
34
33
  ownedByPatch: Map<string, Set<string>>;
35
- /** Every checkJs-relevant file in the queue (sys + test scripts) — the
34
+ /** Every checkJs-relevant file in the queue (sys + test scripts), the
36
35
  * resolution universe the program can see. Callers use it to detect
37
36
  * files the hoisted program has never heard of (fresh `--scan`
38
37
  * adoptions) and fall back to a per-patch build. */
@@ -43,10 +42,10 @@ export interface PerRunCheckJs {
43
42
  getGrouped: () => Promise<GroupedCheckJsResult>;
44
43
  /** Run-level checkJs errors (e.g. TypeScript missing). When the program
45
44
  * was never built (all-warm run) this probes the two global failure
46
- * sources directly instead of building it holds because the
45
+ * sources directly instead of building it, which is safe because the
47
46
  * built program never contributes globals of its own. */
48
47
  getGlobal: () => Promise<PatchLintIssue[]>;
49
- /** The byFile slices for `files` (globals deliberately EXCLUDED — they
48
+ /** The byFile slices for `files` (globals are excluded because they
50
49
  * are run-level, never cached, and emitted once per invocation via
51
50
  * `getGlobal`). Feed to `LintExportedPatchOptions.precomputedCheckJs`. */
52
51
  sliceFor: (files: ReadonlySet<string>) => Promise<PatchLintIssue[]>;
@@ -61,4 +60,4 @@ export interface PerRunCheckJs {
61
60
  * subset's owned files and the test-file pass runs only the subset's own
62
61
  * scripts (head.js discovery still spans the queue).
63
62
  */
64
- export declare function buildPerRunCheckJs(projectRoot: string, paths: ReturnType<typeof getProjectPaths>, config: Awaited<ReturnType<typeof loadConfig>>, ctx: PatchQueueContext, rootScopePatches?: ReadonlySet<string>): PerRunCheckJs | undefined;
63
+ export declare function buildPerRunCheckJs(projectRoot: string, paths: ProjectPaths, config: FireForgeConfig, ctx: PatchQueueContext, rootScopePatches?: ReadonlySet<string>): PerRunCheckJs | undefined;
@@ -4,22 +4,21 @@
4
4
  * `re-export`.
5
5
  *
6
6
  * The dominant fixed cost of patch lint is one `ts.createProgram` over the
7
- * queue's patch-owned `.sys.mjs` files — tens of seconds on a large queue.
8
- * This controller builds that program at most ONCE per command invocation
7
+ * queue's patch-owned `.sys.mjs` files, tens of seconds on a large queue.
8
+ * This controller builds that program at most once per command invocation
9
9
  * (lazily, promise-memoised) and lets callers slice per-patch findings out of
10
10
  * the grouped result. Three levers keep the cost paid only when it buys
11
11
  * something:
12
12
  *
13
- * - **Lazy build**: nothing is built until the first cache miss asks.
14
- * - **Root scoping** (`rootScopePatches`): with `--patches <subset>` the
15
- * program's roots are only the subset's owned files; the full queue stays
13
+ * - Lazy build: nothing is built until the first cache miss asks.
14
+ * - Root scoping (`rootScopePatches`): with `--patches <subset>` the
15
+ * program's roots are only the subset's owned files. The full queue stays
16
16
  * resolvable, so cross-patch imports type-check identically while
17
17
  * unrelated files are never parsed.
18
- * - **Warm-run probe**: run-level ("global") checkJs findings come only from
19
- * a missing `typescript` package or an unreadable shim — never from the
20
- * built program — so an all-cache-hit run satisfies "warm never reports
21
- * less than cold" via `probeCheckJsGlobalIssues` instead of building
22
- * anything.
18
+ * - Warm-run probe: run-level ("global") checkJs findings come only from a
19
+ * missing `typescript` package or an unreadable shim, never from the built
20
+ * program, so an all-cache-hit run satisfies "warm never reports less than
21
+ * cold" via `probeCheckJsGlobalIssues` instead of building anything.
23
22
  */
24
23
  import { invokePatchLintCheckJsGrouped, probeCheckJsGlobalIssues, runCheckJsTestFilesGrouped, } from '../core/patch-lint-checkjs.js';
25
24
  import { isTestScriptFile, resolvePatchOwnedSysMjs, resolvePatchOwnedTestScripts, } from '../core/patch-lint-ownership.js';
@@ -52,7 +51,7 @@ export function buildPerRunCheckJs(projectRoot, paths, config, ctx, rootScopePat
52
51
  for (const f of files)
53
52
  resolutionSet.add(f);
54
53
  }
55
- // The subset's owned files, split by program kind; undefined = full queue.
54
+ // The subset's owned files, split by program kind. Undefined = full queue.
56
55
  let scopedRoots;
57
56
  if (rootScopePatches !== undefined) {
58
57
  scopedRoots = new Set();
@@ -63,9 +62,9 @@ export function buildPerRunCheckJs(projectRoot, paths, config, ctx, rootScopePat
63
62
  scopedRoots.add(f);
64
63
  }
65
64
  }
66
- // One build for the whole run: the queue-wide `.sys.mjs` program plus —
67
- // when `patchLint.checkJsTestFiles` is on — one small
68
- // script-scope program per patch-owned test file, merged by file.
65
+ // One build for the whole run: the queue-wide `.sys.mjs` program, plus
66
+ // (when `patchLint.checkJsTestFiles` is on) one small script-scope
67
+ // program per patch-owned test file, merged by file.
69
68
  const buildAll = async () => {
70
69
  const sys = await invokePatchLintCheckJsGrouped(paths.engine, resolvePatchOwnedSysMjs(new Set(), ctx), patchLint, projectRoot, scopedRoots);
71
70
  if (!testFilesEnabled)
@@ -77,7 +76,7 @@ export function buildPerRunCheckJs(projectRoot, paths, config, ctx, rootScopePat
77
76
  }
78
77
  return { byFile, global: [...sys.global, ...tests.global] };
79
78
  };
80
- // Memoise the *promise*, not the resolved value: under the bounded pool
79
+ // Memoise the promise rather than the resolved value: under the bounded pool
81
80
  // several patches can reach `getGrouped` before the first build resolves, and
82
81
  // `??=` on the promise (a synchronous expression) guarantees a single build.
83
82
  let groupedPromise;
@@ -1,7 +1,7 @@
1
1
  import type { PatchLintIssue, PatchMetadata } from '../types/commands/index.js';
2
2
  /**
3
3
  * Structural view of one per-patch lint outcome. Mirrors the relevant
4
- * fields of lint-per-patch's QueuedPatchResult without importing it —
4
+ * fields of lint-per-patch's QueuedPatchResult without importing it:
5
5
  * that module imports this one, and a type back-edge would trip the
6
6
  * dpdm cycle gate.
7
7
  */
@@ -14,8 +14,8 @@ export interface PerPatchReportResult {
14
14
  }
15
15
  /**
16
16
  * Writes the per-patch lint report JSON. Called after the per-patch
17
- * results are assembled in patch order; queue-level and policy findings
17
+ * results are assembled in patch order. Queue-level and policy findings
18
18
  * are patch-attributed by their `file`/`filename` fields upstream and
19
- * are NOT duplicated here — the report is the per-patch view.
19
+ * are not duplicated here. The report is the per-patch view.
20
20
  */
21
21
  export declare function writePerPatchLintReport(reportPath: string, subset: readonly PatchMetadata[], results: readonly PerPatchReportResult[]): Promise<void>;
@@ -2,11 +2,11 @@
2
2
  /**
3
3
  * Machine-readable per-patch lint report (`lint --per-patch --report
4
4
  * <path>`). One mechanism serves two observability gaps: consumers get each
5
- * patch's size metrics against the SAME thresholds the size rules fire on,
5
+ * patch's size metrics against the same thresholds the size rules fire on,
6
6
  * instead of mirroring `countNonBinaryDiffLines`, and lintIgnore-suppressed
7
7
  * issues stay visible with their measurements rather than vanishing.
8
8
  *
9
- * Helper module consumed by lint-per-patch.ts; no registrar is exported and
9
+ * Helper module consumed by lint-per-patch.ts. No registrar is exported and
10
10
  * none is wanted.
11
11
  */
12
12
  import { getPatchSizeThresholds, resolvePatchSizeTier, } from '../core/patch-lint.js';
@@ -15,9 +15,9 @@ import { info } from '../utils/logger.js';
15
15
  const LINT_REPORT_SCHEMA_VERSION = 1;
16
16
  /**
17
17
  * Writes the per-patch lint report JSON. Called after the per-patch
18
- * results are assembled in patch order; queue-level and policy findings
18
+ * results are assembled in patch order. Queue-level and policy findings
19
19
  * are patch-attributed by their `file`/`filename` fields upstream and
20
- * are NOT duplicated here — the report is the per-patch view.
20
+ * are not duplicated here. The report is the per-patch view.
21
21
  */
22
22
  export async function writePerPatchLintReport(reportPath, subset, results) {
23
23
  const patches = [];
@@ -1,4 +1,5 @@
1
1
  import { Command } from 'commander';
2
+ import { type PatchQueueContext } from '../core/patch-lint.js';
2
3
  import type { CommandContext } from '../types/cli.js';
3
4
  import type { LintCommandOptions, PatchLintIssue } from '../types/commands/index.js';
4
5
  /**
@@ -26,15 +27,15 @@ export interface AggregateLintIgnoreResult {
26
27
  * attribute via `issue.file`, which is the offending site and is owned by
27
28
  * some patch.
28
29
  *
29
- * Multiple owners: an issue is dropped if **any** owning patch waived the
30
- * rule. Conservative — never adds new findings, only drops already-waived
31
- * ones.
30
+ * Multiple owners: an issue is dropped if any owning patch waived the
31
+ * rule. This is conservative: it never adds new findings, only drops
32
+ * already-waived ones.
32
33
  *
33
34
  * @param issues - Issues collected from the aggregate lint run.
34
35
  * @param ctx - Patch queue context used to attribute file → patch.
35
36
  * @returns Filtered issue list and the count of dropped findings.
36
37
  */
37
- export declare function applyAggregateLintIgnoreSuppression(issues: PatchLintIssue[], ctx: import('../core/patch-lint.js').PatchQueueContext): AggregateLintIgnoreResult;
38
+ export declare function applyAggregateLintIgnoreSuppression(issues: PatchLintIssue[], ctx: PatchQueueContext): AggregateLintIgnoreResult;
38
39
  /**
39
40
  * Runs the lint command to check engine changes against patch quality rules.
40
41
  * @param projectRoot - Root directory of the project