@ebrindley/build 0.0.0-stage → 1.42.1-rc28

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 (878) hide show
  1. package/.build-project/providers/catalog.json +13951 -0
  2. package/.build-project/providers/pricing.json +1978 -0
  3. package/.build-project/providers/registry.json +4103 -0
  4. package/.github/SECURITY.md +75 -0
  5. package/.nvmrc +1 -0
  6. package/CHANGELOG.md +661 -0
  7. package/CODE_OF_CONDUCT.md +44 -0
  8. package/CONTRIBUTING.md +24 -0
  9. package/INSTALL.md +623 -0
  10. package/LICENSE +21 -0
  11. package/README.md +118 -2
  12. package/THIRD_PARTY_NOTICES.txt +26 -0
  13. package/dist/ai-judge-UE5UOYOO.js +191 -0
  14. package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
  15. package/dist/allowlist-utils-MZZKKXRD.js +31 -0
  16. package/dist/apply-completion-mode-EM37UZHB.js +110 -0
  17. package/dist/artifact-migrator-WPACNSEP.js +276 -0
  18. package/dist/ask-2OZ4JFQR.js +176 -0
  19. package/dist/auth-6UKBTJUQ.js +185 -0
  20. package/dist/auth-H5KJL6HL.js +165 -0
  21. package/dist/auth-LVJRJDMU.js +12 -0
  22. package/dist/auth-NHZOCNRR.js +94 -0
  23. package/dist/auth-PBXHWXGW.js +95 -0
  24. package/dist/auth-T7Y5DCAH.js +91 -0
  25. package/dist/auth-TVVKCHQW.js +13 -0
  26. package/dist/auth-UHB2UCSS.js +97 -0
  27. package/dist/auth-VACA3VUL.js +98 -0
  28. package/dist/auth-VVLC77S3.js +44 -0
  29. package/dist/auth-liveness-XO4AGDDD.js +53 -0
  30. package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
  31. package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
  32. package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
  33. package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
  34. package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
  35. package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
  36. package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
  37. package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
  38. package/dist/autoloop-success-C32QVWOP.js +93 -0
  39. package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
  40. package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
  41. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  42. package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
  43. package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
  44. package/dist/backend-YUTFDZXZ.js +30 -0
  45. package/dist/background-executor-Z3ODTMD7.js +260 -0
  46. package/dist/backlog-75QPEAMW.js +403 -0
  47. package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
  48. package/dist/backup-active-store-XHWLN34M.js +16 -0
  49. package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
  50. package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
  51. package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
  52. package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
  53. package/dist/build-gate-7NKWPY62.js +68 -0
  54. package/dist/build-root-S7DINODY.js +18 -0
  55. package/dist/change-summary-R6CB6VXJ.js +50 -0
  56. package/dist/chunk-24MNKKOM.js +173 -0
  57. package/dist/chunk-2H6VZFIO.js +235 -0
  58. package/dist/chunk-2JIX3EKV.js +39 -0
  59. package/dist/chunk-2KO7HVZM.js +106 -0
  60. package/dist/chunk-2L36U25O.js +100 -0
  61. package/dist/chunk-2NMNFUQA.js +475 -0
  62. package/dist/chunk-2OUAEH67.js +83 -0
  63. package/dist/chunk-2VLJUXJU.js +115 -0
  64. package/dist/chunk-2VUEDIUM.js +77 -0
  65. package/dist/chunk-2Y2IIHPI.js +430 -0
  66. package/dist/chunk-2YRG3LHZ.js +220 -0
  67. package/dist/chunk-2Z5Q3SUY.js +65 -0
  68. package/dist/chunk-32IYXIE5.js +873 -0
  69. package/dist/chunk-33IGPPUI.js +292 -0
  70. package/dist/chunk-352PCJLK.js +283 -0
  71. package/dist/chunk-35J4NE6S.js +226 -0
  72. package/dist/chunk-3C7WBIVK.js +1016 -0
  73. package/dist/chunk-3H3EY6U7.js +1225 -0
  74. package/dist/chunk-3H4MWYIC.js +198 -0
  75. package/dist/chunk-3HHWQR3N.js +2479 -0
  76. package/dist/chunk-3JKNRYEE.js +14 -0
  77. package/dist/chunk-3LECCYZY.js +128 -0
  78. package/dist/chunk-3LOY6YZI.js +852 -0
  79. package/dist/chunk-3M57DADF.js +44 -0
  80. package/dist/chunk-3NOTLVLG.js +3803 -0
  81. package/dist/chunk-3OPP2OZB.js +1480 -0
  82. package/dist/chunk-3P5IN5E7.js +9 -0
  83. package/dist/chunk-3PL22IYZ.js +20 -0
  84. package/dist/chunk-3REDAJUJ.js +14 -0
  85. package/dist/chunk-3S2R4XJI.js +203 -0
  86. package/dist/chunk-3UBZI5DW.js +61 -0
  87. package/dist/chunk-3VV5OBGG.js +308 -0
  88. package/dist/chunk-3WY5TU2O.js +823 -0
  89. package/dist/chunk-43OKHTW4.js +82 -0
  90. package/dist/chunk-45KUJBDI.js +112 -0
  91. package/dist/chunk-47X5LM7B.js +224 -0
  92. package/dist/chunk-4B6FQJ77.js +268 -0
  93. package/dist/chunk-4BTDUT2S.js +42 -0
  94. package/dist/chunk-4DJL2VXA.js +24 -0
  95. package/dist/chunk-4EBSXZ73.js +48 -0
  96. package/dist/chunk-4QKP6I4C.js +294 -0
  97. package/dist/chunk-4U6XK2DG.js +300 -0
  98. package/dist/chunk-4UMRUFBD.js +132 -0
  99. package/dist/chunk-4US4SYJ4.js +569 -0
  100. package/dist/chunk-4ZPLWEZO.js +154 -0
  101. package/dist/chunk-56WPYDJH.js +624 -0
  102. package/dist/chunk-57WRCJJW.js +50 -0
  103. package/dist/chunk-5AW4RMNG.js +24 -0
  104. package/dist/chunk-5EQN56OZ.js +155 -0
  105. package/dist/chunk-5F43TUIN.js +38 -0
  106. package/dist/chunk-5FKHIKTS.js +115 -0
  107. package/dist/chunk-5HDP7XZG.js +91 -0
  108. package/dist/chunk-5KQETTNS.js +152 -0
  109. package/dist/chunk-5PDVN2KO.js +498 -0
  110. package/dist/chunk-5UBIFVRD.js +509 -0
  111. package/dist/chunk-5YDE3Q62.js +46 -0
  112. package/dist/chunk-626AJVMU.js +302 -0
  113. package/dist/chunk-633XZ7UF.js +3583 -0
  114. package/dist/chunk-63DHNHGA.js +236 -0
  115. package/dist/chunk-666656AR.js +568 -0
  116. package/dist/chunk-67YRJPJO.js +19 -0
  117. package/dist/chunk-6CAU7VBA.js +20 -0
  118. package/dist/chunk-6CB3KJRY.js +21 -0
  119. package/dist/chunk-6DBMALXL.js +29 -0
  120. package/dist/chunk-6E25C4IA.js +269 -0
  121. package/dist/chunk-6FIBNIQU.js +73 -0
  122. package/dist/chunk-6G57FYBV.js +189 -0
  123. package/dist/chunk-6KZKRTG3.js +4885 -0
  124. package/dist/chunk-6LAH2UV2.js +525 -0
  125. package/dist/chunk-6PZY2TTU.js +921 -0
  126. package/dist/chunk-6T6NHXK4.js +230 -0
  127. package/dist/chunk-6TBEX4R4.js +432 -0
  128. package/dist/chunk-6TRD7TEE.js +911 -0
  129. package/dist/chunk-6XCP2RAI.js +47 -0
  130. package/dist/chunk-726G6WDL.js +351 -0
  131. package/dist/chunk-75EMT7BF.js +616 -0
  132. package/dist/chunk-762ACDZJ.js +4696 -0
  133. package/dist/chunk-77I6G4CO.js +1 -0
  134. package/dist/chunk-7DJ6SQH3.js +510 -0
  135. package/dist/chunk-7HPCIOMA.js +1383 -0
  136. package/dist/chunk-7HYBSRPZ.js +17503 -0
  137. package/dist/chunk-7KBEOPVB.js +73 -0
  138. package/dist/chunk-7LHJDJB3.js +2222 -0
  139. package/dist/chunk-7NVJMH52.js +306 -0
  140. package/dist/chunk-7RMARDVH.js +33 -0
  141. package/dist/chunk-7SEWU4QG.js +36 -0
  142. package/dist/chunk-7TUTZTI2.js +911 -0
  143. package/dist/chunk-7VBDFPUM.js +340 -0
  144. package/dist/chunk-7VRJHTGZ.js +6406 -0
  145. package/dist/chunk-7YAOUUKK.js +493 -0
  146. package/dist/chunk-AAAODV76.js +860 -0
  147. package/dist/chunk-AB4HUJVQ.js +339 -0
  148. package/dist/chunk-AEQWV746.js +611 -0
  149. package/dist/chunk-AHU3FKPA.js +11639 -0
  150. package/dist/chunk-AISTV5XU.js +226 -0
  151. package/dist/chunk-AJBTKGJZ.js +48 -0
  152. package/dist/chunk-AJJNW7XT.js +248 -0
  153. package/dist/chunk-AJN5Y5YZ.js +160 -0
  154. package/dist/chunk-ALDTFNZ3.js +150 -0
  155. package/dist/chunk-ARARVIZK.js +281 -0
  156. package/dist/chunk-ATBM6AW5.js +53 -0
  157. package/dist/chunk-ATKEKM3E.js +206 -0
  158. package/dist/chunk-AUJLW6JZ.js +92 -0
  159. package/dist/chunk-AY3MHEFM.js +24 -0
  160. package/dist/chunk-B7PYTV72.js +236 -0
  161. package/dist/chunk-B7YRSULE.js +1423 -0
  162. package/dist/chunk-BAWJNMWF.js +339 -0
  163. package/dist/chunk-BBPIILO2.js +88 -0
  164. package/dist/chunk-BD3PGW6A.js +957 -0
  165. package/dist/chunk-BDPYFAB4.js +44 -0
  166. package/dist/chunk-BIUV23HH.js +729 -0
  167. package/dist/chunk-BQ3VAGXH.js +243 -0
  168. package/dist/chunk-BQJOGAWT.js +31 -0
  169. package/dist/chunk-BT7EG7CO.js +68 -0
  170. package/dist/chunk-BV3XQQLU.js +27 -0
  171. package/dist/chunk-BY6ODHNZ.js +78 -0
  172. package/dist/chunk-BZRLSZNV.js +79 -0
  173. package/dist/chunk-C3DH3NCY.js +2773 -0
  174. package/dist/chunk-C3KCMAJP.js +756 -0
  175. package/dist/chunk-C7AGUJ5K.js +267 -0
  176. package/dist/chunk-CBSWKQCX.js +342 -0
  177. package/dist/chunk-CE5OZBYY.js +21 -0
  178. package/dist/chunk-CFCVYHSW.js +373 -0
  179. package/dist/chunk-CHA2HDE5.js +126 -0
  180. package/dist/chunk-CIHWPGS5.js +146 -0
  181. package/dist/chunk-CJBSZX3F.js +127 -0
  182. package/dist/chunk-CLA6QIJM.js +43 -0
  183. package/dist/chunk-CPSVQR2I.js +365 -0
  184. package/dist/chunk-CRPRVNQ4.js +254 -0
  185. package/dist/chunk-CSIE4Y7C.js +1093 -0
  186. package/dist/chunk-CSOPSYDY.js +142 -0
  187. package/dist/chunk-CSXLLEGB.js +205 -0
  188. package/dist/chunk-CTDLERWU.js +293 -0
  189. package/dist/chunk-CULBXMSK.js +110 -0
  190. package/dist/chunk-D2M2Y5ID.js +21 -0
  191. package/dist/chunk-D37WY7SH.js +1060 -0
  192. package/dist/chunk-D4VJFCGZ.js +89 -0
  193. package/dist/chunk-D6WTZMZB.js +48 -0
  194. package/dist/chunk-DBHOWDUH.js +976 -0
  195. package/dist/chunk-DCACX7BV.js +19364 -0
  196. package/dist/chunk-DFHX4XYA.js +128 -0
  197. package/dist/chunk-DIKBRRKE.js +176 -0
  198. package/dist/chunk-DJG5RIOR.js +9 -0
  199. package/dist/chunk-DNIOIISW.js +616 -0
  200. package/dist/chunk-DOA5G7IA.js +315 -0
  201. package/dist/chunk-DP7FKP6W.js +855 -0
  202. package/dist/chunk-DS2JZ677.js +79 -0
  203. package/dist/chunk-DSRLVYBS.js +82 -0
  204. package/dist/chunk-EAEVKNJA.js +209 -0
  205. package/dist/chunk-EEUESN3T.js +575 -0
  206. package/dist/chunk-EJ4LUU5Y.js +73 -0
  207. package/dist/chunk-EJIWTPSZ.js +1063 -0
  208. package/dist/chunk-EJVCDTAN.js +116 -0
  209. package/dist/chunk-EKLUBDBQ.js +627 -0
  210. package/dist/chunk-EN62WLFD.js +849 -0
  211. package/dist/chunk-ENYRCL43.js +26 -0
  212. package/dist/chunk-EP22ZMFO.js +273 -0
  213. package/dist/chunk-EP4SVAVI.js +87 -0
  214. package/dist/chunk-EPAMVGI3.js +1562 -0
  215. package/dist/chunk-EPRMH6HO.js +24 -0
  216. package/dist/chunk-ES6NWJ36.js +4057 -0
  217. package/dist/chunk-ETA2K4KI.js +30 -0
  218. package/dist/chunk-ETAD4NKD.js +31 -0
  219. package/dist/chunk-EUWIIDQ7.js +93 -0
  220. package/dist/chunk-EVE3OD2W.js +141 -0
  221. package/dist/chunk-EXA26FFC.js +459 -0
  222. package/dist/chunk-EXSPAA35.js +244 -0
  223. package/dist/chunk-F55YABKV.js +258 -0
  224. package/dist/chunk-F5DNGU5W.js +27 -0
  225. package/dist/chunk-F622MJYV.js +103 -0
  226. package/dist/chunk-F6NIQD74.js +5111 -0
  227. package/dist/chunk-FAWJTC34.js +43 -0
  228. package/dist/chunk-FAZBRHGG.js +47 -0
  229. package/dist/chunk-FIEUSGNJ.js +39 -0
  230. package/dist/chunk-FKCG7K6H.js +1146 -0
  231. package/dist/chunk-FOVVXV45.js +229 -0
  232. package/dist/chunk-FRBPKBFE.js +30 -0
  233. package/dist/chunk-FSA5BPFI.js +268 -0
  234. package/dist/chunk-FSJ5TTZ3.js +29 -0
  235. package/dist/chunk-FT7SGLXT.js +193 -0
  236. package/dist/chunk-FUUVZZUB.js +62 -0
  237. package/dist/chunk-FYMRVUNZ.js +1697 -0
  238. package/dist/chunk-FYTAA5FG.js +162 -0
  239. package/dist/chunk-G3VB2UCZ.js +3892 -0
  240. package/dist/chunk-G6OIMVXH.js +405 -0
  241. package/dist/chunk-G7PQCXVH.js +228 -0
  242. package/dist/chunk-GAB6UW52.js +1087 -0
  243. package/dist/chunk-GAFJEYLK.js +29 -0
  244. package/dist/chunk-GC4CRMTS.js +642 -0
  245. package/dist/chunk-GFHSIWHL.js +5297 -0
  246. package/dist/chunk-GI5M67YA.js +735 -0
  247. package/dist/chunk-GIJWHUWF.js +191 -0
  248. package/dist/chunk-GO6DRECI.js +1 -0
  249. package/dist/chunk-GOFVBTMN.js +314 -0
  250. package/dist/chunk-GQIP72ZJ.js +13 -0
  251. package/dist/chunk-GQXLXRFA.js +28 -0
  252. package/dist/chunk-GT6HFKJB.js +48 -0
  253. package/dist/chunk-GVJGSSKM.js +174 -0
  254. package/dist/chunk-GWHGTG37.js +36 -0
  255. package/dist/chunk-GZAJHLKO.js +18 -0
  256. package/dist/chunk-GZK62I3N.js +314 -0
  257. package/dist/chunk-H3HGMISG.js +483 -0
  258. package/dist/chunk-H3ISZJMJ.js +403 -0
  259. package/dist/chunk-H4HXVWEC.js +9 -0
  260. package/dist/chunk-H6MJGKAW.js +120 -0
  261. package/dist/chunk-HBTTGVR5.js +353 -0
  262. package/dist/chunk-HBZ322WZ.js +35 -0
  263. package/dist/chunk-HEP3ILP4.js +34 -0
  264. package/dist/chunk-HGFXODKO.js +106 -0
  265. package/dist/chunk-HHWDTB6S.js +59 -0
  266. package/dist/chunk-HKO45NLZ.js +286 -0
  267. package/dist/chunk-HLVTEA6A.js +89 -0
  268. package/dist/chunk-HS3SY6HN.js +160 -0
  269. package/dist/chunk-HT5OCGKN.js +899 -0
  270. package/dist/chunk-HXIIEMGF.js +78 -0
  271. package/dist/chunk-I56TH7VM.js +46 -0
  272. package/dist/chunk-I6FN3R5D.js +352 -0
  273. package/dist/chunk-I7SCBHJN.js +655 -0
  274. package/dist/chunk-IJM4GKAT.js +529 -0
  275. package/dist/chunk-IMEYU36R.js +344 -0
  276. package/dist/chunk-INJ3SS6A.js +936 -0
  277. package/dist/chunk-IUKOPCCE.js +441 -0
  278. package/dist/chunk-IVEPZQJO.js +33 -0
  279. package/dist/chunk-IVZEONFC.js +43 -0
  280. package/dist/chunk-IWBHRSG7.js +936 -0
  281. package/dist/chunk-IYY3HQAD.js +484 -0
  282. package/dist/chunk-J2ICMYDA.js +48 -0
  283. package/dist/chunk-J2QCFLUN.js +505 -0
  284. package/dist/chunk-J5HM6V5P.js +1039 -0
  285. package/dist/chunk-J6NZX6QH.js +398 -0
  286. package/dist/chunk-JBBB2Y47.js +432 -0
  287. package/dist/chunk-JDCZQZU7.js +42 -0
  288. package/dist/chunk-JEDNXGSS.js +169 -0
  289. package/dist/chunk-JHP7OT6K.js +89 -0
  290. package/dist/chunk-JLS65NUQ.js +14 -0
  291. package/dist/chunk-JNMWYMC6.js +38 -0
  292. package/dist/chunk-JNSTWNNW.js +25 -0
  293. package/dist/chunk-JOSK6GEU.js +9564 -0
  294. package/dist/chunk-JQUMSIGC.js +100 -0
  295. package/dist/chunk-JVHGMURQ.js +1106 -0
  296. package/dist/chunk-JYXS47FQ.js +951 -0
  297. package/dist/chunk-K2ZMW2Z5.js +2147 -0
  298. package/dist/chunk-K7FAFORM.js +14 -0
  299. package/dist/chunk-KBJXX3ON.js +333 -0
  300. package/dist/chunk-KHFKVQWY.js +486 -0
  301. package/dist/chunk-KHMEI3DQ.js +173 -0
  302. package/dist/chunk-KHW3UD7B.js +69 -0
  303. package/dist/chunk-KKQKWAMF.js +365 -0
  304. package/dist/chunk-KOKXJV2U.js +455 -0
  305. package/dist/chunk-KQ4NGOJI.js +14 -0
  306. package/dist/chunk-KQYQOXMS.js +342 -0
  307. package/dist/chunk-KTMW65UX.js +14 -0
  308. package/dist/chunk-KUEWV2JH.js +593 -0
  309. package/dist/chunk-KXYDV3HP.js +1523 -0
  310. package/dist/chunk-KZ4JMGZ5.js +96 -0
  311. package/dist/chunk-KZWGBUIO.js +2659 -0
  312. package/dist/chunk-L2CBG5IX.js +1892 -0
  313. package/dist/chunk-L2S235CU.js +314 -0
  314. package/dist/chunk-L32WD57F.js +98 -0
  315. package/dist/chunk-LDJCKAJP.js +123 -0
  316. package/dist/chunk-LDWNBEN7.js +541 -0
  317. package/dist/chunk-LJVH57G2.js +241 -0
  318. package/dist/chunk-LPQ7NZEN.js +209 -0
  319. package/dist/chunk-LRGH3CCV.js +148 -0
  320. package/dist/chunk-LULOGMMM.js +1133 -0
  321. package/dist/chunk-LWGKN2GY.js +8284 -0
  322. package/dist/chunk-LX4F24ZH.js +157 -0
  323. package/dist/chunk-M4BUEXXF.js +839 -0
  324. package/dist/chunk-M6UHOC4I.js +553 -0
  325. package/dist/chunk-MCBNWZNO.js +657 -0
  326. package/dist/chunk-MEMSY6VY.js +223 -0
  327. package/dist/chunk-MHLEZQQI.js +145 -0
  328. package/dist/chunk-MJ6WNSIX.js +192 -0
  329. package/dist/chunk-MKASIKWZ.js +442 -0
  330. package/dist/chunk-MNOVBYFU.js +60 -0
  331. package/dist/chunk-MO2BYAAF.js +2896 -0
  332. package/dist/chunk-MP6P7Y2A.js +180 -0
  333. package/dist/chunk-MQ4TFJAG.js +3365 -0
  334. package/dist/chunk-MT2WAIR3.js +131 -0
  335. package/dist/chunk-MTU7VTNN.js +1122 -0
  336. package/dist/chunk-MULMXX4V.js +150 -0
  337. package/dist/chunk-MW2DWWVA.js +147 -0
  338. package/dist/chunk-MY3ZPUN4.js +151 -0
  339. package/dist/chunk-MYLH2S4G.js +64 -0
  340. package/dist/chunk-MZ5WYKNA.js +28 -0
  341. package/dist/chunk-N3Q2JNPV.js +249 -0
  342. package/dist/chunk-N5DX4JAK.js +12 -0
  343. package/dist/chunk-NAINGKHF.js +35 -0
  344. package/dist/chunk-NEQUQHOX.js +223 -0
  345. package/dist/chunk-NHNPEZS4.js +1408 -0
  346. package/dist/chunk-NHTIXJCR.js +17 -0
  347. package/dist/chunk-NKLPMBNV.js +1154 -0
  348. package/dist/chunk-NMVZ5YES.js +199 -0
  349. package/dist/chunk-NRFRY3GE.js +256 -0
  350. package/dist/chunk-NTD6CSI6.js +1266 -0
  351. package/dist/chunk-NUO7B3SH.js +318 -0
  352. package/dist/chunk-NVOHIJKG.js +1319 -0
  353. package/dist/chunk-NXH3RX7O.js +523 -0
  354. package/dist/chunk-NXZ3DURF.js +257 -0
  355. package/dist/chunk-O26L6F7F.js +209 -0
  356. package/dist/chunk-O5RRIUEP.js +124 -0
  357. package/dist/chunk-O5X6BKAO.js +10 -0
  358. package/dist/chunk-O6ZQUVTR.js +31 -0
  359. package/dist/chunk-O7FE75QZ.js +306 -0
  360. package/dist/chunk-OC7Z6AJQ.js +81 -0
  361. package/dist/chunk-OH7IEZ63.js +307 -0
  362. package/dist/chunk-OI734GRS.js +115 -0
  363. package/dist/chunk-OJBH62DK.js +684 -0
  364. package/dist/chunk-OKJLVSTJ.js +247 -0
  365. package/dist/chunk-OMX5VL43.js +79 -0
  366. package/dist/chunk-ONHAMBN6.js +12 -0
  367. package/dist/chunk-ONYPLIVE.js +753 -0
  368. package/dist/chunk-OSK7QWPD.js +637 -0
  369. package/dist/chunk-OTXLMJKP.js +438 -0
  370. package/dist/chunk-OV5PKQMA.js +213 -0
  371. package/dist/chunk-OXK5HA4B.js +31 -0
  372. package/dist/chunk-OYDWFQA4.js +272 -0
  373. package/dist/chunk-OZAUKWHB.js +22 -0
  374. package/dist/chunk-P5P2EKGH.js +94 -0
  375. package/dist/chunk-P6SSWAKY.js +29 -0
  376. package/dist/chunk-P7CQGPLS.js +30 -0
  377. package/dist/chunk-P7RVCHQV.js +197 -0
  378. package/dist/chunk-PEBWDYIW.js +726 -0
  379. package/dist/chunk-PFCXFO7A.js +9193 -0
  380. package/dist/chunk-PFLDWMX6.js +168 -0
  381. package/dist/chunk-PHZGLQSK.js +15883 -0
  382. package/dist/chunk-PNFTPNSR.js +20 -0
  383. package/dist/chunk-PPHXX4W7.js +175 -0
  384. package/dist/chunk-PPZESPJT.js +262 -0
  385. package/dist/chunk-PRDHI2L5.js +296 -0
  386. package/dist/chunk-PSTKWHHN.js +32 -0
  387. package/dist/chunk-PV53ODOT.js +555 -0
  388. package/dist/chunk-PVJBTI7P.js +24 -0
  389. package/dist/chunk-PXKERBKX.js +100 -0
  390. package/dist/chunk-PZ5AY32C.js +10 -0
  391. package/dist/chunk-Q3DHEZA5.js +85 -0
  392. package/dist/chunk-Q5RZDVQK.js +204 -0
  393. package/dist/chunk-Q64IR2Z2.js +4933 -0
  394. package/dist/chunk-Q6Z5UGPL.js +398 -0
  395. package/dist/chunk-QAMAV4DT.js +627 -0
  396. package/dist/chunk-QBWF4444.js +112 -0
  397. package/dist/chunk-QDKYT4CI.js +22805 -0
  398. package/dist/chunk-QFLBRWCJ.js +126 -0
  399. package/dist/chunk-QILAQACE.js +107 -0
  400. package/dist/chunk-QJ6OEH4K.js +3683 -0
  401. package/dist/chunk-QK3NLYTV.js +320 -0
  402. package/dist/chunk-QOFLUS24.js +535 -0
  403. package/dist/chunk-QOIASNEJ.js +98 -0
  404. package/dist/chunk-QP4UTSOV.js +3587 -0
  405. package/dist/chunk-QP5ST7RI.js +904 -0
  406. package/dist/chunk-QS5AGRZN.js +167 -0
  407. package/dist/chunk-QTAOU53N.js +107 -0
  408. package/dist/chunk-QTCLJHLZ.js +351 -0
  409. package/dist/chunk-QTOLTG4L.js +119 -0
  410. package/dist/chunk-QWDV4OSL.js +142 -0
  411. package/dist/chunk-QWMQ74KD.js +508 -0
  412. package/dist/chunk-QX6LOMMH.js +158 -0
  413. package/dist/chunk-QXBKIHY7.js +238 -0
  414. package/dist/chunk-QXBKTJT6.js +270 -0
  415. package/dist/chunk-QYQOVOLR.js +196 -0
  416. package/dist/chunk-R2CKS6WT.js +73 -0
  417. package/dist/chunk-R2TIYG7U.js +68 -0
  418. package/dist/chunk-R2W3LESH.js +465 -0
  419. package/dist/chunk-R5EXHMUN.js +100 -0
  420. package/dist/chunk-RBBTBCHX.js +289 -0
  421. package/dist/chunk-RBKLOUXA.js +121 -0
  422. package/dist/chunk-RCP2Y6DQ.js +86 -0
  423. package/dist/chunk-RCYEJSD5.js +260 -0
  424. package/dist/chunk-RFDVSI4N.js +134 -0
  425. package/dist/chunk-RGJU63FV.js +1717 -0
  426. package/dist/chunk-RI4EX2QE.js +18 -0
  427. package/dist/chunk-RIMARPCF.js +152 -0
  428. package/dist/chunk-RJ6RSNT6.js +42 -0
  429. package/dist/chunk-RNI2GUIF.js +131 -0
  430. package/dist/chunk-RPHUWJ3K.js +264 -0
  431. package/dist/chunk-RPIMAMV7.js +361 -0
  432. package/dist/chunk-RQFX6YRN.js +49 -0
  433. package/dist/chunk-RRC5BL7B.js +285 -0
  434. package/dist/chunk-RSYTSBOO.js +79 -0
  435. package/dist/chunk-RWQQIKIC.js +35 -0
  436. package/dist/chunk-RZUBOZH2.js +373 -0
  437. package/dist/chunk-S2E632FQ.js +380 -0
  438. package/dist/chunk-S2VQCZO4.js +22 -0
  439. package/dist/chunk-S2XIMQJQ.js +681 -0
  440. package/dist/chunk-S47ISY27.js +183 -0
  441. package/dist/chunk-S6I4KISU.js +142 -0
  442. package/dist/chunk-S6TAFQI5.js +2403 -0
  443. package/dist/chunk-SBBNT5ZJ.js +27 -0
  444. package/dist/chunk-SDJV2DTQ.js +491 -0
  445. package/dist/chunk-SDPIFNLD.js +33 -0
  446. package/dist/chunk-SF6YK3JI.js +835 -0
  447. package/dist/chunk-SK3ZFONO.js +976 -0
  448. package/dist/chunk-SKTFRFQ7.js +1775 -0
  449. package/dist/chunk-SNGM452K.js +2002 -0
  450. package/dist/chunk-STW7OFOA.js +581 -0
  451. package/dist/chunk-SU6UFUQY.js +1351 -0
  452. package/dist/chunk-SVJM3LJA.js +27 -0
  453. package/dist/chunk-SVUNZOPG.js +129 -0
  454. package/dist/chunk-T5XLUYV3.js +34 -0
  455. package/dist/chunk-T7E5JS6N.js +57 -0
  456. package/dist/chunk-TA3N5MMO.js +450 -0
  457. package/dist/chunk-TAJPCXSB.js +13 -0
  458. package/dist/chunk-TDEMDRN2.js +1639 -0
  459. package/dist/chunk-TDSEX5CF.js +24 -0
  460. package/dist/chunk-TGCVL74Y.js +28 -0
  461. package/dist/chunk-TGXXYDL4.js +1012 -0
  462. package/dist/chunk-TIKTYUJO.js +296 -0
  463. package/dist/chunk-TIZAJD4M.js +6029 -0
  464. package/dist/chunk-TLSEZZCG.js +5549 -0
  465. package/dist/chunk-TMBDRHAX.js +19 -0
  466. package/dist/chunk-TRURQUBP.js +1217 -0
  467. package/dist/chunk-TSQ256N5.js +152 -0
  468. package/dist/chunk-TUQMMFEQ.js +2244 -0
  469. package/dist/chunk-U424MJLC.js +81 -0
  470. package/dist/chunk-U4DRS6ZW.js +11 -0
  471. package/dist/chunk-U5KS22IN.js +204 -0
  472. package/dist/chunk-UAPHFJPN.js +673 -0
  473. package/dist/chunk-UB7LQITD.js +1040 -0
  474. package/dist/chunk-UBVRHGAZ.js +237 -0
  475. package/dist/chunk-UDNNAQN5.js +98 -0
  476. package/dist/chunk-UJP3XM54.js +342 -0
  477. package/dist/chunk-UJYDH2MW.js +305 -0
  478. package/dist/chunk-UKMPASIC.js +399 -0
  479. package/dist/chunk-UKUL3EHK.js +763 -0
  480. package/dist/chunk-UPHU64NB.js +1327 -0
  481. package/dist/chunk-URMSZXAD.js +43 -0
  482. package/dist/chunk-US3RT6CY.js +525 -0
  483. package/dist/chunk-UTDEOPKV.js +30 -0
  484. package/dist/chunk-UUUDKV7N.js +13 -0
  485. package/dist/chunk-UVKWU3SM.js +39 -0
  486. package/dist/chunk-V2TVPO3X.js +521 -0
  487. package/dist/chunk-V3KLVK7B.js +398 -0
  488. package/dist/chunk-V3YFFHDR.js +17 -0
  489. package/dist/chunk-VAG6GUBR.js +1162 -0
  490. package/dist/chunk-VBENAHDA.js +1814 -0
  491. package/dist/chunk-VBNCKCCI.js +16 -0
  492. package/dist/chunk-VCGSWN5M.js +1300 -0
  493. package/dist/chunk-VE2O2I7M.js +115 -0
  494. package/dist/chunk-VIFHYTI5.js +31 -0
  495. package/dist/chunk-VJER3FUS.js +5080 -0
  496. package/dist/chunk-VLMDM56Q.js +268 -0
  497. package/dist/chunk-VMFZEVVX.js +99 -0
  498. package/dist/chunk-VNDPQVUZ.js +1853 -0
  499. package/dist/chunk-VSPJRLGA.js +4783 -0
  500. package/dist/chunk-VSWC5ZXI.js +103 -0
  501. package/dist/chunk-VYI4DSZP.js +2017 -0
  502. package/dist/chunk-W4BAIQ6L.js +1212 -0
  503. package/dist/chunk-W7VQAL2K.js +2203 -0
  504. package/dist/chunk-WEI3ZDZH.js +33 -0
  505. package/dist/chunk-WEIUS5NT.js +26 -0
  506. package/dist/chunk-WEW7UFWE.js +546 -0
  507. package/dist/chunk-WGQAXLNA.js +384 -0
  508. package/dist/chunk-WJAL4JL3.js +206 -0
  509. package/dist/chunk-WKFOJ5ZG.js +141 -0
  510. package/dist/chunk-WMWQEFLN.js +2177 -0
  511. package/dist/chunk-WNECKKO2.js +154 -0
  512. package/dist/chunk-WPKLYOAM.js +195 -0
  513. package/dist/chunk-WSH37YQN.js +243 -0
  514. package/dist/chunk-WV3KQDPE.js +84 -0
  515. package/dist/chunk-WZFC4V4U.js +389 -0
  516. package/dist/chunk-XCOIBNET.js +13 -0
  517. package/dist/chunk-XDM65LBX.js +53 -0
  518. package/dist/chunk-XGU6PBO5.js +645 -0
  519. package/dist/chunk-XHOI4V62.js +43 -0
  520. package/dist/chunk-XIBVFMLQ.js +6858 -0
  521. package/dist/chunk-XJ2E7YEJ.js +117 -0
  522. package/dist/chunk-XON4ZCYX.js +69 -0
  523. package/dist/chunk-XQPEWJPI.js +127 -0
  524. package/dist/chunk-XSJTIFUY.js +31 -0
  525. package/dist/chunk-XT7OVWM3.js +64 -0
  526. package/dist/chunk-XTXYIISX.js +1104 -0
  527. package/dist/chunk-XV7NZL4B.js +57 -0
  528. package/dist/chunk-XWIZ6B5S.js +109 -0
  529. package/dist/chunk-XWLIKOBX.js +240 -0
  530. package/dist/chunk-XZOXEIN4.js +156 -0
  531. package/dist/chunk-XZRS7I7W.js +3673 -0
  532. package/dist/chunk-Y4ZDDHB6.js +44 -0
  533. package/dist/chunk-Y733RB7T.js +194 -0
  534. package/dist/chunk-YBHUB4XR.js +14931 -0
  535. package/dist/chunk-YKC75XK4.js +147 -0
  536. package/dist/chunk-YKMXFVK7.js +27 -0
  537. package/dist/chunk-YO5BAJ55.js +225 -0
  538. package/dist/chunk-YPDCLXNZ.js +568 -0
  539. package/dist/chunk-YSQPGVFK.js +116 -0
  540. package/dist/chunk-YTVVTIWJ.js +716 -0
  541. package/dist/chunk-YVCMDVBB.js +698 -0
  542. package/dist/chunk-YYTOA6DP.js +114 -0
  543. package/dist/chunk-Z5WGNULV.js +88 -0
  544. package/dist/chunk-Z6NGVVXG.js +66 -0
  545. package/dist/chunk-Z7CDQNH3.js +20 -0
  546. package/dist/chunk-ZH4G3FU5.js +187 -0
  547. package/dist/chunk-ZJB6SQPA.js +257 -0
  548. package/dist/chunk-ZL6E4HMY.js +42 -0
  549. package/dist/chunk-ZMLOC3DW.js +62 -0
  550. package/dist/chunk-ZORW64QH.js +101 -0
  551. package/dist/chunk-ZVVD2XGV.js +1369 -0
  552. package/dist/cli-utils-ER33ODC5.js +31 -0
  553. package/dist/cli-validation-6CHPTANV.js +146 -0
  554. package/dist/commit-utils-3STAY7C7.js +49 -0
  555. package/dist/compatibility-notice-IHNXR2JR.js +21 -0
  556. package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
  557. package/dist/compete-results-XUM3PJHS.js +318 -0
  558. package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
  559. package/dist/config-4HHE4OIK.js +238 -0
  560. package/dist/config-D6YAZASH.js +10 -0
  561. package/dist/config-MIPRDYYV.js +46 -0
  562. package/dist/config-audit-GA5DCUAI.js +371 -0
  563. package/dist/config-explain-4LMO556H.js +71 -0
  564. package/dist/config-loader-RGP634PC.js +51 -0
  565. package/dist/config-manager-J2UTO635.js +114 -0
  566. package/dist/config-merger-TVUJBZTS.js +14 -0
  567. package/dist/config-validator-H4ZVIE56.js +122 -0
  568. package/dist/cost-HSIV5U2Y.js +85 -0
  569. package/dist/data-migration-state-OAUL2WPQ.js +35 -0
  570. package/dist/db-migrator-NUOW5NKR.js +34 -0
  571. package/dist/default-paths-UILB62BN.js +49 -0
  572. package/dist/discovery-V6GYUJUC.js +53 -0
  573. package/dist/doctor-BBSMCDWE.js +271 -0
  574. package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
  575. package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
  576. package/dist/doctor-purpose-6YJOXPBE.js +30 -0
  577. package/dist/domain-analyzer-S35ABUNA.js +48 -0
  578. package/dist/ensure-initialized-Q6PEU55O.js +78 -0
  579. package/dist/entry.js +922 -0
  580. package/dist/error-parser-core-MZFMFANN.js +70 -0
  581. package/dist/evaluation-context-GQBYDAEV.js +63 -0
  582. package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
  583. package/dist/execution-data-writer-YCG5UH37.js +72 -0
  584. package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
  585. package/dist/execution-preflight-DASJWWQF.js +223 -0
  586. package/dist/execution-roles-KNSNNB2D.js +112 -0
  587. package/dist/exit-code-error-QIY5DOKF.js +18 -0
  588. package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
  589. package/dist/factory-YCYCB7AE.js +209 -0
  590. package/dist/file-utils-ZQYNBQBW.js +45 -0
  591. package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
  592. package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
  593. package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
  594. package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
  595. package/dist/flywheel-executor-JWU43KAY.js +437 -0
  596. package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
  597. package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
  598. package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
  599. package/dist/flywheel-preflight-III2C7TH.js +163 -0
  600. package/dist/flywheel-resume-2O45MS7Y.js +31 -0
  601. package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
  602. package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
  603. package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
  604. package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
  605. package/dist/git-message-style-KCXGMTDT.js +104 -0
  606. package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
  607. package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
  608. package/dist/identity-XLQJ4YJF.js +25 -0
  609. package/dist/index-query-6NUY4FKX.js +37 -0
  610. package/dist/index.js +85588 -0
  611. package/dist/indexer-DL54CM3K.js +44 -0
  612. package/dist/init-OUZ72344.js +245 -0
  613. package/dist/instructions-import-offer-NSYXSITC.js +363 -0
  614. package/dist/instructions-run-NBII7W36.js +114 -0
  615. package/dist/interrupted-work-E4TLKJLE.js +43 -0
  616. package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
  617. package/dist/judge-scoring.json +64 -0
  618. package/dist/lab-mode-YXQ2Y3NG.js +44 -0
  619. package/dist/lab-utils-5QAMDJR5.js +29 -0
  620. package/dist/linux-host-class-YDWQX65O.js +31 -0
  621. package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
  622. package/dist/local-ci-config-VZ4WWDT5.js +48 -0
  623. package/dist/local-executor-DCMDDRX2.js +280 -0
  624. package/dist/logger-5KNKS3O4.js +154 -0
  625. package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
  626. package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
  627. package/dist/merge-batch-RTEEMVDB.js +313 -0
  628. package/dist/merge-batch-members-VIWGVRHP.js +24 -0
  629. package/dist/merge-queue-TIIUSOY6.js +126 -0
  630. package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
  631. package/dist/metadata-UKSMWM6J.js +29 -0
  632. package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
  633. package/dist/model-invocations-db-XTUPPQ34.js +70 -0
  634. package/dist/model-resolver-JFZ2MHOJ.js +39 -0
  635. package/dist/model-resolver-SCQ57KAQ.js +217 -0
  636. package/dist/model-roles-D3OR4NAH.js +110 -0
  637. package/dist/monitor-F4SIU5G2.js +96 -0
  638. package/dist/nested-worktrees-2WUWQ75N.js +23 -0
  639. package/dist/next-S3IRLVER.js +96 -0
  640. package/dist/next-UKPFRXOO.js +148 -0
  641. package/dist/opportunistic-TL4S26VX.js +86 -0
  642. package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
  643. package/dist/package-HJR4QJT4.js +10 -0
  644. package/dist/parse-git-status-7PIYFPS2.js +21 -0
  645. package/dist/path-security-5WJSY56G.js +41 -0
  646. package/dist/paths-JUI7C4KU.js +45 -0
  647. package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
  648. package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
  649. package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
  650. package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
  651. package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
  652. package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
  653. package/dist/preflight-PJHGTJNZ.js +12 -0
  654. package/dist/process-registry-B4ZUCN7T.js +28 -0
  655. package/dist/process-scanner-TU3QHWVB.js +23 -0
  656. package/dist/processes-6FHVGT72.js +28 -0
  657. package/dist/processes-json-fast-YWTMUWXB.js +72 -0
  658. package/dist/profile-HWTC56SG.js +209 -0
  659. package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
  660. package/dist/protected-branches-N36LDBFY.js +71 -0
  661. package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
  662. package/dist/provider-matrix-2KO2V5OM.js +214 -0
  663. package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
  664. package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
  665. package/dist/provider-registry-WCZ65QHC.js +136 -0
  666. package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
  667. package/dist/prune-engine-EOQVWEP6.js +448 -0
  668. package/dist/publication-turn-S42RZTQF.js +44 -0
  669. package/dist/quality-gate-JQMVCKOO.js +72 -0
  670. package/dist/quickstart-3O6FRCFB.js +105 -0
  671. package/dist/readiness-GW6ABRHB.js +139 -0
  672. package/dist/readiness-KFZCXDTT.js +215 -0
  673. package/dist/registry-7XG376SY.js +217 -0
  674. package/dist/repair-helpers-TTV5FEF4.js +117 -0
  675. package/dist/repo-root-YG6MQZDW.js +28 -0
  676. package/dist/resolution-engine-FFEK7HQ2.js +187 -0
  677. package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
  678. package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
  679. package/dist/routing-events-AW6SRZ6G.js +13 -0
  680. package/dist/routing-history-store-FMDDQL6W.js +39 -0
  681. package/dist/routing-planner-C6OHO3EY.js +221 -0
  682. package/dist/runner-KHDNQ5KU.js +1194 -0
  683. package/dist/runner-PIS2BW7Y.js +1801 -0
  684. package/dist/safety-E3JJVSFL.js +67 -0
  685. package/dist/safety-stanza-HE6GXP4G.js +49 -0
  686. package/dist/sandbox-7LBZC5PE.js +72 -0
  687. package/dist/sandbox-ASWCDYZL.js +80 -0
  688. package/dist/schema-extensions.sql +234 -0
  689. package/dist/security-JI22TBEB.js +17 -0
  690. package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
  691. package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
  692. package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
  693. package/dist/shared-utils-34HJZ6JX.js +40 -0
  694. package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
  695. package/dist/sprint-N7JFTEGL.js +403 -0
  696. package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
  697. package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
  698. package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
  699. package/dist/sprint-manager-MU2ZUWN2.js +140 -0
  700. package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
  701. package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
  702. package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
  703. package/dist/storage-access-I3V5LER7.js +31 -0
  704. package/dist/store-XVG64ZR2.js +25 -0
  705. package/dist/task-classifier-MN2DYE5R.js +558 -0
  706. package/dist/task-list-fast-7AT6LTTA.js +112 -0
  707. package/dist/task-manager-LHPBBRRE.js +136 -0
  708. package/dist/task-report-OLPAWBTK.js +64 -0
  709. package/dist/task-type-detector-6RG3YNZF.js +27 -0
  710. package/dist/task-type-resolver-EQHOUIHT.js +64 -0
  711. package/dist/telemetry-5VYSK772.js +212 -0
  712. package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
  713. package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
  714. package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
  715. package/dist/transports-NREZQTJK.js +106 -0
  716. package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
  717. package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
  718. package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
  719. package/dist/user-agents-QLIGPLP2.js +30 -0
  720. package/dist/variant-execution-I4ZZUAWY.js +319 -0
  721. package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
  722. package/dist/variant-request-input-PL37N3AN.js +11 -0
  723. package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
  724. package/dist/variant-worker-COB5YTJX.js +4517 -0
  725. package/dist/variant-worker.js +26 -0
  726. package/dist/variants-XGDSXYG3.js +267 -0
  727. package/dist/verification-command-YSPU4VBH.js +66 -0
  728. package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
  729. package/dist/verify-commands-LOHMOFKC.js +65 -0
  730. package/dist/warning-JSKSFKBT.js +13 -0
  731. package/dist/work-edge-K65NHVWY.js +50 -0
  732. package/dist/work-item-writer-KY5ZWZWW.js +30 -0
  733. package/dist/worker-JNXXEIT6.js +1504 -0
  734. package/dist/worker.js +21 -0
  735. package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
  736. package/dist/worktree-environment-WTVABAQW.js +64 -0
  737. package/dist/worktree-metrics-VZRQI26T.js +66 -0
  738. package/dist/writeback-TQFQBJNU.js +50 -0
  739. package/docs/CLI_REFERENCE.md +8287 -0
  740. package/docs/PROVIDER_SETUP.md +1737 -0
  741. package/docs/README.md +96 -0
  742. package/docs/TROUBLESHOOTING.md +2209 -0
  743. package/docs/getting-started/QUICK_START.md +260 -0
  744. package/docs/getting-started/README.md +198 -0
  745. package/docs/getting-started/SETUP.md +25 -0
  746. package/docs/reference/AGENT_CONTEXT.md +84 -0
  747. package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
  748. package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
  749. package/docs/reference/SECURITY.md +291 -0
  750. package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
  751. package/integrations/bb-plugin-build/README.md +391 -0
  752. package/integrations/bb-plugin-build/app.css +431 -0
  753. package/integrations/bb-plugin-build/app.tsx +6210 -0
  754. package/integrations/bb-plugin-build/package.json +45 -0
  755. package/integrations/bb-plugin-build/server.ts +488 -0
  756. package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
  757. package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
  758. package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
  759. package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
  760. package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
  761. package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
  762. package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
  763. package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
  764. package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
  765. package/integrations/bb-plugin-build/src/contract.ts +718 -0
  766. package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
  767. package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
  768. package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
  769. package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
  770. package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
  771. package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
  772. package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
  773. package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
  774. package/integrations/bb-plugin-build/src/model.ts +1318 -0
  775. package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
  776. package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
  777. package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
  778. package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
  779. package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
  780. package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
  781. package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
  782. package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
  783. package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
  784. package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
  785. package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
  786. package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
  787. package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
  788. package/integrations/bb-plugin-build/src/project-target.ts +45 -0
  789. package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
  790. package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
  791. package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
  792. package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
  793. package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
  794. package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
  795. package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
  796. package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
  797. package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
  798. package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
  799. package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
  800. package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
  801. package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
  802. package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
  803. package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
  804. package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
  805. package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
  806. package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
  807. package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
  808. package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
  809. package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
  810. package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
  811. package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
  812. package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
  813. package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
  814. package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
  815. package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
  816. package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
  817. package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
  818. package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
  819. package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
  820. package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
  821. package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
  822. package/package.json +306 -4
  823. package/schemas/README.md +80 -0
  824. package/schemas/build.config.schema.json +2110 -0
  825. package/schemas/config-v1.schema.json +136 -0
  826. package/schemas/execution-config.schema.json +47 -0
  827. package/schemas/judge-scoring.schema.json +257 -0
  828. package/schemas/provider-config.schema.json +179 -0
  829. package/schemas/telemetry-config.schema.json +79 -0
  830. package/schemas/user-preferences.schema.json +141 -0
  831. package/scripts/assert-node-runtime.mjs +146 -0
  832. package/scripts/preflight-native.mjs +49 -0
  833. package/scripts/setup-git-hooks.mjs +39 -0
  834. package/scripts/sync.sh +2871 -0
  835. package/scripts/write-node-launcher.sh +138 -0
  836. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  837. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  838. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  839. package/templates/.build-project/README.md +41 -0
  840. package/templates/.build-project/agents/README.md +50 -0
  841. package/templates/.build-project/agents/architect.md +10 -0
  842. package/templates/.build-project/agents/code-reviewer.md +10 -0
  843. package/templates/.build-project/agents/debugger.md +10 -0
  844. package/templates/.build-project/agents/documenter.md +10 -0
  845. package/templates/.build-project/agents/test-automator.md +10 -0
  846. package/templates/.build-project/config/build.config.jsonc +64 -0
  847. package/templates/.build-project/config/project-context.template.json +6 -0
  848. package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
  849. package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
  850. package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
  851. package/templates/.build-project/config/task-type-aliases.yaml +29 -0
  852. package/templates/.build-project/gitignore.template +70 -0
  853. package/templates/.build-project/task-types/analysis.yaml +38 -0
  854. package/templates/.build-project/task-types/architecture.yaml +35 -0
  855. package/templates/.build-project/task-types/doc.yaml +34 -0
  856. package/templates/.build-project/task-types/feature.yaml +22 -0
  857. package/templates/.build-project/task-types/general.yaml +4 -0
  858. package/templates/.build-project/task-types/security.yaml +38 -0
  859. package/templates/AGENTS.template.md +85 -0
  860. package/templates/CLAUDE.template.md +1 -0
  861. package/templates/GEMINI.template.md +1 -0
  862. package/templates/builtin-workflows/code-review.yaml +73 -0
  863. package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
  864. package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
  865. package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
  866. package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
  867. package/templates/ci/incident-intake.mjs +787 -0
  868. package/templates/ci/incidents.yml.template +103 -0
  869. package/templates/ci/node.yml.template +17 -0
  870. package/templates/ci/python.yml.template +17 -0
  871. package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
  872. package/templates/guard-kit/build-guard.yml.template +189 -0
  873. package/templates/guard-kit/check.mjs.template +932 -0
  874. package/templates/guard-kit/config.json.template +7 -0
  875. package/templates/guard-kit/policy.json.template +1 -0
  876. package/templates/profiles/README.md +57 -0
  877. package/templates/profiles/frontier-claude.json +23 -0
  878. package/templates/profiles/frontier-codex.json +23 -0
@@ -0,0 +1,2244 @@
1
+ import {
2
+ applicableRunnerLanguages,
3
+ describeVerificationCommand,
4
+ detectZeroCollectedTests,
5
+ isPythonStdlibUnittestCommand,
6
+ runnerRowApplies
7
+ } from "./chunk-EPAMVGI3.js";
8
+ import {
9
+ isProjectSourcePath
10
+ } from "./chunk-RPIMAMV7.js";
11
+ import {
12
+ BUILD_PLAIN_LOGS,
13
+ readEnv
14
+ } from "./chunk-7VRJHTGZ.js";
15
+
16
+ // src/core/providers/shared/output-processing.ts
17
+ var ANSI_ESCAPE_SEQUENCE = /\x1B\[[0-9;?]*[ -/]*[@-~]/g;
18
+ var OSC_ESCAPE_SEQUENCE = /\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)/g;
19
+ var DCS_ESCAPE_SEQUENCE = /\x1BP(?:[^\x1B]|\x1B(?!\\))*\x1B\\/g;
20
+ function isIgnorableProviderBannerLine(line) {
21
+ const trimmed = line.trim();
22
+ if (!trimmed) return true;
23
+ if (trimmed === "YOLO mode is enabled. All tool calls will be automatically approved." || trimmed === "Loaded cached credentials." || trimmed === "Loaded cached credentials") {
24
+ return true;
25
+ }
26
+ return false;
27
+ }
28
+ function selectBestErrorLine(output) {
29
+ const lines2 = output.split("\n").map((line) => line.trim()).filter((line) => !isIgnorableProviderBannerLine(line));
30
+ if (lines2.length === 0) return void 0;
31
+ const priorityMatchers = [
32
+ /\bModelNotFoundError\b/,
33
+ /\[API Error:/,
34
+ /\bTraceback\b/,
35
+ /\bException\b/,
36
+ /\bError\b/,
37
+ /\bfailed\b/i,
38
+ /\bnot found\b/i,
39
+ /\bunauthorized\b/i,
40
+ /\bforbidden\b/i,
41
+ /\brate limit\b/i,
42
+ /\bECONNRESET\b/,
43
+ /\bETIMEDOUT\b/
44
+ ];
45
+ for (const line of lines2) {
46
+ if (priorityMatchers.some((re) => re.test(line))) {
47
+ return line;
48
+ }
49
+ }
50
+ return lines2[0];
51
+ }
52
+ function selectBestErrorSummary(primaryOutput, fallbackOutput) {
53
+ const primaryLine = selectBestErrorLine(primaryOutput);
54
+ if (primaryLine) {
55
+ return primaryLine;
56
+ }
57
+ if (fallbackOutput) {
58
+ const fallbackLine = selectBestErrorLine(fallbackOutput);
59
+ if (fallbackLine) {
60
+ return fallbackLine;
61
+ }
62
+ }
63
+ return primaryOutput.split("\n")[0]?.trim() || fallbackOutput?.split("\n")[0]?.trim();
64
+ }
65
+ function stripCarriageReturnOverwrites(text) {
66
+ if (!text.includes("\r")) {
67
+ return text;
68
+ }
69
+ const pieces = text.split("\n");
70
+ for (let i = 0; i < pieces.length; i++) {
71
+ let piece = pieces[i] ?? "";
72
+ let crlfSuffix = "";
73
+ if (piece.endsWith("\r") && i < pieces.length - 1) {
74
+ crlfSuffix = "\r";
75
+ piece = piece.slice(0, -1);
76
+ }
77
+ const lastBareCr = piece.lastIndexOf("\r");
78
+ if (lastBareCr !== -1) {
79
+ piece = piece.slice(lastBareCr + 1);
80
+ }
81
+ pieces[i] = piece + crlfSuffix;
82
+ }
83
+ return pieces.join("\n");
84
+ }
85
+ function normalizeOutput(text) {
86
+ const plainLogs = readEnv(BUILD_PLAIN_LOGS).value;
87
+ let result = stripCarriageReturnOverwrites(text);
88
+ if (plainLogs) {
89
+ result = result.replace(ANSI_ESCAPE_SEQUENCE, "").replace(OSC_ESCAPE_SEQUENCE, "").replace(DCS_ESCAPE_SEQUENCE, "");
90
+ }
91
+ result = result.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\n{3,}/g, "\n\n");
92
+ return result;
93
+ }
94
+ function processOutput(stdout, stderr, onData, onErrorData, formatLine, passThroughUnformatted = false) {
95
+ if (onData && stdout) {
96
+ const normalized = normalizeOutput(stdout);
97
+ const lines2 = normalized.trim().split("\n");
98
+ for (const line of lines2) {
99
+ if (!line.trim()) continue;
100
+ if (formatLine) {
101
+ const formatted = formatLine(line);
102
+ if (formatted) {
103
+ onData(`${formatted}
104
+ `);
105
+ } else if (passThroughUnformatted) {
106
+ onData(`${line}
107
+ `);
108
+ }
109
+ } else {
110
+ onData(`${line}
111
+ `);
112
+ }
113
+ }
114
+ }
115
+ if (onErrorData && stderr) {
116
+ const normalized = normalizeOutput(stderr);
117
+ onErrorData(normalized);
118
+ }
119
+ }
120
+ function chunkToText(chunk) {
121
+ if (typeof chunk === "string") {
122
+ return chunk;
123
+ }
124
+ if (Buffer.isBuffer(chunk)) {
125
+ return chunk.toString("utf-8");
126
+ }
127
+ return "";
128
+ }
129
+ function createLineBufferedStreamProcessor(onLine) {
130
+ let buffer = "";
131
+ let emittedContentLine = false;
132
+ const emitLine = (rawLine, isFinal) => {
133
+ const normalized = normalizeOutput(rawLine);
134
+ if (!normalized.trim()) {
135
+ return;
136
+ }
137
+ const adjusted = emittedContentLine ? normalized : normalized.trimStart();
138
+ const finalAdjusted = isFinal ? adjusted.trimEnd() : adjusted;
139
+ if (!finalAdjusted.trim()) {
140
+ return;
141
+ }
142
+ emittedContentLine = true;
143
+ onLine(finalAdjusted, isFinal);
144
+ };
145
+ return {
146
+ push(chunk) {
147
+ const text = chunkToText(chunk);
148
+ if (!text) {
149
+ return;
150
+ }
151
+ buffer += text;
152
+ buffer = buffer.replace(/\r\n/g, "\n");
153
+ const lines2 = buffer.split("\n");
154
+ buffer = lines2.pop() ?? "";
155
+ for (const line of lines2) {
156
+ emitLine(line, false);
157
+ }
158
+ },
159
+ flush() {
160
+ if (!buffer) {
161
+ return;
162
+ }
163
+ emitLine(buffer, true);
164
+ buffer = "";
165
+ }
166
+ };
167
+ }
168
+ function stripAnsiSequences(str) {
169
+ return str.replace(ANSI_ESCAPE_SEQUENCE, "").replace(OSC_ESCAPE_SEQUENCE, "").replace(DCS_ESCAPE_SEQUENCE, "");
170
+ }
171
+
172
+ // src/core/judge/test-gate-runners.ts
173
+ var RESOLVER_SUITE_RUNNERS = [
174
+ "ruby",
175
+ "php",
176
+ "dotnet",
177
+ "swift",
178
+ "dart",
179
+ "native",
180
+ "r"
181
+ ];
182
+ var RESOLVER_SUITE_RUNNER_SET = new Set(RESOLVER_SUITE_RUNNERS);
183
+ var RESOLVER_SUITE_RUNNER_LANGUAGES = Object.freeze(
184
+ Object.fromEntries(RESOLVER_SUITE_RUNNERS.map((runner) => [runner, runner]))
185
+ );
186
+ function isResolverSuiteRunner(runner) {
187
+ return typeof runner === "string" && RESOLVER_SUITE_RUNNER_SET.has(runner);
188
+ }
189
+ function detectResolverSuiteRunner(testCommands) {
190
+ for (const command of testCommands) {
191
+ const descriptor = describeVerificationCommand(command);
192
+ if (descriptor.kind !== "test") continue;
193
+ if (isResolverSuiteRunner(descriptor.language)) return descriptor.language;
194
+ }
195
+ return void 0;
196
+ }
197
+ function detectCommandTestRunner(command) {
198
+ const descriptor = describeVerificationCommand(command);
199
+ if (descriptor.kind !== "test") return null;
200
+ switch (descriptor.language) {
201
+ case "node": {
202
+ const normalized = command.trim().replace(/^(?:npx|pnpx|bunx)\s+(?:--no-install|--offline)\s+/u, "").replace(/^node\s+scripts\/dynamic-node-options\.mjs\s+/u, "").replace(/^(?:\.\/)?node_modules\/\.bin\//u, "");
203
+ const runner = normalized.match(/^(vitest|jest|mocha|ava)\b/)?.[1];
204
+ if (runner) return runner;
205
+ return /^node\s+(?:--[^\s]+\s+)*--test(?=\s|$)/u.test(normalized) ? "node-test" : null;
206
+ }
207
+ case "python":
208
+ return /\bpytest\b/u.test(command) ? "pytest" : /\bunittest\b/u.test(command) ? "unittest" : null;
209
+ case "go":
210
+ return "go";
211
+ case "rust":
212
+ return "cargo";
213
+ case "jvm":
214
+ return /\b(?:gradle|gradlew)\b/u.test(command) ? "gradle" : "maven";
215
+ default:
216
+ return isResolverSuiteRunner(descriptor.language) ? descriptor.language : null;
217
+ }
218
+ }
219
+
220
+ // src/core/judge/test-runner-summary-rows.ts
221
+ var NAME_LIMIT = 20;
222
+ function readPrintedCount(text, pattern) {
223
+ const value = pattern.exec(text)?.[1];
224
+ return value === void 0 ? void 0 : Number(value);
225
+ }
226
+ function readTestOutcomeTokens(summary, dialect) {
227
+ const boundary = dialect === "jest" ? String.raw`\b` : "";
228
+ const flags = dialect === "failure" ? "i" : "";
229
+ const count = (label) => readPrintedCount(summary, new RegExp(String.raw`(\d+)\s+${label}${boundary}`, flags));
230
+ return {
231
+ passed: count("passed"),
232
+ failed: count("failed"),
233
+ skipped: count("skipped"),
234
+ total: count("total")
235
+ };
236
+ }
237
+ function readTapFooterTokens(output, dialect) {
238
+ const count = (label) => {
239
+ const pattern = dialect === "node" ? new RegExp(String.raw`^[ \t]*# ${label} (\d+)[ \t]*$`, "m") : dialect === "judge" ? new RegExp(String.raw`^#\s+${label}\s+(\d+)\s*$`, "im") : new RegExp(String.raw`(?:^|\n)\s*#\s+${label}\s+(\d+)`, "i");
240
+ return readPrintedCount(output, pattern);
241
+ };
242
+ return {
243
+ tests: count("tests"),
244
+ pass: count("pass"),
245
+ fail: count("fail"),
246
+ cancelled: count("cancelled"),
247
+ skipped: count(dialect === "failure" ? "skip(?:ped)?" : "skipped"),
248
+ todo: count("todo")
249
+ };
250
+ }
251
+ function readPytestSummaryRows(output) {
252
+ const decorated = [];
253
+ const quiet = [];
254
+ const completeQuiet = /^\d+\s+[a-z]+(?:,\s*\d+\s+[a-z]+)*\s+in\s+\d+(?:\.\d+)?s(?:\s+\([\d:.]+\))?$/i;
255
+ for (const rawLine of stripAnsiSequences(output).split(/\r\n|[\r\n\u2028\u2029]/)) {
256
+ const line = rawLine.trim();
257
+ let start = 0;
258
+ while (start < line.length && line.charCodeAt(start) === 61) start += 1;
259
+ if (start > 0) {
260
+ let end = line.length - 1;
261
+ while (end >= start && line.charCodeAt(end) === 61) end -= 1;
262
+ if (end < line.length - 1) {
263
+ const summary = line.slice(start, end + 1).trim();
264
+ if (/\b\d+\s+(?:passed|failed|errors?|skipped)\b/i.test(summary)) {
265
+ decorated.push(summary);
266
+ }
267
+ }
268
+ } else if (/^(?:\d+\s+(?:passed|failed|errors?|warnings?|skipped|xfailed|xpassed|deselected)(?:,\s*|\s+in\b|$))+/i.test(
269
+ line
270
+ )) {
271
+ quiet.push(line);
272
+ }
273
+ }
274
+ const extraQuiet = decorated.length > 0 ? quiet.filter((line) => completeQuiet.test(line)) : quiet;
275
+ for (const summary of decorated) {
276
+ const duplicate = extraQuiet.indexOf(summary);
277
+ if (duplicate !== -1) extraQuiet.splice(duplicate, 1);
278
+ }
279
+ return [...decorated, ...extraQuiet].map((summary) => ({
280
+ passed: summary.match(/\b(\d+)\s+passed\b/i)?.[1] === void 0 ? void 0 : Number(summary.match(/\b(\d+)\s+passed\b/i)?.[1]),
281
+ failed: Number(summary.match(/\b(\d+)\s+failed\b/i)?.[1] ?? 0),
282
+ errors: Number(summary.match(/\b(\d+)\s+errors?\b/i)?.[1] ?? 0),
283
+ skipped: Number(summary.match(/\b(\d+)\s+skipped\b/i)?.[1] ?? 0)
284
+ }));
285
+ }
286
+ function lines(output) {
287
+ return stripAnsiSequences(output).split(/\r?\n/);
288
+ }
289
+ function uniqueNames(names, limit) {
290
+ return [...new Set(names)].slice(0, limit);
291
+ }
292
+ function readNodeSpecCounters(output) {
293
+ const cleaned = stripAnsiSequences(output);
294
+ const count = (label) => {
295
+ const match = cleaned.match(
296
+ new RegExp(String.raw`^\s*(?:\u2139\s+)?${label}\s+(\d+)\s*$`, "im")
297
+ )?.[1];
298
+ return match === void 0 ? void 0 : Number(match);
299
+ };
300
+ const tests = count("tests");
301
+ const pass = count("pass");
302
+ const fail = count("fail");
303
+ if (tests === void 0 || pass === void 0 || fail === void 0) return void 0;
304
+ if (!Number.isFinite(tests) || !Number.isFinite(pass) || !Number.isFinite(fail)) {
305
+ return void 0;
306
+ }
307
+ return {
308
+ tests,
309
+ pass,
310
+ fail,
311
+ cancelled: count("cancelled") ?? 0,
312
+ skipped: count("skipped") ?? 0,
313
+ todo: count("todo") ?? 0
314
+ };
315
+ }
316
+ function nodeSpecCountersAddUp(counters) {
317
+ const { tests, pass, fail, cancelled, skipped, todo } = counters;
318
+ return pass + fail + cancelled + skipped + todo === tests;
319
+ }
320
+ function readNodeSpecFailureNames(output, limit = NAME_LIMIT) {
321
+ const names = [];
322
+ for (const line of lines(output)) {
323
+ const match = /^\s*\u2716\s+(.+?)\s+\(\d+(?:\.\d+)?ms\)\s*$/.exec(line);
324
+ if (match?.[1]) names.push(match[1]);
325
+ }
326
+ return uniqueNames(names, limit);
327
+ }
328
+ function readMochaCounters(output) {
329
+ const cleaned = stripAnsiSequences(output);
330
+ const read = (pattern) => {
331
+ const match = cleaned.match(pattern)?.[1];
332
+ return match === void 0 ? void 0 : Number(match);
333
+ };
334
+ const passing = read(/^\s*(\d+)\s+passing(?:\s+\([^)\n]*\))?\s*$/m);
335
+ const failing = read(/^\s*(\d+)\s+failing\s*$/m);
336
+ if (passing === void 0 && failing === void 0) return void 0;
337
+ const pending = read(/^\s*(\d+)\s+pending\s*$/m);
338
+ return {
339
+ ...passing === void 0 ? {} : { passing },
340
+ ...failing === void 0 ? {} : { failing },
341
+ ...pending === void 0 ? {} : { pending }
342
+ };
343
+ }
344
+ function readMochaFailureNames(output, limit = NAME_LIMIT) {
345
+ const all = lines(output);
346
+ const start = all.findIndex((line) => /^\s*\d+\s+failing\s*$/.test(line));
347
+ if (start < 0) return [];
348
+ const names = [];
349
+ let index = start + 1;
350
+ while (index < all.length) {
351
+ const heading = /^\s*(\d+)\)\s+(.*\S)\s*$/.exec(all[index] ?? "");
352
+ if (!heading || Number(heading[1]) !== names.length + 1) {
353
+ index += 1;
354
+ continue;
355
+ }
356
+ const parts = [heading[2] ?? ""];
357
+ index += 1;
358
+ while (index < all.length && (all[index] ?? "").trim() !== "") {
359
+ parts.push((all[index] ?? "").trim());
360
+ index += 1;
361
+ }
362
+ names.push(parts.join(" ").replace(/:$/, ""));
363
+ }
364
+ return names.slice(0, limit);
365
+ }
366
+ function readAvaCounters(output) {
367
+ const cleaned = stripAnsiSequences(output);
368
+ const read = (pattern) => {
369
+ const match = cleaned.match(pattern)?.[1];
370
+ return match === void 0 ? void 0 : Number(match);
371
+ };
372
+ const passed = read(/^\s*(\d+)\s+tests?\s+passed\s*$/m);
373
+ const failed = read(/^\s*(\d+)\s+tests?\s+failed\s*$/m);
374
+ if (passed === void 0 && failed === void 0) return void 0;
375
+ return {
376
+ ...passed === void 0 ? {} : { passed },
377
+ ...failed === void 0 ? {} : { failed }
378
+ };
379
+ }
380
+ function readAvaFailureNames(output, limit = NAME_LIMIT) {
381
+ const names = [];
382
+ for (const line of lines(output)) {
383
+ const match = /^\s*\S+\s+\[fail\]:\s+(.+?)\s*$/.exec(line);
384
+ if (match?.[1]) names.push(match[1]);
385
+ }
386
+ return uniqueNames(names, limit);
387
+ }
388
+ function readBunCounters(output) {
389
+ const cleaned = stripAnsiSequences(output);
390
+ const read = (pattern) => {
391
+ const match = cleaned.match(pattern)?.[1];
392
+ return match === void 0 ? void 0 : Number(match);
393
+ };
394
+ const pass = read(/^\s*(\d+)\s+pass\s*$/m);
395
+ const fail = read(/^\s*(\d+)\s+fail\s*$/m);
396
+ const ran = read(/^Ran\s+(\d+)\s+tests?\s+across\s+\d+\s+files?\b/m);
397
+ if (pass === void 0 || fail === void 0 || ran === void 0) return void 0;
398
+ return {
399
+ pass,
400
+ fail,
401
+ skip: read(/^\s*(\d+)\s+skip\s*$/m) ?? 0,
402
+ todo: read(/^\s*(\d+)\s+todo\s*$/m) ?? 0,
403
+ ran
404
+ };
405
+ }
406
+ function bunCountersAddUp(counters) {
407
+ const { pass, fail, skip, todo, ran } = counters;
408
+ return pass + fail + skip + todo === ran;
409
+ }
410
+ function readBunFailureNames(output, limit = NAME_LIMIT) {
411
+ const names = [];
412
+ for (const line of lines(output)) {
413
+ const match = /^\(fail\)\s+(.+?)(?:\s+\[[\d.]+m?s\])?\s*$/.exec(line);
414
+ if (match?.[1]) names.push(match[1]);
415
+ }
416
+ return uniqueNames(names, limit);
417
+ }
418
+ function readCargoTestTotals(output) {
419
+ const results = Array.from(
420
+ stripAnsiSequences(output).matchAll(
421
+ /^\s*test result:\s+(ok|FAILED)\.\s+(\d+)\s+passed;\s+(\d+)\s+failed;(?:\s+(\d+)\s+ignored;)?/gim
422
+ )
423
+ );
424
+ if (results.length === 0) return void 0;
425
+ return results.reduce(
426
+ (total, match) => ({
427
+ passed: total.passed + Number(match[2] ?? 0),
428
+ failed: total.failed + Number(match[3] ?? 0),
429
+ ignored: total.ignored + Number(match[4] ?? 0),
430
+ summaries: total.summaries + 1,
431
+ failedSummaries: total.failedSummaries + (match[1]?.toUpperCase() === "FAILED" ? 1 : 0)
432
+ }),
433
+ { passed: 0, failed: 0, ignored: 0, summaries: 0, failedSummaries: 0 }
434
+ );
435
+ }
436
+ function readCargoFailureLines(output) {
437
+ const failed = [];
438
+ for (const line of lines(output)) {
439
+ if (/^test\s+\S+\s+\.\.\.\s+FAILED\b/.test(line.trim())) failed.push(line.trim());
440
+ }
441
+ return failed.slice(0, NAME_LIMIT);
442
+ }
443
+ function readSurefireTotals(output) {
444
+ let totals;
445
+ for (const line of lines(output)) {
446
+ const match = /^(?:\[[A-Z]+\]\s+)?Tests run:\s*(\d+),\s*Failures:\s*(\d+),\s*Errors:\s*(\d+)(?:,\s*Skipped:\s*(\d+))?\s*$/.exec(
447
+ line
448
+ );
449
+ if (!match) continue;
450
+ totals ??= { run: 0, failures: 0, errors: 0, skipped: 0 };
451
+ totals.run += Number(match[1]);
452
+ totals.failures += Number(match[2]);
453
+ totals.errors += Number(match[3]);
454
+ totals.skipped += Number(match[4] ?? 0);
455
+ }
456
+ return totals;
457
+ }
458
+ function readXctestTotal(output) {
459
+ const all = lines(output);
460
+ for (let index = all.length - 1; index >= 0; index -= 1) {
461
+ const match = /^\s*Executed\s+(\d+)\s+tests?,\s+with\s+(\d+)\s+failures?\b/.exec(
462
+ all[index] ?? ""
463
+ );
464
+ if (match) return { run: Number(match[1]), failures: Number(match[2]) };
465
+ }
466
+ return void 0;
467
+ }
468
+
469
+ // src/core/judge/test-runner-summaries.ts
470
+ function asMeasuredMetrics(metrics) {
471
+ const { testsRun, testsPassed, testsFailed } = metrics;
472
+ return { testsRun, testsPassed, testsFailed, metricsMeasured: testsRun > 0 };
473
+ }
474
+ function parseVitestOutput(output) {
475
+ const testMatch = lastMatch(
476
+ stripAnsiSequences(output),
477
+ /^\s*Tests\s+(.*\d+\s+(?:passed|failed).*?)\s*$/gm
478
+ );
479
+ if (testMatch) {
480
+ const summary = testMatch[1] ?? "";
481
+ const tokens = readTestOutcomeTokens(summary, "vitest");
482
+ const passed = tokens.passed ?? 0;
483
+ const failed = tokens.failed ?? 0;
484
+ return {
485
+ testsRun: passed + failed,
486
+ testsPassed: passed,
487
+ testsFailed: failed
488
+ };
489
+ }
490
+ return { testsRun: 0, testsPassed: 0, testsFailed: 0 };
491
+ }
492
+ function parseJestOutput(output) {
493
+ const summaryMatch = output.match(/Tests:[ \t]+([^\n\r]*?\d+\s+total)/);
494
+ if (summaryMatch) {
495
+ const summary = summaryMatch[1] ?? "";
496
+ const tokens = readTestOutcomeTokens(summary, "jest");
497
+ return {
498
+ testsRun: tokens.total ?? 0,
499
+ testsPassed: tokens.passed ?? 0,
500
+ testsFailed: tokens.failed ?? 0
501
+ };
502
+ }
503
+ return { testsRun: 0, testsPassed: 0, testsFailed: 0 };
504
+ }
505
+ function parseMochaStyleOutput(output) {
506
+ const mocha = readMochaCounters(output);
507
+ if (mocha) {
508
+ const passed = mocha.passing ?? 0;
509
+ const failed = mocha.failing ?? 0;
510
+ return { testsRun: passed + failed, testsPassed: passed, testsFailed: failed };
511
+ }
512
+ const ava = readAvaCounters(output);
513
+ if (ava) {
514
+ const passed = ava.passed ?? 0;
515
+ const failed = ava.failed ?? 0;
516
+ return { testsRun: passed + failed, testsPassed: passed, testsFailed: failed };
517
+ }
518
+ const tap = parseTapSummary(output);
519
+ if (tap) return tap;
520
+ return { testsRun: 0, testsPassed: 0, testsFailed: 0 };
521
+ }
522
+ function parseTapSummary(output) {
523
+ const tokens = readTapFooterTokens(output, "judge");
524
+ const tapTests = tokens.tests;
525
+ if (tapTests !== void 0 && Number.isFinite(tapTests)) {
526
+ const tapPassed = tokens.pass ?? 0;
527
+ const tapFailed = tokens.fail ?? 0;
528
+ const tapCancelled = tokens.cancelled ?? 0;
529
+ return {
530
+ testsRun: tapTests,
531
+ testsPassed: tapPassed,
532
+ testsFailed: tapFailed + tapCancelled
533
+ };
534
+ }
535
+ const resultLines = output.split(/\r?\n/).map((line) => line.trim()).filter((line) => /^(?:not\s+ok|ok)\s+\d+\b/i.test(line));
536
+ if (resultLines.length > 0) {
537
+ const failed = resultLines.filter((line) => /^not\s+ok\b/i.test(line)).length;
538
+ const passed = resultLines.length - failed;
539
+ return { testsRun: resultLines.length, testsPassed: passed, testsFailed: failed };
540
+ }
541
+ return void 0;
542
+ }
543
+ function parseUnittestOutput(output) {
544
+ const sumMatches = (pattern) => {
545
+ let total = 0;
546
+ for (const match of output.matchAll(pattern)) {
547
+ total += Number(match[1] ?? 0);
548
+ }
549
+ return total;
550
+ };
551
+ const testsRun = sumMatches(/^[ \t]*Ran[ \t]+(\d+)[ \t]+tests?\b/gim);
552
+ if (testsRun === 0) {
553
+ return { testsRun: 0, testsPassed: 0, testsFailed: 0, testsSkipped: 0 };
554
+ }
555
+ const outcomeMatches = Array.from(
556
+ output.matchAll(/^[ \t]*(?:OK|FAILED)\b[ \t]*(?:\(([^)]*)\))?[ \t]*$/gim)
557
+ );
558
+ const outcomeLines = outcomeMatches.map((match) => match[1] ?? "").join(", ");
559
+ const ranLineCount = Array.from(output.matchAll(/^[ \t]*Ran[ \t]+\d+[ \t]+tests?\b/gim)).length;
560
+ const countIn = (pattern) => {
561
+ let total = 0;
562
+ for (const match of outcomeLines.matchAll(pattern)) {
563
+ total += Number(match[1] ?? 0);
564
+ }
565
+ return total;
566
+ };
567
+ const failures = countIn(/(?<!\bexpected )failures=(\d+)/gi);
568
+ const errors = countIn(/\berrors=(\d+)/gi);
569
+ const unexpectedSuccesses = countIn(/\bunexpected\s+successes=(\d+)/gi);
570
+ const skipped = countIn(/\bskipped=(\d+)/gi);
571
+ const testsFailed = failures + errors + unexpectedSuccesses;
572
+ const testsPassed = Math.max(0, testsRun - testsFailed - skipped);
573
+ return {
574
+ testsRun,
575
+ testsPassed,
576
+ testsFailed,
577
+ testsSkipped: outcomeMatches.length >= ranLineCount ? skipped : null
578
+ };
579
+ }
580
+ function parsePytestOutput(output) {
581
+ const rows = readPytestSummaryRows(output);
582
+ const passed = rows.reduce((sum, row) => sum + (row.passed ?? 0), 0);
583
+ const failed = rows.reduce((sum, row) => sum + row.failed + row.errors, 0);
584
+ return { testsRun: passed + failed, testsPassed: passed, testsFailed: failed };
585
+ }
586
+ function parseNodeSpecSummary(output) {
587
+ const counters = readNodeSpecCounters(output);
588
+ if (!counters) return void 0;
589
+ return {
590
+ testsRun: counters.tests,
591
+ testsPassed: counters.pass,
592
+ testsFailed: counters.fail + counters.cancelled,
593
+ metricsMeasured: counters.tests > 0 && nodeSpecCountersAddUp(counters)
594
+ };
595
+ }
596
+ function lastMatch(output, pattern) {
597
+ return Array.from(output.matchAll(pattern)).at(-1);
598
+ }
599
+ function parseRustSummary(output) {
600
+ const totals = readCargoTestTotals(output);
601
+ if (!totals) return void 0;
602
+ const testsRun = totals.passed + totals.failed;
603
+ return {
604
+ testsRun,
605
+ testsPassed: totals.passed,
606
+ testsFailed: totals.failed,
607
+ metricsMeasured: testsRun > 0
608
+ };
609
+ }
610
+ function parseDotnetSummary(output) {
611
+ const summaries = Array.from(
612
+ output.matchAll(
613
+ /^\s*(?:Passed|Failed)!\s*-\s*Failed:\s*(\d+),\s*Passed:\s*(\d+),\s*Skipped:\s*(\d+),\s*Total:\s*(\d+)\b/gim
614
+ )
615
+ );
616
+ if (summaries.length > 0) {
617
+ const totals = summaries.reduce(
618
+ (acc, match) => ({
619
+ failed: acc.failed + Number(match[1] ?? 0),
620
+ passed: acc.passed + Number(match[2] ?? 0),
621
+ skipped: acc.skipped + Number(match[3] ?? 0),
622
+ total: acc.total + Number(match[4] ?? 0)
623
+ }),
624
+ { failed: 0, passed: 0, skipped: 0, total: 0 }
625
+ );
626
+ return {
627
+ testsRun: totals.passed + totals.failed,
628
+ testsPassed: totals.passed,
629
+ testsFailed: totals.failed,
630
+ metricsMeasured: totals.total > 0 && totals.passed + totals.failed + totals.skipped === totals.total
631
+ };
632
+ }
633
+ return void 0;
634
+ }
635
+ function parseRubySummary(output) {
636
+ const rspec = lastMatch(
637
+ output,
638
+ /^\s*(\d+)\s+examples?,\s+(\d+)\s+failures?(?:,\s+(\d+)\s+pending)?\s*$/gim
639
+ );
640
+ if (rspec) {
641
+ const testsRun = Number(rspec[1] ?? 0);
642
+ const testsFailed = Number(rspec[2] ?? 0);
643
+ const pending = Number(rspec[3] ?? 0);
644
+ return {
645
+ testsRun: Math.max(0, testsRun - pending),
646
+ testsPassed: Math.max(0, testsRun - testsFailed - pending),
647
+ testsFailed,
648
+ metricsMeasured: testsRun > 0 && testsFailed + pending <= testsRun
649
+ };
650
+ }
651
+ const minitest = lastMatch(
652
+ output,
653
+ /^\s*(\d+)\s+runs?,\s+\d+\s+assertions?,\s+(\d+)\s+failures?,\s+(\d+)\s+errors?,\s+(\d+)\s+skips?\s*$/gim
654
+ );
655
+ if (minitest) {
656
+ const testsRun = Number(minitest[1] ?? 0);
657
+ const testsFailed = Number(minitest[2] ?? 0) + Number(minitest[3] ?? 0);
658
+ const skipped = Number(minitest[4] ?? 0);
659
+ return {
660
+ testsRun: Math.max(0, testsRun - skipped),
661
+ testsPassed: Math.max(0, testsRun - testsFailed - skipped),
662
+ testsFailed,
663
+ metricsMeasured: testsRun > 0 && testsFailed + skipped <= testsRun
664
+ };
665
+ }
666
+ return void 0;
667
+ }
668
+ function parseDartSummary(output) {
669
+ const progress = lastMatch(output, /^\s*\d+:\d{2}\s+([+~\-\d\s]+?)(?::|\s*$)/gim);
670
+ if (progress) {
671
+ const counters = progress[1] ?? "";
672
+ const readCount = (prefix) => Number(counters.match(new RegExp(`${prefix}(\\d+)`))?.[1] ?? 0);
673
+ const testsPassed = readCount("\\+");
674
+ const testsFailed = readCount("-");
675
+ const testsRun = testsPassed + testsFailed;
676
+ return {
677
+ testsRun,
678
+ testsPassed,
679
+ testsFailed,
680
+ metricsMeasured: testsRun > 0
681
+ };
682
+ }
683
+ return void 0;
684
+ }
685
+ function parseSwiftSummary(output) {
686
+ const xctest = lastMatch(
687
+ output,
688
+ /^\s*Executed\s+(\d+)\s+tests?,\s+with\s+(\d+)\s+failures?\b/gim
689
+ );
690
+ const swiftTesting = lastMatch(
691
+ output,
692
+ /^[^A-Za-z0-9\r\n]*Test run with\s+(\d+)\s+tests?\s+passed\b/gim
693
+ );
694
+ if (xctest || swiftTesting) {
695
+ const xctestRun = Number(xctest?.[1] ?? 0);
696
+ const xctestFailed = Number(xctest?.[2] ?? 0);
697
+ const swiftTestingRun = Number(swiftTesting?.[1] ?? 0);
698
+ const testsRun = xctestRun + swiftTestingRun;
699
+ return {
700
+ testsRun,
701
+ testsPassed: Math.max(0, xctestRun - xctestFailed) + swiftTestingRun,
702
+ testsFailed: xctestFailed,
703
+ metricsMeasured: testsRun > 0 && xctestFailed <= xctestRun
704
+ };
705
+ }
706
+ return void 0;
707
+ }
708
+ function parsePhpSummary(output) {
709
+ const phpunit = lastMatch(output, /^\s*OK\s+\((\d+)\s+tests?,\s+\d+\s+assertions?\)\s*$/gim);
710
+ if (phpunit) {
711
+ const testsRun = Number(phpunit[1] ?? 0);
712
+ return {
713
+ testsRun,
714
+ testsPassed: testsRun,
715
+ testsFailed: 0,
716
+ metricsMeasured: testsRun > 0
717
+ };
718
+ }
719
+ const phpunitFailure = lastMatch(
720
+ output,
721
+ /^\s*Tests:\s*(\d+),\s*Assertions:\s*\d+(.*?)(?:\.\s*)?$/gim
722
+ );
723
+ if (phpunitFailure) {
724
+ const testsRun = Number(phpunitFailure[1] ?? 0);
725
+ const counters = /* @__PURE__ */ new Map();
726
+ for (const counter of (phpunitFailure[2] ?? "").matchAll(
727
+ /,\s*([A-Za-z][A-Za-z ]*):\s*(\d+)/g
728
+ )) {
729
+ counters.set(counter[1]?.trim().toLowerCase() ?? "", Number(counter[2] ?? 0));
730
+ }
731
+ const count = (name) => counters.get(name) ?? 0;
732
+ const testsFailed = count("failures") + count("errors") + count("risky") + count("incomplete");
733
+ const skipped = count("skipped");
734
+ const executed = Math.max(0, testsRun - skipped);
735
+ return {
736
+ testsRun: executed,
737
+ testsPassed: Math.max(0, executed - testsFailed),
738
+ testsFailed,
739
+ metricsMeasured: executed > 0 && testsFailed <= executed
740
+ };
741
+ }
742
+ return void 0;
743
+ }
744
+ function parseNativeSummary(output) {
745
+ const ctest = lastMatch(
746
+ output,
747
+ /^\s*\d+%\s+tests passed,\s+(\d+)\s+tests failed out of\s+(\d+)\s*$/gim
748
+ );
749
+ if (ctest) {
750
+ const testsFailed = Number(ctest[1] ?? 0);
751
+ const testsRun = Number(ctest[2] ?? 0);
752
+ return {
753
+ testsRun,
754
+ testsPassed: Math.max(0, testsRun - testsFailed),
755
+ testsFailed,
756
+ metricsMeasured: testsRun > 0 && testsFailed <= testsRun
757
+ };
758
+ }
759
+ const mesonCount = (label) => {
760
+ const match = lastMatch(output, new RegExp(String.raw`^\s*${label}:\s*(\d+)\s*$`, "gim"));
761
+ return match?.[1] === void 0 ? void 0 : Number(match[1]);
762
+ };
763
+ const passed = mesonCount("Ok");
764
+ const failed = mesonCount("Fail");
765
+ if (passed !== void 0 && failed !== void 0) {
766
+ const expectedFail = mesonCount("Expected Fail") ?? 0;
767
+ const unexpectedPass = mesonCount("Unexpected Pass") ?? 0;
768
+ const timedOut = mesonCount("Timeout") ?? 0;
769
+ const testsPassed = passed + expectedFail;
770
+ const testsFailed = failed + unexpectedPass + timedOut;
771
+ const testsRun = testsPassed + testsFailed;
772
+ return {
773
+ testsRun,
774
+ testsPassed,
775
+ testsFailed,
776
+ metricsMeasured: testsRun > 0
777
+ };
778
+ }
779
+ return void 0;
780
+ }
781
+ function parseRSummary(output) {
782
+ const testthat = lastMatch(
783
+ output,
784
+ /^\s*\[\s*FAIL\s+(\d+)\s*\|\s*WARN\s+\d+\s*\|\s*SKIP\s+(\d+)\s*\|\s*PASS\s+(\d+)\s*\]\s*$/gim
785
+ );
786
+ if (testthat) {
787
+ const testsFailed = Number(testthat[1] ?? 0);
788
+ const testsPassed = Number(testthat[3] ?? 0);
789
+ const testsRun = testsPassed + testsFailed;
790
+ return {
791
+ testsRun,
792
+ testsPassed,
793
+ testsFailed,
794
+ metricsMeasured: testsRun > 0
795
+ };
796
+ }
797
+ return void 0;
798
+ }
799
+ function parseSqlSummary(output) {
800
+ const dbt = lastMatch(
801
+ output,
802
+ /^\s*Done\.\s+PASS=(\d+)\s+WARN=(\d+)\s+ERROR=(\d+)\s+SKIP=(\d+)\s+TOTAL=(\d+)\s*$/gim
803
+ );
804
+ if (dbt) {
805
+ const testsPassed = Number(dbt[1] ?? 0);
806
+ const warned = Number(dbt[2] ?? 0);
807
+ const testsFailed = Number(dbt[3] ?? 0);
808
+ const skipped = Number(dbt[4] ?? 0);
809
+ const total = Number(dbt[5] ?? 0);
810
+ const testsRun = testsPassed + testsFailed;
811
+ return {
812
+ testsRun,
813
+ testsPassed,
814
+ testsFailed,
815
+ metricsMeasured: testsRun > 0 && testsPassed + warned + testsFailed + skipped === total
816
+ };
817
+ }
818
+ return void 0;
819
+ }
820
+ var LANGUAGE_SUMMARY_PARSERS = {
821
+ rust: parseRustSummary,
822
+ dotnet: parseDotnetSummary,
823
+ ruby: parseRubySummary,
824
+ dart: parseDartSummary,
825
+ swift: parseSwiftSummary,
826
+ php: parsePhpSummary,
827
+ native: parseNativeSummary,
828
+ r: parseRSummary,
829
+ sql: parseSqlSummary
830
+ };
831
+ function parseCommandFamilySummary(command, output) {
832
+ if (!command.trim()) return void 0;
833
+ const descriptor = describeVerificationCommand(command);
834
+ if (descriptor.kind !== "test") return void 0;
835
+ if (descriptor.language === "python") {
836
+ if (isPythonStdlibUnittestCommand(command)) {
837
+ return asMeasuredMetrics(parseUnittestOutput(output));
838
+ }
839
+ if (/\bpytest\b/.test(command)) {
840
+ return asMeasuredMetrics(parsePytestOutput(output));
841
+ }
842
+ return void 0;
843
+ }
844
+ if (descriptor.language === "node") return parseNodeRunnerSummary(output);
845
+ return LANGUAGE_SUMMARY_PARSERS[descriptor.language]?.(output);
846
+ }
847
+ function parseNodeRunnerSummary(output) {
848
+ const mochaStyle = asMeasuredMetrics(parseMochaStyleOutput(output));
849
+ if (mochaStyle.metricsMeasured) return mochaStyle;
850
+ const bun = readBunCounters(output);
851
+ if (!bun) return void 0;
852
+ const testsRun = bun.pass + bun.fail;
853
+ return {
854
+ testsRun,
855
+ testsPassed: bun.pass,
856
+ testsFailed: bun.fail,
857
+ metricsMeasured: testsRun > 0
858
+ };
859
+ }
860
+ function isOpaqueTestCommand(command) {
861
+ return command.trim() !== "" && describeVerificationCommand(command).language === "unknown";
862
+ }
863
+ var OPAQUE_WRAPPER_SUMMARY_PARSERS = [
864
+ (output) => asMeasuredMetrics(parsePytestOutput(output)),
865
+ (output) => asMeasuredMetrics(parseUnittestOutput(output)),
866
+ ...Object.values(LANGUAGE_SUMMARY_PARSERS),
867
+ (output) => asMeasuredMetrics(parseVitestOutput(output)),
868
+ (output) => asMeasuredMetrics(parseJestOutput(output)),
869
+ (output) => asMeasuredMetrics(parseMochaStyleOutput(output))
870
+ ];
871
+ function parseOpaqueWrapperSummary(output) {
872
+ const totals = { testsRun: 0, testsPassed: 0, testsFailed: 0 };
873
+ for (const parse of OPAQUE_WRAPPER_SUMMARY_PARSERS) {
874
+ const metrics = parse(output);
875
+ if (!metrics || !metrics.metricsMeasured && metrics.testsFailed === 0) continue;
876
+ totals.testsRun += metrics.testsRun;
877
+ totals.testsPassed += metrics.testsPassed;
878
+ totals.testsFailed += metrics.testsFailed;
879
+ }
880
+ if (totals.testsFailed === 0 && totals.testsPassed === 0) return void 0;
881
+ return { ...totals, metricsMeasured: true };
882
+ }
883
+ function parseGenericPassFailOutput(rawOutput, command = "") {
884
+ const output = stripAnsiSequences(rawOutput);
885
+ const { failureProse, ...metrics } = readGenericPassFailOutput(output, command);
886
+ const proseOnlyFailure = failureProse === true;
887
+ if (metrics.metricsMeasured || metrics.testsFailed > 0 && !proseOnlyFailure || !isOpaqueTestCommand(command)) {
888
+ return metrics;
889
+ }
890
+ return parseOpaqueWrapperSummary(output) ?? metrics;
891
+ }
892
+ function readGenericPassFailOutput(output, command) {
893
+ const tap = parseTapSummary(output);
894
+ if (tap) {
895
+ return { ...tap, metricsMeasured: tap.testsRun > 0 };
896
+ }
897
+ const spec = parseNodeSpecSummary(output);
898
+ if (spec) {
899
+ return spec;
900
+ }
901
+ const familySummary = parseCommandFamilySummary(command, output);
902
+ if (familySummary) {
903
+ return familySummary;
904
+ }
905
+ const pester = output.match(
906
+ /Tests\s+Passed:\s*(\d+)\s*,\s*Failed:\s*(\d+)\s*,\s*Skipped:\s*(\d+)/i
907
+ );
908
+ if (pester) {
909
+ const passed = Number(pester[1] ?? 0);
910
+ const failed = Number(pester[2] ?? 0);
911
+ const skipped = Number(pester[3] ?? 0);
912
+ return {
913
+ testsRun: passed + failed + skipped,
914
+ testsPassed: passed,
915
+ testsFailed: failed,
916
+ metricsMeasured: passed + failed + skipped > 0
917
+ };
918
+ }
919
+ const surefire = readSurefireTotals(output);
920
+ if (surefire) {
921
+ const testsRun = surefire.run;
922
+ const testsFailed = surefire.failures + surefire.errors;
923
+ const skipped = surefire.skipped;
924
+ const executed = Math.max(0, testsRun - skipped);
925
+ return {
926
+ testsRun: executed,
927
+ testsPassed: Math.max(0, executed - testsFailed),
928
+ testsFailed,
929
+ metricsMeasured: executed > 0
930
+ };
931
+ }
932
+ const gradleCompleted = output.match(/(\d+)\s+tests?\s+completed\b/i);
933
+ if (gradleCompleted) {
934
+ const testsRun = Number(gradleCompleted[1] ?? 0);
935
+ const failedMatch = output.match(/(\d+)\s+failed\b/i);
936
+ const testsFailed = Number(failedMatch?.[1] ?? 0);
937
+ return {
938
+ testsRun,
939
+ testsPassed: Math.max(0, testsRun - testsFailed),
940
+ testsFailed,
941
+ metricsMeasured: testsRun > 0
942
+ };
943
+ }
944
+ const failureZeroStripped = output.replace(/\b(?:fail(?:ures?|ed)?|errors?)\s*[:=]\s*0\b/gi, "").replace(/\b0\s+(?:tests?\s+)?(?:failures?|failed|errors?)\b/gi, "").replace(/\u2139\s+fail\s+0\b/gi, "").replace(/\bfail\s+0\b/gi, "");
945
+ if (/\b(fail|failed|error)\b/i.test(failureZeroStripped)) {
946
+ return {
947
+ testsRun: 1,
948
+ testsPassed: 0,
949
+ testsFailed: 1,
950
+ metricsMeasured: false,
951
+ failureProse: true
952
+ };
953
+ }
954
+ const successProse = /\b(ok|pass|passed|test result: ok|BUILD SUCCESS|BUILD SUCCESSFUL)\b/i.test(
955
+ output
956
+ );
957
+ return {
958
+ testsRun: 0,
959
+ testsPassed: 0,
960
+ testsFailed: 0,
961
+ metricsMeasured: false,
962
+ successProse
963
+ };
964
+ }
965
+ function parseTestOutput(runner, rawOutput, command = "") {
966
+ const output = rawOutput ? stripAnsiSequences(rawOutput) : rawOutput;
967
+ const fallback = {
968
+ testsRun: 0,
969
+ testsPassed: 0,
970
+ testsFailed: 0,
971
+ metricsMeasured: false
972
+ };
973
+ if (!output) {
974
+ return fallback;
975
+ }
976
+ try {
977
+ const runnerParser = runner === "vitest" ? parseVitestOutput : runner === "jest" ? parseJestOutput : runner === "mocha" || runner === "ava" ? parseMochaStyleOutput : runner === "pytest" ? parsePytestOutput : runner === "unittest" ? parseUnittestOutput : void 0;
978
+ if (runnerParser) {
979
+ const metrics = asMeasuredMetrics(runnerParser(output));
980
+ if (!metrics.metricsMeasured && metrics.testsFailed === 0 && isOpaqueTestCommand(command)) {
981
+ return parseGenericPassFailOutput(output, command);
982
+ }
983
+ return metrics;
984
+ }
985
+ if (
986
+ // node:test emits TAP or (Node 24 default) spec; the generic parser
987
+ // reads both the TAP plan/trailer and the spec tests/pass/fail footer.
988
+ runner === "node-test" || runner === "go" || runner === "cargo" || runner === "maven" || runner === "gradle" || runner === "powershell" || runner === "generic" || // Resolver-lane suites (rspec/minitest, phpunit, dotnet test, swift test,
989
+ // dart test, ctest, R CMD check) are read by the command-family summary
990
+ // parser inside parseGenericPassFailOutput.
991
+ isResolverSuiteRunner(runner)
992
+ ) {
993
+ return parseGenericPassFailOutput(output, command);
994
+ }
995
+ } catch {
996
+ return fallback;
997
+ }
998
+ return fallback;
999
+ }
1000
+
1001
+ // src/core/project/test-execution-evidence.ts
1002
+ function readNodeTapCounters(output) {
1003
+ const tokens = readTapFooterTokens(output, "node");
1004
+ const { tests, pass, fail } = tokens;
1005
+ if (tests === void 0 || pass === void 0 || fail === void 0) return void 0;
1006
+ return {
1007
+ tests,
1008
+ pass,
1009
+ fail,
1010
+ cancelled: tokens.cancelled ?? 0,
1011
+ skipped: tokens.skipped ?? 0,
1012
+ todo: tokens.todo ?? 0
1013
+ };
1014
+ }
1015
+ var VITEST_EXECUTED = /^[ \t]*(?:Tests[ \t]+(?:.* )?[1-9]\d* (?:passed|failed)|Test Files[ \t]+(?:.* )?[1-9]\d* failed)\b/m;
1016
+ var JEST_EXECUTED = /^(?:Tests:[ \t]+(?:.*, )?[1-9]\d* (?:passed|failed)|Test Suites:[ \t]+(?:.*, )?[1-9]\d* failed)\b/m;
1017
+ var PYTEST_SUMMARY = /^(?:=+ )?(\d+ [A-Za-z][A-Za-z ]*(?:, \d+ [A-Za-z][A-Za-z ]*)*) in \d+(?:\.\d+)?s(?: \(\d+:\d{2}:\d{2}\))?(?: =+)?[ \t]*$/gm;
1018
+ var PYTEST_NEUTRAL_PARTS = /* @__PURE__ */ new Set(["skipped", "deselected", "warning", "warnings"]);
1019
+ function readPytestSummaries(output) {
1020
+ return Array.from(output.matchAll(PYTEST_SUMMARY), (match) => {
1021
+ const summary = { executed: 0, skipped: 0 };
1022
+ for (const part of (match[1] ?? "").split(", ")) {
1023
+ const [count = "0", ...name] = part.split(" ");
1024
+ const label = name.join(" ");
1025
+ if (label === "skipped") summary.skipped += Number(count);
1026
+ else if (!PYTEST_NEUTRAL_PARTS.has(label)) summary.executed += Number(count);
1027
+ }
1028
+ return summary;
1029
+ });
1030
+ }
1031
+ function readUnittestTotals(output) {
1032
+ const ran = Array.from(output.matchAll(/^Ran (\d+) tests? in [\d.]+s[ \t]*$/gm)).reduce(
1033
+ (total, match) => total + Number(match[1] ?? 0),
1034
+ 0
1035
+ );
1036
+ const results = Array.from(output.matchAll(/^(?:OK|FAILED)\b.*$/gm), (match) => match[0].trim());
1037
+ const skipCounts = results.map((line) => /^OK \(skipped=(\d+)\)$/.exec(line));
1038
+ return {
1039
+ ran,
1040
+ skipped: skipCounts.reduce((total, match) => total + Number(match?.[1] ?? 0), 0),
1041
+ skipOnly: results.length > 0 && skipCounts.every((match) => match !== null),
1042
+ failed: /^FAILED\b/m.test(output)
1043
+ };
1044
+ }
1045
+ var CARGO_RESULT = /^[ \t]*test result: (ok|FAILED)\. (\d+) passed; (\d+) failed; \d+ ignored; (\d+) measured; \d+ filtered out\b/gm;
1046
+ function readCargoResults(output) {
1047
+ return Array.from(output.matchAll(CARGO_RESULT), (match) => ({
1048
+ ok: match[1] === "ok",
1049
+ executed: Number(match[2] ?? 0) + Number(match[3] ?? 0) + Number(match[4] ?? 0)
1050
+ }));
1051
+ }
1052
+ var GO_EXECUTED_LINES = /^[ \t]*(?:--- (?:PASS|FAIL):|FAIL\b|panic:|Benchmark\S+[ \t]+\d+[ \t])/m;
1053
+ var GO_OK_LINE = /^ok[ \t]+\S+[ \t]+(?:\(cached\)|[\d.]+s)\b(?![^\n]*\[no tests to run\])/m;
1054
+ function goExecuted(output) {
1055
+ if (GO_EXECUTED_LINES.test(output)) return true;
1056
+ return GO_OK_LINE.test(output) && !/^[ \t]*--- SKIP:/m.test(output);
1057
+ }
1058
+ var DART_EXECUTED = /^\d{2,}:\d{2}[ \t]+(?:\+[1-9]\d*|(?:\+\d+[ \t]+)?-[1-9]\d*)\b/m;
1059
+ var SWIFT_EXECUTED = /^[ \t]*Executed [1-9]\d* tests?, with\b|^[^A-Za-z0-9\r\n]*Test run with [1-9]\d* tests?\b/m;
1060
+ var PESTER_EXECUTED = /^Tests Passed: (?:[1-9]\d*, Failed: \d+|\d+, Failed: [1-9]\d*)\b/m;
1061
+ var RSPEC_SUMMARY = /^[ \t]*(\d+) examples?, (\d+) failures?(?:, (\d+) pending)?(?:, (\d+) errors? occurred outside of examples)?[ \t]*$/gm;
1062
+ function readRspecSummaries(output) {
1063
+ return Array.from(output.matchAll(RSPEC_SUMMARY), (match) => {
1064
+ const [examples, failures, pending, errors] = match.slice(1).map((count) => Number(count ?? 0));
1065
+ return {
1066
+ examples: examples ?? 0,
1067
+ executed: Math.max(0, (examples ?? 0) - (pending ?? 0)) + (failures ?? 0) + (errors ?? 0)
1068
+ };
1069
+ });
1070
+ }
1071
+ var MINITEST_SUMMARY = /^[ \t]*(\d+) runs?, \d+ assertions?, (\d+) failures?, (\d+) errors?, (\d+) skips?[ \t]*$/gm;
1072
+ function readMinitestSummaries(output) {
1073
+ return Array.from(output.matchAll(MINITEST_SUMMARY), (match) => {
1074
+ const [runs, failures, errors, skips] = match.slice(1).map(Number);
1075
+ return {
1076
+ runs: runs ?? 0,
1077
+ executed: Math.max(0, (runs ?? 0) - (skips ?? 0)) + (failures ?? 0) + (errors ?? 0)
1078
+ };
1079
+ });
1080
+ }
1081
+ var MAVEN_RUN_LINE = /^[ \t]*(?:\[[A-Z]+\][ \t]*)?Tests run:[ \t]*(\d+),[ \t]*Failures:[ \t]*(\d+),[ \t]*Errors:[ \t]*(\d+)(?:,[ \t]*Skipped:[ \t]*(\d+))?/gm;
1082
+ function readMavenRunLines(output) {
1083
+ return Array.from(output.matchAll(MAVEN_RUN_LINE), (match) => {
1084
+ const [run, failures, errors, skipped] = match.slice(1).map((count) => Number(count ?? 0));
1085
+ return {
1086
+ skipped: skipped ?? 0,
1087
+ executed: Math.max(0, (run ?? 0) - (skipped ?? 0)) + (failures ?? 0) + (errors ?? 0)
1088
+ };
1089
+ });
1090
+ }
1091
+ var DOTNET_SUMMARY = /^[ \t]*(Passed|Failed|Skipped)![ \t]*-[ \t]*Failed:[ \t]*(\d+),[ \t]*Passed:[ \t]*(\d+),[ \t]*Skipped:[ \t]*(\d+),[ \t]*Total:[ \t]*(\d+)\b/gm;
1092
+ function readDotnetSummaries(output) {
1093
+ return Array.from(output.matchAll(DOTNET_SUMMARY), (match) => {
1094
+ const [, outcome, failed, passed, skipped] = match;
1095
+ const executed = Number(failed) + Number(passed);
1096
+ return { skipped: Number(skipped), executed: outcome === "Failed" ? executed + 1 : executed };
1097
+ });
1098
+ }
1099
+ function parsedRunnerRan(runner, output) {
1100
+ const metrics = parseTestOutput(runner, output);
1101
+ return metrics.testsPassed + metrics.testsFailed > 0;
1102
+ }
1103
+ var NODE_EXECUTED_LINE = /^[ \t]*(?:\u2139[ \t]+|# )?(?:pass|fail|cancelled)[ \t]+[1-9]\d*[ \t]*$/m;
1104
+ var MOCHA_EXECUTED_LINE = /^[ \t]*[1-9]\d*[ \t]+(?:passing(?:[ \t]+\([^)\n]*\))?|failing)[ \t]*$/m;
1105
+ var AVA_EXECUTED_LINE = /^[ \t]*[1-9]\d*[ \t]+tests?[ \t]+(?:passed|failed)[ \t]*$/m;
1106
+ var BUN_EXECUTED_LINE = /^[ \t]*[1-9]\d*[ \t]+(?:pass|fail)[ \t]*$/m;
1107
+ function outputProvesTestsRan(output) {
1108
+ const plain = stripAnsiSequences(String(output ?? ""));
1109
+ const nodeSummary = readNodeSpecCounters(plain) ?? readNodeTapCounters(plain);
1110
+ if (nodeSummary && NODE_EXECUTED_LINE.test(plain)) return true;
1111
+ if (readMochaCounters(plain) && MOCHA_EXECUTED_LINE.test(plain)) return true;
1112
+ if (readAvaCounters(plain) && AVA_EXECUTED_LINE.test(plain)) return true;
1113
+ if (readBunCounters(plain) && BUN_EXECUTED_LINE.test(plain)) return true;
1114
+ if (VITEST_EXECUTED.test(plain) || JEST_EXECUTED.test(plain)) return true;
1115
+ if (readPytestSummaries(plain).some((summary) => summary.executed > 0)) return true;
1116
+ const unittest = readUnittestTotals(plain);
1117
+ if (unittest.ran > unittest.skipped || unittest.failed) return true;
1118
+ if (parsedRunnerRan("pytest", plain) || parsedRunnerRan("unittest", plain)) return true;
1119
+ if (readCargoResults(plain).some((result) => !result.ok || result.executed > 0)) return true;
1120
+ if (goExecuted(plain)) return true;
1121
+ if (DART_EXECUTED.test(plain) || SWIFT_EXECUTED.test(plain) || PESTER_EXECUTED.test(plain)) {
1122
+ return true;
1123
+ }
1124
+ if (readRspecSummaries(plain).some((summary) => summary.executed > 0)) return true;
1125
+ if (readMinitestSummaries(plain).some((summary) => summary.executed > 0)) return true;
1126
+ if (readMavenRunLines(plain).some((line) => line.executed > 0)) return true;
1127
+ if (readDotnetSummaries(plain).some((summary) => summary.executed > 0)) return true;
1128
+ return /^[1-9]\d* tests? completed\b/m.test(plain);
1129
+ }
1130
+
1131
+ // src/core/project/zero-executed-runs.ts
1132
+ var VITEST_SKIP_ONLY = /^[ \t]*Tests[ \t]+[1-9]\d* (?:skipped|todo)(?: \| [1-9]\d* (?:skipped|todo))* \(\d+\)[ \t]*$/m;
1133
+ var JEST_SKIP_ONLY = /^Tests:[ \t]+[1-9]\d* (?:skipped|todo)(?:, [1-9]\d* (?:skipped|todo))*, \d+ total[ \t]*$/m;
1134
+ function pytestNothingExecuted(output) {
1135
+ const summaries = readPytestSummaries(output);
1136
+ return summaries.length > 0 && summaries.every((summary) => summary.executed === 0) && summaries.some((summary) => summary.skipped > 0);
1137
+ }
1138
+ function unittestNothingExecuted(output) {
1139
+ const totals = readUnittestTotals(output);
1140
+ return totals.skipOnly && totals.ran > 0 && totals.ran === totals.skipped;
1141
+ }
1142
+ function nodeCountersNothingExecuted(counters) {
1143
+ return counters !== void 0 && counters.tests > 0 && counters.pass + counters.fail + counters.cancelled === 0;
1144
+ }
1145
+ var ZERO_EXECUTED_ROWS = [
1146
+ {
1147
+ runner: "vitest",
1148
+ reason: "vitest ran only skipped or todo tests",
1149
+ languages: ["node"],
1150
+ nothingExecuted: (output) => VITEST_SKIP_ONLY.test(output)
1151
+ },
1152
+ {
1153
+ runner: "jest",
1154
+ reason: "jest ran only skipped or todo tests",
1155
+ languages: ["node"],
1156
+ nothingExecuted: (output) => JEST_SKIP_ONLY.test(output)
1157
+ },
1158
+ {
1159
+ runner: "node-test",
1160
+ reason: "node --test ran only skipped or todo tests",
1161
+ languages: ["node"],
1162
+ nothingExecuted: (output) => nodeCountersNothingExecuted(readNodeSpecCounters(output)) || nodeCountersNothingExecuted(readNodeTapCounters(output))
1163
+ },
1164
+ {
1165
+ runner: "unittest",
1166
+ reason: "unittest skipped every test",
1167
+ languages: ["python"],
1168
+ nothingExecuted: unittestNothingExecuted
1169
+ },
1170
+ {
1171
+ runner: "pytest",
1172
+ reason: "pytest skipped every test",
1173
+ languages: ["python"],
1174
+ nothingExecuted: pytestNothingExecuted
1175
+ },
1176
+ {
1177
+ runner: "cargo",
1178
+ reason: "cargo test executed no tests (all ignored or filtered out)",
1179
+ languages: ["rust"],
1180
+ nothingExecuted: (output) => {
1181
+ const results = readCargoResults(output);
1182
+ return results.length > 0 && results.every((result) => result.ok && result.executed === 0);
1183
+ }
1184
+ },
1185
+ {
1186
+ runner: "go",
1187
+ reason: "go test skipped every test",
1188
+ languages: ["go"],
1189
+ nothingExecuted: (output) => /^[ \t]*--- SKIP:/m.test(output)
1190
+ },
1191
+ {
1192
+ runner: "dart",
1193
+ reason: "dart test skipped every test",
1194
+ languages: ["dart"],
1195
+ nothingExecuted: (output) => /^\d{2,}:\d{2}[ \t]+\+0(?:[ \t]+~\d+)?:[ \t]*All tests skipped\.[ \t]*$/m.test(output)
1196
+ },
1197
+ {
1198
+ runner: "swiftpm",
1199
+ reason: "swift test matched no test cases",
1200
+ languages: ["swift"],
1201
+ nothingExecuted: (output) => /^warning: No matching test cases were run[ \t]*$/m.test(output)
1202
+ },
1203
+ {
1204
+ runner: "pester",
1205
+ reason: "Invoke-Pester found no test files",
1206
+ // Pester is not a classified runner: only an unclassified wrapper reaches this row.
1207
+ languages: [],
1208
+ nothingExecuted: (output) => /^(?:System\.Management\.Automation\.)?RuntimeException: No test files were found and no scriptblocks were provided\./m.test(
1209
+ output
1210
+ )
1211
+ },
1212
+ {
1213
+ runner: "rspec",
1214
+ reason: "rspec left every example pending",
1215
+ languages: ["ruby"],
1216
+ nothingExecuted: (output) => {
1217
+ const summaries = readRspecSummaries(output);
1218
+ return summaries.length > 0 && summaries.every((summary) => summary.examples > 0 && summary.executed === 0);
1219
+ }
1220
+ },
1221
+ {
1222
+ runner: "minitest",
1223
+ reason: "minitest skipped every test",
1224
+ languages: ["ruby"],
1225
+ nothingExecuted: (output) => {
1226
+ const summaries = readMinitestSummaries(output);
1227
+ return summaries.length > 0 && summaries.every((summary) => summary.runs > 0 && summary.executed === 0);
1228
+ }
1229
+ },
1230
+ {
1231
+ runner: "maven",
1232
+ reason: "maven surefire skipped every test",
1233
+ languages: ["jvm"],
1234
+ nothingExecuted: (output) => {
1235
+ const lines2 = readMavenRunLines(output);
1236
+ return lines2.length > 0 && lines2.every((line) => line.executed === 0) && lines2.some((line) => line.skipped > 0);
1237
+ }
1238
+ },
1239
+ {
1240
+ runner: "dotnet",
1241
+ reason: "dotnet test skipped every test",
1242
+ languages: ["dotnet"],
1243
+ nothingExecuted: (output) => {
1244
+ const summaries = readDotnetSummaries(output);
1245
+ return summaries.length > 0 && summaries.every((summary) => summary.executed === 0) && summaries.some((summary) => summary.skipped > 0);
1246
+ }
1247
+ }
1248
+ ];
1249
+ function rowApplies(row, command) {
1250
+ return row.languages.length === 0 ? applicableRunnerLanguages(command) === "all" : row.languages.some((language) => runnerRowApplies(command, language));
1251
+ }
1252
+ function detectZeroExecutedRun(command, plainOutput, hint) {
1253
+ const descriptor = describeVerificationCommand(command, hint);
1254
+ if (descriptor.kind !== "test" && descriptor.kind !== "unknown") return void 0;
1255
+ const row = ZERO_EXECUTED_ROWS.find(
1256
+ (candidate) => rowApplies(candidate, descriptor) && candidate.nothingExecuted(plainOutput)
1257
+ );
1258
+ return row ? { runner: row.runner, reason: row.reason } : void 0;
1259
+ }
1260
+
1261
+ // src/core/project/empty-run-exits.ts
1262
+ var ANSI_CSI = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*[A-Za-z]`, "g");
1263
+ var EMPTY_RUN_ROWS = [
1264
+ {
1265
+ runner: "jest",
1266
+ reason: "jest found no tests",
1267
+ languages: ["node"],
1268
+ exitCodes: [1],
1269
+ signatures: [/^[ \t]*No tests found, exiting with code 1[ \t]*$/m]
1270
+ },
1271
+ {
1272
+ runner: "vitest",
1273
+ reason: "vitest found no test files",
1274
+ languages: ["node"],
1275
+ exitCodes: [1],
1276
+ signatures: [/^[ \t]*No test files found, exiting with code 1[ \t]*$/m]
1277
+ },
1278
+ {
1279
+ runner: "mocha",
1280
+ reason: "mocha found no test files",
1281
+ languages: ["node"],
1282
+ exitCodes: [1],
1283
+ signatures: [/^[ \t]*Error: No test files found: ".*"[ \t]*$/m]
1284
+ },
1285
+ {
1286
+ runner: "bun",
1287
+ reason: "bun found no tests",
1288
+ languages: ["node"],
1289
+ exitCodes: [1],
1290
+ signatures: [
1291
+ /^error: 0 test files matching .+ in --cwd=".*"[ \t]*$/m,
1292
+ /^error: regex ".*" matched 0 tests\. Searched \d+ files? \(skipping \d+ tests?\)/m
1293
+ ]
1294
+ },
1295
+ {
1296
+ runner: "ava",
1297
+ reason: "ava found no test files",
1298
+ languages: ["node"],
1299
+ exitCodes: [1],
1300
+ signatures: [/^[ \t]*(?:\u2718[ \t]+)?Couldn['’]t find any files to test[ \t]*$/m]
1301
+ },
1302
+ {
1303
+ runner: "swiftpm",
1304
+ reason: "SwiftPM found no tests",
1305
+ languages: ["swift"],
1306
+ exitCodes: [1],
1307
+ signatures: [/^error: no tests found; create a target in the 'Tests' directory[ \t]*$/m]
1308
+ },
1309
+ {
1310
+ runner: "maven",
1311
+ reason: "Maven Surefire matched no tests",
1312
+ languages: ["jvm"],
1313
+ exitCodes: [1],
1314
+ signatures: [
1315
+ /^\[ERROR\] Failed to execute goal \S*surefire\S* .*No tests matching pattern ".*" were executed!/m
1316
+ ]
1317
+ },
1318
+ {
1319
+ runner: "gradle",
1320
+ reason: "Gradle matched no tests",
1321
+ languages: ["jvm"],
1322
+ exitCodes: [1],
1323
+ signatures: [/^> No tests found for given includes: \[.*\]\(--tests filter\)[ \t]*$/m]
1324
+ },
1325
+ {
1326
+ runner: "dart",
1327
+ reason: "dart test ran no tests",
1328
+ languages: ["dart"],
1329
+ exitCodes: [79],
1330
+ signatures: [/^No tests ran\.[ \t]*\r?\n(?:No tests were found\.|No tests match )/m]
1331
+ },
1332
+ {
1333
+ runner: "dart",
1334
+ reason: "dart test found no test directory",
1335
+ languages: ["dart"],
1336
+ exitCodes: [65],
1337
+ signatures: [
1338
+ /^No test files were passed and the default "test\/" directory doesn't exist\.[ \t]*$/m
1339
+ ]
1340
+ },
1341
+ {
1342
+ runner: "unittest",
1343
+ reason: "unittest ran no tests",
1344
+ languages: ["python"],
1345
+ exitCodes: [5],
1346
+ signatures: [/^NO TESTS RAN[ \t]*$/m],
1347
+ commandGate: isPythonStdlibUnittestCommand
1348
+ }
1349
+ ];
1350
+ var RUN_ERROR_LINES = [
1351
+ /\berror TS\d+:/,
1352
+ /\berror CS\d+:/,
1353
+ /\berror\[E\d+\]/,
1354
+ /^[ \t]*error: could not compile\b/m,
1355
+ /:\d+(?::\d+)?: (?:fatal )?error:/,
1356
+ /:\d+:\d+: Error:/,
1357
+ /\bCOMPILATION (?:ERROR|FAILURE)\b/,
1358
+ /^[ \t]*>?[ \t]*Task :\S*compile\S* FAILED\b/m,
1359
+ /\[build failed\]/,
1360
+ /^[ \t]*(?:Uncaught )?(?:SyntaxError|ReferenceError|TypeError|ImportError|ModuleNotFoundError)\b/m,
1361
+ /\bCannot find module\b|\bERR_MODULE_NOT_FOUND\b|\bFailed to resolve import\b/,
1362
+ /^[ \t]*Failed to load "/m
1363
+ ];
1364
+ function matchedRow(row, descriptor, exitCode, output) {
1365
+ if (!row.exitCodes.includes(exitCode)) return false;
1366
+ if (!row.languages.some((language) => runnerRowApplies(descriptor, language))) return false;
1367
+ const ownCommand = applicableRunnerLanguages(descriptor) !== "all";
1368
+ if (ownCommand && row.commandGate && !row.commandGate(descriptor.command)) return false;
1369
+ if (!row.signatures.some((signature) => signature.test(output))) return false;
1370
+ return !RUN_ERROR_LINES.some((pattern) => pattern.test(output));
1371
+ }
1372
+ function detectEmptyRun(command, output, exitCode, hint) {
1373
+ const plain = String(output ?? "").replace(ANSI_CSI, "");
1374
+ if (exitCode === 0) {
1375
+ if (detectZeroCollectedTests(command, output, hint)) {
1376
+ return {
1377
+ runner: "zero-collected",
1378
+ reason: "zero collected",
1379
+ message: "Test command exited 0 but collected/ran zero tests; no verification evidence."
1380
+ };
1381
+ }
1382
+ const zeroExecuted = outputProvesTestsRan(plain) ? void 0 : detectZeroExecutedRun(command, plain, hint);
1383
+ return zeroExecuted ? {
1384
+ runner: zeroExecuted.runner,
1385
+ reason: zeroExecuted.reason,
1386
+ message: `Test command exited 0 but executed no tests (${zeroExecuted.reason}); no verification evidence.`
1387
+ } : void 0;
1388
+ }
1389
+ const descriptor = describeVerificationCommand(command, hint);
1390
+ if (descriptor.kind !== "test" && descriptor.kind !== "unknown") return void 0;
1391
+ const row = outputProvesTestsRan(plain) ? void 0 : EMPTY_RUN_ROWS.find((candidate) => matchedRow(candidate, descriptor, exitCode, plain));
1392
+ return row ? {
1393
+ runner: row.runner,
1394
+ reason: row.reason,
1395
+ message: `Test command exited ${exitCode} having run no tests (${row.reason}); no verification evidence.`
1396
+ } : void 0;
1397
+ }
1398
+ function detectEmptyRunOfResult(command, result, output, hint) {
1399
+ if (typeof result.exitCode !== "number" || result.timedOut === true || result.isCanceled === true || result.isMaxBuffer === true) {
1400
+ return void 0;
1401
+ }
1402
+ return detectEmptyRun(command, output, result.exitCode, hint);
1403
+ }
1404
+
1405
+ // src/core/verification/verification-disposition.ts
1406
+ function deriveVerificationDisposition(input) {
1407
+ const scope = input.scope ?? "unknown";
1408
+ const uncovered = input.uncovered && input.uncovered.length > 0 ? input.uncovered : void 0;
1409
+ const base = {
1410
+ scope,
1411
+ ...input.reason ? { reason: input.reason } : {},
1412
+ ...uncovered ? { uncovered } : {}
1413
+ };
1414
+ if (!input.passed && !input.unavailable) return { outcome: "failed", ...base };
1415
+ if (input.unavailable || uncovered) return { outcome: "unverified", ...base };
1416
+ if (input.required === false) return { outcome: "not-required", ...base };
1417
+ return { outcome: "passed", ...base };
1418
+ }
1419
+ function aggregateVerificationDispositions(entries, defaultScope = "unknown") {
1420
+ const relevant = [];
1421
+ for (const entry of entries) {
1422
+ if (entry.verification) relevant.push(entry.verification);
1423
+ else if (!entry.passed) relevant.push({ outcome: "failed", scope: defaultScope });
1424
+ }
1425
+ if (relevant.length === 0) return void 0;
1426
+ const failed = relevant.find((d) => d.outcome === "failed");
1427
+ if (failed) return failed;
1428
+ const unverified = relevant.filter((d) => d.outcome === "unverified");
1429
+ if (unverified.length > 0) {
1430
+ const reasons = unverified.map((d) => d.reason).filter((r) => Boolean(r));
1431
+ const uncovered = unverified.flatMap((d) => d.uncovered ?? []);
1432
+ const scope = unverified.some((d) => d.scope === "project") ? "project" : unverified[0]?.scope ?? "unknown";
1433
+ return {
1434
+ outcome: "unverified",
1435
+ scope,
1436
+ ...reasons.length > 0 ? { reason: reasons.join("; ") } : {},
1437
+ ...uncovered.length > 0 ? { uncovered } : {}
1438
+ };
1439
+ }
1440
+ return relevant.find((d) => d.outcome === "passed") ?? relevant[0];
1441
+ }
1442
+ var SCOPE_TEXT = {
1443
+ task: "this task",
1444
+ project: "the project",
1445
+ unknown: "an unknown scope"
1446
+ };
1447
+ function formatUnverifiedDeliveryLabel(disposition) {
1448
+ if (disposition.outcome !== "unverified") return void 0;
1449
+ const reason = disposition.reason?.trim().replace(/[.\s]+$/, "");
1450
+ return `Delivered, unverified: tests for ${SCOPE_TEXT[disposition.scope]} were not verified; ${reason || "no verification result was available"}.`;
1451
+ }
1452
+
1453
+ // src/core/verification/typescript-diagnostic-patterns.ts
1454
+ var LOCATION_PREFIX = {
1455
+ parenthesized: /^(.+?)\((\d+),(\d+)\):/.source,
1456
+ colon: /^(.+?):(\d+):(\d+)\s*-/.source
1457
+ };
1458
+ function createTypeScriptLocatedErrorPattern(location, options) {
1459
+ return new RegExp(
1460
+ LOCATION_PREFIX[location] + (options.locationWhitespace === "required" ? /\s+/.source : /\s*/.source) + /error\s+(TS\d+)/.source + (options.message === "required" ? /:\s*(.*)$/.source : ""),
1461
+ options.multiline ? "gm" : ""
1462
+ );
1463
+ }
1464
+
1465
+ // src/core/project/biome-json-diagnostics.ts
1466
+ function extractBiomeJson(text) {
1467
+ const raw = String(text ?? "").trim();
1468
+ if (!raw) return null;
1469
+ const start = raw.indexOf("{");
1470
+ const end = raw.lastIndexOf("}");
1471
+ if (start < 0 || end <= start) return null;
1472
+ const candidate = raw.slice(start, end + 1);
1473
+ try {
1474
+ return { text: candidate, parsed: JSON.parse(candidate) };
1475
+ } catch {
1476
+ return null;
1477
+ }
1478
+ }
1479
+ function asRecord(value) {
1480
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
1481
+ }
1482
+ function readFile(location) {
1483
+ const path = location.path;
1484
+ const file = typeof path === "string" ? path : asRecord(path)?.file;
1485
+ return typeof file === "string" && file.trim().length > 0 ? file : void 0;
1486
+ }
1487
+ function readPosition(location) {
1488
+ const span = location.span;
1489
+ const legacy = asRecord(asRecord(span)?.start) ?? asRecord(location.start);
1490
+ if (legacy) {
1491
+ return {
1492
+ line: typeof legacy.line === "number" ? legacy.line : void 0,
1493
+ column: typeof legacy.column === "number" ? legacy.column : void 0
1494
+ };
1495
+ }
1496
+ const offset = Array.isArray(span) ? span[0] : void 0;
1497
+ const source = location.sourceCode;
1498
+ if (typeof offset !== "number" || offset < 0 || typeof source !== "string") return {};
1499
+ const prefix = Buffer.from(source, "utf8").subarray(0, offset).toString("utf8");
1500
+ const lastBreak = prefix.lastIndexOf("\n");
1501
+ return { line: prefix.split("\n").length, column: prefix.length - lastBreak };
1502
+ }
1503
+ function readMessage(diag) {
1504
+ if (typeof diag.description === "string" && diag.description) return diag.description;
1505
+ const message = diag.message;
1506
+ if (typeof message === "string") return message;
1507
+ const text = asRecord(message)?.text;
1508
+ if (typeof text === "string") return text;
1509
+ if (Array.isArray(message)) {
1510
+ const joined = message.map((part) => {
1511
+ const content = asRecord(part)?.content;
1512
+ return typeof content === "string" ? content : "";
1513
+ }).join("");
1514
+ return joined || void 0;
1515
+ }
1516
+ return void 0;
1517
+ }
1518
+ function readCategory(diag) {
1519
+ for (const key of ["category", "code", "rule"]) {
1520
+ const value = diag[key];
1521
+ if (typeof value === "string") return value;
1522
+ }
1523
+ return void 0;
1524
+ }
1525
+ function readBiomeDiagnostics(parsed) {
1526
+ const diagnostics = asRecord(parsed)?.diagnostics;
1527
+ if (!Array.isArray(diagnostics)) return [];
1528
+ const out = [];
1529
+ for (const entry of diagnostics) {
1530
+ const diag = asRecord(entry);
1531
+ const location = asRecord(diag?.location);
1532
+ if (!diag || !location) continue;
1533
+ const file = readFile(location);
1534
+ if (!file) continue;
1535
+ const { line, column } = readPosition(location);
1536
+ const tags = Array.isArray(diag.tags) ? diag.tags : [];
1537
+ out.push({
1538
+ file,
1539
+ category: readCategory(diag),
1540
+ severity: typeof diag.severity === "string" ? diag.severity : void 0,
1541
+ message: readMessage(diag),
1542
+ line,
1543
+ column,
1544
+ fixable: diag.canFix === true || tags.includes("fixable")
1545
+ });
1546
+ }
1547
+ return out;
1548
+ }
1549
+
1550
+ // src/core/verification/issue-identity.ts
1551
+ import { createHash } from "crypto";
1552
+ var IssueSet = class _IssueSet {
1553
+ issues = /* @__PURE__ */ new Map();
1554
+ /** Occurrence count per stable key (multiset cardinality of that signature). */
1555
+ counts = /* @__PURE__ */ new Map();
1556
+ constructor(issues) {
1557
+ if (issues) {
1558
+ for (const issue of issues) {
1559
+ this.add(issue);
1560
+ }
1561
+ }
1562
+ }
1563
+ add(issue) {
1564
+ this.issues.set(issue.key, issue);
1565
+ this.counts.set(issue.key, (this.counts.get(issue.key) ?? 0) + 1);
1566
+ }
1567
+ /**
1568
+ * Replace the representative issue for an existing key without changing
1569
+ * occurrence count. Used by multi-command max-union so last-command wins for
1570
+ * display fields and sentinel magnitude while counts stay max-of-counts.
1571
+ */
1572
+ setRepresentative(issue) {
1573
+ if (!this.issues.has(issue.key)) return;
1574
+ this.issues.set(issue.key, issue);
1575
+ }
1576
+ has(key) {
1577
+ return this.issues.has(key);
1578
+ }
1579
+ get(key) {
1580
+ return this.issues.get(key);
1581
+ }
1582
+ /**
1583
+ * Occurrences of a stable key in this multiset (0 if absent).
1584
+ * Minimal public surface for occurrence-aware comparison.
1585
+ */
1586
+ countOf(key) {
1587
+ return this.counts.get(key) ?? 0;
1588
+ }
1589
+ /** Total occurrences across all stable keys (multiset cardinality). */
1590
+ get size() {
1591
+ let total = 0;
1592
+ for (const n of this.counts.values()) {
1593
+ total += n;
1594
+ }
1595
+ return total;
1596
+ }
1597
+ keys() {
1598
+ return this.issues.keys();
1599
+ }
1600
+ values() {
1601
+ return this.issues.values();
1602
+ }
1603
+ /** One representative issue per distinct stable key (not expanded by multiplicity). */
1604
+ toArray() {
1605
+ return Array.from(this.issues.values());
1606
+ }
1607
+ /**
1608
+ * Multiset difference: occurrences in this set beyond those in other.
1609
+ * Excess count for a shared key is reported as new/fixed occurrences.
1610
+ */
1611
+ difference(other) {
1612
+ const result = new _IssueSet();
1613
+ for (const issue of this.toArray()) {
1614
+ const excess = this.countOf(issue.key) - other.countOf(issue.key);
1615
+ for (let i = 0; i < excess; i++) {
1616
+ result.add(issue);
1617
+ }
1618
+ }
1619
+ return result;
1620
+ }
1621
+ /**
1622
+ * Multiset intersection: min(count_this, count_other) per shared key.
1623
+ */
1624
+ intersection(other) {
1625
+ const result = new _IssueSet();
1626
+ for (const issue of this.toArray()) {
1627
+ const shared = Math.min(this.countOf(issue.key), other.countOf(issue.key));
1628
+ for (let i = 0; i < shared; i++) {
1629
+ result.add(issue);
1630
+ }
1631
+ }
1632
+ return result;
1633
+ }
1634
+ };
1635
+ function normalizePath(filePath) {
1636
+ let normalized = filePath.replace(/^\/Users\/[^/]+\/(?:[^/]+\/){1,5}/, "").replace(/^\/home\/[^/]+\/(?:[^/]+\/){1,5}/, "").replace(/^\/tmp\/(?:[^/]+\/){1,3}/, "").replace(/^C:\\Users\\[^\\]+\\(?:[^\\]+\\){1,5}/, "").replace(/^\.\//, "");
1637
+ normalized = normalized.replace(/\\/g, "/");
1638
+ return normalized;
1639
+ }
1640
+ function normalizeMessage(message) {
1641
+ let normalized = message;
1642
+ normalized = normalized.replace(/\bline\s+\d+/gi, "line <n>").replace(/\bcolumn\s+\d+/gi, "column <n>").replace(/\bat\s+\d+:\d+/gi, "at <n>:<n>").replace(/\(\d+,\s*\d+\)/g, "(<n>, <n>)").replace(/:\d+:\d+/g, ":<n>:<n>");
1643
+ normalized = normalized.replace(/'[^']+'/g, "'<id>'").replace(/"[^"]+"/g, '"<id>"').replace(/`[^`]+`/g, "`<id>`").replace(/‘[^’]+’/g, "'<id>'").replace(/“[^”]+”/g, '"<id>"');
1644
+ normalized = normalized.replace(/(?<!TS|ts)\b\d+\b/g, "<n>");
1645
+ normalized = normalized.replace(/(?:\/[a-zA-Z0-9_.-]+)+(?:\.[a-zA-Z0-9]+)?/g, (match) => {
1646
+ if (match.includes("/") && match.length > 5) {
1647
+ return "<path>";
1648
+ }
1649
+ return match;
1650
+ });
1651
+ normalized = normalized.replace(/\s+/g, " ").trim();
1652
+ return normalized;
1653
+ }
1654
+ function hashMessage(normalizedMessage) {
1655
+ return createHash("sha256").update(normalizedMessage).digest("hex").slice(0, 12);
1656
+ }
1657
+ function createKey(gate, file, code, messageHash) {
1658
+ return `${gate}:${file}:${code}:${messageHash}`;
1659
+ }
1660
+ function createDiagnosticIssue(params) {
1661
+ const file = normalizePath(params.filePath);
1662
+ if (!isProjectSourcePath(file)) return null;
1663
+ const code = params.code.trim() || "__diagnostic__";
1664
+ const normalizedMsg = normalizeMessage(params.message);
1665
+ const msgHash = hashMessage(normalizedMsg || code);
1666
+ return {
1667
+ gate: params.gate,
1668
+ file,
1669
+ code,
1670
+ messageHash: msgHash,
1671
+ key: createKey(params.gate, file, code, msgHash),
1672
+ line: params.line,
1673
+ col: params.col,
1674
+ originalMessage: params.message
1675
+ };
1676
+ }
1677
+ var DIAGNOSTIC_SEVERITY_LINE = /(?:^|[^a-z])(?:error|warning|failed|failure)\b/i;
1678
+ var DIAGNOSTIC_LOCATION_LINE = /(?:^|\s)\S+:\d+(?::\d+)?:/;
1679
+ var TRANSFER_NOISE_LINE = /^\s*(?:\[(?:INFO|DEBUG)\]\s*)?(?:Downloading|Downloaded|Download|Progress \(\d+\)|Fetching|Receiving|Resolving|Unpacking|Uploading|Uploaded)\b/i;
1680
+ function isTransferNoiseLine(line) {
1681
+ return TRANSFER_NOISE_LINE.test(line);
1682
+ }
1683
+ function countUnparseableDiagnostics(output) {
1684
+ if (!output) return 0;
1685
+ let count = 0;
1686
+ for (const rawLine of output.split(/\r?\n/)) {
1687
+ if (isTransferNoiseLine(rawLine)) continue;
1688
+ if (DIAGNOSTIC_SEVERITY_LINE.test(rawLine) || DIAGNOSTIC_LOCATION_LINE.test(rawLine)) {
1689
+ count += 1;
1690
+ }
1691
+ }
1692
+ return count;
1693
+ }
1694
+ function parseTypeScriptError(line) {
1695
+ let match = createTypeScriptLocatedErrorPattern("parenthesized", {
1696
+ message: "required",
1697
+ locationWhitespace: "optional"
1698
+ }).exec(line);
1699
+ if (match) {
1700
+ const filePath = match[1] ?? "";
1701
+ const lineNum = match[2] ?? "0";
1702
+ const colNum = match[3] ?? "0";
1703
+ const code = match[4] ?? "";
1704
+ const message = match[5];
1705
+ const file = normalizePath(filePath);
1706
+ const normalizedMsg = normalizeMessage(message ?? "");
1707
+ const msgHash = hashMessage(normalizedMsg);
1708
+ return {
1709
+ gate: "build",
1710
+ file,
1711
+ code,
1712
+ messageHash: msgHash,
1713
+ key: createKey("build", file, code, msgHash),
1714
+ line: Number.parseInt(lineNum, 10),
1715
+ col: Number.parseInt(colNum, 10),
1716
+ originalMessage: message
1717
+ };
1718
+ }
1719
+ match = createTypeScriptLocatedErrorPattern("colon", {
1720
+ message: "required",
1721
+ locationWhitespace: "optional"
1722
+ }).exec(line);
1723
+ if (match) {
1724
+ const filePath = match[1] ?? "";
1725
+ const lineNum = match[2] ?? "0";
1726
+ const colNum = match[3] ?? "0";
1727
+ const code = match[4] ?? "";
1728
+ const message = match[5];
1729
+ const file = normalizePath(filePath);
1730
+ const normalizedMsg = normalizeMessage(message ?? "");
1731
+ const msgHash = hashMessage(normalizedMsg);
1732
+ return {
1733
+ gate: "build",
1734
+ file,
1735
+ code,
1736
+ messageHash: msgHash,
1737
+ key: createKey("build", file, code, msgHash),
1738
+ line: Number.parseInt(lineNum, 10),
1739
+ col: Number.parseInt(colNum, 10),
1740
+ originalMessage: message
1741
+ };
1742
+ }
1743
+ return null;
1744
+ }
1745
+ function parseLintError(filePath, ruleId, message, line, col) {
1746
+ const file = normalizePath(filePath);
1747
+ const normalizedMsg = message ? normalizeMessage(message) : "";
1748
+ const msgHash = hashMessage(normalizedMsg || ruleId);
1749
+ return {
1750
+ gate: "lint",
1751
+ file,
1752
+ code: ruleId,
1753
+ messageHash: msgHash,
1754
+ key: createKey("lint", file, ruleId, msgHash),
1755
+ line,
1756
+ col,
1757
+ originalMessage: message
1758
+ };
1759
+ }
1760
+ function parseLintErrorLine(line) {
1761
+ const match = /^(.+?):(\d+):(\d+)\s+(?:error|warning)\s+(.+?)\s+(\S+)\s*$/.exec(line);
1762
+ if (match) {
1763
+ const filePath = match[1] ?? "";
1764
+ const lineNum = match[2] ?? "0";
1765
+ const colNum = match[3] ?? "0";
1766
+ const message = match[4];
1767
+ const ruleId = match[5] ?? "";
1768
+ return parseLintError(
1769
+ filePath,
1770
+ ruleId,
1771
+ message,
1772
+ Number.parseInt(lineNum, 10),
1773
+ Number.parseInt(colNum, 10)
1774
+ );
1775
+ }
1776
+ return null;
1777
+ }
1778
+ function parseBiomePrettyLine(line) {
1779
+ if (/^\s/.test(line) || /\bat\s+\S/.test(line) || /\s-\s+error\s/.test(line)) {
1780
+ return null;
1781
+ }
1782
+ const isLikelyPath = (filePath) => filePath.length > 0 && !/[{}[\]()"'`]/.test(filePath) && !filePath.includes("diagnostics") && !filePath.includes(" ");
1783
+ const fullMatch = /^(.+?):(\d+):(\d+)\s+([a-z]+\/\S+)(?:\s|$)/.exec(line);
1784
+ if (fullMatch) {
1785
+ const filePath = fullMatch[1] ?? "";
1786
+ if (!isLikelyPath(filePath)) return null;
1787
+ const lineNum = Number.parseInt(fullMatch[2] ?? "0", 10);
1788
+ const colNum = Number.parseInt(fullMatch[3] ?? "0", 10);
1789
+ const ruleId = fullMatch[4] ?? "";
1790
+ return parseLintError(filePath, ruleId, void 0, lineNum, colNum);
1791
+ }
1792
+ const truncatedMatch = /^([a-zA-Z0-9_./-]+):(\d+):(\d+)(?:\s+(\S+))?$/.exec(line);
1793
+ if (truncatedMatch) {
1794
+ const filePath = truncatedMatch[1] ?? "";
1795
+ if (!isLikelyPath(filePath)) return null;
1796
+ const lineNum = Number.parseInt(truncatedMatch[2] ?? "0", 10);
1797
+ const colNum = Number.parseInt(truncatedMatch[3] ?? "0", 10);
1798
+ const ruleIdCandidate = truncatedMatch[4] ?? "";
1799
+ const ruleId = ruleIdCandidate.includes("/") ? ruleIdCandidate : "__biome_pretty_diagnostic__";
1800
+ return parseLintError(filePath, ruleId, void 0, lineNum, colNum);
1801
+ }
1802
+ return null;
1803
+ }
1804
+ function parseTestFailure(testName, filePath, magnitude) {
1805
+ const file = filePath ? normalizePath(filePath) : "";
1806
+ const msgHash = hashMessage(testName);
1807
+ return {
1808
+ gate: "test",
1809
+ file,
1810
+ code: testName,
1811
+ messageHash: msgHash,
1812
+ key: createKey("test", file, testName, msgHash),
1813
+ originalMessage: testName,
1814
+ magnitude
1815
+ };
1816
+ }
1817
+ function parseBuildFailure(marker, filePath, magnitude) {
1818
+ const file = filePath ? normalizePath(filePath) : "";
1819
+ const msgHash = hashMessage(marker);
1820
+ return {
1821
+ gate: "build",
1822
+ file,
1823
+ code: marker,
1824
+ messageHash: msgHash,
1825
+ key: createKey("build", file, marker, msgHash),
1826
+ originalMessage: marker,
1827
+ magnitude
1828
+ };
1829
+ }
1830
+ function parseLintFailure(marker, filePath, magnitude) {
1831
+ const file = filePath ? normalizePath(filePath) : "";
1832
+ const msgHash = hashMessage(marker);
1833
+ return {
1834
+ gate: "lint",
1835
+ file,
1836
+ code: marker,
1837
+ messageHash: msgHash,
1838
+ key: createKey("lint", file, marker, msgHash),
1839
+ originalMessage: marker,
1840
+ magnitude
1841
+ };
1842
+ }
1843
+ var UNPARSEABLE_BUILD_SENTINEL = "__unparseable_build_failures__";
1844
+ var UNPARSEABLE_LINT_SENTINEL = "__unparseable_lint_failures__";
1845
+ var UNPARSEABLE_TEST_SENTINEL = "__unparseable_test_failures__";
1846
+ function extractTypeScriptIssues(output) {
1847
+ const issues = new IssueSet();
1848
+ for (const line of output.split(/\r?\n/)) {
1849
+ const issue = parseTypeScriptError(line.trim());
1850
+ if (issue) {
1851
+ issues.add(issue);
1852
+ }
1853
+ }
1854
+ return issues;
1855
+ }
1856
+ function parseLocationDiagnosticLine(line, gate) {
1857
+ const trimmed = line.trim();
1858
+ const javaMatch = /^(.+?\.java):(\d+):\s*(error|warning):\s*(.+)$/.exec(trimmed);
1859
+ if (javaMatch) {
1860
+ return createDiagnosticIssue({
1861
+ gate,
1862
+ filePath: javaMatch[1] ?? "",
1863
+ code: javaMatch[3] ?? "__java_diagnostic__",
1864
+ message: javaMatch[4] ?? "",
1865
+ line: Number.parseInt(javaMatch[2] ?? "0", 10)
1866
+ });
1867
+ }
1868
+ const ruffOrMypyMatch = /^(.+?\.py):(\d+):(?:(\d+):)?\s*(?:(error|warning|[A-Z]\d{3,4}|[a-z][a-z0-9_-]+):\s*)?(.+)$/i.exec(
1869
+ trimmed
1870
+ );
1871
+ if (ruffOrMypyMatch) {
1872
+ const rawMessage = ruffOrMypyMatch[5] ?? "";
1873
+ const inlineCode = /^([A-Z]\d{3,4})\s+(.+)$/.exec(rawMessage);
1874
+ return createDiagnosticIssue({
1875
+ gate,
1876
+ filePath: ruffOrMypyMatch[1] ?? "",
1877
+ code: ruffOrMypyMatch[4] ?? inlineCode?.[1] ?? "__python_diagnostic__",
1878
+ message: inlineCode?.[2] ?? rawMessage,
1879
+ line: Number.parseInt(ruffOrMypyMatch[2] ?? "0", 10),
1880
+ col: ruffOrMypyMatch[3] ? Number.parseInt(ruffOrMypyMatch[3] ?? "0", 10) : void 0
1881
+ });
1882
+ }
1883
+ const goMatch = /^(.+?\.go):(\d+):(?:(\d+):)?\s*(.+)$/.exec(trimmed);
1884
+ if (goMatch) {
1885
+ return createDiagnosticIssue({
1886
+ gate,
1887
+ filePath: goMatch[1] ?? "",
1888
+ code: "__go_diagnostic__",
1889
+ message: goMatch[4] ?? "",
1890
+ line: Number.parseInt(goMatch[2] ?? "0", 10),
1891
+ col: goMatch[3] ? Number.parseInt(goMatch[3] ?? "0", 10) : void 0
1892
+ });
1893
+ }
1894
+ return null;
1895
+ }
1896
+ function extractRustDiagnostics(output, gate) {
1897
+ const issues = new IssueSet();
1898
+ let pending = null;
1899
+ for (const rawLine of output.split(/\r?\n/)) {
1900
+ const line = rawLine.trimEnd();
1901
+ const header = /^(?:error|warning)(?:\[(E\d+)\])?:\s*(.+)$/.exec(line.trim());
1902
+ if (header) {
1903
+ pending = {
1904
+ code: header[1] ?? (line.trim().startsWith("warning") ? "__rust_warning__" : "__rust_error__"),
1905
+ message: header[2] ?? ""
1906
+ };
1907
+ continue;
1908
+ }
1909
+ const location = /^\s*-->\s+(.+?\.rs):(\d+):(\d+)/.exec(line);
1910
+ if (location && pending) {
1911
+ const issue = createDiagnosticIssue({
1912
+ gate,
1913
+ filePath: location[1] ?? "",
1914
+ code: pending.code,
1915
+ message: pending.message,
1916
+ line: Number.parseInt(location[2] ?? "0", 10),
1917
+ col: Number.parseInt(location[3] ?? "0", 10)
1918
+ });
1919
+ if (issue) issues.add(issue);
1920
+ pending = null;
1921
+ }
1922
+ }
1923
+ return issues;
1924
+ }
1925
+ function extractLocationDiagnostics(output, gate) {
1926
+ const issues = extractRustDiagnostics(output, gate);
1927
+ for (const line of output.split(/\r?\n/)) {
1928
+ const issue = parseLocationDiagnosticLine(line, gate);
1929
+ if (issue) issues.add(issue);
1930
+ }
1931
+ return issues;
1932
+ }
1933
+ function extractNonNodeBuildIssues(output) {
1934
+ return extractLocationDiagnostics(output, "build");
1935
+ }
1936
+ function extractNonNodeLintIssues(output) {
1937
+ return extractLocationDiagnostics(output, "lint");
1938
+ }
1939
+ function extractBiomeLintIssues(output) {
1940
+ const issues = new IssueSet();
1941
+ const extracted = extractBiomeJson(output);
1942
+ if (extracted) {
1943
+ for (const diag of readBiomeDiagnostics(extracted.parsed)) {
1944
+ issues.add(
1945
+ parseLintError(diag.file, diag.category ?? "unknown", diag.message, diag.line, diag.column)
1946
+ );
1947
+ }
1948
+ }
1949
+ if (issues.size > 0) return issues;
1950
+ for (const line of output.split(/\r?\n/)) {
1951
+ const issue = parseLintErrorLine(line.trim());
1952
+ if (issue) {
1953
+ issues.add(issue);
1954
+ continue;
1955
+ }
1956
+ const biomePretty = parseBiomePrettyLine(line.trim());
1957
+ if (biomePretty) {
1958
+ issues.add(biomePretty);
1959
+ }
1960
+ }
1961
+ return issues;
1962
+ }
1963
+ function looksLikeProjectFileToken(token) {
1964
+ const trimmed = token.trim();
1965
+ if (trimmed.length === 0) return false;
1966
+ if (isProjectSourcePath(trimmed)) return true;
1967
+ return (trimmed.includes("/") || trimmed.includes("\\")) && !/\s/.test(trimmed);
1968
+ }
1969
+ function splitTestFailureId(testName) {
1970
+ const trimmed = testName.trim();
1971
+ for (const separator of [/\s*>\s*/, /::/]) {
1972
+ const match = separator.exec(trimmed);
1973
+ if (!match || match.index <= 0) continue;
1974
+ const head = trimmed.slice(0, match.index).trim();
1975
+ const tail = trimmed.slice(match.index + match[0].length).trim();
1976
+ if (looksLikeProjectFileToken(head) && tail.length > 0) {
1977
+ return { file: head, testPath: tail };
1978
+ }
1979
+ }
1980
+ const goMatch = /^(.+?):(\d+)$/.exec(trimmed);
1981
+ if (goMatch && looksLikeProjectFileToken(goMatch[1] ?? "")) {
1982
+ return { file: (goMatch[1] ?? "").trim(), testPath: trimmed };
1983
+ }
1984
+ return { testPath: trimmed };
1985
+ }
1986
+ function extractTestFailures(failingTests, _testOutput) {
1987
+ const issues = new IssueSet();
1988
+ for (const testName of failingTests) {
1989
+ const { file, testPath } = splitTestFailureId(testName);
1990
+ issues.add(parseTestFailure(testPath, file));
1991
+ }
1992
+ return issues;
1993
+ }
1994
+ function calculateIssueDelta(baseline, current) {
1995
+ const newIssues = current.difference(baseline);
1996
+ const fixedIssues = baseline.difference(current);
1997
+ const persistingIssues = current.intersection(baseline);
1998
+ const regraded = new IssueSet();
1999
+ const worsened = new IssueSet();
2000
+ const improved = new IssueSet();
2001
+ for (const issue of persistingIssues.toArray()) {
2002
+ const n = persistingIssues.countOf(issue.key);
2003
+ const baselineIssue = baseline.get(issue.key);
2004
+ const currentMagnitude = issue.magnitude;
2005
+ const baselineMagnitude = baselineIssue?.magnitude;
2006
+ if (typeof currentMagnitude === "number" && typeof baselineMagnitude === "number") {
2007
+ if (currentMagnitude > baselineMagnitude) {
2008
+ for (let i = 0; i < n; i++) worsened.add(issue);
2009
+ continue;
2010
+ }
2011
+ if (currentMagnitude < baselineMagnitude) {
2012
+ for (let i = 0; i < n; i++) improved.add(baselineIssue ?? issue);
2013
+ for (let i = 0; i < n; i++) regraded.add(issue);
2014
+ continue;
2015
+ }
2016
+ }
2017
+ for (let i = 0; i < n; i++) regraded.add(issue);
2018
+ }
2019
+ for (const issue of worsened.toArray()) {
2020
+ for (let i = 0; i < worsened.countOf(issue.key); i++) newIssues.add(issue);
2021
+ }
2022
+ return {
2023
+ newIssues,
2024
+ fixedIssues,
2025
+ persistingIssues: regraded,
2026
+ netChange: fixedIssues.size - newIssues.size,
2027
+ hasRegressions: newIssues.size > 0,
2028
+ hasImprovements: fixedIssues.size > 0,
2029
+ regradedImprovements: improved
2030
+ };
2031
+ }
2032
+ function channelDidNotRun(status) {
2033
+ return status === "skipped" || status === "unavailable" || status === "not_run";
2034
+ }
2035
+ function stableGateState(gate) {
2036
+ const unavailable = gate?.status === "unavailable" || gate?.status === "not_run" || gate?.commandResults?.some((command) => command.status === "unavailable") === true;
2037
+ const skipped = gate?.status === "skipped";
2038
+ return {
2039
+ passed: !unavailable && (skipped || gate?.exitCode === 0),
2040
+ unavailable,
2041
+ availability: unavailable ? "unavailable" : skipped ? "out_of_scope" : "executed"
2042
+ };
2043
+ }
2044
+ function unparseableMarker(bare, language, multiCommand) {
2045
+ if (!multiCommand || !language || language === "unknown") return bare;
2046
+ return `${bare}:${language}`;
2047
+ }
2048
+ function buildIssuesFromSingleOutput(outputTail, language, multiCommand) {
2049
+ const isNode = language === "node";
2050
+ const parsed = isNode ? extractTypeScriptIssues(outputTail) : !language || language === "unknown" ? new IssueSet() : extractNonNodeBuildIssues(outputTail);
2051
+ if (parsed.size > 0) return parsed;
2052
+ const sentinel = new IssueSet();
2053
+ sentinel.add(
2054
+ parseBuildFailure(
2055
+ unparseableMarker(UNPARSEABLE_BUILD_SENTINEL, language, multiCommand),
2056
+ void 0,
2057
+ countUnparseableDiagnostics(outputTail)
2058
+ )
2059
+ );
2060
+ return sentinel;
2061
+ }
2062
+ function lintIssuesFromSingleOutput(outputTail, language, multiCommand) {
2063
+ const isNode = language === "node";
2064
+ const parsed = isNode ? extractBiomeLintIssues(outputTail) : !language || language === "unknown" ? new IssueSet() : extractNonNodeLintIssues(outputTail);
2065
+ if (parsed.size > 0) return parsed;
2066
+ const sentinel = new IssueSet();
2067
+ sentinel.add(
2068
+ parseLintFailure(
2069
+ unparseableMarker(UNPARSEABLE_LINT_SENTINEL, language, multiCommand),
2070
+ void 0,
2071
+ countUnparseableDiagnostics(outputTail)
2072
+ )
2073
+ );
2074
+ return sentinel;
2075
+ }
2076
+ function testIssuesFromSingleOutput(failingTests, outputTail, language, multiCommand) {
2077
+ const extracted = extractTestFailures(failingTests, outputTail);
2078
+ if (extracted.size > 0) return extracted;
2079
+ const sentinel = new IssueSet();
2080
+ sentinel.add(
2081
+ parseTestFailure(
2082
+ unparseableMarker(UNPARSEABLE_TEST_SENTINEL, language, multiCommand),
2083
+ void 0,
2084
+ countUnparseableDiagnostics(outputTail)
2085
+ )
2086
+ );
2087
+ return sentinel;
2088
+ }
2089
+ function mergeCommandIssuesMaxUnion(into, from) {
2090
+ for (const issue of from.toArray()) {
2091
+ const deficit = from.countOf(issue.key) - into.countOf(issue.key);
2092
+ if (deficit > 0) {
2093
+ for (let i = 0; i < deficit; i++) {
2094
+ into.add(issue);
2095
+ }
2096
+ } else if (into.has(issue.key)) {
2097
+ into.setRepresentative(issue);
2098
+ }
2099
+ }
2100
+ }
2101
+ function issuesFromCommandResults(channel, commandResults, fallback) {
2102
+ if (!commandResults || commandResults.length <= 1) return fallback();
2103
+ const union = new IssueSet();
2104
+ for (const command of commandResults) {
2105
+ if (command.exitCode === 0 || channelDidNotRun(command.status)) continue;
2106
+ const commandIssues = channel === "build" ? buildIssuesFromSingleOutput(command.outputTail, command.language, true) : channel === "lint" ? lintIssuesFromSingleOutput(command.outputTail, command.language, true) : testIssuesFromSingleOutput(
2107
+ command.failingTestIdentities ?? command.failingTests ?? [],
2108
+ command.outputTail,
2109
+ command.language,
2110
+ true
2111
+ );
2112
+ mergeCommandIssuesMaxUnion(union, commandIssues);
2113
+ }
2114
+ return union;
2115
+ }
2116
+ function extractStableVerificationState(gates) {
2117
+ const buildOutputTail = gates.build?.outputTail ?? "";
2118
+ const buildOutputLines = buildOutputTail.split(/\r?\n/).length;
2119
+ const buildIssues = (() => {
2120
+ if (gates.build == null) return new IssueSet();
2121
+ return issuesFromCommandResults("build", gates.build.commandResults, () => {
2122
+ if (gates.build == null || gates.build.exitCode === 0) return new IssueSet();
2123
+ if (channelDidNotRun(gates.build.status)) return new IssueSet();
2124
+ return buildIssuesFromSingleOutput(buildOutputTail, gates.build.language, false);
2125
+ });
2126
+ })();
2127
+ const lintIssues = (() => {
2128
+ if (gates.lint == null) return new IssueSet();
2129
+ return issuesFromCommandResults("lint", gates.lint.commandResults, () => {
2130
+ if (gates.lint == null || gates.lint.exitCode === 0) return new IssueSet();
2131
+ if (channelDidNotRun(gates.lint.status)) return new IssueSet();
2132
+ return lintIssuesFromSingleOutput(gates.lint.outputTail ?? "", gates.lint.language, false);
2133
+ });
2134
+ })();
2135
+ const testIssues = (() => {
2136
+ if (!gates.tests) return new IssueSet();
2137
+ return issuesFromCommandResults("test", gates.tests.commandResults, () => {
2138
+ if (!gates.tests) return new IssueSet();
2139
+ if (gates.tests.status === "skipped" || gates.tests.status === "unavailable" || gates.tests.status === "not_run")
2140
+ return new IssueSet();
2141
+ if (gates.tests.exitCode === 0) return new IssueSet();
2142
+ return testIssuesFromSingleOutput(
2143
+ gates.tests.failingTestIdentities ?? gates.tests.failingTests ?? [],
2144
+ gates.tests.outputTail ?? "",
2145
+ gates.tests.language,
2146
+ false
2147
+ );
2148
+ });
2149
+ })();
2150
+ const buildIncomplete = gates.build?.exitCode !== 0 && buildOutputTail.trim().length > 0 && buildOutputLines < 5;
2151
+ return {
2152
+ buildIssues,
2153
+ lintIssues,
2154
+ testIssues,
2155
+ totalIssues: buildIssues.size + lintIssues.size + testIssues.size,
2156
+ gates: {
2157
+ build: {
2158
+ ...stableGateState(gates.build),
2159
+ incomplete: buildIncomplete
2160
+ },
2161
+ lint: stableGateState(gates.lint),
2162
+ test: gates.tests ? stableGateState(gates.tests) : { passed: true, unavailable: true }
2163
+ }
2164
+ };
2165
+ }
2166
+ function compareVerificationStates(baseline, current) {
2167
+ const build = calculateIssueDelta(baseline.buildIssues, current.buildIssues);
2168
+ const lint = calculateIssueDelta(baseline.lintIssues, current.lintIssues);
2169
+ const test = calculateIssueDelta(baseline.testIssues, current.testIssues);
2170
+ const totalNewIssues = build.newIssues.size + lint.newIssues.size + test.newIssues.size;
2171
+ const totalFixedIssues = build.fixedIssues.size + lint.fixedIssues.size + test.fixedIssues.size;
2172
+ const totalPersistingIssues = build.persistingIssues.size + lint.persistingIssues.size + test.persistingIssues.size;
2173
+ let incompleteOutputWarning;
2174
+ if (current.gates.build.incomplete) {
2175
+ incompleteOutputWarning = "Build output may be incomplete (tsc bailed early); delta accuracy reduced";
2176
+ }
2177
+ return {
2178
+ build,
2179
+ lint,
2180
+ test,
2181
+ totalNewIssues,
2182
+ totalFixedIssues,
2183
+ totalPersistingIssues,
2184
+ hasAnyRegressions: build.hasRegressions || lint.hasRegressions || test.hasRegressions,
2185
+ hasAnyImprovements: build.hasImprovements || lint.hasImprovements || test.hasImprovements,
2186
+ netChange: totalFixedIssues - totalNewIssues,
2187
+ incompleteOutputWarning
2188
+ };
2189
+ }
2190
+
2191
+ export {
2192
+ selectBestErrorSummary,
2193
+ normalizeOutput,
2194
+ processOutput,
2195
+ chunkToText,
2196
+ createLineBufferedStreamProcessor,
2197
+ stripAnsiSequences,
2198
+ detectResolverSuiteRunner,
2199
+ detectCommandTestRunner,
2200
+ readTestOutcomeTokens,
2201
+ readTapFooterTokens,
2202
+ readPytestSummaryRows,
2203
+ readNodeSpecCounters,
2204
+ nodeSpecCountersAddUp,
2205
+ readNodeSpecFailureNames,
2206
+ readMochaCounters,
2207
+ readMochaFailureNames,
2208
+ readAvaCounters,
2209
+ readAvaFailureNames,
2210
+ readBunCounters,
2211
+ bunCountersAddUp,
2212
+ readBunFailureNames,
2213
+ readCargoTestTotals,
2214
+ readCargoFailureLines,
2215
+ readSurefireTotals,
2216
+ readXctestTotal,
2217
+ parseUnittestOutput,
2218
+ parseGenericPassFailOutput,
2219
+ parseTestOutput,
2220
+ detectEmptyRun,
2221
+ detectEmptyRunOfResult,
2222
+ deriveVerificationDisposition,
2223
+ aggregateVerificationDispositions,
2224
+ formatUnverifiedDeliveryLabel,
2225
+ extractBiomeJson,
2226
+ readBiomeDiagnostics,
2227
+ createTypeScriptLocatedErrorPattern,
2228
+ IssueSet,
2229
+ isTransferNoiseLine,
2230
+ countUnparseableDiagnostics,
2231
+ parseTestFailure,
2232
+ parseBuildFailure,
2233
+ parseLintFailure,
2234
+ UNPARSEABLE_BUILD_SENTINEL,
2235
+ UNPARSEABLE_LINT_SENTINEL,
2236
+ UNPARSEABLE_TEST_SENTINEL,
2237
+ extractTypeScriptIssues,
2238
+ extractBiomeLintIssues,
2239
+ splitTestFailureId,
2240
+ extractTestFailures,
2241
+ extractStableVerificationState,
2242
+ compareVerificationStates
2243
+ };
2244
+ //# sourceMappingURL=chunk-TUQMMFEQ.js.map