@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.
- package/.build-project/providers/catalog.json +13951 -0
- package/.build-project/providers/pricing.json +1978 -0
- package/.build-project/providers/registry.json +4103 -0
- package/.github/SECURITY.md +75 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +661 -0
- package/CODE_OF_CONDUCT.md +44 -0
- package/CONTRIBUTING.md +24 -0
- package/INSTALL.md +623 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/THIRD_PARTY_NOTICES.txt +26 -0
- package/dist/ai-judge-UE5UOYOO.js +191 -0
- package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
- package/dist/allowlist-utils-MZZKKXRD.js +31 -0
- package/dist/apply-completion-mode-EM37UZHB.js +110 -0
- package/dist/artifact-migrator-WPACNSEP.js +276 -0
- package/dist/ask-2OZ4JFQR.js +176 -0
- package/dist/auth-6UKBTJUQ.js +185 -0
- package/dist/auth-H5KJL6HL.js +165 -0
- package/dist/auth-LVJRJDMU.js +12 -0
- package/dist/auth-NHZOCNRR.js +94 -0
- package/dist/auth-PBXHWXGW.js +95 -0
- package/dist/auth-T7Y5DCAH.js +91 -0
- package/dist/auth-TVVKCHQW.js +13 -0
- package/dist/auth-UHB2UCSS.js +97 -0
- package/dist/auth-VACA3VUL.js +98 -0
- package/dist/auth-VVLC77S3.js +44 -0
- package/dist/auth-liveness-XO4AGDDD.js +53 -0
- package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
- package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
- package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
- package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
- package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
- package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
- package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
- package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
- package/dist/autoloop-success-C32QVWOP.js +93 -0
- package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
- package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
- package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
- package/dist/backend-YUTFDZXZ.js +30 -0
- package/dist/background-executor-Z3ODTMD7.js +260 -0
- package/dist/backlog-75QPEAMW.js +403 -0
- package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
- package/dist/backup-active-store-XHWLN34M.js +16 -0
- package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
- package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
- package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
- package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
- package/dist/build-gate-7NKWPY62.js +68 -0
- package/dist/build-root-S7DINODY.js +18 -0
- package/dist/change-summary-R6CB6VXJ.js +50 -0
- package/dist/chunk-24MNKKOM.js +173 -0
- package/dist/chunk-2H6VZFIO.js +235 -0
- package/dist/chunk-2JIX3EKV.js +39 -0
- package/dist/chunk-2KO7HVZM.js +106 -0
- package/dist/chunk-2L36U25O.js +100 -0
- package/dist/chunk-2NMNFUQA.js +475 -0
- package/dist/chunk-2OUAEH67.js +83 -0
- package/dist/chunk-2VLJUXJU.js +115 -0
- package/dist/chunk-2VUEDIUM.js +77 -0
- package/dist/chunk-2Y2IIHPI.js +430 -0
- package/dist/chunk-2YRG3LHZ.js +220 -0
- package/dist/chunk-2Z5Q3SUY.js +65 -0
- package/dist/chunk-32IYXIE5.js +873 -0
- package/dist/chunk-33IGPPUI.js +292 -0
- package/dist/chunk-352PCJLK.js +283 -0
- package/dist/chunk-35J4NE6S.js +226 -0
- package/dist/chunk-3C7WBIVK.js +1016 -0
- package/dist/chunk-3H3EY6U7.js +1225 -0
- package/dist/chunk-3H4MWYIC.js +198 -0
- package/dist/chunk-3HHWQR3N.js +2479 -0
- package/dist/chunk-3JKNRYEE.js +14 -0
- package/dist/chunk-3LECCYZY.js +128 -0
- package/dist/chunk-3LOY6YZI.js +852 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3NOTLVLG.js +3803 -0
- package/dist/chunk-3OPP2OZB.js +1480 -0
- package/dist/chunk-3P5IN5E7.js +9 -0
- package/dist/chunk-3PL22IYZ.js +20 -0
- package/dist/chunk-3REDAJUJ.js +14 -0
- package/dist/chunk-3S2R4XJI.js +203 -0
- package/dist/chunk-3UBZI5DW.js +61 -0
- package/dist/chunk-3VV5OBGG.js +308 -0
- package/dist/chunk-3WY5TU2O.js +823 -0
- package/dist/chunk-43OKHTW4.js +82 -0
- package/dist/chunk-45KUJBDI.js +112 -0
- package/dist/chunk-47X5LM7B.js +224 -0
- package/dist/chunk-4B6FQJ77.js +268 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4DJL2VXA.js +24 -0
- package/dist/chunk-4EBSXZ73.js +48 -0
- package/dist/chunk-4QKP6I4C.js +294 -0
- package/dist/chunk-4U6XK2DG.js +300 -0
- package/dist/chunk-4UMRUFBD.js +132 -0
- package/dist/chunk-4US4SYJ4.js +569 -0
- package/dist/chunk-4ZPLWEZO.js +154 -0
- package/dist/chunk-56WPYDJH.js +624 -0
- package/dist/chunk-57WRCJJW.js +50 -0
- package/dist/chunk-5AW4RMNG.js +24 -0
- package/dist/chunk-5EQN56OZ.js +155 -0
- package/dist/chunk-5F43TUIN.js +38 -0
- package/dist/chunk-5FKHIKTS.js +115 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5KQETTNS.js +152 -0
- package/dist/chunk-5PDVN2KO.js +498 -0
- package/dist/chunk-5UBIFVRD.js +509 -0
- package/dist/chunk-5YDE3Q62.js +46 -0
- package/dist/chunk-626AJVMU.js +302 -0
- package/dist/chunk-633XZ7UF.js +3583 -0
- package/dist/chunk-63DHNHGA.js +236 -0
- package/dist/chunk-666656AR.js +568 -0
- package/dist/chunk-67YRJPJO.js +19 -0
- package/dist/chunk-6CAU7VBA.js +20 -0
- package/dist/chunk-6CB3KJRY.js +21 -0
- package/dist/chunk-6DBMALXL.js +29 -0
- package/dist/chunk-6E25C4IA.js +269 -0
- package/dist/chunk-6FIBNIQU.js +73 -0
- package/dist/chunk-6G57FYBV.js +189 -0
- package/dist/chunk-6KZKRTG3.js +4885 -0
- package/dist/chunk-6LAH2UV2.js +525 -0
- package/dist/chunk-6PZY2TTU.js +921 -0
- package/dist/chunk-6T6NHXK4.js +230 -0
- package/dist/chunk-6TBEX4R4.js +432 -0
- package/dist/chunk-6TRD7TEE.js +911 -0
- package/dist/chunk-6XCP2RAI.js +47 -0
- package/dist/chunk-726G6WDL.js +351 -0
- package/dist/chunk-75EMT7BF.js +616 -0
- package/dist/chunk-762ACDZJ.js +4696 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DJ6SQH3.js +510 -0
- package/dist/chunk-7HPCIOMA.js +1383 -0
- package/dist/chunk-7HYBSRPZ.js +17503 -0
- package/dist/chunk-7KBEOPVB.js +73 -0
- package/dist/chunk-7LHJDJB3.js +2222 -0
- package/dist/chunk-7NVJMH52.js +306 -0
- package/dist/chunk-7RMARDVH.js +33 -0
- package/dist/chunk-7SEWU4QG.js +36 -0
- package/dist/chunk-7TUTZTI2.js +911 -0
- package/dist/chunk-7VBDFPUM.js +340 -0
- package/dist/chunk-7VRJHTGZ.js +6406 -0
- package/dist/chunk-7YAOUUKK.js +493 -0
- package/dist/chunk-AAAODV76.js +860 -0
- package/dist/chunk-AB4HUJVQ.js +339 -0
- package/dist/chunk-AEQWV746.js +611 -0
- package/dist/chunk-AHU3FKPA.js +11639 -0
- package/dist/chunk-AISTV5XU.js +226 -0
- package/dist/chunk-AJBTKGJZ.js +48 -0
- package/dist/chunk-AJJNW7XT.js +248 -0
- package/dist/chunk-AJN5Y5YZ.js +160 -0
- package/dist/chunk-ALDTFNZ3.js +150 -0
- package/dist/chunk-ARARVIZK.js +281 -0
- package/dist/chunk-ATBM6AW5.js +53 -0
- package/dist/chunk-ATKEKM3E.js +206 -0
- package/dist/chunk-AUJLW6JZ.js +92 -0
- package/dist/chunk-AY3MHEFM.js +24 -0
- package/dist/chunk-B7PYTV72.js +236 -0
- package/dist/chunk-B7YRSULE.js +1423 -0
- package/dist/chunk-BAWJNMWF.js +339 -0
- package/dist/chunk-BBPIILO2.js +88 -0
- package/dist/chunk-BD3PGW6A.js +957 -0
- package/dist/chunk-BDPYFAB4.js +44 -0
- package/dist/chunk-BIUV23HH.js +729 -0
- package/dist/chunk-BQ3VAGXH.js +243 -0
- package/dist/chunk-BQJOGAWT.js +31 -0
- package/dist/chunk-BT7EG7CO.js +68 -0
- package/dist/chunk-BV3XQQLU.js +27 -0
- package/dist/chunk-BY6ODHNZ.js +78 -0
- package/dist/chunk-BZRLSZNV.js +79 -0
- package/dist/chunk-C3DH3NCY.js +2773 -0
- package/dist/chunk-C3KCMAJP.js +756 -0
- package/dist/chunk-C7AGUJ5K.js +267 -0
- package/dist/chunk-CBSWKQCX.js +342 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFCVYHSW.js +373 -0
- package/dist/chunk-CHA2HDE5.js +126 -0
- package/dist/chunk-CIHWPGS5.js +146 -0
- package/dist/chunk-CJBSZX3F.js +127 -0
- package/dist/chunk-CLA6QIJM.js +43 -0
- package/dist/chunk-CPSVQR2I.js +365 -0
- package/dist/chunk-CRPRVNQ4.js +254 -0
- package/dist/chunk-CSIE4Y7C.js +1093 -0
- package/dist/chunk-CSOPSYDY.js +142 -0
- package/dist/chunk-CSXLLEGB.js +205 -0
- package/dist/chunk-CTDLERWU.js +293 -0
- package/dist/chunk-CULBXMSK.js +110 -0
- package/dist/chunk-D2M2Y5ID.js +21 -0
- package/dist/chunk-D37WY7SH.js +1060 -0
- package/dist/chunk-D4VJFCGZ.js +89 -0
- package/dist/chunk-D6WTZMZB.js +48 -0
- package/dist/chunk-DBHOWDUH.js +976 -0
- package/dist/chunk-DCACX7BV.js +19364 -0
- package/dist/chunk-DFHX4XYA.js +128 -0
- package/dist/chunk-DIKBRRKE.js +176 -0
- package/dist/chunk-DJG5RIOR.js +9 -0
- package/dist/chunk-DNIOIISW.js +616 -0
- package/dist/chunk-DOA5G7IA.js +315 -0
- package/dist/chunk-DP7FKP6W.js +855 -0
- package/dist/chunk-DS2JZ677.js +79 -0
- package/dist/chunk-DSRLVYBS.js +82 -0
- package/dist/chunk-EAEVKNJA.js +209 -0
- package/dist/chunk-EEUESN3T.js +575 -0
- package/dist/chunk-EJ4LUU5Y.js +73 -0
- package/dist/chunk-EJIWTPSZ.js +1063 -0
- package/dist/chunk-EJVCDTAN.js +116 -0
- package/dist/chunk-EKLUBDBQ.js +627 -0
- package/dist/chunk-EN62WLFD.js +849 -0
- package/dist/chunk-ENYRCL43.js +26 -0
- package/dist/chunk-EP22ZMFO.js +273 -0
- package/dist/chunk-EP4SVAVI.js +87 -0
- package/dist/chunk-EPAMVGI3.js +1562 -0
- package/dist/chunk-EPRMH6HO.js +24 -0
- package/dist/chunk-ES6NWJ36.js +4057 -0
- package/dist/chunk-ETA2K4KI.js +30 -0
- package/dist/chunk-ETAD4NKD.js +31 -0
- package/dist/chunk-EUWIIDQ7.js +93 -0
- package/dist/chunk-EVE3OD2W.js +141 -0
- package/dist/chunk-EXA26FFC.js +459 -0
- package/dist/chunk-EXSPAA35.js +244 -0
- package/dist/chunk-F55YABKV.js +258 -0
- package/dist/chunk-F5DNGU5W.js +27 -0
- package/dist/chunk-F622MJYV.js +103 -0
- package/dist/chunk-F6NIQD74.js +5111 -0
- package/dist/chunk-FAWJTC34.js +43 -0
- package/dist/chunk-FAZBRHGG.js +47 -0
- package/dist/chunk-FIEUSGNJ.js +39 -0
- package/dist/chunk-FKCG7K6H.js +1146 -0
- package/dist/chunk-FOVVXV45.js +229 -0
- package/dist/chunk-FRBPKBFE.js +30 -0
- package/dist/chunk-FSA5BPFI.js +268 -0
- package/dist/chunk-FSJ5TTZ3.js +29 -0
- package/dist/chunk-FT7SGLXT.js +193 -0
- package/dist/chunk-FUUVZZUB.js +62 -0
- package/dist/chunk-FYMRVUNZ.js +1697 -0
- package/dist/chunk-FYTAA5FG.js +162 -0
- package/dist/chunk-G3VB2UCZ.js +3892 -0
- package/dist/chunk-G6OIMVXH.js +405 -0
- package/dist/chunk-G7PQCXVH.js +228 -0
- package/dist/chunk-GAB6UW52.js +1087 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GC4CRMTS.js +642 -0
- package/dist/chunk-GFHSIWHL.js +5297 -0
- package/dist/chunk-GI5M67YA.js +735 -0
- package/dist/chunk-GIJWHUWF.js +191 -0
- package/dist/chunk-GO6DRECI.js +1 -0
- package/dist/chunk-GOFVBTMN.js +314 -0
- package/dist/chunk-GQIP72ZJ.js +13 -0
- package/dist/chunk-GQXLXRFA.js +28 -0
- package/dist/chunk-GT6HFKJB.js +48 -0
- package/dist/chunk-GVJGSSKM.js +174 -0
- package/dist/chunk-GWHGTG37.js +36 -0
- package/dist/chunk-GZAJHLKO.js +18 -0
- package/dist/chunk-GZK62I3N.js +314 -0
- package/dist/chunk-H3HGMISG.js +483 -0
- package/dist/chunk-H3ISZJMJ.js +403 -0
- package/dist/chunk-H4HXVWEC.js +9 -0
- package/dist/chunk-H6MJGKAW.js +120 -0
- package/dist/chunk-HBTTGVR5.js +353 -0
- package/dist/chunk-HBZ322WZ.js +35 -0
- package/dist/chunk-HEP3ILP4.js +34 -0
- package/dist/chunk-HGFXODKO.js +106 -0
- package/dist/chunk-HHWDTB6S.js +59 -0
- package/dist/chunk-HKO45NLZ.js +286 -0
- package/dist/chunk-HLVTEA6A.js +89 -0
- package/dist/chunk-HS3SY6HN.js +160 -0
- package/dist/chunk-HT5OCGKN.js +899 -0
- package/dist/chunk-HXIIEMGF.js +78 -0
- package/dist/chunk-I56TH7VM.js +46 -0
- package/dist/chunk-I6FN3R5D.js +352 -0
- package/dist/chunk-I7SCBHJN.js +655 -0
- package/dist/chunk-IJM4GKAT.js +529 -0
- package/dist/chunk-IMEYU36R.js +344 -0
- package/dist/chunk-INJ3SS6A.js +936 -0
- package/dist/chunk-IUKOPCCE.js +441 -0
- package/dist/chunk-IVEPZQJO.js +33 -0
- package/dist/chunk-IVZEONFC.js +43 -0
- package/dist/chunk-IWBHRSG7.js +936 -0
- package/dist/chunk-IYY3HQAD.js +484 -0
- package/dist/chunk-J2ICMYDA.js +48 -0
- package/dist/chunk-J2QCFLUN.js +505 -0
- package/dist/chunk-J5HM6V5P.js +1039 -0
- package/dist/chunk-J6NZX6QH.js +398 -0
- package/dist/chunk-JBBB2Y47.js +432 -0
- package/dist/chunk-JDCZQZU7.js +42 -0
- package/dist/chunk-JEDNXGSS.js +169 -0
- package/dist/chunk-JHP7OT6K.js +89 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JNMWYMC6.js +38 -0
- package/dist/chunk-JNSTWNNW.js +25 -0
- package/dist/chunk-JOSK6GEU.js +9564 -0
- package/dist/chunk-JQUMSIGC.js +100 -0
- package/dist/chunk-JVHGMURQ.js +1106 -0
- package/dist/chunk-JYXS47FQ.js +951 -0
- package/dist/chunk-K2ZMW2Z5.js +2147 -0
- package/dist/chunk-K7FAFORM.js +14 -0
- package/dist/chunk-KBJXX3ON.js +333 -0
- package/dist/chunk-KHFKVQWY.js +486 -0
- package/dist/chunk-KHMEI3DQ.js +173 -0
- package/dist/chunk-KHW3UD7B.js +69 -0
- package/dist/chunk-KKQKWAMF.js +365 -0
- package/dist/chunk-KOKXJV2U.js +455 -0
- package/dist/chunk-KQ4NGOJI.js +14 -0
- package/dist/chunk-KQYQOXMS.js +342 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KUEWV2JH.js +593 -0
- package/dist/chunk-KXYDV3HP.js +1523 -0
- package/dist/chunk-KZ4JMGZ5.js +96 -0
- package/dist/chunk-KZWGBUIO.js +2659 -0
- package/dist/chunk-L2CBG5IX.js +1892 -0
- package/dist/chunk-L2S235CU.js +314 -0
- package/dist/chunk-L32WD57F.js +98 -0
- package/dist/chunk-LDJCKAJP.js +123 -0
- package/dist/chunk-LDWNBEN7.js +541 -0
- package/dist/chunk-LJVH57G2.js +241 -0
- package/dist/chunk-LPQ7NZEN.js +209 -0
- package/dist/chunk-LRGH3CCV.js +148 -0
- package/dist/chunk-LULOGMMM.js +1133 -0
- package/dist/chunk-LWGKN2GY.js +8284 -0
- package/dist/chunk-LX4F24ZH.js +157 -0
- package/dist/chunk-M4BUEXXF.js +839 -0
- package/dist/chunk-M6UHOC4I.js +553 -0
- package/dist/chunk-MCBNWZNO.js +657 -0
- package/dist/chunk-MEMSY6VY.js +223 -0
- package/dist/chunk-MHLEZQQI.js +145 -0
- package/dist/chunk-MJ6WNSIX.js +192 -0
- package/dist/chunk-MKASIKWZ.js +442 -0
- package/dist/chunk-MNOVBYFU.js +60 -0
- package/dist/chunk-MO2BYAAF.js +2896 -0
- package/dist/chunk-MP6P7Y2A.js +180 -0
- package/dist/chunk-MQ4TFJAG.js +3365 -0
- package/dist/chunk-MT2WAIR3.js +131 -0
- package/dist/chunk-MTU7VTNN.js +1122 -0
- package/dist/chunk-MULMXX4V.js +150 -0
- package/dist/chunk-MW2DWWVA.js +147 -0
- package/dist/chunk-MY3ZPUN4.js +151 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N3Q2JNPV.js +249 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-NAINGKHF.js +35 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NHNPEZS4.js +1408 -0
- package/dist/chunk-NHTIXJCR.js +17 -0
- package/dist/chunk-NKLPMBNV.js +1154 -0
- package/dist/chunk-NMVZ5YES.js +199 -0
- package/dist/chunk-NRFRY3GE.js +256 -0
- package/dist/chunk-NTD6CSI6.js +1266 -0
- package/dist/chunk-NUO7B3SH.js +318 -0
- package/dist/chunk-NVOHIJKG.js +1319 -0
- package/dist/chunk-NXH3RX7O.js +523 -0
- package/dist/chunk-NXZ3DURF.js +257 -0
- package/dist/chunk-O26L6F7F.js +209 -0
- package/dist/chunk-O5RRIUEP.js +124 -0
- package/dist/chunk-O5X6BKAO.js +10 -0
- package/dist/chunk-O6ZQUVTR.js +31 -0
- package/dist/chunk-O7FE75QZ.js +306 -0
- package/dist/chunk-OC7Z6AJQ.js +81 -0
- package/dist/chunk-OH7IEZ63.js +307 -0
- package/dist/chunk-OI734GRS.js +115 -0
- package/dist/chunk-OJBH62DK.js +684 -0
- package/dist/chunk-OKJLVSTJ.js +247 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ONHAMBN6.js +12 -0
- package/dist/chunk-ONYPLIVE.js +753 -0
- package/dist/chunk-OSK7QWPD.js +637 -0
- package/dist/chunk-OTXLMJKP.js +438 -0
- package/dist/chunk-OV5PKQMA.js +213 -0
- package/dist/chunk-OXK5HA4B.js +31 -0
- package/dist/chunk-OYDWFQA4.js +272 -0
- package/dist/chunk-OZAUKWHB.js +22 -0
- package/dist/chunk-P5P2EKGH.js +94 -0
- package/dist/chunk-P6SSWAKY.js +29 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-P7RVCHQV.js +197 -0
- package/dist/chunk-PEBWDYIW.js +726 -0
- package/dist/chunk-PFCXFO7A.js +9193 -0
- package/dist/chunk-PFLDWMX6.js +168 -0
- package/dist/chunk-PHZGLQSK.js +15883 -0
- package/dist/chunk-PNFTPNSR.js +20 -0
- package/dist/chunk-PPHXX4W7.js +175 -0
- package/dist/chunk-PPZESPJT.js +262 -0
- package/dist/chunk-PRDHI2L5.js +296 -0
- package/dist/chunk-PSTKWHHN.js +32 -0
- package/dist/chunk-PV53ODOT.js +555 -0
- package/dist/chunk-PVJBTI7P.js +24 -0
- package/dist/chunk-PXKERBKX.js +100 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3DHEZA5.js +85 -0
- package/dist/chunk-Q5RZDVQK.js +204 -0
- package/dist/chunk-Q64IR2Z2.js +4933 -0
- package/dist/chunk-Q6Z5UGPL.js +398 -0
- package/dist/chunk-QAMAV4DT.js +627 -0
- package/dist/chunk-QBWF4444.js +112 -0
- package/dist/chunk-QDKYT4CI.js +22805 -0
- package/dist/chunk-QFLBRWCJ.js +126 -0
- package/dist/chunk-QILAQACE.js +107 -0
- package/dist/chunk-QJ6OEH4K.js +3683 -0
- package/dist/chunk-QK3NLYTV.js +320 -0
- package/dist/chunk-QOFLUS24.js +535 -0
- package/dist/chunk-QOIASNEJ.js +98 -0
- package/dist/chunk-QP4UTSOV.js +3587 -0
- package/dist/chunk-QP5ST7RI.js +904 -0
- package/dist/chunk-QS5AGRZN.js +167 -0
- package/dist/chunk-QTAOU53N.js +107 -0
- package/dist/chunk-QTCLJHLZ.js +351 -0
- package/dist/chunk-QTOLTG4L.js +119 -0
- package/dist/chunk-QWDV4OSL.js +142 -0
- package/dist/chunk-QWMQ74KD.js +508 -0
- package/dist/chunk-QX6LOMMH.js +158 -0
- package/dist/chunk-QXBKIHY7.js +238 -0
- package/dist/chunk-QXBKTJT6.js +270 -0
- package/dist/chunk-QYQOVOLR.js +196 -0
- package/dist/chunk-R2CKS6WT.js +73 -0
- package/dist/chunk-R2TIYG7U.js +68 -0
- package/dist/chunk-R2W3LESH.js +465 -0
- package/dist/chunk-R5EXHMUN.js +100 -0
- package/dist/chunk-RBBTBCHX.js +289 -0
- package/dist/chunk-RBKLOUXA.js +121 -0
- package/dist/chunk-RCP2Y6DQ.js +86 -0
- package/dist/chunk-RCYEJSD5.js +260 -0
- package/dist/chunk-RFDVSI4N.js +134 -0
- package/dist/chunk-RGJU63FV.js +1717 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RIMARPCF.js +152 -0
- package/dist/chunk-RJ6RSNT6.js +42 -0
- package/dist/chunk-RNI2GUIF.js +131 -0
- package/dist/chunk-RPHUWJ3K.js +264 -0
- package/dist/chunk-RPIMAMV7.js +361 -0
- package/dist/chunk-RQFX6YRN.js +49 -0
- package/dist/chunk-RRC5BL7B.js +285 -0
- package/dist/chunk-RSYTSBOO.js +79 -0
- package/dist/chunk-RWQQIKIC.js +35 -0
- package/dist/chunk-RZUBOZH2.js +373 -0
- package/dist/chunk-S2E632FQ.js +380 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S2XIMQJQ.js +681 -0
- package/dist/chunk-S47ISY27.js +183 -0
- package/dist/chunk-S6I4KISU.js +142 -0
- package/dist/chunk-S6TAFQI5.js +2403 -0
- package/dist/chunk-SBBNT5ZJ.js +27 -0
- package/dist/chunk-SDJV2DTQ.js +491 -0
- package/dist/chunk-SDPIFNLD.js +33 -0
- package/dist/chunk-SF6YK3JI.js +835 -0
- package/dist/chunk-SK3ZFONO.js +976 -0
- package/dist/chunk-SKTFRFQ7.js +1775 -0
- package/dist/chunk-SNGM452K.js +2002 -0
- package/dist/chunk-STW7OFOA.js +581 -0
- package/dist/chunk-SU6UFUQY.js +1351 -0
- package/dist/chunk-SVJM3LJA.js +27 -0
- package/dist/chunk-SVUNZOPG.js +129 -0
- package/dist/chunk-T5XLUYV3.js +34 -0
- package/dist/chunk-T7E5JS6N.js +57 -0
- package/dist/chunk-TA3N5MMO.js +450 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TDEMDRN2.js +1639 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TGCVL74Y.js +28 -0
- package/dist/chunk-TGXXYDL4.js +1012 -0
- package/dist/chunk-TIKTYUJO.js +296 -0
- package/dist/chunk-TIZAJD4M.js +6029 -0
- package/dist/chunk-TLSEZZCG.js +5549 -0
- package/dist/chunk-TMBDRHAX.js +19 -0
- package/dist/chunk-TRURQUBP.js +1217 -0
- package/dist/chunk-TSQ256N5.js +152 -0
- package/dist/chunk-TUQMMFEQ.js +2244 -0
- package/dist/chunk-U424MJLC.js +81 -0
- package/dist/chunk-U4DRS6ZW.js +11 -0
- package/dist/chunk-U5KS22IN.js +204 -0
- package/dist/chunk-UAPHFJPN.js +673 -0
- package/dist/chunk-UB7LQITD.js +1040 -0
- package/dist/chunk-UBVRHGAZ.js +237 -0
- package/dist/chunk-UDNNAQN5.js +98 -0
- package/dist/chunk-UJP3XM54.js +342 -0
- package/dist/chunk-UJYDH2MW.js +305 -0
- package/dist/chunk-UKMPASIC.js +399 -0
- package/dist/chunk-UKUL3EHK.js +763 -0
- package/dist/chunk-UPHU64NB.js +1327 -0
- package/dist/chunk-URMSZXAD.js +43 -0
- package/dist/chunk-US3RT6CY.js +525 -0
- package/dist/chunk-UTDEOPKV.js +30 -0
- package/dist/chunk-UUUDKV7N.js +13 -0
- package/dist/chunk-UVKWU3SM.js +39 -0
- package/dist/chunk-V2TVPO3X.js +521 -0
- package/dist/chunk-V3KLVK7B.js +398 -0
- package/dist/chunk-V3YFFHDR.js +17 -0
- package/dist/chunk-VAG6GUBR.js +1162 -0
- package/dist/chunk-VBENAHDA.js +1814 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCGSWN5M.js +1300 -0
- package/dist/chunk-VE2O2I7M.js +115 -0
- package/dist/chunk-VIFHYTI5.js +31 -0
- package/dist/chunk-VJER3FUS.js +5080 -0
- package/dist/chunk-VLMDM56Q.js +268 -0
- package/dist/chunk-VMFZEVVX.js +99 -0
- package/dist/chunk-VNDPQVUZ.js +1853 -0
- package/dist/chunk-VSPJRLGA.js +4783 -0
- package/dist/chunk-VSWC5ZXI.js +103 -0
- package/dist/chunk-VYI4DSZP.js +2017 -0
- package/dist/chunk-W4BAIQ6L.js +1212 -0
- package/dist/chunk-W7VQAL2K.js +2203 -0
- package/dist/chunk-WEI3ZDZH.js +33 -0
- package/dist/chunk-WEIUS5NT.js +26 -0
- package/dist/chunk-WEW7UFWE.js +546 -0
- package/dist/chunk-WGQAXLNA.js +384 -0
- package/dist/chunk-WJAL4JL3.js +206 -0
- package/dist/chunk-WKFOJ5ZG.js +141 -0
- package/dist/chunk-WMWQEFLN.js +2177 -0
- package/dist/chunk-WNECKKO2.js +154 -0
- package/dist/chunk-WPKLYOAM.js +195 -0
- package/dist/chunk-WSH37YQN.js +243 -0
- package/dist/chunk-WV3KQDPE.js +84 -0
- package/dist/chunk-WZFC4V4U.js +389 -0
- package/dist/chunk-XCOIBNET.js +13 -0
- package/dist/chunk-XDM65LBX.js +53 -0
- package/dist/chunk-XGU6PBO5.js +645 -0
- package/dist/chunk-XHOI4V62.js +43 -0
- package/dist/chunk-XIBVFMLQ.js +6858 -0
- package/dist/chunk-XJ2E7YEJ.js +117 -0
- package/dist/chunk-XON4ZCYX.js +69 -0
- package/dist/chunk-XQPEWJPI.js +127 -0
- package/dist/chunk-XSJTIFUY.js +31 -0
- package/dist/chunk-XT7OVWM3.js +64 -0
- package/dist/chunk-XTXYIISX.js +1104 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XWIZ6B5S.js +109 -0
- package/dist/chunk-XWLIKOBX.js +240 -0
- package/dist/chunk-XZOXEIN4.js +156 -0
- package/dist/chunk-XZRS7I7W.js +3673 -0
- package/dist/chunk-Y4ZDDHB6.js +44 -0
- package/dist/chunk-Y733RB7T.js +194 -0
- package/dist/chunk-YBHUB4XR.js +14931 -0
- package/dist/chunk-YKC75XK4.js +147 -0
- package/dist/chunk-YKMXFVK7.js +27 -0
- package/dist/chunk-YO5BAJ55.js +225 -0
- package/dist/chunk-YPDCLXNZ.js +568 -0
- package/dist/chunk-YSQPGVFK.js +116 -0
- package/dist/chunk-YTVVTIWJ.js +716 -0
- package/dist/chunk-YVCMDVBB.js +698 -0
- package/dist/chunk-YYTOA6DP.js +114 -0
- package/dist/chunk-Z5WGNULV.js +88 -0
- package/dist/chunk-Z6NGVVXG.js +66 -0
- package/dist/chunk-Z7CDQNH3.js +20 -0
- package/dist/chunk-ZH4G3FU5.js +187 -0
- package/dist/chunk-ZJB6SQPA.js +257 -0
- package/dist/chunk-ZL6E4HMY.js +42 -0
- package/dist/chunk-ZMLOC3DW.js +62 -0
- package/dist/chunk-ZORW64QH.js +101 -0
- package/dist/chunk-ZVVD2XGV.js +1369 -0
- package/dist/cli-utils-ER33ODC5.js +31 -0
- package/dist/cli-validation-6CHPTANV.js +146 -0
- package/dist/commit-utils-3STAY7C7.js +49 -0
- package/dist/compatibility-notice-IHNXR2JR.js +21 -0
- package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
- package/dist/compete-results-XUM3PJHS.js +318 -0
- package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
- package/dist/config-4HHE4OIK.js +238 -0
- package/dist/config-D6YAZASH.js +10 -0
- package/dist/config-MIPRDYYV.js +46 -0
- package/dist/config-audit-GA5DCUAI.js +371 -0
- package/dist/config-explain-4LMO556H.js +71 -0
- package/dist/config-loader-RGP634PC.js +51 -0
- package/dist/config-manager-J2UTO635.js +114 -0
- package/dist/config-merger-TVUJBZTS.js +14 -0
- package/dist/config-validator-H4ZVIE56.js +122 -0
- package/dist/cost-HSIV5U2Y.js +85 -0
- package/dist/data-migration-state-OAUL2WPQ.js +35 -0
- package/dist/db-migrator-NUOW5NKR.js +34 -0
- package/dist/default-paths-UILB62BN.js +49 -0
- package/dist/discovery-V6GYUJUC.js +53 -0
- package/dist/doctor-BBSMCDWE.js +271 -0
- package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
- package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
- package/dist/doctor-purpose-6YJOXPBE.js +30 -0
- package/dist/domain-analyzer-S35ABUNA.js +48 -0
- package/dist/ensure-initialized-Q6PEU55O.js +78 -0
- package/dist/entry.js +922 -0
- package/dist/error-parser-core-MZFMFANN.js +70 -0
- package/dist/evaluation-context-GQBYDAEV.js +63 -0
- package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
- package/dist/execution-data-writer-YCG5UH37.js +72 -0
- package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
- package/dist/execution-preflight-DASJWWQF.js +223 -0
- package/dist/execution-roles-KNSNNB2D.js +112 -0
- package/dist/exit-code-error-QIY5DOKF.js +18 -0
- package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
- package/dist/factory-YCYCB7AE.js +209 -0
- package/dist/file-utils-ZQYNBQBW.js +45 -0
- package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
- package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
- package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
- package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
- package/dist/flywheel-executor-JWU43KAY.js +437 -0
- package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
- package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
- package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
- package/dist/flywheel-preflight-III2C7TH.js +163 -0
- package/dist/flywheel-resume-2O45MS7Y.js +31 -0
- package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
- package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
- package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
- package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
- package/dist/git-message-style-KCXGMTDT.js +104 -0
- package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
- package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
- package/dist/identity-XLQJ4YJF.js +25 -0
- package/dist/index-query-6NUY4FKX.js +37 -0
- package/dist/index.js +85588 -0
- package/dist/indexer-DL54CM3K.js +44 -0
- package/dist/init-OUZ72344.js +245 -0
- package/dist/instructions-import-offer-NSYXSITC.js +363 -0
- package/dist/instructions-run-NBII7W36.js +114 -0
- package/dist/interrupted-work-E4TLKJLE.js +43 -0
- package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
- package/dist/judge-scoring.json +64 -0
- package/dist/lab-mode-YXQ2Y3NG.js +44 -0
- package/dist/lab-utils-5QAMDJR5.js +29 -0
- package/dist/linux-host-class-YDWQX65O.js +31 -0
- package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
- package/dist/local-ci-config-VZ4WWDT5.js +48 -0
- package/dist/local-executor-DCMDDRX2.js +280 -0
- package/dist/logger-5KNKS3O4.js +154 -0
- package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
- package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
- package/dist/merge-batch-RTEEMVDB.js +313 -0
- package/dist/merge-batch-members-VIWGVRHP.js +24 -0
- package/dist/merge-queue-TIIUSOY6.js +126 -0
- package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
- package/dist/metadata-UKSMWM6J.js +29 -0
- package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
- package/dist/model-invocations-db-XTUPPQ34.js +70 -0
- package/dist/model-resolver-JFZ2MHOJ.js +39 -0
- package/dist/model-resolver-SCQ57KAQ.js +217 -0
- package/dist/model-roles-D3OR4NAH.js +110 -0
- package/dist/monitor-F4SIU5G2.js +96 -0
- package/dist/nested-worktrees-2WUWQ75N.js +23 -0
- package/dist/next-S3IRLVER.js +96 -0
- package/dist/next-UKPFRXOO.js +148 -0
- package/dist/opportunistic-TL4S26VX.js +86 -0
- package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
- package/dist/package-HJR4QJT4.js +10 -0
- package/dist/parse-git-status-7PIYFPS2.js +21 -0
- package/dist/path-security-5WJSY56G.js +41 -0
- package/dist/paths-JUI7C4KU.js +45 -0
- package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
- package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
- package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
- package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
- package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
- package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
- package/dist/preflight-PJHGTJNZ.js +12 -0
- package/dist/process-registry-B4ZUCN7T.js +28 -0
- package/dist/process-scanner-TU3QHWVB.js +23 -0
- package/dist/processes-6FHVGT72.js +28 -0
- package/dist/processes-json-fast-YWTMUWXB.js +72 -0
- package/dist/profile-HWTC56SG.js +209 -0
- package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
- package/dist/protected-branches-N36LDBFY.js +71 -0
- package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
- package/dist/provider-matrix-2KO2V5OM.js +214 -0
- package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
- package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
- package/dist/provider-registry-WCZ65QHC.js +136 -0
- package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
- package/dist/prune-engine-EOQVWEP6.js +448 -0
- package/dist/publication-turn-S42RZTQF.js +44 -0
- package/dist/quality-gate-JQMVCKOO.js +72 -0
- package/dist/quickstart-3O6FRCFB.js +105 -0
- package/dist/readiness-GW6ABRHB.js +139 -0
- package/dist/readiness-KFZCXDTT.js +215 -0
- package/dist/registry-7XG376SY.js +217 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-YG6MQZDW.js +28 -0
- package/dist/resolution-engine-FFEK7HQ2.js +187 -0
- package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
- package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
- package/dist/routing-events-AW6SRZ6G.js +13 -0
- package/dist/routing-history-store-FMDDQL6W.js +39 -0
- package/dist/routing-planner-C6OHO3EY.js +221 -0
- package/dist/runner-KHDNQ5KU.js +1194 -0
- package/dist/runner-PIS2BW7Y.js +1801 -0
- package/dist/safety-E3JJVSFL.js +67 -0
- package/dist/safety-stanza-HE6GXP4G.js +49 -0
- package/dist/sandbox-7LBZC5PE.js +72 -0
- package/dist/sandbox-ASWCDYZL.js +80 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-JI22TBEB.js +17 -0
- package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
- package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
- package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
- package/dist/shared-utils-34HJZ6JX.js +40 -0
- package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
- package/dist/sprint-N7JFTEGL.js +403 -0
- package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
- package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
- package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
- package/dist/sprint-manager-MU2ZUWN2.js +140 -0
- package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
- package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
- package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
- package/dist/storage-access-I3V5LER7.js +31 -0
- package/dist/store-XVG64ZR2.js +25 -0
- package/dist/task-classifier-MN2DYE5R.js +558 -0
- package/dist/task-list-fast-7AT6LTTA.js +112 -0
- package/dist/task-manager-LHPBBRRE.js +136 -0
- package/dist/task-report-OLPAWBTK.js +64 -0
- package/dist/task-type-detector-6RG3YNZF.js +27 -0
- package/dist/task-type-resolver-EQHOUIHT.js +64 -0
- package/dist/telemetry-5VYSK772.js +212 -0
- package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
- package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
- package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
- package/dist/transports-NREZQTJK.js +106 -0
- package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
- package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
- package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
- package/dist/user-agents-QLIGPLP2.js +30 -0
- package/dist/variant-execution-I4ZZUAWY.js +319 -0
- package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
- package/dist/variant-request-input-PL37N3AN.js +11 -0
- package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
- package/dist/variant-worker-COB5YTJX.js +4517 -0
- package/dist/variant-worker.js +26 -0
- package/dist/variants-XGDSXYG3.js +267 -0
- package/dist/verification-command-YSPU4VBH.js +66 -0
- package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
- package/dist/verify-commands-LOHMOFKC.js +65 -0
- package/dist/warning-JSKSFKBT.js +13 -0
- package/dist/work-edge-K65NHVWY.js +50 -0
- package/dist/work-item-writer-KY5ZWZWW.js +30 -0
- package/dist/worker-JNXXEIT6.js +1504 -0
- package/dist/worker.js +21 -0
- package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
- package/dist/worktree-environment-WTVABAQW.js +64 -0
- package/dist/worktree-metrics-VZRQI26T.js +66 -0
- package/dist/writeback-TQFQBJNU.js +50 -0
- package/docs/CLI_REFERENCE.md +8287 -0
- package/docs/PROVIDER_SETUP.md +1737 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2209 -0
- package/docs/getting-started/QUICK_START.md +260 -0
- package/docs/getting-started/README.md +198 -0
- package/docs/getting-started/SETUP.md +25 -0
- package/docs/reference/AGENT_CONTEXT.md +84 -0
- package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/SECURITY.md +291 -0
- package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
- package/integrations/bb-plugin-build/README.md +391 -0
- package/integrations/bb-plugin-build/app.css +431 -0
- package/integrations/bb-plugin-build/app.tsx +6210 -0
- package/integrations/bb-plugin-build/package.json +45 -0
- package/integrations/bb-plugin-build/server.ts +488 -0
- package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
- package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
- package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-build/src/contract.ts +718 -0
- package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
- package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
- package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
- package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-build/src/model.ts +1318 -0
- package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
- package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
- package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
- package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
- package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
- package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
- package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-build/src/project-target.ts +45 -0
- package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
- package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
- package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
- package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
- package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
- package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
- package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
- package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
- package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
- package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
- package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
- package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
- package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
- package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
- package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
- package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
- package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
- package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
- package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
- package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
- package/package.json +306 -4
- package/schemas/README.md +80 -0
- package/schemas/build.config.schema.json +2110 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +257 -0
- package/schemas/provider-config.schema.json +179 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +146 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/setup-git-hooks.mjs +39 -0
- package/scripts/sync.sh +2871 -0
- package/scripts/write-node-launcher.sh +138 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.build-project/README.md +41 -0
- package/templates/.build-project/agents/README.md +50 -0
- package/templates/.build-project/agents/architect.md +10 -0
- package/templates/.build-project/agents/code-reviewer.md +10 -0
- package/templates/.build-project/agents/debugger.md +10 -0
- package/templates/.build-project/agents/documenter.md +10 -0
- package/templates/.build-project/agents/test-automator.md +10 -0
- package/templates/.build-project/config/build.config.jsonc +64 -0
- package/templates/.build-project/config/project-context.template.json +6 -0
- package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.build-project/config/task-type-aliases.yaml +29 -0
- package/templates/.build-project/gitignore.template +70 -0
- package/templates/.build-project/task-types/analysis.yaml +38 -0
- package/templates/.build-project/task-types/architecture.yaml +35 -0
- package/templates/.build-project/task-types/doc.yaml +34 -0
- package/templates/.build-project/task-types/feature.yaml +22 -0
- package/templates/.build-project/task-types/general.yaml +4 -0
- package/templates/.build-project/task-types/security.yaml +38 -0
- package/templates/AGENTS.template.md +85 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
- package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
- package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
- package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
- package/templates/ci/incident-intake.mjs +787 -0
- package/templates/ci/incidents.yml.template +103 -0
- package/templates/ci/node.yml.template +17 -0
- package/templates/ci/python.yml.template +17 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
- package/templates/guard-kit/build-guard.yml.template +189 -0
- package/templates/guard-kit/check.mjs.template +932 -0
- package/templates/guard-kit/config.json.template +7 -0
- package/templates/guard-kit/policy.json.template +1 -0
- package/templates/profiles/README.md +57 -0
- package/templates/profiles/frontier-claude.json +23 -0
- package/templates/profiles/frontier-codex.json +23 -0
|
@@ -0,0 +1,1562 @@
|
|
|
1
|
+
// src/utils/shell-backslash.ts
|
|
2
|
+
function readShellBackslash(text, index, inDouble) {
|
|
3
|
+
const next = text[index + 1];
|
|
4
|
+
if (next === void 0) return { kind: "dangling", value: "\\", consumed: 1 };
|
|
5
|
+
if (next === "\n") return { kind: "continuation", value: "\n", consumed: 2 };
|
|
6
|
+
if (inDouble && !["$", "`", '"', "\\"].includes(next)) {
|
|
7
|
+
return { kind: "character", value: "\\", consumed: 1 };
|
|
8
|
+
}
|
|
9
|
+
return { kind: "character", value: next, consumed: 2 };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/core/project/verification-scope.ts
|
|
13
|
+
function isMissingToolLaunch(exitCode, errorCode) {
|
|
14
|
+
return errorCode === "ENOENT" || exitCode === 127 || exitCode === 9009;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// src/core/project/launcher-not-found.ts
|
|
18
|
+
function missingExecutableMessage(executable) {
|
|
19
|
+
return `Verification tool unavailable: executable '${executable}' was not found.`;
|
|
20
|
+
}
|
|
21
|
+
function launcherLinesCount(exitCode) {
|
|
22
|
+
return exitCode === void 0 || isMissingToolLaunch(exitCode);
|
|
23
|
+
}
|
|
24
|
+
function findLauncherMissingExecutable(output) {
|
|
25
|
+
const match = /(?:^|\n)\s*(?:(?:ba)?sh|zsh|dash|fish):\s*(?:\d+:\s*)?([a-z0-9_.-]+):\s*(?:command )?not found\b/i.exec(
|
|
26
|
+
output
|
|
27
|
+
) ?? /(?:^|\n)\s*(?:sh:\s*(?:\d+:\s*)?)?([a-z0-9_.-]+):\s*command not found\b/i.exec(output) ?? /\bspawn\s+(?:[^\s/\\]+[/\\])*([a-z0-9_.-]+)(?:\s+[^\n]*?)?\s+enoent\b/i.exec(output);
|
|
28
|
+
return match?.[1];
|
|
29
|
+
}
|
|
30
|
+
function outputNamesMissingSubcommand(output, subcommand) {
|
|
31
|
+
const named = /(?:^|\n)\s*(?:error:\s*)?no such (?:sub)?command:?\s*[`'"]?([^\s`'"]+)/g;
|
|
32
|
+
return [...output.matchAll(named)].some((m) => m[1] === subcommand);
|
|
33
|
+
}
|
|
34
|
+
function outputNamesToolNotInstalledForToolchain(output, tool) {
|
|
35
|
+
const escaped = tool.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
36
|
+
return new RegExp(
|
|
37
|
+
`(?:^|\\n)\\s*error:\\s*['"]${escaped}['"] is not installed for the toolchain\\b`
|
|
38
|
+
).test(output);
|
|
39
|
+
}
|
|
40
|
+
function outputNamesInvokedNotFound(output, executable) {
|
|
41
|
+
const escaped = executable.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
42
|
+
const invokedNotFound = new RegExp(
|
|
43
|
+
`(?:^|[\\s:])${escaped}:\\s*command not found[ \\t\\r]*$|(?:^|:)[ \\t]*command not found:\\s*${escaped}[ \\t\\r]*$`,
|
|
44
|
+
"m"
|
|
45
|
+
);
|
|
46
|
+
return invokedNotFound.test(output) || output.includes(`${executable}: not found`) || output.includes(`not found: ${executable}`);
|
|
47
|
+
}
|
|
48
|
+
var WRAPPER_INNER_EXIT_LINE = /^[^\n]*(?:\*\*\* (?:\[[^\]\n]*\] )?error(?: code)? |\bfailed on line \d+ with exit code |\bnon-zero exit (?:value|code|status) )(\d+)[ \t\r]*$/gim;
|
|
49
|
+
var MAKE_LEVEL_PREFIX = /^\s*g?make(?:\[(\d+)\])?:/i;
|
|
50
|
+
var MAKE_LAUNCH_FAILURE = /(?:^|\n)\s*g?make(?:\[\d+\])?:\s+([a-z0-9_.-]+):\s+no such file or directory\s*(?:\n|$)/i;
|
|
51
|
+
function wrapperReportsInnerMissingLaunch(output) {
|
|
52
|
+
const lines = [...output.matchAll(WRAPPER_INNER_EXIT_LINE)].map((match) => {
|
|
53
|
+
const prefix = MAKE_LEVEL_PREFIX.exec(match[0]);
|
|
54
|
+
return { code: match[1], level: prefix ? Number(prefix[1] ?? 0) : void 0 };
|
|
55
|
+
});
|
|
56
|
+
const unexplainedChildren = /* @__PURE__ */ new Map();
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
if (line.level === void 0 || line.level === 0) continue;
|
|
59
|
+
unexplainedChildren.set(line.level, (unexplainedChildren.get(line.level) ?? 0) + 1);
|
|
60
|
+
}
|
|
61
|
+
const independent = lines.filter((line) => {
|
|
62
|
+
if (line.code !== "2" || line.level === void 0) return true;
|
|
63
|
+
const children = unexplainedChildren.get(line.level + 1) ?? 0;
|
|
64
|
+
if (children === 0) return true;
|
|
65
|
+
unexplainedChildren.set(line.level + 1, children - 1);
|
|
66
|
+
return false;
|
|
67
|
+
});
|
|
68
|
+
return independent.some((line) => line.code === "127") && independent.every((line) => line.code === "127");
|
|
69
|
+
}
|
|
70
|
+
function nestedMissingMessage(output, exitCode, wrapperExecutable, processExitCode) {
|
|
71
|
+
const wrapperReportedMiss = (processExitCode ?? exitCode) !== 0 && wrapperReportsInnerMissingLaunch(output);
|
|
72
|
+
const named = wrapperReportedMiss || launcherLinesCount(exitCode) ? findLauncherMissingExecutable(output) ?? (wrapperReportedMiss ? MAKE_LAUNCH_FAILURE.exec(output)?.[1] : void 0) : void 0;
|
|
73
|
+
if (named) return missingExecutableMessage(named);
|
|
74
|
+
return wrapperReportedMiss ? `Verification tool unavailable: a command run by '${wrapperExecutable}' was not found (inner exit 127).` : void 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/core/project/verification-command-argv.ts
|
|
78
|
+
function parseVerificationCommandArgv(command) {
|
|
79
|
+
if (!command.trim()) return { error: "Verification command is empty." };
|
|
80
|
+
if (command.includes("`") || command.includes("$(")) {
|
|
81
|
+
return { error: "Verification command contains shell control syntax." };
|
|
82
|
+
}
|
|
83
|
+
const args = [];
|
|
84
|
+
let current = "";
|
|
85
|
+
let inSingle = false;
|
|
86
|
+
let inDouble = false;
|
|
87
|
+
let tokenStarted = false;
|
|
88
|
+
let i = 0;
|
|
89
|
+
const danglingEscape = { error: "Verification command has a dangling escape." };
|
|
90
|
+
const unterminatedQuote = { error: "Verification command has an unterminated quote." };
|
|
91
|
+
while (i < command.length) {
|
|
92
|
+
const ch = command[i];
|
|
93
|
+
if (inSingle) {
|
|
94
|
+
if (ch === "'") {
|
|
95
|
+
inSingle = false;
|
|
96
|
+
} else {
|
|
97
|
+
current += ch;
|
|
98
|
+
}
|
|
99
|
+
i += 1;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (inDouble) {
|
|
103
|
+
if (ch === "\\") {
|
|
104
|
+
const decoded = readShellBackslash(command, i, true);
|
|
105
|
+
if (decoded.kind === "dangling") return danglingEscape;
|
|
106
|
+
if (decoded.kind !== "continuation") current += decoded.value;
|
|
107
|
+
i += decoded.consumed;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (ch === '"') {
|
|
111
|
+
inDouble = false;
|
|
112
|
+
i += 1;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
current += ch;
|
|
116
|
+
i += 1;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if ("|;<>".includes(ch) || ch === "&" && command[i + 1] === "&") {
|
|
120
|
+
return { error: "Verification command contains shell control syntax." };
|
|
121
|
+
}
|
|
122
|
+
if (ch === "\\") {
|
|
123
|
+
const decoded = readShellBackslash(command, i, false);
|
|
124
|
+
if (decoded.kind === "dangling") return danglingEscape;
|
|
125
|
+
if (decoded.kind !== "continuation") {
|
|
126
|
+
current += decoded.value;
|
|
127
|
+
tokenStarted = true;
|
|
128
|
+
}
|
|
129
|
+
i += decoded.consumed;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (ch === "'") {
|
|
133
|
+
inSingle = true;
|
|
134
|
+
tokenStarted = true;
|
|
135
|
+
i += 1;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (ch === '"') {
|
|
139
|
+
inDouble = true;
|
|
140
|
+
tokenStarted = true;
|
|
141
|
+
i += 1;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (/\s/.test(ch)) {
|
|
145
|
+
if (tokenStarted) {
|
|
146
|
+
args.push(current);
|
|
147
|
+
current = "";
|
|
148
|
+
tokenStarted = false;
|
|
149
|
+
}
|
|
150
|
+
i += 1;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
current += ch;
|
|
154
|
+
tokenStarted = true;
|
|
155
|
+
i += 1;
|
|
156
|
+
}
|
|
157
|
+
if (inSingle || inDouble) return unterminatedQuote;
|
|
158
|
+
if (tokenStarted) args.push(current);
|
|
159
|
+
return args.length > 0 ? args : { error: "Verification command is empty." };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// src/core/project/python-coverage.ts
|
|
163
|
+
var UNITTEST_MODULE = "unittest";
|
|
164
|
+
function pythonUnittestDiscoveryArgs(startDirectory) {
|
|
165
|
+
return `discover -s ${startDirectory}`;
|
|
166
|
+
}
|
|
167
|
+
function hasPytestCovDeclared(text) {
|
|
168
|
+
return /\bpytest-cov\b/.test(text);
|
|
169
|
+
}
|
|
170
|
+
function hasCoveragePyDeclared(text, hasConfigFile, pytestCovDeclared) {
|
|
171
|
+
return hasConfigFile || pytestCovDeclared || /\[tool\.coverage/.test(text) || /\[coverage:/.test(text) || /(^|\n)\s*coverage(?:[<>=~! ]|\n|$)/.test(text);
|
|
172
|
+
}
|
|
173
|
+
function derivePythonCoverageCommands(input) {
|
|
174
|
+
const text = input.declaredDependencyText.toLowerCase();
|
|
175
|
+
const pytestCovDeclared = hasPytestCovDeclared(text);
|
|
176
|
+
const coveragePyDeclared = hasCoveragePyDeclared(
|
|
177
|
+
text,
|
|
178
|
+
input.hasCoveragePyConfigFile,
|
|
179
|
+
pytestCovDeclared
|
|
180
|
+
);
|
|
181
|
+
const build = input.buildPythonModuleCommand;
|
|
182
|
+
if (input.testShape === "pytest") {
|
|
183
|
+
if (pytestCovDeclared) return [build("pytest", "--cov")];
|
|
184
|
+
if (coveragePyDeclared)
|
|
185
|
+
return [build("coverage", "run -m pytest"), build("coverage", "report")];
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
if (input.testShape === "unittest" && input.unittestDiscoveryArgs !== null && coveragePyDeclared) {
|
|
189
|
+
return [build("coverage", `run -m ${UNITTEST_MODULE} ${input.unittestDiscoveryArgs}`)];
|
|
190
|
+
}
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
var COVERAGE_PY_NO_DATA = /no data to report|no data was collected/;
|
|
194
|
+
var PYTHON_RUNNER_FAILURE = /^\s*failed\s*\(|\b[1-9]\d*\s+(?:failed|failures|error|errors)\b/im;
|
|
195
|
+
var COVERAGE_NO_DATA = "Verification tool unavailable: coverage.py collected no data.";
|
|
196
|
+
function classifyPythonModuleUnavailable(lowercasedCommand, lowercasedOutput) {
|
|
197
|
+
for (const match of lowercasedCommand.matchAll(/\s-m\s+([a-z0-9_.-]+)/g)) {
|
|
198
|
+
const moduleName = match[1];
|
|
199
|
+
if (moduleName !== void 0 && lowercasedOutput.includes(`no module named ${moduleName}`)) {
|
|
200
|
+
return `Verification tool unavailable: module '${moduleName}' is not installed.`;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (!/\s-m\s+coverage\b/.test(lowercasedCommand)) return void 0;
|
|
204
|
+
if (!COVERAGE_PY_NO_DATA.test(lowercasedOutput)) return void 0;
|
|
205
|
+
if (/\s-m\s+coverage\s+run\b/.test(lowercasedCommand) && PYTHON_RUNNER_FAILURE.test(lowercasedOutput)) {
|
|
206
|
+
return void 0;
|
|
207
|
+
}
|
|
208
|
+
return COVERAGE_NO_DATA;
|
|
209
|
+
}
|
|
210
|
+
var UNITTEST_DISCOVERY_FLAGS = /* @__PURE__ */ new Set([
|
|
211
|
+
"-s",
|
|
212
|
+
"--start-directory",
|
|
213
|
+
"-t",
|
|
214
|
+
"--top-level-directory",
|
|
215
|
+
"-p",
|
|
216
|
+
"--pattern"
|
|
217
|
+
]);
|
|
218
|
+
function isSafeDiscoveryValue(value) {
|
|
219
|
+
if (value.startsWith("-") || value.startsWith("/") || value.startsWith("\\")) return false;
|
|
220
|
+
if (value.split(/[/\\]/).includes("..")) return false;
|
|
221
|
+
return /^[A-Za-z0-9_.*?[\]-]+(?:[/\\][A-Za-z0-9_.*?[\]-]+)*$/.test(value);
|
|
222
|
+
}
|
|
223
|
+
function isUnittestDiscoveryTail(tail) {
|
|
224
|
+
for (let index = 0; index < tail.length; index += 2) {
|
|
225
|
+
const flag = tail[index];
|
|
226
|
+
const value = tail[index + 1];
|
|
227
|
+
if (flag === void 0 || !UNITTEST_DISCOVERY_FLAGS.has(flag)) return false;
|
|
228
|
+
if (value === void 0 || !isSafeDiscoveryValue(value)) return false;
|
|
229
|
+
}
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
function isResolverPythonCoverageArgv(moduleArgs) {
|
|
233
|
+
if (moduleArgs.length === 1 && moduleArgs[0] === "report") return true;
|
|
234
|
+
if (moduleArgs[0] !== "run" || moduleArgs[1] !== "-m") return false;
|
|
235
|
+
const runner = moduleArgs[2];
|
|
236
|
+
const rest = moduleArgs.slice(3);
|
|
237
|
+
if (runner === "pytest") return rest.length === 0;
|
|
238
|
+
if (runner !== UNITTEST_MODULE) return false;
|
|
239
|
+
if (rest[0] !== "discover") return false;
|
|
240
|
+
return isUnittestDiscoveryTail(rest.slice(1));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// src/core/project/uv-run.ts
|
|
244
|
+
var UV_RUN_PASSIVE_OPTIONS = /* @__PURE__ */ new Set([
|
|
245
|
+
"--frozen",
|
|
246
|
+
"--locked",
|
|
247
|
+
"--no-sync",
|
|
248
|
+
"--offline",
|
|
249
|
+
"-q",
|
|
250
|
+
"--quiet",
|
|
251
|
+
"--no-dev"
|
|
252
|
+
]);
|
|
253
|
+
var UV_RUN_TOOLS = /* @__PURE__ */ new Set([
|
|
254
|
+
"black",
|
|
255
|
+
"mypy",
|
|
256
|
+
"pytest",
|
|
257
|
+
"python",
|
|
258
|
+
"python3",
|
|
259
|
+
"ruff"
|
|
260
|
+
]);
|
|
261
|
+
function parseUvRunArgv(argv) {
|
|
262
|
+
if (argv[0] !== "uv" || argv[1] !== "run") return void 0;
|
|
263
|
+
let index = 2;
|
|
264
|
+
while (UV_RUN_PASSIVE_OPTIONS.has(argv[index] ?? "")) index += 1;
|
|
265
|
+
const tool = argv[index];
|
|
266
|
+
return tool !== void 0 && UV_RUN_TOOLS.has(tool) ? argv.slice(index) : void 0;
|
|
267
|
+
}
|
|
268
|
+
function unwrapUvRunCommand(command) {
|
|
269
|
+
const argv = command.trim().split(/\s+/);
|
|
270
|
+
return parseUvRunArgv(argv)?.join(" ") ?? command;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// src/core/project/verification-runner-dispatch.ts
|
|
274
|
+
var PACKAGE_TEST_WRAPPER = /^(?:(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?|deno\s+task\s+)test\b/;
|
|
275
|
+
function isPackageTestWrapperDescriptor(descriptor) {
|
|
276
|
+
return descriptor.language === "node" && descriptor.kind === "test" && PACKAGE_TEST_WRAPPER.test(descriptor.command.trim().replace(/\s+/g, " "));
|
|
277
|
+
}
|
|
278
|
+
function applicableRunnerLanguages(descriptor) {
|
|
279
|
+
if (descriptor.language === "unknown" || isPackageTestWrapperDescriptor(descriptor)) return "all";
|
|
280
|
+
return [descriptor.language];
|
|
281
|
+
}
|
|
282
|
+
function runnerRowApplies(descriptor, language) {
|
|
283
|
+
const languages = applicableRunnerLanguages(descriptor);
|
|
284
|
+
return languages === "all" || languages.includes(language);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// src/core/project/exit-zero-failure-detectors.ts
|
|
288
|
+
function detectNodeExitZeroFailure(output) {
|
|
289
|
+
const vitestTestFiles = output.match(
|
|
290
|
+
/^\s*Test Files\s+.*?\b([1-9]\d*)\s+failed\b.*\(\d+\)\s*$/im
|
|
291
|
+
);
|
|
292
|
+
if (vitestTestFiles?.[1]) {
|
|
293
|
+
return {
|
|
294
|
+
toolchain: "node",
|
|
295
|
+
message: `Vitest reported ${vitestTestFiles[1]} failed test file(s) despite exit code 0.`
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const vitestTests = output.match(/^\s*Tests\s+.*?\b([1-9]\d*)\s+failed\b.*\(\d+\)\s*$/im);
|
|
299
|
+
if (vitestTests?.[1]) {
|
|
300
|
+
return {
|
|
301
|
+
toolchain: "node",
|
|
302
|
+
message: `Vitest reported ${vitestTests[1]} failed test(s) despite exit code 0.`
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
const jestSuites = output.match(
|
|
306
|
+
/^\s*Test Suites:\s+.*?\b([1-9]\d*)\s+failed\b.*,\s*\d+\s+total\s*$/im
|
|
307
|
+
);
|
|
308
|
+
if (jestSuites?.[1]) {
|
|
309
|
+
return {
|
|
310
|
+
toolchain: "node",
|
|
311
|
+
message: `Jest reported ${jestSuites[1]} failed test suite(s) despite exit code 0.`
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const jestTests = output.match(/^\s*Tests:\s+.*?\b([1-9]\d*)\s+failed\b.*,\s*\d+\s+total\s*$/im);
|
|
315
|
+
if (jestTests?.[1]) {
|
|
316
|
+
return {
|
|
317
|
+
toolchain: "node",
|
|
318
|
+
message: `Jest reported ${jestTests[1]} failed test(s) despite exit code 0.`
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const mochaFailing = output.match(/^\s*([1-9]\d*)\s+failing\s*$/im);
|
|
322
|
+
if (mochaFailing?.[1]) {
|
|
323
|
+
return {
|
|
324
|
+
toolchain: "node",
|
|
325
|
+
message: `Mocha reported ${mochaFailing[1]} failing test(s) despite exit code 0.`
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
return void 0;
|
|
329
|
+
}
|
|
330
|
+
function detectPythonExitZeroFailure(output) {
|
|
331
|
+
const pytestSummary = output.match(/^\s*=+\s+.*?\b([1-9]\d*)\s+failed\b.*?=+\s*$/im) ?? output.match(/^\s*([1-9]\d*)\s+failed\b.*\bin\s+\d+(?:\.\d+)?s\s*$/im);
|
|
332
|
+
if (pytestSummary?.[1]) {
|
|
333
|
+
return {
|
|
334
|
+
toolchain: "python",
|
|
335
|
+
message: `pytest reported ${pytestSummary[1]} failed test(s) despite exit code 0.`
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
const mypySummary = output.match(
|
|
339
|
+
/^\s*Found\s+([1-9]\d*)\s+errors?\s+in\s+\d+\s+files?\s+\(checked\s+\d+\s+source\s+files?\)\s*$/im
|
|
340
|
+
);
|
|
341
|
+
if (mypySummary?.[1]) {
|
|
342
|
+
return {
|
|
343
|
+
toolchain: "python",
|
|
344
|
+
message: `mypy reported ${mypySummary[1]} error(s) despite exit code 0.`
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
return void 0;
|
|
348
|
+
}
|
|
349
|
+
function detectGoExitZeroFailure(output) {
|
|
350
|
+
if (
|
|
351
|
+
// `--- FAIL: TestX (0.00s)`, indented for a subtest.
|
|
352
|
+
/^[ \t]*---\s+FAIL:\s+\S+(?:\s+\(\d+(?:\.\d+)?s\))?\s*$/m.test(output) || // The bare `FAIL` line, and `FAIL<TAB>pkg<TAB>0.186s` / `FAIL<TAB>pkg [build failed]`.
|
|
353
|
+
/^FAIL\s*$/m.test(output) || /^FAIL\t\S+(?:\t\d+(?:\.\d+)?s| \[(?:build|setup) failed\])\s*$/m.test(output)
|
|
354
|
+
) {
|
|
355
|
+
return {
|
|
356
|
+
toolchain: "go",
|
|
357
|
+
message: "go test reported failures despite exit code 0."
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
function detectNativeExitZeroFailure(output) {
|
|
363
|
+
if (
|
|
364
|
+
// ctest: `Errors while running CTest` and `50% tests passed, 1 tests failed out of 2`.
|
|
365
|
+
/^\s*Errors while running CTest\s*$/m.test(output) || /^\s*\d+%\s+tests passed,\s+[1-9]\d*\s+tests?\s+failed\s+out\s+of\s+\d+\s*$/m.test(output) || // ninja's own stop line (every failed build ends with one, with or without -k) and its
|
|
366
|
+
// load-time errors. The preceding `FAILED: <edge>` line is not matched on its own: a
|
|
367
|
+
// line starting with that word is not specific to ninja.
|
|
368
|
+
/^ninja: build stopped: .+$/m.test(output) || /^ninja: error: .+$/m.test(output) || // meson test: the failures heading, a failed result row, and the Ok/Fail totals block
|
|
369
|
+
// (`Fail: 0` is the passing form).
|
|
370
|
+
/^Summary of Failures:\s*$/m.test(output) || /^\d+\/\d+\s+\S+\s+FAIL\s+\d+(?:\.\d+)?s\b.*$/m.test(output) || /^Ok:[ \t]+\d+[ \t]*\r?\n(?:Expected Fail:[ \t]+\d+[ \t]*\r?\n)?Fail:[ \t]+[1-9]\d*[ \t]*$/m.test(
|
|
371
|
+
output
|
|
372
|
+
)
|
|
373
|
+
) {
|
|
374
|
+
return {
|
|
375
|
+
toolchain: "native",
|
|
376
|
+
message: "Native build/test tooling reported failures despite exit code 0."
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
return void 0;
|
|
380
|
+
}
|
|
381
|
+
function detectRustExitZeroFailure(output) {
|
|
382
|
+
const rustFailure = output.match(
|
|
383
|
+
/^\s*test result:\s+FAILED\.\s+\d+\s+passed;\s+([1-9]\d*)\s+failed;.*$/im
|
|
384
|
+
);
|
|
385
|
+
if (rustFailure?.[1]) {
|
|
386
|
+
return {
|
|
387
|
+
toolchain: "rust",
|
|
388
|
+
message: `cargo reported ${rustFailure[1]} failed test(s) despite exit code 0.`
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
return void 0;
|
|
392
|
+
}
|
|
393
|
+
function detectJvmExitZeroFailure(output) {
|
|
394
|
+
if (
|
|
395
|
+
// Gradle `BUILD FAILED in 5s` (Ant prints it bare) and Maven `[ERROR] BUILD FAILURE`.
|
|
396
|
+
/^\s*BUILD FAILED(?: in .+)?\s*$/m.test(output) || /^(?:\[ERROR\]\s+)?BUILD FAILURE\s*$/m.test(output) || // Gradle's report line, with the `> ` prefix under FAILURE and without it when
|
|
397
|
+
// `ignoreFailures` lets the build exit 0 after failing tests.
|
|
398
|
+
/^(?:>\s+)?There were failing tests\. See the report at: .+$/m.test(output)
|
|
399
|
+
) {
|
|
400
|
+
return {
|
|
401
|
+
toolchain: "jvm",
|
|
402
|
+
message: "JVM build tool reported failed verification despite exit code 0."
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
return void 0;
|
|
406
|
+
}
|
|
407
|
+
function detectDotnetExitZeroFailure(output) {
|
|
408
|
+
if (/^\s*Failed!\s+-\s+Failed:\s*[1-9]\d*,\s*Passed:\s*\d+,\s*Skipped:\s*\d+,\s*Total:\s*\d+(?:,.*)?$/m.test(
|
|
409
|
+
output
|
|
410
|
+
) || // MSBuild's own final status line, cased as it prints it.
|
|
411
|
+
/^\s*Build FAILED\.\s*$/m.test(output)) {
|
|
412
|
+
return {
|
|
413
|
+
toolchain: "dotnet",
|
|
414
|
+
message: ".NET tooling reported failed verification despite exit code 0."
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
return void 0;
|
|
418
|
+
}
|
|
419
|
+
function detectSwiftExitZeroFailure(output, descriptor) {
|
|
420
|
+
const swiftSpecificFailure = /^\s*\*\*\s+TEST FAILED\s+\*\*\s*$/m.test(output) || /^\s*Test Suite '.+' failed at .+$/m.test(output);
|
|
421
|
+
if (descriptor.language !== "swift" && descriptor.language !== "unknown" && !isPackageTestWrapperDescriptor(descriptor))
|
|
422
|
+
return void 0;
|
|
423
|
+
if (descriptor.language === "swift" && /^\s*(?:.+?:\d+:\d+:\s+)?error:\s/im.test(output) || swiftSpecificFailure) {
|
|
424
|
+
return {
|
|
425
|
+
toolchain: "swift",
|
|
426
|
+
message: "Swift tooling reported failed verification despite exit code 0."
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
return void 0;
|
|
430
|
+
}
|
|
431
|
+
function detectDartExitZeroFailure(output, descriptor) {
|
|
432
|
+
if (descriptor.language !== "dart" && descriptor.language !== "unknown" && !isPackageTestWrapperDescriptor(descriptor))
|
|
433
|
+
return void 0;
|
|
434
|
+
if (/^\s*\d{2}:\d{2}(?::\d{2})?(?:\s+[+~-]\d+)+:\s*Some tests failed\.\s*$/m.test(output) || /^\s*\d{2}:\d{2}(?::\d{2})?(?:\s+[+~]\d+)+\s+-[1-9]\d*:\s+\S.*$/m.test(output)) {
|
|
435
|
+
return {
|
|
436
|
+
toolchain: "dart",
|
|
437
|
+
message: "Dart/Flutter tooling reported failures despite exit code 0."
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
return void 0;
|
|
441
|
+
}
|
|
442
|
+
function detectRubyExitZeroFailure(output) {
|
|
443
|
+
if (
|
|
444
|
+
// Minitest: `2 runs, 2 assertions, 1 failures, 0 errors, 0 skips`.
|
|
445
|
+
/^\d+ runs, \d+ assertions, [1-9]\d* failures, \d+ errors, \d+ skips\s*$/m.test(output) || /^\d+ runs, \d+ assertions, \d+ failures, [1-9]\d* errors, \d+ skips\s*$/m.test(output) || // RSpec: `2 examples, 1 failure` and `0 examples, 0 failures, 1 error occurred outside of examples`.
|
|
446
|
+
/^\d+ examples?, [1-9]\d* failures?(?:, \d+ pending)?(?:, \d+ errors? occurred outside of examples)?\s*$/m.test(
|
|
447
|
+
output
|
|
448
|
+
) || /^\d+ examples?, \d+ failures?(?:, \d+ pending)?, [1-9]\d* errors? occurred outside of examples\s*$/m.test(
|
|
449
|
+
output
|
|
450
|
+
)
|
|
451
|
+
) {
|
|
452
|
+
return {
|
|
453
|
+
toolchain: "ruby",
|
|
454
|
+
message: "Ruby test tooling reported failures despite exit code 0."
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
return void 0;
|
|
458
|
+
}
|
|
459
|
+
function detectPhpExitZeroFailure(output) {
|
|
460
|
+
if (
|
|
461
|
+
// PHPUnit: the `FAILURES!` heading and `Tests: 2, Assertions: 2, Failures: 1.` totals
|
|
462
|
+
// (`Errors: n` leads when present; `Skipped`, `Risky` and the rest may follow).
|
|
463
|
+
/^FAILURES!\s*$/m.test(output) || /^Tests:\s*\d+,\s*Assertions:\s*\d+(?:,\s*[A-Za-z ]+:\s*\d+)*?,\s*(?:Errors|Failures):\s*[1-9]\d*(?:,\s*[A-Za-z ]+:\s*\d+)*\.\s*$/m.test(
|
|
464
|
+
output
|
|
465
|
+
)
|
|
466
|
+
) {
|
|
467
|
+
return {
|
|
468
|
+
toolchain: "php",
|
|
469
|
+
message: "PHP test tooling reported failures despite exit code 0."
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
return void 0;
|
|
473
|
+
}
|
|
474
|
+
function detectShellExitZeroFailure(output) {
|
|
475
|
+
if (
|
|
476
|
+
// ShellCheck prints no summary line: its error findings are the status lines, in the
|
|
477
|
+
// default tty format (`^-- SC1049 (error): ...`, `^----^ SC2034 (error): ...`) and
|
|
478
|
+
// the gcc format (`error.sh:2:1: error: ... [SC1049]`).
|
|
479
|
+
/^\s*\^[-^]*\s+SC\d{4}\s+\(error\):\s+\S.*$/m.test(output) || /^\S[^\n]*?:\d+:\d+:\s+error:\s+.+\s\[SC\d{4}\]\s*$/m.test(output)
|
|
480
|
+
) {
|
|
481
|
+
return {
|
|
482
|
+
toolchain: "shell",
|
|
483
|
+
message: "ShellCheck reported errors despite exit code 0."
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
const pester = output.match(
|
|
487
|
+
/^Tests Passed:\s*\d+,\s*Failed:\s*([1-9]\d*),\s*Skipped:\s*\d+,\s*Inconclusive:\s*\d+,\s*NotRun:\s*\d+\s*$/m
|
|
488
|
+
);
|
|
489
|
+
if (pester?.[1]) {
|
|
490
|
+
return {
|
|
491
|
+
toolchain: "shell",
|
|
492
|
+
message: `Pester reported ${pester[1]} failed test(s) despite exit code 0.`
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
return void 0;
|
|
496
|
+
}
|
|
497
|
+
function detectRExitZeroFailure(output, descriptor) {
|
|
498
|
+
if (descriptor.language !== "r" && descriptor.language !== "unknown" && !isPackageTestWrapperDescriptor(descriptor))
|
|
499
|
+
return void 0;
|
|
500
|
+
if (/^\s*\*\s+checking\b.+\.\.\.\s+ERROR\s*$/m.test(output) || /^\s*Status:\s+[1-9]\d*\s+ERRORs?(?:,.*)?$/m.test(output) || // testthat's bracketed summary, e.g. `[ FAIL 1 | WARN 0 | SKIP 0 | PASS 4 ]`.
|
|
501
|
+
descriptor.language === "r" && /^\s*\[\s*FAIL\s+[1-9]\d*\s*\|\s*WARN\s+\d+\s*\|\s*SKIP\s+\d+\s*\|\s*PASS\s+\d+\s*\]\s*$/m.test(
|
|
502
|
+
output
|
|
503
|
+
)) {
|
|
504
|
+
return {
|
|
505
|
+
toolchain: "r",
|
|
506
|
+
message: "R tooling reported failed verification despite exit code 0."
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
return void 0;
|
|
510
|
+
}
|
|
511
|
+
var ANSI_COLOR = new RegExp(String.raw`\x1B\[[0-9;]*m`, "g");
|
|
512
|
+
function detectSqlExitZeroFailure(output) {
|
|
513
|
+
const plain = output.replace(ANSI_COLOR, "");
|
|
514
|
+
if (
|
|
515
|
+
// dbt: `Completed with 1 error, 0 partial successes, and 0 warnings:` and the
|
|
516
|
+
// `Done. PASS=3 WARN=0 ERROR=1 SKIP=0 ...` totals, each after a `00:48:55 ` timestamp.
|
|
517
|
+
/^(?:\d{2}:\d{2}:\d{2}\s+)?Completed with\s+[1-9]\d*\s+errors?\b.*\bwarnings?:\s*$/m.test(
|
|
518
|
+
plain
|
|
519
|
+
) || /^(?:\d{2}:\d{2}:\d{2}\s+)?Done\.\s+PASS=\d+\s+WARN=\d+\s+ERROR=[1-9]\d*(?:\s+[A-Z-]+=\d+)*\s*$/m.test(
|
|
520
|
+
plain
|
|
521
|
+
) || // sqlfluff lists only failing files, as `== [path/to/file.sql] FAIL`; `All Finished!` is
|
|
522
|
+
// printed whatever the result.
|
|
523
|
+
/^== \[.+\] FAIL\s*$/m.test(plain)
|
|
524
|
+
) {
|
|
525
|
+
return {
|
|
526
|
+
toolchain: "sql",
|
|
527
|
+
message: "SQL/dbt tooling reported failed verification despite exit code 0."
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
return void 0;
|
|
531
|
+
}
|
|
532
|
+
var EXIT_ZERO_FAILURE_DETECTORS = {
|
|
533
|
+
node: detectNodeExitZeroFailure,
|
|
534
|
+
python: detectPythonExitZeroFailure,
|
|
535
|
+
native: detectNativeExitZeroFailure,
|
|
536
|
+
go: detectGoExitZeroFailure,
|
|
537
|
+
rust: detectRustExitZeroFailure,
|
|
538
|
+
jvm: detectJvmExitZeroFailure,
|
|
539
|
+
dotnet: detectDotnetExitZeroFailure,
|
|
540
|
+
swift: detectSwiftExitZeroFailure,
|
|
541
|
+
dart: detectDartExitZeroFailure,
|
|
542
|
+
ruby: detectRubyExitZeroFailure,
|
|
543
|
+
php: detectPhpExitZeroFailure,
|
|
544
|
+
shell: detectShellExitZeroFailure,
|
|
545
|
+
r: detectRExitZeroFailure,
|
|
546
|
+
sql: detectSqlExitZeroFailure
|
|
547
|
+
};
|
|
548
|
+
function orderedExitZeroFailureDetectors(descriptor) {
|
|
549
|
+
const languages = applicableRunnerLanguages(descriptor);
|
|
550
|
+
return languages === "all" ? Object.values(EXIT_ZERO_FAILURE_DETECTORS) : languages.map((language) => EXIT_ZERO_FAILURE_DETECTORS[language]);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// src/core/project/missing-dependency-signatures.ts
|
|
554
|
+
var RUBY_ERROR_LOCATION = String.raw`\S+:\d+:in [^\n]*?: `;
|
|
555
|
+
var BUNDLER_GEM_NOT_FOUND_LINE = new RegExp(
|
|
556
|
+
`(?:^|\\n)(?:bundler::gemnotfound\\b|${RUBY_ERROR_LOCATION}[^\\n]*\\(bundler::gemnotfound\\)[ \\t\\r]*(?=\\n|$))`
|
|
557
|
+
);
|
|
558
|
+
var BUNDLER_LOCKED_GEM_MISSING = new RegExp(
|
|
559
|
+
`(?:^|\\n)(?:${RUBY_ERROR_LOCATION})?could not find (?:[a-z0-9_.-]+-\\d[^\\s,]*, )*[a-z0-9_.-]+-\\d[^\\s,]* in (?:locally installed gems|any of the sources)`
|
|
560
|
+
);
|
|
561
|
+
var BUNDLER_COULD_NOT_FIND_GEM = /(?:^|\n)could not find gem '[^'\n]+'/;
|
|
562
|
+
var BUNDLE_INSTALL_HINT = /(?:^|\n)run `bundle install`/;
|
|
563
|
+
var CARGO_OFFLINE_DEPENDENCY_MISSING = new RegExp(
|
|
564
|
+
"(?:^|\\n)error: no matching package named `[^`\\n]+` found\\r?\\n(?:location searched: [^\\n]*\\r?\\n)?required by package [^\\n]*\\r?\\nas a reminder, you're using offline mode \\(--(?:offline|frozen)\\)"
|
|
565
|
+
);
|
|
566
|
+
var CARGO_RAN_CODE = /(?:^|\n)[ \t]*(?:compiling |running |test result:|error: test failed|error: could not compile)|\n[ \t]*test \S+ \.\.\. (?:ok|failed)/;
|
|
567
|
+
var MAVEN_RAN_CODE = /t e s t s|tests run:|<<< (?:failure|error)!|compiling \d+ source file|compilation error|build success/;
|
|
568
|
+
var MAVEN_OFFLINE_ARTIFACT_MISSING = /(?:^|\n)\[error\][ \t]+cannot access [^\n]*\([^)\n]+\) in offline mode and the artifact [^\n]+ has not been downloaded from it before\./;
|
|
569
|
+
var GO_ALLOWED_LINE = [
|
|
570
|
+
/^go: (?:downloading|finding) \S.*$/,
|
|
571
|
+
/^# \S+$/,
|
|
572
|
+
/^[^\s:]+\.go:\d+:\d+: module lookup disabled by goproxy=off$/,
|
|
573
|
+
/^fail$/,
|
|
574
|
+
/^ok\s*\t.*$/,
|
|
575
|
+
/^\?\s*\t.*\[no test files\]$/,
|
|
576
|
+
// Execa's shortMessage line, appended to the process output by the caller.
|
|
577
|
+
/^command failed with exit code \d+(?::.*)?$/
|
|
578
|
+
];
|
|
579
|
+
var GO_LOOKUP_DISABLED_LINE = /^[^\s:]+\.go:\d+:\d+: module lookup disabled by goproxy=off$/;
|
|
580
|
+
var GO_SETUP_FAILED_LINE = /^fail\t\S+ \[setup failed\]$/;
|
|
581
|
+
function isGoOfflineModuleMiss(output) {
|
|
582
|
+
const lines = output.split("\n").map((line) => line.replace(/\r$/, "").trimEnd()).filter((line) => line !== "");
|
|
583
|
+
let lookups = 0;
|
|
584
|
+
let setupFailures = 0;
|
|
585
|
+
for (const line of lines) {
|
|
586
|
+
if (GO_LOOKUP_DISABLED_LINE.test(line)) lookups += 1;
|
|
587
|
+
else if (GO_SETUP_FAILED_LINE.test(line)) setupFailures += 1;
|
|
588
|
+
else if (!GO_ALLOWED_LINE.some((allowed) => allowed.test(line))) return false;
|
|
589
|
+
}
|
|
590
|
+
return lookups > 0 && setupFailures > 0;
|
|
591
|
+
}
|
|
592
|
+
var MISSING_DEPENDENCY_SIGNATURES = [
|
|
593
|
+
{
|
|
594
|
+
heads: /* @__PURE__ */ new Set(["bundle", "rake", "rspec"]),
|
|
595
|
+
// `bundler: failed to load command:` is always followed by the GemNotFound line.
|
|
596
|
+
matches: (output) => BUNDLER_GEM_NOT_FOUND_LINE.test(output) || BUNDLER_LOCKED_GEM_MISSING.test(output) || BUNDLER_COULD_NOT_FIND_GEM.test(output) && BUNDLE_INSTALL_HINT.test(output),
|
|
597
|
+
message: "Verification tool unavailable: Ruby gems are not installed (run bundle install)."
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
heads: /* @__PURE__ */ new Set(["cargo"]),
|
|
601
|
+
matches: (output) => CARGO_OFFLINE_DEPENDENCY_MISSING.test(output) && !CARGO_RAN_CODE.test(output),
|
|
602
|
+
message: "Verification tool unavailable: Cargo dependencies are not available offline (fetch them first)."
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
heads: /* @__PURE__ */ new Set(["mvn", "mvnw"]),
|
|
606
|
+
matches: (output) => MAVEN_OFFLINE_ARTIFACT_MISSING.test(output) && !MAVEN_RAN_CODE.test(output),
|
|
607
|
+
message: "Verification tool unavailable: Maven plugins or dependencies are not in the local repository (offline)."
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
heads: /* @__PURE__ */ new Set(["go"]),
|
|
611
|
+
matches: isGoOfflineModuleMiss,
|
|
612
|
+
message: "Verification tool unavailable: Go modules are not in the module cache and module lookup is disabled (fetch them first)."
|
|
613
|
+
}
|
|
614
|
+
];
|
|
615
|
+
function detectMissingDependencySignature(executable, output, exitCode) {
|
|
616
|
+
if (exitCode === 0 || exitCode === 124) return void 0;
|
|
617
|
+
return MISSING_DEPENDENCY_SIGNATURES.find(
|
|
618
|
+
(signature) => signature.heads.has(executable) && signature.matches(output)
|
|
619
|
+
)?.message;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// src/core/project/node-style-tools.ts
|
|
623
|
+
var LOCAL_JS_TOOL_PREFIX = String.raw`(?:(?:npx|pnpx|bunx)\s+(?:--no-install|--offline)\s+)?`;
|
|
624
|
+
var BIOME_OR_ESLINT = new RegExp(`^${LOCAL_JS_TOOL_PREFIX}(?:biome|eslint)\\b`);
|
|
625
|
+
var RUNNER_PASSIVE_FLAGS = /* @__PURE__ */ new Set(["--no-install", "--offline", "--yes", "-y", "--no", "--"]);
|
|
626
|
+
var PRETTIER_TOOL = /^(?:prettier|(?:[^\s]*[/\\])?node_modules[/\\]\.bin[/\\]prettier)$/;
|
|
627
|
+
function toolIndexAfterRunner(args) {
|
|
628
|
+
const head = args[0] ?? "";
|
|
629
|
+
let index;
|
|
630
|
+
if (head === "npx" || head === "pnpx" || head === "bunx") index = 1;
|
|
631
|
+
else if ((head === "npm" || head === "pnpm" || head === "yarn") && args[1] === "exec") index = 2;
|
|
632
|
+
else if (head === "bun" && args[1] === "x") index = 2;
|
|
633
|
+
else return 0;
|
|
634
|
+
while (index < args.length && (args[index] ?? "").startsWith("-")) {
|
|
635
|
+
if (!RUNNER_PASSIVE_FLAGS.has(args[index] ?? "")) return -1;
|
|
636
|
+
index += 1;
|
|
637
|
+
}
|
|
638
|
+
return index;
|
|
639
|
+
}
|
|
640
|
+
function prettierIndex(argv) {
|
|
641
|
+
const index = toolIndexAfterRunner(argv);
|
|
642
|
+
return index >= 0 && PRETTIER_TOOL.test(argv[index] ?? "") ? index : -1;
|
|
643
|
+
}
|
|
644
|
+
function isPrettierCheck(normalized) {
|
|
645
|
+
const argv = parseVerificationCommandArgv(normalized);
|
|
646
|
+
if (!Array.isArray(argv)) return false;
|
|
647
|
+
const index = prettierIndex(argv);
|
|
648
|
+
if (index < 0) return false;
|
|
649
|
+
let checks = false;
|
|
650
|
+
for (const arg of argv.slice(index + 1)) {
|
|
651
|
+
if (arg === "--check" || arg === "--list-different") checks = true;
|
|
652
|
+
else if (arg === "--write" || arg.startsWith("--write=")) return false;
|
|
653
|
+
else if (/^-[a-zA-Z]+$/.test(arg)) {
|
|
654
|
+
if (arg.includes("w")) return false;
|
|
655
|
+
if (arg.includes("c") || arg.includes("l")) checks = true;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
return checks;
|
|
659
|
+
}
|
|
660
|
+
function classifyNodeStyleTool(normalized) {
|
|
661
|
+
if (BIOME_OR_ESLINT.test(normalized)) return "lint";
|
|
662
|
+
return isPrettierCheck(normalized) ? "format" : void 0;
|
|
663
|
+
}
|
|
664
|
+
function isPrettierInvocation(tokens) {
|
|
665
|
+
return prettierIndex(tokens) >= 0;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// src/core/project/verification-command-metadata.ts
|
|
669
|
+
var FAST_SCRIPT_KEYS = /* @__PURE__ */ new Set(["typecheck", "type-check", "lint", "test:smoke"]);
|
|
670
|
+
var BROAD_SCRIPT_KEYS = /* @__PURE__ */ new Set([
|
|
671
|
+
"test",
|
|
672
|
+
"test:unit",
|
|
673
|
+
"test:core",
|
|
674
|
+
"test:automation",
|
|
675
|
+
"test:coverage",
|
|
676
|
+
"build"
|
|
677
|
+
]);
|
|
678
|
+
function scriptWord(pattern) {
|
|
679
|
+
return new RegExp(`(?<![A-Za-z0-9])(?:${pattern})(?![A-Za-z0-9])`);
|
|
680
|
+
}
|
|
681
|
+
var LINT_WORD = scriptWord("lint");
|
|
682
|
+
var TYPECHECK_WORD = scriptWord("type-?check|analy[sz]e|phpstan|psalm");
|
|
683
|
+
var BUILD_WORD = scriptWord("build");
|
|
684
|
+
var FAST_COST_WORD = scriptWord("smoke|unit|fast");
|
|
685
|
+
function kindFromScriptName(script) {
|
|
686
|
+
if (LINT_WORD.test(script)) return "lint";
|
|
687
|
+
if (TYPECHECK_WORD.test(script)) return "typecheck";
|
|
688
|
+
if (BUILD_WORD.test(script)) return "build";
|
|
689
|
+
return "test";
|
|
690
|
+
}
|
|
691
|
+
function scriptCostClass(script) {
|
|
692
|
+
if (FAST_SCRIPT_KEYS.has(script)) return "fast";
|
|
693
|
+
if (BROAD_SCRIPT_KEYS.has(script)) return "broad";
|
|
694
|
+
return FAST_COST_WORD.test(script) ? "medium" : "broad";
|
|
695
|
+
}
|
|
696
|
+
function classifyScriptRunnerCommand(normalized) {
|
|
697
|
+
const node = /^(?:(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?|deno\s+task\s+|deno\s+(?=(?:test|lint)(?:\s|$)))((?:test|lint|typecheck|type-check|build)(?:[:._-][\w:.-]*)?)(?=\s|$)/.exec(
|
|
698
|
+
normalized
|
|
699
|
+
);
|
|
700
|
+
if (node?.[1]) {
|
|
701
|
+
return {
|
|
702
|
+
language: "node",
|
|
703
|
+
kind: kindFromScriptName(node[1]),
|
|
704
|
+
scope: "unknown",
|
|
705
|
+
costClass: scriptCostClass(node[1])
|
|
706
|
+
};
|
|
707
|
+
}
|
|
708
|
+
if (/^composer\s+(?:run|run-script|test|exec)\b/.test(normalized)) {
|
|
709
|
+
const tokens = normalized.split(" ").slice(2);
|
|
710
|
+
const script = /^composer\s+(?:run|run-script)\b/.test(normalized) ? tokens.find((token) => token !== "--" && !token.startsWith("-")) : void 0;
|
|
711
|
+
let kind;
|
|
712
|
+
if (/^composer\s+exec\b/.test(normalized)) {
|
|
713
|
+
const executable = (tokens.find((token) => token !== "--" && !token.startsWith("-")) ?? "").replace(/^.*[/\\]/, "");
|
|
714
|
+
kind = /^(?:phpstan|psalm)(?:\.phar)?$/.test(executable) ? "typecheck" : /^(?:phpcs|php-cs-fixer|pint|phpcbf)(?:\.phar)?$/.test(executable) ? "lint" : "test";
|
|
715
|
+
} else {
|
|
716
|
+
kind = script ? kindFromScriptName(script) : "test";
|
|
717
|
+
}
|
|
718
|
+
return {
|
|
719
|
+
language: "php",
|
|
720
|
+
kind,
|
|
721
|
+
scope: "full",
|
|
722
|
+
costClass: kind === "lint" || kind === "typecheck" ? "fast" : "broad"
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
return void 0;
|
|
726
|
+
}
|
|
727
|
+
function classifyNinjaCommand(normalized) {
|
|
728
|
+
if (!/^ninja\b/.test(normalized)) return void 0;
|
|
729
|
+
const targets = [];
|
|
730
|
+
const tokens = normalized.split(" ");
|
|
731
|
+
for (let index = 1; index < tokens.length; index += 1) {
|
|
732
|
+
const token = tokens[index];
|
|
733
|
+
if (!token) continue;
|
|
734
|
+
if (token === "-t" || token === "--tool") return void 0;
|
|
735
|
+
if (["-C", "-f", "-j", "-k", "-l", "-d"].includes(token)) {
|
|
736
|
+
index += 1;
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
if (/^-(?:C|f|j|k|l|d).+/.test(token)) continue;
|
|
740
|
+
if (token === "-v") continue;
|
|
741
|
+
if (token.startsWith("-")) return void 0;
|
|
742
|
+
targets.push(token);
|
|
743
|
+
}
|
|
744
|
+
if (targets.length === 0) return "build";
|
|
745
|
+
if (targets.every((target) => /^(?:all|default|build)$/.test(target))) return "build";
|
|
746
|
+
if (targets.every((target) => /(?:^|:)(?:test|check|tests|checks)$/.test(target))) {
|
|
747
|
+
return "test";
|
|
748
|
+
}
|
|
749
|
+
return void 0;
|
|
750
|
+
}
|
|
751
|
+
function classifyMakeCommand(normalized) {
|
|
752
|
+
if (!/^make\b/.test(normalized)) return void 0;
|
|
753
|
+
const tokens = normalized.split(" ").slice(1);
|
|
754
|
+
const targets = [];
|
|
755
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
756
|
+
const token = tokens[index];
|
|
757
|
+
if (!token) continue;
|
|
758
|
+
if (token.startsWith("-")) {
|
|
759
|
+
if (MAKE_VALUE_OPTIONS.has(token)) {
|
|
760
|
+
index += 1;
|
|
761
|
+
} else if (MAKE_OPTIONAL_NUMBER_OPTIONS.has(token) && /^\d+(?:\.\d+)?$/.test(tokens[index + 1] ?? "")) {
|
|
762
|
+
index += 1;
|
|
763
|
+
}
|
|
764
|
+
continue;
|
|
765
|
+
}
|
|
766
|
+
if (token.includes("=")) continue;
|
|
767
|
+
targets.push(token);
|
|
768
|
+
}
|
|
769
|
+
if (targets.some((target) => /^(?:test|tests|check|checks)$/.test(target))) return "test";
|
|
770
|
+
if (targets.some((target) => /^(?:build|all)$/.test(target))) return "build";
|
|
771
|
+
return void 0;
|
|
772
|
+
}
|
|
773
|
+
var MAKE_VALUE_OPTIONS = /* @__PURE__ */ new Set([
|
|
774
|
+
"-C",
|
|
775
|
+
"--directory",
|
|
776
|
+
"-f",
|
|
777
|
+
"--file",
|
|
778
|
+
"--makefile",
|
|
779
|
+
"-I",
|
|
780
|
+
"--include-dir",
|
|
781
|
+
"-o",
|
|
782
|
+
"--old-file",
|
|
783
|
+
"--assume-old",
|
|
784
|
+
"-W",
|
|
785
|
+
"--what-if",
|
|
786
|
+
"--new-file",
|
|
787
|
+
"--assume-new"
|
|
788
|
+
]);
|
|
789
|
+
var MAKE_OPTIONAL_NUMBER_OPTIONS = /* @__PURE__ */ new Set(["-j", "--jobs", "-l", "--load-average"]);
|
|
790
|
+
var CARGO_VALUE_FLAGS = /* @__PURE__ */ new Set([
|
|
791
|
+
"--test",
|
|
792
|
+
"--bin",
|
|
793
|
+
"--example",
|
|
794
|
+
"--bench",
|
|
795
|
+
"-p",
|
|
796
|
+
"--package",
|
|
797
|
+
"--exclude",
|
|
798
|
+
"-F",
|
|
799
|
+
"--features",
|
|
800
|
+
"--target",
|
|
801
|
+
"--target-dir",
|
|
802
|
+
"--manifest-path",
|
|
803
|
+
"--profile",
|
|
804
|
+
"-j",
|
|
805
|
+
"--jobs",
|
|
806
|
+
"--color",
|
|
807
|
+
"--message-format",
|
|
808
|
+
"--config",
|
|
809
|
+
"-Z"
|
|
810
|
+
]);
|
|
811
|
+
var CARGO_SELECTOR_FLAGS = /* @__PURE__ */ new Set(["--test", "--bin", "--example", "-p", "--package"]);
|
|
812
|
+
function cargoTestScope(args) {
|
|
813
|
+
let targeted = false;
|
|
814
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
815
|
+
const token = args[index] ?? "";
|
|
816
|
+
if (token === "--") break;
|
|
817
|
+
if (token === "--workspace" || token === "--all") return "full";
|
|
818
|
+
if (!token.startsWith("-")) {
|
|
819
|
+
targeted = true;
|
|
820
|
+
continue;
|
|
821
|
+
}
|
|
822
|
+
const flag = token.split("=")[0] ?? token;
|
|
823
|
+
if (CARGO_SELECTOR_FLAGS.has(flag) && (token.includes("=") || args[index + 1])) {
|
|
824
|
+
targeted = true;
|
|
825
|
+
} else if (/^-p[^-]/.test(token)) {
|
|
826
|
+
targeted = true;
|
|
827
|
+
}
|
|
828
|
+
if (CARGO_VALUE_FLAGS.has(token)) index += 1;
|
|
829
|
+
}
|
|
830
|
+
return targeted ? "targeted" : "full";
|
|
831
|
+
}
|
|
832
|
+
function splitQuotedWords(command) {
|
|
833
|
+
const words = [];
|
|
834
|
+
let current = "";
|
|
835
|
+
let started = false;
|
|
836
|
+
let quote;
|
|
837
|
+
for (let index = 0; index < command.length; index += 1) {
|
|
838
|
+
const ch = command[index] ?? "";
|
|
839
|
+
if (quote) {
|
|
840
|
+
if (ch === quote) quote = void 0;
|
|
841
|
+
else if (ch === "\\" && quote === '"' && index + 1 < command.length) {
|
|
842
|
+
index += 1;
|
|
843
|
+
current += command[index];
|
|
844
|
+
} else current += ch;
|
|
845
|
+
} else if (ch === '"' || ch === "'") {
|
|
846
|
+
quote = ch;
|
|
847
|
+
started = true;
|
|
848
|
+
} else if (ch === "\\" && index + 1 < command.length) {
|
|
849
|
+
index += 1;
|
|
850
|
+
current += command[index];
|
|
851
|
+
started = true;
|
|
852
|
+
} else if (/[|&;<>`]/.test(ch) || ch === "$" && command[index + 1] === "(") {
|
|
853
|
+
return void 0;
|
|
854
|
+
} else if (/\s/.test(ch)) {
|
|
855
|
+
if (started) words.push(current);
|
|
856
|
+
current = "";
|
|
857
|
+
started = false;
|
|
858
|
+
} else {
|
|
859
|
+
current += ch;
|
|
860
|
+
started = true;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
if (started) words.push(current);
|
|
864
|
+
return words;
|
|
865
|
+
}
|
|
866
|
+
var GRADLE_VALUE_FLAGS = /* @__PURE__ */ new Set([
|
|
867
|
+
"-p",
|
|
868
|
+
"--project-dir",
|
|
869
|
+
"-b",
|
|
870
|
+
"--build-file",
|
|
871
|
+
"-c",
|
|
872
|
+
"--settings-file",
|
|
873
|
+
"-g",
|
|
874
|
+
"--gradle-user-home",
|
|
875
|
+
"-I",
|
|
876
|
+
"--init-script",
|
|
877
|
+
"-x",
|
|
878
|
+
"--exclude-task",
|
|
879
|
+
"--include-build",
|
|
880
|
+
"--console",
|
|
881
|
+
"--warning-mode",
|
|
882
|
+
"--max-workers"
|
|
883
|
+
]);
|
|
884
|
+
var GRADLE_TESTISH_TASK = /^(?!compile)(?:check|build|verify|\w*[tT]est\w*|\w*Check)$/;
|
|
885
|
+
function gradleTestScope(args) {
|
|
886
|
+
const tasks = [];
|
|
887
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
888
|
+
const token = args[index] ?? "";
|
|
889
|
+
if (token === "--tests" || token.startsWith("--tests=")) {
|
|
890
|
+
const previous = tasks[tasks.length - 1];
|
|
891
|
+
if (previous) previous.filtered = true;
|
|
892
|
+
if (token === "--tests") index += 1;
|
|
893
|
+
} else if (token.startsWith("-")) {
|
|
894
|
+
if (GRADLE_VALUE_FLAGS.has(token)) index += 1;
|
|
895
|
+
} else {
|
|
896
|
+
tasks.push({ name: token, filtered: false });
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
const unfilteredTestTask = tasks.some(
|
|
900
|
+
(task) => !task.filtered && GRADLE_TESTISH_TASK.test(task.name.split(":").pop() ?? "")
|
|
901
|
+
);
|
|
902
|
+
return tasks.some((task) => task.filtered) && !unfilteredTestTask ? "targeted" : "full";
|
|
903
|
+
}
|
|
904
|
+
function testSelectorScope(normalized, parseMavenSelector) {
|
|
905
|
+
if (/^(?:\.\/)?mvnw?\b/.test(normalized)) {
|
|
906
|
+
const hasSelector = normalized.split(/\s+/).some((token) => parseMavenSelector?.(token));
|
|
907
|
+
return hasSelector ? "targeted" : "full";
|
|
908
|
+
}
|
|
909
|
+
const argv = splitQuotedWords(normalized);
|
|
910
|
+
if (!argv) return "full";
|
|
911
|
+
if (/^cargo (?:test|nextest run)\b/.test(normalized)) {
|
|
912
|
+
return cargoTestScope(argv.slice(argv[1] === "nextest" ? 3 : 2));
|
|
913
|
+
}
|
|
914
|
+
if (/^(?:\.\/)?gradlew?\b/.test(normalized)) return gradleTestScope(argv.slice(1));
|
|
915
|
+
if (/^ctest\b/.test(normalized)) {
|
|
916
|
+
return argv.some((token) => /^(?:-R.*|--tests-regex(?:=.*)?)$/.test(token)) ? "targeted" : "full";
|
|
917
|
+
}
|
|
918
|
+
return "full";
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
// src/core/project/zero-collected-detectors.ts
|
|
922
|
+
function detectsBatsZeroCollected(output) {
|
|
923
|
+
if (/^[ \t]*(?:not ok|ok)[ \t]+\d+\b/m.test(output)) return false;
|
|
924
|
+
if (/^[ \t]*1\.\.[1-9]\d*[ \t\r]*(?:#.*)?$/m.test(output)) return false;
|
|
925
|
+
return /^[ \t]*1\.\.0[ \t\r]*(?:#.*)?$/m.test(output);
|
|
926
|
+
}
|
|
927
|
+
function detectsDbtZeroCollected(output) {
|
|
928
|
+
if (/\b(?:PASS|TOTAL)=[1-9]\d*/.test(output)) return false;
|
|
929
|
+
return /\bNothing to do\.[ \t]+Try checking your model configs\b/.test(output);
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
// src/core/project/verification-toolchains.ts
|
|
933
|
+
var PYTHON_INTERPRETER_HEAD = /^(?:[\w./-]*[/\\])?(?:python3?|py)(?:\.exe)?(?=\s|$)/;
|
|
934
|
+
function normalizeCommand(command) {
|
|
935
|
+
return command.trim().replace(/\s+/g, " ");
|
|
936
|
+
}
|
|
937
|
+
function unwrapEnvPythonPathPrefix(normalized) {
|
|
938
|
+
if (!normalized.startsWith("env ")) return normalized;
|
|
939
|
+
const parts = parseVerificationCommandArgv(normalized);
|
|
940
|
+
if (!Array.isArray(parts) || parts[0] !== "env") return normalized;
|
|
941
|
+
let index = 1;
|
|
942
|
+
for (; index < parts.length; index += 1) {
|
|
943
|
+
const token = parts[index] ?? "";
|
|
944
|
+
if (!token.includes("=")) break;
|
|
945
|
+
if (!token.startsWith("PYTHONPATH=")) return normalized;
|
|
946
|
+
}
|
|
947
|
+
return index > 1 && index < parts.length ? parts.slice(index).join(" ") : normalized;
|
|
948
|
+
}
|
|
949
|
+
function unwrapTrustedEnvPythonPathPrefix(command) {
|
|
950
|
+
return unwrapEnvPythonPathPrefix(normalizeCommand(command));
|
|
951
|
+
}
|
|
952
|
+
var JVM_VALUE_OPTIONS = /* @__PURE__ */ new Set([
|
|
953
|
+
"-b",
|
|
954
|
+
"--build-file",
|
|
955
|
+
"-c",
|
|
956
|
+
"--settings-file",
|
|
957
|
+
"-f",
|
|
958
|
+
"--file",
|
|
959
|
+
"-gs",
|
|
960
|
+
"--global-settings",
|
|
961
|
+
"-I",
|
|
962
|
+
"--init-script",
|
|
963
|
+
"-p",
|
|
964
|
+
"--project-dir",
|
|
965
|
+
"-pl",
|
|
966
|
+
"--projects",
|
|
967
|
+
"-P",
|
|
968
|
+
"--activate-profiles",
|
|
969
|
+
"-s",
|
|
970
|
+
"--settings"
|
|
971
|
+
]);
|
|
972
|
+
var MAVEN_TEST_SELECTOR_MAX_LENGTH = 512;
|
|
973
|
+
var MAVEN_TEST_SELECTOR_MAX_COUNT = 32;
|
|
974
|
+
var MAVEN_TEST_CLASS_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/;
|
|
975
|
+
function parseMavenTestSelectorToken(token) {
|
|
976
|
+
if (!token.startsWith("-Dtest=")) return void 0;
|
|
977
|
+
if (token.length > MAVEN_TEST_SELECTOR_MAX_LENGTH) return void 0;
|
|
978
|
+
const selectors = token.slice("-Dtest=".length).split(",");
|
|
979
|
+
if (selectors.length === 0 || selectors.length > MAVEN_TEST_SELECTOR_MAX_COUNT || selectors.some((selector) => !MAVEN_TEST_CLASS_PATTERN.test(selector))) {
|
|
980
|
+
return void 0;
|
|
981
|
+
}
|
|
982
|
+
return selectors;
|
|
983
|
+
}
|
|
984
|
+
function optionTakesSeparateValue(token) {
|
|
985
|
+
if (JVM_VALUE_OPTIONS.has(token)) return true;
|
|
986
|
+
if (token.startsWith("--") && token.includes("=")) return false;
|
|
987
|
+
return false;
|
|
988
|
+
}
|
|
989
|
+
function isAttachedJvmOptionValue(token) {
|
|
990
|
+
return /^-(?:b|c|f|gs|I|p|pl|P|s).+/.test(token) || /^--(?:build-file|settings-file|file|global-settings|init-script|project-dir|projects|activate-profiles|settings)=/.test(
|
|
991
|
+
token
|
|
992
|
+
);
|
|
993
|
+
}
|
|
994
|
+
function extractJvmVerificationGoals(command) {
|
|
995
|
+
const normalized = normalizeCommand(command);
|
|
996
|
+
if (!/^(?:\.\/)?(?:gradlew|gradle|mvnw|mvn)\b/.test(normalized)) return [];
|
|
997
|
+
const tokens = normalized.split(/\s+/).slice(1);
|
|
998
|
+
const goals = [];
|
|
999
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
1000
|
+
const token = tokens[index];
|
|
1001
|
+
if (!token) continue;
|
|
1002
|
+
if (token === "--") {
|
|
1003
|
+
goals.push(...tokens.slice(index + 1).filter(Boolean));
|
|
1004
|
+
break;
|
|
1005
|
+
}
|
|
1006
|
+
if (optionTakesSeparateValue(token)) {
|
|
1007
|
+
index += 1;
|
|
1008
|
+
continue;
|
|
1009
|
+
}
|
|
1010
|
+
if (isAttachedJvmOptionValue(token)) continue;
|
|
1011
|
+
if (token.startsWith("-")) continue;
|
|
1012
|
+
goals.push(token);
|
|
1013
|
+
}
|
|
1014
|
+
return goals;
|
|
1015
|
+
}
|
|
1016
|
+
function describeVerificationCommand(command, hint) {
|
|
1017
|
+
const descriptor = describeVerificationCommandText(command);
|
|
1018
|
+
const bucketKind = hint?.bucket;
|
|
1019
|
+
return bucketKind && bucketKind !== "unknown" && bucketKind !== descriptor.kind ? { ...descriptor, kind: bucketKind } : descriptor;
|
|
1020
|
+
}
|
|
1021
|
+
function describeVerificationCommandText(command) {
|
|
1022
|
+
const normalized = normalizeCommand(command);
|
|
1023
|
+
const pythonNormalized = unwrapUvRunCommand(unwrapTrustedEnvPythonPathPrefix(normalized));
|
|
1024
|
+
if (new RegExp(`^${LOCAL_JS_TOOL_PREFIX}(?:vitest|jest)\\b`).test(normalized)) {
|
|
1025
|
+
return {
|
|
1026
|
+
command,
|
|
1027
|
+
language: "node",
|
|
1028
|
+
kind: "test",
|
|
1029
|
+
scope: /\s(?:run\s+)?(?:tests?|src|__tests__|[^ ]+\.(?:test|spec)\.)/.test(normalized) ? "targeted" : "full",
|
|
1030
|
+
costClass: /\b(?:--runInBand|--bail|--changed|--findRelatedTests)\b/.test(normalized) ? "medium" : "broad"
|
|
1031
|
+
};
|
|
1032
|
+
}
|
|
1033
|
+
if (/^node\s+scripts\/[^ ]*(?:test|spec|verify|check)[^ ]*\.m?[cj]s\b/.test(normalized)) {
|
|
1034
|
+
return {
|
|
1035
|
+
command,
|
|
1036
|
+
language: "node",
|
|
1037
|
+
kind: "test",
|
|
1038
|
+
scope: "unknown",
|
|
1039
|
+
costClass: "unknown"
|
|
1040
|
+
};
|
|
1041
|
+
}
|
|
1042
|
+
if (/^node\s+scripts\/dynamic-node-options\.mjs\s+(?:\.\/node_modules\/\.bin\/)?(?:vitest|jest)\b/.test(
|
|
1043
|
+
normalized
|
|
1044
|
+
)) {
|
|
1045
|
+
return {
|
|
1046
|
+
command,
|
|
1047
|
+
language: "node",
|
|
1048
|
+
kind: "test",
|
|
1049
|
+
scope: /\s(?:run\s+)?(?:tests?|src|__tests__|[^ ]+\.(?:test|spec)\.)/.test(normalized) ? "targeted" : "full",
|
|
1050
|
+
costClass: "broad"
|
|
1051
|
+
};
|
|
1052
|
+
}
|
|
1053
|
+
if (/^node\s+(?:--[^\s]+\s+)*--test(?=\s|$)/.test(normalized)) {
|
|
1054
|
+
return {
|
|
1055
|
+
command,
|
|
1056
|
+
language: "node",
|
|
1057
|
+
kind: "test",
|
|
1058
|
+
scope: /--test\s+\S/.test(normalized) ? "targeted" : "full",
|
|
1059
|
+
costClass: "broad"
|
|
1060
|
+
};
|
|
1061
|
+
}
|
|
1062
|
+
if (new RegExp(`^${LOCAL_JS_TOOL_PREFIX}(?:mocha|ava)\\b`).test(normalized)) {
|
|
1063
|
+
return {
|
|
1064
|
+
command,
|
|
1065
|
+
language: "node",
|
|
1066
|
+
kind: "test",
|
|
1067
|
+
scope: /\s(?:tests?|src|__tests__|[^ ]+\.(?:test|spec)\.)/.test(normalized) ? "targeted" : "full",
|
|
1068
|
+
costClass: "broad"
|
|
1069
|
+
};
|
|
1070
|
+
}
|
|
1071
|
+
if (new RegExp(`^${LOCAL_JS_TOOL_PREFIX}playwright\\s+test\\b`).test(normalized) || new RegExp(`^${LOCAL_JS_TOOL_PREFIX}cypress\\s+run\\b`).test(normalized)) {
|
|
1072
|
+
return {
|
|
1073
|
+
command,
|
|
1074
|
+
language: "node",
|
|
1075
|
+
kind: "test",
|
|
1076
|
+
scope: "full",
|
|
1077
|
+
costClass: "broad"
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
const nodeStyleKind = classifyNodeStyleTool(normalized);
|
|
1081
|
+
if (nodeStyleKind) {
|
|
1082
|
+
return { command, language: "node", kind: nodeStyleKind, scope: "full", costClass: "fast" };
|
|
1083
|
+
}
|
|
1084
|
+
const scriptRunner = classifyScriptRunnerCommand(normalized);
|
|
1085
|
+
if (scriptRunner) {
|
|
1086
|
+
return { command, ...scriptRunner };
|
|
1087
|
+
}
|
|
1088
|
+
{
|
|
1089
|
+
const npxRunnerMatch = new RegExp(`^${LOCAL_JS_TOOL_PREFIX}([^\\s]+)`).exec(normalized);
|
|
1090
|
+
const firstToken = npxRunnerMatch?.[1] ?? "";
|
|
1091
|
+
const viaLocalRunner = Boolean(
|
|
1092
|
+
// npx/pnpx/bunx --no-install|--offline tsc ... (the prefix matched and the
|
|
1093
|
+
// runner target basename is tsc).
|
|
1094
|
+
/^(?:npx|pnpx|bunx)\s/.test(normalized) && firstToken.replace(/^.*[/\\]/, "").replace(/\.(?:cmd|exe|ps1)$/i, "") === "tsc"
|
|
1095
|
+
);
|
|
1096
|
+
const firstTokenBasename = firstToken.replace(/^.*[/\\]/, "").replace(/\.(?:cmd|exe|ps1)$/i, "");
|
|
1097
|
+
const isLocalBinPath = /[/\\]node_modules[/\\]\.bin[/\\]tsc(?:\.(?:cmd|exe|ps1))?(?:\s|$)/i.test(firstToken);
|
|
1098
|
+
const isBasenameTsc = firstTokenBasename === "tsc";
|
|
1099
|
+
const hasTsCompilerFlag = /(?:^|\s)(?:--noEmit|-p|--project|-b|--build)(?:\s|=|$)/.test(
|
|
1100
|
+
normalized
|
|
1101
|
+
);
|
|
1102
|
+
const hasTsconfigArg = /(?:^|\s|=)[^\s]*tsconfig[^\s]*\.json(?:\s|$)/i.test(normalized);
|
|
1103
|
+
if (isBasenameTsc && (viaLocalRunner || isLocalBinPath || hasTsCompilerFlag || hasTsconfigArg)) {
|
|
1104
|
+
return {
|
|
1105
|
+
command,
|
|
1106
|
+
language: "node",
|
|
1107
|
+
kind: "typecheck",
|
|
1108
|
+
scope: "full",
|
|
1109
|
+
// Fast, matching the `typecheck` package-script policy autoloop enforces.
|
|
1110
|
+
costClass: "fast"
|
|
1111
|
+
};
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
const pythonModuleTest = /^pytest\b/.test(pythonNormalized) || PYTHON_INTERPRETER_HEAD.test(pythonNormalized) && /\s(?:-m\s+(?:pytest|unittest)|manage\.py\s+test)\b/.test(pythonNormalized);
|
|
1115
|
+
if (pythonModuleTest) {
|
|
1116
|
+
return {
|
|
1117
|
+
command,
|
|
1118
|
+
language: "python",
|
|
1119
|
+
kind: "test",
|
|
1120
|
+
// `manage.py test` is the runner's entry point, not a path the run is narrowed to.
|
|
1121
|
+
scope: /\s(?:tests?|[^ ]+\.py)\b/.test(pythonNormalized.replace(/\smanage\.py\s+test\b/, "")) ? "targeted" : "full",
|
|
1122
|
+
costClass: "broad"
|
|
1123
|
+
};
|
|
1124
|
+
}
|
|
1125
|
+
if (/^(?:ruff|black|mypy|pyright|flake8)\b/.test(pythonNormalized)) {
|
|
1126
|
+
return {
|
|
1127
|
+
command,
|
|
1128
|
+
language: "python",
|
|
1129
|
+
kind: pythonNormalized.startsWith("black ") ? "format" : /^(?:mypy|pyright)\b/.test(pythonNormalized) ? "typecheck" : "lint",
|
|
1130
|
+
scope: "full",
|
|
1131
|
+
costClass: "fast"
|
|
1132
|
+
};
|
|
1133
|
+
}
|
|
1134
|
+
const ninjaKind = classifyNinjaCommand(normalized);
|
|
1135
|
+
if (/^(?:cmake|ctest|meson)\b/.test(normalized) || ninjaKind) {
|
|
1136
|
+
const kind = ninjaKind ? ninjaKind : /^(?:ctest|meson\s+test)\b/.test(normalized) ? "test" : /^(?:cmake\s+--build|meson\s+compile)\b/.test(normalized) ? "build" : "unknown";
|
|
1137
|
+
return {
|
|
1138
|
+
command,
|
|
1139
|
+
language: "native",
|
|
1140
|
+
kind,
|
|
1141
|
+
scope: kind === "test" ? testSelectorScope(normalized) : "full",
|
|
1142
|
+
costClass: kind === "test" || kind === "build" ? "broad" : "unknown"
|
|
1143
|
+
};
|
|
1144
|
+
}
|
|
1145
|
+
if (/^gofmt\b/.test(normalized)) {
|
|
1146
|
+
return { command, language: "go", kind: "format", scope: "full", costClass: "fast" };
|
|
1147
|
+
}
|
|
1148
|
+
if (/^golangci-lint\b/.test(normalized)) {
|
|
1149
|
+
return {
|
|
1150
|
+
command,
|
|
1151
|
+
language: "go",
|
|
1152
|
+
kind: "lint",
|
|
1153
|
+
scope: "full",
|
|
1154
|
+
costClass: "fast"
|
|
1155
|
+
};
|
|
1156
|
+
}
|
|
1157
|
+
if (/^go\s+(?:test|vet|build)\b/.test(normalized)) {
|
|
1158
|
+
const kind = normalized.startsWith("go vet") ? "lint" : normalized.startsWith("go build") ? "build" : "test";
|
|
1159
|
+
return {
|
|
1160
|
+
command,
|
|
1161
|
+
language: "go",
|
|
1162
|
+
kind,
|
|
1163
|
+
scope: normalized.includes("./...") ? "full" : "targeted",
|
|
1164
|
+
costClass: kind === "lint" ? "fast" : "broad"
|
|
1165
|
+
};
|
|
1166
|
+
}
|
|
1167
|
+
if (/^cargo\s+(?:fmt|clippy|check|test|build|audit|nextest\s+run)\b/.test(normalized)) {
|
|
1168
|
+
const kind = normalized.startsWith("cargo fmt") ? "format" : normalized.startsWith("cargo clippy") ? "lint" : normalized.startsWith("cargo check") ? "typecheck" : normalized.startsWith("cargo build") ? "build" : normalized.startsWith("cargo audit") ? "unknown" : "test";
|
|
1169
|
+
return {
|
|
1170
|
+
command,
|
|
1171
|
+
language: "rust",
|
|
1172
|
+
kind,
|
|
1173
|
+
scope: kind === "test" ? testSelectorScope(normalized) : "full",
|
|
1174
|
+
costClass: kind === "test" || kind === "build" ? "broad" : "fast"
|
|
1175
|
+
};
|
|
1176
|
+
}
|
|
1177
|
+
if (/^(?:\.\/)?(?:gradlew|gradle|mvnw|mvn)\b/.test(normalized)) {
|
|
1178
|
+
const goals = extractJvmVerificationGoals(normalized);
|
|
1179
|
+
const hasTestSelector = testSelectorScope(normalized, parseMavenTestSelectorToken) === "targeted";
|
|
1180
|
+
const hasTestGoal = goals.some((goal) => /(?:^|:)(?:test|tests)$/.test(goal));
|
|
1181
|
+
const hasLintGoal = goals.some((goal) => /(?:^|:)(?:check|lint)$/.test(goal));
|
|
1182
|
+
const styleOnly = goals.length > 0 && goals.every((goal) => /(?:^|:)(?:checkstyle|spotless)[\w:-]*$/i.test(goal));
|
|
1183
|
+
const hasCompileGoal = goals.some(
|
|
1184
|
+
(goal) => /(?:^|:)(?:compile|test-compile|classes|testClasses|compile[A-Z][\w-]*)$/.test(goal)
|
|
1185
|
+
);
|
|
1186
|
+
return {
|
|
1187
|
+
command,
|
|
1188
|
+
language: "jvm",
|
|
1189
|
+
kind: styleOnly ? "lint" : hasTestGoal ? "test" : hasLintGoal ? "lint" : hasCompileGoal ? "typecheck" : "build",
|
|
1190
|
+
scope: hasTestSelector || normalized.includes(" ./") || goals.some((goal) => /:[^ ]*test$/.test(goal)) ? "targeted" : "full",
|
|
1191
|
+
costClass: styleOnly ? "fast" : hasCompileGoal ? "medium" : "broad"
|
|
1192
|
+
};
|
|
1193
|
+
}
|
|
1194
|
+
if (/^dotnet\s+(?:format|build|test)\b/.test(normalized)) {
|
|
1195
|
+
return {
|
|
1196
|
+
command,
|
|
1197
|
+
language: "dotnet",
|
|
1198
|
+
kind: normalized.startsWith("dotnet format") ? "format" : normalized.startsWith("dotnet build") ? "build" : "test",
|
|
1199
|
+
scope: "full",
|
|
1200
|
+
costClass: normalized.startsWith("dotnet format") ? "fast" : "broad"
|
|
1201
|
+
};
|
|
1202
|
+
}
|
|
1203
|
+
if (/^swift\s+(?:build|test)\b/.test(normalized)) {
|
|
1204
|
+
return {
|
|
1205
|
+
command,
|
|
1206
|
+
language: "swift",
|
|
1207
|
+
kind: normalized.startsWith("swift build") ? "build" : "test",
|
|
1208
|
+
scope: "full",
|
|
1209
|
+
costClass: "broad"
|
|
1210
|
+
};
|
|
1211
|
+
}
|
|
1212
|
+
if (/^(?:flutter|dart)\s+(?:analyze|test)\b/.test(normalized)) {
|
|
1213
|
+
return {
|
|
1214
|
+
command,
|
|
1215
|
+
language: "dart",
|
|
1216
|
+
kind: /\banalyze\b/.test(normalized) ? "lint" : "test",
|
|
1217
|
+
scope: "full",
|
|
1218
|
+
costClass: /\banalyze\b/.test(normalized) ? "medium" : "broad"
|
|
1219
|
+
};
|
|
1220
|
+
}
|
|
1221
|
+
if (/^(?:bundle\s+exec\s+)?(?:rake|rspec|rubocop)\b/.test(normalized)) {
|
|
1222
|
+
return {
|
|
1223
|
+
command,
|
|
1224
|
+
language: "ruby",
|
|
1225
|
+
kind: /\brubocop\b/.test(normalized) ? "lint" : "test",
|
|
1226
|
+
scope: "full",
|
|
1227
|
+
costClass: /\brubocop\b/.test(normalized) ? "fast" : "broad"
|
|
1228
|
+
};
|
|
1229
|
+
}
|
|
1230
|
+
if (/^(?:phpunit|phpstan|psalm)\b/.test(normalized)) {
|
|
1231
|
+
return {
|
|
1232
|
+
command,
|
|
1233
|
+
language: "php",
|
|
1234
|
+
kind: /^(?:phpstan|psalm)\b/.test(normalized) ? "typecheck" : "test",
|
|
1235
|
+
scope: "full",
|
|
1236
|
+
costClass: "broad"
|
|
1237
|
+
};
|
|
1238
|
+
}
|
|
1239
|
+
if (/^shellcheck\b/.test(normalized)) {
|
|
1240
|
+
return {
|
|
1241
|
+
command,
|
|
1242
|
+
language: "shell",
|
|
1243
|
+
kind: "lint",
|
|
1244
|
+
scope: "full",
|
|
1245
|
+
costClass: "fast"
|
|
1246
|
+
};
|
|
1247
|
+
}
|
|
1248
|
+
if (/^R\s+CMD\s+check\b/.test(command.trim())) {
|
|
1249
|
+
return {
|
|
1250
|
+
command,
|
|
1251
|
+
language: "r",
|
|
1252
|
+
kind: "test",
|
|
1253
|
+
scope: "full",
|
|
1254
|
+
costClass: "broad"
|
|
1255
|
+
};
|
|
1256
|
+
}
|
|
1257
|
+
if (/^(?:dbt|sqlfluff)\b/.test(normalized)) {
|
|
1258
|
+
return {
|
|
1259
|
+
command,
|
|
1260
|
+
language: "sql",
|
|
1261
|
+
kind: normalized.startsWith("sqlfluff") ? "lint" : normalized.includes(" compile") ? "build" : "test",
|
|
1262
|
+
scope: "full",
|
|
1263
|
+
costClass: "broad"
|
|
1264
|
+
};
|
|
1265
|
+
}
|
|
1266
|
+
const makeKind = classifyMakeCommand(normalized);
|
|
1267
|
+
if (makeKind) {
|
|
1268
|
+
return { command, language: "unknown", kind: makeKind, scope: "full", costClass: "broad" };
|
|
1269
|
+
}
|
|
1270
|
+
if (/^(?:tox|nox)\b/.test(normalized)) {
|
|
1271
|
+
return { command, language: "unknown", kind: "test", scope: "full", costClass: "broad" };
|
|
1272
|
+
}
|
|
1273
|
+
return {
|
|
1274
|
+
command,
|
|
1275
|
+
language: "unknown",
|
|
1276
|
+
kind: "unknown",
|
|
1277
|
+
scope: "unknown",
|
|
1278
|
+
costClass: "unknown"
|
|
1279
|
+
};
|
|
1280
|
+
}
|
|
1281
|
+
function resolveVerificationExitCode(command, result, options) {
|
|
1282
|
+
const failureExitCode = options?.failureExitCode ?? 1;
|
|
1283
|
+
const unavailableExitCode = options?.unavailableExitCode ?? 127;
|
|
1284
|
+
if (result.timedOut === true) return { exitCode: 124, toolUnavailable: false };
|
|
1285
|
+
if (typeof result.exitCode === "number") {
|
|
1286
|
+
return { exitCode: result.exitCode, toolUnavailable: false };
|
|
1287
|
+
}
|
|
1288
|
+
if (result.toolUnavailable === true) {
|
|
1289
|
+
return { exitCode: unavailableExitCode, toolUnavailable: true };
|
|
1290
|
+
}
|
|
1291
|
+
const all = [
|
|
1292
|
+
result.all ?? `${String(result.stdout ?? "")}
|
|
1293
|
+
${String(result.stderr ?? "")}`,
|
|
1294
|
+
result.shortMessage,
|
|
1295
|
+
result.message
|
|
1296
|
+
].filter((value) => value !== void 0 && value !== null).map(String).join("\n");
|
|
1297
|
+
const toolUnavailable = detectVerificationToolUnavailable(command, all) !== void 0;
|
|
1298
|
+
return {
|
|
1299
|
+
exitCode: toolUnavailable ? unavailableExitCode : failureExitCode,
|
|
1300
|
+
toolUnavailable
|
|
1301
|
+
};
|
|
1302
|
+
}
|
|
1303
|
+
function detectExitZeroVerifyFailure(command, output) {
|
|
1304
|
+
const normalizedOutput = String(output ?? "");
|
|
1305
|
+
const descriptor = describeVerificationCommand(command);
|
|
1306
|
+
for (const detector of orderedExitZeroFailureDetectors(descriptor)) {
|
|
1307
|
+
const signal = detector(normalizedOutput, descriptor);
|
|
1308
|
+
if (signal) return signal;
|
|
1309
|
+
}
|
|
1310
|
+
return void 0;
|
|
1311
|
+
}
|
|
1312
|
+
function isPythonStdlibUnittestCommand(command) {
|
|
1313
|
+
const descriptor = describeVerificationCommand(command);
|
|
1314
|
+
if (descriptor.language !== "python" || descriptor.kind !== "test") return false;
|
|
1315
|
+
const normalized = unwrapTrustedEnvPythonPathPrefix(command);
|
|
1316
|
+
if (/\bpytest\b/.test(normalized)) return false;
|
|
1317
|
+
return PYTHON_INTERPRETER_HEAD.test(normalized) && /\s-m\s+unittest\b/.test(normalized);
|
|
1318
|
+
}
|
|
1319
|
+
function detectZeroCollectedTests(command, output, hint) {
|
|
1320
|
+
const csi = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*[A-Za-z]`, "g");
|
|
1321
|
+
const normalizedOutput = String(output ?? "").replace(csi, "");
|
|
1322
|
+
const descriptor = describeVerificationCommand(command, hint);
|
|
1323
|
+
if (descriptor.kind !== "test" && descriptor.kind !== "unknown") return false;
|
|
1324
|
+
if (/^\s*Ran\s+0\s+tests?\b/im.test(normalizedOutput) || /^\s*NO TESTS RAN\b/im.test(normalizedOutput) || /^\s*=+\s+no tests ran\b.*$/im.test(normalizedOutput) || /^\s*collected\s+0\s+items?\b/im.test(normalizedOutput)) {
|
|
1325
|
+
return true;
|
|
1326
|
+
}
|
|
1327
|
+
if (descriptor.language === "go") {
|
|
1328
|
+
return !/\s-run(?:\s+|=)(?:"\^\$"|'?\^\$'?)/.test(normalizeCommand(command)) && detectsGoZeroCollectedTests(normalizedOutput);
|
|
1329
|
+
}
|
|
1330
|
+
if (descriptor.language === "unknown") {
|
|
1331
|
+
return Object.values(ZERO_COLLECTED_DETECTORS).some((detector) => detector(normalizedOutput));
|
|
1332
|
+
}
|
|
1333
|
+
return ZERO_COLLECTED_DETECTORS[descriptor.language]?.(normalizedOutput) ?? false;
|
|
1334
|
+
}
|
|
1335
|
+
function hasPositiveNodeRunnerSummary(output) {
|
|
1336
|
+
return /^[ \t]*(?:Tests:|Test Suites:|Tests|Test Files)[ \t]+[1-9]\d*[ \t]+(?:passed|failed|skipped|todo|pending)\b/m.test(
|
|
1337
|
+
output
|
|
1338
|
+
);
|
|
1339
|
+
}
|
|
1340
|
+
function detectsNodeZeroCollectedTests(output) {
|
|
1341
|
+
const normalized = output;
|
|
1342
|
+
if (/^\s*No test files found(?:, exiting with code 0)?\s*$/im.test(normalized) && !/[1-9]\d*\s+passed\b/i.test(normalized) && !/Tests?\s*[:]?\s*[1-9]/i.test(normalized) && !/^\s*(?:\u2139\s+)?tests\s+[1-9]\d*\s*$/im.test(normalized)) {
|
|
1343
|
+
return true;
|
|
1344
|
+
}
|
|
1345
|
+
if (/^\s*No tests found, exiting with code 0\s*$/im.test(normalized) && !hasPositiveNodeRunnerSummary(normalized)) {
|
|
1346
|
+
return true;
|
|
1347
|
+
}
|
|
1348
|
+
if (/^\s*0\s+passing\b/im.test(normalized) && !/^\s*[1-9]\d*\s+(?:passing|failing)\b/im.test(normalized) && !/[1-9]\d*\s+passed\b/i.test(normalized) && !/Tests?\s*[:]?\s*[1-9]/i.test(normalized)) {
|
|
1349
|
+
return true;
|
|
1350
|
+
}
|
|
1351
|
+
if (/^\s*#\s+tests\s+0\s*$/im.test(normalized)) {
|
|
1352
|
+
return true;
|
|
1353
|
+
}
|
|
1354
|
+
return /^\s*(?:\u2139\s+)?tests\s+0\s*$/im.test(normalized) && !/^\s*(?:\u2139\s+)?tests\s+[1-9]\d*\s*$/im.test(normalized);
|
|
1355
|
+
}
|
|
1356
|
+
function detectsGoZeroCollectedTests(output) {
|
|
1357
|
+
const lines = output.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
1358
|
+
const packageResultLines = lines.filter((line) => /^(?:ok|\?)\s+\S+/.test(line));
|
|
1359
|
+
const coverageOnlyLines = lines.filter(
|
|
1360
|
+
(line) => /^\S+\s+coverage:\s+0\.0%\s+of\s+statements\s*$/i.test(line)
|
|
1361
|
+
);
|
|
1362
|
+
if (packageResultLines.length === 0 && coverageOnlyLines.length > 0) return true;
|
|
1363
|
+
if (packageResultLines.length === 0) return false;
|
|
1364
|
+
return packageResultLines.every(
|
|
1365
|
+
(line) => /\[(?:no test files|no tests to run)\]\s*$/i.test(line)
|
|
1366
|
+
);
|
|
1367
|
+
}
|
|
1368
|
+
function detectsRustZeroCollectedTests(output) {
|
|
1369
|
+
const runningCounts = Array.from(output.matchAll(/^\s*running\s+(\d+)\s+tests?\b/gim)).map(
|
|
1370
|
+
(match) => Number(match[1] ?? 0)
|
|
1371
|
+
);
|
|
1372
|
+
if (runningCounts.length === 0 || runningCounts.some((count) => count > 0)) return false;
|
|
1373
|
+
return !/^\s*test result:\s+ok\.\s+.*?\b[1-9]\d*\s+passed\b/im.test(output);
|
|
1374
|
+
}
|
|
1375
|
+
function detectsJvmZeroCollectedTests(output) {
|
|
1376
|
+
const mavenRunCounts = Array.from(
|
|
1377
|
+
output.matchAll(/^\s*(?:\[INFO\]\s*)?Tests run:\s*(\d+)\b/gim),
|
|
1378
|
+
(match) => Number(match[1] ?? 0)
|
|
1379
|
+
);
|
|
1380
|
+
if (mavenRunCounts.length > 0) {
|
|
1381
|
+
return mavenRunCounts.every((count) => count === 0);
|
|
1382
|
+
}
|
|
1383
|
+
if (/^\s*(?:\[INFO\]\s*)?No tests to run\.?\s*$/im.test(output)) {
|
|
1384
|
+
return true;
|
|
1385
|
+
}
|
|
1386
|
+
const gradleTestTaskLines = output.split(/\r?\n/).map((line) => line.trim()).filter(
|
|
1387
|
+
(line) => /^(?:>\s*)?Task\s+:[^\s]*test\b/i.test(line) || /^(?:>\s*)?:[^\s]*test\b/i.test(line)
|
|
1388
|
+
);
|
|
1389
|
+
return gradleTestTaskLines.length > 0 && gradleTestTaskLines.every((line) => /\bNO-SOURCE\b/i.test(line));
|
|
1390
|
+
}
|
|
1391
|
+
function detectsDotnetZeroCollectedTests(output) {
|
|
1392
|
+
if (/^\s*(?:Passed|Failed)!\s*-\s*Failed:\s*\d+,\s*Passed:\s*\d+,\s*Skipped:\s*\d+,\s*Total:\s*[1-9]/im.test(
|
|
1393
|
+
output
|
|
1394
|
+
)) {
|
|
1395
|
+
return false;
|
|
1396
|
+
}
|
|
1397
|
+
return /^\s*No test is available in\b/im.test(output) || /^\s*No test matches the given testcase filter\b/im.test(output) || /^\s*Passed!\s*-\s*Failed:\s*0,\s*Passed:\s*0,\s*Skipped:\s*\d+,\s*Total:\s*0\b/im.test(output);
|
|
1398
|
+
}
|
|
1399
|
+
function detectsRubyZeroCollectedTests(output) {
|
|
1400
|
+
if (/^\s*[1-9]\d*\s+examples?,/im.test(output) || /^\s*[1-9]\d*\s+runs?,/im.test(output)) {
|
|
1401
|
+
return false;
|
|
1402
|
+
}
|
|
1403
|
+
return /^\s*0\s+examples,\s+0\s+failures\b/im.test(output) || /^\s*0\s+runs,\s+0\s+assertions\b/im.test(output);
|
|
1404
|
+
}
|
|
1405
|
+
function detectsDartZeroCollectedTests(output) {
|
|
1406
|
+
return /^\s*(?:\d{2}:\d{2}\s+\+\d+(?:\s+-\d+)?(?:\s+~\d+)?:\s*)?No tests ran\.\s*$/im.test(
|
|
1407
|
+
output
|
|
1408
|
+
);
|
|
1409
|
+
}
|
|
1410
|
+
function detectsSwiftZeroCollectedTests(output) {
|
|
1411
|
+
if (/^\s*Executed\s+[1-9]\d*\s+tests?\b/im.test(output) || /^[^A-Za-z0-9\r\n]*Test run with\s+[1-9]\d*\s+tests?\b/im.test(output)) {
|
|
1412
|
+
return false;
|
|
1413
|
+
}
|
|
1414
|
+
return /^\s*Executed\s+0\s+tests\b/im.test(output) || /^[^A-Za-z0-9\r\n]*Test run with\s+0\s+tests\b/im.test(output);
|
|
1415
|
+
}
|
|
1416
|
+
function detectsPhpZeroCollectedTests(output) {
|
|
1417
|
+
return /^\s*No tests executed!\s*$/im.test(output);
|
|
1418
|
+
}
|
|
1419
|
+
function detectsNativeZeroCollectedTests(output) {
|
|
1420
|
+
return /^\s*No tests were found!!!\s*$/im.test(output) || /^\s*No tests defined\.\s*$/im.test(output);
|
|
1421
|
+
}
|
|
1422
|
+
function detectsRZeroCollectedTests(output) {
|
|
1423
|
+
if (/^\s*\[\s*FAIL\s+\d+\s*\|\s*WARN\s+\d+\s*\|\s*SKIP\s+\d+\s*\|\s*PASS\s+[1-9]\d*\s*\]/im.test(
|
|
1424
|
+
output
|
|
1425
|
+
)) {
|
|
1426
|
+
return false;
|
|
1427
|
+
}
|
|
1428
|
+
return /^\s*\[\s*FAIL\s+0\s*\|\s*WARN\s+\d+\s*\|\s*SKIP\s+0\s*\|\s*PASS\s+0\s*\]\s*$/im.test(
|
|
1429
|
+
output
|
|
1430
|
+
);
|
|
1431
|
+
}
|
|
1432
|
+
var ZERO_COLLECTED_DETECTORS = {
|
|
1433
|
+
go: detectsGoZeroCollectedTests,
|
|
1434
|
+
rust: detectsRustZeroCollectedTests,
|
|
1435
|
+
jvm: detectsJvmZeroCollectedTests,
|
|
1436
|
+
node: detectsNodeZeroCollectedTests,
|
|
1437
|
+
dotnet: detectsDotnetZeroCollectedTests,
|
|
1438
|
+
ruby: detectsRubyZeroCollectedTests,
|
|
1439
|
+
dart: detectsDartZeroCollectedTests,
|
|
1440
|
+
swift: detectsSwiftZeroCollectedTests,
|
|
1441
|
+
php: detectsPhpZeroCollectedTests,
|
|
1442
|
+
native: detectsNativeZeroCollectedTests,
|
|
1443
|
+
r: detectsRZeroCollectedTests,
|
|
1444
|
+
shell: detectsBatsZeroCollected,
|
|
1445
|
+
sql: detectsDbtZeroCollected
|
|
1446
|
+
};
|
|
1447
|
+
function selectFallbacksForCommand(primaryCommand, fallbackCommands) {
|
|
1448
|
+
const primary = describeVerificationCommand(primaryCommand);
|
|
1449
|
+
if (primary.kind !== "test" && primary.kind !== "unknown") return [];
|
|
1450
|
+
return fallbackCommands.filter(
|
|
1451
|
+
(fallback) => describeVerificationCommand(fallback).language === primary.language
|
|
1452
|
+
);
|
|
1453
|
+
}
|
|
1454
|
+
var VERIFICATION_LANGUAGE_PROJECT_LANGUAGES = {
|
|
1455
|
+
node: ["node", "typescript", "javascript"],
|
|
1456
|
+
python: ["python"],
|
|
1457
|
+
native: ["c", "cpp"],
|
|
1458
|
+
go: ["go"],
|
|
1459
|
+
rust: ["rust"],
|
|
1460
|
+
jvm: ["java", "kotlin"],
|
|
1461
|
+
dotnet: ["dotnet"],
|
|
1462
|
+
swift: ["swift"],
|
|
1463
|
+
dart: ["dart"],
|
|
1464
|
+
ruby: ["ruby"],
|
|
1465
|
+
php: ["php"],
|
|
1466
|
+
shell: ["shell", "powershell"],
|
|
1467
|
+
r: ["r"],
|
|
1468
|
+
sql: ["sql"]
|
|
1469
|
+
};
|
|
1470
|
+
var NODE_PACKAGE_MANAGER_COMMAND_HEAD = /^(?:npm|pnpm|yarn|bun|npx|pnpx|bunx)\b/;
|
|
1471
|
+
function verificationCommandMatchesProjectLanguages(command, projectLanguages, options) {
|
|
1472
|
+
if (NODE_PACKAGE_MANAGER_COMMAND_HEAD.test(normalizeCommand(command))) {
|
|
1473
|
+
return options?.hasRootPackageManifest ?? projectLanguages.includes("node");
|
|
1474
|
+
}
|
|
1475
|
+
const descriptor = describeVerificationCommand(command);
|
|
1476
|
+
if (descriptor.language === "unknown") return true;
|
|
1477
|
+
const compatible = VERIFICATION_LANGUAGE_PROJECT_LANGUAGES[descriptor.language];
|
|
1478
|
+
return compatible.some((language) => projectLanguages.includes(language));
|
|
1479
|
+
}
|
|
1480
|
+
var PRE_SPAWN_SETUP_REQUIRED = /^command not found: \S+ \(setup required: ([^\n]+)/m;
|
|
1481
|
+
function detectVerificationToolUnavailable(command, output, exitCode, processExitCode) {
|
|
1482
|
+
const normalizedCommand = normalizeCommand(command).toLowerCase();
|
|
1483
|
+
const normalizedOutput = String(output ?? "").toLowerCase();
|
|
1484
|
+
const descriptor = describeVerificationCommand(command);
|
|
1485
|
+
const signal = (unavailableReason) => (message) => ({
|
|
1486
|
+
toolchain: descriptor.language,
|
|
1487
|
+
message,
|
|
1488
|
+
unavailableReason
|
|
1489
|
+
});
|
|
1490
|
+
const dependency = signal("dependency_missing");
|
|
1491
|
+
const launcher = signal("launcher_missing");
|
|
1492
|
+
const interpreterCommand = unwrapTrustedEnvPythonPathPrefix(command).toLowerCase();
|
|
1493
|
+
const pythonUnavailable = PYTHON_INTERPRETER_HEAD.test(interpreterCommand) ? classifyPythonModuleUnavailable(interpreterCommand, normalizedOutput) : void 0;
|
|
1494
|
+
if (pythonUnavailable === COVERAGE_NO_DATA) return signal("zero_tests")(pythonUnavailable);
|
|
1495
|
+
if (pythonUnavailable) return dependency(pythonUnavailable);
|
|
1496
|
+
const executable = normalizedCommand.trim().split(/\s+/)[0]?.replace(/^.*[/\\]/, "");
|
|
1497
|
+
if (!executable) return void 0;
|
|
1498
|
+
const commandParts = normalizedCommand.trim().split(/\s+/);
|
|
1499
|
+
const subcommand = commandParts[1];
|
|
1500
|
+
if (normalizedOutput.includes(`no module named ${executable}`)) {
|
|
1501
|
+
return dependency(`Verification tool unavailable: module '${executable}' is not installed.`);
|
|
1502
|
+
}
|
|
1503
|
+
const setupGap = PRE_SPAWN_SETUP_REQUIRED.exec(String(output ?? ""))?.[1]?.replace(/\)\s*$/, "").trim();
|
|
1504
|
+
if (setupGap) return dependency(`Verification tool unavailable: setup required: ${setupGap}`);
|
|
1505
|
+
const launcherEvidence = launcherLinesCount(exitCode);
|
|
1506
|
+
const missing = nestedMissingMessage(normalizedOutput, exitCode, executable, processExitCode);
|
|
1507
|
+
if (missing) return launcher(missing);
|
|
1508
|
+
const missingJvmLauncher = normalizedOutput.match(
|
|
1509
|
+
/\bno ['"]?([a-z0-9_.-]+)['"]? command could be found in your path\b/i
|
|
1510
|
+
)?.[1];
|
|
1511
|
+
if (descriptor.language === "jvm" && missingJvmLauncher) {
|
|
1512
|
+
return launcher(
|
|
1513
|
+
`Verification tool unavailable: executable '${missingJvmLauncher}' was not found.`
|
|
1514
|
+
);
|
|
1515
|
+
}
|
|
1516
|
+
const unresolved = detectMissingDependencySignature(
|
|
1517
|
+
executable,
|
|
1518
|
+
normalizedOutput,
|
|
1519
|
+
processExitCode ?? exitCode
|
|
1520
|
+
);
|
|
1521
|
+
if (unresolved) return dependency(unresolved);
|
|
1522
|
+
if (subcommand && outputNamesMissingSubcommand(normalizedOutput, subcommand)) {
|
|
1523
|
+
return launcher(`Verification tool unavailable: subcommand '${subcommand}' is not installed.`);
|
|
1524
|
+
}
|
|
1525
|
+
const proxiedTool = subcommand ? `${executable}-${subcommand}` : executable;
|
|
1526
|
+
if (outputNamesToolNotInstalledForToolchain(normalizedOutput, proxiedTool)) {
|
|
1527
|
+
return launcher(`Verification tool unavailable: '${proxiedTool}' is not installed.`);
|
|
1528
|
+
}
|
|
1529
|
+
if (launcherEvidence && outputNamesInvokedNotFound(normalizedOutput, executable)) {
|
|
1530
|
+
return launcher(`Verification tool unavailable: executable '${executable}' was not found.`);
|
|
1531
|
+
}
|
|
1532
|
+
return void 0;
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
export {
|
|
1536
|
+
readShellBackslash,
|
|
1537
|
+
applicableRunnerLanguages,
|
|
1538
|
+
runnerRowApplies,
|
|
1539
|
+
isMissingToolLaunch,
|
|
1540
|
+
missingExecutableMessage,
|
|
1541
|
+
wrapperReportsInnerMissingLaunch,
|
|
1542
|
+
parseVerificationCommandArgv,
|
|
1543
|
+
isPrettierInvocation,
|
|
1544
|
+
pythonUnittestDiscoveryArgs,
|
|
1545
|
+
derivePythonCoverageCommands,
|
|
1546
|
+
isResolverPythonCoverageArgv,
|
|
1547
|
+
parseUvRunArgv,
|
|
1548
|
+
PYTHON_INTERPRETER_HEAD,
|
|
1549
|
+
unwrapTrustedEnvPythonPathPrefix,
|
|
1550
|
+
parseMavenTestSelectorToken,
|
|
1551
|
+
extractJvmVerificationGoals,
|
|
1552
|
+
describeVerificationCommand,
|
|
1553
|
+
resolveVerificationExitCode,
|
|
1554
|
+
detectExitZeroVerifyFailure,
|
|
1555
|
+
isPythonStdlibUnittestCommand,
|
|
1556
|
+
detectZeroCollectedTests,
|
|
1557
|
+
selectFallbacksForCommand,
|
|
1558
|
+
VERIFICATION_LANGUAGE_PROJECT_LANGUAGES,
|
|
1559
|
+
verificationCommandMatchesProjectLanguages,
|
|
1560
|
+
detectVerificationToolUnavailable
|
|
1561
|
+
};
|
|
1562
|
+
//# sourceMappingURL=chunk-EPAMVGI3.js.map
|