@sma1lboy/rove 0.9.266 → 0.9.267
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/{chunk-e69s8s16.js → chunk-02htajas.js} +3 -3
- package/dist/cli/chunk-0bcs1v6n.js +2 -0
- package/dist/cli/{chunk-7wsxppwc.js → chunk-0fejmkz1.js} +1 -1
- package/dist/cli/{chunk-gskbzgc3.js → chunk-0g4wc808.js} +1 -1
- package/dist/cli/chunk-0t0ykzek.js +2 -0
- package/dist/cli/chunk-1b3pq6g6.js +2 -0
- package/dist/cli/{chunk-tz3eftty.js → chunk-1qvrn21x.js} +1 -1
- package/dist/cli/chunk-1z1tjqyy.js +3 -0
- package/dist/cli/{chunk-yk498qwr.js → chunk-1z2sze0v.js} +1 -1
- package/dist/cli/{chunk-3zsm2jbm.js → chunk-2a19815h.js} +2 -2
- package/dist/cli/chunk-2gc4kqrt.js +2 -0
- package/dist/cli/chunk-2geegpp7.js +2 -0
- package/dist/cli/chunk-2jzaabcy.js +11 -0
- package/dist/cli/{chunk-ag3txfg2.js → chunk-2r1fgng9.js} +1 -1
- package/dist/cli/{chunk-n3f5sdka.js → chunk-32j6y5d1.js} +1 -1
- package/dist/cli/{chunk-rbr6qapz.js → chunk-3gegmpff.js} +1 -1
- package/dist/cli/{chunk-8vkma6c4.js → chunk-3nf9zbm7.js} +1 -1
- package/dist/cli/{chunk-zprhxt1q.js → chunk-3qkhxem2.js} +1 -1
- package/dist/cli/chunk-3xrbb1yv.js +2 -0
- package/dist/cli/{chunk-31jxjkrq.js → chunk-48ynmrd8.js} +1 -1
- package/dist/cli/{chunk-b3pm5nvh.js → chunk-4bfwafzg.js} +1 -1
- package/dist/cli/{chunk-8saxdp88.js → chunk-4fa35dbn.js} +1 -1
- package/dist/cli/{chunk-ejd307we.js → chunk-4kdakncb.js} +1 -1
- package/dist/cli/{chunk-mr0z23fd.js → chunk-57qny54a.js} +1 -1
- package/dist/cli/chunk-5d3p4rqv.js +2 -0
- package/dist/cli/{chunk-hc6qpkpy.js → chunk-5m1ef9ez.js} +2 -2
- package/dist/cli/{chunk-wvaf3d9j.js → chunk-5r4d0h87.js} +1 -1
- package/dist/cli/chunk-5vetsh77.js +4 -0
- package/dist/cli/chunk-66zvkh5z.js +2 -0
- package/dist/cli/chunk-6xsc9crp.js +4 -0
- package/dist/cli/{chunk-7c4zdjr5.js → chunk-6z02cd58.js} +1 -1
- package/dist/cli/{chunk-ye4vt96f.js → chunk-7ag59vyh.js} +9 -7
- package/dist/cli/{chunk-hq3hd8qr.js → chunk-7maf6x1g.js} +1 -1
- package/dist/cli/{chunk-3342qzve.js → chunk-7mwvvj46.js} +1 -1
- package/dist/cli/{chunk-me656p3n.js → chunk-835qwnnq.js} +2 -2
- package/dist/cli/chunk-84m0d72d.js +2 -0
- package/dist/cli/chunk-85m74thf.js +31 -0
- package/dist/cli/{chunk-tdhk4dz8.js → chunk-8t7qbr1e.js} +1 -1
- package/dist/cli/{chunk-yztr951z.js → chunk-a0rz9g11.js} +1 -1
- package/dist/cli/{chunk-qpr14v8x.js → chunk-a4znycsh.js} +1 -1
- package/dist/cli/{chunk-kvwqh35r.js → chunk-a569ctz6.js} +1 -1
- package/dist/cli/{chunk-3x0ryj15.js → chunk-acqcph62.js} +1 -1
- package/dist/cli/chunk-ak0frbbw.js +3 -0
- package/dist/cli/chunk-ankt6yse.js +2 -0
- package/dist/cli/{chunk-80jqznbm.js → chunk-av482xxw.js} +1 -1
- package/dist/cli/chunk-awgsda64.js +2 -0
- package/dist/cli/chunk-axjcmamn.js +2 -0
- package/dist/cli/chunk-azpvsc5d.js +2 -0
- package/dist/cli/{chunk-zh0c8yzw.js → chunk-bejhca6z.js} +1 -1
- package/dist/cli/chunk-bm2baazf.js +2 -0
- package/dist/cli/{chunk-wqckm0k6.js → chunk-br8r72bf.js} +1 -1
- package/dist/cli/{chunk-sdya3r5j.js → chunk-bvsjep6w.js} +1 -1
- package/dist/cli/{chunk-1vtfzcca.js → chunk-c1dz3qg3.js} +1 -1
- package/dist/cli/{chunk-2gjrfqhs.js → chunk-c25vea1q.js} +1 -1
- package/dist/cli/{chunk-qwz9728j.js → chunk-cangy5wn.js} +1 -1
- package/dist/cli/chunk-dhcx1gna.js +3 -0
- package/dist/cli/chunk-e7h7w4n0.js +4 -0
- package/dist/cli/{chunk-sr4c9fve.js → chunk-eckrcmtz.js} +1 -1
- package/dist/cli/{chunk-7zyyvc3d.js → chunk-eqa843hf.js} +1 -1
- package/dist/cli/{chunk-n0rtj4z7.js → chunk-eqdbfgq5.js} +1 -1
- package/dist/cli/{chunk-cbc1h345.js → chunk-eyrt04mg.js} +1 -2
- package/dist/cli/{chunk-3126c9x9.js → chunk-f09ex46c.js} +1 -1
- package/dist/cli/{chunk-szjgjrar.js → chunk-f2bqrzsy.js} +1 -1
- package/dist/cli/chunk-f8gg8cqh.js +3 -0
- package/dist/cli/{chunk-wyn3zbh4.js → chunk-f8w52tsz.js} +2 -2
- package/dist/cli/{chunk-qs0526nj.js → chunk-fcnd49ce.js} +1 -1
- package/dist/cli/{chunk-ek6kywem.js → chunk-fcqtqpm1.js} +1 -1
- package/dist/cli/chunk-fjvefbnr.js +16 -0
- package/dist/cli/chunk-fvvb0072.js +3 -0
- package/dist/cli/{chunk-b4zqkdyq.js → chunk-ga412sby.js} +1 -1
- package/dist/cli/{chunk-5v02t4pz.js → chunk-gak4aag4.js} +25 -8
- package/dist/cli/{chunk-vxc90473.js → chunk-gg5f2ayw.js} +1 -1
- package/dist/cli/{chunk-30g1bgkg.js → chunk-ggnq2vvk.js} +1 -1
- package/dist/cli/{chunk-4018sjy3.js → chunk-ghkr7f4t.js} +1 -1
- package/dist/cli/{chunk-41x1hrqe.js → chunk-gq36nzg8.js} +1 -1
- package/dist/cli/{chunk-mh2s5ttr.js → chunk-gqh6atvp.js} +2 -2
- package/dist/cli/{chunk-y078swzq.js → chunk-gs6j7y6q.js} +1 -1
- package/dist/cli/chunk-gytx47yk.js +3 -0
- package/dist/cli/{chunk-1jz7ppsy.js → chunk-h6bbe9nd.js} +1 -1
- package/dist/cli/{chunk-9g2faw9a.js → chunk-h8t4xg1p.js} +1 -1
- package/dist/cli/{chunk-re15t5r1.js → chunk-heajz5tw.js} +1 -1
- package/dist/cli/{chunk-yadx0wc5.js → chunk-hf168gph.js} +1 -1
- package/dist/cli/{chunk-1ys1maw7.js → chunk-hsy5gebc.js} +1 -1
- package/dist/cli/{chunk-cajrtabt.js → chunk-hv79ys32.js} +1 -1
- package/dist/cli/{chunk-mb018hfg.js → chunk-hy0r635n.js} +3 -3
- package/dist/cli/{chunk-812et2xk.js → chunk-j1z9kgyd.js} +1 -1
- package/dist/cli/{chunk-w196jkg5.js → chunk-jj5f4n51.js} +1 -1
- package/dist/cli/{chunk-z80jjarw.js → chunk-jp8vfwqm.js} +1 -1
- package/dist/cli/chunk-kcd1w62f.js +2 -0
- package/dist/cli/{chunk-tshbjft4.js → chunk-ke19jzhg.js} +2 -2
- package/dist/cli/chunk-kq01awhv.js +3 -0
- package/dist/cli/{chunk-kmgheesn.js → chunk-krnacq08.js} +2 -2
- package/dist/cli/{chunk-t6hzyee7.js → chunk-kwyxwcr8.js} +1 -1
- package/dist/cli/chunk-kx7b5nht.js +11 -0
- package/dist/cli/{chunk-a42j8eek.js → chunk-mj7nfaaf.js} +1 -1
- package/dist/cli/{chunk-c47gag5r.js → chunk-mvnz68vh.js} +1 -1
- package/dist/cli/{chunk-j1fe3j54.js → chunk-mzk4p07t.js} +2 -2
- package/dist/cli/chunk-n1tfhd48.js +2 -0
- package/dist/cli/{chunk-rtkj4wdw.js → chunk-n1v59qgs.js} +2 -2
- package/dist/cli/{chunk-drt79f2t.js → chunk-n2j5sk0g.js} +1 -1
- package/dist/cli/chunk-npnbq79j.js +2 -0
- package/dist/cli/{chunk-5srsjs7r.js → chunk-nw4p86t1.js} +1 -1
- package/dist/cli/{chunk-dzmfexh8.js → chunk-p4fjynez.js} +1 -1
- package/dist/cli/{chunk-8sksdq95.js → chunk-p6jw0zcd.js} +1 -1
- package/dist/cli/{chunk-ve348rmz.js → chunk-p9t6ye6t.js} +2 -2
- package/dist/cli/{chunk-amc17enx.js → chunk-pv2334ak.js} +1 -1
- package/dist/cli/chunk-pxdnc5mz.js +91 -0
- package/dist/cli/{chunk-4rya4jmx.js → chunk-qeya7dv5.js} +2 -2
- package/dist/cli/{chunk-6a70wv2b.js → chunk-qgrg9a5n.js} +1 -1
- package/dist/cli/{chunk-4z01vg3t.js → chunk-qnpkhvrn.js} +1 -1
- package/dist/cli/{chunk-cgxgqc87.js → chunk-qykg15ks.js} +1 -1
- package/dist/cli/{chunk-625773dm.js → chunk-r0etc6vp.js} +1 -1
- package/dist/cli/chunk-r40aj7z6.js +2 -0
- package/dist/cli/{chunk-jrqtzp35.js → chunk-r67c54hn.js} +1 -1
- package/dist/cli/chunk-ra1m0gs4.js +3 -0
- package/dist/cli/{chunk-m6pp9gaf.js → chunk-rfp0ayra.js} +1 -1
- package/dist/cli/chunk-rn08whn3.js +20 -0
- package/dist/cli/chunk-s3cvbp3a.js +3 -0
- package/dist/cli/chunk-s4ghfrr9.js +2 -0
- package/dist/cli/chunk-s4nrmbqh.js +13 -0
- package/dist/cli/{chunk-p2vagan3.js → chunk-s7mzpdgb.js} +1 -1
- package/dist/cli/{chunk-tgfn5ykb.js → chunk-sfn4s219.js} +1 -1
- package/dist/cli/chunk-sq6zj3fb.js +5 -0
- package/dist/cli/{chunk-n9w0026r.js → chunk-tca0hx96.js} +1 -1
- package/dist/cli/{chunk-xh72jz7c.js → chunk-tst79jmx.js} +1 -1
- package/dist/cli/{chunk-mtw6nce9.js → chunk-twjt04z3.js} +1 -1
- package/dist/cli/{chunk-qga9xd2f.js → chunk-v8nvfyd4.js} +1 -1
- package/dist/cli/{chunk-m8shvh3j.js → chunk-v967kt9x.js} +1 -1
- package/dist/cli/{chunk-w78n33b8.js → chunk-vckr5yvb.js} +1 -1
- package/dist/cli/{chunk-67qa9eca.js → chunk-vd6z4v6p.js} +1 -1
- package/dist/cli/{chunk-gvmgabps.js → chunk-wa7jswp3.js} +1 -1
- package/dist/cli/{chunk-agt2sdaw.js → chunk-wd9n7cwz.js} +6 -6
- package/dist/cli/chunk-x4s60mnd.js +2 -0
- package/dist/cli/chunk-xex81qeb.js +2 -0
- package/dist/cli/{chunk-bwr6dygx.js → chunk-xfgqae9t.js} +1 -1
- package/dist/cli/chunk-xt543e2h.js +3 -0
- package/dist/cli/{chunk-z72f3d9m.js → chunk-xymn760d.js} +17 -17
- package/dist/cli/chunk-y1xnjx8x.js +4 -0
- package/dist/cli/chunk-y7a8h5xe.js +2 -0
- package/dist/cli/chunk-y8b2p44q.js +2 -0
- package/dist/cli/{chunk-yyjskza5.js → chunk-ycd28edp.js} +1 -1
- package/dist/cli/chunk-yfvt96ar.js +3 -0
- package/dist/cli/{chunk-rwmxpjrx.js → chunk-ykyertq9.js} +1 -1
- package/dist/cli/chunk-yssxs1fn.js +3 -0
- package/dist/cli/{chunk-z3zaa155.js → chunk-yzkhwn31.js} +1 -1
- package/dist/cli/{chunk-prqeddy7.js → chunk-z1nj22va.js} +1 -1
- package/dist/cli/chunk-z7d7gk7p.js +2 -0
- package/dist/cli/{chunk-0sm0wcx9.js → chunk-zg66t7k9.js} +1 -1
- package/dist/cli/chunk-zy2jdze4.js +3 -0
- package/dist/cli/index.js +8 -8
- package/dist/cli/pty-host-node.mjs +29 -7
- package/dist/cli/rove-run.js +1 -1
- package/dist/cli/rove.js +1 -1
- package/dist/completions/rove.bash +1 -1
- package/dist/completions/rove.fish +1 -1
- package/dist/completions/rove.zsh +1 -1
- package/dist/skills/rove/SKILL.md +25 -20
- package/dist/skills/rove/references/api-flags.md +3 -1
- package/dist/web/assets/index-BM0Pt6E-.js +111 -0
- package/dist/web/assets/index-DneB7YXQ.css +1 -0
- package/dist/web/index.html +2 -2
- package/dist/web-ui/assets/{harness-dYkQBfYz.js → harness-pEyVtWV4.js} +1 -1
- package/dist/web-ui/assets/index-Bsn8NuKa.css +1 -0
- package/dist/web-ui/assets/{index-ByMdqeTv.js → index-Dyg-qcgB.js} +2 -2
- package/dist/web-ui/index.html +2 -2
- package/package.json +3 -3
- package/dist/cli/chunk-09sfrqkr.js +0 -2
- package/dist/cli/chunk-1bmhygwd.js +0 -2
- package/dist/cli/chunk-1gawhhd0.js +0 -3
- package/dist/cli/chunk-1nrva2m2.js +0 -11
- package/dist/cli/chunk-1pg3247n.js +0 -16
- package/dist/cli/chunk-2gk96h3f.js +0 -2
- package/dist/cli/chunk-2vrx0pmv.js +0 -2
- package/dist/cli/chunk-4250pw6r.js +0 -3
- package/dist/cli/chunk-4b9f565d.js +0 -2
- package/dist/cli/chunk-4dsyczce.js +0 -2
- package/dist/cli/chunk-4gngf0mt.js +0 -70
- package/dist/cli/chunk-4sj2sqyt.js +0 -2
- package/dist/cli/chunk-56n0whme.js +0 -2
- package/dist/cli/chunk-696sqb6j.js +0 -2
- package/dist/cli/chunk-7nrzkqt5.js +0 -3
- package/dist/cli/chunk-aeswyjhk.js +0 -3
- package/dist/cli/chunk-b39sdtt0.js +0 -3
- package/dist/cli/chunk-b7xjhgts.js +0 -4
- package/dist/cli/chunk-bav3bh70.js +0 -4
- package/dist/cli/chunk-bc72rgkm.js +0 -2
- package/dist/cli/chunk-bnv1mm5h.js +0 -4
- package/dist/cli/chunk-chzn3px6.js +0 -31
- package/dist/cli/chunk-cqsc0wmp.js +0 -20
- package/dist/cli/chunk-g1px1rk6.js +0 -9
- package/dist/cli/chunk-kg8k1rar.js +0 -2
- package/dist/cli/chunk-m86qk3za.js +0 -2
- package/dist/cli/chunk-njvz867e.js +0 -2
- package/dist/cli/chunk-nyw4s1pv.js +0 -2
- package/dist/cli/chunk-pcqw7r50.js +0 -2
- package/dist/cli/chunk-qdvtz853.js +0 -3
- package/dist/cli/chunk-r4vfng2z.js +0 -2
- package/dist/cli/chunk-r6k3ve2g.js +0 -3
- package/dist/cli/chunk-s0gp5b9p.js +0 -10
- package/dist/cli/chunk-s27a0ckk.js +0 -3
- package/dist/cli/chunk-sgngkkp3.js +0 -2
- package/dist/cli/chunk-spee6wv8.js +0 -3
- package/dist/cli/chunk-swxq6yak.js +0 -2
- package/dist/cli/chunk-trhrdby1.js +0 -4
- package/dist/cli/chunk-tvbbnfp2.js +0 -2
- package/dist/cli/chunk-xgans9wf.js +0 -3
- package/dist/cli/chunk-xm7a6swz.js +0 -2
- package/dist/cli/chunk-y87f04kk.js +0 -2
- package/dist/cli/chunk-ywwm92e5.js +0 -2
- package/dist/cli/chunk-z5g3twhn.js +0 -2
- package/dist/cli/chunk-z99ynm4r.js +0 -3
- package/dist/web/assets/index-BsbDxm3K.js +0 -109
- package/dist/web/assets/index-DNv-oxrT.css +0 -1
- package/dist/web-ui/assets/index-nMJ42IGm.css +0 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{quoteShellArg,quoteShellArgv}from"./chunk-7kysxgbq.js";import{spawn,spawnSync}from"child_process";import{existsSync}from"fs";import{mkdir,readFile as readFileAsync,readdir as readdirAsync}from"fs/promises";var shQuote=quoteShellArg,shJoin=quoteShellArgv;function shToken(s){return/^[A-Za-z0-9_@%+=:,./-]+$/.test(s)?s:quoteShellArg(s)}function remoteShellCommand(command,cwd){return cwd?`cd ${shQuote(cwd)} && ${command}`:command}function remoteEnvPrefix(env){if(!env)return"";let pairs=Object.entries(env).filter(([key])=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(key));if(pairs.length===0)return"";return`${pairs.map(([key,value])=>`${key}=${shQuote(value)}`).join(" ")} `}function sshConnectArgs(spec,opts={}){let argv=["ssh"];if(opts.tty)argv.push("-tt");if(opts.batch)argv.push("-o","BatchMode=yes");if(argv.push("-o","ControlMaster=auto","-o",`ControlPath=${spec.controlPath}`,"-o","ControlPersist=300"),argv.push("-o","StrictHostKeyChecking=accept-new"),spec.port)argv.push("-p",String(spec.port));if(spec.auth.kind==="key"&&spec.auth.keyPath)argv.push("-i",spec.auth.keyPath);return argv.push(`${spec.user}@${spec.host}`),argv}function spawnCollect(argv,opts={}){return new Promise((resolve)=>{let[cmd,...rest]=argv,stdout="",stderr="",settled=!1,finish=(exitCode)=>{if(settled)return;settled=!0,resolve({stdout,stderr,exitCode})},child;try{child=spawn(cmd??"",rest,{cwd:opts.cwd,env:opts.env,shell:!1,signal:opts.signal})}catch{finish(-1);return}child.stdout?.setEncoding("utf8"),child.stdout?.on("data",(d)=>{stdout+=d}),child.stderr?.setEncoding("utf8"),child.stderr?.on("data",(d)=>{stderr+=d,opts.onStderr?.(d)}),child.on("error",()=>finish(-1)),child.on("close",(code)=>finish(code??-1))})}class LocalExecHost{isRemote=!1;run(argv,opts={}){return spawnCollect(argv,{cwd:opts.cwd,env:opts.env?{...process.env,...opts.env}:process.env,signal:opts.signal,onStderr:opts.onStderr})}async exists(path){return existsSync(path)}async mkdirp(path){await mkdir(path,{recursive:!0})}async readFile(path){try{return await readFileAsync(path,"utf8")}catch{return null}}async readdir(path){try{return await readdirAsync(path)}catch{return[]}}wrapCommand(command){return command}ensureReady(){}}var defaultSpawner=(argv,env)=>{let[cmd,...rest]=argv,proc=spawnSync(cmd??"",rest,{env:env?{...process.env,...env}:process.env,encoding:"utf8",shell:!1});return{stdout:proc.stdout??"",stderr:proc.stderr??"",exitCode:proc.status??-1}},defaultAsyncSpawner=(argv,env,opts)=>spawnCollect(argv,{env:env?{...process.env,...env}:process.env,signal:opts?.signal,onStderr:opts?.onStderr});class RemoteExecHost{spec;spawn;isRemote=!0;masterUp=!1;spawnAsync;constructor(spec,spawn2=defaultSpawner,spawnAsync){this.spec=spec;this.spawn=spawn2;this.spawnAsync=spawnAsync??(this.spawn===defaultSpawner?defaultAsyncSpawner:async(argv,env)=>this.spawn(argv,env))}ensureReady(){if(this.masterUp)return;if(this.spawn([...sshConnectArgs(this.spec,{batch:!0}),"-O","check"]).exitCode===0){this.masterUp=!0;return}let base=[...sshConnectArgs(this.spec,{batch:this.spec.auth.kind!=="password"}),"-fN"];if(this.spec.auth.kind==="password"){let pw=this.spec.auth.getPassword();if(pw!=null){this.spawn(["sshpass","-e",...base],{SSHPASS:pw}),this.masterUp=!0;return}}this.spawn(base),this.masterUp=!0}async run(argv,opts={}){this.ensureReady();let remote=remoteShellCommand(`${remoteEnvPrefix(opts.env)}${shJoin(argv)}`,opts.cwd),result=await this.spawnAsync([...sshConnectArgs(this.spec,{batch:!0}),remote],void 0,{signal:opts.signal,onStderr:opts.onStderr});if(result.exitCode===255)this.masterUp=!1;return result}async exists(path){return(await this.run(["test","-e",path])).exitCode===0}async mkdirp(path){await this.run(["mkdir","-p",path])}async readFile(path){let r=await this.run(["cat",path]);return r.exitCode===0?r.stdout:null}async readdir(path){let r=await this.run(["ls","-1A",path]);if(r.exitCode!==0)return[];return r.stdout.split(`
|
|
3
|
+
`).filter((s)=>s.length>0)}wrapCommand(command,opts={}){let remote=remoteShellCommand(command,opts.cwd);return`${sshConnectArgs(this.spec,{tty:opts.tty}).map(shToken).join(" ")} ${shQuote(remote)}`}}
|
|
4
|
+
export{shQuote,LocalExecHost,RemoteExecHost};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{MachineHub}from"./chunk-ak0frbbw.js";import"./chunk-1z1tjqyy.js";import"./chunk-atn06ncf.js";import"./chunk-55ajzrj6.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-6xppe9bj.js";import"./chunk-dhcx1gna.js";import"./chunk-sq6zj3fb.js";import"./chunk-s4nrmbqh.js";import"./chunk-y1xnjx8x.js";import"./chunk-sfn4s219.js";import"./chunk-v8nvfyd4.js";import"./chunk-gak4aag4.js";import"./chunk-xy8be792.js";import"./chunk-7kysxgbq.js";import"./chunk-p4fjynez.js";import"./chunk-40dgv828.js";import"./chunk-32j6y5d1.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-yt15y085.js";import"./chunk-cmp64q4j.js";import"./chunk-krnacq08.js";import"./chunk-f2bqrzsy.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";var PUBLISH_DEBOUNCE_MS=50;function startDaemonMachineHub(bus){let hub=new MachineHub,timer=null,publish=()=>{timer=null;let live=hub.liveSignal().get(),payload={machines:hub.machinesSignal().get(),tasks:hub.tasksSignal().get().map((task)=>({...task,kind:task.kind??"task",pinned:task.pinned??!1})),live:{activity:Object.fromEntries(live.activity),changes:Object.fromEntries(live.changes),tokens:Object.fromEntries(live.tokens)}};bus.publish("machines",payload)},schedule=()=>{timer??=setTimeout(publish,PUBLISH_DEBOUNCE_MS)},stops=[hub.machinesSignal(),hub.tasksSignal(),hub.liveSignal()].map((signal)=>signal.subscribe(schedule)),lastRegistry=null,offState=bus.onPublish((event)=>{if(event.channel!=="state")return;let state=event.payload.state,text=JSON.stringify(state.machines??null);if(text===lastRegistry)return;lastRegistry=text,hub.sync()});return hub.sync(),publish(),()=>{offState();for(let stop of stops)stop();if(timer)clearTimeout(timer);hub.dispose(),bus.publish("machines",{machines:[],tasks:[],live:{activity:{},changes:{},tokens:{}}})}}export{startDaemonMachineHub};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{readLastActiveTaskId,writeLastActiveTaskId}from"./chunk-c1dz3qg3.js";import"./chunk-32j6y5d1.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-yt15y085.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";export{writeLastActiveTaskId,readLastActiveTaskId};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{BUNDLED_THEME_JSONS,userThemesDir,validateTheme}from"./chunk-
|
|
2
|
+
import{BUNDLED_THEME_JSONS,userThemesDir,validateTheme}from"./chunk-yzkhwn31.js";import{expandTilde}from"./chunk-2r1fgng9.js";import{errorMessage}from"./chunk-2brn8e1y.js";import"./chunk-7ghwdjdc.js";import{SUBCOMMAND_VERBS}from"./chunk-tjj9bt7n.js";import"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-pn5ygqn6.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";import{existsSync,mkdirSync,readFileSync,readdirSync,unlinkSync,writeFileSync}from"fs";import{basename,join,resolve}from"path";var CLI_NAME=ROVE_PRODUCT_NAME,THEME_VERB_ALIASES={ls:"list",rm:"remove"},BUNDLED_NAMES=Object.keys(BUNDLED_THEME_JSONS);function fail(message){process.stderr.write(`${CLI_NAME} theme: ${message}
|
|
3
3
|
Run ${CLI_NAME} theme --help for valid names and options.
|
|
4
4
|
`),process.exit(1)}function failUsage(message){process.stderr.write(`${CLI_NAME} theme: ${message}
|
|
5
5
|
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{pathSyntax}from"./chunk-pn5ygqn6.js";function childrenOf(tasks,id){return tasks.filter((task)=>task.parentTaskId===id)}function isSharedChild(task){return task.sharesWorkspaceOf!==void 0}function subtreeIds(tasks,id){let out=[],seen=new Set,visit=(current)=>{if(seen.has(current))return;seen.add(current);for(let child of childrenOf(tasks,current))visit(child.id);out.push(current)};return visit(id),out}function taskCwd(task){let root=task.worktreePath??"";if(!root||!task.cwdSubpath)return root;return pathSyntax(root).join(root,task.cwdSubpath)}
|
|
3
|
+
export{childrenOf,isSharedChild,subtreeIds,taskCwd};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{getKeychainPassword,isKeychainSupported,remoteKeychainRef,setKeychainPassword}from"./chunk-sak1tphp.js";import{RemoteExecHost}from"./chunk-
|
|
2
|
+
import{getKeychainPassword,isKeychainSupported,remoteKeychainRef,setKeychainPassword}from"./chunk-sak1tphp.js";import{RemoteExecHost}from"./chunk-y1xnjx8x.js";import{errorMessage}from"./chunk-2brn8e1y.js";import"./chunk-7kysxgbq.js";import{addRemoteRepo,isRemoteProjectsEnabled}from"./chunk-rfp0ayra.js";import"./chunk-40dgv828.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import{remoteControlSocketPath}from"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-yt15y085.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";import{createInterface}from"readline";var CLI_NAME=ROVE_PRODUCT_NAME,USAGE=`Usage: ${CLI_NAME} add --remote --host <host> --user <user> --path <basePath>
|
|
3
3
|
[--port N] [--key [path] | --password]
|
|
4
4
|
|
|
5
5
|
Register an experimental SSH-backed project. Worktrees are created on <host>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{ensureForwards}from"./chunk-dhcx1gna.js";import{dedupeMachines,discoverMachine,learnedFrom,listMachines,localDaemonSocketPath,localPtySocketPath,updateMachine}from"./chunk-s4nrmbqh.js";import{findCheckouts,isLocalCheckout,parseRepoRef,repoIdentity,unpushedCommits}from"./chunk-48ynmrd8.js";import{ApiError}from"./chunk-f09ex46c.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{getSavedRepos}from"./chunk-rfp0ayra.js";import{RoveDaemonClient}from"./chunk-krnacq08.js";import{ROVE_API_VERSION}from"./chunk-f2bqrzsy.js";import{hostname}from"os";var LOCAL_MACHINE="local";async function machineDaemonSocket(entry){let socketPath=localDaemonSocketPath(entry.alias);if(await answers(socketPath))return socketPath;if(!entry.sockets||!await forward(entry,entry.sockets))return null;if(await answers(socketPath))return socketPath;let found=await discoverMachine(entry.alias,entry);if(!found.ok)return null;let learned=learnedFrom(found);return updateMachine(entry.alias,learned),await forward({...entry,...learned},learned.sockets)&&await answers(socketPath)?socketPath:null}function forward(entry,sockets){return ensureForwards({alias:entry.alias,config:{...entry,sockets},remoteDaemonSocket:sockets.daemon,remotePtySocket:sockets.pty})}async function answers(socketPath){let client=new RoveDaemonClient(socketPath);try{return await client.request("hello",{}),!0}catch{return!1}finally{client.close()}}async function machineTasks(entry){let socketPath=await machineDaemonSocket(entry);if(!socketPath)return null;let client=new RoveDaemonClient(socketPath);try{return(await client.request("task.list")).tasks??[]}catch{return null}finally{client.close()}}function requireMachine(alias){let entry=listMachines().find((m)=>m.alias===alias);if(entry)return entry;throw new ApiError(`no machine named "${alias}"`,"UNKNOWN_MACHINE",{hint:"list the registered machines and retry with one of their aliases, or register it first",nextCommandArgs:["machine","list"]})}var AUTO_MACHINE="auto",busy=(tasks)=>tasks.filter((task)=>task.status==="in_progress").length;async function pickMachine(localTasks,readTasks=machineTasks,machines=dedupeMachines(listMachines()),hosts){let[local,...remote]=await Promise.all([localTasks().catch(()=>[]),...machines.map((entry)=>readTasks(entry))]),loads={[LOCAL_MACHINE]:busy(local)};machines.forEach((entry,i)=>{let tasks=remote[i];if(tasks)loads[entry.alias]=busy(tasks)});let pool=[null,...machines.filter((entry)=>loads[entry.alias]!==void 0)],skipped;if(hosts){let ok=await Promise.all(pool.map((entry)=>hosts(entry).catch(()=>!1)));if(ok.some(Boolean))skipped=pool.filter((_,i)=>!ok[i]).map((entry)=>entry?.alias??LOCAL_MACHINE),pool=pool.filter((_,i)=>ok[i])}let best=null,bestLoad=Number.POSITIVE_INFINITY;for(let entry of pool){let load=loads[entry?.alias??LOCAL_MACHINE]??0;if(load<bestLoad)best=entry,bestLoad=load}return{entry:best,loads,...skipped?{skipped}:{}}}function repoWanted(repo){if(typeof repo!=="string")return null;let ref=parseRepoRef(repo);if(ref.kind==="id")return{origin:ref.id};return isLocalCheckout(ref.path)?repoIdentity(ref.path):null}function repoHosts(params){if(flagOn(params.clone))return;let want=repoWanted(params.repo);if(!want||!want.origin&&!want.root)return;return async(entry)=>{if(entry===null){if(typeof params.repo==="string"&&parseRepoRef(params.repo).kind==="path")return!0;return getSavedRepos().some((path)=>findCheckouts(want,[{path,identity:repoIdentity(path)??{}}]).length)}let socket=await machineDaemonSocket(entry);if(!socket)return!1;let client=new RoveDaemonClient(socket);try{let res=await client.request("api.invoke",{verb:"repo-match",params:{...want.origin?{origin:want.origin}:{},...want.root?{root:want.root}:{}},forwarded:!0,from:hostname()});return res.ok&&Boolean(res.result.repo)}finally{client.close()}}}async function routeTarget(args){if(args.machine===AUTO_MACHINE){let hosts=args.params?repoHosts(args.params):void 0;return(await pickMachine(args.localTasks??(async()=>[]),machineTasks,void 0,hosts)).entry}if(args.machine!==void 0&&args.machine!==LOCAL_MACHINE)return requireMachine(args.machine);if(args.machine===LOCAL_MACHINE||!args.taskId)return null;let machines=dedupeMachines(listMachines());if(machines.length===0||await args.isLocalTask(args.taskId))return null;for(let entry of machines)if((await machineTasks(entry))?.some((task)=>task.id===args.taskId))return entry;return null}async function forwardVerb(entry,verb,params,socketPath){let target=socketPath??await machineDaemonSocket(entry);if(!target)return offline(entry.alias);let client=new RoveDaemonClient(target);try{let repo=await translateRepo(client,entry.alias,params);if(repo.failure)return repo.failure;if(verb==="land"&¶ms["dry-run"]===void 0){let published=await client.request("api.invoke",{verb:"publish",params:{"task-id":params["task-id"]},forwarded:!0,from:hostname()});if(published.ok||published.error.code!=="UNKNOWN_VERB")return published}return await client.request("api.invoke",{verb,params:repo.params,forwarded:!0,from:hostname()})}catch(err){let message=errorMessage(err);if(/unknown daemon request:/i.test(message))return tooOld(entry.alias);return failure("MACHINE_UNREACHABLE",`machine "${entry.alias}": ${message}`,{hint:"check the machine is up and reachable over ssh, then retry",nextCommandArgs:["machine","list"]})}finally{client.close()}}async function translateRepo(client,alias,params){let repo=params.repo;if(typeof repo!=="string")return{params};let ref=parseRepoRef(repo),local=ref.kind==="path"&&isLocalCheckout(ref.path);if(ref.kind==="path"&&!local)return{params};let identity=ref.kind==="id"?{origin:ref.id}:repoIdentity(repo);if(!identity?.origin&&!identity?.root)return{params};let allowFork=flagOn(params["allow-fork"]),ask=await client.request("api.invoke",{verb:"repo-match",params:{...identity.origin?{origin:identity.origin}:{},...identity.root?{root:identity.root}:{},...allowFork?{"allow-fork":!0}:{}},forwarded:!0,from:hostname()});if(!ask.ok)return ask.error.code==="UNKNOWN_VERB"?{params}:{failure:ask};let answer=ask.result,found=answer.repo;if(found){let base=params["base-branch"],unpushed=local&&typeof base==="string"?unpushedCommits(repo,base):null;if(typeof base==="string"&&unpushed)return{failure:failure("UNPUSHED_BASE",`${base} has ${unpushed} commit${unpushed===1?"":"s"} no remote has; ${alias} cannot base a task on it`,{hint:`push it first (\`git -C ${repo} push -u origin ${base}\`), then dispatch again`})};return{params:{...params,repo:found}}}if(answer.fork)return{failure:failure("FORK_MATCH",`machine "${alias}" only has ${answer.fork}, a fork of ${identity.origin??repo} (same history, other origin)`,{hint:"pass --allow-fork to use it, or --clone with the repo id to fetch the repo itself there"})};if(flagOn(params.clone)&&identity.origin)return{params:{...params,repo:ref.kind==="id"?repo:identity.origin}};return{failure:failure("NO_REMOTE_CHECKOUT",`machine "${alias}" has no checkout of ${identity.origin??repo}`,{hint:identity.origin?`pass --clone to clone it on ${alias}, or --repo with ${alias}'s own path`:`clone it on ${alias} (and open it there once so Rove knows it), or pass --repo with ${alias}'s own path`})}}var flagOn=(value)=>value===!0||value==="true";function offline(alias){return failure("MACHINE_UNREACHABLE",`machine "${alias}" did not answer`,{hint:`check \`ssh ${alias} true\` works without a prompt, then retry`,nextCommandArgs:["machine","list"]})}function tooOld(alias){return failure("MACHINE_VERSION_SKEW",`machine "${alias}" runs a Rove too old to accept forwarded verbs`,{hint:`upgrade Rove on ${alias} (\`rove update\` there), then retry`})}function failure(code,message,data){return{apiVersion:ROVE_API_VERSION,ok:!1,error:{message,code,...data}}}async function invokeRouted(args){if(args.forwarded)return args.runHere();let taskId=args.params["task-id"],target;try{target=await routeTarget({machine:args.machine,taskId:typeof taskId==="string"?taskId:void 0,isLocalTask:args.isLocalTask,...args.localTasks?{localTasks:args.localTasks}:{},params:args.params})}catch(err){if(!(err instanceof ApiError))throw err;return failure(err.code,err.message,err.data??{})}return target?forwardVerb(target,args.verb,args.params):args.runHere()}async function machinePtySocket(alias){let entry=requireMachine(alias);if(!await machineDaemonSocket(entry))throw new ApiError(`machine "${alias}" did not answer`,"MACHINE_UNREACHABLE");return localPtySocketPath(alias)}
|
|
3
|
+
export{LOCAL_MACHINE,machineDaemonSocket,machineTasks,requireMachine,AUTO_MACHINE,pickMachine,repoWanted,repoHosts,routeTarget,forwardVerb,invokeRouted,machinePtySocket};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{errorMessage}from"./chunk-2brn8e1y.js";import{isObject}from"./chunk-7ghwdjdc.js";import{roveStateDir}from"./chunk-prqeddy7.js";var claude_default={$schema:"https://opencode.ai/theme.json",defs:{darkBg:"#141413",darkBgRaised:"#1A1917",darkBgInset:"#2B2A27",darkBgMenu:"#33312E",darkBorderSubtle:"#2B2A27",darkBorder:"#3A3835",darkBorderActive:"#5C5853",darkText:"#EAE7DF",darkTextMuted:"#A9A39A",darkTextSubtle:"#6B665F",darkPrimary:"#CC785C",darkSecondary:"#D4967E",darkAccent:"#CC785C",darkAccentHover:"#E0AB96",darkRed:"#D47563",darkOrange:"#D97757",darkYellow:"#E8C96B",darkGreen:"#9ACA86",darkBlue:"#61AAF2",darkViolet:"#9B87F5",darkTerracotta:"#BF4D43",lightBg:"#FAF9F5",lightBgRaised:"#F0EEE6",lightBgInset:"#EAE7DF",lightBgMenu:"#E2DED4",lightBorderSubtle:"#EAE7DF",lightBorder:"#D9D5CC",lightBorderActive:"#A9A39A",lightText:"#1A1917",lightTextMuted:"#6B665F",lightTextSubtle:"#8D877D",lightPrimary:"#C96442",lightSecondary:"#B85F3D",lightAccent:"#CC785C",lightAccentHover:"#B85F3D",lightRed:"#A84B3A",lightOrange:"#C96442",lightYellow:"#8A6220",lightGreen:"#2E7C4C",lightBlue:"#207FDE",lightViolet:"#7B5BB6",lightTerracotta:"#BF4D43"},theme:{primary:{dark:"darkPrimary",light:"lightPrimary"},secondary:{dark:"darkSecondary",light:"lightSecondary"},accent:{dark:"darkAccent",light:"lightAccent"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkYellow",light:"lightYellow"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkBlue",light:"lightBlue"},text:{dark:"darkText",light:"lightText"},textMuted:{dark:"darkTextMuted",light:"lightTextMuted"},background:{dark:"darkBg",light:"lightBg"},backgroundPanel:{dark:"darkBgRaised",light:"lightBgRaised"},backgroundElement:{dark:"darkBgInset",light:"lightBgInset"},backgroundMenu:{dark:"darkBgMenu",light:"lightBgMenu"},backgroundDialog:{dark:"darkBgRaised",light:"lightBgRaised"},border:{dark:"darkBorder",light:"lightBorder"},borderActive:{dark:"darkBorderActive",light:"lightBorderActive"},borderSubtle:{dark:"darkBorderSubtle",light:"lightBorderSubtle"},diffAdded:{dark:"darkGreen",light:"lightGreen"},diffRemoved:{dark:"darkRed",light:"lightRed"},diffContext:{dark:"darkTextMuted",light:"lightTextSubtle"},diffHunkHeader:{dark:"darkTextMuted",light:"lightTextSubtle"},diffHighlightAdded:{dark:"#B5E0A0",light:"#1F6638"},diffHighlightRemoved:{dark:"#E89180",light:"#8A3A2C"},diffAddedBg:{dark:"#1F2A1F",light:"#E5EEDF"},diffRemovedBg:{dark:"#2A1F1C",light:"#F5DAD3"},diffContextBg:{dark:"darkBgRaised",light:"lightBgRaised"},diffLineNumber:{dark:"darkTextSubtle",light:"lightTextSubtle"},diffAddedLineNumberBg:{dark:"#1A2419",light:"#D5E2CC"},diffRemovedLineNumberBg:{dark:"#241915",light:"#EBC8BE"},markdownText:{dark:"darkText",light:"lightText"},markdownHeading:{dark:"darkPrimary",light:"lightPrimary"},markdownLink:{dark:"darkAccent",light:"lightAccent"},markdownLinkText:{dark:"darkBlue",light:"lightBlue"},markdownCode:{dark:"darkSecondary",light:"lightSecondary"},markdownBlockQuote:{dark:"darkTextMuted",light:"lightTextMuted"},markdownEmph:{dark:"darkYellow",light:"lightYellow"},markdownStrong:{dark:"darkPrimary",light:"lightPrimary"},markdownHorizontalRule:{dark:"darkTextMuted",light:"lightTextMuted"},markdownListItem:{dark:"darkAccent",light:"lightAccent"},markdownListEnumeration:{dark:"darkBlue",light:"lightBlue"},markdownImage:{dark:"darkAccent",light:"lightAccent"},markdownImageText:{dark:"darkBlue",light:"lightBlue"},markdownCodeBlock:{dark:"darkText",light:"lightText"},markdownQuote:{dark:"darkTextMuted",light:"lightTextMuted"},syntaxComment:{dark:"darkTextSubtle",light:"lightTextSubtle"},syntaxKeyword:{dark:"darkPrimary",light:"lightPrimary"},syntaxFunction:{dark:"darkBlue",light:"lightBlue"},syntaxVariable:{dark:"darkText",light:"lightText"},syntaxString:{dark:"darkGreen",light:"lightGreen"},syntaxNumber:{dark:"darkOrange",light:"lightOrange"},syntaxType:{dark:"darkViolet",light:"lightViolet"},syntaxOperator:{dark:"darkSecondary",light:"lightSecondary"},syntaxPunctuation:{dark:"darkText",light:"lightText"},selectedListItemText:{dark:"darkBg",light:"lightBg"}}};var conductor_default={$schema:"https://opencode.ai/theme.json",defs:{darkStep1:"#0a0a0a",darkStep2:"#111111",darkStep3:"#181818",darkStep4:"#1f1f1f",darkStep5:"#2a2a2a",darkStep6:"#363636",darkStep7:"#444444",darkStep8:"#5a5a5a",darkStep9:"#7a7a7a",darkStep10:"#9a9a9a",darkStep11:"#909090",darkStep12:"#e8e8e8",darkAccent:"#7da5c8",darkAccentBright:"#9bc3e3",darkRed:"#e06c75",darkOrange:"#d6a668",darkGreen:"#7fd88f",darkCyan:"#7da5c8",darkYellow:"#d6a668",lightStep1:"#fafafa",lightStep2:"#f3f3f3",lightStep3:"#ececec",lightStep4:"#e2e2e2",lightStep5:"#d4d4d4",lightStep6:"#bdbdbd",lightStep7:"#9c9c9c",lightStep8:"#7c7c7c",lightStep9:"#5b5b5b",lightStep10:"#404040",lightStep11:"#6c6c6c",lightStep12:"#1a1a1a",lightAccent:"#3d6f9f",lightAccentBright:"#1a4f87",lightRed:"#c9343a",lightOrange:"#a06b1a",lightGreen:"#3d9a57",lightCyan:"#3d6f9f",lightYellow:"#a06b1a"},theme:{primary:{dark:"darkStep12",light:"lightStep12"},secondary:{dark:"darkAccentBright",light:"lightAccentBright"},accent:{dark:"darkAccent",light:"lightAccent"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkOrange",light:"lightOrange"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkCyan",light:"lightCyan"},text:{dark:"darkStep12",light:"lightStep12"},textMuted:{dark:"darkStep11",light:"lightStep11"},background:{dark:"darkStep1",light:"lightStep1"},backgroundPanel:{dark:"darkStep2",light:"lightStep2"},backgroundElement:{dark:"darkStep3",light:"lightStep3"},backgroundMenu:{dark:"darkStep4",light:"lightStep4"},border:{dark:"darkStep6",light:"lightStep6"},borderActive:{dark:"darkStep8",light:"lightStep8"},borderSubtle:{dark:"darkStep4",light:"lightStep4"},diffAdded:{dark:"#7fd88f",light:"#3d9a57"},diffRemoved:{dark:"#e06c75",light:"#c9343a"},diffContext:{dark:"darkStep10",light:"lightStep10"},diffHunkHeader:{dark:"darkStep10",light:"lightStep10"},diffHighlightAdded:{dark:"#9be5ad",light:"#2d7a3f"},diffHighlightRemoved:{dark:"#f08490",light:"#a82530"},diffAddedBg:{dark:"#15241a",light:"#d8efdc"},diffRemovedBg:{dark:"#2a1518",light:"#f5dadc"},diffContextBg:{dark:"darkStep2",light:"lightStep2"},diffLineNumber:{dark:"darkStep9",light:"lightStep9"},diffAddedLineNumberBg:{dark:"#0f1c14",light:"#c5deca"},diffRemovedLineNumberBg:{dark:"#221012",light:"#e5c5c8"},markdownText:{dark:"darkStep12",light:"lightStep12"},markdownHeading:{dark:"darkStep12",light:"lightStep12"},markdownLink:{dark:"darkAccent",light:"lightAccent"},markdownCode:{dark:"darkAccentBright",light:"lightAccentBright"},markdownCodeBlock:{dark:"darkStep12",light:"lightStep12"},markdownQuote:{dark:"darkStep11",light:"lightStep11"},selectedListItemText:{dark:"darkStep1",light:"lightStep1"}}};var skylight_default={$schema:"https://raw.githubusercontent.com/sma1lboy/rove/main/packages/rove/src/tui/context/theme/theme.schema.json",defs:{dayBg:"#FAFBFC",dayBgRaised:"#F2F5F8",dayBgInset:"#E7ECF2",dayBgFloat:"#FFFFFF",dayBorderSubtle:"#E4E9EF",dayBorder:"#D5DCE4",dayBorderActive:"#7F8C9D",dayText:"#16202C",dayTextMuted:"#556174",dayTextSubtle:"#8591A1",daySky:"#006F9E",dayViolet:"#7440D8",dayBlue:"#2E58D4",dayGreen:"#1A7746",dayAmber:"#8F5C00",dayRed:"#C22E29",nightBg:"#0B0D10",nightBgRaised:"#111419",nightBgInset:"#1A1F27",nightBgMenu:"#20262F",nightBgFloat:"#14181E",nightBorderSubtle:"#1C2129",nightBorder:"#272D36",nightBorderActive:"#5A6676",nightText:"#E6EBF1",nightTextMuted:"#95A0AF",nightTextSubtle:"#687384",nightSky:"#2FC0EC",nightViolet:"#B08CFF",nightBlue:"#7C9BFF",nightGreen:"#56CF8A",nightAmber:"#EFBC66",nightRed:"#FF6B5E"},theme:{primary:{dark:"nightSky",light:"daySky"},secondary:{dark:"nightViolet",light:"dayViolet"},accent:{dark:"nightSky",light:"daySky"},error:{dark:"nightRed",light:"dayRed"},warning:{dark:"nightAmber",light:"dayAmber"},success:{dark:"nightGreen",light:"dayGreen"},info:{dark:"nightBlue",light:"dayBlue"},text:{dark:"nightText",light:"dayText"},textMuted:{dark:"nightTextMuted",light:"dayTextMuted"},background:{dark:"nightBg",light:"dayBg"},backgroundPanel:{dark:"nightBgRaised",light:"dayBgRaised"},backgroundElement:{dark:"nightBgInset",light:"dayBgInset"},backgroundMenu:{dark:"nightBgMenu",light:"dayBgFloat"},backgroundDialog:{dark:"nightBgFloat",light:"dayBgFloat"},border:{dark:"nightBorder",light:"dayBorder"},borderActive:{dark:"nightBorderActive",light:"dayBorderActive"},borderSubtle:{dark:"nightBorderSubtle",light:"dayBorderSubtle"},diffAdded:{dark:"nightGreen",light:"dayGreen"},diffRemoved:{dark:"nightRed",light:"dayRed"},diffContext:{dark:"nightTextMuted",light:"dayTextMuted"},diffHunkHeader:{dark:"nightTextMuted",light:"dayTextMuted"},diffHighlightAdded:{dark:"#8FE3B0",light:"#145F38"},diffHighlightRemoved:{dark:"#FF9A90",light:"#9E2320"},diffAddedBg:{dark:"#10241A",light:"#E2F2E8"},diffRemovedBg:{dark:"#2A1517",light:"#FBE4E2"},diffContextBg:{dark:"nightBgRaised",light:"dayBgRaised"},diffLineNumber:{dark:"nightTextSubtle",light:"dayTextSubtle"},diffAddedLineNumberBg:{dark:"#0D1E15",light:"#D3EBDC"},diffRemovedLineNumberBg:{dark:"#231113",light:"#F5D3D0"},markdownText:{dark:"nightText",light:"dayText"},markdownHeading:{dark:"nightSky",light:"daySky"},markdownLink:{dark:"nightBlue",light:"dayBlue"},markdownLinkText:{dark:"nightBlue",light:"dayBlue"},markdownCode:{dark:"nightViolet",light:"dayViolet"},markdownBlockQuote:{dark:"nightTextMuted",light:"dayTextMuted"},markdownEmph:{dark:"nightAmber",light:"dayAmber"},markdownStrong:{dark:"nightText",light:"dayText"},markdownHorizontalRule:{dark:"nightBorderActive",light:"dayBorderActive"},markdownListItem:{dark:"nightSky",light:"daySky"},markdownListEnumeration:{dark:"nightSky",light:"daySky"},markdownImage:{dark:"nightBlue",light:"dayBlue"},markdownImageText:{dark:"nightBlue",light:"dayBlue"},markdownCodeBlock:{dark:"nightText",light:"dayText"},markdownQuote:{dark:"nightTextMuted",light:"dayTextMuted"},syntaxComment:{dark:"nightTextSubtle",light:"dayTextSubtle"},syntaxKeyword:{dark:"nightViolet",light:"dayViolet"},syntaxFunction:{dark:"nightBlue",light:"dayBlue"},syntaxVariable:{dark:"nightText",light:"dayText"},syntaxString:{dark:"nightGreen",light:"dayGreen"},syntaxNumber:{dark:"nightAmber",light:"dayAmber"},syntaxType:{dark:"nightSky",light:"daySky"},syntaxOperator:{dark:"nightTextMuted",light:"dayTextMuted"},syntaxPunctuation:{dark:"nightTextMuted",light:"dayTextMuted"},selectedListItemText:{dark:"nightBg",light:"dayBg"}}};var tokyonight_default={$schema:"https://opencode.ai/theme.json",defs:{darkStep1:"#1a1b26",darkStep2:"#1e2030",darkStep3:"#222436",darkStep4:"#292e42",darkStep5:"#3b4261",darkStep6:"#545c7e",darkStep7:"#737aa2",darkStep8:"#9099b2",darkStep9:"#82aaff",darkStep10:"#89b4fa",darkStep11:"#828bb8",darkStep12:"#c8d3f5",darkRed:"#ff757f",darkOrange:"#ff966c",darkYellow:"#ffc777",darkGreen:"#c3e88d",darkCyan:"#86e1fc",darkPurple:"#c099ff",lightStep1:"#e1e2e7",lightStep2:"#d5d6db",lightStep3:"#c8c9ce",lightStep4:"#b9bac1",lightStep5:"#a8aecb",lightStep6:"#9699a8",lightStep7:"#737a8c",lightStep8:"#5a607d",lightStep9:"#2e7de9",lightStep10:"#1a6ce7",lightStep11:"#8990a3",lightStep12:"#3760bf",lightRed:"#f52a65",lightOrange:"#b15c00",lightYellow:"#8c6c3e",lightGreen:"#587539",lightCyan:"#007197",lightPurple:"#9854f1"},theme:{primary:{dark:"darkStep9",light:"lightStep9"},secondary:{dark:"darkPurple",light:"lightPurple"},accent:{dark:"darkCyan",light:"lightCyan"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkOrange",light:"lightOrange"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkStep9",light:"lightStep9"},text:{dark:"darkStep12",light:"lightStep12"},textMuted:{dark:"darkStep11",light:"lightStep11"},background:{dark:"darkStep1",light:"lightStep1"},backgroundPanel:{dark:"darkStep2",light:"lightStep2"},backgroundElement:{dark:"darkStep3",light:"lightStep3"},border:{dark:"darkStep7",light:"lightStep7"},borderActive:{dark:"darkStep8",light:"lightStep8"},borderSubtle:{dark:"darkStep6",light:"lightStep6"},diffAdded:{dark:"#4fd6be",light:"#1e725c"},diffRemoved:{dark:"#c53b53",light:"#c53b53"},diffContext:{dark:"#828bb8",light:"#7086b5"},diffHunkHeader:{dark:"#828bb8",light:"#7086b5"},diffHighlightAdded:{dark:"#b8db87",light:"#4db380"},diffHighlightRemoved:{dark:"#e26a75",light:"#f52a65"},diffAddedBg:{dark:"#20303b",light:"#d5e5d5"},diffRemovedBg:{dark:"#37222c",light:"#f7d8db"},diffContextBg:{dark:"darkStep2",light:"lightStep2"},diffLineNumber:{dark:"#8f909a",light:"#59595b"},diffAddedLineNumberBg:{dark:"#1b2b34",light:"#c5d5c5"},diffRemovedLineNumberBg:{dark:"#2d1f26",light:"#e7c8cb"},markdownText:{dark:"darkStep12",light:"lightStep12"},markdownHeading:{dark:"darkPurple",light:"lightPurple"},markdownLink:{dark:"darkStep9",light:"lightStep9"},markdownLinkText:{dark:"darkCyan",light:"lightCyan"},markdownCode:{dark:"darkGreen",light:"lightGreen"},markdownBlockQuote:{dark:"darkYellow",light:"lightYellow"},markdownEmph:{dark:"darkYellow",light:"lightYellow"},markdownStrong:{dark:"darkOrange",light:"lightOrange"},markdownHorizontalRule:{dark:"darkStep11",light:"lightStep11"},markdownListItem:{dark:"darkStep9",light:"lightStep9"},markdownListEnumeration:{dark:"darkCyan",light:"lightCyan"},markdownImage:{dark:"darkStep9",light:"lightStep9"},markdownImageText:{dark:"darkCyan",light:"lightCyan"},markdownCodeBlock:{dark:"darkStep12",light:"lightStep12"},syntaxComment:{dark:"darkStep11",light:"lightStep11"},syntaxKeyword:{dark:"darkPurple",light:"lightPurple"},syntaxFunction:{dark:"darkStep9",light:"lightStep9"},syntaxVariable:{dark:"darkRed",light:"lightRed"},syntaxString:{dark:"darkGreen",light:"lightGreen"},syntaxNumber:{dark:"darkOrange",light:"lightOrange"},syntaxType:{dark:"darkYellow",light:"lightYellow"},syntaxOperator:{dark:"darkCyan",light:"lightCyan"},syntaxPunctuation:{dark:"darkStep12",light:"lightStep12"}}};var BUNDLED_THEME_JSONS={claude:claude_default,conductor:conductor_default,skylight:skylight_default,tokyonight:tokyonight_default};var RGB_RE=/^rgba?\(([^()]*)\)$/i;function isRgbLiteral(s){return RGB_RE.test(s.trim())}function channel(part){if(!/^\d{1,3}$/.test(part))return null;let n=Number(part);return n<=255?n:null}function alpha(part){if(!/^(?:0|1|0?\.\d+|1\.0+)$/.test(part))return null;return Math.round(Number(part)*255)}function parseRgbLiteral(value){let m=RGB_RE.exec(value.trim());if(!m)return null;let parts=m[1].split(",").map((p)=>p.trim());if(parts.length!==3&&parts.length!==4)return null;let r=channel(parts[0]),g=channel(parts[1]),b=channel(parts[2]);if(r===null||g===null||b===null)return null;let a=parts.length===4?alpha(parts[3]):255;if(a===null)return null;return{r,g,b,a}}function badRgbLiteral(value){if(!isRgbLiteral(value)||parseRgbLiteral(value))return null;return`\`${value}\` is not a valid rgb()/rgba() literal (channels 0-255, alpha 0-1, comma-separated)`}function validateTheme(value){if(!isObject(value))return{ok:!1,reason:"theme must be a JSON object at the top level"};let obj=value;if(!("theme"in obj))return{ok:!1,reason:"missing required key `theme`"};let theme=obj.theme;if(!isObject(theme))return{ok:!1,reason:"`theme` must be an object map"};if("defs"in obj&&obj.defs!==void 0){if(!isObject(obj.defs))return{ok:!1,reason:"`defs` must be an object map"};for(let[k,v]of Object.entries(obj.defs)){if(typeof v!=="string")return{ok:!1,reason:`defs.${k} must be a string (hex like "#abc" or a ref name)`};let bad=badRgbLiteral(v);if(bad)return{ok:!1,reason:`defs.${k}: ${bad}`}}}for(let[slot,raw]of Object.entries(theme)){if(typeof raw==="string"){let bad=badRgbLiteral(raw);if(bad)return{ok:!1,reason:`theme.${slot}: ${bad}`};continue}if(!isObject(raw))return{ok:!1,reason:`theme.${slot} must be a string or a { dark, light } object (got ${raw===null?"null":Array.isArray(raw)?"array":typeof raw})`};let variant=raw;if(typeof variant.dark!=="string")return{ok:!1,reason:`theme.${slot}.dark must be a string`};if(typeof variant.light!=="string")return{ok:!1,reason:`theme.${slot}.light must be a string`};for(let mode of["dark","light"]){let bad=badRgbLiteral(variant[mode]);if(bad)return{ok:!1,reason:`theme.${slot}.${mode}: ${bad}`}}}if("$schema"in obj&&obj.$schema!==void 0&&typeof obj.$schema!=="string")return{ok:!1,reason:"`$schema` must be a string when present"};return{ok:!0,theme:obj}}import{readFileSync,readdirSync}from"fs";import{join}from"path";function userThemesDir(){return join(roveStateDir(),"themes")}function loadUserThemes(){let dir=userThemesDir(),entries;try{entries=readdirSync(dir)}catch{return[]}let out=[];for(let file of entries){if(!file.endsWith(".json"))continue;let path=join(dir,file),parsed;try{let text=readFileSync(path,"utf8");parsed=JSON.parse(text)}catch(err){let msg=errorMessage(err);console.warn(`[rove] skipping user theme ${path}: invalid JSON \u2014 ${msg}`);continue}let result=validateTheme(parsed);if(!result.ok){console.warn(`[rove] skipping user theme ${path}: ${result.reason}`);continue}let name=file.slice(0,-5);out.push({name,theme:result.theme})}return out}
|
|
2
|
+
import{errorMessage}from"./chunk-2brn8e1y.js";import{isObject}from"./chunk-7ghwdjdc.js";import{roveStateDir}from"./chunk-z1nj22va.js";var claude_default={$schema:"https://opencode.ai/theme.json",defs:{darkBg:"#141413",darkBgRaised:"#1A1917",darkBgInset:"#2B2A27",darkBgMenu:"#33312E",darkBorderSubtle:"#2B2A27",darkBorder:"#3A3835",darkBorderActive:"#5C5853",darkText:"#EAE7DF",darkTextMuted:"#A9A39A",darkTextSubtle:"#6B665F",darkPrimary:"#CC785C",darkSecondary:"#D4967E",darkAccent:"#CC785C",darkAccentHover:"#E0AB96",darkRed:"#D47563",darkOrange:"#D97757",darkYellow:"#E8C96B",darkGreen:"#9ACA86",darkBlue:"#61AAF2",darkViolet:"#9B87F5",darkTerracotta:"#BF4D43",lightBg:"#FAF9F5",lightBgRaised:"#F0EEE6",lightBgInset:"#EAE7DF",lightBgMenu:"#E2DED4",lightBorderSubtle:"#EAE7DF",lightBorder:"#D9D5CC",lightBorderActive:"#A9A39A",lightText:"#1A1917",lightTextMuted:"#6B665F",lightTextSubtle:"#8D877D",lightPrimary:"#C96442",lightSecondary:"#B85F3D",lightAccent:"#CC785C",lightAccentHover:"#B85F3D",lightRed:"#A84B3A",lightOrange:"#C96442",lightYellow:"#8A6220",lightGreen:"#2E7C4C",lightBlue:"#207FDE",lightViolet:"#7B5BB6",lightTerracotta:"#BF4D43"},theme:{primary:{dark:"darkPrimary",light:"lightPrimary"},secondary:{dark:"darkSecondary",light:"lightSecondary"},accent:{dark:"darkAccent",light:"lightAccent"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkYellow",light:"lightYellow"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkBlue",light:"lightBlue"},text:{dark:"darkText",light:"lightText"},textMuted:{dark:"darkTextMuted",light:"lightTextMuted"},background:{dark:"darkBg",light:"lightBg"},backgroundPanel:{dark:"darkBgRaised",light:"lightBgRaised"},backgroundElement:{dark:"darkBgInset",light:"lightBgInset"},backgroundMenu:{dark:"darkBgMenu",light:"lightBgMenu"},backgroundDialog:{dark:"darkBgRaised",light:"lightBgRaised"},border:{dark:"darkBorder",light:"lightBorder"},borderActive:{dark:"darkBorderActive",light:"lightBorderActive"},borderSubtle:{dark:"darkBorderSubtle",light:"lightBorderSubtle"},diffAdded:{dark:"darkGreen",light:"lightGreen"},diffRemoved:{dark:"darkRed",light:"lightRed"},diffContext:{dark:"darkTextMuted",light:"lightTextSubtle"},diffHunkHeader:{dark:"darkTextMuted",light:"lightTextSubtle"},diffHighlightAdded:{dark:"#B5E0A0",light:"#1F6638"},diffHighlightRemoved:{dark:"#E89180",light:"#8A3A2C"},diffAddedBg:{dark:"#1F2A1F",light:"#E5EEDF"},diffRemovedBg:{dark:"#2A1F1C",light:"#F5DAD3"},diffContextBg:{dark:"darkBgRaised",light:"lightBgRaised"},diffLineNumber:{dark:"darkTextSubtle",light:"lightTextSubtle"},diffAddedLineNumberBg:{dark:"#1A2419",light:"#D5E2CC"},diffRemovedLineNumberBg:{dark:"#241915",light:"#EBC8BE"},markdownText:{dark:"darkText",light:"lightText"},markdownHeading:{dark:"darkPrimary",light:"lightPrimary"},markdownLink:{dark:"darkAccent",light:"lightAccent"},markdownLinkText:{dark:"darkBlue",light:"lightBlue"},markdownCode:{dark:"darkSecondary",light:"lightSecondary"},markdownBlockQuote:{dark:"darkTextMuted",light:"lightTextMuted"},markdownEmph:{dark:"darkYellow",light:"lightYellow"},markdownStrong:{dark:"darkPrimary",light:"lightPrimary"},markdownHorizontalRule:{dark:"darkTextMuted",light:"lightTextMuted"},markdownListItem:{dark:"darkAccent",light:"lightAccent"},markdownListEnumeration:{dark:"darkBlue",light:"lightBlue"},markdownImage:{dark:"darkAccent",light:"lightAccent"},markdownImageText:{dark:"darkBlue",light:"lightBlue"},markdownCodeBlock:{dark:"darkText",light:"lightText"},markdownQuote:{dark:"darkTextMuted",light:"lightTextMuted"},syntaxComment:{dark:"darkTextSubtle",light:"lightTextSubtle"},syntaxKeyword:{dark:"darkPrimary",light:"lightPrimary"},syntaxFunction:{dark:"darkBlue",light:"lightBlue"},syntaxVariable:{dark:"darkText",light:"lightText"},syntaxString:{dark:"darkGreen",light:"lightGreen"},syntaxNumber:{dark:"darkOrange",light:"lightOrange"},syntaxType:{dark:"darkViolet",light:"lightViolet"},syntaxOperator:{dark:"darkSecondary",light:"lightSecondary"},syntaxPunctuation:{dark:"darkText",light:"lightText"},selectedListItemText:{dark:"darkBg",light:"lightBg"}}};var conductor_default={$schema:"https://opencode.ai/theme.json",defs:{darkStep1:"#0a0a0a",darkStep2:"#111111",darkStep3:"#181818",darkStep4:"#1f1f1f",darkStep5:"#2a2a2a",darkStep6:"#363636",darkStep7:"#444444",darkStep8:"#5a5a5a",darkStep9:"#7a7a7a",darkStep10:"#9a9a9a",darkStep11:"#909090",darkStep12:"#e8e8e8",darkAccent:"#7da5c8",darkAccentBright:"#9bc3e3",darkRed:"#e06c75",darkOrange:"#d6a668",darkGreen:"#7fd88f",darkCyan:"#7da5c8",darkYellow:"#d6a668",lightStep1:"#fafafa",lightStep2:"#f3f3f3",lightStep3:"#ececec",lightStep4:"#e2e2e2",lightStep5:"#d4d4d4",lightStep6:"#bdbdbd",lightStep7:"#9c9c9c",lightStep8:"#7c7c7c",lightStep9:"#5b5b5b",lightStep10:"#404040",lightStep11:"#6c6c6c",lightStep12:"#1a1a1a",lightAccent:"#3d6f9f",lightAccentBright:"#1a4f87",lightRed:"#c9343a",lightOrange:"#a06b1a",lightGreen:"#3d9a57",lightCyan:"#3d6f9f",lightYellow:"#a06b1a"},theme:{primary:{dark:"darkStep12",light:"lightStep12"},secondary:{dark:"darkAccentBright",light:"lightAccentBright"},accent:{dark:"darkAccent",light:"lightAccent"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkOrange",light:"lightOrange"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkCyan",light:"lightCyan"},text:{dark:"darkStep12",light:"lightStep12"},textMuted:{dark:"darkStep11",light:"lightStep11"},background:{dark:"darkStep1",light:"lightStep1"},backgroundPanel:{dark:"darkStep2",light:"lightStep2"},backgroundElement:{dark:"darkStep3",light:"lightStep3"},backgroundMenu:{dark:"darkStep4",light:"lightStep4"},border:{dark:"darkStep6",light:"lightStep6"},borderActive:{dark:"darkStep8",light:"lightStep8"},borderSubtle:{dark:"darkStep4",light:"lightStep4"},diffAdded:{dark:"#7fd88f",light:"#3d9a57"},diffRemoved:{dark:"#e06c75",light:"#c9343a"},diffContext:{dark:"darkStep10",light:"lightStep10"},diffHunkHeader:{dark:"darkStep10",light:"lightStep10"},diffHighlightAdded:{dark:"#9be5ad",light:"#2d7a3f"},diffHighlightRemoved:{dark:"#f08490",light:"#a82530"},diffAddedBg:{dark:"#15241a",light:"#d8efdc"},diffRemovedBg:{dark:"#2a1518",light:"#f5dadc"},diffContextBg:{dark:"darkStep2",light:"lightStep2"},diffLineNumber:{dark:"darkStep9",light:"lightStep9"},diffAddedLineNumberBg:{dark:"#0f1c14",light:"#c5deca"},diffRemovedLineNumberBg:{dark:"#221012",light:"#e5c5c8"},markdownText:{dark:"darkStep12",light:"lightStep12"},markdownHeading:{dark:"darkStep12",light:"lightStep12"},markdownLink:{dark:"darkAccent",light:"lightAccent"},markdownCode:{dark:"darkAccentBright",light:"lightAccentBright"},markdownCodeBlock:{dark:"darkStep12",light:"lightStep12"},markdownQuote:{dark:"darkStep11",light:"lightStep11"},selectedListItemText:{dark:"darkStep1",light:"lightStep1"}}};var skylight_default={$schema:"https://raw.githubusercontent.com/sma1lboy/rove/main/packages/rove/src/tui/context/theme/theme.schema.json",defs:{dayBg:"#FAFBFC",dayBgRaised:"#F2F5F8",dayBgInset:"#E7ECF2",dayBgFloat:"#FFFFFF",dayBorderSubtle:"#E4E9EF",dayBorder:"#D5DCE4",dayBorderActive:"#7F8C9D",dayText:"#16202C",dayTextMuted:"#556174",dayTextSubtle:"#8591A1",daySky:"#006F9E",dayViolet:"#7440D8",dayBlue:"#2E58D4",dayGreen:"#1A7746",dayAmber:"#8F5C00",dayRed:"#C22E29",nightBg:"#0B0D10",nightBgRaised:"#111419",nightBgInset:"#1A1F27",nightBgMenu:"#20262F",nightBgFloat:"#14181E",nightBorderSubtle:"#1C2129",nightBorder:"#272D36",nightBorderActive:"#5A6676",nightText:"#E6EBF1",nightTextMuted:"#95A0AF",nightTextSubtle:"#687384",nightSky:"#2FC0EC",nightViolet:"#B08CFF",nightBlue:"#7C9BFF",nightGreen:"#56CF8A",nightAmber:"#EFBC66",nightRed:"#FF6B5E"},theme:{primary:{dark:"nightSky",light:"daySky"},secondary:{dark:"nightViolet",light:"dayViolet"},accent:{dark:"nightSky",light:"daySky"},error:{dark:"nightRed",light:"dayRed"},warning:{dark:"nightAmber",light:"dayAmber"},success:{dark:"nightGreen",light:"dayGreen"},info:{dark:"nightBlue",light:"dayBlue"},text:{dark:"nightText",light:"dayText"},textMuted:{dark:"nightTextMuted",light:"dayTextMuted"},background:{dark:"nightBg",light:"dayBg"},backgroundPanel:{dark:"nightBgRaised",light:"dayBgRaised"},backgroundElement:{dark:"nightBgInset",light:"dayBgInset"},backgroundMenu:{dark:"nightBgMenu",light:"dayBgFloat"},backgroundDialog:{dark:"nightBgFloat",light:"dayBgFloat"},border:{dark:"nightBorder",light:"dayBorder"},borderActive:{dark:"nightBorderActive",light:"dayBorderActive"},borderSubtle:{dark:"nightBorderSubtle",light:"dayBorderSubtle"},diffAdded:{dark:"nightGreen",light:"dayGreen"},diffRemoved:{dark:"nightRed",light:"dayRed"},diffContext:{dark:"nightTextMuted",light:"dayTextMuted"},diffHunkHeader:{dark:"nightTextMuted",light:"dayTextMuted"},diffHighlightAdded:{dark:"#8FE3B0",light:"#145F38"},diffHighlightRemoved:{dark:"#FF9A90",light:"#9E2320"},diffAddedBg:{dark:"#10241A",light:"#E2F2E8"},diffRemovedBg:{dark:"#2A1517",light:"#FBE4E2"},diffContextBg:{dark:"nightBgRaised",light:"dayBgRaised"},diffLineNumber:{dark:"nightTextSubtle",light:"dayTextSubtle"},diffAddedLineNumberBg:{dark:"#0D1E15",light:"#D3EBDC"},diffRemovedLineNumberBg:{dark:"#231113",light:"#F5D3D0"},markdownText:{dark:"nightText",light:"dayText"},markdownHeading:{dark:"nightSky",light:"daySky"},markdownLink:{dark:"nightBlue",light:"dayBlue"},markdownLinkText:{dark:"nightBlue",light:"dayBlue"},markdownCode:{dark:"nightViolet",light:"dayViolet"},markdownBlockQuote:{dark:"nightTextMuted",light:"dayTextMuted"},markdownEmph:{dark:"nightAmber",light:"dayAmber"},markdownStrong:{dark:"nightText",light:"dayText"},markdownHorizontalRule:{dark:"nightBorderActive",light:"dayBorderActive"},markdownListItem:{dark:"nightSky",light:"daySky"},markdownListEnumeration:{dark:"nightSky",light:"daySky"},markdownImage:{dark:"nightBlue",light:"dayBlue"},markdownImageText:{dark:"nightBlue",light:"dayBlue"},markdownCodeBlock:{dark:"nightText",light:"dayText"},markdownQuote:{dark:"nightTextMuted",light:"dayTextMuted"},syntaxComment:{dark:"nightTextSubtle",light:"dayTextSubtle"},syntaxKeyword:{dark:"nightViolet",light:"dayViolet"},syntaxFunction:{dark:"nightBlue",light:"dayBlue"},syntaxVariable:{dark:"nightText",light:"dayText"},syntaxString:{dark:"nightGreen",light:"dayGreen"},syntaxNumber:{dark:"nightAmber",light:"dayAmber"},syntaxType:{dark:"nightSky",light:"daySky"},syntaxOperator:{dark:"nightTextMuted",light:"dayTextMuted"},syntaxPunctuation:{dark:"nightTextMuted",light:"dayTextMuted"},selectedListItemText:{dark:"nightBg",light:"dayBg"}}};var tokyonight_default={$schema:"https://opencode.ai/theme.json",defs:{darkStep1:"#1a1b26",darkStep2:"#1e2030",darkStep3:"#222436",darkStep4:"#292e42",darkStep5:"#3b4261",darkStep6:"#545c7e",darkStep7:"#737aa2",darkStep8:"#9099b2",darkStep9:"#82aaff",darkStep10:"#89b4fa",darkStep11:"#828bb8",darkStep12:"#c8d3f5",darkRed:"#ff757f",darkOrange:"#ff966c",darkYellow:"#ffc777",darkGreen:"#c3e88d",darkCyan:"#86e1fc",darkPurple:"#c099ff",lightStep1:"#e1e2e7",lightStep2:"#d5d6db",lightStep3:"#c8c9ce",lightStep4:"#b9bac1",lightStep5:"#a8aecb",lightStep6:"#9699a8",lightStep7:"#737a8c",lightStep8:"#5a607d",lightStep9:"#2e7de9",lightStep10:"#1a6ce7",lightStep11:"#8990a3",lightStep12:"#3760bf",lightRed:"#f52a65",lightOrange:"#b15c00",lightYellow:"#8c6c3e",lightGreen:"#587539",lightCyan:"#007197",lightPurple:"#9854f1"},theme:{primary:{dark:"darkStep9",light:"lightStep9"},secondary:{dark:"darkPurple",light:"lightPurple"},accent:{dark:"darkCyan",light:"lightCyan"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkOrange",light:"lightOrange"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkStep9",light:"lightStep9"},text:{dark:"darkStep12",light:"lightStep12"},textMuted:{dark:"darkStep11",light:"lightStep11"},background:{dark:"darkStep1",light:"lightStep1"},backgroundPanel:{dark:"darkStep2",light:"lightStep2"},backgroundElement:{dark:"darkStep3",light:"lightStep3"},border:{dark:"darkStep7",light:"lightStep7"},borderActive:{dark:"darkStep8",light:"lightStep8"},borderSubtle:{dark:"darkStep6",light:"lightStep6"},diffAdded:{dark:"#4fd6be",light:"#1e725c"},diffRemoved:{dark:"#c53b53",light:"#c53b53"},diffContext:{dark:"#828bb8",light:"#7086b5"},diffHunkHeader:{dark:"#828bb8",light:"#7086b5"},diffHighlightAdded:{dark:"#b8db87",light:"#4db380"},diffHighlightRemoved:{dark:"#e26a75",light:"#f52a65"},diffAddedBg:{dark:"#20303b",light:"#d5e5d5"},diffRemovedBg:{dark:"#37222c",light:"#f7d8db"},diffContextBg:{dark:"darkStep2",light:"lightStep2"},diffLineNumber:{dark:"#8f909a",light:"#59595b"},diffAddedLineNumberBg:{dark:"#1b2b34",light:"#c5d5c5"},diffRemovedLineNumberBg:{dark:"#2d1f26",light:"#e7c8cb"},markdownText:{dark:"darkStep12",light:"lightStep12"},markdownHeading:{dark:"darkPurple",light:"lightPurple"},markdownLink:{dark:"darkStep9",light:"lightStep9"},markdownLinkText:{dark:"darkCyan",light:"lightCyan"},markdownCode:{dark:"darkGreen",light:"lightGreen"},markdownBlockQuote:{dark:"darkYellow",light:"lightYellow"},markdownEmph:{dark:"darkYellow",light:"lightYellow"},markdownStrong:{dark:"darkOrange",light:"lightOrange"},markdownHorizontalRule:{dark:"darkStep11",light:"lightStep11"},markdownListItem:{dark:"darkStep9",light:"lightStep9"},markdownListEnumeration:{dark:"darkCyan",light:"lightCyan"},markdownImage:{dark:"darkStep9",light:"lightStep9"},markdownImageText:{dark:"darkCyan",light:"lightCyan"},markdownCodeBlock:{dark:"darkStep12",light:"lightStep12"},syntaxComment:{dark:"darkStep11",light:"lightStep11"},syntaxKeyword:{dark:"darkPurple",light:"lightPurple"},syntaxFunction:{dark:"darkStep9",light:"lightStep9"},syntaxVariable:{dark:"darkRed",light:"lightRed"},syntaxString:{dark:"darkGreen",light:"lightGreen"},syntaxNumber:{dark:"darkOrange",light:"lightOrange"},syntaxType:{dark:"darkYellow",light:"lightYellow"},syntaxOperator:{dark:"darkCyan",light:"lightCyan"},syntaxPunctuation:{dark:"darkStep12",light:"lightStep12"}}};var BUNDLED_THEME_JSONS={claude:claude_default,conductor:conductor_default,skylight:skylight_default,tokyonight:tokyonight_default};var RGB_RE=/^rgba?\(([^()]*)\)$/i;function isRgbLiteral(s){return RGB_RE.test(s.trim())}function channel(part){if(!/^\d{1,3}$/.test(part))return null;let n=Number(part);return n<=255?n:null}function alpha(part){if(!/^(?:0|1|0?\.\d+|1\.0+)$/.test(part))return null;return Math.round(Number(part)*255)}function parseRgbLiteral(value){let m=RGB_RE.exec(value.trim());if(!m)return null;let parts=m[1].split(",").map((p)=>p.trim());if(parts.length!==3&&parts.length!==4)return null;let r=channel(parts[0]),g=channel(parts[1]),b=channel(parts[2]);if(r===null||g===null||b===null)return null;let a=parts.length===4?alpha(parts[3]):255;if(a===null)return null;return{r,g,b,a}}function badRgbLiteral(value){if(!isRgbLiteral(value)||parseRgbLiteral(value))return null;return`\`${value}\` is not a valid rgb()/rgba() literal (channels 0-255, alpha 0-1, comma-separated)`}function validateTheme(value){if(!isObject(value))return{ok:!1,reason:"theme must be a JSON object at the top level"};let obj=value;if(!("theme"in obj))return{ok:!1,reason:"missing required key `theme`"};let theme=obj.theme;if(!isObject(theme))return{ok:!1,reason:"`theme` must be an object map"};if("defs"in obj&&obj.defs!==void 0){if(!isObject(obj.defs))return{ok:!1,reason:"`defs` must be an object map"};for(let[k,v]of Object.entries(obj.defs)){if(typeof v!=="string")return{ok:!1,reason:`defs.${k} must be a string (hex like "#abc" or a ref name)`};let bad=badRgbLiteral(v);if(bad)return{ok:!1,reason:`defs.${k}: ${bad}`}}}for(let[slot,raw]of Object.entries(theme)){if(typeof raw==="string"){let bad=badRgbLiteral(raw);if(bad)return{ok:!1,reason:`theme.${slot}: ${bad}`};continue}if(!isObject(raw))return{ok:!1,reason:`theme.${slot} must be a string or a { dark, light } object (got ${raw===null?"null":Array.isArray(raw)?"array":typeof raw})`};let variant=raw;if(typeof variant.dark!=="string")return{ok:!1,reason:`theme.${slot}.dark must be a string`};if(typeof variant.light!=="string")return{ok:!1,reason:`theme.${slot}.light must be a string`};for(let mode of["dark","light"]){let bad=badRgbLiteral(variant[mode]);if(bad)return{ok:!1,reason:`theme.${slot}.${mode}: ${bad}`}}}if("$schema"in obj&&obj.$schema!==void 0&&typeof obj.$schema!=="string")return{ok:!1,reason:"`$schema` must be a string when present"};return{ok:!0,theme:obj}}import{readFileSync,readdirSync}from"fs";import{join}from"path";function userThemesDir(){return join(roveStateDir(),"themes")}function loadUserThemes(){let dir=userThemesDir(),entries;try{entries=readdirSync(dir)}catch{return[]}let out=[];for(let file of entries){if(!file.endsWith(".json"))continue;let path=join(dir,file),parsed;try{let text=readFileSync(path,"utf8");parsed=JSON.parse(text)}catch(err){let msg=errorMessage(err);console.warn(`[rove] skipping user theme ${path}: invalid JSON \u2014 ${msg}`);continue}let result=validateTheme(parsed);if(!result.ok){console.warn(`[rove] skipping user theme ${path}: ${result.reason}`);continue}let name=file.slice(0,-5);out.push({name,theme:result.theme})}return out}
|
|
3
3
|
export{BUNDLED_THEME_JSONS,parseRgbLiteral,validateTheme,userThemesDir,loadUserThemes};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{ROVE_STATE_DIR_BASENAME as ROVE_STATE_DIR_BASENAME2}from"./chunk-zt7wfnva.js";import{preRenameConfigDir,preRenameStateDir}from"./chunk-
|
|
2
|
+
import{ROVE_STATE_DIR_BASENAME as ROVE_STATE_DIR_BASENAME2}from"./chunk-zt7wfnva.js";import{preRenameConfigDir,preRenameStateDir}from"./chunk-f8gg8cqh.js";import{ROVE_CONFIG_DIR_BASENAME,ROVE_STATE_DIR_BASENAME,readRoveEnv,readRoveHomeDirEnv}from"./chunk-nc46gddg.js";import{createHash}from"crypto";import{join as join2}from"path";import{homedir}from"os";import{join}from"path";function resolveProductHomeDir(){return readRoveHomeDirEnv()??homedir()}function defaultUiPrefsStatePath(homeDir=resolveProductHomeDir()){return join(homeDir,".config",ROVE_CONFIG_DIR_BASENAME,"state.json")}function defaultKeybindingsPath(homeDir=resolveProductHomeDir()){return join(homeDir,ROVE_STATE_DIR_BASENAME,"settings","keybindings.yaml")}function isDev(){return readRoveEnv("DEV")==="1"}function homeDir(){return resolveProductHomeDir()}function roveStateDir(){return join2(homeDir(),ROVE_STATE_DIR_BASENAME2)}function legacyRoveStateDir(){return preRenameStateDir(homeDir())}function kvStatePath(){return defaultUiPrefsStatePath(homeDir())}function legacyRoveKvStatePath(){return join2(preRenameConfigDir(homeDir()),"state.json")}function secretsPath(){return join2(roveStateDir(),"secrets.json")}function keybindingsConfigPath(){return defaultKeybindingsPath(homeDir())}function promptAttachmentsDir(){return join2(roveStateDir(),"attachments")}function remoteControlSocketPath(host,user,port){let hash=createHash("sha1").update(`${user}@${host}:${port??22}`).digest("hex").slice(0,16);return join2(roveStateDir(),"ssh",`${hash}.sock`)}function worktreeInitMarkerPath(worktreePath){let hash=createHash("sha1").update(worktreePath).digest("hex").slice(0,16);return join2(roveStateDir(),"worktree-init",hash)}
|
|
3
3
|
export{resolveProductHomeDir,defaultUiPrefsStatePath,defaultKeybindingsPath,isDev,homeDir,roveStateDir,legacyRoveStateDir,kvStatePath,legacyRoveKvStatePath,secretsPath,keybindingsConfigPath,promptAttachmentsDir,remoteControlSocketPath,worktreeInitMarkerPath};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Orchestrator}from"./chunk-e7h7w4n0.js";import"./chunk-3qkhxem2.js";import"./chunk-kx7b5nht.js";import"./chunk-c1dz3qg3.js";import{PLACEHOLDER_TASK_TITLE}from"./chunk-eyrt04mg.js";import"./chunk-mzk4p07t.js";import"./chunk-yfvt96ar.js";import"./chunk-gq36nzg8.js";import"./chunk-1z2sze0v.js";import"./chunk-sak1tphp.js";import"./chunk-hpay0ax8.js";import"./chunk-catrr0z3.js";import"./chunk-2tfnscxk.js";import"./chunk-h8t4xg1p.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-6xppe9bj.js";import"./chunk-y1xnjx8x.js";import"./chunk-2brn8e1y.js";import"./chunk-xy8be792.js";import"./chunk-7kysxgbq.js";import"./chunk-h2m7em1e.js";import"./chunk-rfp0ayra.js";import"./chunk-40dgv828.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-yt15y085.js";import"./chunk-cmp64q4j.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";export{PLACEHOLDER_TASK_TITLE,Orchestrator};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{__require}from"./chunk-91sykzqq.js";var welcomeWrite=Promise.resolve();function trackWelcomeWrite(write){welcomeWrite=write}async function launchTui(){let{startTui}=await import("./chunk-
|
|
2
|
+
import{__require}from"./chunk-91sykzqq.js";var welcomeWrite=Promise.resolve();function trackWelcomeWrite(write){welcomeWrite=write}async function launchTui(){let{startTui}=await import("./chunk-npnbq79j.js");await startTui(),await welcomeWrite;let{runPendingWelcomeInstalls}=await import("./chunk-axjcmamn.js");runPendingWelcomeInstalls()}
|
|
3
3
|
export{trackWelcomeWrite,launchTui};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{stampOrigin}from"./chunk-ak0frbbw.js";import{createStateCell}from"./chunk-cmp64q4j.js";var NO_LIVE={activity:new Map,changes:new Map,tokens:new Map},NONE={machines:[],tasks:[],live:NO_LIVE};function decodeMachines(payload){let p=payload;if(!p||!Array.isArray(p.machines)||!Array.isArray(p.tasks)||!p.live||typeof p.live!=="object")return null;let map=(value)=>new Map(value&&typeof value==="object"?Object.entries(value):[]);return{machines:p.machines,tasks:p.tasks,live:{activity:map(p.live.activity),changes:map(p.live.changes),tokens:map(p.live.tokens)}}}class MachineFeed{local;remote=NONE;machinesAcc=createStateCell([],"machines.status");tasksAcc;liveAcc=createStateCell(NO_LIVE,"machines.live");stops;constructor(local){this.local=local;this.tasksAcc=createStateCell(local.tasksSignal().get(),"machines.tasks");let raw=local.rawChannelSignal("machines"),take=()=>{let next=decodeMachines(raw.get());if(!next)return;this.remote=next,this.machinesAcc.set(next.machines),this.liveAcc.set(next.live),this.merge()};this.stops=[raw.subscribe(take),local.tasksSignal().subscribe(()=>this.merge())],take()}machinesSignal(){return this.machinesAcc}tasksSignal(){return this.tasksAcc}liveSignal(){return this.liveAcc}merge(){let local=this.local.tasksSignal().get();if(this.remote.machines.length===0){this.tasksAcc.set(local);return}this.tasksAcc.set([...local.map((task)=>stampOrigin(task,"local","local")),...this.remote.tasks])}dispose(){for(let stop of this.stops)stop()}}
|
|
3
|
+
export{decodeMachines,MachineFeed};
|
package/dist/cli/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{matchPathGlob}from"./chunk-kg11c1py.js";import{failureHint}from"./chunk-
|
|
3
|
+
import{matchPathGlob}from"./chunk-kg11c1py.js";import{failureHint}from"./chunk-nw4p86t1.js";import{switchFlag}from"./chunk-zsfyj36g.js";import{connectIfRunning}from"./chunk-sfn4s219.js";import"./chunk-v8nvfyd4.js";import"./chunk-gak4aag4.js";import{expandTilde}from"./chunk-2r1fgng9.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{BUILTIN_VENDORS,coerceVendorId,isBuiltinVendor}from"./chunk-h2m7em1e.js";import{CURRENT_VERSION}from"./chunk-p4fjynez.js";import{rejectionReason}from"./chunk-7mwvvj46.js";import"./chunk-br8r72bf.js";import"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-yt15y085.js";import"./chunk-r0etc6vp.js";import"./chunk-xt543e2h.js";import"./chunk-cmp64q4j.js";import"./chunk-krnacq08.js";import"./chunk-f2bqrzsy.js";import"./chunk-0g4wc808.js";import{pathSyntax}from"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";import{resolve as resolve2}from"path";function debugEnabled(env){return env.ROVE_DEBUG==="1"||env.ROVE_DEBUG==="1"}function failureSubject(cliName,argv){let verb=argv[2];return verb&&!verb.startsWith("-")&&!verb.includes("/")?`${cliName} ${verb}`:cliName}function summarizeCliGitError(message,cwd){if(!/not a git repository/i.test(message))return null;return`${cwd} is not a git repository \u2014 run this inside one, or pass a repo path.`}function formatCliFailure(err,opts){let subject=failureSubject(opts.cliName,opts.argv);if(debugEnabled(opts.env))return`${subject}: ${String(err instanceof Error?err.stack??err:err)}
|
|
4
4
|
${failureHint(err,opts.cliName)}`;let raw=errorMessage(err),git=summarizeCliGitError(raw,opts.cwd);return`${subject}: ${git??`${raw}
|
|
5
|
-
${failureHint(err,opts.cliName)}`}`}var DYNAMIC_COMMANDS=new Map([["completions",async(args)=>{let{runCompletionsSubcommand}=await import("./chunk-
|
|
6
|
-
`),process.exit(1);let projectRoot=await projectRootFor(dir);await withDaemonOrLocal({daemon:async(client)=>{let taskId;if(projectRoot)taskId=(await client.request("task.ensureMain",{repo:projectRoot})).task.id;else taskId=(await client.request("task.openDir",{dir})).taskId;await client.request("task.setActive",{taskId})},local:async(orch)=>{let task=projectRoot?await orch.ensureMainTask(projectRoot):await orch.openDirectoryTask({dir}),{writeLastActiveTaskId}=await import("./chunk-
|
|
5
|
+
${failureHint(err,opts.cliName)}`}`}var DYNAMIC_COMMANDS=new Map([["completions",async(args)=>{let{runCompletionsSubcommand}=await import("./chunk-ke19jzhg.js");await runCompletionsSubcommand(args)}],["export",async(args)=>{let{runExportSubcommand}=await import("./chunk-acqcph62.js");await runExportSubcommand(args)}],["repo",async(args)=>{let{runRepoSubcommand}=await import("./chunk-gqh6atvp.js");await runRepoSubcommand(args)}],["api",async(args)=>{let{runApiSubcommand}=await import("./chunk-xex81qeb.js");await runApiSubcommand(args)}],["update",async(args)=>{let{runUpdateSubcommand}=await import("./chunk-5m1ef9ez.js");await runUpdateSubcommand(args)}],["theme",async(args)=>{let{runThemeSubcommand}=await import("./chunk-ycd28edp.js");await runThemeSubcommand(args)}],["feedback",async(args)=>{let{runFeedbackSubcommand}=await import("./chunk-7maf6x1g.js");await runFeedbackSubcommand(args)}],["daemon",async(args)=>{let{runDaemonSubcommand}=await import("./chunk-2jzaabcy.js");await runDaemonSubcommand(args)}],["machine",async(args)=>{let{runMachineSubcommand}=await import("./chunk-7ag59vyh.js");await runMachineSubcommand(args)}],["weixin",async(args)=>{let{runChannelCli}=await import("./chunk-gs6j7y6q.js");await runChannelCli("weixin",args)}],["doctor",async(args)=>{let{runDoctorSubcommand}=await import("./chunk-2a19815h.js");await runDoctorSubcommand(args)}],["config",async(args)=>{let{runConfigSubcommand}=await import("./chunk-6z02cd58.js");await runConfigSubcommand(args)}],["reset",async(args)=>{let{runResetSubcommand}=await import("./chunk-n2j5sk0g.js");await runResetSubcommand(args)}],["pty-host",async(args)=>{let{runPtyHostSubcommand}=await import("./chunk-5vetsh77.js");await runPtyHostSubcommand(args)}],["skill",async(args)=>{let{runSkillSubcommand}=await import("./chunk-hy0r635n.js");await runSkillSubcommand(args)}],["plugin",async(args)=>{let{runPluginSubcommand}=await import("./chunk-02htajas.js");await runPluginSubcommand(args)}],["hook",async(args)=>{let{runHookSubcommand}=await import("./chunk-0t0ykzek.js");await runHookSubcommand(args)}]]);import{statSync}from"fs";import{resolve}from"path";async function openLocalOrchestrator(){let{TaskIndexStore}=await import("./chunk-66zvkh5z.js"),{GitWorktreeManager}=await import("./chunk-azpvsc5d.js"),{Orchestrator}=await import("./chunk-z7d7gk7p.js"),store=new TaskIndexStore;return await store.load(),new Orchestrator({store,worktrees:new GitWorktreeManager})}async function withDaemonOrLocal(bridge){let client=await connectIfRunning();if(client)try{return await bridge.daemon(client)}finally{client.close()}let orch=await openLocalOrchestrator();return bridge.local(orch)}function isPathLikeArg(arg){return arg==="."||arg===".."||arg.startsWith("./")||arg.startsWith("../")||arg.startsWith(".\\")||arg.startsWith("..\\")||pathSyntax(arg).isAbsolute(arg)||arg.startsWith("/")||arg==="~"||arg.startsWith("~/")||arg.startsWith("~\\")}async function projectRootFor(dir){let{isGitRepo,resolveRepoRoot}=await import("./chunk-hv79ys32.js"),{projectRejection}=await import("./chunk-qnpkhvrn.js"),top=resolveRepoRoot(dir);if(top!==dir)return null;return projectRejection(top,isGitRepo,"explicit")?null:top}async function runOpenDirectory(arg){let dir=resolve(process.cwd(),expandTilde(arg)),isDir=!1;try{isDir=statSync(dir).isDirectory()}catch{isDir=!1}if(!isDir)process.stderr.write(`${ROVE_PRODUCT_NAME}: "${arg}" is not a directory (resolved to ${dir}).
|
|
6
|
+
`),process.exit(1);let projectRoot=await projectRootFor(dir);await withDaemonOrLocal({daemon:async(client)=>{let taskId;if(projectRoot)taskId=(await client.request("task.ensureMain",{repo:projectRoot})).task.id;else taskId=(await client.request("task.openDir",{dir})).taskId;await client.request("task.setActive",{taskId})},local:async(orch)=>{let task=projectRoot?await orch.ensureMainTask(projectRoot):await orch.openDirectoryTask({dir}),{writeLastActiveTaskId}=await import("./chunk-y8b2p44q.js");writeLastActiveTaskId(String(task.id))}});let{publishRoveTerminalTitle}=await import("./chunk-g8wrdp7n.js");publishRoveTerminalTitle();let{launchTui}=await import("./chunk-vd6z4v6p.js");await launchTui()}function topLevelUsage(cliName=ROVE_PRODUCT_NAME){return[`${cliName} ${CURRENT_VERSION}`,"",`Usage: ${cliName} [command] [options]`,"","Run with no command to launch PureTUI.",`Run \`${cliName} .\` (or \`${cliName} <path>\`) to open a directory as a standalone task.`,"","Commands:"," completions <shell> Generate shell completion script (bash/zsh/fish)"," add [path] Save a repo path for the new-task picker"," remove [path] Forget a saved project (inverse of add; non-destructive)"," adopt [glob] Import existing git worktrees as tasks"," export [--csv|--json] Print the task list (json/csv/table; daemon-free)"," repo <verb> Per-repo init script + first prompt (show|set|unset)",` api <verb> Scriptable RPC surface for agents (see \`${cliName} api --help\`)`," daemon <verb> Manage the daemon (start|stop|status|restart)"," machine <verb> Other computers running Rove (add|doctor|remove|list)"," weixin <verb> Talk to Rove from WeChat (login|logout|status|allow|deny|send|agent)"," doctor [--report|--fix] Diagnose daemon/PTY/engines/git; --fix walks the remedies",` config [--path] Open ${cliName}'s config file (state.json) in your editor`," reset [--hard] Stop runtimes; optionally wipe task/UI state"," theme <verb> Manage user themes (list|add|remove)",` skill <verb> Install the ${cliName} agent skill (install|status|command|print)`," plugin <verb> Install and run plugins (install|link|list|action|\u2026)"," feedback Send feedback to GitHub Discussions",` update [version|channel|list] Self-update ${cliName}, switch channel, or list versions`,"","Options:"," -v, --version Print version"," -h, --help Print this help"," --skill Print the agent skill file and exit"," --web [bridge flags] Serve the browser client on 127.0.0.1 and print its link"].join(`
|
|
7
7
|
`)}var CLI_NAME=ROVE_PRODUCT_NAME,ADD_USAGE=[`Usage: ${CLI_NAME} add [path]`,` ${CLI_NAME} add --remote --host <host> --user <user> --path <basePath> [--port N] [--key [path] | --password]`,"","Save a repo for the new-task picker. With --remote, register an SSH-backed","project whose worktrees live on <host>; engine launch over SSH is pending.",""].join(`
|
|
8
|
-
`);async function runAddSubcommand(rest){let arg=rest[0];if(arg==="--help"||arg==="-h"||arg==="help"){process.stdout.write(ADD_USAGE);return}if(arg==="--remote"){let{runAddRemote}=await import("./chunk-
|
|
8
|
+
`);async function runAddSubcommand(rest){let arg=rest[0];if(arg==="--help"||arg==="-h"||arg==="help"){process.stdout.write(ADD_USAGE);return}if(arg==="--remote"){let{runAddRemote}=await import("./chunk-ykyertq9.js");await runAddRemote(rest.slice(1));return}if(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} add: unknown flag "${arg}"
|
|
9
9
|
|
|
10
|
-
${ADD_USAGE}`),process.exit(2);let target=resolve2(process.cwd(),expandTilde(arg&&arg.length>0?arg:".")),{addSavedRepo}=await import("./chunk-
|
|
10
|
+
${ADD_USAGE}`),process.exit(2);let target=resolve2(process.cwd(),expandTilde(arg&&arg.length>0?arg:".")),{addSavedRepo}=await import("./chunk-hv79ys32.js"),result=addSavedRepo(target);if(result.rejected)process.stderr.write(`${CLI_NAME} add: "${arg&&arg.length>0?arg:"."}" cannot be a project \u2014 ${rejectionReason(result.rejected)} (resolved to ${result.path}).
|
|
11
11
|
`),process.exit(1);if(result.added)console.log(`added ${result.path} (${result.total} saved repo${result.total===1?"":"s"} total)`);else console.log(`already saved: ${result.path}`);await ensureProjectMainTask(result.path),await adoptAllWorktrees(result.path)}async function ensureProjectMainTask(repo){try{await withDaemonOrLocal({daemon:(client)=>client.request("task.ensureMain",{repo}),local:(orch)=>orch.ensureMainTask(repo)})}catch(err){console.error(`(skipped project main-task setup: ${errorMessage(err)}). Run ${CLI_NAME} doctor, then retry ${CLI_NAME} add.`)}}var PURGE_FLAG="--purge-credentials",REMOVE_USAGE=[`Usage: ${CLI_NAME} remove [path] [--purge-credentials]`,"","Forget a saved project (drop it from the new-task picker). Non-destructive:","the repo's files, worktrees, branches and tasks all stay on disk. A remote","(ssh://) project also has its stored connection config dropped.",""," path defaults to the current directory. Pass an exact saved entry (e.g. a"," remote `ssh://user@host` key) to remove it verbatim. Run with no match to"," print the current saved projects.",""," --purge-credentials also delete the remote project's SSH password from"," the OS keychain. Off by default: forgetting a project"," should not silently destroy a stored secret.",""].join(`
|
|
12
12
|
`);async function runRemoveSubcommand(rest){let purgeCredentials=switchFlag(rest,PURGE_FLAG),arg=rest.filter((a)=>a!==PURGE_FLAG&&!a.startsWith(`${PURGE_FLAG}=`))[0];if(arg==="--help"||arg==="-h"||arg==="help"){process.stdout.write(REMOVE_USAGE);return}if(purgeCredentials===void 0)process.stderr.write(`${CLI_NAME} remove: ${PURGE_FLAG} takes true or false
|
|
13
13
|
|
|
14
14
|
${REMOVE_USAGE}`),process.exit(2);if(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} remove: unknown flag "${arg}"
|
|
15
15
|
|
|
16
|
-
${REMOVE_USAGE}`),process.exit(2);let{getRemoteRepoConfig,getSavedRepos,resolveRepoRoot}=await import("./chunk-
|
|
16
|
+
${REMOVE_USAGE}`),process.exit(2);let{getRemoteRepoConfig,getSavedRepos,resolveRepoRoot}=await import("./chunk-hv79ys32.js"),saved=getSavedRepos();if(saved.length===0){console.log("no saved projects to remove.");return}let raw=arg&&arg.length>0?arg:".",target=saved.includes(raw)?raw:(()=>{let abs=resolve2(process.cwd(),expandTilde(raw)),top=resolveRepoRoot(abs);if(saved.includes(top))return top;if(saved.includes(abs))return abs;return null})();if(target===null){process.stderr.write(`${CLI_NAME} remove: "${raw}" is not a saved project.
|
|
17
17
|
|
|
18
18
|
Saved projects:
|
|
19
19
|
`);for(let p of saved)process.stderr.write(` ${p}
|
|
@@ -22,8 +22,8 @@ Saved projects:
|
|
|
22
22
|
|
|
23
23
|
${ADOPT_USAGE}
|
|
24
24
|
`),process.exit(2)}async function runAdoptSubcommand(args){let glob,repoArg,vendorArg,yes=!1;for(let i=0;i<args.length;i++){let a=args[i];if(a==="--help"||a==="-h"||a==="help"){process.stdout.write(`${ADOPT_USAGE}
|
|
25
|
-
`);return}if(a==="--repo"){if(repoArg=args[++i],repoArg===void 0)adoptUsageError("--repo requires a value")}else if(a==="--vendor"){if(vendorArg=args[++i],vendorArg===void 0)adoptUsageError("--vendor requires a value")}else if(a==="--yes"||a==="-y")yes=!0;else if(a&&!a.startsWith("-")&&glob===void 0)glob=a;else adoptUsageError(`unexpected argument "${a}"`)}let{getCustomEngineIds,resolveRepoRoot}=await import("./chunk-
|
|
25
|
+
`);return}if(a==="--repo"){if(repoArg=args[++i],repoArg===void 0)adoptUsageError("--repo requires a value")}else if(a==="--vendor"){if(vendorArg=args[++i],vendorArg===void 0)adoptUsageError("--vendor requires a value")}else if(a==="--yes"||a==="-y")yes=!0;else if(a&&!a.startsWith("-")&&glob===void 0)glob=a;else adoptUsageError(`unexpected argument "${a}"`)}let{getCustomEngineIds,resolveRepoRoot}=await import("./chunk-hv79ys32.js"),repo=resolveRepoRoot(resolve2(process.cwd(),expandTilde(repoArg&&repoArg.length>0?repoArg:"."))),typed=vendorArg?.trim();if(typed&&!isBuiltinVendor(typed)&&!getCustomEngineIds().includes(typed)){let known=[...BUILTIN_VENDORS,...getCustomEngineIds()].join(", ");adoptUsageError(`unknown engine "${typed}" \u2014 no task was created. Known engines: ${known}`)}let vendor=coerceVendorId(vendorArg),orch=await openLocalOrchestrator(),worktrees=await orch.discoverAdoptableWorktrees(repo);if(worktrees.length===0){console.log(`no adoptable worktrees for ${repo} \u2014 every git worktree here is already a task`);return}let isMatch=(w)=>!glob||matchPathGlob(glob,w.path);console.log(`adoptable worktrees in ${repo}:`);for(let w of worktrees){let hit=glob?isMatch(w)?"*":" ":"-",tags=[w.dirty===!0?"dirty":w.dirty===null?"dirty?":"",w.roveManaged?"":"external"].filter(Boolean).join(",");console.log(` ${hit} ${w.branch} ${w.path}${tags?` (${tags})`:""}`)}if(!glob){console.log(`
|
|
26
26
|
pass a path glob to adopt, e.g. ${CLI_NAME} adopt '${repo}/*' --yes`);return}let matched=worktrees.filter(isMatch);if(matched.length===0){console.log(`
|
|
27
27
|
no worktrees match glob ${JSON.stringify(glob)}`);return}if(!yes){console.log(`
|
|
28
28
|
${matched.length} worktree(s) match \u2014 re-run with --yes to adopt them`);return}await adoptWorktreesInto(orch,repo,matched,vendor),console.log(`done \u2014 adopted ${matched.length} worktree(s)`)}function printTopLevelUsage(out){out.write(`${topLevelUsage()}
|
|
29
|
-
`)}var COMMANDS=new Map([["add",runAddSubcommand],["remove",runRemoveSubcommand],["adopt",runAdoptSubcommand],...DYNAMIC_COMMANDS]);async function main(){let[,,...rawArgs]=process.argv,[subcommand,...rest]=rawArgs;if(subcommand==="--version"||subcommand==="-v"||subcommand==="version"){let{CURRENT_VERSION:CURRENT_VERSION2}=await import("./chunk-
|
|
29
|
+
`)}var COMMANDS=new Map([["add",runAddSubcommand],["remove",runRemoveSubcommand],["adopt",runAdoptSubcommand],...DYNAMIC_COMMANDS]);async function main(){let[,,...rawArgs]=process.argv,[subcommand,...rest]=rawArgs;if(subcommand==="--version"||subcommand==="-v"||subcommand==="version"){let{CURRENT_VERSION:CURRENT_VERSION2}=await import("./chunk-5r4d0h87.js");console.log(`${CLI_NAME} ${CURRENT_VERSION2}`);return}if(subcommand==="--help"||subcommand==="-h"||subcommand==="help"){printTopLevelUsage(process.stdout);return}if(subcommand==="--skill"){let{runSkillSubcommand}=await import("./chunk-hy0r635n.js");await runSkillSubcommand(["print"]);return}if(subcommand==="--web"){let{runWebSubcommand}=await import("./chunk-hf168gph.js");await runWebSubcommand(rest);return}let handler=subcommand!==void 0?COMMANDS.get(subcommand):void 0;if(handler){await handler(rest);return}if(subcommand!==void 0&&isPathLikeArg(subcommand)){await runOpenDirectory(subcommand);return}if(subcommand!==void 0)console.error(`${CLI_NAME}: unknown command '${subcommand}'`),printTopLevelUsage(process.stderr),process.exit(2);let{publishRoveTerminalTitle}=await import("./chunk-g8wrdp7n.js");publishRoveTerminalTitle();let{launchTui}=await import("./chunk-vd6z4v6p.js");await launchTui()}main().catch((err)=>{console.error(formatCliFailure(err,{cliName:CLI_NAME,argv:process.argv,cwd:process.cwd(),env:process.env})),process.exit(1)});
|
|
@@ -40,6 +40,7 @@ import { basename as basename2, dirname as dirname2, join as join2 } from "node:
|
|
|
40
40
|
// ../rove-daemon/src/daemon/pre-rename-runtime.ts
|
|
41
41
|
import { basename, dirname, join } from "node:path";
|
|
42
42
|
var LEGACY_PRE_RENAME_RUNTIME_NAME = "kobe";
|
|
43
|
+
var PRE_RENAME_VERSION_KEY = `${LEGACY_PRE_RENAME_RUNTIME_NAME}Version`;
|
|
43
44
|
function preRenameStateDir(home) {
|
|
44
45
|
return join(home, `.${LEGACY_PRE_RENAME_RUNTIME_NAME}`);
|
|
45
46
|
}
|
|
@@ -726,6 +727,7 @@ var DAEMON_CHANNELS = [
|
|
|
726
727
|
"issue.snapshot",
|
|
727
728
|
"tabs.changed",
|
|
728
729
|
"row.status",
|
|
730
|
+
"dispatch.snapshot",
|
|
729
731
|
"active-task",
|
|
730
732
|
"update",
|
|
731
733
|
"engine-state",
|
|
@@ -733,6 +735,8 @@ var DAEMON_CHANNELS = [
|
|
|
733
735
|
"gates",
|
|
734
736
|
"ui-prefs",
|
|
735
737
|
"keybindings",
|
|
738
|
+
"state",
|
|
739
|
+
"machines",
|
|
736
740
|
"task.jobs",
|
|
737
741
|
"task.tokens",
|
|
738
742
|
"worktree.changes",
|
|
@@ -765,6 +769,7 @@ var BLOCKING_RPCS = new Set([
|
|
|
765
769
|
"automation.runNow",
|
|
766
770
|
"pr.rerunFailedChecks",
|
|
767
771
|
"task.ensureWorktree",
|
|
772
|
+
"task.spawn",
|
|
768
773
|
"task.ensureMain",
|
|
769
774
|
"worktree.discoverAdoptable",
|
|
770
775
|
"worktree.adopt",
|
|
@@ -2705,9 +2710,13 @@ using System.Runtime.InteropServices;
|
|
|
2705
2710
|
public static class RoveDetachedLaunch {
|
|
2706
2711
|
[StructLayout(LayoutKind.Sequential)] public struct SA { public int nLength; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; }
|
|
2707
2712
|
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] public struct SI { public int cb; public string lpReserved; public string lpDesktop; public string lpTitle; public int dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags; public short wShowWindow, cbReserved2; public IntPtr lpReserved2, hStdInput, hStdOutput, hStdError; }
|
|
2713
|
+
[StructLayout(LayoutKind.Sequential)] public struct SIEX { public SI StartupInfo; public IntPtr lpAttributeList; }
|
|
2708
2714
|
[StructLayout(LayoutKind.Sequential)] public struct PI { public IntPtr hProcess, hThread; public int dwProcessId, dwThreadId; }
|
|
2709
2715
|
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern IntPtr CreateFile(string name, uint access, uint share, ref SA sa, uint disposition, uint flags, IntPtr template);
|
|
2710
|
-
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern bool CreateProcess(string app, string cmd, IntPtr pa, IntPtr ta, bool inherit, uint flags, IntPtr env, string cwd, ref
|
|
2716
|
+
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern bool CreateProcess(string app, string cmd, IntPtr pa, IntPtr ta, bool inherit, uint flags, IntPtr env, string cwd, ref SIEX si, out PI pi);
|
|
2717
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool InitializeProcThreadAttributeList(IntPtr list, int count, int flags, ref IntPtr size);
|
|
2718
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool UpdateProcThreadAttribute(IntPtr list, uint flags, IntPtr attr, IntPtr value, IntPtr size, IntPtr prev, IntPtr ret);
|
|
2719
|
+
[DllImport("kernel32.dll")] static extern void DeleteProcThreadAttributeList(IntPtr list);
|
|
2711
2720
|
[DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr h);
|
|
2712
2721
|
public static int Launch(string cmd, string log) {
|
|
2713
2722
|
SA sa = new SA(); sa.nLength = Marshal.SizeOf(sa); sa.bInheritHandle = true;
|
|
@@ -2715,13 +2724,26 @@ public static class RoveDetachedLaunch {
|
|
|
2715
2724
|
IntPtr h = CreateFile(log, 0x0004 | 0x80000000, 0x1 | 0x2, ref sa, 4, 0x80, IntPtr.Zero);
|
|
2716
2725
|
if (h == (IntPtr)(-1)) throw new Exception("CreateFile(" + log + ") failed: " + Marshal.GetLastWin32Error());
|
|
2717
2726
|
IntPtr nul = CreateFile("NUL", 0x80000000, 0x1 | 0x2, ref sa, 3, 0x80, IntPtr.Zero);
|
|
2718
|
-
|
|
2719
|
-
si.dwFlags = 0x100 | 0x1; // STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW
|
|
2720
|
-
si.wShowWindow = 0; // SW_HIDE
|
|
2721
|
-
si.hStdInput = nul; si.hStdOutput = h; si.hStdError = h;
|
|
2727
|
+
SIEX si = new SIEX(); si.StartupInfo.cb = Marshal.SizeOf(si);
|
|
2728
|
+
si.StartupInfo.dwFlags = 0x100 | 0x1; // STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW
|
|
2729
|
+
si.StartupInfo.wShowWindow = 0; // SW_HIDE
|
|
2730
|
+
si.StartupInfo.hStdInput = nul; si.StartupInfo.hStdOutput = h; si.StartupInfo.hStdError = h;
|
|
2731
|
+
// Inherit ONLY the log and NUL: an inheritable handle leaked from the spawner (an ssh
|
|
2732
|
+
// session's stdout pipe) would keep that session open for as long as the child lives.
|
|
2733
|
+
IntPtr handles = Marshal.AllocHGlobal(2 * IntPtr.Size);
|
|
2734
|
+
Marshal.WriteIntPtr(handles, 0, h); Marshal.WriteIntPtr(handles, IntPtr.Size, nul);
|
|
2735
|
+
IntPtr size = IntPtr.Zero;
|
|
2736
|
+
InitializeProcThreadAttributeList(IntPtr.Zero, 1, 0, ref size);
|
|
2737
|
+
si.lpAttributeList = Marshal.AllocHGlobal(size);
|
|
2738
|
+
if (!InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, ref size)) throw new Exception("InitializeProcThreadAttributeList failed: " + Marshal.GetLastWin32Error());
|
|
2739
|
+
// PROC_THREAD_ATTRIBUTE_HANDLE_LIST
|
|
2740
|
+
if (!UpdateProcThreadAttribute(si.lpAttributeList, 0, (IntPtr)0x20002, handles, (IntPtr)(2 * IntPtr.Size), IntPtr.Zero, IntPtr.Zero)) throw new Exception("UpdateProcThreadAttribute failed: " + Marshal.GetLastWin32Error());
|
|
2722
2741
|
PI pi;
|
|
2723
|
-
uint flags = 0x00000010 | 0x01000000 | 0x00000200; // CREATE_NEW_CONSOLE | CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_PROCESS_GROUP
|
|
2724
|
-
|
|
2742
|
+
uint flags = 0x00000010 | 0x01000000 | 0x00000200 | 0x00080000; // CREATE_NEW_CONSOLE | CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_PROCESS_GROUP | EXTENDED_STARTUPINFO_PRESENT
|
|
2743
|
+
bool ok = CreateProcess(null, cmd, IntPtr.Zero, IntPtr.Zero, true, flags, IntPtr.Zero, null, ref si, out pi);
|
|
2744
|
+
int err = Marshal.GetLastWin32Error();
|
|
2745
|
+
DeleteProcThreadAttributeList(si.lpAttributeList); Marshal.FreeHGlobal(si.lpAttributeList); Marshal.FreeHGlobal(handles);
|
|
2746
|
+
if (!ok) throw new Exception("CreateProcess failed: " + err);
|
|
2725
2747
|
CloseHandle(h); CloseHandle(nul); CloseHandle(pi.hThread); CloseHandle(pi.hProcess);
|
|
2726
2748
|
return pi.dwProcessId;
|
|
2727
2749
|
}
|
package/dist/cli/rove-run.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{isObject}from"./chunk-7ghwdjdc.js";import{migrateRoveClientStateLayout}from"./chunk-
|
|
3
|
+
import{isObject}from"./chunk-7ghwdjdc.js";import{migrateRoveClientStateLayout}from"./chunk-8t7qbr1e.js";import{updateStateFile}from"./chunk-32j6y5d1.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import{kvStatePath}from"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-yt15y085.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";import{readFileSync}from"fs";var RENAMED_KEY_PREFIXES=[{from:"autoEffort.",to:"autoRouting."}],NOTHING={moved:0,superseded:0};function legacyRename(key){for(let{from,to}of RENAMED_KEY_PREFIXES)if(key.startsWith(from))return`${to}${key.slice(from.length)}`;return}function isStateObject(text){try{let parsed=JSON.parse(text);return isObject(parsed)}catch{return!1}}function migrateRenamedStateKeys(){let text;try{text=readFileSync(kvStatePath(),"utf8")}catch{return NOTHING}if(!RENAMED_KEY_PREFIXES.some(({from})=>text.includes(`"${from}`)))return NOTHING;if(!isStateObject(text))return NOTHING;let moved=0,superseded=0;try{updateStateFile((state)=>{for(let[key,value]of Object.entries(state)){let renamed=legacyRename(key);if(renamed===void 0)continue;if(renamed in state)superseded+=1;else state[renamed]=value,moved+=1;delete state[key]}return moved+superseded>0})}catch{return NOTHING}return{moved,superseded}}function prepareCliStateLayout(env=process.env){let result=migrateRoveClientStateLayout(env);for(let warning of result.warnings)console.error(`[rove] state migration will retry: ${warning}. Check the source/destination permissions, then relaunch Rove.`);migrateRenamedStateKeys()}prepareCliStateLayout();await import("./index.js");
|
package/dist/cli/rove.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{join as l}from"node:path";import{createInterface as a}from"node:readline/promises";import{pathToFileURL as ss}from"node:url";import{spawnSync as Q}from"node:child_process";import{constants as e,accessSync as V}from"node:fs";import{homedir as R}from"node:os";import{basename as o,delimiter as I,dirname as U,join as y}from"node:path";import{fileURLToPath as T}from"node:url";var H={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.
|
|
2
|
+
import{join as l}from"node:path";import{createInterface as a}from"node:readline/promises";import{pathToFileURL as ss}from"node:url";import{spawnSync as Q}from"node:child_process";import{constants as e,accessSync as V}from"node:fs";import{homedir as R}from"node:os";import{basename as o,delimiter as I,dirname as U,join as y}from"node:path";import{fileURLToPath as T}from"node:url";var H={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.267",description:"Rove — 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:{rove:"dist/cli/rove.js"},files:["dist/cli","dist/completions","dist/web","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:mock":"ROVE_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","build:rubric":"bun run scripts/build-tier-rubric.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":"ROVE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"ROVE_INCLUDE_SOCKET=1 ROVE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"ROVE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun scripts/render-track.mjs",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",react:"^19.2.8","smol-toml":"^1.7.1",ws:"^8.21.3"},optionalDependencies:{"node-pty":"^1.1.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/rove-daemon":"0.7.22","@tsconfig/bun":"1.0.11","@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","rove-bridge":"0.0.28","rove-weixin":"0.0.28",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var q="rove";var k=q;var z="ROVE_BUN",_="ROVE_NO_BUN_BOOTSTRAP",F="ROVE_SKIP_BUN_CHECK",$=H.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",L=(s)=>{try{return V(s,e.X_OK),!0}catch{return!1}},B=(s)=>s==="win32"?"bun.exe":"bun",f=(s)=>{let t=Q(s,["--version"],{encoding:"utf8",timeout:5000});if(t.error||t.status!==0)return null;return t.stdout?.split(`
|
|
3
3
|
`)[0]?.trim()??""};function J(s){return s.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function X(s,t=$){let c=J(s),W=J(t);if(!c||!W)return!0;let b=c.split(".").map(Number),g=W.split(".").map(Number);for(let p=0;p<3;p++){let r=b[p]??0,i=g[p]??0;if(r!==i)return r>i}return!0}function Y(s=process.env){return s[F]==="1"}function A(s={}){let t=s.env??process.env,c=s.platform??process.platform,W=s.home??t.HOME??t.USERPROFILE??R(),b=B(c),g=[],p=t[z]?.trim();if(p)g.push(p);for(let G of(t.PATH??t.Path??"").split(I))if(G)g.push(y(G,b));let r=t.BUN_INSTALL?.trim();if(r)g.push(y(r,"bin",b));if(W)g.push(y(W,".bun","bin",b));let i=s.launcherDir;if(i)g.push(y(i,"..","..","node_modules","bun","bin",b)),g.push(y(i,"..","..","..","bun","bin",b));return g}function N(s={}){let t=s.isExecutable??L;return A(s).find((c)=>t(c))??null}function Z(s={}){let t=s.isExecutable??L,c=s.bunVersionOf??f;if(Y(s.env??process.env))return{bun:N(s),stale:null,unusable:null};let W=null,b=null;for(let g of A(s)){if(!t(g))continue;let p=c(g);if(p===null){b??=g;continue}if(X(p))return{bun:g,stale:W,unusable:b};W??={path:g,version:J(p)??p}}return{bun:null,stale:W,unusable:b}}function h(s){return U(T(s))}function C(s){return o(T(s)).replace(/\.[cm]?[jt]s$/,"")}function n(s=process.platform){return s==="win32"?["powershell","-NoProfile","-Command","irm bun.sh/install.ps1 | iex"]:["bash","-c","curl -fsSL https://bun.sh/install | bash"]}function D(s=k,t=process.platform){let c=t==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash";return[`${s}: Rove runs on the Bun runtime, and no Bun was found on this machine.`,"","Install Bun, then run this command again:",` ${c}`," npm install -g bun # any platform, if you already have npm","","Or install Bun and Rove together in one step:"," curl -fsSL https://rove.run/install.sh | sh","",`Already have Bun somewhere unusual? Point Rove at it: ${z}=/path/to/bun`,""].join(`
|
|
4
4
|
`)}function j(s,t,c=k){return[`${c}: this machine's Bun is too old for Rove — found ${t} at ${s}, need ${$} or newer.`,"","Rove's terminals are built on Bun's PTY API. An older Bun ignores it silently,","so every terminal and engine tab would open empty and stay empty.","","Upgrade Bun, then run this command again:"," bun upgrade # Bun installed itself (~/.bun)"," brew upgrade bun # Homebrew"," npm install -g bun@latest # npm-managed Bun","",`Have a newer Bun elsewhere? Point Rove at it: ${z}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${F}=1`,""].join(`
|
|
5
5
|
`)}function v(s,t=k){return[`${t}: the Bun at ${s} could not be run — \`${s} --version\` failed or never returned.`,"","Rove skipped it rather than starting through it, which would hang or fail","with a message from that binary instead of this one.","","Reinstall Bun, then run this command again:"," curl -fsSL https://bun.sh/install | bash","",`Have a working Bun elsewhere? Point Rove at it: ${z}=/path/to/bun`,""].join(`
|
|
@@ -12,7 +12,7 @@ _rove() {
|
|
|
12
12
|
fi
|
|
13
13
|
if [[ ${COMP_CWORD} -eq 2 ]]; then
|
|
14
14
|
case "${prev}" in
|
|
15
|
-
api) COMPREPLY=( $(compgen -W "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file repo-match repo-list publish deliveries should-run add send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt" -- "${cur}") ) ;;
|
|
15
|
+
api) COMPREPLY=( $(compgen -W "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file repo-match repo-list publish deliveries should-run add spawn send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt" -- "${cur}") ) ;;
|
|
16
16
|
daemon) COMPREPLY=( $(compgen -W "status start stop restart relay" -- "${cur}") ) ;;
|
|
17
17
|
machine) COMPREPLY=( $(compgen -W "add doctor remove list" -- "${cur}") ) ;;
|
|
18
18
|
plugin) COMPREPLY=( $(compgen -W "install link list search outdated update enable disable unlink uninstall config-dir log action pane" -- "${cur}") ) ;;
|
|
@@ -19,7 +19,7 @@ complete -c rove -f -n __fish_use_subcommand -a skill
|
|
|
19
19
|
complete -c rove -f -n __fish_use_subcommand -a plugin
|
|
20
20
|
complete -c rove -f -n __fish_use_subcommand -a feedback
|
|
21
21
|
complete -c rove -f -n __fish_use_subcommand -a update
|
|
22
|
-
complete -c rove -f -n "__fish_seen_subcommand_from api" -a "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file repo-match repo-list publish deliveries should-run add send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt"
|
|
22
|
+
complete -c rove -f -n "__fish_seen_subcommand_from api" -a "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file repo-match repo-list publish deliveries should-run add spawn send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt"
|
|
23
23
|
complete -c rove -f -n "__fish_seen_subcommand_from daemon" -a "status start stop restart relay"
|
|
24
24
|
complete -c rove -f -n "__fish_seen_subcommand_from machine" -a "add doctor remove list"
|
|
25
25
|
complete -c rove -f -n "__fish_seen_subcommand_from plugin" -a "install link list search outdated update enable disable unlink uninstall config-dir log action pane"
|
|
@@ -13,7 +13,7 @@ _rove() {
|
|
|
13
13
|
|
|
14
14
|
verbs=()
|
|
15
15
|
case "${words[2]}" in
|
|
16
|
-
api) verbs=("schema" "engine-list" "list" "get-task" "pty-list" "collect" "context" "digest" "agent-turns" "inspect" "read-output" "watch" "worktree-files" "worktree-diff" "worktree-diff-file" "repo-match" "repo-list" "publish" "deliveries" "should-run" "add" "send" "dispatch" "interrupt" "note" "note-list" "note-delete" "pane-open" "pane-close" "pane-graphics" "tab-close" "tab-new" "tab-split" "notify" "prompt" "engine-report" "row-token" "set-active" "report" "attention-dismiss" "gate-raise" "gate-answer" "gate-withdraw" "gates" "feedback" "issue-list" "issue-create" "issue-update" "issue-delete" "routine-list" "routine-create" "routine-update" "routine-delete" "routine-run-now" "routine-respond" "routine-runs" "workitem-list" "workitem-start" "update" "land" "delete" "ensure-worktree" "remove-worktree" "discover-adoptable" "adopt") ;;
|
|
16
|
+
api) verbs=("schema" "engine-list" "list" "get-task" "pty-list" "collect" "context" "digest" "agent-turns" "inspect" "read-output" "watch" "worktree-files" "worktree-diff" "worktree-diff-file" "repo-match" "repo-list" "publish" "deliveries" "should-run" "add" "spawn" "send" "dispatch" "interrupt" "note" "note-list" "note-delete" "pane-open" "pane-close" "pane-graphics" "tab-close" "tab-new" "tab-split" "notify" "prompt" "engine-report" "row-token" "set-active" "report" "attention-dismiss" "gate-raise" "gate-answer" "gate-withdraw" "gates" "feedback" "issue-list" "issue-create" "issue-update" "issue-delete" "routine-list" "routine-create" "routine-update" "routine-delete" "routine-run-now" "routine-respond" "routine-runs" "workitem-list" "workitem-start" "update" "land" "delete" "ensure-worktree" "remove-worktree" "discover-adoptable" "adopt") ;;
|
|
17
17
|
daemon) verbs=("status" "start" "stop" "restart" "relay") ;;
|
|
18
18
|
machine) verbs=("add" "doctor" "remove" "list") ;;
|
|
19
19
|
plugin) verbs=("install" "link" "list" "search" "outdated" "update" "enable" "disable" "unlink" "uninstall" "config-dir" "log" "action" "pane") ;;
|