@sma1lboy/rove 0.9.266 → 0.9.267

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 (214) hide show
  1. package/dist/cli/{chunk-e69s8s16.js → chunk-02htajas.js} +3 -3
  2. package/dist/cli/chunk-0bcs1v6n.js +2 -0
  3. package/dist/cli/{chunk-7wsxppwc.js → chunk-0fejmkz1.js} +1 -1
  4. package/dist/cli/{chunk-gskbzgc3.js → chunk-0g4wc808.js} +1 -1
  5. package/dist/cli/chunk-0t0ykzek.js +2 -0
  6. package/dist/cli/chunk-1b3pq6g6.js +2 -0
  7. package/dist/cli/{chunk-tz3eftty.js → chunk-1qvrn21x.js} +1 -1
  8. package/dist/cli/chunk-1z1tjqyy.js +3 -0
  9. package/dist/cli/{chunk-yk498qwr.js → chunk-1z2sze0v.js} +1 -1
  10. package/dist/cli/{chunk-3zsm2jbm.js → chunk-2a19815h.js} +2 -2
  11. package/dist/cli/chunk-2gc4kqrt.js +2 -0
  12. package/dist/cli/chunk-2geegpp7.js +2 -0
  13. package/dist/cli/chunk-2jzaabcy.js +11 -0
  14. package/dist/cli/{chunk-ag3txfg2.js → chunk-2r1fgng9.js} +1 -1
  15. package/dist/cli/{chunk-n3f5sdka.js → chunk-32j6y5d1.js} +1 -1
  16. package/dist/cli/{chunk-rbr6qapz.js → chunk-3gegmpff.js} +1 -1
  17. package/dist/cli/{chunk-8vkma6c4.js → chunk-3nf9zbm7.js} +1 -1
  18. package/dist/cli/{chunk-zprhxt1q.js → chunk-3qkhxem2.js} +1 -1
  19. package/dist/cli/chunk-3xrbb1yv.js +2 -0
  20. package/dist/cli/{chunk-31jxjkrq.js → chunk-48ynmrd8.js} +1 -1
  21. package/dist/cli/{chunk-b3pm5nvh.js → chunk-4bfwafzg.js} +1 -1
  22. package/dist/cli/{chunk-8saxdp88.js → chunk-4fa35dbn.js} +1 -1
  23. package/dist/cli/{chunk-ejd307we.js → chunk-4kdakncb.js} +1 -1
  24. package/dist/cli/{chunk-mr0z23fd.js → chunk-57qny54a.js} +1 -1
  25. package/dist/cli/chunk-5d3p4rqv.js +2 -0
  26. package/dist/cli/{chunk-hc6qpkpy.js → chunk-5m1ef9ez.js} +2 -2
  27. package/dist/cli/{chunk-wvaf3d9j.js → chunk-5r4d0h87.js} +1 -1
  28. package/dist/cli/chunk-5vetsh77.js +4 -0
  29. package/dist/cli/chunk-66zvkh5z.js +2 -0
  30. package/dist/cli/chunk-6xsc9crp.js +4 -0
  31. package/dist/cli/{chunk-7c4zdjr5.js → chunk-6z02cd58.js} +1 -1
  32. package/dist/cli/{chunk-ye4vt96f.js → chunk-7ag59vyh.js} +9 -7
  33. package/dist/cli/{chunk-hq3hd8qr.js → chunk-7maf6x1g.js} +1 -1
  34. package/dist/cli/{chunk-3342qzve.js → chunk-7mwvvj46.js} +1 -1
  35. package/dist/cli/{chunk-me656p3n.js → chunk-835qwnnq.js} +2 -2
  36. package/dist/cli/chunk-84m0d72d.js +2 -0
  37. package/dist/cli/chunk-85m74thf.js +31 -0
  38. package/dist/cli/{chunk-tdhk4dz8.js → chunk-8t7qbr1e.js} +1 -1
  39. package/dist/cli/{chunk-yztr951z.js → chunk-a0rz9g11.js} +1 -1
  40. package/dist/cli/{chunk-qpr14v8x.js → chunk-a4znycsh.js} +1 -1
  41. package/dist/cli/{chunk-kvwqh35r.js → chunk-a569ctz6.js} +1 -1
  42. package/dist/cli/{chunk-3x0ryj15.js → chunk-acqcph62.js} +1 -1
  43. package/dist/cli/chunk-ak0frbbw.js +3 -0
  44. package/dist/cli/chunk-ankt6yse.js +2 -0
  45. package/dist/cli/{chunk-80jqznbm.js → chunk-av482xxw.js} +1 -1
  46. package/dist/cli/chunk-awgsda64.js +2 -0
  47. package/dist/cli/chunk-axjcmamn.js +2 -0
  48. package/dist/cli/chunk-azpvsc5d.js +2 -0
  49. package/dist/cli/{chunk-zh0c8yzw.js → chunk-bejhca6z.js} +1 -1
  50. package/dist/cli/chunk-bm2baazf.js +2 -0
  51. package/dist/cli/{chunk-wqckm0k6.js → chunk-br8r72bf.js} +1 -1
  52. package/dist/cli/{chunk-sdya3r5j.js → chunk-bvsjep6w.js} +1 -1
  53. package/dist/cli/{chunk-1vtfzcca.js → chunk-c1dz3qg3.js} +1 -1
  54. package/dist/cli/{chunk-2gjrfqhs.js → chunk-c25vea1q.js} +1 -1
  55. package/dist/cli/{chunk-qwz9728j.js → chunk-cangy5wn.js} +1 -1
  56. package/dist/cli/chunk-dhcx1gna.js +3 -0
  57. package/dist/cli/chunk-e7h7w4n0.js +4 -0
  58. package/dist/cli/{chunk-sr4c9fve.js → chunk-eckrcmtz.js} +1 -1
  59. package/dist/cli/{chunk-7zyyvc3d.js → chunk-eqa843hf.js} +1 -1
  60. package/dist/cli/{chunk-n0rtj4z7.js → chunk-eqdbfgq5.js} +1 -1
  61. package/dist/cli/{chunk-cbc1h345.js → chunk-eyrt04mg.js} +1 -2
  62. package/dist/cli/{chunk-3126c9x9.js → chunk-f09ex46c.js} +1 -1
  63. package/dist/cli/{chunk-szjgjrar.js → chunk-f2bqrzsy.js} +1 -1
  64. package/dist/cli/chunk-f8gg8cqh.js +3 -0
  65. package/dist/cli/{chunk-wyn3zbh4.js → chunk-f8w52tsz.js} +2 -2
  66. package/dist/cli/{chunk-qs0526nj.js → chunk-fcnd49ce.js} +1 -1
  67. package/dist/cli/{chunk-ek6kywem.js → chunk-fcqtqpm1.js} +1 -1
  68. package/dist/cli/chunk-fjvefbnr.js +16 -0
  69. package/dist/cli/chunk-fvvb0072.js +3 -0
  70. package/dist/cli/{chunk-b4zqkdyq.js → chunk-ga412sby.js} +1 -1
  71. package/dist/cli/{chunk-5v02t4pz.js → chunk-gak4aag4.js} +25 -8
  72. package/dist/cli/{chunk-vxc90473.js → chunk-gg5f2ayw.js} +1 -1
  73. package/dist/cli/{chunk-30g1bgkg.js → chunk-ggnq2vvk.js} +1 -1
  74. package/dist/cli/{chunk-4018sjy3.js → chunk-ghkr7f4t.js} +1 -1
  75. package/dist/cli/{chunk-41x1hrqe.js → chunk-gq36nzg8.js} +1 -1
  76. package/dist/cli/{chunk-mh2s5ttr.js → chunk-gqh6atvp.js} +2 -2
  77. package/dist/cli/{chunk-y078swzq.js → chunk-gs6j7y6q.js} +1 -1
  78. package/dist/cli/chunk-gytx47yk.js +3 -0
  79. package/dist/cli/{chunk-1jz7ppsy.js → chunk-h6bbe9nd.js} +1 -1
  80. package/dist/cli/{chunk-9g2faw9a.js → chunk-h8t4xg1p.js} +1 -1
  81. package/dist/cli/{chunk-re15t5r1.js → chunk-heajz5tw.js} +1 -1
  82. package/dist/cli/{chunk-yadx0wc5.js → chunk-hf168gph.js} +1 -1
  83. package/dist/cli/{chunk-1ys1maw7.js → chunk-hsy5gebc.js} +1 -1
  84. package/dist/cli/{chunk-cajrtabt.js → chunk-hv79ys32.js} +1 -1
  85. package/dist/cli/{chunk-mb018hfg.js → chunk-hy0r635n.js} +3 -3
  86. package/dist/cli/{chunk-812et2xk.js → chunk-j1z9kgyd.js} +1 -1
  87. package/dist/cli/{chunk-w196jkg5.js → chunk-jj5f4n51.js} +1 -1
  88. package/dist/cli/{chunk-z80jjarw.js → chunk-jp8vfwqm.js} +1 -1
  89. package/dist/cli/chunk-kcd1w62f.js +2 -0
  90. package/dist/cli/{chunk-tshbjft4.js → chunk-ke19jzhg.js} +2 -2
  91. package/dist/cli/chunk-kq01awhv.js +3 -0
  92. package/dist/cli/{chunk-kmgheesn.js → chunk-krnacq08.js} +2 -2
  93. package/dist/cli/{chunk-t6hzyee7.js → chunk-kwyxwcr8.js} +1 -1
  94. package/dist/cli/chunk-kx7b5nht.js +11 -0
  95. package/dist/cli/{chunk-a42j8eek.js → chunk-mj7nfaaf.js} +1 -1
  96. package/dist/cli/{chunk-c47gag5r.js → chunk-mvnz68vh.js} +1 -1
  97. package/dist/cli/{chunk-j1fe3j54.js → chunk-mzk4p07t.js} +2 -2
  98. package/dist/cli/chunk-n1tfhd48.js +2 -0
  99. package/dist/cli/{chunk-rtkj4wdw.js → chunk-n1v59qgs.js} +2 -2
  100. package/dist/cli/{chunk-drt79f2t.js → chunk-n2j5sk0g.js} +1 -1
  101. package/dist/cli/chunk-npnbq79j.js +2 -0
  102. package/dist/cli/{chunk-5srsjs7r.js → chunk-nw4p86t1.js} +1 -1
  103. package/dist/cli/{chunk-dzmfexh8.js → chunk-p4fjynez.js} +1 -1
  104. package/dist/cli/{chunk-8sksdq95.js → chunk-p6jw0zcd.js} +1 -1
  105. package/dist/cli/{chunk-ve348rmz.js → chunk-p9t6ye6t.js} +2 -2
  106. package/dist/cli/{chunk-amc17enx.js → chunk-pv2334ak.js} +1 -1
  107. package/dist/cli/chunk-pxdnc5mz.js +91 -0
  108. package/dist/cli/{chunk-4rya4jmx.js → chunk-qeya7dv5.js} +2 -2
  109. package/dist/cli/{chunk-6a70wv2b.js → chunk-qgrg9a5n.js} +1 -1
  110. package/dist/cli/{chunk-4z01vg3t.js → chunk-qnpkhvrn.js} +1 -1
  111. package/dist/cli/{chunk-cgxgqc87.js → chunk-qykg15ks.js} +1 -1
  112. package/dist/cli/{chunk-625773dm.js → chunk-r0etc6vp.js} +1 -1
  113. package/dist/cli/chunk-r40aj7z6.js +2 -0
  114. package/dist/cli/{chunk-jrqtzp35.js → chunk-r67c54hn.js} +1 -1
  115. package/dist/cli/chunk-ra1m0gs4.js +3 -0
  116. package/dist/cli/{chunk-m6pp9gaf.js → chunk-rfp0ayra.js} +1 -1
  117. package/dist/cli/chunk-rn08whn3.js +20 -0
  118. package/dist/cli/chunk-s3cvbp3a.js +3 -0
  119. package/dist/cli/chunk-s4ghfrr9.js +2 -0
  120. package/dist/cli/chunk-s4nrmbqh.js +13 -0
  121. package/dist/cli/{chunk-p2vagan3.js → chunk-s7mzpdgb.js} +1 -1
  122. package/dist/cli/{chunk-tgfn5ykb.js → chunk-sfn4s219.js} +1 -1
  123. package/dist/cli/chunk-sq6zj3fb.js +5 -0
  124. package/dist/cli/{chunk-n9w0026r.js → chunk-tca0hx96.js} +1 -1
  125. package/dist/cli/{chunk-xh72jz7c.js → chunk-tst79jmx.js} +1 -1
  126. package/dist/cli/{chunk-mtw6nce9.js → chunk-twjt04z3.js} +1 -1
  127. package/dist/cli/{chunk-qga9xd2f.js → chunk-v8nvfyd4.js} +1 -1
  128. package/dist/cli/{chunk-m8shvh3j.js → chunk-v967kt9x.js} +1 -1
  129. package/dist/cli/{chunk-w78n33b8.js → chunk-vckr5yvb.js} +1 -1
  130. package/dist/cli/{chunk-67qa9eca.js → chunk-vd6z4v6p.js} +1 -1
  131. package/dist/cli/{chunk-gvmgabps.js → chunk-wa7jswp3.js} +1 -1
  132. package/dist/cli/{chunk-agt2sdaw.js → chunk-wd9n7cwz.js} +6 -6
  133. package/dist/cli/chunk-x4s60mnd.js +2 -0
  134. package/dist/cli/chunk-xex81qeb.js +2 -0
  135. package/dist/cli/{chunk-bwr6dygx.js → chunk-xfgqae9t.js} +1 -1
  136. package/dist/cli/chunk-xt543e2h.js +3 -0
  137. package/dist/cli/{chunk-z72f3d9m.js → chunk-xymn760d.js} +17 -17
  138. package/dist/cli/chunk-y1xnjx8x.js +4 -0
  139. package/dist/cli/chunk-y7a8h5xe.js +2 -0
  140. package/dist/cli/chunk-y8b2p44q.js +2 -0
  141. package/dist/cli/{chunk-yyjskza5.js → chunk-ycd28edp.js} +1 -1
  142. package/dist/cli/chunk-yfvt96ar.js +3 -0
  143. package/dist/cli/{chunk-rwmxpjrx.js → chunk-ykyertq9.js} +1 -1
  144. package/dist/cli/chunk-yssxs1fn.js +3 -0
  145. package/dist/cli/{chunk-z3zaa155.js → chunk-yzkhwn31.js} +1 -1
  146. package/dist/cli/{chunk-prqeddy7.js → chunk-z1nj22va.js} +1 -1
  147. package/dist/cli/chunk-z7d7gk7p.js +2 -0
  148. package/dist/cli/{chunk-0sm0wcx9.js → chunk-zg66t7k9.js} +1 -1
  149. package/dist/cli/chunk-zy2jdze4.js +3 -0
  150. package/dist/cli/index.js +8 -8
  151. package/dist/cli/pty-host-node.mjs +29 -7
  152. package/dist/cli/rove-run.js +1 -1
  153. package/dist/cli/rove.js +1 -1
  154. package/dist/completions/rove.bash +1 -1
  155. package/dist/completions/rove.fish +1 -1
  156. package/dist/completions/rove.zsh +1 -1
  157. package/dist/skills/rove/SKILL.md +25 -20
  158. package/dist/skills/rove/references/api-flags.md +3 -1
  159. package/dist/web/assets/index-BM0Pt6E-.js +111 -0
  160. package/dist/web/assets/index-DneB7YXQ.css +1 -0
  161. package/dist/web/index.html +2 -2
  162. package/dist/web-ui/assets/{harness-dYkQBfYz.js → harness-pEyVtWV4.js} +1 -1
  163. package/dist/web-ui/assets/index-Bsn8NuKa.css +1 -0
  164. package/dist/web-ui/assets/{index-ByMdqeTv.js → index-Dyg-qcgB.js} +2 -2
  165. package/dist/web-ui/index.html +2 -2
  166. package/package.json +3 -3
  167. package/dist/cli/chunk-09sfrqkr.js +0 -2
  168. package/dist/cli/chunk-1bmhygwd.js +0 -2
  169. package/dist/cli/chunk-1gawhhd0.js +0 -3
  170. package/dist/cli/chunk-1nrva2m2.js +0 -11
  171. package/dist/cli/chunk-1pg3247n.js +0 -16
  172. package/dist/cli/chunk-2gk96h3f.js +0 -2
  173. package/dist/cli/chunk-2vrx0pmv.js +0 -2
  174. package/dist/cli/chunk-4250pw6r.js +0 -3
  175. package/dist/cli/chunk-4b9f565d.js +0 -2
  176. package/dist/cli/chunk-4dsyczce.js +0 -2
  177. package/dist/cli/chunk-4gngf0mt.js +0 -70
  178. package/dist/cli/chunk-4sj2sqyt.js +0 -2
  179. package/dist/cli/chunk-56n0whme.js +0 -2
  180. package/dist/cli/chunk-696sqb6j.js +0 -2
  181. package/dist/cli/chunk-7nrzkqt5.js +0 -3
  182. package/dist/cli/chunk-aeswyjhk.js +0 -3
  183. package/dist/cli/chunk-b39sdtt0.js +0 -3
  184. package/dist/cli/chunk-b7xjhgts.js +0 -4
  185. package/dist/cli/chunk-bav3bh70.js +0 -4
  186. package/dist/cli/chunk-bc72rgkm.js +0 -2
  187. package/dist/cli/chunk-bnv1mm5h.js +0 -4
  188. package/dist/cli/chunk-chzn3px6.js +0 -31
  189. package/dist/cli/chunk-cqsc0wmp.js +0 -20
  190. package/dist/cli/chunk-g1px1rk6.js +0 -9
  191. package/dist/cli/chunk-kg8k1rar.js +0 -2
  192. package/dist/cli/chunk-m86qk3za.js +0 -2
  193. package/dist/cli/chunk-njvz867e.js +0 -2
  194. package/dist/cli/chunk-nyw4s1pv.js +0 -2
  195. package/dist/cli/chunk-pcqw7r50.js +0 -2
  196. package/dist/cli/chunk-qdvtz853.js +0 -3
  197. package/dist/cli/chunk-r4vfng2z.js +0 -2
  198. package/dist/cli/chunk-r6k3ve2g.js +0 -3
  199. package/dist/cli/chunk-s0gp5b9p.js +0 -10
  200. package/dist/cli/chunk-s27a0ckk.js +0 -3
  201. package/dist/cli/chunk-sgngkkp3.js +0 -2
  202. package/dist/cli/chunk-spee6wv8.js +0 -3
  203. package/dist/cli/chunk-swxq6yak.js +0 -2
  204. package/dist/cli/chunk-trhrdby1.js +0 -4
  205. package/dist/cli/chunk-tvbbnfp2.js +0 -2
  206. package/dist/cli/chunk-xgans9wf.js +0 -3
  207. package/dist/cli/chunk-xm7a6swz.js +0 -2
  208. package/dist/cli/chunk-y87f04kk.js +0 -2
  209. package/dist/cli/chunk-ywwm92e5.js +0 -2
  210. package/dist/cli/chunk-z5g3twhn.js +0 -2
  211. package/dist/cli/chunk-z99ynm4r.js +0 -3
  212. package/dist/web/assets/index-BsbDxm3K.js +0 -109
  213. package/dist/web/assets/index-DNv-oxrT.css +0 -1
  214. package/dist/web-ui/assets/index-nMJ42IGm.css +0 -1
@@ -1,3 +1,2 @@
1
1
  // @bun
2
- var PLACEHOLDER_TASK_TITLE="(new task)";function sanitizeTaskTitle(title){return title.replace(/[\u0000-\u0020\u007f-\u009f]+/g," ").trim()}function deriveTitleFromPrompt(prompt){if(typeof prompt!=="string")return"";let collapsed=prompt.replace(/\s+/g," ").trim();if(collapsed.length===0)return"";let points=[...collapsed];if(points.length<=40)return collapsed;return`${points.slice(0,40).join("")}\u2026`}function isPlaceholderDerivedBranch(branch,taskId){let id6=taskId.slice(-6).toLowerCase();if(branch===`rove/new-task-${id6}`||branch===`rove/new-task-${id6}`)return!0;return/^(?:[^/]+\/)?new-task(?:-\d+)?$/.test(branch)}
3
- export{PLACEHOLDER_TASK_TITLE,sanitizeTaskTitle,deriveTitleFromPrompt,isPlaceholderDerivedBranch};
2
+ var PLACEHOLDER_TASK_TITLE="(new task)";function sanitizeTaskTitle(title){return title.replace(/[\u0000-\u0020\u007f-\u009f]+/g," ").trim()}function deriveTitleFromPrompt(prompt){if(typeof prompt!=="string")return"";let collapsed=prompt.replace(/\s+/g," ").trim();if(collapsed.length===0)return"";let points=[...collapsed];if(points.length<=40)return collapsed;return`${points.slice(0,40).join("")}\u2026`}function isPlaceholderDerivedBranch(branch,taskId){let id6=taskId.slice(-6).toLowerCase();if(branch===`rove/new-task-${id6}`||branch===`rove/new-task-${id6}`)return!0;return/^(?:[^/]+\/)?new-task(?:-\d+)?$/.test(branch)}export{PLACEHOLDER_TASK_TITLE,sanitizeTaskTitle,deriveTitleFromPrompt,isPlaceholderDerivedBranch};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{MOD_NOT_INSTALLED,builtinModMissingMessage,isBuiltinModInstalled}from"./chunk-bwr6dygx.js";class ApiError extends Error{code;data;constructor(message,code,data){super(message);this.code=code;this.data=data}}var DAEMON_CODE_PREFIX=/^([A-Z][A-Z0-9_]{2,}): /;function splitDaemonCode(message){let match=DAEMON_CODE_PREFIX.exec(message);if(!match?.[1])return null;return{code:match[1],rest:message.slice(match[0].length)}}function helpStep(verbName){return{hint:"run the verb's --help for its exact flag contract, then retry",nextCommandArgs:["api",verbName,"--help"]}}function cliCaller(){return{cli:!0,cwd:process.cwd()}}var REMOTE_CALLER={cli:!1},VERB_GROUP_IDS=["discover","read","create","drive","edit","issues","workitems","routine","lifecycle","worktree","feedback"],GROUP_MOD={issues:"kanban",workitems:"issues"};function verbInstalled(verb){let mod=GROUP_MOD[verb.group];return mod===void 0||isBuiltinModInstalled(mod)}function requireVerbInstalled(verb){let mod=GROUP_MOD[verb.group];if(mod===void 0||isBuiltinModInstalled(mod))return;throw new ApiError(`${verb.name}: ${builtinModMissingMessage(mod)}`,MOD_NOT_INSTALLED,{hint:`install the ${mod} mod, then retry`,nextCommandArgs:["plugin","install",mod]})}function promptMayHaveLanded(delivered){return delivered.delivered||delivered.reason!==void 0}
2
+ import{MOD_NOT_INSTALLED,builtinModMissingMessage,isBuiltinModInstalled}from"./chunk-xfgqae9t.js";class ApiError extends Error{code;data;constructor(message,code,data){super(message);this.code=code;this.data=data}}var DAEMON_CODE_PREFIX=/^([A-Z][A-Z0-9_]{2,}): /;function splitDaemonCode(message){let match=DAEMON_CODE_PREFIX.exec(message);if(!match?.[1])return null;return{code:match[1],rest:message.slice(match[0].length)}}function helpStep(verbName){return{hint:"run the verb's --help for its exact flag contract, then retry",nextCommandArgs:["api",verbName,"--help"]}}function cliCaller(){return{cli:!0,cwd:process.cwd()}}var REMOTE_CALLER={cli:!1},VERB_GROUP_IDS=["discover","read","create","drive","edit","issues","workitems","routine","lifecycle","worktree","feedback"],GROUP_MOD={issues:"kanban",workitems:"issues"};function verbInstalled(verb){let mod=GROUP_MOD[verb.group];return mod===void 0||isBuiltinModInstalled(mod)}function requireVerbInstalled(verb){let mod=GROUP_MOD[verb.group];if(mod===void 0||isBuiltinModInstalled(mod))return;throw new ApiError(`${verb.name}: ${builtinModMissingMessage(mod)}`,MOD_NOT_INSTALLED,{hint:`install the ${mod} mod, then retry`,nextCommandArgs:["plugin","install",mod]})}function promptMayHaveLanded(delivered){return delivered.delivered||delivered.reason!==void 0}
3
3
  export{ApiError,splitDaemonCode,helpStep,cliCaller,REMOTE_CALLER,VERB_GROUP_IDS,GROUP_MOD,verbInstalled,requireVerbInstalled,promptMayHaveLanded};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- var MOD_TONES=["info","success","warning","error","muted"];var MOD_INPUT_MAX=4000,MOD_KEY_PATTERN=/^[A-Za-z0-9._:-]{1,64}$/,MOD_PANE_ID_PATTERN=/^[A-Za-z0-9._-]{1,64}$/,MOD_TITLE_MAX=60,ALLOWED={box:new Set(["type","direction","gap","padding","border","children"]),text:new Set(["type","text","tone","bold"]),button:new Set(["type","key","label","tone"]),input:new Set(["type","key","placeholder","value"])};function isTone(v){return typeof v==="string"&&MOD_TONES.includes(v)}function isSpace(v){return v===0||v===1||v===2||v===3}class Refused extends Error{}function validateModTree(input){let nodes=0,keys=new Set,walk=(raw,path,depth)=>{if(depth>12)throw new Refused(`${path}: deeper than 12`);if(++nodes>400)throw new Refused("more than 400 elements");if(!raw||typeof raw!=="object"||Array.isArray(raw))throw new Refused(`${path}: not an element`);let el=raw,type=el.type;if(type!=="box"&&type!=="text"&&type!=="button"&&type!=="input")throw new Refused(`${path}: unknown element ${JSON.stringify(type)}`);for(let prop of Object.keys(el))if(!ALLOWED[type].has(prop))throw new Refused(`${path}: ${type} has no prop "${prop}"`);if(el.tone!==void 0&&!isTone(el.tone))throw new Refused(`${path}: tone must be one of ${MOD_TONES.join(", ")}`);if(type==="text"){if(typeof el.text!=="string"||el.text.length>4000)throw new Refused(`${path}: text must be a string of at most 4000 chars`);if(el.bold!==void 0&&typeof el.bold!=="boolean")throw new Refused(`${path}: bold must be boolean`);return{type,text:el.text,...el.tone!==void 0?{tone:el.tone}:{},...el.bold?{bold:!0}:{}}}if(type==="button"||type==="input"){if(typeof el.key!=="string"||!MOD_KEY_PATTERN.test(el.key))throw new Refused(`${path}: bad ${type} key`);if(keys.has(el.key))throw new Refused(`${path}: duplicate key "${el.key}"`);keys.add(el.key)}if(type==="input"){for(let prop of["placeholder","value"]){let v=el[prop];if(v!==void 0&&(typeof v!=="string"||v.length>4000))throw new Refused(`${path}: ${prop} must be a string of at most 4000 chars`)}return{type,key:el.key,...el.placeholder!==void 0?{placeholder:el.placeholder}:{},...el.value!==void 0?{value:el.value}:{}}}if(type==="button"){if(typeof el.label!=="string"||el.label.length===0||el.label.length>40)throw new Refused(`${path}: label must be 1-40 chars`);return{type,key:el.key,label:el.label,...el.tone!==void 0?{tone:el.tone}:{}}}if(el.direction!==void 0&&el.direction!=="row"&&el.direction!=="column")throw new Refused(`${path}: direction must be "row" or "column"`);for(let prop of["gap","padding"])if(el[prop]!==void 0&&!isSpace(el[prop]))throw new Refused(`${path}: ${prop} must be 0-3`);if(el.border!==void 0&&typeof el.border!=="boolean")throw new Refused(`${path}: border must be boolean`);if(!Array.isArray(el.children))throw new Refused(`${path}: box needs children`);return{type,...el.direction!==void 0?{direction:el.direction}:{},...el.gap!==void 0?{gap:el.gap}:{},...el.padding!==void 0?{padding:el.padding}:{},...el.border?{border:!0}:{},children:el.children.map((child,i)=>walk(child,`${path}.children[${i}]`,depth+1))}};try{return{ok:!0,tree:walk(input,"tree",1)}}catch(err){if(err instanceof Refused)return{ok:!1,error:err.message};throw err}}function parseModUiPayload(payload){let panes=payload?.panes;if(!Array.isArray(panes))return null;let out=[];for(let raw of panes){if(!raw||typeof raw!=="object")continue;let p=raw;if(typeof p.plugin!=="string"||typeof p.id!=="string"||typeof p.title!=="string")continue;let tree=validateModTree(p.tree);if(tree.ok)out.push({plugin:p.plugin,id:p.id,title:p.title,tree:tree.tree})}return out}var PLUGIN_EVENT_NAMES=["task.created","task.deleted","task.changed","task.landed","task.pr-changed","worktree.created","issue.changed","note.filed","message.delivered","attention.handled","automation.dispatched","automation.skipped","automation.failed","quota.exhausted","quota.resumed","session.exited","plugin.enabled","plugin.disabled","agent.turn-complete","agent.permission-needed","agent.rate-limited","agent.rate-limit-recovered","agent.error","agent.running","agent.idle","session.start","session.end","turn.prompt","turn.complete","turn.failed","turn.interrupted","tool.pre","tool.post","tool.failed","attention.permission","attention.question","context.pre-compact","context.post-compact","subagent.start","subagent.stop","file.will-open","file.opened","file.closed","task.opened","project.opened","tab.opened","tab.closed"],DAEMON_CHANNELS=["task.snapshot","issue.snapshot","tabs.changed","row.status","active-task","update","engine-state","attention.inbox","gates","ui-prefs","keybindings","task.jobs","task.tokens","worktree.changes","transcript.activity","session.deliver","tab.open","tab.close","tab.rename","tab.add","engine.lifecycle","notice.event","usage.snapshot","usage.context","ui.prompt","graphics.write","mod.ui"],ROVE_API_VERSION=3;
2
+ var MOD_TONES=["info","success","warning","error","muted"];var MOD_INPUT_MAX=4000,MOD_KEY_PATTERN=/^[A-Za-z0-9._:-]{1,64}$/,MOD_PANE_ID_PATTERN=/^[A-Za-z0-9._-]{1,64}$/,MOD_TITLE_MAX=60,ALLOWED={box:new Set(["type","direction","gap","padding","border","children"]),text:new Set(["type","text","tone","bold"]),button:new Set(["type","key","label","tone"]),input:new Set(["type","key","placeholder","value"])};function isTone(v){return typeof v==="string"&&MOD_TONES.includes(v)}function isSpace(v){return v===0||v===1||v===2||v===3}class Refused extends Error{}function validateModTree(input){let nodes=0,keys=new Set,walk=(raw,path,depth)=>{if(depth>12)throw new Refused(`${path}: deeper than 12`);if(++nodes>400)throw new Refused("more than 400 elements");if(!raw||typeof raw!=="object"||Array.isArray(raw))throw new Refused(`${path}: not an element`);let el=raw,type=el.type;if(type!=="box"&&type!=="text"&&type!=="button"&&type!=="input")throw new Refused(`${path}: unknown element ${JSON.stringify(type)}`);for(let prop of Object.keys(el))if(!ALLOWED[type].has(prop))throw new Refused(`${path}: ${type} has no prop "${prop}"`);if(el.tone!==void 0&&!isTone(el.tone))throw new Refused(`${path}: tone must be one of ${MOD_TONES.join(", ")}`);if(type==="text"){if(typeof el.text!=="string"||el.text.length>4000)throw new Refused(`${path}: text must be a string of at most 4000 chars`);if(el.bold!==void 0&&typeof el.bold!=="boolean")throw new Refused(`${path}: bold must be boolean`);return{type,text:el.text,...el.tone!==void 0?{tone:el.tone}:{},...el.bold?{bold:!0}:{}}}if(type==="button"||type==="input"){if(typeof el.key!=="string"||!MOD_KEY_PATTERN.test(el.key))throw new Refused(`${path}: bad ${type} key`);if(keys.has(el.key))throw new Refused(`${path}: duplicate key "${el.key}"`);keys.add(el.key)}if(type==="input"){for(let prop of["placeholder","value"]){let v=el[prop];if(v!==void 0&&(typeof v!=="string"||v.length>4000))throw new Refused(`${path}: ${prop} must be a string of at most 4000 chars`)}return{type,key:el.key,...el.placeholder!==void 0?{placeholder:el.placeholder}:{},...el.value!==void 0?{value:el.value}:{}}}if(type==="button"){if(typeof el.label!=="string"||el.label.length===0||el.label.length>40)throw new Refused(`${path}: label must be 1-40 chars`);return{type,key:el.key,label:el.label,...el.tone!==void 0?{tone:el.tone}:{}}}if(el.direction!==void 0&&el.direction!=="row"&&el.direction!=="column")throw new Refused(`${path}: direction must be "row" or "column"`);for(let prop of["gap","padding"])if(el[prop]!==void 0&&!isSpace(el[prop]))throw new Refused(`${path}: ${prop} must be 0-3`);if(el.border!==void 0&&typeof el.border!=="boolean")throw new Refused(`${path}: border must be boolean`);if(!Array.isArray(el.children))throw new Refused(`${path}: box needs children`);return{type,...el.direction!==void 0?{direction:el.direction}:{},...el.gap!==void 0?{gap:el.gap}:{},...el.padding!==void 0?{padding:el.padding}:{},...el.border?{border:!0}:{},children:el.children.map((child,i)=>walk(child,`${path}.children[${i}]`,depth+1))}};try{return{ok:!0,tree:walk(input,"tree",1)}}catch(err){if(err instanceof Refused)return{ok:!1,error:err.message};throw err}}function parseModUiPayload(payload){let panes=payload?.panes;if(!Array.isArray(panes))return null;let out=[];for(let raw of panes){if(!raw||typeof raw!=="object")continue;let p=raw;if(typeof p.plugin!=="string"||typeof p.id!=="string"||typeof p.title!=="string")continue;let tree=validateModTree(p.tree);if(tree.ok)out.push({plugin:p.plugin,id:p.id,title:p.title,tree:tree.tree})}return out}var PLUGIN_EVENT_NAMES=["task.created","task.deleted","task.changed","task.landed","task.pr-changed","worktree.created","issue.changed","note.filed","message.delivered","attention.handled","automation.dispatched","automation.skipped","automation.failed","quota.exhausted","quota.resumed","session.exited","plugin.enabled","plugin.disabled","agent.turn-complete","agent.permission-needed","agent.rate-limited","agent.rate-limit-recovered","agent.error","agent.running","agent.idle","session.start","session.end","turn.prompt","turn.complete","turn.failed","turn.interrupted","tool.pre","tool.post","tool.failed","attention.permission","attention.question","context.pre-compact","context.post-compact","subagent.start","subagent.stop","file.will-open","file.opened","file.closed","task.opened","project.opened","tab.opened","tab.closed"],DAEMON_CHANNELS=["task.snapshot","issue.snapshot","tabs.changed","row.status","dispatch.snapshot","active-task","update","engine-state","attention.inbox","gates","ui-prefs","keybindings","state","machines","task.jobs","task.tokens","worktree.changes","transcript.activity","session.deliver","tab.open","tab.close","tab.rename","tab.add","engine.lifecycle","notice.event","usage.snapshot","usage.context","ui.prompt","graphics.write","mod.ui"],ROVE_API_VERSION=3;
3
3
  export{MOD_INPUT_MAX,MOD_KEY_PATTERN,MOD_PANE_ID_PATTERN,MOD_TITLE_MAX,validateModTree,parseModUiPayload,PLUGIN_EVENT_NAMES,DAEMON_CHANNELS,ROVE_API_VERSION};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{basename,dirname,join}from"path";var LEGACY_PRE_RENAME_RUNTIME_NAME="kobe",PRE_RENAME_VERSION_KEY=`${LEGACY_PRE_RENAME_RUNTIME_NAME}Version`;function preRenameStateDir(home){return join(home,`.${LEGACY_PRE_RENAME_RUNTIME_NAME}`)}function preRenameConfigDir(home){return join(home,".config",LEGACY_PRE_RENAME_RUNTIME_NAME)}function preRenameRuntimePaths(canonical){let name=basename(canonical);if(canonical.startsWith("\\\\.\\pipe\\rove-")&&canonical.endsWith("-pty"))return[canonical.replace("\\pipe\\rove-",`\\pipe\\${LEGACY_PRE_RENAME_RUNTIME_NAME}-`)];if(/^rove(?:-[a-f0-9]{8})?-(?:pty|daemon)(?:-\d+)?\.sock$/.test(name)||name==="rove.sock")return[join(dirname(canonical),name.replace(/^rove/,LEGACY_PRE_RENAME_RUNTIME_NAME))];if(["pty.sock","pty.pid","daemon.sock","daemon.pid"].includes(name)&&basename(dirname(canonical))===".rove")return[join(preRenameStateDir(dirname(dirname(canonical))),name)];return[]}
3
+ export{PRE_RENAME_VERSION_KEY,preRenameStateDir,preRenameConfigDir,preRenameRuntimePaths};
@@ -1,9 +1,9 @@
1
1
  // @bun
2
- import{getPersistedString,setPersistedString}from"./chunk-m6pp9gaf.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import{__require}from"./chunk-91sykzqq.js";import{accessSync,existsSync,constants as fsConstants,readFileSync,statSync}from"fs";import{homedir}from"os";import{delimiter,dirname,join,resolve}from"path";import{fileURLToPath}from"url";var ROVE_SKILL_VERSION=72,ROVE_SKILL_REL_PATHS=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md"],SKILL_REL_PATHS=ROVE_SKILL_REL_PATHS;function skillInstallCommand(env=process.env){return`${ROVE_PRODUCT_NAME} skill install`}var SKILL_SOURCE_SLUG="Sma1lboy/rove";function bundledSkillDir(){let here=fileURLToPath(import.meta.url);return[resolve(here,"../../../../../.agents/skills/rove"),resolve(here,"../../skills/rove")].find((dir)=>existsSync(join(dir,"SKILL.md")))??null}function npxSkillsArgv(opts={}){let source=opts.source!==void 0?opts.source:bundledSkillDir(),agents=opts.agent===void 0?[]:typeof opts.agent==="string"?[opts.agent]:opts.agent;return["skills","add",source??SKILL_SOURCE_SLUG,"--skill",ROVE_PRODUCT_NAME,...opts.global===!1?[]:["--global"],...agents.flatMap((a)=>["--agent",a])]}function npxSkillsCommand(opts={}){return`npx ${npxSkillsArgv(opts).join(" ")}`}var NPX_MISSING_EXIT=127;function isNpxMissing(){let parts=(process.env.PATH??"").split(delimiter).filter(Boolean);if(parts.length===0)return!1;return!parts.some((dir)=>{try{return accessSync(join(dir,"npx"),fsConstants.X_OK),!0}catch{return!1}})}function npxMissingMessage(){return`${ROVE_PRODUCT_NAME} skill install needs \`npx\` (part of Node.js), which isn't on your PATH.
2
+ import{getPersistedString,setPersistedString}from"./chunk-rfp0ayra.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import{__require}from"./chunk-91sykzqq.js";import{accessSync,existsSync,constants as fsConstants,readFileSync,statSync}from"fs";import{homedir}from"os";import{delimiter,dirname,join,resolve}from"path";import{fileURLToPath}from"url";var ROVE_SKILL_VERSION=73,ROVE_SKILL_REL_PATHS=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md"],SKILL_REL_PATHS=ROVE_SKILL_REL_PATHS;function skillInstallCommand(env=process.env){return`${ROVE_PRODUCT_NAME} skill install`}var SKILL_SOURCE_SLUG="Sma1lboy/rove";function bundledSkillDir(){let here=fileURLToPath(import.meta.url);return[resolve(here,"../../../../../.agents/skills/rove"),resolve(here,"../../skills/rove")].find((dir)=>existsSync(join(dir,"SKILL.md")))??null}function npxSkillsArgv(opts={}){let source=opts.source!==void 0?opts.source:bundledSkillDir(),agents=opts.agent===void 0?[]:typeof opts.agent==="string"?[opts.agent]:opts.agent;return["skills","add",source??SKILL_SOURCE_SLUG,"--skill",ROVE_PRODUCT_NAME,...opts.global===!1?[]:["--global"],...agents.flatMap((a)=>["--agent",a])]}function npxSkillsCommand(opts={}){return`npx ${npxSkillsArgv(opts).join(" ")}`}var NPX_MISSING_EXIT=127;function isNpxMissing(){let parts=(process.env.PATH??"").split(delimiter).filter(Boolean);if(parts.length===0)return!1;return!parts.some((dir)=>{try{return accessSync(join(dir,"npx"),fsConstants.X_OK),!0}catch{return!1}})}function npxMissingMessage(){return`${ROVE_PRODUCT_NAME} skill install needs \`npx\` (part of Node.js), which isn't on your PATH.
3
3
  Install Node.js (https://nodejs.org) and run it again \u2014 the Rove installer only installs Bun and Rove.`}async function runNpxSkillsInstall(agent,global){if(isNpxMissing())return process.stderr.write(`
4
4
  ${npxMissingMessage()}
5
5
 
6
- `),NPX_MISSING_EXIT;return await Bun.spawn(["npx",...npxSkillsArgv({...agent===void 0?{}:{agent},global})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}var HINT_SEEN_KEY="skillHintSeen";function markSkillHintSeen(){setPersistedString(HINT_SEEN_KEY,"1")}function roveSkillPaths(opts={}){let home=opts.home??homedir(),cwd=opts.cwd??process.cwd();return[home,cwd].flatMap((root)=>SKILL_REL_PATHS.map((rel)=>join(root,rel)))}function parseSkillVersion(content){let m=content.match(/rove-skill-version:\s*(\d+)/);return m?Number.parseInt(m[1],10):null}function skillVersionAt(path){try{return parseSkillVersion(readFileSync(path,"utf8"))}catch{return null}}function inodeKey(path){try{let stat=statSync(path);return`${stat.dev}:${stat.ino}`}catch{return path}}function distinctSkillFiles(roots,rels){let seen=new Set,out=[];for(let root of roots)for(let rel of rels){let path=join(root,rel);if(!existsSync(path))continue;let key=inodeKey(path);if(seen.has(key))continue;seen.add(key),out.push(path)}return out}function installedSkillDirs(home=homedir()){return distinctSkillFiles([home],SKILL_REL_PATHS).map((path)=>dirname(path))}function roveSkillState(opts={}){let roots=[opts.home??homedir(),opts.cwd??process.cwd()],best=[...distinctSkillFiles(roots,ROVE_SKILL_REL_PATHS).map((path)=>({path,version:skillVersionAt(path)}))].sort((a,b)=>(b.version??-1)-(a.version??-1))[0];if(!best)return{installed:!1,installedVersion:null,currentVersion:ROVE_SKILL_VERSION,stale:!1,path:null};let stale=best.version===null||best.version<ROVE_SKILL_VERSION;return{installed:!0,installedVersion:best.version,currentVersion:ROVE_SKILL_VERSION,stale,path:best.path}}function installedSkillDiffersFromBundled(installedPath){let bundled=bundledSkillDir();if(!bundled)return!1;try{return readFileSync(join(bundled,"SKILL.md"),"utf8")!==readFileSync(installedPath,"utf8")}catch{return!1}}function promptLine(){return new Promise((resolve2)=>{process.stdin.resume(),process.stdin.once("data",(d)=>{process.stdin.pause(),resolve2(String(d))})})}async function maybeHintSkillInstall(io={}){let{isRovePluginEnabled}=await import("./chunk-c47gag5r.js");if(isRovePluginEnabled())return;let cliName=ROVE_PRODUCT_NAME,installCommand=skillInstallCommand(),state=roveSkillState();if(!state.installed){if(getPersistedString(HINT_SEEN_KEY)==="1")return;setPersistedString(HINT_SEEN_KEY,"1"),process.stderr.write(`
6
+ `),NPX_MISSING_EXIT;return await Bun.spawn(["npx",...npxSkillsArgv({...agent===void 0?{}:{agent},global})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}var HINT_SEEN_KEY="skillHintSeen";function markSkillHintSeen(){setPersistedString(HINT_SEEN_KEY,"1")}function roveSkillPaths(opts={}){let home=opts.home??homedir(),cwd=opts.cwd??process.cwd();return[home,cwd].flatMap((root)=>SKILL_REL_PATHS.map((rel)=>join(root,rel)))}function parseSkillVersion(content){let m=content.match(/rove-skill-version:\s*(\d+)/);return m?Number.parseInt(m[1],10):null}function skillVersionAt(path){try{return parseSkillVersion(readFileSync(path,"utf8"))}catch{return null}}function inodeKey(path){try{let stat=statSync(path);return`${stat.dev}:${stat.ino}`}catch{return path}}function distinctSkillFiles(roots,rels){let seen=new Set,out=[];for(let root of roots)for(let rel of rels){let path=join(root,rel);if(!existsSync(path))continue;let key=inodeKey(path);if(seen.has(key))continue;seen.add(key),out.push(path)}return out}function installedSkillDirs(home=homedir()){return distinctSkillFiles([home],SKILL_REL_PATHS).map((path)=>dirname(path))}function roveSkillState(opts={}){let roots=[opts.home??homedir(),opts.cwd??process.cwd()],best=[...distinctSkillFiles(roots,ROVE_SKILL_REL_PATHS).map((path)=>({path,version:skillVersionAt(path)}))].sort((a,b)=>(b.version??-1)-(a.version??-1))[0];if(!best)return{installed:!1,installedVersion:null,currentVersion:ROVE_SKILL_VERSION,stale:!1,path:null};let stale=best.version===null||best.version<ROVE_SKILL_VERSION;return{installed:!0,installedVersion:best.version,currentVersion:ROVE_SKILL_VERSION,stale,path:best.path}}function installedSkillDiffersFromBundled(installedPath){let bundled=bundledSkillDir();if(!bundled)return!1;try{return readFileSync(join(bundled,"SKILL.md"),"utf8")!==readFileSync(installedPath,"utf8")}catch{return!1}}function promptLine(){return new Promise((resolve2)=>{process.stdin.resume(),process.stdin.once("data",(d)=>{process.stdin.pause(),resolve2(String(d))})})}async function maybeHintSkillInstall(io={}){let{isRovePluginEnabled}=await import("./chunk-mvnz68vh.js");if(isRovePluginEnabled())return;let cliName=ROVE_PRODUCT_NAME,installCommand=skillInstallCommand(),state=roveSkillState();if(!state.installed){if(getPersistedString(HINT_SEEN_KEY)==="1")return;setPersistedString(HINT_SEEN_KEY,"1"),process.stderr.write(`
7
7
  ${cliName}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${cliName} api\`:
8
8
  ${installCommand}
9
9
  (wraps \`${npxSkillsCommand()}\`; check anytime with \`${cliName} doctor\`)
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{interactiveEngineCommand,listPresetIds}from"./chunk-a42j8eek.js";import{engineEntry}from"./chunk-rbr6qapz.js";import{installedEngineIds}from"./chunk-8saxdp88.js";import{spawnSync}from"child_process";import{statSync}from"fs";import path from"path";function whichOnPath(bin){let bunWhich=globalThis.Bun?.which;if(bunWhich)return bunWhich(bin);let out=spawnSync(process.platform==="win32"?"where":"which",[bin],{encoding:"utf8"});if(out.status!==0)return null;return out.stdout.split(`
2
+ import{interactiveEngineCommand,listPresetIds}from"./chunk-mj7nfaaf.js";import{engineEntry}from"./chunk-3gegmpff.js";import{installedEngineIds}from"./chunk-4fa35dbn.js";import{spawnSync}from"child_process";import{statSync}from"fs";import path from"path";function whichOnPath(bin){let bunWhich=globalThis.Bun?.which;if(bunWhich)return bunWhich(bin);let out=spawnSync(process.platform==="win32"?"where":"which",[bin],{encoding:"utf8"});if(out.status!==0)return null;return out.stdout.split(`
3
3
  `).map((l)=>l.trim()).find(Boolean)??null}var defaultDeps={which:whichOnPath,command:(vendor)=>interactiveEngineCommand(vendor)};function probeLaunchBinary(argv,which){let bin=argv[0]?.trim();if(!bin)return{found:!1,error:"no launch command"};if(bin.includes(path.sep)||bin.startsWith(".")){try{if(statSync(bin).isFile())return{found:!0,path:bin}}catch{}return{found:!1,error:`not found at ${bin}`}}let found=which(bin);return found?{found:!0,path:found}:{found:!1,error:"not found on PATH"}}async function detectEngineStatus(vendor,over={}){let deps={...defaultDeps,...over},detector=engineEntry(vendor).detectAccount;if(!detector)return{vendor,binary:probeLaunchBinary(deps.command(vendor),deps.which),account:null};let status=await detector(deps.accountDeps),binary=status.binary.found?status.binary:probeLaunchBinary(deps.command(vendor),deps.which);return{vendor,binary,account:status.account,accountError:status.accountError}}function detectEngineStatuses(vendors,over={}){return Promise.all(vendors.map((v)=>detectEngineStatus(v,over)))}function describeAccount(account){if(account===null)return"login not detectable";switch(account.kind){case"oauth":return"email"in account?`logged in (${account.email}${account.organization?`, ${account.organization}`:""})`:"logged in";case"chatgpt":return`logged in (${account.email}${account.plan?`, ${account.plan}`:""})`;case"apikey":return"API key";case"token":return`token (${account.source})`;default:return"no account"}}function engineUsable(status){return status.binary.found&&status.account?.kind!=="none"}async function probeableEngineIds(){return[...new Set([...listPresetIds(),...await installedEngineIds()])]}function summarizeEngines(statuses){let usable=[],signedOut=[];for(let status of statuses)if(engineUsable(status))usable.push(status.vendor);else if(status.binary.found)signedOut.push(status.vendor);return{usable,signedOut}}
4
4
  export{detectEngineStatus,detectEngineStatuses,describeAccount,probeableEngineIds,summarizeEngines};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{isEngineActivityKind}from"./chunk-17e2tgyg.js";import{loadPluginRegistry,readPluginManifest}from"./chunk-kvwqh35r.js";import{activityHookAdapters}from"./chunk-rbr6qapz.js";import{flagValue}from"./chunk-zsfyj36g.js";import{connectIfRunning}from"./chunk-tgfn5ykb.js";import{getPersistedString,setPersistedString}from"./chunk-m6pp9gaf.js";import{readRoveEnv}from"./chunk-nc46gddg.js";import{join,resolve}from"path";var STDIN_READ_TIMEOUT_MS=500;async function readTextWithTimeout(read,timeoutMs=STDIN_READ_TIMEOUT_MS){let raceTimer;try{return await Promise.race([read(),new Promise((resolve2)=>{raceTimer=setTimeout(()=>resolve2(""),timeoutMs)})])}finally{if(raceTimer!==void 0)clearTimeout(raceTimer)}}async function readStdinText(isComplete){let bun=globalThis.Bun;if(bun)return bun.stdin.text();if(process.stdin.isTTY)return"";let chunks=[];try{for await(let chunk of process.stdin)if(chunks.push(chunk),isComplete?.(Buffer.concat(chunks).toString("utf8")))break}finally{process.stdin.destroy()}return Buffer.concat(chunks).toString("utf8")}function isCompleteJson(text){try{return JSON.parse(text),!0}catch{return!1}}async function readStdinPayload(){try{let text=await readTextWithTimeout(()=>readStdinText(isCompleteJson));if(!text.trim())return{};let parsed=JSON.parse(text);return parsed&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:{}}catch{return{}}}async function runHookSubcommand(argv){let[verb,...rest]=argv;if(verb==="setup"){await runHookSetup(rest);return}if(verb==="cleanup"){await runHookCleanup();return}try{if(!verb||!isEngineActivityKind(verb))return;let payload=await readStdinPayload(),payloadFlag=flagValue(rest,"--payload");if(payloadFlag)try{let extra=JSON.parse(payloadFlag);if(extra&&typeof extra==="object"&&!Array.isArray(extra))Object.assign(payload,extra)}catch{}let taskId=flagValue(rest,"--task-id"),envTaskId=process.env.ROVE_TASK_ID,envTabId=process.env.ROVE_TAB_ID,engine=flagValue(rest,"--engine"),adapters=activityHookAdapters().filter((a)=>!engine||a.vendor===engine);if(!taskId&&adapters.some((a)=>a.isUnattendedSession?.(process.env)===!0))return;let cwd=typeof payload.cwd==="string"&&payload.cwd?payload.cwd:void 0;for(let adapter of adapters){if(cwd)break;cwd=adapter.cwdFromPayload?.(payload)}cwd||=process.cwd();let detail;for(let adapter of adapters)if(detail=adapter.activityDetailFromPayload(verb,payload),detail)break;let session;for(let adapter of adapters)if(session=adapter.sessionFromPayload(payload),session)break;let client=await connectIfRunning();if(!client)return;try{let effectiveTaskId=taskId??envTaskId;await client.request("engine.reportEvent",{...effectiveTaskId?{taskId:effectiveTaskId}:{cwd},kind:verb,...engine?{engine}:{},...envTabId?{tabId:envTabId}:{},...detail?{detail}:{},...session?{sessionId:session.sessionId}:{},...session?.transcriptPath?{transcriptPath:session.transcriptPath}:{}})}finally{client.close()}}catch(err){if(readRoveEnv("HOOK_DEBUG"))console.error(`[rove hook] ${verb} failed:`,err instanceof Error?err.message:String(err))}}var SYNC_SETTING_KEY="externalWorktreeSync";function worktreeSyncAdapters(){return activityHookAdapters().filter((a)=>a.supportsWorktreeSync())}function globalSettingsPath(){return worktreeSyncAdapters()[0]?.globalSettingsPath()}function persistedSyncPath(stored){if(!stored||stored==="off")return;if(stored==="global")return globalSettingsPath();if(stored.startsWith("repo:"))return join(resolve(stored.slice(5)),".claude","settings.json");return stored}async function ensureGlobalRoveHooks(opts={}){try{let toolEvents=pluginsWantToolEvents();for(let a of activityHookAdapters()){let external=await a.externallyManagedHooks?.();if(external){if(external.notice)process.stderr.write(`
2
+ import{isEngineActivityKind}from"./chunk-17e2tgyg.js";import{loadPluginRegistry,readPluginManifest}from"./chunk-a569ctz6.js";import{activityHookAdapters}from"./chunk-3gegmpff.js";import{flagValue}from"./chunk-zsfyj36g.js";import{connectIfRunning}from"./chunk-sfn4s219.js";import{getPersistedString,setPersistedString}from"./chunk-rfp0ayra.js";import{readRoveEnv}from"./chunk-nc46gddg.js";import{join,resolve}from"path";var STDIN_READ_TIMEOUT_MS=500;async function readTextWithTimeout(read,timeoutMs=STDIN_READ_TIMEOUT_MS){let raceTimer;try{return await Promise.race([read(),new Promise((resolve2)=>{raceTimer=setTimeout(()=>resolve2(""),timeoutMs)})])}finally{if(raceTimer!==void 0)clearTimeout(raceTimer)}}async function readStdinText(isComplete){let bun=globalThis.Bun;if(bun)return bun.stdin.text();if(process.stdin.isTTY)return"";let chunks=[];try{for await(let chunk of process.stdin)if(chunks.push(chunk),isComplete?.(Buffer.concat(chunks).toString("utf8")))break}finally{process.stdin.destroy()}return Buffer.concat(chunks).toString("utf8")}function isCompleteJson(text){try{return JSON.parse(text),!0}catch{return!1}}async function readStdinPayload(){try{let text=await readTextWithTimeout(()=>readStdinText(isCompleteJson));if(!text.trim())return{};let parsed=JSON.parse(text);return parsed&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:{}}catch{return{}}}async function runHookSubcommand(argv){let[verb,...rest]=argv;if(verb==="setup"){await runHookSetup(rest);return}if(verb==="cleanup"){await runHookCleanup();return}try{if(!verb||!isEngineActivityKind(verb))return;let payload=await readStdinPayload(),payloadFlag=flagValue(rest,"--payload");if(payloadFlag)try{let extra=JSON.parse(payloadFlag);if(extra&&typeof extra==="object"&&!Array.isArray(extra))Object.assign(payload,extra)}catch{}let taskId=flagValue(rest,"--task-id"),envTaskId=process.env.ROVE_TASK_ID,envTabId=process.env.ROVE_TAB_ID,engine=flagValue(rest,"--engine"),adapters=activityHookAdapters().filter((a)=>!engine||a.vendor===engine);if(!taskId&&adapters.some((a)=>a.isUnattendedSession?.(process.env)===!0))return;let cwd=typeof payload.cwd==="string"&&payload.cwd?payload.cwd:void 0;for(let adapter of adapters){if(cwd)break;cwd=adapter.cwdFromPayload?.(payload)}cwd||=process.cwd();let detail;for(let adapter of adapters)if(detail=adapter.activityDetailFromPayload(verb,payload),detail)break;let session;for(let adapter of adapters)if(session=adapter.sessionFromPayload(payload),session)break;let client=await connectIfRunning();if(!client)return;try{let effectiveTaskId=taskId??envTaskId;await client.request("engine.reportEvent",{...effectiveTaskId?{taskId:effectiveTaskId}:{cwd},kind:verb,...engine?{engine}:{},...envTabId?{tabId:envTabId}:{},...detail?{detail}:{},...session?{sessionId:session.sessionId}:{},...session?.transcriptPath?{transcriptPath:session.transcriptPath}:{}})}finally{client.close()}}catch(err){if(readRoveEnv("HOOK_DEBUG"))console.error(`[rove hook] ${verb} failed:`,err instanceof Error?err.message:String(err))}}var SYNC_SETTING_KEY="externalWorktreeSync";function worktreeSyncAdapters(){return activityHookAdapters().filter((a)=>a.supportsWorktreeSync())}function globalSettingsPath(){return worktreeSyncAdapters()[0]?.globalSettingsPath()}function persistedSyncPath(stored){if(!stored||stored==="off")return;if(stored==="global")return globalSettingsPath();if(stored.startsWith("repo:"))return join(resolve(stored.slice(5)),".claude","settings.json");return stored}async function ensureGlobalRoveHooks(opts={}){try{let toolEvents=pluginsWantToolEvents();for(let a of activityHookAdapters()){let external=await a.externallyManagedHooks?.();if(external){if(external.notice)process.stderr.write(`
3
3
  ${external.notice}
4
4
  `);continue}let enginePath=a.globalSettingsPath();if(!enginePath)continue;await a.installActivityHooks(enginePath,{toolEvents,quiet:opts.quiet}),await a.removeWorktreeWatchHook(enginePath)}await cleanupWorktreeSyncHook()}catch{}}function pluginsWantToolEvents(){try{for(let entry of loadPluginRegistry().plugins){if(!entry.enabled)continue;try{if(readPluginManifest(entry.root).manifest.events.some((e)=>e.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function cleanupWorktreeSyncHook(){let adapters=worktreeSyncAdapters();if(adapters.length===0)return;let stored=getPersistedString(SYNC_SETTING_KEY),paths=new Set;for(let adapter of adapters){let file=adapter.globalSettingsPath();if(file)paths.add(file)}let prev=persistedSyncPath(stored);if(prev)paths.add(prev);for(let a of adapters)for(let p of paths)await a.removeWorktreeSyncHook(p);if(stored!=="off")setPersistedString(SYNC_SETTING_KEY,"off")}async function runHookCleanup(){let claude=activityHookAdapters().find((a)=>a.vendor==="claude"),path=claude?.globalSettingsPath();if(!claude||!path){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
5
5
  `);return}await claude.removeActivityHooks(path),await claude.removeWorktreeWatchHook(path),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${path}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`