@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,1122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
errorEvent,
|
|
3
|
+
infoEvent
|
|
4
|
+
} from "./chunk-GQXLXRFA.js";
|
|
5
|
+
import {
|
|
6
|
+
collectTrailerItemIds,
|
|
7
|
+
fetchGitHubPrView
|
|
8
|
+
} from "./chunk-AJJNW7XT.js";
|
|
9
|
+
import {
|
|
10
|
+
createCliOutputRenderer
|
|
11
|
+
} from "./chunk-3UBZI5DW.js";
|
|
12
|
+
import {
|
|
13
|
+
TRACKED_EXECUTE_NOTE
|
|
14
|
+
} from "./chunk-UVKWU3SM.js";
|
|
15
|
+
import {
|
|
16
|
+
emitPlanningStateWarning
|
|
17
|
+
} from "./chunk-RQFX6YRN.js";
|
|
18
|
+
import {
|
|
19
|
+
listTasksInSprint
|
|
20
|
+
} from "./chunk-L2CBG5IX.js";
|
|
21
|
+
import {
|
|
22
|
+
parseKindOption,
|
|
23
|
+
queryNextItems
|
|
24
|
+
} from "./chunk-S6TAFQI5.js";
|
|
25
|
+
import {
|
|
26
|
+
queryBacklogList
|
|
27
|
+
} from "./chunk-NKLPMBNV.js";
|
|
28
|
+
import {
|
|
29
|
+
backlogExecutionStatusCarriesDelivery,
|
|
30
|
+
evaluateAutoFinalizeEligibility,
|
|
31
|
+
isBacklogExecutionProvenanceActivelyExecuting,
|
|
32
|
+
listBacklogExecutionProvenanceByStatus,
|
|
33
|
+
loadBacklogExecutionProvenance,
|
|
34
|
+
updateBacklogExecutionProvenance
|
|
35
|
+
} from "./chunk-3WY5TU2O.js";
|
|
36
|
+
import {
|
|
37
|
+
ExitCodeError
|
|
38
|
+
} from "./chunk-Y4ZDDHB6.js";
|
|
39
|
+
import {
|
|
40
|
+
getPlanningRoot
|
|
41
|
+
} from "./chunk-CSXLLEGB.js";
|
|
42
|
+
import {
|
|
43
|
+
checkSharedBucketReadability
|
|
44
|
+
} from "./chunk-AJBTKGJZ.js";
|
|
45
|
+
import {
|
|
46
|
+
getBucketPathByKind
|
|
47
|
+
} from "./chunk-V3KLVK7B.js";
|
|
48
|
+
import {
|
|
49
|
+
loadManifest
|
|
50
|
+
} from "./chunk-6TRD7TEE.js";
|
|
51
|
+
import {
|
|
52
|
+
resolvePlanningContextForRoot
|
|
53
|
+
} from "./chunk-BBPIILO2.js";
|
|
54
|
+
import {
|
|
55
|
+
detectRemoteConfiguration
|
|
56
|
+
} from "./chunk-EPRMH6HO.js";
|
|
57
|
+
import {
|
|
58
|
+
classifyBranchRole,
|
|
59
|
+
isDisposableBranchRole,
|
|
60
|
+
resolveManagedSyncDefaultBranch
|
|
61
|
+
} from "./chunk-XGU6PBO5.js";
|
|
62
|
+
import {
|
|
63
|
+
execGit
|
|
64
|
+
} from "./chunk-MHLEZQQI.js";
|
|
65
|
+
import {
|
|
66
|
+
PLANNING_GIT_NETWORK_TIMEOUT_MS
|
|
67
|
+
} from "./chunk-I56TH7VM.js";
|
|
68
|
+
import {
|
|
69
|
+
resolveCliRepoRoot
|
|
70
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
71
|
+
|
|
72
|
+
// src/cli/commands/next.ts
|
|
73
|
+
import * as fs from "fs/promises";
|
|
74
|
+
import * as path2 from "path";
|
|
75
|
+
import { Command } from "commander";
|
|
76
|
+
|
|
77
|
+
// src/planning/backlog-delivery-evidence.ts
|
|
78
|
+
import { execa } from "execa";
|
|
79
|
+
async function refreshBacklogFinalizationTarget(root) {
|
|
80
|
+
try {
|
|
81
|
+
const branch = await resolveManagedSyncDefaultBranch(root);
|
|
82
|
+
if (!branch) return void 0;
|
|
83
|
+
const fetched = await execGit(["fetch", "origin", branch], {
|
|
84
|
+
cwd: root,
|
|
85
|
+
timeoutMs: PLANNING_GIT_NETWORK_TIMEOUT_MS
|
|
86
|
+
});
|
|
87
|
+
return fetched.exitCode === 0 ? `origin/${branch}` : void 0;
|
|
88
|
+
} catch {
|
|
89
|
+
return void 0;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function inspectBacklogDeliveryEvidence(root, record, options = {}) {
|
|
93
|
+
const unknown = (reason) => ({ state: "unknown", reason });
|
|
94
|
+
const contradicted = (reason) => ({
|
|
95
|
+
state: "contradicted",
|
|
96
|
+
reason
|
|
97
|
+
});
|
|
98
|
+
try {
|
|
99
|
+
if (record.status === "archived") {
|
|
100
|
+
const archived = await queryBacklogList(getBucketPathByKind("backlog", root), "archived");
|
|
101
|
+
return archived.some((item) => item.id === record.backlogItemId) ? { state: "confirmed", reason: "The item has an archive record." } : unknown("The recorded archive is unavailable in this checkout.");
|
|
102
|
+
}
|
|
103
|
+
if (record.status === "delivered-local") {
|
|
104
|
+
return unknown("This local-delivery receipt contains no applied commit or target witness.");
|
|
105
|
+
}
|
|
106
|
+
if (record.prNumber === null || !options.queryPr) {
|
|
107
|
+
return unknown("Current PR evidence is unavailable; the recorded delivery is preserved.");
|
|
108
|
+
}
|
|
109
|
+
const pr = await fetchGitHubPrView(execa, root, record.prNumber);
|
|
110
|
+
const merged = pr.state === "MERGED" || Boolean(pr.mergedAt);
|
|
111
|
+
if (pr.state === "CLOSED" && !merged) {
|
|
112
|
+
return contradicted(`PR #${record.prNumber} is closed without merging.`);
|
|
113
|
+
}
|
|
114
|
+
if (pr.state === "OPEN" && record.status === "pr-open") {
|
|
115
|
+
return { state: "confirmed", reason: `PR #${record.prNumber} is open.` };
|
|
116
|
+
}
|
|
117
|
+
if (!merged) return unknown("The PR does not establish the recorded merge.");
|
|
118
|
+
const commit = pr.mergeCommit?.oid;
|
|
119
|
+
if (!commit || !/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/i.test(commit)) {
|
|
120
|
+
return unknown("The merged PR has no usable merge commit evidence.");
|
|
121
|
+
}
|
|
122
|
+
if (record.mergeCommit) {
|
|
123
|
+
if (!/^[a-f0-9]{4,64}$/i.test(record.mergeCommit)) {
|
|
124
|
+
return unknown("The recorded merge commit is not an immutable commit identifier.");
|
|
125
|
+
}
|
|
126
|
+
const recorded = await execGit(
|
|
127
|
+
[
|
|
128
|
+
"rev-parse",
|
|
129
|
+
"--verify",
|
|
130
|
+
"--end-of-options",
|
|
131
|
+
`${record.mergeCommit.toLowerCase()}^{commit}`
|
|
132
|
+
],
|
|
133
|
+
{ cwd: root }
|
|
134
|
+
);
|
|
135
|
+
if (recorded.exitCode !== 0) return unknown("The recorded merge commit cannot be resolved.");
|
|
136
|
+
if (recorded.stdout.trim().toLowerCase() !== commit.toLowerCase()) {
|
|
137
|
+
return contradicted("The recorded merge commit differs from the PR merge commit.");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!options.remoteTarget) {
|
|
141
|
+
return unknown("The finalization target could not be refreshed.");
|
|
142
|
+
}
|
|
143
|
+
const valid = await execGit(["rev-parse", "--verify", `${commit}^{commit}`], { cwd: root });
|
|
144
|
+
if (valid.exitCode !== 0) return unknown("The PR merge commit is not available locally.");
|
|
145
|
+
const onTarget = await execGit(["merge-base", "--is-ancestor", commit, options.remoteTarget], {
|
|
146
|
+
cwd: root
|
|
147
|
+
});
|
|
148
|
+
if (onTarget.exitCode === 1) {
|
|
149
|
+
return contradicted("The PR merge commit is absent from the refreshed finalization target.");
|
|
150
|
+
}
|
|
151
|
+
if (onTarget.exitCode !== 0) return unknown("The finalization target could not be inspected.");
|
|
152
|
+
const eligibility = evaluateAutoFinalizeEligibility({ ...record, status: "pr-open" }, commit, {
|
|
153
|
+
validCommit: true,
|
|
154
|
+
mergeCommitOnRemoteDefault: true,
|
|
155
|
+
prMerged: true,
|
|
156
|
+
mergeCommitMatchesPr: true,
|
|
157
|
+
backlogItemMatchesPr: collectTrailerItemIds(pr.commits ?? []).declared.includes(
|
|
158
|
+
record.backlogItemId
|
|
159
|
+
)
|
|
160
|
+
});
|
|
161
|
+
return eligibility.eligible ? {
|
|
162
|
+
state: "confirmed",
|
|
163
|
+
reason: `PR #${record.prNumber} is merged on the finalization target.`,
|
|
164
|
+
readyMergeCommit: eligibility.mergeCommit
|
|
165
|
+
} : unknown(eligibility.reason);
|
|
166
|
+
} catch {
|
|
167
|
+
return unknown("Delivery evidence could not be read; the recorded delivery is preserved.");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// src/cli/commands/backlog-execution-state.ts
|
|
172
|
+
import * as path from "path";
|
|
173
|
+
function backlogExecutionBranchName(backlogItemId, sequence = 0) {
|
|
174
|
+
const suffix = sequence > 0 ? `-${sequence + 1}` : "";
|
|
175
|
+
return `run/backlog-${backlogItemId}${suffix}`;
|
|
176
|
+
}
|
|
177
|
+
function isBacklogExecutionBranchName(backlogItemId, branch) {
|
|
178
|
+
if (!backlogItemId || !branch) return false;
|
|
179
|
+
if (branch === backlogExecutionBranchName(backlogItemId, 0)) return true;
|
|
180
|
+
const prefix = `run/backlog-${backlogItemId}-`;
|
|
181
|
+
if (!branch.startsWith(prefix)) return false;
|
|
182
|
+
const rest = branch.slice(prefix.length);
|
|
183
|
+
return /^[1-9]\d*$/.test(rest) && Number(rest) >= 2;
|
|
184
|
+
}
|
|
185
|
+
function backlogSyncBranchName(backlogItemId) {
|
|
186
|
+
return `chore/backlog-sync-${backlogItemId}`;
|
|
187
|
+
}
|
|
188
|
+
function backlogExecuteSignalCleanupName(backlogItemId) {
|
|
189
|
+
return `BacklogExecute:${backlogItemId}:${process.pid}`;
|
|
190
|
+
}
|
|
191
|
+
function backlogFinalizeSignalCleanupName(backlogItemId) {
|
|
192
|
+
return `BacklogFinalize:${backlogItemId}:${process.pid}`;
|
|
193
|
+
}
|
|
194
|
+
function backlogExecuteTerminalStatusCopy(status, backlogItemId) {
|
|
195
|
+
if (status === "delivered-local") {
|
|
196
|
+
return {
|
|
197
|
+
statusText: `Backlog item ${backlogItemId} was delivered locally.`,
|
|
198
|
+
nextActionText: ` Complete or archive explicitly: build plan backlog archive ${backlogItemId} --reason <reason>`
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
statusText: `Backlog item ${backlogItemId} is already merged.`,
|
|
203
|
+
nextActionText: " Run `build plan backlog finalize <id> --pr <n> --commit <sha>` to archive it."
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
async function backlogExecuteReceiptCopy(root, record) {
|
|
207
|
+
const id = record.backlogItemId;
|
|
208
|
+
if (record.status === "delivered-local") {
|
|
209
|
+
return { ...backlogExecuteTerminalStatusCopy(record.status, id), confirmed: true };
|
|
210
|
+
}
|
|
211
|
+
if (record.status === "pr-open" && record.prNumber === null && hasReusableExecutionResult(record)) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
if (!["pr-open", "merged", "archived"].includes(record.status)) return null;
|
|
215
|
+
const remoteTarget = record.status === "archived" || record.prNumber === null ? void 0 : await refreshBacklogFinalizationTarget(root);
|
|
216
|
+
const evidence = await inspectBacklogDeliveryEvidence(root, record, {
|
|
217
|
+
remoteTarget,
|
|
218
|
+
queryPr: true
|
|
219
|
+
});
|
|
220
|
+
if (evidence.state !== "confirmed") {
|
|
221
|
+
return {
|
|
222
|
+
confirmed: false,
|
|
223
|
+
statusText: `Backlog item ${id} needs reconciliation: ${evidence.reason}`,
|
|
224
|
+
nextActionText: " Recorded delivery is preserved; inspect before resetting execution."
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (record.status === "archived") {
|
|
228
|
+
return {
|
|
229
|
+
confirmed: true,
|
|
230
|
+
statusText: `Backlog item ${id} is already archived.`,
|
|
231
|
+
nextActionText: " Archive evidence is present."
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
if (evidence.readyMergeCommit) {
|
|
235
|
+
return {
|
|
236
|
+
confirmed: true,
|
|
237
|
+
statusText: `Backlog item ${id} is already merged.`,
|
|
238
|
+
nextActionText: ` Finalize: build plan backlog finalize ${id} --pr ${record.prNumber} --commit ${evidence.readyMergeCommit}`
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
confirmed: true,
|
|
243
|
+
statusText: `Backlog item ${id} already has an open PR.`,
|
|
244
|
+
nextActionText: ` Existing PR: #${record.prNumber}; finalize after merge.`
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function finalizeFailureProvenanceUpdate(params) {
|
|
248
|
+
const base = {
|
|
249
|
+
prNumber: params.prNumber,
|
|
250
|
+
mergeCommit: params.mergeCommit,
|
|
251
|
+
archiveSyncPrNumber: params.archiveSyncPrNumber
|
|
252
|
+
};
|
|
253
|
+
if (params.archiveSyncPending) {
|
|
254
|
+
return {
|
|
255
|
+
...base,
|
|
256
|
+
archiveSyncWarning: params.errorMessage,
|
|
257
|
+
status: "archive-sync-pending",
|
|
258
|
+
lastCompletedStep: "finalize",
|
|
259
|
+
failedAtStep: null,
|
|
260
|
+
errorMessage: null
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
if (backlogExecutionStatusCarriesDelivery(params.priorStatus)) {
|
|
264
|
+
return {
|
|
265
|
+
archiveSyncWarning: null,
|
|
266
|
+
// Status and delivery evidence are intentionally omitted: the stored
|
|
267
|
+
// record remains truthful when a retry supplies bad values.
|
|
268
|
+
failedAtStep: "finalize",
|
|
269
|
+
errorMessage: params.errorMessage
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
...base,
|
|
274
|
+
archiveSyncWarning: null,
|
|
275
|
+
status: "failed",
|
|
276
|
+
failedAtStep: "finalize",
|
|
277
|
+
errorMessage: params.errorMessage
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function finalizeInterruptProvenanceUpdate(prNumber, mergeCommit, archiveSyncPrNumber, signal, priorStatus) {
|
|
281
|
+
return finalizeFailureProvenanceUpdate({
|
|
282
|
+
priorStatus: priorStatus ?? null,
|
|
283
|
+
prNumber,
|
|
284
|
+
mergeCommit,
|
|
285
|
+
archiveSyncPrNumber,
|
|
286
|
+
archiveSyncPending: archiveSyncPrNumber !== null,
|
|
287
|
+
errorMessage: `Interrupted by ${signal}`
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
function parsePrNumberFromUrl(prUrl) {
|
|
291
|
+
const match = prUrl.match(/\/pull\/(\d+)$/);
|
|
292
|
+
if (!match?.[1]) return null;
|
|
293
|
+
const parsed = Number.parseInt(match[1], 10);
|
|
294
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
295
|
+
}
|
|
296
|
+
function extractWorkflowIdFromOutput(output) {
|
|
297
|
+
const match = output.match(/(?:^|\n)\s*Workflow ID:\s*([^\s]+)/i);
|
|
298
|
+
if (match?.[1]?.trim()) {
|
|
299
|
+
return match[1].trim();
|
|
300
|
+
}
|
|
301
|
+
for (const line of output.split("\n")) {
|
|
302
|
+
const trimmed = line.trim();
|
|
303
|
+
if (!trimmed.startsWith("{")) continue;
|
|
304
|
+
try {
|
|
305
|
+
const parsed = JSON.parse(trimmed);
|
|
306
|
+
if (typeof parsed.workflowId === "string" && parsed.workflowId.trim().length > 0) {
|
|
307
|
+
return parsed.workflowId.trim();
|
|
308
|
+
}
|
|
309
|
+
} catch {
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
function tryParseJsonObjectAt(source, startIndex) {
|
|
315
|
+
let depth = 0;
|
|
316
|
+
let inString = false;
|
|
317
|
+
let escaped = false;
|
|
318
|
+
for (let i = startIndex; i < source.length; i += 1) {
|
|
319
|
+
const ch = source[i];
|
|
320
|
+
if (ch === void 0) break;
|
|
321
|
+
if (inString) {
|
|
322
|
+
if (escaped) {
|
|
323
|
+
escaped = false;
|
|
324
|
+
} else if (ch === "\\") {
|
|
325
|
+
escaped = true;
|
|
326
|
+
} else if (ch === '"') {
|
|
327
|
+
inString = false;
|
|
328
|
+
}
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (ch === '"') {
|
|
332
|
+
inString = true;
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (ch === "{") {
|
|
336
|
+
depth += 1;
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
if (ch === "}") {
|
|
340
|
+
depth -= 1;
|
|
341
|
+
if (depth === 0) {
|
|
342
|
+
try {
|
|
343
|
+
return JSON.parse(source.slice(startIndex, i + 1));
|
|
344
|
+
} catch {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
function extractUnansweredMustHaveBlockerPayload(stderr) {
|
|
353
|
+
const marker = '{"error":"unanswered_must_have_blockers"';
|
|
354
|
+
const startIndex = stderr.lastIndexOf(marker);
|
|
355
|
+
if (startIndex < 0) return null;
|
|
356
|
+
const parsed = tryParseJsonObjectAt(stderr, startIndex);
|
|
357
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
358
|
+
const candidate = parsed;
|
|
359
|
+
if (candidate.error !== "unanswered_must_have_blockers" || !Array.isArray(candidate.blockers)) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
const blockers = candidate.blockers.filter((entry) => {
|
|
363
|
+
return !!entry && typeof entry === "object" && typeof entry.question === "string";
|
|
364
|
+
}).map((entry) => ({
|
|
365
|
+
...typeof entry.id === "string" ? { id: entry.id } : {},
|
|
366
|
+
question: entry.question,
|
|
367
|
+
...Array.isArray(entry.stageIds) ? {
|
|
368
|
+
stageIds: entry.stageIds.filter(
|
|
369
|
+
(stageId) => typeof stageId === "string"
|
|
370
|
+
)
|
|
371
|
+
} : {}
|
|
372
|
+
}));
|
|
373
|
+
if (blockers.length === 0) return null;
|
|
374
|
+
return { error: "unanswered_must_have_blockers", blockers };
|
|
375
|
+
}
|
|
376
|
+
function extractPlanExecuteFailurePayload(output) {
|
|
377
|
+
const marker = '{"error":"planned_build_failed"';
|
|
378
|
+
const startIndex = output.lastIndexOf(marker);
|
|
379
|
+
if (startIndex < 0) return null;
|
|
380
|
+
const parsed = tryParseJsonObjectAt(output, startIndex);
|
|
381
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
382
|
+
const candidate = parsed;
|
|
383
|
+
if (candidate.error !== "planned_build_failed") return null;
|
|
384
|
+
const errors = Array.isArray(candidate.errors) ? candidate.errors.filter((entry) => typeof entry === "string") : void 0;
|
|
385
|
+
return {
|
|
386
|
+
error: "planned_build_failed",
|
|
387
|
+
...typeof candidate.message === "string" ? { message: candidate.message } : {},
|
|
388
|
+
...errors && errors.length > 0 ? { errors } : {}
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
function extractTerminalResultFailureReason(output) {
|
|
392
|
+
const startIndex = output.lastIndexOf('{"kind":"result"');
|
|
393
|
+
if (startIndex < 0) return null;
|
|
394
|
+
const parsed = tryParseJsonObjectAt(output, startIndex);
|
|
395
|
+
const goalGap = parsed?.result?.finalOutcome?.goalGap;
|
|
396
|
+
if (!goalGap || goalGap.satisfied !== false || !Array.isArray(goalGap.gaps)) return null;
|
|
397
|
+
const gaps = goalGap.gaps.filter(
|
|
398
|
+
(gap) => typeof gap?.criterion === "string" && gap.criterion.trim().length > 0
|
|
399
|
+
);
|
|
400
|
+
const lead = gaps.find((gap) => gap.severity === "blocking" && gap.status !== "satisfied") ?? gaps[0];
|
|
401
|
+
return lead ? lead.criterion.trim() : null;
|
|
402
|
+
}
|
|
403
|
+
function extractPlanExecuteDecompositionFailurePayload(output) {
|
|
404
|
+
const marker = "BUILD_PLANNED_DECOMPOSITION_FAILURE ";
|
|
405
|
+
const markerIndex = output.lastIndexOf(marker);
|
|
406
|
+
if (markerIndex < 0) return null;
|
|
407
|
+
const parsed = tryParseJsonObjectAt(output, markerIndex + marker.length);
|
|
408
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
409
|
+
const candidate = parsed;
|
|
410
|
+
return {
|
|
411
|
+
...typeof candidate.kind === "string" ? { kind: candidate.kind } : {},
|
|
412
|
+
...typeof candidate.errorMessage === "string" ? { errorMessage: candidate.errorMessage } : {},
|
|
413
|
+
...typeof candidate.failureKind === "string" ? { failureKind: candidate.failureKind } : {},
|
|
414
|
+
...typeof candidate.timedOut === "boolean" ? { timedOut: candidate.timedOut } : {},
|
|
415
|
+
...typeof candidate.idleTerminated === "boolean" ? { idleTerminated: candidate.idleTerminated } : {},
|
|
416
|
+
...typeof candidate.workflowMaterialized === "boolean" ? { workflowMaterialized: candidate.workflowMaterialized } : {}
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
function extractLastNonEmptyStderrLine(stderr) {
|
|
420
|
+
const lines = stderr.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
|
|
421
|
+
const last = lines.at(-1) ?? null;
|
|
422
|
+
if (!last?.startsWith("{")) return last;
|
|
423
|
+
const marker = '{"error":"';
|
|
424
|
+
let structured = null;
|
|
425
|
+
for (let at = last.indexOf(marker); at >= 0; at = last.indexOf(marker, at + 1)) {
|
|
426
|
+
const parsed = tryParseJsonObjectAt(last, at);
|
|
427
|
+
if (typeof parsed?.error !== "string") continue;
|
|
428
|
+
structured = typeof parsed.message === "string" && parsed.message.trim() ? parsed.message.trim() : parsed.error;
|
|
429
|
+
}
|
|
430
|
+
return structured;
|
|
431
|
+
}
|
|
432
|
+
function summarizeUnansweredMustHaveBlockers(payload) {
|
|
433
|
+
const questions = payload.blockers.map((blocker) => blocker.question.trim()).filter(Boolean);
|
|
434
|
+
if (questions.length === 0) {
|
|
435
|
+
return "Blocked by unanswered must-have blockers";
|
|
436
|
+
}
|
|
437
|
+
if (questions.length === 1) {
|
|
438
|
+
return `Blocked by unanswered must-have blocker: ${questions[0]}`;
|
|
439
|
+
}
|
|
440
|
+
return `Blocked by ${questions.length} unanswered must-have blockers: ${questions.join(" | ")}`;
|
|
441
|
+
}
|
|
442
|
+
function pendingBlockersFromPayload(payload) {
|
|
443
|
+
if (!payload) return [];
|
|
444
|
+
return payload.blockers.map((blocker) => ({
|
|
445
|
+
...blocker.id?.trim() ? { id: blocker.id.trim() } : {},
|
|
446
|
+
question: blocker.question,
|
|
447
|
+
...blocker.stageIds && blocker.stageIds.length > 0 ? { stageIds: blocker.stageIds } : {}
|
|
448
|
+
}));
|
|
449
|
+
}
|
|
450
|
+
function summarizePlanExecuteFailure(payload) {
|
|
451
|
+
const message = payload.message?.trim();
|
|
452
|
+
if (message) return message;
|
|
453
|
+
return payload.errors?.map((entry) => entry.trim()).find((entry) => entry.length > 0) ?? null;
|
|
454
|
+
}
|
|
455
|
+
function summarizePlanExecuteDecompositionFailure(payload) {
|
|
456
|
+
const message = payload.errorMessage?.trim();
|
|
457
|
+
if (message) return message;
|
|
458
|
+
if (payload.timedOut) return "Provider timed out during decomposition";
|
|
459
|
+
if (payload.idleTerminated) return "Provider was idle-terminated during decomposition";
|
|
460
|
+
if (payload.failureKind) return `Decomposition failed: ${payload.failureKind}`;
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
function childCommandExitCode(result) {
|
|
464
|
+
if (typeof result.exitCode === "number") return result.exitCode;
|
|
465
|
+
return result.signal || result.failed ? 1 : 0;
|
|
466
|
+
}
|
|
467
|
+
function stoppedOnVetRevise(output) {
|
|
468
|
+
const startIndex = output.lastIndexOf('{"error":"plan_vet_failed"');
|
|
469
|
+
if (startIndex < 0) return false;
|
|
470
|
+
const parsed = tryParseJsonObjectAt(output, startIndex);
|
|
471
|
+
return parsed?.recommendation === "revise";
|
|
472
|
+
}
|
|
473
|
+
function vetReviseNextStep(backlogItemId) {
|
|
474
|
+
return `Revise the item with \`build plan backlog update ${backlogItemId} --body-file <path>\`, then rerun \`build plan backlog execute ${backlogItemId}\`.`;
|
|
475
|
+
}
|
|
476
|
+
function parsePlanExecuteFailure(params) {
|
|
477
|
+
const parsed = parsePlanExecuteFailureCause(params);
|
|
478
|
+
if (parsed.status !== "failed" || !params.backlogItemId || !stoppedOnVetRevise(params.output ?? params.stderr)) {
|
|
479
|
+
return parsed;
|
|
480
|
+
}
|
|
481
|
+
return {
|
|
482
|
+
...parsed,
|
|
483
|
+
errorMessage: `${parsed.errorMessage}. ${vetReviseNextStep(params.backlogItemId)}`
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
function parsePlanExecuteFailureCause(params) {
|
|
487
|
+
const exitCode = params.exitCode ?? 1;
|
|
488
|
+
const output = params.output ?? params.stderr;
|
|
489
|
+
const blockerPayload = exitCode === 2 ? extractUnansweredMustHaveBlockerPayload(output) : null;
|
|
490
|
+
if (blockerPayload) {
|
|
491
|
+
return {
|
|
492
|
+
status: "blocked",
|
|
493
|
+
failedAtStep: null,
|
|
494
|
+
errorMessage: summarizeUnansweredMustHaveBlockers(blockerPayload),
|
|
495
|
+
blockerPayload
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
const decompositionFailurePayload = extractPlanExecuteDecompositionFailurePayload(output);
|
|
499
|
+
const decompositionFailureSummary = decompositionFailurePayload ? summarizePlanExecuteDecompositionFailure(decompositionFailurePayload) : null;
|
|
500
|
+
if (decompositionFailureSummary) {
|
|
501
|
+
return {
|
|
502
|
+
status: "failed",
|
|
503
|
+
failedAtStep: "execute",
|
|
504
|
+
errorMessage: `planned build failed: ${decompositionFailureSummary}`
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
const failurePayload = extractPlanExecuteFailurePayload(output);
|
|
508
|
+
const failureSummary = failurePayload ? summarizePlanExecuteFailure(failurePayload) : null;
|
|
509
|
+
if (failureSummary) {
|
|
510
|
+
return {
|
|
511
|
+
status: "failed",
|
|
512
|
+
failedAtStep: "execute",
|
|
513
|
+
errorMessage: `planned build failed: ${failureSummary}`
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
const terminalReason = extractTerminalResultFailureReason(output);
|
|
517
|
+
if (terminalReason) {
|
|
518
|
+
return {
|
|
519
|
+
status: "failed",
|
|
520
|
+
failedAtStep: "execute",
|
|
521
|
+
errorMessage: `planned build failed: ${terminalReason}`
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
const stderrLine = extractLastNonEmptyStderrLine(params.stderr);
|
|
525
|
+
return {
|
|
526
|
+
status: "failed",
|
|
527
|
+
failedAtStep: "execute",
|
|
528
|
+
errorMessage: `planned build failed${stderrLine ? `: ${stderrLine}` : ""}`
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
async function collectTrackedTaskIds(params) {
|
|
532
|
+
if (!params.planArtifactPath) return [];
|
|
533
|
+
const normalizedPlanArtifactPath = path.posix.normalize(
|
|
534
|
+
params.planArtifactPath.replace(/\\/g, "/").trim()
|
|
535
|
+
);
|
|
536
|
+
if (!normalizedPlanArtifactPath || normalizedPlanArtifactPath === ".") return [];
|
|
537
|
+
try {
|
|
538
|
+
const tasks = await listTasksInSprint(params.sprintId);
|
|
539
|
+
return tasks.filter(
|
|
540
|
+
(task) => typeof task.planArtifactPath === "string" && path.posix.normalize(task.planArtifactPath.replace(/\\/g, "/").trim()) === normalizedPlanArtifactPath
|
|
541
|
+
).map((task) => task.id);
|
|
542
|
+
} catch {
|
|
543
|
+
return [];
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
async function updateBacklogExecutionTracking(params) {
|
|
547
|
+
const manifest = await loadManifest(params.workflowId).catch(() => null);
|
|
548
|
+
const sprintId = manifest?.sprintId ?? null;
|
|
549
|
+
const planArtifact = manifest?.planArtifactPath ?? null;
|
|
550
|
+
const taskIds = sprintId && planArtifact ? await collectTrackedTaskIds({ sprintId, planArtifactPath: planArtifact }) : [];
|
|
551
|
+
return updateBacklogExecutionProvenance(params.projectRoot, params.backlogItemId, {
|
|
552
|
+
workflowId: params.workflowId,
|
|
553
|
+
sprintId,
|
|
554
|
+
taskIds,
|
|
555
|
+
planArtifact,
|
|
556
|
+
status: params.status,
|
|
557
|
+
lastCompletedStep: params.lastCompletedStep,
|
|
558
|
+
failedAtStep: params.failedAtStep,
|
|
559
|
+
errorMessage: params.errorMessage,
|
|
560
|
+
...params.pendingBlockers !== void 0 ? { pendingBlockers: params.pendingBlockers } : {},
|
|
561
|
+
...params.prNumber !== void 0 ? { prNumber: params.prNumber } : {},
|
|
562
|
+
...params.mergeCommit !== void 0 ? { mergeCommit: params.mergeCommit } : {},
|
|
563
|
+
...params.archiveSyncPrNumber !== void 0 ? { archiveSyncPrNumber: params.archiveSyncPrNumber } : {}
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
function deriveBacklogExecutionFailureStep(provenance) {
|
|
567
|
+
if (provenance.status === "blocked") {
|
|
568
|
+
return "execute";
|
|
569
|
+
}
|
|
570
|
+
if (provenance.lastCompletedStep === null && provenance.status === "initialized") {
|
|
571
|
+
return "initialize";
|
|
572
|
+
}
|
|
573
|
+
if (provenance.lastCompletedStep === "execute") {
|
|
574
|
+
return "create-pr";
|
|
575
|
+
}
|
|
576
|
+
if (provenance.status === "executing" || provenance.lastCompletedStep === "prepare-branch") {
|
|
577
|
+
return "execute";
|
|
578
|
+
}
|
|
579
|
+
return "prepare-branch";
|
|
580
|
+
}
|
|
581
|
+
function hasReusableExecutionResult(provenance) {
|
|
582
|
+
return typeof provenance.workflowId === "string" && provenance.workflowId.trim().length > 0 && provenance.status !== "blocked" && provenance.lastCompletedStep === "execute" && provenance.failedAtStep !== "execute";
|
|
583
|
+
}
|
|
584
|
+
async function recordBacklogExecutionStepFailure(params) {
|
|
585
|
+
const errorMessage = params.interruptSignal ? `Interrupted by ${params.interruptSignal}` : params.error instanceof Error ? params.error.message : String(params.error);
|
|
586
|
+
return updateBacklogExecutionProvenance(params.projectRoot, params.backlogItemId, {
|
|
587
|
+
status: "failed",
|
|
588
|
+
lastCompletedStep: params.lastCompletedStep,
|
|
589
|
+
failedAtStep: params.failedAtStep,
|
|
590
|
+
errorMessage
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// src/cli/commands/next-resume-guidance.ts
|
|
595
|
+
var NOT_GITHUB_HOST_ERROR = /point to a known github host/i;
|
|
596
|
+
async function resolveNextResumeGuidance(params) {
|
|
597
|
+
try {
|
|
598
|
+
const repoRoot = resolveCliRepoRoot(params.cwd);
|
|
599
|
+
const provenance = await loadBacklogExecutionProvenance(params.rootDir, params.itemId, {
|
|
600
|
+
cleanupTerminalLocks: false
|
|
601
|
+
});
|
|
602
|
+
const resumable = provenance !== null && hasReusableExecutionResult(provenance) && !backlogExecutionStatusCarriesDelivery(provenance.status) && !await isBacklogExecutionProvenanceActivelyExecuting(params.rootDir, provenance);
|
|
603
|
+
if (resumable) {
|
|
604
|
+
const remote = await detectRemoteConfiguration(repoRoot);
|
|
605
|
+
const noPr = remote === "none" || NOT_GITHUB_HOST_ERROR.test(provenance.errorMessage ?? "");
|
|
606
|
+
if (!noPr) return { kind: "resume", noPr };
|
|
607
|
+
const current = (await execGit(["branch", "--show-current"], { cwd: repoRoot })).stdout.trim();
|
|
608
|
+
const target = (current && current === provenance.branch ? provenance.sourceBranch ?? "" : current).trim();
|
|
609
|
+
const role = classifyBranchRole(target);
|
|
610
|
+
const eligible = role !== "protected" && role !== "detached" && !isDisposableBranchRole(role);
|
|
611
|
+
return eligible ? { kind: "resume", noPr } : { kind: "resume", noPr, ineligibleApplyBranch: target || "(detached HEAD)" };
|
|
612
|
+
}
|
|
613
|
+
const branch = await execGit(
|
|
614
|
+
["show-ref", "--verify", "--quiet", `refs/heads/${params.adHocBranch}`],
|
|
615
|
+
{ cwd: repoRoot }
|
|
616
|
+
);
|
|
617
|
+
return branch.exitCode === 0 ? { kind: "branch-collision", branch: params.adHocBranch } : null;
|
|
618
|
+
} catch {
|
|
619
|
+
return null;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// src/cli/commands/next.ts
|
|
624
|
+
var UNTRACKED_NOTE = "Untracked: records no lifecycle provenance.";
|
|
625
|
+
var BACKLOG_RUN_BRANCH_ID_MAX_LEN = 80;
|
|
626
|
+
function sanitizeBacklogIdForRunBranch(id) {
|
|
627
|
+
const sanitized = String(id ?? "").trim().replace(/[^A-Za-z0-9_-]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "").slice(0, BACKLOG_RUN_BRANCH_ID_MAX_LEN).replace(/-+$/g, "");
|
|
628
|
+
return sanitized.length > 0 ? sanitized : "item";
|
|
629
|
+
}
|
|
630
|
+
function backlogAdHocRunBranch(id) {
|
|
631
|
+
return `run/backlog-${sanitizeBacklogIdForRunBranch(id)}`;
|
|
632
|
+
}
|
|
633
|
+
async function listBacklogExecutionAttention(rootDir) {
|
|
634
|
+
const [
|
|
635
|
+
prOpenRecords,
|
|
636
|
+
deliveredLocalRecords,
|
|
637
|
+
executingRecords,
|
|
638
|
+
archiveSyncRecords,
|
|
639
|
+
mergedRecords,
|
|
640
|
+
archivedRecords
|
|
641
|
+
] = await Promise.all([
|
|
642
|
+
listBacklogExecutionProvenanceByStatus(rootDir, "pr-open"),
|
|
643
|
+
listBacklogExecutionProvenanceByStatus(rootDir, "delivered-local"),
|
|
644
|
+
listBacklogExecutionProvenanceByStatus(rootDir, "executing"),
|
|
645
|
+
listBacklogExecutionProvenanceByStatus(rootDir, "archive-sync-pending"),
|
|
646
|
+
listBacklogExecutionProvenanceByStatus(rootDir, "merged"),
|
|
647
|
+
listBacklogExecutionProvenanceByStatus(rootDir, "archived")
|
|
648
|
+
]);
|
|
649
|
+
const backlogDir = getBucketPathByKind("backlog", rootDir);
|
|
650
|
+
const activeDeliveredLocalRecords = await Promise.all(
|
|
651
|
+
deliveredLocalRecords.map(async (record) => {
|
|
652
|
+
try {
|
|
653
|
+
await fs.access(path2.join(backlogDir, `${record.backlogItemId}.md`));
|
|
654
|
+
return record;
|
|
655
|
+
} catch {
|
|
656
|
+
return null;
|
|
657
|
+
}
|
|
658
|
+
})
|
|
659
|
+
);
|
|
660
|
+
const ready = activeDeliveredLocalRecords.flatMap(
|
|
661
|
+
(record) => record ? [
|
|
662
|
+
{
|
|
663
|
+
backlogItemId: record.backlogItemId,
|
|
664
|
+
kind: "delivered-local"
|
|
665
|
+
}
|
|
666
|
+
] : []
|
|
667
|
+
);
|
|
668
|
+
ready.push(
|
|
669
|
+
...archiveSyncRecords.map((record) => ({
|
|
670
|
+
backlogItemId: record.backlogItemId,
|
|
671
|
+
kind: "archive-sync-pending",
|
|
672
|
+
archiveSyncPrNumber: record.archiveSyncPrNumber ?? null
|
|
673
|
+
}))
|
|
674
|
+
);
|
|
675
|
+
const runningRecords = await Promise.all(
|
|
676
|
+
executingRecords.map(async (record) => {
|
|
677
|
+
try {
|
|
678
|
+
await fs.access(path2.join(backlogDir, `${record.backlogItemId}.md`));
|
|
679
|
+
if (!await isBacklogExecutionProvenanceActivelyExecuting(rootDir, record)) {
|
|
680
|
+
return null;
|
|
681
|
+
}
|
|
682
|
+
return {
|
|
683
|
+
backlogItemId: record.backlogItemId,
|
|
684
|
+
branch: record.branch,
|
|
685
|
+
workflowId: record.workflowId
|
|
686
|
+
};
|
|
687
|
+
} catch {
|
|
688
|
+
return null;
|
|
689
|
+
}
|
|
690
|
+
})
|
|
691
|
+
);
|
|
692
|
+
const running = runningRecords.flatMap((record) => record ? [record] : []);
|
|
693
|
+
running.sort((a, b) => a.backlogItemId.localeCompare(b.backlogItemId));
|
|
694
|
+
const remoteTarget = prOpenRecords.length > 0 ? await refreshBacklogFinalizationTarget(rootDir) : void 0;
|
|
695
|
+
await Promise.all(
|
|
696
|
+
[...prOpenRecords, ...mergedRecords, ...archivedRecords].map(async (record) => {
|
|
697
|
+
try {
|
|
698
|
+
await fs.access(path2.join(backlogDir, `${record.backlogItemId}.md`));
|
|
699
|
+
} catch {
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
const evidence = await inspectBacklogDeliveryEvidence(rootDir, record, {
|
|
703
|
+
remoteTarget,
|
|
704
|
+
// Keep the existing per-open-PR query count. Explicit execute can refresh one receipt.
|
|
705
|
+
queryPr: record.status === "pr-open"
|
|
706
|
+
});
|
|
707
|
+
if (evidence.readyMergeCommit && record.prNumber !== null) {
|
|
708
|
+
ready.push({
|
|
709
|
+
backlogItemId: record.backlogItemId,
|
|
710
|
+
kind: "merged-pr",
|
|
711
|
+
prNumber: record.prNumber,
|
|
712
|
+
mergeCommit: evidence.readyMergeCommit
|
|
713
|
+
});
|
|
714
|
+
} else if (evidence.state !== "confirmed") {
|
|
715
|
+
ready.push({
|
|
716
|
+
backlogItemId: record.backlogItemId,
|
|
717
|
+
kind: "reconciliation",
|
|
718
|
+
reason: evidence.reason
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
})
|
|
722
|
+
);
|
|
723
|
+
ready.sort((a, b) => a.backlogItemId.localeCompare(b.backlogItemId));
|
|
724
|
+
return { readyToFinalize: ready, running };
|
|
725
|
+
}
|
|
726
|
+
async function loadCurrentSprintActionSummary() {
|
|
727
|
+
try {
|
|
728
|
+
const { getCurrentSprint, listTasksInSprint: listTasksInSprint2 } = await import("./sprint-manager-MU2ZUWN2.js");
|
|
729
|
+
const current = await getCurrentSprint();
|
|
730
|
+
if (!current) {
|
|
731
|
+
return null;
|
|
732
|
+
}
|
|
733
|
+
const tasks = await listTasksInSprint2(current.yaml.id);
|
|
734
|
+
const openTaskCount = tasks.filter(
|
|
735
|
+
(task) => ["todo", "in_progress", "review"].includes(task.status)
|
|
736
|
+
).length;
|
|
737
|
+
return openTaskCount > 0 ? { id: current.yaml.id, openTaskCount } : null;
|
|
738
|
+
} catch {
|
|
739
|
+
return null;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
function shouldLoadNextFinalizeSummaries(options) {
|
|
743
|
+
return options.json !== true && options.quiet !== true && options.idsOnly !== true;
|
|
744
|
+
}
|
|
745
|
+
function buildMissingBacklogHint(buildDirExists) {
|
|
746
|
+
return buildDirExists ? 'Run `build plan backlog add "Your first task"` to get started.' : "Run `build init` to set up Build in this project.";
|
|
747
|
+
}
|
|
748
|
+
function createPlanNextCommand() {
|
|
749
|
+
const plan = new Command("plan").alias("pl");
|
|
750
|
+
plan.addCommand(createNextCommand());
|
|
751
|
+
return plan;
|
|
752
|
+
}
|
|
753
|
+
function createNextCommand() {
|
|
754
|
+
return new Command("next").description(
|
|
755
|
+
"Show actionable work items from the planning system\n\nExamples:\n build plan next\n build plan next --json\n build plan next --limit 5\n build plan next --kind debt\n build plan next --kind all"
|
|
756
|
+
).option("--json", "(OPTIONAL) Output as JSON for AI parsing\n Example: --json").option("-q, --quiet", "(OPTIONAL) Suppress text output when no JSON is requested").option("-v, --verbose", "(OPTIONAL) Show extra context and follow-up commands").option(
|
|
757
|
+
"--ids-only",
|
|
758
|
+
"(OPTIONAL) Output compact id/title lines for terminal-friendly piping\n Example: --ids-only"
|
|
759
|
+
).option(
|
|
760
|
+
"--include-duplicates",
|
|
761
|
+
"(OPTIONAL) Include items that may be duplicates of archived items\n Example: --include-duplicates"
|
|
762
|
+
).option(
|
|
763
|
+
"--include-findings",
|
|
764
|
+
"(OPTIONAL) Include actionable findings and issues from the issue management system\n Example: --include-findings"
|
|
765
|
+
).option(
|
|
766
|
+
"--include-blocked",
|
|
767
|
+
"(OPTIONAL) Include backlog items whose blocked-by prerequisites are not yet done\n (hidden by default; readiness shows only startable work)\n Example: --include-blocked"
|
|
768
|
+
).option("--limit <n>", "(OPTIONAL) Limit number of results\n Example: --limit 5").option(
|
|
769
|
+
"--context",
|
|
770
|
+
"(OPTIONAL) Include body preview and acceptance criteria (opt-in, slower)\n Example: --context"
|
|
771
|
+
).option(
|
|
772
|
+
"--kind <types>",
|
|
773
|
+
'(OPTIONAL) Comma-separated entity kinds to include: backlog,debt,parking or "all"\n Example: --kind debt or --kind all'
|
|
774
|
+
).action(async (options) => {
|
|
775
|
+
const output = createCliOutputRenderer();
|
|
776
|
+
try {
|
|
777
|
+
const rootDir = getPlanningRoot();
|
|
778
|
+
await emitPlanningStateWarning(options.json === true);
|
|
779
|
+
const backlogDir = getBucketPathByKind("backlog", rootDir);
|
|
780
|
+
const unavailable = checkSharedBucketReadability(resolvePlanningContextForRoot(rootDir));
|
|
781
|
+
if (unavailable) {
|
|
782
|
+
output.event(errorEvent("Planning storage unavailable", { detail: unavailable.reason }));
|
|
783
|
+
throw new ExitCodeError(1);
|
|
784
|
+
}
|
|
785
|
+
const parsedKinds = parseKindOption(options.kind);
|
|
786
|
+
const limit = (() => {
|
|
787
|
+
if (!options.limit) {
|
|
788
|
+
return void 0;
|
|
789
|
+
}
|
|
790
|
+
const parsed = Number(options.limit);
|
|
791
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
792
|
+
throw new Error("--limit must be a positive integer");
|
|
793
|
+
}
|
|
794
|
+
return parsed;
|
|
795
|
+
})();
|
|
796
|
+
const backlogExists = await fs.stat(backlogDir).then(() => true).catch(() => false);
|
|
797
|
+
const needsBacklog = parsedKinds.length === 0 || parsedKinds.includes("backlog");
|
|
798
|
+
if (!backlogExists && !options.includeFindings && needsBacklog && parsedKinds.length === 0) {
|
|
799
|
+
if (options.json) {
|
|
800
|
+
console.log(JSON.stringify([], null, 2));
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
const buildDirExists = await fs.stat(path2.join(rootDir, ".build-project")).then(() => true).catch(() => false);
|
|
804
|
+
output.event(infoEvent("No backlog/ directory found"));
|
|
805
|
+
output.line(buildMissingBacklogHint(buildDirExists));
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
const loadHumanAttention = shouldLoadNextFinalizeSummaries(options);
|
|
809
|
+
const [candidates, executionAttention, currentSprint] = await Promise.all([
|
|
810
|
+
queryNextItems({
|
|
811
|
+
rootDir,
|
|
812
|
+
limit,
|
|
813
|
+
context: options.context,
|
|
814
|
+
includeFindings: options.includeFindings,
|
|
815
|
+
includeDuplicates: options.includeDuplicates,
|
|
816
|
+
includeBlocked: options.includeBlocked,
|
|
817
|
+
kinds: parsedKinds
|
|
818
|
+
}),
|
|
819
|
+
loadHumanAttention ? listBacklogExecutionAttention(rootDir) : Promise.resolve({ readyToFinalize: [], running: [] }),
|
|
820
|
+
loadHumanAttention ? loadCurrentSprintActionSummary() : Promise.resolve(null)
|
|
821
|
+
]);
|
|
822
|
+
if (options.json) {
|
|
823
|
+
console.log(JSON.stringify(candidates, null, 2));
|
|
824
|
+
} else if (options.quiet) {
|
|
825
|
+
return;
|
|
826
|
+
} else if (options.idsOnly) {
|
|
827
|
+
printNextCandidatesIdsOnly(candidates);
|
|
828
|
+
} else {
|
|
829
|
+
const topBacklog = candidates.find((c) => c.kind === "backlog" || c.kind === "task");
|
|
830
|
+
const resume = !options.verbose && topBacklog && !topBacklog.blockedReason && !topBacklog.needsRefinement ? await resolveNextResumeGuidance({
|
|
831
|
+
rootDir,
|
|
832
|
+
cwd: process.cwd(),
|
|
833
|
+
itemId: topBacklog.id,
|
|
834
|
+
adHocBranch: backlogAdHocRunBranch(topBacklog.id)
|
|
835
|
+
}) : null;
|
|
836
|
+
printNextCandidates(candidates, {
|
|
837
|
+
resume,
|
|
838
|
+
verbose: options.verbose === true,
|
|
839
|
+
readyToFinalize: executionAttention.readyToFinalize,
|
|
840
|
+
running: executionAttention.running,
|
|
841
|
+
currentSprint
|
|
842
|
+
});
|
|
843
|
+
await printInterruptedWorkWarning(output);
|
|
844
|
+
}
|
|
845
|
+
} catch (error) {
|
|
846
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
847
|
+
output.event(errorEvent("Failed to query planning system", { detail: errorMessage }));
|
|
848
|
+
throw new ExitCodeError(1);
|
|
849
|
+
}
|
|
850
|
+
});
|
|
851
|
+
}
|
|
852
|
+
var INTERRUPTED_WORK_DEADLINE_MS = 3e3;
|
|
853
|
+
async function printInterruptedWorkWarning(output) {
|
|
854
|
+
let timer;
|
|
855
|
+
try {
|
|
856
|
+
const { resolveCliRepoRoot: resolveCliRepoRoot2 } = await import("./repo-root-YG6MQZDW.js");
|
|
857
|
+
const { findInterruptedWork, formatInterruptedWorkWarning } = await import("./interrupted-work-E4TLKJLE.js");
|
|
858
|
+
const report = await Promise.race([
|
|
859
|
+
findInterruptedWork(resolveCliRepoRoot2(process.cwd())),
|
|
860
|
+
new Promise((resolve) => {
|
|
861
|
+
timer = setTimeout(() => resolve(void 0), INTERRUPTED_WORK_DEADLINE_MS);
|
|
862
|
+
timer.unref();
|
|
863
|
+
})
|
|
864
|
+
]);
|
|
865
|
+
const line = report ? formatInterruptedWorkWarning(report) : void 0;
|
|
866
|
+
if (line) output.line(line);
|
|
867
|
+
} catch {
|
|
868
|
+
} finally {
|
|
869
|
+
clearTimeout(timer);
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
function printNextCandidates(candidates, options = {}) {
|
|
873
|
+
const output = createCliOutputRenderer();
|
|
874
|
+
const running = options.running ?? [];
|
|
875
|
+
if (running.length > 0) {
|
|
876
|
+
output.line(`${running.length} backlog execution${running.length === 1 ? "" : "s"} running`);
|
|
877
|
+
for (const entry of running) {
|
|
878
|
+
output.line(` ${entry.backlogItemId}`);
|
|
879
|
+
if (entry.branch) {
|
|
880
|
+
output.line(` Branch: ${entry.branch}`);
|
|
881
|
+
}
|
|
882
|
+
if (entry.workflowId) {
|
|
883
|
+
output.line(` Inspect: build run flywheel status ${entry.workflowId}`);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
output.line("");
|
|
887
|
+
}
|
|
888
|
+
const currentSprint = options.currentSprint;
|
|
889
|
+
if (currentSprint) {
|
|
890
|
+
output.line(
|
|
891
|
+
`Current sprint: ${currentSprint.id} (${currentSprint.openTaskCount} open task${currentSprint.openTaskCount === 1 ? "" : "s"})`
|
|
892
|
+
);
|
|
893
|
+
output.line(` Preview: build run sprint ${currentSprint.id} --preflight`);
|
|
894
|
+
output.line(` Execute: build run sprint ${currentSprint.id} --apply`);
|
|
895
|
+
output.line("");
|
|
896
|
+
}
|
|
897
|
+
const readyToFinalize = options.readyToFinalize ?? [];
|
|
898
|
+
if (readyToFinalize.length > 0) {
|
|
899
|
+
output.line(
|
|
900
|
+
`${readyToFinalize.length} backlog item${readyToFinalize.length === 1 ? "" : "s"} needing completion attention`
|
|
901
|
+
);
|
|
902
|
+
for (const entry of readyToFinalize) {
|
|
903
|
+
if (entry.kind === "reconciliation") {
|
|
904
|
+
output.line(` ${entry.backlogItemId} needs reconciliation: ${entry.reason}`);
|
|
905
|
+
output.line(" Recorded delivery is preserved; inspect before resetting execution.");
|
|
906
|
+
} else if (entry.kind === "archive-sync-pending") {
|
|
907
|
+
output.line(
|
|
908
|
+
` ${entry.backlogItemId} archive sync PR #${entry.archiveSyncPrNumber ?? "unknown"}; merge if open, then resume finalization`
|
|
909
|
+
);
|
|
910
|
+
output.line(" Resume: build plan backlog finalize --auto");
|
|
911
|
+
} else if (entry.kind === "delivered-local") {
|
|
912
|
+
output.line(` ${entry.backlogItemId} delivered locally; complete or archive explicitly`);
|
|
913
|
+
if (options.verbose) {
|
|
914
|
+
output.verbose(`build plan backlog archive ${entry.backlogItemId} --reason <reason>`);
|
|
915
|
+
}
|
|
916
|
+
} else {
|
|
917
|
+
output.line(` ${entry.backlogItemId} PR #${entry.prNumber}`);
|
|
918
|
+
if (options.verbose) {
|
|
919
|
+
output.verbose(
|
|
920
|
+
`build plan backlog finalize ${entry.backlogItemId} --pr ${entry.prNumber} --commit ${entry.mergeCommit}`
|
|
921
|
+
);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
output.line("");
|
|
926
|
+
}
|
|
927
|
+
if (candidates.length === 0) {
|
|
928
|
+
if (running.length === 0 && readyToFinalize.length === 0 && !currentSprint) {
|
|
929
|
+
output.line("No actionable items found.");
|
|
930
|
+
if (options.verbose) {
|
|
931
|
+
output.verbose('Add items with: build plan backlog add "Your task"');
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
output.line(`${candidates.length} actionable item${candidates.length === 1 ? "" : "s"}`);
|
|
937
|
+
output.line("");
|
|
938
|
+
const hasMultipleKinds = candidates.some((c) => c.kind === "debt" || c.kind === "parking");
|
|
939
|
+
const byPriority = {};
|
|
940
|
+
for (const candidate of candidates) {
|
|
941
|
+
let key;
|
|
942
|
+
if (candidate.kind === "debt") {
|
|
943
|
+
key = `debt-${candidate.severity ?? "low"}`;
|
|
944
|
+
} else if (candidate.kind === "parking") {
|
|
945
|
+
key = "parking";
|
|
946
|
+
} else {
|
|
947
|
+
key = candidate.priority || "Unprioritized";
|
|
948
|
+
}
|
|
949
|
+
if (!byPriority[key]) byPriority[key] = [];
|
|
950
|
+
byPriority[key]?.push(candidate);
|
|
951
|
+
}
|
|
952
|
+
const priorityLabels = {
|
|
953
|
+
P0: "P0 Critical",
|
|
954
|
+
P1: "P1 High",
|
|
955
|
+
P2: "P2 Medium",
|
|
956
|
+
P3: "P3 Low",
|
|
957
|
+
Unprioritized: "Unprioritized",
|
|
958
|
+
"debt-critical": "Tech Debt Critical",
|
|
959
|
+
"debt-high": "Tech Debt High",
|
|
960
|
+
"debt-medium": "Tech Debt Medium",
|
|
961
|
+
"debt-low": "Tech Debt Low",
|
|
962
|
+
parking: "Parking Lot"
|
|
963
|
+
};
|
|
964
|
+
const displayOrder = [
|
|
965
|
+
"P0",
|
|
966
|
+
"P1",
|
|
967
|
+
"debt-critical",
|
|
968
|
+
"debt-high",
|
|
969
|
+
"P2",
|
|
970
|
+
"P3",
|
|
971
|
+
"Unprioritized",
|
|
972
|
+
"debt-medium",
|
|
973
|
+
"debt-low",
|
|
974
|
+
"parking"
|
|
975
|
+
];
|
|
976
|
+
for (const groupKey of displayOrder) {
|
|
977
|
+
const items = byPriority[groupKey];
|
|
978
|
+
if (!items || items.length === 0) {
|
|
979
|
+
continue;
|
|
980
|
+
}
|
|
981
|
+
output.line(priorityLabels[groupKey] || groupKey);
|
|
982
|
+
for (const item of items) {
|
|
983
|
+
const kindLabel = hasMultipleKinds ? item.kind === "finding" ? " [finding]" : item.kind === "issue" ? " [issue]" : item.kind === "debt" ? " [debt]" : item.kind === "parking" ? " [parking]" : " [backlog]" : item.kind === "finding" ? "[finding]" : item.kind === "issue" ? "[issue]" : "";
|
|
984
|
+
const duplicateBadge = item.isDuplicate ? " [dup?]" : "";
|
|
985
|
+
const incompleteBadge = item.blockedReason || item.needsRefinement ? " [refine]" : "";
|
|
986
|
+
const blockedBadge = item.blockedByOpen && item.blockedByOpen.length > 0 ? ` [blocked x${item.blockedByOpen.length}]` : "";
|
|
987
|
+
output.line(` ${item.title}${kindLabel}${duplicateBadge}${incompleteBadge}${blockedBadge}`);
|
|
988
|
+
output.line(` ${item.id}`);
|
|
989
|
+
if (item.kind === "debt") {
|
|
990
|
+
const blockingTag = item.blocking ? " blocking" : "";
|
|
991
|
+
output.line(
|
|
992
|
+
` Severity: ${item.severity ?? "unknown"}${blockingTag} Effort: ${item.effort ?? "unknown"}`
|
|
993
|
+
);
|
|
994
|
+
} else if (item.kind === "parking") {
|
|
995
|
+
const reasonRaw = item.deferralReason ?? "";
|
|
996
|
+
const reason = reasonRaw.length > 40 ? `${reasonRaw.slice(0, 40)}...` : reasonRaw;
|
|
997
|
+
const overdueTag = item.isOverdue ? " overdue" : "";
|
|
998
|
+
const reconsiderStr = item.reconsiderDate ? ` Reconsider: ${item.reconsiderDate}${overdueTag}` : "";
|
|
999
|
+
if (reason) output.line(` Reason: ${reason}${reconsiderStr}`);
|
|
1000
|
+
else if (reconsiderStr) output.line(` ${reconsiderStr.trimStart()}`);
|
|
1001
|
+
} else {
|
|
1002
|
+
if (item.domain && item.domain !== "general") {
|
|
1003
|
+
output.line(` Domain: ${item.domain}`);
|
|
1004
|
+
}
|
|
1005
|
+
if (item.complexity !== void 0) {
|
|
1006
|
+
output.line(` Complexity: ${item.complexity}`);
|
|
1007
|
+
}
|
|
1008
|
+
if (item.duplicateOf) {
|
|
1009
|
+
output.line(` Possibly duplicate of: ${item.duplicateOf}`);
|
|
1010
|
+
}
|
|
1011
|
+
if (item.blockedReason) {
|
|
1012
|
+
output.line(` Blocked: ${item.blockedReason}`);
|
|
1013
|
+
const answerHint = item.blockedAnswerHint ?? `build plan backlog execute ${item.id} --answer blockerId=value`;
|
|
1014
|
+
output.line(` Answer with: ${answerHint}`);
|
|
1015
|
+
}
|
|
1016
|
+
if (item.blockedByOpen && item.blockedByOpen.length > 0) {
|
|
1017
|
+
const blockerList = item.blockedByOpen.map((b) => b.title ? `${b.id} (${b.title})` : b.id).join(", ");
|
|
1018
|
+
output.line(` Blocked by ${item.blockedByOpen.length} open: ${blockerList}`);
|
|
1019
|
+
}
|
|
1020
|
+
if (item.bodyPreview) {
|
|
1021
|
+
const previewLine = item.bodyPreview.replace(/\s+/g, " ").trim();
|
|
1022
|
+
output.line(` ${previewLine.slice(0, 80)}${previewLine.length > 80 ? "..." : ""}`);
|
|
1023
|
+
}
|
|
1024
|
+
if (item.acceptanceCriteria && item.acceptanceCriteria.length > 0) {
|
|
1025
|
+
output.line(` Acceptance criteria: ${item.acceptanceCriteria.length} item(s)`);
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
output.line("");
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
const topBacklog = candidates.find((c) => c.kind === "backlog" || c.kind === "task");
|
|
1032
|
+
if (!options.verbose && topBacklog) {
|
|
1033
|
+
output.line("---");
|
|
1034
|
+
if (topBacklog.blockedReason || topBacklog.needsRefinement) {
|
|
1035
|
+
output.line(`Next: ${topBacklog.id} \u2014 ${topBacklog.title}`);
|
|
1036
|
+
output.line(` Refine: build plan backlog refine ${topBacklog.id}`);
|
|
1037
|
+
} else {
|
|
1038
|
+
const adHocBranch = backlogAdHocRunBranch(topBacklog.id);
|
|
1039
|
+
const resume = options.resume;
|
|
1040
|
+
output.line(`Next: ${topBacklog.id} \u2014 ${topBacklog.title}`);
|
|
1041
|
+
if (resume?.kind === "resume") {
|
|
1042
|
+
const flag = resume.noPr ? " --no-open-pr" : "";
|
|
1043
|
+
output.line(` Resume: build plan backlog execute ${topBacklog.id}${flag}`);
|
|
1044
|
+
output.line(
|
|
1045
|
+
resume.noPr ? " Reuses the finished build, applies it locally and archives the item; origin has no GitHub PR path." : " Reuses the finished build and opens the PR."
|
|
1046
|
+
);
|
|
1047
|
+
if (resume.ineligibleApplyBranch) {
|
|
1048
|
+
output.line(
|
|
1049
|
+
` Current branch ${resume.ineligibleApplyBranch} cannot take a local apply; first switch to or create a product branch (for example git switch -c fix/<slug>).`
|
|
1050
|
+
);
|
|
1051
|
+
}
|
|
1052
|
+
} else {
|
|
1053
|
+
output.line(` Canonical: build plan backlog execute ${topBacklog.id}`);
|
|
1054
|
+
output.line(` ${TRACKED_EXECUTE_NOTE}`);
|
|
1055
|
+
if (resume?.kind === "branch-collision") {
|
|
1056
|
+
output.line(
|
|
1057
|
+
` Ad hoc: run branch ${resume.branch} already exists; check it out or delete it,`
|
|
1058
|
+
);
|
|
1059
|
+
} else {
|
|
1060
|
+
output.line(` Ad hoc: git checkout -b ${adHocBranch}`);
|
|
1061
|
+
}
|
|
1062
|
+
output.line(` then build run --backlog-item ${topBacklog.id} --no-push`);
|
|
1063
|
+
output.line(` ${UNTRACKED_NOTE}`);
|
|
1064
|
+
}
|
|
1065
|
+
output.line(` Show: build plan backlog show ${topBacklog.id}`);
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
if (options.verbose) {
|
|
1069
|
+
output.verbose("Commands:");
|
|
1070
|
+
output.verbose(" build plan backlog refine <id>");
|
|
1071
|
+
output.verbose(" build plan backlog show <id>");
|
|
1072
|
+
output.verbose(" Canonical: build plan backlog execute <id>");
|
|
1073
|
+
output.verbose(` ${TRACKED_EXECUTE_NOTE}`);
|
|
1074
|
+
output.verbose(" Ad hoc: git checkout -b run/backlog-<sanitized-id>");
|
|
1075
|
+
output.verbose(" then build run --backlog-item <id> --no-push");
|
|
1076
|
+
output.verbose(` ${UNTRACKED_NOTE}`);
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
function formatNextCandidateIdsOnlyLine(candidate) {
|
|
1080
|
+
return `${candidate.id} ${candidate.title}`;
|
|
1081
|
+
}
|
|
1082
|
+
function printNextCandidatesIdsOnly(candidates) {
|
|
1083
|
+
if (candidates.length === 0) {
|
|
1084
|
+
console.log("No actionable items found.");
|
|
1085
|
+
return;
|
|
1086
|
+
}
|
|
1087
|
+
for (const candidate of candidates) {
|
|
1088
|
+
console.log(formatNextCandidateIdsOnlyLine(candidate));
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
export {
|
|
1093
|
+
backlogExecutionBranchName,
|
|
1094
|
+
isBacklogExecutionBranchName,
|
|
1095
|
+
backlogSyncBranchName,
|
|
1096
|
+
backlogExecuteSignalCleanupName,
|
|
1097
|
+
backlogFinalizeSignalCleanupName,
|
|
1098
|
+
backlogExecuteReceiptCopy,
|
|
1099
|
+
finalizeFailureProvenanceUpdate,
|
|
1100
|
+
finalizeInterruptProvenanceUpdate,
|
|
1101
|
+
parsePrNumberFromUrl,
|
|
1102
|
+
extractWorkflowIdFromOutput,
|
|
1103
|
+
extractPlanExecuteFailurePayload,
|
|
1104
|
+
extractPlanExecuteDecompositionFailurePayload,
|
|
1105
|
+
pendingBlockersFromPayload,
|
|
1106
|
+
childCommandExitCode,
|
|
1107
|
+
parsePlanExecuteFailure,
|
|
1108
|
+
updateBacklogExecutionTracking,
|
|
1109
|
+
deriveBacklogExecutionFailureStep,
|
|
1110
|
+
hasReusableExecutionResult,
|
|
1111
|
+
recordBacklogExecutionStepFailure,
|
|
1112
|
+
sanitizeBacklogIdForRunBranch,
|
|
1113
|
+
backlogAdHocRunBranch,
|
|
1114
|
+
shouldLoadNextFinalizeSummaries,
|
|
1115
|
+
buildMissingBacklogHint,
|
|
1116
|
+
createPlanNextCommand,
|
|
1117
|
+
createNextCommand,
|
|
1118
|
+
printNextCandidates,
|
|
1119
|
+
formatNextCandidateIdsOnlyLine,
|
|
1120
|
+
printNextCandidatesIdsOnly
|
|
1121
|
+
};
|
|
1122
|
+
//# sourceMappingURL=chunk-MTU7VTNN.js.map
|