@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,1212 @@
|
|
|
1
|
+
import {
|
|
2
|
+
atomicWrite
|
|
3
|
+
} from "./chunk-4UMRUFBD.js";
|
|
4
|
+
import {
|
|
5
|
+
redactSensitiveConfig
|
|
6
|
+
} from "./chunk-3M57DADF.js";
|
|
7
|
+
import {
|
|
8
|
+
autoFixConfig,
|
|
9
|
+
isFirstTimeDefaultsInitialized,
|
|
10
|
+
registryErrorAtPath,
|
|
11
|
+
validateBuildConfig
|
|
12
|
+
} from "./chunk-HT5OCGKN.js";
|
|
13
|
+
import {
|
|
14
|
+
mergeConfigSources
|
|
15
|
+
} from "./chunk-U5KS22IN.js";
|
|
16
|
+
import {
|
|
17
|
+
resolveConfig
|
|
18
|
+
} from "./chunk-C3DH3NCY.js";
|
|
19
|
+
import {
|
|
20
|
+
getActiveProfilePath,
|
|
21
|
+
loadAllConfigSources,
|
|
22
|
+
loadProjectConfig,
|
|
23
|
+
loadUserConfig
|
|
24
|
+
} from "./chunk-M4BUEXXF.js";
|
|
25
|
+
import {
|
|
26
|
+
mutateUserState,
|
|
27
|
+
readUserState
|
|
28
|
+
} from "./chunk-ZH4G3FU5.js";
|
|
29
|
+
import {
|
|
30
|
+
BuildConfigSchema,
|
|
31
|
+
DEFAULT_CONFIG,
|
|
32
|
+
DEFAULT_USER_PREFERENCES,
|
|
33
|
+
KNOWN_BUILD_CONFIG_ROOTS,
|
|
34
|
+
UserPreferencesSchema,
|
|
35
|
+
buildConfigCandidates,
|
|
36
|
+
isBuildConfigReadError,
|
|
37
|
+
selectedBuildConfigCandidate
|
|
38
|
+
} from "./chunk-FKCG7K6H.js";
|
|
39
|
+
import {
|
|
40
|
+
InvalidConfigContentError,
|
|
41
|
+
InvalidExplicitConfigError,
|
|
42
|
+
ProviderRegistry,
|
|
43
|
+
combineCacheFingerprints,
|
|
44
|
+
fingerprintEnvironment,
|
|
45
|
+
fingerprintFiles,
|
|
46
|
+
getConfiguredProviderRegistryPaths,
|
|
47
|
+
getProviderRegistryInputPaths
|
|
48
|
+
} from "./chunk-QJ6OEH4K.js";
|
|
49
|
+
import {
|
|
50
|
+
PROJECT_CONFIG_SCOPE_ERROR,
|
|
51
|
+
configDirWritable,
|
|
52
|
+
configExists,
|
|
53
|
+
ensureConfigDir,
|
|
54
|
+
findProjectRoot,
|
|
55
|
+
getConfigPaths,
|
|
56
|
+
projectConfigAliasesUserConfig
|
|
57
|
+
} from "./chunk-35J4NE6S.js";
|
|
58
|
+
import {
|
|
59
|
+
BUILD_CONFIG_ALLOW_DEFAULT_FALLBACK,
|
|
60
|
+
emitWarning,
|
|
61
|
+
readEnv
|
|
62
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
63
|
+
|
|
64
|
+
// src/core/config/config-manager.ts
|
|
65
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2, unlinkSync } from "fs";
|
|
66
|
+
import { z } from "zod";
|
|
67
|
+
|
|
68
|
+
// src/core/config/config-jsonc-edits.ts
|
|
69
|
+
import { existsSync, readFileSync } from "fs";
|
|
70
|
+
import { dirname } from "path";
|
|
71
|
+
import { applyEdits, modify } from "jsonc-parser";
|
|
72
|
+
import lockfile from "proper-lockfile";
|
|
73
|
+
var LOCK_OPTIONS = { stale: 1e4, realpath: false };
|
|
74
|
+
var LOCK_RETRIES = 50;
|
|
75
|
+
var LOCK_RETRY_MS = 50;
|
|
76
|
+
function lockConfigFileSync(filePath) {
|
|
77
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
78
|
+
try {
|
|
79
|
+
return lockfile.lockSync(filePath, LOCK_OPTIONS);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (error.code !== "ELOCKED" || attempt >= LOCK_RETRIES) {
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, LOCK_RETRY_MS);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function writeJsoncEdits(filePath, edits, baseDir) {
|
|
89
|
+
let release;
|
|
90
|
+
try {
|
|
91
|
+
release = lockConfigFileSync(filePath);
|
|
92
|
+
return editJsoncFile(filePath, edits, baseDir);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
return { success: false, error: error instanceof Error ? error.message : "Unknown error" };
|
|
95
|
+
} finally {
|
|
96
|
+
release?.();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function editOrCreateJsoncConfig(filePath, edits, baseDir, create) {
|
|
100
|
+
let release;
|
|
101
|
+
try {
|
|
102
|
+
if (!existsSync(dirname(filePath))) return await create();
|
|
103
|
+
release = await lockfile.lock(filePath, {
|
|
104
|
+
...LOCK_OPTIONS,
|
|
105
|
+
retries: { retries: LOCK_RETRIES, minTimeout: LOCK_RETRY_MS, maxTimeout: LOCK_RETRY_MS }
|
|
106
|
+
});
|
|
107
|
+
return existsSync(filePath) ? editJsoncFile(filePath, edits, baseDir) : await create();
|
|
108
|
+
} catch (error) {
|
|
109
|
+
return { success: false, error: error instanceof Error ? error.message : "Unknown error" };
|
|
110
|
+
} finally {
|
|
111
|
+
await release?.().catch(() => void 0);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function editJsoncFile(filePath, edits, baseDir) {
|
|
115
|
+
try {
|
|
116
|
+
let updated = readFileSync(filePath, "utf8");
|
|
117
|
+
for (const edit of edits) {
|
|
118
|
+
updated = applyEdits(
|
|
119
|
+
updated,
|
|
120
|
+
modify(updated, edit.path, edit.value, {
|
|
121
|
+
formattingOptions: {
|
|
122
|
+
insertSpaces: true,
|
|
123
|
+
tabSize: 2
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
const result = atomicWrite(filePath, updated.endsWith("\n") ? updated : `${updated}
|
|
129
|
+
`, {
|
|
130
|
+
baseDir
|
|
131
|
+
});
|
|
132
|
+
return result.success ? { success: true } : { success: false, error: result.error?.message };
|
|
133
|
+
} catch (error) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// src/core/config/user-preferences-state.ts
|
|
142
|
+
var USER_PREFERENCE_ROOT_KEYS = [
|
|
143
|
+
"version",
|
|
144
|
+
"userId",
|
|
145
|
+
"modelRouting",
|
|
146
|
+
"preferences",
|
|
147
|
+
"globalDefaults",
|
|
148
|
+
"migrations",
|
|
149
|
+
"firstTimeSetup"
|
|
150
|
+
];
|
|
151
|
+
function clone(value) {
|
|
152
|
+
return structuredClone(value);
|
|
153
|
+
}
|
|
154
|
+
function isPlainObject(value) {
|
|
155
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
156
|
+
}
|
|
157
|
+
function mergePreferenceValues(existing, incoming) {
|
|
158
|
+
if (!isPlainObject(existing) || !isPlainObject(incoming)) return clone(incoming);
|
|
159
|
+
const merged = clone(existing);
|
|
160
|
+
for (const [key, value] of Object.entries(incoming)) {
|
|
161
|
+
merged[key] = mergePreferenceValues(merged[key], value);
|
|
162
|
+
}
|
|
163
|
+
return merged;
|
|
164
|
+
}
|
|
165
|
+
function topLevelSetupInitialized(value) {
|
|
166
|
+
return isPlainObject(value) && isFirstTimeDefaultsInitialized({ firstTimeSetup: value });
|
|
167
|
+
}
|
|
168
|
+
function preferencesFromUserState(state) {
|
|
169
|
+
const defaults = clone(DEFAULT_USER_PREFERENCES);
|
|
170
|
+
const stored = {};
|
|
171
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) {
|
|
172
|
+
if (key in state) stored[key] = state[key];
|
|
173
|
+
}
|
|
174
|
+
const candidate = mergePreferenceValues(defaults, stored);
|
|
175
|
+
UserPreferencesSchema.parse(candidate);
|
|
176
|
+
return candidate;
|
|
177
|
+
}
|
|
178
|
+
function replacePreferencesInUserState(state, preferences) {
|
|
179
|
+
const source = preferences;
|
|
180
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) {
|
|
181
|
+
if (key in source) {
|
|
182
|
+
state[key] = clone(source[key]);
|
|
183
|
+
} else {
|
|
184
|
+
delete state[key];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function recoverValidPreferenceRoots(state) {
|
|
189
|
+
const recovered = clone(state);
|
|
190
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) delete recovered[key];
|
|
191
|
+
let candidate = clone(DEFAULT_USER_PREFERENCES);
|
|
192
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) {
|
|
193
|
+
if (!(key in state)) continue;
|
|
194
|
+
const trial = { ...candidate, [key]: clone(state[key]) };
|
|
195
|
+
if (UserPreferencesSchema.safeParse(trial).success) {
|
|
196
|
+
candidate = trial;
|
|
197
|
+
recovered[key] = clone(state[key]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return recovered;
|
|
201
|
+
}
|
|
202
|
+
function preferenceMutationOptions(filePath) {
|
|
203
|
+
return {
|
|
204
|
+
...filePath ? { filePath } : {},
|
|
205
|
+
validateExisting: (state) => {
|
|
206
|
+
preferencesFromUserState(state);
|
|
207
|
+
},
|
|
208
|
+
recoverInvalidExisting: recoverValidPreferenceRoots
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function readUserPreferencesState(filePath) {
|
|
212
|
+
const result = readUserState(filePath ? { filePath } : {});
|
|
213
|
+
return result.status === "valid" ? preferencesFromUserState(result.data) : null;
|
|
214
|
+
}
|
|
215
|
+
function snapshotUserPreferencesState(filePath) {
|
|
216
|
+
const result = readUserState(filePath ? { filePath } : {});
|
|
217
|
+
if (result.status !== "valid") return { status: result.status };
|
|
218
|
+
try {
|
|
219
|
+
return { status: "valid", preferences: preferencesFromUserState(result.data) };
|
|
220
|
+
} catch {
|
|
221
|
+
return { status: "corrupt" };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function restoreUserPreferencesState(snapshot, filePath) {
|
|
225
|
+
if (snapshot.status === "valid") {
|
|
226
|
+
return mutateUserState((state) => {
|
|
227
|
+
const replacement = clone(snapshot.preferences);
|
|
228
|
+
UserPreferencesSchema.parse(replacement);
|
|
229
|
+
replacePreferencesInUserState(state, replacement);
|
|
230
|
+
return replacement;
|
|
231
|
+
}, preferenceMutationOptions(filePath));
|
|
232
|
+
}
|
|
233
|
+
return mutateUserState(
|
|
234
|
+
(state) => {
|
|
235
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) delete state[key];
|
|
236
|
+
return null;
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
...filePath ? { filePath } : {},
|
|
240
|
+
deleteIfEmpty: true
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
function resetFirstRunPreferencesState(filePath) {
|
|
245
|
+
return mutateUserPreferencesState((preferences) => {
|
|
246
|
+
delete preferences.firstTimeSetup;
|
|
247
|
+
preferences.preferences.cursor.firstTimeSetup = { completed: false };
|
|
248
|
+
delete preferences.globalDefaults.defaultProvider;
|
|
249
|
+
return void 0;
|
|
250
|
+
}, filePath);
|
|
251
|
+
}
|
|
252
|
+
function mutateUserPreferencesState(mutator, filePath) {
|
|
253
|
+
return mutateUserState((state) => {
|
|
254
|
+
const preferences = preferencesFromUserState(state);
|
|
255
|
+
const value = mutator(preferences);
|
|
256
|
+
UserPreferencesSchema.parse(preferences);
|
|
257
|
+
replacePreferencesInUserState(state, preferences);
|
|
258
|
+
return { preferences, value };
|
|
259
|
+
}, preferenceMutationOptions(filePath));
|
|
260
|
+
}
|
|
261
|
+
function writeUserPreferencesState(preferences, filePath) {
|
|
262
|
+
return mutateUserState((state) => {
|
|
263
|
+
const existing = preferencesFromUserState(state);
|
|
264
|
+
const merged = mergePreferenceValues(existing, preferences);
|
|
265
|
+
UserPreferencesSchema.parse(merged);
|
|
266
|
+
replacePreferencesInUserState(state, merged);
|
|
267
|
+
return merged;
|
|
268
|
+
}, preferenceMutationOptions(filePath));
|
|
269
|
+
}
|
|
270
|
+
function replaceUserPreferencesState(preferences, filePath) {
|
|
271
|
+
return mutateUserState((state) => {
|
|
272
|
+
UserPreferencesSchema.parse(preferences);
|
|
273
|
+
const replacement = clone(preferences);
|
|
274
|
+
const existing = preferencesFromUserState(state);
|
|
275
|
+
const replacementTopLevelInitialized = topLevelSetupInitialized(replacement.firstTimeSetup);
|
|
276
|
+
const replacementInitialized = isFirstTimeDefaultsInitialized(replacement);
|
|
277
|
+
if (topLevelSetupInitialized(existing.firstTimeSetup) && !replacementTopLevelInitialized) {
|
|
278
|
+
replacement.firstTimeSetup = clone(existing.firstTimeSetup);
|
|
279
|
+
}
|
|
280
|
+
if (isFirstTimeDefaultsInitialized(existing) && !replacementInitialized) {
|
|
281
|
+
replacement.preferences.cursor.firstTimeSetup = clone(
|
|
282
|
+
existing.preferences.cursor.firstTimeSetup
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
replacePreferencesInUserState(state, replacement);
|
|
286
|
+
return replacement;
|
|
287
|
+
}, preferenceMutationOptions(filePath));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// src/core/config/config-manager.ts
|
|
291
|
+
function hasExplicitConfigSource(sources) {
|
|
292
|
+
return sources.some((source) => source.exists && source.type !== "default");
|
|
293
|
+
}
|
|
294
|
+
function allowInvalidConfigFallback() {
|
|
295
|
+
try {
|
|
296
|
+
return readEnv(BUILD_CONFIG_ALLOW_DEFAULT_FALLBACK).value === true;
|
|
297
|
+
} catch (error) {
|
|
298
|
+
throw new InvalidExplicitConfigError(
|
|
299
|
+
`Invalid BUILD_CONFIG_ALLOW_DEFAULT_FALLBACK value: ${error instanceof Error ? error.message : String(error)}`,
|
|
300
|
+
error
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function cloneConfigValue(value) {
|
|
305
|
+
return structuredClone(value);
|
|
306
|
+
}
|
|
307
|
+
function cloneMergedConfigResult(config) {
|
|
308
|
+
return cloneConfigValue(config);
|
|
309
|
+
}
|
|
310
|
+
function snapshotFile(filePath) {
|
|
311
|
+
return existsSync2(filePath) ? { status: "present", content: readFileSync2(filePath, "utf8") } : { status: "missing" };
|
|
312
|
+
}
|
|
313
|
+
function restoreFileSnapshot(filePath, snapshot, baseDir) {
|
|
314
|
+
if (snapshot.status === "present") {
|
|
315
|
+
const result = atomicWrite(filePath, snapshot.content, { baseDir });
|
|
316
|
+
if (!result.success) throw result.error ?? new Error(`Could not restore ${filePath}`);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
unlinkSync(filePath);
|
|
321
|
+
} catch (error) {
|
|
322
|
+
if (error.code !== "ENOENT") throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
function isPlaceholderModelDefault(registryDefault) {
|
|
326
|
+
const unqualified = registryDefault.trim().toLowerCase().split("/").pop() ?? "";
|
|
327
|
+
return unqualified === "auto" || unqualified === "default";
|
|
328
|
+
}
|
|
329
|
+
var ConfigManager = class {
|
|
330
|
+
cache = /* @__PURE__ */ new Map();
|
|
331
|
+
cacheHits = 0;
|
|
332
|
+
cacheMisses = 0;
|
|
333
|
+
options;
|
|
334
|
+
updateCursorModelQueue = Promise.resolve();
|
|
335
|
+
constructor(options = {}) {
|
|
336
|
+
this.options = {
|
|
337
|
+
enableCache: options.enableCache ?? true,
|
|
338
|
+
cacheTTL: options.cacheTTL ?? 5 * 60 * 1e3,
|
|
339
|
+
// 5 minutes
|
|
340
|
+
autoFix: options.autoFix ?? false,
|
|
341
|
+
cwd: options.cwd ?? process.cwd()
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
get paths() {
|
|
345
|
+
return getConfigPaths(this.options.cwd);
|
|
346
|
+
}
|
|
347
|
+
buildLoadCacheKey(cliFlags) {
|
|
348
|
+
const paths = this.paths;
|
|
349
|
+
const filePaths = [
|
|
350
|
+
...buildConfigCandidates(paths.projectConfigFile),
|
|
351
|
+
...buildConfigCandidates(paths.userConfigFile),
|
|
352
|
+
paths.userPreferencesFile,
|
|
353
|
+
getActiveProfilePath(),
|
|
354
|
+
...getProviderRegistryInputPaths(this.options.cwd)
|
|
355
|
+
].filter((value) => value !== void 0);
|
|
356
|
+
return JSON.stringify({
|
|
357
|
+
cliFlags,
|
|
358
|
+
cwd: this.options.cwd,
|
|
359
|
+
fingerprint: combineCacheFingerprints(
|
|
360
|
+
fingerprintEnvironment(process.env, () => true),
|
|
361
|
+
fingerprintFiles(filePaths)
|
|
362
|
+
)
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Load configuration from all sources with precedence
|
|
367
|
+
*
|
|
368
|
+
* @param cliFlags - CLI flag overrides
|
|
369
|
+
* @param forceReload - Skip cache and reload
|
|
370
|
+
* @returns Resolved configuration with metadata
|
|
371
|
+
*/
|
|
372
|
+
async loadConfig(cliFlags = {}, forceReload = false) {
|
|
373
|
+
const startTime = Date.now();
|
|
374
|
+
const cacheKey = this.buildLoadCacheKey(cliFlags);
|
|
375
|
+
try {
|
|
376
|
+
if (!forceReload && this.options.enableCache) {
|
|
377
|
+
const cached = this.getFromCache(cacheKey);
|
|
378
|
+
if (cached) {
|
|
379
|
+
return cached;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
const allowDefaultFallback = allowInvalidConfigFallback();
|
|
383
|
+
const explicitProviderRegistryPaths = getConfiguredProviderRegistryPaths(
|
|
384
|
+
this.options.cwd
|
|
385
|
+
).filter((path) => existsSync2(path));
|
|
386
|
+
if (explicitProviderRegistryPaths.length > 0) {
|
|
387
|
+
try {
|
|
388
|
+
ProviderRegistry.load(void 0, this.options.cwd);
|
|
389
|
+
} catch (error) {
|
|
390
|
+
if (!allowDefaultFallback) {
|
|
391
|
+
throw new InvalidExplicitConfigError(
|
|
392
|
+
`Invalid explicit provider registry: ${error instanceof Error ? error.message : String(error)}`,
|
|
393
|
+
error
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const sources = await loadAllConfigSources(this.options.cwd, cliFlags);
|
|
399
|
+
const mergeResult = mergeConfigSources(sources);
|
|
400
|
+
const validationResult = validateBuildConfig(mergeResult.mergedConfig, {
|
|
401
|
+
includeWarnings: true,
|
|
402
|
+
includeSuggestions: true,
|
|
403
|
+
cwd: this.options.cwd
|
|
404
|
+
});
|
|
405
|
+
let finalConfig = mergeResult.mergedConfig;
|
|
406
|
+
if (this.options.autoFix && !validationResult.isValid) {
|
|
407
|
+
const autoFixResult = autoFixConfig(mergeResult.mergedConfig);
|
|
408
|
+
if (autoFixResult.changes.length > 0) {
|
|
409
|
+
finalConfig = autoFixResult.fixedConfig;
|
|
410
|
+
emitWarning(
|
|
411
|
+
"CFG-002",
|
|
412
|
+
{
|
|
413
|
+
taskId: "config-manager",
|
|
414
|
+
subsystem: "config",
|
|
415
|
+
executionPhase: "setup"
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
severity: "INFO" /* INFO */,
|
|
419
|
+
metadata: {
|
|
420
|
+
changes: autoFixResult.changes,
|
|
421
|
+
operation: "loadConfig"
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
const finalValidationResult = finalConfig === mergeResult.mergedConfig ? validationResult : validateBuildConfig(finalConfig, {
|
|
428
|
+
includeWarnings: true,
|
|
429
|
+
includeSuggestions: true,
|
|
430
|
+
cwd: this.options.cwd
|
|
431
|
+
});
|
|
432
|
+
if (!finalValidationResult.isValid) {
|
|
433
|
+
const explicitConfigInvalid = hasExplicitConfigSource(sources) || getConfiguredProviderRegistryPaths(this.options.cwd).some((path) => existsSync2(path));
|
|
434
|
+
emitWarning(
|
|
435
|
+
"CFG-003",
|
|
436
|
+
{
|
|
437
|
+
taskId: "config-manager",
|
|
438
|
+
subsystem: "config",
|
|
439
|
+
executionPhase: "setup"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
severity: "ERROR" /* ERROR */,
|
|
443
|
+
metadata: {
|
|
444
|
+
operation: "loadConfig",
|
|
445
|
+
errors: finalValidationResult.errors,
|
|
446
|
+
sourceTypes: sources.filter((source) => source.exists).map((source) => source.type),
|
|
447
|
+
fallback: explicitConfigInvalid && !allowDefaultFallback ? "blocked-invalid-explicit-config" : "default-config"
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
);
|
|
451
|
+
if (explicitConfigInvalid && !allowDefaultFallback) {
|
|
452
|
+
throw new InvalidConfigContentError(
|
|
453
|
+
`Invalid explicit Build configuration: ${finalValidationResult.errors.map((err) => err.message).join("; ")}`
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
finalConfig = cloneConfigValue(DEFAULT_CONFIG);
|
|
457
|
+
}
|
|
458
|
+
const isFirstTimeUser = await this.detectFirstTimeUser();
|
|
459
|
+
const resolvedConfig = {
|
|
460
|
+
config: finalConfig,
|
|
461
|
+
sources,
|
|
462
|
+
isFirstTimeUser,
|
|
463
|
+
loadTime: Date.now() - startTime
|
|
464
|
+
};
|
|
465
|
+
this.validateProviderDefaultsConsistency(resolvedConfig.config);
|
|
466
|
+
if (this.options.enableCache) {
|
|
467
|
+
this.setCache(cacheKey, resolvedConfig);
|
|
468
|
+
}
|
|
469
|
+
return cloneMergedConfigResult(resolvedConfig);
|
|
470
|
+
} catch (error) {
|
|
471
|
+
if (error instanceof InvalidExplicitConfigError) {
|
|
472
|
+
throw error;
|
|
473
|
+
}
|
|
474
|
+
if (isBuildConfigReadError(error)) {
|
|
475
|
+
throw error;
|
|
476
|
+
}
|
|
477
|
+
throw error;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/** Registry-first execution defaults with source attribution. */
|
|
481
|
+
resolveExecutionConfig(cli = {}) {
|
|
482
|
+
return resolveConfig(cli, this.options.cwd, { strictSynthesisModel: false });
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Write user preferences atomically
|
|
486
|
+
*
|
|
487
|
+
* @param preferences - User preferences to write
|
|
488
|
+
* @returns Success status
|
|
489
|
+
*/
|
|
490
|
+
async writeUserPreferences(preferences) {
|
|
491
|
+
try {
|
|
492
|
+
const result = writeUserPreferencesState(preferences, this.paths.userPreferencesFile);
|
|
493
|
+
this.emitUserStateWarnings(result.warnings);
|
|
494
|
+
this.invalidateCache();
|
|
495
|
+
return { success: true };
|
|
496
|
+
} catch (error) {
|
|
497
|
+
return {
|
|
498
|
+
success: false,
|
|
499
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Load user preferences
|
|
505
|
+
*
|
|
506
|
+
* @returns User preferences or null
|
|
507
|
+
*/
|
|
508
|
+
async loadUserPreferences() {
|
|
509
|
+
try {
|
|
510
|
+
const preferences = readUserPreferencesState(this.paths.userPreferencesFile);
|
|
511
|
+
return preferences ? cloneConfigValue(preferences) : null;
|
|
512
|
+
} catch {
|
|
513
|
+
return null;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/** Write project config atomically, preserving user-scope ownership. */
|
|
517
|
+
async writeProjectConfig(config) {
|
|
518
|
+
if (projectConfigAliasesUserConfig(this.options.cwd)) {
|
|
519
|
+
return PROJECT_CONFIG_SCOPE_ERROR;
|
|
520
|
+
}
|
|
521
|
+
try {
|
|
522
|
+
await this.excludeProjectConfigBackups();
|
|
523
|
+
if (!ensureConfigDir(this.paths.projectConfigDir)) {
|
|
524
|
+
return {
|
|
525
|
+
success: false,
|
|
526
|
+
error: "Cannot create project config directory"
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
const configContent = this.generateConfigFileContent(config);
|
|
530
|
+
const result = atomicWrite(this.paths.projectConfigFile, configContent, {
|
|
531
|
+
baseDir: findProjectRoot(this.options.cwd) ?? this.options.cwd
|
|
532
|
+
});
|
|
533
|
+
if (!result.success) {
|
|
534
|
+
return { success: false, error: result.error?.message };
|
|
535
|
+
}
|
|
536
|
+
this.invalidateCache();
|
|
537
|
+
return { success: true };
|
|
538
|
+
} catch (error) {
|
|
539
|
+
return {
|
|
540
|
+
success: false,
|
|
541
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/** Apply only repaired JSONC paths in the existing project candidate, retaining comments. */
|
|
546
|
+
async applyProjectConfigFixes(edits) {
|
|
547
|
+
if (edits.length === 0) return { success: true };
|
|
548
|
+
if (projectConfigAliasesUserConfig(this.options.cwd)) {
|
|
549
|
+
return PROJECT_CONFIG_SCOPE_ERROR;
|
|
550
|
+
}
|
|
551
|
+
const projectConfigFile = selectedBuildConfigCandidate(this.paths.projectConfigFile);
|
|
552
|
+
const projectConfig = edits.reduce(
|
|
553
|
+
(config, edit) => this.setNestedValue(config, edit.path, edit.value),
|
|
554
|
+
{}
|
|
555
|
+
);
|
|
556
|
+
return this.applyJsoncEdits(
|
|
557
|
+
projectConfigFile,
|
|
558
|
+
edits,
|
|
559
|
+
() => this.writeProjectConfig(projectConfig)
|
|
560
|
+
);
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Update user configuration atomically (~/.config/build/build.config.jsonc)
|
|
564
|
+
*
|
|
565
|
+
* @param config - User configuration to write
|
|
566
|
+
* @returns Success status
|
|
567
|
+
*/
|
|
568
|
+
async writeUserConfig(config) {
|
|
569
|
+
try {
|
|
570
|
+
if (!ensureConfigDir(this.paths.userConfigDir)) {
|
|
571
|
+
return {
|
|
572
|
+
success: false,
|
|
573
|
+
error: "Cannot create user config directory"
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
const configContent = this.generateConfigFileContent(config);
|
|
577
|
+
const result = atomicWrite(this.paths.userConfigFile, configContent, {
|
|
578
|
+
baseDir: this.options.cwd
|
|
579
|
+
});
|
|
580
|
+
if (!result.success) {
|
|
581
|
+
return { success: false, error: result.error?.message };
|
|
582
|
+
}
|
|
583
|
+
this.invalidateCache();
|
|
584
|
+
return { success: true };
|
|
585
|
+
} catch (error) {
|
|
586
|
+
return {
|
|
587
|
+
success: false,
|
|
588
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Load project configuration
|
|
594
|
+
*
|
|
595
|
+
* @returns Project configuration or null
|
|
596
|
+
*/
|
|
597
|
+
async loadProjectConfig() {
|
|
598
|
+
return loadProjectConfig(this.paths.projectConfigFile, this.options.cwd);
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Update cursor model preference
|
|
602
|
+
*
|
|
603
|
+
* @param model - New cursor model
|
|
604
|
+
* @param context - Change context
|
|
605
|
+
* @returns Success status
|
|
606
|
+
*/
|
|
607
|
+
async updateCursorModel(model, context) {
|
|
608
|
+
return this.runSerializedCursorModelUpdate(async () => {
|
|
609
|
+
try {
|
|
610
|
+
const result = mutateUserPreferencesState((preferences) => {
|
|
611
|
+
const cursor = preferences.preferences.cursor;
|
|
612
|
+
const previousModel = cursor.usageHistory.lastUsed;
|
|
613
|
+
cursor.userChosenDefault = model;
|
|
614
|
+
cursor.usageHistory.lastUsed = model;
|
|
615
|
+
cursor.usageHistory.usageCount += 1;
|
|
616
|
+
cursor.usageHistory.modelChanges ??= [];
|
|
617
|
+
cursor.usageHistory.modelChanges.push({
|
|
618
|
+
from: previousModel ?? "",
|
|
619
|
+
to: model,
|
|
620
|
+
timestamp: context.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
|
|
621
|
+
context: context.type
|
|
622
|
+
});
|
|
623
|
+
}, this.paths.userPreferencesFile);
|
|
624
|
+
this.emitUserStateWarnings(result.warnings);
|
|
625
|
+
this.invalidateCache();
|
|
626
|
+
return { success: true };
|
|
627
|
+
} catch (error) {
|
|
628
|
+
return {
|
|
629
|
+
success: false,
|
|
630
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Detect if this is a first-time user
|
|
637
|
+
*
|
|
638
|
+
* @returns True if first-time user
|
|
639
|
+
*/
|
|
640
|
+
async detectFirstTimeUser() {
|
|
641
|
+
try {
|
|
642
|
+
const userPrefs = await this.loadUserPreferences();
|
|
643
|
+
return !isFirstTimeDefaultsInitialized(userPrefs);
|
|
644
|
+
} catch {
|
|
645
|
+
return true;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Get configuration diagnostics
|
|
650
|
+
*
|
|
651
|
+
* @returns Diagnostic information
|
|
652
|
+
*/
|
|
653
|
+
async getDiagnostics() {
|
|
654
|
+
const paths = {
|
|
655
|
+
projectConfigFile: {
|
|
656
|
+
exists: buildConfigCandidates(this.paths.projectConfigFile).some(configExists)
|
|
657
|
+
},
|
|
658
|
+
userConfigFile: {
|
|
659
|
+
exists: buildConfigCandidates(this.paths.userConfigFile).some(configExists)
|
|
660
|
+
},
|
|
661
|
+
userPreferencesFile: {
|
|
662
|
+
exists: configExists(this.paths.userPreferencesFile)
|
|
663
|
+
},
|
|
664
|
+
userConfigDir: {
|
|
665
|
+
exists: configExists(this.paths.userConfigDir),
|
|
666
|
+
writable: configDirWritable(this.paths.userConfigDir, { createIfMissing: false })
|
|
667
|
+
},
|
|
668
|
+
projectConfigDir: {
|
|
669
|
+
exists: configExists(this.paths.projectConfigDir),
|
|
670
|
+
writable: configDirWritable(this.paths.projectConfigDir, { createIfMissing: false })
|
|
671
|
+
}
|
|
672
|
+
};
|
|
673
|
+
const cache = {
|
|
674
|
+
enabled: this.options.enableCache,
|
|
675
|
+
size: this.cache.size,
|
|
676
|
+
entries: Array.from(this.cache.entries()).map(([key, entry]) => ({
|
|
677
|
+
key: `${key.substring(0, 50)}...`,
|
|
678
|
+
age: Date.now() - entry.timestamp
|
|
679
|
+
}))
|
|
680
|
+
};
|
|
681
|
+
const config = await this.loadConfig();
|
|
682
|
+
const validationResult = validateBuildConfig(config.config, { cwd: this.options.cwd });
|
|
683
|
+
const validation = {
|
|
684
|
+
isValid: validationResult.isValid,
|
|
685
|
+
errors: validationResult.errors.map((e) => e.message),
|
|
686
|
+
warnings: validationResult.warnings.map((w) => w.message),
|
|
687
|
+
autoFixed: validationResult.autoFixed
|
|
688
|
+
};
|
|
689
|
+
const performance = {
|
|
690
|
+
avgLoadTime: config.loadTime,
|
|
691
|
+
cacheHitRate: this.calculateCacheHitRate()
|
|
692
|
+
};
|
|
693
|
+
return { paths, cache, validation, performance };
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Clear configuration cache
|
|
697
|
+
*/
|
|
698
|
+
clearCache() {
|
|
699
|
+
this.cache.clear();
|
|
700
|
+
this.cacheHits = 0;
|
|
701
|
+
this.cacheMisses = 0;
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
* Invalidate cache for current working directory
|
|
705
|
+
*
|
|
706
|
+
* CRITICAL FIX: Atomic cache invalidation to prevent race conditions.
|
|
707
|
+
* Collect all keys first, then delete them atomically to ensure
|
|
708
|
+
* consistent cache state during concurrent access.
|
|
709
|
+
*/
|
|
710
|
+
invalidateCache() {
|
|
711
|
+
const keysToDelete = [];
|
|
712
|
+
for (const [key] of this.cache) {
|
|
713
|
+
if (key.includes(this.options.cwd)) {
|
|
714
|
+
keysToDelete.push(key);
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
for (const key of keysToDelete) {
|
|
718
|
+
this.cache.delete(key);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Get configuration from cache
|
|
723
|
+
*
|
|
724
|
+
* @param key - Cache key
|
|
725
|
+
* @returns Cached configuration or null
|
|
726
|
+
*/
|
|
727
|
+
getFromCache(key) {
|
|
728
|
+
const entry = this.cache.get(key);
|
|
729
|
+
if (!entry) {
|
|
730
|
+
this.cacheMisses += 1;
|
|
731
|
+
return null;
|
|
732
|
+
}
|
|
733
|
+
if (Date.now() - entry.timestamp > this.options.cacheTTL) {
|
|
734
|
+
this.cache.delete(key);
|
|
735
|
+
this.cacheMisses += 1;
|
|
736
|
+
return null;
|
|
737
|
+
}
|
|
738
|
+
this.cacheHits += 1;
|
|
739
|
+
return cloneMergedConfigResult(entry.config);
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Set configuration in cache
|
|
743
|
+
*
|
|
744
|
+
* @param key - Cache key
|
|
745
|
+
* @param config - Configuration to cache
|
|
746
|
+
*/
|
|
747
|
+
setCache(key, config) {
|
|
748
|
+
this.cache.set(key, {
|
|
749
|
+
config: cloneMergedConfigResult(config),
|
|
750
|
+
timestamp: Date.now(),
|
|
751
|
+
sources: config.sources.map((s) => s.type)
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
async runSerializedCursorModelUpdate(operation) {
|
|
755
|
+
let release = () => {
|
|
756
|
+
};
|
|
757
|
+
const previous = this.updateCursorModelQueue;
|
|
758
|
+
this.updateCursorModelQueue = new Promise((resolve) => {
|
|
759
|
+
release = resolve;
|
|
760
|
+
});
|
|
761
|
+
await previous;
|
|
762
|
+
try {
|
|
763
|
+
return await operation();
|
|
764
|
+
} finally {
|
|
765
|
+
release?.();
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Calculate cache hit rate
|
|
770
|
+
*
|
|
771
|
+
* @returns Cache hit rate as percentage
|
|
772
|
+
*/
|
|
773
|
+
calculateCacheHitRate() {
|
|
774
|
+
const totalLookups = this.cacheHits + this.cacheMisses;
|
|
775
|
+
if (totalLookups === 0) {
|
|
776
|
+
return 0;
|
|
777
|
+
}
|
|
778
|
+
return Math.round(this.cacheHits / totalLookups * 1e3) / 10;
|
|
779
|
+
}
|
|
780
|
+
emitUserStateWarnings(warnings) {
|
|
781
|
+
for (const warning of warnings) {
|
|
782
|
+
emitWarning(
|
|
783
|
+
"CFG-001",
|
|
784
|
+
{ taskId: "config-manager", subsystem: "config", executionPhase: "setup" },
|
|
785
|
+
{
|
|
786
|
+
severity: "WARN" /* WARN */,
|
|
787
|
+
metadata: { operation: "writeUserPreferences", ...warning }
|
|
788
|
+
}
|
|
789
|
+
);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Detect and warn about provider default drift (all providers with model defaults).
|
|
794
|
+
*/
|
|
795
|
+
validateProviderDefaultsConsistency(config) {
|
|
796
|
+
try {
|
|
797
|
+
const registry = ProviderRegistry.load(void 0, this.options.cwd);
|
|
798
|
+
const providersWithModels = Object.values(registry.providers).filter(
|
|
799
|
+
(p) => p.models?.default
|
|
800
|
+
);
|
|
801
|
+
for (const providerConfig of providersWithModels) {
|
|
802
|
+
const providerId = providerConfig.id;
|
|
803
|
+
const registryDefault = providerConfig.models.default;
|
|
804
|
+
const providerEntry = config.providers?.[providerId];
|
|
805
|
+
const configured = providerEntry && typeof providerEntry === "object" && "model" in providerEntry && typeof providerEntry.model === "string" ? providerEntry.model : void 0;
|
|
806
|
+
if (configured && configured !== registryDefault && !isPlaceholderModelDefault(registryDefault)) {
|
|
807
|
+
emitWarning(
|
|
808
|
+
"CFG-007",
|
|
809
|
+
{
|
|
810
|
+
taskId: "config-manager",
|
|
811
|
+
subsystem: "config",
|
|
812
|
+
executionPhase: "setup"
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
severity: "WARN" /* WARN */,
|
|
816
|
+
metadata: {
|
|
817
|
+
provider: providerId,
|
|
818
|
+
configuredDefault: configured,
|
|
819
|
+
registryDefault,
|
|
820
|
+
recommendation: "Remove the model override or align it with providers.yaml"
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
} catch (error) {
|
|
827
|
+
emitWarning(
|
|
828
|
+
"CFG-002",
|
|
829
|
+
{
|
|
830
|
+
taskId: "config-manager",
|
|
831
|
+
subsystem: "config",
|
|
832
|
+
executionPhase: "setup"
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
severity: "INFO" /* INFO */,
|
|
836
|
+
metadata: {
|
|
837
|
+
error: error instanceof Error ? error.message : String(error),
|
|
838
|
+
recommendation: "Ensure provider registry is valid to compare defaults"
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
/**
|
|
845
|
+
* Set a configuration value using dot-notation path
|
|
846
|
+
*
|
|
847
|
+
* @param path - Dot-notation path (e.g., 'defaults.provider', 'automation.flywheel.merge.biomeRepair')
|
|
848
|
+
* @param value - Value to set
|
|
849
|
+
* @param scope - Configuration scope ('user' or 'project')
|
|
850
|
+
* @returns Success status with previous value
|
|
851
|
+
*/
|
|
852
|
+
async setConfigValue(path, value, scope = "project") {
|
|
853
|
+
try {
|
|
854
|
+
const pathSegments = path.split(".").filter(Boolean);
|
|
855
|
+
if (pathSegments.length === 0) {
|
|
856
|
+
return { success: false, error: "Invalid configuration path" };
|
|
857
|
+
}
|
|
858
|
+
if (!this.isValidConfigPath(pathSegments)) {
|
|
859
|
+
return {
|
|
860
|
+
success: false,
|
|
861
|
+
error: `Unknown configuration path: ${path}. Use 'build config show' to see valid paths.`
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
const config = await this.loadScopedConfig(scope);
|
|
865
|
+
const previousValue = this.getNestedValue(config, pathSegments);
|
|
866
|
+
const parsedValue = this.parseConfigValue(value);
|
|
867
|
+
const updatedConfig = this.setNestedValue(config, pathSegments, parsedValue);
|
|
868
|
+
const validationResult = BuildConfigSchema.safeParse(updatedConfig);
|
|
869
|
+
if (!validationResult.success) {
|
|
870
|
+
return {
|
|
871
|
+
success: false,
|
|
872
|
+
error: `Invalid configuration: ${validationResult.error.issues.map((issue) => issue.message).join(", ")}`
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
if (!this.hasNestedPath(validationResult.data, pathSegments)) {
|
|
876
|
+
return {
|
|
877
|
+
success: false,
|
|
878
|
+
error: `Unknown configuration path: ${path}. Use 'build config show' to see valid paths.`
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
const keyError = registryErrorAtPath(validationResult.data, pathSegments, this.options.cwd);
|
|
882
|
+
if (keyError) {
|
|
883
|
+
return { success: false, error: keyError };
|
|
884
|
+
}
|
|
885
|
+
const writeResult = await this.writeConfigValuePreservingJsonc(
|
|
886
|
+
scope,
|
|
887
|
+
pathSegments,
|
|
888
|
+
parsedValue,
|
|
889
|
+
updatedConfig
|
|
890
|
+
// unparsed: never persist schema defaults
|
|
891
|
+
);
|
|
892
|
+
if (!writeResult.success) {
|
|
893
|
+
return writeResult;
|
|
894
|
+
}
|
|
895
|
+
return { success: true, previousValue };
|
|
896
|
+
} catch (error) {
|
|
897
|
+
return {
|
|
898
|
+
success: false,
|
|
899
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
900
|
+
};
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
/**
|
|
904
|
+
* Get a configuration value using dot-notation path
|
|
905
|
+
*
|
|
906
|
+
* @param path - Dot-notation path
|
|
907
|
+
* @param scope - Configuration scope ('user' or 'project')
|
|
908
|
+
* @returns The value at the path or undefined
|
|
909
|
+
*/
|
|
910
|
+
async getConfigValue(path, scope = "project") {
|
|
911
|
+
const config = await this.loadScopedConfig(scope);
|
|
912
|
+
return this.getNestedValue(config, path.split(".").filter(Boolean));
|
|
913
|
+
}
|
|
914
|
+
/**
|
|
915
|
+
* Read one raw config layer. The user layer is read from its own file rather
|
|
916
|
+
* than through loadConfig(), so a value that makes the merged tree invalid can
|
|
917
|
+
* still be read and replaced in place.
|
|
918
|
+
*/
|
|
919
|
+
async loadScopedConfig(scope) {
|
|
920
|
+
return scope === "project" ? await this.loadProjectConfig() ?? {} : await loadUserConfig(this.paths.userConfigFile, this.options.cwd) ?? {};
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Validate a configuration path against allowed paths
|
|
924
|
+
*/
|
|
925
|
+
isValidConfigPath(pathSegments) {
|
|
926
|
+
const rootNamespace = pathSegments[0];
|
|
927
|
+
if (!rootNamespace || !KNOWN_BUILD_CONFIG_ROOTS.includes(rootNamespace)) {
|
|
928
|
+
return false;
|
|
929
|
+
}
|
|
930
|
+
return true;
|
|
931
|
+
}
|
|
932
|
+
/**
|
|
933
|
+
* Get nested value from object using path segments
|
|
934
|
+
*/
|
|
935
|
+
getNestedValue(obj, path) {
|
|
936
|
+
let current = obj;
|
|
937
|
+
for (const segment of path) {
|
|
938
|
+
if (current == null || typeof current !== "object") {
|
|
939
|
+
return void 0;
|
|
940
|
+
}
|
|
941
|
+
current = current[segment];
|
|
942
|
+
}
|
|
943
|
+
return current;
|
|
944
|
+
}
|
|
945
|
+
hasNestedPath(obj, path) {
|
|
946
|
+
let current = obj;
|
|
947
|
+
for (const segment of path) {
|
|
948
|
+
if (current == null || typeof current !== "object" || !Object.hasOwn(current, segment)) {
|
|
949
|
+
return false;
|
|
950
|
+
}
|
|
951
|
+
current = current[segment];
|
|
952
|
+
}
|
|
953
|
+
return true;
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* Set nested value in object using path segments (immutable)
|
|
957
|
+
*/
|
|
958
|
+
setNestedValue(obj, path, value) {
|
|
959
|
+
const result = structuredClone(obj);
|
|
960
|
+
let current = result;
|
|
961
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
962
|
+
const segment = path[i];
|
|
963
|
+
if (!segment) {
|
|
964
|
+
continue;
|
|
965
|
+
}
|
|
966
|
+
if (!(segment in current) || typeof current[segment] !== "object" || current[segment] === null) {
|
|
967
|
+
current[segment] = {};
|
|
968
|
+
}
|
|
969
|
+
current = current[segment];
|
|
970
|
+
}
|
|
971
|
+
const lastSegment = path[path.length - 1];
|
|
972
|
+
if (lastSegment) {
|
|
973
|
+
current[lastSegment] = value;
|
|
974
|
+
}
|
|
975
|
+
return result;
|
|
976
|
+
}
|
|
977
|
+
/**
|
|
978
|
+
* Parse config value from string to appropriate type
|
|
979
|
+
*/
|
|
980
|
+
parseConfigValue(value) {
|
|
981
|
+
if (typeof value !== "string") {
|
|
982
|
+
return value;
|
|
983
|
+
}
|
|
984
|
+
const trimmed = value.trim();
|
|
985
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]") || trimmed.startsWith("{") && trimmed.endsWith("}")) {
|
|
986
|
+
try {
|
|
987
|
+
return JSON.parse(trimmed);
|
|
988
|
+
} catch {
|
|
989
|
+
return value;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
if (value.toLowerCase() === "true") return true;
|
|
993
|
+
if (value.toLowerCase() === "false") return false;
|
|
994
|
+
const num = Number(value);
|
|
995
|
+
if (!Number.isNaN(num) && value.trim() !== "") {
|
|
996
|
+
return num;
|
|
997
|
+
}
|
|
998
|
+
if (value.toLowerCase() === "null") return null;
|
|
999
|
+
if (value.toLowerCase() === "undefined") return void 0;
|
|
1000
|
+
return value;
|
|
1001
|
+
}
|
|
1002
|
+
/**
|
|
1003
|
+
* Generate JSONC configuration file content
|
|
1004
|
+
*
|
|
1005
|
+
* @param config - Configuration object
|
|
1006
|
+
* @returns JSONC file content
|
|
1007
|
+
*/
|
|
1008
|
+
generateConfigFileContent(config) {
|
|
1009
|
+
return `{
|
|
1010
|
+
// Build configuration.
|
|
1011
|
+
// JSONC is JSON with comments and trailing commas; use "build config set/get"
|
|
1012
|
+
// to edit this safely, or hand-edit it with a JSONC-aware editor.
|
|
1013
|
+
${JSON.stringify(config, null, 2).split("\n").map((line, index) => index === 0 ? line.slice(1) : ` ${line}`).join("\n")}
|
|
1014
|
+
`;
|
|
1015
|
+
}
|
|
1016
|
+
async writeConfigValuePreservingJsonc(scope, pathSegments, value, validatedConfig) {
|
|
1017
|
+
if (scope === "project" && projectConfigAliasesUserConfig(this.options.cwd)) {
|
|
1018
|
+
return PROJECT_CONFIG_SCOPE_ERROR;
|
|
1019
|
+
}
|
|
1020
|
+
const filePath = selectedBuildConfigCandidate(
|
|
1021
|
+
scope === "project" ? this.paths.projectConfigFile : this.paths.userConfigFile
|
|
1022
|
+
);
|
|
1023
|
+
return this.applyJsoncEdits(
|
|
1024
|
+
filePath,
|
|
1025
|
+
[{ path: pathSegments, value }],
|
|
1026
|
+
() => scope === "project" ? this.writeProjectConfig(validatedConfig) : this.writeUserConfig(validatedConfig)
|
|
1027
|
+
);
|
|
1028
|
+
}
|
|
1029
|
+
/** Edit a config file in place, or create it when absent; invalidates the cache once written. */
|
|
1030
|
+
async applyJsoncEdits(filePath, edits, create) {
|
|
1031
|
+
const projectRoot = findProjectRoot(this.options.cwd) ?? this.options.cwd;
|
|
1032
|
+
const isUserFile = buildConfigCandidates(this.paths.userConfigFile).includes(filePath);
|
|
1033
|
+
const baseDir = isUserFile ? this.options.cwd : projectRoot;
|
|
1034
|
+
if (!isUserFile) await this.excludeProjectConfigBackups();
|
|
1035
|
+
const result = await editOrCreateJsoncConfig(filePath, edits, baseDir, create);
|
|
1036
|
+
if (result.success) {
|
|
1037
|
+
this.invalidateCache();
|
|
1038
|
+
}
|
|
1039
|
+
return result;
|
|
1040
|
+
}
|
|
1041
|
+
async excludeProjectConfigBackups() {
|
|
1042
|
+
const { ensureWorktreeGitExclude } = await import("./worktree-environment-WTVABAQW.js");
|
|
1043
|
+
await ensureWorktreeGitExclude(findProjectRoot(this.options.cwd) ?? this.options.cwd, [
|
|
1044
|
+
"/.build-project/config/*.backup.*"
|
|
1045
|
+
]);
|
|
1046
|
+
}
|
|
1047
|
+
/** Reset the selected scopes; refuse aliased project scope before either write. */
|
|
1048
|
+
async resetToDefaults(level = "project") {
|
|
1049
|
+
if (level !== "user" && projectConfigAliasesUserConfig(this.options.cwd)) {
|
|
1050
|
+
return PROJECT_CONFIG_SCOPE_ERROR;
|
|
1051
|
+
}
|
|
1052
|
+
try {
|
|
1053
|
+
if (level === "user" || level === "all") {
|
|
1054
|
+
const userConfigSnapshot = snapshotFile(this.paths.userConfigFile);
|
|
1055
|
+
const userResult = await this.writeUserConfig({});
|
|
1056
|
+
if (!userResult.success) return userResult;
|
|
1057
|
+
if (level === "all") {
|
|
1058
|
+
const projectResult = await this.writeProjectConfig({});
|
|
1059
|
+
if (!projectResult.success) {
|
|
1060
|
+
const rollbackErrors = [];
|
|
1061
|
+
try {
|
|
1062
|
+
restoreFileSnapshot(this.paths.userConfigFile, userConfigSnapshot, this.options.cwd);
|
|
1063
|
+
} catch (error) {
|
|
1064
|
+
rollbackErrors.push(
|
|
1065
|
+
`user config rollback failed: ${error instanceof Error ? error.message : String(error)}`
|
|
1066
|
+
);
|
|
1067
|
+
}
|
|
1068
|
+
return rollbackErrors.length === 0 ? projectResult : {
|
|
1069
|
+
success: false,
|
|
1070
|
+
error: `${projectResult.error ?? "Project config write failed"}; ${rollbackErrors.join("; ")}`
|
|
1071
|
+
};
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
} else if (level === "project") {
|
|
1075
|
+
const result = await this.writeProjectConfig({});
|
|
1076
|
+
if (!result.success) return result;
|
|
1077
|
+
}
|
|
1078
|
+
this.clearCache();
|
|
1079
|
+
return { success: true };
|
|
1080
|
+
} catch (error) {
|
|
1081
|
+
return {
|
|
1082
|
+
success: false,
|
|
1083
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1084
|
+
};
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
/**
|
|
1088
|
+
* Export configuration for backup or sharing
|
|
1089
|
+
*
|
|
1090
|
+
* @param includeUserPreferences - Whether to include user preferences
|
|
1091
|
+
* @returns Export data
|
|
1092
|
+
*/
|
|
1093
|
+
async exportConfig(includeUserPreferences = false) {
|
|
1094
|
+
const config = await this.loadConfig();
|
|
1095
|
+
const result = {
|
|
1096
|
+
config: redactSensitiveConfig(config.config),
|
|
1097
|
+
metadata: {
|
|
1098
|
+
exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1099
|
+
version: "1.0",
|
|
1100
|
+
cwd: this.options.cwd
|
|
1101
|
+
}
|
|
1102
|
+
};
|
|
1103
|
+
if (includeUserPreferences) {
|
|
1104
|
+
const prefs = await this.loadUserPreferences();
|
|
1105
|
+
if (prefs) {
|
|
1106
|
+
result.preferences = redactSensitiveConfig(prefs);
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
return result;
|
|
1110
|
+
}
|
|
1111
|
+
/**
|
|
1112
|
+
* Import configuration from exported data
|
|
1113
|
+
*
|
|
1114
|
+
* @param exportData - Exported configuration data
|
|
1115
|
+
* @param importPreferences - Whether to import user preferences
|
|
1116
|
+
* @returns Success status
|
|
1117
|
+
*/
|
|
1118
|
+
async importConfig(exportData, importPreferences = false) {
|
|
1119
|
+
try {
|
|
1120
|
+
if (!exportData || typeof exportData !== "object" || !("config" in exportData) || !("metadata" in exportData)) {
|
|
1121
|
+
return { success: false, error: "Invalid export data format" };
|
|
1122
|
+
}
|
|
1123
|
+
const metadataResult = z.object({
|
|
1124
|
+
exportedAt: z.string().min(1),
|
|
1125
|
+
version: z.string().min(1),
|
|
1126
|
+
cwd: z.string()
|
|
1127
|
+
}).strict().safeParse(exportData.metadata);
|
|
1128
|
+
if (!metadataResult.success) {
|
|
1129
|
+
return {
|
|
1130
|
+
success: false,
|
|
1131
|
+
error: `Invalid export data format: ${metadataResult.error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ")}`
|
|
1132
|
+
};
|
|
1133
|
+
}
|
|
1134
|
+
const unknownConfigRoots = exportData.config && typeof exportData.config === "object" && !Array.isArray(exportData.config) ? Object.keys(exportData.config).filter((key) => !KNOWN_BUILD_CONFIG_ROOTS.includes(key)) : [];
|
|
1135
|
+
if (unknownConfigRoots.length > 0) {
|
|
1136
|
+
return {
|
|
1137
|
+
success: false,
|
|
1138
|
+
error: `Invalid imported configuration: Unknown top-level configuration key(s): ${unknownConfigRoots.join(", ")}`
|
|
1139
|
+
};
|
|
1140
|
+
}
|
|
1141
|
+
const configResult = BuildConfigSchema.safeParse(exportData.config);
|
|
1142
|
+
if (!configResult.success) {
|
|
1143
|
+
return {
|
|
1144
|
+
success: false,
|
|
1145
|
+
error: `Invalid imported configuration: ${configResult.error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ")}`
|
|
1146
|
+
};
|
|
1147
|
+
}
|
|
1148
|
+
let validatedPreferences;
|
|
1149
|
+
let previousPreferences;
|
|
1150
|
+
if (importPreferences && exportData.preferences !== void 0) {
|
|
1151
|
+
const preferencesResult = UserPreferencesSchema.safeParse(exportData.preferences);
|
|
1152
|
+
if (!preferencesResult.success) {
|
|
1153
|
+
return {
|
|
1154
|
+
success: false,
|
|
1155
|
+
error: `Invalid imported preferences: ${preferencesResult.error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ")}`
|
|
1156
|
+
};
|
|
1157
|
+
}
|
|
1158
|
+
validatedPreferences = preferencesResult.data;
|
|
1159
|
+
previousPreferences = snapshotUserPreferencesState(this.paths.userPreferencesFile);
|
|
1160
|
+
}
|
|
1161
|
+
if (validatedPreferences) {
|
|
1162
|
+
try {
|
|
1163
|
+
const prefResult = replaceUserPreferencesState(
|
|
1164
|
+
validatedPreferences,
|
|
1165
|
+
this.paths.userPreferencesFile
|
|
1166
|
+
);
|
|
1167
|
+
this.emitUserStateWarnings(prefResult.warnings);
|
|
1168
|
+
} catch (error) {
|
|
1169
|
+
return {
|
|
1170
|
+
success: false,
|
|
1171
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1172
|
+
};
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
const result = await this.writeProjectConfig(configResult.data);
|
|
1176
|
+
if (!result.success) {
|
|
1177
|
+
if (previousPreferences) {
|
|
1178
|
+
try {
|
|
1179
|
+
restoreUserPreferencesState(previousPreferences, this.paths.userPreferencesFile);
|
|
1180
|
+
} catch (rollbackError) {
|
|
1181
|
+
return {
|
|
1182
|
+
success: false,
|
|
1183
|
+
error: `${result.error ?? "Project config write failed"}; preference rollback also failed: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`
|
|
1184
|
+
};
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
return result;
|
|
1188
|
+
}
|
|
1189
|
+
this.clearCache();
|
|
1190
|
+
return { success: true };
|
|
1191
|
+
} catch (error) {
|
|
1192
|
+
return {
|
|
1193
|
+
success: false,
|
|
1194
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
};
|
|
1199
|
+
|
|
1200
|
+
export {
|
|
1201
|
+
writeJsoncEdits,
|
|
1202
|
+
preferencesFromUserState,
|
|
1203
|
+
snapshotUserPreferencesState,
|
|
1204
|
+
restoreUserPreferencesState,
|
|
1205
|
+
resetFirstRunPreferencesState,
|
|
1206
|
+
mutateUserPreferencesState,
|
|
1207
|
+
writeUserPreferencesState,
|
|
1208
|
+
replaceUserPreferencesState,
|
|
1209
|
+
isPlaceholderModelDefault,
|
|
1210
|
+
ConfigManager
|
|
1211
|
+
};
|
|
1212
|
+
//# sourceMappingURL=chunk-W4BAIQ6L.js.map
|