@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
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import { appendFile, readdir, rm } from 'node:fs/promises'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { git_gh_issue_alias_graphql } from '#scripts/gh/git-gh-issue-alias-graphql'
|
|
5
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { z } from 'zod'
|
|
7
|
+
import {
|
|
8
|
+
CARRIED_ROUNDS_SUFFIX,
|
|
9
|
+
LEDGER_FILE_EXTENSION,
|
|
10
|
+
OBSERVATION_LEDGER_DIRECTORY,
|
|
11
|
+
} from './observation-ledger'
|
|
12
|
+
import { observation_ledger_home } from './observation-ledger-home'
|
|
13
|
+
|
|
14
|
+
// The ledger's retention: archive, never expire (`docs/maintainers/observation-ledger-rationale.md` →
|
|
15
|
+
// "Retention policy", joshuafolkken/kit#7336). A closed issue's `<issue>.md` and
|
|
16
|
+
// `<issue>-comment-rounds.md` move, verbatim and in name order, into `archive-YYYY-MM.md` for the month
|
|
17
|
+
// the issue closed — the same directory, so `observation_ledger_home.read` still counts every line.
|
|
18
|
+
//
|
|
19
|
+
// **Only `observations:flush` runs it, on the default branch**: parallel lanes writing one archive
|
|
20
|
+
// file would conflict. An issue GitHub did not answer as closed keeps its file until a later flush.
|
|
21
|
+
//
|
|
22
|
+
// **The carried mark survives the move**: the carry treats an issue whose rounds file exists as
|
|
23
|
+
// carried, so each archived rounds file's issue is listed in `archived-comment-rounds.txt`, which the
|
|
24
|
+
// carry reads too. It is not a `.md` file, so no reader takes it for ledger lines.
|
|
25
|
+
|
|
26
|
+
const ARCHIVE_PREFIX = 'archive-'
|
|
27
|
+
const ARCHIVED_ROUNDS_FILE = 'archived-comment-rounds.txt'
|
|
28
|
+
const ISSUE_FILE_PATTERN = new RegExp(
|
|
29
|
+
String.raw`^(?<issue>\d+)(?<rounds>${CARRIED_ROUNDS_SUFFIX})?\.md$`,
|
|
30
|
+
'u',
|
|
31
|
+
)
|
|
32
|
+
const CLOSED_FIELDS = 'state closedAt'
|
|
33
|
+
const CLOSED_STATE = 'CLOSED'
|
|
34
|
+
const MONTH_END = 7
|
|
35
|
+
const NONE = 0
|
|
36
|
+
const ARCHIVED_LINE = "closed issues' ledger file(s) moved into the monthly archive files."
|
|
37
|
+
const ARCHIVE_FAILED_LINE =
|
|
38
|
+
"Could not archive the closed issues' ledger files; the next flush retries:"
|
|
39
|
+
|
|
40
|
+
const closed_schema = z.object({ state: z.string(), closedAt: z.string().nullish() })
|
|
41
|
+
|
|
42
|
+
interface IssueFile {
|
|
43
|
+
name: string
|
|
44
|
+
issue: number
|
|
45
|
+
is_rounds: boolean
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function issue_file_of(name: string): IssueFile | undefined {
|
|
49
|
+
const groups = ISSUE_FILE_PATTERN.exec(name)?.groups
|
|
50
|
+
|
|
51
|
+
if (groups?.['issue'] === undefined) return undefined
|
|
52
|
+
|
|
53
|
+
return { name, issue: Number(groups['issue']), is_rounds: groups['rounds'] !== undefined }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function issue_files(names: ReadonlyArray<string>): Array<IssueFile> {
|
|
57
|
+
return names
|
|
58
|
+
.toSorted((left, right) => left.localeCompare(right))
|
|
59
|
+
.flatMap((name) => issue_file_of(name) ?? [])
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function archive_name(closed_at: string): string {
|
|
63
|
+
return `${ARCHIVE_PREFIX}${closed_at.slice(0, MONTH_END)}${LEDGER_FILE_EXTENSION}`
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The archive file of each closed issue; an open issue, or one GitHub did not answer, is absent.
|
|
67
|
+
async function closed_archives(issues: ReadonlyArray<number>): Promise<Map<number, string>> {
|
|
68
|
+
const read = await git_gh_issue_alias_graphql.read_aliased(issues, CLOSED_FIELDS, closed_schema)
|
|
69
|
+
|
|
70
|
+
return new Map(
|
|
71
|
+
[...read.answers].flatMap(([issue, answer]) =>
|
|
72
|
+
answer.state === CLOSED_STATE && typeof answer.closedAt === 'string'
|
|
73
|
+
? [[issue, archive_name(answer.closedAt)] as const]
|
|
74
|
+
: [],
|
|
75
|
+
),
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function by_archive(
|
|
80
|
+
files: ReadonlyArray<IssueFile>,
|
|
81
|
+
archives: ReadonlyMap<number, string>,
|
|
82
|
+
): Map<string, Array<IssueFile>> {
|
|
83
|
+
const groups = new Map<string, Array<IssueFile>>()
|
|
84
|
+
|
|
85
|
+
for (const file of files) {
|
|
86
|
+
const target = archives.get(file.issue)
|
|
87
|
+
|
|
88
|
+
if (target !== undefined) groups.set(target, [...(groups.get(target) ?? []), file])
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return groups
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Written before the sources are removed: a stop between the two leaves a duplicate in the working
|
|
95
|
+
// tree, which `git checkout` undoes, rather than a lost line.
|
|
96
|
+
async function move(
|
|
97
|
+
directory: string,
|
|
98
|
+
target: string,
|
|
99
|
+
files: ReadonlyArray<IssueFile>,
|
|
100
|
+
): Promise<void> {
|
|
101
|
+
const contents = await Promise.all(
|
|
102
|
+
files.map(
|
|
103
|
+
async (file) =>
|
|
104
|
+
await observation_ledger_home.read_file(path.join(directory, file.name), true),
|
|
105
|
+
),
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
await appendFile(path.join(directory, target), contents.join(''), 'utf8')
|
|
109
|
+
await Promise.all(
|
|
110
|
+
files.map(async (file) => {
|
|
111
|
+
await rm(path.join(directory, file.name))
|
|
112
|
+
}),
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function archived_rounds_path(root: string): string {
|
|
117
|
+
return path.join(root, OBSERVATION_LEDGER_DIRECTORY, ARCHIVED_ROUNDS_FILE)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function record_rounds(root: string, files: ReadonlyArray<IssueFile>): Promise<void> {
|
|
121
|
+
const issues = files.filter((file) => file.is_rounds).map((file) => String(file.issue))
|
|
122
|
+
|
|
123
|
+
if (issues.length > NONE) {
|
|
124
|
+
await appendFile(archived_rounds_path(root), `${issues.join('\n')}\n`, 'utf8')
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// The issues whose carried rounds file was archived — carried, so the carry never reads them again.
|
|
129
|
+
function archived_rounds(root: string): ReadonlySet<number> {
|
|
130
|
+
const target = archived_rounds_path(root)
|
|
131
|
+
|
|
132
|
+
if (!existsSync(target)) return new Set()
|
|
133
|
+
|
|
134
|
+
return new Set(readFileSync(target, 'utf8').split('\n').filter(Boolean).map(Number))
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Moves every closed issue's ledger files into its month's archive, and answers how many it moved.
|
|
138
|
+
async function archive(root: string): Promise<number> {
|
|
139
|
+
const directory = path.join(root, OBSERVATION_LEDGER_DIRECTORY)
|
|
140
|
+
|
|
141
|
+
if (!existsSync(directory)) return NONE
|
|
142
|
+
|
|
143
|
+
const files = issue_files(await readdir(directory))
|
|
144
|
+
const groups = by_archive(files, await closed_archives(files.map((file) => file.issue)))
|
|
145
|
+
const moved = [...groups.values()].flat()
|
|
146
|
+
|
|
147
|
+
await Promise.all(
|
|
148
|
+
[...groups].map(async ([name, group]) => {
|
|
149
|
+
await move(directory, name, group)
|
|
150
|
+
}),
|
|
151
|
+
)
|
|
152
|
+
await record_rounds(root, moved)
|
|
153
|
+
|
|
154
|
+
return moved.length
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// **An archive that fails never fails the flush**: the files stay where they are and the next flush
|
|
158
|
+
// moves them, so `0` is returned.
|
|
159
|
+
async function archive_reported(root: string): Promise<number> {
|
|
160
|
+
try {
|
|
161
|
+
const count = await archive(root)
|
|
162
|
+
|
|
163
|
+
if (count > NONE) console.info(`Archived ${String(count)} ${ARCHIVED_LINE}`)
|
|
164
|
+
|
|
165
|
+
return count
|
|
166
|
+
} catch (error) {
|
|
167
|
+
console.warn(`${ARCHIVE_FAILED_LINE} ${error_text.message_of(error)}`)
|
|
168
|
+
|
|
169
|
+
return NONE
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const observation_ledger_archive = {
|
|
174
|
+
ARCHIVE_FAILED_LINE,
|
|
175
|
+
archive,
|
|
176
|
+
archive_reported,
|
|
177
|
+
archived_rounds,
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export { observation_ledger_archive }
|
|
@@ -25,6 +25,10 @@ const LEDGER_DIRECTORIES: ReadonlyArray<string> = [
|
|
|
25
25
|
|
|
26
26
|
const LEDGER_FILE_EXTENSION = '.md'
|
|
27
27
|
|
|
28
|
+
// The suffix of a closed issue's carried comment rounds, `<issue>-comment-rounds.md` — named here
|
|
29
|
+
// because both the carry that writes it and the archive that moves it read it.
|
|
30
|
+
const CARRIED_ROUNDS_SUFFIX = '-comment-rounds'
|
|
31
|
+
|
|
28
32
|
// What the single-file ledgers held is moved here (`observation-ledger-migrate.ts`), so no line is
|
|
29
33
|
// lost to the split.
|
|
30
34
|
const LEGACY_LEDGER_FILE = `legacy${LEDGER_FILE_EXTENSION}`
|
|
@@ -135,6 +139,7 @@ const observation_ledger = {
|
|
|
135
139
|
}
|
|
136
140
|
|
|
137
141
|
export {
|
|
142
|
+
CARRIED_ROUNDS_SUFFIX,
|
|
138
143
|
LEDGER_DIRECTORIES,
|
|
139
144
|
LEDGER_EXCLUSION_PATHSPEC,
|
|
140
145
|
LEDGER_FILE_EXTENSION,
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import {
|
|
3
|
+
cpSync,
|
|
4
|
+
existsSync,
|
|
5
|
+
lstatSync,
|
|
6
|
+
mkdirSync,
|
|
7
|
+
readFileSync,
|
|
8
|
+
renameSync,
|
|
9
|
+
rmSync,
|
|
10
|
+
writeFileSync,
|
|
11
|
+
} from 'node:fs'
|
|
12
|
+
import path from 'node:path'
|
|
13
|
+
import { git_command } from '#scripts/git/git-command'
|
|
14
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
15
|
+
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
16
|
+
import { git_worktree } from '#scripts/git/git-worktree'
|
|
17
|
+
import { repository_lock } from '#scripts/git/repository-lock'
|
|
18
|
+
import { lane_install } from '#scripts/lane/lane-install'
|
|
19
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
20
|
+
import { poll } from '#scripts/lib/poll'
|
|
21
|
+
import { SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
22
|
+
import { z } from 'zod'
|
|
23
|
+
import { observation_ledger, OBSERVATION_LEDGER_DIRECTORY } from './observation-ledger'
|
|
24
|
+
|
|
25
|
+
const LOCK_WAIT_MS = 30_000
|
|
26
|
+
const COMMIT_MESSAGE = 'Record observation ledger entries'
|
|
27
|
+
const ATTEMPTS = 5
|
|
28
|
+
const INTERVAL_MS = 250
|
|
29
|
+
const snapshot_schema = z.object({
|
|
30
|
+
name: z.string(),
|
|
31
|
+
content: z.string().optional(),
|
|
32
|
+
base: z.string().optional(),
|
|
33
|
+
})
|
|
34
|
+
type SnapshotFile = z.infer<typeof snapshot_schema>
|
|
35
|
+
const state_schema = z.object({
|
|
36
|
+
branch: z.string(),
|
|
37
|
+
base: z.string(),
|
|
38
|
+
tree: z.string(),
|
|
39
|
+
archived: z.number().optional(),
|
|
40
|
+
landed: z.boolean().optional(),
|
|
41
|
+
initialized: z.boolean().optional(),
|
|
42
|
+
committed: z.boolean().optional(),
|
|
43
|
+
installed: z.boolean().optional(),
|
|
44
|
+
index: z.string(),
|
|
45
|
+
files: z.array(snapshot_schema),
|
|
46
|
+
reconciled: z.array(snapshot_schema).optional(),
|
|
47
|
+
})
|
|
48
|
+
type State = z.infer<typeof state_schema>
|
|
49
|
+
|
|
50
|
+
interface Steps {
|
|
51
|
+
prepare: () => Promise<number>
|
|
52
|
+
publish: (branch: string, archived: number) => Promise<void>
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function lock_failure(error: unknown): undefined {
|
|
56
|
+
if (!/index\.lock.*(?:File exists|exists)/su.test(error_text.message_of(error))) throw error
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function retry(work: () => Promise<unknown>): Promise<void> {
|
|
60
|
+
const state: { failure?: unknown } = {}
|
|
61
|
+
const is_complete = await poll.poll_for(
|
|
62
|
+
async () => {
|
|
63
|
+
try {
|
|
64
|
+
await work()
|
|
65
|
+
delete state.failure
|
|
66
|
+
} catch (error) {
|
|
67
|
+
lock_failure(error)
|
|
68
|
+
state.failure = error
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return state.failure === undefined ? true : undefined
|
|
72
|
+
},
|
|
73
|
+
{ attempts: ATTEMPTS, interval_ms: INTERVAL_MS },
|
|
74
|
+
)
|
|
75
|
+
if (is_complete === undefined) throw state.failure
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function read(root: string, name: string): string | undefined {
|
|
79
|
+
const target = path.join(root, name)
|
|
80
|
+
if (!existsSync(target)) return undefined
|
|
81
|
+
if (!lstatSync(target).isFile()) throw new Error(`Not a regular ledger file: ${target}`)
|
|
82
|
+
|
|
83
|
+
return readFileSync(target, 'utf8')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function write(root: string, name: string, content: string | undefined): void {
|
|
87
|
+
const target = path.join(root, name)
|
|
88
|
+
|
|
89
|
+
if (content === undefined) {
|
|
90
|
+
rmSync(target, { force: true })
|
|
91
|
+
|
|
92
|
+
return
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
mkdirSync(path.dirname(target), { recursive: true })
|
|
96
|
+
writeFileSync(target, content, 'utf8')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function capture(root: string): Promise<Array<SnapshotFile>> {
|
|
100
|
+
const output = await git_spawn.read([
|
|
101
|
+
'-C',
|
|
102
|
+
root,
|
|
103
|
+
'ls-files',
|
|
104
|
+
'-z',
|
|
105
|
+
'--cached',
|
|
106
|
+
'--others',
|
|
107
|
+
'--exclude-standard',
|
|
108
|
+
])
|
|
109
|
+
const names = new Set(
|
|
110
|
+
output.split('\0').filter((name) => observation_ledger.is_ledger_path(name)),
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
return [...names].map((name) => ({
|
|
114
|
+
name,
|
|
115
|
+
content: read(root, name),
|
|
116
|
+
}))
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function apply(root: string, files: ReadonlyArray<SnapshotFile>): void {
|
|
120
|
+
for (const file of files) write(root, file.name, file.content)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function reconciled_content(file: SnapshotFile, suffix: string): string | undefined {
|
|
124
|
+
if (suffix === '' && file.base === undefined) return undefined
|
|
125
|
+
|
|
126
|
+
return (file.base ?? '') + suffix
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function reconciled_file(root: string, file: SnapshotFile): SnapshotFile {
|
|
130
|
+
const current = read(root, file.name) ?? ''
|
|
131
|
+
const original = file.content ?? ''
|
|
132
|
+
|
|
133
|
+
if (!current.startsWith(original)) {
|
|
134
|
+
throw new Error(`Ledger changed beyond an append: ${file.name}; recovery retained`)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return { ...file, content: reconciled_content(file, current.slice(original.length)) }
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function starts_with(current = '', expected = ''): boolean {
|
|
141
|
+
return current.startsWith(expected)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function restore_file(root: string, file: SnapshotFile, before: SnapshotFile | undefined): void {
|
|
145
|
+
const current = read(root, file.name)
|
|
146
|
+
if (current === file.content) return
|
|
147
|
+
|
|
148
|
+
if (before !== undefined && starts_with(current, before.content)) {
|
|
149
|
+
write(root, file.name, reconciled_file(root, before).content)
|
|
150
|
+
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (!starts_with(current, file.content)) throw new Error(`Recovery conflict: ${file.name}`)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function restore(
|
|
158
|
+
root: string,
|
|
159
|
+
before: ReadonlyArray<SnapshotFile>,
|
|
160
|
+
after: ReadonlyArray<SnapshotFile>,
|
|
161
|
+
): void {
|
|
162
|
+
for (const file of after) {
|
|
163
|
+
restore_file(
|
|
164
|
+
root,
|
|
165
|
+
file,
|
|
166
|
+
before.find((entry) => entry.name === file.name),
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function save(target: string, state: State): void {
|
|
172
|
+
writeFileSync(`${target}.tmp`, JSON.stringify(state), 'utf8')
|
|
173
|
+
renameSync(`${target}.tmp`, target)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async function location(root: string): Promise<string> {
|
|
177
|
+
const own = await git_spawn.read(['-C', root, 'rev-parse', '--absolute-git-dir'])
|
|
178
|
+
const directory = path.join(own, 'josh', 'observation-flush')
|
|
179
|
+
|
|
180
|
+
mkdirSync(directory, { recursive: true })
|
|
181
|
+
|
|
182
|
+
return path.join(directory, 'state.json')
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async function create(root: string, branch: string, target: string): Promise<State> {
|
|
186
|
+
const existing = git_spawn_sync.read(
|
|
187
|
+
['show-ref', '--verify', `refs/heads/${branch}`],
|
|
188
|
+
git_spawn_sync.located(root),
|
|
189
|
+
)
|
|
190
|
+
const state = {
|
|
191
|
+
branch: existing === undefined ? branch : `${branch}-${randomUUID()}`,
|
|
192
|
+
base: await git_command.head_commit(),
|
|
193
|
+
index: await git_spawn.read(['-C', root, 'diff', '--cached', '--binary']),
|
|
194
|
+
tree: `${path.dirname(target)}/tree`,
|
|
195
|
+
files: await capture(root),
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
save(target, state)
|
|
199
|
+
|
|
200
|
+
return state
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async function initialize(root: string, state: State, target: string): Promise<void> {
|
|
204
|
+
if (state.initialized === true) return
|
|
205
|
+
const existing = git_spawn_sync.read(
|
|
206
|
+
['show-ref', '--verify', `refs/heads/${state.branch}`],
|
|
207
|
+
git_spawn_sync.located(root),
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
if (!existsSync(state.tree)) {
|
|
211
|
+
await git_worktree.worktree_add(
|
|
212
|
+
state.tree,
|
|
213
|
+
state.branch,
|
|
214
|
+
existing === undefined ? state.base : undefined,
|
|
215
|
+
)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
Object.assign(state, {
|
|
219
|
+
files: state.files.map((file) => ({ ...file, base: read(state.tree, file.name) })),
|
|
220
|
+
initialized: true,
|
|
221
|
+
})
|
|
222
|
+
save(target, state)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async function load(root: string, branch: string, target: string): Promise<State> {
|
|
226
|
+
const state = existsSync(target)
|
|
227
|
+
? state_schema.parse(JSON.parse(readFileSync(target, 'utf8')))
|
|
228
|
+
: await create(root, branch, target)
|
|
229
|
+
|
|
230
|
+
await initialize(root, state, target)
|
|
231
|
+
|
|
232
|
+
return state
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function pending(root: string): Promise<boolean> {
|
|
236
|
+
return existsSync(await location(root))
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async function reset_preparation(state: State, target: string): Promise<void> {
|
|
240
|
+
const ledger = path.join(state.tree, OBSERVATION_LEDGER_DIRECTORY)
|
|
241
|
+
|
|
242
|
+
if (existsSync(ledger)) {
|
|
243
|
+
cpSync(ledger, `${path.dirname(target)}/attempt-${String(Date.now())}`, { recursive: true })
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
await git_spawn.read(['reset', '--hard', state.base])
|
|
247
|
+
await git_spawn.read(['clean', '-fd', '--', OBSERVATION_LEDGER_DIRECTORY])
|
|
248
|
+
apply(state.tree, state.files)
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async function stage(): Promise<void> {
|
|
252
|
+
const status = await git_command.status()
|
|
253
|
+
const unstaged = status
|
|
254
|
+
.split('\n')
|
|
255
|
+
.filter((line) => line[1] !== ' ')
|
|
256
|
+
.join('\n')
|
|
257
|
+
const names = observation_ledger.ledger_paths(unstaged)
|
|
258
|
+
|
|
259
|
+
for (const name of names) {
|
|
260
|
+
// eslint-disable-next-line no-await-in-loop -- each git add exclusively owns this index
|
|
261
|
+
await retry(async () => await git_spawn.read(['add', '--', name]))
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
async function prepare(state: State, target: string, steps: Steps): Promise<void> {
|
|
266
|
+
if ((await git_command.head_commit()) !== state.base) return
|
|
267
|
+
|
|
268
|
+
if (state.archived === undefined) {
|
|
269
|
+
await reset_preparation(state, target)
|
|
270
|
+
Object.assign(state, { archived: await steps.prepare() })
|
|
271
|
+
save(target, state)
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
await stage()
|
|
275
|
+
if (!observation_ledger.has_pending_append(await git_command.status())) return
|
|
276
|
+
await retry(async () => await git_spawn.read(['commit', '-m', COMMIT_MESSAGE], SUITE_TIMEOUT_MS))
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
async function publish(state: State, target: string, steps: Steps): Promise<void> {
|
|
280
|
+
const is_committed = (await git_command.head_commit()) !== state.base
|
|
281
|
+
|
|
282
|
+
Object.assign(state, { committed: is_committed })
|
|
283
|
+
save(target, state)
|
|
284
|
+
if (is_committed) await steps.publish(state.branch, state.archived ?? 0)
|
|
285
|
+
|
|
286
|
+
Object.assign(state, { landed: true })
|
|
287
|
+
save(target, state)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
async function install(state: State, target: string): Promise<void> {
|
|
291
|
+
if (state.installed === true) return
|
|
292
|
+
const result = await lane_install.install_dependencies(state.tree)
|
|
293
|
+
|
|
294
|
+
if (!result.is_installed) {
|
|
295
|
+
throw new Error(`Flush worktree dependency installation failed: ${result.output}`)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
Object.assign(state, { installed: true })
|
|
299
|
+
save(target, state)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
async function inside(state: State, target: string, steps: Steps): Promise<void> {
|
|
303
|
+
if (state.landed === true) return
|
|
304
|
+
const previous = process.cwd()
|
|
305
|
+
|
|
306
|
+
try {
|
|
307
|
+
process.chdir(state.tree)
|
|
308
|
+
await install(state, target)
|
|
309
|
+
await prepare(state, target, steps)
|
|
310
|
+
await publish(state, target, steps)
|
|
311
|
+
} finally {
|
|
312
|
+
process.chdir(previous)
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
async function finish(root: string, state: State, target: string): Promise<void> {
|
|
317
|
+
const index = await git_spawn.read(['-C', root, 'diff', '--cached', '--binary'])
|
|
318
|
+
if (index !== state.index) throw new Error('Source index changed during flush; recovery retained')
|
|
319
|
+
state.reconciled ??= state.files.map((file) => reconciled_file(root, file))
|
|
320
|
+
save(target, state)
|
|
321
|
+
restore(root, state.files, state.reconciled)
|
|
322
|
+
if (existsSync(state.tree)) await git_worktree.worktree_remove(state.tree)
|
|
323
|
+
renameSync(target, `${target}.completed-${path.basename(state.branch)}`)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
async function transact(root: string, branch: string, steps: Steps): Promise<string> {
|
|
327
|
+
const target = await location(root)
|
|
328
|
+
|
|
329
|
+
try {
|
|
330
|
+
const state = await load(root, branch, target)
|
|
331
|
+
|
|
332
|
+
await inside(state, target, steps)
|
|
333
|
+
await finish(root, state, target)
|
|
334
|
+
|
|
335
|
+
return state.committed === true ? state.branch : ''
|
|
336
|
+
} catch (error) {
|
|
337
|
+
throw new Error(
|
|
338
|
+
`${error_text.message_of(error)} — observations recovery: ${target}; rerun observations:flush; do not remove the recovery tree`,
|
|
339
|
+
{ cause: error },
|
|
340
|
+
)
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
async function run(root: string, branch: string, steps: Steps): Promise<string> {
|
|
345
|
+
const lock = repository_lock.lock_path('josh-observation-flush-', root)
|
|
346
|
+
const result = await repository_lock.with_lock(
|
|
347
|
+
async () => await transact(root, branch, steps),
|
|
348
|
+
lock,
|
|
349
|
+
LOCK_WAIT_MS,
|
|
350
|
+
)
|
|
351
|
+
if (result === undefined) throw new Error('Observation flush is already running; retry later')
|
|
352
|
+
|
|
353
|
+
return result
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const observations_flush_transaction = { pending, run }
|
|
357
|
+
|
|
358
|
+
export { observations_flush_transaction }
|