@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,1775 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isYesAnswer
|
|
3
|
+
} from "./chunk-O5X6BKAO.js";
|
|
4
|
+
import {
|
|
5
|
+
gatesAlsoFailingOnBase
|
|
6
|
+
} from "./chunk-R2CKS6WT.js";
|
|
7
|
+
import {
|
|
8
|
+
readVariantVerification
|
|
9
|
+
} from "./chunk-3OPP2OZB.js";
|
|
10
|
+
import {
|
|
11
|
+
detectRemoteConfiguration,
|
|
12
|
+
prSkipNoRemoteNotice
|
|
13
|
+
} from "./chunk-EPRMH6HO.js";
|
|
14
|
+
import {
|
|
15
|
+
execGitSyncChecked
|
|
16
|
+
} from "./chunk-XHOI4V62.js";
|
|
17
|
+
import {
|
|
18
|
+
assertSafePathComponent
|
|
19
|
+
} from "./chunk-S2VQCZO4.js";
|
|
20
|
+
import {
|
|
21
|
+
aggregateResolverOutcomes,
|
|
22
|
+
classifyResolverCommand
|
|
23
|
+
} from "./chunk-6TBEX4R4.js";
|
|
24
|
+
import {
|
|
25
|
+
FileLockCompromisedError,
|
|
26
|
+
acquireFencedFileLock,
|
|
27
|
+
ensureLockTargetFile
|
|
28
|
+
} from "./chunk-QYQOVOLR.js";
|
|
29
|
+
import {
|
|
30
|
+
prepareUntrackedIntentIndex
|
|
31
|
+
} from "./chunk-QFLBRWCJ.js";
|
|
32
|
+
import {
|
|
33
|
+
filterDeliveryPatchByExcludedPaths
|
|
34
|
+
} from "./chunk-AEQWV746.js";
|
|
35
|
+
import {
|
|
36
|
+
parseDiffGitHeaderPaths,
|
|
37
|
+
parseUnifiedDiffPathLine
|
|
38
|
+
} from "./chunk-5FKHIKTS.js";
|
|
39
|
+
import {
|
|
40
|
+
runVerificationCommand
|
|
41
|
+
} from "./chunk-S2E632FQ.js";
|
|
42
|
+
import {
|
|
43
|
+
CURRENT_BRANCH_REV_PARSE_ARGS,
|
|
44
|
+
assertBranchAllowsCodeApply,
|
|
45
|
+
parseCurrentBranchRef
|
|
46
|
+
} from "./chunk-XGU6PBO5.js";
|
|
47
|
+
import {
|
|
48
|
+
captureCurrentWorkspaceTreeIdentity
|
|
49
|
+
} from "./chunk-YO5BAJ55.js";
|
|
50
|
+
import {
|
|
51
|
+
parsePorcelainEntriesZ
|
|
52
|
+
} from "./chunk-EVE3OD2W.js";
|
|
53
|
+
import {
|
|
54
|
+
mkBuildTempDir
|
|
55
|
+
} from "./chunk-D6WTZMZB.js";
|
|
56
|
+
import {
|
|
57
|
+
readTrackedToolOutputRootsSync,
|
|
58
|
+
shouldExcludeStatusPath
|
|
59
|
+
} from "./chunk-5EQN56OZ.js";
|
|
60
|
+
import {
|
|
61
|
+
resolveVerificationChannelScope
|
|
62
|
+
} from "./chunk-AHU3FKPA.js";
|
|
63
|
+
import {
|
|
64
|
+
deriveVerificationDisposition,
|
|
65
|
+
formatUnverifiedDeliveryLabel
|
|
66
|
+
} from "./chunk-TUQMMFEQ.js";
|
|
67
|
+
import {
|
|
68
|
+
isGeneratedLockfilePath
|
|
69
|
+
} from "./chunk-D4VJFCGZ.js";
|
|
70
|
+
import {
|
|
71
|
+
safeRmDir
|
|
72
|
+
} from "./chunk-ALDTFNZ3.js";
|
|
73
|
+
import {
|
|
74
|
+
isUnderNestedToolOutputDir
|
|
75
|
+
} from "./chunk-QOIASNEJ.js";
|
|
76
|
+
import {
|
|
77
|
+
decodeGitQuotedPathBody
|
|
78
|
+
} from "./chunk-J2ICMYDA.js";
|
|
79
|
+
import {
|
|
80
|
+
toVariantSlug
|
|
81
|
+
} from "./chunk-2VLJUXJU.js";
|
|
82
|
+
import {
|
|
83
|
+
LabPathResolver
|
|
84
|
+
} from "./chunk-C3KCMAJP.js";
|
|
85
|
+
import {
|
|
86
|
+
execGit
|
|
87
|
+
} from "./chunk-MHLEZQQI.js";
|
|
88
|
+
import {
|
|
89
|
+
redactTelemetryValue
|
|
90
|
+
} from "./chunk-WV3KQDPE.js";
|
|
91
|
+
import {
|
|
92
|
+
assertContainedPath,
|
|
93
|
+
isSymlink
|
|
94
|
+
} from "./chunk-RCP2Y6DQ.js";
|
|
95
|
+
import {
|
|
96
|
+
DEFAULT_TIMEOUT_MS
|
|
97
|
+
} from "./chunk-I56TH7VM.js";
|
|
98
|
+
import {
|
|
99
|
+
readBuildPackageVersion
|
|
100
|
+
} from "./chunk-RJ6RSNT6.js";
|
|
101
|
+
import {
|
|
102
|
+
BUILD_ALLOW_OFF_SCOPE_REPAIR,
|
|
103
|
+
getExecutionContext,
|
|
104
|
+
readEnv
|
|
105
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
106
|
+
|
|
107
|
+
// src/core/compete/apply-completion-mode.ts
|
|
108
|
+
import { execFileSync } from "child_process";
|
|
109
|
+
import { existsSync as existsSync2, mkdirSync, writeFileSync } from "fs";
|
|
110
|
+
import { join as join5 } from "path";
|
|
111
|
+
|
|
112
|
+
// src/telemetry/artifact-storage.ts
|
|
113
|
+
import { createHash } from "crypto";
|
|
114
|
+
import * as fsSync from "fs";
|
|
115
|
+
import * as fs2 from "fs/promises";
|
|
116
|
+
import * as path2 from "path";
|
|
117
|
+
import { gunzipSync, gzipSync } from "zlib";
|
|
118
|
+
|
|
119
|
+
// src/core/utils/build-artifact-dir.ts
|
|
120
|
+
import * as fs from "fs";
|
|
121
|
+
import * as path from "path";
|
|
122
|
+
function realpathExisting(root) {
|
|
123
|
+
try {
|
|
124
|
+
return fs.realpathSync.native(path.resolve(root));
|
|
125
|
+
} catch {
|
|
126
|
+
throw new Error(`Repository root is unresolvable: ${root}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function rebaseOntoCanonicalRoot(lexicalRoot, canonicalRoot, candidate) {
|
|
130
|
+
const relative3 = path.relative(path.resolve(lexicalRoot), path.resolve(candidate));
|
|
131
|
+
if (relative3 === "") {
|
|
132
|
+
return canonicalRoot;
|
|
133
|
+
}
|
|
134
|
+
if (!relative3.startsWith("..") && !path.isAbsolute(relative3)) {
|
|
135
|
+
return path.join(canonicalRoot, relative3);
|
|
136
|
+
}
|
|
137
|
+
return path.resolve(candidate);
|
|
138
|
+
}
|
|
139
|
+
function assertBuildBucketWritePath(repoRoot, bucketRoot, targetDir, label) {
|
|
140
|
+
const canonicalRepo = realpathExisting(repoRoot);
|
|
141
|
+
const resolvedBucket = path.resolve(bucketRoot);
|
|
142
|
+
if (isSymlink(resolvedBucket)) {
|
|
143
|
+
throw new Error(`${label} refuses a symlinked bucket root: ${resolvedBucket}`);
|
|
144
|
+
}
|
|
145
|
+
const canonicalTarget = assertContainedPath(
|
|
146
|
+
canonicalRepo,
|
|
147
|
+
rebaseOntoCanonicalRoot(repoRoot, canonicalRepo, targetDir),
|
|
148
|
+
label
|
|
149
|
+
);
|
|
150
|
+
const canonicalBucket = rebaseOntoCanonicalRoot(repoRoot, canonicalRepo, bucketRoot);
|
|
151
|
+
assertContainedPath(canonicalBucket, canonicalTarget, `${label} bucket`);
|
|
152
|
+
return canonicalTarget;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// src/telemetry/artifact-storage.ts
|
|
156
|
+
var RAW_SIZE_THRESHOLD_BYTES = 1024 * 1024;
|
|
157
|
+
var MAX_DECOMPRESSED_DIFF_BYTES = RAW_SIZE_THRESHOLD_BYTES;
|
|
158
|
+
var COMPRESSED_SIZE_THRESHOLD_BYTES = 500 * 1024;
|
|
159
|
+
var MANIFEST_VERSION = 1;
|
|
160
|
+
async function resolveContainedExistingFile(baseDir, filename) {
|
|
161
|
+
const candidatePath = path2.resolve(baseDir, filename);
|
|
162
|
+
const [realBaseDir, realCandidatePath] = await Promise.all([
|
|
163
|
+
fs2.realpath(baseDir),
|
|
164
|
+
fs2.realpath(candidatePath)
|
|
165
|
+
]);
|
|
166
|
+
const relative3 = path2.relative(realBaseDir, realCandidatePath);
|
|
167
|
+
if (relative3 === "" || relative3.startsWith("..") || path2.isAbsolute(relative3)) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return realCandidatePath;
|
|
171
|
+
}
|
|
172
|
+
function canonicalizeBuildRoot(buildRoot) {
|
|
173
|
+
try {
|
|
174
|
+
return fsSync.realpathSync.native(path2.resolve(buildRoot));
|
|
175
|
+
} catch {
|
|
176
|
+
return path2.resolve(buildRoot);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function getArtifactDir(buildRoot, taskId, variantSlug) {
|
|
180
|
+
const root = canonicalizeBuildRoot(buildRoot);
|
|
181
|
+
const safeTaskId = assertSafePathComponent(taskId, "taskId");
|
|
182
|
+
const safeVariantSlug = assertSafePathComponent(variantSlug, "variantSlug");
|
|
183
|
+
const buildDir = path2.join(root, ".build-project");
|
|
184
|
+
const labResolver = LabPathResolver.getInstance();
|
|
185
|
+
const baseDir = labResolver.getArtifactDir(buildDir);
|
|
186
|
+
const artifactDir = path2.join(baseDir, safeTaskId, safeVariantSlug);
|
|
187
|
+
return assertBuildBucketWritePath(root, baseDir, artifactDir, "Artifact directory");
|
|
188
|
+
}
|
|
189
|
+
async function getGitVersion() {
|
|
190
|
+
try {
|
|
191
|
+
const { execSync } = await import("child_process");
|
|
192
|
+
const result = execSync("git --version", { encoding: "utf-8", timeout: 5e3 });
|
|
193
|
+
return result.trim();
|
|
194
|
+
} catch {
|
|
195
|
+
return void 0;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async function getBuildVersion() {
|
|
199
|
+
return readBuildPackageVersion() ?? "unknown";
|
|
200
|
+
}
|
|
201
|
+
async function atomicWrite(filePath, data) {
|
|
202
|
+
const tmpPath = `${filePath}.tmp.${process.pid}`;
|
|
203
|
+
try {
|
|
204
|
+
await fs2.writeFile(tmpPath, data);
|
|
205
|
+
await fs2.rename(tmpPath, filePath);
|
|
206
|
+
} catch (error) {
|
|
207
|
+
try {
|
|
208
|
+
await fs2.unlink(tmpPath);
|
|
209
|
+
} catch {
|
|
210
|
+
}
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function sha256(data) {
|
|
215
|
+
return createHash("sha256").update(data).digest("hex");
|
|
216
|
+
}
|
|
217
|
+
function containsBinaryContent(diff) {
|
|
218
|
+
return diff.includes("Binary files") || diff.includes("GIT binary patch") || // Check for high ratio of non-printable characters
|
|
219
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: intentional binary detection
|
|
220
|
+
/[\x00-\x08\x0E-\x1F]/.test(diff.slice(0, 1e4));
|
|
221
|
+
}
|
|
222
|
+
function evidenceFilenameForDiffSource(diffSource) {
|
|
223
|
+
if (diffSource === "worktreeDiff") return "diff.patch.gz";
|
|
224
|
+
if (diffSource === "output") return "analysis.txt.gz";
|
|
225
|
+
return "stdout.txt.gz";
|
|
226
|
+
}
|
|
227
|
+
async function persistVariantArtifact(options) {
|
|
228
|
+
const {
|
|
229
|
+
taskId,
|
|
230
|
+
variantSpec,
|
|
231
|
+
provider,
|
|
232
|
+
variant,
|
|
233
|
+
filteredDiff,
|
|
234
|
+
diffSource,
|
|
235
|
+
baseCommitSha,
|
|
236
|
+
baseTreeSha,
|
|
237
|
+
judgeScore,
|
|
238
|
+
completeness,
|
|
239
|
+
buildRoot: buildRootOption = process.cwd()
|
|
240
|
+
} = options;
|
|
241
|
+
const buildRoot = canonicalizeBuildRoot(buildRootOption);
|
|
242
|
+
const redactedValue = redactTelemetryValue(filteredDiff);
|
|
243
|
+
const redactedDiff = typeof redactedValue === "string" ? redactedValue : String(redactedValue);
|
|
244
|
+
try {
|
|
245
|
+
const variantSlug = toVariantSlug(variantSpec);
|
|
246
|
+
const artifactDir = getArtifactDir(buildRoot, taskId, variantSlug);
|
|
247
|
+
await fs2.mkdir(artifactDir, { recursive: true });
|
|
248
|
+
const [gitVersion, buildVersion] = await Promise.all([getGitVersion(), getBuildVersion()]);
|
|
249
|
+
const manifest = {
|
|
250
|
+
manifestVersion: MANIFEST_VERSION,
|
|
251
|
+
buildVersion,
|
|
252
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
253
|
+
taskId,
|
|
254
|
+
variantSpec,
|
|
255
|
+
variantSlug,
|
|
256
|
+
provider,
|
|
257
|
+
variant,
|
|
258
|
+
diff: {
|
|
259
|
+
status: "skipped",
|
|
260
|
+
rawByteCount: Buffer.byteLength(redactedDiff, "utf-8"),
|
|
261
|
+
replayable: options.replayable !== false && redactedDiff === filteredDiff
|
|
262
|
+
},
|
|
263
|
+
reconstruction: {
|
|
264
|
+
diffSource,
|
|
265
|
+
filteringApplied: true,
|
|
266
|
+
gitVersion,
|
|
267
|
+
baseCommitSha,
|
|
268
|
+
baseTreeSha
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
if (judgeScore !== void 0 || completeness !== void 0) {
|
|
272
|
+
manifest.scores = {
|
|
273
|
+
judgeScore,
|
|
274
|
+
completeness
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const manifestPath = path2.join(artifactDir, "manifest.json");
|
|
278
|
+
const artifactFilename = evidenceFilenameForDiffSource(diffSource);
|
|
279
|
+
const diffPath = path2.join(artifactDir, artifactFilename);
|
|
280
|
+
if (!redactedDiff || redactedDiff.trim().length === 0) {
|
|
281
|
+
manifest.diff.status = "skipped";
|
|
282
|
+
manifest.diff.skipReason = "empty";
|
|
283
|
+
await atomicWrite(manifestPath, JSON.stringify(manifest, null, 2));
|
|
284
|
+
return {
|
|
285
|
+
success: true,
|
|
286
|
+
manifestPath: path2.relative(buildRoot, manifestPath),
|
|
287
|
+
manifest
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
if (containsBinaryContent(redactedDiff)) {
|
|
291
|
+
manifest.diff.status = "skipped";
|
|
292
|
+
manifest.diff.skipReason = "binary_content";
|
|
293
|
+
await atomicWrite(manifestPath, JSON.stringify(manifest, null, 2));
|
|
294
|
+
return {
|
|
295
|
+
success: true,
|
|
296
|
+
manifestPath: path2.relative(buildRoot, manifestPath),
|
|
297
|
+
manifest
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
if (manifest.diff.rawByteCount > RAW_SIZE_THRESHOLD_BYTES) {
|
|
301
|
+
manifest.diff.status = "skipped";
|
|
302
|
+
manifest.diff.skipReason = "too_large";
|
|
303
|
+
manifest.diff.sizeThreshold = COMPRESSED_SIZE_THRESHOLD_BYTES;
|
|
304
|
+
await atomicWrite(manifestPath, JSON.stringify(manifest, null, 2));
|
|
305
|
+
return {
|
|
306
|
+
success: true,
|
|
307
|
+
manifestPath: path2.relative(buildRoot, manifestPath),
|
|
308
|
+
manifest
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const compressed = gzipSync(Buffer.from(redactedDiff, "utf-8"));
|
|
312
|
+
const compressedSize = compressed.length;
|
|
313
|
+
if (compressedSize > COMPRESSED_SIZE_THRESHOLD_BYTES) {
|
|
314
|
+
manifest.diff.status = "skipped";
|
|
315
|
+
manifest.diff.skipReason = "too_large";
|
|
316
|
+
manifest.diff.compressedByteCount = compressedSize;
|
|
317
|
+
manifest.diff.sizeThreshold = COMPRESSED_SIZE_THRESHOLD_BYTES;
|
|
318
|
+
await atomicWrite(manifestPath, JSON.stringify(manifest, null, 2));
|
|
319
|
+
return {
|
|
320
|
+
success: true,
|
|
321
|
+
manifestPath: path2.relative(buildRoot, manifestPath),
|
|
322
|
+
manifest
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
await atomicWrite(diffPath, compressed);
|
|
326
|
+
const diffHash = sha256(compressed);
|
|
327
|
+
manifest.diff.status = "persisted";
|
|
328
|
+
manifest.diff.filename = artifactFilename;
|
|
329
|
+
manifest.diff.sha256 = diffHash;
|
|
330
|
+
manifest.diff.compressedByteCount = compressedSize;
|
|
331
|
+
await atomicWrite(manifestPath, JSON.stringify(manifest, null, 2));
|
|
332
|
+
return {
|
|
333
|
+
success: true,
|
|
334
|
+
manifestPath: path2.relative(buildRoot, manifestPath),
|
|
335
|
+
diffPath: path2.relative(buildRoot, diffPath),
|
|
336
|
+
manifest
|
|
337
|
+
};
|
|
338
|
+
} catch (error) {
|
|
339
|
+
return {
|
|
340
|
+
success: false,
|
|
341
|
+
error: error instanceof Error ? error.message : String(error)
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async function readArtifactManifest(buildRoot, taskId, variantSlug) {
|
|
346
|
+
try {
|
|
347
|
+
const artifactDir = getArtifactDir(buildRoot, taskId, variantSlug);
|
|
348
|
+
const manifestPath = path2.join(artifactDir, "manifest.json");
|
|
349
|
+
const content = await fs2.readFile(manifestPath, "utf-8");
|
|
350
|
+
return JSON.parse(content);
|
|
351
|
+
} catch {
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async function readArtifactDiff(buildRoot, taskId, variantSlug, requireReplayable = false) {
|
|
356
|
+
try {
|
|
357
|
+
const artifactDir = getArtifactDir(buildRoot, taskId, variantSlug);
|
|
358
|
+
const manifest = await readArtifactManifest(buildRoot, taskId, variantSlug);
|
|
359
|
+
if (requireReplayable && manifest?.diff.replayable !== true) return null;
|
|
360
|
+
const diffFilename = manifest?.diff.filename ?? "diff.patch.gz";
|
|
361
|
+
const diffPath = await resolveContainedExistingFile(artifactDir, diffFilename);
|
|
362
|
+
if (!diffPath) {
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
const compressed = await fs2.readFile(diffPath);
|
|
366
|
+
return gunzipSync(compressed, { maxOutputLength: MAX_DECOMPRESSED_DIFF_BYTES }).toString(
|
|
367
|
+
"utf-8"
|
|
368
|
+
);
|
|
369
|
+
} catch {
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async function readArtifactDiffFromManifestPath(manifestPath, buildRoot = process.cwd(), requireReplayable = false) {
|
|
374
|
+
const manifest = await readArtifactManifestFromPath(manifestPath, buildRoot);
|
|
375
|
+
if (!manifest) {
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
try {
|
|
379
|
+
if (manifest.diff.status !== "persisted" || requireReplayable && manifest.diff.replayable !== true) {
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
const absoluteManifestPath = path2.isAbsolute(manifestPath) ? manifestPath : path2.join(buildRoot, manifestPath);
|
|
383
|
+
const diffFilename = manifest.diff.filename ?? "diff.patch.gz";
|
|
384
|
+
const manifestDir = path2.dirname(absoluteManifestPath);
|
|
385
|
+
const diffPath = await resolveContainedExistingFile(manifestDir, diffFilename);
|
|
386
|
+
if (!diffPath) {
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
const compressed = await fs2.readFile(diffPath);
|
|
390
|
+
return gunzipSync(compressed, { maxOutputLength: MAX_DECOMPRESSED_DIFF_BYTES }).toString(
|
|
391
|
+
"utf-8"
|
|
392
|
+
);
|
|
393
|
+
} catch {
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
async function readArtifactManifestFromPath(manifestPath, buildRoot = process.cwd()) {
|
|
398
|
+
if (!manifestPath || manifestPath.trim().length === 0) {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
try {
|
|
402
|
+
const absoluteManifestPath = path2.isAbsolute(manifestPath) ? manifestPath : path2.join(buildRoot, manifestPath);
|
|
403
|
+
const manifestContent = await fs2.readFile(absoluteManifestPath, "utf-8");
|
|
404
|
+
return JSON.parse(manifestContent);
|
|
405
|
+
} catch {
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async function listTaskArtifacts(buildRoot, taskId) {
|
|
410
|
+
try {
|
|
411
|
+
const buildDir = path2.join(canonicalizeBuildRoot(buildRoot), ".build-project");
|
|
412
|
+
const labResolver = LabPathResolver.getInstance();
|
|
413
|
+
const taskDir = path2.join(
|
|
414
|
+
labResolver.getArtifactDir(buildDir),
|
|
415
|
+
assertSafePathComponent(taskId, "taskId")
|
|
416
|
+
);
|
|
417
|
+
const entries = await fs2.readdir(taskDir, { withFileTypes: true });
|
|
418
|
+
return entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
419
|
+
} catch {
|
|
420
|
+
return [];
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
function createArtifactPointer(result) {
|
|
424
|
+
if (!result.success || !result.manifestPath) {
|
|
425
|
+
return void 0;
|
|
426
|
+
}
|
|
427
|
+
return { artifactManifest: result.manifestPath };
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// src/core/git/checkout-mutation-lock.ts
|
|
431
|
+
import * as fs3 from "fs/promises";
|
|
432
|
+
import * as path3 from "path";
|
|
433
|
+
var CHECKOUT_MUTATION_LOCK_STALE_MS = 12e4;
|
|
434
|
+
var CHECKOUT_MUTATION_LOCK_RETRIES = 120;
|
|
435
|
+
var CHECKOUT_MUTATION_LOCK_MIN_TIMEOUT_MS = 250;
|
|
436
|
+
var CHECKOUT_MUTATION_LOCK_MAX_TIMEOUT_MS = 2e3;
|
|
437
|
+
var CHECKOUT_MUTATION_LOCK_BACKOFF_FACTOR = 1.5;
|
|
438
|
+
function getCheckoutMutationLockTarget(projectRoot) {
|
|
439
|
+
return path3.join(projectRoot, ".build-project", "merge-apply", ".apply.lock");
|
|
440
|
+
}
|
|
441
|
+
async function resolveCheckoutMutationLockRoot(projectRoot) {
|
|
442
|
+
try {
|
|
443
|
+
return await fs3.realpath(projectRoot);
|
|
444
|
+
} catch {
|
|
445
|
+
return projectRoot;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
async function acquireCheckoutMutationLock(projectRoot) {
|
|
449
|
+
const canonicalRoot = await resolveCheckoutMutationLockRoot(projectRoot);
|
|
450
|
+
const lockTarget = getCheckoutMutationLockTarget(canonicalRoot);
|
|
451
|
+
try {
|
|
452
|
+
await fs3.mkdir(path3.dirname(lockTarget), { recursive: true });
|
|
453
|
+
await ensureLockTargetFile(lockTarget);
|
|
454
|
+
} catch (error) {
|
|
455
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
456
|
+
throw new Error(`Failed to prepare checkout mutation lock at ${lockTarget}: ${msg}`);
|
|
457
|
+
}
|
|
458
|
+
return acquireFencedFileLock(lockTarget, {
|
|
459
|
+
stale: CHECKOUT_MUTATION_LOCK_STALE_MS,
|
|
460
|
+
realpath: false,
|
|
461
|
+
retries: {
|
|
462
|
+
retries: CHECKOUT_MUTATION_LOCK_RETRIES,
|
|
463
|
+
minTimeout: CHECKOUT_MUTATION_LOCK_MIN_TIMEOUT_MS,
|
|
464
|
+
maxTimeout: CHECKOUT_MUTATION_LOCK_MAX_TIMEOUT_MS,
|
|
465
|
+
factor: CHECKOUT_MUTATION_LOCK_BACKOFF_FACTOR
|
|
466
|
+
},
|
|
467
|
+
description: "Checkout mutation lock"
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// src/core/utils/ci-environment.ts
|
|
472
|
+
function isCiEnvironment(env = process.env) {
|
|
473
|
+
const ci = (env.CI ?? "").trim().toLowerCase();
|
|
474
|
+
return ci !== "" && ci !== "false" && ci !== "0" && ci !== "no";
|
|
475
|
+
}
|
|
476
|
+
function isCompeteNonInteractiveEnvironment(env = process.env, stdoutIsTty = Boolean(process.stdout.isTTY)) {
|
|
477
|
+
return isCiEnvironment(env) || !stdoutIsTty;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// src/core/verification/repair-scope-classifier.ts
|
|
481
|
+
import { createHash as createHash2 } from "crypto";
|
|
482
|
+
var REPAIR_SCOPE_MECHANICAL_MAX_TOTAL_LINE_DELTA = 80;
|
|
483
|
+
var REPAIR_SCOPE_MECHANICAL_MAX_PER_FILE_LINE_DELTA = 40;
|
|
484
|
+
var REPAIR_SCOPE_OFF_SCOPE_MIN_LINE_DELTA = 20;
|
|
485
|
+
var MECHANICAL_PATH_PATTERNS = [/(^|\/)__snapshots__\/.+\.snap$/, /\.snap$/, /\.snapshot$/];
|
|
486
|
+
function isMechanicalRepairPath(filePath) {
|
|
487
|
+
return isGeneratedLockfilePath(filePath) || MECHANICAL_PATH_PATTERNS.some((pattern) => pattern.test(filePath));
|
|
488
|
+
}
|
|
489
|
+
function normalizeDiffPath(line) {
|
|
490
|
+
return line.replace(/\t.*$/, "");
|
|
491
|
+
}
|
|
492
|
+
function normalizeDiffBlock(block) {
|
|
493
|
+
return block.replace(/\r\n/g, "\n").split("\n").filter((line) => !/^index [0-9a-f]+\.\.[0-9a-f]+(?: \d+)?$/i.test(line)).map((line) => {
|
|
494
|
+
if (line.startsWith("--- ") || line.startsWith("+++ ")) {
|
|
495
|
+
return normalizeDiffPath(line);
|
|
496
|
+
}
|
|
497
|
+
return line;
|
|
498
|
+
}).join("\n").replace(/\n+$/, "\n");
|
|
499
|
+
}
|
|
500
|
+
function normalizeUnifiedDiffForHash(diff) {
|
|
501
|
+
const normalized = diff.replace(/\r\n/g, "\n").trim();
|
|
502
|
+
if (!normalized) return "";
|
|
503
|
+
const blocks = normalized.split(/(?=^diff --git )/m).map((block) => block.trimEnd()).filter((block) => block.trim().length > 0).map(normalizeDiffBlock).sort((a, b) => a.localeCompare(b));
|
|
504
|
+
return `${blocks.join("\n")}
|
|
505
|
+
`;
|
|
506
|
+
}
|
|
507
|
+
function hashNormalizedDiff(diff) {
|
|
508
|
+
return createHash2("sha256").update(normalizeUnifiedDiffForHash(diff)).digest("hex");
|
|
509
|
+
}
|
|
510
|
+
function stripGitPrefix(filePath) {
|
|
511
|
+
if (filePath === "/dev/null") return filePath;
|
|
512
|
+
return filePath.replace(/^[ab]\//, "");
|
|
513
|
+
}
|
|
514
|
+
function parseDiffHeaderPath(line) {
|
|
515
|
+
const match = /^diff --git (.+?) (.+)$/.exec(line);
|
|
516
|
+
if (!match) return null;
|
|
517
|
+
const rhs = stripGitPrefix(match[2] ?? "");
|
|
518
|
+
const lhs = stripGitPrefix(match[1] ?? "");
|
|
519
|
+
return rhs === "/dev/null" ? lhs : rhs;
|
|
520
|
+
}
|
|
521
|
+
function extractRepairDiffStats(diff) {
|
|
522
|
+
const statsByPath = /* @__PURE__ */ new Map();
|
|
523
|
+
let currentPath = null;
|
|
524
|
+
for (const line of diff.replace(/\r\n/g, "\n").split("\n")) {
|
|
525
|
+
const headerPath = parseDiffHeaderPath(line);
|
|
526
|
+
if (headerPath) {
|
|
527
|
+
currentPath = headerPath;
|
|
528
|
+
if (!statsByPath.has(currentPath)) {
|
|
529
|
+
statsByPath.set(currentPath, {
|
|
530
|
+
path: currentPath,
|
|
531
|
+
linesAdded: 0,
|
|
532
|
+
linesDeleted: 0,
|
|
533
|
+
lineDelta: 0,
|
|
534
|
+
isNewFile: false,
|
|
535
|
+
isDeletedFile: false
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
continue;
|
|
539
|
+
}
|
|
540
|
+
if (!currentPath) continue;
|
|
541
|
+
const stats = statsByPath.get(currentPath);
|
|
542
|
+
if (!stats) continue;
|
|
543
|
+
if (line.startsWith("--- ")) {
|
|
544
|
+
stats.isNewFile = normalizeDiffPath(line.slice(4)) === "/dev/null";
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
if (line.startsWith("+++ ")) {
|
|
548
|
+
stats.isDeletedFile = normalizeDiffPath(line.slice(4)) === "/dev/null";
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
if (line.startsWith("+++") || line.startsWith("---")) continue;
|
|
552
|
+
if (line.startsWith("+")) {
|
|
553
|
+
stats.linesAdded += 1;
|
|
554
|
+
stats.lineDelta += 1;
|
|
555
|
+
} else if (line.startsWith("-")) {
|
|
556
|
+
stats.linesDeleted += 1;
|
|
557
|
+
stats.lineDelta += 1;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
return Array.from(statsByPath.values()).sort((a, b) => a.path.localeCompare(b.path));
|
|
561
|
+
}
|
|
562
|
+
function buildRepairDiffSnapshot(diff, commit) {
|
|
563
|
+
const fileStats = extractRepairDiffStats(diff);
|
|
564
|
+
const linesAdded = fileStats.reduce((sum, file) => sum + file.linesAdded, 0);
|
|
565
|
+
const linesDeleted = fileStats.reduce((sum, file) => sum + file.linesDeleted, 0);
|
|
566
|
+
return {
|
|
567
|
+
...commit ? { commit } : {},
|
|
568
|
+
diffHash: hashNormalizedDiff(diff),
|
|
569
|
+
files: fileStats.map((file) => file.path),
|
|
570
|
+
linesAdded,
|
|
571
|
+
linesDeleted,
|
|
572
|
+
lineDelta: linesAdded + linesDeleted,
|
|
573
|
+
fileStats,
|
|
574
|
+
hashAlgorithm: "sha256",
|
|
575
|
+
normalization: "normalized-unified-diff-v1"
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
function classifyFromDelta(preRepairDiff, finalDiff, repairDelta) {
|
|
579
|
+
if (finalDiff.diffHash === preRepairDiff.diffHash) return "none";
|
|
580
|
+
const outsideStats = finalDiff.fileStats.filter(
|
|
581
|
+
(file) => repairDelta.filesOutsidePreRepairDiff.includes(file.path)
|
|
582
|
+
);
|
|
583
|
+
if (outsideStats.length === 0) return "substantive_in_scope";
|
|
584
|
+
const mechanicalOutsideStats = outsideStats.filter((file) => isMechanicalRepairPath(file.path));
|
|
585
|
+
const allOutsideMechanical = mechanicalOutsideStats.length === outsideStats.length;
|
|
586
|
+
const withinMechanicalBounds = repairDelta.outsideLineDelta <= REPAIR_SCOPE_MECHANICAL_MAX_TOTAL_LINE_DELTA && outsideStats.every((file) => file.lineDelta <= REPAIR_SCOPE_MECHANICAL_MAX_PER_FILE_LINE_DELTA);
|
|
587
|
+
if (allOutsideMechanical && withinMechanicalBounds) return "mechanical";
|
|
588
|
+
const hasOutsideDeletion = outsideStats.some((file) => file.linesDeleted > 0);
|
|
589
|
+
const hasNetNewOutsideFile = outsideStats.some((file) => file.isNewFile);
|
|
590
|
+
const hasMeaningfulOutsideDelta = repairDelta.outsideLineDelta >= REPAIR_SCOPE_OFF_SCOPE_MIN_LINE_DELTA;
|
|
591
|
+
const touchesMultipleOutsideFiles = outsideStats.length > 1;
|
|
592
|
+
if (!allOutsideMechanical && (hasOutsideDeletion || hasNetNewOutsideFile || hasMeaningfulOutsideDelta || touchesMultipleOutsideFiles)) {
|
|
593
|
+
return "off_scope";
|
|
594
|
+
}
|
|
595
|
+
return "scope_expanded";
|
|
596
|
+
}
|
|
597
|
+
function judgeVerdictApplicabilityForRepair(classification) {
|
|
598
|
+
switch (classification) {
|
|
599
|
+
case "none":
|
|
600
|
+
case "mechanical":
|
|
601
|
+
return "applies";
|
|
602
|
+
case "substantive_in_scope":
|
|
603
|
+
case "scope_expanded":
|
|
604
|
+
return "partially_applies";
|
|
605
|
+
case "off_scope":
|
|
606
|
+
return "does_not_apply";
|
|
607
|
+
case "unknown":
|
|
608
|
+
return "unknown";
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
function trustForRepairClassification(classification) {
|
|
612
|
+
switch (classification) {
|
|
613
|
+
case "none":
|
|
614
|
+
case "mechanical":
|
|
615
|
+
return "normal";
|
|
616
|
+
case "substantive_in_scope":
|
|
617
|
+
case "scope_expanded":
|
|
618
|
+
return "warning";
|
|
619
|
+
case "off_scope":
|
|
620
|
+
return "quarantined";
|
|
621
|
+
case "unknown":
|
|
622
|
+
return "unknown";
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
function analyzeRepairScope(input) {
|
|
626
|
+
const { preRepairDiff, finalDiff } = input;
|
|
627
|
+
if (!preRepairDiff || !finalDiff) {
|
|
628
|
+
return {
|
|
629
|
+
...preRepairDiff ? { preRepairDiff } : {},
|
|
630
|
+
...finalDiff ? { finalDiff } : {},
|
|
631
|
+
classification: "unknown",
|
|
632
|
+
judgeVerdictApplicability: "unknown",
|
|
633
|
+
finalArtifactTrust: "unknown"
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
const preRepairFiles = new Set(preRepairDiff.files);
|
|
637
|
+
const finalFiles = new Set(finalDiff.files);
|
|
638
|
+
const filesOutsidePreRepairDiff = finalDiff.files.filter((file) => !preRepairFiles.has(file));
|
|
639
|
+
const changedFilesInsidePreRepairDiff = finalDiff.files.filter(
|
|
640
|
+
(file) => preRepairFiles.has(file)
|
|
641
|
+
);
|
|
642
|
+
const outsideStats = finalDiff.fileStats.filter((file) => !preRepairFiles.has(file.path));
|
|
643
|
+
const linesAddedOutsidePreRepairDiff = outsideStats.reduce(
|
|
644
|
+
(sum, file) => sum + file.linesAdded,
|
|
645
|
+
0
|
|
646
|
+
);
|
|
647
|
+
const linesDeletedOutsidePreRepairDiff = outsideStats.reduce(
|
|
648
|
+
(sum, file) => sum + file.linesDeleted,
|
|
649
|
+
0
|
|
650
|
+
);
|
|
651
|
+
const outsideLineDelta = linesAddedOutsidePreRepairDiff + linesDeletedOutsidePreRepairDiff;
|
|
652
|
+
const repairDelta = {
|
|
653
|
+
filesOutsidePreRepairDiff,
|
|
654
|
+
changedFilesInsidePreRepairDiff,
|
|
655
|
+
linesAddedOutsidePreRepairDiff,
|
|
656
|
+
linesDeletedOutsidePreRepairDiff,
|
|
657
|
+
outsideLineDelta,
|
|
658
|
+
preRepairLineDelta: preRepairDiff.lineDelta,
|
|
659
|
+
finalLineDelta: finalDiff.lineDelta,
|
|
660
|
+
lineDeltaRatio: outsideLineDelta / Math.max(1, preRepairDiff.lineDelta),
|
|
661
|
+
mechanicalAllowlistMatches: filesOutsidePreRepairDiff.filter(isMechanicalRepairPath),
|
|
662
|
+
scopeExpanded: filesOutsidePreRepairDiff.length > 0 || finalFiles.size > preRepairFiles.size
|
|
663
|
+
};
|
|
664
|
+
const classification = classifyFromDelta(preRepairDiff, finalDiff, repairDelta);
|
|
665
|
+
return {
|
|
666
|
+
preRepairDiff,
|
|
667
|
+
finalDiff,
|
|
668
|
+
repairDelta,
|
|
669
|
+
classification,
|
|
670
|
+
judgeVerdictApplicability: judgeVerdictApplicabilityForRepair(classification),
|
|
671
|
+
finalArtifactTrust: trustForRepairClassification(classification)
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
function resolveRepairArtifactPolicy(input) {
|
|
675
|
+
const classification = input.classification ?? "unknown";
|
|
676
|
+
if (classification === "off_scope") {
|
|
677
|
+
if (input.allowOffScopeRepair) {
|
|
678
|
+
return {
|
|
679
|
+
action: "warn",
|
|
680
|
+
finalArtifactTrust: "warning",
|
|
681
|
+
reason: "off-scope repair allowed by explicit override",
|
|
682
|
+
overrideAllowed: true,
|
|
683
|
+
overrideUsed: true
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
if (input.effectiveMode === "branch" || input.effectiveMode === "pr") {
|
|
687
|
+
return {
|
|
688
|
+
action: "block",
|
|
689
|
+
finalArtifactTrust: "blocked",
|
|
690
|
+
reason: `completion-mode=${input.effectiveMode} blocks off-scope repaired artifacts by default`,
|
|
691
|
+
overrideAllowed: true
|
|
692
|
+
};
|
|
693
|
+
}
|
|
694
|
+
return {
|
|
695
|
+
action: "quarantine",
|
|
696
|
+
finalArtifactTrust: "quarantined",
|
|
697
|
+
reason: "isolated completion retains off-scope repaired artifact for inspection only",
|
|
698
|
+
overrideAllowed: true
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
if (classification === "unknown") {
|
|
702
|
+
return {
|
|
703
|
+
action: "warn",
|
|
704
|
+
finalArtifactTrust: "unknown",
|
|
705
|
+
reason: "repair scope could not be classified from available diff evidence",
|
|
706
|
+
overrideAllowed: false
|
|
707
|
+
};
|
|
708
|
+
}
|
|
709
|
+
if (classification === "substantive_in_scope" || classification === "scope_expanded") {
|
|
710
|
+
return {
|
|
711
|
+
action: "warn",
|
|
712
|
+
finalArtifactTrust: "warning",
|
|
713
|
+
reason: `repair classified as ${classification}`,
|
|
714
|
+
overrideAllowed: false
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
return {
|
|
718
|
+
action: "allow",
|
|
719
|
+
finalArtifactTrust: "normal",
|
|
720
|
+
reason: `repair classified as ${classification}`,
|
|
721
|
+
overrideAllowed: false
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// src/core/compete/apply-branch-policy.ts
|
|
726
|
+
function resolveBranchApplyBoundary(command, overrides) {
|
|
727
|
+
return {
|
|
728
|
+
projectRoot: getExecutionContext().repoRoot || process.cwd(),
|
|
729
|
+
authority: {
|
|
730
|
+
command,
|
|
731
|
+
allowMain: overrides.allowMain,
|
|
732
|
+
allowProtected: overrides.allowProtected,
|
|
733
|
+
allowCommingleValidationOutput: overrides.allowCommingleValidationOutput
|
|
734
|
+
}
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
async function assertLiveWorkspaceMatchesAcceptedArtifact(winner, mode) {
|
|
738
|
+
if (!winner.worktreePath || !winner.acceptedWorkspaceTreeSha) {
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
const currentSourceTreeSha = await captureCurrentWorkspaceTreeIdentity(winner.worktreePath);
|
|
742
|
+
if (currentSourceTreeSha !== winner.acceptedWorkspaceTreeSha) {
|
|
743
|
+
throw new Error(
|
|
744
|
+
`completion-mode=${mode}: live winner workspace no longer matches the accepted judged artifact (${winner.acceptedWorkspaceTreeSha} -> ${currentSourceTreeSha}). Refusing stale or expanded application.`
|
|
745
|
+
);
|
|
746
|
+
}
|
|
747
|
+
if (mode === "pr") {
|
|
748
|
+
const headTree = await execGit(["rev-parse", "--verify", "HEAD^{tree}"], {
|
|
749
|
+
cwd: winner.worktreePath
|
|
750
|
+
});
|
|
751
|
+
if (headTree.exitCode !== 0 || headTree.stdout.trim() !== winner.acceptedWorkspaceTreeSha) {
|
|
752
|
+
throw new Error(
|
|
753
|
+
`completion-mode=pr: committed HEAD tree at ${winner.worktreePath} could not be verified against the accepted judged artifact (${winner.acceptedWorkspaceTreeSha}). Refusing PR publication.`
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
function assertBranchApplyTargetUnchanged(params) {
|
|
759
|
+
const { authority, expected, observed } = params;
|
|
760
|
+
if (observed.headSha !== expected.headSha) {
|
|
761
|
+
throw new Error(
|
|
762
|
+
`completion-mode=branch: target HEAD changed while resolving the winner patch (${expected.headSha} -> ${observed.headSha ?? "unavailable"}). Refusing stale application.`
|
|
763
|
+
);
|
|
764
|
+
}
|
|
765
|
+
if (observed.branch !== expected.branch) {
|
|
766
|
+
throw new Error(
|
|
767
|
+
`completion-mode=branch: target branch changed while resolving the winner patch (${expected.branch ?? "detached HEAD"} -> ${observed.branch ?? "detached HEAD"}). Refusing to apply the winner to a branch that was never policy-checked.`
|
|
768
|
+
);
|
|
769
|
+
}
|
|
770
|
+
if (!authority) {
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
assertBranchAllowsCodeApply({
|
|
774
|
+
allowMain: authority.allowMain,
|
|
775
|
+
allowProtected: authority.allowProtected,
|
|
776
|
+
allowCommingleValidationOutput: authority.allowCommingleValidationOutput,
|
|
777
|
+
command: authority.command,
|
|
778
|
+
cwd: params.projectRoot,
|
|
779
|
+
// 'HEAD' is how the branch policy spells a detached checkout; passing it
|
|
780
|
+
// explicitly keeps the locked verdict deterministic instead of re-reading
|
|
781
|
+
// the checkout that was already observed above.
|
|
782
|
+
currentBranch: observed.branch ?? "HEAD"
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
// src/core/compete/judge-winner-line.ts
|
|
787
|
+
var judgeWinnerLine = {
|
|
788
|
+
announce(winner) {
|
|
789
|
+
const label = winner.matrixRecountLabel;
|
|
790
|
+
if (!label) return `Judge winner: ${winner.variantId}`;
|
|
791
|
+
return `Judge winner: ${winner.variantId}; ${label}`;
|
|
792
|
+
},
|
|
793
|
+
presentation(winner) {
|
|
794
|
+
return winner.matrixRecountLabel ? { matrixRecountLabel: winner.matrixRecountLabel } : {};
|
|
795
|
+
},
|
|
796
|
+
pr(variantId, label) {
|
|
797
|
+
return `Judge winner: \`${variantId}\`${label ? `; ${label}` : ""}.`;
|
|
798
|
+
}
|
|
799
|
+
};
|
|
800
|
+
|
|
801
|
+
// src/core/compete/apply-pr-body.ts
|
|
802
|
+
var TASK_SUMMARY_MAX_CHARS = 600;
|
|
803
|
+
function quoteTaskSummary(prompt) {
|
|
804
|
+
const trimmed = prompt.trim();
|
|
805
|
+
const excerpt = trimmed.length > TASK_SUMMARY_MAX_CHARS ? `${trimmed.slice(0, TASK_SUMMARY_MAX_CHARS).trimEnd()} ...` : trimmed;
|
|
806
|
+
return excerpt.split(/\r?\n/).map((line) => line.trim() ? `> ${line}` : ">");
|
|
807
|
+
}
|
|
808
|
+
function buildPrBody(input) {
|
|
809
|
+
const lines = ["## Summary", `Delivery artifact: \`${input.variantId}\`.`];
|
|
810
|
+
if (input.taskPrompt?.trim()) {
|
|
811
|
+
lines.push("", "## Task", ...quoteTaskSummary(input.taskPrompt));
|
|
812
|
+
}
|
|
813
|
+
const source = [];
|
|
814
|
+
if (input.judgeWinnerId) {
|
|
815
|
+
source.push(judgeWinnerLine.pr(input.judgeWinnerId, input.matrixRecountLabel));
|
|
816
|
+
}
|
|
817
|
+
if (input.substitutionReason) source.push(`Delivery reason: ${input.substitutionReason}`);
|
|
818
|
+
const contributors = input.synthesisContributors?.filter((id) => id.trim()) ?? [];
|
|
819
|
+
if (contributors.length > 0) {
|
|
820
|
+
source.push(`Synthesis contributors: ${contributors.map((id) => `\`${id}\``).join(", ")}`);
|
|
821
|
+
}
|
|
822
|
+
if (source.length > 0) lines.push("", "## Delivery source", ...source);
|
|
823
|
+
if (input.verificationSummary) {
|
|
824
|
+
lines.push("", "## Verification", input.verificationSummary);
|
|
825
|
+
}
|
|
826
|
+
const details = [];
|
|
827
|
+
if (input.taskId) details.push(`- Task ID: \`${input.taskId}\``);
|
|
828
|
+
if (input.judge) details.push(`- Judge: \`${input.judge}\``);
|
|
829
|
+
if (input.completionMode) details.push(`- Completion mode: \`${input.completionMode}\``);
|
|
830
|
+
if (input.variantCount) details.push(`- Variants evaluated: ${input.variantCount}`);
|
|
831
|
+
if (details.length > 0) lines.push("", ...details);
|
|
832
|
+
return `${lines.join("\n")}
|
|
833
|
+
`;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// src/core/compete/patch-delivery-eligibility.ts
|
|
837
|
+
import { posix } from "path";
|
|
838
|
+
function pathsCreatedByPatch(patch) {
|
|
839
|
+
const created = /* @__PURE__ */ new Set();
|
|
840
|
+
let current;
|
|
841
|
+
for (const line of patch.split("\n")) {
|
|
842
|
+
if (line.startsWith("diff --git ")) {
|
|
843
|
+
current = parseDiffGitHeaderPaths(line)?.bPath.replace(/\\/g, "/");
|
|
844
|
+
} else if (current && line.startsWith("new file mode ")) {
|
|
845
|
+
created.add(current);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
return created;
|
|
849
|
+
}
|
|
850
|
+
function assertPatchPathsAreDeliveryEligible(patch, projectRoot, errorPrefix) {
|
|
851
|
+
const trackedRoots = readTrackedToolOutputRootsSync(projectRoot);
|
|
852
|
+
const specialMode = patch.match(
|
|
853
|
+
/^(?:(?:new file mode|new mode) (120000|160000)|index [0-9a-f]+\.\.[0-9a-f]+ (120000|160000))$/m
|
|
854
|
+
);
|
|
855
|
+
const specialModeValue = specialMode?.[1] ?? specialMode?.[2];
|
|
856
|
+
if (specialModeValue) {
|
|
857
|
+
throw new Error(
|
|
858
|
+
`${errorPrefix}: accepted artifact contains special Git object mode ${specialModeValue}.`
|
|
859
|
+
);
|
|
860
|
+
}
|
|
861
|
+
const createdPaths = pathsCreatedByPatch(patch);
|
|
862
|
+
const patchProbe = {
|
|
863
|
+
isNestedToolOutputDir: (candidate) => trackedRoots.isNestedToolOutputDir?.(candidate, createdPaths) ?? false
|
|
864
|
+
};
|
|
865
|
+
for (const line of patch.split("\n")) {
|
|
866
|
+
let paths = [];
|
|
867
|
+
if (line.startsWith("diff --git ")) {
|
|
868
|
+
const parsed = parseDiffGitHeaderPaths(line);
|
|
869
|
+
if (!parsed) {
|
|
870
|
+
throw new Error(
|
|
871
|
+
`${errorPrefix}: could not validate a diff header path. Refusing an unscoped patch.`
|
|
872
|
+
);
|
|
873
|
+
}
|
|
874
|
+
paths = [parsed.aPath, parsed.bPath];
|
|
875
|
+
} else if (line.startsWith("--- ") || line.startsWith("+++ ")) {
|
|
876
|
+
const parsed = parseUnifiedDiffPathLine(line);
|
|
877
|
+
if (parsed && parsed !== "/dev/null") paths = [parsed];
|
|
878
|
+
}
|
|
879
|
+
for (const patchPath of paths) {
|
|
880
|
+
const normalized = patchPath.replace(/\\/g, "/");
|
|
881
|
+
if (normalized === ".gitmodules") {
|
|
882
|
+
throw new Error(
|
|
883
|
+
`${errorPrefix}: accepted artifact contains .gitmodules. Refusing repository-level submodule configuration.`
|
|
884
|
+
);
|
|
885
|
+
}
|
|
886
|
+
if (posix.isAbsolute(normalized) || normalized === ".." || normalized.startsWith("../") || normalized.includes("/../")) {
|
|
887
|
+
throw new Error(
|
|
888
|
+
`${errorPrefix}: accepted artifact contains unsafe path ${patchPath}. Refusing to apply bytes outside the repository.`
|
|
889
|
+
);
|
|
890
|
+
}
|
|
891
|
+
const created = createdPaths.has(normalized);
|
|
892
|
+
if (shouldExcludeStatusPath(patchPath, created, trackedRoots) || created && isUnderNestedToolOutputDir(normalized, patchProbe, createdPaths)) {
|
|
893
|
+
throw new Error(
|
|
894
|
+
`${errorPrefix}: accepted artifact contains excluded path ${patchPath}. Refusing to apply bytes outside the delivery-eligible artifact.`
|
|
895
|
+
);
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
// src/core/compete/post-apply-label.ts
|
|
902
|
+
function derivePostApplyDisposition(report, changedFiles) {
|
|
903
|
+
if (!report || report.status !== "unavailable" && report.status !== "not_run") return void 0;
|
|
904
|
+
return deriveVerificationDisposition({
|
|
905
|
+
passed: report.status === "not_run",
|
|
906
|
+
unavailable: true,
|
|
907
|
+
// Without applied-file provenance the evaluation covers the whole project.
|
|
908
|
+
scope: changedFiles && changedFiles.length > 0 ? "task" : "project",
|
|
909
|
+
reason: report.reason
|
|
910
|
+
});
|
|
911
|
+
}
|
|
912
|
+
function formatPostApplyUnverifiedLabel(report, changedFiles) {
|
|
913
|
+
const disposition = derivePostApplyDisposition(report, changedFiles);
|
|
914
|
+
return disposition ? formatUnverifiedDeliveryLabel(disposition)?.replace(/^Delivered,/, "Applied,") : void 0;
|
|
915
|
+
}
|
|
916
|
+
function formatApplicationVerificationLine(application) {
|
|
917
|
+
const report = application?.postApplyVerification;
|
|
918
|
+
if (!application || !report?.status) return void 0;
|
|
919
|
+
const label = formatPostApplyUnverifiedLabel(
|
|
920
|
+
{ status: report.status, reason: report.reason },
|
|
921
|
+
application.changedFiles
|
|
922
|
+
);
|
|
923
|
+
return `Application: ${label ?? `${application.status ?? "applied"}; post-apply verification ${report.status}`}`;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
// src/core/compete/post-apply-verification.ts
|
|
927
|
+
var NO_VERIFICATION_SURFACE_NOTE = "no verification surface";
|
|
928
|
+
function shouldRefusePostApplyVerification(verification) {
|
|
929
|
+
return verification.status === "failed";
|
|
930
|
+
}
|
|
931
|
+
function commitRefsMatch(left, right) {
|
|
932
|
+
const a = left.trim().toLowerCase();
|
|
933
|
+
const b = right.trim().toLowerCase();
|
|
934
|
+
return a === b || a.length >= 7 && b.startsWith(a) || b.length >= 7 && a.startsWith(b);
|
|
935
|
+
}
|
|
936
|
+
function deriveBaselineFailureEvidence(result) {
|
|
937
|
+
const baselineRef = result.baselineComparison?.baselineRef?.trim();
|
|
938
|
+
if (!baselineRef) return void 0;
|
|
939
|
+
const verification = readVariantVerification(result);
|
|
940
|
+
if (verification.status !== "baseline_clean") return void 0;
|
|
941
|
+
const gates = gatesAlsoFailingOnBase(verification.gates);
|
|
942
|
+
return gates.length > 0 ? { baselineRef, gates } : void 0;
|
|
943
|
+
}
|
|
944
|
+
function acceptBaselineKnownFailure(report, evidence, targetHeadSha) {
|
|
945
|
+
if (report.status !== "failed" || !evidence || !commitRefsMatch(evidence.baselineRef, targetHeadSha)) {
|
|
946
|
+
return report;
|
|
947
|
+
}
|
|
948
|
+
const failing = (report.commands ?? []).filter(
|
|
949
|
+
(c) => c.classification !== "passed" && c.classification !== "unavailable"
|
|
950
|
+
);
|
|
951
|
+
const sameAsBase = failing.length > 0 && failing.every((c) => c.classification === "failed" && evidence.gates.includes(c.channel));
|
|
952
|
+
if (!sameAsBase) return report;
|
|
953
|
+
const channels = [...new Set(failing.map((c) => c.channel))].join(", ");
|
|
954
|
+
return {
|
|
955
|
+
status: "unavailable",
|
|
956
|
+
reason: `${channels} fails the same way on the base commit`,
|
|
957
|
+
commands: report.commands
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
function resolvePostApplyVerificationSurface(input) {
|
|
961
|
+
const channels = [
|
|
962
|
+
["build", input.scope.build],
|
|
963
|
+
["lint", input.scope.lint],
|
|
964
|
+
["test", input.scope.test]
|
|
965
|
+
];
|
|
966
|
+
const selected = channels.flatMap(
|
|
967
|
+
([channel, resolved]) => (resolved.availability === "relevant" ? resolved.commands : resolved.partialCommands ?? []).map((command) => ({ channel, command }))
|
|
968
|
+
);
|
|
969
|
+
const unavailableChannels = channels.filter(([, resolved]) => resolved.availability === "unavailable").map(
|
|
970
|
+
([channel, resolved]) => resolved.uncovered?.length ? `${channel} (no ${resolved.uncovered.join(", ")} coverage)` : channel
|
|
971
|
+
);
|
|
972
|
+
if (unavailableChannels.length > 0) {
|
|
973
|
+
return {
|
|
974
|
+
selected,
|
|
975
|
+
noSurface: {
|
|
976
|
+
status: "unavailable",
|
|
977
|
+
reason: `Capability-resolved verification is unavailable for ${unavailableChannels.join(
|
|
978
|
+
", "
|
|
979
|
+
)} on the applied files; cannot verify.`
|
|
980
|
+
}
|
|
981
|
+
};
|
|
982
|
+
}
|
|
983
|
+
if (selected.length === 0) {
|
|
984
|
+
return {
|
|
985
|
+
selected: [],
|
|
986
|
+
noSurface: {
|
|
987
|
+
status: "not_run",
|
|
988
|
+
reason: NO_VERIFICATION_SURFACE_NOTE
|
|
989
|
+
}
|
|
990
|
+
};
|
|
991
|
+
}
|
|
992
|
+
return { selected };
|
|
993
|
+
}
|
|
994
|
+
function resolvePostApplyVerificationFromOutcomes(outcomes) {
|
|
995
|
+
const aggregate = aggregateResolverOutcomes(outcomes);
|
|
996
|
+
const commandEvidence = outcomes.map(({ channel, command, classification, durationMs }) => ({
|
|
997
|
+
channel,
|
|
998
|
+
command,
|
|
999
|
+
classification,
|
|
1000
|
+
durationMs
|
|
1001
|
+
}));
|
|
1002
|
+
if (aggregate.classification === "passed") {
|
|
1003
|
+
const unmeasured = outcomes.some((outcome) => outcome.unmeasured === true);
|
|
1004
|
+
const suffix = unmeasured ? " (unmeasured)" : "";
|
|
1005
|
+
return {
|
|
1006
|
+
status: "passed",
|
|
1007
|
+
reason: `Passed ${outcomes.length} capability-resolved verification command(s)${suffix}.`,
|
|
1008
|
+
commands: commandEvidence
|
|
1009
|
+
};
|
|
1010
|
+
}
|
|
1011
|
+
if (aggregate.classification === "unavailable") {
|
|
1012
|
+
return {
|
|
1013
|
+
status: "unavailable",
|
|
1014
|
+
reason: aggregate.representative?.message ?? `${NO_VERIFICATION_SURFACE_NOTE}: capability-resolved post-apply verification produced no usable evidence.`,
|
|
1015
|
+
commands: commandEvidence
|
|
1016
|
+
};
|
|
1017
|
+
}
|
|
1018
|
+
return {
|
|
1019
|
+
status: "failed",
|
|
1020
|
+
reason: aggregate.representative?.message ?? "Capability-resolved post-apply verification produced no usable evidence.",
|
|
1021
|
+
commands: commandEvidence
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
1024
|
+
async function verifyAppliedBranch(projectRoot, changedFiles, timeoutMinutes) {
|
|
1025
|
+
const scope = resolveVerificationChannelScope(projectRoot, changedFiles);
|
|
1026
|
+
const surface = resolvePostApplyVerificationSurface({ scope, changedFiles });
|
|
1027
|
+
if (surface.noSurface && surface.selected.length === 0) return surface.noSurface;
|
|
1028
|
+
const outcomes = [];
|
|
1029
|
+
for (const { channel, command } of surface.selected) {
|
|
1030
|
+
const startedAt = Date.now();
|
|
1031
|
+
const result = await runVerificationCommand(command, {
|
|
1032
|
+
cwd: projectRoot,
|
|
1033
|
+
timeoutMs: timeoutMinutes !== void 0 ? timeoutMinutes * 6e4 : DEFAULT_TIMEOUT_MS
|
|
1034
|
+
});
|
|
1035
|
+
outcomes.push({
|
|
1036
|
+
...classifyResolverCommand(command, result, Date.now() - startedAt, { bucket: channel }),
|
|
1037
|
+
channel
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
const report = resolvePostApplyVerificationFromOutcomes(outcomes);
|
|
1041
|
+
return surface.noSurface && report.status === "passed" ? { ...surface.noSurface, commands: report.commands } : report;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
// src/core/compete/verify-pr-publication.ts
|
|
1045
|
+
import { existsSync } from "fs";
|
|
1046
|
+
import { readFile as readFile2 } from "fs/promises";
|
|
1047
|
+
import { tmpdir } from "os";
|
|
1048
|
+
import { join as join4 } from "path";
|
|
1049
|
+
var FULL_OBJECT_ID = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/i;
|
|
1050
|
+
function refuse(cwd, reason) {
|
|
1051
|
+
throw new Error(
|
|
1052
|
+
`completion-mode=pr: ${reason} (${cwd}). Refusing PR publication; candidate retained.`
|
|
1053
|
+
);
|
|
1054
|
+
}
|
|
1055
|
+
async function resolveObject(cwd, ref, kind) {
|
|
1056
|
+
const result = await execGit(["rev-parse", "--verify", "--end-of-options", `${ref}^{${kind}}`], {
|
|
1057
|
+
cwd
|
|
1058
|
+
});
|
|
1059
|
+
const sha = result.stdout.trim();
|
|
1060
|
+
if (result.exitCode !== 0 || !FULL_OBJECT_ID.test(sha)) {
|
|
1061
|
+
refuse(cwd, `could not resolve publication ${kind}`);
|
|
1062
|
+
}
|
|
1063
|
+
return sha;
|
|
1064
|
+
}
|
|
1065
|
+
async function assertAcceptedPatch(artifact, projectRoot, cwd, sourceHeadSha) {
|
|
1066
|
+
const baseline = artifact.baselineRef?.trim();
|
|
1067
|
+
const patch = artifact.worktreeDiffReplayable === true && artifact.worktreeDiff ? artifact.worktreeDiff : artifact.artifactManifest ? await readArtifactDiffFromManifestPath(artifact.artifactManifest, projectRoot, true) : void 0;
|
|
1068
|
+
if (!baseline || !FULL_OBJECT_ID.test(baseline) || !patch) {
|
|
1069
|
+
refuse(cwd, "no accepted tree or trusted replayable patch with an immutable baseline");
|
|
1070
|
+
}
|
|
1071
|
+
const baseSha = await resolveObject(cwd, baseline, "commit");
|
|
1072
|
+
if (baseSha !== baseline.toLowerCase())
|
|
1073
|
+
refuse(cwd, "accepted patch baseline could not be verified");
|
|
1074
|
+
const scratch = await mkBuildTempDir("pr-publication-witness");
|
|
1075
|
+
try {
|
|
1076
|
+
const patchPath = join4(scratch, "committed.patch");
|
|
1077
|
+
const diff = await execGit(
|
|
1078
|
+
[
|
|
1079
|
+
"diff",
|
|
1080
|
+
"--binary",
|
|
1081
|
+
"--full-index",
|
|
1082
|
+
"--no-color",
|
|
1083
|
+
"--no-ext-diff",
|
|
1084
|
+
"--no-textconv",
|
|
1085
|
+
"--no-relative",
|
|
1086
|
+
"--src-prefix=a/",
|
|
1087
|
+
"--dst-prefix=b/",
|
|
1088
|
+
`--output=${patchPath}`,
|
|
1089
|
+
baseSha,
|
|
1090
|
+
sourceHeadSha,
|
|
1091
|
+
"--"
|
|
1092
|
+
],
|
|
1093
|
+
{ cwd, timeoutMs: 6e4 }
|
|
1094
|
+
);
|
|
1095
|
+
if (diff.exitCode !== 0 && diff.exitCode !== 1) {
|
|
1096
|
+
refuse(cwd, "could not read the full committed diff for the accepted patch");
|
|
1097
|
+
}
|
|
1098
|
+
const committedPatch = await readFile2(patchPath);
|
|
1099
|
+
if (!committedPatch.equals(Buffer.from(patch, "utf8"))) {
|
|
1100
|
+
refuse(cwd, "committed source is not byte-identical to the accepted replayable patch");
|
|
1101
|
+
}
|
|
1102
|
+
} finally {
|
|
1103
|
+
await safeRmDir(scratch, { protectedPaths: [tmpdir()], managedRoots: [tmpdir()] });
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
async function verifyPrPublicationSource(artifact, projectRoot, branchName) {
|
|
1107
|
+
const worktreePath = artifact.worktreePath && existsSync(artifact.worktreePath) ? artifact.worktreePath : void 0;
|
|
1108
|
+
const cwd = worktreePath ?? projectRoot;
|
|
1109
|
+
const sourceHeadSha = await resolveObject(
|
|
1110
|
+
cwd,
|
|
1111
|
+
worktreePath ? "HEAD" : `refs/heads/${branchName}`,
|
|
1112
|
+
"commit"
|
|
1113
|
+
);
|
|
1114
|
+
const committedTree = await resolveObject(cwd, sourceHeadSha, "tree");
|
|
1115
|
+
if (artifact.acceptedWorkspaceTreeSha) {
|
|
1116
|
+
if (committedTree !== artifact.acceptedWorkspaceTreeSha) {
|
|
1117
|
+
refuse(cwd, "committed source tree does not match the accepted judged artifact");
|
|
1118
|
+
}
|
|
1119
|
+
} else {
|
|
1120
|
+
await assertAcceptedPatch(artifact, projectRoot, cwd, sourceHeadSha);
|
|
1121
|
+
}
|
|
1122
|
+
if (worktreePath && await captureCurrentWorkspaceTreeIdentity(worktreePath) !== committedTree) {
|
|
1123
|
+
refuse(cwd, "live winner workspace no longer matches the accepted judged artifact");
|
|
1124
|
+
}
|
|
1125
|
+
return { cwd, sourceHeadSha };
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
// src/core/compete/apply-completion-mode.ts
|
|
1129
|
+
var COMPETE_DIFF_BINARY_FLAGS = ["--binary", "--full-index"];
|
|
1130
|
+
var COMPETE_GIT_APPLY_WHITESPACE_FLAGS = ["--whitespace=nowarn"];
|
|
1131
|
+
var COMPETE_DIFF_MAX_BUFFER_BYTES = 256 * 1024 * 1024;
|
|
1132
|
+
var APPLY_GIT_TIMEOUT_MS = 6e4;
|
|
1133
|
+
var TRUNCATED_DIFF_MARKERS = [
|
|
1134
|
+
/^(?:\.\.\. ?)?\[(?:\.\.\. )?diff truncated\b[^\]\n]*\](?: \.\.\.)?[ \t]*$/im,
|
|
1135
|
+
/^\.\.\. \[diff truncated(?:[^\]]*)\](?:[;,]|$)/im,
|
|
1136
|
+
/^\[Note: .*diff truncated.*\]$/im,
|
|
1137
|
+
/^NOTE: Diff truncated/im,
|
|
1138
|
+
/^\.\.\.\[output truncated:/im
|
|
1139
|
+
];
|
|
1140
|
+
function isRecoverableCompetitionDiff(diff) {
|
|
1141
|
+
if (diff.trim().length === 0) return false;
|
|
1142
|
+
return !TRUNCATED_DIFF_MARKERS.some((marker) => marker.test(diff));
|
|
1143
|
+
}
|
|
1144
|
+
var PR_REMOTE_OP_TIMEOUT_MS = 3e5;
|
|
1145
|
+
function resolveEffectiveCompletionMode(mode, context) {
|
|
1146
|
+
let effectiveMode = mode === "none" ? "isolated" : mode;
|
|
1147
|
+
if (effectiveMode === "auto") {
|
|
1148
|
+
if (context.autoModePreference !== void 0) {
|
|
1149
|
+
effectiveMode = context.autoModePreference;
|
|
1150
|
+
} else {
|
|
1151
|
+
effectiveMode = "isolated";
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
if (context.createPr === false && effectiveMode === "pr") {
|
|
1155
|
+
effectiveMode = "isolated";
|
|
1156
|
+
}
|
|
1157
|
+
return effectiveMode;
|
|
1158
|
+
}
|
|
1159
|
+
var CompletionModeCancelledError = class extends Error {
|
|
1160
|
+
constructor(mode, variantId) {
|
|
1161
|
+
super(`completion-mode=${mode} cancelled by user for ${variantId}`);
|
|
1162
|
+
this.name = "CompletionModeCancelledError";
|
|
1163
|
+
}
|
|
1164
|
+
};
|
|
1165
|
+
function getBranchModeAckPath(projectRoot) {
|
|
1166
|
+
return join5(projectRoot, ".build-project", "state", "branch-mode-ack");
|
|
1167
|
+
}
|
|
1168
|
+
function hasBranchModeAck(projectRoot) {
|
|
1169
|
+
return existsSync2(getBranchModeAckPath(projectRoot));
|
|
1170
|
+
}
|
|
1171
|
+
function writeBranchModeAck(projectRoot) {
|
|
1172
|
+
const ackPath = getBranchModeAckPath(projectRoot);
|
|
1173
|
+
mkdirSync(join5(projectRoot, ".build-project", "state"), { recursive: true });
|
|
1174
|
+
writeFileSync(ackPath, (/* @__PURE__ */ new Date()).toISOString(), "utf8");
|
|
1175
|
+
}
|
|
1176
|
+
function isWorkingTreeClean(projectRoot) {
|
|
1177
|
+
try {
|
|
1178
|
+
return readStatusChangedFiles(projectRoot, ["--untracked-files=all"]).every(
|
|
1179
|
+
(filePath) => filePath === ".build-project/merge-apply" || filePath.startsWith(".build-project/merge-apply/")
|
|
1180
|
+
);
|
|
1181
|
+
} catch {
|
|
1182
|
+
return false;
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
function resolveWinnerBranchName(winner) {
|
|
1186
|
+
if (winner.branchName?.trim()) {
|
|
1187
|
+
return winner.branchName.trim();
|
|
1188
|
+
}
|
|
1189
|
+
if (!winner.worktreePath) {
|
|
1190
|
+
return void 0;
|
|
1191
|
+
}
|
|
1192
|
+
try {
|
|
1193
|
+
const output = parseCurrentBranchRef(
|
|
1194
|
+
execGitSyncChecked([...CURRENT_BRANCH_REV_PARSE_ARGS], {
|
|
1195
|
+
cwd: winner.worktreePath,
|
|
1196
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS
|
|
1197
|
+
}).stdout
|
|
1198
|
+
);
|
|
1199
|
+
if (!output || output === "HEAD") {
|
|
1200
|
+
return void 0;
|
|
1201
|
+
}
|
|
1202
|
+
return output;
|
|
1203
|
+
} catch {
|
|
1204
|
+
return void 0;
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
function readGitOutput(projectRoot, args) {
|
|
1208
|
+
try {
|
|
1209
|
+
const output = execGitSyncChecked(args, {
|
|
1210
|
+
cwd: projectRoot,
|
|
1211
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS
|
|
1212
|
+
}).stdout.trim();
|
|
1213
|
+
return output || void 0;
|
|
1214
|
+
} catch {
|
|
1215
|
+
return void 0;
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
function normalizePatchForGitApply(patch) {
|
|
1219
|
+
return patch.endsWith("\n") ? patch : `${patch}
|
|
1220
|
+
`;
|
|
1221
|
+
}
|
|
1222
|
+
function readGitHead(projectRoot) {
|
|
1223
|
+
return readGitOutput(projectRoot, ["rev-parse", "HEAD"]);
|
|
1224
|
+
}
|
|
1225
|
+
function readGitBranch(projectRoot) {
|
|
1226
|
+
const branch = readGitOutput(projectRoot, [...CURRENT_BRANCH_REV_PARSE_ARGS]);
|
|
1227
|
+
const name = branch ? parseCurrentBranchRef(branch) : void 0;
|
|
1228
|
+
return name && name !== "HEAD" ? name : void 0;
|
|
1229
|
+
}
|
|
1230
|
+
function readWinnerHead(winner, projectRoot) {
|
|
1231
|
+
if (winner.worktreePath) {
|
|
1232
|
+
const worktreeHead = readGitHead(winner.worktreePath);
|
|
1233
|
+
if (worktreeHead) return worktreeHead;
|
|
1234
|
+
}
|
|
1235
|
+
const branchName = resolveWinnerBranchName(winner);
|
|
1236
|
+
return branchName ? readGitOutput(projectRoot, ["rev-parse", branchName]) : void 0;
|
|
1237
|
+
}
|
|
1238
|
+
function readStatusChangedFiles(projectRoot, extraArgs = []) {
|
|
1239
|
+
const { stdout } = execGitSyncChecked(["status", "--porcelain", "-z", ...extraArgs], {
|
|
1240
|
+
cwd: projectRoot,
|
|
1241
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS,
|
|
1242
|
+
stripFinalNewline: false
|
|
1243
|
+
});
|
|
1244
|
+
return [...new Set(parsePorcelainEntriesZ(stdout).map((entry) => entry.path))].sort();
|
|
1245
|
+
}
|
|
1246
|
+
function parsePrNumberFromGhCreateOutput(output) {
|
|
1247
|
+
const trimmed = String(output).trim();
|
|
1248
|
+
if (!trimmed) {
|
|
1249
|
+
return void 0;
|
|
1250
|
+
}
|
|
1251
|
+
const githubUrlMatch = trimmed.match(/\/pull\/(\d+)(?:\b|$)/);
|
|
1252
|
+
if (githubUrlMatch?.[1]) {
|
|
1253
|
+
return Number.parseInt(githubUrlMatch[1], 10);
|
|
1254
|
+
}
|
|
1255
|
+
const hashMatch = trimmed.match(/#(\d+)\b/);
|
|
1256
|
+
if (hashMatch?.[1]) {
|
|
1257
|
+
return Number.parseInt(hashMatch[1], 10);
|
|
1258
|
+
}
|
|
1259
|
+
return void 0;
|
|
1260
|
+
}
|
|
1261
|
+
async function applyIsolated(winner, context) {
|
|
1262
|
+
if (winner.worktreePath) {
|
|
1263
|
+
console.log(
|
|
1264
|
+
`Artifact ${winner.variantId} retained at: ${winner.worktreePath} (no target changes applied)`
|
|
1265
|
+
);
|
|
1266
|
+
} else {
|
|
1267
|
+
console.log(`Artifact: ${winner.variantId} (retained; no target changes applied)`);
|
|
1268
|
+
}
|
|
1269
|
+
const classification = winner.repairOutcome?.classification;
|
|
1270
|
+
if (classification === "off_scope") {
|
|
1271
|
+
console.log(`Final artifact: ${winner.repairOutcome?.finalArtifactTrust ?? "quarantined"}`);
|
|
1272
|
+
console.log("Judge verdict applies to final artifact: no");
|
|
1273
|
+
} else if (classification === "unknown") {
|
|
1274
|
+
console.log("Final artifact: unknown repair scope");
|
|
1275
|
+
}
|
|
1276
|
+
context.onApplied?.({
|
|
1277
|
+
mode: "isolated",
|
|
1278
|
+
variantId: winner.variantId,
|
|
1279
|
+
taskId: context.taskId
|
|
1280
|
+
});
|
|
1281
|
+
}
|
|
1282
|
+
async function applyPr(winner, context) {
|
|
1283
|
+
const branchName = resolveWinnerBranchName(winner);
|
|
1284
|
+
if (!branchName) {
|
|
1285
|
+
console.warn("completion-mode=pr: winner has no branch; falling back to isolated.");
|
|
1286
|
+
await applyIsolated(winner, context);
|
|
1287
|
+
return;
|
|
1288
|
+
}
|
|
1289
|
+
winner.branchName = branchName;
|
|
1290
|
+
const publication = await verifyPrPublicationSource(winner, context.projectRoot, branchName);
|
|
1291
|
+
console.log(`Pushing delivery branch: ${branchName}`);
|
|
1292
|
+
try {
|
|
1293
|
+
execGitSyncChecked(
|
|
1294
|
+
["push", "origin", `${publication.sourceHeadSha}:refs/heads/${branchName}`],
|
|
1295
|
+
{
|
|
1296
|
+
cwd: publication.cwd,
|
|
1297
|
+
// Bound the push so it cannot hang forever on a credential/auth prompt
|
|
1298
|
+
// (FIX #7). Other apply git calls already use 30s/60s timeouts.
|
|
1299
|
+
timeoutMs: PR_REMOTE_OP_TIMEOUT_MS,
|
|
1300
|
+
// Fail fast instead of blocking on an interactive credential prompt.
|
|
1301
|
+
// Only this override is passed: the shared primitive supplies the base
|
|
1302
|
+
// environment with the ambient git repository variables removed, so a
|
|
1303
|
+
// hook-supplied GIT_DIR cannot redirect the push.
|
|
1304
|
+
env: { GIT_TERMINAL_PROMPT: "0" }
|
|
1305
|
+
}
|
|
1306
|
+
);
|
|
1307
|
+
const prCreateOutput = execFileSync(
|
|
1308
|
+
"gh",
|
|
1309
|
+
[
|
|
1310
|
+
"pr",
|
|
1311
|
+
"create",
|
|
1312
|
+
"--head",
|
|
1313
|
+
branchName,
|
|
1314
|
+
"--title",
|
|
1315
|
+
`Build: deliver ${winner.variantId}`,
|
|
1316
|
+
"--body",
|
|
1317
|
+
buildPrBody({
|
|
1318
|
+
...context.deliveryPresentation,
|
|
1319
|
+
variantId: winner.variantId,
|
|
1320
|
+
verificationSummary: winner.verificationSummary,
|
|
1321
|
+
synthesisContributors: winner.synthesisContributors,
|
|
1322
|
+
taskId: context.taskId,
|
|
1323
|
+
judge: context.resolvedConfig?.judge,
|
|
1324
|
+
completionMode: context.resolvedConfig?.completionMode,
|
|
1325
|
+
variantCount: context.allVariants?.length
|
|
1326
|
+
})
|
|
1327
|
+
],
|
|
1328
|
+
{
|
|
1329
|
+
cwd: context.projectRoot,
|
|
1330
|
+
encoding: "utf8",
|
|
1331
|
+
// Bound remote operations and disable interactive auth prompts (FIX #7).
|
|
1332
|
+
timeout: PR_REMOTE_OP_TIMEOUT_MS,
|
|
1333
|
+
env: { ...process.env, GH_PROMPT_DISABLED: "1" }
|
|
1334
|
+
}
|
|
1335
|
+
);
|
|
1336
|
+
const prNumber = parsePrNumberFromGhCreateOutput(prCreateOutput);
|
|
1337
|
+
if (typeof prNumber === "number" && Number.isFinite(prNumber)) {
|
|
1338
|
+
winner.prNumber = prNumber;
|
|
1339
|
+
}
|
|
1340
|
+
console.log(`Pull request created for ${winner.variantId}`);
|
|
1341
|
+
context.onApplied?.({
|
|
1342
|
+
mode: "pr",
|
|
1343
|
+
variantId: winner.variantId,
|
|
1344
|
+
taskId: context.taskId,
|
|
1345
|
+
prNumber,
|
|
1346
|
+
sourceHeadSha: publication.sourceHeadSha,
|
|
1347
|
+
sourceBranch: branchName
|
|
1348
|
+
});
|
|
1349
|
+
} catch (err) {
|
|
1350
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1351
|
+
console.error(`Failed to create PR: ${msg}`);
|
|
1352
|
+
throw err;
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
function parseAddedFilePathsFromPatch(patch) {
|
|
1356
|
+
const lines = patch.split("\n");
|
|
1357
|
+
const added = [];
|
|
1358
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1359
|
+
const line = lines[i];
|
|
1360
|
+
if (line === "--- /dev/null" || line?.startsWith("--- /dev/null ")) {
|
|
1361
|
+
const next = lines[i + 1];
|
|
1362
|
+
if (next?.startsWith("+++ ")) {
|
|
1363
|
+
const decoded = decodePatchPath(next.slice(4));
|
|
1364
|
+
if (decoded) {
|
|
1365
|
+
added.push(decoded);
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
return added;
|
|
1371
|
+
}
|
|
1372
|
+
function decodePatchPath(field) {
|
|
1373
|
+
let raw = field.split(" ")[0]?.trim() ?? "";
|
|
1374
|
+
if (!raw || raw === "/dev/null") {
|
|
1375
|
+
return void 0;
|
|
1376
|
+
}
|
|
1377
|
+
if (raw.startsWith('"') && raw.endsWith('"') && raw.length >= 2) {
|
|
1378
|
+
raw = decodeGitQuotedPathBody(raw.slice(1, -1));
|
|
1379
|
+
}
|
|
1380
|
+
if (raw.startsWith("a/") || raw.startsWith("b/")) {
|
|
1381
|
+
raw = raw.slice(2);
|
|
1382
|
+
}
|
|
1383
|
+
return raw.length > 0 ? raw : void 0;
|
|
1384
|
+
}
|
|
1385
|
+
function rollbackFailedApply(projectRoot, baseSha, patch) {
|
|
1386
|
+
try {
|
|
1387
|
+
execGitSyncChecked(["reset", "--hard", baseSha], {
|
|
1388
|
+
cwd: projectRoot,
|
|
1389
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS
|
|
1390
|
+
});
|
|
1391
|
+
const addedPaths = parseAddedFilePathsFromPatch(patch);
|
|
1392
|
+
if (addedPaths.length > 0) {
|
|
1393
|
+
const literalPathspecs = addedPaths.map((path4) => `:(literal)${path4}`);
|
|
1394
|
+
execGitSyncChecked(["clean", "-d", "-f", "--", ...literalPathspecs], {
|
|
1395
|
+
cwd: projectRoot,
|
|
1396
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1399
|
+
} catch (rollbackErr) {
|
|
1400
|
+
const rollbackMsg = rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr);
|
|
1401
|
+
throw new Error(
|
|
1402
|
+
`Error: failed to roll back working tree after a failed apply: ${rollbackMsg}. The working tree may be in a partial state. Recover manually with: git reset --hard ${baseSha} && git clean -d -f`
|
|
1403
|
+
);
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
async function applyBranch(winner, modeSource, context) {
|
|
1407
|
+
const inCi = context.isCi ?? isCompeteNonInteractiveEnvironment();
|
|
1408
|
+
if (inCi && modeSource !== "flag" && modeSource !== "env") {
|
|
1409
|
+
throw new Error(
|
|
1410
|
+
"completion-mode=branch requires explicit opt-in in CI. Use --completion-mode branch or BUILD_COMPLETION_MODE=branch to enable."
|
|
1411
|
+
);
|
|
1412
|
+
}
|
|
1413
|
+
if (!isWorkingTreeClean(context.projectRoot)) {
|
|
1414
|
+
throw new Error(
|
|
1415
|
+
"completion-mode=branch requires a clean working tree. Commit or stash your changes first."
|
|
1416
|
+
);
|
|
1417
|
+
}
|
|
1418
|
+
const baseSha = execGitSyncChecked(["rev-parse", "HEAD"], {
|
|
1419
|
+
cwd: context.projectRoot,
|
|
1420
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS
|
|
1421
|
+
}).stdout.trim();
|
|
1422
|
+
const targetBranch = readGitBranch(context.projectRoot);
|
|
1423
|
+
if (!inCi && !hasBranchModeAck(context.projectRoot)) {
|
|
1424
|
+
if (process.stdout.isTTY) {
|
|
1425
|
+
const readline = await import("readline");
|
|
1426
|
+
const rl = readline.createInterface({
|
|
1427
|
+
input: process.stdin,
|
|
1428
|
+
output: process.stdout
|
|
1429
|
+
});
|
|
1430
|
+
const answer = await new Promise((resolve3) => {
|
|
1431
|
+
rl.question(
|
|
1432
|
+
"completion-mode=branch will apply changes directly to your current branch.\nThis is a one-time confirmation per repo. Continue? [y/N] ",
|
|
1433
|
+
(ans) => {
|
|
1434
|
+
rl.close();
|
|
1435
|
+
resolve3(ans.trim().toLowerCase());
|
|
1436
|
+
}
|
|
1437
|
+
);
|
|
1438
|
+
});
|
|
1439
|
+
if (!isYesAnswer(answer)) {
|
|
1440
|
+
console.log("Aborted.");
|
|
1441
|
+
throw new CompletionModeCancelledError("branch", winner.variantId);
|
|
1442
|
+
}
|
|
1443
|
+
writeBranchModeAck(context.projectRoot);
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
1446
|
+
console.log(`Applying ${winner.variantId} changes to current branch...`);
|
|
1447
|
+
const baselineRef = winner.baselineRef?.trim();
|
|
1448
|
+
if (!baselineRef) {
|
|
1449
|
+
throw new Error(
|
|
1450
|
+
`completion-mode=branch: winner ${winner.variantId} is missing a trustworthy baselineRef. Refusing to apply without proving the target branch is still at the competition base.`
|
|
1451
|
+
);
|
|
1452
|
+
}
|
|
1453
|
+
if (!commitRefsMatch(baselineRef, baseSha)) {
|
|
1454
|
+
throw new Error(
|
|
1455
|
+
`completion-mode=branch: target HEAD moved since the competition started (expected ${baselineRef}, found ${baseSha}). Refusing to reverse or overwrite concurrent commits.`
|
|
1456
|
+
);
|
|
1457
|
+
}
|
|
1458
|
+
const sourceBranch = resolveWinnerBranchName(winner);
|
|
1459
|
+
const sourceHeadSha = readWinnerHead(winner, context.projectRoot);
|
|
1460
|
+
let applyAttempted = false;
|
|
1461
|
+
let releaseCheckoutMutationLock;
|
|
1462
|
+
let patchOutput = "";
|
|
1463
|
+
let appliedEvent;
|
|
1464
|
+
try {
|
|
1465
|
+
let source = "none";
|
|
1466
|
+
let artifactDiff;
|
|
1467
|
+
if (winner.worktreePath) {
|
|
1468
|
+
let intentIndex;
|
|
1469
|
+
try {
|
|
1470
|
+
intentIndex = await prepareUntrackedIntentIndex({
|
|
1471
|
+
worktreePath: winner.worktreePath
|
|
1472
|
+
});
|
|
1473
|
+
} catch (prepareErr) {
|
|
1474
|
+
if (existsSync2(winner.worktreePath)) {
|
|
1475
|
+
const prepareMsg = prepareErr instanceof Error ? prepareErr.message : String(prepareErr);
|
|
1476
|
+
throw new Error(
|
|
1477
|
+
`completion-mode=branch: failed to stage untracked winner files for the diff from worktree ${winner.worktreePath}: ${prepareMsg}. Refusing to apply a patch that would silently omit newly created files.`
|
|
1478
|
+
);
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
try {
|
|
1482
|
+
patchOutput = filterDeliveryPatchByExcludedPaths(
|
|
1483
|
+
execGitSyncChecked(["diff", ...COMPETE_DIFF_BINARY_FLAGS, "--no-color", baseSha], {
|
|
1484
|
+
cwd: winner.worktreePath,
|
|
1485
|
+
maxBuffer: COMPETE_DIFF_MAX_BUFFER_BYTES,
|
|
1486
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS,
|
|
1487
|
+
// Verbatim: the runner's default newline strip takes a trailing
|
|
1488
|
+
// "\r\n" in full, so a CRLF winner's last line would lose its CR
|
|
1489
|
+
// (normalizePatchForGitApply re-adds "\n" only) and apply as
|
|
1490
|
+
// different bytes than the winner produced.
|
|
1491
|
+
stripFinalNewline: false,
|
|
1492
|
+
// Read against the temp index so untracked files render as new-file
|
|
1493
|
+
// blocks. Omitted when there were none, keeping the no-untracked-work
|
|
1494
|
+
// case byte-identical to previous behavior. Only GIT_INDEX_FILE is
|
|
1495
|
+
// passed: the shared primitive's base environment already has the
|
|
1496
|
+
// ambient git repository variables removed, so the diff cannot be
|
|
1497
|
+
// redirected to a hook's repository or index.
|
|
1498
|
+
...intentIndex?.indexPath ? { env: { GIT_INDEX_FILE: intentIndex.indexPath } } : {}
|
|
1499
|
+
}).stdout
|
|
1500
|
+
);
|
|
1501
|
+
source = "worktree";
|
|
1502
|
+
} catch (diffErr) {
|
|
1503
|
+
const worktreeMissing = !existsSync2(winner.worktreePath);
|
|
1504
|
+
if (!worktreeMissing) {
|
|
1505
|
+
const diffMsg = diffErr instanceof Error ? diffErr.message : String(diffErr);
|
|
1506
|
+
throw new Error(
|
|
1507
|
+
`completion-mode=branch: failed to read the winner diff from worktree ${winner.worktreePath}: ${diffMsg}. Refusing to fall back to a possibly-stale cached diff because the worktree is present but the diff could not be read.`
|
|
1508
|
+
);
|
|
1509
|
+
}
|
|
1510
|
+
} finally {
|
|
1511
|
+
await intentIndex?.dispose();
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
let acceptedDiff;
|
|
1515
|
+
if (winner.worktreeDiff && isRecoverableCompetitionDiff(winner.worktreeDiff)) {
|
|
1516
|
+
acceptedDiff = winner.worktreeDiff;
|
|
1517
|
+
} else if (winner.artifactManifest) {
|
|
1518
|
+
acceptedDiff = await readArtifactDiffFromManifestPath(winner.artifactManifest, context.projectRoot) ?? void 0;
|
|
1519
|
+
}
|
|
1520
|
+
const legacyByteIdentity = source === "worktree" && acceptedDiff !== void 0 && normalizePatchForGitApply(patchOutput) === normalizePatchForGitApply(acceptedDiff);
|
|
1521
|
+
if (acceptedDiff)
|
|
1522
|
+
assertPatchPathsAreDeliveryEligible(
|
|
1523
|
+
acceptedDiff,
|
|
1524
|
+
context.projectRoot,
|
|
1525
|
+
"completion-mode=branch"
|
|
1526
|
+
);
|
|
1527
|
+
if (source === "worktree" && patchOutput.trim() && !winner.acceptedWorkspaceTreeSha && !legacyByteIdentity) {
|
|
1528
|
+
throw new Error(
|
|
1529
|
+
acceptedDiff ? "completion-mode=branch: live winner diff is not byte-identical to the accepted eligible artifact and has no accepted workspace-tree identity. Refusing stale or expanded application." : "completion-mode=branch: live winner has no accepted cached or persisted artifact identity (workspace-tree identity unavailable). Refusing to apply an unverified live worktree state."
|
|
1530
|
+
);
|
|
1531
|
+
}
|
|
1532
|
+
if (source === "none" && winner.worktreeDiffReplayable !== false && winner.worktreeDiff && isRecoverableCompetitionDiff(winner.worktreeDiff)) {
|
|
1533
|
+
patchOutput = winner.worktreeDiff;
|
|
1534
|
+
source = "cached-diff";
|
|
1535
|
+
}
|
|
1536
|
+
if (source === "none" && winner.artifactManifest) {
|
|
1537
|
+
artifactDiff ??= await readArtifactDiffFromManifestPath(
|
|
1538
|
+
winner.artifactManifest,
|
|
1539
|
+
context.projectRoot,
|
|
1540
|
+
true
|
|
1541
|
+
) ?? void 0;
|
|
1542
|
+
if (artifactDiff && isRecoverableCompetitionDiff(artifactDiff)) {
|
|
1543
|
+
patchOutput = artifactDiff;
|
|
1544
|
+
source = "artifact";
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
if (source === "none") {
|
|
1548
|
+
throw new Error(
|
|
1549
|
+
`completion-mode=branch: winner ${winner.variantId} has no worktree path, cached diff, or artifact diff for application.`
|
|
1550
|
+
);
|
|
1551
|
+
}
|
|
1552
|
+
assertPatchPathsAreDeliveryEligible(patchOutput, context.projectRoot, "completion-mode=branch");
|
|
1553
|
+
if (source === "worktree") {
|
|
1554
|
+
await assertLiveWorkspaceMatchesAcceptedArtifact(winner, "branch");
|
|
1555
|
+
}
|
|
1556
|
+
if (!patchOutput.trim()) {
|
|
1557
|
+
console.log("Winner has no changes relative to HEAD \u2014 nothing to apply.");
|
|
1558
|
+
context.onApplied?.({
|
|
1559
|
+
mode: "branch",
|
|
1560
|
+
variantId: winner.variantId,
|
|
1561
|
+
taskId: context.taskId,
|
|
1562
|
+
appliedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1563
|
+
sourceBranch,
|
|
1564
|
+
sourceHeadSha,
|
|
1565
|
+
targetBranch,
|
|
1566
|
+
targetPreApplyHeadSha: baseSha,
|
|
1567
|
+
targetPostApplyHeadSha: baseSha,
|
|
1568
|
+
diffSource: source,
|
|
1569
|
+
changedFiles: [],
|
|
1570
|
+
filesChanged: 0,
|
|
1571
|
+
reason: "empty_diff"
|
|
1572
|
+
});
|
|
1573
|
+
return;
|
|
1574
|
+
}
|
|
1575
|
+
patchOutput = normalizePatchForGitApply(patchOutput);
|
|
1576
|
+
releaseCheckoutMutationLock = await acquireCheckoutMutationLock(context.projectRoot);
|
|
1577
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
1578
|
+
if (!isWorkingTreeClean(context.projectRoot)) {
|
|
1579
|
+
throw new Error(
|
|
1580
|
+
"completion-mode=branch: target working tree changed while resolving the winner patch. Refusing to mix concurrent edits into the apply transaction."
|
|
1581
|
+
);
|
|
1582
|
+
}
|
|
1583
|
+
assertBranchApplyTargetUnchanged({
|
|
1584
|
+
expected: { branch: targetBranch, headSha: baseSha },
|
|
1585
|
+
observed: {
|
|
1586
|
+
branch: readGitBranch(context.projectRoot),
|
|
1587
|
+
headSha: readGitHead(context.projectRoot)
|
|
1588
|
+
},
|
|
1589
|
+
projectRoot: context.projectRoot,
|
|
1590
|
+
authority: context.branchApplyAuthority
|
|
1591
|
+
});
|
|
1592
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
1593
|
+
applyAttempted = true;
|
|
1594
|
+
execGitSyncChecked(["apply", "--3way", ...COMPETE_GIT_APPLY_WHITESPACE_FLAGS], {
|
|
1595
|
+
cwd: context.projectRoot,
|
|
1596
|
+
input: patchOutput,
|
|
1597
|
+
timeoutMs: APPLY_GIT_TIMEOUT_MS
|
|
1598
|
+
});
|
|
1599
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
1600
|
+
const targetPostApplyHeadSha = readGitHead(context.projectRoot);
|
|
1601
|
+
const changedFiles = readStatusChangedFiles(context.projectRoot);
|
|
1602
|
+
console.log(
|
|
1603
|
+
source === "cached-diff" ? `Applied ${winner.variantId} changes to current branch (from cached diff).` : source === "artifact" ? `Applied ${winner.variantId} changes to current branch (from artifact diff).` : `Applied ${winner.variantId} changes to current branch.`
|
|
1604
|
+
);
|
|
1605
|
+
appliedEvent = {
|
|
1606
|
+
mode: "branch",
|
|
1607
|
+
variantId: winner.variantId,
|
|
1608
|
+
taskId: context.taskId,
|
|
1609
|
+
appliedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1610
|
+
sourceBranch,
|
|
1611
|
+
sourceHeadSha,
|
|
1612
|
+
targetBranch,
|
|
1613
|
+
targetPreApplyHeadSha: baseSha,
|
|
1614
|
+
targetPostApplyHeadSha,
|
|
1615
|
+
diffSource: source,
|
|
1616
|
+
changedFiles,
|
|
1617
|
+
filesChanged: changedFiles.length
|
|
1618
|
+
};
|
|
1619
|
+
} catch (err) {
|
|
1620
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1621
|
+
console.error(`Error: failed to apply changes: ${msg}`);
|
|
1622
|
+
if (applyAttempted) {
|
|
1623
|
+
try {
|
|
1624
|
+
if (releaseCheckoutMutationLock) {
|
|
1625
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
1626
|
+
}
|
|
1627
|
+
rollbackFailedApply(context.projectRoot, baseSha, patchOutput);
|
|
1628
|
+
console.log(`Info: rolled back working tree to ${baseSha} after failed apply.`);
|
|
1629
|
+
} catch (rollbackErr) {
|
|
1630
|
+
const rollbackMsg = rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr);
|
|
1631
|
+
console.error(
|
|
1632
|
+
rollbackErr instanceof FileLockCompromisedError ? `Warning: checkout lock ownership was lost; rollback was skipped and the target tree may be partially applied at ${context.projectRoot}. ${rollbackMsg}` : rollbackMsg
|
|
1633
|
+
);
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
throw err;
|
|
1637
|
+
} finally {
|
|
1638
|
+
if (releaseCheckoutMutationLock) {
|
|
1639
|
+
await releaseCheckoutMutationLock().catch(() => void 0);
|
|
1640
|
+
releaseCheckoutMutationLock = void 0;
|
|
1641
|
+
}
|
|
1642
|
+
}
|
|
1643
|
+
if (!appliedEvent) return;
|
|
1644
|
+
context.onApplicationFact?.(appliedEvent);
|
|
1645
|
+
const postApplyVerification = acceptBaselineKnownFailure(
|
|
1646
|
+
await verifyAppliedBranch(
|
|
1647
|
+
context.projectRoot,
|
|
1648
|
+
appliedEvent.changedFiles ?? [],
|
|
1649
|
+
context.resolvedConfig?.timeout
|
|
1650
|
+
),
|
|
1651
|
+
winner.baselineFailureEvidence,
|
|
1652
|
+
baseSha
|
|
1653
|
+
);
|
|
1654
|
+
const verifiedEvent = { ...appliedEvent, postApplyVerification };
|
|
1655
|
+
context.onApplied?.(verifiedEvent);
|
|
1656
|
+
if (shouldRefusePostApplyVerification(postApplyVerification)) {
|
|
1657
|
+
throw new Error(
|
|
1658
|
+
`completion-mode=branch post-apply verification ${postApplyVerification.status}: ${postApplyVerification.reason}. The applied changes were left in the working tree for inspection.`
|
|
1659
|
+
);
|
|
1660
|
+
}
|
|
1661
|
+
const unverifiedLabel = formatPostApplyUnverifiedLabel(
|
|
1662
|
+
postApplyVerification,
|
|
1663
|
+
appliedEvent.changedFiles
|
|
1664
|
+
);
|
|
1665
|
+
if (unverifiedLabel) console.log(unverifiedLabel);
|
|
1666
|
+
}
|
|
1667
|
+
function isOffScopeRepairOverrideEnabled(context) {
|
|
1668
|
+
return context.allowOffScopeRepair === true || readEnv(BUILD_ALLOW_OFF_SCOPE_REPAIR).value === true;
|
|
1669
|
+
}
|
|
1670
|
+
function assertRepairArtifactAllowedForMode(winner, effectiveMode, context) {
|
|
1671
|
+
const classification = winner.repairOutcome?.classification;
|
|
1672
|
+
const policy = resolveRepairArtifactPolicy({
|
|
1673
|
+
classification,
|
|
1674
|
+
effectiveMode,
|
|
1675
|
+
allowOffScopeRepair: isOffScopeRepairOverrideEnabled(context)
|
|
1676
|
+
});
|
|
1677
|
+
if (winner.repairOutcome) {
|
|
1678
|
+
winner.repairOutcome.finalArtifactTrust = policy.finalArtifactTrust;
|
|
1679
|
+
}
|
|
1680
|
+
if (policy.action === "block") {
|
|
1681
|
+
throw new Error(
|
|
1682
|
+
`${policy.reason}. Judge verdict does not apply to the repaired final artifact. Use --allow-off-scope-repair or BUILD_ALLOW_OFF_SCOPE_REPAIR=1 to override.`
|
|
1683
|
+
);
|
|
1684
|
+
}
|
|
1685
|
+
if (policy.action === "warn") {
|
|
1686
|
+
if (classification === "off_scope") {
|
|
1687
|
+
console.warn(
|
|
1688
|
+
`Warning: ${policy.reason}. Judge verdict does not apply to the repaired final artifact.`
|
|
1689
|
+
);
|
|
1690
|
+
} else if (classification === "scope_expanded" || classification === "substantive_in_scope") {
|
|
1691
|
+
console.warn(
|
|
1692
|
+
`Warning: ${policy.reason}. Judge verdict only partially applies to the repaired final artifact.`
|
|
1693
|
+
);
|
|
1694
|
+
} else if (classification === "unknown") {
|
|
1695
|
+
console.warn(`Warning: ${policy.reason}.`);
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
async function applyCompletionMode(winner, mode, modeSource, context) {
|
|
1700
|
+
let preCreatePrDowngrade = mode === "none" ? "isolated" : mode;
|
|
1701
|
+
if (mode === "auto") {
|
|
1702
|
+
preCreatePrDowngrade = context.autoModePreference ?? "isolated";
|
|
1703
|
+
}
|
|
1704
|
+
const effectiveMode = resolveEffectiveCompletionMode(mode, {
|
|
1705
|
+
...context,
|
|
1706
|
+
winner: {
|
|
1707
|
+
executionMode: winner.executionMode
|
|
1708
|
+
}
|
|
1709
|
+
});
|
|
1710
|
+
if (context.createPr === false && preCreatePrDowngrade === "pr") {
|
|
1711
|
+
console.log("completion-mode=pr downgraded to isolated (--no-create-pr)");
|
|
1712
|
+
}
|
|
1713
|
+
if (context.createPr !== false && effectiveMode !== "pr") {
|
|
1714
|
+
if (await detectRemoteConfiguration(context.projectRoot) === "none") {
|
|
1715
|
+
console.log(prSkipNoRemoteNotice());
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
assertRepairArtifactAllowedForMode(winner, effectiveMode, context);
|
|
1719
|
+
if ((effectiveMode === "pr" || effectiveMode === "branch") && winner.gatesPassed !== true) {
|
|
1720
|
+
throw new Error(
|
|
1721
|
+
`Refusing completion-mode=${effectiveMode}: apply gates did not pass for ${winner.variantId}`
|
|
1722
|
+
);
|
|
1723
|
+
}
|
|
1724
|
+
switch (effectiveMode) {
|
|
1725
|
+
case "isolated":
|
|
1726
|
+
await applyIsolated(winner, context);
|
|
1727
|
+
break;
|
|
1728
|
+
case "pr":
|
|
1729
|
+
await applyPr(winner, context);
|
|
1730
|
+
break;
|
|
1731
|
+
case "branch":
|
|
1732
|
+
await applyBranch(winner, modeSource, context);
|
|
1733
|
+
break;
|
|
1734
|
+
default:
|
|
1735
|
+
console.warn(
|
|
1736
|
+
`Unknown completion mode: ${effectiveMode}; falling back to isolated.`
|
|
1737
|
+
);
|
|
1738
|
+
await applyIsolated(winner, context);
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
export {
|
|
1743
|
+
assertBuildBucketWritePath,
|
|
1744
|
+
persistVariantArtifact,
|
|
1745
|
+
readArtifactManifest,
|
|
1746
|
+
readArtifactDiff,
|
|
1747
|
+
readArtifactDiffFromManifestPath,
|
|
1748
|
+
readArtifactManifestFromPath,
|
|
1749
|
+
listTaskArtifacts,
|
|
1750
|
+
createArtifactPointer,
|
|
1751
|
+
acquireCheckoutMutationLock,
|
|
1752
|
+
isCiEnvironment,
|
|
1753
|
+
buildRepairDiffSnapshot,
|
|
1754
|
+
analyzeRepairScope,
|
|
1755
|
+
resolveRepairArtifactPolicy,
|
|
1756
|
+
resolveBranchApplyBoundary,
|
|
1757
|
+
judgeWinnerLine,
|
|
1758
|
+
assertPatchPathsAreDeliveryEligible,
|
|
1759
|
+
formatPostApplyUnverifiedLabel,
|
|
1760
|
+
formatApplicationVerificationLine,
|
|
1761
|
+
NO_VERIFICATION_SURFACE_NOTE,
|
|
1762
|
+
shouldRefusePostApplyVerification,
|
|
1763
|
+
deriveBaselineFailureEvidence,
|
|
1764
|
+
resolvePostApplyVerificationSurface,
|
|
1765
|
+
resolvePostApplyVerificationFromOutcomes,
|
|
1766
|
+
COMPETE_DIFF_BINARY_FLAGS,
|
|
1767
|
+
COMPETE_GIT_APPLY_WHITESPACE_FLAGS,
|
|
1768
|
+
COMPETE_DIFF_MAX_BUFFER_BYTES,
|
|
1769
|
+
isRecoverableCompetitionDiff,
|
|
1770
|
+
PR_REMOTE_OP_TIMEOUT_MS,
|
|
1771
|
+
resolveEffectiveCompletionMode,
|
|
1772
|
+
CompletionModeCancelledError,
|
|
1773
|
+
applyCompletionMode
|
|
1774
|
+
};
|
|
1775
|
+
//# sourceMappingURL=chunk-SKTFRFQ7.js.map
|