@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,9 +1,9 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
3
  * Operator-facing triage for the `timed out … with no output` / `Ran 0
4
- * checks` stall — the shape where the harness dies before ANY test output.
4
+ * checks` stall: the shape where the harness dies before any test output.
5
5
  *
6
- * Split out of `test-harness-crash.ts`, which CLASSIFIES runs; this module
6
+ * Split out of `test-harness-crash.ts`, which classifies runs. This module
7
7
  * only renders advice about one already-classified shape. Keeping the two
8
8
  * apart matters because the census below carries claims of unequal
9
9
  * evidential strength, and the rules for editing it are not the rules for
@@ -11,14 +11,14 @@
11
11
  * the output or not, while a cause in the census is an assertion about the
12
12
  * world that an operator will act on.
13
13
  *
14
- * Everything here is pure — the platform and the probed display state are
14
+ * Everything here is pure. The platform and the probed display state are
15
15
  * injected, so unit tests need no mocking.
16
16
  */
17
17
  /**
18
18
  * First step for the `timed out … with no output` / `Ran 0 checks`
19
- * signature, printed ABOVE the cause list. Running a known-good control
19
+ * signature, printed above the cause list. Running a known-good control
20
20
  * separates "this test" from "this build" and is the correct opening move
21
- * for EVERY cause below — it is not specific to any one of them, so
21
+ * for every cause below. It is not specific to any one of them, so
22
22
  * attaching it to a single entry made reaching that entry informationally
23
23
  * empty.
24
24
  */
@@ -26,23 +26,23 @@ const NO_OUTPUT_STALL_CONTROL_STEP = 'First, run a known-good control test. If t
26
26
  'under investigation, and the list below applies to the build or the host.';
27
27
  /**
28
28
  * Recorded causes of the `timed out … with no output` / `Ran 0 checks`
29
- * signature, each paired with the probe that DISCRIMINATES it from the
29
+ * signature, each paired with the probe that discriminates it from the
30
30
  * others. Printed verbatim under the hint.
31
31
  *
32
- * Evidence per entry is deliberately unequal, and the text says so:
32
+ * Evidence per entry is unequal, and the text says so:
33
33
  *
34
- * - (1) is MEASURED — `probeDisplaySleepState` reads the display's power
34
+ * - (1) is measured: `probeDisplaySleepState` reads the display's power
35
35
  * state, so the hint states it as fact rather than as a possibility.
36
36
  * - (2) is discriminated by `--headless`.
37
- * - (4) is MECHANICAL and was root-caused downstream: the harness serves
37
+ * - (4) is mechanical and was root-caused downstream: the harness serves
38
38
  * its manifest from `server.js` on 8888, and a survivor of an
39
39
  * interrupted run keeps the port. Its probe is exact, and the preflight
40
40
  * in `mochitest-server-port.ts` now refuses it before a run starts.
41
- * - (3) is now MECHANICAL and root-caused, replacing the correlation an
41
+ * - (3) is now mechanical and root-caused, replacing the correlation an
42
42
  * earlier revision recorded. A `chrome://` (or `resource://`) URL that
43
43
  * resolves to nothing reaches `CheckForBrokenChromeURL`
44
44
  * (netwerk/base/nsNetUtil.cpp), which outside automation only
45
- * `printf_stderr`s `Missing chrome or resource URL: <uri>` — but under
45
+ * `printf_stderr`s `Missing chrome or resource URL: <uri>`, but under
46
46
  * `xpc::IsInAutomation()` the same condition is
47
47
  * `MOZ_CRASH_UNSAFE_PRINTF("Missing chrome or resource URLs: %s")`. A
48
48
  * downstream reproduction symbolicated the faulting frame as
@@ -52,13 +52,13 @@ const NO_OUTPUT_STALL_CONTROL_STEP = 'First, run a known-good control test. If t
52
52
  * failed image load in Gecko fires `error` and does not gate the
53
53
  * document load event.
54
54
  *
55
- * Detection by log line is deliberately NOT specified for (3), and the
56
- * reason is the mechanism itself: in the reproduction the crash landed in a
57
- * CONTENT process (`plugin-container`, a child of the browser) with the
55
+ * Detection by log line is not specified for (3), because of the mechanism
56
+ * itself: in the reproduction the crash landed in a content
57
+ * process (`plugin-container`, a child of the browser) with the
58
58
  * crash reporter compiled out, so the harness log carried neither the crash
59
- * message nor a crash line — only the no-output timeout, `Ran 0 checks`,
59
+ * message nor a crash line, only the no-output timeout, `Ran 0 checks`,
60
60
  * and mochitest's "Can't trigger Breakpad, just killing process". Under
61
- * automation the message is in the process that DIED, not in the log, so
61
+ * automation the message is in the process that died, not in the log, so
62
62
  * the census points at the two artefacts that do carry it: the OS crash
63
63
  * report (whose faulting frame names `CheckForBrokenChromeURL`) and the
64
64
  * out-of-automation smoke probe (which prints the non-crashing spelling
@@ -90,17 +90,17 @@ const NO_OUTPUT_STALL_TRIAGE = [
90
90
  'reach a stall only on a host where the port could not be probed.',
91
91
  ];
92
92
  /**
93
- * Optional hint appended to the harness-crash message when a HEADED run on
93
+ * Optional hint appended to the harness-crash message when a headed run on
94
94
  * macOS died at the no-output timeout.
95
95
  *
96
- * When `displayState` names a MEASURED display state, the hint states it as
97
- * fact rather than as one of three possibilities — that is the point of
98
- * probing: an operator staring at a bare test failure should not have to
96
+ * When `displayState` names a measured display state, the hint states it as
97
+ * fact rather than as one of three possibilities, which is what probing is
98
+ * for: an operator staring at a bare test failure should not have to
99
99
  * rediscover that their machine dimmed. `caffeinate` is described accurately
100
- * (it prevents sleep; it cannot wake an already-sleeping display), so
100
+ * (it prevents sleep, and cannot wake an already-sleeping display), so
101
101
  * operators are not sent to a command that could not have helped them.
102
102
  *
103
- * Pure — the platform and the probed state are injected so unit tests need
103
+ * Pure. The platform and the probed state are injected so unit tests need
104
104
  * no mocking.
105
105
  *
106
106
  * @param signature - The recognized crash shape
@@ -1,14 +1,33 @@
1
- import { type MachCommandResult } from './mach.js';
1
+ import { type MachCommandResult, type MachTestSuiteKind } from './mach.js';
2
2
  export interface XpcshellRetryClassification {
3
3
  xpcshell: readonly string[];
4
4
  nonXpcshell: readonly string[];
5
5
  }
6
- /** Dispatches a (possibly suite-specific) mach test run, mirroring `testWithOutput`. */
7
- export type TestDispatch = (engineDir: string, testPaths: string[], args: string[], env?: Record<string, string>, fullOutput?: boolean) => Promise<MachCommandResult>;
6
+ export interface XpcshellRetryOptions {
7
+ /** Engine checkout the run happened in. */
8
+ engineDir: string;
9
+ /** Object directory the run used, when one is configured. */
10
+ objDir: string | undefined;
11
+ /** Result of the run that may need repairing and retrying. */
12
+ result: MachCommandResult;
13
+ /** Which of the requested paths are xpcshell tests, and which are not. */
14
+ classification: XpcshellRetryClassification;
15
+ /** Test paths, normalized, as handed to mach. */
16
+ normalizedPaths: string[];
17
+ /** Extra mach arguments the run was started with. */
18
+ extraArgs: string[];
19
+ /** Environment overlay for the retried run. */
20
+ env?: Record<string, string> | undefined;
21
+ /** Mach command kind to retry with. Defaults to the generic `test`. */
22
+ kind?: MachTestSuiteKind | undefined;
23
+ /** Whether the run was started with full harness output. */
24
+ fullOutput?: boolean | undefined;
25
+ }
8
26
  /**
9
27
  * Removes a stale xpcshell install symlink and retries the focused mach test
10
- * once. The retry uses the same `dispatch` (suite-specific or generic) the
11
- * caller is already running on, so an xpcshell-suite run repairs and re-runs
12
- * via `mach xpcshell-test` rather than falling back to the generic command.
28
+ * once. The retry uses the same mach command `kind` (suite-specific or
29
+ * generic) the caller is already running on, so an xpcshell-suite run repairs
30
+ * and re-runs via `mach xpcshell-test` rather than falling back to the
31
+ * generic command.
13
32
  */
14
- export declare function retryAfterXpcshellSymlinkRepair(engineDir: string, objDir: string | undefined, result: MachCommandResult, classification: XpcshellRetryClassification, normalizedPaths: string[], extraArgs: string[], env?: Record<string, string>, dispatch?: TestDispatch, fullOutput?: boolean): Promise<MachCommandResult>;
33
+ export declare function retryAfterXpcshellSymlinkRepair(options: XpcshellRetryOptions): Promise<MachCommandResult>;
@@ -1,13 +1,15 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
- import { testWithOutput } from './mach.js';
2
+ import { runMachTestSuite } from './mach.js';
3
3
  import { tryRepairStaleXpcshellTestSymlink } from './test-stale-symlink.js';
4
4
  /**
5
5
  * Removes a stale xpcshell install symlink and retries the focused mach test
6
- * once. The retry uses the same `dispatch` (suite-specific or generic) the
7
- * caller is already running on, so an xpcshell-suite run repairs and re-runs
8
- * via `mach xpcshell-test` rather than falling back to the generic command.
6
+ * once. The retry uses the same mach command `kind` (suite-specific or
7
+ * generic) the caller is already running on, so an xpcshell-suite run repairs
8
+ * and re-runs via `mach xpcshell-test` rather than falling back to the
9
+ * generic command.
9
10
  */
10
- export async function retryAfterXpcshellSymlinkRepair(engineDir, objDir, result, classification, normalizedPaths, extraArgs, env, dispatch = testWithOutput, fullOutput) {
11
+ export async function retryAfterXpcshellSymlinkRepair(options) {
12
+ const { engineDir, objDir, result, classification, normalizedPaths, extraArgs, env, kind = 'test', fullOutput, } = options;
11
13
  if (result.exitCode !== 0 &&
12
14
  classification.xpcshell.length > 0 &&
13
15
  classification.nonXpcshell.length === 0) {
@@ -15,12 +17,13 @@ export async function retryAfterXpcshellSymlinkRepair(engineDir, objDir, result,
15
17
  if (repaired) {
16
18
  // The repaired re-run is the same logical invocation, so it keeps
17
19
  // the verbosity the run was started with.
18
- if (fullOutput === true) {
19
- return dispatch(engineDir, normalizedPaths, extraArgs, env, true);
20
- }
21
- return env
22
- ? dispatch(engineDir, normalizedPaths, extraArgs, env)
23
- : dispatch(engineDir, normalizedPaths, extraArgs);
20
+ return runMachTestSuite(kind, {
21
+ engineDir,
22
+ testPaths: normalizedPaths,
23
+ args: extraArgs,
24
+ env,
25
+ fullOutput,
26
+ });
24
27
  }
25
28
  }
26
29
  return result;
@@ -1,10 +1,36 @@
1
1
  /**
2
2
  * True when `lines` contain a category header (single-line or multi-line
3
- * banner shape) whose name EQUALS `category`. Shared by the pre-add
3
+ * banner shape) whose name equals `category`. Shared by the pre-add
4
4
  * assertion, the banner creation path, and the section finder so all
5
5
  * agree on what "exists" means.
6
6
  */
7
7
  export declare function categoryHeaderExists(lines: string[], category: string): boolean;
8
+ /**
9
+ * Scans a tokens CSS file for category header comments and returns the
10
+ * category names in document order. Used to enrich the "category not
11
+ * found" error body with concrete alternatives the operator can copy.
12
+ *
13
+ * Mirrors the shapes `findCategorySection` recognises:
14
+ * - Single-line: `/* = Foo = *\/`
15
+ * - Multi-line: `/* =====` opening, `Foo` on any of the next ~5 lines,
16
+ * closing `*\/`.
17
+ *
18
+ * This helper exists as a pure inspector. It never throws on malformed
19
+ * headers and silently skips shapes it cannot parse.
20
+ */
21
+ /**
22
+ * Category name declared by the banner starting at `index`, or `undefined`
23
+ * when that line opens no banner.
24
+ *
25
+ * The single reader for both banner shapes, so the inventory walk, the
26
+ * "available categories" error body and the section finder cannot drift on
27
+ * what counts as a header.
28
+ *
29
+ * @param lines - Tokens CSS split into lines
30
+ * @param index - 0-based line index to test
31
+ * @returns The declared category name, or undefined
32
+ */
33
+ export declare function categoryBannerNameAt(lines: string[], index: number): string | undefined;
8
34
  /**
9
35
  * Asserts the category banner exists (or that creation was requested).
10
36
  * Throws a GeneralError naming the available categories and the
@@ -23,6 +49,13 @@ export declare function findCategorySection(lines: string[], category: string, t
23
49
  categoryLine: number;
24
50
  sectionEnd: number;
25
51
  };
52
+ /** 0-based open/close line indices of the base `:root {` block. */
53
+ export declare function findBaseRootBounds(lines: string[]): {
54
+ open: number;
55
+ close: number;
56
+ } | undefined;
57
+ /** Masks block-comment content per line so declarations inside comments never match. */
58
+ export declare function maskCommentLines(lines: string[]): string[];
26
59
  /** Location of an existing base-`:root` token declaration. */
27
60
  export interface TokenDeclarationLocation {
28
61
  /** 1-based line number in the tokens CSS file. */
@@ -33,7 +66,7 @@ export interface TokenDeclarationLocation {
33
66
  /**
34
67
  * Finds an existing declaration of `tokenName` inside the base `:root`
35
68
  * block. Dark `@media` and `:root[variant]` companion blocks are
36
- * deliberately excluded — they mirror the base declaration, they do not
69
+ * excluded: they mirror the base declaration, they do not
37
70
  * own the token. Comment content never matches, and the name match is
38
71
  * exact (`--foo-bar` does not match `--x-foo-bar`).
39
72
  */
@@ -3,11 +3,12 @@
3
3
  * Category banner and token-declaration helpers for the tokens CSS file.
4
4
  * Split out of `token-manager.ts` to stay inside the per-file line budget.
5
5
  *
6
- * Banner matching is EXACT: the text between the `=` runs (single-line
6
+ * Banner matching is exact: the text between the `=` runs (single-line
7
7
  * shape) or on the block line (multi-line shape) must equal the category
8
- * after trimming. A substring match lets a TOC comment or a longer banner
9
- * (`Colors — Canvas` for `Colors`) satisfy the lookup, so `token add` writes
10
- * into the wrong section — or no-ops — with exit 0.
8
+ * after trimming. With a substring match, a TOC comment or a longer banner
9
+ * whose name merely starts with the category (a canvas colors banner
10
+ * satisfying a lookup for `Colors`) would also match, and `token add` would
11
+ * then write into the wrong section, or no-op, with exit 0.
11
12
  */
12
13
  import { join } from 'node:path';
13
14
  import { GeneralError } from '../errors/base.js';
@@ -20,10 +21,10 @@ function multiLineBlockNameMatches(blockLine, category) {
20
21
  return blockLine.replace(/^\s*\*\s*/, '').trim() === category;
21
22
  }
22
23
  /**
23
- * Body of the first `/* … *\/` comment on `line`, or `null` when the line
24
- * carries no closed block comment.
24
+ * Body of the first `/* … *\/` comment on `line`, or `undefined` when the
25
+ * line carries no closed block comment.
25
26
  *
26
- * Deliberately index arithmetic rather than a regex: every regex spelling of
27
+ * This uses index arithmetic rather than a regex: every regex spelling of
27
28
  * "banner comment" this module used to carry was super-linear on a line that
28
29
  * repeats the opening shape (CodeQL `js/polynomial-redos`), and `tokens.css`
29
30
  * is a file FireForge reads out of a consumer's engine tree, so a
@@ -32,14 +33,14 @@ function multiLineBlockNameMatches(blockLine, category) {
32
33
  function blockCommentBody(line) {
33
34
  const open = line.indexOf('/*');
34
35
  if (open === -1)
35
- return null;
36
+ return undefined;
36
37
  const close = line.indexOf('*/', open + 2);
37
38
  if (close === -1)
38
- return null;
39
+ return undefined;
39
40
  return line.slice(open + 2, close);
40
41
  }
41
42
  /**
42
- * True when `line` carries a single-line banner comment — a closed block
43
+ * True when `line` carries a single-line banner comment: a closed block
43
44
  * comment whose body both opens and closes with `=`. Recognises the decorative
44
45
  * all-`=` rule as well as a named `= Foo =` banner, which is what the section
45
46
  * scan wants: either shape ends the preceding section.
@@ -49,14 +50,15 @@ function isSingleLineBannerLine(line) {
49
50
  return body !== undefined && body.length >= 2 && body.startsWith('=') && body.endsWith('=');
50
51
  }
51
52
  /**
52
- * Name declared by a single-line banner (`/* = Foo = *\/` → `Foo`), or `null`
53
- * when the line is not a named banner. The `=` runs on both sides are
54
- * required; a decorative all-`=` rule carries no name and yields `null`.
53
+ * Name declared by a single-line banner (`/* = Foo = *\/` → `Foo`), or
54
+ * `undefined` when the line is not a named banner. The `=` runs on both sides
55
+ * are required. A decorative all-`=` rule carries no name and yields
56
+ * `undefined`.
55
57
  */
56
58
  function singleLineBannerName(line) {
57
59
  const body = blockCommentBody(line);
58
- if (body === null)
59
- return null;
60
+ if (body === undefined)
61
+ return undefined;
60
62
  let start = 0;
61
63
  let end = body.length;
62
64
  while (start < end && /\s/.test(body[start] ?? ''))
@@ -65,27 +67,26 @@ function singleLineBannerName(line) {
65
67
  while (start < end && body[start] === '=')
66
68
  start++;
67
69
  if (start === leadingEqStart)
68
- return null;
70
+ return undefined;
69
71
  while (end > start && /\s/.test(body[end - 1] ?? ''))
70
72
  end--;
71
73
  const trailingEqEnd = end;
72
74
  while (end > start && body[end - 1] === '=')
73
75
  end--;
74
76
  if (end === trailingEqEnd)
75
- return null;
77
+ return undefined;
76
78
  const name = body.slice(start, end).trim();
77
- return name.length > 0 ? name : null;
79
+ return name.length > 0 ? name : undefined;
78
80
  }
79
81
  /**
80
82
  * True when `lines` contain a category header (single-line or multi-line
81
- * banner shape) whose name EQUALS `category`. Shared by the pre-add
83
+ * banner shape) whose name equals `category`. Shared by the pre-add
82
84
  * assertion, the banner creation path, and the section finder so all
83
85
  * agree on what "exists" means.
84
86
  */
85
87
  export function categoryHeaderExists(lines, category) {
86
88
  const singleLinePattern = singleLineBannerPattern(category);
87
- for (let i = 0; i < lines.length; i++) {
88
- const line = lines[i] ?? '';
89
+ for (const [i, line] of lines.entries()) {
89
90
  if (singleLinePattern.test(line)) {
90
91
  return true;
91
92
  }
@@ -112,32 +113,47 @@ export function categoryHeaderExists(lines, category) {
112
113
  * - Multi-line: `/* =====` opening, `Foo` on any of the next ~5 lines,
113
114
  * closing `*\/`.
114
115
  *
115
- * This helper exists as a pure inspector; it never throws on malformed
116
+ * This helper exists as a pure inspector. It never throws on malformed
116
117
  * headers and silently skips shapes it cannot parse.
117
118
  */
119
+ /**
120
+ * Category name declared by the banner starting at `index`, or `undefined`
121
+ * when that line opens no banner.
122
+ *
123
+ * The single reader for both banner shapes, so the inventory walk, the
124
+ * "available categories" error body and the section finder cannot drift on
125
+ * what counts as a header.
126
+ *
127
+ * @param lines - Tokens CSS split into lines
128
+ * @param index - 0-based line index to test
129
+ * @returns The declared category name, or undefined
130
+ */
131
+ export function categoryBannerNameAt(lines, index) {
132
+ const line = lines[index] ?? '';
133
+ const extracted = singleLineBannerName(line);
134
+ if (extracted !== undefined)
135
+ return extracted;
136
+ if (/^\s*\/\*\s*=+/.test(line) && !/\*\//.test(line)) {
137
+ for (let j = index + 1; j < Math.min(index + 6, lines.length); j++) {
138
+ const blockLine = lines[j] ?? '';
139
+ if (/\*\//.test(blockLine))
140
+ break;
141
+ const trimmed = blockLine.replace(/^\s*\*\s*/, '').trim();
142
+ if (trimmed.length === 0)
143
+ continue;
144
+ if (/^=+$/.test(trimmed))
145
+ continue;
146
+ return trimmed;
147
+ }
148
+ }
149
+ return undefined;
150
+ }
118
151
  function discoverCategoryHeaders(lines) {
119
152
  const categories = new Set();
120
153
  for (let i = 0; i < lines.length; i++) {
121
- const line = lines[i] ?? '';
122
- const extracted = singleLineBannerName(line);
123
- if (extracted !== null) {
124
- categories.add(extracted);
125
- continue;
126
- }
127
- if (/^\s*\/\*\s*=+/.test(line) && !/\*\//.test(line)) {
128
- for (let j = i + 1; j < Math.min(i + 6, lines.length); j++) {
129
- const blockLine = lines[j] ?? '';
130
- if (/\*\//.test(blockLine))
131
- break;
132
- const trimmed = blockLine.replace(/^\s*\*\s*/, '').trim();
133
- if (trimmed.length === 0)
134
- continue;
135
- if (/^=+$/.test(trimmed))
136
- continue;
137
- categories.add(trimmed);
138
- break;
139
- }
140
- }
154
+ const name = categoryBannerNameAt(lines, i);
155
+ if (name !== undefined)
156
+ categories.add(name);
141
157
  }
142
158
  return [...categories];
143
159
  }
@@ -177,7 +193,7 @@ export async function assertTokenCategoryExists(engineDir, tokensCssPath, catego
177
193
  */
178
194
  export function declareCategoryBanner(lines, category, tokensCssPath) {
179
195
  const bounds = findBaseRootBounds(lines);
180
- if (bounds === null) {
196
+ if (bounds === undefined) {
181
197
  throw new GeneralError(`Cannot create category "${category}": no :root block found in ${tokensCssPath}. ` +
182
198
  'Run "fireforge furnace init --force" to re-scaffold the tokens CSS file.');
183
199
  }
@@ -190,14 +206,13 @@ export function declareCategoryBanner(lines, category, tokensCssPath) {
190
206
  export function findCategorySection(lines, category, tokensCssPath) {
191
207
  const singleLinePattern = singleLineBannerPattern(category);
192
208
  let categoryLine = -1;
193
- for (let i = 0; i < lines.length; i++) {
194
- const line = lines[i] ?? '';
209
+ for (const [i, line] of lines.entries()) {
195
210
  // Check single-line format: /* = Category = */
196
211
  if (singleLinePattern.test(line)) {
197
212
  categoryLine = i;
198
213
  break;
199
214
  }
200
- // Check multi-line format: line opens a block comment with === but does NOT close it
215
+ // Check multi-line format: line opens a block comment with === but does not close it
201
216
  if (/^\s*\/\*\s*=+/.test(line) && !/\*\//.test(line)) {
202
217
  for (let j = i + 1; j < Math.min(i + 6, lines.length); j++) {
203
218
  const blockLine = lines[j] ?? '';
@@ -245,16 +260,10 @@ export function findCategorySection(lines, category, tokensCssPath) {
245
260
  return { categoryLine, sectionEnd };
246
261
  }
247
262
  /** 0-based open/close line indices of the base `:root {` block. */
248
- function findBaseRootBounds(lines) {
249
- let open = -1;
250
- for (let i = 0; i < lines.length; i++) {
251
- if (/:root\s*\{/.test(lines[i] ?? '')) {
252
- open = i;
253
- break;
254
- }
255
- }
263
+ export function findBaseRootBounds(lines) {
264
+ const open = lines.findIndex((line) => /:root\s*\{/.test(line));
256
265
  if (open === -1)
257
- return null;
266
+ return undefined;
258
267
  for (let i = open + 1; i < lines.length; i++) {
259
268
  if (/^\s*\}/.test(lines[i] ?? '')) {
260
269
  return { open, close: i };
@@ -263,20 +272,20 @@ function findBaseRootBounds(lines) {
263
272
  return { open, close: -1 };
264
273
  }
265
274
  /** Masks block-comment content per line so declarations inside comments never match. */
266
- function maskCommentLines(lines) {
275
+ export function maskCommentLines(lines) {
267
276
  const masked = lines.join('\n').replace(/\/\*[\s\S]*?\*\//g, (m) => m.replace(/[^\n]/g, ' '));
268
277
  return masked.split('\n');
269
278
  }
270
279
  /**
271
280
  * Finds an existing declaration of `tokenName` inside the base `:root`
272
281
  * block. Dark `@media` and `:root[variant]` companion blocks are
273
- * deliberately excluded — they mirror the base declaration, they do not
282
+ * excluded: they mirror the base declaration, they do not
274
283
  * own the token. Comment content never matches, and the name match is
275
284
  * exact (`--foo-bar` does not match `--x-foo-bar`).
276
285
  */
277
286
  export function findTokenDeclarationInRoot(lines, tokenName) {
278
287
  const bounds = findBaseRootBounds(lines);
279
- if (bounds === null || bounds.close === -1)
288
+ if (bounds === undefined || bounds.close === -1)
280
289
  return undefined;
281
290
  const masked = maskCommentLines(lines);
282
291
  const declPattern = new RegExp(`^\\s*${escapeRegex(tokenName)}\\s*:`);
@@ -8,16 +8,15 @@ import { loadFurnaceConfig } from './furnace-config.js';
8
8
  /**
9
9
  * Default platform prefixes treated as allowlisted upstream vars. Any
10
10
  * `var(--moz-*)` usage in a fork's CSS is a Firefox platform variable the
11
- * fork does not own and must not count as an unknown — otherwise a
11
+ * fork does not own and must not count as an unknown. Otherwise a
12
12
  * `furnace override moz-button -t css-only` plus one fork token reports 1%
13
13
  * coverage, because the ~84 upstream `--moz-*` vars in the copied baseline
14
14
  * all count against it.
15
15
  *
16
16
  * Forks that want to opt out can override this via
17
- * `furnace.json.platformPrefixes = []`; forks that want more can extend it
18
- * (e.g. `['--moz-', '--in-content-']`). The config is additive — nothing is
19
- * removed from the defaults unless the operator explicitly writes a shorter
20
- * list.
17
+ * `furnace.json.platformPrefixes = []`. Forks that want more can extend it
18
+ * (e.g. `['--moz-', '--in-content-']`). The config is additive: nothing is
19
+ * removed from the defaults unless the operator writes a shorter list.
21
20
  */
22
21
  const DEFAULT_PLATFORM_PREFIXES = ['--moz-'];
23
22
  /**
@@ -2,8 +2,8 @@
2
2
  * Dark-mode insertion helpers for the tokens CSS scaffold.
3
3
  *
4
4
  * `fireforge token add --mode override --dark-value ...` must land the dark
5
- * declaration INSIDE the nested `:root { }` of the
6
- * `@media (prefers-color-scheme: dark)` block; landing after that block has
5
+ * declaration inside the nested `:root { }` of the
6
+ * `@media (prefers-color-scheme: dark)` block. Landing after that block has
7
7
  * closed produces a declaration outside any rule. The helpers here scan the
8
8
  * comment-stripped source lines to find the *inner* `:root` block's closing
9
9
  * `}` and return a line index the caller can splice into. When the inner
@@ -19,28 +19,28 @@
19
19
  * into the original array at the same index.
20
20
  *
21
21
  * We blank the comment body with spaces (rather than removing it) so
22
- * any downstream consumer that indexes by column — or derives an
23
- * insertion index as a line number in the original array — still
22
+ * any downstream consumer that indexes by column (or derives an
23
+ * insertion index as a line number in the original array) still
24
24
  * agrees on line numbers.
25
25
  */
26
26
  export declare function stripBlockCommentsInLines(lines: string[]): string[];
27
27
  /**
28
28
  * Finds the closing `}` line of the nested `:root { ... }` block inside
29
29
  * a `@media (prefers-color-scheme: dark)` block. Returns `-1` when the
30
- * media block exists but the nested `:root` block is missing; returns
30
+ * media block exists but the nested `:root` block is missing. Returns
31
31
  * `null` when the `@media` block itself is absent.
32
32
  *
33
33
  * Runs the scan over a comment-stripped mirror of the source lines so
34
34
  * braces inside CSS comments (`/* before { after *\/`) do not offset
35
- * the depth counter. The scan is deliberately line-indexed so callers
35
+ * the depth counter. The scan is line-indexed so callers
36
36
  * can splice into the original `lines` array at the returned index.
37
37
  */
38
38
  export declare function findDarkRootInsertionIndex(lines: string[]): number | null;
39
39
  /**
40
40
  * Depth-counts braces from `startLine` (whose lines must already have
41
41
  * block comments stripped), returning the index of the line on which the
42
- * block opened there returns to its entry depth — i.e. the line carrying
43
- * the block's closing `}` — or -1 when the block never closes. The first
42
+ * block opened there returns to its entry depth, i.e. the line carrying
43
+ * the block's closing `}`, or -1 when the block never closes. The first
44
44
  * `{` encountered sets the entry depth, so the scan may start on the
45
45
  * selector/at-rule line itself rather than on the opener.
46
46
  */
@@ -48,7 +48,7 @@ export declare function findBlockCloseIndex(stripped: string[], startLine: numbe
48
48
  /**
49
49
  * Finds the closing `}` of the outermost
50
50
  * `@media (prefers-color-scheme: dark)` block. Used as the fallback
51
- * landing site when the scaffold has no nested `:root { }` — the
51
+ * landing site when the scaffold has no nested `:root { }`. The
52
52
  * insertion helper uses this index to splice a brand-new `:root`
53
53
  * wrapper containing the dark declaration, rather than dropping the
54
54
  * value.