@hominis/fireforge 0.49.2 → 0.51.0

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 (400) hide show
  1. package/CHANGELOG.md +87 -1
  2. package/README.md +1 -1
  3. package/dist/bin/fireforge.js +6 -0
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/commands/build-prelock.d.ts +20 -0
  6. package/dist/src/commands/build-prelock.js +50 -0
  7. package/dist/src/commands/build.d.ts +3 -1
  8. package/dist/src/commands/build.js +13 -6
  9. package/dist/src/commands/check-report.d.ts +41 -0
  10. package/dist/src/commands/check-report.js +91 -0
  11. package/dist/src/commands/check-run.d.ts +33 -0
  12. package/dist/src/commands/check-run.js +112 -0
  13. package/dist/src/commands/check-steps.d.ts +75 -0
  14. package/dist/src/commands/check-steps.js +200 -0
  15. package/dist/src/commands/check.d.ts +32 -0
  16. package/dist/src/commands/check.js +160 -0
  17. package/dist/src/commands/config.js +5 -6
  18. package/dist/src/commands/declarations-report.d.ts +43 -0
  19. package/dist/src/commands/declarations-report.js +76 -0
  20. package/dist/src/commands/doctor-engine-eslint.js +6 -1
  21. package/dist/src/commands/doctor-source-pin.js +4 -1
  22. package/dist/src/commands/export-adopt-check.d.ts +38 -0
  23. package/dist/src/commands/export-adopt-check.js +98 -0
  24. package/dist/src/commands/export-flow.js +29 -14
  25. package/dist/src/commands/export-placement-gate.d.ts +6 -2
  26. package/dist/src/commands/export-placement-gate.js +8 -0
  27. package/dist/src/commands/export-shared.d.ts +2 -1
  28. package/dist/src/commands/export-staged-registration.d.ts +46 -0
  29. package/dist/src/commands/export-staged-registration.js +91 -0
  30. package/dist/src/commands/forward-import-remedy.d.ts +32 -0
  31. package/dist/src/commands/forward-import-remedy.js +63 -0
  32. package/dist/src/commands/furnace/apply.js +3 -3
  33. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +2 -1
  34. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  35. package/dist/src/commands/furnace/chrome-doc.d.ts +2 -1
  36. package/dist/src/commands/furnace/chrome-doc.js +2 -2
  37. package/dist/src/commands/furnace/create.js +2 -2
  38. package/dist/src/commands/furnace/deploy-named.d.ts +48 -0
  39. package/dist/src/commands/furnace/deploy-named.js +107 -0
  40. package/dist/src/commands/furnace/deploy.d.ts +3 -2
  41. package/dist/src/commands/furnace/deploy.js +50 -86
  42. package/dist/src/commands/furnace/diff.js +26 -3
  43. package/dist/src/commands/furnace/index.js +66 -41
  44. package/dist/src/commands/furnace/init.js +13 -6
  45. package/dist/src/commands/furnace/override.js +4 -2
  46. package/dist/src/commands/furnace/preview.js +4 -3
  47. package/dist/src/commands/furnace/refresh.js +2 -2
  48. package/dist/src/commands/furnace/remove.js +4 -3
  49. package/dist/src/commands/furnace/rename-dry-run.d.ts +29 -0
  50. package/dist/src/commands/furnace/rename-dry-run.js +127 -0
  51. package/dist/src/commands/furnace/rename-helpers.d.ts +7 -0
  52. package/dist/src/commands/furnace/rename-helpers.js +15 -1
  53. package/dist/src/commands/furnace/rename-registrations.d.ts +41 -0
  54. package/dist/src/commands/furnace/rename-registrations.js +98 -0
  55. package/dist/src/commands/furnace/rename.d.ts +2 -1
  56. package/dist/src/commands/furnace/rename.js +28 -66
  57. package/dist/src/commands/furnace/scan.d.ts +9 -4
  58. package/dist/src/commands/furnace/scan.js +11 -9
  59. package/dist/src/commands/furnace/sync.js +3 -2
  60. package/dist/src/commands/furnace/validate-report.d.ts +45 -0
  61. package/dist/src/commands/furnace/validate-report.js +91 -0
  62. package/dist/src/commands/furnace/validate.d.ts +1 -1
  63. package/dist/src/commands/furnace/validate.js +151 -113
  64. package/dist/src/commands/furnace/validation-output.js +14 -3
  65. package/dist/src/commands/lint-per-patch.js +36 -61
  66. package/dist/src/commands/lint-per-run-checkjs.js +2 -2
  67. package/dist/src/commands/lint-report.d.ts +8 -4
  68. package/dist/src/commands/lint-report.js +20 -5
  69. package/dist/src/commands/lint.js +15 -34
  70. package/dist/src/commands/manifest.js +4 -0
  71. package/dist/src/commands/park.d.ts +22 -0
  72. package/dist/src/commands/park.js +232 -0
  73. package/dist/src/commands/patch/delete-gap-notice.js +3 -1
  74. package/dist/src/commands/patch/delete.d.ts +1 -1
  75. package/dist/src/commands/patch/delete.js +24 -104
  76. package/dist/src/commands/patch/index.d.ts +3 -3
  77. package/dist/src/commands/patch/index.js +10 -4
  78. package/dist/src/commands/patch/lint-ignore-from.d.ts +44 -0
  79. package/dist/src/commands/patch/lint-ignore-from.js +142 -0
  80. package/dist/src/commands/patch/lint-ignore.d.ts +5 -1
  81. package/dist/src/commands/patch/lint-ignore.js +78 -31
  82. package/dist/src/commands/patch/move-files-create.js +34 -18
  83. package/dist/src/commands/patch/move-files-into.js +15 -7
  84. package/dist/src/commands/patch/move-files.js +6 -2
  85. package/dist/src/commands/patch/removal-created-files.d.ts +48 -0
  86. package/dist/src/commands/patch/removal-created-files.js +83 -0
  87. package/dist/src/commands/patch/removal-dependents.d.ts +63 -0
  88. package/dist/src/commands/patch/removal-dependents.js +133 -0
  89. package/dist/src/commands/patch/rename.js +20 -1
  90. package/dist/src/commands/patch/reserve.d.ts +33 -0
  91. package/dist/src/commands/patch/reserve.js +152 -0
  92. package/dist/src/commands/patch/retire.d.ts +34 -0
  93. package/dist/src/commands/patch/retire.js +133 -0
  94. package/dist/src/commands/patch/split-plan.d.ts +17 -8
  95. package/dist/src/commands/patch/split-plan.js +60 -28
  96. package/dist/src/commands/patch/split-staged.d.ts +108 -0
  97. package/dist/src/commands/patch/split-staged.js +202 -0
  98. package/dist/src/commands/patch/split.d.ts +5 -0
  99. package/dist/src/commands/patch/split.js +62 -17
  100. package/dist/src/commands/patch/stage.d.ts +34 -0
  101. package/dist/src/commands/patch/stage.js +153 -0
  102. package/dist/src/commands/patch/staged-dependency-batch.d.ts +48 -0
  103. package/dist/src/commands/patch/staged-dependency-batch.js +176 -0
  104. package/dist/src/commands/patch/staged-dependency-entries.d.ts +36 -0
  105. package/dist/src/commands/patch/staged-dependency-entries.js +52 -0
  106. package/dist/src/commands/patch/staged-dependency-from.d.ts +14 -0
  107. package/dist/src/commands/patch/staged-dependency-from.js +108 -0
  108. package/dist/src/commands/patch/staged-dependency-remove.d.ts +31 -0
  109. package/dist/src/commands/patch/staged-dependency-remove.js +80 -0
  110. package/dist/src/commands/patch/staged-dependency.js +54 -139
  111. package/dist/src/commands/re-export-adjacent-registrations.d.ts +20 -0
  112. package/dist/src/commands/re-export-adjacent-registrations.js +75 -0
  113. package/dist/src/commands/re-export-adjacent.d.ts +50 -2
  114. package/dist/src/commands/re-export-adjacent.js +160 -40
  115. package/dist/src/commands/re-export-bulk-scan.d.ts +2 -1
  116. package/dist/src/commands/re-export-bulk-scan.js +22 -7
  117. package/dist/src/commands/re-export-drift.d.ts +36 -8
  118. package/dist/src/commands/re-export-drift.js +73 -49
  119. package/dist/src/commands/re-export-files.js +11 -8
  120. package/dist/src/commands/re-export-hunks.d.ts +35 -0
  121. package/dist/src/commands/re-export-hunks.js +220 -0
  122. package/dist/src/commands/re-export-lint.d.ts +2 -1
  123. package/dist/src/commands/re-export-lint.js +23 -10
  124. package/dist/src/commands/re-export-options.js +74 -6
  125. package/dist/src/commands/re-export-preflight.d.ts +23 -0
  126. package/dist/src/commands/re-export-preflight.js +160 -0
  127. package/dist/src/commands/re-export-purity-scope.d.ts +18 -0
  128. package/dist/src/commands/re-export-purity-scope.js +131 -0
  129. package/dist/src/commands/re-export-register.js +56 -17
  130. package/dist/src/commands/re-export-removed.d.ts +13 -2
  131. package/dist/src/commands/re-export-removed.js +57 -12
  132. package/dist/src/commands/re-export-scan-owner.d.ts +44 -0
  133. package/dist/src/commands/re-export-scan-owner.js +116 -0
  134. package/dist/src/commands/re-export-scan.d.ts +19 -9
  135. package/dist/src/commands/re-export-scan.js +60 -24
  136. package/dist/src/commands/re-export-single.js +122 -46
  137. package/dist/src/commands/re-export-stale-registrations.d.ts +18 -0
  138. package/dist/src/commands/re-export-stale-registrations.js +62 -0
  139. package/dist/src/commands/re-export-summary.d.ts +28 -0
  140. package/dist/src/commands/re-export-summary.js +36 -0
  141. package/dist/src/commands/re-export.js +71 -57
  142. package/dist/src/commands/rebase/index.js +17 -17
  143. package/dist/src/commands/run.js +16 -2
  144. package/dist/src/commands/status-check.d.ts +55 -16
  145. package/dist/src/commands/status-check.js +92 -37
  146. package/dist/src/commands/status-json.d.ts +22 -9
  147. package/dist/src/commands/status-json.js +47 -32
  148. package/dist/src/commands/status-output.js +3 -1
  149. package/dist/src/commands/status-scope.d.ts +37 -0
  150. package/dist/src/commands/status-scope.js +54 -0
  151. package/dist/src/commands/status.js +66 -23
  152. package/dist/src/commands/test-browser-preflight.js +19 -3
  153. package/dist/src/commands/test-build-furnace.d.ts +22 -0
  154. package/dist/src/commands/test-build-furnace.js +54 -0
  155. package/dist/src/commands/test-build-phase.js +64 -41
  156. package/dist/src/commands/test-checkjs.js +10 -2
  157. package/dist/src/commands/test-diagnose.js +7 -0
  158. package/dist/src/commands/test-dispatch.d.ts +39 -0
  159. package/dist/src/commands/test-dispatch.js +211 -0
  160. package/dist/src/commands/test-furnace-reach.d.ts +37 -0
  161. package/dist/src/commands/test-furnace-reach.js +132 -0
  162. package/dist/src/commands/test-modes.d.ts +16 -1
  163. package/dist/src/commands/test-modes.js +24 -1
  164. package/dist/src/commands/test-multi-verdict.d.ts +61 -0
  165. package/dist/src/commands/test-multi-verdict.js +111 -0
  166. package/dist/src/commands/test-orchestrate.d.ts +52 -0
  167. package/dist/src/commands/test-orchestrate.js +240 -0
  168. package/dist/src/commands/test-perf-scope.d.ts +50 -0
  169. package/dist/src/commands/test-perf-scope.js +138 -0
  170. package/dist/src/commands/test-prelock.d.ts +51 -0
  171. package/dist/src/commands/test-prelock.js +273 -0
  172. package/dist/src/commands/test-register.js +69 -10
  173. package/dist/src/commands/test-results.d.ts +62 -0
  174. package/dist/src/commands/test-results.js +62 -0
  175. package/dist/src/commands/test-run.d.ts +13 -55
  176. package/dist/src/commands/test-run.js +74 -99
  177. package/dist/src/commands/test-shards.d.ts +110 -0
  178. package/dist/src/commands/test-shards.js +255 -0
  179. package/dist/src/commands/test-stale-gate.d.ts +5 -1
  180. package/dist/src/commands/test-stale-gate.js +60 -28
  181. package/dist/src/commands/test-verdict.d.ts +11 -1
  182. package/dist/src/commands/test-verdict.js +28 -1
  183. package/dist/src/commands/test.d.ts +6 -1
  184. package/dist/src/commands/test.js +120 -124
  185. package/dist/src/commands/token-lint.d.ts +14 -0
  186. package/dist/src/commands/token-lint.js +151 -0
  187. package/dist/src/commands/token.js +10 -0
  188. package/dist/src/commands/verify-scope.d.ts +28 -0
  189. package/dist/src/commands/verify-scope.js +67 -0
  190. package/dist/src/commands/verify.d.ts +10 -2
  191. package/dist/src/commands/verify.js +67 -36
  192. package/dist/src/core/build-baseline-types.d.ts +46 -0
  193. package/dist/src/core/build-baseline-validate.js +19 -0
  194. package/dist/src/core/build-baseline.d.ts +5 -1
  195. package/dist/src/core/build-baseline.js +3 -1
  196. package/dist/src/core/build-overwrite-guard.d.ts +50 -0
  197. package/dist/src/core/build-overwrite-guard.js +84 -4
  198. package/dist/src/core/build-prepare.d.ts +13 -0
  199. package/dist/src/core/build-prepare.js +42 -10
  200. package/dist/src/core/build-run-record.d.ts +74 -0
  201. package/dist/src/core/build-run-record.js +136 -0
  202. package/dist/src/core/checkjs-support-heads.d.ts +41 -0
  203. package/dist/src/core/checkjs-support-heads.js +104 -0
  204. package/dist/src/core/config-paths.d.ts +2 -2
  205. package/dist/src/core/config-paths.js +10 -0
  206. package/dist/src/core/config-validate-check.d.ts +8 -0
  207. package/dist/src/core/config-validate-check.js +219 -0
  208. package/dist/src/core/config-validate-file-size.d.ts +9 -6
  209. package/dist/src/core/config-validate-file-size.js +91 -2
  210. package/dist/src/core/config-validate-history.d.ts +11 -0
  211. package/dist/src/core/config-validate-history.js +38 -0
  212. package/dist/src/core/config-validate-patch-policy.js +100 -0
  213. package/dist/src/core/config-validate-test-toolchains.js +21 -0
  214. package/dist/src/core/config-validate-token-scales.d.ts +9 -0
  215. package/dist/src/core/config-validate-token-scales.js +92 -0
  216. package/dist/src/core/config-validate.js +20 -5
  217. package/dist/src/core/config.d.ts +5 -0
  218. package/dist/src/core/config.js +16 -0
  219. package/dist/src/core/coverage-dispatch.d.ts +24 -0
  220. package/dist/src/core/coverage-dispatch.js +44 -0
  221. package/dist/src/core/coverage-extend.d.ts +70 -45
  222. package/dist/src/core/coverage-extend.js +199 -144
  223. package/dist/src/core/coverage-records.d.ts +108 -0
  224. package/dist/src/core/coverage-records.js +384 -0
  225. package/dist/src/core/destructive.d.ts +7 -4
  226. package/dist/src/core/destructive.js +10 -10
  227. package/dist/src/core/engine-session-lock.d.ts +16 -1
  228. package/dist/src/core/engine-session-lock.js +38 -10
  229. package/dist/src/core/export-moved-code-shape.d.ts +49 -11
  230. package/dist/src/core/export-moved-code-shape.js +135 -44
  231. package/dist/src/core/file-lock-queue.d.ts +67 -0
  232. package/dist/src/core/file-lock-queue.js +221 -0
  233. package/dist/src/core/file-lock-shared.d.ts +57 -0
  234. package/dist/src/core/file-lock-shared.js +117 -0
  235. package/dist/src/core/file-lock.d.ts +13 -25
  236. package/dist/src/core/file-lock.js +163 -140
  237. package/dist/src/core/furnace-apply-output.d.ts +10 -0
  238. package/dist/src/core/furnace-apply-output.js +31 -1
  239. package/dist/src/core/furnace-apply.js +22 -12
  240. package/dist/src/core/furnace-composed-source.d.ts +76 -0
  241. package/dist/src/core/furnace-composed-source.js +167 -0
  242. package/dist/src/core/furnace-config-validate-exceptions.d.ts +16 -0
  243. package/dist/src/core/furnace-config-validate-exceptions.js +102 -0
  244. package/dist/src/core/furnace-config-validate.js +14 -0
  245. package/dist/src/core/furnace-css-fragments.d.ts +10 -0
  246. package/dist/src/core/furnace-css-fragments.js +26 -0
  247. package/dist/src/core/furnace-operation.d.ts +3 -3
  248. package/dist/src/core/furnace-registration-jar-inplace.d.ts +12 -0
  249. package/dist/src/core/furnace-registration-jar-inplace.js +80 -0
  250. package/dist/src/core/furnace-registration-remove.d.ts +22 -1
  251. package/dist/src/core/furnace-registration-remove.js +53 -17
  252. package/dist/src/core/furnace-registration-rename.d.ts +26 -0
  253. package/dist/src/core/furnace-registration-rename.js +77 -0
  254. package/dist/src/core/furnace-registration.d.ts +14 -4
  255. package/dist/src/core/furnace-registration.js +44 -10
  256. package/dist/src/core/furnace-staleness.d.ts +7 -0
  257. package/dist/src/core/furnace-staleness.js +34 -24
  258. package/dist/src/core/furnace-validate-accessibility.d.ts +8 -4
  259. package/dist/src/core/furnace-validate-accessibility.js +71 -28
  260. package/dist/src/core/furnace-validate-exceptions.d.ts +48 -0
  261. package/dist/src/core/furnace-validate-exceptions.js +80 -0
  262. package/dist/src/core/furnace-validate-icon-button.d.ts +7 -0
  263. package/dist/src/core/furnace-validate-icon-button.js +78 -0
  264. package/dist/src/core/furnace-validate.js +1 -1
  265. package/dist/src/core/harness-port-fallback.d.ts +60 -0
  266. package/dist/src/core/harness-port-fallback.js +96 -0
  267. package/dist/src/core/history-log-file.d.ts +61 -0
  268. package/dist/src/core/history-log-file.js +164 -0
  269. package/dist/src/core/history-log.d.ts +2 -1
  270. package/dist/src/core/history-log.js +2 -1
  271. package/dist/src/core/json-preserving-edit.d.ts +22 -0
  272. package/dist/src/core/json-preserving-edit.js +199 -0
  273. package/dist/src/core/line-prefixer.d.ts +18 -0
  274. package/dist/src/core/line-prefixer.js +34 -0
  275. package/dist/src/core/mach.d.ts +7 -0
  276. package/dist/src/core/mach.js +32 -10
  277. package/dist/src/core/module-resolution-preflight.d.ts +19 -3
  278. package/dist/src/core/module-resolution-preflight.js +24 -6
  279. package/dist/src/core/negative-control-compiled.d.ts +27 -0
  280. package/dist/src/core/negative-control-compiled.js +73 -0
  281. package/dist/src/core/negative-control-diff.d.ts +51 -0
  282. package/dist/src/core/negative-control-diff.js +179 -0
  283. package/dist/src/core/negative-control.d.ts +150 -0
  284. package/dist/src/core/negative-control.js +399 -0
  285. package/dist/src/core/objdir-install-manifests.d.ts +73 -0
  286. package/dist/src/core/objdir-install-manifests.js +226 -0
  287. package/dist/src/core/park-store.d.ts +63 -0
  288. package/dist/src/core/park-store.js +216 -0
  289. package/dist/src/core/patch-export-update.d.ts +6 -0
  290. package/dist/src/core/patch-export-update.js +13 -3
  291. package/dist/src/core/patch-export.d.ts +3 -2
  292. package/dist/src/core/patch-export.js +22 -16
  293. package/dist/src/core/patch-files.js +26 -8
  294. package/dist/src/core/patch-lint-checkjs-any-import.d.ts +39 -0
  295. package/dist/src/core/patch-lint-checkjs-any-import.js +63 -0
  296. package/dist/src/core/patch-lint-checkjs-diagnostics.d.ts +17 -0
  297. package/dist/src/core/patch-lint-checkjs-diagnostics.js +32 -0
  298. package/dist/src/core/patch-lint-checkjs.d.ts +10 -1
  299. package/dist/src/core/patch-lint-checkjs.js +20 -13
  300. package/dist/src/core/patch-lint-code-lines.d.ts +59 -0
  301. package/dist/src/core/patch-lint-code-lines.js +105 -0
  302. package/dist/src/core/patch-lint-cross.d.ts +3 -1
  303. package/dist/src/core/patch-lint-cross.js +17 -4
  304. package/dist/src/core/patch-lint-css.d.ts +8 -2
  305. package/dist/src/core/patch-lint-css.js +24 -14
  306. package/dist/src/core/patch-lint-file-size.d.ts +12 -5
  307. package/dist/src/core/patch-lint-file-size.js +22 -11
  308. package/dist/src/core/patch-lint-forward-registration-extended.d.ts +23 -0
  309. package/dist/src/core/patch-lint-forward-registration-extended.js +36 -11
  310. package/dist/src/core/patch-lint-forward-registration.js +10 -0
  311. package/dist/src/core/patch-lint-ignore.d.ts +196 -0
  312. package/dist/src/core/patch-lint-ignore.js +429 -0
  313. package/dist/src/core/patch-lint-ownership.d.ts +10 -0
  314. package/dist/src/core/patch-lint-ownership.js +26 -0
  315. package/dist/src/core/patch-lint-size-thresholds.d.ts +52 -0
  316. package/dist/src/core/patch-lint-size-thresholds.js +110 -0
  317. package/dist/src/core/patch-lint-size.d.ts +117 -0
  318. package/dist/src/core/patch-lint-size.js +331 -0
  319. package/dist/src/core/patch-lint-staged-registration.d.ts +18 -1
  320. package/dist/src/core/patch-lint-staged-registration.js +20 -0
  321. package/dist/src/core/patch-lint-token-scale.d.ts +57 -0
  322. package/dist/src/core/patch-lint-token-scale.js +286 -0
  323. package/dist/src/core/patch-lint.d.ts +11 -83
  324. package/dist/src/core/patch-lint.js +66 -288
  325. package/dist/src/core/patch-lock.js +7 -6
  326. package/dist/src/core/patch-manifest-consistency.js +7 -6
  327. package/dist/src/core/patch-manifest-io.d.ts +6 -3
  328. package/dist/src/core/patch-manifest-io.js +27 -9
  329. package/dist/src/core/patch-manifest-key-order.d.ts +24 -0
  330. package/dist/src/core/patch-manifest-key-order.js +61 -0
  331. package/dist/src/core/patch-manifest-stage.d.ts +46 -0
  332. package/dist/src/core/patch-manifest-stage.js +96 -0
  333. package/dist/src/core/patch-manifest-validate.js +61 -3
  334. package/dist/src/core/patch-order-legal.d.ts +26 -0
  335. package/dist/src/core/patch-order-legal.js +88 -0
  336. package/dist/src/core/patch-policy-content.d.ts +40 -0
  337. package/dist/src/core/patch-policy-content.js +216 -0
  338. package/dist/src/core/patch-policy.d.ts +22 -5
  339. package/dist/src/core/patch-policy.js +26 -12
  340. package/dist/src/core/patch-retired.d.ts +57 -0
  341. package/dist/src/core/patch-retired.js +92 -0
  342. package/dist/src/core/patch-subset.d.ts +16 -0
  343. package/dist/src/core/patch-subset.js +66 -0
  344. package/dist/src/core/preflight-wait.d.ts +20 -0
  345. package/dist/src/core/preflight-wait.js +38 -0
  346. package/dist/src/core/rebase-from-version.d.ts +46 -0
  347. package/dist/src/core/rebase-from-version.js +71 -0
  348. package/dist/src/core/run-log.d.ts +26 -0
  349. package/dist/src/core/run-log.js +106 -4
  350. package/dist/src/core/run-profile.d.ts +7 -0
  351. package/dist/src/core/run-profile.js +7 -1
  352. package/dist/src/core/smoke-patterns.d.ts +5 -0
  353. package/dist/src/core/smoke-patterns.js +13 -0
  354. package/dist/src/core/test-harness-crash.d.ts +19 -1
  355. package/dist/src/core/test-harness-crash.js +8 -9
  356. package/dist/src/core/test-harness-signature.d.ts +33 -0
  357. package/dist/src/core/test-harness-signature.js +23 -1
  358. package/dist/src/core/test-raw-log.d.ts +66 -0
  359. package/dist/src/core/test-raw-log.js +122 -0
  360. package/dist/src/core/test-run-completeness.d.ts +90 -0
  361. package/dist/src/core/test-run-completeness.js +184 -0
  362. package/dist/src/core/test-stale-check.d.ts +27 -1
  363. package/dist/src/core/test-stale-check.js +39 -49
  364. package/dist/src/core/test-stale-exempt.d.ts +40 -0
  365. package/dist/src/core/test-stale-exempt.js +70 -0
  366. package/dist/src/core/test-xpcshell-retry.d.ts +2 -0
  367. package/dist/src/core/test-xpcshell-retry.js +2 -1
  368. package/dist/src/core/token-lint.d.ts +53 -0
  369. package/dist/src/core/token-lint.js +131 -0
  370. package/dist/src/core/token-sibling-sheets.d.ts +46 -0
  371. package/dist/src/core/token-sibling-sheets.js +119 -0
  372. package/dist/src/core/tree-guard.js +5 -0
  373. package/dist/src/core/typecheck-shim.d.ts +6 -2
  374. package/dist/src/core/typecheck-shim.js +205 -4
  375. package/dist/src/core/typecheck.js +3 -1
  376. package/dist/src/index.d.ts +14 -3
  377. package/dist/src/index.js +6 -1
  378. package/dist/src/types/commands/index.d.ts +2 -2
  379. package/dist/src/types/commands/options.d.ts +212 -24
  380. package/dist/src/types/commands/patches.d.ts +118 -1
  381. package/dist/src/types/config.d.ts +264 -0
  382. package/dist/src/types/config.js +9 -0
  383. package/dist/src/types/furnace.d.ts +63 -1
  384. package/dist/src/types/furnace.js +7 -0
  385. package/dist/src/types/index.d.ts +1 -1
  386. package/dist/src/utils/options.d.ts +36 -7
  387. package/dist/src/utils/options.js +94 -8
  388. package/dist/src/utils/path-glob.d.ts +15 -0
  389. package/dist/src/utils/path-glob.js +47 -0
  390. package/dist/src/utils/regex.d.ts +15 -3
  391. package/dist/src/utils/regex.js +37 -16
  392. package/docs/configuration.md +369 -11
  393. package/docs/exit-codes.md +18 -1
  394. package/docs/furnace.md +139 -3
  395. package/docs/lifecycle-invariants.md +65 -30
  396. package/docs/machine-output.md +120 -12
  397. package/docs/patch-workflow.md +458 -22
  398. package/docs/run-logs.md +20 -1
  399. package/docs/testing.md +346 -21
  400. package/package.json +3 -3
@@ -68,9 +68,14 @@ export function stringListOption() {
68
68
  const DEFAULT_WAIT_LOCK_SECONDS = 60;
69
69
  /** Environment variable naming a standing wait budget for the whole session. */
70
70
  export const WAIT_LOCK_ENV_VAR = 'FIREFORGE_WAIT_LOCK';
71
- /** Bounds shared by the flag and the environment variable. */
71
+ /**
72
+ * Bounds shared by the flag and the environment variable. The ceiling is a
73
+ * day: on a shared engine a re-export or `test --build` queued behind a
74
+ * peer's long series can need more than the hour the cap used to be, and a
75
+ * longer wait then had to be a requeue after exit 15.
76
+ */
72
77
  const MIN_WAIT_LOCK_SECONDS = 1;
73
- const MAX_WAIT_LOCK_SECONDS = 3600;
78
+ export const MAX_WAIT_LOCK_SECONDS = 86_400;
74
79
  /**
75
80
  * Parses a wait budget from text, or undefined when it is not an integer in
76
81
  * range. Shared by the flag and {@link WAIT_LOCK_ENV_VAR} so the two cannot
@@ -115,7 +120,7 @@ function waitLockSecondsFromEnv() {
115
120
  * - absent (`undefined`) → {@link WAIT_LOCK_ENV_VAR} if set, else `undefined`
116
121
  * (the ~1 s fail-fast),
117
122
  * - bare flag (`true`) → {@link DEFAULT_WAIT_LOCK_SECONDS},
118
- * - explicit value → integer validated into 1..3600.
123
+ * - explicit value → integer validated into 1..86400.
119
124
  *
120
125
  * The flag always wins over the environment: the environment expresses a
121
126
  * default for a session, and an invocation that names a budget has said
@@ -151,11 +156,11 @@ export function resolveWaitLockSeconds(value) {
151
156
  * `--wait-lock` flag was threaded to. A furnace mutation takes the engine
152
157
  * session lock and then `.fireforge/furnace.lock`. Only the first had a
153
158
  * budget, so a contended deploy died on the file lock's fixed 30 s while
154
- * its operator believed a much larger budget was in force. Threading the
155
- * flag reaches the three furnace commands that declare it. This reaches
156
- * the twelve that do not (`create`, `remove`, `rename`, `refresh`, `scan`,
157
- * `override`, `chrome-doc`, …), which have no flag to thread but are just
158
- * as contended.
159
+ * its operator believed a much larger budget was in force. Every furnace
160
+ * leaf that takes the furnace lock threads its own `--wait-lock` into it;
161
+ * this is the fallback when the flag is absent, and the only budget for
162
+ * callers that do not thread one (doctor's furnace repair, the
163
+ * pre-build apply).
159
164
  *
160
165
  * Env-only: a flag belongs to one invocation and is passed
161
166
  * explicitly where it applies, while the environment is exactly the place a
@@ -204,9 +209,90 @@ export function ensureWaitLockOptionEverywhere(command) {
204
209
  // action can see it. Register the uniform flag only on actionable leaves.
205
210
  if (sub.commands.length === 0 && !hasWaitLockOption(sub))
206
211
  addAcceptedWaitLockOption(sub);
212
+ releasePathShapedOptionalValues(sub);
207
213
  ensureWaitLockOptionEverywhere(sub);
208
214
  }
209
215
  }
216
+ /**
217
+ * Optional-value flags whose value is a number and therefore never a path.
218
+ * `--canary [path]` is the counter-example that must stay out: its value IS
219
+ * a path.
220
+ */
221
+ const NUMERIC_OPTIONAL_VALUE_FLAGS = new Set([
222
+ '--wait-lock',
223
+ '--wait-browser',
224
+ '--wait-port',
225
+ '--shuffle',
226
+ ]);
227
+ /**
228
+ * True for a token that reads as a path rather than a number: it has a
229
+ * path separator or a file extension, or is `.`/`..`. A bare word such as
230
+ * `nonsense` is not path-shaped, so `--wait-lock nonsense` stays the usage
231
+ * error it always was.
232
+ */
233
+ export function isPathShapedArgument(token) {
234
+ if (/^\d+(?:\.\d+)?$/.test(token))
235
+ return false;
236
+ return token === '.' || token === '..' || /[\\/]/.test(token) || /\.[A-Za-z][\w-]*$/.test(token);
237
+ }
238
+ /**
239
+ * Rewrites a command's option tokens so a path-shaped argument after a
240
+ * numeric optional-value flag is an operand, and the flag takes its
241
+ * default.
242
+ *
243
+ * Commander binds the next non-dash token to an optional value, so
244
+ * `fireforge test --build --wait-lock browser_x.js` failed with
245
+ * "--wait-lock must be an integer in 1..86400 (got "browser_x.js")": the
246
+ * help says the value is optional, and the obvious spelling refused. The
247
+ * released flag moves to the end of the option section (before any `--`),
248
+ * where nothing follows it, so commander reads it bare. Operands keep their
249
+ * relative order. The value of a required-value option (`--mach-arg
250
+ * --wait-lock`) is never mistaken for a flag.
251
+ *
252
+ * @param argv - The tokens commander passes to `parseOptions`
253
+ * @param requiredValueFlags - This command's flags that always take a value
254
+ * @returns The rewritten tokens
255
+ */
256
+ export function releasePathShapedValues(argv, requiredValueFlags) {
257
+ const kept = [];
258
+ const released = [];
259
+ let index = 0;
260
+ for (; index < argv.length; index += 1) {
261
+ const token = argv[index] ?? '';
262
+ if (token === '--')
263
+ break;
264
+ const next = argv[index + 1];
265
+ if (requiredValueFlags.has(token) && next !== undefined) {
266
+ kept.push(token, next);
267
+ index += 1;
268
+ continue;
269
+ }
270
+ if (NUMERIC_OPTIONAL_VALUE_FLAGS.has(token) &&
271
+ next !== undefined &&
272
+ !next.startsWith('-') &&
273
+ isPathShapedArgument(next)) {
274
+ released.push(token);
275
+ continue;
276
+ }
277
+ kept.push(token);
278
+ }
279
+ return [...kept, ...released, ...argv.slice(index)];
280
+ }
281
+ /**
282
+ * Installs {@link releasePathShapedValues} on `command` when it registers
283
+ * any numeric optional-value flag.
284
+ */
285
+ function releasePathShapedOptionalValues(command) {
286
+ const flags = command.options.filter((option) => option.long !== undefined && NUMERIC_OPTIONAL_VALUE_FLAGS.has(option.long));
287
+ if (flags.length === 0)
288
+ return;
289
+ const requiredValueFlags = new Set(command.options
290
+ .filter((option) => option.required)
291
+ .flatMap((option) => [option.long, option.short])
292
+ .filter((flag) => flag !== undefined));
293
+ const parseOptions = command.parseOptions.bind(command);
294
+ command.parseOptions = (argv) => parseOptions(releasePathShapedValues(argv, requiredValueFlags));
295
+ }
210
296
  /**
211
297
  * Registers the shared `--wait-lock [seconds]` flag on a lock-taking
212
298
  * command (the engine session lock for engine-mutating commands, the patch
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Minimal path globs for policy config: `*` matches within one path segment,
3
+ * `?` one character of a segment, and `**` any number of whole segments
4
+ * (`a/**` is everything under `a/`, `**\/x` is `x` in any directory). A
5
+ * pattern is anchored at both ends against an engine-relative POSIX path;
6
+ * there is no basename-anywhere matching, so `*.toml` matches only top-level
7
+ * files and `**\/*.toml` matches them everywhere.
8
+ *
9
+ * Hand-rolled because the policy surface needs exactly this much and the
10
+ * package keeps its dependency list short.
11
+ */
12
+ /** Compiles one glob to an anchored regular expression. */
13
+ export declare function globToRegExp(glob: string): RegExp;
14
+ /** True when `path` matches at least one of `globs`. */
15
+ export declare function matchesAnyGlob(path: string, globs: readonly string[]): boolean;
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ /**
3
+ * Minimal path globs for policy config: `*` matches within one path segment,
4
+ * `?` one character of a segment, and `**` any number of whole segments
5
+ * (`a/**` is everything under `a/`, `**\/x` is `x` in any directory). A
6
+ * pattern is anchored at both ends against an engine-relative POSIX path;
7
+ * there is no basename-anywhere matching, so `*.toml` matches only top-level
8
+ * files and `**\/*.toml` matches them everywhere.
9
+ *
10
+ * Hand-rolled because the policy surface needs exactly this much and the
11
+ * package keeps its dependency list short.
12
+ */
13
+ import { escapeRegex } from './regex.js';
14
+ /** Compiles one glob to an anchored regular expression. */
15
+ export function globToRegExp(glob) {
16
+ let source = '';
17
+ for (let i = 0; i < glob.length; i++) {
18
+ const char = glob[i] ?? '';
19
+ if (char === '*' && glob[i + 1] === '*') {
20
+ const atSegmentStart = i === 0 || glob[i - 1] === '/';
21
+ const followedBySlash = glob[i + 2] === '/';
22
+ if (atSegmentStart && followedBySlash) {
23
+ // `**/` : zero or more leading directories.
24
+ source += '(?:[^/]+/)*';
25
+ i += 2;
26
+ }
27
+ else {
28
+ source += '.*';
29
+ i += 1;
30
+ }
31
+ }
32
+ else if (char === '*') {
33
+ source += '[^/]*';
34
+ }
35
+ else if (char === '?') {
36
+ source += '[^/]';
37
+ }
38
+ else {
39
+ source += escapeRegex(char);
40
+ }
41
+ }
42
+ return new RegExp(`^${source}$`);
43
+ }
44
+ /** True when `path` matches at least one of `globs`. */
45
+ export function matchesAnyGlob(path, globs) {
46
+ return globs.some((glob) => globToRegExp(glob).test(path));
47
+ }
@@ -16,11 +16,23 @@ export declare function hasRawCssColors(content: string): boolean;
16
16
  * implementation does not model them, so two adjacent slashes inside a regex
17
17
  * (the tail of `/https?:\/\//`) read as a `//` line comment and the rest of
18
18
  * the line is blanked, corrupting whatever lint pass consumes the stripped
19
- * text. Firefox chrome sources contain preprocessor directives (`#ifdef`)
20
- * and other constructs acorn cannot tokenize. Those fall back to the legacy
21
- * regex strip, which handles strings but not regex literals.
19
+ * text. The source is tokenized as a module, then as a script. Firefox
20
+ * chrome sources can contain constructs acorn tokenizes under neither goal.
21
+ * Those fall back to the legacy regex strip, which handles strings but not
22
+ * regex literals.
22
23
  */
23
24
  export declare function stripJsComments(source: string): string;
25
+ /**
26
+ * The tokenizer half of {@link stripJsComments}: the stripped source, or
27
+ * `null` when acorn can tokenize it neither as a module nor as a script.
28
+ *
29
+ * Module first, then script, because chrome subscripts are scripts: a
30
+ * legacy octal escape is a tokenizer error only under the module goal.
31
+ * Callers that must not under-count when tokenizing fails (the code-line
32
+ * size metric) read the `null` and pick their own fallback rather than the
33
+ * legacy regex strip, which can blank code.
34
+ */
35
+ export declare function stripJsCommentsParsed(source: string): string | null;
24
36
  /**
25
37
  * Counts the total number of raw CSS color values (hex, rgb, hsl) in content.
26
38
  */
@@ -32,16 +32,47 @@ export function hasRawCssColors(content) {
32
32
  * implementation does not model them, so two adjacent slashes inside a regex
33
33
  * (the tail of `/https?:\/\//`) read as a `//` line comment and the rest of
34
34
  * the line is blanked, corrupting whatever lint pass consumes the stripped
35
- * text. Firefox chrome sources contain preprocessor directives (`#ifdef`)
36
- * and other constructs acorn cannot tokenize. Those fall back to the legacy
37
- * regex strip, which handles strings but not regex literals.
35
+ * text. The source is tokenized as a module, then as a script. Firefox
36
+ * chrome sources can contain constructs acorn tokenizes under neither goal.
37
+ * Those fall back to the legacy regex strip, which handles strings but not
38
+ * regex literals.
38
39
  */
39
40
  export function stripJsComments(source) {
41
+ return stripJsCommentsParsed(source) ?? stripJsCommentsLegacy(source);
42
+ }
43
+ /**
44
+ * The tokenizer half of {@link stripJsComments}: the stripped source, or
45
+ * `null` when acorn can tokenize it neither as a module nor as a script.
46
+ *
47
+ * Module first, then script, because chrome subscripts are scripts: a
48
+ * legacy octal escape is a tokenizer error only under the module goal.
49
+ * Callers that must not under-count when tokenizing fails (the code-line
50
+ * size metric) read the `null` and pick their own fallback rather than the
51
+ * legacy regex strip, which can blank code.
52
+ */
53
+ export function stripJsCommentsParsed(source) {
54
+ const comments = collectJsComments(source, 'module') ?? collectJsComments(source, 'script');
55
+ if (comments === null)
56
+ return null;
57
+ if (comments.length === 0)
58
+ return source;
59
+ const chars = source.split('');
60
+ for (const { start, end } of comments) {
61
+ for (let i = start; i < end; i++) {
62
+ if (chars[i] !== '\n' && chars[i] !== '\r') {
63
+ chars[i] = ' ';
64
+ }
65
+ }
66
+ }
67
+ return chars.join('');
68
+ }
69
+ /** Comment ranges of `source` under one parse goal, or `null` on a tokenizer error. */
70
+ function collectJsComments(source, sourceType) {
40
71
  const comments = [];
41
72
  try {
42
73
  const t = acornTokenizer(source, {
43
74
  ecmaVersion: 'latest',
44
- sourceType: 'module',
75
+ sourceType,
45
76
  allowHashBang: true,
46
77
  onComment: (_isBlock, _text, start, end) => {
47
78
  comments.push({ start, end });
@@ -55,19 +86,9 @@ export function stripJsComments(source) {
55
86
  }
56
87
  }
57
88
  catch {
58
- return stripJsCommentsLegacy(source);
89
+ return null;
59
90
  }
60
- if (comments.length === 0)
61
- return source;
62
- const chars = source.split('');
63
- for (const { start, end } of comments) {
64
- for (let i = start; i < end; i++) {
65
- if (chars[i] !== '\n' && chars[i] !== '\r') {
66
- chars[i] = ' ';
67
- }
68
- }
69
- }
70
- return chars.join('');
91
+ return comments;
71
92
  }
72
93
  /**
73
94
  * Legacy pure-regex comment strip, used only when acorn cannot tokenize