@sma1lboy/rove 0.9.99 → 0.9.101
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 +91 -91
- package/dist/cli/kobe-run.js +91 -91
- package/dist/cli/kobe.js +1 -1
- package/dist/cli/rove-run.js +91 -91
- package/dist/cli/rove.js +1 -1
- package/dist/skills/rove/SKILL.md +15 -5
- package/dist/skills/rove/references/api-flags.md +8 -8
- package/package.json +1 -1
package/dist/cli/rove.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{join as $1}from"node:path";import{createInterface as J1}from"node:readline/promises";import{pathToFileURL as Q1}from"node:url";import{spawnSync as L}from"node:child_process";import{constants as u,accessSync as l}from"node:fs";import{homedir as t}from"node:os";import{basename as o,delimiter as r,dirname as i,join as Y}from"node:path";import{fileURLToPath as C}from"node:url";var U={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.
|
|
2
|
+
import{join as $1}from"node:path";import{createInterface as J1}from"node:readline/promises";import{pathToFileURL as Q1}from"node:url";import{spawnSync as L}from"node:child_process";import{constants as u,accessSync as l}from"node:fs";import{homedir as t}from"node:os";import{basename as o,delimiter as r,dirname as i,join as Y}from"node:path";import{fileURLToPath as C}from"node:url";var U={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.101",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",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","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var x="rove",j="kobe";var E="ROVE_INVOKED_AS";function F(W=process.env){return W[E]===x?x:j}var k="ROVE_BUN",a="ROVE_NO_BUN_BOOTSTRAP",M="ROVE_SKIP_BUN_CHECK",G=U.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",T=(W)=>{try{return l(W,u.X_OK),!0}catch{return!1}},n=(W)=>W==="win32"?"bun.exe":"bun",e=(W)=>{let b=L(W,["--version"],{encoding:"utf8",timeout:5000});if(b.error||b.status!==0)return null;return b.stdout?.split(`
|
|
3
3
|
`)[0]?.trim()??""};function K(W){return W.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function P(W,b=G){let z=K(W),Q=K(b);if(!z||!Q)return!0;let J=z.split(".").map(Number),$=Q.split(".").map(Number);for(let X=0;X<3;X++){let q=J[X]??0,H=$[X]??0;if(q!==H)return q>H}return!0}function g(W=process.env){return W[M]==="1"}function p(W={}){let b=W.env??process.env,z=W.platform??process.platform,Q=W.home??b.HOME??b.USERPROFILE??t(),J=n(z),$=[],X=b[k]?.trim();if(X)$.push(X);for(let D of(b.PATH??b.Path??"").split(r))if(D)$.push(Y(D,J));let q=b.BUN_INSTALL?.trim();if(q)$.push(Y(q,"bin",J));if(Q)$.push(Y(Q,".bun","bin",J));let H=W.launcherDir;if(H)$.push(Y(H,"..","..","node_modules","bun","bin",J)),$.push(Y(H,"..","..","..","bun","bin",J));return $}function W1(W={}){let b=W.isExecutable??T;return p(W).find((z)=>b(z))??null}function w(W={}){let b=W.isExecutable??T,z=W.bunVersionOf??e;if(g(W.env??process.env))return{bun:W1(W),stale:null,unusable:null};let Q=null,J=null;for(let $ of p(W)){if(!b($))continue;let X=z($);if(X===null){J??=$;continue}if(P(X))return{bun:$,stale:Q,unusable:J};Q??={path:$,version:K(X)??X}}return{bun:null,stale:Q,unusable:J}}function B(W){return i(C(W))}function O(W){return o(C(W)).replace(/\.[cm]?[jt]s$/,"")}function b1(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 y(W=F(),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: ${k}=/path/to/bun`,""].join(`
|
|
4
4
|
`)}function h(W,b,z=F()){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: ${k}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${M}=1`,""].join(`
|
|
5
5
|
`)}function A(W,b=F()){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: ${k}=/path/to/bun`,""].join(`
|
|
@@ -3,7 +3,7 @@ name: rove
|
|
|
3
3
|
description: Use when controlling Rove tasks, parallel coding attempts, hosted agent sessions, task lifecycle, or the daemon-owned issue tracker from a shell. Also the ONLY channel for messaging another agent session on this machine — `rove api send`, never a peer/MCP side channel.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- rove-skill-version:
|
|
6
|
+
<!-- rove-skill-version: 42 — bump in lockstep with KOBE_SKILL_VERSION (src/lib/skill-install.ts). -->
|
|
7
7
|
|
|
8
8
|
# Rove shell control
|
|
9
9
|
|
|
@@ -149,7 +149,7 @@ rove api get-task --task-id "$ROVE_TASK_ID" # .task.worktreePath, .task.branch,
|
|
|
149
149
|
|
|
150
150
|
`get-task` is the per-task read that answers "what is my worktree, my
|
|
151
151
|
branch, and which sibling tabs exist" — `.tabs[]` carries each tab's `id`, `kind`,
|
|
152
|
-
`vendor`, `lastTitle` and `alive`, which is exactly the target list for
|
|
152
|
+
`vendor`, `liveVendor`, `lastTitle` and `alive`, which is exactly the target list for
|
|
153
153
|
`send --tab`. A tab flagged `unregistered: true` is a live session the tab
|
|
154
154
|
snapshot lost; it is addressable like any other.
|
|
155
155
|
|
|
@@ -271,7 +271,8 @@ rove api add --repo "$PWD" --agents claude:2,codex:1 --prompt "<prompt>"
|
|
|
271
271
|
|
|
272
272
|
# Follow up. Use an explicit id for unattended work; the active task can drift.
|
|
273
273
|
# From inside a Rove task this auto-prefixes [ROVE PEER] provenance
|
|
274
|
-
# (sender + reply command)
|
|
274
|
+
# (sender + reply command) — `add --prompt` wears it too, so a dispatched
|
|
275
|
+
# task's opening brief carries its reply address; --plain sends verbatim.
|
|
275
276
|
#
|
|
276
277
|
# A prompt with backticks, $vars, or quotes goes through --prompt-file, NEVER
|
|
277
278
|
# a double-quoted --prompt: in double quotes `rove api send …` is command
|
|
@@ -304,6 +305,14 @@ rove api collect --group <groupId> --pretty
|
|
|
304
305
|
rove api list --pretty
|
|
305
306
|
```
|
|
306
307
|
|
|
308
|
+
**A `deferred` send already landed — do NOT retry.** When the target composer
|
|
309
|
+
holds half-typed text, `send` exits 0 with `"deferred"` in the JSON instead of
|
|
310
|
+
pasting over it: the daemon has stored the message and queued a
|
|
311
|
+
`prompt_deferred` Inbox episode for a human to release. That is a SUCCESS, not
|
|
312
|
+
a failure to deliver. Retrying stacks a duplicate — and the second send fails
|
|
313
|
+
`DEFERRED_PROMPT_PENDING` until the Inbox item is released, dismissed, or
|
|
314
|
+
expires. Read the `delivered` / `deferred` keys, not just the exit code.
|
|
315
|
+
|
|
307
316
|
`.running` means any hosted engine tab on the task is alive; a live shell,
|
|
308
317
|
command, or content tab alone does not count. It is process truth, not
|
|
309
318
|
progress: a task whose work is merged and whose worker has signed off still
|
|
@@ -333,8 +342,9 @@ separate command tab — the attached TUI performs it, so this is a no-op
|
|
|
333
342
|
headless:
|
|
334
343
|
|
|
335
344
|
```bash
|
|
336
|
-
# Split the focused tab; the pane runs the command
|
|
337
|
-
#
|
|
345
|
+
# Split the focused tab; the pane runs the command through your login
|
|
346
|
+
# shell's `-ilc` (so it sees the same rc-exported PATH the engine tab does)
|
|
347
|
+
# and closes when it exits. Omit --command for an interactive shell.
|
|
338
348
|
rove api pane-open --command "btop"
|
|
339
349
|
rove api pane-open --direction down --command "watch -n1 git status -sb"
|
|
340
350
|
rove api pane-open --placement tab --title logs --command "tail -f app.log"
|
|
@@ -24,10 +24,10 @@ These five carry almost all traffic. Nothing here should ever need `schema`.
|
|
|
24
24
|
```text
|
|
25
25
|
add --repo(REQ) --prompt|--prompt-file --title --command --count --agents
|
|
26
26
|
--branch --base-branch --status --pin --activate
|
|
27
|
-
send --prompt|--prompt-file(REQ) --task-id --tab --command --plain
|
|
27
|
+
send --prompt|--prompt-file(REQ) --task-id --tab --command --plain --allow-empty
|
|
28
28
|
get-task --task-id(REQ)
|
|
29
29
|
list (no flags)
|
|
30
|
-
collect --task-ids <csv> | --repo
|
|
30
|
+
collect --task-ids <csv> | --group | --repo
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Four flag names that have actually been guessed wrong here, and what they are:
|
|
@@ -50,11 +50,16 @@ Four flag names that have actually been guessed wrong here, and what they are:
|
|
|
50
50
|
| `fan-out` | `add --count N` / `add --agents claude:2,codex:1` |
|
|
51
51
|
| `task-list` | `list` |
|
|
52
52
|
| `send-tab` | `send --tab tab-N` |
|
|
53
|
-
|
|
|
53
|
+
| `set-vendor` | `set-command` (an engine id from `engine-list`, or a full command line) |
|
|
54
54
|
|
|
55
55
|
Seeing one of these in guidance means that guidance predates the rename —
|
|
56
56
|
`rove api schema` is the tiebreak.
|
|
57
57
|
|
|
58
|
+
`$KOBE_TASK_ID` / `$KOBE_TAB_ID` are NOT retired: they are still exported into
|
|
59
|
+
every engine tab as aliases of `$ROVE_TASK_ID` / `$ROVE_TAB_ID`, and parts of
|
|
60
|
+
the daemon still read the `KOBE_` spelling. Write the `ROVE_` names; expect to
|
|
61
|
+
see both.
|
|
62
|
+
|
|
58
63
|
## read
|
|
59
64
|
|
|
60
65
|
<!-- generated:begin read -->
|
|
@@ -265,11 +270,6 @@ is gone when the next firing arrives (an overnight gap usually means it is),
|
|
|
265
270
|
the daemon respawns it in the SAME worktree — files and branch carry over, the
|
|
266
271
|
conversation does not — and records that run as `revived`, not `dispatched`.
|
|
267
272
|
|
|
268
|
-
**Routines take `--prompt` only.** Unlike `send`/`add`/`dispatch` there is no
|
|
269
|
-
`--prompt-file` here, so a prompt with backticks, `$vars` or quotes has no
|
|
270
|
-
escape hatch — write it with single quotes and keep `$` out of it, or set it
|
|
271
|
-
from the TUI.
|
|
272
|
-
|
|
273
273
|
A bare `--enabled` means true, so pausing a routine is
|
|
274
274
|
`routine-set-enabled --id <id> --enabled=false` (the same `=false` spelling
|
|
275
275
|
`pin --pinned=false` uses).
|
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.101",
|
|
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",
|