@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
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { cost_transcript, type SessionFile } from '#scripts/cost-runtime/cost-transcript'
|
|
4
|
+
import { hook_ledger_read } from '#scripts/hooks/hook-ledger-read'
|
|
5
|
+
import { lane_stats_request } from '#scripts/lane/lane-stats-request'
|
|
4
6
|
import { stamped_memo } from '#scripts/lib/stamped-memo'
|
|
5
7
|
import { delivered_rules } from './delivered-rules'
|
|
6
8
|
import { piped_verification_shapes } from './piped-verification-shapes'
|
|
@@ -10,6 +12,7 @@ import { rule_value_cache, type FreshReading } from './rule-value-cache'
|
|
|
10
12
|
import { rule_value_candidates } from './rule-value-candidates'
|
|
11
13
|
import { rule_value_prose } from './rule-value-prose'
|
|
12
14
|
import { rule_value_runs, type RunSummary } from './rule-value-runs'
|
|
15
|
+
import { rule_value_trend } from './rule-value-trend'
|
|
13
16
|
|
|
14
17
|
// `josh rule:value` — what each delivered rule earns on the channel that carries it, one row per rule.
|
|
15
18
|
// `rule_value.measure` was public but had no caller outside its own test, so
|
|
@@ -25,6 +28,8 @@ const ARGV_OFFSET = 2
|
|
|
25
28
|
const REFRESH_FLAG = '--refresh'
|
|
26
29
|
const FRESH_FLAG = '--fresh'
|
|
27
30
|
const PROSE_FLAG = '--prose'
|
|
31
|
+
const PERIOD_FLAG = '--period'
|
|
32
|
+
const PERIOD_USAGE = 'usage: josh rule:value --period <days> — a positive number of days'
|
|
28
33
|
const CACHED_NOTE = 'cached reading taken at'
|
|
29
34
|
const PERCENT_SIGN = '%'
|
|
30
35
|
const COLUMN_GAP = ' '
|
|
@@ -67,6 +72,19 @@ function gather_summaries(cwd: string): Array<RunSummary> {
|
|
|
67
72
|
return summaries
|
|
68
73
|
}
|
|
69
74
|
|
|
75
|
+
// The runs of the transcripts last written at or after `since_ms`.
|
|
76
|
+
function window_runs(cwd: string, since_ms: number): Map<string, Array<SessionFile>> {
|
|
77
|
+
const files = cost_transcript.list_sessions_across(cost_transcript.transcript_directories(cwd))
|
|
78
|
+
|
|
79
|
+
return group_by_run(files.filter((file) => file.modified_ms >= since_ms))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// `--period`: the window's runs read into a memo of its own — the stored per-run counts hold whole
|
|
83
|
+
// runs, so a window must neither read nor evict them.
|
|
84
|
+
function gather_window(cwd: string, since_ms: number): Array<RunSummary> {
|
|
85
|
+
return rule_value_runs.summaries_of(window_runs(cwd, since_ms), stamped_memo.create())
|
|
86
|
+
}
|
|
87
|
+
|
|
70
88
|
function* summarized(runs: Iterable<ReadonlyArray<string>>): Generator<RunSummary> {
|
|
71
89
|
for (const texts of runs) yield rule_value_runs.summarize(texts)
|
|
72
90
|
}
|
|
@@ -148,12 +166,64 @@ function cached_text(fresh: FreshReading): string {
|
|
|
148
166
|
return `${fresh.text.trimEnd()}\n\n${CACHED_NOTE} ${taken_at} — ${FRESH_FLAG} to measure now, with candidates`
|
|
149
167
|
}
|
|
150
168
|
|
|
151
|
-
function
|
|
152
|
-
const { table, candidates } = render_summaries(
|
|
169
|
+
function print_summaries(summaries: Iterable<RunSummary>): void {
|
|
170
|
+
const { table, candidates } = render_summaries(summaries)
|
|
153
171
|
|
|
154
172
|
process.stdout.write(`${[table, candidates].filter(Boolean).join('\n\n')}\n`)
|
|
155
173
|
}
|
|
156
174
|
|
|
175
|
+
function print_measured(cwd: string): void {
|
|
176
|
+
print_summaries(gather_summaries(cwd))
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// The start of the `--period` window, or `undefined` when its value is not a positive number of days.
|
|
180
|
+
function period_since(argv: ReadonlyArray<string>): number | undefined {
|
|
181
|
+
const period_days = lane_stats_request.positive(argv[argv.indexOf(PERIOD_FLAG) + 1])
|
|
182
|
+
|
|
183
|
+
return period_days === undefined
|
|
184
|
+
? undefined
|
|
185
|
+
: hook_ledger_read.period_start(period_days, new Date())
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function refuse(usage: string): number {
|
|
189
|
+
process.stderr.write(`${usage}\n`)
|
|
190
|
+
|
|
191
|
+
return 1
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// The cache holds the all-time reading, so a period always measures and never stores.
|
|
195
|
+
function print_period(argv: ReadonlyArray<string>, cwd: string): number {
|
|
196
|
+
const since_ms = period_since(argv)
|
|
197
|
+
|
|
198
|
+
if (since_ms === undefined) return refuse(PERIOD_USAGE)
|
|
199
|
+
|
|
200
|
+
print_summaries(gather_window(cwd, since_ms))
|
|
201
|
+
|
|
202
|
+
return 0
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// `--weekly` reads every transcript unless `--period` narrows it.
|
|
206
|
+
function weekly_since(argv: ReadonlyArray<string>): number | undefined {
|
|
207
|
+
return argv.includes(PERIOD_FLAG) ? period_since(argv) : 0
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Like `--period`, the trend always measures and never touches the cache (`rule-value-trend.ts`).
|
|
211
|
+
function print_weekly(argv: ReadonlyArray<string>, cwd: string): number {
|
|
212
|
+
const ids = rule_value_trend.requested_ids(argv)
|
|
213
|
+
|
|
214
|
+
if (ids === undefined) return refuse(rule_value_trend.WEEKLY_USAGE)
|
|
215
|
+
|
|
216
|
+
const since_ms = weekly_since(argv)
|
|
217
|
+
|
|
218
|
+
if (since_ms === undefined) return refuse(PERIOD_USAGE)
|
|
219
|
+
|
|
220
|
+
const weeks = rule_value_trend.tallies(window_runs(cwd, since_ms))
|
|
221
|
+
|
|
222
|
+
process.stdout.write(`${rule_value_trend.render(weeks, ids) ?? NO_TARGETS}\n`)
|
|
223
|
+
|
|
224
|
+
return 0
|
|
225
|
+
}
|
|
226
|
+
|
|
157
227
|
function print_reading(argv: ReadonlyArray<string>, cwd: string): void {
|
|
158
228
|
const fresh = argv.includes(FRESH_FLAG) ? undefined : rule_value_cache.read_fresh(cwd)
|
|
159
229
|
|
|
@@ -173,15 +243,25 @@ function print_transcripts(argv: ReadonlyArray<string>, cwd: string): void {
|
|
|
173
243
|
} else print_reading(argv, cwd)
|
|
174
244
|
}
|
|
175
245
|
|
|
246
|
+
function print_windowed(argv: ReadonlyArray<string>, cwd: string): number {
|
|
247
|
+
if (argv.includes(rule_value_trend.WEEKLY_FLAG)) return print_weekly(argv, cwd)
|
|
248
|
+
if (argv.includes(PERIOD_FLAG)) return print_period(argv, cwd)
|
|
249
|
+
|
|
250
|
+
print_transcripts(argv, cwd)
|
|
251
|
+
|
|
252
|
+
return 0
|
|
253
|
+
}
|
|
254
|
+
|
|
176
255
|
// `--refresh` is the detached measurement the `backlogrun` loop head starts: the table goes to the
|
|
177
256
|
// cache `backlog:offer` prints from, never to stdout (`rule-value-cache.ts`). The candidates are read
|
|
178
257
|
// when a rule is retired, not at the loop head, so they print to stdout only and the cache keeps its
|
|
179
258
|
// shape. Bare, a reading cached inside the refresh interval is printed instead of measuring again —
|
|
180
259
|
// the measurement re-reads every transcript and takes minutes (joshuafolkken/kit#5186); `--fresh`
|
|
181
|
-
// measures regardless.
|
|
260
|
+
// measures regardless. `--period <days>` counts only the transcripts of that trailing window;
|
|
261
|
+
// `--weekly <rule-id>...` prints those rules week by week, inside that window when one is given.
|
|
182
262
|
function run_rule_value(argv: ReadonlyArray<string> = [], cwd: string = process.cwd()): number {
|
|
183
263
|
if (argv.includes(PROSE_FLAG)) print_prose(cwd)
|
|
184
|
-
else
|
|
264
|
+
else return print_windowed(argv, cwd)
|
|
185
265
|
|
|
186
266
|
return 0
|
|
187
267
|
}
|
|
@@ -199,6 +279,7 @@ const rule_value_cli = {
|
|
|
199
279
|
run_rule_value,
|
|
200
280
|
CACHED_NOTE,
|
|
201
281
|
NO_TARGETS,
|
|
282
|
+
PERIOD_USAGE,
|
|
202
283
|
UNMEASURED,
|
|
203
284
|
UNREACHED,
|
|
204
285
|
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { SessionFile } from '#scripts/cost-runtime/cost-transcript'
|
|
2
|
+
import { stamped_memo } from '#scripts/lib/stamped-memo'
|
|
3
|
+
import { delivered_rules } from './delivered-rules'
|
|
4
|
+
import { rule_rephrase } from './rule-rephrase'
|
|
5
|
+
import { rule_value_runs, type Tally } from './rule-value-runs'
|
|
6
|
+
|
|
7
|
+
// `josh rule:value --weekly <rule-id>...` — the named rules' reached / refused / rephrased, one line per
|
|
8
|
+
// week, so a rule's refusals read before and after the week it was changed (joshuafolkken/kit#7332).
|
|
9
|
+
//
|
|
10
|
+
// **A run is never split across weeks**: it counts in the week its newest file was last written, the
|
|
11
|
+
// same run unit the cumulative table reads. Weeks open on Monday 00:00 UTC.
|
|
12
|
+
|
|
13
|
+
const WEEKLY_FLAG = '--weekly'
|
|
14
|
+
const WEEKLY_USAGE =
|
|
15
|
+
'usage: josh rule:value --weekly <rule-id>... [--period <days>] — one or more measured rule ids'
|
|
16
|
+
const FLAG_PREFIX = '--'
|
|
17
|
+
const MS_PER_DAY = 86_400_000
|
|
18
|
+
const DAYS_PER_WEEK = 7
|
|
19
|
+
// The Unix epoch fell on a Thursday, three days after the Monday that opens its week.
|
|
20
|
+
const EPOCH_AFTER_MONDAY_DAYS = 3
|
|
21
|
+
const WEEK_MS = DAYS_PER_WEEK * MS_PER_DAY
|
|
22
|
+
const EPOCH_OFFSET_MS = EPOCH_AFTER_MONDAY_DAYS * MS_PER_DAY
|
|
23
|
+
const DATE_LENGTH = 'YYYY-MM-DD'.length
|
|
24
|
+
const INDENT = ' '
|
|
25
|
+
const COLUMN_GAP = ' '
|
|
26
|
+
|
|
27
|
+
type Runs = ReadonlyMap<string, ReadonlyArray<SessionFile>>
|
|
28
|
+
|
|
29
|
+
interface WeekTally {
|
|
30
|
+
label: string
|
|
31
|
+
tally: Tally
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function week_start(ms: number): number {
|
|
35
|
+
return ms - ((ms + EPOCH_OFFSET_MS) % WEEK_MS)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The ids following `--weekly` up to the next flag, or `undefined` when there are none or one is not
|
|
39
|
+
// a measured rule — a misspelt id would otherwise print a trend of zeros.
|
|
40
|
+
function requested_ids(argv: ReadonlyArray<string>): Array<string> | undefined {
|
|
41
|
+
const start = argv.indexOf(WEEKLY_FLAG) + 1
|
|
42
|
+
const end = argv.findIndex((value, index) => index >= start && value.startsWith(FLAG_PREFIX))
|
|
43
|
+
const ids = argv.slice(start, end === -1 ? undefined : end)
|
|
44
|
+
const known = new Set(delivered_rules.MEASURED_RULES.map((rule) => rule.id))
|
|
45
|
+
|
|
46
|
+
return ids.length > 0 && ids.every((id) => known.has(id)) ? ids : undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function run_week(files: ReadonlyArray<SessionFile>): number {
|
|
50
|
+
return week_start(Math.max(...files.map((file) => file.modified_ms)))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The runs grouped by week, oldest first.
|
|
54
|
+
function by_week(runs: Runs): Array<[number, Map<string, ReadonlyArray<SessionFile>>]> {
|
|
55
|
+
const weeks = new Map<number, Map<string, ReadonlyArray<SessionFile>>>()
|
|
56
|
+
|
|
57
|
+
for (const [owner, files] of runs) {
|
|
58
|
+
const week = run_week(files)
|
|
59
|
+
const owned = weeks.get(week) ?? new Map<string, ReadonlyArray<SessionFile>>()
|
|
60
|
+
|
|
61
|
+
owned.set(owner, files)
|
|
62
|
+
weeks.set(week, owned)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return [...weeks].toSorted(([left], [right]) => left - right)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Each week's tally, read into a memo of its own as `--period` is: the stored counts hold whole runs.
|
|
69
|
+
function tallies(runs: Runs): Array<WeekTally> {
|
|
70
|
+
return by_week(runs)
|
|
71
|
+
.map(([week, owned]) => ({
|
|
72
|
+
label: new Date(week).toISOString().slice(0, DATE_LENGTH),
|
|
73
|
+
tally: rule_value_runs.tally(rule_value_runs.summaries_of(owned, stamped_memo.create())),
|
|
74
|
+
}))
|
|
75
|
+
.filter((week) => week.tally.runs > 0)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function week_line(id: string, { label, tally }: WeekTally): string {
|
|
79
|
+
const reading = tally.readings.find((candidate) => candidate.id === id)
|
|
80
|
+
const counts: Array<[string, number]> = [
|
|
81
|
+
['reached', reading?.sessions ?? 0],
|
|
82
|
+
['refused', reading?.refusals ?? 0],
|
|
83
|
+
['rephrased', rule_rephrase.rephrased_of(id, tally.rephrased)],
|
|
84
|
+
]
|
|
85
|
+
const columns = counts.map(([name, count]) => `${name} ${String(count)}`)
|
|
86
|
+
|
|
87
|
+
return INDENT + [label, ...columns].join(COLUMN_GAP)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// One block per rule: its id, then a line per week. `undefined` when no week holds a read run.
|
|
91
|
+
function render(weeks: ReadonlyArray<WeekTally>, ids: ReadonlyArray<string>): string | undefined {
|
|
92
|
+
if (weeks.length === 0) return undefined
|
|
93
|
+
|
|
94
|
+
return ids.map((id) => [id, ...weeks.map((week) => week_line(id, week))].join('\n')).join('\n\n')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const rule_value_trend = {
|
|
98
|
+
by_week,
|
|
99
|
+
render,
|
|
100
|
+
requested_ids,
|
|
101
|
+
tallies,
|
|
102
|
+
week_start,
|
|
103
|
+
WEEKLY_FLAG,
|
|
104
|
+
WEEKLY_USAGE,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { rule_value_trend }
|
|
108
|
+
export type { WeekTally }
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
2
|
import { nested_commands } from './nested-commands'
|
|
3
|
+
import { shell_tokens, type ShellToken } from './shell-tokens'
|
|
3
4
|
|
|
4
5
|
// The files a shell segment's redirects name, used by `protected-files.ts` to detect secrets read or
|
|
5
6
|
// written.
|
|
6
7
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
8
|
+
// The segment's words are the shared tokenizer's (`shell_tokens.words_of`). Within each word, each `<`
|
|
9
|
+
// of a redirect operator is cut out as the read mark and each `>` (the clobber `>|` whole) as the
|
|
10
|
+
// write mark, so the piece after the last mark of `<`, `>`, `>>`, `2>` or `&>` is the file it
|
|
9
11
|
// reads or writes. A quoted `>` is text (`git commit -m "x >> .env"`), so the marks are read on the
|
|
10
12
|
// quote-blanked segment, whose offsets match the original; a shell's quoted script
|
|
11
13
|
// (`sh -c "echo x > .env"`) runs, so its marks are read as written, as is a heredoc line, which
|
|
@@ -16,7 +18,8 @@ const READ_MARK = '\u{1}read'
|
|
|
16
18
|
const WRITE_MARK = '\u{1}write'
|
|
17
19
|
const READ_OPERATOR = '<'
|
|
18
20
|
const REDIRECT = />\||[<>]/gu
|
|
19
|
-
|
|
21
|
+
// Cuts a word around its marks; like the marks, no command line carries it.
|
|
22
|
+
const PIECE_END = '\u{0}'
|
|
20
23
|
const NEXT = 1
|
|
21
24
|
const ANY_MARK: ReadonlySet<string> = new Set([READ_MARK, WRITE_MARK])
|
|
22
25
|
const { SHELLS } = nested_commands
|
|
@@ -31,13 +34,22 @@ function mark_of(operator: string): string {
|
|
|
31
34
|
return operator === READ_OPERATOR ? READ_MARK : WRITE_MARK
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
// One word's pieces: each operator the reading marks becomes a piece of its own, so `2>&1` is `2`, a
|
|
38
|
+
// write mark and `&1`, and `cat<in.txt` reads `in.txt`.
|
|
39
|
+
function marked_pieces(word: ShellToken, marks: string): Array<string> {
|
|
40
|
+
const pieced = word.text.replaceAll(REDIRECT, (operator, offset: number) =>
|
|
41
|
+
marks.startsWith(operator, word.begin + offset)
|
|
42
|
+
? `${PIECE_END}${mark_of(operator)}${PIECE_END}`
|
|
43
|
+
: operator,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
return pieced.split(PIECE_END).filter((piece) => piece !== '')
|
|
47
|
+
}
|
|
48
|
+
|
|
34
49
|
function marked_words(segment: string, program: string | undefined): Array<string> {
|
|
35
50
|
const marks = redirect_marks_of(segment, program)
|
|
36
|
-
const spaced = segment.replaceAll(REDIRECT, (operator, offset: number) =>
|
|
37
|
-
marks.startsWith(operator, offset) ? ` ${mark_of(operator)} ` : operator,
|
|
38
|
-
)
|
|
39
51
|
|
|
40
|
-
return
|
|
52
|
+
return shell_tokens.words_of(segment).flatMap((word) => marked_pieces(word, marks))
|
|
41
53
|
}
|
|
42
54
|
|
|
43
55
|
// Every file the segment's redirects read or write.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { time_josh_names } from '#scripts/time-runtime/time-josh-names'
|
|
2
2
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
3
|
+
import { shell_tokens, type ShellToken } from './shell-tokens'
|
|
3
4
|
|
|
4
5
|
// **A shell line carries several commands, and each has to be judged on its own.** Every trigger in
|
|
5
6
|
// this directory that reads a command string needs the same cut, so the cut lives here rather than
|
|
@@ -14,28 +15,153 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
|
14
15
|
// **`early-heartbeat.ts` keeps its own separator on purpose** and is not a caller here: it adds `&`,
|
|
15
16
|
// because `sleep 1200 &` is an armed timer sent to the background and has to be seen as one. That is
|
|
16
17
|
// a different question about a different character, not a second copy of this answer.
|
|
17
|
-
const
|
|
18
|
-
const SEGMENT_PARTS = new RegExp(`(${SEGMENT_SEPARATOR.source})`, 'u')
|
|
18
|
+
const SEGMENT_OPERATORS: ReadonlySet<string> = new Set(['&&', '||', ';', ';;', ';;&', ';&', '\n'])
|
|
19
19
|
|
|
20
20
|
// **The rows that read a segment as argv cut at the pipe and the background `&` as well.** Their
|
|
21
21
|
// question is which program a segment launches, and `true | git push -f` or `x & git push -f`
|
|
22
22
|
// launches git all the same; a `--jq` fragment cut off by a `|` begins with no program word, so it
|
|
23
|
-
// launches nothing they look for. A `&` that belongs to a redirection (`2>&1`, `&>file`, `<&3`)
|
|
24
|
-
// not
|
|
25
|
-
const
|
|
23
|
+
// launches nothing they look for. A `&` that belongs to a redirection (`2>&1`, `&>file`, `<&3`) is
|
|
24
|
+
// part of a word, not an operator, and so is the `|` of the clobber redirect `>|` (`shell-tokens.ts`).
|
|
25
|
+
const COMMAND_OPERATORS: ReadonlySet<string> = new Set([...SEGMENT_OPERATORS, '|', '|&', '&'])
|
|
26
|
+
|
|
27
|
+
// **A compound command's opening word is a cut too** (joshuafolkken/kit#7334): the command after it
|
|
28
|
+
// starts a segment of its own, so `f() { rm -rf x; }` yields `rm -rf x` for a rule anchored at `^rm`,
|
|
29
|
+
// and `case $x in a) rm -rf x;; esac` does the same past the arm's pattern. A `{` opens a group or a
|
|
30
|
+
// function body only at a command's start, after `name()` or after `function name`; a pattern closes
|
|
31
|
+
// with `)` right after `case … in` or after the previous arm's `;;`.
|
|
32
|
+
const CASE_ARM_ENDS: ReadonlySet<string> = new Set([';;', ';;&', ';&'])
|
|
33
|
+
const GROUP_OPENER = '{'
|
|
34
|
+
const FUNCTION_HEAD_END = '()'
|
|
35
|
+
const FUNCTION_KEYWORD = 'function'
|
|
36
|
+
const FUNCTION_NAME_OFFSET = 2
|
|
37
|
+
const PATTERN_END = ')'
|
|
38
|
+
const NEWLINE = '\n'
|
|
39
|
+
// joshuafolkken/kit#7340: the pattern's words and the `|` between its alternatives stand between the
|
|
40
|
+
// arm's start and its `)`, so `a|b)` and a `)` standing apart (`a )`) end the pattern too. Newlines
|
|
41
|
+
// stand only before the pattern, so `esac` and a newline do not start one.
|
|
42
|
+
const PATTERN_LINK = '|'
|
|
43
|
+
const ARM_START = 'in'
|
|
44
|
+
// The command may touch the `)` (`b)git push`), so the cut ends at the word's first `)` past its quoting:
|
|
45
|
+
// `'a)'` closes nothing.
|
|
46
|
+
const QUOTING = /['"]|\\[\s\S]?/gu
|
|
47
|
+
|
|
48
|
+
type Cut = Pick<ShellToken, 'begin' | 'end'>
|
|
49
|
+
|
|
50
|
+
function is_function_head(tokens: ReadonlyArray<ShellToken>, index: number): boolean {
|
|
51
|
+
const previous = tokens[index - 1]
|
|
52
|
+
|
|
53
|
+
if (previous?.text.endsWith(FUNCTION_HEAD_END) === true) return true
|
|
54
|
+
|
|
55
|
+
return tokens[index - FUNCTION_NAME_OFFSET]?.text === FUNCTION_KEYWORD
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function is_group_opener(tokens: ReadonlyArray<ShellToken>, index: number): boolean {
|
|
59
|
+
if (tokens[index]?.text !== GROUP_OPENER) return false
|
|
60
|
+
|
|
61
|
+
const previous = tokens[index - 1]
|
|
62
|
+
|
|
63
|
+
return previous?.kind !== 'word' || is_function_head(tokens, index)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function follows_case_head(tokens: ReadonlyArray<ShellToken>, index: number): boolean {
|
|
67
|
+
return tokens.slice(0, index).some((token) => token.text === 'case')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function quoting_end(text: string): number {
|
|
71
|
+
const quoting = [...text.matchAll(QUOTING)].at(-1)
|
|
72
|
+
|
|
73
|
+
return quoting === undefined ? 0 : quoting.index + quoting[0].length
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The offset just past the word's pattern-closing `)`, or -1 when it closes none.
|
|
77
|
+
function close_end(text: string): number {
|
|
78
|
+
const close = text.indexOf(PATTERN_END, quoting_end(text))
|
|
79
|
+
|
|
80
|
+
return close === -1 ? close : close + 1
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function is_pattern_part(token: ShellToken): boolean {
|
|
84
|
+
if (token.kind === 'operator') return token.text === PATTERN_LINK
|
|
85
|
+
|
|
86
|
+
return token.text !== ARM_START && close_end(token.text) < 0
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The token the arm's pattern follows, past the pattern's own words and the newlines before them.
|
|
90
|
+
function lead_index(tokens: ReadonlyArray<ShellToken>, index: number): number {
|
|
91
|
+
const start = tokens.slice(0, index).findLastIndex((token) => !is_pattern_part(token)) + 1
|
|
92
|
+
|
|
93
|
+
return tokens.slice(0, start).findLastIndex((token) => token.text !== NEWLINE)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function is_arm_lead(tokens: ReadonlyArray<ShellToken>, lead_at: number): boolean {
|
|
97
|
+
const lead = tokens[lead_at]
|
|
98
|
+
|
|
99
|
+
if (lead === undefined) return false
|
|
100
|
+
if (CASE_ARM_ENDS.has(lead.text)) return true
|
|
101
|
+
|
|
102
|
+
return lead.text === ARM_START && follows_case_head(tokens, lead_at)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function pattern_cut(
|
|
106
|
+
tokens: ReadonlyArray<ShellToken>,
|
|
107
|
+
index: number,
|
|
108
|
+
token: ShellToken,
|
|
109
|
+
): Cut | undefined {
|
|
110
|
+
const close = close_end(token.text)
|
|
111
|
+
|
|
112
|
+
if (close < 0 || !is_arm_lead(tokens, lead_index(tokens, index))) return undefined
|
|
113
|
+
|
|
114
|
+
return { begin: token.begin, end: token.begin + close }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function word_cut(
|
|
118
|
+
tokens: ReadonlyArray<ShellToken>,
|
|
119
|
+
index: number,
|
|
120
|
+
token: ShellToken,
|
|
121
|
+
): Cut | undefined {
|
|
122
|
+
return is_group_opener(tokens, index) ? token : pattern_cut(tokens, index, token)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function cut_of(
|
|
126
|
+
tokens: ReadonlyArray<ShellToken>,
|
|
127
|
+
index: number,
|
|
128
|
+
operators: ReadonlySet<string>,
|
|
129
|
+
): Cut | undefined {
|
|
130
|
+
const token = tokens[index]
|
|
131
|
+
|
|
132
|
+
if (token === undefined) return undefined
|
|
133
|
+
if (token.kind === 'word') return word_cut(tokens, index, token)
|
|
134
|
+
|
|
135
|
+
return operators.has(token.text) ? token : undefined
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function cuts_of(reading: string, operators: ReadonlySet<string>): Array<Cut> {
|
|
139
|
+
const tokens = shell_tokens.tokens_of(reading)
|
|
140
|
+
|
|
141
|
+
return tokens.flatMap((_token, index) => cut_of(tokens, index, operators) ?? [])
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// The typed line between the cuts, untrimmed; the cuts were found on a reading with the same offsets.
|
|
145
|
+
function pieces_of(command: string, cuts: ReadonlyArray<Cut>): Array<string> {
|
|
146
|
+
const starts = [0, ...cuts.map((cut) => cut.end)]
|
|
147
|
+
|
|
148
|
+
return starts.map((start, index) => command.slice(start, cuts[index]?.begin ?? command.length))
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function trimmed(pieces: ReadonlyArray<string>): Array<string> {
|
|
152
|
+
return pieces.map((piece) => piece.trim())
|
|
153
|
+
}
|
|
26
154
|
|
|
27
155
|
/** The line's commands, trimmed. Empty segments are kept: a caller anchoring at `^` rejects them. */
|
|
28
156
|
function segments_of(command: string): Array<string> {
|
|
29
|
-
return
|
|
157
|
+
return trimmed(pieces_of(command, cuts_of(command, SEGMENT_OPERATORS)))
|
|
30
158
|
}
|
|
31
159
|
|
|
32
160
|
/** The line's commands as separate programs: the `segments_of` cut plus a pipe and a background `&`. */
|
|
33
161
|
function commands_of(command: string): Array<string> {
|
|
34
|
-
return
|
|
162
|
+
return trimmed(pieces_of(command, cuts_of(command, COMMAND_OPERATORS)))
|
|
35
163
|
}
|
|
36
164
|
|
|
37
|
-
const COMMAND_SEPARATORS = new RegExp(COMMAND_SEPARATOR.source, 'gu')
|
|
38
|
-
|
|
39
165
|
/**
|
|
40
166
|
* The `commands_of` cut taken where the quote-blanked line puts each separator, so a `|` or `;`
|
|
41
167
|
* inside a quoted argument does not cut it; a heredoc line falls back to `commands_of`.
|
|
@@ -45,14 +171,7 @@ function quote_aware_commands_of(command: string): Array<string> {
|
|
|
45
171
|
|
|
46
172
|
if (plain === undefined) return commands_of(command)
|
|
47
173
|
|
|
48
|
-
|
|
49
|
-
begin: match.index,
|
|
50
|
-
end: match.index + match[0].length,
|
|
51
|
-
}))
|
|
52
|
-
const starts = [0, ...cuts.map((cut) => cut.end)]
|
|
53
|
-
const stops = cuts.map((cut) => cut.begin)
|
|
54
|
-
|
|
55
|
-
return starts.map((start, index) => command.slice(start, stops[index] ?? command.length).trim())
|
|
174
|
+
return trimmed(pieces_of(command, cuts_of(plain, COMMAND_OPERATORS)))
|
|
56
175
|
}
|
|
57
176
|
|
|
58
177
|
const LINE_CONTINUATION = /\\\n/gu
|
|
@@ -64,7 +183,13 @@ function joined_continuations(command: string): string {
|
|
|
64
183
|
|
|
65
184
|
/** The same cut, untrimmed and with each separator kept between its commands, so the parts join back to the line. */
|
|
66
185
|
function parts_of(command: string): Array<string> {
|
|
67
|
-
|
|
186
|
+
const cuts = cuts_of(command, SEGMENT_OPERATORS)
|
|
187
|
+
|
|
188
|
+
return pieces_of(command, cuts).flatMap((piece, index) => {
|
|
189
|
+
const cut = cuts[index]
|
|
190
|
+
|
|
191
|
+
return cut === undefined ? piece : [piece, command.slice(cut.begin, cut.end)]
|
|
192
|
+
})
|
|
68
193
|
}
|
|
69
194
|
|
|
70
195
|
/**
|
|
@@ -76,9 +201,9 @@ function first_of(command: string): string | undefined {
|
|
|
76
201
|
|
|
77
202
|
if (plain === undefined) return undefined
|
|
78
203
|
|
|
79
|
-
const cut = plain
|
|
204
|
+
const [cut] = cuts_of(plain, SEGMENT_OPERATORS)
|
|
80
205
|
|
|
81
|
-
return
|
|
206
|
+
return command.slice(0, cut?.begin ?? command.length).trim()
|
|
82
207
|
}
|
|
83
208
|
|
|
84
209
|
// **Both spellings match, and the expansion is not this file's.** `time_josh_names` expands the alias
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// **One reading of a shell line's words and control operators, shared by the guards** (joshuafolkken/kit#7334).
|
|
2
|
+
// A guard that cuts the line with a separator pattern of its own can read the same line differently
|
|
3
|
+
// from the next one, so the cut starts here. The tokenizer is hand-written rather than a parser package: the guards slice the
|
|
4
|
+
// typed line at a token's offsets, and the candidate packages return argv with the quotes removed and
|
|
5
|
+
// the variables expanded, so no offset survives (`docs/maintainers/shell-tokenizer.md`).
|
|
6
|
+
//
|
|
7
|
+
// **Quoting is the caller's reading, not this file's.** A caller that must not cut inside quotes hands
|
|
8
|
+
// in the quote-blanked line (`time_shell.blanked`), whose offsets are the typed line's; a caller that
|
|
9
|
+
// reads quoted text as commands too hands in the line as typed. `words_of` is the one reading of a
|
|
10
|
+
// command's words for the guards that read arguments rather than cut commands.
|
|
11
|
+
|
|
12
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
13
|
+
|
|
14
|
+
type ShellTokenKind = 'operator' | 'word'
|
|
15
|
+
|
|
16
|
+
interface ShellToken {
|
|
17
|
+
begin: number
|
|
18
|
+
end: number
|
|
19
|
+
kind: ShellTokenKind
|
|
20
|
+
text: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Longest first, so `;;&` and `;;` (a `case` arm's end) are one operator, not two `;`. A `|` after `>`
|
|
24
|
+
// is the clobber redirect, and a `&` beside `<` or `>` belongs to a redirection (`2>&1`, `&>f`, `<&3`).
|
|
25
|
+
const OPERATOR = String.raw`;;&?|;&|&&|\|\||(?<!>)\|&?|;|\n|(?<![<>])&(?!>)`
|
|
26
|
+
const WORD = String.raw`(?:[^\s;&|]|(?<=[<>])&|&(?=>)|(?<=>)\|)+`
|
|
27
|
+
const TOKEN_PATTERN = new RegExp(`(?<operator>${OPERATOR})|${WORD}`, 'gu')
|
|
28
|
+
// A separator character the quote-held reading turns into a word character where a quote holds it.
|
|
29
|
+
const SEPARATOR = /[;&|]/gu
|
|
30
|
+
const HELD = '_'
|
|
31
|
+
const BLANK = ' '
|
|
32
|
+
|
|
33
|
+
/** The line's tokens in order, each with its offsets; whitespace other than a newline separates them. */
|
|
34
|
+
function tokens_of(reading: string): Array<ShellToken> {
|
|
35
|
+
return [...reading.matchAll(TOKEN_PATTERN)].map((match) => ({
|
|
36
|
+
begin: match.index,
|
|
37
|
+
end: match.index + match[0].length,
|
|
38
|
+
kind: match.groups?.['operator'] === undefined ? 'word' : 'operator',
|
|
39
|
+
text: match[0],
|
|
40
|
+
}))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The line with each `;`, `&` or `|` a quote or a backslash holds made a word character; the quote-blanked
|
|
44
|
+
// line has the typed line's offsets. A heredoc line, which `blanked` does not read, stays as typed.
|
|
45
|
+
function quote_held(line: string): string {
|
|
46
|
+
const plain = time_shell.blanked(line)
|
|
47
|
+
if (plain === undefined) return line
|
|
48
|
+
|
|
49
|
+
return line.replaceAll(SEPARATOR, (character, offset: number) =>
|
|
50
|
+
plain[offset] === BLANK ? HELD : character,
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The line's words, each with its typed text: whitespace cuts a word as it does unquoted, but a
|
|
56
|
+
* separator inside quotes stays in its word (`rg "a|b" f` is three words).
|
|
57
|
+
*/
|
|
58
|
+
function words_of(line: string): Array<ShellToken> {
|
|
59
|
+
return tokens_of(quote_held(line))
|
|
60
|
+
.filter((token) => token.kind === 'word')
|
|
61
|
+
.map((token) => ({ ...token, text: line.slice(token.begin, token.end) }))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const shell_tokens = { tokens_of, words_of }
|
|
65
|
+
|
|
66
|
+
export { shell_tokens, type ShellToken }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
5
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
6
|
+
|
|
7
|
+
// A Bash line that is one `gh issue <action> <N> …` call and nothing else, which a refusing row can
|
|
8
|
+
// rewrite to its `pnpm josh` command (joshuafolkken/kit#7330): every word is plain, so nothing is
|
|
9
|
+
// piped, chained, redirected, quoted or expanded, and the one issue number is split from the flags the
|
|
10
|
+
// row reads. Shared by `direct-issue-read.ts` and `direct-issue-comment.ts`.
|
|
11
|
+
|
|
12
|
+
interface StandaloneCall {
|
|
13
|
+
issue: string
|
|
14
|
+
// The words that are not the issue number, joined by one space.
|
|
15
|
+
flags: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const WORD_SEPARATOR = ' '
|
|
19
|
+
// A word with no shell syntax in it, so a line of them is one call with nothing chained or redirected.
|
|
20
|
+
const PLAIN_WORD = /^[\w./=-]+$/u
|
|
21
|
+
|
|
22
|
+
function line_of(words: ReadonlyArray<string>): string {
|
|
23
|
+
return words.join(WORD_SEPARATOR)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function is_plain_word(word: string): boolean {
|
|
27
|
+
return PLAIN_WORD.test(word)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function split_issue(rest: ReadonlyArray<string>): StandaloneCall | undefined {
|
|
31
|
+
const issues = rest.filter((word) => issue_number_shape.is_issue_number(word))
|
|
32
|
+
const [issue] = issues
|
|
33
|
+
const flags = line_of(rest.filter((word) => !issue_number_shape.is_issue_number(word)))
|
|
34
|
+
|
|
35
|
+
return issue !== undefined && issues.length === 1 ? { issue, flags } : undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The issue and flags after `lead` on a line that is that one call alone, else `undefined`.
|
|
39
|
+
function call_of(line: string, lead: ReadonlyArray<string>): StandaloneCall | undefined {
|
|
40
|
+
const words = line.trim().split(WORD_SEPARATOR)
|
|
41
|
+
const is_lead = line_of(words.slice(0, lead.length)) === line_of(lead)
|
|
42
|
+
|
|
43
|
+
return is_lead && words.every((word) => is_plain_word(word))
|
|
44
|
+
? split_issue(words.slice(lead.length))
|
|
45
|
+
: undefined
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The Bash input with its command replaced by `command_of`'s answer, else `undefined`.
|
|
49
|
+
function input_of(
|
|
50
|
+
call: GuardedCall,
|
|
51
|
+
command_of: (command: string) => string | undefined,
|
|
52
|
+
): Record<string, unknown> | undefined {
|
|
53
|
+
if (call.name !== cost_blocks.BASH_TOOL || !json_value.is_record(call.input)) return undefined
|
|
54
|
+
|
|
55
|
+
const command = command_of(time_shell.bash_command(call.input))
|
|
56
|
+
|
|
57
|
+
return command === undefined ? undefined : { ...call.input, command }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const standalone_gh_call = { call_of, input_of, is_plain_word, line_of }
|
|
61
|
+
|
|
62
|
+
export type { StandaloneCall }
|
|
63
|
+
export { standalone_gh_call }
|