@sma1lboy/kobe 0.8.152 → 0.8.153
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 +1 -1
- package/dist/cli/kobe-run.js +1 -1
- package/dist/cli/rove-run.js +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -303,7 +303,7 @@ ${G}
|
|
|
303
303
|
`)}let z=ZG0();for(let G of yT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await Wh()}catch{}}function ZG0(){try{for(let $ of o4().plugins){if(!$.enabled)continue;try{if(Y6($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Wh(){let $=eY0();if($.length===0)return;let Z=x5(Zh),J=new Set([Gh()]),X=$G0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")z6(Zh,"off")}async function JG0(){let $=yT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
|
|
304
304
|
`);return}await $.removeActivityHooks(Z),await $.removeWorktreeWatchHook(Z),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${Z}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`
|
|
305
305
|
`))}async function XG0($){await Wh(),process.stdout.write(["rove hook setup is deprecated and now a no-op (cleanup only).","","The old external-worktree sync used a global WorktreeCreate hook, which is","a VCS provider hook \u2014 its presence broke `claude --worktree` / EnterWorktree","in every repo. Any hook Rove previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo Rove already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `rove adopt`.",""].join(`
|
|
306
|
-
`))}var iY0=500,oY0="worktree-created",Zh="externalWorktreeSync";var bT=d(()=>{I2();hJ();OZ();wT();fT();C4();M7();u4()});var Rj;var qh=d(()=>{Rj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.
|
|
306
|
+
`))}var iY0=500,oY0="worktree-created",Zh="externalWorktreeSync";var bT=d(()=>{I2();hJ();OZ();wT();fT();C4();M7();u4()});var Rj;var qh=d(()=>{Rj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.153",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",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://github.com/Sma1lboy/rove#readme",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"},"//":"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.14","@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 Bh={};A$(Bh,{repoSlug:()=>bY,releasePageUrl:()=>cT,recommendedGlobalInstallCommand:()=>mT,isNewerSemver:()=>vT,fetchReleaseSummaries:()=>HF,fetchReleaseNotesRange:()=>uT,fetchReleaseNotes:()=>hT,compareSemver:()=>C3,checkLatestVersion:()=>vY,breakingVersionsCrossed:()=>WF,UPDATE_SCRIPT_URL:()=>Tj,UPDATE_COMMAND:()=>_Z,PACKAGE_NAME:()=>kT,CURRENT_VERSION:()=>R$,BREAKING_VERSIONS:()=>pJ});function bY(){let $=Rj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function mT(){return`npm install -g ${kT}@latest`}function WF($,Z,J=pJ){let[X,z]=C3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>C3(G,X)>0&&C3(G,z)<=0)}async function zG0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Sj);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function vT($,Z){return C3($,Z)>0}function C3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function vY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:R$,latest:Z,hasUpdate:vT(Z,R$)};if(SH()&&!$.force)return null;let J=await zG0(kT);if(!J)return null;return{current:R$,latest:J,hasUpdate:vT(J,R$)}}function Uh($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function hT($){let Z=bY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Sj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function uT($){let Z=bY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Sj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Uh(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(C3(U,$.current)<=0)return null;if(C3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function HF($=12){let Z=bY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Sj);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Uh(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function cT($){let Z=bY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var R$,kT,Tj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",_Z,pJ,Sj=3000;var d8=d(()=>{qh();V5();R$=Rj.version,kT=Rj.name;_Z=`curl -fsSL ${Tj} | sh`;pJ=[]});var Fh={};A$(Fh,{stampResetGate:()=>Ij,resetGateBlockers:()=>Kh,enforceResetGate:()=>lT,LAST_RUN_VERSION_KEY:()=>dT});function Kh($,Z=R$,J=pJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=C3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>C3(G,X)>0&&C3(G,z)<=0)}function lT(){let $=$$(),Z=L4()[dT],J=Kh(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${R$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
|
|
307
307
|
`)),process.exit(1)}if(Z!==R$)Ij()}function Ij(){try{E2({[dT]:R$})}catch{}}var dT="app.lastRunVersion";var Ej=d(()=>{w2();d8();u4()});import{existsSync as Lh,readFileSync as YG0}from"fs";import{homedir as GG0}from"os";import{join as Nh,resolve as Mh}from"path";import{fileURLToPath as WG0}from"url";function iT($=process.env){return`${$$($)} skill install`}function wj(){let $=WG0(import.meta.url);return[Mh($,"../../../../../.agents/skills/kobe"),Mh($,"../../skills/rove")].find((J)=>Lh(Nh(J,"SKILL.md")))??null}function xj($={}){let Z=$.source!==void 0?$.source:wj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??qG0,"--skill",Z6,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function kY($={}){return`npx ${xj($).join(" ")}`}async function oT($,Z){return await Bun.spawn(["npx",...xj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function fj($={}){let Z=$.home??GG0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>HG0.map((z)=>Nh(X,z)))}function UG0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function qF($){let Z=fj($).find((z)=>Lh(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:pT,stale:!1};let J=null;try{J=UG0(YG0(Z,"utf8"))}catch{J=null}let X=J===null||J<pT;return{installed:!0,installedVersion:J,currentVersion:pT,stale:X}}function BG0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Oh($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (Pj(),Aj));if(Z())return;let J=$$(),X=iT(),z=qF();if(!z.installed){if(x5(nT)==="1")return;z6(nT,"1"),process.stderr.write(`
|
|
308
308
|
${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
|
|
309
309
|
${X}
|
package/dist/cli/kobe-run.js
CHANGED
|
@@ -303,7 +303,7 @@ ${G}
|
|
|
303
303
|
`)}let z=QG0();for(let G of gT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await qh()}catch{}}function QG0(){try{for(let $ of o4().plugins){if(!$.enabled)continue;try{if(Y6($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function qh(){let $=JG0();if($.length===0)return;let Z=x5(Xh),J=new Set([Hh()]),X=XG0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")z6(Xh,"off")}async function zG0(){let $=gT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
|
|
304
304
|
`);return}await $.removeActivityHooks(Z),await $.removeWorktreeWatchHook(Z),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${Z}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`
|
|
305
305
|
`))}async function YG0($){await qh(),process.stdout.write(["rove hook setup is deprecated and now a no-op (cleanup only).","","The old external-worktree sync used a global WorktreeCreate hook, which is","a VCS provider hook \u2014 its presence broke `claude --worktree` / EnterWorktree","in every repo. Any hook Rove previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo Rove already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `rove adopt`.",""].join(`
|
|
306
|
-
`))}var rY0=500,sY0="worktree-created",Xh="externalWorktreeSync";var vT=d(()=>{I2();hJ();OZ();xT();yT();C4();M7();b4()});var Tj;var Bh=d(()=>{Tj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.
|
|
306
|
+
`))}var rY0=500,sY0="worktree-created",Xh="externalWorktreeSync";var vT=d(()=>{I2();hJ();OZ();xT();yT();C4();M7();b4()});var Tj;var Bh=d(()=>{Tj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.153",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",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://github.com/Sma1lboy/rove#readme",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"},"//":"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.14","@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 Fh={};A$(Fh,{repoSlug:()=>bY,releasePageUrl:()=>dT,recommendedGlobalInstallCommand:()=>hT,isNewerSemver:()=>kT,fetchReleaseSummaries:()=>HF,fetchReleaseNotesRange:()=>cT,fetchReleaseNotes:()=>uT,compareSemver:()=>C3,checkLatestVersion:()=>vY,breakingVersionsCrossed:()=>WF,UPDATE_SCRIPT_URL:()=>Sj,UPDATE_COMMAND:()=>_Z,PACKAGE_NAME:()=>mT,CURRENT_VERSION:()=>R$,BREAKING_VERSIONS:()=>pJ});function bY(){let $=Tj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function hT(){return`npm install -g ${mT}@latest`}function WF($,Z,J=pJ){let[X,z]=C3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>C3(G,X)>0&&C3(G,z)<=0)}async function WG0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Ij);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function kT($,Z){return C3($,Z)>0}function C3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function vY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:R$,latest:Z,hasUpdate:kT(Z,R$)};if(SH()&&!$.force)return null;let J=await WG0(mT);if(!J)return null;return{current:R$,latest:J,hasUpdate:kT(J,R$)}}function Kh($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function uT($){let Z=bY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Ij);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function cT($){let Z=bY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Ij);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Kh(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(C3(U,$.current)<=0)return null;if(C3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function HF($=12){let Z=bY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Ij);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Kh(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function dT($){let Z=bY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var R$,mT,Sj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",_Z,pJ,Ij=3000;var d8=d(()=>{Bh();V5();R$=Tj.version,mT=Tj.name;_Z=`curl -fsSL ${Sj} | sh`;pJ=[]});var Lh={};A$(Lh,{stampResetGate:()=>Ej,resetGateBlockers:()=>Mh,enforceResetGate:()=>pT,LAST_RUN_VERSION_KEY:()=>lT});function Mh($,Z=R$,J=pJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=C3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>C3(G,X)>0&&C3(G,z)<=0)}function pT(){let $=$$(),Z=L4()[lT],J=Mh(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${R$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
|
|
307
307
|
`)),process.exit(1)}if(Z!==R$)Ej()}function Ej(){try{E2({[lT]:R$})}catch{}}var lT="app.lastRunVersion";var wj=d(()=>{w2();d8();b4()});import{existsSync as Oh,readFileSync as HG0}from"fs";import{homedir as qG0}from"os";import{join as jh,resolve as Nh}from"path";import{fileURLToPath as UG0}from"url";function oT($=process.env){return`${$$($)} skill install`}function xj(){let $=UG0(import.meta.url);return[Nh($,"../../../../../.agents/skills/kobe"),Nh($,"../../skills/rove")].find((J)=>Oh(jh(J,"SKILL.md")))??null}function fj($={}){let Z=$.source!==void 0?$.source:xj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??KG0,"--skill",Z6,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function kY($={}){return`npx ${fj($).join(" ")}`}async function aT($,Z){return await Bun.spawn(["npx",...fj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function yj($={}){let Z=$.home??qG0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>BG0.map((z)=>jh(X,z)))}function FG0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function qF($){let Z=yj($).find((z)=>Oh(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:nT,stale:!1};let J=null;try{J=FG0(HG0(Z,"utf8"))}catch{J=null}let X=J===null||J<nT;return{installed:!0,installedVersion:J,currentVersion:nT,stale:X}}function MG0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Vh($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (Rj(),Pj));if(Z())return;let J=$$(),X=oT(),z=qF();if(!z.installed){if(x5(iT)==="1")return;z6(iT,"1"),process.stderr.write(`
|
|
308
308
|
${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
|
|
309
309
|
${X}
|
package/dist/cli/rove-run.js
CHANGED
|
@@ -303,7 +303,7 @@ ${G}
|
|
|
303
303
|
`)}let z=QG0();for(let G of gT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await qh()}catch{}}function QG0(){try{for(let $ of o4().plugins){if(!$.enabled)continue;try{if(Y6($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function qh(){let $=JG0();if($.length===0)return;let Z=x5(Xh),J=new Set([Hh()]),X=XG0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")z6(Xh,"off")}async function zG0(){let $=gT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
|
|
304
304
|
`);return}await $.removeActivityHooks(Z),await $.removeWorktreeWatchHook(Z),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${Z}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`
|
|
305
305
|
`))}async function YG0($){await qh(),process.stdout.write(["rove hook setup is deprecated and now a no-op (cleanup only).","","The old external-worktree sync used a global WorktreeCreate hook, which is","a VCS provider hook \u2014 its presence broke `claude --worktree` / EnterWorktree","in every repo. Any hook Rove previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo Rove already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `rove adopt`.",""].join(`
|
|
306
|
-
`))}var rY0=500,sY0="worktree-created",Xh="externalWorktreeSync";var vT=d(()=>{I2();hJ();OZ();xT();yT();C4();M7();b4()});var Tj;var Bh=d(()=>{Tj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.
|
|
306
|
+
`))}var rY0=500,sY0="worktree-created",Xh="externalWorktreeSync";var vT=d(()=>{I2();hJ();OZ();xT();yT();C4();M7();b4()});var Tj;var Bh=d(()=>{Tj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.153",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",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://github.com/Sma1lboy/rove#readme",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"},"//":"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.14","@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 Fh={};A$(Fh,{repoSlug:()=>bY,releasePageUrl:()=>dT,recommendedGlobalInstallCommand:()=>hT,isNewerSemver:()=>kT,fetchReleaseSummaries:()=>HF,fetchReleaseNotesRange:()=>cT,fetchReleaseNotes:()=>uT,compareSemver:()=>C3,checkLatestVersion:()=>vY,breakingVersionsCrossed:()=>WF,UPDATE_SCRIPT_URL:()=>Sj,UPDATE_COMMAND:()=>_Z,PACKAGE_NAME:()=>mT,CURRENT_VERSION:()=>R$,BREAKING_VERSIONS:()=>pJ});function bY(){let $=Tj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function hT(){return`npm install -g ${mT}@latest`}function WF($,Z,J=pJ){let[X,z]=C3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>C3(G,X)>0&&C3(G,z)<=0)}async function WG0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Ij);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function kT($,Z){return C3($,Z)>0}function C3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function vY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:R$,latest:Z,hasUpdate:kT(Z,R$)};if(SH()&&!$.force)return null;let J=await WG0(mT);if(!J)return null;return{current:R$,latest:J,hasUpdate:kT(J,R$)}}function Kh($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function uT($){let Z=bY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Ij);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function cT($){let Z=bY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Ij);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Kh(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(C3(U,$.current)<=0)return null;if(C3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function HF($=12){let Z=bY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Ij);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Kh(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function dT($){let Z=bY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var R$,mT,Sj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",_Z,pJ,Ij=3000;var d8=d(()=>{Bh();V5();R$=Tj.version,mT=Tj.name;_Z=`curl -fsSL ${Sj} | sh`;pJ=[]});var Lh={};A$(Lh,{stampResetGate:()=>Ej,resetGateBlockers:()=>Mh,enforceResetGate:()=>pT,LAST_RUN_VERSION_KEY:()=>lT});function Mh($,Z=R$,J=pJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=C3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>C3(G,X)>0&&C3(G,z)<=0)}function pT(){let $=$$(),Z=L4()[lT],J=Mh(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${R$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
|
|
307
307
|
`)),process.exit(1)}if(Z!==R$)Ej()}function Ej(){try{E2({[lT]:R$})}catch{}}var lT="app.lastRunVersion";var wj=d(()=>{w2();d8();b4()});import{existsSync as Oh,readFileSync as HG0}from"fs";import{homedir as qG0}from"os";import{join as jh,resolve as Nh}from"path";import{fileURLToPath as UG0}from"url";function oT($=process.env){return`${$$($)} skill install`}function xj(){let $=UG0(import.meta.url);return[Nh($,"../../../../../.agents/skills/kobe"),Nh($,"../../skills/rove")].find((J)=>Oh(jh(J,"SKILL.md")))??null}function fj($={}){let Z=$.source!==void 0?$.source:xj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??KG0,"--skill",Z6,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function kY($={}){return`npx ${fj($).join(" ")}`}async function aT($,Z){return await Bun.spawn(["npx",...fj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function yj($={}){let Z=$.home??qG0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>BG0.map((z)=>jh(X,z)))}function FG0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function qF($){let Z=yj($).find((z)=>Oh(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:nT,stale:!1};let J=null;try{J=FG0(HG0(Z,"utf8"))}catch{J=null}let X=J===null||J<nT;return{installed:!0,installedVersion:J,currentVersion:nT,stale:X}}function MG0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Vh($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (Rj(),Pj));if(Z())return;let J=$$(),X=oT(),z=qF();if(!z.installed){if(x5(iT)==="1")return;z6(iT,"1"),process.stderr.write(`
|
|
308
308
|
${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
|
|
309
309
|
${X}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@sma1lboy/kobe",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.153",
|
|
5
5
|
"description": "Rove — the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"packageManager": "bun@1.3.13",
|