@sma1lboy/rove 0.9.108 → 0.9.147

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 (194) hide show
  1. package/README.md +0 -1
  2. package/dist/cli/chunk-003tvywc.js +3 -0
  3. package/dist/cli/chunk-0m9j3yap.js +7 -0
  4. package/dist/cli/chunk-0r8333z3.js +3 -0
  5. package/dist/cli/chunk-0sm2k04y.js +3 -0
  6. package/dist/cli/chunk-0vmrteyg.js +3 -0
  7. package/dist/cli/chunk-0vy8351p.js +18 -0
  8. package/dist/cli/chunk-13s8rnk5.js +3 -0
  9. package/dist/cli/chunk-1kktfmtg.js +4 -0
  10. package/dist/cli/chunk-1rkb0j1j.js +3 -0
  11. package/dist/cli/chunk-1tx1s5v6.js +2 -0
  12. package/dist/cli/chunk-20pt9yqh.js +4 -0
  13. package/dist/cli/chunk-2brn8e1y.js +3 -0
  14. package/dist/cli/chunk-2fypr41w.js +3 -0
  15. package/dist/cli/chunk-2jxdzw4r.js +3 -0
  16. package/dist/cli/chunk-2pqqvse3.js +2 -0
  17. package/dist/cli/chunk-3bfm4hrs.js +3 -0
  18. package/dist/cli/chunk-3ry6prwn.js +3 -0
  19. package/dist/cli/chunk-3ztek08w.js +4 -0
  20. package/dist/cli/chunk-49s2zc0h.js +8 -0
  21. package/dist/cli/chunk-4wwx51m5.js +3 -0
  22. package/dist/cli/chunk-5bn91n19.js +3 -0
  23. package/dist/cli/chunk-5c3d1y0r.js +2 -0
  24. package/dist/cli/chunk-5hhvrvgm.js +8 -0
  25. package/dist/cli/chunk-6dn6h640.js +3 -0
  26. package/dist/cli/chunk-6frfschk.js +2 -0
  27. package/dist/cli/chunk-6rkc7efm.js +5 -0
  28. package/dist/cli/chunk-6xppe9bj.js +3 -0
  29. package/dist/cli/chunk-6zwg6me2.js +4 -0
  30. package/dist/cli/chunk-764bsyb0.js +1 -0
  31. package/dist/cli/chunk-79gqh5p2.js +5 -0
  32. package/dist/cli/chunk-7nhdvr5v.js +4 -0
  33. package/dist/cli/chunk-7q67dz4c.js +3 -0
  34. package/dist/cli/chunk-7ydwn358.js +3 -0
  35. package/dist/cli/chunk-86j25g7y.js +7 -0
  36. package/dist/cli/chunk-88qjhytd.js +12 -0
  37. package/dist/cli/chunk-8arm7k43.js +69 -0
  38. package/dist/cli/chunk-8ddjfc2v.js +4 -0
  39. package/dist/cli/chunk-8r1shxz0.js +16 -0
  40. package/dist/cli/chunk-99devyxr.js +2 -0
  41. package/dist/cli/chunk-9c1e5z6a.js +3 -0
  42. package/dist/cli/chunk-9n458sdy.js +2 -0
  43. package/dist/cli/chunk-aq912vvw.js +3 -0
  44. package/dist/cli/chunk-arf294te.js +2 -0
  45. package/dist/cli/chunk-awsawfrm.js +2 -0
  46. package/dist/cli/chunk-aynx3d2a.js +2 -0
  47. package/dist/cli/chunk-b99tf0jr.js +3 -0
  48. package/dist/cli/chunk-bdbgmjt7.js +3 -0
  49. package/dist/cli/chunk-c6mthex1.js +5 -0
  50. package/dist/cli/chunk-cb0pgyq1.js +8 -0
  51. package/dist/cli/chunk-cb2fpajx.js +3 -0
  52. package/dist/cli/chunk-cehhk94g.js +2 -0
  53. package/dist/cli/chunk-d4bqay6d.js +9 -0
  54. package/dist/cli/chunk-dcb59tsn.js +2 -0
  55. package/dist/cli/chunk-df7qe9y7.js +4 -0
  56. package/dist/cli/chunk-dkxhmj9k.js +25 -0
  57. package/dist/cli/chunk-dnb2bmtb.js +3 -0
  58. package/dist/cli/chunk-dqndd97s.js +7 -0
  59. package/dist/cli/chunk-dvcb6mk4.js +3 -0
  60. package/dist/cli/chunk-dw853n4w.js +3 -0
  61. package/dist/cli/chunk-dwsgeq06.js +15 -0
  62. package/dist/cli/chunk-e1g9mvww.js +11 -0
  63. package/dist/cli/chunk-e3ye4kmk.js +2 -0
  64. package/dist/cli/chunk-ef11h2am.js +3 -0
  65. package/dist/cli/chunk-ef39ym8f.js +3 -0
  66. package/dist/cli/chunk-ewdhz3dv.js +2 -0
  67. package/dist/cli/chunk-f6zsej8e.js +3 -0
  68. package/dist/cli/chunk-fe34e0w7.js +28 -0
  69. package/dist/cli/chunk-g1ybdgad.js +25 -0
  70. package/dist/cli/chunk-gbasmvsc.js +4 -0
  71. package/dist/cli/chunk-gjf604bb.js +3 -0
  72. package/dist/cli/chunk-gm3vj0fv.js +5 -0
  73. package/dist/cli/chunk-grh6dvfv.js +5 -0
  74. package/dist/cli/chunk-gwcneg6c.js +2 -0
  75. package/dist/cli/chunk-h5j8b87f.js +2 -0
  76. package/dist/cli/chunk-h79zfebh.js +7 -0
  77. package/dist/cli/chunk-h82kzdsn.js +3 -0
  78. package/dist/cli/chunk-hape5vwj.js +3 -0
  79. package/dist/cli/chunk-hg5x2wr0.js +3 -0
  80. package/dist/cli/chunk-hgq2gtxx.js +4 -0
  81. package/dist/cli/chunk-j4xfsn9g.js +5 -0
  82. package/dist/cli/chunk-j9g1m4dy.js +2 -0
  83. package/dist/cli/chunk-jdbfawrm.js +3 -0
  84. package/dist/cli/chunk-jsss3ze7.js +11 -0
  85. package/dist/cli/chunk-jvssy49v.js +2 -0
  86. package/dist/cli/chunk-jvxh93nz.js +3 -0
  87. package/dist/cli/chunk-jyv82gf0.js +258 -0
  88. package/dist/cli/chunk-k3ksts6g.js +3 -0
  89. package/dist/cli/chunk-kdrrw9tm.js +2 -0
  90. package/dist/cli/chunk-kg11c1py.js +3 -0
  91. package/dist/cli/chunk-kwe61yx7.js +3 -0
  92. package/dist/cli/chunk-mb5m7ex7.js +2 -0
  93. package/dist/cli/chunk-mfqjdpd8.js +2 -0
  94. package/dist/cli/chunk-mjvq39gf.js +4 -0
  95. package/dist/cli/chunk-mrwee8sj.js +3 -0
  96. package/dist/cli/chunk-my20q579.js +3 -0
  97. package/dist/cli/chunk-myfjt6dw.js +7 -0
  98. package/dist/cli/chunk-nceh1q3d.js +12 -0
  99. package/dist/cli/chunk-ncsgawg7.js +2 -0
  100. package/dist/cli/chunk-nm6adny4.js +4 -0
  101. package/dist/cli/chunk-np07kccr.js +4 -0
  102. package/dist/cli/chunk-p56s3ekm.js +3 -0
  103. package/dist/cli/chunk-p5spmf7e.js +2 -0
  104. package/dist/cli/chunk-p7kztgsd.js +4 -0
  105. package/dist/cli/chunk-pdh5w4ht.js +3 -0
  106. package/dist/cli/chunk-pdj8kqa1.js +74 -0
  107. package/dist/cli/chunk-psx9tk3x.js +4 -0
  108. package/dist/cli/chunk-pw6yfj10.js +3 -0
  109. package/dist/cli/chunk-q6579rbz.js +3 -0
  110. package/dist/cli/chunk-q7dr9eh6.js +3 -0
  111. package/dist/cli/chunk-q9x6d0k6.js +3 -0
  112. package/dist/cli/chunk-qkehg2c1.js +3 -0
  113. package/dist/cli/chunk-qtke4x42.js +3 -0
  114. package/dist/cli/chunk-rgcv1wcs.js +4 -0
  115. package/dist/cli/chunk-rxvbm4vt.js +7 -0
  116. package/dist/cli/chunk-ryhrw647.js +3 -0
  117. package/dist/cli/chunk-s76r56rj.js +3 -0
  118. package/dist/cli/chunk-sdyzxayr.js +3 -0
  119. package/dist/cli/chunk-svpn3av1.js +3 -0
  120. package/dist/cli/chunk-v5893dx3.js +2 -0
  121. package/dist/cli/chunk-vapjtyv9.js +7 -0
  122. package/dist/cli/chunk-vkch2spv.js +33 -0
  123. package/dist/cli/chunk-vpzvcxc1.js +3 -0
  124. package/dist/cli/chunk-vws0j65e.js +4 -0
  125. package/dist/cli/chunk-vyb5a2rh.js +4 -0
  126. package/dist/cli/chunk-w298ayjc.js +3 -0
  127. package/dist/cli/chunk-w48zjgxv.js +9 -0
  128. package/dist/cli/chunk-w5xy83ze.js +2 -0
  129. package/dist/cli/chunk-wpgmq5z6.js +106 -0
  130. package/dist/cli/chunk-wqfp8d9w.js +3 -0
  131. package/dist/cli/chunk-x760j10f.js +3 -0
  132. package/dist/cli/chunk-xbc3gcry.js +2 -0
  133. package/dist/cli/chunk-xy8be792.js +3 -0
  134. package/dist/cli/chunk-yhcz2d2r.js +34 -0
  135. package/dist/cli/chunk-yk2ha5yj.js +3 -0
  136. package/dist/cli/chunk-ykvk2546.js +3 -0
  137. package/dist/cli/chunk-ympakh8w.js +6 -0
  138. package/dist/cli/chunk-zb56ck5f.js +3 -0
  139. package/dist/cli/chunk-zwzkve1e.js +2 -0
  140. package/dist/cli/chunk-zy6vgjdp.js +19 -0
  141. package/dist/cli/index.js +15 -845
  142. package/dist/cli/kobe-run.js +1 -853
  143. package/dist/cli/kobe.js +6 -6
  144. package/dist/cli/pty-host-node.mjs +190 -52
  145. package/dist/cli/rove-run.js +1 -853
  146. package/dist/cli/rove.js +6 -6
  147. package/dist/skills/rove/SKILL.md +29 -10
  148. package/dist/skills/rove/references/api-flags.md +35 -13
  149. package/dist/web-ui/assets/{ChatTerminal-BshL3M8G.js → harness-CYGJ4uoR.js} +19 -20
  150. package/dist/web-ui/assets/index-BTJ-X_4s.js +10 -0
  151. package/dist/web-ui/assets/index-Cs2vPLNB.css +1 -0
  152. package/dist/web-ui/index.html +2 -9
  153. package/dist/web-ui/pty-server.mjs +4 -5
  154. package/package.json +2 -2
  155. package/dist/web-ui/assets/AppShell-BGRIs5hW.js +0 -5
  156. package/dist/web-ui/assets/AppShell-HiyATJse.css +0 -1
  157. package/dist/web-ui/assets/Board-Bt3cwp25.js +0 -1
  158. package/dist/web-ui/assets/BoardPeek-BKR-tpS2.js +0 -2
  159. package/dist/web-ui/assets/ChatTranscript-B67_nnd6.js +0 -1
  160. package/dist/web-ui/assets/ConfirmDialog-kyA624OF.js +0 -1
  161. package/dist/web-ui/assets/IssueIntakePanel-BMP8Vc3E.js +0 -1
  162. package/dist/web-ui/assets/IssuePeek-C7afOYax.js +0 -1
  163. package/dist/web-ui/assets/IssuesPage-DwRaBB-m.js +0 -1
  164. package/dist/web-ui/assets/SettingsPage-CC1sDI8j.js +0 -2
  165. package/dist/web-ui/assets/SlideOver-B4sEOPyN.css +0 -1
  166. package/dist/web-ui/assets/SlideOver-Dq0ifiEm.js +0 -173
  167. package/dist/web-ui/assets/ViewToggle-mNsDLJp8.js +0 -1
  168. package/dist/web-ui/assets/WorkspaceTabs-DLzL-Tad.css +0 -1
  169. package/dist/web-ui/assets/WorkspaceTabs-ifAIZ5Fj.js +0 -3
  170. package/dist/web-ui/assets/active-task-gVYiAkLv.js +0 -1
  171. package/dist/web-ui/assets/arrow-left-CavMh90a.js +0 -1
  172. package/dist/web-ui/assets/board-DoArj55z.js +0 -1
  173. package/dist/web-ui/assets/chips-CS9PLtWy.js +0 -1
  174. package/dist/web-ui/assets/createLucideIcon-CuIQtyYV.js +0 -1
  175. package/dist/web-ui/assets/external-link-Du2dMe8S.js +0 -1
  176. package/dist/web-ui/assets/external-store-BCBJewGi.js +0 -1
  177. package/dist/web-ui/assets/harness-ClZMF1wx.js +0 -1
  178. package/dist/web-ui/assets/index-B4xJZEqf.js +0 -10
  179. package/dist/web-ui/assets/index-BnjD9Q-3.css +0 -1
  180. package/dist/web-ui/assets/issues-DwrKXp9c.js +0 -4
  181. package/dist/web-ui/assets/issues-ISAZBras.js +0 -1
  182. package/dist/web-ui/assets/lazy-issue-panels-DvXQJhKy.js +0 -6
  183. package/dist/web-ui/assets/rotate-cw-BXdpzm3v.js +0 -1
  184. package/dist/web-ui/assets/routes-DEEkL5gG.js +0 -1
  185. package/dist/web-ui/assets/store-BLM6nh6E.js +0 -2
  186. package/dist/web-ui/assets/tabs-CMZJhcSB.js +0 -1
  187. package/dist/web-ui/assets/task._taskId-BCIhg4IQ.js +0 -1
  188. package/dist/web-ui/assets/terminal-DOp1a9g6.js +0 -1
  189. package/dist/web-ui/assets/text-match-DW3sD-Rt.js +0 -1
  190. package/dist/web-ui/assets/time-kviT26Tm.js +0 -1
  191. package/dist/web-ui/assets/toast-C4yXq6hM.js +0 -1
  192. package/dist/web-ui/assets/web-transport-Beqz2mQ8.js +0 -1
  193. package/dist/web-ui/assets/worktrees-BGvJOG2b.js +0 -1
  194. /package/dist/web-ui/assets/{ChatTerminal-BrP-ENHg.css → harness-BrP-ENHg.css} +0 -0
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{LEGACY_KOBE_CONFIG_DIR_BASENAME,LEGACY_KOBE_STATE_DIR_BASENAME,ROVE_CONFIG_DIR_BASENAME,ROVE_STATE_DIR_BASENAME}from"./chunk-cb2fpajx.js";import{readRoveEnv}from"./chunk-3bfm4hrs.js";import{randomUUID}from"crypto";import{constants,closeSync,copyFileSync,fsyncSync,linkSync,lstatSync,mkdirSync,openSync,readdirSync,readlinkSync,renameSync,symlinkSync,unlinkSync,writeFileSync}from"fs";import{homedir}from"os";import{dirname,join}from"path";var CLIENT_MIGRATION_MARKER=".layout-client-migration-v1",PLUGIN_MIGRATION_MARKER=".layout-plugins-migration-v1",DAEMON_MIGRATION_MARKER=".layout-daemon-migration-v1",CLIENT_STATE_ENTRIES=["attachments","settings","themes"],DAEMON_STATE_ENTRIES=["attention-inbox.json","automations.json","issue-assets","issues.json","notes","notes.json","tasks.json","worktree-init"];function errorText(err){return err instanceof Error?err.message:String(err)}function lstatIfExists(path){try{return lstatSync(path)}catch(err){if(err.code==="ENOENT")return;throw err}}function removeTemp(path){try{unlinkSync(path)}catch(err){if(err.code!=="ENOENT")throw err}}function syncFile(path){let handle=openSync(path,"r");try{fsyncSync(handle)}finally{closeSync(handle)}}function publishTemp(temp,destination){try{return linkSync(temp,destination),!0}catch(err){if(err.code==="EEXIST")return!1;throw err}}function copyRegularFile(source,destination){let temp=`${destination}.migration-${process.pid}-${randomUUID()}.tmp`;try{return copyFileSync(source,temp,constants.COPYFILE_EXCL),syncFile(temp),publishTemp(temp,destination)?1:0}finally{removeTemp(temp)}}function writeMarker(destination){let temp=`${destination}.migration-${process.pid}-${randomUUID()}.tmp`;try{writeFileSync(temp,`legacy kobe state copied without overwrite
3
+ `,{flag:"wx"}),syncFile(temp),publishTemp(temp,destination)}finally{removeTemp(temp)}}function copyMissing(source,destination){let sourceStat=lstatIfExists(source);if(!sourceStat)return 0;let destinationStat=lstatIfExists(destination);if(destinationStat){if(!sourceStat.isDirectory()||!destinationStat.isDirectory())return 0;let copied=0;for(let name of readdirSync(source))copied+=copyMissing(join(source,name),join(destination,name));return copied}if(mkdirSync(dirname(destination),{recursive:!0}),sourceStat.isDirectory()){mkdirSync(destination,{recursive:!0,mode:sourceStat.mode});let copied=0;for(let name of readdirSync(source))copied+=copyMissing(join(source,name),join(destination,name));return copied}if(sourceStat.isSymbolicLink())try{return symlinkSync(readlinkSync(source),destination),1}catch(err){if(err.code==="EEXIST")return 0;throw err}return copyRegularFile(source,destination)}function migrateStateEntries(entries,markerName,includeConfig,env){let home=readRoveEnv("HOME_DIR",env)??homedir(),legacyState=join(home,LEGACY_KOBE_STATE_DIR_BASENAME),roveState=join(home,ROVE_STATE_DIR_BASENAME),legacyConfig=join(home,".config",LEGACY_KOBE_CONFIG_DIR_BASENAME,"state.json"),roveConfig=join(home,".config",ROVE_CONFIG_DIR_BASENAME,"state.json"),marker=join(roveState,markerName),hasSource;try{if(lstatIfExists(marker))return{attempted:!1,copied:0,warnings:[]};hasSource=Boolean(lstatIfExists(legacyState)||includeConfig&&lstatIfExists(legacyConfig))}catch(err){return{attempted:!0,copied:0,warnings:[`migration preflight: ${err instanceof Error?err.message:String(err)}`]}}if(!hasSource)return{attempted:!1,copied:0,warnings:[]};let copied=0,warnings=[];for(let name of entries)try{copied+=copyMissing(join(legacyState,name),join(roveState,name))}catch(err){warnings.push(`${name}: ${err instanceof Error?err.message:String(err)}`)}if(includeConfig)try{copied+=copyMissing(legacyConfig,roveConfig)}catch(err){warnings.push(`state.json: ${err instanceof Error?err.message:String(err)}`)}if(warnings.length===0){mkdirSync(roveState,{recursive:!0});try{writeMarker(marker)}catch(err){warnings.push(`migration marker: ${err instanceof Error?err.message:String(err)}`)}}return{attempted:!0,copied,warnings}}var PLUGIN_ENTRIES=["plugins.json","plugins","plugins-outdated.json"];function migrateLegacyPluginTree(env){let home=readRoveEnv("HOME_DIR",env)??homedir(),legacyState=join(home,LEGACY_KOBE_STATE_DIR_BASENAME),roveState=join(home,ROVE_STATE_DIR_BASENAME),marker=join(roveState,PLUGIN_MIGRATION_MARKER);try{if(lstatIfExists(marker)||lstatIfExists(join(roveState,"plugins.json")))return{attempted:!1,copied:0,warnings:[]};if(!lstatIfExists(join(legacyState,"plugins.json")))return{attempted:!1,copied:0,warnings:[]}}catch(err){return{attempted:!0,copied:0,warnings:[`plugin migration preflight: ${errorText(err)}`]}}mkdirSync(roveState,{recursive:!0});let moved=0,warnings=[];for(let name of PLUGIN_ENTRIES){let source=join(legacyState,name),destination=join(roveState,name);try{if(!lstatIfExists(source)||lstatIfExists(destination))continue;renameSync(source,destination),moved+=1;try{symlinkSync(destination,source)}catch{}}catch(err){warnings.push(`${name}: ${errorText(err)}`)}}if(warnings.length===0)try{writeMarker(marker)}catch(err){warnings.push(`plugin migration marker: ${errorText(err)}`)}return{attempted:!0,copied:moved,warnings}}function migrateRoveClientStateLayout(env=process.env){return migrateStateEntries(CLIENT_STATE_ENTRIES,CLIENT_MIGRATION_MARKER,!0,env)}function migrateRoveDaemonStateLayout(env=process.env){let state=migrateStateEntries(DAEMON_STATE_ENTRIES,DAEMON_MIGRATION_MARKER,!1,env),plugins=migrateLegacyPluginTree(env);return{attempted:state.attempted||plugins.attempted,copied:state.copied+plugins.copied,warnings:[...state.warnings,...plugins.warnings]}}
4
+ export{DAEMON_MIGRATION_MARKER,migrateRoveClientStateLayout,migrateRoveDaemonStateLayout};
@@ -0,0 +1,16 @@
1
+ // @bun
2
+ import{BREAKING_VERSIONS,CURRENT_VERSION,DEFAULT_RELEASE_CHANNEL,RELEASE_CHANNELS,UPDATE_COMMAND,UPDATE_SCRIPT_URL,breakingVersionsCrossed,channelOf,checkLatestVersion,fetchReleaseSummaries,recommendedGlobalInstallCommand}from"./chunk-dnb2bmtb.js";import"./chunk-6dn6h640.js";import{activeCliName}from"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-3bfm4hrs.js";import{__require}from"./chunk-wqfp8d9w.js";import{spawnSync}from"child_process";var CLI_NAME=activeCliName();function updatePlan(target){let shell=target===void 0?UPDATE_COMMAND:`${UPDATE_COMMAND} -s -- ${target}`;return{command:"sh",args:["-c",shell],display:shell}}var VERSION_SHAPE=/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/;function isReleaseChannel(value){return RELEASE_CHANNELS.includes(value)}function parseUpdateArgs(args){let dryRun=!1,list=!1,version,channel;for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg===void 0)continue;if(arg==="--help"||arg==="-h"||arg==="help")return{help:!0,dryRun,list,version,channel};if(arg==="dry-run"||arg==="--dry-run"){dryRun=!0;continue}if(arg==="list"||arg==="--list"){list=!0;continue}if(arg==="--channel"||arg.startsWith("--channel=")){let value=(arg.startsWith("--channel=")?arg.slice(10):void 0)??args[++i];if(value===void 0||!isReleaseChannel(value))process.stderr.write(`${CLI_NAME} update: --channel expects one of ${RELEASE_CHANNELS.join(", ")}${value===void 0?"":` (got "${value}")`}
3
+
4
+ `),printUsage(process.stderr),process.exit(2);channel=value;continue}if(channel===void 0&&isReleaseChannel(arg)){channel=arg;continue}if(version===void 0&&VERSION_SHAPE.test(arg)){version=arg;continue}process.stderr.write(`${CLI_NAME} update: unknown argument "${arg}"
5
+
6
+ `),printUsage(process.stderr),process.exit(2)}return{help:!1,dryRun,list,version,channel}}function printUsage(out){out.write([`Usage: ${CLI_NAME} update [version|channel|list|dry-run]`,"","Runs Rove's GitHub-hosted update script. With [version] (e.g.","0.7.90) the script installs that exact release instead of the","head of your channel.","","Verbs (--flag spellings also accepted):"," list Browse recent versions \u2014 a TUI page with release notes"," when interactive, plain text when piped"," dry-run Print the command without running it","","Channels:"," latest Stable releases (default)"," nightly Automated nightly cut from main \u2014 newer, less baked","",`You are on: ${channelOf()}`,"","Switching channels is just installing from the other one; there is","no stored setting. Update checks follow the build you are running.","","Default command:",` ${UPDATE_COMMAND}`,"","Script URL:",` ${UPDATE_SCRIPT_URL}`,"","Manual fallback:",` ${recommendedGlobalInstallCommand()}`,"","Examples:",` ${CLI_NAME} update`,` ${CLI_NAME} update 0.7.90`,` ${CLI_NAME} update nightly`,` ${CLI_NAME} update --channel latest`,` ${CLI_NAME} update list`,` ${CLI_NAME} update dry-run`,""].join(`
7
+ `))}async function printVersionList(io){let releases=await fetchReleaseSummaries(20);if(releases.length===0)io.stderr.write(`${CLI_NAME} update: could not fetch the release list (offline or rate-limited)
8
+ `),io.exit(1);for(let release of releases){let markers=[release.version===CURRENT_VERSION?"(current)":"",BREAKING_VERSIONS.includes(release.version)?`(breaking \u2014 needs \`${CLI_NAME} reset\`)`:""].filter(Boolean).join(" ");io.stdout.write(`${release.version}${markers?` ${markers}`:""}
9
+ `)}io.stdout.write(`
10
+ install one with: ${CLI_NAME} update <version>
11
+ `)}async function warnBreakingCrossings(target,channel,io){if(BREAKING_VERSIONS.length===0)return;let resolved=target??(await checkLatestVersion({force:!0,channel}))?.latest;if(!resolved)return;let crossed=breakingVersionsCrossed(CURRENT_VERSION,resolved);if(crossed.length===0)return;io.stderr.write([`warning: ${CURRENT_VERSION} -> ${resolved} crosses breaking version(s): ${crossed.join(", ")}.`,`After this update, Rove will refuse to start until you run \`${CLI_NAME} reset\``,"(worktrees are never touched; add --hard only to also wipe the task index).",""].join(`
12
+ `))}async function runUpdateSubcommand(args,deps){let io={spawn:deps?.spawn??spawnSync,stdout:deps?.stdout??process.stdout,stderr:deps?.stderr??process.stderr,exit:deps?.exit??((code)=>process.exit(code))},parsed=parseUpdateArgs(args);if(parsed.help){printUsage(io.stdout);return}if(parsed.list){if(deps===void 0&&process.stdout.isTTY){let{startVersionsHost}=await import("./chunk-p5spmf7e.js");await startVersionsHost();return}await printVersionList(io);return}let channel=parsed.channel??channelOf(),target=parsed.version??(channel===DEFAULT_RELEASE_CHANNEL?void 0:channel),plan=updatePlan(target),switching=parsed.channel!==void 0&&parsed.channel!==channelOf();if(io.stdout.write(`${CLI_NAME} ${CURRENT_VERSION} -> ${target??channel}
13
+ `),switching)io.stdout.write(`switching channel: ${channelOf()} -> ${channel}
14
+ `);if(io.stdout.write(`running: ${plan.display}
15
+ `),parsed.dryRun)return;await warnBreakingCrossings(parsed.version,channel,io);let result=io.spawn(plan.command,plan.args,{stdio:"inherit"});if(result.error)io.stderr.write(`${CLI_NAME} update: failed to run ${plan.command}: ${result.error.message}
16
+ `),io.exit(1);io.exit(result.status??1)}export{updatePlan,runUpdateSubcommand,parseUpdateArgs};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{Orchestrator}from"./chunk-gm3vj0fv.js";import"./chunk-003tvywc.js";import"./chunk-zb56ck5f.js";import"./chunk-5hhvrvgm.js";import"./chunk-2jxdzw4r.js";import"./chunk-1kktfmtg.js";import"./chunk-f6zsej8e.js";import"./chunk-6xppe9bj.js";import{PLACEHOLDER_TASK_TITLE}from"./chunk-aq912vvw.js";import"./chunk-hape5vwj.js";import"./chunk-sdyzxayr.js";import"./chunk-gwcneg6c.js";import"./chunk-2fypr41w.js";import"./chunk-k3ksts6g.js";import"./chunk-gjf604bb.js";import"./chunk-xy8be792.js";import"./chunk-2brn8e1y.js";import"./chunk-9c1e5z6a.js";import"./chunk-6dn6h640.js";import"./chunk-h82kzdsn.js";import"./chunk-cb2fpajx.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";export{PLACEHOLDER_TASK_TITLE,Orchestrator};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{homeDir,legacyKobeStateDir,roveStateDir}from"./chunk-6dn6h640.js";import{tmpdir}from"os";import{isAbsolute,join,relative,resolve,sep}from"path";var THROWAWAY_SEGMENTS=new Set([".dev-sandbox",".scratch"]);function isRemoteKey(key){return key.startsWith("ssh://")}function isInside(candidate,root){let rel=relative(resolve(root),resolve(candidate));return rel===""||!rel.startsWith("..")&&!isAbsolute(rel)}function roveInternalRoots(){return[roveStateDir(),legacyKobeStateDir(),join(homeDir(),".config","rove")]}function pathRejection(absPath,intent="derived"){let raw=absPath.trim();if(!raw)return"notAbsolute";if(isRemoteKey(raw))return null;if(!isAbsolute(raw))return"notAbsolute";if(raw.split(sep).some((s)=>THROWAWAY_SEGMENTS.has(s)))return"insideSandbox";for(let root of roveInternalRoots())if(isInside(raw,root))return"roveInternal";if(intent==="derived"&&(isInside(raw,tmpdir())||isInside(raw,"/tmp")||isInside(raw,"/private/tmp")))return"temporary";return null}function projectRejection(absPath,isRepo,intent="derived"){let shape=pathRejection(absPath,intent);if(shape)return shape;let raw=absPath.trim();if(isRemoteKey(raw))return null;if(isRepo&&!isRepo(raw))return"notGitRepo";return null}function rejectionReason(rejection){switch(rejection){case"notAbsolute":return"not an absolute path";case"notGitRepo":return"not a git repository";case"temporary":return"inside a temporary directory";case"roveInternal":return"inside Rove's own state directory";case"insideSandbox":return"inside a sandbox or scratch directory"}}
3
+ export{pathRejection,projectRejection,rejectionReason};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{API_VERBS,RETIRED_VERBS,VERBS,VERB_ALIASES,VERB_GROUPS,findVerb}from"./chunk-86j25g7y.js";import"./chunk-ykvk2546.js";import"./chunk-1rkb0j1j.js";import"./chunk-aq912vvw.js";import"./chunk-jyv82gf0.js";import"./chunk-vkch2spv.js";import"./chunk-qkehg2c1.js";import"./chunk-0vmrteyg.js";import"./chunk-dnb2bmtb.js";import"./chunk-7ydwn358.js";import"./chunk-p56s3ekm.js";import"./chunk-8arm7k43.js";import"./chunk-hape5vwj.js";import"./chunk-20pt9yqh.js";import"./chunk-q7dr9eh6.js";import"./chunk-jvxh93nz.js";import"./chunk-7q67dz4c.js";import"./chunk-b99tf0jr.js";import"./chunk-jdbfawrm.js";import"./chunk-q9x6d0k6.js";import"./chunk-w298ayjc.js";import"./chunk-sdyzxayr.js";import"./chunk-0sm2k04y.js";import"./chunk-5bn91n19.js";import"./chunk-pdh5w4ht.js";import"./chunk-4wwx51m5.js";import"./chunk-79gqh5p2.js";import"./chunk-3ztek08w.js";import"./chunk-kwe61yx7.js";import"./chunk-gbasmvsc.js";import"./chunk-yhcz2d2r.js";import"./chunk-df7qe9y7.js";import"./chunk-gwcneg6c.js";import"./chunk-7nhdvr5v.js";import"./chunk-2fypr41w.js";import"./chunk-k3ksts6g.js";import"./chunk-gjf604bb.js";import"./chunk-qtke4x42.js";import"./chunk-xy8be792.js";import"./chunk-2brn8e1y.js";import"./chunk-9c1e5z6a.js";import"./chunk-6dn6h640.js";import"./chunk-h82kzdsn.js";import"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-grh6dvfv.js";import"./chunk-pw6yfj10.js";import"./chunk-rxvbm4vt.js";import"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";export{findVerb,VERB_GROUPS,VERB_ALIASES,VERBS,RETIRED_VERBS,API_VERBS};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{errorMessage}from"./chunk-2brn8e1y.js";var PLACEHOLDER_TASK_TITLE="(new task)";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===`kobe/new-task-${id6}`)return!0;return/^(?:[^/]+\/)?new-task(?:-\d+)?$/.test(branch)}class IllegalTransitionError extends Error{from;to;taskId;constructor(from,to,taskId){super(`illegal transition for task ${taskId}: ${from} -> ${to}`);this.from=from;this.to=to;this.taskId=taskId;this.name="IllegalTransitionError"}}class TaskNotFoundError extends Error{constructor(taskId){super(`task not found: ${taskId}`);this.name="TaskNotFoundError"}}class CannotDeleteMainTaskError extends Error{constructor(){super("cannot delete a main task; remove the repo from saved repos instead");this.name="CannotDeleteMainTaskError"}}var DIRTY_WORKTREE_CODE="DIRTY_WORKTREE";class DirtyWorktreeError extends Error{taskId;ignored;constructor(taskId,ignored=[]){let what=ignored.length>0?`gitignored work git status cannot see: ${ignored.join(", ")}`:"uncommitted or untracked changes";super(`${DIRTY_WORKTREE_CODE}: task ${taskId} worktree has ${what}`);this.taskId=taskId;this.ignored=ignored;this.name="DirtyWorktreeError"}}class WorktreeRemoveFailedError extends Error{taskId;cause;constructor(taskId,cause){super(`failed to remove worktree for task ${taskId}: ${errorMessage(cause)}`);this.taskId=taskId;this.cause=cause;this.name="WorktreeRemoveFailedError"}}var TASK_DELETING_CODE="TASK_DELETING";class TaskDeletingError extends Error{taskId;constructor(taskId){super(`${TASK_DELETING_CODE}: task ${taskId} is being deleted`);this.taskId=taskId;this.name="TaskDeletingError"}}var MAIN_CHECKOUT_DIRTY_CODE="MAIN_CHECKOUT_DIRTY";class MainCheckoutDirtyError extends Error{repo;dir;constructor(repo,dir){super(`${MAIN_CHECKOUT_DIRTY_CODE}: base checkout at ${dir} has uncommitted changes; commit them before landing (never git stash \u2014 the stash stack is shared by every worktree of this repo)`);this.repo=repo;this.dir=dir;this.name="MainCheckoutDirtyError"}}var EMPTY_BRANCH_CODE="EMPTY_BRANCH";class EmptyBranchError extends Error{branch;landedOn;constructor(branch,landedOn){super(`${EMPTY_BRANCH_CODE}: '${branch}' has no commits ahead of '${landedOn}' \u2014 landing it would be a no-op (the worker may not have delivered anything)`);this.branch=branch;this.landedOn=landedOn;this.name="EmptyBranchError"}}var EMPTY_BRANCH_DIRTY_WORKTREE_CODE="EMPTY_BRANCH_DIRTY_WORKTREE";class EmptyBranchDirtyWorktreeError extends Error{branch;landedOn;worktreePath;files;constructor(branch,landedOn,worktreePath,files){let list=files.length>0?files.join(", "):"(none reported)";super(`${EMPTY_BRANCH_DIRTY_WORKTREE_CODE}: '${branch}' has no commits ahead of '${landedOn}' but its worktree ${worktreePath} has uncommitted changes (${list}) \u2014 commit them in the worktree first, then land again`);this.branch=branch;this.landedOn=landedOn;this.worktreePath=worktreePath;this.files=files;this.name="EmptyBranchDirtyWorktreeError"}}var MISSING_REF_CODE="MISSING_REF";class MissingRefError extends Error{branch;landedOn;dir;constructor(branch,landedOn,dir){super(`${MISSING_REF_CODE}: '${branch}' does not resolve in the base repo at ${dir} (comparing against '${landedOn}') \u2014 the branch was renamed or deleted outside Rove; re-point the task with \`rove api set-branch\` or recreate the branch`);this.branch=branch;this.landedOn=landedOn;this.dir=dir;this.name="MissingRefError"}}var LAND_CONFLICT_CODE="LAND_CONFLICT";class LandConflictError extends Error{taskId;branch;files;constructor(taskId,branch,files){let list=files.length>0?files.join(", "):"(none reported)";super(`${LAND_CONFLICT_CODE}: merging '${branch}' hit conflicts, merge aborted \u2014 conflicted files: ${list}`);this.taskId=taskId;this.branch=branch;this.files=files;this.name="LandConflictError"}}var GIT_COMMAND_FAILED_CODE="GIT_COMMAND_FAILED";class GitCommandFailedError extends Error{command;stderr;constructor(command,stderr,hint){let detail=stderr.trim()||"(git printed nothing on stderr)";super(`${GIT_COMMAND_FAILED_CODE}: \`git ${command}\` failed \u2014 ${detail}${hint?`; ${hint}`:""}`);this.command=command;this.stderr=stderr;this.name="GitCommandFailedError"}}
3
+ export{PLACEHOLDER_TASK_TITLE,deriveTitleFromPrompt,isPlaceholderDerivedBranch,IllegalTransitionError,TaskNotFoundError,CannotDeleteMainTaskError,DIRTY_WORKTREE_CODE,DirtyWorktreeError,WorktreeRemoveFailedError,TASK_DELETING_CODE,TaskDeletingError,MainCheckoutDirtyError,EmptyBranchError,EMPTY_BRANCH_DIRTY_WORKTREE_CODE,EmptyBranchDirtyWorktreeError,MissingRefError,LandConflictError,GitCommandFailedError};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{KobeDaemonClient,RpcTimeoutError}from"./chunk-79gqh5p2.js";import"./chunk-3ztek08w.js";import"./chunk-kwe61yx7.js";import"./chunk-grh6dvfv.js";import"./chunk-pw6yfj10.js";import"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";export{RpcTimeoutError,KobeDaemonClient};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{getGlobalDefaultVendor,getRepoLastActiveVendor,resolvePreferredVendor,setGlobalDefaultVendor,setRepoLastActiveVendor}from"./chunk-f6zsej8e.js";import"./chunk-k3ksts6g.js";import"./chunk-gjf604bb.js";import"./chunk-xy8be792.js";import"./chunk-9c1e5z6a.js";import"./chunk-6dn6h640.js";import"./chunk-h82kzdsn.js";import"./chunk-cb2fpajx.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";export{setRepoLastActiveVendor,setGlobalDefaultVendor,resolvePreferredVendor,getRepoLastActiveVendor,getGlobalDefaultVendor};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{openDaemonSession,resolveActiveTaskId,withDaemonSession}from"./chunk-1rkb0j1j.js";import"./chunk-5bn91n19.js";import"./chunk-pdh5w4ht.js";import"./chunk-4wwx51m5.js";import"./chunk-79gqh5p2.js";import"./chunk-3ztek08w.js";import"./chunk-kwe61yx7.js";import"./chunk-grh6dvfv.js";import"./chunk-pw6yfj10.js";import"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";export{withDaemonSession,resolveActiveTaskId,openDaemonSession};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{existsSync}from"fs";function windowsBashCandidates(env){return[env.ProgramFiles,env["ProgramFiles(x86)"],env.LOCALAPPDATA&&`${env.LOCALAPPDATA}\\Programs`].filter(Boolean).map((root)=>`${root}\\Git\\bin\\bash.exe`)}var WINDOWS_BASH_FALLBACK="C:\\Program Files\\Git\\bin\\bash.exe";function isWindowsSpawnable(shellPath){return/^[A-Za-z]:[\\/]/.test(shellPath)||shellPath.startsWith("\\\\")}var cache=new Map;function resolveLoginShell(options={}){let fallback=options.fallback??"/bin/bash",platform=options.platform??process.platform,env=options.env??process.env,exists=options.exists??existsSync,cacheable=platform===process.platform&&env===process.env&&options.exists===void 0;if(cacheable){let hit=cache.get(fallback);if(hit)return hit}let resolved=resolveUncached(fallback,platform,env,exists);if(cacheable)cache.set(fallback,resolved);return resolved}function resolveUncached(fallback,platform,env,exists){let explicit=env.SHELL?.trim();if(platform!=="win32")return explicit||fallback;if(explicit&&isWindowsSpawnable(explicit)&&exists(explicit))return explicit;for(let candidate of windowsBashCandidates(env))if(exists(candidate))return candidate;return WINDOWS_BASH_FALLBACK}function toPosixPath(filePath,platform=process.platform){if(platform!=="win32")return filePath;let slashed=filePath.replace(/\\/g,"/"),drive=/^([A-Za-z]):\//.exec(slashed);return drive?`/${drive[1].toLowerCase()}${slashed.slice(2)}`:slashed}
3
+ export{resolveLoginShell,toPosixPath};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{TaskDeletingError,deriveTitleFromPrompt}from"./chunk-aq912vvw.js";import{ComposerBusyError,awaitEngineProcess,buildEngineSessionLaunch,deliverToHostedKey,ensureHostedEngine,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,killHostedSessions,listHostedSessions,openHostedSessionHost,pastePromptWhenEngineUp,sessionHasEngine,trustEngineWorktree}from"./chunk-8arm7k43.js";import{engineLaunchArgv,protocolEntry}from"./chunk-q7dr9eh6.js";import{resolveLoginShell}from"./chunk-b99tf0jr.js";import{engineEntry}from"./chunk-yhcz2d2r.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";var MAX_SESSIONS_SCANNED=8;function titleFromMessages(messages){let firstUser=messages.find((m)=>m.role==="user");if(!firstUser)return"";let text=firstUser.blocks.filter((b)=>b.type==="text").map((b)=>b.text).join(" "),title=deriveTitleFromPrompt(text);return title.length>0?Buffer.from(title,"utf8").toString("utf8"):title}async function deriveTitleFromSession(worktree,vendor=DEFAULT_TASK_VENDOR){if(!worktree)return"";let{history}=protocolEntry(vendor),ids=await history.listSessionIdsForWorktree(worktree);for(let sessionId of ids.slice(0,MAX_SESSIONS_SCANNED)){let title=titleFromMessages(await history.readHistory(sessionId));if(title)return title}return""}async function deriveTitleFromSessionId(vendor,sessionId){if(!sessionId)return"";try{return titleFromMessages(await protocolEntry(vendor).history.readHistory(sessionId))}catch{return""}}async function getTask(link,taskId){let{task}=await link.request("task.get",{taskId});return task}async function ensureTaskWorktree(link,taskId){let task=await getTask(link,taskId);if(task.deletion)throw new TaskDeletingError(taskId);if(task.worktreePath)return{task,worktreePath:task.worktreePath};let{worktreePath}=await link.request("task.ensureWorktree",{taskId});if(!worktreePath)throw Error(`task ${taskId} has no worktree`);return{task,worktreePath}}async function ensureTaskSessionAdapter(link,taskId){let{task,worktreePath}=await ensureTaskWorktree(link,taskId),launch=taskEngineLaunch(task,worktreePath,{kind:"repo-init"}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)throw Error(`failed to start hosted engine session for ${taskId}`);if(launch.firstMessage){let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort})[0];await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs}).catch(()=>!1)}}finally{host.close()}return{session:launch.key,worktreePath}}async function startTaskSessionWithPromptAdapter(link,taskId,prompt){let{task,worktreePath}=await ensureTaskWorktree(link,taskId);await link.request("task.observeLanguage",{taskId,text:prompt}).catch(()=>{});let launch=taskEngineLaunch(task,worktreePath,{kind:"new-task",prompt}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)return{started:!1,error:"hosted session did not open"};let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort})[0],wait={initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs};if(launch.firstMessage){if(await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}if(await awaitEngineProcess(host.rpc,launch.key,engineBin,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}finally{host.close()}}async function startFailureReason(rpc,key){let tail=await hostedSessionFailureLine(rpc,key),base="engine process never started";return tail?`engine process never started; last session output: ${tail}`:"engine process never started"}function taskEngineLaunch(task,worktreePath,promptIntent){return trustEngineWorktree(task.vendor,worktreePath),buildEngineSessionLaunch({task:{id:task.id,kind:task.kind,vendor:task.vendor,repo:task.repo},worktreePath,shell:resolveLoginShell({fallback:"/bin/zsh"}),argv:engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort}),promptIntent})}async function deliverPromptToLiveEngineAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return!1;try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return!1;if(!await sessionHasEngine(sessions.find((s)=>s.key===key)?.pid,engineArgv))return!1;let manifest=task.vendor?engineEntry(task.vendor).screenManifest:void 0;return await deliverToHostedKey(host.rpc,key,prompt,{screenManifest:manifest})!==null}catch(err){if(err instanceof ComposerBusyError)throw err;return!1}finally{host.close()}}function tabIdFromHostedKey(key){return key.split("::")[1]??"tab-1"}async function deliverPromptToLiveEngineDetailedAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return{outcome:"no-session"};if(!await sessionHasEngine(sessions.find((s)=>s.key===key)?.pid,engineArgv))return{outcome:"no-engine",tabId:tabIdFromHostedKey(key)};let manifest=task.vendor?engineEntry(task.vendor).screenManifest:void 0;try{return await deliverToHostedKey(host.rpc,key,prompt,{screenManifest:manifest})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:tabIdFromHostedKey(key)}}catch(err){if(err instanceof ComposerBusyError)return{outcome:"busy",tabId:tabIdFromHostedKey(key),layer:err.layer};throw err}}catch{return{outcome:"no-session"}}finally{host.close()}}async function deliverPromptToLiveEngineTabDetailedAdapter(target,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let key=`${target.id}::${target.tabId}`,sessions;try{sessions=await listHostedSessions(host.rpc)}catch{return{outcome:"no-session"}}let session=sessions.find((candidate)=>candidate.alive&&candidate.key===key);if(!session)return{outcome:"no-session"};let engineArgv=engineLaunchArgv({command:target.command,vendor:target.vendor});if(!await sessionHasEngine(session.pid,engineArgv))return{outcome:"no-engine",tabId:target.tabId};let manifest=target.vendor?engineEntry(target.vendor).screenManifest:void 0;try{return await deliverToHostedKey(host.rpc,key,prompt,{screenManifest:manifest})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:target.tabId}}catch(err){if(err instanceof ComposerBusyError)return{outcome:"busy",tabId:target.tabId,layer:err.layer};throw err}}finally{host.close()}}async function tearDownTaskSessionAdapter(taskId){let host=await openHostedSessionHost();if(!host)return;try{await killHostedSessions(host.rpc,hostedTaskKeys(await listHostedSessions(host.rpc),taskId))}catch{}finally{host.close()}}
3
+ export{deriveTitleFromSession,deriveTitleFromSessionId,ensureTaskSessionAdapter,startTaskSessionWithPromptAdapter,deliverPromptToLiveEngineAdapter,deliverPromptToLiveEngineDetailedAdapter,deliverPromptToLiveEngineTabDetailedAdapter,tearDownTaskSessionAdapter};
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{defaultDaemonLogPath,defaultPtyHostLogPath}from"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";import{mkdirSync,readFileSync,writeFileSync}from"fs";import{dirname,join}from"path";var REPORT_ENV_SUFFIXES=["HOME_DIR","DAEMON_SOCKET_PATH","SOCKET_PATH","PTY_SOCKET_PATH","DAEMON_WEB_PORT","PTY_PORT","WEB_HOST","BIN_PATH","DEV","DEBUG","TERMINAL_BACKEND","TASK_ID","TAB_ID"],REPORT_ENV_KEYS=["SHELL","TERM","TERM_PROGRAM","TERM_PROGRAM_VERSION","COLORTERM","VISUAL","EDITOR",...REPORT_ENV_SUFFIXES.flatMap((suffix)=>[`ROVE_${suffix}`,`KOBE_${suffix}`]),"ROVE_INVOKED_AS"],LOG_TAIL_LINES=200;function logTail(path,count){try{return readFileSync(path,"utf8").split(`
3
+ `).filter((line)=>line.trim().length>0).slice(-count).join(`
4
+ `)}catch{return""}}function reportEnvLines(env){let shown=new Set(REPORT_ENV_KEYS),keys=new Set(shown);for(let key of Object.keys(env))if(key.startsWith("ROVE_")||key.startsWith("KOBE_"))keys.add(key);return[...keys].sort().map((key)=>{let value=env[key];if(value===void 0)return`${key}=(unset)`;return shown.has(key)?`${key}=${value}`:`${key}=(set)`})}function buildReportBundle(doctorLines,parts){return["# Rove doctor report",`generated: ${parts.generatedAt}`,"","## diagnosis",...doctorLines,"","## environment",...reportEnvLines(parts.env),"",`## daemon.log (last ${LOG_TAIL_LINES} lines)`,parts.daemonLog||"(empty or absent)","",`## pty.log (last ${LOG_TAIL_LINES} lines)`,parts.ptyLog||"(empty or absent)",""].join(`
5
+ `)}function writeReportBundle(doctorLines){let dir=dirname(defaultDaemonLogPath());mkdirSync(dir,{recursive:!0});let path=join(dir,"rove-doctor-report.txt");return writeFileSync(path,buildReportBundle(doctorLines,{generatedAt:new Date().toISOString(),env:process.env,daemonLog:logTail(defaultDaemonLogPath(),LOG_TAIL_LINES),ptyLog:logTail(defaultPtyHostLogPath(),LOG_TAIL_LINES)})),path}export{writeReportBundle,reportEnvLines,buildReportBundle};
@@ -0,0 +1,8 @@
1
+ // @bun
2
+ import{checkOnboardingEnv,noEngineAction}from"./chunk-0r8333z3.js";import{LAST_RUN_VERSION_KEY}from"./chunk-hgq2gtxx.js";import{isNpxMissing,markSkillHintSeen,npxSkillsArgv,npxSkillsCommand}from"./chunk-g1ybdgad.js";import{t}from"./chunk-q9x6d0k6.js";import{getPersistedBool,loadStateFile,setPersistedBool}from"./chunk-gjf604bb.js";import{activeCliName}from"./chunk-ef11h2am.js";import{__require}from"./chunk-wqfp8d9w.js";import{spawnSync}from"child_process";import{appendFileSync,existsSync,mkdirSync,readFileSync,writeFileSync}from"fs";import{homedir}from"os";import{basename,join}from"path";var ONBOARDED_KEY="onboarded",PRIMER_KEY="onboardedPrimer";function detectShell(env=process.env){let shell=basename(env.SHELL??"");return shell==="zsh"||shell==="bash"||shell==="fish"?shell:null}function installCompletions(shell,home=homedir(),cli=activeCliName()){let rcMarker=`${cli} completions`;if(shell==="fish"){let dir=join(home,".config","fish","completions"),path=join(dir,`${cli}.fish`);return mkdirSync(dir,{recursive:!0}),writeFileSync(path,`${cli} completions fish | source
3
+ `),path}let rc=join(home,shell==="zsh"?".zshrc":".bashrc");if(!(existsSync(rc)?readFileSync(rc,"utf8"):"").includes(rcMarker)){let line=`
4
+ # ${cli} completions
5
+ command -v ${cli} >/dev/null && source <(${cli} completions ${shell})
6
+ `;appendFileSync(rc,line)}return rc}function isOnboarded(){return getPersistedBool(ONBOARDED_KEY,!1)}function markOnboarded(){setPersistedBool(ONBOARDED_KEY,!0)}function isPrimerDone(){return getPersistedBool(PRIMER_KEY,!1)}function markPrimerDone(){setPersistedBool(PRIMER_KEY,!0)}function backfillPrimerForExistingUsers(){if(typeof loadStateFile()[LAST_RUN_VERSION_KEY]!=="string")return!1;return markPrimerDone(),!0}function envReadyForTasks(env){return env.engines.anyUsable&&env.git.found}function applyOnboardingChoices(choices,shell,env){let cli=activeCliName(),completionsHelp=`${cli} completions --help`,skillInstall=`${cli} skill install`,out=(line)=>process.stdout.write(`${line}
7
+ `);if(shell!==null)if(choices.completions)out(t("onboarding.appliedCompletions",{path:installCompletions(shell)}));else out(t("onboarding.skippedCompletions",{command:completionsHelp}));if(choices.skill){if(isNpxMissing())out(t("onboarding.skillNeedsNode",{command:skillInstall}));else if(out(t("onboarding.installingSkill",{command:npxSkillsCommand()})),spawnSync("npx",npxSkillsArgv(),{stdio:"inherit"}).status!==0)out(t("onboarding.skillFailed",{command:skillInstall}))}else out(t("onboarding.skippedSkill",{command:skillInstall})),markSkillHintSeen();out(""),out(env.git.line);for(let line of env.engines.lines)out(line);if(out(""),envReadyForTasks(env))out(t("onboarding.ready")),out(t("onboarding.readyHint",{command:cli}));else{if(out(t("onboarding.notReadyHeader")),!env.engines.anyUsable)out(` \u2192 ${noEngineAction(env.engines.signedOut)}`);if(!env.git.found)out(` \u2192 ${t("doctor.fix.gitAction")}`)}}async function maybeRunOnboarding(){if(!process.stdout.isTTY||!process.stdin.isTTY)return!1;let seen=isOnboarded();if(seen&&(isPrimerDone()||backfillPrimerForExistingUsers()))return!1;markOnboarded();let shell=detectShell(),env=await checkOnboardingEnv(),{runOnboardingWizard}=await import("./chunk-cehhk94g.js"),choices=await runOnboardingWizard(shell,env,seen?"primer":"full");return markPrimerDone(),applyOnboardingChoices(choices,shell,env),!0}
8
+ export{detectShell,installCompletions,envReadyForTasks,applyOnboardingChoices,maybeRunOnboarding};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{LEGACY_KOBE_CONFIG_DIR_BASENAME,LEGACY_KOBE_PRODUCT_NAME,LEGACY_KOBE_STATE_DIR_BASENAME,ROVE_CONFIG_DIR_BASENAME,ROVE_PRODUCT_NAME,ROVE_STATE_DIR_BASENAME}from"./chunk-3bfm4hrs.js";var LEGACY_KOBE_CONFIG_DIR_BASENAME2=LEGACY_KOBE_CONFIG_DIR_BASENAME,LEGACY_KOBE_PRODUCT_NAME2=LEGACY_KOBE_PRODUCT_NAME,LEGACY_KOBE_STATE_DIR_BASENAME2=LEGACY_KOBE_STATE_DIR_BASENAME,ROVE_CONFIG_DIR_BASENAME2=ROVE_CONFIG_DIR_BASENAME,ROVE_PRODUCT_NAME2=ROVE_PRODUCT_NAME,ROVE_STATE_DIR_BASENAME2=ROVE_STATE_DIR_BASENAME;
3
+ export{LEGACY_KOBE_CONFIG_DIR_BASENAME2 as LEGACY_KOBE_CONFIG_DIR_BASENAME,LEGACY_KOBE_PRODUCT_NAME2 as LEGACY_KOBE_PRODUCT_NAME,LEGACY_KOBE_STATE_DIR_BASENAME2 as LEGACY_KOBE_STATE_DIR_BASENAME,ROVE_CONFIG_DIR_BASENAME2 as ROVE_CONFIG_DIR_BASENAME,ROVE_PRODUCT_NAME2 as ROVE_PRODUCT_NAME,ROVE_STATE_DIR_BASENAME2 as ROVE_STATE_DIR_BASENAME};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{envReadyForTasks}from"./chunk-cb0pgyq1.js";import{wizardKeyLines}from"./chunk-ryhrw647.js";import"./chunk-0r8333z3.js";import"./chunk-np07kccr.js";import"./chunk-hgq2gtxx.js";import"./chunk-g1ybdgad.js";import{$Fragment,$jsx,$jsxs,bootPaneHost,currentPrefixConfiguration,pageCloseBindings,require_react_production,useBindings,useRenderer,useT,useTheme}from"./chunk-fe34e0w7.js";import"./chunk-764bsyb0.js";import"./chunk-mjvq39gf.js";import"./chunk-6xppe9bj.js";import"./chunk-dnb2bmtb.js";import"./chunk-q7dr9eh6.js";import"./chunk-jvxh93nz.js";import"./chunk-jdbfawrm.js";import"./chunk-q9x6d0k6.js";import"./chunk-w298ayjc.js";import"./chunk-sdyzxayr.js";import"./chunk-0sm2k04y.js";import"./chunk-5bn91n19.js";import"./chunk-pdh5w4ht.js";import"./chunk-4wwx51m5.js";import"./chunk-79gqh5p2.js";import"./chunk-3ztek08w.js";import"./chunk-kwe61yx7.js";import"./chunk-gbasmvsc.js";import"./chunk-yhcz2d2r.js";import"./chunk-df7qe9y7.js";import"./chunk-gwcneg6c.js";import"./chunk-7nhdvr5v.js";import"./chunk-2fypr41w.js";import"./chunk-k3ksts6g.js";import"./chunk-gjf604bb.js";import"./chunk-qtke4x42.js";import"./chunk-xy8be792.js";import"./chunk-2brn8e1y.js";import"./chunk-9c1e5z6a.js";import"./chunk-6dn6h640.js";import"./chunk-h82kzdsn.js";import"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-grh6dvfv.js";import"./chunk-pw6yfj10.js";import"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import{__toESM}from"./chunk-wqfp8d9w.js";import{TextAttributes}from"@opentui/core";var import_react2=__toESM(require_react_production(),1);function inlineRowsFor(env){return 15+env.engines.lines.length+envActionKeys(env).length}function envActionKeys(env){let keys=[];if(!env.engines.anyUsable)keys.push("doctor.fix.noEngineAction");if(!env.git.found)keys.push("doctor.fix.gitAction");return keys}function WizardPage(props){let{theme}=useTheme(),t=useT(),renderer=useRenderer(),steps=(props.mode??"full")==="primer"?[]:props.shell===null?["skill"]:["completions","skill"],[stepIndex,setStepIndex]=import_react2.useState(0),[yes,setYes]=import_react2.useState(!0),[answers,setAnswers]=import_react2.useState({}),[page,setPage]=import_react2.useState(steps.length===0?"env":"questions"),step=steps[stepIndex];function finish(finalAnswers){renderer?.destroy(),props.onDone({completions:finalAnswers.completions??!1,skill:finalAnswers.skill??!1})}function confirm(choice=yes){if(page==="env"){setPage("keys");return}if(page==="keys"){finish(answers);return}let next={...answers,[step]:choice};if(setAnswers(next),stepIndex+1>=steps.length){setPage("env");return}setStepIndex(stepIndex+1),setYes(!0)}useBindings(()=>({bindings:[{key:"up",cmd:()=>setYes(!0)},{key:"k",cmd:()=>setYes(!0)},{key:"down",cmd:()=>setYes(!1)},{key:"j",cmd:()=>setYes(!1)},{key:"return",cmd:()=>confirm()},...pageCloseBindings(()=>finish(answers))]}));function questionFor(s){return s==="completions"?t("onboarding.completionsQuestion",{shell:props.shell??""}):t("onboarding.skillQuestion")}let explain=step==="completions"?t("onboarding.completionsExplain"):t("onboarding.skillExplain"),ready=envReadyForTasks(props.env);return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[$jsx("text",{fg:theme.primary,attributes:TextAttributes.BOLD,wrapMode:"none",children:t("onboarding.title")}),$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t("onboarding.subtitle")}),$jsxs("box",{flexDirection:"column",paddingTop:1,children:[steps.slice(0,page==="questions"?stepIndex:steps.length).map((answered)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.success,wrapMode:"none",children:"\u2713"}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:questionFor(answered)}),$jsx("text",{fg:theme.text,wrapMode:"none",children:answers[answered]?t("onboarding.optionYes"):t("onboarding.optionNo")})]},answered)),page==="env"?$jsxs("box",{flexDirection:"column",onMouseUp:()=>confirm(),children:[$jsx("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"word",children:t("onboarding.envTitle")}),$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t("onboarding.envExplain")}),$jsxs("box",{flexDirection:"column",paddingTop:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:props.env.git.line}),props.env.engines.lines.map((line)=>$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:line},line))]}),$jsxs("box",{paddingTop:1,flexDirection:"column",children:[$jsx("text",{fg:ready?theme.success:theme.error,wrapMode:"word",children:ready?t("onboarding.envReady"):t("onboarding.envNotReady")}),envActionKeys(props.env).map((key)=>$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:`\u2192 ${t(key)}`},key))]})]}):null,page==="keys"?$jsxs("box",{flexDirection:"column",onMouseUp:()=>confirm(),children:[$jsx("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"word",children:t("onboarding.keysTitle")}),wizardKeyLines(currentPrefixConfiguration().key).map((line)=>$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t(`onboarding.${line.msg}`,line.params)},line.msg))]}):null,page==="questions"?$jsxs($Fragment,{children:[$jsx("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"word",children:questionFor(step)}),$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:explain}),[!0,!1].map((option)=>{let active=yes===option;return $jsxs("box",{flexDirection:"row",gap:1,paddingLeft:1,onMouseUp:()=>confirm(option),children:[$jsx("text",{fg:active?theme.primary:theme.textMuted,wrapMode:"none",children:active?"\u276F":" "}),$jsx("text",{fg:active?theme.primary:theme.textMuted,attributes:active?TextAttributes.BOLD:void 0,wrapMode:"none",children:option?t("onboarding.optionYes"):t("onboarding.optionNo")})]},String(option))})]}):null]}),$jsx("box",{paddingTop:1,children:$jsx("text",{fg:theme.textMuted,attributes:TextAttributes.DIM,wrapMode:"none",children:t(page==="keys"?"onboarding.keysLegend":page==="env"?"onboarding.envLegend":"onboarding.legend")})})]})}async function runOnboardingWizard(shell,env,mode){return await new Promise((resolve)=>{bootPaneHost({inlineRows:inlineRowsFor(env),setup:()=>({root:()=>$jsx(WizardPage,{shell,env,mode,onDone:resolve})})})})}export{runOnboardingWizard,WizardPage};
@@ -0,0 +1,9 @@
1
+ // @bun
2
+ import{stampResetGate}from"./chunk-hgq2gtxx.js";import{stopLegacyTmux}from"./chunk-dqndd97s.js";import"./chunk-dnb2bmtb.js";import{stopDaemonProcess}from"./chunk-pdh5w4ht.js";import"./chunk-4wwx51m5.js";import"./chunk-79gqh5p2.js";import"./chunk-3ztek08w.js";import"./chunk-kwe61yx7.js";import"./chunk-gjf604bb.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{kvStatePath,legacyKobeKvStatePath,legacyKobeStateDir,roveStateDir}from"./chunk-6dn6h640.js";import{activeCliName}from"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-grh6dvfv.js";import"./chunk-pw6yfj10.js";import{defaultDaemonPidPath,defaultDaemonSocketPath,defaultPtyHostPidPath,defaultPtyHostSocketPath}from"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";import{readFileSync}from"fs";import{unlink}from"fs/promises";import{join}from"path";import{createInterface}from"readline";var CLI_NAME=activeCliName();function printUsage(out){out.write([`Usage: ${CLI_NAME} reset [--hard] [--yes]`,"","Recover a wedged install: stop the daemon, Hosted PTY host, and any pre-v0.8 tmux sessions.","This ends background terminal and engine sessions; the next launch starts fresh.","Never touches your git worktrees.","","Options:"," --hard Also wipe the task index + UI state"," -y, --yes Skip the interactive confirmation"," -h, --help Print this help",""].join(`
3
+ `))}function taskCount(path){try{let parsed=JSON.parse(readFileSync(path,"utf8"));return Array.isArray(parsed.tasks)?parsed.tasks.length:null}catch{return null}}async function confirmTty(prompt){let readline=createInterface({input:process.stdin,output:process.stdout});try{let answer=await new Promise((resolve)=>readline.question(prompt,resolve));return/^y(es)?$/i.test(answer.trim())}finally{readline.close()}}async function removeStateFile(path,label){try{await unlink(path),console.log(` removed ${label} (${path})`)}catch(err){if(err.code==="ENOENT")console.log(` ${label}: already absent`);else throw Error(`failed to remove ${label} (${path}): ${errorMessage(err)}`)}}async function runResetSubcommand(argv){if(argv.some((arg)=>arg==="--help"||arg==="-h"||arg==="help")){printUsage(process.stdout);return}let known=new Set(["--hard","--yes","-y"]),unknown=argv.find((arg)=>!known.has(arg));if(unknown!==void 0)process.stderr.write(`${CLI_NAME} reset: unknown argument "${unknown}"
4
+
5
+ `),printUsage(process.stderr),process.exit(2);let hard=argv.includes("--hard"),yes=argv.includes("--yes")||argv.includes("-y"),daemonSocket=defaultDaemonSocketPath(),tasksPath=join(roveStateDir(),"tasks.json"),legacyTasksPath=join(legacyKobeStateDir(),"tasks.json"),statePath=kvStatePath(),legacyStatePath=legacyKobeKvStatePath();if(console.log(`${CLI_NAME} reset will:`),console.log(" \u2022 stop the Rove daemon (graceful \u2192 SIGTERM \u2192 SIGKILL)"),console.log(` \u2022 remove its socket + pidfile (${daemonSocket})`),console.log(" \u2022 stop the standalone Hosted PTY host and all background terminal/engine sessions"),console.log(" \u2022 stop any pre-v0.8 tmux sessions after SIGTERM-ing their pane process groups"),hard){let count=taskCount(tasksPath)??taskCount(legacyTasksPath);console.log(` \u2022 DELETE the task index${count===null?"":` (${count} task(s))`} \u2014 ${tasksPath}`),console.log(` \u2022 DELETE the UI state \u2014 ${statePath}`),console.log(" \u2022 DELETE the pre-Rove task/UI indexes too, so migration cannot restore reset state")}if(console.log(" \u2022 NOT touch your git worktrees under ~/.rove/worktrees/, ~/.kobe/worktrees/, or repo-local roots"),!hard)console.log(" (your task list & worktrees are kept \u2014 add --hard to also wipe task and UI state)");if(!yes){if(!process.stdin.isTTY){console.log(`
6
+ re-run with --yes to proceed (no interactive terminal for a y/N prompt)`);return}if(!await confirmTty(hard?`
7
+ Stop runtimes and wipe task/UI state? [y/N] `:`
8
+ Stop runtimes? [y/N] `)){console.log("aborted \u2014 nothing changed");return}}console.log("");let daemon=await stopDaemonProcess(daemonSocket,defaultDaemonPidPath());console.log(daemon.method==="absent"?" daemon: was not running (cleared any stale socket/pidfile)":` daemon: stopped via ${daemon.method}${daemon.pid?` (pid ${daemon.pid})`:""}`);let ptyHost=await stopDaemonProcess(defaultPtyHostSocketPath(),defaultPtyHostPidPath());console.log(ptyHost.method==="absent"?" pty host: was not running (cleared any stale socket/pidfile)":` pty host: stopped via ${ptyHost.method}${ptyHost.pid?` (pid ${ptyHost.pid})`:""}`);let legacyTmux=await stopLegacyTmux();if(legacyTmux.status==="failed"){console.error(` legacy tmux: cleanup failed \u2014 ${legacyTmux.error??"unknown error"}`),process.exitCode=1;return}if(console.log(legacyTmux.status==="absent"?" legacy tmux: no pre-v0.8 sessions found":` legacy tmux: stopped ${legacyTmux.sessions} session(s) after signalling ${legacyTmux.signalledGroups} pane group(s)`),hard)await removeStateFile(tasksPath,"task index"),await removeStateFile(legacyTasksPath,"legacy task index"),await removeStateFile(statePath,"UI state"),await removeStateFile(legacyStatePath,"legacy UI state");else stampResetGate();console.log(`
9
+ ${CLI_NAME}: reset complete. Relaunch Rove to start fresh.`)}export{runResetSubcommand};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{writeOutdatedCache}from"./chunk-nm6adny4.js";import{PluginCliError,installPlugin}from"./chunk-rgcv1wcs.js";import{loadPluginRegistry,pluginCheckoutDir,pluginConfigDir,pluginDataDir,pluginStateDir,removePluginEntry,savePluginRegistry}from"./chunk-jyv82gf0.js";import"./chunk-dnb2bmtb.js";import"./chunk-kwe61yx7.js";import"./chunk-6dn6h640.js";import{activeCliName}from"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";import{execFileSync}from"child_process";import{existsSync,mkdirSync,readdirSync,renameSync}from"fs";import{join}from"path";function gitOut(args,cwd){try{return execFileSync("git",args,{cwd,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function checkEntry(entry){let repoSpec=entry.source.spec.split("/").slice(0,2).join("/"),localSha=gitOut(["rev-parse","HEAD"],pluginCheckoutDir(entry.id)),remote=gitOut(["ls-remote",`https://github.com/${repoSpec}.git`,"HEAD"]),remoteSha=remote?remote.split(/\s+/)[0]??null:null;return{id:entry.id,spec:entry.source.spec,version:entry.version,localSha,remoteSha,behind:Boolean(localSha&&remoteSha&&localSha!==remoteSha)}}function listOutdated(){let rows=loadPluginRegistry().plugins.filter((p)=>p.source.kind==="github").map(checkEntry);return writeOutdatedCache(rows.filter((r)=>r.behind).map((r)=>r.id)),rows}function printOutdated(){let rows=listOutdated();if(rows.length===0){console.log("no GitHub-installed plugins.");return}for(let r of rows){let status=r.behind?"update available":r.remoteSha===null?"remote unreachable":r.localSha===null?"local sha unreadable":"up to date";console.log(`${r.id} v${r.version} ${status}`)}}function migrateRenamedPlugin(oldId,newId){for(let dirOf of[pluginConfigDir,pluginStateDir]){let from=dirOf(oldId),to=dirOf(newId);if(!existsSync(from))continue;mkdirSync(to,{recursive:!0});for(let entry of readdirSync(from)){if(existsSync(join(to,entry)))continue;renameSync(join(from,entry),join(to,entry))}}savePluginRegistry(removePluginEntry(loadPluginRegistry(),oldId)),console.log(`renamed ${oldId} \u2192 ${newId}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${pluginDataDir(oldId)}`)}async function updatePlugins(ids,opts){let rows=listOutdated(),targets;if(opts.all){if(targets=rows.filter((r)=>r.behind),targets.length===0){console.log("all plugins up to date.");return}}else{if(ids.length===0)throw new PluginCliError("update takes plugin ids or --all");targets=ids.map((id)=>{let row=rows.find((r)=>r.id===id);if(!row)throw new PluginCliError(`\`${id}\` is not a GitHub-installed plugin; see \`${activeCliName()} plugin list\``);return row})}for(let target of targets){if(!target.behind&&!ids.includes(target.id))continue;console.log(`updating ${target.id} (${target.spec})\u2026`);let installedId=await installPlugin(target.spec,{yes:opts.yes});if(installedId!==target.id)migrateRenamedPlugin(target.id,installedId)}listOutdated()}export{updatePlugins,printOutdated};
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{getCustomEngineIds,getDisabledEngineIds}from"./chunk-k3ksts6g.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{__require}from"./chunk-wqfp8d9w.js";var pluginEngines=new Map;function registerPluginEngine(id,spec){if(Object.hasOwn(CONTRIB_ENGINES,id))return!1;return pluginEngines.set(id,spec),!0}function clearPluginEngines(){pluginEngines.clear()}function pluginEngineIds(){return[...pluginEngines.keys()]}var GEMINI={rules:[{state:"blocked",any:["\u2502 apply this change","\u2502 allow execution","waiting for user confirmation"]},{state:"blocked",all:["do you want to proceed"],any:["yes"]},{state:"working",any:["esc to cancel"]}]},OPENCODE={rules:[{state:"blocked",any:["\u25B3 permission required"]},{state:"blocked",all:["esc dismiss"],any:["enter confirm","enter submit","enter toggle"]},{state:"working",any:["esc interrupt","esc to interrupt","ctrl+c to interrupt","esc again to interrupt"]},{state:"idle",any:["enter send"]}]},CURSOR={rules:[{state:"blocked",any:["press any key to log in"]},{state:"blocked",all:["proceed (y)"]},{state:"blocked",any:["run this command?","waiting for approval","skip (esc or n)","(y) (enter)"]},{state:"working",any:["esc to cancel","ctrl+c to stop"]}]},GROK={rules:[{state:"blocked",any:["\u26A0 action required","ctrl+o:yolo"]},{state:"blocked",all:["\u2503"],lineRegex:["^\\s*\u2503\\s+\\S+\\s+\\(\u25CB\\)"]},{state:"working",any:["[stop]"],lineRegex:["^\\s*[\\u2800-\\u28FF]"]}]},DROID={rules:[{state:"blocked",all:["enter to select","esc to cancel"],any:["> yes, allow","> no, cancel"]},{state:"blocked",all:["enter select","esc cancel"]},{state:"working",any:["esc to stop"]}]},AMP={rules:[{state:"blocked",any:["waiting for approval","run this command?","allow editing file:","allow creating file:","confirm tool call"]},{state:"working",lineRegex:["^\\s*\u2570\\s+\\S+\\s+(thinking|streaming|running tools|waiting)\\s+\u2500"]}]},CONTRIB_ENGINES={gemini:{displayName:"Gemini CLI",defaultCommand:["gemini"],screenManifest:GEMINI},opencode:{displayName:"OpenCode",defaultCommand:["opencode"],screenManifest:OPENCODE,firstMessageDelivery:"paste"},cursor:{displayName:"Cursor Agent",defaultCommand:["cursor-agent"],screenManifest:CURSOR},grok:{displayName:"Grok CLI",defaultCommand:["grok"],screenManifest:GROK},droid:{displayName:"Droid",defaultCommand:["droid"],screenManifest:DROID},amp:{displayName:"Amp",defaultCommand:["amp"],screenManifest:AMP}};function isContribEngine(id){return Object.hasOwn(CONTRIB_ENGINES,id)||pluginEngines.has(id)}var CONTRIB_ENGINE_IDS=Object.keys(CONTRIB_ENGINES);function contribEngineEntry(id,base){let spec=CONTRIB_ENGINES[id]??pluginEngines.get(id);if(!spec)return base;return{...base,displayName:spec.displayName,defaultCommand:spec.defaultCommand,...spec.processNames?{processNames:spec.processNames}:{},screenManifest:spec.screenManifest,...spec.identity?{identity:spec.identity}:{},...spec.firstMessageDelivery?{firstMessageDelivery:spec.firstMessageDelivery}:{}}}import{homedir as homedir3}from"os";import{spawnSync}from"child_process";import{existsSync,statSync}from"fs";import{homedir}from"os";var defaultBinaryDeps={fileExists(p){try{return statSync(p).isFile()}catch{return!1}},env(name){return process.env[name]},home(){return homedir()},which(name){let cmd=process.platform==="win32"?"where":"which",out=spawnSync(cmd,[name],{encoding:"utf8"});if(out.status!==0)return;let first=out.stdout.split(`
3
+ `).map((l)=>l.trim()).filter(Boolean)[0];if(!first)return;if(first.startsWith(`${name}:`)&&first.includes("aliased to")){let aliasTarget=first.split("aliased to")[1]?.trim();return aliasTarget&&existsSync(aliasTarget)?aliasTarget:void 0}return first},readdir(p){try{return __require("fs").readdirSync(p)}catch{return[]}}};class BinaryNotFoundError extends Error{checkedPaths;constructor(label,hint,checkedPaths){super(`${label} not found. Checked: ${checkedPaths.join(", ")}. ${hint}`);this.name="BinaryNotFoundError",this.checkedPaths=checkedPaths}}function createBinaryFinder(spec){return async function(deps=defaultBinaryDeps){let checked=[],whichResult=deps.which(spec.name);if(whichResult){if(checked.push(`which:${whichResult}`),deps.fileExists(whichResult))return whichResult}for(let candidate of spec.candidates({deps,home:deps.home()}))if(checked.push(candidate),deps.fileExists(candidate))return candidate;throw spec.notFound(checked)}}import path from"path";class ClaudeBinaryNotFoundError extends BinaryNotFoundError{constructor(checkedPaths){super("Claude Code binary","Ensure 'claude' is on PATH, or install at ~/.claude/local/claude.",checkedPaths);this.name="ClaudeBinaryNotFoundError"}}var findClaudeBinary=createBinaryFinder({name:"claude",candidates({deps,home}){let out=[path.join(home,".claude","local","claude")],nvmBin=deps.env("NVM_BIN");if(nvmBin)out.push(path.join(nvmBin,"claude"));let nvmRoot=path.join(home,".nvm","versions","node"),versions=(deps.readdir?.(nvmRoot)??[]).sort((a,b)=>b.localeCompare(a,void 0,{numeric:!0}));for(let v of versions)out.push(path.join(nvmRoot,v,"bin","claude"));out.push("/opt/homebrew/bin/claude","/usr/local/bin/claude","/usr/bin/claude","/bin/claude");for(let rel of[".local/bin",".npm-global/bin",".yarn/bin",".bun/bin","bin"])out.push(path.join(home,rel,"claude"));return out},notFound:(checked)=>new ClaudeBinaryNotFoundError(checked)});import path2 from"path";class CodexBinaryNotFoundError extends BinaryNotFoundError{constructor(checkedPaths){super("Codex CLI binary","Ensure 'codex' is on PATH (e.g. `brew install codex` or the official installer).",checkedPaths);this.name="CodexBinaryNotFoundError"}}var findCodexBinary=createBinaryFinder({name:"codex",candidates({deps,home}){let out=["/opt/homebrew/bin/codex","/usr/local/bin/codex","/usr/bin/codex","/bin/codex"],nvmBin=deps.env("NVM_BIN");if(nvmBin)out.push(path2.join(nvmBin,"codex"));for(let rel of[".local/bin",".bun/bin","bin"])out.push(path2.join(home,rel,"codex"));return out},notFound:(checked)=>new CodexBinaryNotFoundError(checked)});import path3 from"path";class CopilotBinaryNotFoundError extends BinaryNotFoundError{constructor(checkedPaths){super("GitHub Copilot CLI binary","Ensure 'copilot' is on PATH (for example `npm install -g @github/copilot` or `brew install copilot-cli`).",checkedPaths);this.name="CopilotBinaryNotFoundError"}}var findCopilotBinary=createBinaryFinder({name:"copilot",candidates({deps,home}){let win32=(deps.platform?.()??process.platform)==="win32",names=win32?["copilot.exe","copilot.cmd","copilot"]:["copilot"],dirs=["/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"],nvmBin=deps.env("NVM_BIN");if(nvmBin)dirs.push(nvmBin);let homeDirs=[path3.join(home,".npm-global/bin"),path3.join(home,".local/bin"),path3.join(home,".bun/bin"),path3.join(home,"bin")];if(win32){let appData=deps.env("APPDATA"),localAppData=deps.env("LOCALAPPDATA");if(homeDirs.unshift(path3.join(home,"AppData/Roaming/npm")),appData)homeDirs.unshift(path3.join(appData,"npm"));if(localAppData)homeDirs.unshift(path3.join(localAppData,"npm"))}return[...dirs,...homeDirs].flatMap((dir)=>names.map((name)=>path3.join(dir,name)))},notFound:(checked)=>new CopilotBinaryNotFoundError(checked)});import{readFileSync,statSync as statSync2}from"fs";import{readFile,stat}from"fs/promises";var MAX_ENGINE_FILE_BYTES=104857600,MAX_JSONL_LINE_CHARS=8388608;async function readTextFileBounded(p,maxBytes=MAX_ENGINE_FILE_BYTES){let{size}=await stat(p);if(size>maxBytes)return"";return readFile(p,"utf8")}function readTextFileSyncBounded(p,maxBytes=MAX_ENGINE_FILE_BYTES){let st;try{st=statSync2(p)}catch(err){if(err.code==="ENOENT")return null;throw err}if(st.size>maxBytes)return null;return readFileSync(p,"utf8")}function isJsonlLineWithinBound(line,maxChars=MAX_JSONL_LINE_CHARS){return line.length<=maxChars}import path4 from"path";class KimiBinaryNotFoundError extends BinaryNotFoundError{constructor(checkedPaths){super("Kimi Code CLI binary","Ensure 'kimi' is on PATH or installed at ~/.kimi-code/bin/kimi.",checkedPaths);this.name="KimiBinaryNotFoundError"}}var findKimiBinary=createBinaryFinder({name:"kimi",candidates:({home})=>[path4.join(home,".kimi-code/bin"),path4.join(home,".local/bin"),path4.join(home,"bin"),"/opt/homebrew/bin","/usr/local/bin"].map((dir)=>path4.join(dir,"kimi")),notFound:(checked)=>new KimiBinaryNotFoundError(checked)});import{homedir as homedir2}from"os";import path5 from"path";var VENDOR_HOMES={claude:{envVar:"CLAUDE_CONFIG_DIR",dirName:".claude"},codex:{envVar:"CODEX_HOME",dirName:".codex"},copilot:{envVar:"COPILOT_HOME",dirName:".copilot"},kimi:{envVar:"KIMI_CODE_HOME",dirName:".kimi-code"}},defaultVendorHomeDeps={env:(name)=>process.env[name],home:()=>homedir2()};function vendorConfigHome(vendor,deps=defaultVendorHomeDeps){let{envVar,dirName}=VENDOR_HOMES[vendor],override=deps.env(envVar)?.trim();if(override)return override;return path5.join(deps.home(),dirName)}function depsOf(env,home){return{env,home:()=>home}}function claudeGlobalConfigPath(env,home){let override=env("CLAUDE_CONFIG_DIR")?.trim();if(override)return path5.join(override,".claude.json");return path5.join(home,".claude.json")}function codexAuthPath(env,home){return path5.join(vendorConfigHome("codex",depsOf(env,home)),"auth.json")}function copilotConfigPath(env,home){return path5.join(vendorConfigHome("copilot",depsOf(env,home)),"config.json")}function kimiCredentialsPath(env,home){return path5.join(vendorConfigHome("kimi",depsOf(env,home)),"credentials","kimi-code.json")}var defaultDeps={readFile(p){return readTextFileSyncBounded(p)},env(name){return process.env[name]},home(){return homedir3()},findClaudeBinary(){return findClaudeBinary()},findCodexBinary(){return findCodexBinary()},findCopilotBinary(){return findCopilotBinary()},findKimiBinary(){return findKimiBinary()}};function decodeJwtPayload(jwt){let parts=jwt.split(".");if(parts.length!==3)return null;let payload=parts[1];if(!payload)return null;let b64=payload.replace(/-/g,"+").replace(/_/g,"/"),padded=b64+"=".repeat((4-b64.length%4)%4);try{let json=Buffer.from(padded,"base64").toString("utf8"),obj=JSON.parse(json);return typeof obj==="object"&&obj!==null?obj:null}catch{return null}}async function probeBinary(probe){try{return{found:!0,path:await probe()}}catch(err){if(err instanceof BinaryNotFoundError)return{found:!1,error:"not found on PATH"};return{found:!1,error:errorMessage(err)}}}var cachedDefaultVendors=null;async function probeAvailableVendors(deps){return(await Promise.all([["claude",()=>deps.findClaudeBinary()],["codex",()=>deps.findCodexBinary()],["copilot",()=>deps.findCopilotBinary()],["kimi",()=>deps.findKimiBinary()]].map(async([vendor,probe])=>(await probeBinary(probe)).found?vendor:null))).filter((v)=>v!==null)}function detectAvailableVendors(deps=defaultDeps){if(deps!==defaultDeps)return probeAvailableVendors(deps);if(cachedDefaultVendors)return cachedDefaultVendors;let pending=probeAvailableVendors(deps).catch((err)=>{throw cachedDefaultVendors=null,err});return cachedDefaultVendors=pending,pending}function resetAvailableVendorsCache(){cachedDefaultVendors=null,cachedContribEngines=null}async function installedEngineIds(deps=defaultDeps){let builtins=await detectAvailableVendors(deps),contrib=await detectContribEngines();return[...new Set([...builtins,...getCustomEngineIds(),...contrib])]}async function availableEngineIds(deps=defaultDeps){let disabled=new Set(getDisabledEngineIds());return(await installedEngineIds(deps)).filter((id)=>!disabled.has(id))}var cachedContribEngines=null;function detectContribEngines(){if(cachedContribEngines)return cachedContribEngines;let which=globalThis.Bun?.which;return cachedContribEngines=Promise.resolve([...which?CONTRIB_ENGINE_IDS.filter((id)=>{let bin=CONTRIB_ENGINES[id]?.defaultCommand[0];return bin?which(bin)!==null:!1}):[],...pluginEngineIds()]),cachedContribEngines}async function detectClaudeAccount(deps=defaultDeps){let binary=await probeBinary(()=>deps.findClaudeBinary()),configPath=claudeGlobalConfigPath(deps.env,deps.home()),raw;try{raw=deps.readFile(configPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${configPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${configPath}: ${errorMessage(err)}`}}let oauth=parsed?.oauthAccount;if(!oauth||typeof oauth!=="object")return{binary,account:{kind:"none"}};let o=oauth,email=typeof o.emailAddress==="string"?o.emailAddress:void 0;if(!email)return{binary,account:{kind:"none"}};return{binary,account:{kind:"oauth",email,organization:typeof o.organizationName==="string"?o.organizationName:void 0,displayName:typeof o.displayName==="string"?o.displayName:void 0,billingType:typeof o.billingType==="string"?o.billingType:void 0}}}async function detectCodexAccount(deps=defaultDeps){let binary=await probeBinary(()=>deps.findCodexBinary()),authPath=codexAuthPath(deps.env,deps.home()),raw;try{raw=deps.readFile(authPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${authPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${authPath}: ${errorMessage(err)}`}}let obj=parsed??{},tokens=obj.tokens,idToken=typeof tokens?.id_token==="string"?tokens.id_token:void 0;if(idToken){let payload=decodeJwtPayload(idToken);if(!payload)return{binary,account:{kind:"none"},accountError:"codex id_token: malformed JWT"};let email=typeof payload.email==="string"?payload.email:void 0,authClaimRaw=payload["https://api.openai.com/auth"],authClaim=typeof authClaimRaw==="object"&&authClaimRaw!==null&&!Array.isArray(authClaimRaw)?authClaimRaw:void 0,plan=typeof authClaim?.chatgpt_plan_type==="string"?authClaim.chatgpt_plan_type:void 0;if(email)return{binary,account:{kind:"chatgpt",email,plan}};return{binary,account:{kind:"none"},accountError:"codex id_token: no email claim"}}let apiKey=obj.OPENAI_API_KEY;if(typeof apiKey==="string"&&apiKey.length>0)return{binary,account:{kind:"apikey"}};return{binary,account:{kind:"none"}}}async function detectCopilotAccount(deps=defaultDeps){let binary=await probeBinary(()=>deps.findCopilotBinary());for(let source of["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"])if(deps.env(source)?.trim())return{binary,account:{kind:"token",source}};let configPath=copilotConfigPath(deps.env,deps.home()),raw;try{raw=deps.readFile(configPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${configPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${configPath}: ${errorMessage(err)}`}}if(!isRecord(parsed))return{binary,account:{kind:"none"}};if(hasStringDeep(parsed,["github_token","oauth_token","access_token","token","selectedUser","currentUser","user"]))return{binary,account:{kind:"oauth"}};return{binary,account:{kind:"none"}}}async function detectKimiAccount(deps=defaultDeps){let binary=await probeBinary(()=>deps.findKimiBinary()),credPath=kimiCredentialsPath(deps.env,deps.home()),raw;try{raw=deps.readFile(credPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${credPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${credPath}: ${errorMessage(err)}`}}if(!isRecord(parsed))return{binary,account:{kind:"none"}};let token=parsed.access_token;if(typeof token==="string"&&token.length>0)return{binary,account:{kind:"oauth"}};return{binary,account:{kind:"none"}}}function isRecord(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function hasStringDeep(value,interestingKeys,depth=0){if(depth>4||!isRecord(value))return!1;for(let[key,entry]of Object.entries(value)){if(interestingKeys.includes(key)&&typeof entry==="string"&&entry.length>0)return!0;if(isRecord(entry)&&hasStringDeep(entry,interestingKeys,depth+1))return!0}return!1}
4
+ export{registerPluginEngine,clearPluginEngines,pluginEngineIds,isContribEngine,CONTRIB_ENGINE_IDS,contribEngineEntry,readTextFileBounded,isJsonlLineWithinBound,vendorConfigHome,copilotConfigPath,resetAvailableVendorsCache,installedEngineIds,availableEngineIds,detectClaudeAccount,detectCodexAccount,detectCopilotAccount,detectKimiAccount};
@@ -0,0 +1,25 @@
1
+ // @bun
2
+ import{NPX_MISSING_EXIT,bundledSkillDir,kobeSkillPaths,kobeSkillState,npxSkillsCommand,runNpxSkillsInstall}from"./chunk-g1ybdgad.js";import{SUBCOMMAND_VERBS}from"./chunk-s76r56rj.js";import"./chunk-k3ksts6g.js";import"./chunk-gjf604bb.js";import"./chunk-9c1e5z6a.js";import"./chunk-6dn6h640.js";import{activeCliName}from"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-3bfm4hrs.js";import{__require}from"./chunk-wqfp8d9w.js";import{existsSync,readFileSync}from"fs";import{join}from"path";var CLI_NAME=activeCliName(),SKILL_VERBS=SUBCOMMAND_VERBS.skill;function skillUsage(){return[`usage: ${CLI_NAME} skill <verb>`,"","verbs:"," install [--project] [--agent NAME]\u2026 Install the Rove agent skill (wraps `npx skills add`)"," status Show whether the skill is installed"," command [--project] [--agent NAME]\u2026 Print the underlying npx command without running it",` print Print the bundled SKILL.md (also: \`${CLI_NAME} --skill\`)`,"",`The skill teaches a coding agent how to drive \`${CLI_NAME} api\`. Installs are`,"global (user-level) by default; --project installs into the current project","instead. With no --agent, the agent-skills CLI detects your installed agents","and asks; repeat --agent to name them (e.g. --agent claude-code --agent codex)."].join(`
3
+ `)}function parseInstallFlags(rest){let global=!0,agents=[];for(let i=0;i<rest.length;i++){let arg=rest[i];if(arg==="--project"||arg==="-p")global=!1;else if(arg==="--global"||arg==="-g")global=!0;else if(arg==="--agent"){let v=rest[i+1];if(!v||v.startsWith("--"))process.stderr.write(`${CLI_NAME} skill: --agent requires a value
4
+ `),process.exit(2);agents.push(v),i++}else if(arg.startsWith("--agent="))agents.push(arg.slice(8));else process.stderr.write(`${CLI_NAME} skill: unknown flag "${arg}"
5
+
6
+ ${skillUsage()}
7
+ `),process.exit(2)}let joined=agents.find((a)=>a.includes(","));if(joined)process.stderr.write(`${CLI_NAME} skill: --agent takes one name; repeat the flag instead of "${joined}"
8
+ e.g. ${joined.split(",").map((a)=>`--agent ${a.trim()}`).join(" ")}
9
+ `),process.exit(2);return{agents,global}}async function runSkillSubcommand(argv){let[verb,...rest]=argv;if(!verb||verb==="--help"||verb==="-h"||verb==="help"){if(process.stdout.write(`${skillUsage()}
10
+ `),!verb)process.exitCode=2;return}if(!SKILL_VERBS.includes(verb))process.stderr.write(`${CLI_NAME} skill: unknown verb "${verb}"
11
+
12
+ ${skillUsage()}
13
+ `),process.exit(2);if(verb==="print"){let bundled2=bundledSkillDir(),path=bundled2?join(bundled2,"SKILL.md"):kobeSkillPaths().find((p)=>existsSync(p));if(!path)process.stderr.write(`${CLI_NAME} skill: no SKILL.md found (not bundled, not installed) \u2014 run \`${CLI_NAME} skill install\`
14
+ `),process.exit(1);process.stdout.write(readFileSync(path,"utf8"));return}if(verb==="status"){let{isRovePluginEnabled}=await import("./chunk-vws0j65e.js"),state=kobeSkillState(),paths=kobeSkillPaths(),pluginNote=isRovePluginEnabled()?` note: the Rove Claude Code plugin is enabled \u2014 for Claude Code the skill ships
15
+ inside the plugin and versions with it (staleness prompts are suppressed).
16
+ `:"",head=!state.installed?"\u2717 not installed":state.stale?`\u26A0 out of date (installed ${state.installedVersion===null?"unstamped":`v${state.installedVersion}`}, this Rove wants v${state.currentVersion})`:`\u2713 installed (v${state.installedVersion})`;process.stdout.write([`${CLI_NAME} skill: ${head}`,...state.legacyCopies.map((copy)=>` \u26A0 stale duplicate: ${copy.path}${copy.version===null?"":` (v${copy.version})`} \u2014 remove it; agents load both`),` looked in: ${paths.join(`
17
+ `)}`,state.installed&&!state.stale?"":` \u2192 run \`${CLI_NAME} skill install\` to install / refresh`,""].join(`
18
+ `)+pluginNote);return}if(verb==="command"){let flags=parseInstallFlags(rest);process.stdout.write(`${npxSkillsCommand({agent:flags.agents,global:flags.global})}
19
+ `);return}let{agents,global}=parseInstallFlags(rest),bundled=bundledSkillDir();process.stdout.write(`${CLI_NAME} skill: running \`${npxSkillsCommand({agent:agents,global})}\`
20
+ ${bundled?"":`${CLI_NAME} skill: no bundled skill found \u2014 falling back to a repo clone (large download).
21
+ `}`);let code=await runNpxSkillsInstall(agents,global);if(code!==0){if(code!==NPX_MISSING_EXIT)process.stderr.write(`
22
+ ${CLI_NAME} skill install failed (npx exited ${code}).
23
+ You can run it yourself: ${npxSkillsCommand({agent:agents,global})}
24
+ `);process.exit(code||1)}process.stdout.write(`${CLI_NAME} skill: installed.
25
+ `)}export{runSkillSubcommand};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{isDev}from"./chunk-6dn6h640.js";import{fileURLToPath}from"url";var package_default={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.147",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",keywords:["terminal","tui","cli","multiplexer","ai-agents","coding-agent","ai-coding-assistant","agentic-ai","parallel-agents","git-worktree","claude-code","codex","llm","developer-tools"],type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://rove.run",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.18","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var CURRENT_VERSION=package_default.version,PACKAGE_NAME=package_default.name;function repoSlug(){let url=package_default.repository?.url;if(!url)return null;let m=url.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!m||!m[1]||!m[2])return null;return`${m[1]}/${m[2]}`}var UPDATE_SCRIPT_URL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",UPDATE_COMMAND=`curl -fsSL ${UPDATE_SCRIPT_URL} | sh`;function owningNpmPrefix(modulePath=fileURLToPath(import.meta.url)){let at=modulePath.indexOf("/lib/node_modules/");if(at<=0)return null;return modulePath.slice(0,at)}function recommendedGlobalInstallCommand(prefix=owningNpmPrefix()){let target=`${PACKAGE_NAME}@latest`;return prefix===null?`npm install -g ${target}`:`npm install -g --prefix ${prefix} ${target}`}var BREAKING_VERSIONS=[];function breakingVersionsCrossed(from,to,breaking=BREAKING_VERSIONS){let[lo,hi]=compareSemver(from,to)<=0?[from,to]:[to,from];return breaking.filter((b)=>compareSemver(b,lo)>0&&compareSemver(b,hi)<=0)}var FETCH_TIMEOUT_MS=3000,RELEASE_CHANNELS=["latest","nightly"],DEFAULT_RELEASE_CHANNEL="latest";function channelOf(version=CURRENT_VERSION){return prereleaseOf(version)?.split(".")[0]==="nightly"?"nightly":DEFAULT_RELEASE_CHANNEL}async function fetchLatestFromRegistry(packageName,channel){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let encoded=packageName.replace("/","%2F"),res=await fetch(`https://registry.npmjs.org/${encoded}/${channel}`,{signal:ctrl.signal,headers:{accept:"application/json"}});if(!res.ok)return null;let body=await res.json();if(typeof body.version!=="string")return null;return body.version}catch{return null}finally{clearTimeout(timer)}}function isNewerSemver(latest,current){let core=compareSemver(latest,current);if(core!==0)return core>0;return comparePrerelease(prereleaseOf(latest),prereleaseOf(current))>0}function prereleaseOf(version){let dash=version.indexOf("-");return dash===-1?void 0:version.slice(dash+1)||void 0}function comparePrerelease(a,b){if(a===b)return 0;if(a===void 0)return 1;if(b===void 0)return-1;let aParts=a.split("."),bParts=b.split(".");for(let i=0;i<Math.max(aParts.length,bParts.length);i++){let av=aParts[i],bv=bParts[i];if(av===void 0)return-1;if(bv===void 0)return 1;if(av===bv)continue;let an=/^\d+$/.test(av)?Number.parseInt(av,10):null,bn=/^\d+$/.test(bv)?Number.parseInt(bv,10):null;if(an!==null&&bn!==null)return an>bn?1:-1;if(an!==null)return-1;if(bn!==null)return 1;return av>bv?1:-1}return 0}function compareSemver(aVersion,bVersion){let norm=(v)=>v.split("-")[0]??v,a=norm(aVersion).split(".").map((s)=>Number.parseInt(s,10)),b=norm(bVersion).split(".").map((s)=>Number.parseInt(s,10));for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(Number.isNaN(av)||Number.isNaN(bv))return 0;if(av>bv)return 1;if(av<bv)return-1}return 0}async function checkLatestVersion(opts={}){let channel=opts.channel??channelOf(),fake=process.env.KOBE_FAKE_UPDATE;if(fake)return{current:CURRENT_VERSION,latest:fake,hasUpdate:isNewerSemver(fake,CURRENT_VERSION),channel};if(isDev()&&!opts.force)return null;let latest=await fetchLatestFromRegistry(PACKAGE_NAME,channel);if(!latest)return null;return{current:CURRENT_VERSION,latest,hasUpdate:isNewerSemver(latest,CURRENT_VERSION),channel}}function versionFromTagName(tagName){if(typeof tagName!=="string")return null;return tagName.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function fetchReleaseNotes(version){let slug=repoSlug();if(!slug)return null;let tag=`v${version}`,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases/tags/${tag}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return null;let body=await res.json();if(typeof body.body!=="string"||typeof body.html_url!=="string")return null;return{body:body.body,url:body.html_url,version}}catch{return null}finally{clearTimeout(timer)}}async function fetchReleaseNotesRange(args){let slug=repoSlug();if(!slug)return[];let limit=args.limit??100,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release)=>{let version=versionFromTagName(release.tag_name);if(!version||typeof release.html_url!=="string"||typeof release.body!=="string")return null;if(compareSemver(version,args.current)<=0)return null;if(compareSemver(version,args.latest)>0)return null;return{version,url:release.html_url,body:release.body}}).filter((release)=>release!==null)}catch{return[]}finally{clearTimeout(timer)}}async function fetchReleaseSummaries(limit=12){let slug=repoSlug();if(!slug)return[];let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release)=>{let version=versionFromTagName(release.tag_name);if(!version||typeof release.html_url!=="string")return null;return{version,url:release.html_url}}).filter((release)=>release!==null)}catch{return[]}finally{clearTimeout(timer)}}function releasePageUrl(version){let slug=repoSlug();if(!slug)return null;return`https://github.com/${slug}/releases/tag/v${version}`}
3
+ export{package_default,CURRENT_VERSION,PACKAGE_NAME,repoSlug,UPDATE_SCRIPT_URL,UPDATE_COMMAND,owningNpmPrefix,recommendedGlobalInstallCommand,BREAKING_VERSIONS,breakingVersionsCrossed,RELEASE_CHANNELS,DEFAULT_RELEASE_CHANNEL,channelOf,isNewerSemver,compareSemver,checkLatestVersion,fetchReleaseNotes,fetchReleaseNotesRange,fetchReleaseSummaries,releasePageUrl};
@@ -0,0 +1,7 @@
1
+ // @bun
2
+ async function run(argv){try{let proc=Bun.spawn([...argv],{stdin:"ignore",stdout:"pipe",stderr:"pipe"}),[stdout,stderr,code]=await Promise.all([new Response(proc.stdout).text().catch(()=>""),new Response(proc.stderr).text().catch(()=>""),proc.exited]);return{code,stdout,stderr,missing:!1}}catch(error){let systemError=error;return{code:127,stdout:"",stderr:error instanceof Error?error.message:String(error),missing:systemError.code==="ENOENT"}}}async function runTmux(socket,args){return run(["tmux","-L",socket,...args])}function commandFailure(label,result){return`${label} failed: ${result.stderr.trim()||`exit ${result.code}`}`}function isMissingServer(result){return/no server running|error connecting to|failed to connect to server|no sessions/i.test(`${result.stdout}
3
+ ${result.stderr}`)}function parsePositiveInts(output){return output.split(`
4
+ `).map((line)=>Number.parseInt(line.trim(),10)).filter((value)=>Number.isFinite(value)&&value>1)}function parseLegacyPsRows(output){let rows=[];for(let line of output.split(`
5
+ `).slice(1)){let parts=line.trim().split(/\s+/);if(parts.length<4)continue;let pid=Number.parseInt(parts[0]??"",10),pgid=Number.parseInt(parts[1]??"",10),rssKb=Number.parseInt(parts[2]??"",10);if(!Number.isFinite(pid)||!Number.isFinite(pgid)||!Number.isFinite(rssKb))continue;rows.push({pid,pgid,rssKb,command:parts.slice(3).join(" ")})}return rows}function legacyPaneProcesses(rows,panePids){let groups=new Set(panePids);return rows.filter((row)=>groups.has(row.pgid))}function emptyReport(available,version,error=null){return{available,version,sessions:[],panePids:[],processes:[],error}}async function inspectLegacyTmux(socket="kobe"){let versionResult=await run(["tmux","-V"]);if(versionResult.missing)return emptyReport(!1,null);if(versionResult.code!==0)return emptyReport(!0,null,commandFailure("tmux -V",versionResult));let version=versionResult.stdout.trim()||null,sessionsResult=await runTmux(socket,["list-sessions","-F","#{session_name}"]);if(sessionsResult.code!==0){if(isMissingServer(sessionsResult))return emptyReport(!0,version);return emptyReport(!0,version,commandFailure("tmux list-sessions",sessionsResult))}let sessions=sessionsResult.stdout.split(`
6
+ `).map((line)=>line.trim()).filter(Boolean);if(sessions.length===0)return emptyReport(!0,version);let panesResult=await runTmux(socket,["list-panes","-a","-F","#{pane_pid}"]);if(panesResult.code!==0)return{...emptyReport(!0,version,commandFailure("tmux list-panes",panesResult)),sessions};let panePids=parsePositiveInts(panesResult.stdout);if(panePids.length===0)return{...emptyReport(!0,version,"tmux reported live sessions but no pane process groups"),sessions};let psResult=await run(["ps","-axo","pid,pgid,rss,comm"]);if(psResult.code!==0)return{available:!0,version,sessions,panePids,processes:[],error:commandFailure("ps",psResult)};return{available:!0,version,sessions,panePids,processes:legacyPaneProcesses(parseLegacyPsRows(psResult.stdout),panePids),error:null}}function legacyTmuxDoctorLines(report,socket="kobe"){if(report.error)return[`legacy tmux: \u2717 inspection failed \u2014 ${report.error}`];if(!report.available)return["legacy tmux: not installed \u2014 no pre-v0.8 sessions to inspect"];let version=report.version??"tmux (version unknown)";if(report.sessions.length===0)return[`legacy tmux: ${version} \u2014 no sessions on \`${socket}\``];let totalMb=report.processes.reduce((sum,row)=>sum+row.rssKb,0)/1024,grouped=new Map;for(let row of report.processes){let item=grouped.get(row.command)??{count:0,rssKb:0};item.count++,item.rssKb+=row.rssKb,grouped.set(row.command,item)}let lines=[`legacy tmux: \u26A0 ${version} \u2014 ${report.sessions.length} pre-v0.8 session(s) on \`${socket}\``,` ${report.processes.length} process(es) across ${report.panePids.length} pane(s), ${totalMb.toFixed(1)} MB RSS total`];for(let[command,item]of[...grouped].sort((a,b)=>b[1].rssKb-a[1].rssKb))lines.push(` ${command}: ${item.count} proc, ${(item.rssKb/1024).toFixed(1)} MB`);return lines.push(" \u2192 run `rove reset` to stop this retired runtime safely"),lines}var PROCESS_GROUP_EXIT_GRACE_MS=6000,PROCESS_GROUP_POLL_MS=100;async function ownProcessGroup(){let result=await run(["ps","-o","pgid=","-p",String(process.pid)]);if(result.code!==0)return{pgid:null,error:commandFailure("ps current process group",result)};let pgid=Number.parseInt(result.stdout.trim(),10);if(!Number.isFinite(pgid)||pgid<=1)return{pgid:null,error:"unable to determine current process group"};return{pgid,error:null}}function processGroupAlive(pgid){try{return process.kill(-pgid,0),!0}catch(error){return error.code!=="ESRCH"}}async function waitForProcessGroupsExit(pgids){let deadline=Date.now()+PROCESS_GROUP_EXIT_GRACE_MS,survivors=pgids.filter(processGroupAlive);while(survivors.length>0&&Date.now()<deadline)await new Promise((resolve)=>setTimeout(resolve,PROCESS_GROUP_POLL_MS)),survivors=survivors.filter(processGroupAlive);return survivors}async function stopLegacyTmux(socket="kobe"){let report=await inspectLegacyTmux(socket);if(report.error)return{status:"failed",sessions:report.sessions.length,signalledGroups:0,error:report.error};if(!report.available||report.sessions.length===0)return{status:"absent",sessions:0,signalledGroups:0};let ownGroup=await ownProcessGroup();if(ownGroup.error)return{status:"failed",sessions:report.sessions.length,signalledGroups:0,error:ownGroup.error};let signalledPaneGroups=[];for(let pgid of new Set(report.panePids)){if(pgid===ownGroup.pgid)continue;try{process.kill(-pgid,"SIGTERM"),signalledPaneGroups.push(pgid)}catch(error){if(error.code==="ESRCH")continue;return{status:"failed",sessions:report.sessions.length,signalledGroups:signalledPaneGroups.length,error:`failed to SIGTERM pane group ${pgid}: ${error instanceof Error?error.message:String(error)}`}}}let result=await runTmux(socket,["kill-server"]);if(result.code!==0){let remaining=await inspectLegacyTmux(socket);if(remaining.error||remaining.sessions.length>0)return{status:"failed",sessions:report.sessions.length,signalledGroups:signalledPaneGroups.length,error:remaining.error??(result.stderr.trim()||`tmux exited ${result.code}`)}}let survivors=await waitForProcessGroupsExit(signalledPaneGroups);if(survivors.length>0)return{status:"failed",sessions:report.sessions.length,signalledGroups:signalledPaneGroups.length,error:`pane process groups still alive after ${PROCESS_GROUP_EXIT_GRACE_MS}ms: ${survivors.join(", ")}`};return{status:"stopped",sessions:report.sessions.length,signalledGroups:signalledPaneGroups.length}}
7
+ export{inspectLegacyTmux,legacyTmuxDoctorLines,stopLegacyTmux};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ function charWidth(cp){if(cp<32||cp>=127&&cp<=159)return 0;if(cp>=768&&cp<=879||cp>=4448&&cp<=4607||cp>=6832&&cp<=6911||cp>=7616&&cp<=7679||cp>=8203&&cp<=8207||cp>=8234&&cp<=8238||cp>=8288&&cp<=8292||cp>=8400&&cp<=8447||cp>=12330&&cp<=12335||cp>=12441&&cp<=12442||cp>=65024&&cp<=65039||cp>=65056&&cp<=65071||cp===65279)return 0;if(cp>=4352&&cp<=4447||cp===9001||cp===9002||cp>=11904&&cp<=12350||cp>=12353&&cp<=13311||cp>=13312&&cp<=19903||cp>=19968&&cp<=40959||cp>=40960&&cp<=42191||cp>=44032&&cp<=55203||cp>=63744&&cp<=64255||cp>=65040&&cp<=65049||cp>=65072&&cp<=65135||cp>=65280&&cp<=65376||cp>=65504&&cp<=65510||cp===126980||cp===127183||cp>=127488&&cp<=127743||cp>=127744&&cp<=129791||cp>=131072&&cp<=262141)return 2;return 1}function displayWidth(s){let width=0;for(let ch of s)width+=charWidth(ch.codePointAt(0));return width}function approxCharCells(cp){return cp>=4352?2:1}function approxCellWidth(s){let n=0;for(let ch of s)n+=approxCharCells(ch.codePointAt(0)??0);return n}function padEndCells(s,cells){let deficit=cells-displayWidth(s);return deficit<=0?s:s+" ".repeat(deficit)}
3
+ export{charWidth,displayWidth,approxCharCells,approxCellWidth,padEndCells};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ var KOBE_TERMINAL_TITLE_SEQUENCE="\x1B]0;rove\x07";function publishKobeTerminalTitle(output=process.stdout){if(!output.isTTY)return!1;return output.write("\x1B]0;rove\x07"),!0}
3
+ export{KOBE_TERMINAL_TITLE_SEQUENCE,publishKobeTerminalTitle};
@@ -0,0 +1,15 @@
1
+ // @bun
2
+ import{$jsx,$jsxs,pageCloseBindings,require_react_production,useBindings,useRenderer,useT,useTheme}from"./chunk-fe34e0w7.js";import{CURRENT_VERSION,UPDATE_COMMAND,checkLatestVersion,fetchReleaseNotesRange,releasePageUrl}from"./chunk-dnb2bmtb.js";import{__toESM}from"./chunk-wqfp8d9w.js";import{spawnSync}from"child_process";function waitForKeypress(){if(!process.stdin.isTTY)return Promise.resolve();return new Promise((resolve)=>{let stdin=process.stdin,done=()=>{stdin.off("data",done),stdin.setRawMode?.(!1),stdin.pause(),resolve()};stdin.setRawMode?.(!0),stdin.resume(),stdin.once("data",done)})}async function runShellUpdater(opts){opts.renderer?.destroy(),process.stdout.write(`
3
+ rove ${CURRENT_VERSION} -> ${opts.targetLabel}
4
+ `),process.stdout.write(`running: ${opts.command}
5
+
6
+ `);let result=spawnSync("sh",["-c",opts.command],{stdio:"inherit"}),code=result.status??(result.error?1:0);if(result.error)process.stderr.write(`
7
+ rove update: failed to start updater: ${result.error.message}
8
+ `);process.stdout.write(code===0?`
9
+ ${opts.t("update.updateComplete")}
10
+ `:`
11
+ ${opts.t("update.updateFailed",{code:String(code)})}
12
+ `),process.stdout.write(opts.t("update.pressAnyKey")),await waitForKeypress(),process.exit(code)}import{TextAttributes}from"@opentui/core";var import_react2=__toESM(require_react_production(),1);import{spawn}from"child_process";function spawnDetached(cmd,args,opts={}){try{let child=spawn(cmd,args,{detached:!0,stdio:"ignore"});return child.on("error",(err)=>opts.onError?.(err)),child.unref(),!0}catch(err){if(opts.onError&&err instanceof Error)opts.onError(err);return!1}}function systemOpenArgv(absPath,platform=process.platform){if(platform==="darwin")return["open",absPath];if(platform==="win32")return["cmd","/c","start","",absPath];return["xdg-open",absPath]}function openWithSystemViewer(absPath){let[cmd,...args]=systemOpenArgv(absPath);return spawnDetached(cmd??"",args)}function releaseBodyLines(body){return body.replace(/\r\n/g,`
13
+ `).split(`
14
+ `).map((line)=>line.trim()).filter(Boolean)}function UpdatePage(props){let{theme}=useTheme(),t=useT(),renderer=useRenderer(),[info,setInfo]=import_react2.useState(null),[checked,setChecked]=import_react2.useState(!1),[releaseNotes,setReleaseNotes]=import_react2.useState([]),[loadingNotes,setLoadingNotes]=import_react2.useState(!0),[selected,setSelected]=import_react2.useState("close"),[status,setStatus]=import_react2.useState(null),latest=info?.latest??CURRENT_VERSION,latestUnknown=checked&&info===null,hasUpdate=info?.hasUpdate===!0,upToDate=checked&&info!==null&&!hasUpdate,releaseUrl=releaseNotes[0]?.url??releasePageUrl(latest),actions=[...hasUpdate?[{id:"update",key:"U",label:t("update.actions.updateNow"),detail:UPDATE_COMMAND}]:[],{id:"release",key:"R",label:t("update.actions.openRelease"),detail:releaseUrl??t("update.releaseUrlUnavailable")},{id:"close",key:"Q",label:t("update.actions.close"),detail:t("update.actions.closeDetail")}];import_react2.useEffect(()=>{load()},[]);async function load(){let next=await checkLatestVersion({force:!0});if(setInfo(next),setChecked(!0),next?.hasUpdate)setSelected("update");let fetched=next?.hasUpdate?await fetchReleaseNotesRange({current:CURRENT_VERSION,latest:next.latest}):[];setReleaseNotes(fetched),setLoadingNotes(!1)}function move(delta){let ids=actions.map((a)=>a.id),next=(ids.indexOf(selected)+delta+ids.length)%ids.length;setSelected(ids[next]??"close")}function activate(id=selected){if(id==="close"){props.onClose();return}if(id==="update"&&!hasUpdate)return;if(id==="release"){setStatus(openWithSystemViewer(releaseUrl)?t("update.statusReleaseOpened"):t("update.statusReleaseError"));return}runUpdater()}async function runUpdater(){setStatus(t("update.statusRunningUpdater")),await new Promise((resolve)=>setTimeout(resolve,30)),await runShellUpdater({renderer,t,targetLabel:latest,command:UPDATE_COMMAND})}return useBindings(()=>({bindings:[{key:"up",cmd:()=>move(-1)},{key:"down",cmd:()=>move(1)},{key:"k",cmd:()=>move(-1)},{key:"j",cmd:()=>move(1)},{key:"return",cmd:()=>activate()},{key:"u",cmd:()=>activate("update")},{key:"r",cmd:()=>activate("release")},...pageCloseBindings(()=>activate("close"))]})),$jsxs("box",{flexDirection:"column",flexGrow:1,backgroundColor:theme.background,paddingTop:1,paddingLeft:2,paddingRight:2,children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",flexShrink:0,children:[$jsx("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"none",children:t("update.pageTitle")}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",onMouseUp:()=>activate("close"),children:"q / esc"})]}),$jsxs("box",{flexDirection:"row",gap:2,flexShrink:0,paddingTop:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t("update.current")}),$jsxs("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"none",children:["v",CURRENT_VERSION]}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t("update.latest")}),latestUnknown?$jsx("text",{fg:theme.textMuted,attributes:TextAttributes.BOLD,wrapMode:"none",children:t("update.latestUnknown")}):$jsxs("text",{fg:hasUpdate?theme.warning:theme.success,attributes:TextAttributes.BOLD,wrapMode:"none",children:["v",latest]})]}),upToDate?$jsx("box",{flexShrink:0,paddingTop:1,children:$jsx("text",{fg:theme.success,wrapMode:"word",children:t("update.upToDate")})}):null,$jsx("box",{flexDirection:"column",flexShrink:0,paddingTop:1,gap:0,children:actions.map((action)=>$jsxs("box",{flexDirection:"row",gap:1,paddingLeft:1,paddingRight:1,backgroundColor:selected===action.id?theme.primary:void 0,onMouseUp:()=>activate(action.id),children:[$jsx("box",{width:4,flexShrink:0,children:$jsxs("text",{fg:selected===action.id?theme.selectedListItemText:theme.accent,attributes:TextAttributes.BOLD,wrapMode:"none",children:["[",action.key,"]"]})}),$jsx("box",{width:14,flexShrink:0,children:$jsx("text",{fg:selected===action.id?theme.selectedListItemText:theme.text,wrapMode:"none",children:action.label})}),$jsx("text",{fg:selected===action.id?theme.selectedListItemText:theme.textMuted,wrapMode:"word",children:action.detail})]},action.id))}),status?$jsx("text",{fg:theme.info,wrapMode:"word",children:status}):null,hasUpdate?$jsx("box",{flexShrink:0,paddingTop:1,children:$jsx("text",{fg:theme.textMuted,attributes:TextAttributes.DIM,wrapMode:"none",children:t("update.changesSectionHeader",{from:CURRENT_VERSION,to:latest})})}):null,$jsx("scrollbox",{flexGrow:1,flexShrink:1,stickyScroll:!1,verticalScrollbarOptions:{trackOptions:{backgroundColor:theme.background,foregroundColor:theme.borderActive}},children:$jsxs("box",{flexDirection:"column",paddingRight:1,paddingBottom:1,gap:0,children:[loadingNotes?$jsx("text",{fg:theme.textMuted,children:t("update.loadingNotes")}):null,!loadingNotes&&hasUpdate&&releaseNotes.length===0?$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t("update.notesUnavailable")}):null,releaseNotes.map((release)=>$jsxs("box",{flexDirection:"column",paddingBottom:1,gap:0,children:[$jsxs("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"none",children:["v",release.version]}),releaseBodyLines(release.body).map((line,i)=>$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:line},`${i}:${line}`))]},release.version))]})})]})}
15
+ export{runShellUpdater,spawnDetached,openWithSystemViewer,releaseBodyLines,UpdatePage};
@@ -0,0 +1,11 @@
1
+ // @bun
2
+ import{displayWidth}from"./chunk-dvcb6mk4.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";import{activeCliName}from"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-3bfm4hrs.js";import{__require}from"./chunk-wqfp8d9w.js";var CLI_NAME=activeCliName(),EXPORT_USAGE=[`Usage: ${CLI_NAME} export [--json | --csv | --format <json|csv|table>]`,"","Print the task list (from ~/.rove/tasks.json) to stdout. Read-only and","daemon-free \u2014 works with the Rove daemon down.","","Options:"," --json JSON array of tasks (default)"," --csv CSV with a header row"," --format <fmt> One of: json, csv, table"," -h, --help Print this help",""].join(`
3
+ `),COLUMNS=["id","title","status","vendor","branch","repo","worktreePath"];function toRow(task){return{id:task.id,title:task.title,status:task.status,vendor:task.vendor??DEFAULT_TASK_VENDOR,branch:task.branch,repo:task.repo,worktreePath:task.worktreePath}}function usageError(message){process.stderr.write(`${CLI_NAME} export: ${message}
4
+
5
+ ${EXPORT_USAGE}
6
+ `),process.exit(2)}function parseFormat(args){let format="json";for(let i=0;i<args.length;i++){let a=args[i];if(a==="--json")format="json";else if(a==="--csv")format="csv";else if(a==="--format"){let v=args[++i];if(v===void 0)usageError("--format requires a value (json, csv, or table)");format=coerceFormat(v)}else if(a.startsWith("--format="))format=coerceFormat(a.slice(9));else usageError(`unexpected argument "${a}"`)}return format}function coerceFormat(value){if(value==="json"||value==="csv"||value==="table")return value;usageError(`unknown format "${value}" (expected json, csv, or table)`)}function csvCell(value){if(/[",\r\n]/.test(value))return`"${value.replace(/"/g,'""')}"`;return value}function renderCsv(rows){let lines=[COLUMNS.join(",")];for(let row of rows)lines.push(COLUMNS.map((c)=>csvCell(row[c])).join(","));return lines.join(`
7
+ `)}function padCell(cell,width){return cell+" ".repeat(Math.max(0,width-displayWidth(cell)))}function renderTable(rows){let widths={};for(let c of COLUMNS)widths[c]=Math.max(displayWidth(c),...rows.map((r)=>displayWidth(r[c])));let line=(cells)=>COLUMNS.map((c)=>padCell(cells[c],widths[c])).join(" ").trimEnd(),header={};for(let c of COLUMNS)header[c]=c;return[line(header),...rows.map(line)].join(`
8
+ `)}function renderExport(tasks,format){let rows=tasks.map(toRow);if(format==="json")return JSON.stringify(rows,null,2);if(format==="csv")return renderCsv(rows);return renderTable(rows)}async function runExportSubcommand(args){if(args.includes("--help")||args.includes("-h")||args.includes("help")){process.stdout.write(`${EXPORT_USAGE}
9
+ `);return}let format=parseFormat(args),{TaskIndexStore}=await import("./chunk-ncsgawg7.js"),store=new TaskIndexStore;await store.load();let tasks=store.list();if(tasks.length===0&&format==="table"){process.stdout.write(`no tasks
10
+ `);return}process.stdout.write(`${renderExport(tasks,format)}
11
+ `)}export{runExportSubcommand,renderExport};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{applyOnboardingChoices,detectShell,envReadyForTasks,installCompletions,maybeRunOnboarding}from"./chunk-cb0pgyq1.js";import"./chunk-0r8333z3.js";import"./chunk-np07kccr.js";import"./chunk-hgq2gtxx.js";import"./chunk-g1ybdgad.js";import"./chunk-dnb2bmtb.js";import"./chunk-q7dr9eh6.js";import"./chunk-jvxh93nz.js";import"./chunk-q9x6d0k6.js";import"./chunk-w298ayjc.js";import"./chunk-sdyzxayr.js";import"./chunk-gbasmvsc.js";import"./chunk-yhcz2d2r.js";import"./chunk-df7qe9y7.js";import"./chunk-gwcneg6c.js";import"./chunk-7nhdvr5v.js";import"./chunk-2fypr41w.js";import"./chunk-k3ksts6g.js";import"./chunk-gjf604bb.js";import"./chunk-qtke4x42.js";import"./chunk-xy8be792.js";import"./chunk-2brn8e1y.js";import"./chunk-9c1e5z6a.js";import"./chunk-6dn6h640.js";import"./chunk-h82kzdsn.js";import"./chunk-ef11h2am.js";import"./chunk-8ddjfc2v.js";import"./chunk-cb2fpajx.js";import"./chunk-grh6dvfv.js";import"./chunk-pw6yfj10.js";import"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";export{maybeRunOnboarding,installCompletions,envReadyForTasks,detectShell,applyOnboardingChoices};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{migrateRoveClientStateLayout}from"./chunk-8ddjfc2v.js";import{LEGACY_KOBE_PRODUCT_NAME,ROVE_PRODUCT_NAME}from"./chunk-cb2fpajx.js";import{installRoveEnvCompatibility}from"./chunk-3bfm4hrs.js";var INVOKED_AS_ENV="ROVE_INVOKED_AS";function markRoveInvocation(env=process.env){env[INVOKED_AS_ENV]=ROVE_PRODUCT_NAME}function markKobeInvocation(env=process.env){env[INVOKED_AS_ENV]=LEGACY_KOBE_PRODUCT_NAME}function prepareCliEnvironment(env=process.env){installRoveEnvCompatibility(env)}function prepareCliStateLayout(env=process.env){let result=migrateRoveClientStateLayout(env);for(let warning of result.warnings)console.error(`[rove] state migration will retry: ${warning}`)}function activeCliName(env=process.env){return env[INVOKED_AS_ENV]===ROVE_PRODUCT_NAME?ROVE_PRODUCT_NAME:LEGACY_KOBE_PRODUCT_NAME}
3
+ export{markRoveInvocation,markKobeInvocation,prepareCliEnvironment,prepareCliStateLayout,activeCliName};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ var IDENTITY_VARS=new Set(["TERM_PROGRAM","TERM_PROGRAM_VERSION","TERM_SESSION_ID","TERM_FEATURES","LC_TERMINAL","LC_TERMINAL_VERSION","__CFBundleIdentifier","VTE_VERSION","WT_SESSION","WT_PROFILE_ID","TMUX","TMUX_PANE","ZELLIJ","STY","WINDOW"]),IDENTITY_PREFIXES=["ITERM_","KITTY_","GHOSTTY_","WEZTERM_","ALACRITTY_","KONSOLE_","ZELLIJ_"];function embeddedTerminalEnv(base,overrides={}){let env={};for(let[key,value]of Object.entries(base)){if(IDENTITY_VARS.has(key))continue;if(IDENTITY_PREFIXES.some((prefix)=>key.startsWith(prefix)))continue;env[key]=value}return{...env,...overrides}}
3
+ export{embeddedTerminalEnv};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{defaultClientLogPath,defaultDaemonLogPath,defaultDaemonPidPath,defaultDaemonSocketPath,defaultPtyExitsPath,defaultPtyFreezeDir,defaultPtyHostLogPath,defaultPtyHostPidPath,defaultPtyHostSocketPath,defaultWebTokenPath,fitSocketPath,isWindowsPipePath,legacyDaemonPidPath,legacyDaemonSocketPath,legacyPtyHostPidPath,legacyPtyHostSocketPath,legacyRuntimePath,resolveDaemonHomeDir,shortHomeTag,windowsPipePath}from"./chunk-x760j10f.js";import"./chunk-3bfm4hrs.js";import"./chunk-wqfp8d9w.js";export{windowsPipePath,shortHomeTag,resolveDaemonHomeDir,legacyRuntimePath,legacyPtyHostSocketPath,legacyPtyHostPidPath,legacyDaemonSocketPath,legacyDaemonPidPath,isWindowsPipePath,fitSocketPath,defaultWebTokenPath,defaultPtyHostSocketPath,defaultPtyHostPidPath,defaultPtyHostLogPath,defaultPtyFreezeDir,defaultPtyExitsPath,defaultDaemonSocketPath,defaultDaemonPidPath,defaultDaemonLogPath,defaultClientLogPath};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{getCustomEngineIds,getPersistedString,setPersistedString}from"./chunk-k3ksts6g.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";import{isBuiltinVendor}from"./chunk-h82kzdsn.js";var REPO_KEY_PREFIX="lastActiveVendor.";function validVendor(value,customIds){let v=value?.trim();if(!v)return;if(isBuiltinVendor(v)||customIds.includes(v))return v;return}function getRepoLastActiveVendor(repo){return validVendor(getPersistedString(REPO_KEY_PREFIX+repo),getCustomEngineIds())}function setRepoLastActiveVendor(repo,vendor){setPersistedString(REPO_KEY_PREFIX+repo,vendor)}function getGlobalDefaultVendor(){let customIds=getCustomEngineIds();return validVendor(getPersistedString("defaultVendor"),customIds)??validVendor(getPersistedString("lastSelectedVendor"),customIds)}function setGlobalDefaultVendor(vendor){setPersistedString("defaultVendor",vendor)}function resolvePreferredVendor(repo){return(repo?getRepoLastActiveVendor(repo):void 0)??getGlobalDefaultVendor()??DEFAULT_TASK_VENDOR}
3
+ export{getRepoLastActiveVendor,setRepoLastActiveVendor,getGlobalDefaultVendor,setGlobalDefaultVendor,resolvePreferredVendor};