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