@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
@@ -1,13 +1,16 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { git_pr_checks } from '#scripts/gh/git-pr-checks'
2
3
  import { git_command } from '#scripts/git/git-command'
3
4
  import { main_sync } from '#scripts/git/main-sync'
4
5
  import { IGNORE_FOR_RELEASE_LABEL } from '#scripts/issue/issue-labels'
5
6
  import { error_text } from '#scripts/lib/error-message'
6
7
  import { review_comment_carry } from '#scripts/review/review-comment-carry'
7
8
  import { observation_ledger, OBSERVATION_LEDGER_DIRECTORY } from './observation-ledger'
9
+ import { observation_ledger_archive } from './observation-ledger-archive'
8
10
  import type { BrokenLine } from './observation-ledger-line'
9
11
  import { observation_ledger_prepare } from './observation-ledger-prepare'
10
12
  import { observations_flush_landing } from './observations-flush-landing'
13
+ import { observations_flush_transaction } from './observations-flush-transaction'
11
14
 
12
15
  // The commit path for the ledger lines no run's own commit carried. Every run —
13
16
  // a lane's included — commits its appended lines with its own pull request (`scripts/git/
@@ -29,13 +32,12 @@ const BRANCH_PREFIX = 'observations/'
29
32
  const SUCCESS_EXIT_CODE = 0
30
33
  const RETURN_FAILURE_MESSAGE =
31
34
  'Could not return this checkout to the default branch; `pnpm josh ms` printed the reason above.'
32
- const FAST_FORWARD_FAILURE_MESSAGE =
33
- 'The flush pull request merged, but the local default branch could not be fast-forwarded to it, so this checkout is still on the flush branch:'
34
35
  const DATE_END = 10
35
36
  const TIME_START = 11
36
37
  const TIME_END = 19
37
38
  const COLON = ':'
38
39
  const NO_COMMITS = 0
40
+ const NO_ARCHIVED_FILES = 0
39
41
 
40
42
  // **A count that could not be read is treated as "it may hold a commit".** Of the two refusals below
41
43
  // it chooses the one that warns about the only copy, because printing "nothing is stranded" on a
@@ -58,11 +60,22 @@ function branch_name_for(stamp: string): string {
58
60
 
59
61
  // **No `closes #N`.** A flush carries whatever observations the last cycle recorded; it answers to no
60
62
  // single issue, and the ledger's own lines say where each one was seen.
61
- function pull_request_body(): string {
63
+ //
64
+ // **A flush that archived says it moved lines** (joshuafolkken/kit#7336): "changes none" would be
65
+ // false of the removed files, so it says what holds instead — every line moved, none dropped.
66
+ function ledger_change_sentence(archived_files: number): string {
67
+ if (archived_files === NO_ARCHIVED_FILES) {
68
+ return 'so this pull request adds lines and changes none.'
69
+ }
70
+
71
+ return `so this pull request drops none: it adds lines, and moves ${String(archived_files)} closed issues' file(s) verbatim into the monthly \`archive-YYYY-MM.md\` files.`
72
+ }
73
+
74
+ function pull_request_body(archived_files: number): string {
62
75
  return [
63
76
  `Appended observations from \`${OBSERVATION_LEDGER_DIRECTORY}\` that no run's own commit carried.`,
64
77
  '',
65
- 'The ledger is append-only, and a second line under one key is what promotes an observation to an issue — so this pull request adds lines and changes none.',
78
+ `The ledger is append-only, and a second line under one key is what promotes an observation to an issue — ${ledger_change_sentence(archived_files)}`,
66
79
  '',
67
80
  'Opened by `pnpm josh observations:flush` (joshuafolkken/kit#1756).',
68
81
  ].join('\n')
@@ -212,7 +225,7 @@ async function catch_up_default(default_branch: string): Promise<void> {
212
225
  }
213
226
  }
214
227
 
215
- // Returns the default branch, which is what the rollback below checks out again.
228
+ // Refuse another person's work before creating the isolated flush checkout.
216
229
  async function refuse_unsafe_flush(status_output: string): Promise<string> {
217
230
  const current = await git_command.branch()
218
231
  const default_branch = await git_command.get_default_branch()
@@ -226,155 +239,28 @@ async function refuse_unsafe_flush(status_output: string): Promise<string> {
226
239
  return default_branch
227
240
  }
228
241
 
229
- // **`main_sync.run` rather than a third copy of its three lines.** `pnpm josh ms` and
230
- // `pnpm josh release`'s own `finally` already spell out "read the default branch, check it out, pull
231
- // it", and writing it again here would be the clone `CLAUDE.md` prohibits. Reusing the command also
232
- // brings its refusal inside a linked work tree, which is a precondition this flush wants anyway.
233
- //
234
- // **Its exit code is read rather than discarded**: `run` catches its own errors and returns `1`, so a
235
- // checkout left on the flush branch would otherwise be reported as a completed flush.
236
- //
237
- // **The local default branch is fast-forwarded before it is checked out**.
238
- // Lines appended while the pull request waited leave the ledger dirty, and git refuses to check out a
239
- // default branch whose ledger differs from the flush branch's. Once the merge is in, the fast-forwarded
240
- // default branch holds the same ledger the flush branch does, so the checkout carries those lines over.
241
- //
242
- // **A failed fast-forward says the merge is already in**, so the person reading it knows the ledger
243
- // lines are safe and only this checkout is left on the flush branch.
242
+ // The source stayed on the default branch; main:sync owns its fast-forward and exit status.
244
243
  async function return_to_default_branch(default_branch: string): Promise<void> {
245
- try {
246
- await git_command.fast_forward_local(default_branch)
247
- } catch (error) {
248
- throw new Error(`${FAST_FORWARD_FAILURE_MESSAGE} ${error_text.message_of(error)}`, {
249
- cause: error,
250
- })
251
- }
252
-
244
+ if ((await git_command.branch()) !== default_branch) throw new Error(RETURN_FAILURE_MESSAGE)
253
245
  const exit_code = await main_sync.run([])
254
246
 
255
247
  if (exit_code !== SUCCESS_EXIT_CODE) throw new Error(RETURN_FAILURE_MESSAGE)
256
248
  }
257
249
 
258
- // Everything after the commit, so a failure here can say what is on the branch and what it costs to
259
- // walk away from it.
260
- async function push_and_open(branch_name: string): Promise<string> {
250
+ // Publication failures retain the isolated commit and the source records for retry.
251
+ async function push_and_open(branch_name: string, body: string): Promise<string> {
261
252
  try {
262
253
  await git_command.push()
263
254
 
264
- return await git_gh_command.pr_create(
265
- COMMIT_MESSAGE,
266
- pull_request_body(),
267
- IGNORE_FOR_RELEASE_LABEL,
268
- )
269
- } catch (error) {
270
- throw new Error(stranded_branch_message(branch_name, error_text.message_of(error)), {
271
- cause: error,
272
- })
273
- }
274
- }
275
-
276
- // **The side that created the branch is the side that rolls it back**, so a commit rejected by the
277
- // pre-commit hook does not leave the branch behind with nothing on it. Nothing is stranded at this
278
- // point — the appended lines are still in the working tree, staged and uncommitted — so returning to
279
- // the default branch and removing the branch loses none of them.
280
- //
281
- // **Its own failure is returned rather than thrown or printed**, so the single error the command
282
- // exits with can carry both facts — why the commit was rejected, and whether the branch is still
283
- // there. Printed above the throw it scrolled past the message that mattered; thrown over it, the
284
- // reason for the rejection was lost outright. `undefined` means the rollback finished.
285
- async function roll_back(branch_name: string, default_branch: string): Promise<string | undefined> {
286
- try {
287
- await git_command.checkout(default_branch)
288
- await git_command.delete_branch(branch_name)
289
-
290
- return undefined
291
- } catch (error) {
292
- return error_text.message_of(error)
293
- }
294
- }
295
-
296
- // **The message is chosen from what the rollback did, never assumed.** A rollback that could not
297
- // check the default branch out leaves the branch exactly where it was, and a message asserting its
298
- // removal would send somebody looking for something that is still in the checkout.
299
- function rejection_message(
300
- branch_name: string,
301
- reason: string,
302
- roll_back_reason: string | undefined,
303
- ): string {
304
- if (roll_back_reason === undefined) return rejected_commit_message(branch_name, reason)
305
-
306
- return roll_back_failure_message(branch_name, reason, roll_back_reason)
307
- }
308
-
309
- // **Every ledger path the status names is staged, not the one constant**.
310
- // After a migration the change is the new file together with the old one's deletion, and a commit
311
- // holding only the first would leave the deletion behind as a change no later flush could tell apart
312
- // from a fresh append.
313
- async function stage_ledger(): Promise<void> {
314
- const ledger_paths = observation_ledger.ledger_paths(await git_command.status())
315
-
316
- for (const file_path of ledger_paths) {
317
- // eslint-disable-next-line no-await-in-loop -- git add holds the index lock, so two at once fail
318
- await git_command.add_path(file_path)
319
- }
320
- }
321
-
322
- async function commit_ledger(branch_name: string, default_branch: string): Promise<void> {
323
- try {
324
- await stage_ledger()
325
- await git_command.commit(COMMIT_MESSAGE)
255
+ return await git_gh_command.pr_create(COMMIT_MESSAGE, body, IGNORE_FOR_RELEASE_LABEL)
326
256
  } catch (error) {
327
- const roll_back_reason = await roll_back(branch_name, default_branch)
328
-
329
257
  throw new Error(
330
- rejection_message(branch_name, error_text.message_of(error), roll_back_reason),
331
- {
332
- cause: error,
333
- },
258
+ `The ledger is committed on \`${branch_name}\` in the recovery worktree; publication failed: ${error_text.message_of(error)}. The source checkout and original records are preserved. Rerun \`pnpm josh observations:flush\` from the source checkout to resume.`,
259
+ { cause: error },
334
260
  )
335
261
  }
336
262
  }
337
263
 
338
- async function open_pull_request(branch_name: string, default_branch: string): Promise<string> {
339
- await git_command.checkout_b(branch_name)
340
- await commit_ledger(branch_name, default_branch)
341
-
342
- return await push_and_open(branch_name)
343
- }
344
-
345
- // **The checkout goes back to the default branch only on the way that merged.** A `finally` here
346
- // would check the default branch out after a red check too — and the ledger would then
347
- // revert to main's content, leaving the appended lines on a branch nothing in this checkout points
348
- // at any more. The next flush would read `has_ledger_change` as false and report `clean`, which is
349
- // the silent loss the refusals above exist to prevent. Left on the branch, the refusal fires.
350
- //
351
- // With auto-merge on, a failed wait does not strand the lines for good — GitHub still merges once
352
- // the checks pass — but the checkout stays on the branch all the same,
353
- // because only a merge this command has seen makes returning to the default branch safe.
354
- async function land(
355
- branch_name: string,
356
- default_branch: string,
357
- is_auto_merge: boolean,
358
- ): Promise<void> {
359
- try {
360
- await observations_flush_landing.wait_for_landing(branch_name, is_auto_merge)
361
- } catch (error) {
362
- throw new Error(stranded_branch_message(branch_name, error_text.message_of(error)), {
363
- cause: error,
364
- })
365
- }
366
-
367
- await return_to_default_branch(default_branch)
368
- }
369
-
370
- async function open_and_land(branch_name: string, default_branch: string): Promise<void> {
371
- console.info(await open_pull_request(branch_name, default_branch))
372
-
373
- const is_auto_merge = await observations_flush_landing.request_auto_merge(branch_name)
374
-
375
- await land(branch_name, default_branch, is_auto_merge)
376
- }
377
-
378
264
  function merged_message(branch_name: string): string {
379
265
  return `merged \`${branch_name}\` — the appended observations are on the default branch`
380
266
  }
@@ -385,64 +271,78 @@ function broken_lines_message(broken: ReadonlyArray<BrokenLine>): string {
385
271
  return `\`${OBSERVATION_LEDGER_DIRECTORY}\` has ${String(broken.length)} line(s) that break the ledger grammar, so the ledger commit stops rather than carrying them:\n${rows}`
386
272
  }
387
273
 
388
- // **A malformed line is refused before a branch is cut, not after.** The ledger path was collected
389
- // without a line ever being parsed, so a broken append could ride a flush
390
- // through; validating here keeps the committed ledger to its grammar. The migration and the parse are
391
- // `observation-ledger-prepare.ts`'s, shared with the run's own commit.
274
+ // Validate the isolated payload before staging it.
392
275
  async function prepare_ledger(): Promise<void> {
393
276
  const broken = await observation_ledger_prepare.prepare(process.cwd())
394
277
 
395
278
  if (broken.length > 0) throw new Error(broken_lines_message(broken))
396
279
  }
397
280
 
398
- // The checkout made safe and caught up: a carried file an earlier flush left uncommitted is discarded
399
- // first, since it would make git refuse the fast-forward (`review-comment-carry.ts`).
281
+ // Recovery must precede a freshness check: an already landed archive can conflict with the snapshot.
400
282
  async function ready_default_branch(status_output: string): Promise<string> {
401
283
  const default_branch = await refuse_unsafe_flush(status_output)
402
284
 
403
- review_comment_carry.discard_uncommitted(status_output, process.cwd())
404
- await catch_up_default(default_branch)
285
+ if (status_output.split('\n').some((line) => /^[^ ?]/u.test(line))) {
286
+ throw new Error(
287
+ 'Staged changes must be committed or unstaged before observations:flush; index left untouched',
288
+ )
289
+ }
290
+
291
+ if (!(await observations_flush_transaction.pending(process.cwd()))) {
292
+ await catch_up_default(default_branch)
293
+ }
405
294
 
406
295
  return default_branch
407
296
  }
408
297
 
409
- // **The closed issues' comment rounds are carried only once a flush will go ahead**
410
- // (joshuafolkken/kit#5326): a lane child leaves them to this flush, so the carried files ride its pull
411
- // request, and the status is read again so a carry alone is a change to flush. A carry left behind by
412
- // a later stop is discarded by the next flush's `ready_default_branch`.
413
- async function carried_status(): Promise<string> {
298
+ // Partial archival must throw: the transaction rebuilds it from its durable snapshot on retry.
299
+ async function carried_status(): Promise<{ status_output: string; archived_files: number }> {
414
300
  await review_comment_carry.carry_reported(process.cwd())
415
301
 
416
- return await git_command.status()
302
+ const archived_files = await observation_ledger_archive.archive(process.cwd())
303
+
304
+ return { status_output: await git_command.status(), archived_files }
417
305
  }
418
306
 
419
- // **Nothing pulls in front of the branch, and that is deliberate.** The ledger is dirty by
420
- // definition at this point, so `git pull --ff-only` aborts on it in exactly the case a pull would
421
- // have been for — an upstream flush that already advanced the ledger — and reports a failure about
422
- // the wrong thing. So the freshness of the start
423
- // point is read from the remote first, and `catch_up_default` fast-forwards
424
- // only where git can do it without touching the ledger: a default branch
425
- // that predates another merged flush still stops here — before a branch is cut — rather than opening
426
- // a pull request that cannot merge. An earlier flush pull request still open is checked for the same
427
- // reason: a branch cut beside it conflicts with it at the ledger's tail. So the order is: ready the
428
- // default branch, defer to an open flush, carry, then check, prepare and land.
429
- async function flush(now: Date): Promise<string> {
430
- const default_branch = await ready_default_branch(await git_command.status())
307
+ // Carry, migration and archival run only in the isolated checkout.
308
+ async function prepare_isolated(): Promise<number> {
309
+ const { archived_files } = await carried_status()
431
310
 
432
- const deferred = await observations_flush_landing.refuse_open_flush(BRANCH_PREFIX)
433
- if (deferred !== undefined) return deferred
311
+ await prepare_ledger()
312
+
313
+ return archived_files
314
+ }
434
315
 
435
- const status_output = await carried_status()
316
+ async function publish_isolated(branch_name: string, archived_files: number): Promise<void> {
317
+ if ((await git_pr_checks.read_merge_progress(branch_name)) === 'merged') return
318
+ const open = await git_gh_command.pr_list_open_with_head_prefix(branch_name)
436
319
 
437
- if (!has_ledger_change(status_output)) return CLEAN_MESSAGE
320
+ if (open.length === 0) {
321
+ console.info(await push_and_open(branch_name, pull_request_body(archived_files)))
322
+ }
438
323
 
439
- await prepare_ledger()
324
+ const is_auto_merge = await observations_flush_landing.request_auto_merge(branch_name)
325
+
326
+ await observations_flush_landing.wait_for_landing(branch_name, is_auto_merge)
327
+ }
440
328
 
329
+ async function flush(now: Date): Promise<string> {
330
+ const default_branch = await ready_default_branch(await git_command.status())
331
+ const is_pending = await observations_flush_transaction.pending(process.cwd())
332
+ const deferred = is_pending
333
+ ? undefined
334
+ : await observations_flush_landing.refuse_open_flush(BRANCH_PREFIX)
335
+ if (deferred !== undefined) return deferred
441
336
  const branch_name = branch_name_for(timestamp_for(now))
442
337
 
443
- await open_and_land(branch_name, default_branch)
338
+ const committed_branch = await observations_flush_transaction.run(process.cwd(), branch_name, {
339
+ prepare: prepare_isolated,
340
+ publish: publish_isolated,
341
+ })
342
+ if (committed_branch === '') return CLEAN_MESSAGE
343
+ await return_to_default_branch(default_branch)
444
344
 
445
- return merged_message(branch_name)
345
+ return merged_message(committed_branch)
446
346
  }
447
347
 
448
348
  const observations_flush = {
@@ -8,6 +8,7 @@ import { project_checks } from '#scripts/gate/project-checks'
8
8
  import { plan_consumers } from '#scripts/issue/plan-consumers'
9
9
  import { josh_environment_file } from '#scripts/josh/josh-environment-file'
10
10
  import { session_language } from '#scripts/josh/session-language'
11
+ import { lane_plan_estimate } from '#scripts/lane/lane-plan-estimate'
11
12
  import { line_budget } from '#scripts/lines/line-budget'
12
13
  import { run_prep_cli } from '#scripts/run/run-prep-cli'
13
14
  import { run_prep_locate } from '#scripts/run/run-prep-locate'
@@ -22,7 +23,7 @@ import { plan_scaffold, type ScaffoldParts, type Targets } from './plan-scaffold
22
23
  const ARGV_OFFSET = 2
23
24
  const SUCCESS_EXIT_CODE = 0
24
25
  const FAILURE_EXIT_CODE = 1
25
- const USAGE = 'Usage: josh plan:scaffold <issue-number> [<path>...]'
26
+ const USAGE = 'Usage: josh plan:scaffold <issue-number> [<path>...] [--estimate <json-file>]'
26
27
 
27
28
  // A backticked directory is not a planned file: only a regular file reaches `lines` and `test:declared`.
28
29
  function is_file(target: string): boolean {
@@ -79,7 +80,11 @@ async function gather(
79
80
  return { summary, files, near_limit: rows, declared, cases: owed, consumers }
80
81
  }
81
82
 
82
- async function scaffold(issue_number: string, paths: ReadonlyArray<string>): Promise<number> {
83
+ async function scaffold(
84
+ issue_number: string,
85
+ paths: ReadonlyArray<string>,
86
+ estimate?: string,
87
+ ): Promise<number> {
83
88
  const summary = await run_prep_cli.read_summary(issue_number)
84
89
 
85
90
  if (summary === undefined) {
@@ -92,16 +97,22 @@ async function scaffold(issue_number: string, paths: ReadonlyArray<string>): Pro
92
97
  run_prep_locate.extract_targets(summary.body),
93
98
  is_file,
94
99
  )
95
- const files = paths.length > 0 ? paths : targets.files
100
+ const planned = estimate !== undefined || paths.length > 0 ? paths : targets.files
101
+ const scope = await lane_plan_estimate.attach(
102
+ { issue: Number(issue_number), paths: [...planned], planned_at: '' },
103
+ estimate,
104
+ )
105
+ const parts = await gather(summary.text, scope.paths, targets)
96
106
 
97
- console.info(plan_scaffold.format(await gather(summary.text, files, targets)))
107
+ console.info(plan_scaffold.format({ ...parts, estimate: scope.estimated_size }))
98
108
 
99
109
  return SUCCESS_EXIT_CODE
100
110
  }
101
111
 
102
112
  // A malformed number is an argument error (usage); an unreadable body is a read failure (its own note).
103
113
  async function run(argv: ReadonlyArray<string>): Promise<number> {
104
- const [first = '', ...paths] = argv
114
+ const input = lane_plan_estimate.split(argv)
115
+ const [first = '', ...paths] = input.tokens
105
116
  const issue_number = run_prep_cli.parse_number([first])
106
117
 
107
118
  if (issue_number === undefined) {
@@ -110,7 +121,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
110
121
  return FAILURE_EXIT_CODE
111
122
  }
112
123
 
113
- return await scaffold(issue_number, paths)
124
+ return await scaffold(issue_number, paths, input.file)
114
125
  }
115
126
 
116
127
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -1,5 +1,7 @@
1
1
  import path from 'node:path'
2
+ import { issue_body_keys } from '#scripts/issue/issue-body-keys'
2
3
  import { line_budget, type FileBudget } from '#scripts/lines/line-budget'
4
+ import type { DeclaredSize } from '#scripts/split/split-assess'
3
5
  import { test_declared_logic, type Verdict } from '#scripts/test/test-declared-logic'
4
6
 
5
7
  // The formatting half of `josh plan:scaffold`: each section is an existing command's answer, computed
@@ -25,6 +27,7 @@ interface ScaffoldParts {
25
27
  declared: string
26
28
  cases: ReadonlyArray<string>
27
29
  consumers: string | undefined
30
+ estimate?: DeclaredSize | undefined
28
31
  }
29
32
 
30
33
  // A body target that names a file is a planned file; any other name is an identifier whose consumers
@@ -94,9 +97,17 @@ function file_sections(parts: ScaffoldParts): ReadonlyArray<string> {
94
97
  ]
95
98
  }
96
99
 
100
+ function estimate_lines(size: DeclaredSize | undefined): Array<string> {
101
+ if (size === undefined) return []
102
+ const counts = issue_body_keys.size_value(String(size.files), String(size.lines))
103
+
104
+ return [`${issue_body_keys.prefix('size')} ${counts}`]
105
+ }
106
+
97
107
  function format(parts: ScaffoldParts): string {
98
108
  return [
99
109
  parts.summary,
110
+ ...estimate_lines(parts.estimate),
100
111
  ...file_sections(parts),
101
112
  section(
102
113
  'plan:consumers',
@@ -0,0 +1,24 @@
1
+ // GitHub refuses a release whose body exceeds this many characters (HTTP 422).
2
+ const MAX_BODY_LENGTH = 125_000
3
+ const LINE_BREAK = '\n'
4
+
5
+ function changelog_url(repository: string, tag: string, previous: string | undefined): string {
6
+ const root = `https://github.com/${repository}`
7
+
8
+ return previous === undefined ? `${root}/commits/${tag}` : `${root}/compare/${previous}...${tag}`
9
+ }
10
+
11
+ // Cut at a line break so no Markdown line or surrogate pair is split; the changelog link stays last.
12
+ function cap_body(body: string, url: string): string {
13
+ if (body.length <= MAX_BODY_LENGTH) return body
14
+
15
+ const tail = `${LINE_BREAK}${LINE_BREAK}…${LINE_BREAK}${LINE_BREAK}**Full Changelog**: ${url}`
16
+ const head = body.slice(0, MAX_BODY_LENGTH - tail.length)
17
+ const line_end = head.lastIndexOf(LINE_BREAK)
18
+
19
+ return `${line_end > 0 ? head.slice(0, line_end) : head}${tail}`
20
+ }
21
+
22
+ const github_release_notes = { MAX_BODY_LENGTH, cap_body, changelog_url }
23
+
24
+ export { github_release_notes }
@@ -21,6 +21,11 @@ const JOBS_SCHEMA = z.object({ jobs: z.array(JOB_SCHEMA) })
21
21
  type Run = z.infer<typeof RUN_SCHEMA>
22
22
  type PollState = 'ready' | 'failed' | 'pending'
23
23
 
24
+ interface JobOutcomes {
25
+ failed: ReadonlyArray<string>
26
+ succeeded: ReadonlyArray<string>
27
+ }
28
+
24
29
  // `read` answers a GET on a repository API path. `workflow` is the publish workflow and `jobs` the
25
30
  // jobs in it whose failure counts (empty: every job). `release_run_workflow` is the workflow that
26
31
  // creates a tag's release — the publish workflow itself when its run creates the release.
@@ -31,11 +36,15 @@ interface RunSource {
31
36
  release_run_workflow: string | undefined
32
37
  }
33
38
 
39
+ // A reusable workflow's jobs are listed as `<caller job> / <job>`, so the caller's name covers them.
40
+ function is_named_job(job_name: string, names: ReadonlyArray<string>): boolean {
41
+ return names.some((name) => job_name === name || job_name.startsWith(`${name} /`))
42
+ }
43
+
34
44
  function is_failed_job(job: z.infer<typeof JOB_SCHEMA>, names: ReadonlyArray<string>): boolean {
35
45
  if (job.status !== 'completed' || !FAILED_CONCLUSIONS.has(job.conclusion ?? '')) return false
36
- if (names.length === 0) return true
37
46
 
38
- return names.some((name) => job.name === name || job.name.startsWith(`${name} /`))
47
+ return names.length === 0 || is_named_job(job.name, names)
39
48
  }
40
49
 
41
50
  async function list_runs(source: RunSource, workflow_name: string): Promise<ReadonlyArray<Run>> {
@@ -55,12 +64,22 @@ async function find_run(
55
64
  return runs.find((item) => item.display_title === title)
56
65
  }
57
66
 
58
- async function has_failed_job(source: RunSource, run_id: number): Promise<boolean> {
67
+ // A job skipped because the one it needs failed is in neither list.
68
+ async function job_outcomes(source: RunSource, run_id: number): Promise<JobOutcomes> {
59
69
  const { jobs } = JOBS_SCHEMA.parse(
60
70
  await source.read(`/actions/runs/${String(run_id)}/jobs?per_page=100`),
61
71
  )
62
72
 
63
- return jobs.some((job) => is_failed_job(job, source.jobs))
73
+ return {
74
+ failed: jobs.filter((job) => is_failed_job(job, source.jobs)).map((job) => job.name),
75
+ succeeded: jobs.filter((job) => job.conclusion === 'success').map((job) => job.name),
76
+ }
77
+ }
78
+
79
+ async function has_failed_job(source: RunSource, run_id: number): Promise<boolean> {
80
+ const { failed } = await job_outcomes(source, run_id)
81
+
82
+ return failed.length > 0
64
83
  }
65
84
 
66
85
  // A run started before its title named the tag may be at work on any tag.
@@ -120,7 +139,14 @@ async function publication_state(
120
139
  return run_state(await publish_run(source, workflow, tag))
121
140
  }
122
141
 
123
- const github_release_runs = { is_release_lost, publication_state, publish_run, run_state }
142
+ const github_release_runs = {
143
+ is_named_job,
144
+ job_outcomes,
145
+ is_release_lost,
146
+ publication_state,
147
+ publish_run,
148
+ run_state,
149
+ }
124
150
 
125
- export type { PollState, Run, RunSource }
151
+ export type { JobOutcomes, PollState, Run, RunSource }
126
152
  export { github_release_runs }
@@ -2,6 +2,7 @@ import { setTimeout } from 'node:timers/promises'
2
2
  import { poll as shared_poll } from '#scripts/lib/poll'
3
3
  import semver from 'semver'
4
4
  import { z } from 'zod'
5
+ import { github_release_notes } from './github-release-notes'
5
6
  import { github_release_runs, type PollState, type RunSource } from './github-release-runs'
6
7
 
7
8
  const API_ROOT = 'https://api.github.com/repos'
@@ -41,6 +42,7 @@ interface Client extends Omit<RunSource, 'read'> {
41
42
  request: ReleaseRequest
42
43
  token: string
43
44
  url: string
45
+ repository: string
44
46
  }
45
47
 
46
48
  // `fallback` answers when no tag sits between the floor and the target; without one the floor itself
@@ -81,7 +83,11 @@ async function api_post(client: Client, path: string, body: object): Promise<Res
81
83
  }
82
84
 
83
85
  async function read_response(response: Response): Promise<unknown> {
84
- if (!response.ok) throw new Error(`GitHub Releases API returned HTTP ${String(response.status)}`)
86
+ if (!response.ok) {
87
+ const detail = await response.text()
88
+
89
+ throw new Error(`GitHub Releases API returned HTTP ${String(response.status)}: ${detail}`)
90
+ }
85
91
 
86
92
  return await response.json()
87
93
  }
@@ -248,10 +254,11 @@ async function create_release(
248
254
  previous: string | undefined,
249
255
  ): Promise<void> {
250
256
  const notes = await generate_notes(client, tag, previous)
257
+ const url = github_release_notes.changelog_url(client.repository, tag, previous)
251
258
  const response = await api_post(client, '/releases', {
252
259
  tag_name: tag,
253
260
  name: notes.name,
254
- body: notes.body,
261
+ body: github_release_notes.cap_body(notes.body, url),
255
262
  draft: false,
256
263
  prerelease: false,
257
264
  })
@@ -268,6 +275,7 @@ function create_client(request: ReleaseRequest, token: string, settings: Release
268
275
  request,
269
276
  token,
270
277
  url: `${API_ROOT}/${settings.repository}`,
278
+ repository: settings.repository,
271
279
  workflow: settings.workflow,
272
280
  jobs: settings.jobs ?? [],
273
281
  release_run_workflow: settings.release_run_workflow,
@@ -4,7 +4,7 @@ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
4
4
  import { poll } from '#scripts/lib/poll'
5
5
  import { file_reader } from '#scripts/lib/read-file'
6
6
  import { npm_registry } from '#scripts/version/npm-registry'
7
- import { release_publish_run } from './release-publish-run'
7
+ import { release_publish_run, type FailedRun } from './release-publish-run'
8
8
  import { release_tag } from './release-tag'
9
9
 
10
10
  // The stage lines `pnpm josh release` prints, and the two stages it waits for after the tag.
@@ -26,7 +26,7 @@ const HTML_URL_FILTER = '.html_url'
26
26
  const PUBLISH_WORKFLOW_PATH = '.github/workflows/publish.yml'
27
27
  const RELEASE_WORKFLOW_PATH = '.github/workflows/github-release.yml'
28
28
 
29
- type NpmState = { kind: 'published' } | { kind: 'failed'; run_id: number } | { kind: 'pending' }
29
+ type NpmState = { kind: 'published' } | { kind: 'failed'; run: FailedRun } | { kind: 'pending' }
30
30
 
31
31
  function pr_opened_line(pr_url: string): string {
32
32
  return `📝 Release PR opened: ${pr_url}`
@@ -61,15 +61,27 @@ function missed_npm_line(package_name: string, version: string): string {
61
61
  ].join('\n')
62
62
  }
63
63
 
64
+ function failed_run_headline(tag: string, run: FailedRun): string {
65
+ const run_label = `Publish ${tag} failed (run ${String(run.run_id)})`
66
+
67
+ if (run.has_npm_job_failed) return `❌ ${run_label} before npm listed ${tag}.`
68
+
69
+ return `❌ ${run_label} in ${run.failed_jobs.join(', ')}; its publish-npm job succeeded.`
70
+ }
71
+
64
72
  // The run's own failure is known, so the line names the run rather than a stage that never came. It
65
- // claims no more than the last registry read: a job beside `publish-npm` can fail the run after npm
66
- // took the version.
67
- function failed_publish_line(version: string, run_id: number): string {
73
+ // claims no more than the last registry read: when a job beside `publish-npm` failed the run, npm
74
+ // may still take the version, so the npm side is reported as unconfirmed rather than failed.
75
+ function failed_publish_line(package_name: string, version: string, run: FailedRun): string {
68
76
  const tag = release_tag.tag_name(version)
77
+ const npm_lines = run.has_npm_job_failed
78
+ ? []
79
+ : [` npm has not listed ${tag} yet: check ${npm_package_url(package_name, version)}`]
69
80
 
70
81
  return [
71
- `❌ Publish ${tag} failed (run ${String(run_id)}) before npm listed ${tag}.`,
72
- ` Inspect it with: gh run view ${String(run_id)} --log-failed`,
82
+ failed_run_headline(tag, run),
83
+ ...npm_lines,
84
+ ` Inspect it with: gh run view ${String(run.run_id)} --log-failed`,
73
85
  ].join('\n')
74
86
  }
75
87
 
@@ -117,16 +129,16 @@ async function read_release_url(version: string): Promise<string | undefined> {
117
129
 
118
130
  function npm_outcome_line(package_name: string, version: string, state: NpmState): string {
119
131
  if (state.kind === 'published') return npm_line(package_name, version)
120
- if (state.kind === 'failed') return failed_publish_line(version, state.run_id)
132
+ if (state.kind === 'failed') return failed_publish_line(package_name, version, state.run)
121
133
 
122
134
  return missed_npm_line(package_name, version)
123
135
  }
124
136
 
125
137
  async function npm_state(package_name: string, version: string): Promise<NpmState> {
126
138
  if (npm_registry.has_public_version(package_name, version)) return { kind: 'published' }
127
- const run_id = await release_publish_run.failed_run_id(version)
139
+ const run = await release_publish_run.failed_run(version)
128
140
 
129
- return run_id === undefined ? { kind: 'pending' } : { kind: 'failed', run_id }
141
+ return run === undefined ? { kind: 'pending' } : { kind: 'failed', run }
130
142
  }
131
143
 
132
144
  // `josh release` is distributed to consumers whose packages are not on npm, so a repository that does