@joshuafolkken/kit 1.3000.0 → 1.3041.0
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/.claude/skills/workflow-commands/backlogrun-steps.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +6 -0
- package/dist/.inputs-verified.json +1 -1
- package/dist/commands/adopt.js +12 -12
- package/dist/commands/auto-ok-judge-cli.js +18 -14
- package/dist/commands/auto-ok-main.js +42 -40
- package/dist/commands/backlog-budget-main.js +3 -3
- package/dist/commands/backlog-drive-cli.js +276 -188
- package/dist/commands/backlog-next-main.js +77 -75
- package/dist/commands/backlog-offer-main.js +80 -78
- package/dist/commands/backlog-plan-cli.js +96 -97
- package/dist/commands/backlog-triage-cli.js +94 -92
- package/dist/commands/backlogrun-cli.js +212 -206
- package/dist/commands/behavior-cli.js +12 -13
- package/dist/commands/bump-version-main.js +2 -2
- package/dist/commands/bytes-command.js +61 -22
- package/dist/commands/check-related.js +61 -60
- package/dist/commands/{chunk-X7PN54LZ.js → chunk-22DVQCP6.js} +16 -6
- package/dist/commands/{chunk-7GHOFHUS.js → chunk-24ZDAWML.js} +3 -3
- package/dist/commands/{chunk-HBNB3TLG.js → chunk-2BB5ZR2F.js} +13 -7
- package/dist/commands/{chunk-F22G3VDB.js → chunk-2BC33QPY.js} +1 -1
- package/dist/commands/{chunk-72EW7AVI.js → chunk-2BJJUTZA.js} +2 -2
- package/dist/commands/{chunk-XDQOWUVT.js → chunk-2CXT6MBR.js} +4 -4
- package/dist/commands/{chunk-TVJE67O2.js → chunk-2EZTYLO4.js} +6 -6
- package/dist/commands/{chunk-JLYW7CP6.js → chunk-2PHOLX62.js} +1 -1
- package/dist/commands/{chunk-6EU5ZCDP.js → chunk-2QM72JCJ.js} +23 -87
- package/dist/commands/{chunk-EFHSCUFN.js → chunk-2VFPUPSG.js} +2 -2
- package/dist/commands/{chunk-ATRMETHT.js → chunk-2XAH3MHV.js} +1 -1
- package/dist/commands/{chunk-T2E724HN.js → chunk-34JJYCIY.js} +2 -2
- package/dist/commands/{chunk-REMKUFAC.js → chunk-34KZDKQJ.js} +1 -1
- package/dist/commands/{chunk-GK2KY4MO.js → chunk-352KLSFX.js} +3 -3
- package/dist/commands/{chunk-7S6VRZOH.js → chunk-3AEDZZNL.js} +5 -5
- package/dist/commands/{chunk-KVJDDECB.js → chunk-3B2HEFNO.js} +2 -2
- package/dist/commands/{chunk-HZBTXKT2.js → chunk-3Z425MM3.js} +2 -2
- package/dist/commands/{chunk-J3G2R64I.js → chunk-3ZOX4G4U.js} +3 -3
- package/dist/commands/{chunk-LRS2OS5J.js → chunk-452HWOJ7.js} +2 -2
- package/dist/commands/{chunk-HRT4KWP4.js → chunk-475EFIJV.js} +1 -1
- package/dist/commands/{chunk-4HBVHYNL.js → chunk-47UZB54M.js} +3 -3
- package/dist/commands/{chunk-H4LYG37R.js → chunk-4DN4XVPL.js} +6 -6
- package/dist/commands/{chunk-TMLNI3YW.js → chunk-4HERA2GY.js} +1 -1
- package/dist/commands/{chunk-W6V4DWC5.js → chunk-4JI35CVO.js} +1 -1
- package/dist/commands/{chunk-YT342DRV.js → chunk-4L4LNWZ7.js} +2 -2
- package/dist/commands/{chunk-ZZAH3YQP.js → chunk-4N32QKJZ.js} +6 -6
- package/dist/commands/{chunk-GDUK5YPO.js → chunk-4NRSFLG7.js} +12 -12
- package/dist/commands/{chunk-O5QZ2S6X.js → chunk-4OKRPAUT.js} +4 -4
- package/dist/commands/{chunk-QDFDB4CF.js → chunk-4Q64PG46.js} +13 -13
- package/dist/commands/{chunk-HO52D6JY.js → chunk-4UDTQVDD.js} +14 -14
- package/dist/commands/{chunk-HPVLI26Z.js → chunk-4WR2LEZL.js} +6 -6
- package/dist/commands/{chunk-DP7WIGQ4.js → chunk-4ZJOC6OK.js} +4 -4
- package/dist/commands/{chunk-WTRDWEUQ.js → chunk-4ZQM4I7R.js} +12 -12
- package/dist/commands/{chunk-OTZJXU2R.js → chunk-54X37JEJ.js} +8 -8
- package/dist/commands/{chunk-A5V7EWIX.js → chunk-56KW5EOK.js} +2 -2
- package/dist/commands/chunk-5CG3XU3O.js +74 -0
- package/dist/commands/{chunk-FC33R5UN.js → chunk-5ESZLHDZ.js} +13 -15
- package/dist/commands/{chunk-OVA7STGP.js → chunk-5FBRMARM.js} +9 -9
- package/dist/commands/{chunk-SK2LJBFS.js → chunk-5PCK53WP.js} +3 -3
- package/dist/commands/{chunk-6NV2F7QH.js → chunk-5RG4S66L.js} +1 -1
- package/dist/commands/{chunk-JOARHU3M.js → chunk-5UJGACVN.js} +1 -1
- package/dist/commands/{chunk-NKOET4FB.js → chunk-5Y7B7FDL.js} +2 -2
- package/dist/commands/{chunk-XMBRXCIE.js → chunk-5Z6E5ZUV.js} +4 -4
- package/dist/commands/{chunk-RZ4OKKPM.js → chunk-5ZNUH4LV.js} +2 -2
- package/dist/commands/{chunk-7CHCZBNF.js → chunk-6CFHLMKM.js} +4 -4
- package/dist/commands/{chunk-TXXYC7EV.js → chunk-6DDK5XWK.js} +1 -1
- package/dist/commands/{chunk-2TQXCH2K.js → chunk-6GQX752S.js} +3 -3
- package/dist/commands/{chunk-RY6ZDHKB.js → chunk-6MAZ55GF.js} +107 -84
- package/dist/commands/{chunk-SNFLV7VV.js → chunk-6RUWU2SB.js} +2 -2
- package/dist/commands/{chunk-D4SZK7H2.js → chunk-6TIVDEKG.js} +2 -2
- package/dist/commands/{chunk-RIQ75QWR.js → chunk-6UCWAFQY.js} +55 -43
- package/dist/commands/{chunk-4D5KWMFL.js → chunk-6YURRFRU.js} +19 -19
- package/dist/commands/{chunk-7MOZEEFJ.js → chunk-6YVURZAJ.js} +1 -1
- package/dist/commands/{chunk-73JOEKIC.js → chunk-6Z4YZG7P.js} +5 -5
- package/dist/commands/{chunk-NJ53AWJU.js → chunk-77BIN247.js} +9 -9
- package/dist/commands/{chunk-MZHOPRI6.js → chunk-7ABHNNY3.js} +7 -7
- package/dist/commands/{chunk-6WTVAL4D.js → chunk-7C7FOKJK.js} +1 -1
- package/dist/commands/{chunk-KVSSLDA3.js → chunk-7HAGC6SW.js} +5 -5
- package/dist/commands/{chunk-IG22Y5MA.js → chunk-7KKUFLH5.js} +1 -1
- package/dist/commands/{chunk-ZQ3CKRMP.js → chunk-7MJYLUF4.js} +2 -2
- package/dist/commands/{chunk-6UGFS3EU.js → chunk-7NHZCI5Y.js} +11 -11
- package/dist/commands/{chunk-FB3D7CX5.js → chunk-7OQ56DVW.js} +5 -7
- package/dist/commands/{chunk-EK327QOS.js → chunk-7VWPGTZO.js} +10 -10
- package/dist/commands/{chunk-WSOF74K4.js → chunk-7YZXS3AK.js} +3 -3
- package/dist/commands/{chunk-N6TYL3B2.js → chunk-AAUDI7WJ.js} +2 -2
- package/dist/commands/{chunk-3GF52L5F.js → chunk-AC26ZUG5.js} +12 -24
- package/dist/commands/{chunk-EK2Y6B4X.js → chunk-ACZ52JPI.js} +7 -7
- package/dist/commands/{chunk-VD72V5VX.js → chunk-AJ65WNJB.js} +4 -4
- package/dist/commands/{chunk-MYWRGF5A.js → chunk-AK7SEO4Y.js} +2 -2
- package/dist/commands/{chunk-IBEKFLWG.js → chunk-ALDAS2WG.js} +9 -9
- package/dist/commands/{chunk-W32DIQEP.js → chunk-ARFBIJFS.js} +1 -1
- package/dist/commands/{chunk-F3WBEEYC.js → chunk-AVVMDVGO.js} +5 -5
- package/dist/commands/chunk-AXXEMVRJ.js +23 -0
- package/dist/commands/{chunk-GIGKMIPQ.js → chunk-B3M5WSGN.js} +1 -1
- package/dist/commands/{chunk-4Z5723GA.js → chunk-B7ZNIEDV.js} +5 -4
- package/dist/commands/{chunk-B3XFOHDX.js → chunk-BCUDQWYK.js} +10 -4
- package/dist/commands/{chunk-PR3JCPP7.js → chunk-BMKWSWWE.js} +1 -1
- package/dist/commands/{chunk-RZJAUVMI.js → chunk-BMM4RHCG.js} +2 -2
- package/dist/commands/{chunk-LAKVPOJQ.js → chunk-BMTYUJNT.js} +2 -2
- package/dist/commands/{chunk-DAJCUSPG.js → chunk-BRHPRDDV.js} +3 -3
- package/dist/commands/{chunk-UZAU6UI6.js → chunk-BRUBX64M.js} +2 -2
- package/dist/commands/{chunk-BFLFPKQQ.js → chunk-BTZJDHQT.js} +4 -4
- package/dist/commands/{chunk-AI5K4QJO.js → chunk-BYFC6MD2.js} +1 -1
- package/dist/commands/{chunk-JGTLNFFE.js → chunk-BYGJ3BCJ.js} +10 -10
- package/dist/commands/{chunk-5HWZFL4D.js → chunk-C54QXJD6.js} +51 -18
- package/dist/commands/{chunk-LMS6N6GE.js → chunk-CBAKBWSZ.js} +7 -7
- package/dist/commands/{chunk-7EAMUVIO.js → chunk-CFHRNTE5.js} +1 -1
- package/dist/commands/{chunk-UIWAMLQH.js → chunk-CGYDIYHD.js} +2 -2
- package/dist/commands/{chunk-4QYW2IL7.js → chunk-CHKYPF5O.js} +1 -1
- package/dist/commands/{chunk-5HCPSV45.js → chunk-CJBW6BWG.js} +8 -8
- package/dist/commands/chunk-CKUKK7JG.js +252 -0
- package/dist/commands/{chunk-4PES3BAA.js → chunk-CMHGDCGN.js} +3 -3
- package/dist/commands/{chunk-F6OWP2AY.js → chunk-CNGTHSUS.js} +22 -22
- package/dist/commands/{chunk-B2EA2HCY.js → chunk-COGKULQH.js} +4 -4
- package/dist/commands/{chunk-S7XWXG4M.js → chunk-CP2J4RV2.js} +175 -81
- package/dist/commands/{chunk-YGDNUTTI.js → chunk-CQUZ6TNQ.js} +2 -2
- package/dist/commands/chunk-CQZI7RIK.js +72 -0
- package/dist/commands/chunk-CVJHQOI3.js +153 -0
- package/dist/commands/{chunk-2MJ4OCDL.js → chunk-CWCKCZS6.js} +1 -1
- package/dist/commands/chunk-D5OHVIPM.js +17 -0
- package/dist/commands/{chunk-TPKFVVJQ.js → chunk-D6D6WQR6.js} +2 -2
- package/dist/commands/{chunk-5PAEXYIY.js → chunk-D7JRJI44.js} +69 -6
- package/dist/commands/{chunk-LOSOLCCW.js → chunk-D7OAU32Z.js} +1 -1
- package/dist/commands/{chunk-VZHC2I3T.js → chunk-DAAX7XDS.js} +8 -8
- package/dist/commands/{chunk-OHVAEJSM.js → chunk-DEZF7QZZ.js} +5 -5
- package/dist/commands/{chunk-CA6F5OXK.js → chunk-DYZOOWVW.js} +124 -21
- package/dist/commands/{chunk-TKGBF75Y.js → chunk-EDKOSZ3K.js} +5 -5
- package/dist/commands/{chunk-YPNTORQD.js → chunk-EFDVE5P5.js} +1 -1
- package/dist/commands/{chunk-EH3LVYOX.js → chunk-EGIHAEMT.js} +1 -1
- package/dist/commands/{chunk-7P4X4TQL.js → chunk-EKLU6QR7.js} +4 -4
- package/dist/commands/{chunk-ILQZFUDC.js → chunk-ELY76WAR.js} +2 -2
- package/dist/commands/{chunk-2VLHFILE.js → chunk-EM3HAZF6.js} +2 -2
- package/dist/commands/{chunk-F2HFWLQR.js → chunk-EMTZAGT5.js} +20 -1
- package/dist/commands/{chunk-GA4VIFHD.js → chunk-ERG4QRNG.js} +2 -2
- package/dist/commands/{chunk-ICEMFE2V.js → chunk-EUGNQCYK.js} +1 -1
- package/dist/commands/{chunk-3HU3LPIF.js → chunk-EXDFKKMH.js} +2 -2
- package/dist/commands/{chunk-ISPBJVXM.js → chunk-EXWB34R2.js} +7 -7
- package/dist/commands/{chunk-FNOSSXLG.js → chunk-EYMPBHDN.js} +2 -2
- package/dist/commands/{chunk-7V5UVKFG.js → chunk-EZ7IPKIH.js} +2 -2
- package/dist/commands/{chunk-KQWSENCT.js → chunk-F6IQHZYY.js} +3 -3
- package/dist/commands/{chunk-7ZECP3J6.js → chunk-FDS65XOJ.js} +5 -5
- package/dist/commands/{chunk-KXRFGPZD.js → chunk-FGG7V473.js} +21 -5
- package/dist/commands/{chunk-PZ6VWHOO.js → chunk-FHFWNNUC.js} +1 -1
- package/dist/commands/{chunk-XBRD2BDL.js → chunk-FJX7AENO.js} +2 -2
- package/dist/commands/{chunk-M42SLJCD.js → chunk-FKZ5E4JD.js} +4 -4
- package/dist/commands/{chunk-F2J6DGDM.js → chunk-FMZWRDKH.js} +8 -8
- package/dist/commands/{chunk-DSBK66US.js → chunk-FOKCRIAN.js} +10 -10
- package/dist/commands/{chunk-OI7KM4K3.js → chunk-FQGWO2ZH.js} +2 -2
- package/dist/commands/{chunk-2IESYBZH.js → chunk-FURNDIT3.js} +3 -3
- package/dist/commands/chunk-FVDQNMP6.js +93 -0
- package/dist/commands/{chunk-PZU6FZO6.js → chunk-FWU3H4TX.js} +1 -1
- package/dist/commands/{chunk-RYZ3RQRH.js → chunk-G3HBYHFA.js} +1 -1
- package/dist/commands/{chunk-HCA5QG2U.js → chunk-G4E4M2P4.js} +2 -2
- package/dist/commands/{chunk-VJLZ3IQQ.js → chunk-G5KSL2Q2.js} +1 -1
- package/dist/commands/{chunk-Y5ZW3KN5.js → chunk-G6XC7V6Y.js} +2 -2
- package/dist/commands/{chunk-73EBNBUW.js → chunk-GCPP5XIG.js} +1 -1
- package/dist/commands/{chunk-Q3463XNL.js → chunk-GITT5A5A.js} +3 -3
- package/dist/commands/{chunk-T2IO4LEB.js → chunk-GLC47H7I.js} +10 -10
- package/dist/commands/{chunk-GA6E4VGO.js → chunk-GUR54ELE.js} +1 -1
- package/dist/commands/{chunk-7IT23HIR.js → chunk-GY4DMCKS.js} +2 -2
- package/dist/commands/{chunk-PZ4ITSLG.js → chunk-H6JQRHDC.js} +3 -3
- package/dist/commands/{chunk-ZHZSZNE2.js → chunk-HATKF6VX.js} +2 -2
- package/dist/commands/{chunk-ELWNRE6E.js → chunk-HH3CVIFU.js} +5 -5
- package/dist/commands/{chunk-7GMTJDO2.js → chunk-HHMMGDMP.js} +6 -6
- package/dist/commands/{chunk-VD5674LW.js → chunk-HI5WPM6C.js} +2 -2
- package/dist/commands/{chunk-JUUBDYFZ.js → chunk-HQSWPRUF.js} +4 -4
- package/dist/commands/{chunk-ZAJD6T6E.js → chunk-HVCQYZVD.js} +2 -2
- package/dist/commands/chunk-HWEZRNPL.js +66 -0
- package/dist/commands/{chunk-J6GIVMXI.js → chunk-HX3FFIO5.js} +18 -3
- package/dist/commands/{chunk-GU5ML3Y3.js → chunk-HXDTA5VU.js} +13 -68
- package/dist/commands/{chunk-BNXE3NVB.js → chunk-I2KCGKJI.js} +1 -1
- package/dist/commands/{chunk-LC7SBONO.js → chunk-IAD4WLLI.js} +1 -1
- package/dist/commands/{chunk-WWC5L3AO.js → chunk-IB5TT73I.js} +2 -2
- package/dist/commands/{chunk-HOSZITJM.js → chunk-IBAYXCMU.js} +2 -2
- package/dist/commands/{chunk-UTBVTCQN.js → chunk-IF3EIFK4.js} +267 -153
- package/dist/commands/chunk-IGDJNXX2.js +49 -0
- package/dist/commands/{chunk-OJ4LGBVD.js → chunk-ILIITIMQ.js} +3 -3
- package/dist/commands/{chunk-CUR2WNYB.js → chunk-IRGDMSTI.js} +3 -3
- package/dist/commands/{chunk-PZTWQYRI.js → chunk-IYJEBWW5.js} +3 -3
- package/dist/commands/{chunk-A3D2XHOJ.js → chunk-J22PSIXR.js} +40 -9
- package/dist/commands/{chunk-O27H6NN6.js → chunk-J66YBAAM.js} +3 -5
- package/dist/commands/{chunk-P6RGQXHI.js → chunk-J6WKZRV2.js} +2 -2
- package/dist/commands/{chunk-NFEBQED3.js → chunk-J7IO3AYH.js} +2 -2
- package/dist/commands/{chunk-T57W3UWK.js → chunk-JAKC2BHX.js} +1 -1
- package/dist/commands/{chunk-3EO2XN3A.js → chunk-JCAQ7B6J.js} +4 -4
- package/dist/commands/{chunk-QQZOQ7AM.js → chunk-JFLFGLE4.js} +1 -1
- package/dist/commands/{chunk-ZDSDPKCD.js → chunk-JIGBNCDR.js} +1 -1
- package/dist/commands/{chunk-Q5N2J2UF.js → chunk-JJHWTFWQ.js} +5 -7
- package/dist/commands/{chunk-EI6JG5DF.js → chunk-JKOGWGQM.js} +1 -1
- package/dist/commands/{chunk-RK4HE5NW.js → chunk-JM6EVOFN.js} +4 -4
- package/dist/commands/{chunk-EBNIX2TC.js → chunk-JV24VP2O.js} +1 -1
- package/dist/commands/{chunk-BCK5LW4F.js → chunk-JVKXJ763.js} +3 -3
- package/dist/commands/{chunk-D5TAR6TV.js → chunk-JZHY7D6D.js} +1 -1
- package/dist/commands/{chunk-CRNPPKP2.js → chunk-JZK33TA5.js} +1 -1
- package/dist/commands/{chunk-UOAG2XQT.js → chunk-K275REYP.js} +3 -3
- package/dist/commands/{chunk-HESMKHEB.js → chunk-K4G3HOKS.js} +2 -2
- package/dist/commands/{chunk-L6XN3EXI.js → chunk-K64EIHD2.js} +1 -1
- package/dist/commands/{chunk-RINVPTA2.js → chunk-KCFOP5RI.js} +28 -28
- package/dist/commands/{chunk-O26Y2FOJ.js → chunk-KGE4AS2Y.js} +1 -1
- package/dist/commands/{chunk-EWA72KO7.js → chunk-KK2SL42W.js} +2 -2
- package/dist/commands/{chunk-MMXZKLDU.js → chunk-KK7TEL5G.js} +10 -4
- package/dist/commands/{chunk-UEURNXE5.js → chunk-KKIMVXAP.js} +2 -2
- package/dist/commands/{chunk-MAGJFH5T.js → chunk-KODXWMBX.js} +6 -6
- package/dist/commands/{chunk-D4HNS43Q.js → chunk-KPSKWTOS.js} +17 -17
- package/dist/commands/{chunk-VFJYOAOQ.js → chunk-KTV2HNWB.js} +2 -2
- package/dist/commands/{chunk-OWR2TCOY.js → chunk-KWYQR5MK.js} +5 -5
- package/dist/commands/{chunk-FNQW6NY7.js → chunk-KXK2A2HB.js} +6 -2
- package/dist/commands/{chunk-O5FVBIRI.js → chunk-KZ5BBBMO.js} +5 -5
- package/dist/commands/{chunk-JUJFIATR.js → chunk-KZ7HD37E.js} +6 -6
- package/dist/commands/{chunk-2YCKPX3A.js → chunk-KZZWPUJW.js} +1 -1
- package/dist/commands/{chunk-MYNM3YMR.js → chunk-L7DAL54N.js} +3 -3
- package/dist/commands/{chunk-NOXLKIPR.js → chunk-LAR76BFA.js} +1 -1
- package/dist/commands/{chunk-ZA3W73PF.js → chunk-LB557AHJ.js} +3 -3
- package/dist/commands/{chunk-LYEKT3IN.js → chunk-LEB2VP7F.js} +1 -1
- package/dist/commands/{chunk-WQJ7O3C3.js → chunk-LJXKVLYI.js} +1 -1
- package/dist/commands/{chunk-CHX4QTP4.js → chunk-LJZERYLG.js} +1 -1
- package/dist/commands/{chunk-PF22VUWB.js → chunk-LOOFYHUM.js} +76 -26
- package/dist/commands/{chunk-HIPO6HUG.js → chunk-LPSULLNK.js} +1 -1
- package/dist/commands/{chunk-G47ZNQVG.js → chunk-LR22UK5W.js} +1 -1
- package/dist/commands/{chunk-SV4FHQE7.js → chunk-LT7QSHR4.js} +14 -14
- package/dist/commands/{chunk-HIB5G2X6.js → chunk-LUXWDMKI.js} +7 -7
- package/dist/commands/{chunk-XH6BGVVP.js → chunk-LX7TIEMI.js} +9 -36
- package/dist/commands/{chunk-OGNTJ5JB.js → chunk-LYO6TX5L.js} +1 -1
- package/dist/commands/{chunk-JLREFWJ4.js → chunk-LZ5QXE5N.js} +6 -6
- package/dist/commands/{chunk-5WIZR5SC.js → chunk-M4UV3BEV.js} +11 -11
- package/dist/commands/{chunk-LNBUIOK6.js → chunk-M6JDU5EK.js} +4 -4
- package/dist/commands/{chunk-VZSJCFRT.js → chunk-MFBNNTBM.js} +4 -4
- package/dist/commands/{chunk-KHWTJ4F7.js → chunk-MI2OS6TL.js} +3 -3
- package/dist/commands/{chunk-VZCQZFPH.js → chunk-MLW4S35K.js} +19 -8
- package/dist/commands/{chunk-RIUPRMLW.js → chunk-MN425CU6.js} +1 -1
- package/dist/commands/{chunk-7W3D3WRW.js → chunk-MOIOSCZM.js} +2 -2
- package/dist/commands/{chunk-3BNNMJOT.js → chunk-MRORPFSO.js} +20 -320
- package/dist/commands/{chunk-LA5WTOAM.js → chunk-MUGTOJUL.js} +12 -12
- package/dist/commands/{chunk-L6LU2633.js → chunk-MVHPRYHE.js} +1 -1
- package/dist/commands/{chunk-EKCKCX5S.js → chunk-MWO6FOSZ.js} +123 -21
- package/dist/commands/{chunk-AVUGMOHZ.js → chunk-N7QTMTST.js} +2 -2
- package/dist/commands/{chunk-LMSS4ARB.js → chunk-NDBX7LSS.js} +1 -1
- package/dist/commands/{chunk-BEE7OAQ5.js → chunk-NDWZTWXV.js} +21 -2
- package/dist/commands/{chunk-6TESOL3L.js → chunk-NEGJ77RV.js} +7 -7
- package/dist/commands/{chunk-LCEJXF7A.js → chunk-NEGRE5VW.js} +4 -4
- package/dist/commands/{chunk-IXX4SXIP.js → chunk-NFPD2P3V.js} +1 -1
- package/dist/commands/chunk-NHIW7JE6.js +335 -0
- package/dist/commands/{chunk-CJSFC5YI.js → chunk-NILSN7A4.js} +7 -7
- package/dist/commands/{chunk-W4J6YTFE.js → chunk-NOLFSPOB.js} +2 -2
- package/dist/commands/chunk-NT67QTZO.js +65 -0
- package/dist/commands/{chunk-NJT5L6IC.js → chunk-NU7W6QGT.js} +33 -4
- package/dist/commands/chunk-NUR4FQHM.js +21 -0
- package/dist/commands/{chunk-OKKQI4ZG.js → chunk-OAAVY2JK.js} +1 -1
- package/dist/commands/chunk-OF4BY4N7.js +32 -0
- package/dist/commands/{chunk-W47I2KDY.js → chunk-OGS2DK7I.js} +3 -3
- package/dist/commands/{chunk-MS6Q3Z7V.js → chunk-OIPV3PWW.js} +6 -6
- package/dist/commands/{chunk-T33QDAWD.js → chunk-OIX2363L.js} +1 -1
- package/dist/commands/{chunk-GPMSYXYO.js → chunk-OJ65BZBV.js} +283 -15
- package/dist/commands/{chunk-34LAULSC.js → chunk-OKZWEVR4.js} +3 -3
- package/dist/commands/{chunk-2CXAVVST.js → chunk-OL6IF4JC.js} +1 -1
- package/dist/commands/{chunk-6JVNRY5A.js → chunk-OMPRILFH.js} +1 -1
- package/dist/commands/{chunk-VGHSZLYQ.js → chunk-OOWGH2RG.js} +1 -1
- package/dist/commands/{chunk-ERGZPWKP.js → chunk-OP2RFVLS.js} +1 -1
- package/dist/commands/{chunk-UU6GCJGM.js → chunk-ORKVN2LO.js} +2 -2
- package/dist/commands/{chunk-RHII5XI6.js → chunk-OSBWXZJ4.js} +24 -24
- package/dist/commands/{chunk-D3SHCUBC.js → chunk-OVWPZDWP.js} +2 -2
- package/dist/commands/{chunk-Z4HYBFZD.js → chunk-OWYK2BEJ.js} +108 -46
- package/dist/commands/{chunk-P4O67FP5.js → chunk-OX3VQLV2.js} +6 -6
- package/dist/commands/{chunk-L6TU7FC2.js → chunk-OZJP77UM.js} +4 -4
- package/dist/commands/{chunk-SNO7CY2B.js → chunk-P3H3DKTE.js} +2 -2
- package/dist/commands/{chunk-2OIX4JLA.js → chunk-P5SOYWH2.js} +3 -3
- package/dist/commands/{chunk-M4PEC7YW.js → chunk-PHLOTUB7.js} +54 -37
- package/dist/commands/{chunk-73KBUQKI.js → chunk-PTNQCCIB.js} +2 -2
- package/dist/commands/{chunk-4P2LCVGO.js → chunk-PTZEFQUX.js} +8 -8
- package/dist/commands/{chunk-DJVMC3U2.js → chunk-Q426ZSZ4.js} +1 -1
- package/dist/commands/{chunk-US6X7JXC.js → chunk-Q7EEIOAD.js} +4 -4
- package/dist/commands/{chunk-LE7TFPMU.js → chunk-QABRNGQV.js} +2 -2
- package/dist/commands/{chunk-NGKB632X.js → chunk-QDFVVRQP.js} +3 -3
- package/dist/commands/{chunk-36M2UV6C.js → chunk-QGATHT4S.js} +38 -4
- package/dist/commands/{chunk-DIB2Z2OS.js → chunk-QJRVDE7T.js} +1 -1
- package/dist/commands/{chunk-KUJQWO6M.js → chunk-QKTTKAXM.js} +2 -2
- package/dist/commands/{chunk-DXZW4V7J.js → chunk-QMDKDQKW.js} +3 -3
- package/dist/commands/{chunk-VW5SGE7A.js → chunk-QOSC5RKD.js} +1 -1
- package/dist/commands/{chunk-ENLWXAHD.js → chunk-QV5FKMOU.js} +1 -1
- package/dist/commands/{chunk-32SNWQJP.js → chunk-R2THGPI3.js} +2 -2
- package/dist/commands/{chunk-RVHBWSIG.js → chunk-R54Z2Z3X.js} +2 -2
- package/dist/commands/{chunk-CJAA5GAF.js → chunk-RG53UFNW.js} +15 -15
- package/dist/commands/{chunk-HJKZDDDI.js → chunk-RHKCWJQX.js} +1 -1
- package/dist/commands/{chunk-RPDWFUQO.js → chunk-RKIAX4DZ.js} +36 -84
- package/dist/commands/{chunk-LE2T3FGJ.js → chunk-RLBFEHHC.js} +2 -4
- package/dist/commands/{chunk-5GBZ43UA.js → chunk-RMDLFLPE.js} +1 -1
- package/dist/commands/{chunk-U2UH4VM4.js → chunk-RN2YDNLF.js} +2 -2
- package/dist/commands/{chunk-GQHUFNXN.js → chunk-RRAIRS2T.js} +1 -1
- package/dist/commands/{chunk-DRCTDVI2.js → chunk-RUQY5TS3.js} +3 -3
- package/dist/commands/{chunk-WGULS5DA.js → chunk-RW64VHEB.js} +1 -0
- package/dist/commands/{chunk-4G7NKNAZ.js → chunk-RXYMJPJB.js} +3 -3
- package/dist/commands/{chunk-B33BTNB4.js → chunk-S4M6UWR2.js} +21 -5
- package/dist/commands/{chunk-4Q4FXBUQ.js → chunk-SASX3W2M.js} +2 -2
- package/dist/commands/{chunk-TIXJY22D.js → chunk-SJ2ZN575.js} +5 -5
- package/dist/commands/{chunk-NSZTSCBW.js → chunk-SP7DKYGU.js} +13 -13
- package/dist/commands/{chunk-T3FD3Q73.js → chunk-SRG6PKVS.js} +1 -1
- package/dist/commands/{chunk-QA22PBCJ.js → chunk-SSL6A3Y4.js} +3 -3
- package/dist/commands/{chunk-4BEIYKI2.js → chunk-SV4FZR24.js} +2 -0
- package/dist/commands/{chunk-HZSQI6TD.js → chunk-SVTS7ACS.js} +2 -2
- package/dist/commands/{chunk-F7XLEK55.js → chunk-SVV4U5AR.js} +1 -1
- package/dist/commands/{chunk-RRQFITJE.js → chunk-SXJM4DZ5.js} +1 -1
- package/dist/commands/{chunk-OIDMJASD.js → chunk-SYB3M632.js} +1 -1
- package/dist/commands/{chunk-UJOZ2MGX.js → chunk-SYOXIKB7.js} +6 -6
- package/dist/commands/{chunk-5SB37YDW.js → chunk-SZG5HDNP.js} +3 -3
- package/dist/commands/{chunk-R2CF6VZE.js → chunk-T4F33UKZ.js} +4 -4
- package/dist/commands/{chunk-ESQEEL4O.js → chunk-TAEGXID2.js} +2 -2
- package/dist/commands/chunk-TEPYEUYG.js +585 -0
- package/dist/commands/{chunk-LUMCYDGE.js → chunk-TFLHYC2F.js} +2 -2
- package/dist/commands/{chunk-V5OIPYA6.js → chunk-TJKM56WJ.js} +4 -4
- package/dist/commands/{chunk-CYQ3ZF7R.js → chunk-TLAB552K.js} +86 -13
- package/dist/commands/{chunk-ST32OGPY.js → chunk-TP6L4W3W.js} +5 -5
- package/dist/commands/{chunk-C26LKDBE.js → chunk-TR7WWYD5.js} +1 -1
- package/dist/commands/{chunk-PWYXY46Y.js → chunk-TYNH2R66.js} +15 -15
- package/dist/commands/{chunk-AZUE65NT.js → chunk-U5P6G3UV.js} +2 -2
- package/dist/commands/{chunk-REPANBLS.js → chunk-U7Y6RKLK.js} +1 -1
- package/dist/commands/{chunk-55I7OYHI.js → chunk-UIMMWH7U.js} +1 -1
- package/dist/commands/{chunk-72J2G2E7.js → chunk-UKBBWMLE.js} +20 -20
- package/dist/commands/{chunk-VTLL6CKO.js → chunk-UNMSZGSG.js} +14 -14
- package/dist/commands/chunk-UOVUUVDK.js +18 -0
- package/dist/commands/{chunk-JNWHX25C.js → chunk-URDT2O2K.js} +1 -1
- package/dist/commands/{chunk-FGZQSSGH.js → chunk-UREXZJDB.js} +1 -1
- package/dist/commands/{chunk-O4WBADCX.js → chunk-UTHUX7VU.js} +3 -3
- package/dist/commands/{chunk-PDDKRHHS.js → chunk-V5OUZFWK.js} +3 -3
- package/dist/commands/{chunk-N4O5I55P.js → chunk-VCPGFBMN.js} +8 -8
- package/dist/commands/{chunk-WN7NK3NY.js → chunk-VGPIQNDB.js} +1 -1
- package/dist/commands/{chunk-HOGFJHBT.js → chunk-VJS2MCLA.js} +1 -1
- package/dist/commands/{chunk-4YI4SLRJ.js → chunk-VK6D5CWA.js} +8 -8
- package/dist/commands/{chunk-4LWRCPS5.js → chunk-VOF3N4WO.js} +3 -3
- package/dist/commands/{chunk-AM44D7NF.js → chunk-VQRT32JB.js} +1 -1
- package/dist/commands/{chunk-AS3GWVAN.js → chunk-VQVPAVQ3.js} +1 -1
- package/dist/commands/{chunk-6VTJO5L2.js → chunk-VV4TQYGD.js} +3 -3
- package/dist/commands/{chunk-WIE7VUBE.js → chunk-W7DRUOF7.js} +5 -5
- package/dist/commands/{chunk-HH2KDLTP.js → chunk-WAEN2RTT.js} +2 -2
- package/dist/commands/{chunk-NKKH3PBE.js → chunk-WB4T3VY2.js} +18 -1
- package/dist/commands/{chunk-DNJC7X73.js → chunk-WCEUMOKK.js} +2 -2
- package/dist/commands/{chunk-BK6Q4VCA.js → chunk-WTH6NTXU.js} +4 -4
- package/dist/commands/{chunk-WG6GYBRJ.js → chunk-WWVYEHQT.js} +2 -1
- package/dist/commands/{chunk-P4CWLRT2.js → chunk-X3TNPALI.js} +1 -1
- package/dist/commands/{chunk-LZNYHWRO.js → chunk-XC6GG5JR.js} +3 -3
- package/dist/commands/{chunk-RI7EQYKL.js → chunk-XFWI6WHH.js} +2 -2
- package/dist/commands/{chunk-BY3POLIQ.js → chunk-XHGWMD3L.js} +7 -7
- package/dist/commands/{chunk-BPSJSHYD.js → chunk-XI2ABCRX.js} +2 -2
- package/dist/commands/{chunk-TS4ZK46L.js → chunk-XKSUBUIH.js} +5 -5
- package/dist/commands/{chunk-K7GL3BGI.js → chunk-XPBF5DG3.js} +4 -4
- package/dist/commands/{chunk-6SKMZGER.js → chunk-XUMYPESL.js} +20 -8
- package/dist/commands/{chunk-QS5USD4T.js → chunk-XXC32PVL.js} +5 -4
- package/dist/commands/{chunk-ORSI7Y55.js → chunk-XXN2EZBY.js} +1 -1
- package/dist/commands/{chunk-IZVM2TTH.js → chunk-XZQWEVR3.js} +2 -2
- package/dist/commands/{chunk-E3CXOVPQ.js → chunk-Y27PTXXI.js} +1 -1
- package/dist/commands/{chunk-337QQM4C.js → chunk-Y4EBUI6M.js} +106 -5
- package/dist/commands/{chunk-WRX3MINT.js → chunk-YAU3LYNF.js} +1 -1
- package/dist/commands/{chunk-JB7R3A4A.js → chunk-YDURQICF.js} +4 -4
- package/dist/commands/{chunk-RX5JSPPH.js → chunk-YGFOGA7C.js} +11 -11
- package/dist/commands/{chunk-S6SXMBF2.js → chunk-YHJ2AJMA.js} +2 -2
- package/dist/commands/{chunk-MVPUQLN5.js → chunk-YM77CF4D.js} +4 -4
- package/dist/commands/{chunk-ZYIMQHCB.js → chunk-YNPRJCEO.js} +6 -6
- package/dist/commands/{chunk-3UKJFWKS.js → chunk-YTBQAD5W.js} +3 -3
- package/dist/commands/{chunk-WW3TX742.js → chunk-Z3WGHIVB.js} +3 -3
- package/dist/commands/{chunk-KIVOZY2J.js → chunk-ZBZ5DDCH.js} +66 -64
- package/dist/commands/{chunk-TAPDXK34.js → chunk-ZLRUHSOP.js} +1 -1
- package/dist/commands/{chunk-XYAK53TK.js → chunk-ZNR75OXP.js} +2 -1
- package/dist/commands/{chunk-CADFBQJJ.js → chunk-ZSOR4ISJ.js} +4 -4
- package/dist/commands/{chunk-6NRTLH6I.js → chunk-ZYFHYQA7.js} +1 -1
- package/dist/commands/{chunk-Q7TV3OV6.js → chunk-ZZFFSQF4.js} +4 -4
- package/dist/commands/{chunk-PDAY76AN.js → chunk-ZZULXNC2.js} +1 -1
- package/dist/commands/{chunk-5Y7QQYTU.js → chunk-ZZXO6TFH.js} +1 -1
- package/dist/commands/code-symbol-cli.js +4 -4
- package/dist/commands/codex-hook-adapter.js +99 -100
- package/dist/commands/command-derive.js +10 -10
- package/dist/commands/cost-audit-main.js +94 -92
- package/dist/commands/cspell-cached.js +24 -23
- package/dist/commands/defect-origin-main.js +19 -18
- package/dist/commands/defect-report-main.js +15 -14
- package/dist/commands/disposition-cli.js +67 -64
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/document-read-cli.js +89 -9
- package/dist/commands/document-section-main.js +89 -9
- package/dist/commands/edit-files-cli.js +1 -1
- package/dist/commands/effect-audit-cli.js +20 -19
- package/dist/commands/epic-audit-main.js +55 -53
- package/dist/commands/epic-bundle-main.js +87 -85
- package/dist/commands/epic-check.js +16 -15
- package/dist/commands/epic-main.js +93 -91
- package/dist/commands/epic-next-main.js +51 -49
- package/dist/commands/format-edited-cli.js +30 -32
- package/dist/commands/format.js +11 -10
- package/dist/commands/fresh-machine-cli.js +6 -6
- package/dist/commands/git-followup-workflow.js +137 -122
- package/dist/commands/git-workflow.js +28 -27
- package/dist/commands/github-release-cli.js +26 -3
- package/dist/commands/hook-ledger-cli.js +74 -126
- package/dist/commands/init-main.js +20 -19
- package/dist/commands/inputs.json +1907 -1876
- package/dist/commands/issue-ack-cli.js +5 -5
- package/dist/commands/issue-already-done-cli.js +63 -58
- package/dist/commands/issue-body-cli.js +44 -42
- package/dist/commands/issue-cite-main.js +11 -10
- package/dist/commands/issue-comment-main.js +15 -11
- package/dist/commands/issue-consolidate-cli.js +31 -30
- package/dist/commands/issue-file-main.js +114 -110
- package/dist/commands/issue-fold-existing-cli.js +88 -86
- package/dist/commands/issue-fold-main.js +26 -25
- package/dist/commands/issue-lint-main.js +38 -37
- package/dist/commands/issue-measured-cli.js +66 -61
- package/dist/commands/issue-plan-cli.js +103 -101
- package/dist/commands/issue-premise-unmet-cli.js +66 -61
- package/dist/commands/issue-priority-cli.js +13 -12
- package/dist/commands/issue-read-main.js +18 -17
- package/dist/commands/issue-release-class-cli.js +12 -11
- package/dist/commands/issue-release-main.js +13 -12
- package/dist/commands/issue-scout-main.js +89 -87
- package/dist/commands/issue-spill-main.js +114 -110
- package/dist/commands/issue-state-main.js +16 -15
- package/dist/commands/issue-tick-cli.js +14 -13
- package/dist/commands/josh-completion.js +10 -10
- package/dist/commands/lane-adopt-cli.js +19 -19
- package/dist/commands/lane-breakdown-cli.js +154 -126
- package/dist/commands/lane-cli.js +131 -125
- package/dist/commands/lane-launch-main.js +17 -17
- package/dist/commands/lane-limit-cli.js +81 -79
- package/dist/commands/lane-measure-cli.js +246 -130
- package/dist/commands/lane-pause-cli.js +15 -15
- package/dist/commands/lane-plan-cli.js +108 -101
- package/dist/commands/lane-resolve-cli.js +20 -19
- package/dist/commands/lane-restart-cli.js +124 -118
- package/dist/commands/lane-why-cli.js +85 -82
- package/dist/commands/lane-withdraw-cli.js +49 -48
- package/dist/commands/latest-corepack.js +3 -3
- package/dist/commands/latest-if-required-cli.js +9 -9
- package/dist/commands/latest-scope-main.js +5 -5
- package/dist/commands/latest-update.js +3 -3
- package/dist/commands/lines-command.js +3 -3
- package/dist/commands/lint-parallel-main.js +32 -31
- package/dist/commands/lint-related.js +79 -60
- package/dist/commands/lint-rule.js +32 -31
- package/dist/commands/lockfile-policy.js +11 -11
- package/dist/commands/main-merge-main.js +5 -5
- package/dist/commands/main-sync-main.js +5 -5
- package/dist/commands/managed-config-scope-cli.js +3 -3
- package/dist/commands/measure-rerun-cli.js +10 -10
- package/dist/commands/metrics-command.js +91 -58
- package/dist/commands/observation-record-cli.js +3 -3
- package/dist/commands/observations-flush-cli.js +27 -25
- package/dist/commands/oracle-list-cli.js +2 -2
- package/dist/commands/overrides-check.js +4 -4
- package/dist/commands/package-scout-cli.js +67 -26
- package/dist/commands/plan-consumers-main.js +4 -4
- package/dist/commands/plan-scaffold-cli.js +132 -91
- package/dist/commands/pr-classification-main.js +3 -3
- package/dist/commands/pre-commit-lint.js +11 -12
- package/dist/commands/pre-commit-type-check.js +25 -24
- package/dist/commands/pre-push-unit.js +33 -33
- package/dist/commands/pretool-guard-cli.js +90 -91
- package/dist/commands/project-profile-cli.js +5 -4
- package/dist/commands/propagate.js +15 -15
- package/dist/commands/prose-stale-cli.js +20 -19
- package/dist/commands/publishable-range-check.js +4 -4
- package/dist/commands/read-files-cli.js +2 -2
- package/dist/commands/read-set-cli.js +61 -24
- package/dist/commands/refactor-scan-cli.js +6 -6
- package/dist/commands/release-cli.js +64 -36
- package/dist/commands/release-scope-main.js +19 -18
- package/dist/commands/rename-cli.js +27 -29
- package/dist/commands/reserved-run.js +3 -3
- package/dist/commands/retrospective-cli.js +104 -102
- package/dist/commands/review-attest-cli.js +6 -6
- package/dist/commands/review-brief-main.js +127 -109
- package/dist/commands/review-findings-cli.js +2 -2
- package/dist/commands/review-pair-cli.js +110 -84
- package/dist/commands/review-record-main.js +108 -83
- package/dist/commands/review-round2-cli.js +46 -45
- package/dist/commands/review-stops-cli.js +16 -16
- package/dist/commands/review-submit-cli.js +127 -109
- package/dist/commands/rule-list.js +58 -60
- package/dist/commands/rule-value-cli.js +226 -74
- package/dist/commands/run-add-cli.js +28 -27
- package/dist/commands/run-board-main.js +136 -132
- package/dist/commands/run-carry-cli.js +127 -124
- package/dist/commands/run-chain-cli.js +116 -93
- package/dist/commands/run-cut-cli.js +124 -119
- package/dist/commands/run-ending-cli.js +19 -22
- package/dist/commands/run-entry-cli.js +183 -180
- package/dist/commands/run-event-cli.js +5 -5
- package/dist/commands/run-handoff-cli.js +52 -28
- package/dist/commands/run-handoff-lanes-cli.js +15 -15
- package/dist/commands/run-hold-main.js +64 -62
- package/dist/commands/run-liveness-cli.js +11 -11
- package/dist/commands/run-merge-main.js +119 -116
- package/dist/commands/run-next-cli.js +87 -86
- package/dist/commands/run-park-cli.js +111 -92
- package/dist/commands/run-pause-cli.js +147 -133
- package/dist/commands/run-pickup-cli.js +13 -13
- package/dist/commands/run-prep-main.js +83 -82
- package/dist/commands/run-prime-cli.js +107 -87
- package/dist/commands/run-progress-main.js +123 -107
- package/dist/commands/run-report-cli.js +25 -24
- package/dist/commands/run-review-cli.js +168 -149
- package/dist/commands/run-ship-cli.js +208 -203
- package/dist/commands/run-ship-evidence-cli.js +38 -37
- package/dist/commands/run-ship-wait-main.js +40 -37
- package/dist/commands/run-split-cli.js +127 -125
- package/dist/commands/run-stale-main.js +36 -35
- package/dist/commands/run-status-cli.js +16 -15
- package/dist/commands/run-step-cli.js +173 -164
- package/dist/commands/run-tail-cli.js +1 -1
- package/dist/commands/run-tidy-main.js +30 -29
- package/dist/commands/run-wake-main.js +137 -119
- package/dist/commands/run-watcher-guard-cli.js +30 -29
- package/dist/commands/secretlint-scan.js +2 -2
- package/dist/commands/selfcheck-cli.js +27 -26
- package/dist/commands/session-language-main.js +48 -28
- package/dist/commands/sonar-hotspots-cli.js +3 -3
- package/dist/commands/split-assess-cli.js +24 -23
- package/dist/commands/split-child-recover-cli.js +13 -12
- package/dist/commands/start.js +37 -35
- package/dist/commands/stash-pop-main.js +3 -3
- package/dist/commands/stash-push-main.js +3 -3
- package/dist/commands/stop-guard.js +144 -143
- package/dist/commands/sync-main.js +11 -10
- package/dist/commands/telegram-test-main.js +5 -5
- package/dist/commands/test-declared.js +9 -8
- package/dist/commands/test-e2e-guard.js +23 -22
- package/dist/commands/test-pinned-main.js +26 -25
- package/dist/commands/test-reach-cli.js +15 -14
- package/dist/commands/test-red-main.js +5 -5
- package/dist/commands/{test-related-ZT2AO62I.js → test-related-ZCNC46MS.js} +31 -31
- package/dist/commands/test-related-main.js +51 -50
- package/dist/commands/test-unit-guard-main.js +9 -8
- package/dist/commands/time-cli.js +24 -27
- package/dist/commands/time-density-cli.js +8 -9
- package/dist/commands/tree-status-cli.js +4 -4
- package/dist/commands/type-check-command.js +8 -7
- package/dist/commands/ui-shot-cli.js +4 -4
- package/dist/commands/uninstall.js +20 -19
- package/dist/commands/unused-members-cli.js +9 -8
- package/dist/commands/upstream-interrupt-main.js +115 -111
- package/dist/commands/verification-gate.js +46 -46
- package/dist/commands/version-check.js +5 -5
- package/dist/hooks/{chunk-LWD43Z3C.js → chunk-5CUXGQT6.js} +1667 -107
- package/dist/hooks/{chunk-4YXV2REH.js → chunk-5R5YFQR5.js} +8 -8
- package/dist/hooks/{chunk-LKQBEKBI.js → chunk-6RLY27FT.js} +8 -8
- package/dist/hooks/{chunk-CICKRHTB.js → chunk-AO4TOV4V.js} +119 -2679
- package/dist/hooks/{chunk-NUPVO7RI.js → chunk-G5WSPYJ6.js} +4296 -1687
- package/dist/hooks/{chunk-UU4PTPEZ.js → chunk-HHIVWGHX.js} +250 -125
- package/dist/hooks/{chunk-P7BPAU26.js → chunk-IURJANNZ.js} +2 -2
- package/dist/hooks/{chunk-6RR6JZSB.js → chunk-OV22V63P.js} +357 -1744
- package/dist/hooks/{chunk-RQXECHAS.js → chunk-SXABK6UV.js} +57 -45
- package/dist/hooks/codex-hook-adapter.js +11 -11
- package/dist/hooks/daemon.js +1053 -690
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +551 -536
- package/dist/hooks/pretool-guard.js +7 -7
- package/dist/hooks/session-lang.js +292 -15
- package/dist/hooks/stop-guard.js +225 -48
- package/dist/inputs.json +65 -65
- package/dist/josh.js +73 -19
- package/dist/self-sync-guard/index.js +18 -1
- package/dist/version/index.js +18 -1
- package/package.json +3 -3
- package/pnpm-workspace.yaml +5 -13
- package/prompts/collaboration-workflow/issue-template.en.md +56 -52
- package/scripts/agent/agent-argv.ts +20 -6
- package/scripts/agent/agent-phase-profile.ts +89 -0
- package/scripts/agent/agent-role-profile.ts +3 -71
- package/scripts/agent/agent-ship-cap.ts +44 -0
- package/scripts/agent/agent-worker-profile.ts +154 -0
- package/scripts/agent/claude-agent-argv.ts +1 -1
- package/scripts/agent/lane-instructions.ts +29 -3
- package/scripts/auto-ok/auto-ok-judge-cli.ts +3 -0
- package/scripts/auto-ok/auto-ok-judge-write.ts +2 -1
- package/scripts/auto-ok/auto-ok-judge.ts +4 -2
- package/scripts/backlog/backlog-drive-escalate.ts +115 -0
- package/scripts/backlog/backlog-drive-stalled-retry.ts +48 -10
- package/scripts/document/document-scan.ts +35 -1
- package/scripts/gh/git-pr-checks-failed.ts +24 -0
- package/scripts/hooks/implementation-shell-deny-expansion.ts +20 -0
- package/scripts/hooks/implementation-shell-deny-git.ts +128 -0
- package/scripts/hooks/implementation-shell-deny.ts +14 -138
- package/scripts/hooks/implementation-shell.ts +28 -5
- package/scripts/hooks/step-zero-notice.ts +9 -6
- package/scripts/hooks/stop-actions.ts +4 -2
- package/scripts/init/init-logic-workspace.ts +1 -1
- package/scripts/issue/issue-auto-ok.ts +43 -4
- package/scripts/issue/issue-body-keys.ts +4 -0
- package/scripts/issue/issue-comment-cli.ts +15 -2
- package/scripts/issue/issue-evidence-exit.ts +6 -2
- package/scripts/issue/issue-file-cli.ts +5 -1
- package/scripts/issue/issue-file-pass.ts +14 -7
- package/scripts/issue/issue-file-worker.ts +95 -0
- package/scripts/issue/issue-file.ts +1 -1
- package/scripts/issue/issue-outcome.ts +107 -0
- package/scripts/issue/issue-read.ts +12 -7
- package/scripts/issue/issue-watch-diff.ts +2 -1
- package/scripts/josh/josh-commands-ai.ts +2 -2
- package/scripts/josh/josh-commands-development.ts +21 -5
- package/scripts/josh/josh-commands-issue-write.ts +3 -2
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-project.ts +7 -2
- package/scripts/josh/josh-commands-run.ts +10 -2
- package/scripts/josh/josh-commands-workflow.ts +5 -0
- package/scripts/lane/lane-breakdown-cli.ts +14 -4
- package/scripts/lane/lane-breakdown-text.ts +7 -0
- package/scripts/lane/lane-breakdown.ts +21 -1
- package/scripts/lane/lane-dispatch-prepare.ts +83 -0
- package/scripts/lane/lane-dispatch.ts +3 -53
- package/scripts/lane/lane-elapsed-time.ts +118 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +4 -1
- package/scripts/lane/lane-net-time.ts +35 -7
- package/scripts/lane/lane-overrun.ts +1 -1
- package/scripts/lane/lane-plan-cli.ts +7 -3
- package/scripts/lane/lane-plan-estimate.ts +57 -0
- package/scripts/lane/lane-plan-size.ts +11 -20
- package/scripts/lane/lane-plan.ts +1 -0
- package/scripts/lane/lane-relaunch.ts +9 -4
- package/scripts/lane/lane-stage-budget.ts +6 -1
- package/scripts/lane/lane-stage-events.ts +103 -0
- package/scripts/lane/lane-stats-tables.ts +3 -0
- package/scripts/lane/lane-stop-check-stats.ts +117 -0
- package/scripts/lane/lane-stop-stats.ts +30 -6
- package/scripts/lane/lane-why-causes.ts +3 -11
- package/scripts/lane/openai-lane-supervisor-owner.ts +12 -0
- package/scripts/lane/openai-lane-supervisor.ts +36 -1
- package/scripts/lib/home-tilde.ts +24 -0
- package/scripts/lib/package-manifest.ts +27 -1
- package/scripts/observations/observation-ledger-archive.ts +180 -0
- package/scripts/observations/observation-ledger-home.ts +1 -0
- package/scripts/observations/observation-ledger.ts +5 -0
- package/scripts/observations/observations-flush-transaction.ts +358 -0
- package/scripts/observations/observations-flush.ts +72 -172
- package/scripts/plan/plan-scaffold-cli.ts +17 -6
- package/scripts/plan/plan-scaffold.ts +11 -0
- package/scripts/release/github-release-notes.ts +24 -0
- package/scripts/release/github-release-runs.ts +32 -6
- package/scripts/release/github-release.ts +10 -2
- package/scripts/release/release-progress.ts +22 -10
- package/scripts/release/release-publish-run.ts +39 -6
- package/scripts/repo/repository-labels.ts +23 -11
- package/scripts/review/review-comment-round.ts +10 -5
- package/scripts/rules/broad-investigation-shell.ts +2 -2
- package/scripts/rules/codex-prompt.ts +63 -0
- package/scripts/rules/direct-issue-comment.ts +62 -2
- package/scripts/rules/direct-issue-read.ts +55 -2
- package/scripts/rules/guard-remedy.ts +10 -4
- package/scripts/rules/issue-citation.ts +20 -9
- package/scripts/rules/last-prompt.ts +8 -4
- package/scripts/rules/rule-value-cli.ts +85 -4
- package/scripts/rules/rule-value-trend.ts +108 -0
- package/scripts/rules/shell-redirects.ts +19 -7
- package/scripts/rules/shell-segments.ts +145 -20
- package/scripts/rules/shell-tokens.ts +66 -0
- package/scripts/rules/standalone-gh-call.ts +63 -0
- package/scripts/rules/unasked-filing.ts +12 -4
- package/scripts/run/board/run-board-closed.ts +10 -1
- package/scripts/run/board/run-board-decision-read.ts +52 -12
- package/scripts/run/board/run-board-decision.ts +5 -0
- package/scripts/run/board/run-board-ending-reason.ts +21 -7
- package/scripts/run/board/run-board-github.ts +8 -1
- package/scripts/run/board/run-board-layout.ts +5 -3
- package/scripts/run/board/run-board-link.ts +2 -0
- package/scripts/run/board/run-board-operation.ts +6 -2
- package/scripts/run/board/run-board-pause-fixture.json +12 -0
- package/scripts/run/board/run-board-pause.ts +87 -0
- package/scripts/run/board/run-board-plan-shared.ts +2 -0
- package/scripts/run/board/run-board-render-condition.ts +10 -1
- package/scripts/run/board/run-board-render-title.ts +7 -0
- package/scripts/run/board/run-board-settle.ts +16 -2
- package/scripts/run/board/run-board-snapshot.ts +4 -0
- package/scripts/run/board/run-board-status.ts +11 -1
- package/scripts/run/cut/run-cut-cli.ts +2 -1
- package/scripts/run/park/run-park-cli.ts +13 -1
- package/scripts/run/park/run-park-escalate.ts +102 -0
- package/scripts/run/park/run-stalled.ts +29 -7
- package/scripts/run/review/run-review-early-push.ts +6 -6
- package/scripts/run/ship/run-ship-stop-cause.ts +12 -1
- package/scripts/split/split-assess.ts +14 -5
- package/scripts/test/test-related-touched.ts +21 -3
- package/scripts/test/test-related.ts +1 -1
- package/dist/commands/chunk-6WEVLIZE.js +0 -29
- package/dist/commands/chunk-E2ZCUKHT.js +0 -274
- package/dist/commands/chunk-NMLCPYBN.js +0 -134
- package/dist/commands/chunk-QEIO2ZNQ.js +0 -324
- package/dist/commands/chunk-QWX7EBC6.js +0 -112
- package/dist/commands/chunk-RQRLW4XK.js +0 -20
- package/dist/commands/chunk-UCQJDYE3.js +0 -21
- package/dist/commands/chunk-W4YH2DF3.js +0 -58
- package/dist/commands/{chunk-LRA3PXHS.js → chunk-ENKFCOVY.js} +3 -3
- package/dist/commands/{chunk-RUWV4INF.js → chunk-HQGNXR6I.js} +3 -3
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { agent_argv, type AgentArgv, type AgentArgvResult } from '#scripts/agent/agent-argv'
|
|
2
|
+
import {
|
|
3
|
+
agent_role_profile,
|
|
4
|
+
type AgentProfile,
|
|
5
|
+
type ProfileResult,
|
|
6
|
+
} from '#scripts/agent/agent-role-profile'
|
|
7
|
+
import { agent_worker_profile } from '#scripts/agent/agent-worker-profile'
|
|
8
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
9
|
+
import { run_ending } from '#scripts/run/run-ending'
|
|
10
|
+
import { lane_dispatch_log } from './lane-dispatch-log'
|
|
11
|
+
import type { LaneInfo } from './lane-registry'
|
|
12
|
+
import { lane_resume, type ResumePlan } from './lane-resume'
|
|
13
|
+
|
|
14
|
+
type Prepared =
|
|
15
|
+
| {
|
|
16
|
+
kind: 'prepared'
|
|
17
|
+
invocation: string
|
|
18
|
+
argv: AgentArgv
|
|
19
|
+
profile: AgentProfile
|
|
20
|
+
resumed_from: string | undefined
|
|
21
|
+
}
|
|
22
|
+
| { kind: 'rejected'; note: string }
|
|
23
|
+
|
|
24
|
+
// Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
|
|
25
|
+
// Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
|
|
26
|
+
// exactly the reasons a fresh dispatch is.
|
|
27
|
+
function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
|
|
28
|
+
if (plan.kind === 'resume') {
|
|
29
|
+
return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// **The worker profile the lane's Issue selects, where the repository opts into `josh.worker`**.
|
|
36
|
+
// The Issue's `worker:<name>` label (else the configured default) wins over `JOSH_WORKER_MODEL` /
|
|
37
|
+
// `JOSH_WORKER_EFFORT`; a repository without the setting resolves the worker from the environment as
|
|
38
|
+
// before and never reads the labels. `record_output` keeps the chosen profile in the lane's `.env`,
|
|
39
|
+
// which a cut relaunch resumes on.
|
|
40
|
+
async function worker_profile(lane: LaneInfo): Promise<ProfileResult> {
|
|
41
|
+
const worker = await agent_worker_profile.resolve(
|
|
42
|
+
lane.directory,
|
|
43
|
+
async () => await git_gh_issue_write.read_label_names(lane.issue),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
if (worker.kind === 'unset') return agent_role_profile.resolve(agent_role_profile.WORKER)
|
|
47
|
+
|
|
48
|
+
return worker.kind === 'rejected' ? worker : { kind: 'profile', profile: worker.worker.agent }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
|
|
52
|
+
// The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
|
|
53
|
+
// none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
|
|
54
|
+
// first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh. **A
|
|
55
|
+
// fresh dispatch never reads the record**: a person restarting a child (`lane:restart`) wants a new
|
|
56
|
+
// session that reads the Issue from the start, whatever the previous one ended on.
|
|
57
|
+
async function prepared(lane: LaneInfo, is_fresh: boolean): Promise<Prepared> {
|
|
58
|
+
const resolved = await worker_profile(lane)
|
|
59
|
+
|
|
60
|
+
if (resolved.kind === 'rejected') return resolved
|
|
61
|
+
|
|
62
|
+
const record = is_fresh
|
|
63
|
+
? undefined
|
|
64
|
+
: run_ending.read_exit(lane_dispatch_log.default_log_path(lane))
|
|
65
|
+
const plan = lane_resume.plan(lane.issue, record, resolved.profile.provider)
|
|
66
|
+
const built = built_for(plan, resolved.profile, lane)
|
|
67
|
+
|
|
68
|
+
if (built.kind === 'rejected') return built
|
|
69
|
+
const resumed_from = plan.kind === 'resume' ? plan.session_id : undefined
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
kind: 'prepared',
|
|
73
|
+
invocation: plan.invocation,
|
|
74
|
+
argv: built.argv,
|
|
75
|
+
profile: built.profile,
|
|
76
|
+
resumed_from,
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const lane_dispatch_prepare = { prepared }
|
|
81
|
+
|
|
82
|
+
export type { Prepared }
|
|
83
|
+
export { lane_dispatch_prepare }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AgentArgv } from '#scripts/agent/agent-argv'
|
|
2
2
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
3
|
import type { LabelWrite } from '#scripts/gh/git-gh-issue-write'
|
|
4
4
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
@@ -10,15 +10,14 @@ import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
|
|
|
10
10
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
11
11
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
12
12
|
import { run_park } from '#scripts/run/park/run-park'
|
|
13
|
-
import { run_ending } from '#scripts/run/run-ending'
|
|
14
13
|
import { run_label } from '#scripts/run/run-label'
|
|
15
14
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
16
15
|
import { lane_child_marker } from './lane-child-marker'
|
|
17
16
|
import { lane_dispatch_log } from './lane-dispatch-log'
|
|
17
|
+
import { lane_dispatch_prepare } from './lane-dispatch-prepare'
|
|
18
18
|
import { lane_ledger_write } from './lane-ledger-write'
|
|
19
19
|
import { lane_output } from './lane-output'
|
|
20
20
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
21
|
-
import { lane_resume, type ResumePlan } from './lane-resume'
|
|
22
21
|
import { lane_seat_start } from './lane-seat-start'
|
|
23
22
|
import { lane_state } from './lane-state'
|
|
24
23
|
import { openai_lane_supervisor } from './openai-lane-supervisor'
|
|
@@ -51,7 +50,6 @@ const WARNING_RECOVERY =
|
|
|
51
50
|
// once rather than inlined at each use.
|
|
52
51
|
const LABEL_UNSET_KIND = 'label-unset'
|
|
53
52
|
const RESTART_START = 'restart'
|
|
54
|
-
// The role a lane child runs under, resolved once so the fresh and resume builders read the same one.
|
|
55
53
|
|
|
56
54
|
interface Dispatched {
|
|
57
55
|
kind: 'dispatched'
|
|
@@ -93,16 +91,6 @@ interface StartRequest {
|
|
|
93
91
|
resumed_from: string | undefined
|
|
94
92
|
}
|
|
95
93
|
|
|
96
|
-
type Prepared =
|
|
97
|
-
| {
|
|
98
|
-
kind: 'prepared'
|
|
99
|
-
invocation: string
|
|
100
|
-
argv: AgentArgv
|
|
101
|
-
profile: AgentProfile
|
|
102
|
-
resumed_from: string | undefined
|
|
103
|
-
}
|
|
104
|
-
| { kind: 'rejected'; note: string }
|
|
105
|
-
|
|
106
94
|
/** The prompt the headless child is given: `fullrun #<N>`, and nothing a caller supplied verbatim. */
|
|
107
95
|
function child_invocation(issue: string): string {
|
|
108
96
|
return lane_child_invocation.child_invocation(issue)
|
|
@@ -276,44 +264,6 @@ async function started(request: StartRequest): Promise<DispatchOutcome> {
|
|
|
276
264
|
return await dispatched_start(request, result.pid, notes, nonce)
|
|
277
265
|
}
|
|
278
266
|
|
|
279
|
-
// Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
|
|
280
|
-
// Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
|
|
281
|
-
// exactly the reasons a fresh dispatch is.
|
|
282
|
-
function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
|
|
283
|
-
if (plan.kind === 'resume') {
|
|
284
|
-
return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
|
|
291
|
-
// The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
|
|
292
|
-
// none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
|
|
293
|
-
// first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh. **A
|
|
294
|
-
// fresh dispatch never reads the record**: a person restarting a child (`lane:restart`) wants a new
|
|
295
|
-
// session that reads the Issue from the start, whatever the previous one ended on.
|
|
296
|
-
function prepared(lane: LaneInfo, is_fresh: boolean): Prepared {
|
|
297
|
-
const resolved = agent_role_profile.resolve(agent_role_profile.WORKER)
|
|
298
|
-
|
|
299
|
-
if (resolved.kind === 'rejected') return resolved
|
|
300
|
-
|
|
301
|
-
const record = is_fresh ? undefined : run_ending.read_exit(default_log_path(lane))
|
|
302
|
-
const plan = lane_resume.plan(lane.issue, record, resolved.profile.provider)
|
|
303
|
-
const built = built_for(plan, resolved.profile, lane)
|
|
304
|
-
|
|
305
|
-
if (built.kind === 'rejected') return built
|
|
306
|
-
const resumed_from = plan.kind === 'resume' ? plan.session_id : undefined
|
|
307
|
-
|
|
308
|
-
return {
|
|
309
|
-
kind: 'prepared',
|
|
310
|
-
invocation: plan.invocation,
|
|
311
|
-
argv: built.argv,
|
|
312
|
-
profile: built.profile,
|
|
313
|
-
resumed_from,
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
267
|
// **The parent claims the marker before it starts the child**, so the window in which a running child
|
|
318
268
|
// is uncounted closes at dispatch rather than tens of minutes later once the child's own `fullrun` gets
|
|
319
269
|
// to its (idempotent) apply. `issue_add_label` creates the label if the repository lacks it — a
|
|
@@ -400,7 +350,7 @@ async function dispatch_child(
|
|
|
400
350
|
const lane = await lane_registry.find_open_lane(issue)
|
|
401
351
|
|
|
402
352
|
if (lane === undefined) return { kind: 'no-lane' }
|
|
403
|
-
const built = prepared(lane, start === RESTART_START)
|
|
353
|
+
const built = await lane_dispatch_prepare.prepared(lane, start === RESTART_START)
|
|
404
354
|
const log_path = default_log_path(lane)
|
|
405
355
|
|
|
406
356
|
if (built.kind === 'rejected') return { kind: 'failed', lane, log_path, note: built.note }
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
2
|
+
import type { RunEvent } from '#scripts/run/event/run-event-stream'
|
|
3
|
+
import { lane_breakdown } from './lane-breakdown'
|
|
4
|
+
import { lane_ledger, type LedgerEntry } from './lane-ledger'
|
|
5
|
+
import { lane_net_time, type LaneSpan } from './lane-net-time'
|
|
6
|
+
import { lane_stage_budget } from './lane-stage-budget'
|
|
7
|
+
import type { ToolCall } from './lane-transcript-calls'
|
|
8
|
+
|
|
9
|
+
// Wall-clock accounting, separate from legacy lane net. Human wait wins over automatic wait;
|
|
10
|
+
// automatic wait wins over off-tool work. Parallel tool durations remain a separate cumulative value.
|
|
11
|
+
interface ElapsedTime {
|
|
12
|
+
total_ms: number
|
|
13
|
+
human_ms: number
|
|
14
|
+
automatic_ms: number
|
|
15
|
+
work_ms: number
|
|
16
|
+
unclassified_ms: number
|
|
17
|
+
tool_ms: number
|
|
18
|
+
within_target: boolean
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const EDIT_TOOLS: ReadonlySet<string> = new Set(['Edit', 'Write'])
|
|
22
|
+
const AUTOMATIC_STAGES: ReadonlySet<string> = new Set([
|
|
23
|
+
'gate',
|
|
24
|
+
'pre-detach',
|
|
25
|
+
'followup',
|
|
26
|
+
lane_ledger.CI_WAIT_STAGE,
|
|
27
|
+
])
|
|
28
|
+
|
|
29
|
+
function tool_spans(calls: ReadonlyArray<ToolCall>): Array<LaneSpan> {
|
|
30
|
+
return calls.flatMap((call) =>
|
|
31
|
+
call.duration_ms === undefined || EDIT_TOOLS.has(call.tool ?? '')
|
|
32
|
+
? []
|
|
33
|
+
: { from_ms: call.started_ms, to_ms: call.started_ms + call.duration_ms },
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function stage_spans(entries: ReadonlyArray<LedgerEntry>, issue: number): Array<LaneSpan> {
|
|
38
|
+
return entries.flatMap((entry) =>
|
|
39
|
+
entry.kind === lane_ledger.KIND.STAGE &&
|
|
40
|
+
entry.issue === issue &&
|
|
41
|
+
AUTOMATIC_STAGES.has(entry.stage)
|
|
42
|
+
? { from_ms: Date.parse(entry.at) - entry.elapsed_ms, to_ms: Date.parse(entry.at) }
|
|
43
|
+
: [],
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function human_spans(
|
|
48
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
49
|
+
events: ReadonlyArray<RunEvent>,
|
|
50
|
+
issue: number,
|
|
51
|
+
span: LaneSpan,
|
|
52
|
+
): ReadonlyArray<LaneSpan> {
|
|
53
|
+
return lane_net_time.hold_waits(
|
|
54
|
+
entries,
|
|
55
|
+
events.filter((event) => event.kind === 'park'),
|
|
56
|
+
issue,
|
|
57
|
+
span,
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function tool_ms(span: LaneSpan, calls: ReadonlyArray<ToolCall>): number {
|
|
62
|
+
return tool_spans(calls).reduce((sum, call) => sum + lane_breakdown.covered_ms(span, [call]), 0)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function partition(
|
|
66
|
+
span: LaneSpan,
|
|
67
|
+
human: ReadonlyArray<LaneSpan>,
|
|
68
|
+
automatic: ReadonlyArray<LaneSpan>,
|
|
69
|
+
calls: ReadonlyArray<ToolCall>,
|
|
70
|
+
): ElapsedTime {
|
|
71
|
+
const total_ms = span.to_ms - span.from_ms
|
|
72
|
+
const human_ms = lane_breakdown.covered_ms(span, human)
|
|
73
|
+
const occupied_ms = lane_breakdown.covered_ms(span, [...human, ...automatic])
|
|
74
|
+
const remainder_ms = total_ms - occupied_ms
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
total_ms,
|
|
78
|
+
human_ms,
|
|
79
|
+
automatic_ms: occupied_ms - human_ms,
|
|
80
|
+
work_ms: calls.length > 0 ? remainder_ms : 0,
|
|
81
|
+
unclassified_ms: calls.length > 0 ? 0 : remainder_ms,
|
|
82
|
+
tool_ms: tool_ms(span, calls),
|
|
83
|
+
within_target: total_ms <= lane_stage_budget.TARGET_MINUTES * MS_PER_MINUTE,
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function of(
|
|
88
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
89
|
+
events: ReadonlyArray<RunEvent>,
|
|
90
|
+
issue: number,
|
|
91
|
+
calls: ReadonlyArray<ToolCall>,
|
|
92
|
+
): ElapsedTime | undefined {
|
|
93
|
+
const span = lane_net_time.span_of(entries, issue)
|
|
94
|
+
if (span === undefined) return undefined
|
|
95
|
+
const human = human_spans(entries, events, issue, span)
|
|
96
|
+
const automatic = [
|
|
97
|
+
...lane_net_time.automatic_waits(entries, events, issue, span),
|
|
98
|
+
...stage_spans(entries, issue),
|
|
99
|
+
...tool_spans(calls),
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
return partition(span, human, automatic, calls)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function text(timing: ElapsedTime): string {
|
|
106
|
+
const minutes = lane_breakdown.minutes_text
|
|
107
|
+
const status = timing.within_target ? 'within target' : 'over target'
|
|
108
|
+
|
|
109
|
+
return [
|
|
110
|
+
`End-to-end ${minutes(timing.total_ms)} (${status}); ${lane_stage_budget.DESCRIPTION}`,
|
|
111
|
+
`Exclusive wall clock: off-tool work ${minutes(timing.work_ms)}; automatic wait ${minutes(timing.automatic_ms)}; human wait ${minutes(timing.human_ms)}; unclassified (missing transcripts) ${minutes(timing.unclassified_ms)}`,
|
|
112
|
+
`Tool cumulative ${minutes(timing.tool_ms)} (parallel calls overlap; not additive to wall clock). Off-tool work includes unrecorded activity; automatic wait includes tool responses, gate, CI, yield, outage and sleep. Legacy net excludes more than human wait.`,
|
|
113
|
+
].join('\n')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const lane_elapsed_time = { of, text }
|
|
117
|
+
|
|
118
|
+
export { lane_elapsed_time }
|
|
@@ -24,7 +24,9 @@ const early_push_schema = z.object({
|
|
|
24
24
|
// finding that decided a review or round-2 stop — the blocking ones, else the fixed ones
|
|
25
25
|
// (joshuafolkken/kit#4426), absent where none decided the stop. `base` is the change base a review
|
|
26
26
|
// failure or a followup `check` stopped on, so its re-ship can tell a fix-only tree from a moved base
|
|
27
|
-
// (joshuafolkken/kit#6141, joshuafolkken/kit#6675), absent on every other stop.
|
|
27
|
+
// (joshuafolkken/kit#6141, joshuafolkken/kit#6675), absent on every other stop. `checks` names the CI
|
|
28
|
+
// checks a followup `check` stop's wait reported failed (joshuafolkken/kit#7333), absent on every other
|
|
29
|
+
// stop and on one recorded before it had them. How long it stayed stopped is derived
|
|
28
30
|
// from the next ship stage, not recorded, so a resumed ship never has to know the stop it ends.
|
|
29
31
|
const stop_schema = z.object({
|
|
30
32
|
kind: z.literal(KIND.STOP),
|
|
@@ -35,6 +37,7 @@ const stop_schema = z.object({
|
|
|
35
37
|
preconditions: z.array(z.string()).optional(),
|
|
36
38
|
findings: z.array(z.string()).optional(),
|
|
37
39
|
base: z.string().optional(),
|
|
40
|
+
checks: z.array(z.string()).optional(),
|
|
38
41
|
})
|
|
39
42
|
// One `josh run:chain` on `issue`, done or stopped: `at` is its end and `elapsed_ms` its length, so the
|
|
40
43
|
// next run's start ends the wait after a stop. `stage` names where it stopped and `reason` why — the
|
|
@@ -4,6 +4,7 @@ import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
|
4
4
|
import type { LedgerEntry } from './lane-ledger'
|
|
5
5
|
import { lane_sleep } from './lane-sleep'
|
|
6
6
|
import { lane_spans, type IssueAt, type Span } from './lane-spans'
|
|
7
|
+
import { lane_stage_events } from './lane-stage-events'
|
|
7
8
|
import { lane_stage_stats } from './lane-stage-stats'
|
|
8
9
|
import { lane_stop_stats } from './lane-stop-stats'
|
|
9
10
|
import { lane_yield } from './lane-yield'
|
|
@@ -35,7 +36,9 @@ function entries_of(entries: ReadonlyArray<LedgerEntry>, issue: number): Array<L
|
|
|
35
36
|
// The first dispatch of `issue` to its merge, or `undefined` while either is missing or the merge comes
|
|
36
37
|
// first.
|
|
37
38
|
function span_of(entries: ReadonlyArray<LedgerEntry>, issue: number): LaneSpan | undefined {
|
|
38
|
-
const of_issue = entries_of(entries, issue)
|
|
39
|
+
const of_issue = entries_of(entries, issue).toSorted(
|
|
40
|
+
(left, right) => Date.parse(left.at) - Date.parse(right.at),
|
|
41
|
+
)
|
|
39
42
|
const from = of_issue.find((entry) => lane_stage_stats.is_dispatch(entry))
|
|
40
43
|
const to = of_issue.findLast((entry) => lane_stage_stats.is_merge(entry))
|
|
41
44
|
|
|
@@ -191,10 +194,7 @@ function split_waits(
|
|
|
191
194
|
return cut_inside(split_spans(entries, events_of_issue(events, issue)), span)
|
|
192
195
|
}
|
|
193
196
|
|
|
194
|
-
|
|
195
|
-
// yield and split run until its redispatch, and each sleep of the host — the intervals `josh
|
|
196
|
-
// lane:breakdown` counts as excluded (`lane-breakdown.ts`).
|
|
197
|
-
function waits(
|
|
197
|
+
function waiting(
|
|
198
198
|
entries: ReadonlyArray<LedgerEntry>,
|
|
199
199
|
events: ReadonlyArray<RunEvent>,
|
|
200
200
|
issue: number,
|
|
@@ -203,11 +203,23 @@ function waits(
|
|
|
203
203
|
return joined([
|
|
204
204
|
...hold_waits(entries, events, issue, span),
|
|
205
205
|
...yielded(entries, events, issue, span),
|
|
206
|
-
...split_waits(entries, events, issue, span),
|
|
207
206
|
...slept(events, span),
|
|
208
207
|
])
|
|
209
208
|
}
|
|
210
209
|
|
|
210
|
+
// Legacy net also leaves out the complete run that split its issue.
|
|
211
|
+
function waits(
|
|
212
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
213
|
+
events: ReadonlyArray<RunEvent>,
|
|
214
|
+
issue: number,
|
|
215
|
+
span: LaneSpan,
|
|
216
|
+
): Array<LaneSpan> {
|
|
217
|
+
return joined([
|
|
218
|
+
...waiting(entries, events, issue, span),
|
|
219
|
+
...split_waits(entries, events, issue, span),
|
|
220
|
+
])
|
|
221
|
+
}
|
|
222
|
+
|
|
211
223
|
function is_followup_start(event: RunEvent): boolean {
|
|
212
224
|
const { stage, phase } = run_ship_stage.words_of(event.text)
|
|
213
225
|
|
|
@@ -230,6 +242,17 @@ function followed(events: ReadonlyArray<RunEvent>, issue: number, span: LaneSpan
|
|
|
230
242
|
.map(({ line, to_ms }) => ({ from_ms: line.at_ms, to_ms }))
|
|
231
243
|
}
|
|
232
244
|
|
|
245
|
+
function automatic_waits(
|
|
246
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
247
|
+
events: ReadonlyArray<RunEvent>,
|
|
248
|
+
issue: number,
|
|
249
|
+
span: LaneSpan,
|
|
250
|
+
): Array<LaneSpan> {
|
|
251
|
+
const stages = lane_stage_events.of(entries, events, issue)
|
|
252
|
+
|
|
253
|
+
return joined([...waiting(entries, events, issue, span), ...followed(stages, issue, span)])
|
|
254
|
+
}
|
|
255
|
+
|
|
233
256
|
// Every interval `net_ms` leaves out of `span`: the waits and the driver's followups, joined.
|
|
234
257
|
function outside(
|
|
235
258
|
entries: ReadonlyArray<LedgerEntry>,
|
|
@@ -237,7 +260,10 @@ function outside(
|
|
|
237
260
|
issue: number,
|
|
238
261
|
span: LaneSpan,
|
|
239
262
|
): Array<LaneSpan> {
|
|
240
|
-
return joined([
|
|
263
|
+
return joined([
|
|
264
|
+
...automatic_waits(entries, events, issue, span),
|
|
265
|
+
...split_waits(entries, events, issue, span),
|
|
266
|
+
])
|
|
241
267
|
}
|
|
242
268
|
|
|
243
269
|
/**
|
|
@@ -282,6 +308,8 @@ function missing_reason(entries: ReadonlyArray<LedgerEntry>, issue: number): str
|
|
|
282
308
|
}
|
|
283
309
|
|
|
284
310
|
const lane_net_time = {
|
|
311
|
+
automatic_waits,
|
|
312
|
+
hold_waits,
|
|
285
313
|
missing_reason,
|
|
286
314
|
net_minutes,
|
|
287
315
|
net_ms,
|
|
@@ -215,7 +215,7 @@ type OverranNet = Extract<LaneNet, { kind: 'minutes' }>
|
|
|
215
215
|
async function overran_text(issue: number, net: OverranNet): Promise<string> {
|
|
216
216
|
const breakdown =
|
|
217
217
|
lane_breakdown_implement.breakdown_of(net.entries, net.events, issue) ?? net.breakdown
|
|
218
|
-
const report = lane_breakdown_text.report_of(issue, breakdown, net.entries)
|
|
218
|
+
const report = lane_breakdown_text.report_of(issue, breakdown, net.entries, net.events)
|
|
219
219
|
const comment = lane_breakdown_text.comment(issue, net.minutes, report)
|
|
220
220
|
|
|
221
221
|
if (!net.is_commented) await git_gh_issue_write.issue_try_comment(String(issue), comment)
|
|
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import type { LanePlan } from './lane-plan'
|
|
4
4
|
import { lane_plan_approval } from './lane-plan-approval'
|
|
5
5
|
import { lane_plan_check } from './lane-plan-check'
|
|
6
|
+
import { lane_plan_estimate } from './lane-plan-estimate'
|
|
6
7
|
import { lane_plan_imports } from './lane-plan-imports'
|
|
7
8
|
|
|
8
9
|
// `josh lane:plan <issue> <path>... [--probe] [--imports <path>...]` — the command line over
|
|
@@ -16,7 +17,7 @@ const PROBE_FLAG = '--probe'
|
|
|
16
17
|
const SINGLE_FLAG = '--single'
|
|
17
18
|
const FLAGS = new Set([PROBE_FLAG, SINGLE_FLAG])
|
|
18
19
|
const USAGE =
|
|
19
|
-
'Usage: josh lane:plan <issue-number> <path> [<path> ...] [--probe] [--single] [--size-approval <json-file>] [--imports <path> ...]'
|
|
20
|
+
'Usage: josh lane:plan <issue-number> <path> [<path> ...] [--probe] [--single] [--estimate <json-file>] [--size-approval <json-file>] [--imports <path> ...]'
|
|
20
21
|
const { YIELD_EXIT_CODE } = lane_plan_check
|
|
21
22
|
|
|
22
23
|
async function planned(
|
|
@@ -24,12 +25,15 @@ async function planned(
|
|
|
24
25
|
directory: string,
|
|
25
26
|
is_single: boolean,
|
|
26
27
|
): Promise<LanePlan | undefined> {
|
|
27
|
-
const
|
|
28
|
+
const estimate = lane_plan_estimate.split(tokens)
|
|
29
|
+
const input = lane_plan_approval.split(estimate.tokens)
|
|
28
30
|
const plan = lane_plan_check.plan_of(input.tokens, new Date())
|
|
29
31
|
if (plan === undefined) return undefined
|
|
30
32
|
const declared = is_single ? { ...plan, single: true } : plan
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
const scoped = await lane_plan_estimate.attach(declared, estimate.file)
|
|
35
|
+
|
|
36
|
+
return await lane_plan_approval.attach(lane_plan_check.placed(scoped, directory), input.file)
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
async function run(
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises'
|
|
2
|
+
import { split_assess } from '#scripts/split/split-assess'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
import type { LanePlan } from './lane-plan'
|
|
5
|
+
|
|
6
|
+
// Selected consumers, distributed docs and verification fixtures share the actual-size calculator.
|
|
7
|
+
// A reference alone implies neither an edit nor an independently mergeable split boundary.
|
|
8
|
+
const FLAG = '--estimate'
|
|
9
|
+
const FLAG_WIDTH = 2
|
|
10
|
+
const change_schema = z.object({
|
|
11
|
+
path: z.string().trim().min(1),
|
|
12
|
+
changed_lines: z.number().int().nonnegative(),
|
|
13
|
+
})
|
|
14
|
+
const schema = z.object({
|
|
15
|
+
changes: z.array(change_schema),
|
|
16
|
+
added: z.array(z.string()).default([]),
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
function split(tokens: ReadonlyArray<string>): { tokens: Array<string>; file?: string } {
|
|
20
|
+
const at = tokens.indexOf(FLAG)
|
|
21
|
+
if (at === -1) return { tokens: [...tokens] }
|
|
22
|
+
if (tokens.lastIndexOf(FLAG) !== at) throw new Error('duplicate --estimate')
|
|
23
|
+
const file = tokens[at + 1]
|
|
24
|
+
if (file === undefined || file.startsWith('--')) throw new Error('--estimate needs a JSON file')
|
|
25
|
+
|
|
26
|
+
return { tokens: [...tokens.slice(0, at), ...tokens.slice(at + FLAG_WIDTH)], file }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function read(file: string): Promise<z.infer<typeof schema>> {
|
|
30
|
+
const scope = schema.parse(JSON.parse(await readFile(file, 'utf8')))
|
|
31
|
+
const paths = scope.changes.map((change) => change.path)
|
|
32
|
+
if (new Set(paths).size !== paths.length) throw new Error('duplicate estimate path')
|
|
33
|
+
|
|
34
|
+
if (scope.added.some((path) => !paths.includes(path))) {
|
|
35
|
+
throw new Error('added path needs an estimate')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return scope
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function attach(plan: LanePlan, file: string | undefined): Promise<LanePlan> {
|
|
42
|
+
if (file === undefined) return plan
|
|
43
|
+
const scope = await read(file)
|
|
44
|
+
const paths = scope.changes.map((change) => change.path)
|
|
45
|
+
|
|
46
|
+
if (plan.paths.some((path) => !paths.includes(path))) {
|
|
47
|
+
throw new Error('planned path needs an estimate')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const size = split_assess.measure(scope.changes, undefined, new Set(scope.added))
|
|
51
|
+
|
|
52
|
+
return { ...plan, paths, estimated_size: { files: size.files, lines: size.lines } }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const lane_plan_estimate = { attach, read, split }
|
|
56
|
+
|
|
57
|
+
export { lane_plan_estimate }
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { codex_hooks } from '#scripts/agent/codex-hooks'
|
|
2
1
|
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
3
2
|
import { issue_body_keys } from '#scripts/issue/issue-body-keys'
|
|
4
3
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
@@ -163,20 +162,10 @@ function files_approved(
|
|
|
163
162
|
)
|
|
164
163
|
}
|
|
165
164
|
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
function
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
return source !== undefined && sources.includes(source)
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function is_counted(file: string, paths: ReadonlyArray<string>): boolean {
|
|
175
|
-
return !test_declared_logic.is_test_file(file) && !is_generated_from(file, paths)
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
function with_artifacts(files: ReadonlyArray<string>, paths: ReadonlyArray<string>): Array<string> {
|
|
179
|
-
return [...files, ...paths.filter((file) => is_generated_from(file, files))]
|
|
165
|
+
// Estimate paths and the actual diff exclude the same tests and run records. Generated pairs are
|
|
166
|
+
// grouped by `split_assess.units_of`, so no caller can split an artifact from its source.
|
|
167
|
+
function is_counted(file: string): boolean {
|
|
168
|
+
return split_assess.is_deliverable({ path: file, changed_lines: 0 })
|
|
180
169
|
}
|
|
181
170
|
|
|
182
171
|
function files_over(
|
|
@@ -186,7 +175,7 @@ function files_over(
|
|
|
186
175
|
signals: PlanSignals,
|
|
187
176
|
): FilesOver | undefined {
|
|
188
177
|
const limit = declared * declared_growth.factor(ratios_of(signals), 'files')
|
|
189
|
-
const counted = plan.paths.filter((file) => is_counted(file
|
|
178
|
+
const counted = plan.paths.filter((file) => is_counted(file))
|
|
190
179
|
const units = units_of(ordered(counted, recorded?.paths ?? []), signals)
|
|
191
180
|
|
|
192
181
|
if (units.length <= limit || files_approved(plan, declared, recorded, units.length)) {
|
|
@@ -194,8 +183,8 @@ function files_over(
|
|
|
194
183
|
}
|
|
195
184
|
|
|
196
185
|
const tests = plan.paths.filter((file) => test_declared_logic.is_test_file(file))
|
|
197
|
-
const kept =
|
|
198
|
-
const split_off =
|
|
186
|
+
const kept = counted.filter((file) => units.slice(0, limit).flat().includes(file))
|
|
187
|
+
const split_off = counted.filter((file) => units.slice(limit).flat().includes(file))
|
|
199
188
|
|
|
200
189
|
return { reason: 'files', declared, limit, kept, split_off, tests }
|
|
201
190
|
}
|
|
@@ -286,9 +275,11 @@ function measure_over(
|
|
|
286
275
|
): MeasureOver | undefined {
|
|
287
276
|
if (signals.split_filed) return undefined
|
|
288
277
|
|
|
278
|
+
const estimated = Math.max(declared.lines, plan.estimated_size?.lines ?? 0)
|
|
279
|
+
|
|
289
280
|
return (
|
|
290
281
|
hunks_over(declared.files, unplanned_hunks(signals, plan, recorded), signals) ??
|
|
291
|
-
planned_lines(
|
|
282
|
+
planned_lines(estimated, signals, plan, recorded)
|
|
292
283
|
)
|
|
293
284
|
}
|
|
294
285
|
|
|
@@ -343,7 +334,7 @@ const SIZE_PREFIX = issue_body_keys.prefix('size')
|
|
|
343
334
|
|
|
344
335
|
function files_text(issue: number, over: FilesOver): string {
|
|
345
336
|
const planned = [...over.kept, ...over.split_off]
|
|
346
|
-
const counted =
|
|
337
|
+
const counted = split_assess.units_of(planned, new Set()).length
|
|
347
338
|
const bar = `${String(counted)} files (tests and generated artifacts excluded), over ${String(over.limit)} — ${String(over.limit / over.declared)} times the ${String(over.declared)} its \`${SIZE_PREFIX}\` declares`
|
|
348
339
|
const replan = ['pnpm josh lane:plan', String(issue), ...over.kept, ...over.tests].join(' ')
|
|
349
340
|
|
|
@@ -24,6 +24,7 @@ const lane_plan_schema = z.object({
|
|
|
24
24
|
issue: z.number(),
|
|
25
25
|
paths: z.array(z.string()),
|
|
26
26
|
planned_at: z.string(),
|
|
27
|
+
estimated_size: z.object({ files: z.number(), lines: z.number() }).optional(),
|
|
27
28
|
size_approval: lane_plan_approval.approval_schema.optional(),
|
|
28
29
|
// `--single`: the plan is one deliverable with no separately-mergeable part, so a files-axis overrun
|
|
29
30
|
// is noted for the pre-gate `run:cut` to verify rather than refused (joshuafolkken/kit#6647).
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { agent_argv } from '#scripts/agent/agent-argv'
|
|
2
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
2
3
|
import { error_text } from '#scripts/lib/error-message'
|
|
3
4
|
import { detached_launch, type LaunchResult } from '#scripts/run/detached-launch'
|
|
4
5
|
import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
|
|
@@ -22,7 +23,7 @@ const { SUPERVISED_KEY } = run_ship_detach
|
|
|
22
23
|
const OPENAI_PROVIDER = 'openai'
|
|
23
24
|
|
|
24
25
|
type RelaunchResult = LaunchResult | { kind: 'rejected'; note: string }
|
|
25
|
-
type Prepared = Exclude<ReturnType<typeof agent_argv.resume_argv
|
|
26
|
+
type Prepared = Exclude<Awaited<ReturnType<typeof agent_argv.resume_argv>>, { kind: 'rejected' }>
|
|
26
27
|
|
|
27
28
|
function launch(lane: LaneInfo, built: Prepared, on_note: (note: string) => void): RelaunchResult {
|
|
28
29
|
return detached_launch.launch(
|
|
@@ -53,10 +54,14 @@ async function relaunch(
|
|
|
53
54
|
phase: string,
|
|
54
55
|
on_note: (note: string) => void,
|
|
55
56
|
): Promise<RelaunchResult> {
|
|
56
|
-
const built = agent_argv.resume_argv(invocation, lane.profile, phase, lane.directory)
|
|
57
|
-
if (built.kind === 'rejected') return built
|
|
58
|
-
|
|
59
57
|
try {
|
|
58
|
+
// The labels are read only when `josh.worker` caps the phase's model; a failed read refuses.
|
|
59
|
+
const built = await agent_argv.resume_argv(invocation, lane.profile, phase, {
|
|
60
|
+
cwd: lane.directory,
|
|
61
|
+
labels: async () => await git_gh_issue_write.read_label_names(lane.issue),
|
|
62
|
+
})
|
|
63
|
+
if (built.kind === 'rejected') return built
|
|
64
|
+
|
|
60
65
|
return await lane_seat_start.start(lane, async (seated) => launch(seated, built, on_note))
|
|
61
66
|
} catch (error) {
|
|
62
67
|
return { kind: 'failed', note: error_text.message_of(error) }
|
|
@@ -12,6 +12,11 @@ const BUDGET_MINUTES = {
|
|
|
12
12
|
followup: 5,
|
|
13
13
|
} as const
|
|
14
14
|
|
|
15
|
+
// An end-to-end target, independent of the internal stage budgets and legacy lane net exclusions.
|
|
16
|
+
const TARGET_MINUTES = 30
|
|
17
|
+
const INTERNAL_MINUTES = Object.values(BUDGET_MINUTES).reduce((sum, minutes) => sum + minutes, 0)
|
|
18
|
+
const DESCRIPTION = `target ${String(TARGET_MINUTES)} min dispatch to merge (human wait reported separately, included); internal stage budgets ${String(INTERNAL_MINUTES)} min (plan 3 + implement 9 + ship 8 + followup 5)`
|
|
19
|
+
|
|
15
20
|
type BudgetStage = keyof typeof BUDGET_MINUTES
|
|
16
21
|
|
|
17
22
|
// The whole minutes `elapsed_ms` runs past `stage`'s budget, `undefined` within it.
|
|
@@ -21,7 +26,7 @@ function over_minutes(stage: BudgetStage, elapsed_ms: number): number | undefine
|
|
|
21
26
|
return over_ms > 0 ? Math.ceil(over_ms / MS_PER_MINUTE) : undefined
|
|
22
27
|
}
|
|
23
28
|
|
|
24
|
-
const lane_stage_budget = { BUDGET_MINUTES, over_minutes }
|
|
29
|
+
const lane_stage_budget = { BUDGET_MINUTES, DESCRIPTION, TARGET_MINUTES, over_minutes }
|
|
25
30
|
|
|
26
31
|
export { lane_stage_budget }
|
|
27
32
|
export type { BudgetStage }
|