@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,1217 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertNoPlanningStorageHold,
|
|
3
|
+
assertNoStorageDrift,
|
|
4
|
+
publishManagedChange,
|
|
5
|
+
recordManagedChange
|
|
6
|
+
} from "./chunk-SNGM452K.js";
|
|
7
|
+
import {
|
|
8
|
+
repositoryFromGitHubRemoteUrl
|
|
9
|
+
} from "./chunk-BDPYFAB4.js";
|
|
10
|
+
import {
|
|
11
|
+
getBucketByName
|
|
12
|
+
} from "./chunk-V3KLVK7B.js";
|
|
13
|
+
import {
|
|
14
|
+
refreshDefaultBranchTracking
|
|
15
|
+
} from "./chunk-BAWJNMWF.js";
|
|
16
|
+
import {
|
|
17
|
+
resolvePlanningContextForRoot
|
|
18
|
+
} from "./chunk-BBPIILO2.js";
|
|
19
|
+
import {
|
|
20
|
+
ManagedSyncBranchError,
|
|
21
|
+
describeManagedSyncBranchRefusal,
|
|
22
|
+
findEmbeddedHomePathRefusal,
|
|
23
|
+
formatManagedSyncBranchError,
|
|
24
|
+
isManagedSyncBranchError
|
|
25
|
+
} from "./chunk-I7SCBHJN.js";
|
|
26
|
+
import {
|
|
27
|
+
isSafeGitRemoteAndRef
|
|
28
|
+
} from "./chunk-D2M2Y5ID.js";
|
|
29
|
+
import {
|
|
30
|
+
resolveManagedSyncDefaultBranch
|
|
31
|
+
} from "./chunk-XGU6PBO5.js";
|
|
32
|
+
import {
|
|
33
|
+
GitExecError,
|
|
34
|
+
execGit
|
|
35
|
+
} from "./chunk-MHLEZQQI.js";
|
|
36
|
+
import {
|
|
37
|
+
GIT_HOOK_COMMIT_TIMEOUT_MS,
|
|
38
|
+
PLANNING_GIT_NETWORK_TIMEOUT_MS
|
|
39
|
+
} from "./chunk-I56TH7VM.js";
|
|
40
|
+
import {
|
|
41
|
+
toRepoRelativePath
|
|
42
|
+
} from "./chunk-STW7OFOA.js";
|
|
43
|
+
import {
|
|
44
|
+
BUILD_DEFER_SYNC,
|
|
45
|
+
PUBLISH_OUTCOME_EXIT_CODES,
|
|
46
|
+
readEnv
|
|
47
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
48
|
+
|
|
49
|
+
// src/planning/git-exec.ts
|
|
50
|
+
var NETWORK_GIT_SUBCOMMANDS = /* @__PURE__ */ new Set(["fetch", "ls-remote", "pull", "push"]);
|
|
51
|
+
async function runPlanningGit(args, options) {
|
|
52
|
+
const replayingRebase = args[0] === "rebase" && args[1] !== "--abort" && args[1] !== "--quit";
|
|
53
|
+
const networkTimeoutMs = NETWORK_GIT_SUBCOMMANDS.has(args[0] ?? "") ? PLANNING_GIT_NETWORK_TIMEOUT_MS : replayingRebase ? GIT_HOOK_COMMIT_TIMEOUT_MS : void 0;
|
|
54
|
+
try {
|
|
55
|
+
const result = await execGit(args, {
|
|
56
|
+
cwd: options.cwd,
|
|
57
|
+
...options.input === void 0 ? {} : { input: options.input },
|
|
58
|
+
...options.env ? { env: options.env } : {},
|
|
59
|
+
...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : networkTimeoutMs !== void 0 ? { timeoutMs: networkTimeoutMs } : {}
|
|
60
|
+
});
|
|
61
|
+
if (options.reject !== false && result.exitCode !== 0) {
|
|
62
|
+
throw new Error(
|
|
63
|
+
`git ${args.join(" ")} failed with exit ${result.exitCode}: ${result.stderr}`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (options.reject === false && error instanceof GitExecError) {
|
|
69
|
+
return {
|
|
70
|
+
exitCode: void 0,
|
|
71
|
+
stdout: "",
|
|
72
|
+
stderr: error.message,
|
|
73
|
+
...error.timedOut ? { timedOut: true } : {}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// src/planning/git-sync-publication-base.ts
|
|
81
|
+
async function readManagedSyncPublicationBase(projectRoot, remote, remoteBranch) {
|
|
82
|
+
const head = await runPlanningGit(["rev-parse", "HEAD"], {
|
|
83
|
+
cwd: projectRoot,
|
|
84
|
+
reject: false
|
|
85
|
+
});
|
|
86
|
+
const preSyncHeadSha = head.exitCode === 0 ? head.stdout.trim() : "";
|
|
87
|
+
const remoteBranchResult = await runPlanningGit(
|
|
88
|
+
["ls-remote", "--heads", "--", remote, `refs/heads/${remoteBranch}`],
|
|
89
|
+
{ cwd: projectRoot, reject: false }
|
|
90
|
+
);
|
|
91
|
+
return {
|
|
92
|
+
preSyncHeadSha,
|
|
93
|
+
remoteBranchExists: remoteBranchResult.stdout.trim().length > 0,
|
|
94
|
+
remoteBranchResult
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/planning/git-sync-staging.ts
|
|
99
|
+
function splitNulTerminatedPaths(stdout) {
|
|
100
|
+
return stdout.split("\0").filter((entry) => entry.length > 0);
|
|
101
|
+
}
|
|
102
|
+
async function resolvePathsThisSyncWillStage(projectRoot, managedPaths, hadPreexistingStagedChanges) {
|
|
103
|
+
if (managedPaths.length === 0) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
if (!hadPreexistingStagedChanges) {
|
|
107
|
+
return [...managedPaths];
|
|
108
|
+
}
|
|
109
|
+
const alreadyStaged = new Set(await listStagedRelativePaths(projectRoot, managedPaths));
|
|
110
|
+
return managedPaths.filter((managedPath) => !alreadyStaged.has(managedPath));
|
|
111
|
+
}
|
|
112
|
+
async function unstageThisSyncPaths(projectRoot, paths) {
|
|
113
|
+
if (paths.length === 0) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
await runPlanningGit(["reset", "--", ...paths], {
|
|
117
|
+
cwd: projectRoot,
|
|
118
|
+
reject: false
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async function snapshotStagedIndexEntries(projectRoot, paths) {
|
|
122
|
+
if (paths.length === 0) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const result = await runPlanningGit(["ls-files", "-s", "-z", "--", ...paths], {
|
|
126
|
+
cwd: projectRoot,
|
|
127
|
+
reject: false
|
|
128
|
+
});
|
|
129
|
+
if (result.exitCode !== 0 || !result.stdout) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
const entries = [];
|
|
133
|
+
for (const record of result.stdout.split("\0")) {
|
|
134
|
+
if (!record) continue;
|
|
135
|
+
const match = record.match(/^(\d{6}) ([0-9a-f]{40,64}) \d+\t(.+)$/);
|
|
136
|
+
if (!match?.[1] || !match[2] || !match[3]) continue;
|
|
137
|
+
entries.push({ mode: match[1], sha: match[2], path: match[3] });
|
|
138
|
+
}
|
|
139
|
+
return entries;
|
|
140
|
+
}
|
|
141
|
+
async function restoreStagedIndexEntries(projectRoot, entries) {
|
|
142
|
+
for (const entry of entries) {
|
|
143
|
+
await runPlanningGit(["update-index", "--cacheinfo", entry.mode, entry.sha, entry.path], {
|
|
144
|
+
cwd: projectRoot,
|
|
145
|
+
reject: false
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function captureManagedSyncStaging(projectRoot, managedPaths, hadPreexistingStagedChanges) {
|
|
150
|
+
const pathsThisSyncWillStage = await resolvePathsThisSyncWillStage(
|
|
151
|
+
projectRoot,
|
|
152
|
+
managedPaths,
|
|
153
|
+
hadPreexistingStagedChanges
|
|
154
|
+
);
|
|
155
|
+
return {
|
|
156
|
+
pathsThisSyncWillStage,
|
|
157
|
+
overlappingStagedSnapshots: await snapshotStagedIndexEntries(
|
|
158
|
+
projectRoot,
|
|
159
|
+
managedPaths.filter((managedPath) => !pathsThisSyncWillStage.includes(managedPath))
|
|
160
|
+
)
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async function abandonManagedSyncStaging(projectRoot, state) {
|
|
164
|
+
await unstageThisSyncPaths(projectRoot, state.pathsStagedByThisSync);
|
|
165
|
+
await restoreStagedIndexEntries(projectRoot, state.overlappingStagedSnapshots);
|
|
166
|
+
}
|
|
167
|
+
async function listStagedRelativePaths(projectRoot, pathspecs) {
|
|
168
|
+
if (pathspecs.length === 0) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
const result = await runPlanningGit(
|
|
172
|
+
["diff", "--cached", "--name-only", "-z", "--", ...pathspecs],
|
|
173
|
+
{ cwd: projectRoot, reject: false }
|
|
174
|
+
);
|
|
175
|
+
return splitNulTerminatedPaths(result.stdout);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// src/planning/remote-sync-verify.ts
|
|
179
|
+
import * as fs from "fs/promises";
|
|
180
|
+
import * as path from "path";
|
|
181
|
+
var DEFAULT_VERIFY_DELAYS_MS = [0, 2e3, 4e3];
|
|
182
|
+
function sleep(ms) {
|
|
183
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
184
|
+
}
|
|
185
|
+
async function resolveRemoteBranchSha(projectRoot, remote, remoteBranch, options = {}) {
|
|
186
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranch)) {
|
|
187
|
+
return "";
|
|
188
|
+
}
|
|
189
|
+
const ref = `refs/heads/${remoteBranch}`;
|
|
190
|
+
const lsRemote = await runPlanningGit(["ls-remote", "--heads", "--", remote, ref], {
|
|
191
|
+
cwd: projectRoot,
|
|
192
|
+
reject: false,
|
|
193
|
+
...options.timeoutMs === void 0 ? {} : { timeoutMs: options.timeoutMs }
|
|
194
|
+
});
|
|
195
|
+
if (lsRemote.exitCode !== 0) {
|
|
196
|
+
return "";
|
|
197
|
+
}
|
|
198
|
+
const matches = lsRemote.stdout.trim().split(/\r?\n/).map((line) => line.trim().split(/\s+/)).filter(([, name]) => name === ref);
|
|
199
|
+
return matches.length === 1 ? matches[0]?.[0] ?? "" : "";
|
|
200
|
+
}
|
|
201
|
+
async function remoteContainsCommit(projectRoot, remote, remoteBranch, commitSha, options = {}) {
|
|
202
|
+
const remoteSha = await resolveRemoteBranchSha(projectRoot, remote, remoteBranch, options);
|
|
203
|
+
if (!remoteSha) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
if (remoteSha === commitSha) {
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
const ancestorCheck = await runPlanningGit(
|
|
210
|
+
["merge-base", "--is-ancestor", commitSha, remoteSha],
|
|
211
|
+
{
|
|
212
|
+
cwd: projectRoot,
|
|
213
|
+
reject: false
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
return ancestorCheck.exitCode === 0;
|
|
217
|
+
}
|
|
218
|
+
async function remoteContainsPaths(projectRoot, remote, remoteBranch, relativePaths) {
|
|
219
|
+
const remoteRef = `${remote}/${remoteBranch}`;
|
|
220
|
+
for (const relativePath of relativePaths) {
|
|
221
|
+
const showResult = await runPlanningGit(["show", `${remoteRef}:${relativePath}`], {
|
|
222
|
+
cwd: projectRoot,
|
|
223
|
+
reject: false
|
|
224
|
+
});
|
|
225
|
+
if (showResult.exitCode !== 0) {
|
|
226
|
+
return { ok: false, missingPath: relativePath };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return { ok: true };
|
|
230
|
+
}
|
|
231
|
+
async function verifyRemoteSyncPush(options) {
|
|
232
|
+
const {
|
|
233
|
+
projectRoot,
|
|
234
|
+
remote,
|
|
235
|
+
remoteBranch,
|
|
236
|
+
relativePaths,
|
|
237
|
+
expectedCommitSha,
|
|
238
|
+
maxAttempts = 3,
|
|
239
|
+
verifyDelaysMs = DEFAULT_VERIFY_DELAYS_MS
|
|
240
|
+
} = options;
|
|
241
|
+
if (!expectedCommitSha) {
|
|
242
|
+
return { ok: false, reason: "missing expected commit SHA for remote verification" };
|
|
243
|
+
}
|
|
244
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranch)) {
|
|
245
|
+
return {
|
|
246
|
+
ok: false,
|
|
247
|
+
reason: "upstream remote or branch name is not a safe git identifier"
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
251
|
+
const delayMs = verifyDelaysMs[attempt] ?? verifyDelaysMs.at(-1) ?? 0;
|
|
252
|
+
if (delayMs > 0) {
|
|
253
|
+
await sleep(delayMs);
|
|
254
|
+
}
|
|
255
|
+
const fetchResult = await runPlanningGit(["fetch", "--", remote, remoteBranch], {
|
|
256
|
+
cwd: projectRoot,
|
|
257
|
+
reject: false
|
|
258
|
+
});
|
|
259
|
+
if (fetchResult.exitCode !== 0) {
|
|
260
|
+
if (attempt === maxAttempts - 1) {
|
|
261
|
+
const fetchDetail = fetchResult.stderr?.split("\n").find((line) => line.trim().length > 0) ?? fetchResult.stdout?.split("\n").find((line) => line.trim().length > 0) ?? "fetch failed";
|
|
262
|
+
return {
|
|
263
|
+
ok: false,
|
|
264
|
+
reason: `remote verification fetch failed after ${maxAttempts} attempts: ${fetchDetail}`
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const remoteSha = await resolveRemoteBranchSha(projectRoot, remote, remoteBranch);
|
|
270
|
+
if (!remoteSha) {
|
|
271
|
+
if (attempt === maxAttempts - 1) {
|
|
272
|
+
return {
|
|
273
|
+
ok: false,
|
|
274
|
+
reason: `remote branch ${remote}/${remoteBranch} not found after push`
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
const commitVisible = await remoteContainsCommit(
|
|
280
|
+
projectRoot,
|
|
281
|
+
remote,
|
|
282
|
+
remoteBranch,
|
|
283
|
+
expectedCommitSha
|
|
284
|
+
);
|
|
285
|
+
if (!commitVisible) {
|
|
286
|
+
if (attempt === maxAttempts - 1) {
|
|
287
|
+
return {
|
|
288
|
+
ok: false,
|
|
289
|
+
reason: `remote ${remote}/${remoteBranch} at ${remoteSha} does not contain pushed commit ${expectedCommitSha}`
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (relativePaths.length > 0) {
|
|
295
|
+
const pathCheck = await remoteContainsPaths(projectRoot, remote, remoteBranch, relativePaths);
|
|
296
|
+
if (!pathCheck.ok) {
|
|
297
|
+
if (attempt === maxAttempts - 1) {
|
|
298
|
+
return {
|
|
299
|
+
ok: false,
|
|
300
|
+
reason: `remote ${remote}/${remoteBranch} is missing synced path ${pathCheck.missingPath}`
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return { ok: true, remoteSha };
|
|
307
|
+
}
|
|
308
|
+
return { ok: false, reason: "remote verification failed after retries" };
|
|
309
|
+
}
|
|
310
|
+
function isRefspecPushTopology(localBranch, remoteBranch) {
|
|
311
|
+
return localBranch.length > 0 && remoteBranch.length > 0 && localBranch !== remoteBranch;
|
|
312
|
+
}
|
|
313
|
+
async function filterExistingRelativePaths(projectRoot, relativePaths) {
|
|
314
|
+
const existingPaths = [];
|
|
315
|
+
for (const relativePath of relativePaths) {
|
|
316
|
+
try {
|
|
317
|
+
await fs.access(path.join(projectRoot, relativePath));
|
|
318
|
+
existingPaths.push(relativePath);
|
|
319
|
+
} catch {
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return existingPaths;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// src/planning/git-sync-push.ts
|
|
326
|
+
function isMissingRemoteError(output) {
|
|
327
|
+
return /does not appear to be a git repository|couldn't find remote ref|repository .* not found|no such remote/i.test(
|
|
328
|
+
output
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
function firstGitLine(output) {
|
|
332
|
+
return output?.split("\n").find((line) => line.trim().length > 0)?.trim() ?? "unknown";
|
|
333
|
+
}
|
|
334
|
+
async function resolveManagedSyncPushCandidate(projectRoot, expectedParentSha, allowedPaths) {
|
|
335
|
+
const headResult = await runPlanningGit(["rev-parse", "HEAD"], {
|
|
336
|
+
cwd: projectRoot,
|
|
337
|
+
reject: false
|
|
338
|
+
});
|
|
339
|
+
const candidateSha = headResult.exitCode === 0 ? headResult.stdout.trim() : "";
|
|
340
|
+
if (!candidateSha || !expectedParentSha) {
|
|
341
|
+
return {
|
|
342
|
+
ok: false,
|
|
343
|
+
reason: "could not resolve the managed sync candidate or its parent"
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
const parentResult = await runPlanningGit(["rev-parse", `${candidateSha}^`], {
|
|
347
|
+
cwd: projectRoot,
|
|
348
|
+
reject: false
|
|
349
|
+
});
|
|
350
|
+
if (parentResult.exitCode !== 0 || parentResult.stdout.trim() !== expectedParentSha) {
|
|
351
|
+
return {
|
|
352
|
+
ok: false,
|
|
353
|
+
reason: "the final candidate was not exactly one managed sync commit above the remote base"
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
const changedPathsResult = await runPlanningGit(
|
|
357
|
+
["diff-tree", "--no-commit-id", "--name-only", "-r", "-z", candidateSha],
|
|
358
|
+
{ cwd: projectRoot, reject: false }
|
|
359
|
+
);
|
|
360
|
+
const changedPaths = splitNulTerminatedPaths(changedPathsResult.stdout);
|
|
361
|
+
const allowedPathSet = new Set(allowedPaths);
|
|
362
|
+
if (changedPathsResult.exitCode !== 0 || changedPaths.length === 0 || changedPaths.some((changedPath) => !allowedPathSet.has(changedPath))) {
|
|
363
|
+
return {
|
|
364
|
+
ok: false,
|
|
365
|
+
reason: "the final candidate changed paths outside the managed sync scope"
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
return { ok: true, sha: candidateSha };
|
|
369
|
+
}
|
|
370
|
+
async function pushManagedCommitWithRetry(params) {
|
|
371
|
+
const { projectRoot, remote, remoteBranch, refspecTopology, preSyncHeadSha } = params;
|
|
372
|
+
const maxSyncAttempts = refspecTopology ? 1 : 3;
|
|
373
|
+
for (let attempt = 1; attempt <= maxSyncAttempts; attempt++) {
|
|
374
|
+
let expectedParentSha = preSyncHeadSha;
|
|
375
|
+
if (params.remoteBranchExists && !refspecTopology) {
|
|
376
|
+
const remoteHeadResult = await runPlanningGit(["rev-parse", "FETCH_HEAD"], {
|
|
377
|
+
cwd: projectRoot,
|
|
378
|
+
reject: false
|
|
379
|
+
});
|
|
380
|
+
expectedParentSha = remoteHeadResult.exitCode === 0 ? remoteHeadResult.stdout.trim() : "";
|
|
381
|
+
const rebaseResult = await runPlanningGit(["rebase", "FETCH_HEAD"], {
|
|
382
|
+
cwd: projectRoot,
|
|
383
|
+
reject: false
|
|
384
|
+
});
|
|
385
|
+
if (rebaseResult.exitCode !== 0) {
|
|
386
|
+
const rebaseStderr = rebaseResult.stderr ?? "";
|
|
387
|
+
const rebaseStdout = rebaseResult.stdout ?? "";
|
|
388
|
+
const rebaseOutputCombined = `${rebaseStderr}
|
|
389
|
+
${rebaseStdout}`.toLowerCase();
|
|
390
|
+
const isConflict = rebaseOutputCombined.includes("conflict") || rebaseOutputCombined.includes("could not apply");
|
|
391
|
+
await runPlanningGit(["rebase", "--abort"], { cwd: projectRoot, reject: false });
|
|
392
|
+
const reason = isConflict ? "rebase conflicted (aborted rebase)" : `rebase failed: ${firstGitLine(rebaseStderr || rebaseStdout)}`;
|
|
393
|
+
return { kind: "local-only", message: `Committed locally but ${reason} - push skipped` };
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const candidate = await resolveManagedSyncPushCandidate(
|
|
397
|
+
projectRoot,
|
|
398
|
+
expectedParentSha,
|
|
399
|
+
params.commitPaths
|
|
400
|
+
);
|
|
401
|
+
if (!candidate.ok) {
|
|
402
|
+
return {
|
|
403
|
+
kind: "local-only",
|
|
404
|
+
message: `Committed locally but ${candidate.reason} - push skipped`
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
const shouldSetUpstream = !params.hasUpstream || !params.remoteBranchExists;
|
|
408
|
+
const pushArgs = shouldSetUpstream ? ["push", "-u", "--", remote, `${candidate.sha}:refs/heads/${remoteBranch}`] : ["push", "--", remote, `${candidate.sha}:${remoteBranch}`];
|
|
409
|
+
await params.turn?.assertOwned();
|
|
410
|
+
const pushResult = await runPlanningGit(pushArgs, { cwd: projectRoot, reject: false });
|
|
411
|
+
if (pushResult.exitCode === 0) {
|
|
412
|
+
const verifyResult = await verifyRemoteSyncPush({
|
|
413
|
+
projectRoot,
|
|
414
|
+
remote,
|
|
415
|
+
remoteBranch,
|
|
416
|
+
relativePaths: await filterExistingRelativePaths(projectRoot, params.verifyPaths),
|
|
417
|
+
expectedCommitSha: candidate.sha
|
|
418
|
+
});
|
|
419
|
+
if (verifyResult.ok) return { kind: "synced" };
|
|
420
|
+
return {
|
|
421
|
+
kind: "unverified",
|
|
422
|
+
message: `Committed locally but remote verification failed: ${verifyResult.reason} - treat push as failed`
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
const pushOutput = `${pushResult.stderr ?? ""}
|
|
426
|
+
${pushResult.stdout ?? ""}`;
|
|
427
|
+
const pushError = pushOutput.toLowerCase();
|
|
428
|
+
const isNonFastForward = pushError.includes("non-fast-forward") || pushError.includes("fetch first") || pushError.includes("failed to push some refs");
|
|
429
|
+
if (!isNonFastForward || attempt === maxSyncAttempts) {
|
|
430
|
+
return {
|
|
431
|
+
kind: "push-failed",
|
|
432
|
+
message: `Committed locally but push failed: ${firstGitLine(pushResult.stderr ?? pushResult.stdout)}`,
|
|
433
|
+
missingRemote: isMissingRemoteError(pushOutput)
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
const refreshedBoundary = await params.refreshBoundary();
|
|
437
|
+
if (!refreshedBoundary.ok) {
|
|
438
|
+
return {
|
|
439
|
+
kind: "local-only",
|
|
440
|
+
message: `Committed locally but ${refreshedBoundary.reason} - push skipped`
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
throw new Error("Managed sync retry loop exhausted without a terminal outcome");
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// src/planning/storage/sync-dispatch.ts
|
|
448
|
+
import path2 from "path";
|
|
449
|
+
var ManagedStoragePathError = class extends Error {
|
|
450
|
+
paths;
|
|
451
|
+
constructor(paths) {
|
|
452
|
+
super(
|
|
453
|
+
`Managed item paths are not under the planning storage worktree; managed items never live in the code checkout under the git-branch backend: ${paths.join(", ")}`
|
|
454
|
+
);
|
|
455
|
+
this.name = "ManagedStoragePathError";
|
|
456
|
+
this.paths = paths;
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
function toManagedSyncOutcome(result) {
|
|
460
|
+
const status = {
|
|
461
|
+
published: "synced",
|
|
462
|
+
"local-only": "local-only",
|
|
463
|
+
pending: "unverified",
|
|
464
|
+
unverified: "unverified"
|
|
465
|
+
}[result.outcome];
|
|
466
|
+
const detail = [
|
|
467
|
+
result.outcome === "pending" ? "publication pending" : void 0,
|
|
468
|
+
result.reason,
|
|
469
|
+
result.pendingRef ? `candidate retained at ${result.pendingRef}` : void 0
|
|
470
|
+
].filter((part) => Boolean(part));
|
|
471
|
+
const unpublished = result.outcome === "pending" || result.outcome === "unverified";
|
|
472
|
+
return {
|
|
473
|
+
outcome: { synced: result.outcome === "published", status },
|
|
474
|
+
exitCode: result.exitCode ?? PUBLISH_OUTCOME_EXIT_CODES[result.outcome],
|
|
475
|
+
publishOutcome: result.outcome,
|
|
476
|
+
...detail.length > 0 ? { reason: detail.join("; ") } : {},
|
|
477
|
+
...result.pendingRef ? { pendingRef: result.pendingRef } : {},
|
|
478
|
+
...result.commitSha ? { commitSha: result.commitSha } : {},
|
|
479
|
+
localByPolicyPaths: result.localByPolicyPaths,
|
|
480
|
+
...unpublished ? { pendingWarning: formatUnpublishedPublication(result) } : {}
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
function toDeferredSyncOutcome(result) {
|
|
484
|
+
return {
|
|
485
|
+
outcome: { synced: false, status: "skipped" },
|
|
486
|
+
exitCode: 0,
|
|
487
|
+
publishOutcome: result.outcome,
|
|
488
|
+
...result.pendingRef ? { pendingRef: result.pendingRef } : {},
|
|
489
|
+
...result.commitSha ? { commitSha: result.commitSha } : {},
|
|
490
|
+
localByPolicyPaths: result.localByPolicyPaths
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
function formatUnpublishedPublication(result) {
|
|
494
|
+
return [
|
|
495
|
+
`managed publication ${result.outcome}`,
|
|
496
|
+
result.reason?.replace(/[\s\p{Cc}]+/gu, " ").trim() || void 0,
|
|
497
|
+
result.pendingRef ? `candidate retained at ${result.pendingRef}` : void 0,
|
|
498
|
+
"publish it with: build plan storage sync"
|
|
499
|
+
].filter((part) => Boolean(part)).join("; ");
|
|
500
|
+
}
|
|
501
|
+
function toStorageRelativePath(ctx, filePath) {
|
|
502
|
+
const absolute = path2.isAbsolute(filePath) ? filePath : path2.resolve(ctx.projectRoot, filePath);
|
|
503
|
+
const relative = toRepoRelativePath(ctx.storageRoot, absolute);
|
|
504
|
+
if (!relative || path2.isAbsolute(relative) || relative.split(path2.sep)[0] === "..") {
|
|
505
|
+
return void 0;
|
|
506
|
+
}
|
|
507
|
+
return relative.split(path2.sep).join("/");
|
|
508
|
+
}
|
|
509
|
+
function resolveStoragePaths(ctx, filePaths) {
|
|
510
|
+
const resolved = [];
|
|
511
|
+
const rejected = [];
|
|
512
|
+
for (const filePath of filePaths) {
|
|
513
|
+
const storagePath = toStorageRelativePath(ctx, filePath);
|
|
514
|
+
if (storagePath) {
|
|
515
|
+
if (!resolved.includes(storagePath)) resolved.push(storagePath);
|
|
516
|
+
} else {
|
|
517
|
+
rejected.push(filePath);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
if (rejected.length > 0) {
|
|
521
|
+
throw new ManagedStoragePathError(rejected);
|
|
522
|
+
}
|
|
523
|
+
return resolved;
|
|
524
|
+
}
|
|
525
|
+
async function beginManagedSync(projectRoot) {
|
|
526
|
+
const ctx = resolvePlanningContextForRoot(projectRoot);
|
|
527
|
+
assertNoPlanningStorageHold();
|
|
528
|
+
await assertNoStorageDrift(ctx);
|
|
529
|
+
return ctx;
|
|
530
|
+
}
|
|
531
|
+
function codeCheckoutCarriesSharedBuckets(projectRoot) {
|
|
532
|
+
return resolvePlanningContextForRoot(projectRoot).backend !== "git-branch";
|
|
533
|
+
}
|
|
534
|
+
function backlogArchiveCopyPublishes(projectRoot) {
|
|
535
|
+
return !codeCheckoutCarriesSharedBuckets(projectRoot) && getBucketByName("backlog", projectRoot)?.archivePublished === true;
|
|
536
|
+
}
|
|
537
|
+
async function storageDriftRefusalAtPublication(projectRoot, remote) {
|
|
538
|
+
const ctx = resolvePlanningContextForRoot(projectRoot);
|
|
539
|
+
const refresh = await refreshDefaultBranchTracking(projectRoot, remote);
|
|
540
|
+
if (!refresh.ok) return { reason: refresh.reason, kind: "fetch-failed", blockCommit: false };
|
|
541
|
+
try {
|
|
542
|
+
await assertNoStorageDrift(ctx, { remote, defaultBranch: refresh.defaultBranch });
|
|
543
|
+
return void 0;
|
|
544
|
+
} catch (error) {
|
|
545
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
546
|
+
return { reason, kind: "storage-drift", blockCommit: true };
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
var UNPUBLISHED_EXIT_CODE = 2;
|
|
550
|
+
function reportUnpublishedOutcome(translated, reportPending) {
|
|
551
|
+
if (!translated.pendingWarning) return;
|
|
552
|
+
if (reportPending === "dispatcher") {
|
|
553
|
+
process.stderr.write(`Warning: ${translated.pendingWarning}
|
|
554
|
+
`);
|
|
555
|
+
}
|
|
556
|
+
const current = typeof process.exitCode === "number" ? process.exitCode : 0;
|
|
557
|
+
if (current < UNPUBLISHED_EXIT_CODE) process.exitCode = UNPUBLISHED_EXIT_CODE;
|
|
558
|
+
}
|
|
559
|
+
async function publishManagedSync(ctx, input) {
|
|
560
|
+
const storagePaths = resolveStoragePaths(ctx, input.paths);
|
|
561
|
+
const request = {
|
|
562
|
+
touchedPaths: storagePaths,
|
|
563
|
+
message: input.message,
|
|
564
|
+
...input.verbose === void 0 ? {} : { verbose: input.verbose },
|
|
565
|
+
...input.backlogGatePassed ? { backlogGatePassed: true } : {}
|
|
566
|
+
};
|
|
567
|
+
if (input.deferPublication) {
|
|
568
|
+
return { ...toDeferredSyncOutcome(await recordManagedChange(ctx, request)), storagePaths };
|
|
569
|
+
}
|
|
570
|
+
const result = await publishManagedChange(ctx, request);
|
|
571
|
+
const translated = toManagedSyncOutcome(result);
|
|
572
|
+
reportUnpublishedOutcome(translated, input.reportPending ?? "dispatcher");
|
|
573
|
+
return { ...translated, storagePaths };
|
|
574
|
+
}
|
|
575
|
+
async function dispatchManagedSync(projectRoot, input) {
|
|
576
|
+
const ctx = await beginManagedSync(projectRoot);
|
|
577
|
+
if (ctx.backend !== "git-branch") {
|
|
578
|
+
return { backend: ctx.backend, ctx, outcome: await input.legacySync() };
|
|
579
|
+
}
|
|
580
|
+
const published = await publishManagedSync(ctx, input);
|
|
581
|
+
return { backend: ctx.backend, ctx, ...published };
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// src/planning/git-sync.ts
|
|
585
|
+
import { randomUUID } from "crypto";
|
|
586
|
+
import { existsSync } from "fs";
|
|
587
|
+
import path3 from "path";
|
|
588
|
+
import chalk from "chalk";
|
|
589
|
+
|
|
590
|
+
// src/core/git/commit-subject.ts
|
|
591
|
+
var MAX_BOOKKEEPING_SUBJECT_LENGTH = 62;
|
|
592
|
+
function capCommitSubject(subject, max = MAX_BOOKKEEPING_SUBJECT_LENGTH) {
|
|
593
|
+
const points = Array.from(subject);
|
|
594
|
+
if (points.length <= max) return subject;
|
|
595
|
+
const cut = points.slice(0, max).join("");
|
|
596
|
+
const atWord = points[max] === " " ? cut : cut.slice(0, Math.max(cut.lastIndexOf(" "), 0));
|
|
597
|
+
return (atWord || cut).replace(/[\s.,;:]+$/u, "");
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// src/planning/managed-commit-message.ts
|
|
601
|
+
var CONVENTIONAL_SUBJECT = /^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([^)]*\))?!?: /u;
|
|
602
|
+
var DOMAIN_SUBJECT = /^([a-z][a-z0-9-]*): (.+)$/u;
|
|
603
|
+
function styleManagedCommitMessage(message, style) {
|
|
604
|
+
const newline = message.indexOf("\n");
|
|
605
|
+
const subject = newline === -1 ? message : message.slice(0, newline);
|
|
606
|
+
const rest = newline === -1 ? "" : message.slice(newline);
|
|
607
|
+
if (style === "plain" || CONVENTIONAL_SUBJECT.test(subject))
|
|
608
|
+
return capCommitSubject(subject) + rest;
|
|
609
|
+
const domain = DOMAIN_SUBJECT.exec(subject);
|
|
610
|
+
const topic = domain ? `${domain[1]} ${domain[2]}` : subject;
|
|
611
|
+
return capCommitSubject(`chore(planning): ${topic}`) + rest;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// src/planning/git-sync.ts
|
|
615
|
+
var GENERATED_PLANNING_INDEX_CACHE_REL_PATH = ".build-project/planning/indexes";
|
|
616
|
+
function isDeferSyncEnabled() {
|
|
617
|
+
return readEnv(BUILD_DEFER_SYNC).value ?? false;
|
|
618
|
+
}
|
|
619
|
+
var BACKLOG_SYNC_WORKING_BRANCH_PREFIX = "chore/backlog-sync-";
|
|
620
|
+
async function assertManagedSyncBranch(projectRoot, branch) {
|
|
621
|
+
if (branch.startsWith(BACKLOG_SYNC_WORKING_BRANCH_PREFIX)) {
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
const defaultBranch = await resolveManagedSyncDefaultBranch(projectRoot);
|
|
625
|
+
if (defaultBranch && branch === defaultBranch) return;
|
|
626
|
+
if (!defaultBranch) {
|
|
627
|
+
throw new ManagedSyncBranchError(
|
|
628
|
+
`Managed auto-sync refuses branch ${branch}; the repository default branch could not be established from origin/HEAD, main, or master`,
|
|
629
|
+
{ branch, defaultBranch: "" }
|
|
630
|
+
);
|
|
631
|
+
}
|
|
632
|
+
throw new ManagedSyncBranchError(describeManagedSyncBranchRefusal(branch, defaultBranch), {
|
|
633
|
+
branch,
|
|
634
|
+
defaultBranch
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
async function verifyManagedSyncRebasePrecondition(projectRoot, managedCommitPaths) {
|
|
638
|
+
const unstaged = await runPlanningGit(["diff", "--quiet", "--"], {
|
|
639
|
+
cwd: projectRoot,
|
|
640
|
+
reject: false
|
|
641
|
+
});
|
|
642
|
+
if (unstaged.exitCode === 1) {
|
|
643
|
+
return { ok: false, reason: "rebase requires a clean worktree" };
|
|
644
|
+
}
|
|
645
|
+
if (unstaged.exitCode !== 0) {
|
|
646
|
+
return { ok: false, reason: "could not verify the clean worktree required for rebase" };
|
|
647
|
+
}
|
|
648
|
+
const staged = await runPlanningGit(["diff", "--cached", "--name-only", "-z"], {
|
|
649
|
+
cwd: projectRoot,
|
|
650
|
+
reject: false
|
|
651
|
+
});
|
|
652
|
+
if (staged.exitCode !== 0) {
|
|
653
|
+
return { ok: false, reason: "could not verify the staged paths required for rebase" };
|
|
654
|
+
}
|
|
655
|
+
const managedPathSet = new Set(managedCommitPaths);
|
|
656
|
+
const hasUnrelatedStagedPath = splitNulTerminatedPaths(staged.stdout).some(
|
|
657
|
+
(stagedPath) => !managedPathSet.has(stagedPath)
|
|
658
|
+
);
|
|
659
|
+
if (hasUnrelatedStagedPath) {
|
|
660
|
+
return { ok: false, reason: "rebase requires an index without unrelated staged changes" };
|
|
661
|
+
}
|
|
662
|
+
return { ok: true };
|
|
663
|
+
}
|
|
664
|
+
async function assertManagedSyncRepositoryState(projectRoot) {
|
|
665
|
+
for (const marker of ["rebase-merge", "rebase-apply"]) {
|
|
666
|
+
const markerResult = await runPlanningGit(["rev-parse", "--git-path", marker], {
|
|
667
|
+
cwd: projectRoot,
|
|
668
|
+
reject: false
|
|
669
|
+
});
|
|
670
|
+
if (markerResult.exitCode !== 0) continue;
|
|
671
|
+
const rawPath = markerResult.stdout.trim();
|
|
672
|
+
if (!rawPath) continue;
|
|
673
|
+
const markerPath = path3.isAbsolute(rawPath) ? rawPath : path3.resolve(projectRoot, rawPath);
|
|
674
|
+
if (existsSync(markerPath)) {
|
|
675
|
+
throw new ManagedSyncBranchError(
|
|
676
|
+
"Managed auto-sync refuses while a rebase is in progress; finish or abort the rebase first"
|
|
677
|
+
);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
function isWithinRelPath(candidate, root) {
|
|
682
|
+
return candidate === root || candidate.startsWith(`${root}/`);
|
|
683
|
+
}
|
|
684
|
+
async function stageIgnoredTrackedPathsForSync(projectRoot, relRootPath) {
|
|
685
|
+
const trackedResult = await runPlanningGit(["ls-files", "-z", "--", relRootPath], {
|
|
686
|
+
cwd: projectRoot,
|
|
687
|
+
reject: false
|
|
688
|
+
});
|
|
689
|
+
if (trackedResult.exitCode !== 0 || trackedResult.stdout.length === 0) {
|
|
690
|
+
return [];
|
|
691
|
+
}
|
|
692
|
+
const trackedPaths = splitNulTerminatedPaths(trackedResult.stdout).filter(
|
|
693
|
+
(trackedPath) => isWithinRelPath(trackedPath, relRootPath)
|
|
694
|
+
);
|
|
695
|
+
if (trackedPaths.length === 0) {
|
|
696
|
+
return [];
|
|
697
|
+
}
|
|
698
|
+
const ignoredTrackedPaths = [];
|
|
699
|
+
for (const trackedPath of trackedPaths) {
|
|
700
|
+
const ignoreResult = await runPlanningGit(
|
|
701
|
+
["check-ignore", "--no-index", "-q", "--", trackedPath],
|
|
702
|
+
{
|
|
703
|
+
cwd: projectRoot,
|
|
704
|
+
reject: false
|
|
705
|
+
}
|
|
706
|
+
);
|
|
707
|
+
if (ignoreResult.exitCode === 0) {
|
|
708
|
+
ignoredTrackedPaths.push(trackedPath);
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
if (ignoredTrackedPaths.length === 0) {
|
|
712
|
+
return [];
|
|
713
|
+
}
|
|
714
|
+
const rmResult = await runPlanningGit(
|
|
715
|
+
["rm", "--cached", "--ignore-unmatch", "--", ...ignoredTrackedPaths],
|
|
716
|
+
{
|
|
717
|
+
cwd: projectRoot,
|
|
718
|
+
reject: false
|
|
719
|
+
}
|
|
720
|
+
);
|
|
721
|
+
if (rmResult.exitCode !== 0) {
|
|
722
|
+
return [];
|
|
723
|
+
}
|
|
724
|
+
return ignoredTrackedPaths;
|
|
725
|
+
}
|
|
726
|
+
async function stageGeneratedPlanningIndexCacheUntracking(projectRoot) {
|
|
727
|
+
return stageIgnoredTrackedPathsForSync(projectRoot, GENERATED_PLANNING_INDEX_CACHE_REL_PATH);
|
|
728
|
+
}
|
|
729
|
+
async function hasStagedChanges(projectRoot) {
|
|
730
|
+
const result = await runPlanningGit(["diff", "--cached", "--quiet"], {
|
|
731
|
+
cwd: projectRoot,
|
|
732
|
+
reject: false
|
|
733
|
+
});
|
|
734
|
+
return result.exitCode !== 0;
|
|
735
|
+
}
|
|
736
|
+
var ManagedSyncPathError = class extends Error {
|
|
737
|
+
detail;
|
|
738
|
+
paths;
|
|
739
|
+
/** Distinguishes a proven ignore refusal from a staging attempt outside Git. */
|
|
740
|
+
kind;
|
|
741
|
+
constructor(detail, paths, kind = "stage-failure") {
|
|
742
|
+
super(paths.length > 0 ? `${detail}: ${paths.join(", ")}` : detail);
|
|
743
|
+
this.name = "ManagedSyncPathError";
|
|
744
|
+
this.detail = detail;
|
|
745
|
+
this.paths = paths;
|
|
746
|
+
this.kind = kind;
|
|
747
|
+
}
|
|
748
|
+
};
|
|
749
|
+
function isRepositoryGitignoreSource(projectRoot, source) {
|
|
750
|
+
const resolvedSource = path3.resolve(projectRoot, source);
|
|
751
|
+
const relativeSource = path3.relative(path3.resolve(projectRoot), resolvedSource);
|
|
752
|
+
return source.length > 0 && path3.basename(resolvedSource) === ".gitignore" && relativeSource !== ".." && !relativeSource.startsWith(`..${path3.sep}`) && !path3.isAbsolute(relativeSource);
|
|
753
|
+
}
|
|
754
|
+
async function resolveSyncableManagedPaths(projectRoot, relativePaths) {
|
|
755
|
+
const resolved = { syncablePaths: [], unstageablePaths: [] };
|
|
756
|
+
for (const relativePath of relativePaths) {
|
|
757
|
+
const present = existsSync(path3.resolve(projectRoot, relativePath));
|
|
758
|
+
const probe = present ? { args: ["check-ignore", "-q", "--", relativePath], refusedExitCode: 0 } : { args: ["ls-files", "--error-unmatch", "--", relativePath], refusedExitCode: 1 };
|
|
759
|
+
const probed = await runPlanningGit(probe.args, { cwd: projectRoot, reject: false });
|
|
760
|
+
const refused = probed.exitCode === probe.refusedExitCode;
|
|
761
|
+
if (present && refused) {
|
|
762
|
+
const winningRule = await runPlanningGit(["check-ignore", "--stdin", "-v", "-z"], {
|
|
763
|
+
cwd: projectRoot,
|
|
764
|
+
input: `${relativePath}\0`,
|
|
765
|
+
reject: false
|
|
766
|
+
});
|
|
767
|
+
const source = winningRule.stdout.split("\0")[0] ?? "";
|
|
768
|
+
if (winningRule.exitCode !== 0 || !isRepositoryGitignoreSource(projectRoot, source)) {
|
|
769
|
+
throw new ManagedSyncPathError(
|
|
770
|
+
"Required managed paths are unexpectedly ignored outside repository .gitignore rules",
|
|
771
|
+
[relativePath],
|
|
772
|
+
"unexpected-ignore"
|
|
773
|
+
);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
(refused ? resolved.unstageablePaths : resolved.syncablePaths).push(relativePath);
|
|
777
|
+
}
|
|
778
|
+
return resolved;
|
|
779
|
+
}
|
|
780
|
+
async function addManagedSyncPaths(projectRoot, paths) {
|
|
781
|
+
if (paths.length === 0) return;
|
|
782
|
+
const added = await runPlanningGit(["add", "--", ...paths], { cwd: projectRoot, reject: false });
|
|
783
|
+
if (added.exitCode !== 0) {
|
|
784
|
+
throw new ManagedSyncPathError("git add failed for managed paths", paths);
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
async function stageManagedSyncPaths(projectRoot, relativePaths, hadPreexistingStagedChanges) {
|
|
788
|
+
const captured = await captureManagedSyncStaging(
|
|
789
|
+
projectRoot,
|
|
790
|
+
relativePaths,
|
|
791
|
+
hadPreexistingStagedChanges
|
|
792
|
+
);
|
|
793
|
+
await addManagedSyncPaths(projectRoot, relativePaths);
|
|
794
|
+
const generatedCacheUntrackedPaths = hadPreexistingStagedChanges ? [] : await stageGeneratedPlanningIndexCacheUntracking(projectRoot);
|
|
795
|
+
return {
|
|
796
|
+
stagingState: {
|
|
797
|
+
overlappingStagedSnapshots: captured.overlappingStagedSnapshots,
|
|
798
|
+
pathsStagedByThisSync: [...captured.pathsThisSyncWillStage, ...generatedCacheUntrackedPaths]
|
|
799
|
+
},
|
|
800
|
+
generatedCacheUntrackedPaths
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
async function verifyManagedSyncPushBoundary(projectRoot, remote, remoteBranch, preSyncHeadSha, remoteBranchExists, commitContext) {
|
|
804
|
+
if (!preSyncHeadSha) {
|
|
805
|
+
return {
|
|
806
|
+
ok: false,
|
|
807
|
+
reason: "could not resolve the pre-sync commit",
|
|
808
|
+
kind: "unresolved-base",
|
|
809
|
+
blockCommit: false
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranchExists ? remoteBranch : "HEAD")) {
|
|
813
|
+
return {
|
|
814
|
+
ok: false,
|
|
815
|
+
reason: "upstream remote or branch name is not a safe git identifier",
|
|
816
|
+
kind: "unresolved-base",
|
|
817
|
+
blockCommit: false
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
const drift = await storageDriftRefusalAtPublication(projectRoot, remote);
|
|
821
|
+
if (drift) return { ok: false, ...drift };
|
|
822
|
+
const fetchResult = await runPlanningGit(
|
|
823
|
+
remoteBranchExists ? ["fetch", "--", remote, remoteBranch] : ["fetch", "--", remote],
|
|
824
|
+
{
|
|
825
|
+
cwd: projectRoot,
|
|
826
|
+
reject: false
|
|
827
|
+
}
|
|
828
|
+
);
|
|
829
|
+
if (fetchResult.exitCode !== 0) {
|
|
830
|
+
return {
|
|
831
|
+
ok: false,
|
|
832
|
+
reason: `fetch failed: ${firstGitLine(fetchResult.stderr ?? fetchResult.stdout)}`,
|
|
833
|
+
kind: "fetch-failed",
|
|
834
|
+
blockCommit: false
|
|
835
|
+
};
|
|
836
|
+
}
|
|
837
|
+
const ancestryResult = remoteBranchExists ? await runPlanningGit(["merge-base", "--is-ancestor", preSyncHeadSha, "FETCH_HEAD"], {
|
|
838
|
+
cwd: projectRoot,
|
|
839
|
+
reject: false
|
|
840
|
+
}) : await runPlanningGit(
|
|
841
|
+
[
|
|
842
|
+
"for-each-ref",
|
|
843
|
+
"--format=%(refname)",
|
|
844
|
+
"--contains",
|
|
845
|
+
preSyncHeadSha,
|
|
846
|
+
`refs/remotes/${remote}/`
|
|
847
|
+
],
|
|
848
|
+
{ cwd: projectRoot, reject: false }
|
|
849
|
+
);
|
|
850
|
+
const baseIsPublished = ancestryResult.exitCode === 0 && (remoteBranchExists || ancestryResult.stdout.trim().length > 0);
|
|
851
|
+
if (!baseIsPublished) {
|
|
852
|
+
return {
|
|
853
|
+
ok: false,
|
|
854
|
+
reason: "the local branch already contained commits not present on the remote before managed sync",
|
|
855
|
+
kind: "unpublished-base",
|
|
856
|
+
blockCommit: true
|
|
857
|
+
};
|
|
858
|
+
}
|
|
859
|
+
if (remoteBranchExists && commitContext && !isRefspecPushTopology(commitContext.branch, remoteBranch)) {
|
|
860
|
+
const readiness = await verifyManagedSyncRebasePrecondition(projectRoot, commitContext.paths);
|
|
861
|
+
if (!readiness.ok) {
|
|
862
|
+
return { ...readiness, kind: "rebase-precondition", blockCommit: true };
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
return { ok: true };
|
|
866
|
+
}
|
|
867
|
+
async function readManagedSyncTarget(projectRoot, targetBranch) {
|
|
868
|
+
const git = (args) => runPlanningGit(args, { cwd: projectRoot, reject: false });
|
|
869
|
+
let current = await git(["branch", "--show-current"]);
|
|
870
|
+
if (!current.stdout.trim()) current = await git(["rev-parse", "--abbrev-ref", "HEAD"]);
|
|
871
|
+
const branch = current.exitCode === 0 ? current.stdout.trim() : "";
|
|
872
|
+
const upstream = await git(["rev-parse", "--abbrev-ref", `${branch}@{upstream}`]);
|
|
873
|
+
const hasUpstream = upstream.exitCode === 0;
|
|
874
|
+
const slash = upstream.stdout.trim().indexOf("/");
|
|
875
|
+
const remote = !targetBranch && hasUpstream && slash > 0 ? upstream.stdout.trim().slice(0, slash) : "origin";
|
|
876
|
+
const remoteBranch = targetBranch ?? (hasUpstream && slash > 0 ? upstream.stdout.trim().slice(slash + 1) : branch);
|
|
877
|
+
return { branch, remote, remoteBranch, hasUpstream };
|
|
878
|
+
}
|
|
879
|
+
var ManagedPublicationAcquisitionError = class extends Error {
|
|
880
|
+
outcome = { synced: false, status: "staged" };
|
|
881
|
+
constructor(cause) {
|
|
882
|
+
const detail = cause instanceof Error ? cause.message : String(cause);
|
|
883
|
+
super(`Not committed: local work preserved; sync incomplete (${detail})`, { cause });
|
|
884
|
+
this.name = "ManagedPublicationAcquisitionError";
|
|
885
|
+
}
|
|
886
|
+
};
|
|
887
|
+
async function prepareManagedSyncPublication(projectRoot, options = {}) {
|
|
888
|
+
const target = await readManagedSyncTarget(projectRoot, options.targetBranch);
|
|
889
|
+
if (options.prepareOnly || !isSafeGitRemoteAndRef(target.remote, target.remoteBranch))
|
|
890
|
+
return target;
|
|
891
|
+
const readDestination = async () => {
|
|
892
|
+
const result = await runPlanningGit(["remote", "get-url", "--push", "--all", target.remote], {
|
|
893
|
+
cwd: projectRoot,
|
|
894
|
+
reject: false
|
|
895
|
+
});
|
|
896
|
+
if (result.exitCode !== 0 && !isMissingRemoteError(result.stderr))
|
|
897
|
+
throw new Error("Cannot resolve managed publication destination");
|
|
898
|
+
const urls = result.stdout.trim().split(/\r?\n/).filter(Boolean);
|
|
899
|
+
const repositories = urls.map(repositoryFromGitHubRemoteUrl);
|
|
900
|
+
if (urls.length > 1 && repositories.some(Boolean))
|
|
901
|
+
throw new Error("Managed publication requires one GitHub push destination");
|
|
902
|
+
return repositories[0]?.toLowerCase();
|
|
903
|
+
};
|
|
904
|
+
const repository = await readDestination();
|
|
905
|
+
if (!repository) return target;
|
|
906
|
+
if (!options.targetBranch) await assertManagedSyncBranch(projectRoot, target.branch);
|
|
907
|
+
const { acquirePublicationTurn } = await import("./publication-turn-S42RZTQF.js");
|
|
908
|
+
const turn = await acquirePublicationTurn({
|
|
909
|
+
repository,
|
|
910
|
+
targetBranch: target.remoteBranch,
|
|
911
|
+
ownerId: options.ownerId ?? `managed-sync:${randomUUID()}`,
|
|
912
|
+
recover: Boolean(options.ownerId)
|
|
913
|
+
}).catch((cause) => {
|
|
914
|
+
throw new ManagedPublicationAcquisitionError(cause);
|
|
915
|
+
});
|
|
916
|
+
try {
|
|
917
|
+
await turn.assertOwned();
|
|
918
|
+
const fresh = await readManagedSyncTarget(projectRoot, options.targetBranch);
|
|
919
|
+
if (JSON.stringify(fresh) !== JSON.stringify(target) || await readDestination() !== repository)
|
|
920
|
+
throw new Error("Managed publication destination changed while waiting; retry sync");
|
|
921
|
+
return { ...fresh, turn };
|
|
922
|
+
} catch (error) {
|
|
923
|
+
await turn.release();
|
|
924
|
+
throw error;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
async function syncPlanningFiles(projectRoot, filePaths, commitMessage, options = {}) {
|
|
928
|
+
if (options.deferPublication && codeCheckoutCarriesSharedBuckets(projectRoot)) {
|
|
929
|
+
return { synced: false, status: "skipped" };
|
|
930
|
+
}
|
|
931
|
+
const dispatched = await dispatchManagedSync(projectRoot, {
|
|
932
|
+
paths: filePaths,
|
|
933
|
+
message: commitMessage,
|
|
934
|
+
verbose: options.silent !== true,
|
|
935
|
+
...options.deferPublication ? { deferPublication: true } : {},
|
|
936
|
+
legacySync: () => syncPlanningFilesInCheckout(projectRoot, filePaths, commitMessage, options)
|
|
937
|
+
});
|
|
938
|
+
return dispatched.outcome;
|
|
939
|
+
}
|
|
940
|
+
async function syncPlanningFilesInCheckout(projectRoot, filePaths, commitMessage, options) {
|
|
941
|
+
const emitWarning = (message) => {
|
|
942
|
+
if (options.warningsToStderr) {
|
|
943
|
+
console.error(chalk.yellow(` ${message}`));
|
|
944
|
+
} else if (!options.silent) {
|
|
945
|
+
console.log(chalk.yellow(` ${message}`));
|
|
946
|
+
}
|
|
947
|
+
};
|
|
948
|
+
const warnOrThrow = (message) => {
|
|
949
|
+
if (options.strict) {
|
|
950
|
+
throw new Error(message);
|
|
951
|
+
}
|
|
952
|
+
emitWarning(message);
|
|
953
|
+
};
|
|
954
|
+
const warnOrThrowRemoteSync = (message) => {
|
|
955
|
+
if (options.strict && !options.allowPushFailure) {
|
|
956
|
+
throw new Error(message);
|
|
957
|
+
}
|
|
958
|
+
emitWarning(message);
|
|
959
|
+
};
|
|
960
|
+
let turn;
|
|
961
|
+
const stagingState = {
|
|
962
|
+
pathsStagedByThisSync: [],
|
|
963
|
+
overlappingStagedSnapshots: []
|
|
964
|
+
};
|
|
965
|
+
try {
|
|
966
|
+
const relativePaths = [
|
|
967
|
+
...new Set(filePaths.map((fp) => toRepoRelativePath(projectRoot, fp)))
|
|
968
|
+
].filter((fp) => fp.length > 0);
|
|
969
|
+
if (relativePaths.length === 0) {
|
|
970
|
+
if (options.strict && options.requireStagedChanges) {
|
|
971
|
+
throw new Error("Sync made no staged changes: no managed paths were provided");
|
|
972
|
+
}
|
|
973
|
+
return { synced: false, status: "skipped" };
|
|
974
|
+
}
|
|
975
|
+
const publication = await prepareManagedSyncPublication(projectRoot);
|
|
976
|
+
turn = publication.turn;
|
|
977
|
+
const { branch, remote, remoteBranch, hasUpstream } = publication;
|
|
978
|
+
await assertManagedSyncRepositoryState(projectRoot);
|
|
979
|
+
const { syncablePaths } = await resolveSyncableManagedPaths(projectRoot, relativePaths);
|
|
980
|
+
const homePathRefusal = await findEmbeddedHomePathRefusal(projectRoot, syncablePaths);
|
|
981
|
+
if (homePathRefusal) {
|
|
982
|
+
warnOrThrow(homePathRefusal);
|
|
983
|
+
return { synced: false, status: "skipped" };
|
|
984
|
+
}
|
|
985
|
+
const hadPreexistingStagedChanges = await hasStagedChanges(projectRoot);
|
|
986
|
+
const capturedStaging = await captureManagedSyncStaging(
|
|
987
|
+
projectRoot,
|
|
988
|
+
syncablePaths,
|
|
989
|
+
hadPreexistingStagedChanges
|
|
990
|
+
);
|
|
991
|
+
const pathsThisSyncWillStage = capturedStaging.pathsThisSyncWillStage;
|
|
992
|
+
stagingState.overlappingStagedSnapshots = capturedStaging.overlappingStagedSnapshots;
|
|
993
|
+
const generatedCacheUntrackedPaths = hadPreexistingStagedChanges ? [] : await stageGeneratedPlanningIndexCacheUntracking(projectRoot);
|
|
994
|
+
const canCommitAllStaged = generatedCacheUntrackedPaths.length > 0;
|
|
995
|
+
const commitPaths = [...syncablePaths, ...generatedCacheUntrackedPaths];
|
|
996
|
+
const commitManagedPaths = async () => {
|
|
997
|
+
await turn?.assertOwned();
|
|
998
|
+
const { resolveGitMessageStyle } = await import("./git-message-style-KCXGMTDT.js");
|
|
999
|
+
const message = styleManagedCommitMessage(commitMessage, resolveGitMessageStyle(projectRoot));
|
|
1000
|
+
return runPlanningGit(
|
|
1001
|
+
canCommitAllStaged ? ["commit", "-m", message] : ["commit", "-m", message, "--", ...commitPaths],
|
|
1002
|
+
{ cwd: projectRoot, reject: false, timeoutMs: GIT_HOOK_COMMIT_TIMEOUT_MS }
|
|
1003
|
+
);
|
|
1004
|
+
};
|
|
1005
|
+
if (commitPaths.length === 0) {
|
|
1006
|
+
if (options.strict && options.requireStagedChanges) {
|
|
1007
|
+
throw new Error(
|
|
1008
|
+
`Sync made no staged changes for ignored paths: ${relativePaths.join(", ")}`
|
|
1009
|
+
);
|
|
1010
|
+
}
|
|
1011
|
+
return { synced: false, status: "skipped" };
|
|
1012
|
+
}
|
|
1013
|
+
await addManagedSyncPaths(projectRoot, syncablePaths);
|
|
1014
|
+
stagingState.pathsStagedByThisSync = [
|
|
1015
|
+
...pathsThisSyncWillStage,
|
|
1016
|
+
...generatedCacheUntrackedPaths
|
|
1017
|
+
];
|
|
1018
|
+
const diffResult = await runPlanningGit(
|
|
1019
|
+
canCommitAllStaged ? ["diff", "--cached", "--quiet"] : ["diff", "--cached", "--quiet", "--", ...commitPaths],
|
|
1020
|
+
{
|
|
1021
|
+
cwd: projectRoot,
|
|
1022
|
+
reject: false
|
|
1023
|
+
}
|
|
1024
|
+
);
|
|
1025
|
+
if (diffResult.exitCode === 0) {
|
|
1026
|
+
if (options.strict && options.requireStagedChanges) {
|
|
1027
|
+
throw new Error(`Sync made no staged changes for: ${commitPaths.join(", ")}`);
|
|
1028
|
+
}
|
|
1029
|
+
return { synced: false, status: "skipped" };
|
|
1030
|
+
}
|
|
1031
|
+
if (!branch || branch === "HEAD") {
|
|
1032
|
+
throw new ManagedSyncBranchError(
|
|
1033
|
+
"Managed auto-sync refuses a detached HEAD; check out an eligible branch first"
|
|
1034
|
+
);
|
|
1035
|
+
}
|
|
1036
|
+
await assertManagedSyncBranch(projectRoot, branch);
|
|
1037
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranch)) {
|
|
1038
|
+
const unsafeCommit = await commitManagedPaths();
|
|
1039
|
+
if (unsafeCommit.exitCode !== 0) {
|
|
1040
|
+
warnOrThrow(`Commit failed: ${unsafeCommit.stderr?.split("\n")[0] ?? "unknown"}`);
|
|
1041
|
+
return { synced: false, status: "failed" };
|
|
1042
|
+
}
|
|
1043
|
+
warnOrThrowRemoteSync(
|
|
1044
|
+
"Committed locally but upstream remote or branch name is not a safe git identifier - push skipped"
|
|
1045
|
+
);
|
|
1046
|
+
return { synced: false, status: "local-only" };
|
|
1047
|
+
}
|
|
1048
|
+
const { preSyncHeadSha, remoteBranchResult, remoteBranchExists } = await readManagedSyncPublicationBase(projectRoot, remote, remoteBranch);
|
|
1049
|
+
if (remoteBranchResult.exitCode !== 0 && isMissingRemoteError(`${remoteBranchResult.stderr ?? ""}
|
|
1050
|
+
${remoteBranchResult.stdout ?? ""}`)) {
|
|
1051
|
+
const offlineCommit = await commitManagedPaths();
|
|
1052
|
+
if (offlineCommit.exitCode !== 0) {
|
|
1053
|
+
warnOrThrow(`Commit failed: ${offlineCommit.stderr?.split("\n")[0] ?? "unknown"}`);
|
|
1054
|
+
return { synced: false, status: "failed" };
|
|
1055
|
+
}
|
|
1056
|
+
warnOrThrowRemoteSync("Committed locally; no remote repository configured - push skipped");
|
|
1057
|
+
return offlineOutcome(await isRemoteConfigured(projectRoot, remote));
|
|
1058
|
+
}
|
|
1059
|
+
const pushBoundary = await verifyManagedSyncPushBoundary(
|
|
1060
|
+
projectRoot,
|
|
1061
|
+
remote,
|
|
1062
|
+
remoteBranch,
|
|
1063
|
+
preSyncHeadSha,
|
|
1064
|
+
remoteBranchExists,
|
|
1065
|
+
{ branch, paths: commitPaths }
|
|
1066
|
+
);
|
|
1067
|
+
if (!pushBoundary.ok && pushBoundary.blockCommit) {
|
|
1068
|
+
warnOrThrowRemoteSync(
|
|
1069
|
+
`Not committed: ${pushBoundary.reason} - managed changes left staged, push skipped`
|
|
1070
|
+
);
|
|
1071
|
+
return { synced: false, status: "staged" };
|
|
1072
|
+
}
|
|
1073
|
+
const refspecTopology = isRefspecPushTopology(branch, remoteBranch);
|
|
1074
|
+
const commitResult = await commitManagedPaths();
|
|
1075
|
+
if (commitResult.exitCode !== 0) {
|
|
1076
|
+
warnOrThrow(`Commit failed: ${commitResult.stderr?.split("\n")[0] ?? "unknown"}`);
|
|
1077
|
+
return { synced: false, status: "failed" };
|
|
1078
|
+
}
|
|
1079
|
+
if (!pushBoundary.ok) {
|
|
1080
|
+
warnOrThrowRemoteSync(`Committed locally but ${pushBoundary.reason} - push skipped`);
|
|
1081
|
+
return { synced: false, status: "local-only" };
|
|
1082
|
+
}
|
|
1083
|
+
const pushed = await pushManagedCommitWithRetry({
|
|
1084
|
+
projectRoot,
|
|
1085
|
+
remote,
|
|
1086
|
+
remoteBranch,
|
|
1087
|
+
hasUpstream,
|
|
1088
|
+
remoteBranchExists,
|
|
1089
|
+
refspecTopology,
|
|
1090
|
+
preSyncHeadSha,
|
|
1091
|
+
commitPaths,
|
|
1092
|
+
verifyPaths: syncablePaths,
|
|
1093
|
+
turn,
|
|
1094
|
+
refreshBoundary: () => verifyManagedSyncPushBoundary(projectRoot, remote, remoteBranch, preSyncHeadSha, true)
|
|
1095
|
+
});
|
|
1096
|
+
if (pushed.kind === "synced") {
|
|
1097
|
+
if (!options.silent) {
|
|
1098
|
+
console.log(chalk.gray(" Synced to remote"));
|
|
1099
|
+
}
|
|
1100
|
+
return { synced: true, status: "synced" };
|
|
1101
|
+
}
|
|
1102
|
+
if (pushed.kind === "push-failed" && pushed.missingRemote) {
|
|
1103
|
+
warnOrThrowRemoteSync("Committed locally; no remote repository configured - push skipped");
|
|
1104
|
+
return offlineOutcome(await isRemoteConfigured(projectRoot, remote));
|
|
1105
|
+
}
|
|
1106
|
+
warnOrThrowRemoteSync(pushed.message);
|
|
1107
|
+
return { synced: false, status: pushed.kind === "unverified" ? "unverified" : "local-only" };
|
|
1108
|
+
} catch (error) {
|
|
1109
|
+
if (error instanceof ManagedPublicationAcquisitionError && !options.strict) {
|
|
1110
|
+
emitWarning(error.message);
|
|
1111
|
+
return error.outcome;
|
|
1112
|
+
}
|
|
1113
|
+
if (isManagedSyncBranchError(error)) {
|
|
1114
|
+
await abandonManagedSyncStaging(projectRoot, stagingState);
|
|
1115
|
+
throw error;
|
|
1116
|
+
}
|
|
1117
|
+
if (options.strict || error instanceof ManagedSyncPathError && (error.kind === "unexpected-ignore" || await isInsideGitWorkTree(projectRoot))) {
|
|
1118
|
+
throw error;
|
|
1119
|
+
}
|
|
1120
|
+
emitWarning(`Auto-sync failed: ${error.message?.split("\n")[0] ?? "unknown error"}`);
|
|
1121
|
+
return { synced: false, status: "failed" };
|
|
1122
|
+
} finally {
|
|
1123
|
+
await turn?.release();
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
async function isRemoteConfigured(projectRoot, remote) {
|
|
1127
|
+
const result = await runPlanningGit(["config", "--get", `remote.${remote}.url`], {
|
|
1128
|
+
cwd: projectRoot,
|
|
1129
|
+
reject: false
|
|
1130
|
+
});
|
|
1131
|
+
return result.exitCode === 0 && result.stdout.trim().length > 0;
|
|
1132
|
+
}
|
|
1133
|
+
function offlineOutcome(remoteConfigured) {
|
|
1134
|
+
return remoteConfigured ? { synced: false, status: "local-only" } : { synced: false, status: "local-only", noRemote: true };
|
|
1135
|
+
}
|
|
1136
|
+
async function isInsideGitWorkTree(projectRoot) {
|
|
1137
|
+
const result = await runPlanningGit(["rev-parse", "--is-inside-work-tree"], {
|
|
1138
|
+
cwd: projectRoot,
|
|
1139
|
+
reject: false
|
|
1140
|
+
}).catch(() => void 0);
|
|
1141
|
+
return result?.exitCode === 0 && result.stdout.trim() === "true";
|
|
1142
|
+
}
|
|
1143
|
+
var CHECKOUT_UNPUBLISHED_STATUSES = /* @__PURE__ */ new Set([
|
|
1144
|
+
"failed",
|
|
1145
|
+
"local-only",
|
|
1146
|
+
"staged",
|
|
1147
|
+
"unverified"
|
|
1148
|
+
]);
|
|
1149
|
+
async function syncManagedItemFiles(projectRoot, filePaths, commitMessage, options = {}) {
|
|
1150
|
+
if (options.sync === false) {
|
|
1151
|
+
return { synced: false };
|
|
1152
|
+
}
|
|
1153
|
+
const deferred = isDeferSyncEnabled();
|
|
1154
|
+
if (deferred && codeCheckoutCarriesSharedBuckets(projectRoot)) {
|
|
1155
|
+
return { synced: false };
|
|
1156
|
+
}
|
|
1157
|
+
try {
|
|
1158
|
+
const dispatched = await dispatchManagedSync(projectRoot, {
|
|
1159
|
+
paths: filePaths,
|
|
1160
|
+
message: commitMessage,
|
|
1161
|
+
verbose: options.silent !== true,
|
|
1162
|
+
...deferred ? { deferPublication: true } : {},
|
|
1163
|
+
legacySync: () => syncPlanningFilesInCheckout(projectRoot, filePaths, commitMessage, {
|
|
1164
|
+
silent: options.silent ?? false,
|
|
1165
|
+
warningsToStderr: options.warningsToStderr ?? false
|
|
1166
|
+
})
|
|
1167
|
+
});
|
|
1168
|
+
if (dispatched.reason && !dispatched.outcome.synced) {
|
|
1169
|
+
const message = `Managed publication ${dispatched.outcome.status}: ${dispatched.reason}`;
|
|
1170
|
+
if (options.warningsToStderr) console.error(chalk.yellow(` ${message}`));
|
|
1171
|
+
else if (!options.silent) console.log(chalk.yellow(` ${message}`));
|
|
1172
|
+
}
|
|
1173
|
+
const unpublished = dispatched.backend !== "git-branch" && !dispatched.outcome.noRemote && CHECKOUT_UNPUBLISHED_STATUSES.has(dispatched.outcome.status) && await isInsideGitWorkTree(projectRoot);
|
|
1174
|
+
return unpublished ? { synced: dispatched.outcome.synced, unpublished: true } : { synced: dispatched.outcome.synced };
|
|
1175
|
+
} catch (error) {
|
|
1176
|
+
if (!isManagedSyncBranchError(error)) {
|
|
1177
|
+
throw error;
|
|
1178
|
+
}
|
|
1179
|
+
if (options.warningsToStderr) {
|
|
1180
|
+
console.error(chalk.yellow(` ${formatManagedSyncBranchError(error)}`));
|
|
1181
|
+
} else if (!options.silent) {
|
|
1182
|
+
console.log(chalk.yellow(` ${formatManagedSyncBranchError(error)}`));
|
|
1183
|
+
}
|
|
1184
|
+
return { synced: false, syncStatus: "refused-branch" };
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
export {
|
|
1189
|
+
runPlanningGit,
|
|
1190
|
+
readManagedSyncPublicationBase,
|
|
1191
|
+
abandonManagedSyncStaging,
|
|
1192
|
+
verifyRemoteSyncPush,
|
|
1193
|
+
isRefspecPushTopology,
|
|
1194
|
+
isMissingRemoteError,
|
|
1195
|
+
resolveManagedSyncPushCandidate,
|
|
1196
|
+
pushManagedCommitWithRetry,
|
|
1197
|
+
capCommitSubject,
|
|
1198
|
+
toStorageRelativePath,
|
|
1199
|
+
beginManagedSync,
|
|
1200
|
+
codeCheckoutCarriesSharedBuckets,
|
|
1201
|
+
backlogArchiveCopyPublishes,
|
|
1202
|
+
publishManagedSync,
|
|
1203
|
+
isDeferSyncEnabled,
|
|
1204
|
+
assertManagedSyncBranch,
|
|
1205
|
+
assertManagedSyncRepositoryState,
|
|
1206
|
+
hasStagedChanges,
|
|
1207
|
+
ManagedSyncPathError,
|
|
1208
|
+
resolveSyncableManagedPaths,
|
|
1209
|
+
stageManagedSyncPaths,
|
|
1210
|
+
verifyManagedSyncPushBoundary,
|
|
1211
|
+
ManagedPublicationAcquisitionError,
|
|
1212
|
+
prepareManagedSyncPublication,
|
|
1213
|
+
syncPlanningFiles,
|
|
1214
|
+
isInsideGitWorkTree,
|
|
1215
|
+
syncManagedItemFiles
|
|
1216
|
+
};
|
|
1217
|
+
//# sourceMappingURL=chunk-TRURQUBP.js.map
|