@sma1lboy/rove 0.9.154 → 0.9.156
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-0fhab4tq.js +2 -0
- package/dist/cli/{chunk-79gqh5p2.js → chunk-0wnfq5sx.js} +1 -1
- package/dist/cli/{chunk-pxtx1gcf.js → chunk-1aqmmea7.js} +1 -1
- package/dist/cli/{chunk-9zb2wkfr.js → chunk-25hxhtdr.js} +1 -1
- package/dist/cli/{chunk-aedrswty.js → chunk-2ernbaey.js} +3 -3
- package/dist/cli/{chunk-73qrq7bg.js → chunk-32h9htyh.js} +1 -1
- package/dist/cli/{chunk-d393z1mj.js → chunk-38272eqv.js} +1 -1
- package/dist/cli/chunk-39x1ztey.js +4 -0
- package/dist/cli/{chunk-s8eh3cf1.js → chunk-3wj69b0a.js} +1 -1
- package/dist/cli/{chunk-94z64m9x.js → chunk-3xcz7mz7.js} +2 -2
- package/dist/cli/{chunk-5wzap7r2.js → chunk-41ahvk51.js} +1 -1
- package/dist/cli/{chunk-5bn91n19.js → chunk-4502n1bk.js} +1 -1
- package/dist/cli/{chunk-8kvyjb4p.js → chunk-45p9xh44.js} +1 -1
- package/dist/cli/{chunk-183ptzzh.js → chunk-4a37bmpm.js} +1 -1
- package/dist/cli/{chunk-7z9cqycv.js → chunk-4gjr08g0.js} +1 -1
- package/dist/cli/chunk-4pmd0mxp.js +4 -0
- package/dist/cli/{chunk-ke95ebrz.js → chunk-5f80ggc3.js} +1 -1
- package/dist/cli/{chunk-rsqx358z.js → chunk-5v893waj.js} +1 -1
- package/dist/cli/{chunk-8gsqypg8.js → chunk-6123622n.js} +2 -2
- package/dist/cli/{chunk-4exg1101.js → chunk-667hcm3g.js} +2 -2
- package/dist/cli/{chunk-43n38xv5.js → chunk-6bbj9axg.js} +2 -2
- package/dist/cli/{chunk-5snrwe65.js → chunk-6pt23vas.js} +1 -1
- package/dist/cli/{chunk-3ztek08w.js → chunk-7j5372wb.js} +1 -1
- package/dist/cli/chunk-7ntf5hdf.js +15 -0
- package/dist/cli/chunk-7x88845e.js +2 -0
- package/dist/cli/{chunk-h3hw5vpc.js → chunk-88vvd6qz.js} +1 -1
- package/dist/cli/chunk-8kaqpb7t.js +2 -0
- package/dist/cli/chunk-8kj2s16b.js +7 -0
- package/dist/cli/{chunk-mb5m7ex7.js → chunk-91f68r6e.js} +1 -1
- package/dist/cli/{chunk-55xkvzvw.js → chunk-98zhyhpz.js} +1 -1
- package/dist/cli/{chunk-j5bmtpkc.js → chunk-9g7hamhv.js} +1 -1
- package/dist/cli/{chunk-y9ksfpbp.js → chunk-9xt05etk.js} +1 -1
- package/dist/cli/{chunk-8qb8kksk.js → chunk-9ypg30c1.js} +1 -1
- package/dist/cli/{chunk-gc25wht3.js → chunk-aak5ttgt.js} +1 -1
- package/dist/cli/{chunk-nywh3yb9.js → chunk-axfn4f28.js} +1 -1
- package/dist/cli/{chunk-8r1pnch1.js → chunk-bwyskwer.js} +1 -1
- package/dist/cli/{chunk-51y7sjhe.js → chunk-c43g3qcb.js} +1 -1
- package/dist/cli/chunk-caqpt09m.js +3 -0
- package/dist/cli/{chunk-07k2njwk.js → chunk-ch9b1d5y.js} +1 -1
- package/dist/cli/{chunk-mf7xghwj.js → chunk-cqaxnve9.js} +1 -1
- package/dist/cli/chunk-d2p1za6y.js +2 -0
- package/dist/cli/{chunk-rrzepm47.js → chunk-d57awd05.js} +2 -2
- package/dist/cli/{chunk-2z90jxcn.js → chunk-de751t37.js} +1 -1
- package/dist/cli/chunk-dmdpsw2y.js +2 -0
- package/dist/cli/{chunk-37gnmm2m.js → chunk-ds9qf1w1.js} +1 -1
- package/dist/cli/{chunk-703edkrq.js → chunk-dwbtszh0.js} +1 -1
- package/dist/cli/chunk-dzd1wy5a.js +2 -0
- package/dist/cli/{chunk-svpn3av1.js → chunk-e17gszac.js} +1 -1
- package/dist/cli/{chunk-es2agvre.js → chunk-e9cpb5jt.js} +15 -14
- package/dist/cli/{chunk-8ad0ba2n.js → chunk-esk240e5.js} +2 -2
- package/dist/cli/{chunk-yshnare4.js → chunk-exggdhpt.js} +1 -1
- package/dist/cli/chunk-fd2zhddn.js +3 -0
- package/dist/cli/{chunk-tt0fde40.js → chunk-fm5s7njg.js} +1 -1
- package/dist/cli/{chunk-cb2fpajx.js → chunk-g56kvet6.js} +1 -1
- package/dist/cli/{chunk-z83wxkg6.js → chunk-g90z5s39.js} +2 -2
- package/dist/cli/{chunk-9gz7jmgq.js → chunk-gkfd073t.js} +1 -1
- package/dist/cli/chunk-hj08heah.js +10 -0
- package/dist/cli/{chunk-rgnnq8wk.js → chunk-j20cerws.js} +1 -1
- package/dist/cli/{chunk-grh6dvfv.js → chunk-k2ckx8zw.js} +1 -1
- package/dist/cli/{chunk-c6mthex1.js → chunk-ksbvcxc3.js} +1 -1
- package/dist/cli/{chunk-deejtpcr.js → chunk-kt1ppyje.js} +1 -1
- package/dist/cli/{chunk-fg38d91k.js → chunk-m45w6v9d.js} +4 -4
- package/dist/cli/{chunk-vpzvcxc1.js → chunk-max057d8.js} +1 -1
- package/dist/cli/{chunk-1a7ctg07.js → chunk-mbvk5758.js} +1 -1
- package/dist/cli/chunk-mcdv19rs.js +3 -0
- package/dist/cli/{chunk-xhn25xaa.js → chunk-me2752c0.js} +1 -1
- package/dist/cli/chunk-mhs6yywx.js +2 -0
- package/dist/cli/{chunk-ffgb1a1n.js → chunk-mhzv94cg.js} +1 -1
- package/dist/cli/{chunk-z4c6bmw0.js → chunk-mkkp4c5t.js} +2 -2
- package/dist/cli/{chunk-kwe61yx7.js → chunk-mnqxgvyb.js} +1 -1
- package/dist/cli/{chunk-d809qqsk.js → chunk-mp8v5gn8.js} +1 -1
- package/dist/cli/chunk-mqnr4p48.js +2 -0
- package/dist/cli/{chunk-4wwx51m5.js → chunk-mqqnk8w7.js} +1 -1
- package/dist/cli/{chunk-4tzgma89.js → chunk-msr1xtay.js} +1 -1
- package/dist/cli/{chunk-86bjqmg1.js → chunk-n4nntq73.js} +1 -1
- package/dist/cli/{chunk-g5nz190n.js → chunk-n7n12868.js} +1 -1
- package/dist/cli/{chunk-btadstee.js → chunk-n80h9k0r.js} +1 -1
- package/dist/cli/chunk-ngnrz33z.js +3 -0
- package/dist/cli/{chunk-pdh5w4ht.js → chunk-nm0pq5r6.js} +1 -1
- package/dist/cli/{chunk-p1d3ag8b.js → chunk-nss70xwr.js} +1 -1
- package/dist/cli/{chunk-v9p6gxm0.js → chunk-ntt7gy5a.js} +1 -1
- package/dist/cli/chunk-nx7ahbsg.js +2 -0
- package/dist/cli/{chunk-yk2ha5yj.js → chunk-nyv7a76k.js} +1 -1
- package/dist/cli/{chunk-ef11h2am.js → chunk-p7s4xwgx.js} +1 -1
- package/dist/cli/{chunk-rkt1qjec.js → chunk-ptjc5mtc.js} +1 -1
- package/dist/cli/{chunk-4y2vsnhs.js → chunk-qch6g9za.js} +2 -2
- package/dist/cli/chunk-r05r01nv.js +3 -0
- package/dist/cli/{chunk-dp3rdb1p.js → chunk-r0z1bhjg.js} +1 -1
- package/dist/cli/{chunk-3bfm4hrs.js → chunk-r3k9rbwm.js} +1 -1
- package/dist/cli/chunk-r639wna1.js +2 -0
- package/dist/cli/chunk-rc668r26.js +2 -0
- package/dist/cli/{chunk-ea1r26pa.js → chunk-sfv15era.js} +1 -1
- package/dist/cli/chunk-sram9jmt.js +2 -0
- package/dist/cli/{chunk-92vsj4mv.js → chunk-svg7ee0z.js} +1 -1
- package/dist/cli/{chunk-z1e1bsv5.js → chunk-t27t2x9b.js} +1 -1
- package/dist/cli/{chunk-c1xp9qx6.js → chunk-t3z4etp5.js} +1 -1
- package/dist/cli/{chunk-mmd7zehs.js → chunk-t7xhb2jx.js} +1 -1
- package/dist/cli/chunk-t90vnrpk.js +2 -0
- package/dist/cli/{chunk-a4h476hv.js → chunk-vj2vdx3w.js} +1 -1
- package/dist/cli/chunk-wbt845s6.js +4 -0
- package/dist/cli/{chunk-e8493db0.js → chunk-wdhcrcre.js} +1 -1
- package/dist/cli/{chunk-k1tm3bys.js → chunk-we0gedwp.js} +1 -1
- package/dist/cli/{chunk-g6ww85sh.js → chunk-ybcacmqv.js} +1 -1
- package/dist/cli/{chunk-h5jhdjv7.js → chunk-yfy6031g.js} +1 -1
- package/dist/cli/{chunk-ewdhz3dv.js → chunk-yhwb91e4.js} +1 -1
- package/dist/cli/chunk-yqvrr5kt.js +2 -0
- package/dist/cli/{chunk-r8mk1aw4.js → chunk-ywtsabyg.js} +1 -1
- package/dist/cli/{chunk-5c3d1y0r.js → chunk-zd3wmj4d.js} +1 -1
- package/dist/cli/{chunk-xtr7ks02.js → chunk-zftxrnwh.js} +1 -1
- package/dist/cli/{chunk-b9h2ywc7.js → chunk-zqfbyq0a.js} +1 -1
- package/dist/cli/chunk-zwaf2mzz.js +2 -0
- package/dist/cli/index.js +7 -7
- package/dist/cli/kobe-run.js +1 -1
- package/dist/cli/kobe.js +6 -6
- package/dist/cli/pty-host-node.mjs +7 -6
- package/dist/cli/rove-run.js +1 -1
- package/dist/cli/rove.js +6 -6
- package/dist/skills/rove/references/api-flags.md +9 -5
- package/package.json +1 -1
- package/dist/cli/chunk-4c220qpj.js +0 -16
- package/dist/cli/chunk-4gaqhq8t.js +0 -2
- package/dist/cli/chunk-6t2zhxmq.js +0 -2
- package/dist/cli/chunk-7h7tqran.js +0 -2
- package/dist/cli/chunk-8ddjfc2v.js +0 -4
- package/dist/cli/chunk-9j7507ap.js +0 -2
- package/dist/cli/chunk-9k5p5852.js +0 -7
- package/dist/cli/chunk-9tw3vt9p.js +0 -2
- package/dist/cli/chunk-aeq5xmtq.js +0 -3
- package/dist/cli/chunk-aq912vvw.js +0 -3
- package/dist/cli/chunk-arf294te.js +0 -2
- package/dist/cli/chunk-ea0fm583.js +0 -2
- package/dist/cli/chunk-evmfa4v5.js +0 -2
- package/dist/cli/chunk-fm6e40pe.js +0 -2
- package/dist/cli/chunk-fna6sxe4.js +0 -5
- package/dist/cli/chunk-j2j1kq3m.js +0 -2
- package/dist/cli/chunk-kpf3yaj9.js +0 -3
- package/dist/cli/chunk-m6n0mkye.js +0 -2
- package/dist/cli/chunk-makzf3q1.js +0 -9
- package/dist/cli/chunk-nzy3yafz.js +0 -2
- package/dist/cli/chunk-p8hzr9m6.js +0 -2
- package/dist/cli/chunk-q3fc7t7p.js +0 -3
- package/dist/cli/chunk-r94jdy8g.js +0 -2
- package/dist/cli/chunk-snzh4n0v.js +0 -3
- package/dist/cli/chunk-st4xag8b.js +0 -2
- package/dist/cli/chunk-x760j10f.js +0 -3
package/dist/cli/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{matchPathGlob}from"./chunk-kg11c1py.js";import{CURRENT_VERSION}from"./chunk-
|
|
4
|
-
`),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-
|
|
3
|
+
import{matchPathGlob}from"./chunk-kg11c1py.js";import{CURRENT_VERSION}from"./chunk-98zhyhpz.js";import{expandTilde}from"./chunk-msr1xtay.js";import{argvHasFlag}from"./chunk-jvxh93nz.js";import{connectIfRunning}from"./chunk-4502n1bk.js";import"./chunk-nm0pq5r6.js";import"./chunk-mqqnk8w7.js";import"./chunk-0wnfq5sx.js";import"./chunk-7j5372wb.js";import"./chunk-mnqxgvyb.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{rejectionReason}from"./chunk-3wj69b0a.js";import"./chunk-ch9b1d5y.js";import{coerceVendorId}from"./chunk-bq3fyc0p.js";import{activeCliName,prepareCliEnvironment}from"./chunk-p7s4xwgx.js";import"./chunk-4pmd0mxp.js";import"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import{__require}from"./chunk-wqfp8d9w.js";import{resolve as resolve2}from"path";function debugEnabled(env){return env.KOBE_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)}`;let raw=errorMessage(err);return`${subject}: ${summarizeCliGitError(raw,opts.cwd)??raw}`}var DYNAMIC_COMMANDS=new Map([["completions",async(args)=>{let{runCompletionsSubcommand}=await import("./chunk-4a37bmpm.js");await runCompletionsSubcommand(args)}],["export",async(args)=>{let{runExportSubcommand}=await import("./chunk-6123622n.js");await runExportSubcommand(args)}],["repo",async(args)=>{let{runRepoSubcommand}=await import("./chunk-esk240e5.js");await runRepoSubcommand(args)}],["api",async(args)=>{let{runApiSubcommand}=await import("./chunk-ywtsabyg.js");await runApiSubcommand(args)}],["update",async(args)=>{let{runUpdateSubcommand}=await import("./chunk-d57awd05.js");await runUpdateSubcommand(args)}],["theme",async(args)=>{let{runThemeSubcommand}=await import("./chunk-gkfd073t.js");await runThemeSubcommand(args)}],["feedback",async(args)=>{let{runFeedbackSubcommand}=await import("./chunk-9g7hamhv.js");await runFeedbackSubcommand(args)}],["daemon",async(args)=>{let{runDaemonSubcommand}=await import("./chunk-667hcm3g.js");await runDaemonSubcommand(args)}],["doctor",async(args)=>{let{runDoctorSubcommand}=await import("./chunk-m45w6v9d.js");await runDoctorSubcommand(args)}],["config",async(args)=>{let{runConfigSubcommand}=await import("./chunk-yfy6031g.js");await runConfigSubcommand(args)}],["reset",async(args)=>{let{runResetSubcommand}=await import("./chunk-r0z1bhjg.js");await runResetSubcommand(args)}],["pty-host",async(args)=>{let{runPtyHostSubcommand}=await import("./chunk-zftxrnwh.js");await runPtyHostSubcommand(args)}],["skill",async(args)=>{let{runSkillSubcommand}=await import("./chunk-mkkp4c5t.js");await runSkillSubcommand(args)}],["plugin",async(args)=>{let{runPluginSubcommand}=await import("./chunk-2ernbaey.js");await runPluginSubcommand(args)}],["hook",async(args)=>{let{runHookSubcommand}=await import("./chunk-t90vnrpk.js");await runHookSubcommand(args)}]]);import{statSync}from"fs";import{resolve}from"path";async function openLocalOrchestrator(){let{TaskIndexStore}=await import("./chunk-8kaqpb7t.js"),{GitWorktreeManager}=await import("./chunk-7x88845e.js"),{Orchestrator}=await import("./chunk-dzd1wy5a.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==="~"||arg.startsWith("~/")}async function projectRootFor(dir){let{isGitRepo,resolveRepoRoot}=await import("./chunk-mp8v5gn8.js"),{projectRejection}=await import("./chunk-t3z4etp5.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(`${activeCliName()}: "${arg}" is not a directory (resolved to ${dir}).
|
|
4
|
+
`),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-rc668r26.js");writeLastActiveTaskId(String(task.id))}});let{publishKobeTerminalTitle}=await import("./chunk-1tx1s5v6.js");publishKobeTerminalTitle();let{startTui}=await import("./chunk-mqnr4p48.js");await startTui()}function topLevelUsage(cliName=activeCliName()){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)"," 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"].join(`
|
|
5
5
|
`)}prepareCliEnvironment();var CLI_NAME=activeCliName(),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(`
|
|
6
|
-
`);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-
|
|
6
|
+
`);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-32h9htyh.js");await runAddRemote(rest.slice(1));return}if(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} add: unknown flag "${arg}"
|
|
7
7
|
|
|
8
|
-
${ADD_USAGE}`),process.exit(2);let target=resolve2(process.cwd(),expandTilde(arg&&arg.length>0?arg:".")),{addSavedRepo}=await import("./chunk-
|
|
8
|
+
${ADD_USAGE}`),process.exit(2);let target=resolve2(process.cwd(),expandTilde(arg&&arg.length>0?arg:".")),{addSavedRepo}=await import("./chunk-mp8v5gn8.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}).
|
|
9
9
|
`),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)})`)}}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(`
|
|
10
10
|
`);async function runRemoveSubcommand(rest){let purgeCredentials=argvHasFlag(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(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} remove: unknown flag "${arg}"
|
|
11
11
|
|
|
12
|
-
${REMOVE_USAGE}`),process.exit(2);let{getRemoteRepoConfig,getSavedRepos,resolveRepoRoot}=await import("./chunk-
|
|
12
|
+
${REMOVE_USAGE}`),process.exit(2);let{getRemoteRepoConfig,getSavedRepos,resolveRepoRoot}=await import("./chunk-mp8v5gn8.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.
|
|
13
13
|
|
|
14
14
|
Saved projects:
|
|
15
15
|
`);for(let p of saved)process.stderr.write(` ${p}
|
|
@@ -18,8 +18,8 @@ Saved projects:
|
|
|
18
18
|
|
|
19
19
|
${ADOPT_USAGE}
|
|
20
20
|
`),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}
|
|
21
|
-
`);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{resolveRepoRoot}=await import("./chunk-
|
|
21
|
+
`);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{resolveRepoRoot}=await import("./chunk-mp8v5gn8.js"),repo=resolveRepoRoot(resolve2(process.cwd(),expandTilde(repoArg&&repoArg.length>0?repoArg:"."))),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.kobeManaged?"":"external"].filter(Boolean).join(",");console.log(` ${hit} ${w.branch} ${w.path}${tags?` (${tags})`:""}`)}if(!glob){console.log(`
|
|
22
22
|
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(`
|
|
23
23
|
no worktrees match glob ${JSON.stringify(glob)}`);return}if(!yes){console.log(`
|
|
24
24
|
${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()}
|
|
25
|
-
`)}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-
|
|
25
|
+
`)}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-45p9xh44.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-mkkp4c5t.js");await runSkillSubcommand(["print"]);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{publishKobeTerminalTitle}=await import("./chunk-1tx1s5v6.js");publishKobeTerminalTitle();let{maybeRunOnboarding}=await import("./chunk-sram9jmt.js");if(await maybeRunOnboarding())return;let{startTui}=await import("./chunk-mqnr4p48.js");await startTui()}main().catch((err)=>{console.error(formatCliFailure(err,{cliName:CLI_NAME,argv:process.argv,cwd:process.cwd(),env:process.env})),process.exit(1)});
|
package/dist/cli/kobe-run.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{markKobeInvocation,prepareCliEnvironment,prepareCliStateLayout}from"./chunk-
|
|
3
|
+
import{markKobeInvocation,prepareCliEnvironment,prepareCliStateLayout}from"./chunk-p7s4xwgx.js";import"./chunk-4pmd0mxp.js";import"./chunk-g56kvet6.js";import"./chunk-r3k9rbwm.js";import{__require}from"./chunk-wqfp8d9w.js";markKobeInvocation();prepareCliEnvironment();prepareCliStateLayout();await import("./index.js");
|
package/dist/cli/kobe.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{join as z1}from"node:path";import{createInterface as $1}from"node:readline/promises";import{pathToFileURL as J1}from"node:url";import{spawnSync as
|
|
3
|
-
`)[0]?.trim()??""};function
|
|
4
|
-
`)}function g(W,b,z=x()){return[`${z}: this machine's Bun is too old for Rove — found ${b} at ${W}, need ${G} 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: ${F}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${
|
|
5
|
-
`)}function
|
|
6
|
-
`)}function f(W=process.env,b=process.stdin,z=process.stdout){if(W[i]==="1")return!1;if(W.CI==="true"||W.CI==="1")return!1;return Boolean(b.isTTY&&z.isTTY)}function
|
|
7
|
-
`),1;return b1(J)}var
|
|
2
|
+
import{join as z1}from"node:path";import{createInterface as $1}from"node:readline/promises";import{pathToFileURL as J1}from"node:url";import{spawnSync as K}from"node:child_process";import{constants as m,accessSync as u}from"node:fs";import{homedir as l}from"node:os";import{basename as t,delimiter as r,dirname as o,join as Y}from"node:path";import{fileURLToPath as O}from"node:url";var U={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.156",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:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://rove.run",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8","smol-toml":"^1.7.1",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.19","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var C="rove",V="kobe";var T=V;var k=C;var s="ROVE_INVOKED_AS";function x(W=process.env){return W[s]===k?k:T}var F="ROVE_BUN",i="ROVE_NO_BUN_BOOTSTRAP",h="ROVE_SKIP_BUN_CHECK",G=U.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",B=(W)=>{try{return u(W,m.X_OK),!0}catch{return!1}},a=(W)=>W==="win32"?"bun.exe":"bun",n=(W)=>{let b=K(W,["--version"],{encoding:"utf8",timeout:5000});if(b.error||b.status!==0)return null;return b.stdout?.split(`
|
|
3
|
+
`)[0]?.trim()??""};function L(W){return W.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function j(W,b=G){let z=L(W),Q=L(b);if(!z||!Q)return!0;let J=z.split(".").map(Number),$=Q.split(".").map(Number);for(let X=0;X<3;X++){let H=J[X]??0,q=$[X]??0;if(H!==q)return H>q}return!0}function P(W=process.env){return W[h]==="1"}function A(W={}){let b=W.env??process.env,z=W.platform??process.platform,Q=W.home??b.HOME??b.USERPROFILE??l(),J=a(z),$=[],X=b[F]?.trim();if(X)$.push(X);for(let w of(b.PATH??b.Path??"").split(r))if(w)$.push(Y(w,J));let H=b.BUN_INSTALL?.trim();if(H)$.push(Y(H,"bin",J));if(Q)$.push(Y(Q,".bun","bin",J));let q=W.launcherDir;if(q)$.push(Y(q,"..","..","node_modules","bun","bin",J)),$.push(Y(q,"..","..","..","bun","bin",J));return $}function e(W={}){let b=W.isExecutable??B;return A(W).find((z)=>b(z))??null}function D(W={}){let b=W.isExecutable??B,z=W.bunVersionOf??n;if(P(W.env??process.env))return{bun:e(W),stale:null,unusable:null};let Q=null,J=null;for(let $ of A(W)){if(!b($))continue;let X=z($);if(X===null){J??=$;continue}if(j(X))return{bun:$,stale:Q,unusable:J};Q??={path:$,version:L(X)??X}}return{bun:null,stale:Q,unusable:J}}function p(W){return o(O(W))}function y(W){return t(O(W)).replace(/\.[cm]?[jt]s$/,"")}function W1(W=process.platform){return W==="win32"?["powershell","-NoProfile","-Command","irm bun.sh/install.ps1 | iex"]:["bash","-c","curl -fsSL https://bun.sh/install | bash"]}function I(W=x(),b=process.platform){let z=b==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash";return[`${W}: Rove runs on the Bun runtime, and no Bun was found on this machine.`,"","Install Bun, then run this command again:",` ${z}`," 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: ${F}=/path/to/bun`,""].join(`
|
|
4
|
+
`)}function g(W,b,z=x()){return[`${z}: this machine's Bun is too old for Rove — found ${b} at ${W}, need ${G} 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: ${F}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${h}=1`,""].join(`
|
|
5
|
+
`)}function R(W,b=x()){return[`${b}: the Bun at ${W} could not be run — \`${W} --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: ${F}=/path/to/bun`,""].join(`
|
|
6
|
+
`)}function f(W=process.env,b=process.stdin,z=process.stdout){if(W[i]==="1")return!1;if(W.CI==="true"||W.CI==="1")return!1;return Boolean(b.isTTY&&z.isTTY)}function _(W={},b=K){let z=W.platform??process.platform,[Q,...J]=W1(z);if(!Q)return null;let $=b(Q,J,{stdio:"inherit"});if($.error||$.status!==0)return null;return D(W).bun}function b1(W){if(typeof W.status==="number")return W.status;if(W.signal)return 128+(Object.hasOwn(M,W.signal)?M[W.signal]:0);return 1}var M={SIGINT:2,SIGQUIT:3,SIGKILL:9,SIGTERM:15};function N(W,b,z,Q=K){let J=Q(W,[b,...z],{stdio:"inherit"});if(J.error)return process.stderr.write(`rove: could not start Bun at ${W}: ${J.error.message}
|
|
7
|
+
`),1;return b1(J)}var v=p(import.meta.url),Z=y(import.meta.url),c=z1(v,`${Z}-run.js`);async function Q1(W){let b=$1({input:process.stdin,output:process.stdout});try{let z=(await b.question(W)).trim().toLowerCase();return z===""||z==="y"||z==="yes"}finally{b.close()}}async function X1(){let W={launcherDir:v},b=D(W);if(b.bun||!f())return b;let z=b.stale?`${Z}: Bun ${b.stale.version} is too old for Rove (needs ${G}+). Install the latest Bun now? [Y/n] `:`${Z}: Rove runs on the Bun runtime, and none is installed. Install Bun now? [Y/n] `;if(!await Q1(z))return b;return{bun:_(W),stale:b.stale,unusable:b.unusable}}var S=globalThis.Bun;if(S){let W=S.version;if(W&&!P()&&!j(W))process.stderr.write(g(process.execPath,W,Z)),process.exit(1);await import(J1(c).href)}else{let{bun:W,stale:b,unusable:z}=await X1();if(!W){let Q=b?g(b.path,b.version,Z):z?R(z,Z):I(Z);process.stderr.write(Q),process.exit(1)}process.exit(N(W,c,process.argv.slice(2)))}
|
|
@@ -30,16 +30,16 @@ var LEGACY_KOBE_ENV_PREFIX = "KOBE_";
|
|
|
30
30
|
var ROVE_STATE_DIR_BASENAME = ".rove";
|
|
31
31
|
var COMPAT_STATE_DIR_BASENAME = ".kobe";
|
|
32
32
|
function readRoveEnv(suffix, env = process.env) {
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
function readRoveHomeDirEnv(env = process.env) {
|
|
36
|
-
for (const key of [`${ROVE_ENV_PREFIX}HOME_DIR`, `${LEGACY_KOBE_ENV_PREFIX}HOME_DIR`]) {
|
|
33
|
+
for (const key of [`${ROVE_ENV_PREFIX}${suffix}`, `${LEGACY_KOBE_ENV_PREFIX}${suffix}`]) {
|
|
37
34
|
const value = env[key]?.trim();
|
|
38
35
|
if (value)
|
|
39
36
|
return value;
|
|
40
37
|
}
|
|
41
38
|
return;
|
|
42
39
|
}
|
|
40
|
+
function readRoveHomeDirEnv(env = process.env) {
|
|
41
|
+
return readRoveEnv("HOME_DIR", env);
|
|
42
|
+
}
|
|
43
43
|
|
|
44
44
|
// ../kobe-daemon/src/daemon/paths.ts
|
|
45
45
|
function stateDirs(homeDir) {
|
|
@@ -104,7 +104,7 @@ function windowsPipePath(homeDir, role) {
|
|
|
104
104
|
}
|
|
105
105
|
function defaultPtyHostSocketPath(homeDir, platform = process.platform) {
|
|
106
106
|
const override = readRoveEnv("PTY_SOCKET_PATH");
|
|
107
|
-
if (override
|
|
107
|
+
if (override)
|
|
108
108
|
return override;
|
|
109
109
|
const explicit = homeDir ?? readRoveHomeDirEnv();
|
|
110
110
|
if (platform === "win32")
|
|
@@ -121,7 +121,7 @@ function defaultPtyHostSocketPath(homeDir, platform = process.platform) {
|
|
|
121
121
|
}
|
|
122
122
|
function defaultPtyHostPidPath(homeDir = readRoveHomeDirEnv() ?? homedir()) {
|
|
123
123
|
const override = readRoveEnv("PTY_PID_PATH");
|
|
124
|
-
if (override
|
|
124
|
+
if (override)
|
|
125
125
|
return override;
|
|
126
126
|
return runtimePath(homeDir, "pty.pid", "pty.pid");
|
|
127
127
|
}
|
|
@@ -428,6 +428,7 @@ var DAEMON_CHANNELS = [
|
|
|
428
428
|
"session.deliver",
|
|
429
429
|
"tab.open",
|
|
430
430
|
"tab.close",
|
|
431
|
+
"tab.rename",
|
|
431
432
|
"engine.lifecycle",
|
|
432
433
|
"notice.event",
|
|
433
434
|
"usage.snapshot",
|
package/dist/cli/rove-run.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{markRoveInvocation,prepareCliEnvironment,prepareCliStateLayout}from"./chunk-
|
|
3
|
+
import{markRoveInvocation,prepareCliEnvironment,prepareCliStateLayout}from"./chunk-p7s4xwgx.js";import"./chunk-4pmd0mxp.js";import"./chunk-g56kvet6.js";import"./chunk-r3k9rbwm.js";import{__require}from"./chunk-wqfp8d9w.js";markRoveInvocation();prepareCliEnvironment();prepareCliStateLayout();await import("./index.js");
|
package/dist/cli/rove.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{join as z1}from"node:path";import{createInterface as $1}from"node:readline/promises";import{pathToFileURL as J1}from"node:url";import{spawnSync as
|
|
3
|
-
`)[0]?.trim()??""};function
|
|
4
|
-
`)}function g(W,b,z=x()){return[`${z}: this machine's Bun is too old for Rove — found ${b} at ${W}, need ${G} 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: ${F}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${
|
|
5
|
-
`)}function
|
|
6
|
-
`)}function f(W=process.env,b=process.stdin,z=process.stdout){if(W[i]==="1")return!1;if(W.CI==="true"||W.CI==="1")return!1;return Boolean(b.isTTY&&z.isTTY)}function
|
|
7
|
-
`),1;return b1(J)}var
|
|
2
|
+
import{join as z1}from"node:path";import{createInterface as $1}from"node:readline/promises";import{pathToFileURL as J1}from"node:url";import{spawnSync as K}from"node:child_process";import{constants as m,accessSync as u}from"node:fs";import{homedir as l}from"node:os";import{basename as t,delimiter as r,dirname as o,join as Y}from"node:path";import{fileURLToPath as O}from"node:url";var U={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.156",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:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://rove.run",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8","smol-toml":"^1.7.1",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.19","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var C="rove",V="kobe";var T=V;var k=C;var s="ROVE_INVOKED_AS";function x(W=process.env){return W[s]===k?k:T}var F="ROVE_BUN",i="ROVE_NO_BUN_BOOTSTRAP",h="ROVE_SKIP_BUN_CHECK",G=U.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",B=(W)=>{try{return u(W,m.X_OK),!0}catch{return!1}},a=(W)=>W==="win32"?"bun.exe":"bun",n=(W)=>{let b=K(W,["--version"],{encoding:"utf8",timeout:5000});if(b.error||b.status!==0)return null;return b.stdout?.split(`
|
|
3
|
+
`)[0]?.trim()??""};function L(W){return W.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function j(W,b=G){let z=L(W),Q=L(b);if(!z||!Q)return!0;let J=z.split(".").map(Number),$=Q.split(".").map(Number);for(let X=0;X<3;X++){let H=J[X]??0,q=$[X]??0;if(H!==q)return H>q}return!0}function P(W=process.env){return W[h]==="1"}function A(W={}){let b=W.env??process.env,z=W.platform??process.platform,Q=W.home??b.HOME??b.USERPROFILE??l(),J=a(z),$=[],X=b[F]?.trim();if(X)$.push(X);for(let w of(b.PATH??b.Path??"").split(r))if(w)$.push(Y(w,J));let H=b.BUN_INSTALL?.trim();if(H)$.push(Y(H,"bin",J));if(Q)$.push(Y(Q,".bun","bin",J));let q=W.launcherDir;if(q)$.push(Y(q,"..","..","node_modules","bun","bin",J)),$.push(Y(q,"..","..","..","bun","bin",J));return $}function e(W={}){let b=W.isExecutable??B;return A(W).find((z)=>b(z))??null}function D(W={}){let b=W.isExecutable??B,z=W.bunVersionOf??n;if(P(W.env??process.env))return{bun:e(W),stale:null,unusable:null};let Q=null,J=null;for(let $ of A(W)){if(!b($))continue;let X=z($);if(X===null){J??=$;continue}if(j(X))return{bun:$,stale:Q,unusable:J};Q??={path:$,version:L(X)??X}}return{bun:null,stale:Q,unusable:J}}function p(W){return o(O(W))}function y(W){return t(O(W)).replace(/\.[cm]?[jt]s$/,"")}function W1(W=process.platform){return W==="win32"?["powershell","-NoProfile","-Command","irm bun.sh/install.ps1 | iex"]:["bash","-c","curl -fsSL https://bun.sh/install | bash"]}function I(W=x(),b=process.platform){let z=b==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash";return[`${W}: Rove runs on the Bun runtime, and no Bun was found on this machine.`,"","Install Bun, then run this command again:",` ${z}`," 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: ${F}=/path/to/bun`,""].join(`
|
|
4
|
+
`)}function g(W,b,z=x()){return[`${z}: this machine's Bun is too old for Rove — found ${b} at ${W}, need ${G} 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: ${F}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${h}=1`,""].join(`
|
|
5
|
+
`)}function R(W,b=x()){return[`${b}: the Bun at ${W} could not be run — \`${W} --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: ${F}=/path/to/bun`,""].join(`
|
|
6
|
+
`)}function f(W=process.env,b=process.stdin,z=process.stdout){if(W[i]==="1")return!1;if(W.CI==="true"||W.CI==="1")return!1;return Boolean(b.isTTY&&z.isTTY)}function _(W={},b=K){let z=W.platform??process.platform,[Q,...J]=W1(z);if(!Q)return null;let $=b(Q,J,{stdio:"inherit"});if($.error||$.status!==0)return null;return D(W).bun}function b1(W){if(typeof W.status==="number")return W.status;if(W.signal)return 128+(Object.hasOwn(M,W.signal)?M[W.signal]:0);return 1}var M={SIGINT:2,SIGQUIT:3,SIGKILL:9,SIGTERM:15};function N(W,b,z,Q=K){let J=Q(W,[b,...z],{stdio:"inherit"});if(J.error)return process.stderr.write(`rove: could not start Bun at ${W}: ${J.error.message}
|
|
7
|
+
`),1;return b1(J)}var v=p(import.meta.url),Z=y(import.meta.url),c=z1(v,`${Z}-run.js`);async function Q1(W){let b=$1({input:process.stdin,output:process.stdout});try{let z=(await b.question(W)).trim().toLowerCase();return z===""||z==="y"||z==="yes"}finally{b.close()}}async function X1(){let W={launcherDir:v},b=D(W);if(b.bun||!f())return b;let z=b.stale?`${Z}: Bun ${b.stale.version} is too old for Rove (needs ${G}+). Install the latest Bun now? [Y/n] `:`${Z}: Rove runs on the Bun runtime, and none is installed. Install Bun now? [Y/n] `;if(!await Q1(z))return b;return{bun:_(W),stale:b.stale,unusable:b.unusable}}var S=globalThis.Bun;if(S){let W=S.version;if(W&&!P()&&!j(W))process.stderr.write(g(process.execPath,W,Z)),process.exit(1);await import(J1(c).href)}else{let{bun:W,stale:b,unusable:z}=await X1();if(!W){let Q=b?g(b.path,b.version,Z):z?R(z,Z):I(Z);process.stderr.write(Q),process.exit(1)}process.exit(N(W,c,process.argv.slice(2)))}
|
|
@@ -106,6 +106,7 @@ deferred-release --id(REQ)
|
|
|
106
106
|
deferred-dismiss --id(REQ)
|
|
107
107
|
note --task-id(REQ) --text(REQ)
|
|
108
108
|
note-list --repo(REQ)
|
|
109
|
+
note-delete --repo(REQ) --id(REQ)
|
|
109
110
|
pane-open --task-id --tab --command --direction{right|down}(right)
|
|
110
111
|
--placement{split|tab}(split) --title
|
|
111
112
|
pane-close --task-id --title(REQ) --tab
|
|
@@ -167,7 +168,7 @@ add --repo(REQ) --title --branch --base-branch --command --count
|
|
|
167
168
|
--agents <claude:2,codex:1>
|
|
168
169
|
--status{backlog|in_progress|in_review|done|canceled|error}(backlog) --pin
|
|
169
170
|
--activate(false) --prompt|--prompt-file
|
|
170
|
-
rename --task-id(REQ) --title(REQ)
|
|
171
|
+
rename --task-id(REQ) --title(REQ) --tab
|
|
171
172
|
set-branch --task-id(REQ) --branch(REQ)
|
|
172
173
|
set-command --task-id(REQ) --command(REQ)
|
|
173
174
|
set-effort --task-id(REQ) --level(REQ)
|
|
@@ -176,7 +177,7 @@ set-status --task-id(REQ)
|
|
|
176
177
|
pin --task-id(REQ) --pinned(true)
|
|
177
178
|
land --task-id(REQ) --dry-run --strategy{merge|squash}(merge) --delete-branch
|
|
178
179
|
--remove-worktree(true)
|
|
179
|
-
delete --task-id
|
|
180
|
+
delete --task-id --group --force --delete-branch --wait
|
|
180
181
|
```
|
|
181
182
|
<!-- generated:end -->
|
|
182
183
|
|
|
@@ -201,6 +202,7 @@ returns before the worktree is gone.
|
|
|
201
202
|
<!-- generated:begin worktree -->
|
|
202
203
|
```text
|
|
203
204
|
ensure-worktree --task-id(REQ)
|
|
205
|
+
remove-worktree --task-id(REQ) --force
|
|
204
206
|
discover-adoptable --repo(REQ)
|
|
205
207
|
adopt --repo(REQ) --worktree(REQ) --branch --command --title
|
|
206
208
|
```
|
|
@@ -214,6 +216,7 @@ issue-list --repo(REQ)
|
|
|
214
216
|
issue-create --repo(REQ) --title(REQ) --body
|
|
215
217
|
issue-set-status --repo(REQ) --id(REQ) --status{open|doing|hold|done}(REQ)
|
|
216
218
|
issue-update --repo(REQ) --id(REQ) --title --body --task
|
|
219
|
+
issue-delete --repo(REQ) --id(REQ)
|
|
217
220
|
```
|
|
218
221
|
<!-- generated:end -->
|
|
219
222
|
|
|
@@ -253,11 +256,12 @@ it fires with no TUI attached.
|
|
|
253
256
|
```text
|
|
254
257
|
routine-list (none)
|
|
255
258
|
routine-create --repo(REQ) --name(REQ) --prompt|--prompt-file(REQ) --schedule(REQ)
|
|
256
|
-
--vendor{claude|codex|copilot|kimi} --base-branch --precheck
|
|
257
|
-
--precheck-timeout(120) --grace(60) --persistent-session --disabled
|
|
258
|
-
routine-update --id(REQ) --name --prompt|--prompt-file --schedule
|
|
259
259
|
--vendor{claude|codex|copilot|kimi} --base-branch --precheck
|
|
260
260
|
--precheck-timeout(120) --grace(60) --persistent-session
|
|
261
|
+
--target-task --target-tab --disabled
|
|
262
|
+
routine-update --id(REQ) --name --prompt|--prompt-file --schedule --vendor
|
|
263
|
+
--base-branch --precheck --precheck-timeout(120) --grace(60)
|
|
264
|
+
--persistent-session --target-task --target-tab
|
|
261
265
|
routine-set-enabled --id(REQ) --enabled(REQ)
|
|
262
266
|
routine-delete --id(REQ)
|
|
263
267
|
routine-run-now --id(REQ)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@sma1lboy/rove",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.156",
|
|
5
5
|
"description": "Rove — the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"terminal",
|