@joshuafolkken/kit 1.3000.0 → 1.3044.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (691) 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/.claude/skills/workflow-commands/progress-watcher.md +10 -8
  4. package/dist/.inputs-verified.json +1 -1
  5. package/dist/commands/adopt.js +12 -12
  6. package/dist/commands/auto-ok-judge-cli.js +18 -14
  7. package/dist/commands/auto-ok-main.js +42 -40
  8. package/dist/commands/backlog-budget-main.js +3 -3
  9. package/dist/commands/backlog-drive-cli.js +276 -188
  10. package/dist/commands/backlog-next-main.js +77 -75
  11. package/dist/commands/backlog-offer-main.js +80 -78
  12. package/dist/commands/backlog-plan-cli.js +96 -97
  13. package/dist/commands/backlog-triage-cli.js +94 -92
  14. package/dist/commands/backlogrun-cli.js +212 -206
  15. package/dist/commands/behavior-cli.js +12 -13
  16. package/dist/commands/bump-version-main.js +2 -2
  17. package/dist/commands/bytes-command.js +61 -22
  18. package/dist/commands/check-related.js +61 -60
  19. package/dist/commands/{chunk-X7PN54LZ.js → chunk-22DVQCP6.js} +16 -6
  20. package/dist/commands/{chunk-UTBVTCQN.js → chunk-24OATKOF.js} +301 -168
  21. package/dist/commands/{chunk-7GHOFHUS.js → chunk-24ZDAWML.js} +3 -3
  22. package/dist/commands/{chunk-HBNB3TLG.js → chunk-2BB5ZR2F.js} +13 -7
  23. package/dist/commands/{chunk-F22G3VDB.js → chunk-2BC33QPY.js} +1 -1
  24. package/dist/commands/{chunk-72EW7AVI.js → chunk-2BJJUTZA.js} +2 -2
  25. package/dist/commands/{chunk-XDQOWUVT.js → chunk-2CXT6MBR.js} +4 -4
  26. package/dist/commands/{chunk-TVJE67O2.js → chunk-2EZTYLO4.js} +6 -6
  27. package/dist/commands/{chunk-JLYW7CP6.js → chunk-2PHOLX62.js} +1 -1
  28. package/dist/commands/{chunk-6EU5ZCDP.js → chunk-2QM72JCJ.js} +23 -87
  29. package/dist/commands/{chunk-EFHSCUFN.js → chunk-2VFPUPSG.js} +2 -2
  30. package/dist/commands/{chunk-ATRMETHT.js → chunk-2XAH3MHV.js} +1 -1
  31. package/dist/commands/{chunk-T2E724HN.js → chunk-34JJYCIY.js} +2 -2
  32. package/dist/commands/{chunk-REMKUFAC.js → chunk-34KZDKQJ.js} +1 -1
  33. package/dist/commands/{chunk-GK2KY4MO.js → chunk-352KLSFX.js} +3 -3
  34. package/dist/commands/{chunk-7S6VRZOH.js → chunk-3AEDZZNL.js} +5 -5
  35. package/dist/commands/{chunk-KVJDDECB.js → chunk-3B2HEFNO.js} +2 -2
  36. package/dist/commands/{chunk-HZBTXKT2.js → chunk-3Z425MM3.js} +2 -2
  37. package/dist/commands/{chunk-J3G2R64I.js → chunk-3ZOX4G4U.js} +3 -3
  38. package/dist/commands/{chunk-LRS2OS5J.js → chunk-452HWOJ7.js} +2 -2
  39. package/dist/commands/{chunk-HRT4KWP4.js → chunk-475EFIJV.js} +1 -1
  40. package/dist/commands/{chunk-4HBVHYNL.js → chunk-47UZB54M.js} +3 -3
  41. package/dist/commands/{chunk-H4LYG37R.js → chunk-4DN4XVPL.js} +6 -6
  42. package/dist/commands/{chunk-TMLNI3YW.js → chunk-4HERA2GY.js} +1 -1
  43. package/dist/commands/{chunk-W6V4DWC5.js → chunk-4JI35CVO.js} +1 -1
  44. package/dist/commands/{chunk-YT342DRV.js → chunk-4L4LNWZ7.js} +2 -2
  45. package/dist/commands/{chunk-ZZAH3YQP.js → chunk-4N32QKJZ.js} +6 -6
  46. package/dist/commands/{chunk-GDUK5YPO.js → chunk-4NRSFLG7.js} +12 -12
  47. package/dist/commands/{chunk-O5QZ2S6X.js → chunk-4OKRPAUT.js} +4 -4
  48. package/dist/commands/{chunk-QDFDB4CF.js → chunk-4Q64PG46.js} +13 -13
  49. package/dist/commands/{chunk-HO52D6JY.js → chunk-4UDTQVDD.js} +14 -14
  50. package/dist/commands/{chunk-HPVLI26Z.js → chunk-4WR2LEZL.js} +6 -6
  51. package/dist/commands/{chunk-DP7WIGQ4.js → chunk-4ZJOC6OK.js} +4 -4
  52. package/dist/commands/{chunk-WTRDWEUQ.js → chunk-4ZQM4I7R.js} +12 -12
  53. package/dist/commands/{chunk-OTZJXU2R.js → chunk-54X37JEJ.js} +8 -8
  54. package/dist/commands/{chunk-A5V7EWIX.js → chunk-56KW5EOK.js} +2 -2
  55. package/dist/commands/chunk-5CG3XU3O.js +74 -0
  56. package/dist/commands/{chunk-FC33R5UN.js → chunk-5ESZLHDZ.js} +13 -15
  57. package/dist/commands/{chunk-OVA7STGP.js → chunk-5FBRMARM.js} +9 -9
  58. package/dist/commands/{chunk-SK2LJBFS.js → chunk-5PCK53WP.js} +3 -3
  59. package/dist/commands/{chunk-6NV2F7QH.js → chunk-5RG4S66L.js} +1 -1
  60. package/dist/commands/{chunk-JOARHU3M.js → chunk-5UJGACVN.js} +1 -1
  61. package/dist/commands/{chunk-NKOET4FB.js → chunk-5Y7B7FDL.js} +2 -2
  62. package/dist/commands/{chunk-XMBRXCIE.js → chunk-5Z6E5ZUV.js} +4 -4
  63. package/dist/commands/{chunk-RZ4OKKPM.js → chunk-5ZNUH4LV.js} +2 -2
  64. package/dist/commands/{chunk-7CHCZBNF.js → chunk-6CFHLMKM.js} +4 -4
  65. package/dist/commands/{chunk-TXXYC7EV.js → chunk-6DDK5XWK.js} +1 -1
  66. package/dist/commands/{chunk-2TQXCH2K.js → chunk-6GQX752S.js} +3 -3
  67. package/dist/commands/{chunk-RY6ZDHKB.js → chunk-6MAZ55GF.js} +107 -84
  68. package/dist/commands/{chunk-SNFLV7VV.js → chunk-6RUWU2SB.js} +2 -2
  69. package/dist/commands/{chunk-D4SZK7H2.js → chunk-6TIVDEKG.js} +2 -2
  70. package/dist/commands/{chunk-RIQ75QWR.js → chunk-6UCWAFQY.js} +55 -43
  71. package/dist/commands/{chunk-4D5KWMFL.js → chunk-6YURRFRU.js} +19 -19
  72. package/dist/commands/{chunk-7MOZEEFJ.js → chunk-6YVURZAJ.js} +1 -1
  73. package/dist/commands/{chunk-73JOEKIC.js → chunk-6Z4YZG7P.js} +5 -5
  74. package/dist/commands/{chunk-NJ53AWJU.js → chunk-77BIN247.js} +9 -9
  75. package/dist/commands/{chunk-MZHOPRI6.js → chunk-7ABHNNY3.js} +7 -7
  76. package/dist/commands/{chunk-6WTVAL4D.js → chunk-7C7FOKJK.js} +1 -1
  77. package/dist/commands/{chunk-KVSSLDA3.js → chunk-7HAGC6SW.js} +5 -5
  78. package/dist/commands/{chunk-IG22Y5MA.js → chunk-7KKUFLH5.js} +1 -1
  79. package/dist/commands/{chunk-ZQ3CKRMP.js → chunk-7MJYLUF4.js} +2 -2
  80. package/dist/commands/{chunk-6UGFS3EU.js → chunk-7NHZCI5Y.js} +11 -11
  81. package/dist/commands/{chunk-FB3D7CX5.js → chunk-7OQ56DVW.js} +5 -7
  82. package/dist/commands/{chunk-EK327QOS.js → chunk-7VWPGTZO.js} +10 -10
  83. package/dist/commands/{chunk-WSOF74K4.js → chunk-7YZXS3AK.js} +3 -3
  84. package/dist/commands/{chunk-N6TYL3B2.js → chunk-AAUDI7WJ.js} +2 -2
  85. package/dist/commands/{chunk-3GF52L5F.js → chunk-AC26ZUG5.js} +12 -24
  86. package/dist/commands/{chunk-EK2Y6B4X.js → chunk-ACZ52JPI.js} +7 -7
  87. package/dist/commands/{chunk-VD72V5VX.js → chunk-AJ65WNJB.js} +4 -4
  88. package/dist/commands/{chunk-MYWRGF5A.js → chunk-AK7SEO4Y.js} +2 -2
  89. package/dist/commands/{chunk-IBEKFLWG.js → chunk-ALDAS2WG.js} +9 -9
  90. package/dist/commands/{chunk-W32DIQEP.js → chunk-ARFBIJFS.js} +1 -1
  91. package/dist/commands/{chunk-F3WBEEYC.js → chunk-AVVMDVGO.js} +5 -5
  92. package/dist/commands/chunk-AXXEMVRJ.js +23 -0
  93. package/dist/commands/{chunk-GIGKMIPQ.js → chunk-B3M5WSGN.js} +1 -1
  94. package/dist/commands/{chunk-4Z5723GA.js → chunk-B7ZNIEDV.js} +5 -4
  95. package/dist/commands/{chunk-B3XFOHDX.js → chunk-BCUDQWYK.js} +10 -4
  96. package/dist/commands/{chunk-PR3JCPP7.js → chunk-BMKWSWWE.js} +1 -1
  97. package/dist/commands/{chunk-RZJAUVMI.js → chunk-BMM4RHCG.js} +2 -2
  98. package/dist/commands/{chunk-LAKVPOJQ.js → chunk-BMTYUJNT.js} +2 -2
  99. package/dist/commands/{chunk-DAJCUSPG.js → chunk-BRHPRDDV.js} +3 -3
  100. package/dist/commands/{chunk-UZAU6UI6.js → chunk-BRUBX64M.js} +2 -2
  101. package/dist/commands/{chunk-BFLFPKQQ.js → chunk-BTZJDHQT.js} +4 -4
  102. package/dist/commands/{chunk-AI5K4QJO.js → chunk-BYFC6MD2.js} +1 -1
  103. package/dist/commands/{chunk-JGTLNFFE.js → chunk-BYGJ3BCJ.js} +10 -10
  104. package/dist/commands/{chunk-5HWZFL4D.js → chunk-C54QXJD6.js} +51 -18
  105. package/dist/commands/{chunk-LMS6N6GE.js → chunk-CBAKBWSZ.js} +7 -7
  106. package/dist/commands/{chunk-7EAMUVIO.js → chunk-CFHRNTE5.js} +1 -1
  107. package/dist/commands/{chunk-UIWAMLQH.js → chunk-CGYDIYHD.js} +2 -2
  108. package/dist/commands/{chunk-4QYW2IL7.js → chunk-CHKYPF5O.js} +1 -1
  109. package/dist/commands/{chunk-5HCPSV45.js → chunk-CJBW6BWG.js} +8 -8
  110. package/dist/commands/chunk-CKUKK7JG.js +252 -0
  111. package/dist/commands/{chunk-4PES3BAA.js → chunk-CMHGDCGN.js} +3 -3
  112. package/dist/commands/{chunk-F6OWP2AY.js → chunk-CNGTHSUS.js} +22 -22
  113. package/dist/commands/{chunk-B2EA2HCY.js → chunk-COGKULQH.js} +4 -4
  114. package/dist/commands/{chunk-S7XWXG4M.js → chunk-CP2J4RV2.js} +175 -81
  115. package/dist/commands/{chunk-YGDNUTTI.js → chunk-CQUZ6TNQ.js} +2 -2
  116. package/dist/commands/chunk-CQZI7RIK.js +72 -0
  117. package/dist/commands/chunk-CVJHQOI3.js +153 -0
  118. package/dist/commands/{chunk-2MJ4OCDL.js → chunk-CWCKCZS6.js} +1 -1
  119. package/dist/commands/chunk-D5OHVIPM.js +17 -0
  120. package/dist/commands/{chunk-TPKFVVJQ.js → chunk-D6D6WQR6.js} +2 -2
  121. package/dist/commands/{chunk-5PAEXYIY.js → chunk-D7JRJI44.js} +69 -6
  122. package/dist/commands/{chunk-LOSOLCCW.js → chunk-D7OAU32Z.js} +1 -1
  123. package/dist/commands/{chunk-VZHC2I3T.js → chunk-DAAX7XDS.js} +8 -8
  124. package/dist/commands/{chunk-OHVAEJSM.js → chunk-DEZF7QZZ.js} +5 -5
  125. package/dist/commands/{chunk-CA6F5OXK.js → chunk-DYZOOWVW.js} +124 -21
  126. package/dist/commands/{chunk-TKGBF75Y.js → chunk-EDKOSZ3K.js} +5 -5
  127. package/dist/commands/{chunk-YPNTORQD.js → chunk-EFDVE5P5.js} +1 -1
  128. package/dist/commands/{chunk-EH3LVYOX.js → chunk-EGIHAEMT.js} +1 -1
  129. package/dist/commands/{chunk-7P4X4TQL.js → chunk-EKLU6QR7.js} +4 -4
  130. package/dist/commands/{chunk-ILQZFUDC.js → chunk-ELY76WAR.js} +2 -2
  131. package/dist/commands/{chunk-2VLHFILE.js → chunk-EM3HAZF6.js} +2 -2
  132. package/dist/commands/{chunk-F2HFWLQR.js → chunk-EMTZAGT5.js} +20 -1
  133. package/dist/commands/{chunk-GA4VIFHD.js → chunk-ERG4QRNG.js} +2 -2
  134. package/dist/commands/{chunk-ICEMFE2V.js → chunk-EUGNQCYK.js} +1 -1
  135. package/dist/commands/{chunk-3HU3LPIF.js → chunk-EXDFKKMH.js} +2 -2
  136. package/dist/commands/{chunk-ISPBJVXM.js → chunk-EXWB34R2.js} +7 -7
  137. package/dist/commands/{chunk-FNOSSXLG.js → chunk-EYMPBHDN.js} +2 -2
  138. package/dist/commands/{chunk-7V5UVKFG.js → chunk-EZ7IPKIH.js} +2 -2
  139. package/dist/commands/{chunk-KQWSENCT.js → chunk-F6IQHZYY.js} +3 -3
  140. package/dist/commands/{chunk-7ZECP3J6.js → chunk-FDS65XOJ.js} +5 -5
  141. package/dist/commands/{chunk-KXRFGPZD.js → chunk-FGG7V473.js} +21 -5
  142. package/dist/commands/{chunk-PZ6VWHOO.js → chunk-FHFWNNUC.js} +1 -1
  143. package/dist/commands/{chunk-XBRD2BDL.js → chunk-FJX7AENO.js} +2 -2
  144. package/dist/commands/{chunk-M42SLJCD.js → chunk-FKZ5E4JD.js} +4 -4
  145. package/dist/commands/{chunk-F2J6DGDM.js → chunk-FMZWRDKH.js} +8 -8
  146. package/dist/commands/{chunk-DSBK66US.js → chunk-FOKCRIAN.js} +10 -10
  147. package/dist/commands/{chunk-OI7KM4K3.js → chunk-FQGWO2ZH.js} +2 -2
  148. package/dist/commands/{chunk-2IESYBZH.js → chunk-FURNDIT3.js} +3 -3
  149. package/dist/commands/chunk-FVDQNMP6.js +93 -0
  150. package/dist/commands/{chunk-PZU6FZO6.js → chunk-FWU3H4TX.js} +1 -1
  151. package/dist/commands/{chunk-RYZ3RQRH.js → chunk-G3HBYHFA.js} +1 -1
  152. package/dist/commands/{chunk-HCA5QG2U.js → chunk-G4E4M2P4.js} +2 -2
  153. package/dist/commands/{chunk-VJLZ3IQQ.js → chunk-G5KSL2Q2.js} +1 -1
  154. package/dist/commands/{chunk-Y5ZW3KN5.js → chunk-G6XC7V6Y.js} +2 -2
  155. package/dist/commands/{chunk-73EBNBUW.js → chunk-GCPP5XIG.js} +1 -1
  156. package/dist/commands/{chunk-Q3463XNL.js → chunk-GITT5A5A.js} +3 -3
  157. package/dist/commands/{chunk-T2IO4LEB.js → chunk-GLC47H7I.js} +10 -10
  158. package/dist/commands/{chunk-GA6E4VGO.js → chunk-GUR54ELE.js} +1 -1
  159. package/dist/commands/{chunk-7IT23HIR.js → chunk-GY4DMCKS.js} +2 -2
  160. package/dist/commands/{chunk-PZ4ITSLG.js → chunk-H6JQRHDC.js} +3 -3
  161. package/dist/commands/{chunk-ZHZSZNE2.js → chunk-HATKF6VX.js} +2 -2
  162. package/dist/commands/{chunk-ELWNRE6E.js → chunk-HH3CVIFU.js} +5 -5
  163. package/dist/commands/{chunk-7GMTJDO2.js → chunk-HHMMGDMP.js} +6 -6
  164. package/dist/commands/{chunk-VD5674LW.js → chunk-HI5WPM6C.js} +2 -2
  165. package/dist/commands/{chunk-JUUBDYFZ.js → chunk-HQSWPRUF.js} +4 -4
  166. package/dist/commands/{chunk-ZAJD6T6E.js → chunk-HVCQYZVD.js} +2 -2
  167. package/dist/commands/chunk-HWEZRNPL.js +66 -0
  168. package/dist/commands/{chunk-J6GIVMXI.js → chunk-HX3FFIO5.js} +18 -3
  169. package/dist/commands/{chunk-GU5ML3Y3.js → chunk-HXDTA5VU.js} +13 -68
  170. package/dist/commands/{chunk-BNXE3NVB.js → chunk-I2KCGKJI.js} +1 -1
  171. package/dist/commands/{chunk-LC7SBONO.js → chunk-IAD4WLLI.js} +1 -1
  172. package/dist/commands/{chunk-WWC5L3AO.js → chunk-IB5TT73I.js} +2 -2
  173. package/dist/commands/{chunk-HOSZITJM.js → chunk-IBAYXCMU.js} +2 -2
  174. package/dist/commands/chunk-IGDJNXX2.js +49 -0
  175. package/dist/commands/{chunk-OJ4LGBVD.js → chunk-ILIITIMQ.js} +3 -3
  176. package/dist/commands/{chunk-CUR2WNYB.js → chunk-IRGDMSTI.js} +3 -3
  177. package/dist/commands/{chunk-PZTWQYRI.js → chunk-IYJEBWW5.js} +3 -3
  178. package/dist/commands/{chunk-A3D2XHOJ.js → chunk-J22PSIXR.js} +40 -9
  179. package/dist/commands/{chunk-O27H6NN6.js → chunk-J66YBAAM.js} +3 -5
  180. package/dist/commands/{chunk-P6RGQXHI.js → chunk-J6WKZRV2.js} +2 -2
  181. package/dist/commands/{chunk-NFEBQED3.js → chunk-J7IO3AYH.js} +2 -2
  182. package/dist/commands/{chunk-T57W3UWK.js → chunk-JAKC2BHX.js} +1 -1
  183. package/dist/commands/{chunk-3EO2XN3A.js → chunk-JCAQ7B6J.js} +4 -4
  184. package/dist/commands/{chunk-QQZOQ7AM.js → chunk-JFLFGLE4.js} +1 -1
  185. package/dist/commands/{chunk-ZDSDPKCD.js → chunk-JIGBNCDR.js} +1 -1
  186. package/dist/commands/{chunk-Q5N2J2UF.js → chunk-JJHWTFWQ.js} +5 -7
  187. package/dist/commands/{chunk-EI6JG5DF.js → chunk-JKOGWGQM.js} +1 -1
  188. package/dist/commands/{chunk-RK4HE5NW.js → chunk-JM6EVOFN.js} +4 -4
  189. package/dist/commands/{chunk-EBNIX2TC.js → chunk-JV24VP2O.js} +1 -1
  190. package/dist/commands/{chunk-BCK5LW4F.js → chunk-JVKXJ763.js} +3 -3
  191. package/dist/commands/{chunk-D5TAR6TV.js → chunk-JZHY7D6D.js} +1 -1
  192. package/dist/commands/{chunk-CRNPPKP2.js → chunk-JZK33TA5.js} +1 -1
  193. package/dist/commands/{chunk-UOAG2XQT.js → chunk-K275REYP.js} +3 -3
  194. package/dist/commands/{chunk-HESMKHEB.js → chunk-K4G3HOKS.js} +2 -2
  195. package/dist/commands/{chunk-L6XN3EXI.js → chunk-K64EIHD2.js} +1 -1
  196. package/dist/commands/{chunk-RINVPTA2.js → chunk-KCFOP5RI.js} +28 -28
  197. package/dist/commands/{chunk-O26Y2FOJ.js → chunk-KGE4AS2Y.js} +1 -1
  198. package/dist/commands/{chunk-EWA72KO7.js → chunk-KK2SL42W.js} +2 -2
  199. package/dist/commands/{chunk-MMXZKLDU.js → chunk-KK7TEL5G.js} +10 -4
  200. package/dist/commands/{chunk-UEURNXE5.js → chunk-KKIMVXAP.js} +2 -2
  201. package/dist/commands/{chunk-MAGJFH5T.js → chunk-KODXWMBX.js} +6 -6
  202. package/dist/commands/{chunk-D4HNS43Q.js → chunk-KPSKWTOS.js} +17 -17
  203. package/dist/commands/{chunk-VFJYOAOQ.js → chunk-KTV2HNWB.js} +2 -2
  204. package/dist/commands/{chunk-OWR2TCOY.js → chunk-KWYQR5MK.js} +5 -5
  205. package/dist/commands/{chunk-FNQW6NY7.js → chunk-KXK2A2HB.js} +6 -2
  206. package/dist/commands/{chunk-O5FVBIRI.js → chunk-KZ5BBBMO.js} +5 -5
  207. package/dist/commands/{chunk-JUJFIATR.js → chunk-KZ7HD37E.js} +6 -6
  208. package/dist/commands/{chunk-2YCKPX3A.js → chunk-KZZWPUJW.js} +1 -1
  209. package/dist/commands/{chunk-MYNM3YMR.js → chunk-L7DAL54N.js} +3 -3
  210. package/dist/commands/{chunk-NOXLKIPR.js → chunk-LAR76BFA.js} +1 -1
  211. package/dist/commands/{chunk-ZA3W73PF.js → chunk-LB557AHJ.js} +3 -3
  212. package/dist/commands/{chunk-LYEKT3IN.js → chunk-LEB2VP7F.js} +1 -1
  213. package/dist/commands/{chunk-WQJ7O3C3.js → chunk-LJXKVLYI.js} +1 -1
  214. package/dist/commands/{chunk-CHX4QTP4.js → chunk-LJZERYLG.js} +1 -1
  215. package/dist/commands/{chunk-PF22VUWB.js → chunk-LOOFYHUM.js} +76 -26
  216. package/dist/commands/{chunk-HIPO6HUG.js → chunk-LPSULLNK.js} +1 -1
  217. package/dist/commands/{chunk-G47ZNQVG.js → chunk-LR22UK5W.js} +1 -1
  218. package/dist/commands/{chunk-SV4FHQE7.js → chunk-LT7QSHR4.js} +14 -14
  219. package/dist/commands/{chunk-HIB5G2X6.js → chunk-LUXWDMKI.js} +7 -7
  220. package/dist/commands/{chunk-XH6BGVVP.js → chunk-LX7TIEMI.js} +9 -36
  221. package/dist/commands/{chunk-OGNTJ5JB.js → chunk-LYO6TX5L.js} +1 -1
  222. package/dist/commands/{chunk-JLREFWJ4.js → chunk-LZ5QXE5N.js} +6 -6
  223. package/dist/commands/{chunk-WW3TX742.js → chunk-LZPPSOTP.js} +4 -4
  224. package/dist/commands/{chunk-5WIZR5SC.js → chunk-M4UV3BEV.js} +11 -11
  225. package/dist/commands/{chunk-LNBUIOK6.js → chunk-M6JDU5EK.js} +4 -4
  226. package/dist/commands/{chunk-VZSJCFRT.js → chunk-MFBNNTBM.js} +4 -4
  227. package/dist/commands/{chunk-KHWTJ4F7.js → chunk-MI2OS6TL.js} +3 -3
  228. package/dist/commands/{chunk-VZCQZFPH.js → chunk-MLW4S35K.js} +19 -8
  229. package/dist/commands/{chunk-RIUPRMLW.js → chunk-MN425CU6.js} +1 -1
  230. package/dist/commands/{chunk-7W3D3WRW.js → chunk-MOIOSCZM.js} +2 -2
  231. package/dist/commands/{chunk-3BNNMJOT.js → chunk-MRORPFSO.js} +20 -320
  232. package/dist/commands/{chunk-LA5WTOAM.js → chunk-MUGTOJUL.js} +12 -12
  233. package/dist/commands/{chunk-L6LU2633.js → chunk-MVHPRYHE.js} +1 -1
  234. package/dist/commands/{chunk-EKCKCX5S.js → chunk-MWO6FOSZ.js} +123 -21
  235. package/dist/commands/{chunk-AVUGMOHZ.js → chunk-N7QTMTST.js} +2 -2
  236. package/dist/commands/{chunk-LMSS4ARB.js → chunk-NDBX7LSS.js} +1 -1
  237. package/dist/commands/{chunk-BEE7OAQ5.js → chunk-NDWZTWXV.js} +21 -2
  238. package/dist/commands/{chunk-6TESOL3L.js → chunk-NEGJ77RV.js} +7 -7
  239. package/dist/commands/{chunk-LCEJXF7A.js → chunk-NEGRE5VW.js} +4 -4
  240. package/dist/commands/{chunk-IXX4SXIP.js → chunk-NFPD2P3V.js} +1 -1
  241. package/dist/commands/chunk-NHIW7JE6.js +335 -0
  242. package/dist/commands/{chunk-CJSFC5YI.js → chunk-NILSN7A4.js} +7 -7
  243. package/dist/commands/{chunk-W4J6YTFE.js → chunk-NOLFSPOB.js} +2 -2
  244. package/dist/commands/chunk-NT67QTZO.js +65 -0
  245. package/dist/commands/{chunk-NJT5L6IC.js → chunk-NU7W6QGT.js} +33 -4
  246. package/dist/commands/chunk-NUR4FQHM.js +21 -0
  247. package/dist/commands/{chunk-OKKQI4ZG.js → chunk-OAAVY2JK.js} +1 -1
  248. package/dist/commands/chunk-OF4BY4N7.js +32 -0
  249. package/dist/commands/{chunk-W47I2KDY.js → chunk-OGS2DK7I.js} +3 -3
  250. package/dist/commands/{chunk-MS6Q3Z7V.js → chunk-OIPV3PWW.js} +6 -6
  251. package/dist/commands/{chunk-T33QDAWD.js → chunk-OIX2363L.js} +1 -1
  252. package/dist/commands/{chunk-GPMSYXYO.js → chunk-OJ65BZBV.js} +283 -15
  253. package/dist/commands/{chunk-34LAULSC.js → chunk-OKZWEVR4.js} +3 -3
  254. package/dist/commands/{chunk-2CXAVVST.js → chunk-OL6IF4JC.js} +1 -1
  255. package/dist/commands/{chunk-6JVNRY5A.js → chunk-OMPRILFH.js} +1 -1
  256. package/dist/commands/{chunk-VGHSZLYQ.js → chunk-OOWGH2RG.js} +1 -1
  257. package/dist/commands/{chunk-ERGZPWKP.js → chunk-OP2RFVLS.js} +1 -1
  258. package/dist/commands/{chunk-UU6GCJGM.js → chunk-ORKVN2LO.js} +2 -2
  259. package/dist/commands/{chunk-RHII5XI6.js → chunk-OSBWXZJ4.js} +24 -24
  260. package/dist/commands/{chunk-D3SHCUBC.js → chunk-OVWPZDWP.js} +2 -2
  261. package/dist/commands/{chunk-Z4HYBFZD.js → chunk-OWYK2BEJ.js} +108 -46
  262. package/dist/commands/{chunk-P4O67FP5.js → chunk-OX3VQLV2.js} +6 -6
  263. package/dist/commands/{chunk-L6TU7FC2.js → chunk-OZJP77UM.js} +4 -4
  264. package/dist/commands/{chunk-SNO7CY2B.js → chunk-P3H3DKTE.js} +2 -2
  265. package/dist/commands/{chunk-2OIX4JLA.js → chunk-P5SOYWH2.js} +3 -3
  266. package/dist/commands/{chunk-M4PEC7YW.js → chunk-PHLOTUB7.js} +54 -37
  267. package/dist/commands/{chunk-73KBUQKI.js → chunk-PTNQCCIB.js} +2 -2
  268. package/dist/commands/{chunk-4P2LCVGO.js → chunk-PTZEFQUX.js} +8 -8
  269. package/dist/commands/{chunk-DJVMC3U2.js → chunk-Q426ZSZ4.js} +1 -1
  270. package/dist/commands/{chunk-US6X7JXC.js → chunk-Q7EEIOAD.js} +4 -4
  271. package/dist/commands/{chunk-LE7TFPMU.js → chunk-QABRNGQV.js} +2 -2
  272. package/dist/commands/{chunk-NGKB632X.js → chunk-QDFVVRQP.js} +3 -3
  273. package/dist/commands/{chunk-36M2UV6C.js → chunk-QGATHT4S.js} +38 -4
  274. package/dist/commands/{chunk-DIB2Z2OS.js → chunk-QJRVDE7T.js} +1 -1
  275. package/dist/commands/{chunk-KUJQWO6M.js → chunk-QKTTKAXM.js} +2 -2
  276. package/dist/commands/{chunk-DXZW4V7J.js → chunk-QMDKDQKW.js} +3 -3
  277. package/dist/commands/{chunk-VW5SGE7A.js → chunk-QOSC5RKD.js} +1 -1
  278. package/dist/commands/{chunk-ENLWXAHD.js → chunk-QV5FKMOU.js} +1 -1
  279. package/dist/commands/{chunk-32SNWQJP.js → chunk-R2THGPI3.js} +2 -2
  280. package/dist/commands/{chunk-RVHBWSIG.js → chunk-R54Z2Z3X.js} +2 -2
  281. package/dist/commands/{chunk-CJAA5GAF.js → chunk-RG53UFNW.js} +15 -15
  282. package/dist/commands/{chunk-HJKZDDDI.js → chunk-RHKCWJQX.js} +1 -1
  283. package/dist/commands/{chunk-RPDWFUQO.js → chunk-RKIAX4DZ.js} +36 -84
  284. package/dist/commands/{chunk-LE2T3FGJ.js → chunk-RLBFEHHC.js} +2 -4
  285. package/dist/commands/{chunk-5GBZ43UA.js → chunk-RMDLFLPE.js} +1 -1
  286. package/dist/commands/{chunk-U2UH4VM4.js → chunk-RN2YDNLF.js} +2 -2
  287. package/dist/commands/{chunk-GQHUFNXN.js → chunk-RRAIRS2T.js} +1 -1
  288. package/dist/commands/{chunk-DRCTDVI2.js → chunk-RUQY5TS3.js} +3 -3
  289. package/dist/commands/{chunk-WGULS5DA.js → chunk-RW64VHEB.js} +1 -0
  290. package/dist/commands/{chunk-4G7NKNAZ.js → chunk-RXYMJPJB.js} +3 -3
  291. package/dist/commands/{chunk-B33BTNB4.js → chunk-S4M6UWR2.js} +21 -5
  292. package/dist/commands/{chunk-4Q4FXBUQ.js → chunk-SASX3W2M.js} +2 -2
  293. package/dist/commands/{chunk-TIXJY22D.js → chunk-SJ2ZN575.js} +5 -5
  294. package/dist/commands/{chunk-NSZTSCBW.js → chunk-SP7DKYGU.js} +13 -13
  295. package/dist/commands/{chunk-T3FD3Q73.js → chunk-SRG6PKVS.js} +1 -1
  296. package/dist/commands/{chunk-QA22PBCJ.js → chunk-SSL6A3Y4.js} +3 -3
  297. package/dist/commands/{chunk-4BEIYKI2.js → chunk-SV4FZR24.js} +2 -0
  298. package/dist/commands/{chunk-HZSQI6TD.js → chunk-SVTS7ACS.js} +2 -2
  299. package/dist/commands/{chunk-F7XLEK55.js → chunk-SVV4U5AR.js} +1 -1
  300. package/dist/commands/{chunk-RRQFITJE.js → chunk-SXJM4DZ5.js} +1 -1
  301. package/dist/commands/{chunk-OIDMJASD.js → chunk-SYB3M632.js} +1 -1
  302. package/dist/commands/{chunk-UJOZ2MGX.js → chunk-SYOXIKB7.js} +6 -6
  303. package/dist/commands/{chunk-5SB37YDW.js → chunk-SZG5HDNP.js} +3 -3
  304. package/dist/commands/{chunk-R2CF6VZE.js → chunk-T4F33UKZ.js} +4 -4
  305. package/dist/commands/{chunk-ESQEEL4O.js → chunk-TAEGXID2.js} +2 -2
  306. package/dist/commands/chunk-TEPYEUYG.js +585 -0
  307. package/dist/commands/{chunk-LUMCYDGE.js → chunk-TFLHYC2F.js} +2 -2
  308. package/dist/commands/{chunk-V5OIPYA6.js → chunk-TJKM56WJ.js} +4 -4
  309. package/dist/commands/{chunk-CYQ3ZF7R.js → chunk-TLAB552K.js} +86 -13
  310. package/dist/commands/{chunk-ST32OGPY.js → chunk-TP6L4W3W.js} +5 -5
  311. package/dist/commands/{chunk-C26LKDBE.js → chunk-TR7WWYD5.js} +1 -1
  312. package/dist/commands/{chunk-PWYXY46Y.js → chunk-TYNH2R66.js} +15 -15
  313. package/dist/commands/{chunk-AZUE65NT.js → chunk-U5P6G3UV.js} +2 -2
  314. package/dist/commands/{chunk-REPANBLS.js → chunk-U7Y6RKLK.js} +1 -1
  315. package/dist/commands/{chunk-55I7OYHI.js → chunk-UIMMWH7U.js} +1 -1
  316. package/dist/commands/{chunk-72J2G2E7.js → chunk-UKBBWMLE.js} +20 -20
  317. package/dist/commands/{chunk-VTLL6CKO.js → chunk-UNMSZGSG.js} +14 -14
  318. package/dist/commands/chunk-UOVUUVDK.js +18 -0
  319. package/dist/commands/{chunk-JNWHX25C.js → chunk-URDT2O2K.js} +1 -1
  320. package/dist/commands/{chunk-FGZQSSGH.js → chunk-UREXZJDB.js} +1 -1
  321. package/dist/commands/{chunk-O4WBADCX.js → chunk-UTHUX7VU.js} +3 -3
  322. package/dist/commands/{chunk-PDDKRHHS.js → chunk-V5OUZFWK.js} +3 -3
  323. package/dist/commands/{chunk-N4O5I55P.js → chunk-VCPGFBMN.js} +8 -8
  324. package/dist/commands/{chunk-WN7NK3NY.js → chunk-VGPIQNDB.js} +1 -1
  325. package/dist/commands/{chunk-HOGFJHBT.js → chunk-VJS2MCLA.js} +1 -1
  326. package/dist/commands/{chunk-4YI4SLRJ.js → chunk-VK6D5CWA.js} +8 -8
  327. package/dist/commands/{chunk-4LWRCPS5.js → chunk-VOF3N4WO.js} +3 -3
  328. package/dist/commands/{chunk-AM44D7NF.js → chunk-VQRT32JB.js} +1 -1
  329. package/dist/commands/{chunk-AS3GWVAN.js → chunk-VQVPAVQ3.js} +1 -1
  330. package/dist/commands/{chunk-6VTJO5L2.js → chunk-VV4TQYGD.js} +3 -3
  331. package/dist/commands/{chunk-WIE7VUBE.js → chunk-W7DRUOF7.js} +5 -5
  332. package/dist/commands/{chunk-HH2KDLTP.js → chunk-WAEN2RTT.js} +2 -2
  333. package/dist/commands/{chunk-NKKH3PBE.js → chunk-WB4T3VY2.js} +18 -1
  334. package/dist/commands/{chunk-DNJC7X73.js → chunk-WCEUMOKK.js} +2 -2
  335. package/dist/commands/{chunk-BK6Q4VCA.js → chunk-WTH6NTXU.js} +4 -4
  336. package/dist/commands/{chunk-WG6GYBRJ.js → chunk-WWVYEHQT.js} +2 -1
  337. package/dist/commands/{chunk-P4CWLRT2.js → chunk-X3TNPALI.js} +1 -1
  338. package/dist/commands/{chunk-LZNYHWRO.js → chunk-XC6GG5JR.js} +3 -3
  339. package/dist/commands/{chunk-RI7EQYKL.js → chunk-XFWI6WHH.js} +2 -2
  340. package/dist/commands/{chunk-BY3POLIQ.js → chunk-XHGWMD3L.js} +7 -7
  341. package/dist/commands/{chunk-BPSJSHYD.js → chunk-XI2ABCRX.js} +2 -2
  342. package/dist/commands/{chunk-TS4ZK46L.js → chunk-XKSUBUIH.js} +5 -5
  343. package/dist/commands/{chunk-K7GL3BGI.js → chunk-XPBF5DG3.js} +4 -4
  344. package/dist/commands/{chunk-6SKMZGER.js → chunk-XUMYPESL.js} +20 -8
  345. package/dist/commands/{chunk-QS5USD4T.js → chunk-XXC32PVL.js} +5 -4
  346. package/dist/commands/{chunk-ORSI7Y55.js → chunk-XXN2EZBY.js} +1 -1
  347. package/dist/commands/{chunk-IZVM2TTH.js → chunk-XZQWEVR3.js} +2 -2
  348. package/dist/commands/{chunk-E3CXOVPQ.js → chunk-Y27PTXXI.js} +1 -1
  349. package/dist/commands/{chunk-337QQM4C.js → chunk-Y4EBUI6M.js} +106 -5
  350. package/dist/commands/{chunk-WRX3MINT.js → chunk-YAU3LYNF.js} +1 -1
  351. package/dist/commands/{chunk-JB7R3A4A.js → chunk-YDURQICF.js} +4 -4
  352. package/dist/commands/{chunk-RX5JSPPH.js → chunk-YGFOGA7C.js} +11 -11
  353. package/dist/commands/{chunk-S6SXMBF2.js → chunk-YHJ2AJMA.js} +2 -2
  354. package/dist/commands/{chunk-MVPUQLN5.js → chunk-YM77CF4D.js} +4 -4
  355. package/dist/commands/{chunk-ZYIMQHCB.js → chunk-YNPRJCEO.js} +6 -6
  356. package/dist/commands/{chunk-3UKJFWKS.js → chunk-YTBQAD5W.js} +3 -3
  357. package/dist/commands/{chunk-KIVOZY2J.js → chunk-ZBZ5DDCH.js} +66 -64
  358. package/dist/commands/{chunk-TAPDXK34.js → chunk-ZLRUHSOP.js} +1 -1
  359. package/dist/commands/{chunk-XYAK53TK.js → chunk-ZNR75OXP.js} +2 -1
  360. package/dist/commands/{chunk-CADFBQJJ.js → chunk-ZSOR4ISJ.js} +4 -4
  361. package/dist/commands/{chunk-6NRTLH6I.js → chunk-ZYFHYQA7.js} +1 -1
  362. package/dist/commands/{chunk-Q7TV3OV6.js → chunk-ZZFFSQF4.js} +4 -4
  363. package/dist/commands/{chunk-PDAY76AN.js → chunk-ZZULXNC2.js} +1 -1
  364. package/dist/commands/{chunk-5Y7QQYTU.js → chunk-ZZXO6TFH.js} +1 -1
  365. package/dist/commands/code-symbol-cli.js +4 -4
  366. package/dist/commands/codex-hook-adapter.js +99 -100
  367. package/dist/commands/command-derive.js +10 -10
  368. package/dist/commands/cost-audit-main.js +94 -92
  369. package/dist/commands/cspell-cached.js +24 -23
  370. package/dist/commands/defect-origin-main.js +19 -18
  371. package/dist/commands/defect-report-main.js +15 -14
  372. package/dist/commands/disposition-cli.js +67 -64
  373. package/dist/commands/doctor.js +3 -3
  374. package/dist/commands/document-read-cli.js +89 -9
  375. package/dist/commands/document-section-main.js +89 -9
  376. package/dist/commands/edit-files-cli.js +1 -1
  377. package/dist/commands/effect-audit-cli.js +20 -19
  378. package/dist/commands/epic-audit-main.js +55 -53
  379. package/dist/commands/epic-bundle-main.js +87 -85
  380. package/dist/commands/epic-check.js +16 -15
  381. package/dist/commands/epic-main.js +93 -91
  382. package/dist/commands/epic-next-main.js +51 -49
  383. package/dist/commands/format-edited-cli.js +30 -32
  384. package/dist/commands/format.js +11 -10
  385. package/dist/commands/fresh-machine-cli.js +6 -6
  386. package/dist/commands/git-followup-workflow.js +137 -122
  387. package/dist/commands/git-workflow.js +28 -27
  388. package/dist/commands/github-release-cli.js +26 -3
  389. package/dist/commands/hook-ledger-cli.js +74 -126
  390. package/dist/commands/init-main.js +20 -19
  391. package/dist/commands/inputs.json +1909 -1878
  392. package/dist/commands/issue-ack-cli.js +5 -5
  393. package/dist/commands/issue-already-done-cli.js +63 -58
  394. package/dist/commands/issue-body-cli.js +44 -42
  395. package/dist/commands/issue-cite-main.js +11 -10
  396. package/dist/commands/issue-comment-main.js +15 -11
  397. package/dist/commands/issue-consolidate-cli.js +31 -30
  398. package/dist/commands/issue-file-main.js +114 -110
  399. package/dist/commands/issue-fold-existing-cli.js +88 -86
  400. package/dist/commands/issue-fold-main.js +26 -25
  401. package/dist/commands/issue-lint-main.js +38 -37
  402. package/dist/commands/issue-measured-cli.js +66 -61
  403. package/dist/commands/issue-plan-cli.js +103 -101
  404. package/dist/commands/issue-premise-unmet-cli.js +66 -61
  405. package/dist/commands/issue-priority-cli.js +13 -12
  406. package/dist/commands/issue-read-main.js +18 -17
  407. package/dist/commands/issue-release-class-cli.js +12 -11
  408. package/dist/commands/issue-release-main.js +13 -12
  409. package/dist/commands/issue-scout-main.js +89 -87
  410. package/dist/commands/issue-spill-main.js +114 -110
  411. package/dist/commands/issue-state-main.js +16 -15
  412. package/dist/commands/issue-tick-cli.js +14 -13
  413. package/dist/commands/josh-completion.js +10 -10
  414. package/dist/commands/lane-adopt-cli.js +19 -19
  415. package/dist/commands/lane-breakdown-cli.js +154 -126
  416. package/dist/commands/lane-cli.js +131 -125
  417. package/dist/commands/lane-launch-main.js +17 -17
  418. package/dist/commands/lane-limit-cli.js +81 -79
  419. package/dist/commands/lane-measure-cli.js +246 -130
  420. package/dist/commands/lane-pause-cli.js +15 -15
  421. package/dist/commands/lane-plan-cli.js +108 -101
  422. package/dist/commands/lane-resolve-cli.js +20 -19
  423. package/dist/commands/lane-restart-cli.js +124 -118
  424. package/dist/commands/lane-why-cli.js +85 -82
  425. package/dist/commands/lane-withdraw-cli.js +49 -48
  426. package/dist/commands/latest-corepack.js +3 -3
  427. package/dist/commands/latest-if-required-cli.js +9 -9
  428. package/dist/commands/latest-scope-main.js +5 -5
  429. package/dist/commands/latest-update.js +3 -3
  430. package/dist/commands/lines-command.js +3 -3
  431. package/dist/commands/lint-parallel-main.js +32 -31
  432. package/dist/commands/lint-related.js +79 -60
  433. package/dist/commands/lint-rule.js +32 -31
  434. package/dist/commands/lockfile-policy.js +11 -11
  435. package/dist/commands/main-merge-main.js +5 -5
  436. package/dist/commands/main-sync-main.js +5 -5
  437. package/dist/commands/managed-config-scope-cli.js +3 -3
  438. package/dist/commands/measure-rerun-cli.js +10 -10
  439. package/dist/commands/metrics-command.js +91 -58
  440. package/dist/commands/observation-record-cli.js +3 -3
  441. package/dist/commands/observations-flush-cli.js +27 -25
  442. package/dist/commands/oracle-list-cli.js +2 -2
  443. package/dist/commands/overrides-check.js +4 -4
  444. package/dist/commands/package-scout-cli.js +67 -26
  445. package/dist/commands/plan-consumers-main.js +4 -4
  446. package/dist/commands/plan-scaffold-cli.js +132 -91
  447. package/dist/commands/pr-classification-main.js +3 -3
  448. package/dist/commands/pre-commit-lint.js +11 -12
  449. package/dist/commands/pre-commit-type-check.js +25 -24
  450. package/dist/commands/pre-push-unit.js +33 -33
  451. package/dist/commands/pretool-guard-cli.js +90 -91
  452. package/dist/commands/project-profile-cli.js +5 -4
  453. package/dist/commands/propagate.js +15 -15
  454. package/dist/commands/prose-stale-cli.js +20 -19
  455. package/dist/commands/publishable-range-check.js +4 -4
  456. package/dist/commands/read-files-cli.js +2 -2
  457. package/dist/commands/read-set-cli.js +61 -24
  458. package/dist/commands/refactor-scan-cli.js +6 -6
  459. package/dist/commands/release-cli.js +64 -36
  460. package/dist/commands/release-scope-main.js +19 -18
  461. package/dist/commands/rename-cli.js +27 -29
  462. package/dist/commands/reserved-run.js +3 -3
  463. package/dist/commands/retrospective-cli.js +104 -102
  464. package/dist/commands/review-attest-cli.js +6 -6
  465. package/dist/commands/review-brief-main.js +127 -109
  466. package/dist/commands/review-findings-cli.js +2 -2
  467. package/dist/commands/review-pair-cli.js +110 -84
  468. package/dist/commands/review-record-main.js +108 -83
  469. package/dist/commands/review-round2-cli.js +46 -45
  470. package/dist/commands/review-stops-cli.js +16 -16
  471. package/dist/commands/review-submit-cli.js +127 -109
  472. package/dist/commands/rule-list.js +58 -60
  473. package/dist/commands/rule-value-cli.js +226 -74
  474. package/dist/commands/run-add-cli.js +28 -27
  475. package/dist/commands/run-board-main.js +136 -132
  476. package/dist/commands/run-carry-cli.js +127 -124
  477. package/dist/commands/run-chain-cli.js +116 -93
  478. package/dist/commands/run-cut-cli.js +124 -119
  479. package/dist/commands/run-ending-cli.js +19 -22
  480. package/dist/commands/run-entry-cli.js +183 -180
  481. package/dist/commands/run-event-cli.js +5 -5
  482. package/dist/commands/run-handoff-cli.js +52 -28
  483. package/dist/commands/run-handoff-lanes-cli.js +15 -15
  484. package/dist/commands/run-hold-main.js +64 -62
  485. package/dist/commands/run-liveness-cli.js +11 -11
  486. package/dist/commands/run-merge-main.js +119 -116
  487. package/dist/commands/run-next-cli.js +87 -86
  488. package/dist/commands/run-park-cli.js +111 -92
  489. package/dist/commands/run-pause-cli.js +147 -133
  490. package/dist/commands/run-pickup-cli.js +13 -13
  491. package/dist/commands/run-prep-main.js +83 -82
  492. package/dist/commands/run-prime-cli.js +107 -87
  493. package/dist/commands/run-progress-main.js +123 -107
  494. package/dist/commands/run-report-cli.js +25 -24
  495. package/dist/commands/run-review-cli.js +168 -149
  496. package/dist/commands/run-ship-cli.js +208 -203
  497. package/dist/commands/run-ship-evidence-cli.js +38 -37
  498. package/dist/commands/run-ship-wait-main.js +40 -37
  499. package/dist/commands/run-split-cli.js +127 -125
  500. package/dist/commands/run-stale-main.js +36 -35
  501. package/dist/commands/run-status-cli.js +16 -15
  502. package/dist/commands/run-step-cli.js +173 -164
  503. package/dist/commands/run-tail-cli.js +1 -1
  504. package/dist/commands/run-tidy-main.js +30 -29
  505. package/dist/commands/run-wake-main.js +137 -119
  506. package/dist/commands/run-watcher-guard-cli.js +30 -29
  507. package/dist/commands/secretlint-scan.js +2 -2
  508. package/dist/commands/selfcheck-cli.js +27 -26
  509. package/dist/commands/session-language-main.js +48 -28
  510. package/dist/commands/sonar-hotspots-cli.js +3 -3
  511. package/dist/commands/split-assess-cli.js +24 -23
  512. package/dist/commands/split-child-recover-cli.js +13 -12
  513. package/dist/commands/start.js +37 -35
  514. package/dist/commands/stash-pop-main.js +3 -3
  515. package/dist/commands/stash-push-main.js +3 -3
  516. package/dist/commands/stop-guard.js +144 -143
  517. package/dist/commands/sync-main.js +11 -10
  518. package/dist/commands/telegram-test-main.js +5 -5
  519. package/dist/commands/test-declared.js +9 -8
  520. package/dist/commands/test-e2e-guard.js +23 -22
  521. package/dist/commands/test-pinned-main.js +26 -25
  522. package/dist/commands/test-reach-cli.js +15 -14
  523. package/dist/commands/test-red-main.js +5 -5
  524. package/dist/commands/{test-related-ZT2AO62I.js → test-related-ZCNC46MS.js} +31 -31
  525. package/dist/commands/test-related-main.js +51 -50
  526. package/dist/commands/test-unit-guard-main.js +9 -8
  527. package/dist/commands/time-cli.js +24 -27
  528. package/dist/commands/time-density-cli.js +8 -9
  529. package/dist/commands/tree-status-cli.js +4 -4
  530. package/dist/commands/type-check-command.js +8 -7
  531. package/dist/commands/ui-shot-cli.js +4 -4
  532. package/dist/commands/uninstall.js +20 -19
  533. package/dist/commands/unused-members-cli.js +9 -8
  534. package/dist/commands/upstream-interrupt-main.js +115 -111
  535. package/dist/commands/verification-gate.js +46 -46
  536. package/dist/commands/version-check.js +5 -5
  537. package/dist/hooks/{chunk-LWD43Z3C.js → chunk-5CUXGQT6.js} +1667 -107
  538. package/dist/hooks/{chunk-4YXV2REH.js → chunk-5R5YFQR5.js} +8 -8
  539. package/dist/hooks/{chunk-LKQBEKBI.js → chunk-6RLY27FT.js} +8 -8
  540. package/dist/hooks/{chunk-CICKRHTB.js → chunk-AO4TOV4V.js} +119 -2679
  541. package/dist/hooks/{chunk-NUPVO7RI.js → chunk-G5WSPYJ6.js} +4296 -1687
  542. package/dist/hooks/{chunk-UU4PTPEZ.js → chunk-HHIVWGHX.js} +250 -125
  543. package/dist/hooks/{chunk-P7BPAU26.js → chunk-IURJANNZ.js} +2 -2
  544. package/dist/hooks/{chunk-6RR6JZSB.js → chunk-OV22V63P.js} +357 -1744
  545. package/dist/hooks/{chunk-RQXECHAS.js → chunk-SXABK6UV.js} +57 -45
  546. package/dist/hooks/codex-hook-adapter.js +11 -11
  547. package/dist/hooks/daemon.js +1053 -690
  548. package/dist/hooks/format-edited.js +5 -5
  549. package/dist/hooks/inputs.json +542 -527
  550. package/dist/hooks/pretool-guard.js +7 -7
  551. package/dist/hooks/session-lang.js +293 -16
  552. package/dist/hooks/stop-guard.js +225 -48
  553. package/dist/inputs.json +65 -65
  554. package/dist/josh.js +73 -19
  555. package/dist/self-sync-guard/index.js +18 -1
  556. package/dist/version/index.js +18 -1
  557. package/package.json +3 -3
  558. package/pnpm-workspace.yaml +5 -13
  559. package/prompts/collaboration-workflow/issue-template.en.md +56 -52
  560. package/scripts/agent/agent-argv.ts +20 -6
  561. package/scripts/agent/agent-phase-profile.ts +89 -0
  562. package/scripts/agent/agent-role-profile.ts +3 -71
  563. package/scripts/agent/agent-ship-cap.ts +44 -0
  564. package/scripts/agent/agent-worker-profile.ts +154 -0
  565. package/scripts/agent/claude-agent-argv.ts +1 -1
  566. package/scripts/agent/lane-instructions.ts +29 -3
  567. package/scripts/auto-ok/auto-ok-judge-cli.ts +3 -0
  568. package/scripts/auto-ok/auto-ok-judge-write.ts +2 -1
  569. package/scripts/auto-ok/auto-ok-judge.ts +4 -2
  570. package/scripts/backlog/backlog-drive-escalate.ts +115 -0
  571. package/scripts/backlog/backlog-drive-stalled-retry.ts +48 -10
  572. package/scripts/document/document-scan.ts +35 -1
  573. package/scripts/gh/git-pr-checks-failed.ts +24 -0
  574. package/scripts/hooks/implementation-shell-deny-expansion.ts +20 -0
  575. package/scripts/hooks/implementation-shell-deny-git.ts +128 -0
  576. package/scripts/hooks/implementation-shell-deny.ts +14 -138
  577. package/scripts/hooks/implementation-shell.ts +28 -5
  578. package/scripts/hooks/step-zero-notice.ts +9 -6
  579. package/scripts/hooks/stop-actions.ts +4 -2
  580. package/scripts/init/init-logic-workspace.ts +1 -1
  581. package/scripts/issue/issue-auto-ok.ts +43 -4
  582. package/scripts/issue/issue-body-keys.ts +4 -0
  583. package/scripts/issue/issue-comment-cli.ts +15 -2
  584. package/scripts/issue/issue-evidence-exit.ts +6 -2
  585. package/scripts/issue/issue-file-cli.ts +5 -1
  586. package/scripts/issue/issue-file-pass.ts +14 -7
  587. package/scripts/issue/issue-file-worker.ts +95 -0
  588. package/scripts/issue/issue-file.ts +1 -1
  589. package/scripts/issue/issue-outcome.ts +107 -0
  590. package/scripts/issue/issue-read.ts +12 -7
  591. package/scripts/issue/issue-watch-diff.ts +2 -1
  592. package/scripts/josh/josh-commands-ai.ts +2 -2
  593. package/scripts/josh/josh-commands-development.ts +21 -5
  594. package/scripts/josh/josh-commands-issue-write.ts +3 -2
  595. package/scripts/josh/josh-commands-lint.ts +1 -1
  596. package/scripts/josh/josh-commands-project.ts +7 -2
  597. package/scripts/josh/josh-commands-run.ts +10 -2
  598. package/scripts/josh/josh-commands-workflow.ts +5 -0
  599. package/scripts/josh/session-language-cli.ts +1 -1
  600. package/scripts/lane/lane-breakdown-cli.ts +14 -4
  601. package/scripts/lane/lane-breakdown-text.ts +7 -0
  602. package/scripts/lane/lane-breakdown.ts +21 -1
  603. package/scripts/lane/lane-dispatch-prepare.ts +83 -0
  604. package/scripts/lane/lane-dispatch.ts +3 -53
  605. package/scripts/lane/lane-elapsed-time.ts +118 -0
  606. package/scripts/lane/lane-ledger-schema-ship.ts +4 -1
  607. package/scripts/lane/lane-net-time.ts +35 -7
  608. package/scripts/lane/lane-overrun.ts +1 -1
  609. package/scripts/lane/lane-plan-cli.ts +7 -3
  610. package/scripts/lane/lane-plan-estimate.ts +57 -0
  611. package/scripts/lane/lane-plan-size.ts +11 -20
  612. package/scripts/lane/lane-plan.ts +1 -0
  613. package/scripts/lane/lane-relaunch.ts +9 -4
  614. package/scripts/lane/lane-stage-budget.ts +6 -1
  615. package/scripts/lane/lane-stage-events.ts +103 -0
  616. package/scripts/lane/lane-stats-tables.ts +3 -0
  617. package/scripts/lane/lane-stop-check-stats.ts +117 -0
  618. package/scripts/lane/lane-stop-stats.ts +30 -6
  619. package/scripts/lane/lane-why-causes.ts +3 -11
  620. package/scripts/lane/openai-lane-supervisor-owner.ts +12 -0
  621. package/scripts/lane/openai-lane-supervisor.ts +36 -1
  622. package/scripts/lib/home-tilde.ts +24 -0
  623. package/scripts/lib/package-manifest.ts +27 -1
  624. package/scripts/observations/observation-ledger-archive.ts +180 -0
  625. package/scripts/observations/observation-ledger-home.ts +1 -0
  626. package/scripts/observations/observation-ledger.ts +5 -0
  627. package/scripts/observations/observations-flush-transaction.ts +358 -0
  628. package/scripts/observations/observations-flush.ts +72 -172
  629. package/scripts/plan/plan-scaffold-cli.ts +17 -6
  630. package/scripts/plan/plan-scaffold.ts +11 -0
  631. package/scripts/release/github-release-notes.ts +24 -0
  632. package/scripts/release/github-release-runs.ts +32 -6
  633. package/scripts/release/github-release.ts +10 -2
  634. package/scripts/release/release-progress.ts +22 -10
  635. package/scripts/release/release-publish-run.ts +39 -6
  636. package/scripts/repo/repository-labels.ts +23 -11
  637. package/scripts/review/review-comment-round.ts +10 -5
  638. package/scripts/rules/broad-investigation-shell.ts +2 -2
  639. package/scripts/rules/codex-prompt.ts +63 -0
  640. package/scripts/rules/direct-issue-comment.ts +62 -2
  641. package/scripts/rules/direct-issue-read.ts +55 -2
  642. package/scripts/rules/guard-remedy.ts +10 -4
  643. package/scripts/rules/issue-citation.ts +20 -9
  644. package/scripts/rules/last-prompt.ts +8 -4
  645. package/scripts/rules/rule-value-cli.ts +85 -4
  646. package/scripts/rules/rule-value-trend.ts +108 -0
  647. package/scripts/rules/shell-redirects.ts +19 -7
  648. package/scripts/rules/shell-segments.ts +145 -20
  649. package/scripts/rules/shell-tokens.ts +66 -0
  650. package/scripts/rules/standalone-gh-call.ts +63 -0
  651. package/scripts/rules/unasked-filing.ts +12 -4
  652. package/scripts/run/board/run-board-closed.ts +10 -1
  653. package/scripts/run/board/run-board-decision-read.ts +52 -12
  654. package/scripts/run/board/run-board-decision.ts +5 -0
  655. package/scripts/run/board/run-board-ending-reason.ts +21 -7
  656. package/scripts/run/board/run-board-github.ts +8 -1
  657. package/scripts/run/board/run-board-header.ts +4 -5
  658. package/scripts/run/board/run-board-layout.ts +5 -3
  659. package/scripts/run/board/run-board-link.ts +2 -0
  660. package/scripts/run/board/run-board-operation.ts +6 -2
  661. package/scripts/run/board/run-board-pause-fixture.json +12 -0
  662. package/scripts/run/board/run-board-pause.ts +87 -0
  663. package/scripts/run/board/run-board-plan-shared.ts +2 -0
  664. package/scripts/run/board/run-board-read.ts +7 -1
  665. package/scripts/run/board/run-board-render-condition.ts +10 -1
  666. package/scripts/run/board/run-board-render-title.ts +7 -0
  667. package/scripts/run/board/run-board-roots.ts +25 -2
  668. package/scripts/run/board/run-board-settle.ts +16 -2
  669. package/scripts/run/board/run-board-setup.ts +13 -7
  670. package/scripts/run/board/run-board-snapshot.ts +4 -0
  671. package/scripts/run/board/run-board-status.ts +13 -1
  672. package/scripts/run/board/run-board-tick.ts +7 -1
  673. package/scripts/run/cut/run-cut-cli.ts +2 -1
  674. package/scripts/run/park/run-park-cli.ts +13 -1
  675. package/scripts/run/park/run-park-escalate.ts +102 -0
  676. package/scripts/run/park/run-stalled.ts +29 -7
  677. package/scripts/run/review/run-review-early-push.ts +6 -6
  678. package/scripts/run/ship/run-ship-stop-cause.ts +12 -1
  679. package/scripts/split/split-assess.ts +14 -5
  680. package/scripts/test/test-related-touched.ts +21 -3
  681. package/scripts/test/test-related.ts +1 -1
  682. package/dist/commands/chunk-6WEVLIZE.js +0 -29
  683. package/dist/commands/chunk-E2ZCUKHT.js +0 -274
  684. package/dist/commands/chunk-NMLCPYBN.js +0 -134
  685. package/dist/commands/chunk-QEIO2ZNQ.js +0 -324
  686. package/dist/commands/chunk-QWX7EBC6.js +0 -112
  687. package/dist/commands/chunk-RQRLW4XK.js +0 -20
  688. package/dist/commands/chunk-UCQJDYE3.js +0 -21
  689. package/dist/commands/chunk-W4YH2DF3.js +0 -58
  690. package/dist/commands/{chunk-LRA3PXHS.js → chunk-ENKFCOVY.js} +3 -3
  691. package/dist/commands/{chunk-RUWV4INF.js → chunk-HQGNXR6I.js} +3 -3
@@ -0,0 +1,83 @@
1
+ import { agent_argv, type AgentArgv, type AgentArgvResult } from '#scripts/agent/agent-argv'
2
+ import {
3
+ agent_role_profile,
4
+ type AgentProfile,
5
+ type ProfileResult,
6
+ } from '#scripts/agent/agent-role-profile'
7
+ import { agent_worker_profile } from '#scripts/agent/agent-worker-profile'
8
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
9
+ import { run_ending } from '#scripts/run/run-ending'
10
+ import { lane_dispatch_log } from './lane-dispatch-log'
11
+ import type { LaneInfo } from './lane-registry'
12
+ import { lane_resume, type ResumePlan } from './lane-resume'
13
+
14
+ type Prepared =
15
+ | {
16
+ kind: 'prepared'
17
+ invocation: string
18
+ argv: AgentArgv
19
+ profile: AgentProfile
20
+ resumed_from: string | undefined
21
+ }
22
+ | { kind: 'rejected'; note: string }
23
+
24
+ // Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
25
+ // Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
26
+ // exactly the reasons a fresh dispatch is.
27
+ function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
28
+ if (plan.kind === 'resume') {
29
+ return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
30
+ }
31
+
32
+ return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
33
+ }
34
+
35
+ // **The worker profile the lane's Issue selects, where the repository opts into `josh.worker`**.
36
+ // The Issue's `worker:<name>` label (else the configured default) wins over `JOSH_WORKER_MODEL` /
37
+ // `JOSH_WORKER_EFFORT`; a repository without the setting resolves the worker from the environment as
38
+ // before and never reads the labels. `record_output` keeps the chosen profile in the lane's `.env`,
39
+ // which a cut relaunch resumes on.
40
+ async function worker_profile(lane: LaneInfo): Promise<ProfileResult> {
41
+ const worker = await agent_worker_profile.resolve(
42
+ lane.directory,
43
+ async () => await git_gh_issue_write.read_label_names(lane.issue),
44
+ )
45
+
46
+ if (worker.kind === 'unset') return agent_role_profile.resolve(agent_role_profile.WORKER)
47
+
48
+ return worker.kind === 'rejected' ? worker : { kind: 'profile', profile: worker.worker.agent }
49
+ }
50
+
51
+ // **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
52
+ // The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
53
+ // none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
54
+ // first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh. **A
55
+ // fresh dispatch never reads the record**: a person restarting a child (`lane:restart`) wants a new
56
+ // session that reads the Issue from the start, whatever the previous one ended on.
57
+ async function prepared(lane: LaneInfo, is_fresh: boolean): Promise<Prepared> {
58
+ const resolved = await worker_profile(lane)
59
+
60
+ if (resolved.kind === 'rejected') return resolved
61
+
62
+ const record = is_fresh
63
+ ? undefined
64
+ : run_ending.read_exit(lane_dispatch_log.default_log_path(lane))
65
+ const plan = lane_resume.plan(lane.issue, record, resolved.profile.provider)
66
+ const built = built_for(plan, resolved.profile, lane)
67
+
68
+ if (built.kind === 'rejected') return built
69
+ const resumed_from = plan.kind === 'resume' ? plan.session_id : undefined
70
+
71
+ return {
72
+ kind: 'prepared',
73
+ invocation: plan.invocation,
74
+ argv: built.argv,
75
+ profile: built.profile,
76
+ resumed_from,
77
+ }
78
+ }
79
+
80
+ const lane_dispatch_prepare = { prepared }
81
+
82
+ export type { Prepared }
83
+ export { lane_dispatch_prepare }
@@ -1,4 +1,4 @@
1
- import { agent_argv, type AgentArgv, type AgentArgvResult } from '#scripts/agent/agent-argv'
1
+ import type { AgentArgv } from '#scripts/agent/agent-argv'
2
2
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
3
3
  import type { LabelWrite } from '#scripts/gh/git-gh-issue-write'
4
4
  import { issue_cite } from '#scripts/issue/issue-cite'
@@ -10,15 +10,14 @@ import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
10
10
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
11
11
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
12
12
  import { run_park } from '#scripts/run/park/run-park'
13
- import { run_ending } from '#scripts/run/run-ending'
14
13
  import { run_label } from '#scripts/run/run-label'
15
14
  import { lane_child_invocation } from './lane-child-invocation'
16
15
  import { lane_child_marker } from './lane-child-marker'
17
16
  import { lane_dispatch_log } from './lane-dispatch-log'
17
+ import { lane_dispatch_prepare } from './lane-dispatch-prepare'
18
18
  import { lane_ledger_write } from './lane-ledger-write'
19
19
  import { lane_output } from './lane-output'
20
20
  import { lane_registry, type LaneInfo } from './lane-registry'
21
- import { lane_resume, type ResumePlan } from './lane-resume'
22
21
  import { lane_seat_start } from './lane-seat-start'
23
22
  import { lane_state } from './lane-state'
24
23
  import { openai_lane_supervisor } from './openai-lane-supervisor'
@@ -51,7 +50,6 @@ const WARNING_RECOVERY =
51
50
  // once rather than inlined at each use.
52
51
  const LABEL_UNSET_KIND = 'label-unset'
53
52
  const RESTART_START = 'restart'
54
- // The role a lane child runs under, resolved once so the fresh and resume builders read the same one.
55
53
 
56
54
  interface Dispatched {
57
55
  kind: 'dispatched'
@@ -93,16 +91,6 @@ interface StartRequest {
93
91
  resumed_from: string | undefined
94
92
  }
95
93
 
96
- type Prepared =
97
- | {
98
- kind: 'prepared'
99
- invocation: string
100
- argv: AgentArgv
101
- profile: AgentProfile
102
- resumed_from: string | undefined
103
- }
104
- | { kind: 'rejected'; note: string }
105
-
106
94
  /** The prompt the headless child is given: `fullrun #<N>`, and nothing a caller supplied verbatim. */
107
95
  function child_invocation(issue: string): string {
108
96
  return lane_child_invocation.child_invocation(issue)
@@ -276,44 +264,6 @@ async function started(request: StartRequest): Promise<DispatchOutcome> {
276
264
  return await dispatched_start(request, result.pid, notes, nonce)
277
265
  }
278
266
 
279
- // Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
280
- // Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
281
- // exactly the reasons a fresh dispatch is.
282
- function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
283
- if (plan.kind === 'resume') {
284
- return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
285
- }
286
-
287
- return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
288
- }
289
-
290
- // **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
291
- // The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
292
- // none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
293
- // first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh. **A
294
- // fresh dispatch never reads the record**: a person restarting a child (`lane:restart`) wants a new
295
- // session that reads the Issue from the start, whatever the previous one ended on.
296
- function prepared(lane: LaneInfo, is_fresh: boolean): Prepared {
297
- const resolved = agent_role_profile.resolve(agent_role_profile.WORKER)
298
-
299
- if (resolved.kind === 'rejected') return resolved
300
-
301
- const record = is_fresh ? undefined : run_ending.read_exit(default_log_path(lane))
302
- const plan = lane_resume.plan(lane.issue, record, resolved.profile.provider)
303
- const built = built_for(plan, resolved.profile, lane)
304
-
305
- if (built.kind === 'rejected') return built
306
- const resumed_from = plan.kind === 'resume' ? plan.session_id : undefined
307
-
308
- return {
309
- kind: 'prepared',
310
- invocation: plan.invocation,
311
- argv: built.argv,
312
- profile: built.profile,
313
- resumed_from,
314
- }
315
- }
316
-
317
267
  // **The parent claims the marker before it starts the child**, so the window in which a running child
318
268
  // is uncounted closes at dispatch rather than tens of minutes later once the child's own `fullrun` gets
319
269
  // to its (idempotent) apply. `issue_add_label` creates the label if the repository lacks it — a
@@ -400,7 +350,7 @@ async function dispatch_child(
400
350
  const lane = await lane_registry.find_open_lane(issue)
401
351
 
402
352
  if (lane === undefined) return { kind: 'no-lane' }
403
- const built = prepared(lane, start === RESTART_START)
353
+ const built = await lane_dispatch_prepare.prepared(lane, start === RESTART_START)
404
354
  const log_path = default_log_path(lane)
405
355
 
406
356
  if (built.kind === 'rejected') return { kind: 'failed', lane, log_path, note: built.note }
@@ -0,0 +1,118 @@
1
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
2
+ import type { RunEvent } from '#scripts/run/event/run-event-stream'
3
+ import { lane_breakdown } from './lane-breakdown'
4
+ import { lane_ledger, type LedgerEntry } from './lane-ledger'
5
+ import { lane_net_time, type LaneSpan } from './lane-net-time'
6
+ import { lane_stage_budget } from './lane-stage-budget'
7
+ import type { ToolCall } from './lane-transcript-calls'
8
+
9
+ // Wall-clock accounting, separate from legacy lane net. Human wait wins over automatic wait;
10
+ // automatic wait wins over off-tool work. Parallel tool durations remain a separate cumulative value.
11
+ interface ElapsedTime {
12
+ total_ms: number
13
+ human_ms: number
14
+ automatic_ms: number
15
+ work_ms: number
16
+ unclassified_ms: number
17
+ tool_ms: number
18
+ within_target: boolean
19
+ }
20
+
21
+ const EDIT_TOOLS: ReadonlySet<string> = new Set(['Edit', 'Write'])
22
+ const AUTOMATIC_STAGES: ReadonlySet<string> = new Set([
23
+ 'gate',
24
+ 'pre-detach',
25
+ 'followup',
26
+ lane_ledger.CI_WAIT_STAGE,
27
+ ])
28
+
29
+ function tool_spans(calls: ReadonlyArray<ToolCall>): Array<LaneSpan> {
30
+ return calls.flatMap((call) =>
31
+ call.duration_ms === undefined || EDIT_TOOLS.has(call.tool ?? '')
32
+ ? []
33
+ : { from_ms: call.started_ms, to_ms: call.started_ms + call.duration_ms },
34
+ )
35
+ }
36
+
37
+ function stage_spans(entries: ReadonlyArray<LedgerEntry>, issue: number): Array<LaneSpan> {
38
+ return entries.flatMap((entry) =>
39
+ entry.kind === lane_ledger.KIND.STAGE &&
40
+ entry.issue === issue &&
41
+ AUTOMATIC_STAGES.has(entry.stage)
42
+ ? { from_ms: Date.parse(entry.at) - entry.elapsed_ms, to_ms: Date.parse(entry.at) }
43
+ : [],
44
+ )
45
+ }
46
+
47
+ function human_spans(
48
+ entries: ReadonlyArray<LedgerEntry>,
49
+ events: ReadonlyArray<RunEvent>,
50
+ issue: number,
51
+ span: LaneSpan,
52
+ ): ReadonlyArray<LaneSpan> {
53
+ return lane_net_time.hold_waits(
54
+ entries,
55
+ events.filter((event) => event.kind === 'park'),
56
+ issue,
57
+ span,
58
+ )
59
+ }
60
+
61
+ function tool_ms(span: LaneSpan, calls: ReadonlyArray<ToolCall>): number {
62
+ return tool_spans(calls).reduce((sum, call) => sum + lane_breakdown.covered_ms(span, [call]), 0)
63
+ }
64
+
65
+ function partition(
66
+ span: LaneSpan,
67
+ human: ReadonlyArray<LaneSpan>,
68
+ automatic: ReadonlyArray<LaneSpan>,
69
+ calls: ReadonlyArray<ToolCall>,
70
+ ): ElapsedTime {
71
+ const total_ms = span.to_ms - span.from_ms
72
+ const human_ms = lane_breakdown.covered_ms(span, human)
73
+ const occupied_ms = lane_breakdown.covered_ms(span, [...human, ...automatic])
74
+ const remainder_ms = total_ms - occupied_ms
75
+
76
+ return {
77
+ total_ms,
78
+ human_ms,
79
+ automatic_ms: occupied_ms - human_ms,
80
+ work_ms: calls.length > 0 ? remainder_ms : 0,
81
+ unclassified_ms: calls.length > 0 ? 0 : remainder_ms,
82
+ tool_ms: tool_ms(span, calls),
83
+ within_target: total_ms <= lane_stage_budget.TARGET_MINUTES * MS_PER_MINUTE,
84
+ }
85
+ }
86
+
87
+ function of(
88
+ entries: ReadonlyArray<LedgerEntry>,
89
+ events: ReadonlyArray<RunEvent>,
90
+ issue: number,
91
+ calls: ReadonlyArray<ToolCall>,
92
+ ): ElapsedTime | undefined {
93
+ const span = lane_net_time.span_of(entries, issue)
94
+ if (span === undefined) return undefined
95
+ const human = human_spans(entries, events, issue, span)
96
+ const automatic = [
97
+ ...lane_net_time.automatic_waits(entries, events, issue, span),
98
+ ...stage_spans(entries, issue),
99
+ ...tool_spans(calls),
100
+ ]
101
+
102
+ return partition(span, human, automatic, calls)
103
+ }
104
+
105
+ function text(timing: ElapsedTime): string {
106
+ const minutes = lane_breakdown.minutes_text
107
+ const status = timing.within_target ? 'within target' : 'over target'
108
+
109
+ return [
110
+ `End-to-end ${minutes(timing.total_ms)} (${status}); ${lane_stage_budget.DESCRIPTION}`,
111
+ `Exclusive wall clock: off-tool work ${minutes(timing.work_ms)}; automatic wait ${minutes(timing.automatic_ms)}; human wait ${minutes(timing.human_ms)}; unclassified (missing transcripts) ${minutes(timing.unclassified_ms)}`,
112
+ `Tool cumulative ${minutes(timing.tool_ms)} (parallel calls overlap; not additive to wall clock). Off-tool work includes unrecorded activity; automatic wait includes tool responses, gate, CI, yield, outage and sleep. Legacy net excludes more than human wait.`,
113
+ ].join('\n')
114
+ }
115
+
116
+ const lane_elapsed_time = { of, text }
117
+
118
+ export { lane_elapsed_time }
@@ -24,7 +24,9 @@ const early_push_schema = z.object({
24
24
  // finding that decided a review or round-2 stop — the blocking ones, else the fixed ones
25
25
  // (joshuafolkken/kit#4426), absent where none decided the stop. `base` is the change base a review
26
26
  // failure or a followup `check` stopped on, so its re-ship can tell a fix-only tree from a moved base
27
- // (joshuafolkken/kit#6141, joshuafolkken/kit#6675), absent on every other stop. How long it stayed stopped is derived
27
+ // (joshuafolkken/kit#6141, joshuafolkken/kit#6675), absent on every other stop. `checks` names the CI
28
+ // checks a followup `check` stop's wait reported failed (joshuafolkken/kit#7333), absent on every other
29
+ // stop and on one recorded before it had them. How long it stayed stopped is derived
28
30
  // from the next ship stage, not recorded, so a resumed ship never has to know the stop it ends.
29
31
  const stop_schema = z.object({
30
32
  kind: z.literal(KIND.STOP),
@@ -35,6 +37,7 @@ const stop_schema = z.object({
35
37
  preconditions: z.array(z.string()).optional(),
36
38
  findings: z.array(z.string()).optional(),
37
39
  base: z.string().optional(),
40
+ checks: z.array(z.string()).optional(),
38
41
  })
39
42
  // One `josh run:chain` on `issue`, done or stopped: `at` is its end and `elapsed_ms` its length, so the
40
43
  // next run's start ends the wait after a stop. `stage` names where it stopped and `reason` why — the
@@ -4,6 +4,7 @@ import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
4
4
  import type { LedgerEntry } from './lane-ledger'
5
5
  import { lane_sleep } from './lane-sleep'
6
6
  import { lane_spans, type IssueAt, type Span } from './lane-spans'
7
+ import { lane_stage_events } from './lane-stage-events'
7
8
  import { lane_stage_stats } from './lane-stage-stats'
8
9
  import { lane_stop_stats } from './lane-stop-stats'
9
10
  import { lane_yield } from './lane-yield'
@@ -35,7 +36,9 @@ function entries_of(entries: ReadonlyArray<LedgerEntry>, issue: number): Array<L
35
36
  // The first dispatch of `issue` to its merge, or `undefined` while either is missing or the merge comes
36
37
  // first.
37
38
  function span_of(entries: ReadonlyArray<LedgerEntry>, issue: number): LaneSpan | undefined {
38
- const of_issue = entries_of(entries, issue)
39
+ const of_issue = entries_of(entries, issue).toSorted(
40
+ (left, right) => Date.parse(left.at) - Date.parse(right.at),
41
+ )
39
42
  const from = of_issue.find((entry) => lane_stage_stats.is_dispatch(entry))
40
43
  const to = of_issue.findLast((entry) => lane_stage_stats.is_merge(entry))
41
44
 
@@ -191,10 +194,7 @@ function split_waits(
191
194
  return cut_inside(split_spans(entries, events_of_issue(events, issue)), span)
192
195
  }
193
196
 
194
- // The waits `net_ms` takes out of `span` — each hold from itself to its end, cut at the merge, each
195
- // yield and split run until its redispatch, and each sleep of the host — the intervals `josh
196
- // lane:breakdown` counts as excluded (`lane-breakdown.ts`).
197
- function waits(
197
+ function waiting(
198
198
  entries: ReadonlyArray<LedgerEntry>,
199
199
  events: ReadonlyArray<RunEvent>,
200
200
  issue: number,
@@ -203,11 +203,23 @@ function waits(
203
203
  return joined([
204
204
  ...hold_waits(entries, events, issue, span),
205
205
  ...yielded(entries, events, issue, span),
206
- ...split_waits(entries, events, issue, span),
207
206
  ...slept(events, span),
208
207
  ])
209
208
  }
210
209
 
210
+ // Legacy net also leaves out the complete run that split its issue.
211
+ function waits(
212
+ entries: ReadonlyArray<LedgerEntry>,
213
+ events: ReadonlyArray<RunEvent>,
214
+ issue: number,
215
+ span: LaneSpan,
216
+ ): Array<LaneSpan> {
217
+ return joined([
218
+ ...waiting(entries, events, issue, span),
219
+ ...split_waits(entries, events, issue, span),
220
+ ])
221
+ }
222
+
211
223
  function is_followup_start(event: RunEvent): boolean {
212
224
  const { stage, phase } = run_ship_stage.words_of(event.text)
213
225
 
@@ -230,6 +242,17 @@ function followed(events: ReadonlyArray<RunEvent>, issue: number, span: LaneSpan
230
242
  .map(({ line, to_ms }) => ({ from_ms: line.at_ms, to_ms }))
231
243
  }
232
244
 
245
+ function automatic_waits(
246
+ entries: ReadonlyArray<LedgerEntry>,
247
+ events: ReadonlyArray<RunEvent>,
248
+ issue: number,
249
+ span: LaneSpan,
250
+ ): Array<LaneSpan> {
251
+ const stages = lane_stage_events.of(entries, events, issue)
252
+
253
+ return joined([...waiting(entries, events, issue, span), ...followed(stages, issue, span)])
254
+ }
255
+
233
256
  // Every interval `net_ms` leaves out of `span`: the waits and the driver's followups, joined.
234
257
  function outside(
235
258
  entries: ReadonlyArray<LedgerEntry>,
@@ -237,7 +260,10 @@ function outside(
237
260
  issue: number,
238
261
  span: LaneSpan,
239
262
  ): Array<LaneSpan> {
240
- return joined([...waits(entries, events, issue, span), ...followed(events, issue, span)])
263
+ return joined([
264
+ ...automatic_waits(entries, events, issue, span),
265
+ ...split_waits(entries, events, issue, span),
266
+ ])
241
267
  }
242
268
 
243
269
  /**
@@ -282,6 +308,8 @@ function missing_reason(entries: ReadonlyArray<LedgerEntry>, issue: number): str
282
308
  }
283
309
 
284
310
  const lane_net_time = {
311
+ automatic_waits,
312
+ hold_waits,
285
313
  missing_reason,
286
314
  net_minutes,
287
315
  net_ms,
@@ -215,7 +215,7 @@ type OverranNet = Extract<LaneNet, { kind: 'minutes' }>
215
215
  async function overran_text(issue: number, net: OverranNet): Promise<string> {
216
216
  const breakdown =
217
217
  lane_breakdown_implement.breakdown_of(net.entries, net.events, issue) ?? net.breakdown
218
- const report = lane_breakdown_text.report_of(issue, breakdown, net.entries)
218
+ const report = lane_breakdown_text.report_of(issue, breakdown, net.entries, net.events)
219
219
  const comment = lane_breakdown_text.comment(issue, net.minutes, report)
220
220
 
221
221
  if (!net.is_commented) await git_gh_issue_write.issue_try_comment(String(issue), comment)
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import type { LanePlan } from './lane-plan'
4
4
  import { lane_plan_approval } from './lane-plan-approval'
5
5
  import { lane_plan_check } from './lane-plan-check'
6
+ import { lane_plan_estimate } from './lane-plan-estimate'
6
7
  import { lane_plan_imports } from './lane-plan-imports'
7
8
 
8
9
  // `josh lane:plan <issue> <path>... [--probe] [--imports <path>...]` — the command line over
@@ -16,7 +17,7 @@ const PROBE_FLAG = '--probe'
16
17
  const SINGLE_FLAG = '--single'
17
18
  const FLAGS = new Set([PROBE_FLAG, SINGLE_FLAG])
18
19
  const USAGE =
19
- 'Usage: josh lane:plan <issue-number> <path> [<path> ...] [--probe] [--single] [--size-approval <json-file>] [--imports <path> ...]'
20
+ 'Usage: josh lane:plan <issue-number> <path> [<path> ...] [--probe] [--single] [--estimate <json-file>] [--size-approval <json-file>] [--imports <path> ...]'
20
21
  const { YIELD_EXIT_CODE } = lane_plan_check
21
22
 
22
23
  async function planned(
@@ -24,12 +25,15 @@ async function planned(
24
25
  directory: string,
25
26
  is_single: boolean,
26
27
  ): Promise<LanePlan | undefined> {
27
- const input = lane_plan_approval.split(tokens)
28
+ const estimate = lane_plan_estimate.split(tokens)
29
+ const input = lane_plan_approval.split(estimate.tokens)
28
30
  const plan = lane_plan_check.plan_of(input.tokens, new Date())
29
31
  if (plan === undefined) return undefined
30
32
  const declared = is_single ? { ...plan, single: true } : plan
31
33
 
32
- return await lane_plan_approval.attach(lane_plan_check.placed(declared, directory), input.file)
34
+ const scoped = await lane_plan_estimate.attach(declared, estimate.file)
35
+
36
+ return await lane_plan_approval.attach(lane_plan_check.placed(scoped, directory), input.file)
33
37
  }
34
38
 
35
39
  async function run(
@@ -0,0 +1,57 @@
1
+ import { readFile } from 'node:fs/promises'
2
+ import { split_assess } from '#scripts/split/split-assess'
3
+ import { z } from 'zod'
4
+ import type { LanePlan } from './lane-plan'
5
+
6
+ // Selected consumers, distributed docs and verification fixtures share the actual-size calculator.
7
+ // A reference alone implies neither an edit nor an independently mergeable split boundary.
8
+ const FLAG = '--estimate'
9
+ const FLAG_WIDTH = 2
10
+ const change_schema = z.object({
11
+ path: z.string().trim().min(1),
12
+ changed_lines: z.number().int().nonnegative(),
13
+ })
14
+ const schema = z.object({
15
+ changes: z.array(change_schema),
16
+ added: z.array(z.string()).default([]),
17
+ })
18
+
19
+ function split(tokens: ReadonlyArray<string>): { tokens: Array<string>; file?: string } {
20
+ const at = tokens.indexOf(FLAG)
21
+ if (at === -1) return { tokens: [...tokens] }
22
+ if (tokens.lastIndexOf(FLAG) !== at) throw new Error('duplicate --estimate')
23
+ const file = tokens[at + 1]
24
+ if (file === undefined || file.startsWith('--')) throw new Error('--estimate needs a JSON file')
25
+
26
+ return { tokens: [...tokens.slice(0, at), ...tokens.slice(at + FLAG_WIDTH)], file }
27
+ }
28
+
29
+ async function read(file: string): Promise<z.infer<typeof schema>> {
30
+ const scope = schema.parse(JSON.parse(await readFile(file, 'utf8')))
31
+ const paths = scope.changes.map((change) => change.path)
32
+ if (new Set(paths).size !== paths.length) throw new Error('duplicate estimate path')
33
+
34
+ if (scope.added.some((path) => !paths.includes(path))) {
35
+ throw new Error('added path needs an estimate')
36
+ }
37
+
38
+ return scope
39
+ }
40
+
41
+ async function attach(plan: LanePlan, file: string | undefined): Promise<LanePlan> {
42
+ if (file === undefined) return plan
43
+ const scope = await read(file)
44
+ const paths = scope.changes.map((change) => change.path)
45
+
46
+ if (plan.paths.some((path) => !paths.includes(path))) {
47
+ throw new Error('planned path needs an estimate')
48
+ }
49
+
50
+ const size = split_assess.measure(scope.changes, undefined, new Set(scope.added))
51
+
52
+ return { ...plan, paths, estimated_size: { files: size.files, lines: size.lines } }
53
+ }
54
+
55
+ const lane_plan_estimate = { attach, read, split }
56
+
57
+ export { lane_plan_estimate }
@@ -1,4 +1,3 @@
1
- import { codex_hooks } from '#scripts/agent/codex-hooks'
2
1
  import type { OpenIssueData } from '#scripts/git/git-schemas'
3
2
  import { issue_body_keys } from '#scripts/issue/issue-body-keys'
4
3
  import { session_cite } from '#scripts/issue/session-cite'
@@ -163,20 +162,10 @@ function files_approved(
163
162
  )
164
163
  }
165
164
 
166
- // An artifact a build regenerates from one of `sources` (joshuafolkken/kit#6666): its edit is its source's,
167
- // so it is not counted and stays or splits off with its source — apart, the parity test fails.
168
- function is_generated_from(file: string, sources: ReadonlyArray<string>): boolean {
169
- const source = codex_hooks.GENERATED_SOURCES.get(file)
170
-
171
- return source !== undefined && sources.includes(source)
172
- }
173
-
174
- function is_counted(file: string, paths: ReadonlyArray<string>): boolean {
175
- return !test_declared_logic.is_test_file(file) && !is_generated_from(file, paths)
176
- }
177
-
178
- function with_artifacts(files: ReadonlyArray<string>, paths: ReadonlyArray<string>): Array<string> {
179
- return [...files, ...paths.filter((file) => is_generated_from(file, files))]
165
+ // Estimate paths and the actual diff exclude the same tests and run records. Generated pairs are
166
+ // grouped by `split_assess.units_of`, so no caller can split an artifact from its source.
167
+ function is_counted(file: string): boolean {
168
+ return split_assess.is_deliverable({ path: file, changed_lines: 0 })
180
169
  }
181
170
 
182
171
  function files_over(
@@ -186,7 +175,7 @@ function files_over(
186
175
  signals: PlanSignals,
187
176
  ): FilesOver | undefined {
188
177
  const limit = declared * declared_growth.factor(ratios_of(signals), 'files')
189
- const counted = plan.paths.filter((file) => is_counted(file, plan.paths))
178
+ const counted = plan.paths.filter((file) => is_counted(file))
190
179
  const units = units_of(ordered(counted, recorded?.paths ?? []), signals)
191
180
 
192
181
  if (units.length <= limit || files_approved(plan, declared, recorded, units.length)) {
@@ -194,8 +183,8 @@ function files_over(
194
183
  }
195
184
 
196
185
  const tests = plan.paths.filter((file) => test_declared_logic.is_test_file(file))
197
- const kept = with_artifacts(units.slice(0, limit).flat(), plan.paths)
198
- const split_off = with_artifacts(units.slice(limit).flat(), plan.paths)
186
+ const kept = counted.filter((file) => units.slice(0, limit).flat().includes(file))
187
+ const split_off = counted.filter((file) => units.slice(limit).flat().includes(file))
199
188
 
200
189
  return { reason: 'files', declared, limit, kept, split_off, tests }
201
190
  }
@@ -286,9 +275,11 @@ function measure_over(
286
275
  ): MeasureOver | undefined {
287
276
  if (signals.split_filed) return undefined
288
277
 
278
+ const estimated = Math.max(declared.lines, plan.estimated_size?.lines ?? 0)
279
+
289
280
  return (
290
281
  hunks_over(declared.files, unplanned_hunks(signals, plan, recorded), signals) ??
291
- planned_lines(declared.lines, signals, plan, recorded)
282
+ planned_lines(estimated, signals, plan, recorded)
292
283
  )
293
284
  }
294
285
 
@@ -343,7 +334,7 @@ const SIZE_PREFIX = issue_body_keys.prefix('size')
343
334
 
344
335
  function files_text(issue: number, over: FilesOver): string {
345
336
  const planned = [...over.kept, ...over.split_off]
346
- const counted = planned.filter((file) => is_counted(file, planned)).length
337
+ const counted = split_assess.units_of(planned, new Set()).length
347
338
  const bar = `${String(counted)} files (tests and generated artifacts excluded), over ${String(over.limit)} — ${String(over.limit / over.declared)} times the ${String(over.declared)} its \`${SIZE_PREFIX}\` declares`
348
339
  const replan = ['pnpm josh lane:plan', String(issue), ...over.kept, ...over.tests].join(' ')
349
340
 
@@ -24,6 +24,7 @@ const lane_plan_schema = z.object({
24
24
  issue: z.number(),
25
25
  paths: z.array(z.string()),
26
26
  planned_at: z.string(),
27
+ estimated_size: z.object({ files: z.number(), lines: z.number() }).optional(),
27
28
  size_approval: lane_plan_approval.approval_schema.optional(),
28
29
  // `--single`: the plan is one deliverable with no separately-mergeable part, so a files-axis overrun
29
30
  // is noted for the pre-gate `run:cut` to verify rather than refused (joshuafolkken/kit#6647).
@@ -1,4 +1,5 @@
1
1
  import { agent_argv } from '#scripts/agent/agent-argv'
2
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
2
3
  import { error_text } from '#scripts/lib/error-message'
3
4
  import { detached_launch, type LaunchResult } from '#scripts/run/detached-launch'
4
5
  import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
@@ -22,7 +23,7 @@ const { SUPERVISED_KEY } = run_ship_detach
22
23
  const OPENAI_PROVIDER = 'openai'
23
24
 
24
25
  type RelaunchResult = LaunchResult | { kind: 'rejected'; note: string }
25
- type Prepared = Exclude<ReturnType<typeof agent_argv.resume_argv>, { kind: 'rejected' }>
26
+ type Prepared = Exclude<Awaited<ReturnType<typeof agent_argv.resume_argv>>, { kind: 'rejected' }>
26
27
 
27
28
  function launch(lane: LaneInfo, built: Prepared, on_note: (note: string) => void): RelaunchResult {
28
29
  return detached_launch.launch(
@@ -53,10 +54,14 @@ async function relaunch(
53
54
  phase: string,
54
55
  on_note: (note: string) => void,
55
56
  ): Promise<RelaunchResult> {
56
- const built = agent_argv.resume_argv(invocation, lane.profile, phase, lane.directory)
57
- if (built.kind === 'rejected') return built
58
-
59
57
  try {
58
+ // The labels are read only when `josh.worker` caps the phase's model; a failed read refuses.
59
+ const built = await agent_argv.resume_argv(invocation, lane.profile, phase, {
60
+ cwd: lane.directory,
61
+ labels: async () => await git_gh_issue_write.read_label_names(lane.issue),
62
+ })
63
+ if (built.kind === 'rejected') return built
64
+
60
65
  return await lane_seat_start.start(lane, async (seated) => launch(seated, built, on_note))
61
66
  } catch (error) {
62
67
  return { kind: 'failed', note: error_text.message_of(error) }
@@ -12,6 +12,11 @@ const BUDGET_MINUTES = {
12
12
  followup: 5,
13
13
  } as const
14
14
 
15
+ // An end-to-end target, independent of the internal stage budgets and legacy lane net exclusions.
16
+ const TARGET_MINUTES = 30
17
+ const INTERNAL_MINUTES = Object.values(BUDGET_MINUTES).reduce((sum, minutes) => sum + minutes, 0)
18
+ const DESCRIPTION = `target ${String(TARGET_MINUTES)} min dispatch to merge (human wait reported separately, included); internal stage budgets ${String(INTERNAL_MINUTES)} min (plan 3 + implement 9 + ship 8 + followup 5)`
19
+
15
20
  type BudgetStage = keyof typeof BUDGET_MINUTES
16
21
 
17
22
  // The whole minutes `elapsed_ms` runs past `stage`'s budget, `undefined` within it.
@@ -21,7 +26,7 @@ function over_minutes(stage: BudgetStage, elapsed_ms: number): number | undefine
21
26
  return over_ms > 0 ? Math.ceil(over_ms / MS_PER_MINUTE) : undefined
22
27
  }
23
28
 
24
- const lane_stage_budget = { BUDGET_MINUTES, over_minutes }
29
+ const lane_stage_budget = { BUDGET_MINUTES, DESCRIPTION, TARGET_MINUTES, over_minutes }
25
30
 
26
31
  export { lane_stage_budget }
27
32
  export type { BudgetStage }