@joshuafolkken/kit 1.3000.0 → 1.3044.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/.claude/skills/workflow-commands/progress-watcher.md +10 -8
- 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-UTBVTCQN.js → chunk-24OATKOF.js} +301 -168
- 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-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-WW3TX742.js → chunk-LZPPSOTP.js} +4 -4
- 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-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 +1909 -1878
- 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 +542 -527
- package/dist/hooks/pretool-guard.js +7 -7
- package/dist/hooks/session-lang.js +293 -16
- 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/josh/session-language-cli.ts +1 -1
- 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-header.ts +4 -5
- 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-read.ts +7 -1
- 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-roots.ts +25 -2
- package/scripts/run/board/run-board-settle.ts +16 -2
- package/scripts/run/board/run-board-setup.ts +13 -7
- package/scripts/run/board/run-board-snapshot.ts +4 -0
- package/scripts/run/board/run-board-status.ts +13 -1
- package/scripts/run/board/run-board-tick.ts +7 -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
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
2
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
-
import { github_release_runs, type RunSource } from './github-release-runs'
|
|
4
|
+
import { github_release_runs, type JobOutcomes, type RunSource } from './github-release-runs'
|
|
5
5
|
import { release_tag } from './release-tag'
|
|
6
6
|
|
|
7
7
|
// The tag's Publish run as `pnpm josh release` sees it through `gh`, so the npm wait can end the
|
|
8
8
|
// moment that run fails instead of waiting out its timeout for a version that will never appear.
|
|
9
9
|
|
|
10
10
|
const PUBLISH_WORKFLOW = 'publish.yml'
|
|
11
|
+
const NPM_JOBS = ['publish-npm']
|
|
12
|
+
|
|
13
|
+
// `has_npm_job_failed` holds unless `publish-npm` succeeded — so also when the jobs could not be
|
|
14
|
+
// read, since nothing then shows that npm took the version.
|
|
15
|
+
interface FailedRun {
|
|
16
|
+
run_id: number
|
|
17
|
+
failed_jobs: ReadonlyArray<string>
|
|
18
|
+
has_npm_job_failed: boolean
|
|
19
|
+
}
|
|
11
20
|
|
|
12
21
|
function gh_run_source(): RunSource {
|
|
13
22
|
return {
|
|
@@ -21,19 +30,43 @@ function gh_run_source(): RunSource {
|
|
|
21
30
|
}
|
|
22
31
|
}
|
|
23
32
|
|
|
33
|
+
async function read_job_outcomes(source: RunSource, run_id: number): Promise<JobOutcomes> {
|
|
34
|
+
try {
|
|
35
|
+
return await github_release_runs.job_outcomes(source, run_id)
|
|
36
|
+
} catch {
|
|
37
|
+
return { failed: [], succeeded: [] }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Only a `publish-npm` that succeeded clears npm: one skipped because `pack` failed never publishes.
|
|
42
|
+
async function describe_failure(source: RunSource, run_id: number): Promise<FailedRun> {
|
|
43
|
+
const { failed, succeeded } = await read_job_outcomes(source, run_id)
|
|
44
|
+
const has_npm_job_failed = succeeded.every(
|
|
45
|
+
(name) => !github_release_runs.is_named_job(name, NPM_JOBS),
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
return { run_id, failed_jobs: failed, has_npm_job_failed }
|
|
49
|
+
}
|
|
50
|
+
|
|
24
51
|
// A repository without the workflow, or a read that fails, tells nothing about the run, so the npm
|
|
25
52
|
// wait goes on as it did before the run was asked about.
|
|
26
|
-
async function
|
|
53
|
+
async function failed_run(version: string): Promise<FailedRun | undefined> {
|
|
27
54
|
try {
|
|
28
|
-
const
|
|
29
|
-
const run = await github_release_runs.publish_run(
|
|
55
|
+
const source = gh_run_source()
|
|
56
|
+
const run = await github_release_runs.publish_run(
|
|
57
|
+
source,
|
|
58
|
+
PUBLISH_WORKFLOW,
|
|
59
|
+
release_tag.tag_name(version),
|
|
60
|
+
)
|
|
61
|
+
if (!run || github_release_runs.run_state(run) !== 'failed') return undefined
|
|
30
62
|
|
|
31
|
-
return
|
|
63
|
+
return await describe_failure(source, run.id)
|
|
32
64
|
} catch {
|
|
33
65
|
return undefined
|
|
34
66
|
}
|
|
35
67
|
}
|
|
36
68
|
|
|
37
|
-
const release_publish_run = {
|
|
69
|
+
const release_publish_run = { failed_run }
|
|
38
70
|
|
|
71
|
+
export type { FailedRun }
|
|
39
72
|
export { release_publish_run }
|
|
@@ -31,10 +31,13 @@ function read_existing(repo: string): ReadonlyArray<string> | undefined {
|
|
|
31
31
|
return listing?.split('\n').filter((name) => name.length > 0)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
function missing_labels(
|
|
34
|
+
function missing_labels(
|
|
35
|
+
existing: ReadonlyArray<string>,
|
|
36
|
+
wanted: ReadonlyArray<LabelDefinition>,
|
|
37
|
+
): ReadonlyArray<LabelDefinition> {
|
|
35
38
|
const names = new Set(existing.map((name) => name.toLowerCase()))
|
|
36
39
|
|
|
37
|
-
return
|
|
40
|
+
return wanted.filter((label) => !names.has(label.name.toLowerCase()))
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
function create_label(label: LabelDefinition, repo: string): boolean {
|
|
@@ -52,9 +55,11 @@ function label_names(labels: ReadonlyArray<LabelDefinition>): ReadonlyArray<stri
|
|
|
52
55
|
|
|
53
56
|
// An unreadable listing is not an empty one: nothing is created, and every label is reported as
|
|
54
57
|
// unconfirmed rather than as missing. An unresolved repository (no GitHub remote) is the same case.
|
|
55
|
-
function unreadable(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
function unreadable(
|
|
59
|
+
wanted: ReadonlyArray<LabelDefinition>,
|
|
60
|
+
target = 'this repository',
|
|
61
|
+
): ReadonlyArray<string> {
|
|
62
|
+
const names = label_names(wanted)
|
|
58
63
|
|
|
59
64
|
console.warn(
|
|
60
65
|
` ⚠ could not read the labels of ${target}; make sure these exist: ${names.join(', ')}`,
|
|
@@ -76,14 +81,19 @@ function create_missing(
|
|
|
76
81
|
return names
|
|
77
82
|
}
|
|
78
83
|
|
|
79
|
-
// The label names not confirmed present afterwards — empty when the repository has every one.
|
|
80
|
-
|
|
81
|
-
|
|
84
|
+
// The label names not confirmed present afterwards — empty when the repository has every one. `extra`
|
|
85
|
+
// adds labels outside kit's set (an Issue's `worker:<name>`) to the same single listing read.
|
|
86
|
+
function ensure_labels(
|
|
87
|
+
repo: string | undefined,
|
|
88
|
+
extra: ReadonlyArray<LabelDefinition> = [],
|
|
89
|
+
): ReadonlyArray<string> {
|
|
90
|
+
const wanted = [...REPOSITORY_LABELS, ...extra]
|
|
91
|
+
if (repo === undefined) return unreadable(wanted)
|
|
82
92
|
|
|
83
93
|
const existing = read_existing(repo)
|
|
84
|
-
if (existing === undefined) return unreadable(repo)
|
|
94
|
+
if (existing === undefined) return unreadable(wanted, repo)
|
|
85
95
|
|
|
86
|
-
return create_missing(missing_labels(existing), repo)
|
|
96
|
+
return create_missing(missing_labels(existing, wanted), repo)
|
|
87
97
|
}
|
|
88
98
|
|
|
89
99
|
// The label names `ensure_labels` would create, read without creating any — every one when the
|
|
@@ -93,7 +103,9 @@ function planned_labels(repo: string | undefined): ReadonlyArray<string> | undef
|
|
|
93
103
|
if (repo === undefined) return label_names(REPOSITORY_LABELS)
|
|
94
104
|
const existing = read_existing(repo)
|
|
95
105
|
|
|
96
|
-
return existing === undefined
|
|
106
|
+
return existing === undefined
|
|
107
|
+
? undefined
|
|
108
|
+
: label_names(missing_labels(existing, REPOSITORY_LABELS))
|
|
97
109
|
}
|
|
98
110
|
|
|
99
111
|
const repository_labels = { ensure_labels, planned_labels }
|
|
@@ -5,6 +5,8 @@ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
|
5
5
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
6
6
|
import { parse_json, parse_json_array_safe } from '#scripts/git/parse-json-array'
|
|
7
7
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
|
+
import { CARRIED_ROUNDS_SUFFIX } from '#scripts/observations/observation-ledger'
|
|
9
|
+
import { observation_ledger_archive } from '#scripts/observations/observation-ledger-archive'
|
|
8
10
|
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
9
11
|
import { observation_ledger_line } from '#scripts/observations/observation-ledger-line'
|
|
10
12
|
import { z } from 'zod'
|
|
@@ -37,8 +39,7 @@ const COMMENT_NOTE =
|
|
|
37
39
|
'Kept here rather than in the observation ledger: a line appended after the commit would be pushed onto the open pull request and restart its CI.'
|
|
38
40
|
const CODE_FENCE = '```'
|
|
39
41
|
const OBSERVATION_LINE_MARK = '- k:'
|
|
40
|
-
const
|
|
41
|
-
const CARRIED_FILE_PATTERN = new RegExp(String.raw`^\d+${CARRIED_SUFFIX}\.md$`, 'u')
|
|
42
|
+
const CARRIED_FILE_PATTERN = new RegExp(String.raw`^\d+${CARRIED_ROUNDS_SUFFIX}\.md$`, 'u')
|
|
42
43
|
// One page of the newest closed issues: an issue leaves the search's interest once carried, so the
|
|
43
44
|
// ones still to carry are the recently closed.
|
|
44
45
|
const PER_PAGE = '100'
|
|
@@ -145,7 +146,7 @@ async function closed_issues(): Promise<ReadonlyArray<number>> {
|
|
|
145
146
|
}
|
|
146
147
|
|
|
147
148
|
function carried_path(issue: number, root: string): string {
|
|
148
|
-
return observation_ledger_home.file_path(`${String(issue)}${
|
|
149
|
+
return observation_ledger_home.file_path(`${String(issue)}${CARRIED_ROUNDS_SUFFIX}`, root)
|
|
149
150
|
}
|
|
150
151
|
|
|
151
152
|
// A path this carry writes, told by its file name alone so a git status path answers it too.
|
|
@@ -173,10 +174,14 @@ async function carry_issue(issue: number, root: string): Promise<number> {
|
|
|
173
174
|
return lines.length
|
|
174
175
|
}
|
|
175
176
|
|
|
176
|
-
// Copies every closed issue's comment rounds not yet in the ledger, and answers how many lines.
|
|
177
|
+
// Copies every closed issue's comment rounds not yet in the ledger, and answers how many lines. A
|
|
178
|
+
// rounds file the archive moved is carried as well (`observation-ledger-archive.ts`).
|
|
177
179
|
async function carry(root: string): Promise<number> {
|
|
178
180
|
const issues = await closed_issues()
|
|
179
|
-
const
|
|
181
|
+
const archived = observation_ledger_archive.archived_rounds(root)
|
|
182
|
+
const pending = issues.filter(
|
|
183
|
+
(issue) => !archived.has(issue) && !existsSync(carried_path(issue, root)),
|
|
184
|
+
)
|
|
180
185
|
const counts = await Promise.all(pending.map(async (issue) => await carry_issue(issue, root)))
|
|
181
186
|
|
|
182
187
|
return counts.reduce((total, count) => total + count, 0)
|
|
@@ -2,6 +2,7 @@ import { readFileSync, statSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { time_josh_names } from '#scripts/time-runtime/time-josh-names'
|
|
4
4
|
import { shell_segments } from './shell-segments'
|
|
5
|
+
import { shell_tokens } from './shell-tokens'
|
|
5
6
|
|
|
6
7
|
// Which shell commands are broad investigation (joshuafolkken/kit#5351): a search over a tree, a
|
|
7
8
|
// read past the line cap, an aggregation script. A narrow check — a bounded range of one file, a
|
|
@@ -19,7 +20,6 @@ const LINE_COUNT_PREFIXES = ['--lines=', '-n', '-']
|
|
|
19
20
|
const DIGITS = /^\d+$/u
|
|
20
21
|
const FROM_LINE = /^\+\d+$/u
|
|
21
22
|
const QUOTES = /^['"]|['"]$/gu
|
|
22
|
-
const WHITESPACE = /\s+/u
|
|
23
23
|
const ASSIGNMENT = /^\w+=/u
|
|
24
24
|
const ALWAYS_BROAD: ReadonlySet<string> = new Set(['find', 'for', 'node', 'python', 'python3'])
|
|
25
25
|
const ANALYSIS_PREFIX = 'josh cost:'
|
|
@@ -139,7 +139,7 @@ const COMMAND_TESTS: ReadonlyMap<string, CommandTest> = new Map([
|
|
|
139
139
|
])
|
|
140
140
|
|
|
141
141
|
function words_of(segment: string): Array<string> {
|
|
142
|
-
const words =
|
|
142
|
+
const words = shell_tokens.words_of(segment).map((word) => word.text.replaceAll(QUOTES, ''))
|
|
143
143
|
const start = words.findIndex((word) => !ASSIGNMENT.test(word))
|
|
144
144
|
|
|
145
145
|
return start === -1 ? [] : words.slice(start)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
// Native desktop rollouts mark each content item's provenance. A user role alone also
|
|
5
|
+
// carries AGENTS/environment context, so only user-authored items become prompts (#7399).
|
|
6
|
+
const content_schema = z.array(
|
|
7
|
+
z.object({
|
|
8
|
+
type: z.string(),
|
|
9
|
+
text: z.string().optional(),
|
|
10
|
+
}),
|
|
11
|
+
)
|
|
12
|
+
const provenance_schema = z.object({ provenance: z.object({ type: z.string() }) })
|
|
13
|
+
const metadata_schema = z.object({ content_item_metadata: z.array(provenance_schema) })
|
|
14
|
+
const payload_schema = z.object({
|
|
15
|
+
type: z.literal('message'),
|
|
16
|
+
role: z.enum(['user', 'assistant']),
|
|
17
|
+
content: content_schema,
|
|
18
|
+
internal_chat_message_metadata_passthrough: metadata_schema.optional(),
|
|
19
|
+
})
|
|
20
|
+
const record_schema = z.object({
|
|
21
|
+
type: z.literal('response_item'),
|
|
22
|
+
timestamp: z.string(),
|
|
23
|
+
payload: payload_schema,
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
function content_text(block: z.infer<typeof content_schema>[number]): string {
|
|
27
|
+
if (block.type !== 'input_text' && block.type !== 'output_text') return ''
|
|
28
|
+
|
|
29
|
+
return block.text ?? ''
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function person_content(payload: z.infer<typeof record_schema>['payload']): string | undefined {
|
|
33
|
+
const metadata = payload.internal_chat_message_metadata_passthrough?.content_item_metadata
|
|
34
|
+
if (metadata?.length !== payload.content.length) return undefined
|
|
35
|
+
|
|
36
|
+
const authored = payload.content
|
|
37
|
+
.filter((_block, index) => metadata[index]?.provenance.type === 'user')
|
|
38
|
+
.map((block) => content_text(block))
|
|
39
|
+
|
|
40
|
+
return authored.length === 0 ? undefined : authored.join('\n')
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Preserve user turn boundaries while marking unproven content as harness-authored.
|
|
44
|
+
function normalize(line: string): string {
|
|
45
|
+
const record = json_value.parse_with(line, record_schema)
|
|
46
|
+
if (record === undefined) return line
|
|
47
|
+
const { payload, timestamp } = record
|
|
48
|
+
const content =
|
|
49
|
+
payload.role === 'user'
|
|
50
|
+
? person_content(payload)
|
|
51
|
+
: payload.content.map((block) => content_text(block)).join('\n')
|
|
52
|
+
|
|
53
|
+
return JSON.stringify({
|
|
54
|
+
type: payload.role,
|
|
55
|
+
timestamp,
|
|
56
|
+
...(content === undefined && { origin: { kind: 'harness' } }),
|
|
57
|
+
message: { content: content ?? '' },
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const codex_prompt = { normalize }
|
|
62
|
+
|
|
63
|
+
export { codex_prompt }
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
1
2
|
import type { RepoIdentity } from '#scripts/discovery/repo-origin'
|
|
2
3
|
import { repo_party } from '#scripts/discovery/repo-party'
|
|
3
4
|
import type { HookContext } from '#scripts/hooks/hook-context'
|
|
5
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
4
6
|
import { bash_triggers } from './bash-triggers'
|
|
5
7
|
import { direct_pr_create } from './direct-pr-create'
|
|
6
8
|
import { gh_api } from './gh-api'
|
|
7
9
|
import { git_argv } from './git-argv'
|
|
8
10
|
import { shell_segments } from './shell-segments'
|
|
11
|
+
import { standalone_gh_call, type StandaloneCall } from './standalone-gh-call'
|
|
9
12
|
|
|
10
13
|
// The `direct-issue-comment` row of `delivered-rules.ts`. A run's own comment has to carry
|
|
11
14
|
// `RUN_MARKER`, or `issue-watch-diff.ts` reads it as a person's update: the run's review then reads as
|
|
@@ -125,6 +128,55 @@ const DIRECT_ISSUE_COMMENT_REASON =
|
|
|
125
128
|
'`pnpm josh issue:comment <N> --body-file <path>` instead (`shell-body.md`). ' +
|
|
126
129
|
'**This rule fires on every occurrence, not once per run.**'
|
|
127
130
|
|
|
131
|
+
// **A standalone `gh issue comment <N> --body-file <path>` is rewritten rather than refused**
|
|
132
|
+
// (joshuafolkken/kit#7330): `issue:comment` reads the file as it is, so the posted text is the same and
|
|
133
|
+
// gains the run marker. The path is resolved against the call's cwd, since `pnpm josh` runs from the
|
|
134
|
+
// package root. An inline `--body` keeps the refusal: `issue:comment` trims it and expands `\n`, so the
|
|
135
|
+
// posted text could differ. So do stdin (`-`), a pipe, a chain, a quote and any other flag.
|
|
136
|
+
const COMMENT_WORDS = ['gh', ISSUE_GROUP, COMMENT_ACTION]
|
|
137
|
+
const BODY_FILE_SPELLING = /^(?:(?:-F|--body-file) |--body-file=)(?<file>[\w./-]+)$/u
|
|
138
|
+
const STDIN_PATH = '-'
|
|
139
|
+
const ISSUE_COMMENT_COMMAND = 'pnpm josh issue:comment'
|
|
140
|
+
const BODY_FILE_FLAG = '--body-file'
|
|
141
|
+
|
|
142
|
+
// The one body file the flags name, resolved against `cwd`, or `undefined` for any other spelling.
|
|
143
|
+
function body_file_of(flags: string, cwd: string): string | undefined {
|
|
144
|
+
const file = BODY_FILE_SPELLING.exec(flags)?.groups?.['file']
|
|
145
|
+
|
|
146
|
+
return file === undefined || file === STDIN_PATH ? undefined : path.resolve(cwd, file)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function issue_comment_of(comment: StandaloneCall, cwd: string): string | undefined {
|
|
150
|
+
const resolved = body_file_of(comment.flags, cwd)
|
|
151
|
+
|
|
152
|
+
return resolved !== undefined && standalone_gh_call.is_plain_word(resolved)
|
|
153
|
+
? standalone_gh_call.line_of([ISSUE_COMMENT_COMMAND, comment.issue, BODY_FILE_FLAG, resolved])
|
|
154
|
+
: undefined
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// `pnpm josh issue:comment` for a refused post that is a standalone `gh issue comment`, else
|
|
158
|
+
// `undefined`. The word split runs first: it is cheap, and every Bash call passes through here.
|
|
159
|
+
function issue_comment_command(command: string, context: HookContext): string | undefined {
|
|
160
|
+
const comment = standalone_gh_call.call_of(command, COMMENT_WORDS)
|
|
161
|
+
const post = comment === undefined ? undefined : issue_comment_of(comment, context.cwd)
|
|
162
|
+
|
|
163
|
+
return post !== undefined && is_direct_issue_comment_in(command.trim(), context)
|
|
164
|
+
? post
|
|
165
|
+
: undefined
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function issue_comment_input(
|
|
169
|
+
call: GuardedCall,
|
|
170
|
+
_tail: () => string,
|
|
171
|
+
context: HookContext,
|
|
172
|
+
): Record<string, unknown> | undefined {
|
|
173
|
+
return standalone_gh_call.input_of(call, (command) => issue_comment_command(command, context))
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const ISSUE_COMMENT_NOTE =
|
|
177
|
+
'↻ direct issue comment: this `gh issue comment <N> --body-file <path>` ran as ' +
|
|
178
|
+
'`pnpm josh issue:comment <N> --body-file <path>`, which posts the run marker (`shell-body.md`).'
|
|
179
|
+
|
|
128
180
|
const ROW = {
|
|
129
181
|
id: 'direct-issue-comment',
|
|
130
182
|
is_trigger: bash_triggers.on_bash_command(is_direct_issue_comment_in),
|
|
@@ -132,16 +184,24 @@ const ROW = {
|
|
|
132
184
|
decide: (): boolean => true,
|
|
133
185
|
keeps: bash_triggers.on_bash_command(is_josh_comment),
|
|
134
186
|
reaches: bash_triggers.on_bash_command(is_any_comment),
|
|
187
|
+
rewrite: issue_comment_input,
|
|
188
|
+
rewrite_note: ISSUE_COMMENT_NOTE,
|
|
135
189
|
about: {
|
|
136
190
|
title: 'Direct issue comment',
|
|
137
191
|
topic: '`shell-body.md`',
|
|
138
192
|
fires:
|
|
139
|
-
"a comment to the checkout's own repository outside `josh issue:comment` (`gh issue comment` with no `--repo`, or a `gh api` write to `repos/<owner>/<r>/issues/<N>/comments` whose owner is the `{owner}` placeholder or the checkout's own `owner/repo` spelled out); it points at `pnpm josh issue:comment`.
|
|
193
|
+
"a comment to the checkout's own repository outside `josh issue:comment` (`gh issue comment` with no `--repo`, or a `gh api` write to `repos/<owner>/<r>/issues/<N>/comments` whose owner is the `{owner}` placeholder or the checkout's own `owner/repo` spelled out); it points at `pnpm josh issue:comment`. A line that is only `gh issue comment <N>` with one `--body-file` / `-F <path>` is rewritten to `pnpm josh issue:comment <N> --body-file <path>`; every other form is refused, every occurrence",
|
|
140
194
|
quiet:
|
|
141
195
|
'`pnpm josh issue:comment`, or reading the comments — the path that writes the run marker',
|
|
142
196
|
},
|
|
143
197
|
}
|
|
144
198
|
|
|
145
|
-
const direct_issue_comment = {
|
|
199
|
+
const direct_issue_comment = {
|
|
200
|
+
DIRECT_ISSUE_COMMENT_REASON,
|
|
201
|
+
ISSUE_COMMENT_NOTE,
|
|
202
|
+
ROW,
|
|
203
|
+
is_direct_issue_comment,
|
|
204
|
+
issue_comment_command,
|
|
205
|
+
}
|
|
146
206
|
|
|
147
207
|
export { direct_issue_comment }
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
2
3
|
import { bash_triggers } from './bash-triggers'
|
|
3
4
|
import { direct_pr_create } from './direct-pr-create'
|
|
4
5
|
import { gh_api } from './gh-api'
|
|
5
6
|
import { git_argv } from './git-argv'
|
|
6
7
|
import { issue_comments } from './issue-comments'
|
|
7
8
|
import { shell_segments } from './shell-segments'
|
|
9
|
+
import { standalone_gh_call, type StandaloneCall } from './standalone-gh-call'
|
|
8
10
|
|
|
9
11
|
// The `direct-issue-read` row of `delivered-rules.ts` (joshuafolkken/kit#4663). `pnpm josh issue:read`
|
|
10
12
|
// is the one read that withholds a comment from an author without write access and marks an untrusted
|
|
@@ -25,6 +27,11 @@ import { shell_segments } from './shell-segments'
|
|
|
25
27
|
//
|
|
26
28
|
// **It fires on every occurrence**, and before `issue-comments`, whose rewrite would otherwise add the
|
|
27
29
|
// unfiltered comments to the same call.
|
|
30
|
+
//
|
|
31
|
+
// **A standalone `gh issue view <N>` is rewritten rather than refused** (joshuafolkken/kit#7330): the
|
|
32
|
+
// line is that one call with no flag but `-R` / `--repo <owner>/<repo>`, so `issue:read` takes every
|
|
33
|
+
// argument it carries. The rewrite is `issue:read` itself, so an untrusted comment is still withheld.
|
|
34
|
+
// A pipe, a chain, a redirect, a quote, a URL or any other flag keeps the refusal.
|
|
28
35
|
|
|
29
36
|
const API_SUBCOMMAND = 'api'
|
|
30
37
|
const ISSUE_GROUP = 'issue'
|
|
@@ -161,6 +168,44 @@ function is_any_read(command: string): boolean {
|
|
|
161
168
|
return is_direct_issue_read(command) || is_josh_read(command)
|
|
162
169
|
}
|
|
163
170
|
|
|
171
|
+
const VIEW_WORDS = ['gh', ISSUE_GROUP, VIEW_ACTION]
|
|
172
|
+
const REPO_SPELLING = /^(?:(?:-R|--repo) |--repo=)(?<repo>[\w.-]+\/[\w.-]+)$/u
|
|
173
|
+
const ISSUE_READ_COMMAND = 'pnpm josh issue:read'
|
|
174
|
+
const REPO_FLAG = '--repo'
|
|
175
|
+
|
|
176
|
+
// The `--repo` pair `issue:read` takes for the view's flags: none, or one `<owner>/<repo>`.
|
|
177
|
+
function carried_repo(flags: string): ReadonlyArray<string> | undefined {
|
|
178
|
+
if (flags === '') return []
|
|
179
|
+
const repo = REPO_SPELLING.exec(flags)?.groups?.['repo']
|
|
180
|
+
|
|
181
|
+
return repo === undefined ? undefined : [REPO_FLAG, repo]
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function issue_read_of(view: StandaloneCall): string | undefined {
|
|
185
|
+
const repo = carried_repo(view.flags)
|
|
186
|
+
|
|
187
|
+
return repo === undefined
|
|
188
|
+
? undefined
|
|
189
|
+
: standalone_gh_call.line_of([ISSUE_READ_COMMAND, view.issue, ...repo])
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// `pnpm josh issue:read` for a refused read that is a standalone `gh issue view`, else `undefined`.
|
|
193
|
+
// The word split runs first: it is cheap, and every Bash call passes through here.
|
|
194
|
+
function issue_read_command(command: string): string | undefined {
|
|
195
|
+
const view = standalone_gh_call.call_of(command, VIEW_WORDS)
|
|
196
|
+
const read = view === undefined ? undefined : issue_read_of(view)
|
|
197
|
+
|
|
198
|
+
return read !== undefined && is_direct_issue_read(command.trim()) ? read : undefined
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function issue_read_input(call: GuardedCall): Record<string, unknown> | undefined {
|
|
202
|
+
return standalone_gh_call.input_of(call, issue_read_command)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const ISSUE_READ_NOTE =
|
|
206
|
+
'↻ direct issue read: this `gh issue view <N>` ran as `pnpm josh issue:read <N>`, which withholds ' +
|
|
207
|
+
'a comment from an author without write access (`issue-comments.md`).'
|
|
208
|
+
|
|
164
209
|
const DIRECT_ISSUE_READ_REASON =
|
|
165
210
|
'⛔ direct issue read: pnpm josh issue:read <N>\n' +
|
|
166
211
|
'Run that in place of this read of `…/issues/<N>`, its comments or its timeline (`gh api` or ' +
|
|
@@ -176,16 +221,24 @@ const ROW = {
|
|
|
176
221
|
decide: (): boolean => true,
|
|
177
222
|
keeps: bash_triggers.on_bash_command(is_josh_read),
|
|
178
223
|
reaches: bash_triggers.on_bash_command(is_any_read),
|
|
224
|
+
rewrite: issue_read_input,
|
|
225
|
+
rewrite_note: ISSUE_READ_NOTE,
|
|
179
226
|
about: {
|
|
180
227
|
title: 'Direct issue read',
|
|
181
228
|
topic: '`issue-comments.md`',
|
|
182
229
|
fires:
|
|
183
|
-
"a `gh api` GET of the checkout's own `repos/<o>/<r>/issues/<N>`, `…/comments` or `…/timeline` (the `{owner}` placeholder or the origin spelled out), or a `gh issue view <N>` of it, with no projection or one naming the body (or, for the view, the comments); it points at `pnpm josh issue:read`.
|
|
230
|
+
"a `gh api` GET of the checkout's own `repos/<o>/<r>/issues/<N>`, `…/comments` or `…/timeline` (the `{owner}` placeholder or the origin spelled out), or a `gh issue view <N>` of it, with no projection or one naming the body (or, for the view, the comments); it points at `pnpm josh issue:read`. A line that is only `gh issue view <N>`, with at most `-R` / `--repo <owner>/<repo>`, is rewritten to `pnpm josh issue:read <N>`; every other form is refused, every occurrence",
|
|
184
231
|
quiet:
|
|
185
232
|
'`pnpm josh issue:read` / `run:prep` / `run:entry`, a `--jq` / `--json` projection without the body or the comments, `gh issue view --web`, or another repository named outright',
|
|
186
233
|
},
|
|
187
234
|
}
|
|
188
235
|
|
|
189
|
-
const direct_issue_read = {
|
|
236
|
+
const direct_issue_read = {
|
|
237
|
+
DIRECT_ISSUE_READ_REASON,
|
|
238
|
+
ISSUE_READ_NOTE,
|
|
239
|
+
ROW,
|
|
240
|
+
is_direct_issue_read,
|
|
241
|
+
issue_read_command,
|
|
242
|
+
}
|
|
190
243
|
|
|
191
244
|
export { direct_issue_read }
|
|
@@ -31,6 +31,7 @@ const HOLD_RELEASE = 'the hook releases the hold itself; it blocks only when tha
|
|
|
31
31
|
const FILING_OFFER = 'the filing needs a title and a body only the model can write'
|
|
32
32
|
const CONCISE_REPLY = 'the shorter reply is prose only the model can write'
|
|
33
33
|
const NARROW_ENOUGH = 'which reading is narrow enough to keep is the author’s call'
|
|
34
|
+
const BODY_TO_FILE = 'the body moves to a file the call does not name'
|
|
34
35
|
|
|
35
36
|
function rewrite(): GuardRemedy {
|
|
36
37
|
return { remedy: 'rewrite', why: REWRITTEN }
|
|
@@ -52,16 +53,21 @@ const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
|
|
|
52
53
|
'shell-body': judgment(
|
|
53
54
|
"which part of the body the shell was meant to expand is the author's, not the hook's",
|
|
54
55
|
),
|
|
55
|
-
'raw-field-body': judgment(
|
|
56
|
+
'raw-field-body': judgment(BODY_TO_FILE),
|
|
56
57
|
'credential-body': judgment(
|
|
57
58
|
'which text is the credential, and what replaces it, is the author’s',
|
|
58
59
|
),
|
|
59
60
|
'rule-body': judgment('a trigger-plus-pointer line is written, not derived'),
|
|
60
61
|
'direct-filing': judgment(ANOTHER_COMMAND),
|
|
61
62
|
'unasked-filing': judgment(NO_RUN),
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
'direct-
|
|
63
|
+
// A standalone `gh issue comment <N> --body-file <path>` run as `pnpm josh issue:comment`; an inline
|
|
64
|
+
// `--body` is refused, since `issue:comment` trims it and expands `\n` (joshuafolkken/kit#7330).
|
|
65
|
+
'direct-issue-comment': rewrite(),
|
|
66
|
+
'direct-issue-read': rewrite(), // a standalone `gh issue view <N>` run as `pnpm josh issue:read <N>`
|
|
67
|
+
'direct-git-status': judgment(
|
|
68
|
+
'the refusal is spent once per run and its reissue passes, so a rewrite saves at most one ' +
|
|
69
|
+
'round trip while trading the long-format listing the call asked for for porcelain',
|
|
70
|
+
),
|
|
65
71
|
'direct-vitest-run': judgment(ANOTHER_COMMAND),
|
|
66
72
|
'direct-pr-create': judgment(ANOTHER_COMMAND),
|
|
67
73
|
'pr-merge': judgment(ANOTHER_COMMAND),
|
|
@@ -152,16 +152,27 @@ function collect_line_references(line: string, found: Array<string>): void {
|
|
|
152
152
|
for (const reference of line_references(line)) found.push(`${reference.prefix}${reference.text}`)
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
function closes_fence(line: string, marker: string, fence: string): boolean {
|
|
156
|
+
return marker.startsWith(fence) && line.trim() === marker
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function fence_after(line: string, fence: string): string {
|
|
160
|
+
const match = FENCE_MARKER.exec(line)
|
|
161
|
+
if (match === null) return fence
|
|
162
|
+
const marker = match[0].trimStart()
|
|
163
|
+
if (fence === '') return marker
|
|
164
|
+
|
|
165
|
+
return closes_fence(line, marker, fence) ? '' : fence
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Skip through a matching closing fence, including unlike or shorter delimiters inside it.
|
|
158
169
|
function lines_outside_fences(message: string): ReadonlyArray<string> {
|
|
159
170
|
const lines: Array<string> = []
|
|
160
|
-
let
|
|
171
|
+
let fence = ''
|
|
161
172
|
|
|
162
173
|
for (const line of message.split('\n')) {
|
|
163
|
-
|
|
164
|
-
|
|
174
|
+
fence = fence_after(line, fence)
|
|
175
|
+
if (fence === '' && !FENCE_MARKER.test(line)) lines.push(line)
|
|
165
176
|
}
|
|
166
177
|
|
|
167
178
|
return lines
|
|
@@ -231,11 +242,11 @@ function rewrite_line(line: string, slug: string, is_in_fence: boolean): string
|
|
|
231
242
|
// fed the duplicate reply. Fence state is carried across lines, since a fenced block spans them.
|
|
232
243
|
function linkify(message: string, slug: string): string {
|
|
233
244
|
const out: Array<string> = []
|
|
234
|
-
let
|
|
245
|
+
let fence = ''
|
|
235
246
|
|
|
236
247
|
for (const line of message.split('\n')) {
|
|
237
|
-
|
|
238
|
-
out.push(rewrite_line(line, slug,
|
|
248
|
+
fence = fence_after(line, fence)
|
|
249
|
+
out.push(rewrite_line(line, slug, fence !== ''))
|
|
239
250
|
}
|
|
240
251
|
|
|
241
252
|
return out.join('\n')
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { json_value } from '#scripts/lib/json-value'
|
|
2
2
|
import { time_reported_failure } from '#scripts/time-runtime/time-reported-failure'
|
|
3
3
|
import { z } from 'zod'
|
|
4
|
+
import { codex_prompt } from './codex-prompt'
|
|
4
5
|
import { turn_filings } from './turn-filings'
|
|
5
6
|
|
|
6
7
|
// The person's prompts on a transcript tail — what the stop guard reads to tell a question it answers
|
|
@@ -34,7 +35,9 @@ function is_person(line: PromptLine): boolean {
|
|
|
34
35
|
// The prompt line as the person wrote it, or `undefined` when the harness wrote it or it does not
|
|
35
36
|
// read as one.
|
|
36
37
|
function person_line(line: string): PromptLine | undefined {
|
|
37
|
-
const
|
|
38
|
+
const normalized = codex_prompt.normalize(line)
|
|
39
|
+
if (!turn_filings.is_prompt_line(normalized)) return undefined
|
|
40
|
+
const parsed = PROMPT_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(normalized))
|
|
38
41
|
|
|
39
42
|
return parsed.success && is_person(parsed.data) ? parsed.data : undefined
|
|
40
43
|
}
|
|
@@ -51,7 +54,10 @@ function person_text(line: string): string | undefined {
|
|
|
51
54
|
// notification, a subagent's hand-back), so a question asked turns ago does not answer for a stop the
|
|
52
55
|
// run reached on its own since (`stop-decision.ts` → `is_question`).
|
|
53
56
|
function turn_prompt(tail: string): string {
|
|
54
|
-
const opener = tail
|
|
57
|
+
const opener = tail
|
|
58
|
+
.split('\n')
|
|
59
|
+
.map((line) => codex_prompt.normalize(line))
|
|
60
|
+
.findLast((line) => turn_filings.is_prompt_line(line))
|
|
55
61
|
if (opener === undefined) return NO_PROMPT
|
|
56
62
|
|
|
57
63
|
return person_text(opener) ?? NO_PROMPT
|
|
@@ -63,7 +69,6 @@ function turn_prompt(tail: string): string {
|
|
|
63
69
|
function person_prompt(tail: string): string | undefined {
|
|
64
70
|
return tail
|
|
65
71
|
.split('\n')
|
|
66
|
-
.filter((line) => turn_filings.is_prompt_line(line))
|
|
67
72
|
.map((line) => person_text(line))
|
|
68
73
|
.findLast((text) => text !== undefined)
|
|
69
74
|
}
|
|
@@ -72,7 +77,6 @@ function person_prompt(tail: string): string | undefined {
|
|
|
72
77
|
function prompt_time(tail: string): string | undefined {
|
|
73
78
|
return tail
|
|
74
79
|
.split('\n')
|
|
75
|
-
.filter((line) => turn_filings.is_prompt_line(line))
|
|
76
80
|
.map((line) => person_line(line)?.timestamp ?? undefined)
|
|
77
81
|
.findLast((time) => time !== undefined)
|
|
78
82
|
}
|