@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,1408 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LlmJudgeExecutor
|
|
3
|
+
} from "./chunk-CFCVYHSW.js";
|
|
4
|
+
import {
|
|
5
|
+
getUserBuildHome
|
|
6
|
+
} from "./chunk-VCGSWN5M.js";
|
|
7
|
+
import {
|
|
8
|
+
MANIFEST,
|
|
9
|
+
discoverAgentInstructionSources,
|
|
10
|
+
findPendingImport,
|
|
11
|
+
getImportsDir,
|
|
12
|
+
readInstructionsImportState,
|
|
13
|
+
recordImportOptimization,
|
|
14
|
+
recordInstructionsImportState
|
|
15
|
+
} from "./chunk-IYY3HQAD.js";
|
|
16
|
+
import {
|
|
17
|
+
markdownFenceLines
|
|
18
|
+
} from "./chunk-UDNNAQN5.js";
|
|
19
|
+
import {
|
|
20
|
+
CORE_DOCTRINE,
|
|
21
|
+
STEERING_PROVIDERS,
|
|
22
|
+
assessSteeringCap,
|
|
23
|
+
resolveSteeringChannelCaps
|
|
24
|
+
} from "./chunk-HKO45NLZ.js";
|
|
25
|
+
import {
|
|
26
|
+
ConfigManager,
|
|
27
|
+
writeJsoncEdits
|
|
28
|
+
} from "./chunk-W4BAIQ6L.js";
|
|
29
|
+
import {
|
|
30
|
+
readInstructionText,
|
|
31
|
+
userHomeDir
|
|
32
|
+
} from "./chunk-S6I4KISU.js";
|
|
33
|
+
import {
|
|
34
|
+
resolveJudgeConfig
|
|
35
|
+
} from "./chunk-C3DH3NCY.js";
|
|
36
|
+
import {
|
|
37
|
+
isYesAnswer
|
|
38
|
+
} from "./chunk-O5X6BKAO.js";
|
|
39
|
+
import {
|
|
40
|
+
safeRmDir
|
|
41
|
+
} from "./chunk-ALDTFNZ3.js";
|
|
42
|
+
import {
|
|
43
|
+
selectedBuildConfigCandidate
|
|
44
|
+
} from "./chunk-FKCG7K6H.js";
|
|
45
|
+
import {
|
|
46
|
+
isProviderCliResolvable
|
|
47
|
+
} from "./chunk-KKQKWAMF.js";
|
|
48
|
+
import {
|
|
49
|
+
byteLength,
|
|
50
|
+
getUserInstructionsPath,
|
|
51
|
+
getUserInstructionsTargetPath,
|
|
52
|
+
sha256Text
|
|
53
|
+
} from "./chunk-RIMARPCF.js";
|
|
54
|
+
import {
|
|
55
|
+
getUserConfigFile
|
|
56
|
+
} from "./chunk-56WPYDJH.js";
|
|
57
|
+
|
|
58
|
+
// src/core/instructions-import/plan.ts
|
|
59
|
+
import { createHash as createHash2 } from "crypto";
|
|
60
|
+
import { existsSync, readFileSync } from "fs";
|
|
61
|
+
import { dirname, join } from "path";
|
|
62
|
+
|
|
63
|
+
// src/core/instructions-import/secrets.ts
|
|
64
|
+
var TOKEN_SHAPES = [
|
|
65
|
+
["api key (sk-)", /\bsk-[A-Za-z0-9_-]{20,}/],
|
|
66
|
+
["github token", /\b(?:gh[pousr]_[A-Za-z0-9]{30,}|github_pat_[A-Za-z0-9_]{30,})/],
|
|
67
|
+
["gitlab token", /\bglpat-[A-Za-z0-9_-]{20,}/],
|
|
68
|
+
["slack token", /\bxox[abeprs]-[A-Za-z0-9-]{10,}/],
|
|
69
|
+
["aws access key id", /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/],
|
|
70
|
+
["google api key", /\bAIza[0-9A-Za-z_-]{35}/],
|
|
71
|
+
["xai api key", /\bxai-[A-Za-z0-9]{20,}/],
|
|
72
|
+
["npm token", /\bnpm_[A-Za-z0-9]{36}/],
|
|
73
|
+
["stripe key", /\b[rs]k_live_[A-Za-z0-9]{20,}/],
|
|
74
|
+
["jwt", /\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/]
|
|
75
|
+
];
|
|
76
|
+
var KEY_VALUE = /(?:^|[^A-Za-z0-9])(password|passwd|pwd|secret|client[_-]?secret|token|access[_-]?token|auth[_-]?token|api[_-]?key|apikey|access[_-]?key|private[_-]?key)["']?\s*[:=]\s*["']?([^\s"',;]+)/i;
|
|
77
|
+
var CONNECTION_STRING = /\b[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:[^\s@/]+@[^\s]+/i;
|
|
78
|
+
var PRIVATE_KEY_BEGIN = /-----BEGIN [A-Z0-9 ]*PRIVATE KEY( BLOCK)?-----/;
|
|
79
|
+
var PRIVATE_KEY_END = /-----END [A-Z0-9 ]*PRIVATE KEY( BLOCK)?-----/;
|
|
80
|
+
function isPlaceholder(value) {
|
|
81
|
+
return /^<.*>$/.test(value) || /^\$\{?[A-Za-z_][A-Za-z0-9_]*\}?$/.test(value) || /^[*xX.]+$/.test(value) || /^(?:none|null|redacted|changeme|example)$/i.test(value);
|
|
82
|
+
}
|
|
83
|
+
function linePattern(line) {
|
|
84
|
+
for (const [name, shape] of TOKEN_SHAPES) {
|
|
85
|
+
if (shape.test(line)) return name;
|
|
86
|
+
}
|
|
87
|
+
const keyValue = KEY_VALUE.exec(line);
|
|
88
|
+
if (keyValue?.[1] && keyValue[2] && !isPlaceholder(keyValue[2])) {
|
|
89
|
+
return `${keyValue[1].toLowerCase()} value`;
|
|
90
|
+
}
|
|
91
|
+
if (CONNECTION_STRING.test(line)) return "connection string with password";
|
|
92
|
+
return void 0;
|
|
93
|
+
}
|
|
94
|
+
function withholdSecrets(text, source, dropLines = []) {
|
|
95
|
+
const drop = new Set(dropLines);
|
|
96
|
+
const kept = [];
|
|
97
|
+
const withheld = [];
|
|
98
|
+
let inKeyBlock = false;
|
|
99
|
+
text.split(/\r?\n/).forEach((line, index) => {
|
|
100
|
+
const lineNumber = index + 1;
|
|
101
|
+
if (inKeyBlock) {
|
|
102
|
+
if (PRIVATE_KEY_END.test(line)) inKeyBlock = false;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (PRIVATE_KEY_BEGIN.test(line)) {
|
|
106
|
+
withheld.push({ ...source, line: lineNumber, pattern: "private key" });
|
|
107
|
+
inKeyBlock = !PRIVATE_KEY_END.test(line);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const pattern = linePattern(line);
|
|
111
|
+
if (pattern) {
|
|
112
|
+
withheld.push({ ...source, line: lineNumber, pattern });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (!drop.has(lineNumber)) kept.push(line);
|
|
116
|
+
});
|
|
117
|
+
return { text: kept.join("\n"), withheld };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// src/core/instructions-import/sections.ts
|
|
121
|
+
import { createHash } from "crypto";
|
|
122
|
+
var HEADING = /^ {0,3}#{1,6}(?:\s|$)/;
|
|
123
|
+
function parseBlockMarker(line) {
|
|
124
|
+
const trimmed = line.trim();
|
|
125
|
+
const isComment = trimmed.startsWith("<!--") && trimmed.endsWith("-->");
|
|
126
|
+
const body = trimmed.replace(/^<!--|-->$/g, "").replace(/^[\s#=<>*/-]+|[\s#=<>*/-]+$/g, "");
|
|
127
|
+
if (!body) return void 0;
|
|
128
|
+
const colon = /^(\S+?):(start|begin|end)$/i.exec(body);
|
|
129
|
+
if (colon?.[1] && colon[2]) {
|
|
130
|
+
return { edge: colon[2].toLowerCase() === "end" ? "end" : "start", name: colon[1] };
|
|
131
|
+
}
|
|
132
|
+
const word = /^(BEGIN|START|END)\s+(.+)$/i.exec(body);
|
|
133
|
+
if (word?.[1] && word[2] && (isComment || word[1] === word[1].toUpperCase())) {
|
|
134
|
+
return { edge: word[1].toUpperCase() === "END" ? "end" : "start", name: word[2].trim() };
|
|
135
|
+
}
|
|
136
|
+
return void 0;
|
|
137
|
+
}
|
|
138
|
+
function normalizeName(name) {
|
|
139
|
+
return name.toLowerCase().replace(/\s+/g, " ");
|
|
140
|
+
}
|
|
141
|
+
function splitManagedRegions(lines, sourceId) {
|
|
142
|
+
const markers = lines.map((line) => parseBlockMarker(line));
|
|
143
|
+
const regions = [];
|
|
144
|
+
const blocks = [];
|
|
145
|
+
let current = { lines: [] };
|
|
146
|
+
for (let i = 0; i < lines.length; i++) {
|
|
147
|
+
const marker = markers[i];
|
|
148
|
+
if (marker?.edge === "start" && current.managedBy === void 0) {
|
|
149
|
+
const name = normalizeName(marker.name);
|
|
150
|
+
const end = markers.findIndex(
|
|
151
|
+
(m, j) => j > i && m?.edge === "end" && normalizeName(m.name) === name
|
|
152
|
+
);
|
|
153
|
+
if (end !== -1) {
|
|
154
|
+
regions.push(current);
|
|
155
|
+
blocks.push({ sourceId, name: marker.name, line: i + 1 });
|
|
156
|
+
regions.push({ lines: lines.slice(i + 1, end), managedBy: marker.name });
|
|
157
|
+
current = { lines: [] };
|
|
158
|
+
i = end;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
current.lines.push(lines[i] ?? "");
|
|
163
|
+
}
|
|
164
|
+
regions.push(current);
|
|
165
|
+
return { regions: regions.filter((region) => region.lines.length > 0), blocks };
|
|
166
|
+
}
|
|
167
|
+
function splitSections(lines) {
|
|
168
|
+
const sections = [];
|
|
169
|
+
let current = { lines: [] };
|
|
170
|
+
const fenced = markdownFenceLines(lines);
|
|
171
|
+
lines.forEach((line, index) => {
|
|
172
|
+
if (!fenced[index] && HEADING.test(line)) {
|
|
173
|
+
sections.push(current);
|
|
174
|
+
current = { heading: line.trim(), lines: [] };
|
|
175
|
+
}
|
|
176
|
+
current.lines.push(line);
|
|
177
|
+
});
|
|
178
|
+
sections.push(current);
|
|
179
|
+
return sections.map((section) => ({
|
|
180
|
+
...section.heading ? { heading: section.heading } : {},
|
|
181
|
+
text: section.lines.join("\n").trim()
|
|
182
|
+
})).filter((section) => section.text !== "");
|
|
183
|
+
}
|
|
184
|
+
function normalizeSectionText(text) {
|
|
185
|
+
return text.split("\n").map((line) => line.trimEnd()).join("\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
186
|
+
}
|
|
187
|
+
function sectionKey(text) {
|
|
188
|
+
return createHash("sha256").update(normalizeSectionText(text)).digest("hex").slice(0, 16);
|
|
189
|
+
}
|
|
190
|
+
function dedupeSections(sources) {
|
|
191
|
+
const sections = [];
|
|
192
|
+
const managedBlocks = [];
|
|
193
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
194
|
+
for (const source of sources) {
|
|
195
|
+
const { regions, blocks } = splitManagedRegions(source.text.split(/\r?\n/), source.sourceId);
|
|
196
|
+
managedBlocks.push(...blocks);
|
|
197
|
+
for (const region of regions) {
|
|
198
|
+
for (const { heading, text } of splitSections(region.lines)) {
|
|
199
|
+
const key = sectionKey(text);
|
|
200
|
+
const origin = { sourceId: source.sourceId, reaches: [...source.reaches] };
|
|
201
|
+
const existing = byKey.get(key);
|
|
202
|
+
if (existing) {
|
|
203
|
+
existing.origins.push(origin);
|
|
204
|
+
for (const agent of source.reaches) {
|
|
205
|
+
if (!existing.reaches.includes(agent)) existing.reaches.push(agent);
|
|
206
|
+
}
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const section = {
|
|
210
|
+
key,
|
|
211
|
+
...heading ? { heading } : {},
|
|
212
|
+
text,
|
|
213
|
+
origins: [origin],
|
|
214
|
+
reaches: [...source.reaches],
|
|
215
|
+
...region.managedBy ? { managedBy: region.managedBy } : {}
|
|
216
|
+
};
|
|
217
|
+
byKey.set(key, section);
|
|
218
|
+
sections.push(section);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return { sections, managedBlocks };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// src/core/instructions-import/plan.ts
|
|
226
|
+
var BUILD_AGENT = "build";
|
|
227
|
+
function displayPath(path, env = process.env) {
|
|
228
|
+
const home = userHomeDir(env);
|
|
229
|
+
return path === home || path.startsWith(`${home}/`) ? `~${path.slice(home.length)}` : path;
|
|
230
|
+
}
|
|
231
|
+
function describeSource(source, env) {
|
|
232
|
+
const key = source.id.startsWith(`${source.path}#`) ? source.id.slice(source.path.length + 1) : "";
|
|
233
|
+
return key ? `${displayPath(source.path, env)} (${key})` : displayPath(source.path, env);
|
|
234
|
+
}
|
|
235
|
+
function legacyBuildSource() {
|
|
236
|
+
const inUse = getUserInstructionsPath();
|
|
237
|
+
if (inUse === getUserInstructionsTargetPath()) return void 0;
|
|
238
|
+
const read = readInstructionText(inUse);
|
|
239
|
+
if (!read.ok) return void 0;
|
|
240
|
+
return {
|
|
241
|
+
id: inUse,
|
|
242
|
+
path: inUse,
|
|
243
|
+
kind: "instructions",
|
|
244
|
+
reaches: [BUILD_AGENT],
|
|
245
|
+
text: read.text,
|
|
246
|
+
identity: read.identity
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function itemName(raw, taken) {
|
|
250
|
+
const base = raw.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "rule";
|
|
251
|
+
let name = base;
|
|
252
|
+
for (let n = 2; taken.has(name); n++) name = `${base}-${n}`;
|
|
253
|
+
taken.add(name);
|
|
254
|
+
return name;
|
|
255
|
+
}
|
|
256
|
+
function readBuildFile(path) {
|
|
257
|
+
try {
|
|
258
|
+
return readFileSync(path, "utf8");
|
|
259
|
+
} catch {
|
|
260
|
+
return void 0;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function itemStatus(target, sha256) {
|
|
264
|
+
if (!existsSync(target)) return "new";
|
|
265
|
+
const existing = readBuildFile(target);
|
|
266
|
+
return existing !== void 0 && sha256Text(existing) === sha256 ? "same" : "conflict";
|
|
267
|
+
}
|
|
268
|
+
function renderInstructions(sections, sources, env) {
|
|
269
|
+
const blocks = [];
|
|
270
|
+
for (const source of sources) {
|
|
271
|
+
const own = sections.filter((section) => section.origins[0]?.sourceId === source.id);
|
|
272
|
+
if (own.length === 0) continue;
|
|
273
|
+
blocks.push(`<!-- From ${describeSource(source, env)} (${source.reaches.join(", ")}) -->`);
|
|
274
|
+
let managed;
|
|
275
|
+
for (const section of own) {
|
|
276
|
+
if (section.managedBy && section.managedBy !== managed) {
|
|
277
|
+
blocks.push(
|
|
278
|
+
`<!-- Maintained by ${section.managedBy}; later changes there won't follow. -->`
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
managed = section.managedBy;
|
|
282
|
+
blocks.push(section.text);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return blocks.length > 0 ? `${blocks.join("\n\n")}
|
|
286
|
+
` : "";
|
|
287
|
+
}
|
|
288
|
+
function planInstructions(text) {
|
|
289
|
+
const target = getUserInstructionsTargetPath();
|
|
290
|
+
const current = readBuildFile(target);
|
|
291
|
+
const existing = current !== void 0 ? { sha256: sha256Text(current), bytes: byteLength(current), empty: current.trim() === "" } : void 0;
|
|
292
|
+
const sha256 = sha256Text(text);
|
|
293
|
+
const status = text === "" ? "none" : existing?.sha256 === sha256 ? "same" : existing && !existing.empty ? "replace" : "new";
|
|
294
|
+
return {
|
|
295
|
+
target,
|
|
296
|
+
text,
|
|
297
|
+
sha256,
|
|
298
|
+
bytes: byteLength(text),
|
|
299
|
+
...existing ? { existing } : {},
|
|
300
|
+
status
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function runtimeSteeringBytes(bytes) {
|
|
304
|
+
return byteLength(CORE_DOCTRINE.map((entry) => entry.text).join("\n\n")) + 2 + bytes;
|
|
305
|
+
}
|
|
306
|
+
function steeringLimits(bytes) {
|
|
307
|
+
if (bytes === 0) return [];
|
|
308
|
+
return STEERING_PROVIDERS.map((provider) => ({
|
|
309
|
+
provider,
|
|
310
|
+
...assessSteeringCap(provider, runtimeSteeringBytes(bytes))
|
|
311
|
+
})).filter((status) => status.status !== "ok");
|
|
312
|
+
}
|
|
313
|
+
function hashPlan(instructions, items) {
|
|
314
|
+
return createHash2("sha256").update(
|
|
315
|
+
JSON.stringify({
|
|
316
|
+
instructions: [instructions.target, instructions.sha256, instructions.existing?.sha256],
|
|
317
|
+
items: items.map((item) => [item.kind, item.name, item.sha256, item.status])
|
|
318
|
+
})
|
|
319
|
+
).digest("hex");
|
|
320
|
+
}
|
|
321
|
+
function planInstructionsImport(options = {}) {
|
|
322
|
+
const env = options.env ?? process.env;
|
|
323
|
+
const discovered = discoverAgentInstructionSources(env);
|
|
324
|
+
const sources = [...discovered.sources];
|
|
325
|
+
const agents = discovered.agents.map((agent) => ({ ...agent }));
|
|
326
|
+
const legacy = legacyBuildSource();
|
|
327
|
+
if (legacy) {
|
|
328
|
+
const shared = sources.find((source) => source.identity === legacy.identity);
|
|
329
|
+
if (shared) shared.reaches.push(BUILD_AGENT);
|
|
330
|
+
else sources.unshift(legacy);
|
|
331
|
+
agents.unshift({ agent: BUILD_AGENT, home: dirname(legacy.path), homeFound: true });
|
|
332
|
+
}
|
|
333
|
+
const secretsWithheld = [];
|
|
334
|
+
const sectioned = [];
|
|
335
|
+
const items = [];
|
|
336
|
+
const takenNames = /* @__PURE__ */ new Set();
|
|
337
|
+
for (const source of sources) {
|
|
338
|
+
const cleaned = withholdSecrets(
|
|
339
|
+
source.text,
|
|
340
|
+
{ sourceId: source.id, path: source.path },
|
|
341
|
+
source.includeLines
|
|
342
|
+
);
|
|
343
|
+
secretsWithheld.push(...cleaned.withheld);
|
|
344
|
+
if (source.pathScoped && source.ruleName) {
|
|
345
|
+
const name = itemName(source.ruleName, takenNames);
|
|
346
|
+
const target = join(getUserBuildHome(), "steering", `${name}.md`);
|
|
347
|
+
const text = `${cleaned.text.trim()}
|
|
348
|
+
`;
|
|
349
|
+
const sha256 = sha256Text(text);
|
|
350
|
+
items.push({
|
|
351
|
+
kind: "steering",
|
|
352
|
+
name,
|
|
353
|
+
target,
|
|
354
|
+
sourceId: source.id,
|
|
355
|
+
text,
|
|
356
|
+
sha256,
|
|
357
|
+
status: itemStatus(target, sha256)
|
|
358
|
+
});
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
sectioned.push({ sourceId: source.id, reaches: source.reaches, text: cleaned.text });
|
|
362
|
+
}
|
|
363
|
+
const { sections, managedBlocks } = dedupeSections(sectioned);
|
|
364
|
+
const instructions = planInstructions(renderInstructions(sections, sources, env));
|
|
365
|
+
const byId = new Map(sources.map((source) => [source.id, source]));
|
|
366
|
+
const coverage = agents.map((agent) => ({
|
|
367
|
+
...agent,
|
|
368
|
+
sources: sources.filter((source) => source.reaches.includes(agent.agent)).length,
|
|
369
|
+
sections: sections.filter((section) => section.reaches.includes(agent.agent)).length
|
|
370
|
+
}));
|
|
371
|
+
const fingerprints = Object.fromEntries(
|
|
372
|
+
sources.map((source) => [source.id, sha256Text(source.text)])
|
|
373
|
+
);
|
|
374
|
+
return {
|
|
375
|
+
version: "verbatim",
|
|
376
|
+
agents: coverage,
|
|
377
|
+
sources: sources.map((source) => ({
|
|
378
|
+
id: source.id,
|
|
379
|
+
path: source.path,
|
|
380
|
+
kind: source.kind,
|
|
381
|
+
reaches: [...source.reaches],
|
|
382
|
+
sha256: fingerprints[source.id] ?? "",
|
|
383
|
+
bytes: byteLength(source.text),
|
|
384
|
+
...source.includedFrom ? { includedFrom: source.includedFrom } : {},
|
|
385
|
+
...source.pathScoped ? { pathScoped: true } : {}
|
|
386
|
+
})),
|
|
387
|
+
issues: discovered.issues,
|
|
388
|
+
sections,
|
|
389
|
+
managedBlocks: managedBlocks.map((block) => ({
|
|
390
|
+
...block,
|
|
391
|
+
path: byId.get(block.sourceId)?.path ?? block.sourceId
|
|
392
|
+
})),
|
|
393
|
+
secretsWithheld,
|
|
394
|
+
instructions,
|
|
395
|
+
items,
|
|
396
|
+
steeringLimits: steeringLimits(instructions.bytes),
|
|
397
|
+
fingerprints,
|
|
398
|
+
...legacy ? { legacyInstructions: legacy.path } : {},
|
|
399
|
+
planHash: hashPlan(instructions, items)
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
function withOptimizedInstructions(plan, text) {
|
|
403
|
+
const instructions = planInstructions(text);
|
|
404
|
+
return {
|
|
405
|
+
...plan,
|
|
406
|
+
version: "optimized",
|
|
407
|
+
instructions,
|
|
408
|
+
steeringLimits: steeringLimits(instructions.bytes),
|
|
409
|
+
planHash: hashPlan(instructions, plan.items),
|
|
410
|
+
basePlanHash: plan.basePlanHash ?? plan.planHash
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
function isImportUpToDate(plan) {
|
|
414
|
+
return (plan.instructions.status === "same" || plan.instructions.status === "none") && plan.items.every((item) => item.status !== "new");
|
|
415
|
+
}
|
|
416
|
+
function sameFingerprints(a, b) {
|
|
417
|
+
const keys = Object.keys(a);
|
|
418
|
+
return keys.length === Object.keys(b).length && keys.every((key) => a[key] === b[key]);
|
|
419
|
+
}
|
|
420
|
+
function isImportCurrent(plan, state) {
|
|
421
|
+
if (isImportUpToDate(plan)) return true;
|
|
422
|
+
return state?.status === "imported" && state.version === "optimized" && plan.instructions.existing?.empty === false && sameFingerprints(state.fingerprints, plan.fingerprints) && plan.items.every((item) => item.status !== "new");
|
|
423
|
+
}
|
|
424
|
+
function describeImportPlan(plan) {
|
|
425
|
+
const { text: _text, ...instructions } = plan.instructions;
|
|
426
|
+
return {
|
|
427
|
+
version: plan.version,
|
|
428
|
+
agents: plan.agents,
|
|
429
|
+
sources: plan.sources,
|
|
430
|
+
issues: plan.issues,
|
|
431
|
+
sections: plan.sections.map((section) => ({
|
|
432
|
+
heading: section.heading ?? null,
|
|
433
|
+
origins: section.origins.map((origin) => origin.sourceId),
|
|
434
|
+
reaches: section.reaches,
|
|
435
|
+
...section.managedBy ? { managedBy: section.managedBy } : {}
|
|
436
|
+
})),
|
|
437
|
+
managedBlocks: plan.managedBlocks.map((block) => ({
|
|
438
|
+
path: block.path,
|
|
439
|
+
line: block.line,
|
|
440
|
+
name: block.name,
|
|
441
|
+
note: "later changes won't follow"
|
|
442
|
+
})),
|
|
443
|
+
// `source` is the file, or `<file>#<key>` for a settings value; `line` counts within it.
|
|
444
|
+
secretsWithheld: plan.secretsWithheld.map(({ sourceId, line, pattern }) => ({
|
|
445
|
+
source: sourceId,
|
|
446
|
+
line,
|
|
447
|
+
pattern
|
|
448
|
+
})),
|
|
449
|
+
instructions,
|
|
450
|
+
items: plan.items.map(({ text: _itemText, ...item }) => item),
|
|
451
|
+
conflicts: plan.items.filter((item) => item.status === "conflict").map(({ kind, name, target }) => ({ kind, name, target })),
|
|
452
|
+
steeringLimits: plan.steeringLimits,
|
|
453
|
+
...plan.legacyInstructions ? { legacyInstructions: plan.legacyInstructions } : {}
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// src/core/instructions-import/staging.ts
|
|
458
|
+
import { randomBytes } from "crypto";
|
|
459
|
+
import {
|
|
460
|
+
chmodSync,
|
|
461
|
+
closeSync,
|
|
462
|
+
existsSync as existsSync2,
|
|
463
|
+
mkdirSync,
|
|
464
|
+
openSync,
|
|
465
|
+
readFileSync as readFileSync2,
|
|
466
|
+
renameSync,
|
|
467
|
+
rmdirSync,
|
|
468
|
+
statSync,
|
|
469
|
+
unlinkSync,
|
|
470
|
+
writeFileSync
|
|
471
|
+
} from "fs";
|
|
472
|
+
import { basename, dirname as dirname2, join as join2 } from "path";
|
|
473
|
+
import lockfile from "proper-lockfile";
|
|
474
|
+
var ImportActivationError = class extends Error {
|
|
475
|
+
constructor(message, reason) {
|
|
476
|
+
super(message);
|
|
477
|
+
this.reason = reason;
|
|
478
|
+
this.name = "ImportActivationError";
|
|
479
|
+
}
|
|
480
|
+
reason;
|
|
481
|
+
};
|
|
482
|
+
var STAGED_INSTRUCTIONS = "instructions.md";
|
|
483
|
+
var PREVIOUS_INSTRUCTIONS = "previous-instructions.md";
|
|
484
|
+
var ACTIVATE_LOCK = ".activate.lock";
|
|
485
|
+
var LOCK_STALE_MS = 6e4;
|
|
486
|
+
function ensurePrivateDir(dir) {
|
|
487
|
+
mkdirSync(dir, { recursive: true, mode: 448 });
|
|
488
|
+
chmodSync(dir, 448);
|
|
489
|
+
}
|
|
490
|
+
function writePrivateFile(path, text) {
|
|
491
|
+
mkdirSync(dirname2(path), { recursive: true, mode: 448 });
|
|
492
|
+
writeFileSync(path, text, { encoding: "utf8", flag: "wx", mode: 384 });
|
|
493
|
+
}
|
|
494
|
+
function replaceFileAtomically(path, text) {
|
|
495
|
+
mkdirSync(dirname2(path), { recursive: true });
|
|
496
|
+
const temp = join2(
|
|
497
|
+
dirname2(path),
|
|
498
|
+
`.${basename(path)}.${process.pid}-${randomBytes(4).toString("hex")}.tmp`
|
|
499
|
+
);
|
|
500
|
+
let mode;
|
|
501
|
+
try {
|
|
502
|
+
mode = statSync(path).mode & 511;
|
|
503
|
+
} catch {
|
|
504
|
+
mode = void 0;
|
|
505
|
+
}
|
|
506
|
+
writeFileSync(temp, text, { encoding: "utf8", flag: "wx", ...mode ? { mode } : {} });
|
|
507
|
+
try {
|
|
508
|
+
renameSync(temp, path);
|
|
509
|
+
} catch (error) {
|
|
510
|
+
try {
|
|
511
|
+
unlinkSync(temp);
|
|
512
|
+
} catch {
|
|
513
|
+
}
|
|
514
|
+
throw error;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
function writeManifest(staged) {
|
|
518
|
+
staged.manifest.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
519
|
+
const path = join2(staged.dir, MANIFEST);
|
|
520
|
+
const temp = `${path}.${process.pid}.tmp`;
|
|
521
|
+
writeFileSync(temp, `${JSON.stringify(staged.manifest, null, 2)}
|
|
522
|
+
`, { mode: 384 });
|
|
523
|
+
renameSync(temp, path);
|
|
524
|
+
}
|
|
525
|
+
function importId(now) {
|
|
526
|
+
return now.toISOString().replace(/[-:.]/g, "");
|
|
527
|
+
}
|
|
528
|
+
function stageInstructionsImport(plan, optimization = { status: "none" }) {
|
|
529
|
+
const root = getImportsDir();
|
|
530
|
+
ensurePrivateDir(root);
|
|
531
|
+
const base = importId(/* @__PURE__ */ new Date());
|
|
532
|
+
let id = base;
|
|
533
|
+
let dir = join2(root, id);
|
|
534
|
+
for (let n = 2; ; n++) {
|
|
535
|
+
try {
|
|
536
|
+
mkdirSync(dir, { mode: 448 });
|
|
537
|
+
break;
|
|
538
|
+
} catch (error) {
|
|
539
|
+
if (error.code !== "EEXIST") throw error;
|
|
540
|
+
id = `${base}-${n}`;
|
|
541
|
+
dir = join2(root, id);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
chmodSync(dir, 448);
|
|
545
|
+
const writesInstructions = plan.instructions.status === "new" || plan.instructions.status === "replace";
|
|
546
|
+
if (writesInstructions) writePrivateFile(join2(dir, STAGED_INSTRUCTIONS), plan.instructions.text);
|
|
547
|
+
const items = plan.items.filter((item) => item.status === "new").map((item) => {
|
|
548
|
+
const file = join2(
|
|
549
|
+
item.kind,
|
|
550
|
+
item.kind === "skills" ? `${item.name}/SKILL.md` : `${item.name}.md`
|
|
551
|
+
);
|
|
552
|
+
writePrivateFile(join2(dir, file), item.text);
|
|
553
|
+
return { kind: item.kind, name: item.name, target: item.target, file, sha256: item.sha256 };
|
|
554
|
+
});
|
|
555
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
556
|
+
const staged = {
|
|
557
|
+
id,
|
|
558
|
+
dir,
|
|
559
|
+
manifest: {
|
|
560
|
+
schema: 1,
|
|
561
|
+
id,
|
|
562
|
+
status: "staged",
|
|
563
|
+
version: plan.version,
|
|
564
|
+
createdAt: now,
|
|
565
|
+
updatedAt: now,
|
|
566
|
+
planHash: plan.planHash,
|
|
567
|
+
...plan.basePlanHash ? { basePlanHash: plan.basePlanHash } : {},
|
|
568
|
+
...writesInstructions ? {
|
|
569
|
+
instructions: {
|
|
570
|
+
target: plan.instructions.target,
|
|
571
|
+
file: STAGED_INSTRUCTIONS,
|
|
572
|
+
sha256: plan.instructions.sha256,
|
|
573
|
+
expectedExistingSha256: plan.instructions.existing?.sha256 ?? null
|
|
574
|
+
}
|
|
575
|
+
} : {},
|
|
576
|
+
items,
|
|
577
|
+
fingerprints: plan.fingerprints,
|
|
578
|
+
secretsWithheld: plan.secretsWithheld,
|
|
579
|
+
optimization
|
|
580
|
+
}
|
|
581
|
+
};
|
|
582
|
+
writeManifest(staged);
|
|
583
|
+
return staged;
|
|
584
|
+
}
|
|
585
|
+
function readStagedInstructions(staged) {
|
|
586
|
+
const file = staged.manifest.instructions?.file;
|
|
587
|
+
return file ? readBuildFile(join2(staged.dir, file)) : void 0;
|
|
588
|
+
}
|
|
589
|
+
function canResumeImport(staged, plan) {
|
|
590
|
+
const { damaged, stale } = checkStagedImport(staged);
|
|
591
|
+
if (damaged.length > 0 || stale.length > 0) return false;
|
|
592
|
+
const instructions = staged.manifest.instructions;
|
|
593
|
+
return staged.manifest.planHash === plan.planHash || staged.manifest.basePlanHash === plan.planHash || instructions !== void 0 && currentSha(instructions.target) === instructions.sha256;
|
|
594
|
+
}
|
|
595
|
+
function markStagedImport(staged, status, error) {
|
|
596
|
+
staged.manifest.status = status;
|
|
597
|
+
if (error) staged.manifest.error = error;
|
|
598
|
+
writeManifest(staged);
|
|
599
|
+
}
|
|
600
|
+
function currentSha(path) {
|
|
601
|
+
const text = readBuildFile(path);
|
|
602
|
+
return text === void 0 ? null : sha256Text(text);
|
|
603
|
+
}
|
|
604
|
+
function checkStagedImport(staged) {
|
|
605
|
+
const damaged = [];
|
|
606
|
+
const stale = [];
|
|
607
|
+
if (staged.manifest.status !== "staged")
|
|
608
|
+
damaged.push(`import ${staged.id} is ${staged.manifest.status}`);
|
|
609
|
+
const files = [
|
|
610
|
+
...staged.manifest.instructions ? [staged.manifest.instructions] : [],
|
|
611
|
+
...staged.manifest.items
|
|
612
|
+
];
|
|
613
|
+
for (const file of files) {
|
|
614
|
+
if (currentSha(join2(staged.dir, file.file)) !== file.sha256) {
|
|
615
|
+
damaged.push(`staged file ${file.file} is missing or changed`);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
const instructions = staged.manifest.instructions;
|
|
619
|
+
const target = instructions ? currentSha(instructions.target) : null;
|
|
620
|
+
if (instructions && target !== instructions.expectedExistingSha256 && target !== instructions.sha256) {
|
|
621
|
+
stale.push(`${instructions.target} changed after this import was prepared`);
|
|
622
|
+
}
|
|
623
|
+
return { damaged, stale };
|
|
624
|
+
}
|
|
625
|
+
function acquireActivationLock() {
|
|
626
|
+
const target = join2(getImportsDir(), ACTIVATE_LOCK);
|
|
627
|
+
ensurePrivateDir(getImportsDir());
|
|
628
|
+
closeSync(openSync(target, "a", 384));
|
|
629
|
+
try {
|
|
630
|
+
return lockfile.lockSync(target, { stale: LOCK_STALE_MS, realpath: false });
|
|
631
|
+
} catch (error) {
|
|
632
|
+
if (error.code === "ELOCKED") {
|
|
633
|
+
throw new ImportActivationError("another import is being installed right now", "busy");
|
|
634
|
+
}
|
|
635
|
+
throw error;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
var AUTOMATED_INHERITANCE = "inheritance.automated";
|
|
639
|
+
async function setAutomatedInheritance() {
|
|
640
|
+
const manager = new ConfigManager();
|
|
641
|
+
const before = await manager.getConfigValue(AUTOMATED_INHERITANCE, "user");
|
|
642
|
+
const result = await manager.setConfigValue(AUTOMATED_INHERITANCE, "build", "user");
|
|
643
|
+
if (!result.success) {
|
|
644
|
+
throw new Error(`could not set ${AUTOMATED_INHERITANCE}: ${result.error ?? "unknown error"}`);
|
|
645
|
+
}
|
|
646
|
+
const undo = () => {
|
|
647
|
+
if (before === "build") return;
|
|
648
|
+
const file = selectedBuildConfigCandidate(getUserConfigFile());
|
|
649
|
+
const edit = { path: AUTOMATED_INHERITANCE.split("."), value: before };
|
|
650
|
+
const restored = writeJsoncEdits(file, [edit], process.cwd());
|
|
651
|
+
if (!restored.success) {
|
|
652
|
+
throw new Error(`could not restore ${AUTOMATED_INHERITANCE}: ${restored.error ?? "unknown"}`);
|
|
653
|
+
}
|
|
654
|
+
};
|
|
655
|
+
return {
|
|
656
|
+
inheritance: { path: getUserConfigFile(), setting: AUTOMATED_INHERITANCE, value: "build" },
|
|
657
|
+
undo
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
function createdFolders(dir, firstCreated) {
|
|
661
|
+
if (!firstCreated) return [];
|
|
662
|
+
const folders = [];
|
|
663
|
+
for (let current = dir; ; current = dirname2(current)) {
|
|
664
|
+
folders.push(current);
|
|
665
|
+
if (current === firstCreated || dirname2(current) === current) return folders;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
async function activateStagedImport(staged) {
|
|
669
|
+
const { damaged, stale } = checkStagedImport(staged);
|
|
670
|
+
if (damaged.length > 0) throw new ImportActivationError(damaged.join("; "), "damaged");
|
|
671
|
+
if (stale.length > 0) throw new ImportActivationError(stale.join("; "), "stale");
|
|
672
|
+
const release = acquireActivationLock();
|
|
673
|
+
const changes = { created: [], folders: [] };
|
|
674
|
+
const created = changes.created;
|
|
675
|
+
const skipped = [];
|
|
676
|
+
try {
|
|
677
|
+
try {
|
|
678
|
+
for (const item of staged.manifest.items) {
|
|
679
|
+
const text = readFileSync2(join2(staged.dir, item.file), "utf8");
|
|
680
|
+
if (existsSync2(item.target)) {
|
|
681
|
+
const reason = currentSha(item.target) === item.sha256 ? "same" : "conflict";
|
|
682
|
+
skipped.push({ kind: item.kind, name: item.name, path: item.target, reason });
|
|
683
|
+
continue;
|
|
684
|
+
}
|
|
685
|
+
const folder = dirname2(item.target);
|
|
686
|
+
changes.folders.push(...createdFolders(folder, mkdirSync(folder, { recursive: true })));
|
|
687
|
+
writeFileSync(item.target, text, { encoding: "utf8", flag: "wx" });
|
|
688
|
+
created.push({ kind: item.kind, name: item.name, path: item.target });
|
|
689
|
+
}
|
|
690
|
+
let instructions;
|
|
691
|
+
const staging = staged.manifest.instructions;
|
|
692
|
+
if (staging) {
|
|
693
|
+
const previousCopy = join2(staged.dir, PREVIOUS_INSTRUCTIONS);
|
|
694
|
+
const before = staging.expectedExistingSha256 === null ? null : readBuildFile(previousCopy) ?? readBuildFile(staging.target) ?? null;
|
|
695
|
+
if (before !== null && !existsSync2(previousCopy)) writePrivateFile(previousCopy, before);
|
|
696
|
+
changes.previous = { target: staging.target, text: before };
|
|
697
|
+
replaceFileAtomically(staging.target, readFileSync2(join2(staged.dir, staging.file), "utf8"));
|
|
698
|
+
instructions = {
|
|
699
|
+
path: staging.target,
|
|
700
|
+
replaced: before !== null,
|
|
701
|
+
...before !== null ? { previousCopy } : {}
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
const { inheritance, undo } = await setAutomatedInheritance();
|
|
705
|
+
changes.undoInheritance = undo;
|
|
706
|
+
const state = recordInstructionsImportState({
|
|
707
|
+
status: "imported",
|
|
708
|
+
version: staged.manifest.version,
|
|
709
|
+
importId: staged.id,
|
|
710
|
+
fingerprints: staged.manifest.fingerprints,
|
|
711
|
+
optimization: staged.manifest.optimization ?? { status: "none" }
|
|
712
|
+
});
|
|
713
|
+
staged.manifest.status = "activated";
|
|
714
|
+
writeManifest(staged);
|
|
715
|
+
return {
|
|
716
|
+
id: staged.id,
|
|
717
|
+
...instructions ? { instructions } : {},
|
|
718
|
+
created,
|
|
719
|
+
skipped,
|
|
720
|
+
inheritance,
|
|
721
|
+
state
|
|
722
|
+
};
|
|
723
|
+
} catch (error) {
|
|
724
|
+
let message = errorText(error);
|
|
725
|
+
const failures = rollBack(changes, staged.dir);
|
|
726
|
+
if (failures.length > 0) message += `; ${failures.join("; ")}`;
|
|
727
|
+
const reason = failures.length > 0 ? "unrestored" : "failed";
|
|
728
|
+
try {
|
|
729
|
+
markStagedImport(staged, "failed", message);
|
|
730
|
+
} catch {
|
|
731
|
+
}
|
|
732
|
+
throw new ImportActivationError(message, reason);
|
|
733
|
+
}
|
|
734
|
+
} finally {
|
|
735
|
+
release();
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
function rollBack(changes, stagingDir) {
|
|
739
|
+
const failures = [];
|
|
740
|
+
for (const item of [...changes.created].reverse()) {
|
|
741
|
+
try {
|
|
742
|
+
unlinkSync(item.path);
|
|
743
|
+
} catch {
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
for (const folder of [...changes.folders].sort((a, b) => b.length - a.length)) {
|
|
747
|
+
try {
|
|
748
|
+
rmdirSync(folder);
|
|
749
|
+
} catch {
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
const previous = changes.previous;
|
|
753
|
+
try {
|
|
754
|
+
if (previous?.text === null) {
|
|
755
|
+
if (existsSync2(previous.target)) unlinkSync(previous.target);
|
|
756
|
+
} else if (previous) {
|
|
757
|
+
replaceFileAtomically(previous.target, previous.text);
|
|
758
|
+
}
|
|
759
|
+
} catch (error) {
|
|
760
|
+
failures.push(
|
|
761
|
+
`restoring the previous instructions failed (${errorText(error)}); a copy is in ${stagingDir}`
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
try {
|
|
765
|
+
changes.undoInheritance?.();
|
|
766
|
+
} catch (error) {
|
|
767
|
+
failures.push(errorText(error));
|
|
768
|
+
}
|
|
769
|
+
return failures;
|
|
770
|
+
}
|
|
771
|
+
function errorText(error) {
|
|
772
|
+
return error instanceof Error ? error.message : String(error);
|
|
773
|
+
}
|
|
774
|
+
function declineStagedImport(staged, fingerprints, version = "verbatim") {
|
|
775
|
+
if (staged) markStagedImport(staged, "declined");
|
|
776
|
+
if (readInstructionsImportState()?.status === "imported") return;
|
|
777
|
+
recordInstructionsImportState({ status: "declined", version, fingerprints });
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// src/cli/commands/instructions-import.ts
|
|
781
|
+
import chalk from "chalk";
|
|
782
|
+
import { Command } from "commander";
|
|
783
|
+
|
|
784
|
+
// src/core/instructions-import/optimize.ts
|
|
785
|
+
import { mkdtempSync } from "fs";
|
|
786
|
+
import { tmpdir } from "os";
|
|
787
|
+
import { join as join3 } from "path";
|
|
788
|
+
var OPTIMIZED_INSTRUCTIONS_BUDGET_BYTES = Math.min(
|
|
789
|
+
...STEERING_PROVIDERS.map((provider) => resolveSteeringChannelCaps(provider).hardRefuseBytes)
|
|
790
|
+
) - runtimeSteeringBytes(0);
|
|
791
|
+
var OPTIMIZE_TIMEOUT_SECONDS = 600;
|
|
792
|
+
var OPTIMIZE_AGENT_ROLE = "instructions-import";
|
|
793
|
+
var OPEN_TAG = "<instructions>";
|
|
794
|
+
var CLOSE_TAG = "</instructions>";
|
|
795
|
+
var MAX_REASON_CHARS = 240;
|
|
796
|
+
function shortReason(error) {
|
|
797
|
+
const text = (error instanceof Error ? error.message : String(error)).trim();
|
|
798
|
+
const line = text.split("\n")[0] ?? "";
|
|
799
|
+
return line.length > MAX_REASON_CHARS ? `${line.slice(0, MAX_REASON_CHARS - 3)}...` : line;
|
|
800
|
+
}
|
|
801
|
+
function resolveImportOptimizer(cwd = process.cwd()) {
|
|
802
|
+
let resolved;
|
|
803
|
+
try {
|
|
804
|
+
resolved = resolveJudgeConfig(void 0, cwd);
|
|
805
|
+
} catch (error) {
|
|
806
|
+
return { ready: false, reason: shortReason(error) };
|
|
807
|
+
}
|
|
808
|
+
const provider = resolved.provider.value;
|
|
809
|
+
if (!isProviderCliResolvable(provider)) {
|
|
810
|
+
return { ready: false, reason: `the ${provider} CLI was not found` };
|
|
811
|
+
}
|
|
812
|
+
return {
|
|
813
|
+
ready: true,
|
|
814
|
+
provider,
|
|
815
|
+
model: resolved.model.value,
|
|
816
|
+
...resolved.reasoningEffort ? { reasoningEffort: resolved.reasoningEffort.value } : {}
|
|
817
|
+
};
|
|
818
|
+
}
|
|
819
|
+
function buildOptimizePrompt(plan, env = process.env) {
|
|
820
|
+
const budget = OPTIMIZED_INSTRUCTIONS_BUDGET_BYTES;
|
|
821
|
+
const sections = plan.sections.map((section) => {
|
|
822
|
+
const from = section.origins.map((origin) => displayPath(origin.sourceId, env)).join(", ");
|
|
823
|
+
return `<section from="${from}" agents="${section.reaches.join(", ")}">
|
|
824
|
+
${section.text}
|
|
825
|
+
</section>`;
|
|
826
|
+
});
|
|
827
|
+
return [
|
|
828
|
+
"Rewrite a person's global instructions for AI coding agents as one short instructions file.",
|
|
829
|
+
"",
|
|
830
|
+
"Build gives this file to every agent it launches, in place of the global instructions each agent loads on its own. The sections below are what those agents load today, already cleaned: exact duplicates removed and possible secrets left out. Each section names the files it came from and the agents that load it today.",
|
|
831
|
+
"",
|
|
832
|
+
"Write the file so that it:",
|
|
833
|
+
"- Keeps the meaning of every rule. Do not drop, weaken, or add a rule.",
|
|
834
|
+
"- Merges rules that say the same thing, and cuts repetition, filler, and examples that only restate a rule.",
|
|
835
|
+
'- Keeps a short scope note, such as "(Codex only)", on a rule that applies to only one agent: its text is about that agent, or only that agent loads it today.',
|
|
836
|
+
"- Uses plain markdown: short headings and bullet points.",
|
|
837
|
+
`- Fits in ${budget} bytes of UTF-8 text (about ${Math.floor(budget / 7)} words).`,
|
|
838
|
+
"- Contains no secrets, tokens, passwords, or keys.",
|
|
839
|
+
"",
|
|
840
|
+
`Reply with only the file, between a line ${OPEN_TAG} and a line ${CLOSE_TAG}.`,
|
|
841
|
+
"",
|
|
842
|
+
...sections,
|
|
843
|
+
""
|
|
844
|
+
].join("\n");
|
|
845
|
+
}
|
|
846
|
+
function isPlainText(text) {
|
|
847
|
+
for (let i = 0; i < text.length; i++) {
|
|
848
|
+
const code = text.charCodeAt(i);
|
|
849
|
+
if (code < 32 && code !== 9 && code !== 10 && code !== 13 || code === 127) {
|
|
850
|
+
return false;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
return true;
|
|
854
|
+
}
|
|
855
|
+
function isMarkdownText(text) {
|
|
856
|
+
if (!isPlainText(text) || !new RegExp("\\p{L}", "u").test(text)) return false;
|
|
857
|
+
if (/^[{[]/.test(text)) {
|
|
858
|
+
try {
|
|
859
|
+
JSON.parse(text);
|
|
860
|
+
return false;
|
|
861
|
+
} catch {
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
return true;
|
|
865
|
+
}
|
|
866
|
+
function checkOptimizedReply(reply) {
|
|
867
|
+
const start = reply.indexOf(OPEN_TAG);
|
|
868
|
+
const end = reply.lastIndexOf(CLOSE_TAG);
|
|
869
|
+
if (start === -1 || end <= start) {
|
|
870
|
+
return { ok: false, reason: `the reply had no ${OPEN_TAG} block` };
|
|
871
|
+
}
|
|
872
|
+
let body = reply.slice(start + OPEN_TAG.length, end).trim();
|
|
873
|
+
const fenced = /^(```|~~~)[\w-]*\n([\s\S]*)\n\1$/.exec(body);
|
|
874
|
+
if (fenced?.[2] !== void 0) body = fenced[2].trim();
|
|
875
|
+
if (body === "") return { ok: false, reason: "the reply was empty" };
|
|
876
|
+
if (!isMarkdownText(body)) return { ok: false, reason: "the reply was not markdown text" };
|
|
877
|
+
const secret = withholdSecrets(body, { sourceId: "reply", path: "reply" }).withheld[0];
|
|
878
|
+
if (secret) {
|
|
879
|
+
return {
|
|
880
|
+
ok: false,
|
|
881
|
+
reason: `the reply had a possible secret (${secret.pattern}, line ${secret.line})`
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
const text = `${body}
|
|
885
|
+
`;
|
|
886
|
+
const bytes = byteLength(text);
|
|
887
|
+
if (bytes > OPTIMIZED_INSTRUCTIONS_BUDGET_BYTES) {
|
|
888
|
+
return {
|
|
889
|
+
ok: false,
|
|
890
|
+
reason: `the reply was ${bytes} bytes, over the ${OPTIMIZED_INSTRUCTIONS_BUDGET_BYTES}-byte budget`
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
return { ok: true, text };
|
|
894
|
+
}
|
|
895
|
+
async function optimizeInstructionsImport(plan, options = {}) {
|
|
896
|
+
if (plan.instructions.text === "") {
|
|
897
|
+
return { ok: false, reason: "there are no instructions to optimize" };
|
|
898
|
+
}
|
|
899
|
+
const optimizer = options.optimizer ?? resolveImportOptimizer();
|
|
900
|
+
if (!optimizer.ready) return { ok: false, reason: `no ready provider (${optimizer.reason})` };
|
|
901
|
+
const scratchRoot = tmpdir();
|
|
902
|
+
const scratch = mkdtempSync(join3(scratchRoot, "build-instructions-optimize-"));
|
|
903
|
+
let reply;
|
|
904
|
+
try {
|
|
905
|
+
const result = await new LlmJudgeExecutor().evaluate(buildOptimizePrompt(plan, options.env), {
|
|
906
|
+
provider: optimizer.provider,
|
|
907
|
+
model: optimizer.model,
|
|
908
|
+
...optimizer.reasoningEffort ? { reasoningEffort: optimizer.reasoningEffort } : {},
|
|
909
|
+
workingDir: scratch,
|
|
910
|
+
timeoutSeconds: OPTIMIZE_TIMEOUT_SECONDS,
|
|
911
|
+
// One call: a failure falls back to the verbatim version instead of retrying.
|
|
912
|
+
maxAttempts: 1,
|
|
913
|
+
requireThinking: false,
|
|
914
|
+
showProgress: false,
|
|
915
|
+
env: { BUILD_AGENT_ROLE: OPTIMIZE_AGENT_ROLE }
|
|
916
|
+
});
|
|
917
|
+
reply = result.output;
|
|
918
|
+
} catch (error) {
|
|
919
|
+
return { ok: false, reason: `the ${optimizer.provider} call failed: ${shortReason(error)}` };
|
|
920
|
+
} finally {
|
|
921
|
+
await safeRmDir(scratch, { protectedPaths: [scratchRoot], managedRoots: [scratchRoot] }).catch(
|
|
922
|
+
() => void 0
|
|
923
|
+
);
|
|
924
|
+
}
|
|
925
|
+
const checked = checkOptimizedReply(reply);
|
|
926
|
+
if (!checked.ok) return checked;
|
|
927
|
+
return {
|
|
928
|
+
ok: true,
|
|
929
|
+
plan: withOptimizedInstructions(plan, checked.text),
|
|
930
|
+
provider: optimizer.provider
|
|
931
|
+
};
|
|
932
|
+
}
|
|
933
|
+
async function prepareOptimizedImport(plan, options = {}) {
|
|
934
|
+
const result = await optimizeInstructionsImport(plan, options);
|
|
935
|
+
return result.ok ? { plan: result.plan, optimization: { status: "done", provider: result.provider } } : { plan, optimization: { status: "pending", reason: result.reason } };
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
// src/cli/utils/line-diff.ts
|
|
939
|
+
function splitLinesForDiff(text) {
|
|
940
|
+
const normalized = text.replace(/\r\n/g, "\n");
|
|
941
|
+
const lines = normalized.split("\n");
|
|
942
|
+
if (lines.length > 0 && lines[lines.length - 1] === "") {
|
|
943
|
+
lines.pop();
|
|
944
|
+
}
|
|
945
|
+
return lines;
|
|
946
|
+
}
|
|
947
|
+
function formatLineDiff(before, after, labels) {
|
|
948
|
+
const a = splitLinesForDiff(before);
|
|
949
|
+
const b = splitLinesForDiff(after);
|
|
950
|
+
const dp = Array.from(
|
|
951
|
+
{ length: a.length + 1 },
|
|
952
|
+
() => Array.from({ length: b.length + 1 }, () => 0)
|
|
953
|
+
);
|
|
954
|
+
const score = (i2, j2) => dp[i2]?.[j2] ?? 0;
|
|
955
|
+
for (let i2 = a.length - 1; i2 >= 0; i2--) {
|
|
956
|
+
for (let j2 = b.length - 1; j2 >= 0; j2--) {
|
|
957
|
+
const beforeLine = a[i2] ?? "";
|
|
958
|
+
const afterLine = b[j2] ?? "";
|
|
959
|
+
const row = dp[i2];
|
|
960
|
+
if (!row) continue;
|
|
961
|
+
row[j2] = beforeLine === afterLine ? score(i2 + 1, j2 + 1) + 1 : Math.max(score(i2 + 1, j2), score(i2, j2 + 1));
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
const lines = [`--- ${labels.before}`, `+++ ${labels.after}`, "@@"];
|
|
965
|
+
let i = 0;
|
|
966
|
+
let j = 0;
|
|
967
|
+
while (i < a.length || j < b.length) {
|
|
968
|
+
if (i < a.length && j < b.length && a[i] === b[j]) {
|
|
969
|
+
lines.push(` ${a[i]}`);
|
|
970
|
+
i++;
|
|
971
|
+
j++;
|
|
972
|
+
} else if (j < b.length && (i === a.length || score(i, j + 1) >= score(i + 1, j))) {
|
|
973
|
+
lines.push(`+${b[j]}`);
|
|
974
|
+
j++;
|
|
975
|
+
} else if (i < a.length) {
|
|
976
|
+
lines.push(`-${a[i]}`);
|
|
977
|
+
i++;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
return lines;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
// src/cli/commands/instructions-import.ts
|
|
984
|
+
var IMPORT_VERSIONS = ["optimized", "verbatim"];
|
|
985
|
+
var OPTIMIZE_COMMAND = "build config instructions import --optimize";
|
|
986
|
+
function hasNothingToImport(plan) {
|
|
987
|
+
return plan.instructions.status === "none" && plan.items.length === 0;
|
|
988
|
+
}
|
|
989
|
+
function planStatus(plan, state) {
|
|
990
|
+
if (hasNothingToImport(plan)) return "nothing-to-import";
|
|
991
|
+
return isImportCurrent(plan, state) ? "up-to-date" : "ready";
|
|
992
|
+
}
|
|
993
|
+
function steeringLimitLines(plan) {
|
|
994
|
+
const version = `With the ${plan.version} version`;
|
|
995
|
+
return plan.steeringLimits.map(
|
|
996
|
+
(limit) => limit.status === "hard-refuse" ? `Warning: ${version}, ${limit.provider} runtime steering would be ${limit.bytes} bytes, over its ${limit.hardRefuseBytes}-byte limit, so its runs would start with a size warning (see build config instructions lint).` : `Info: ${version}, ${limit.provider} runtime steering would be ${limit.bytes} bytes, over its ${limit.softWarnBytes}-byte soft limit.`
|
|
997
|
+
);
|
|
998
|
+
}
|
|
999
|
+
function renderPlan(plan) {
|
|
1000
|
+
const show = (path) => displayPath(path);
|
|
1001
|
+
console.log("Instructions import");
|
|
1002
|
+
console.log("Sources:");
|
|
1003
|
+
for (const source of plan.sources) {
|
|
1004
|
+
const key = source.kind === "setting" ? ` ${source.id.slice(source.path.length + 1)}` : "";
|
|
1005
|
+
const from = source.includedFrom ? `, included from ${show(source.includedFrom)}` : "";
|
|
1006
|
+
console.log(` ${show(source.path)}${key} (loaded by ${source.reaches.join(", ")}${from})`);
|
|
1007
|
+
}
|
|
1008
|
+
const duplicates = plan.sections.reduce((sum, section) => sum + section.origins.length - 1, 0);
|
|
1009
|
+
console.log(`Sections: ${plan.sections.length} (${duplicates} duplicates removed)`);
|
|
1010
|
+
console.log("Reaches today:");
|
|
1011
|
+
for (const agent of plan.agents) {
|
|
1012
|
+
const detail = agent.homeFound ? `${agent.sections} of ${plan.sections.length} sections` : `not set up (${show(agent.home)})`;
|
|
1013
|
+
console.log(` ${agent.agent}: ${detail}`);
|
|
1014
|
+
}
|
|
1015
|
+
if (plan.managedBlocks.length > 0) {
|
|
1016
|
+
console.log("Maintained by another tool (later changes won't follow):");
|
|
1017
|
+
for (const block of plan.managedBlocks) {
|
|
1018
|
+
console.log(` ${show(block.path)}:${block.line} ${block.name}`);
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
if (plan.secretsWithheld.length > 0) {
|
|
1022
|
+
console.log("Left out as possible secrets:");
|
|
1023
|
+
for (const secret of plan.secretsWithheld) {
|
|
1024
|
+
console.log(` ${show(secret.sourceId)}:${secret.line} ${secret.pattern}`);
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
if (plan.issues.length > 0) {
|
|
1028
|
+
console.log("Not read:");
|
|
1029
|
+
for (const issue of plan.issues) {
|
|
1030
|
+
const from = issue.includedFrom ? ` (named in ${show(issue.includedFrom)})` : "";
|
|
1031
|
+
console.log(` ${show(issue.path)}: ${issue.problem}${from}`);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
for (const item of plan.items) {
|
|
1035
|
+
const note = item.status === "conflict" ? "conflict, left unchanged" : item.status;
|
|
1036
|
+
console.log(`Adds ${item.kind} "${item.name}": ${show(item.target)} (${note})`);
|
|
1037
|
+
}
|
|
1038
|
+
if (plan.instructions.status !== "none") {
|
|
1039
|
+
console.log(
|
|
1040
|
+
`Writes: ${show(plan.instructions.target)} (${plan.instructions.status}; verbatim version ${plan.instructions.bytes} bytes)`
|
|
1041
|
+
);
|
|
1042
|
+
}
|
|
1043
|
+
if (plan.legacyInstructions) {
|
|
1044
|
+
console.log(
|
|
1045
|
+
`Info: ${show(plan.legacyInstructions)} is included and stops being read once instructions.md exists.`
|
|
1046
|
+
);
|
|
1047
|
+
}
|
|
1048
|
+
for (const line of steeringLimitLines(plan)) console.log(line);
|
|
1049
|
+
}
|
|
1050
|
+
function renderDifference(plan) {
|
|
1051
|
+
const before = readBuildFile(plan.instructions.target) ?? "";
|
|
1052
|
+
for (const line of formatLineDiff(before, plan.instructions.text, {
|
|
1053
|
+
before: `${displayPath(plan.instructions.target)} (now)`,
|
|
1054
|
+
after: `${displayPath(plan.instructions.target)} (after import)`
|
|
1055
|
+
})) {
|
|
1056
|
+
if (line.startsWith("+") && !line.startsWith("+++")) console.log(chalk.green(line));
|
|
1057
|
+
else if (line.startsWith("-") && !line.startsWith("---")) console.log(chalk.red(line));
|
|
1058
|
+
else console.log(line);
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
function resultLines(result, plan) {
|
|
1062
|
+
const lines = [];
|
|
1063
|
+
if (result.instructions) {
|
|
1064
|
+
const verb = result.instructions.replaced ? "Replaced" : "Installed";
|
|
1065
|
+
const copy = result.instructions.previousCopy ? ` (previous copy: ${displayPath(result.instructions.previousCopy)})` : "";
|
|
1066
|
+
lines.push(
|
|
1067
|
+
`OK: ${verb} ${displayPath(result.instructions.path)} with the ${result.state.version} version${copy}`
|
|
1068
|
+
);
|
|
1069
|
+
}
|
|
1070
|
+
for (const item of result.created) {
|
|
1071
|
+
lines.push(`OK: Added ${item.kind} "${item.name}": ${displayPath(item.path)}`);
|
|
1072
|
+
}
|
|
1073
|
+
for (const item of result.skipped.filter((skip) => skip.reason === "conflict")) {
|
|
1074
|
+
lines.push(
|
|
1075
|
+
`Warning: ${item.kind} "${item.name}" already exists at ${displayPath(item.path)}; left it unchanged.`
|
|
1076
|
+
);
|
|
1077
|
+
}
|
|
1078
|
+
lines.push(
|
|
1079
|
+
`Info: Set ${result.inheritance.setting} = ${result.inheritance.value} in ${displayPath(result.inheritance.path)}, so each agent Build launches gets these rules once, from Build.`
|
|
1080
|
+
);
|
|
1081
|
+
if (plan.legacyInstructions) {
|
|
1082
|
+
lines.push(`Info: ${displayPath(plan.legacyInstructions)} is no longer read.`);
|
|
1083
|
+
}
|
|
1084
|
+
lines.push(...optimizationLines(result.state.optimization));
|
|
1085
|
+
return lines;
|
|
1086
|
+
}
|
|
1087
|
+
function optimizationLines(optimization) {
|
|
1088
|
+
if (optimization.status === "pending") {
|
|
1089
|
+
return [
|
|
1090
|
+
`Info: The optimized version is pending (${optimization.reason}). Run "${OPTIMIZE_COMMAND}" in a terminal to finish it.`
|
|
1091
|
+
];
|
|
1092
|
+
}
|
|
1093
|
+
if (optimization.status === "failed") {
|
|
1094
|
+
return [
|
|
1095
|
+
`Info: The last optimization failed (${optimization.reason}). Run "${OPTIMIZE_COMMAND}" in a terminal to try again.`
|
|
1096
|
+
];
|
|
1097
|
+
}
|
|
1098
|
+
return [];
|
|
1099
|
+
}
|
|
1100
|
+
async function askLine(question) {
|
|
1101
|
+
const readline = await import("readline");
|
|
1102
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1103
|
+
try {
|
|
1104
|
+
return await new Promise((resolve) => rl.question(question, resolve));
|
|
1105
|
+
} finally {
|
|
1106
|
+
rl.close();
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
async function askYesNo(question) {
|
|
1110
|
+
return isYesAnswer(await askLine(question));
|
|
1111
|
+
}
|
|
1112
|
+
async function askVersion(provider) {
|
|
1113
|
+
const answer = (await askLine(
|
|
1114
|
+
`Install which version? [O]ptimized (one ${provider} call, no tools) / [v]erbatim (no model call) / [n]either: `
|
|
1115
|
+
)).trim().toLowerCase();
|
|
1116
|
+
if (answer === "" || answer === "o" || answer === "optimized") return "optimized";
|
|
1117
|
+
if (answer === "v" || answer === "verbatim") return "verbatim";
|
|
1118
|
+
return void 0;
|
|
1119
|
+
}
|
|
1120
|
+
function planForStagedImport(staged, plan) {
|
|
1121
|
+
const text = staged.manifest.version === "optimized" ? readStagedInstructions(staged) : void 0;
|
|
1122
|
+
return text === void 0 ? plan : withOptimizedInstructions(plan, text);
|
|
1123
|
+
}
|
|
1124
|
+
function isInteractive() {
|
|
1125
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
1126
|
+
}
|
|
1127
|
+
function refuseScriptedReplace(plan) {
|
|
1128
|
+
const existing = plan.instructions.existing;
|
|
1129
|
+
if (!existing || existing.empty) return false;
|
|
1130
|
+
console.error(
|
|
1131
|
+
`Error: ${displayPath(plan.instructions.target)} already has content, so the optimized version needs a shown difference and your confirmation. Run "build config instructions import" in a terminal.`
|
|
1132
|
+
);
|
|
1133
|
+
process.exitCode = 1;
|
|
1134
|
+
return true;
|
|
1135
|
+
}
|
|
1136
|
+
function reportOptimized(optimized, verbatim) {
|
|
1137
|
+
console.log(
|
|
1138
|
+
`Info: Optimized version: ${optimized.instructions.bytes} bytes (verbatim version: ${verbatim.instructions.bytes} bytes).`
|
|
1139
|
+
);
|
|
1140
|
+
}
|
|
1141
|
+
function runCheck(plan, state, json) {
|
|
1142
|
+
const pending = findPendingImport();
|
|
1143
|
+
const report = {
|
|
1144
|
+
status: planStatus(plan, state),
|
|
1145
|
+
...describeImportPlan(plan),
|
|
1146
|
+
pending: pending ? {
|
|
1147
|
+
id: pending.id,
|
|
1148
|
+
version: pending.manifest.version,
|
|
1149
|
+
createdAt: pending.manifest.createdAt,
|
|
1150
|
+
current: pending.manifest.planHash === plan.planHash || pending.manifest.basePlanHash === plan.planHash,
|
|
1151
|
+
...pending.manifest.optimization ? { optimization: pending.manifest.optimization } : {}
|
|
1152
|
+
} : null,
|
|
1153
|
+
state: state ?? null
|
|
1154
|
+
};
|
|
1155
|
+
if (json) {
|
|
1156
|
+
console.log(JSON.stringify(report, null, 2));
|
|
1157
|
+
return;
|
|
1158
|
+
}
|
|
1159
|
+
renderPlan(plan);
|
|
1160
|
+
if (report.pending) {
|
|
1161
|
+
console.log(`Info: an unfinished import from ${report.pending.createdAt} is waiting.`);
|
|
1162
|
+
}
|
|
1163
|
+
for (const line of state ? optimizationLines(state.optimization) : []) console.log(line);
|
|
1164
|
+
console.log(`Status: ${report.status}`);
|
|
1165
|
+
}
|
|
1166
|
+
async function reviewAndActivate(input) {
|
|
1167
|
+
const { plan, staged, yes } = input;
|
|
1168
|
+
const replacing = plan.instructions.status === "replace";
|
|
1169
|
+
if (replacing || !yes && plan.version === "optimized") renderDifference(plan);
|
|
1170
|
+
if (replacing && yes) {
|
|
1171
|
+
console.error(
|
|
1172
|
+
`Error: ${displayPath(plan.instructions.target)} already has content. Review the difference above, then run "build config instructions import" in a terminal to confirm. The prepared import is kept.`
|
|
1173
|
+
);
|
|
1174
|
+
process.exitCode = 1;
|
|
1175
|
+
return;
|
|
1176
|
+
}
|
|
1177
|
+
if (!yes && (replacing || plan.version === "optimized" || !input.agreed)) {
|
|
1178
|
+
const instead = input.instead ? " instead" : "";
|
|
1179
|
+
const question = replacing ? `Replace ${displayPath(plan.instructions.target)} with the ${plan.version} import${instead}? [y/N] ` : `Install the ${plan.version} import${instead}? [y/N] `;
|
|
1180
|
+
if (!await askYesNo(question)) {
|
|
1181
|
+
declineStagedImport(staged, input.verbatim.fingerprints, plan.version);
|
|
1182
|
+
console.log("No changes made.");
|
|
1183
|
+
return;
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
try {
|
|
1187
|
+
for (const line of resultLines(await activateStagedImport(staged), plan)) console.log(line);
|
|
1188
|
+
} catch (error) {
|
|
1189
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1190
|
+
console.error(`Error: import not installed: ${message}`);
|
|
1191
|
+
if (error instanceof ImportActivationError && error.reason === "failed") {
|
|
1192
|
+
console.error("Your previous instructions are unchanged.");
|
|
1193
|
+
}
|
|
1194
|
+
process.exitCode = 1;
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
async function runOptimize(plan, state, yes) {
|
|
1198
|
+
if (state?.status !== "imported") {
|
|
1199
|
+
console.log('Info: Nothing is imported yet; run "build config instructions import".');
|
|
1200
|
+
return;
|
|
1201
|
+
}
|
|
1202
|
+
if (state.version === "optimized") {
|
|
1203
|
+
console.log("OK: The optimized version is already installed.");
|
|
1204
|
+
return;
|
|
1205
|
+
}
|
|
1206
|
+
if (plan.instructions.text === "") {
|
|
1207
|
+
console.log("No agent instruction files found; nothing to optimize.");
|
|
1208
|
+
return;
|
|
1209
|
+
}
|
|
1210
|
+
if (!yes && !isInteractive()) {
|
|
1211
|
+
console.error(`Error: confirmation needed. Run "${OPTIMIZE_COMMAND}" in a terminal.`);
|
|
1212
|
+
process.exitCode = 1;
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
if (yes && refuseScriptedReplace(plan)) return;
|
|
1216
|
+
const pending = findPendingImport();
|
|
1217
|
+
if (pending?.manifest.version === "optimized" && canResumeImport(pending, plan)) {
|
|
1218
|
+
console.log(
|
|
1219
|
+
`Info: finishing the import prepared ${pending.manifest.createdAt} (optimized version).`
|
|
1220
|
+
);
|
|
1221
|
+
const optimized = planForStagedImport(pending, plan);
|
|
1222
|
+
await reviewAndActivate({
|
|
1223
|
+
verbatim: plan,
|
|
1224
|
+
plan: optimized,
|
|
1225
|
+
staged: pending,
|
|
1226
|
+
yes,
|
|
1227
|
+
agreed: true
|
|
1228
|
+
});
|
|
1229
|
+
return;
|
|
1230
|
+
}
|
|
1231
|
+
const optimizer = resolveImportOptimizer();
|
|
1232
|
+
if (optimizer.ready) {
|
|
1233
|
+
console.log(
|
|
1234
|
+
`Info: Making the optimized version with ${optimizer.provider} (one model call, no tools).`
|
|
1235
|
+
);
|
|
1236
|
+
}
|
|
1237
|
+
const result = await optimizeInstructionsImport(plan, { optimizer });
|
|
1238
|
+
if (!result.ok) {
|
|
1239
|
+
recordImportOptimization({
|
|
1240
|
+
status: "failed",
|
|
1241
|
+
reason: result.reason,
|
|
1242
|
+
date: (/* @__PURE__ */ new Date()).toISOString()
|
|
1243
|
+
});
|
|
1244
|
+
console.error(
|
|
1245
|
+
`Error: no optimized version: ${result.reason}. Your installed instructions are unchanged.`
|
|
1246
|
+
);
|
|
1247
|
+
process.exitCode = 1;
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1250
|
+
reportOptimized(result.plan, plan);
|
|
1251
|
+
if (pending) markStagedImport(pending, "superseded");
|
|
1252
|
+
const staged = stageInstructionsImport(result.plan, {
|
|
1253
|
+
status: "done",
|
|
1254
|
+
provider: result.provider
|
|
1255
|
+
});
|
|
1256
|
+
await reviewAndActivate({ verbatim: plan, plan: result.plan, staged, yes, agreed: true });
|
|
1257
|
+
}
|
|
1258
|
+
function readUseOption(options) {
|
|
1259
|
+
if (options.use === void 0) return void 0;
|
|
1260
|
+
const use = IMPORT_VERSIONS.find((version) => version === options.use);
|
|
1261
|
+
if (!use) {
|
|
1262
|
+
console.error(`Error: --use takes ${IMPORT_VERSIONS.join(" or ")}.`);
|
|
1263
|
+
process.exitCode = 1;
|
|
1264
|
+
return null;
|
|
1265
|
+
}
|
|
1266
|
+
return use;
|
|
1267
|
+
}
|
|
1268
|
+
async function runInstructionsImport(options) {
|
|
1269
|
+
if (options.json && !options.check) {
|
|
1270
|
+
console.error("Error: --json needs --check.");
|
|
1271
|
+
process.exitCode = 1;
|
|
1272
|
+
return;
|
|
1273
|
+
}
|
|
1274
|
+
if (options.check && options.yes) {
|
|
1275
|
+
console.error("Error: --check writes nothing; drop --yes.");
|
|
1276
|
+
process.exitCode = 1;
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1279
|
+
if (options.check && (options.use !== void 0 || options.optimize)) {
|
|
1280
|
+
console.error("Error: --check calls no model; drop --use and --optimize.");
|
|
1281
|
+
process.exitCode = 1;
|
|
1282
|
+
return;
|
|
1283
|
+
}
|
|
1284
|
+
const use = readUseOption(options);
|
|
1285
|
+
if (use === null) return;
|
|
1286
|
+
if (options.optimize && use === "verbatim") {
|
|
1287
|
+
console.error("Error: --optimize installs the optimized version; drop --use verbatim.");
|
|
1288
|
+
process.exitCode = 1;
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
const plan = planInstructionsImport();
|
|
1292
|
+
const state = readInstructionsImportState();
|
|
1293
|
+
if (options.check) {
|
|
1294
|
+
runCheck(plan, state, options.json === true);
|
|
1295
|
+
return;
|
|
1296
|
+
}
|
|
1297
|
+
const yes = options.yes === true;
|
|
1298
|
+
if (options.optimize) {
|
|
1299
|
+
await runOptimize(plan, state, yes);
|
|
1300
|
+
return;
|
|
1301
|
+
}
|
|
1302
|
+
const wanted = use ?? (yes ? "verbatim" : void 0);
|
|
1303
|
+
const pending = findPendingImport();
|
|
1304
|
+
const resumable = pending !== void 0 && (wanted === void 0 || pending.manifest.version === wanted) && canResumeImport(pending, plan);
|
|
1305
|
+
if (!resumable && hasNothingToImport(plan)) {
|
|
1306
|
+
console.log("No agent instruction files found; nothing to import.");
|
|
1307
|
+
return;
|
|
1308
|
+
}
|
|
1309
|
+
if (!resumable && isImportCurrent(plan, state)) {
|
|
1310
|
+
console.log("OK: Build already has these instructions.");
|
|
1311
|
+
const owed = state ? optimizationLines(state.optimization) : [];
|
|
1312
|
+
if (owed.length === 0 && wanted === "optimized" && state?.version === "verbatim") {
|
|
1313
|
+
owed.push(`Info: Run "${OPTIMIZE_COMMAND}" to replace the verbatim version.`);
|
|
1314
|
+
}
|
|
1315
|
+
for (const line of owed) console.log(line);
|
|
1316
|
+
return;
|
|
1317
|
+
}
|
|
1318
|
+
if (!yes && !isInteractive()) {
|
|
1319
|
+
renderPlan(plan);
|
|
1320
|
+
console.error(
|
|
1321
|
+
"Error: confirmation needed. Run in a terminal, or add --yes to install the verbatim version."
|
|
1322
|
+
);
|
|
1323
|
+
process.exitCode = 1;
|
|
1324
|
+
return;
|
|
1325
|
+
}
|
|
1326
|
+
renderPlan(plan);
|
|
1327
|
+
if (resumable && pending) {
|
|
1328
|
+
console.log(
|
|
1329
|
+
`Info: finishing the import prepared ${pending.manifest.createdAt} (${pending.manifest.version} version).`
|
|
1330
|
+
);
|
|
1331
|
+
const resumed = planForStagedImport(pending, plan);
|
|
1332
|
+
await reviewAndActivate({ verbatim: plan, plan: resumed, staged: pending, yes, agreed: false });
|
|
1333
|
+
return;
|
|
1334
|
+
}
|
|
1335
|
+
let version = wanted;
|
|
1336
|
+
let agreed = false;
|
|
1337
|
+
const optimizer = version === "verbatim" ? void 0 : resolveImportOptimizer();
|
|
1338
|
+
if (version === void 0 && optimizer?.ready) {
|
|
1339
|
+
version = await askVersion(optimizer.provider);
|
|
1340
|
+
if (version === void 0) {
|
|
1341
|
+
declineStagedImport(void 0, plan.fingerprints);
|
|
1342
|
+
console.log("No changes made.");
|
|
1343
|
+
return;
|
|
1344
|
+
}
|
|
1345
|
+
agreed = true;
|
|
1346
|
+
}
|
|
1347
|
+
let install = plan;
|
|
1348
|
+
let optimization = { status: "none" };
|
|
1349
|
+
if (version !== "verbatim") {
|
|
1350
|
+
if (yes && refuseScriptedReplace(plan)) return;
|
|
1351
|
+
if (optimizer?.ready) {
|
|
1352
|
+
console.log(
|
|
1353
|
+
`Info: Making the optimized version with ${optimizer.provider} (one model call, no tools).`
|
|
1354
|
+
);
|
|
1355
|
+
}
|
|
1356
|
+
({ plan: install, optimization } = await prepareOptimizedImport(plan, { optimizer }));
|
|
1357
|
+
if (optimization.status === "pending") {
|
|
1358
|
+
console.error(
|
|
1359
|
+
`Warning: no optimized version: ${optimization.reason}. ${yes ? "Installing" : "Offering"} the verbatim version instead.`
|
|
1360
|
+
);
|
|
1361
|
+
agreed = false;
|
|
1362
|
+
} else {
|
|
1363
|
+
reportOptimized(install, plan);
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
if (pending) markStagedImport(pending, "superseded");
|
|
1367
|
+
const staged = stageInstructionsImport(install, optimization);
|
|
1368
|
+
await reviewAndActivate({
|
|
1369
|
+
verbatim: plan,
|
|
1370
|
+
plan: install,
|
|
1371
|
+
staged,
|
|
1372
|
+
yes,
|
|
1373
|
+
agreed,
|
|
1374
|
+
instead: optimization.status === "pending"
|
|
1375
|
+
});
|
|
1376
|
+
}
|
|
1377
|
+
function createInstructionsImportCommand() {
|
|
1378
|
+
return new Command("import").description("Bring your agents' global instructions into Build").option(
|
|
1379
|
+
"--yes",
|
|
1380
|
+
"Install without prompting: the verbatim version, or the optimized one with --use optimized",
|
|
1381
|
+
false
|
|
1382
|
+
).option("--use <version>", "Version to install: optimized or verbatim").option("--optimize", "Replace an installed verbatim version with the optimized one", false).option("--check", "Report what an import would do; writes nothing, calls no model", false).option("--json", "With --check, print the report as JSON", false).action(async (options) => {
|
|
1383
|
+
await runInstructionsImport(options);
|
|
1384
|
+
});
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
export {
|
|
1388
|
+
displayPath,
|
|
1389
|
+
planInstructionsImport,
|
|
1390
|
+
isImportCurrent,
|
|
1391
|
+
ImportActivationError,
|
|
1392
|
+
stageInstructionsImport,
|
|
1393
|
+
canResumeImport,
|
|
1394
|
+
markStagedImport,
|
|
1395
|
+
activateStagedImport,
|
|
1396
|
+
declineStagedImport,
|
|
1397
|
+
resolveImportOptimizer,
|
|
1398
|
+
prepareOptimizedImport,
|
|
1399
|
+
formatLineDiff,
|
|
1400
|
+
hasNothingToImport,
|
|
1401
|
+
steeringLimitLines,
|
|
1402
|
+
renderDifference,
|
|
1403
|
+
resultLines,
|
|
1404
|
+
askYesNo,
|
|
1405
|
+
planForStagedImport,
|
|
1406
|
+
createInstructionsImportCommand
|
|
1407
|
+
};
|
|
1408
|
+
//# sourceMappingURL=chunk-NHNPEZS4.js.map
|