@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.
Files changed (684) hide show
  1. package/.claude/skills/workflow-commands/backlogrun-steps.md +1 -1
  2. package/.claude/skills/workflow-commands/kickoff.md +6 -0
  3. package/dist/.inputs-verified.json +1 -1
  4. package/dist/commands/adopt.js +12 -12
  5. package/dist/commands/auto-ok-judge-cli.js +18 -14
  6. package/dist/commands/auto-ok-main.js +42 -40
  7. package/dist/commands/backlog-budget-main.js +3 -3
  8. package/dist/commands/backlog-drive-cli.js +276 -188
  9. package/dist/commands/backlog-next-main.js +77 -75
  10. package/dist/commands/backlog-offer-main.js +80 -78
  11. package/dist/commands/backlog-plan-cli.js +96 -97
  12. package/dist/commands/backlog-triage-cli.js +94 -92
  13. package/dist/commands/backlogrun-cli.js +212 -206
  14. package/dist/commands/behavior-cli.js +12 -13
  15. package/dist/commands/bump-version-main.js +2 -2
  16. package/dist/commands/bytes-command.js +61 -22
  17. package/dist/commands/check-related.js +61 -60
  18. package/dist/commands/{chunk-X7PN54LZ.js → chunk-22DVQCP6.js} +16 -6
  19. package/dist/commands/{chunk-7GHOFHUS.js → chunk-24ZDAWML.js} +3 -3
  20. package/dist/commands/{chunk-HBNB3TLG.js → chunk-2BB5ZR2F.js} +13 -7
  21. package/dist/commands/{chunk-F22G3VDB.js → chunk-2BC33QPY.js} +1 -1
  22. package/dist/commands/{chunk-72EW7AVI.js → chunk-2BJJUTZA.js} +2 -2
  23. package/dist/commands/{chunk-XDQOWUVT.js → chunk-2CXT6MBR.js} +4 -4
  24. package/dist/commands/{chunk-TVJE67O2.js → chunk-2EZTYLO4.js} +6 -6
  25. package/dist/commands/{chunk-JLYW7CP6.js → chunk-2PHOLX62.js} +1 -1
  26. package/dist/commands/{chunk-6EU5ZCDP.js → chunk-2QM72JCJ.js} +23 -87
  27. package/dist/commands/{chunk-EFHSCUFN.js → chunk-2VFPUPSG.js} +2 -2
  28. package/dist/commands/{chunk-ATRMETHT.js → chunk-2XAH3MHV.js} +1 -1
  29. package/dist/commands/{chunk-T2E724HN.js → chunk-34JJYCIY.js} +2 -2
  30. package/dist/commands/{chunk-REMKUFAC.js → chunk-34KZDKQJ.js} +1 -1
  31. package/dist/commands/{chunk-GK2KY4MO.js → chunk-352KLSFX.js} +3 -3
  32. package/dist/commands/{chunk-7S6VRZOH.js → chunk-3AEDZZNL.js} +5 -5
  33. package/dist/commands/{chunk-KVJDDECB.js → chunk-3B2HEFNO.js} +2 -2
  34. package/dist/commands/{chunk-HZBTXKT2.js → chunk-3Z425MM3.js} +2 -2
  35. package/dist/commands/{chunk-J3G2R64I.js → chunk-3ZOX4G4U.js} +3 -3
  36. package/dist/commands/{chunk-LRS2OS5J.js → chunk-452HWOJ7.js} +2 -2
  37. package/dist/commands/{chunk-HRT4KWP4.js → chunk-475EFIJV.js} +1 -1
  38. package/dist/commands/{chunk-4HBVHYNL.js → chunk-47UZB54M.js} +3 -3
  39. package/dist/commands/{chunk-H4LYG37R.js → chunk-4DN4XVPL.js} +6 -6
  40. package/dist/commands/{chunk-TMLNI3YW.js → chunk-4HERA2GY.js} +1 -1
  41. package/dist/commands/{chunk-W6V4DWC5.js → chunk-4JI35CVO.js} +1 -1
  42. package/dist/commands/{chunk-YT342DRV.js → chunk-4L4LNWZ7.js} +2 -2
  43. package/dist/commands/{chunk-ZZAH3YQP.js → chunk-4N32QKJZ.js} +6 -6
  44. package/dist/commands/{chunk-GDUK5YPO.js → chunk-4NRSFLG7.js} +12 -12
  45. package/dist/commands/{chunk-O5QZ2S6X.js → chunk-4OKRPAUT.js} +4 -4
  46. package/dist/commands/{chunk-QDFDB4CF.js → chunk-4Q64PG46.js} +13 -13
  47. package/dist/commands/{chunk-HO52D6JY.js → chunk-4UDTQVDD.js} +14 -14
  48. package/dist/commands/{chunk-HPVLI26Z.js → chunk-4WR2LEZL.js} +6 -6
  49. package/dist/commands/{chunk-DP7WIGQ4.js → chunk-4ZJOC6OK.js} +4 -4
  50. package/dist/commands/{chunk-WTRDWEUQ.js → chunk-4ZQM4I7R.js} +12 -12
  51. package/dist/commands/{chunk-OTZJXU2R.js → chunk-54X37JEJ.js} +8 -8
  52. package/dist/commands/{chunk-A5V7EWIX.js → chunk-56KW5EOK.js} +2 -2
  53. package/dist/commands/chunk-5CG3XU3O.js +74 -0
  54. package/dist/commands/{chunk-FC33R5UN.js → chunk-5ESZLHDZ.js} +13 -15
  55. package/dist/commands/{chunk-OVA7STGP.js → chunk-5FBRMARM.js} +9 -9
  56. package/dist/commands/{chunk-SK2LJBFS.js → chunk-5PCK53WP.js} +3 -3
  57. package/dist/commands/{chunk-6NV2F7QH.js → chunk-5RG4S66L.js} +1 -1
  58. package/dist/commands/{chunk-JOARHU3M.js → chunk-5UJGACVN.js} +1 -1
  59. package/dist/commands/{chunk-NKOET4FB.js → chunk-5Y7B7FDL.js} +2 -2
  60. package/dist/commands/{chunk-XMBRXCIE.js → chunk-5Z6E5ZUV.js} +4 -4
  61. package/dist/commands/{chunk-RZ4OKKPM.js → chunk-5ZNUH4LV.js} +2 -2
  62. package/dist/commands/{chunk-7CHCZBNF.js → chunk-6CFHLMKM.js} +4 -4
  63. package/dist/commands/{chunk-TXXYC7EV.js → chunk-6DDK5XWK.js} +1 -1
  64. package/dist/commands/{chunk-2TQXCH2K.js → chunk-6GQX752S.js} +3 -3
  65. package/dist/commands/{chunk-RY6ZDHKB.js → chunk-6MAZ55GF.js} +107 -84
  66. package/dist/commands/{chunk-SNFLV7VV.js → chunk-6RUWU2SB.js} +2 -2
  67. package/dist/commands/{chunk-D4SZK7H2.js → chunk-6TIVDEKG.js} +2 -2
  68. package/dist/commands/{chunk-RIQ75QWR.js → chunk-6UCWAFQY.js} +55 -43
  69. package/dist/commands/{chunk-4D5KWMFL.js → chunk-6YURRFRU.js} +19 -19
  70. package/dist/commands/{chunk-7MOZEEFJ.js → chunk-6YVURZAJ.js} +1 -1
  71. package/dist/commands/{chunk-73JOEKIC.js → chunk-6Z4YZG7P.js} +5 -5
  72. package/dist/commands/{chunk-NJ53AWJU.js → chunk-77BIN247.js} +9 -9
  73. package/dist/commands/{chunk-MZHOPRI6.js → chunk-7ABHNNY3.js} +7 -7
  74. package/dist/commands/{chunk-6WTVAL4D.js → chunk-7C7FOKJK.js} +1 -1
  75. package/dist/commands/{chunk-KVSSLDA3.js → chunk-7HAGC6SW.js} +5 -5
  76. package/dist/commands/{chunk-IG22Y5MA.js → chunk-7KKUFLH5.js} +1 -1
  77. package/dist/commands/{chunk-ZQ3CKRMP.js → chunk-7MJYLUF4.js} +2 -2
  78. package/dist/commands/{chunk-6UGFS3EU.js → chunk-7NHZCI5Y.js} +11 -11
  79. package/dist/commands/{chunk-FB3D7CX5.js → chunk-7OQ56DVW.js} +5 -7
  80. package/dist/commands/{chunk-EK327QOS.js → chunk-7VWPGTZO.js} +10 -10
  81. package/dist/commands/{chunk-WSOF74K4.js → chunk-7YZXS3AK.js} +3 -3
  82. package/dist/commands/{chunk-N6TYL3B2.js → chunk-AAUDI7WJ.js} +2 -2
  83. package/dist/commands/{chunk-3GF52L5F.js → chunk-AC26ZUG5.js} +12 -24
  84. package/dist/commands/{chunk-EK2Y6B4X.js → chunk-ACZ52JPI.js} +7 -7
  85. package/dist/commands/{chunk-VD72V5VX.js → chunk-AJ65WNJB.js} +4 -4
  86. package/dist/commands/{chunk-MYWRGF5A.js → chunk-AK7SEO4Y.js} +2 -2
  87. package/dist/commands/{chunk-IBEKFLWG.js → chunk-ALDAS2WG.js} +9 -9
  88. package/dist/commands/{chunk-W32DIQEP.js → chunk-ARFBIJFS.js} +1 -1
  89. package/dist/commands/{chunk-F3WBEEYC.js → chunk-AVVMDVGO.js} +5 -5
  90. package/dist/commands/chunk-AXXEMVRJ.js +23 -0
  91. package/dist/commands/{chunk-GIGKMIPQ.js → chunk-B3M5WSGN.js} +1 -1
  92. package/dist/commands/{chunk-4Z5723GA.js → chunk-B7ZNIEDV.js} +5 -4
  93. package/dist/commands/{chunk-B3XFOHDX.js → chunk-BCUDQWYK.js} +10 -4
  94. package/dist/commands/{chunk-PR3JCPP7.js → chunk-BMKWSWWE.js} +1 -1
  95. package/dist/commands/{chunk-RZJAUVMI.js → chunk-BMM4RHCG.js} +2 -2
  96. package/dist/commands/{chunk-LAKVPOJQ.js → chunk-BMTYUJNT.js} +2 -2
  97. package/dist/commands/{chunk-DAJCUSPG.js → chunk-BRHPRDDV.js} +3 -3
  98. package/dist/commands/{chunk-UZAU6UI6.js → chunk-BRUBX64M.js} +2 -2
  99. package/dist/commands/{chunk-BFLFPKQQ.js → chunk-BTZJDHQT.js} +4 -4
  100. package/dist/commands/{chunk-AI5K4QJO.js → chunk-BYFC6MD2.js} +1 -1
  101. package/dist/commands/{chunk-JGTLNFFE.js → chunk-BYGJ3BCJ.js} +10 -10
  102. package/dist/commands/{chunk-5HWZFL4D.js → chunk-C54QXJD6.js} +51 -18
  103. package/dist/commands/{chunk-LMS6N6GE.js → chunk-CBAKBWSZ.js} +7 -7
  104. package/dist/commands/{chunk-7EAMUVIO.js → chunk-CFHRNTE5.js} +1 -1
  105. package/dist/commands/{chunk-UIWAMLQH.js → chunk-CGYDIYHD.js} +2 -2
  106. package/dist/commands/{chunk-4QYW2IL7.js → chunk-CHKYPF5O.js} +1 -1
  107. package/dist/commands/{chunk-5HCPSV45.js → chunk-CJBW6BWG.js} +8 -8
  108. package/dist/commands/chunk-CKUKK7JG.js +252 -0
  109. package/dist/commands/{chunk-4PES3BAA.js → chunk-CMHGDCGN.js} +3 -3
  110. package/dist/commands/{chunk-F6OWP2AY.js → chunk-CNGTHSUS.js} +22 -22
  111. package/dist/commands/{chunk-B2EA2HCY.js → chunk-COGKULQH.js} +4 -4
  112. package/dist/commands/{chunk-S7XWXG4M.js → chunk-CP2J4RV2.js} +175 -81
  113. package/dist/commands/{chunk-YGDNUTTI.js → chunk-CQUZ6TNQ.js} +2 -2
  114. package/dist/commands/chunk-CQZI7RIK.js +72 -0
  115. package/dist/commands/chunk-CVJHQOI3.js +153 -0
  116. package/dist/commands/{chunk-2MJ4OCDL.js → chunk-CWCKCZS6.js} +1 -1
  117. package/dist/commands/chunk-D5OHVIPM.js +17 -0
  118. package/dist/commands/{chunk-TPKFVVJQ.js → chunk-D6D6WQR6.js} +2 -2
  119. package/dist/commands/{chunk-5PAEXYIY.js → chunk-D7JRJI44.js} +69 -6
  120. package/dist/commands/{chunk-LOSOLCCW.js → chunk-D7OAU32Z.js} +1 -1
  121. package/dist/commands/{chunk-VZHC2I3T.js → chunk-DAAX7XDS.js} +8 -8
  122. package/dist/commands/{chunk-OHVAEJSM.js → chunk-DEZF7QZZ.js} +5 -5
  123. package/dist/commands/{chunk-CA6F5OXK.js → chunk-DYZOOWVW.js} +124 -21
  124. package/dist/commands/{chunk-TKGBF75Y.js → chunk-EDKOSZ3K.js} +5 -5
  125. package/dist/commands/{chunk-YPNTORQD.js → chunk-EFDVE5P5.js} +1 -1
  126. package/dist/commands/{chunk-EH3LVYOX.js → chunk-EGIHAEMT.js} +1 -1
  127. package/dist/commands/{chunk-7P4X4TQL.js → chunk-EKLU6QR7.js} +4 -4
  128. package/dist/commands/{chunk-ILQZFUDC.js → chunk-ELY76WAR.js} +2 -2
  129. package/dist/commands/{chunk-2VLHFILE.js → chunk-EM3HAZF6.js} +2 -2
  130. package/dist/commands/{chunk-F2HFWLQR.js → chunk-EMTZAGT5.js} +20 -1
  131. package/dist/commands/{chunk-GA4VIFHD.js → chunk-ERG4QRNG.js} +2 -2
  132. package/dist/commands/{chunk-ICEMFE2V.js → chunk-EUGNQCYK.js} +1 -1
  133. package/dist/commands/{chunk-3HU3LPIF.js → chunk-EXDFKKMH.js} +2 -2
  134. package/dist/commands/{chunk-ISPBJVXM.js → chunk-EXWB34R2.js} +7 -7
  135. package/dist/commands/{chunk-FNOSSXLG.js → chunk-EYMPBHDN.js} +2 -2
  136. package/dist/commands/{chunk-7V5UVKFG.js → chunk-EZ7IPKIH.js} +2 -2
  137. package/dist/commands/{chunk-KQWSENCT.js → chunk-F6IQHZYY.js} +3 -3
  138. package/dist/commands/{chunk-7ZECP3J6.js → chunk-FDS65XOJ.js} +5 -5
  139. package/dist/commands/{chunk-KXRFGPZD.js → chunk-FGG7V473.js} +21 -5
  140. package/dist/commands/{chunk-PZ6VWHOO.js → chunk-FHFWNNUC.js} +1 -1
  141. package/dist/commands/{chunk-XBRD2BDL.js → chunk-FJX7AENO.js} +2 -2
  142. package/dist/commands/{chunk-M42SLJCD.js → chunk-FKZ5E4JD.js} +4 -4
  143. package/dist/commands/{chunk-F2J6DGDM.js → chunk-FMZWRDKH.js} +8 -8
  144. package/dist/commands/{chunk-DSBK66US.js → chunk-FOKCRIAN.js} +10 -10
  145. package/dist/commands/{chunk-OI7KM4K3.js → chunk-FQGWO2ZH.js} +2 -2
  146. package/dist/commands/{chunk-2IESYBZH.js → chunk-FURNDIT3.js} +3 -3
  147. package/dist/commands/chunk-FVDQNMP6.js +93 -0
  148. package/dist/commands/{chunk-PZU6FZO6.js → chunk-FWU3H4TX.js} +1 -1
  149. package/dist/commands/{chunk-RYZ3RQRH.js → chunk-G3HBYHFA.js} +1 -1
  150. package/dist/commands/{chunk-HCA5QG2U.js → chunk-G4E4M2P4.js} +2 -2
  151. package/dist/commands/{chunk-VJLZ3IQQ.js → chunk-G5KSL2Q2.js} +1 -1
  152. package/dist/commands/{chunk-Y5ZW3KN5.js → chunk-G6XC7V6Y.js} +2 -2
  153. package/dist/commands/{chunk-73EBNBUW.js → chunk-GCPP5XIG.js} +1 -1
  154. package/dist/commands/{chunk-Q3463XNL.js → chunk-GITT5A5A.js} +3 -3
  155. package/dist/commands/{chunk-T2IO4LEB.js → chunk-GLC47H7I.js} +10 -10
  156. package/dist/commands/{chunk-GA6E4VGO.js → chunk-GUR54ELE.js} +1 -1
  157. package/dist/commands/{chunk-7IT23HIR.js → chunk-GY4DMCKS.js} +2 -2
  158. package/dist/commands/{chunk-PZ4ITSLG.js → chunk-H6JQRHDC.js} +3 -3
  159. package/dist/commands/{chunk-ZHZSZNE2.js → chunk-HATKF6VX.js} +2 -2
  160. package/dist/commands/{chunk-ELWNRE6E.js → chunk-HH3CVIFU.js} +5 -5
  161. package/dist/commands/{chunk-7GMTJDO2.js → chunk-HHMMGDMP.js} +6 -6
  162. package/dist/commands/{chunk-VD5674LW.js → chunk-HI5WPM6C.js} +2 -2
  163. package/dist/commands/{chunk-JUUBDYFZ.js → chunk-HQSWPRUF.js} +4 -4
  164. package/dist/commands/{chunk-ZAJD6T6E.js → chunk-HVCQYZVD.js} +2 -2
  165. package/dist/commands/chunk-HWEZRNPL.js +66 -0
  166. package/dist/commands/{chunk-J6GIVMXI.js → chunk-HX3FFIO5.js} +18 -3
  167. package/dist/commands/{chunk-GU5ML3Y3.js → chunk-HXDTA5VU.js} +13 -68
  168. package/dist/commands/{chunk-BNXE3NVB.js → chunk-I2KCGKJI.js} +1 -1
  169. package/dist/commands/{chunk-LC7SBONO.js → chunk-IAD4WLLI.js} +1 -1
  170. package/dist/commands/{chunk-WWC5L3AO.js → chunk-IB5TT73I.js} +2 -2
  171. package/dist/commands/{chunk-HOSZITJM.js → chunk-IBAYXCMU.js} +2 -2
  172. package/dist/commands/{chunk-UTBVTCQN.js → chunk-IF3EIFK4.js} +267 -153
  173. package/dist/commands/chunk-IGDJNXX2.js +49 -0
  174. package/dist/commands/{chunk-OJ4LGBVD.js → chunk-ILIITIMQ.js} +3 -3
  175. package/dist/commands/{chunk-CUR2WNYB.js → chunk-IRGDMSTI.js} +3 -3
  176. package/dist/commands/{chunk-PZTWQYRI.js → chunk-IYJEBWW5.js} +3 -3
  177. package/dist/commands/{chunk-A3D2XHOJ.js → chunk-J22PSIXR.js} +40 -9
  178. package/dist/commands/{chunk-O27H6NN6.js → chunk-J66YBAAM.js} +3 -5
  179. package/dist/commands/{chunk-P6RGQXHI.js → chunk-J6WKZRV2.js} +2 -2
  180. package/dist/commands/{chunk-NFEBQED3.js → chunk-J7IO3AYH.js} +2 -2
  181. package/dist/commands/{chunk-T57W3UWK.js → chunk-JAKC2BHX.js} +1 -1
  182. package/dist/commands/{chunk-3EO2XN3A.js → chunk-JCAQ7B6J.js} +4 -4
  183. package/dist/commands/{chunk-QQZOQ7AM.js → chunk-JFLFGLE4.js} +1 -1
  184. package/dist/commands/{chunk-ZDSDPKCD.js → chunk-JIGBNCDR.js} +1 -1
  185. package/dist/commands/{chunk-Q5N2J2UF.js → chunk-JJHWTFWQ.js} +5 -7
  186. package/dist/commands/{chunk-EI6JG5DF.js → chunk-JKOGWGQM.js} +1 -1
  187. package/dist/commands/{chunk-RK4HE5NW.js → chunk-JM6EVOFN.js} +4 -4
  188. package/dist/commands/{chunk-EBNIX2TC.js → chunk-JV24VP2O.js} +1 -1
  189. package/dist/commands/{chunk-BCK5LW4F.js → chunk-JVKXJ763.js} +3 -3
  190. package/dist/commands/{chunk-D5TAR6TV.js → chunk-JZHY7D6D.js} +1 -1
  191. package/dist/commands/{chunk-CRNPPKP2.js → chunk-JZK33TA5.js} +1 -1
  192. package/dist/commands/{chunk-UOAG2XQT.js → chunk-K275REYP.js} +3 -3
  193. package/dist/commands/{chunk-HESMKHEB.js → chunk-K4G3HOKS.js} +2 -2
  194. package/dist/commands/{chunk-L6XN3EXI.js → chunk-K64EIHD2.js} +1 -1
  195. package/dist/commands/{chunk-RINVPTA2.js → chunk-KCFOP5RI.js} +28 -28
  196. package/dist/commands/{chunk-O26Y2FOJ.js → chunk-KGE4AS2Y.js} +1 -1
  197. package/dist/commands/{chunk-EWA72KO7.js → chunk-KK2SL42W.js} +2 -2
  198. package/dist/commands/{chunk-MMXZKLDU.js → chunk-KK7TEL5G.js} +10 -4
  199. package/dist/commands/{chunk-UEURNXE5.js → chunk-KKIMVXAP.js} +2 -2
  200. package/dist/commands/{chunk-MAGJFH5T.js → chunk-KODXWMBX.js} +6 -6
  201. package/dist/commands/{chunk-D4HNS43Q.js → chunk-KPSKWTOS.js} +17 -17
  202. package/dist/commands/{chunk-VFJYOAOQ.js → chunk-KTV2HNWB.js} +2 -2
  203. package/dist/commands/{chunk-OWR2TCOY.js → chunk-KWYQR5MK.js} +5 -5
  204. package/dist/commands/{chunk-FNQW6NY7.js → chunk-KXK2A2HB.js} +6 -2
  205. package/dist/commands/{chunk-O5FVBIRI.js → chunk-KZ5BBBMO.js} +5 -5
  206. package/dist/commands/{chunk-JUJFIATR.js → chunk-KZ7HD37E.js} +6 -6
  207. package/dist/commands/{chunk-2YCKPX3A.js → chunk-KZZWPUJW.js} +1 -1
  208. package/dist/commands/{chunk-MYNM3YMR.js → chunk-L7DAL54N.js} +3 -3
  209. package/dist/commands/{chunk-NOXLKIPR.js → chunk-LAR76BFA.js} +1 -1
  210. package/dist/commands/{chunk-ZA3W73PF.js → chunk-LB557AHJ.js} +3 -3
  211. package/dist/commands/{chunk-LYEKT3IN.js → chunk-LEB2VP7F.js} +1 -1
  212. package/dist/commands/{chunk-WQJ7O3C3.js → chunk-LJXKVLYI.js} +1 -1
  213. package/dist/commands/{chunk-CHX4QTP4.js → chunk-LJZERYLG.js} +1 -1
  214. package/dist/commands/{chunk-PF22VUWB.js → chunk-LOOFYHUM.js} +76 -26
  215. package/dist/commands/{chunk-HIPO6HUG.js → chunk-LPSULLNK.js} +1 -1
  216. package/dist/commands/{chunk-G47ZNQVG.js → chunk-LR22UK5W.js} +1 -1
  217. package/dist/commands/{chunk-SV4FHQE7.js → chunk-LT7QSHR4.js} +14 -14
  218. package/dist/commands/{chunk-HIB5G2X6.js → chunk-LUXWDMKI.js} +7 -7
  219. package/dist/commands/{chunk-XH6BGVVP.js → chunk-LX7TIEMI.js} +9 -36
  220. package/dist/commands/{chunk-OGNTJ5JB.js → chunk-LYO6TX5L.js} +1 -1
  221. package/dist/commands/{chunk-JLREFWJ4.js → chunk-LZ5QXE5N.js} +6 -6
  222. package/dist/commands/{chunk-5WIZR5SC.js → chunk-M4UV3BEV.js} +11 -11
  223. package/dist/commands/{chunk-LNBUIOK6.js → chunk-M6JDU5EK.js} +4 -4
  224. package/dist/commands/{chunk-VZSJCFRT.js → chunk-MFBNNTBM.js} +4 -4
  225. package/dist/commands/{chunk-KHWTJ4F7.js → chunk-MI2OS6TL.js} +3 -3
  226. package/dist/commands/{chunk-VZCQZFPH.js → chunk-MLW4S35K.js} +19 -8
  227. package/dist/commands/{chunk-RIUPRMLW.js → chunk-MN425CU6.js} +1 -1
  228. package/dist/commands/{chunk-7W3D3WRW.js → chunk-MOIOSCZM.js} +2 -2
  229. package/dist/commands/{chunk-3BNNMJOT.js → chunk-MRORPFSO.js} +20 -320
  230. package/dist/commands/{chunk-LA5WTOAM.js → chunk-MUGTOJUL.js} +12 -12
  231. package/dist/commands/{chunk-L6LU2633.js → chunk-MVHPRYHE.js} +1 -1
  232. package/dist/commands/{chunk-EKCKCX5S.js → chunk-MWO6FOSZ.js} +123 -21
  233. package/dist/commands/{chunk-AVUGMOHZ.js → chunk-N7QTMTST.js} +2 -2
  234. package/dist/commands/{chunk-LMSS4ARB.js → chunk-NDBX7LSS.js} +1 -1
  235. package/dist/commands/{chunk-BEE7OAQ5.js → chunk-NDWZTWXV.js} +21 -2
  236. package/dist/commands/{chunk-6TESOL3L.js → chunk-NEGJ77RV.js} +7 -7
  237. package/dist/commands/{chunk-LCEJXF7A.js → chunk-NEGRE5VW.js} +4 -4
  238. package/dist/commands/{chunk-IXX4SXIP.js → chunk-NFPD2P3V.js} +1 -1
  239. package/dist/commands/chunk-NHIW7JE6.js +335 -0
  240. package/dist/commands/{chunk-CJSFC5YI.js → chunk-NILSN7A4.js} +7 -7
  241. package/dist/commands/{chunk-W4J6YTFE.js → chunk-NOLFSPOB.js} +2 -2
  242. package/dist/commands/chunk-NT67QTZO.js +65 -0
  243. package/dist/commands/{chunk-NJT5L6IC.js → chunk-NU7W6QGT.js} +33 -4
  244. package/dist/commands/chunk-NUR4FQHM.js +21 -0
  245. package/dist/commands/{chunk-OKKQI4ZG.js → chunk-OAAVY2JK.js} +1 -1
  246. package/dist/commands/chunk-OF4BY4N7.js +32 -0
  247. package/dist/commands/{chunk-W47I2KDY.js → chunk-OGS2DK7I.js} +3 -3
  248. package/dist/commands/{chunk-MS6Q3Z7V.js → chunk-OIPV3PWW.js} +6 -6
  249. package/dist/commands/{chunk-T33QDAWD.js → chunk-OIX2363L.js} +1 -1
  250. package/dist/commands/{chunk-GPMSYXYO.js → chunk-OJ65BZBV.js} +283 -15
  251. package/dist/commands/{chunk-34LAULSC.js → chunk-OKZWEVR4.js} +3 -3
  252. package/dist/commands/{chunk-2CXAVVST.js → chunk-OL6IF4JC.js} +1 -1
  253. package/dist/commands/{chunk-6JVNRY5A.js → chunk-OMPRILFH.js} +1 -1
  254. package/dist/commands/{chunk-VGHSZLYQ.js → chunk-OOWGH2RG.js} +1 -1
  255. package/dist/commands/{chunk-ERGZPWKP.js → chunk-OP2RFVLS.js} +1 -1
  256. package/dist/commands/{chunk-UU6GCJGM.js → chunk-ORKVN2LO.js} +2 -2
  257. package/dist/commands/{chunk-RHII5XI6.js → chunk-OSBWXZJ4.js} +24 -24
  258. package/dist/commands/{chunk-D3SHCUBC.js → chunk-OVWPZDWP.js} +2 -2
  259. package/dist/commands/{chunk-Z4HYBFZD.js → chunk-OWYK2BEJ.js} +108 -46
  260. package/dist/commands/{chunk-P4O67FP5.js → chunk-OX3VQLV2.js} +6 -6
  261. package/dist/commands/{chunk-L6TU7FC2.js → chunk-OZJP77UM.js} +4 -4
  262. package/dist/commands/{chunk-SNO7CY2B.js → chunk-P3H3DKTE.js} +2 -2
  263. package/dist/commands/{chunk-2OIX4JLA.js → chunk-P5SOYWH2.js} +3 -3
  264. package/dist/commands/{chunk-M4PEC7YW.js → chunk-PHLOTUB7.js} +54 -37
  265. package/dist/commands/{chunk-73KBUQKI.js → chunk-PTNQCCIB.js} +2 -2
  266. package/dist/commands/{chunk-4P2LCVGO.js → chunk-PTZEFQUX.js} +8 -8
  267. package/dist/commands/{chunk-DJVMC3U2.js → chunk-Q426ZSZ4.js} +1 -1
  268. package/dist/commands/{chunk-US6X7JXC.js → chunk-Q7EEIOAD.js} +4 -4
  269. package/dist/commands/{chunk-LE7TFPMU.js → chunk-QABRNGQV.js} +2 -2
  270. package/dist/commands/{chunk-NGKB632X.js → chunk-QDFVVRQP.js} +3 -3
  271. package/dist/commands/{chunk-36M2UV6C.js → chunk-QGATHT4S.js} +38 -4
  272. package/dist/commands/{chunk-DIB2Z2OS.js → chunk-QJRVDE7T.js} +1 -1
  273. package/dist/commands/{chunk-KUJQWO6M.js → chunk-QKTTKAXM.js} +2 -2
  274. package/dist/commands/{chunk-DXZW4V7J.js → chunk-QMDKDQKW.js} +3 -3
  275. package/dist/commands/{chunk-VW5SGE7A.js → chunk-QOSC5RKD.js} +1 -1
  276. package/dist/commands/{chunk-ENLWXAHD.js → chunk-QV5FKMOU.js} +1 -1
  277. package/dist/commands/{chunk-32SNWQJP.js → chunk-R2THGPI3.js} +2 -2
  278. package/dist/commands/{chunk-RVHBWSIG.js → chunk-R54Z2Z3X.js} +2 -2
  279. package/dist/commands/{chunk-CJAA5GAF.js → chunk-RG53UFNW.js} +15 -15
  280. package/dist/commands/{chunk-HJKZDDDI.js → chunk-RHKCWJQX.js} +1 -1
  281. package/dist/commands/{chunk-RPDWFUQO.js → chunk-RKIAX4DZ.js} +36 -84
  282. package/dist/commands/{chunk-LE2T3FGJ.js → chunk-RLBFEHHC.js} +2 -4
  283. package/dist/commands/{chunk-5GBZ43UA.js → chunk-RMDLFLPE.js} +1 -1
  284. package/dist/commands/{chunk-U2UH4VM4.js → chunk-RN2YDNLF.js} +2 -2
  285. package/dist/commands/{chunk-GQHUFNXN.js → chunk-RRAIRS2T.js} +1 -1
  286. package/dist/commands/{chunk-DRCTDVI2.js → chunk-RUQY5TS3.js} +3 -3
  287. package/dist/commands/{chunk-WGULS5DA.js → chunk-RW64VHEB.js} +1 -0
  288. package/dist/commands/{chunk-4G7NKNAZ.js → chunk-RXYMJPJB.js} +3 -3
  289. package/dist/commands/{chunk-B33BTNB4.js → chunk-S4M6UWR2.js} +21 -5
  290. package/dist/commands/{chunk-4Q4FXBUQ.js → chunk-SASX3W2M.js} +2 -2
  291. package/dist/commands/{chunk-TIXJY22D.js → chunk-SJ2ZN575.js} +5 -5
  292. package/dist/commands/{chunk-NSZTSCBW.js → chunk-SP7DKYGU.js} +13 -13
  293. package/dist/commands/{chunk-T3FD3Q73.js → chunk-SRG6PKVS.js} +1 -1
  294. package/dist/commands/{chunk-QA22PBCJ.js → chunk-SSL6A3Y4.js} +3 -3
  295. package/dist/commands/{chunk-4BEIYKI2.js → chunk-SV4FZR24.js} +2 -0
  296. package/dist/commands/{chunk-HZSQI6TD.js → chunk-SVTS7ACS.js} +2 -2
  297. package/dist/commands/{chunk-F7XLEK55.js → chunk-SVV4U5AR.js} +1 -1
  298. package/dist/commands/{chunk-RRQFITJE.js → chunk-SXJM4DZ5.js} +1 -1
  299. package/dist/commands/{chunk-OIDMJASD.js → chunk-SYB3M632.js} +1 -1
  300. package/dist/commands/{chunk-UJOZ2MGX.js → chunk-SYOXIKB7.js} +6 -6
  301. package/dist/commands/{chunk-5SB37YDW.js → chunk-SZG5HDNP.js} +3 -3
  302. package/dist/commands/{chunk-R2CF6VZE.js → chunk-T4F33UKZ.js} +4 -4
  303. package/dist/commands/{chunk-ESQEEL4O.js → chunk-TAEGXID2.js} +2 -2
  304. package/dist/commands/chunk-TEPYEUYG.js +585 -0
  305. package/dist/commands/{chunk-LUMCYDGE.js → chunk-TFLHYC2F.js} +2 -2
  306. package/dist/commands/{chunk-V5OIPYA6.js → chunk-TJKM56WJ.js} +4 -4
  307. package/dist/commands/{chunk-CYQ3ZF7R.js → chunk-TLAB552K.js} +86 -13
  308. package/dist/commands/{chunk-ST32OGPY.js → chunk-TP6L4W3W.js} +5 -5
  309. package/dist/commands/{chunk-C26LKDBE.js → chunk-TR7WWYD5.js} +1 -1
  310. package/dist/commands/{chunk-PWYXY46Y.js → chunk-TYNH2R66.js} +15 -15
  311. package/dist/commands/{chunk-AZUE65NT.js → chunk-U5P6G3UV.js} +2 -2
  312. package/dist/commands/{chunk-REPANBLS.js → chunk-U7Y6RKLK.js} +1 -1
  313. package/dist/commands/{chunk-55I7OYHI.js → chunk-UIMMWH7U.js} +1 -1
  314. package/dist/commands/{chunk-72J2G2E7.js → chunk-UKBBWMLE.js} +20 -20
  315. package/dist/commands/{chunk-VTLL6CKO.js → chunk-UNMSZGSG.js} +14 -14
  316. package/dist/commands/chunk-UOVUUVDK.js +18 -0
  317. package/dist/commands/{chunk-JNWHX25C.js → chunk-URDT2O2K.js} +1 -1
  318. package/dist/commands/{chunk-FGZQSSGH.js → chunk-UREXZJDB.js} +1 -1
  319. package/dist/commands/{chunk-O4WBADCX.js → chunk-UTHUX7VU.js} +3 -3
  320. package/dist/commands/{chunk-PDDKRHHS.js → chunk-V5OUZFWK.js} +3 -3
  321. package/dist/commands/{chunk-N4O5I55P.js → chunk-VCPGFBMN.js} +8 -8
  322. package/dist/commands/{chunk-WN7NK3NY.js → chunk-VGPIQNDB.js} +1 -1
  323. package/dist/commands/{chunk-HOGFJHBT.js → chunk-VJS2MCLA.js} +1 -1
  324. package/dist/commands/{chunk-4YI4SLRJ.js → chunk-VK6D5CWA.js} +8 -8
  325. package/dist/commands/{chunk-4LWRCPS5.js → chunk-VOF3N4WO.js} +3 -3
  326. package/dist/commands/{chunk-AM44D7NF.js → chunk-VQRT32JB.js} +1 -1
  327. package/dist/commands/{chunk-AS3GWVAN.js → chunk-VQVPAVQ3.js} +1 -1
  328. package/dist/commands/{chunk-6VTJO5L2.js → chunk-VV4TQYGD.js} +3 -3
  329. package/dist/commands/{chunk-WIE7VUBE.js → chunk-W7DRUOF7.js} +5 -5
  330. package/dist/commands/{chunk-HH2KDLTP.js → chunk-WAEN2RTT.js} +2 -2
  331. package/dist/commands/{chunk-NKKH3PBE.js → chunk-WB4T3VY2.js} +18 -1
  332. package/dist/commands/{chunk-DNJC7X73.js → chunk-WCEUMOKK.js} +2 -2
  333. package/dist/commands/{chunk-BK6Q4VCA.js → chunk-WTH6NTXU.js} +4 -4
  334. package/dist/commands/{chunk-WG6GYBRJ.js → chunk-WWVYEHQT.js} +2 -1
  335. package/dist/commands/{chunk-P4CWLRT2.js → chunk-X3TNPALI.js} +1 -1
  336. package/dist/commands/{chunk-LZNYHWRO.js → chunk-XC6GG5JR.js} +3 -3
  337. package/dist/commands/{chunk-RI7EQYKL.js → chunk-XFWI6WHH.js} +2 -2
  338. package/dist/commands/{chunk-BY3POLIQ.js → chunk-XHGWMD3L.js} +7 -7
  339. package/dist/commands/{chunk-BPSJSHYD.js → chunk-XI2ABCRX.js} +2 -2
  340. package/dist/commands/{chunk-TS4ZK46L.js → chunk-XKSUBUIH.js} +5 -5
  341. package/dist/commands/{chunk-K7GL3BGI.js → chunk-XPBF5DG3.js} +4 -4
  342. package/dist/commands/{chunk-6SKMZGER.js → chunk-XUMYPESL.js} +20 -8
  343. package/dist/commands/{chunk-QS5USD4T.js → chunk-XXC32PVL.js} +5 -4
  344. package/dist/commands/{chunk-ORSI7Y55.js → chunk-XXN2EZBY.js} +1 -1
  345. package/dist/commands/{chunk-IZVM2TTH.js → chunk-XZQWEVR3.js} +2 -2
  346. package/dist/commands/{chunk-E3CXOVPQ.js → chunk-Y27PTXXI.js} +1 -1
  347. package/dist/commands/{chunk-337QQM4C.js → chunk-Y4EBUI6M.js} +106 -5
  348. package/dist/commands/{chunk-WRX3MINT.js → chunk-YAU3LYNF.js} +1 -1
  349. package/dist/commands/{chunk-JB7R3A4A.js → chunk-YDURQICF.js} +4 -4
  350. package/dist/commands/{chunk-RX5JSPPH.js → chunk-YGFOGA7C.js} +11 -11
  351. package/dist/commands/{chunk-S6SXMBF2.js → chunk-YHJ2AJMA.js} +2 -2
  352. package/dist/commands/{chunk-MVPUQLN5.js → chunk-YM77CF4D.js} +4 -4
  353. package/dist/commands/{chunk-ZYIMQHCB.js → chunk-YNPRJCEO.js} +6 -6
  354. package/dist/commands/{chunk-3UKJFWKS.js → chunk-YTBQAD5W.js} +3 -3
  355. package/dist/commands/{chunk-WW3TX742.js → chunk-Z3WGHIVB.js} +3 -3
  356. package/dist/commands/{chunk-KIVOZY2J.js → chunk-ZBZ5DDCH.js} +66 -64
  357. package/dist/commands/{chunk-TAPDXK34.js → chunk-ZLRUHSOP.js} +1 -1
  358. package/dist/commands/{chunk-XYAK53TK.js → chunk-ZNR75OXP.js} +2 -1
  359. package/dist/commands/{chunk-CADFBQJJ.js → chunk-ZSOR4ISJ.js} +4 -4
  360. package/dist/commands/{chunk-6NRTLH6I.js → chunk-ZYFHYQA7.js} +1 -1
  361. package/dist/commands/{chunk-Q7TV3OV6.js → chunk-ZZFFSQF4.js} +4 -4
  362. package/dist/commands/{chunk-PDAY76AN.js → chunk-ZZULXNC2.js} +1 -1
  363. package/dist/commands/{chunk-5Y7QQYTU.js → chunk-ZZXO6TFH.js} +1 -1
  364. package/dist/commands/code-symbol-cli.js +4 -4
  365. package/dist/commands/codex-hook-adapter.js +99 -100
  366. package/dist/commands/command-derive.js +10 -10
  367. package/dist/commands/cost-audit-main.js +94 -92
  368. package/dist/commands/cspell-cached.js +24 -23
  369. package/dist/commands/defect-origin-main.js +19 -18
  370. package/dist/commands/defect-report-main.js +15 -14
  371. package/dist/commands/disposition-cli.js +67 -64
  372. package/dist/commands/doctor.js +3 -3
  373. package/dist/commands/document-read-cli.js +89 -9
  374. package/dist/commands/document-section-main.js +89 -9
  375. package/dist/commands/edit-files-cli.js +1 -1
  376. package/dist/commands/effect-audit-cli.js +20 -19
  377. package/dist/commands/epic-audit-main.js +55 -53
  378. package/dist/commands/epic-bundle-main.js +87 -85
  379. package/dist/commands/epic-check.js +16 -15
  380. package/dist/commands/epic-main.js +93 -91
  381. package/dist/commands/epic-next-main.js +51 -49
  382. package/dist/commands/format-edited-cli.js +30 -32
  383. package/dist/commands/format.js +11 -10
  384. package/dist/commands/fresh-machine-cli.js +6 -6
  385. package/dist/commands/git-followup-workflow.js +137 -122
  386. package/dist/commands/git-workflow.js +28 -27
  387. package/dist/commands/github-release-cli.js +26 -3
  388. package/dist/commands/hook-ledger-cli.js +74 -126
  389. package/dist/commands/init-main.js +20 -19
  390. package/dist/commands/inputs.json +1907 -1876
  391. package/dist/commands/issue-ack-cli.js +5 -5
  392. package/dist/commands/issue-already-done-cli.js +63 -58
  393. package/dist/commands/issue-body-cli.js +44 -42
  394. package/dist/commands/issue-cite-main.js +11 -10
  395. package/dist/commands/issue-comment-main.js +15 -11
  396. package/dist/commands/issue-consolidate-cli.js +31 -30
  397. package/dist/commands/issue-file-main.js +114 -110
  398. package/dist/commands/issue-fold-existing-cli.js +88 -86
  399. package/dist/commands/issue-fold-main.js +26 -25
  400. package/dist/commands/issue-lint-main.js +38 -37
  401. package/dist/commands/issue-measured-cli.js +66 -61
  402. package/dist/commands/issue-plan-cli.js +103 -101
  403. package/dist/commands/issue-premise-unmet-cli.js +66 -61
  404. package/dist/commands/issue-priority-cli.js +13 -12
  405. package/dist/commands/issue-read-main.js +18 -17
  406. package/dist/commands/issue-release-class-cli.js +12 -11
  407. package/dist/commands/issue-release-main.js +13 -12
  408. package/dist/commands/issue-scout-main.js +89 -87
  409. package/dist/commands/issue-spill-main.js +114 -110
  410. package/dist/commands/issue-state-main.js +16 -15
  411. package/dist/commands/issue-tick-cli.js +14 -13
  412. package/dist/commands/josh-completion.js +10 -10
  413. package/dist/commands/lane-adopt-cli.js +19 -19
  414. package/dist/commands/lane-breakdown-cli.js +154 -126
  415. package/dist/commands/lane-cli.js +131 -125
  416. package/dist/commands/lane-launch-main.js +17 -17
  417. package/dist/commands/lane-limit-cli.js +81 -79
  418. package/dist/commands/lane-measure-cli.js +246 -130
  419. package/dist/commands/lane-pause-cli.js +15 -15
  420. package/dist/commands/lane-plan-cli.js +108 -101
  421. package/dist/commands/lane-resolve-cli.js +20 -19
  422. package/dist/commands/lane-restart-cli.js +124 -118
  423. package/dist/commands/lane-why-cli.js +85 -82
  424. package/dist/commands/lane-withdraw-cli.js +49 -48
  425. package/dist/commands/latest-corepack.js +3 -3
  426. package/dist/commands/latest-if-required-cli.js +9 -9
  427. package/dist/commands/latest-scope-main.js +5 -5
  428. package/dist/commands/latest-update.js +3 -3
  429. package/dist/commands/lines-command.js +3 -3
  430. package/dist/commands/lint-parallel-main.js +32 -31
  431. package/dist/commands/lint-related.js +79 -60
  432. package/dist/commands/lint-rule.js +32 -31
  433. package/dist/commands/lockfile-policy.js +11 -11
  434. package/dist/commands/main-merge-main.js +5 -5
  435. package/dist/commands/main-sync-main.js +5 -5
  436. package/dist/commands/managed-config-scope-cli.js +3 -3
  437. package/dist/commands/measure-rerun-cli.js +10 -10
  438. package/dist/commands/metrics-command.js +91 -58
  439. package/dist/commands/observation-record-cli.js +3 -3
  440. package/dist/commands/observations-flush-cli.js +27 -25
  441. package/dist/commands/oracle-list-cli.js +2 -2
  442. package/dist/commands/overrides-check.js +4 -4
  443. package/dist/commands/package-scout-cli.js +67 -26
  444. package/dist/commands/plan-consumers-main.js +4 -4
  445. package/dist/commands/plan-scaffold-cli.js +132 -91
  446. package/dist/commands/pr-classification-main.js +3 -3
  447. package/dist/commands/pre-commit-lint.js +11 -12
  448. package/dist/commands/pre-commit-type-check.js +25 -24
  449. package/dist/commands/pre-push-unit.js +33 -33
  450. package/dist/commands/pretool-guard-cli.js +90 -91
  451. package/dist/commands/project-profile-cli.js +5 -4
  452. package/dist/commands/propagate.js +15 -15
  453. package/dist/commands/prose-stale-cli.js +20 -19
  454. package/dist/commands/publishable-range-check.js +4 -4
  455. package/dist/commands/read-files-cli.js +2 -2
  456. package/dist/commands/read-set-cli.js +61 -24
  457. package/dist/commands/refactor-scan-cli.js +6 -6
  458. package/dist/commands/release-cli.js +64 -36
  459. package/dist/commands/release-scope-main.js +19 -18
  460. package/dist/commands/rename-cli.js +27 -29
  461. package/dist/commands/reserved-run.js +3 -3
  462. package/dist/commands/retrospective-cli.js +104 -102
  463. package/dist/commands/review-attest-cli.js +6 -6
  464. package/dist/commands/review-brief-main.js +127 -109
  465. package/dist/commands/review-findings-cli.js +2 -2
  466. package/dist/commands/review-pair-cli.js +110 -84
  467. package/dist/commands/review-record-main.js +108 -83
  468. package/dist/commands/review-round2-cli.js +46 -45
  469. package/dist/commands/review-stops-cli.js +16 -16
  470. package/dist/commands/review-submit-cli.js +127 -109
  471. package/dist/commands/rule-list.js +58 -60
  472. package/dist/commands/rule-value-cli.js +226 -74
  473. package/dist/commands/run-add-cli.js +28 -27
  474. package/dist/commands/run-board-main.js +136 -132
  475. package/dist/commands/run-carry-cli.js +127 -124
  476. package/dist/commands/run-chain-cli.js +116 -93
  477. package/dist/commands/run-cut-cli.js +124 -119
  478. package/dist/commands/run-ending-cli.js +19 -22
  479. package/dist/commands/run-entry-cli.js +183 -180
  480. package/dist/commands/run-event-cli.js +5 -5
  481. package/dist/commands/run-handoff-cli.js +52 -28
  482. package/dist/commands/run-handoff-lanes-cli.js +15 -15
  483. package/dist/commands/run-hold-main.js +64 -62
  484. package/dist/commands/run-liveness-cli.js +11 -11
  485. package/dist/commands/run-merge-main.js +119 -116
  486. package/dist/commands/run-next-cli.js +87 -86
  487. package/dist/commands/run-park-cli.js +111 -92
  488. package/dist/commands/run-pause-cli.js +147 -133
  489. package/dist/commands/run-pickup-cli.js +13 -13
  490. package/dist/commands/run-prep-main.js +83 -82
  491. package/dist/commands/run-prime-cli.js +107 -87
  492. package/dist/commands/run-progress-main.js +123 -107
  493. package/dist/commands/run-report-cli.js +25 -24
  494. package/dist/commands/run-review-cli.js +168 -149
  495. package/dist/commands/run-ship-cli.js +208 -203
  496. package/dist/commands/run-ship-evidence-cli.js +38 -37
  497. package/dist/commands/run-ship-wait-main.js +40 -37
  498. package/dist/commands/run-split-cli.js +127 -125
  499. package/dist/commands/run-stale-main.js +36 -35
  500. package/dist/commands/run-status-cli.js +16 -15
  501. package/dist/commands/run-step-cli.js +173 -164
  502. package/dist/commands/run-tail-cli.js +1 -1
  503. package/dist/commands/run-tidy-main.js +30 -29
  504. package/dist/commands/run-wake-main.js +137 -119
  505. package/dist/commands/run-watcher-guard-cli.js +30 -29
  506. package/dist/commands/secretlint-scan.js +2 -2
  507. package/dist/commands/selfcheck-cli.js +27 -26
  508. package/dist/commands/session-language-main.js +48 -28
  509. package/dist/commands/sonar-hotspots-cli.js +3 -3
  510. package/dist/commands/split-assess-cli.js +24 -23
  511. package/dist/commands/split-child-recover-cli.js +13 -12
  512. package/dist/commands/start.js +37 -35
  513. package/dist/commands/stash-pop-main.js +3 -3
  514. package/dist/commands/stash-push-main.js +3 -3
  515. package/dist/commands/stop-guard.js +144 -143
  516. package/dist/commands/sync-main.js +11 -10
  517. package/dist/commands/telegram-test-main.js +5 -5
  518. package/dist/commands/test-declared.js +9 -8
  519. package/dist/commands/test-e2e-guard.js +23 -22
  520. package/dist/commands/test-pinned-main.js +26 -25
  521. package/dist/commands/test-reach-cli.js +15 -14
  522. package/dist/commands/test-red-main.js +5 -5
  523. package/dist/commands/{test-related-ZT2AO62I.js → test-related-ZCNC46MS.js} +31 -31
  524. package/dist/commands/test-related-main.js +51 -50
  525. package/dist/commands/test-unit-guard-main.js +9 -8
  526. package/dist/commands/time-cli.js +24 -27
  527. package/dist/commands/time-density-cli.js +8 -9
  528. package/dist/commands/tree-status-cli.js +4 -4
  529. package/dist/commands/type-check-command.js +8 -7
  530. package/dist/commands/ui-shot-cli.js +4 -4
  531. package/dist/commands/uninstall.js +20 -19
  532. package/dist/commands/unused-members-cli.js +9 -8
  533. package/dist/commands/upstream-interrupt-main.js +115 -111
  534. package/dist/commands/verification-gate.js +46 -46
  535. package/dist/commands/version-check.js +5 -5
  536. package/dist/hooks/{chunk-LWD43Z3C.js → chunk-5CUXGQT6.js} +1667 -107
  537. package/dist/hooks/{chunk-4YXV2REH.js → chunk-5R5YFQR5.js} +8 -8
  538. package/dist/hooks/{chunk-LKQBEKBI.js → chunk-6RLY27FT.js} +8 -8
  539. package/dist/hooks/{chunk-CICKRHTB.js → chunk-AO4TOV4V.js} +119 -2679
  540. package/dist/hooks/{chunk-NUPVO7RI.js → chunk-G5WSPYJ6.js} +4296 -1687
  541. package/dist/hooks/{chunk-UU4PTPEZ.js → chunk-HHIVWGHX.js} +250 -125
  542. package/dist/hooks/{chunk-P7BPAU26.js → chunk-IURJANNZ.js} +2 -2
  543. package/dist/hooks/{chunk-6RR6JZSB.js → chunk-OV22V63P.js} +357 -1744
  544. package/dist/hooks/{chunk-RQXECHAS.js → chunk-SXABK6UV.js} +57 -45
  545. package/dist/hooks/codex-hook-adapter.js +11 -11
  546. package/dist/hooks/daemon.js +1053 -690
  547. package/dist/hooks/format-edited.js +5 -5
  548. package/dist/hooks/inputs.json +551 -536
  549. package/dist/hooks/pretool-guard.js +7 -7
  550. package/dist/hooks/session-lang.js +292 -15
  551. package/dist/hooks/stop-guard.js +225 -48
  552. package/dist/inputs.json +65 -65
  553. package/dist/josh.js +73 -19
  554. package/dist/self-sync-guard/index.js +18 -1
  555. package/dist/version/index.js +18 -1
  556. package/package.json +3 -3
  557. package/pnpm-workspace.yaml +5 -13
  558. package/prompts/collaboration-workflow/issue-template.en.md +56 -52
  559. package/scripts/agent/agent-argv.ts +20 -6
  560. package/scripts/agent/agent-phase-profile.ts +89 -0
  561. package/scripts/agent/agent-role-profile.ts +3 -71
  562. package/scripts/agent/agent-ship-cap.ts +44 -0
  563. package/scripts/agent/agent-worker-profile.ts +154 -0
  564. package/scripts/agent/claude-agent-argv.ts +1 -1
  565. package/scripts/agent/lane-instructions.ts +29 -3
  566. package/scripts/auto-ok/auto-ok-judge-cli.ts +3 -0
  567. package/scripts/auto-ok/auto-ok-judge-write.ts +2 -1
  568. package/scripts/auto-ok/auto-ok-judge.ts +4 -2
  569. package/scripts/backlog/backlog-drive-escalate.ts +115 -0
  570. package/scripts/backlog/backlog-drive-stalled-retry.ts +48 -10
  571. package/scripts/document/document-scan.ts +35 -1
  572. package/scripts/gh/git-pr-checks-failed.ts +24 -0
  573. package/scripts/hooks/implementation-shell-deny-expansion.ts +20 -0
  574. package/scripts/hooks/implementation-shell-deny-git.ts +128 -0
  575. package/scripts/hooks/implementation-shell-deny.ts +14 -138
  576. package/scripts/hooks/implementation-shell.ts +28 -5
  577. package/scripts/hooks/step-zero-notice.ts +9 -6
  578. package/scripts/hooks/stop-actions.ts +4 -2
  579. package/scripts/init/init-logic-workspace.ts +1 -1
  580. package/scripts/issue/issue-auto-ok.ts +43 -4
  581. package/scripts/issue/issue-body-keys.ts +4 -0
  582. package/scripts/issue/issue-comment-cli.ts +15 -2
  583. package/scripts/issue/issue-evidence-exit.ts +6 -2
  584. package/scripts/issue/issue-file-cli.ts +5 -1
  585. package/scripts/issue/issue-file-pass.ts +14 -7
  586. package/scripts/issue/issue-file-worker.ts +95 -0
  587. package/scripts/issue/issue-file.ts +1 -1
  588. package/scripts/issue/issue-outcome.ts +107 -0
  589. package/scripts/issue/issue-read.ts +12 -7
  590. package/scripts/issue/issue-watch-diff.ts +2 -1
  591. package/scripts/josh/josh-commands-ai.ts +2 -2
  592. package/scripts/josh/josh-commands-development.ts +21 -5
  593. package/scripts/josh/josh-commands-issue-write.ts +3 -2
  594. package/scripts/josh/josh-commands-lint.ts +1 -1
  595. package/scripts/josh/josh-commands-project.ts +7 -2
  596. package/scripts/josh/josh-commands-run.ts +10 -2
  597. package/scripts/josh/josh-commands-workflow.ts +5 -0
  598. package/scripts/lane/lane-breakdown-cli.ts +14 -4
  599. package/scripts/lane/lane-breakdown-text.ts +7 -0
  600. package/scripts/lane/lane-breakdown.ts +21 -1
  601. package/scripts/lane/lane-dispatch-prepare.ts +83 -0
  602. package/scripts/lane/lane-dispatch.ts +3 -53
  603. package/scripts/lane/lane-elapsed-time.ts +118 -0
  604. package/scripts/lane/lane-ledger-schema-ship.ts +4 -1
  605. package/scripts/lane/lane-net-time.ts +35 -7
  606. package/scripts/lane/lane-overrun.ts +1 -1
  607. package/scripts/lane/lane-plan-cli.ts +7 -3
  608. package/scripts/lane/lane-plan-estimate.ts +57 -0
  609. package/scripts/lane/lane-plan-size.ts +11 -20
  610. package/scripts/lane/lane-plan.ts +1 -0
  611. package/scripts/lane/lane-relaunch.ts +9 -4
  612. package/scripts/lane/lane-stage-budget.ts +6 -1
  613. package/scripts/lane/lane-stage-events.ts +103 -0
  614. package/scripts/lane/lane-stats-tables.ts +3 -0
  615. package/scripts/lane/lane-stop-check-stats.ts +117 -0
  616. package/scripts/lane/lane-stop-stats.ts +30 -6
  617. package/scripts/lane/lane-why-causes.ts +3 -11
  618. package/scripts/lane/openai-lane-supervisor-owner.ts +12 -0
  619. package/scripts/lane/openai-lane-supervisor.ts +36 -1
  620. package/scripts/lib/home-tilde.ts +24 -0
  621. package/scripts/lib/package-manifest.ts +27 -1
  622. package/scripts/observations/observation-ledger-archive.ts +180 -0
  623. package/scripts/observations/observation-ledger-home.ts +1 -0
  624. package/scripts/observations/observation-ledger.ts +5 -0
  625. package/scripts/observations/observations-flush-transaction.ts +358 -0
  626. package/scripts/observations/observations-flush.ts +72 -172
  627. package/scripts/plan/plan-scaffold-cli.ts +17 -6
  628. package/scripts/plan/plan-scaffold.ts +11 -0
  629. package/scripts/release/github-release-notes.ts +24 -0
  630. package/scripts/release/github-release-runs.ts +32 -6
  631. package/scripts/release/github-release.ts +10 -2
  632. package/scripts/release/release-progress.ts +22 -10
  633. package/scripts/release/release-publish-run.ts +39 -6
  634. package/scripts/repo/repository-labels.ts +23 -11
  635. package/scripts/review/review-comment-round.ts +10 -5
  636. package/scripts/rules/broad-investigation-shell.ts +2 -2
  637. package/scripts/rules/codex-prompt.ts +63 -0
  638. package/scripts/rules/direct-issue-comment.ts +62 -2
  639. package/scripts/rules/direct-issue-read.ts +55 -2
  640. package/scripts/rules/guard-remedy.ts +10 -4
  641. package/scripts/rules/issue-citation.ts +20 -9
  642. package/scripts/rules/last-prompt.ts +8 -4
  643. package/scripts/rules/rule-value-cli.ts +85 -4
  644. package/scripts/rules/rule-value-trend.ts +108 -0
  645. package/scripts/rules/shell-redirects.ts +19 -7
  646. package/scripts/rules/shell-segments.ts +145 -20
  647. package/scripts/rules/shell-tokens.ts +66 -0
  648. package/scripts/rules/standalone-gh-call.ts +63 -0
  649. package/scripts/rules/unasked-filing.ts +12 -4
  650. package/scripts/run/board/run-board-closed.ts +10 -1
  651. package/scripts/run/board/run-board-decision-read.ts +52 -12
  652. package/scripts/run/board/run-board-decision.ts +5 -0
  653. package/scripts/run/board/run-board-ending-reason.ts +21 -7
  654. package/scripts/run/board/run-board-github.ts +8 -1
  655. package/scripts/run/board/run-board-layout.ts +5 -3
  656. package/scripts/run/board/run-board-link.ts +2 -0
  657. package/scripts/run/board/run-board-operation.ts +6 -2
  658. package/scripts/run/board/run-board-pause-fixture.json +12 -0
  659. package/scripts/run/board/run-board-pause.ts +87 -0
  660. package/scripts/run/board/run-board-plan-shared.ts +2 -0
  661. package/scripts/run/board/run-board-render-condition.ts +10 -1
  662. package/scripts/run/board/run-board-render-title.ts +7 -0
  663. package/scripts/run/board/run-board-settle.ts +16 -2
  664. package/scripts/run/board/run-board-snapshot.ts +4 -0
  665. package/scripts/run/board/run-board-status.ts +11 -1
  666. package/scripts/run/cut/run-cut-cli.ts +2 -1
  667. package/scripts/run/park/run-park-cli.ts +13 -1
  668. package/scripts/run/park/run-park-escalate.ts +102 -0
  669. package/scripts/run/park/run-stalled.ts +29 -7
  670. package/scripts/run/review/run-review-early-push.ts +6 -6
  671. package/scripts/run/ship/run-ship-stop-cause.ts +12 -1
  672. package/scripts/split/split-assess.ts +14 -5
  673. package/scripts/test/test-related-touched.ts +21 -3
  674. package/scripts/test/test-related.ts +1 -1
  675. package/dist/commands/chunk-6WEVLIZE.js +0 -29
  676. package/dist/commands/chunk-E2ZCUKHT.js +0 -274
  677. package/dist/commands/chunk-NMLCPYBN.js +0 -134
  678. package/dist/commands/chunk-QEIO2ZNQ.js +0 -324
  679. package/dist/commands/chunk-QWX7EBC6.js +0 -112
  680. package/dist/commands/chunk-RQRLW4XK.js +0 -20
  681. package/dist/commands/chunk-UCQJDYE3.js +0 -21
  682. package/dist/commands/chunk-W4YH2DF3.js +0 -58
  683. package/dist/commands/{chunk-LRA3PXHS.js → chunk-ENKFCOVY.js} +3 -3
  684. 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 print_measured(cwd: string): void {
152
- const { table, candidates } = render_summaries(gather_summaries(cwd))
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 print_transcripts(argv, cwd)
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
- // Each `<` of a redirect operator is spaced out to the read mark and each `>` (the clobber `>|` whole)
8
- // to the write mark, so the word after the last mark of `<`, `>`, `>>`, `2>` or `&>` is the file it
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
- const WHITESPACE = /\s+/u
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 spaced.split(WHITESPACE).filter((word) => word !== '')
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 SEGMENT_SEPARATOR = /&&|\|\||;|\n/u
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`) does
24
- // not cut, nor does the `|` of the clobber redirect `>|`.
25
- const COMMAND_SEPARATOR = /&&|\|\||;|\n|(?<!>)\|&?|(?<![<>])&(?!>)/u
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 command.split(SEGMENT_SEPARATOR).map((segment) => segment.trim())
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 command.split(COMMAND_SEPARATOR).map((segment) => segment.trim())
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
- const cuts = [...plain.matchAll(COMMAND_SEPARATORS)].map((match) => ({
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
- return command.split(SEGMENT_PARTS)
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.search(SEGMENT_SEPARATOR)
204
+ const [cut] = cuts_of(plain, SEGMENT_OPERATORS)
80
205
 
81
- return (cut === -1 ? command : command.slice(0, cut)).trim()
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 }