@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
@@ -6,8 +6,8 @@ The `--json` surface is a contract with scripted consumers. Before 0.44.0 it
6
6
  was four unrelated shapes: `status --json` and `tree list --json` shared a
7
7
  `schemaVersion: 1` envelope but disagreed on failure, `test` emitted a
8
8
  `FIREFORGE-VERDICT:` line, and `lint --per-patch --report` wrote a versioned
9
- file nothing ever reads back. This file is the single statement of what a
10
- `--json` command must do, so the next one added does not invent a fifth.
9
+ file that nothing ever reads back. This file states what a `--json` command
10
+ has to do, so the next one added does not invent a fifth shape.
11
11
 
12
12
  ## The rules
13
13
 
@@ -16,22 +16,23 @@ file nothing ever reads back. This file is the single statement of what a
16
16
  2. **Failure writes exactly one error document to stdout**, of the shape
17
17
  `{ "schemaVersion": 1, "error": "<human message>", "code": "<tag>" }`,
18
18
  and then exits non-zero. The `error` text is the same sentence the
19
- non-JSON mode would print; `code` is a stable machine-readable tag
20
- (`engine-missing`, `engine-not-git`, `tree-list-failed`, …) that consumers
21
- may branch on.
19
+ non-JSON mode would print. `code` is a stable machine-readable tag
20
+ (`engine-missing`, `engine-not-git`, `tree-list-failed`, and so on) that
21
+ consumers may branch on.
22
22
  3. **Machine mode is engaged before any output.** `setMachineOutputMode(true)`
23
- must run before the first write, so every diagnostic — including one
24
- rendered later by `withErrorHandling` — routes to stderr and cannot
23
+ has to run before the first write, so that every diagnostic, including one
24
+ rendered later by `withErrorHandling`, goes to stderr and cannot
25
25
  interleave with the payload.
26
26
  4. **stdout carries nothing else.** No banners, no progress, no warnings.
27
27
  `logger.ts` enforces this through a single `routeToStderr()` gate that all
28
- its helpers consult, including `spinner()`, `note()` and `intro`/`outro`.
28
+ of its helpers consult, including `spinner()`, `note()` and
29
+ `intro`/`outro`.
29
30
 
30
31
  ## Implementation
31
32
 
32
33
  Use `emitMachineError` from `src/utils/machine-output.ts` for rule 2. It
33
34
  writes the envelope and throws `CommandError`, which the CLI boundary treats
34
- as already-rendered — so the boundary adds no second rendering on stderr.
35
+ as already rendered, so the boundary adds no second rendering on stderr.
35
36
 
36
37
  ```ts
37
38
  if (options.json === true) {
@@ -52,22 +53,24 @@ if (options.json === true) {
52
53
 
53
54
  ## Current surfaces
54
55
 
55
- | Surface | Shape | Notes |
56
- | ---------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
57
- | `status --json` | `{ schemaVersion: 1, … }` | Error envelope on three engine preconditions |
58
- | `tree list --json` | `{ schemaVersion: 1, trees }` | Error envelope added in 0.44.0 |
59
- | `test` verdict line | `FIREFORGE-VERDICT: PASS\|FAIL reason=… [log=<path>]` | Not JSON. A single final stdout line, sealed by `setStdoutSealed` so nothing can displace it. `log=` names the run's own complete output under `.fireforge/logs/`, so a piped or truncated run still leaves a re-readable artifact |
60
- | `lint --per-patch --report <path>` | `{ schemaVersion: 1, … }` | Written to a file, never read back by FireForge |
61
- | `status --raw` | `git status --porcelain` lines | Not JSON, but a machine surface: it engages the same stdout discipline, so rules 3 and 4 apply and rules 1 and 2 do not. A clean tree prints nothing |
62
- | `build` log announcement | `Full build output: <path>` | Not JSON. `build` prints no verdict line, so it names its run log directly on the way out |
63
-
64
- `--raw` is why `cli.ts` reads `process.argv` for `--json` **or** `--raw`
65
- before dispatching: rule 3 is about who owns stdout, and that question is
66
- settled the same way for a porcelain stream as for a JSON document.
56
+ | Surface | Shape | Notes |
57
+ | ---------------------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
58
+ | `status --json` | `{ schemaVersion: 1, … }` | Error envelope on three engine preconditions |
59
+ | `tree list --json` | `{ schemaVersion: 1, trees }` | Error envelope added in 0.44.0 |
60
+ | `token list --json` | `{ schemaVersion: 1, tokensCssPath, categories }` | Categories in file order, each with its tokens (`name`, `line`, `value`) |
61
+ | `token show --json` | `{ schemaVersion: 1, name, category, declarations }` | One entry per declaring block, with its selector trail and line |
62
+ | `test` verdict line | `FIREFORGE-VERDICT: PASS\|FAIL reason=… [note=<class>] [log=<path>]` | Not JSON. A single final stdout line, sealed by `setStdoutSealed` so nothing can displace it. `log=` names the run's own complete output under `.fireforge/logs/`, so a piped or truncated run still leaves a re-readable artifact |
63
+ | `lint --per-patch --report <path>` | `{ schemaVersion: 1, … }` | Written to a file, never read back by FireForge |
64
+ | `status --raw` | `git status --porcelain` lines | Not JSON, but still a machine surface: it engages the same stdout discipline, so rules 3 and 4 apply and rules 1 and 2 do not. A clean tree prints nothing |
65
+ | `build` log announcement | `Full build output: <path>` | Not JSON. `build` prints no verdict line, so it names its run log directly on the way out |
66
+
67
+ `--raw` is why `cli.ts` reads `process.argv` for `--json` or `--raw` before
68
+ dispatching. Rule 3 is about who owns stdout, and that question is settled
69
+ the same way for a porcelain stream as for a JSON document.
67
70
 
68
71
  `doctor` and `verify` have no `--json` mode. `doctor` already computes a
69
- serializable `DoctorCheck[]`, so adding one is cheap if a consumer asks —
70
- follow the rules above rather than inventing a shape.
72
+ serializable `DoctorCheck[]`, so adding one is cheap if a consumer asks for
73
+ it. Follow the rules above rather than inventing a shape.
71
74
 
72
75
  The run logs behind `log=` are specified in [`run-logs.md`](run-logs.md).
73
76
 
@@ -75,20 +78,41 @@ The run logs behind `log=` are specified in [`run-logs.md`](run-logs.md).
75
78
 
76
79
  `schemaVersion` is `MACHINE_OUTPUT_SCHEMA_VERSION` in
77
80
  `src/utils/machine-output.ts`. Additive changes (a new key) do not bump it.
78
- Removing or retyping a key does, and needs a note in the changelog naming
79
- what moved.
81
+ Removing or retyping a key does, and needs a changelog note saying what
82
+ moved.
80
83
 
81
84
  ## `test` verdict reasons
82
85
 
83
86
  `FIREFORGE-VERDICT: FAIL reason=<reason>` uses a closed set
84
87
  (`FireforgeVerdictReason`, `src/commands/test-verdict.ts`):
85
88
 
86
- | Reason | Meaning |
87
- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
88
- | `crash` | The harness or the browser died; no trustworthy suite result. |
89
- | `no-tests` | The run dispatched but nothing ran. |
90
- | `test-failures` | The suite ran and reported unexpected results. |
91
- | `preflight` | The run was refused before the harness was reached. |
92
- | `inconclusive` | A result exists but `engine/` moved under it, so it was discarded. |
93
- | `lock-timeout` | The run never started: the engine session lock stayed contended. |
94
- | `killed` | A signal terminated the run. Written from the signal handler so a log tail is always self-describing — a killed run must never be silent, or "killed", "still running" and "never started" become indistinguishable. |
89
+ | Reason | Meaning |
90
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
91
+ | `crash` | The harness or the browser died, so there is no trustworthy suite result. |
92
+ | `no-tests` | The run dispatched but nothing ran. |
93
+ | `test-failures` | The suite ran and reported unexpected results. |
94
+ | `preflight` | The run was refused before the harness was reached. |
95
+ | `inconclusive` | A result exists, but `engine/` moved under it, so the result was discarded. |
96
+ | `lock-timeout` | The run never started: the engine session lock stayed contended. |
97
+ | `killed` | A signal terminated the run. Written from the signal handler so that a log tail always describes itself. A killed run must never be silent, or "killed", "still running" and "never started" all look alike. |
98
+
99
+ ### The additive `note=` key
100
+
101
+ A `FAIL reason=preflight` line covers every gate before the harness: a
102
+ missing build, a peer's packaging record replacing this session's, a
103
+ developer browser holding the objdir. An unattended reader whose pipe kept
104
+ only the verdict line could not tell those apart, so a preflight refusal that
105
+ can classify itself also emits `note=<class>`.
106
+
107
+ `note=` is additive, like `log=`, `signal=` and `shards=`. `reason=` is
108
+ unchanged and still comes from the closed set above, so a consumer that
109
+ tokenises `key=value` pairs is unaffected, and a gate that names no class
110
+ emits no `note=` at all. The classes are not a closed set and may grow, so
111
+ consumers should treat an unrecognised one as opaque. Current values:
112
+ `stale-browser`, `stale-browser-kill-failed`, `marionette-port-busy`,
113
+ `coverage-replaced`, `stale-build`, `stale-components`.
114
+
115
+ A preflight refusal's own text is written to stdout before the verdict line,
116
+ and into the run log, so the verdict stays the last stdout write while the
117
+ reason survives both a redirect and a `tail`. See
118
+ [`run-logs.md`](run-logs.md).
@@ -2,9 +2,9 @@
2
2
 
3
3
  # Patch workflow
4
4
 
5
- The day-to-day loop: change code inside `engine/`, export it, keep the queue
6
- applying cleanly. `fireforge --help` remains the authority on flags; this file
7
- covers the behaviour that a flag list cannot state.
5
+ The day-to-day loop: change code inside `engine/`, export it, and keep the
6
+ queue applying cleanly. `fireforge --help` is the authority on flags. This
7
+ file covers the behavior a flag list cannot state.
8
8
 
9
9
  ## The loop
10
10
 
@@ -18,13 +18,13 @@ npx fireforge verify
18
18
 
19
19
  ## Exporting
20
20
 
21
- Patch names are normalized on export and rename: `window-chrome-tests`,
21
+ Patch names are normalized on export and rename, so `window-chrome-tests`,
22
22
  `ui-window-chrome-tests`, and `235-ui-window-chrome-tests` all resolve to the
23
23
  same `<order>-ui-window-chrome-tests.patch` shape.
24
24
 
25
- For large generated asset batches, `re-export --scan --scan-files <manifest>`
26
- assigns files to their owner patches without broad directory scanning. The
27
- manifest is JSON:
25
+ For large batches of generated assets, `re-export --scan --scan-files
26
+ <manifest>` assigns files to their owner patches without scanning whole
27
+ directories. The manifest is JSON:
28
28
 
29
29
  ```json
30
30
  {
@@ -34,75 +34,79 @@ manifest is JSON:
34
34
  }
35
35
  ```
36
36
 
37
- The command is dry-runnable, refuses ambiguous ownership, and reports each
37
+ The command can be dry-run, refuses ambiguous ownership, and reports each
38
38
  file-to-patch assignment before refreshing the patch.
39
39
 
40
- Scan-less `re-export` previews drift; `--refuse-foreign-drift --expect <path>`
41
- restricts it to intended files.
40
+ `re-export` without a scan previews drift. `--refuse-foreign-drift --expect
41
+ <path>` restricts it to the files you intended.
42
42
 
43
43
  ### Deletions
44
44
 
45
- A deleted upstream file is captured like any other change: a path that is
46
- tracked in HEAD but absent from disk stays in the diff scope, and the emitted
47
- patch carries a `deleted file mode` section. A captured deletion keeps its
48
- `filesAffected` entry — the patch is what performs the deletion, so pruning
49
- the entry would leave the body deleting a file the manifest says the patch has
50
- nothing to do with — and it still requires the confirmation, because the patch
51
- will remove those files wherever it is applied.
45
+ A deleted upstream file is captured like any other change: a path tracked in
46
+ HEAD but absent from disk stays in the diff scope, and the emitted patch
47
+ carries a `deleted file mode` section. A captured deletion keeps its
48
+ `filesAffected` entry, because the patch is what performs the deletion, and
49
+ pruning the entry would leave the body deleting a file the manifest says the
50
+ patch has nothing to do with. It also still requires the confirmation,
51
+ because the patch will remove those files wherever it is applied.
52
52
 
53
- An **untracked** absent path is refused rather than warned about: a patch
53
+ An untracked absent path is refused rather than warned about, because a patch
54
54
  cannot express it either way. The `--files` path also refuses when any
55
- requested path produces no hunk, checked against the full requested list
56
- rather than the post-filter subset, so nothing dropped upstream can pass as a
57
- silent success.
55
+ requested path produces no hunk. That is checked against the full requested
56
+ list rather than the subset left after filtering, so nothing dropped upstream
57
+ can pass as a silent success.
58
58
 
59
59
  ## Queue maintenance
60
60
 
61
61
  Under `fireforge patch`:
62
62
 
63
- - `patch compact` closes ordinal gaps (range-aware when `patchPolicy.ranges`
64
- is configured).
63
+ - `patch compact` closes ordinal gaps, and is range-aware when
64
+ `patchPolicy.ranges` is configured.
65
65
  - `patch reorder` moves a patch.
66
66
  - `patch split <source> --files <paths...> --name <name>` carves files out of
67
- a patch into a new one as a single transaction — including staged-dependency
68
- owner rewrites — with `--dry-run` support.
67
+ a patch into a new one as a single transaction, including staged-dependency
68
+ owner rewrites, and supports `--dry-run`.
69
69
  - `patch rename` also supports `--category` and `--order`.
70
70
 
71
- Every queue-mutating patch command accepts `--wait-lock [seconds]`; see
72
- [`configuration.md`](configuration.md#lock-waits) for how the budget resolves.
71
+ Every queue-mutating patch command accepts `--wait-lock [seconds]`. See
72
+ [`configuration.md`](configuration.md#lock-waits) for how the budget
73
+ resolves.
73
74
 
74
75
  ## Linting the queue
75
76
 
76
77
  `lint --per-patch --patches` accepts repeated flags, comma lists, full
77
- filenames/stems, manifest names, category-prefixed slugs, and bare slugs.
78
+ filenames or stems, bare order numbers, manifest names, category-prefixed
79
+ slugs, and bare slugs.
78
80
 
79
81
  `lint --per-patch --max-warnings 0` is the warning-clean form for a release
80
82
  gate.
81
83
 
82
84
  `lint --per-patch --report <path>` writes a machine-readable JSON report with
83
- each patch's line count, tier, active size thresholds, issues, and
84
- `lintIgnore`-suppressed issues. The size metrics
85
- (`countNonBinaryDiffLines`, `resolvePatchSizeTier`, `getPatchSizeThresholds`)
86
- are also exported on the programmatic API.
85
+ each patch's line count, tier, active size thresholds, issues, and issues
86
+ suppressed by `lintIgnore`. The size metrics (`countNonBinaryDiffLines`,
87
+ `resolvePatchSizeTier`, `getPatchSizeThresholds`) are also exported on the
88
+ programmatic API.
87
89
 
88
- Per-patch lint type-checks plain Firefox JS against a built-in Firefox-globals
89
- shim that tracks upstream WebIDL additions per release. See
90
+ Per-patch lint type-checks plain Firefox JS against a built-in
91
+ Firefox-globals shim that tracks upstream WebIDL additions per release. See
90
92
  [`configuration.md`](configuration.md#patchlint) for the project hooks
91
93
  (`checkJsExtraShim`, `checkJsTestFiles`, `checkJsTestShim`).
92
94
 
93
- For release whitespace checks, use `npm run whitespace:check`; it still checks
94
- source diffs while excluding generated `patches/*.patch` diff syntax.
95
+ For release whitespace checks, use `npm run whitespace:check`. It still
96
+ checks source diffs while excluding the diff syntax of generated
97
+ `patches/*.patch` files.
95
98
 
96
99
  ## CI enforcement
97
100
 
98
101
  `fireforge status --check` exits non-zero when any unmanaged, drifted, or
99
102
  conflicted file exists. `--fail-on <class,...>` tunes the policy set, and
100
- `--json` composes — the JSON stays parseable and its `files[]` entries name
101
- the owning `patch`. `--include-ownership` adds ownership rows to JSON status
102
- output.
103
+ `--json` composes with it: the JSON stays parseable and its `files[]` entries
104
+ name the owning `patch`. `--include-ownership` adds ownership rows to JSON
105
+ status output.
103
106
 
104
- The JSON shapes are specified in [`machine-output.md`](machine-output.md), and
105
- the codes a script should branch on in [`exit-codes.md`](exit-codes.md).
107
+ The JSON shapes are specified in [`machine-output.md`](machine-output.md),
108
+ and the codes a script should branch on in
109
+ [`exit-codes.md`](exit-codes.md).
106
110
 
107
111
  ## Rebasing onto a new Firefox source release
108
112
 
@@ -113,7 +117,7 @@ npx fireforge rebase
113
117
  ```
114
118
 
115
119
  If a patch fails, fix the reject inside `engine/`, then run
116
- `npx fireforge rebase --continue`. A rebase deliberately leaves the engine
117
- mutated, so its apply-and-persist pairs are held across a signal rather than
118
- rolled back — see invariant 4 in
120
+ `npx fireforge rebase --continue`. A rebase leaves the engine mutated on
121
+ purpose, so its apply-and-persist pairs are held across a signal rather than
122
+ rolled back. See invariant 4 in
119
123
  [`lifecycle-invariants.md`](lifecycle-invariants.md).
package/docs/run-logs.md CHANGED
@@ -9,43 +9,87 @@
9
9
  ## Why the tool holds the log, not the operator
10
10
 
11
11
  A run's diagnosis used to exist in exactly one place: the terminal. The
12
- ergonomic default when output is long — `fireforge test … 2>&1 | tail -40` —
13
- keeps the summary and discards the `TEST-UNEXPECTED-FAIL` lines that say WHAT
14
- broke, and it launders the exit code besides. Nothing else held the output:
15
- `runMachCapture` keeps a 2 MB in-memory tail that dies with the process, and
16
- the shard retry loop discards earlier attempts outright.
12
+ convenient thing to do when output is long is
13
+ `fireforge test … 2>&1 | tail -40`, which keeps the summary, discards the
14
+ `TEST-UNEXPECTED-FAIL` lines that say what broke, and launders the exit code
15
+ as well. Nothing else held the output: `runMachCapture` keeps a 2 MB
16
+ in-memory tail that dies with the process, and the shard retry loop discards
17
+ earlier attempts outright.
17
18
 
18
- The operator rule ("never pipe a run") was written down three times downstream
19
- and broken after each writing. That is the tell that it is not an operator
20
- problem — the tool is the only party that can make the log survive the
21
- mistake.
19
+ The operator rule ("never pipe a run") was written down three times
20
+ downstream and broken after each writing. That is a sign it is not an
21
+ operator problem. The tool is the only party that can make the log survive
22
+ the mistake.
22
23
 
23
24
  ## The contract
24
25
 
25
- - **Raw bytes, never the echo filter's collapsed form.** The artifact exists
26
- to be re-read by whoever is diagnosing the run; shortening it would
27
- reintroduce the loss it prevents.
26
+ - **Complete output, never the echo filter's collapsed form.** The artifact
27
+ exists so that whoever is diagnosing the run can re-read it. Shortening it
28
+ would bring back the loss it prevents. The one transformation applied is
29
+ the secret-masking pass below, which changes values but never line
30
+ structure.
31
+ - **Secret-shaped values are masked in the file, and only in the file.** The
32
+ terminal already showed every byte to the operator who ran the command. The
33
+ file is retained twenty deep and gets attached to bug reports, so it gets a
34
+ narrow redaction pass (`src/core/run-log-redact.ts`), applied per line
35
+ before the write. A line split across two chunks is held until its
36
+ terminator arrives (`\n`, or a lone `\r` from progress-bar repaints), or
37
+ until it exceeds 1 MiB, or until the log is closed. What gets redacted:
38
+ - The value of an env-style assignment `KEY=value` whose `KEY` matches
39
+ `/(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i`. The value up to the
40
+ next whitespace, or a whole quoted string, is written as
41
+ `KEY=<redacted>`. The `--password=x` and `-DAUTH_TOKEN=x` spellings that
42
+ mach and configure echo from their argv have the same shape and are
43
+ masked too.
44
+ - The credential of an `Authorization:` header. `Bearer`, `Basic` and
45
+ `Token` keep the scheme word. Any other value is masked whole.
46
+
47
+ Nothing else is masked. A bare token in a URL, a space-separated
48
+ `--password foo` argument, a JSON `"token": "…"` field, or a cookie all
49
+ pass through unchanged. The pass is a seatbelt against the common
50
+ accidental leak (mach echoing its environment), not a guarantee that a log
51
+ is free of secrets. Review a log before sharing it.
52
+
28
53
  - **Opened before any preflight**, so a refusal is logged too. Those are
29
54
  exactly the runs whose only output a `tail` throws away.
30
- - **Retained 20 deep per command kind.** Per-kind, so a busy `test` loop
55
+ - **Retained 20 deep per command kind.** Per kind, so that a busy `test` loop
31
56
  cannot evict the `build` log an operator needs to read beside it. Pruning
32
- runs before the new file is opened, and orders by the filename's
33
- timestamp rather than by stat-ing every entry.
34
- - **Timestamps are filesystem-safe**: the ISO form with `:` and `.` replaced
35
- by `-`, which Windows accepts and which still sorts chronologically.
57
+ runs before the new file is opened, and orders by the timestamp in the
58
+ filename rather than by stat-ing every entry.
59
+ - **Timestamps are filesystem-safe.** They use the ISO form with `:` and `.`
60
+ replaced by `-`, which Windows accepts and which still sorts
61
+ chronologically.
36
62
  - **Best-effort throughout.** A log that cannot be opened, written or pruned
37
- degrades to no log. A run must never fail over a diagnostic, so `openRunLog`
38
- returns `undefined` on failure, a post-open stream error latches `broken`
39
- and drops every later write, and pruning failures are logged verbosely
40
- only.
63
+ degrades to no log, because a run must never fail over a diagnostic.
64
+ `openRunLog` returns `undefined` on failure, a stream error after opening
65
+ latches `broken` and drops every later write, and pruning failures are
66
+ logged verbosely only. The entry point's SIGINT/SIGTERM path closes the
67
+ active log, also best-effort, before exiting, so the held partial line of a
68
+ killed run reaches disk.
69
+
70
+ ## Preflight refusals
71
+
72
+ `fireforge test` opens its run log before any preflight, so a refusal is
73
+ logged too. Those are exactly the runs whose only output a `tail` throws
74
+ away. The refusal's own explanatory text is written into the log, and to
75
+ stdout, before the verdict line seals stdout.
76
+
77
+ Both halves matter. The verdict seal routes everything the CLI error boundary
78
+ renders afterwards to stderr, so a run captured with `> file` used to keep
79
+ `FIREFORGE-VERDICT: FAIL reason=preflight` and nothing else. That rendering
80
+ also happens after the run log is closed, so the artifact the verdict's own
81
+ `log=` key pointed at held only the pre-test build. Writing before the seal
82
+ fixes both without giving up the contract: the reason lands on both channels,
83
+ and the verdict is still the run's last stdout line.
41
84
 
42
85
  ## Where the path is announced
43
86
 
44
87
  `test` publishes it as an additive `log=<path>` key on the
45
- `FIREFORGE-VERDICT:` line. That is forced, not chosen: the verdict must stay
46
- the run's LAST stdout write ([`machine-output.md`](machine-output.md)), so a
47
- separate announcement after it would break the contract, and one before it is
48
- the first thing a `tail` cuts.
88
+ `FIREFORGE-VERDICT:` line. That is forced rather than chosen: the verdict has
89
+ to stay the run's last stdout write (see
90
+ [`machine-output.md`](machine-output.md)), so a separate announcement after
91
+ it would break the contract, and one before it is the first thing a `tail`
92
+ cuts.
49
93
 
50
94
  `build` prints no verdict line, so it announces the path directly
51
95
  (`Full build output: <path>`).
@@ -54,7 +98,7 @@ the first thing a `tail` cuts.
54
98
 
55
99
  At the two mach capture funnels in `src/core/mach.ts`, not at the commands.
56
100
  That covers every dispatch: the three test dispatchers, `package`, and the
57
- stdio-inheriting path `mach build` uses — which rides the collectors' existing
101
+ stdio-inheriting path `mach build` uses, which rides the collectors' existing
58
102
  `mirror` hook rather than growing a second one. A new dispatcher added at the
59
- funnels is logged by construction; one added beside them is not, which is the
60
- reason to keep going through them.
103
+ funnels is logged automatically, and one added beside them is not, which is
104
+ the reason to keep going through them.