@sma1lboy/rove 0.9.83 → 0.9.85
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/index.js +22 -22
- package/dist/cli/kobe-run.js +22 -22
- package/dist/cli/kobe.js +1 -1
- package/dist/cli/pty-host-node.mjs +11 -8
- package/dist/cli/rove-run.js +22 -22
- package/dist/cli/rove.js +1 -1
- package/package.json +1 -1
package/dist/cli/kobe.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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 h}from"node:child_process";import{constants as t,accessSync as u}from"node:fs";import{homedir as o}from"node:os";import{basename as r,delimiter as l,dirname as i,join as q}from"node:path";import{fileURLToPath as U}from"node:url";var c={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.
|
|
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 h}from"node:child_process";import{constants as t,accessSync as u}from"node:fs";import{homedir as o}from"node:os";import{basename as r,delimiter as l,dirname as i,join as q}from"node:path";import{fileURLToPath as U}from"node:url";var c={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.85",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:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/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:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.17","@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","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var x="rove",w="kobe";var E="ROVE_INVOKED_AS";function Y(b=process.env){return b[E]===x?x:w}var K="ROVE_BUN",a="ROVE_NO_BUN_BOOTSTRAP",p="ROVE_SKIP_BUN_CHECK",F=c.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",B=(b)=>{try{return u(b,t.X_OK),!0}catch{return!1}},e=(b)=>b==="win32"?"bun.exe":"bun",n=(b)=>{let W=h(b,["--version"],{encoding:"utf8",timeout:5000});if(W.error||W.status!==0)return null;return W.stdout?.split(`
|
|
3
3
|
`)[0]?.trim()??""};function g(b){return b.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function j(b,W=F){let k=g(b),J=g(W);if(!k||!J)return!0;let $=k.split(".").map(Number),z=J.split(".").map(Number);for(let Q=0;Q<3;Q++){let H=$[Q]??0,Z=z[Q]??0;if(H!==Z)return H>Z}return!0}function G(b=process.env){return b[p]==="1"}function C(b={}){let W=b.env??process.env,k=b.platform??process.platform,J=b.home??W.HOME??W.USERPROFILE??o(),$=e(k),z=[],Q=W[K]?.trim();if(Q)z.push(Q);for(let P of(W.PATH??W.Path??"").split(l))if(P)z.push(q(P,$));let H=W.BUN_INSTALL?.trim();if(H)z.push(q(H,"bin",$));if(J)z.push(q(J,".bun","bin",$));let Z=b.launcherDir;if(Z)z.push(q(Z,"..","..","node_modules","bun","bin",$)),z.push(q(Z,"..","..","..","bun","bin",$));return z}function b1(b={}){let W=b.isExecutable??B;return C(b).find((k)=>W(k))??null}function L(b={}){let W=b.isExecutable??B,k=b.bunVersionOf??n;if(G(b.env??process.env))return{bun:b1(b),stale:null,unusable:null};let J=null,$=null;for(let z of C(b)){if(!W(z))continue;let Q=k(z);if(Q===null){$??=z;continue}if(j(Q))return{bun:z,stale:J,unusable:$};J??={path:z,version:g(Q)??Q}}return{bun:null,stale:J,unusable:$}}function O(b){return i(U(b))}function M(b){return r(U(b)).replace(/\.[cm]?[jt]s$/,"")}function W1(b=process.platform){return b==="win32"?["powershell","-NoProfile","-Command","irm bun.sh/install.ps1 | iex"]:["bash","-c","curl -fsSL https://bun.sh/install | bash"]}function T(b=Y(),W=process.platform){let k=W==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash";return[`${b}: Rove runs on the Bun runtime, and no Bun was found on this machine.`,"","Install Bun, then run this command again:",` ${k}`," 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: ${K}=/path/to/bun`,""].join(`
|
|
4
4
|
`)}function D(b,W,k=Y()){return[`${k}: this machine's Bun is too old for Rove — found ${W} at ${b}, need ${F} 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: ${K}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${p}=1`,""].join(`
|
|
5
5
|
`)}function s(b,W=Y()){return[`${W}: the Bun at ${b} could not be run — \`${b} --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: ${K}=/path/to/bun`,""].join(`
|
|
@@ -1092,14 +1092,16 @@ class PtyHost {
|
|
|
1092
1092
|
sink(frame);
|
|
1093
1093
|
this.opts.log?.("pty", `session ${session.key} exited${describeExit(exit)}`);
|
|
1094
1094
|
this.maybeFreeze(session, true);
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1095
|
+
if (!session.closedByRequest) {
|
|
1096
|
+
try {
|
|
1097
|
+
this.opts.onSessionExit?.({
|
|
1098
|
+
key: session.key,
|
|
1099
|
+
pid: session.proc?.pid ?? null,
|
|
1100
|
+
exit,
|
|
1101
|
+
tail: ringTail(session.chunks, session.bytes, EXIT_TAIL_BYTES)
|
|
1102
|
+
});
|
|
1103
|
+
} catch {}
|
|
1104
|
+
}
|
|
1103
1105
|
this.opts.onSessionEnd?.();
|
|
1104
1106
|
},
|
|
1105
1107
|
log: (event, message) => this.opts.log?.(event, message)
|
|
@@ -1189,6 +1191,7 @@ class PtyHost {
|
|
|
1189
1191
|
if (!session)
|
|
1190
1192
|
return Promise.resolve();
|
|
1191
1193
|
this.sessions.delete(key);
|
|
1194
|
+
session.closedByRequest = true;
|
|
1192
1195
|
this.opts.freeze?.drop(key);
|
|
1193
1196
|
return this.childController.endChild(session);
|
|
1194
1197
|
}
|