@sma1lboy/kobe 0.8.126 → 0.8.127

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 CHANGED
@@ -295,7 +295,7 @@ ${G}
295
295
  `)}let z=Jz0();for(let G of QT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await Gm()}catch{}}function Jz0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Gm(){let $=$z0();if($.length===0)return;let Z=w5(ev),J=new Set([Ym()]),X=Zz0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")J6(ev,"off")}async function Xz0(){let $=QT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
296
296
  `);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(`
297
297
  `))}async function Qz0($){await Gm(),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(`
298
- `))}var aQ0=500,rQ0="worktree-created",ev="externalWorktreeSync";var YT=n(()=>{P2();SQ();yJ();$T();JT();_4();C7();h4()});var qj;var Hm=n(()=>{qj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.126",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 Um={};A$(Um,{repoSlug:()=>EY,releasePageUrl:()=>BT,recommendedGlobalInstallCommand:()=>HT,isNewerSemver:()=>GT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>UT,fetchReleaseNotes:()=>qT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Uj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>WT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=qj.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 ${WT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Yz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Bj);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 GT($,Z){return j3($,Z)>0}function j3($,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 wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:GT(Z,P$)};if(OH()&&!$.force)return null;let J=await Yz0(WT);if(!J)return null;return{current:P$,latest:J,hasUpdate:GT(J,P$)}}function qm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function qT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);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=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);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=qm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(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 ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Bj);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=qm(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 BT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,WT,Uj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Bj=3000;var h8=n(()=>{Hm();O5();P$=qj.version,WT=qj.name;OZ=`curl -fsSL ${Uj} | sh`;vJ=[]});var Km={};A$(Km,{stampResetGate:()=>Kj,resetGateBlockers:()=>Bm,enforceResetGate:()=>FT,LAST_RUN_VERSION_KEY:()=>KT});function Bm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function FT(){let $=$$(),Z=N4()[KT],J=Bm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: 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(`
298
+ `))}var aQ0=500,rQ0="worktree-created",ev="externalWorktreeSync";var YT=n(()=>{P2();SQ();yJ();$T();JT();_4();C7();h4()});var qj;var Hm=n(()=>{qj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.127",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 Um={};A$(Um,{repoSlug:()=>EY,releasePageUrl:()=>BT,recommendedGlobalInstallCommand:()=>HT,isNewerSemver:()=>GT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>UT,fetchReleaseNotes:()=>qT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Uj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>WT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=qj.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 ${WT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Yz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Bj);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 GT($,Z){return j3($,Z)>0}function j3($,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 wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:GT(Z,P$)};if(OH()&&!$.force)return null;let J=await Yz0(WT);if(!J)return null;return{current:P$,latest:J,hasUpdate:GT(J,P$)}}function qm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function qT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);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=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);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=qm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(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 ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Bj);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=qm(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 BT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,WT,Uj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Bj=3000;var h8=n(()=>{Hm();O5();P$=qj.version,WT=qj.name;OZ=`curl -fsSL ${Uj} | sh`;vJ=[]});var Km={};A$(Km,{stampResetGate:()=>Kj,resetGateBlockers:()=>Bm,enforceResetGate:()=>FT,LAST_RUN_VERSION_KEY:()=>KT});function Bm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function FT(){let $=$$(),Z=N4()[KT],J=Bm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: 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(`
299
299
  `)),process.exit(1)}if(Z!==P$)Kj()}function Kj(){try{R2({[KT]:P$})}catch{}}var KT="app.lastRunVersion";var Fj=n(()=>{T2();h8();h4()});import{existsSync as Mm,readFileSync as Gz0}from"fs";import{homedir as Wz0}from"os";import{join as Nm,resolve as Fm}from"path";import{fileURLToPath as Hz0}from"url";function LT($=process.env){return`${$$($)} skill install`}function Mj(){let $=Hz0(import.meta.url);return[Fm($,"../../../../../.agents/skills/kobe"),Fm($,"../../skills/rove")].find((J)=>Mm(Nm(J,"SKILL.md")))??null}function Nj($={}){let Z=$.source!==void 0?$.source:Mj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??Uz0,"--skill",t3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function xY($={}){return`npx ${Nj($).join(" ")}`}async function OT($,Z){return await Bun.spawn(["npx",...Nj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Lj($={}){let Z=$.home??Wz0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>qz0.map((z)=>Nm(X,z)))}function Bz0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function JF($){let Z=Lj($).find((z)=>Mm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:MT,stale:!1};let J=null;try{J=Bz0(Gz0(Z,"utf8"))}catch{J=null}let X=J===null||J<MT;return{installed:!0,installedVersion:J,currentVersion:MT,stale:X}}function Kz0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Lm($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (Hj(),Wj));if(Z())return;let J=$$(),X=LT(),z=JF();if(!z.installed){if(w5(NT)==="1")return;J6(NT,"1"),process.stderr.write(`
300
300
  ${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
301
301
  ${X}
@@ -309,7 +309,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
309
309
  ${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
310
310
  Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??Kz0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??OT)();if(B===0)process.stderr.write(`${J}: skill updated.
311
311
  `);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
312
- `)}else if(U.startsWith("d"))J6(G,"1")}var MT=28,qz0,Uz0="Sma1lboy/rove",NT="skillHintSeen";var XF=n(()=>{h4();NQ();_4();qz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var Oj=()=>{};var q1=FY((Fz0,jj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
312
+ `)}else if(U.startsWith("d"))J6(G,"1")}var MT=29,qz0,Uz0="Sma1lboy/rove",NT="skillHintSeen";var XF=n(()=>{h4();NQ();_4();qz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var Oj=()=>{};var q1=FY((Fz0,jj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
313
313
 
314
314
  Your code should look like:
315
315
  const MyComponent = lazy(() => import('./MyComponent'))
package/dist/cli/kobe.js CHANGED
@@ -295,7 +295,7 @@ ${G}
295
295
  `)}let z=zz0();for(let G of zT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await Hm()}catch{}}function zz0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Hm(){let $=Xz0();if($.length===0)return;let Z=w5(Zm),J=new Set([Wm()]),X=Qz0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")J6(Zm,"off")}async function Yz0(){let $=zT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
296
296
  `);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(`
297
297
  `))}async function Gz0($){await Hm(),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(`
298
- `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.126",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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);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 WT($,Z){return j3($,Z)>0}function j3($,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 wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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 BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(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 ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);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=Bm(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 KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: 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(`
298
+ `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.127",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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);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 WT($,Z){return j3($,Z)>0}function j3($,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 wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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 BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(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 ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);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=Bm(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 KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: 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(`
299
299
  `)),process.exit(1)}if(Z!==P$)Fj()}function Fj(){try{R2({[FT]:P$})}catch{}}var FT="app.lastRunVersion";var Mj=n(()=>{T2();h8();g4()});import{existsSync as Lm,readFileSync as qz0}from"fs";import{homedir as Uz0}from"os";import{join as Om,resolve as Nm}from"path";import{fileURLToPath as Bz0}from"url";function OT($=process.env){return`${$$($)} skill install`}function Nj(){let $=Bz0(import.meta.url);return[Nm($,"../../../../../.agents/skills/kobe"),Nm($,"../../skills/rove")].find((J)=>Lm(Om(J,"SKILL.md")))??null}function Lj($={}){let Z=$.source!==void 0?$.source:Nj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??Fz0,"--skill",t3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function xY($={}){return`npx ${Lj($).join(" ")}`}async function jT($,Z){return await Bun.spawn(["npx",...Lj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Oj($={}){let Z=$.home??Uz0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>Kz0.map((z)=>Om(X,z)))}function Mz0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function JF($){let Z=Oj($).find((z)=>Lm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:NT,stale:!1};let J=null;try{J=Mz0(qz0(Z,"utf8"))}catch{J=null}let X=J===null||J<NT;return{installed:!0,installedVersion:J,currentVersion:NT,stale:X}}function Nz0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function jm($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (qj(),Hj));if(Z())return;let J=$$(),X=OT(),z=JF();if(!z.installed){if(w5(LT)==="1")return;J6(LT,"1"),process.stderr.write(`
300
300
  ${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
301
301
  ${X}
@@ -309,7 +309,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
309
309
  ${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
310
310
  Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??Nz0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??jT)();if(B===0)process.stderr.write(`${J}: skill updated.
311
311
  `);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
312
- `)}else if(U.startsWith("d"))J6(G,"1")}var NT=28,Kz0,Fz0="Sma1lboy/rove",LT="skillHintSeen";var XF=n(()=>{g4();NQ();_4();Kz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var jj=()=>{};var q1=FY((Lz0,Vj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
312
+ `)}else if(U.startsWith("d"))J6(G,"1")}var NT=29,Kz0,Fz0="Sma1lboy/rove",LT="skillHintSeen";var XF=n(()=>{g4();NQ();_4();Kz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var jj=()=>{};var q1=FY((Lz0,Vj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
313
313
 
314
314
  Your code should look like:
315
315
  const MyComponent = lazy(() => import('./MyComponent'))
package/dist/cli/rove.js CHANGED
@@ -295,7 +295,7 @@ ${G}
295
295
  `)}let z=zz0();for(let G of zT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await Hm()}catch{}}function zz0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Hm(){let $=Xz0();if($.length===0)return;let Z=w5(Zm),J=new Set([Wm()]),X=Qz0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")J6(Zm,"off")}async function Yz0(){let $=zT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
296
296
  `);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(`
297
297
  `))}async function Gz0($){await Hm(),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(`
298
- `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.126",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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);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 WT($,Z){return j3($,Z)>0}function j3($,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 wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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 BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(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 ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);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=Bm(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 KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: 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(`
298
+ `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.127",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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);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 WT($,Z){return j3($,Z)>0}function j3($,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 wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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 BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);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=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(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 ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);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=Bm(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 KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: 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(`
299
299
  `)),process.exit(1)}if(Z!==P$)Fj()}function Fj(){try{R2({[FT]:P$})}catch{}}var FT="app.lastRunVersion";var Mj=n(()=>{T2();h8();g4()});import{existsSync as Lm,readFileSync as qz0}from"fs";import{homedir as Uz0}from"os";import{join as Om,resolve as Nm}from"path";import{fileURLToPath as Bz0}from"url";function OT($=process.env){return`${$$($)} skill install`}function Nj(){let $=Bz0(import.meta.url);return[Nm($,"../../../../../.agents/skills/kobe"),Nm($,"../../skills/rove")].find((J)=>Lm(Om(J,"SKILL.md")))??null}function Lj($={}){let Z=$.source!==void 0?$.source:Nj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??Fz0,"--skill",t3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function xY($={}){return`npx ${Lj($).join(" ")}`}async function jT($,Z){return await Bun.spawn(["npx",...Lj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Oj($={}){let Z=$.home??Uz0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>Kz0.map((z)=>Om(X,z)))}function Mz0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function JF($){let Z=Oj($).find((z)=>Lm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:NT,stale:!1};let J=null;try{J=Mz0(qz0(Z,"utf8"))}catch{J=null}let X=J===null||J<NT;return{installed:!0,installedVersion:J,currentVersion:NT,stale:X}}function Nz0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function jm($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (qj(),Hj));if(Z())return;let J=$$(),X=OT(),z=JF();if(!z.installed){if(w5(LT)==="1")return;J6(LT,"1"),process.stderr.write(`
300
300
  ${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
301
301
  ${X}
@@ -309,7 +309,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
309
309
  ${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
310
310
  Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??Nz0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??jT)();if(B===0)process.stderr.write(`${J}: skill updated.
311
311
  `);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
312
- `)}else if(U.startsWith("d"))J6(G,"1")}var NT=28,Kz0,Fz0="Sma1lboy/rove",LT="skillHintSeen";var XF=n(()=>{g4();NQ();_4();Kz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var jj=()=>{};var q1=FY((Lz0,Vj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
312
+ `)}else if(U.startsWith("d"))J6(G,"1")}var NT=29,Kz0,Fz0="Sma1lboy/rove",LT="skillHintSeen";var XF=n(()=>{g4();NQ();_4();Kz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var jj=()=>{};var q1=FY((Lz0,Vj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
313
313
 
314
314
  Your code should look like:
315
315
  const MyComponent = lazy(() => import('./MyComponent'))
@@ -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: 28 — bump in lockstep with KOBE_SKILL_VERSION (src/lib/skill-install.ts). -->
6
+ <!-- rove-skill-version: 29 — bump in lockstep with KOBE_SKILL_VERSION (src/lib/skill-install.ts). -->
7
7
 
8
8
  # Rove shell control
9
9
 
@@ -394,6 +394,13 @@ branch>)"` routes the outcome back to that exact tab. Include the final
394
394
  branch name — the spawner needs it to `land`. The first-prompt coda still
395
395
  names the spawner for an explicit `--task-id` send.
396
396
 
397
+ **"Succeeded" means COMMITTED.** Green tests in your working tree are not a
398
+ deliverable — the only thing `land` can merge is commits on your branch.
399
+ Before reporting success: `git status` clean, your work committed with a
400
+ real message (you wrote the code; you write its message). A worker that ran
401
+ everything, passed everything, and committed nothing has delivered nothing —
402
+ that exact mismatch has shipped empty merges before.
403
+
397
404
  **Coordinator side** — do NOT block or poll. Keep working (or end your
398
405
  turn); each worker's outcome arrives in your chat as a `[KOBE PEER]` message
399
406
  with its task id. What arrives is the worker's claim, not Rove-verified —
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.126",
4
+ "version": "0.8.127",
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",