@sma1lboy/kobe 0.8.138 → 0.8.139
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 +2 -2
- package/dist/cli/kobe-run.js +2 -2
- package/dist/cli/rove-run.js +2 -2
- package/dist/skills/rove/SKILL.md +9 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -297,7 +297,7 @@ ${G}
|
|
|
297
297
|
`)}let z=sz0();for(let G of PT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await bm()}catch{}}function sz0(){try{for(let $ of V5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function bm(){let $=az0();if($.length===0)return;let Z=x5(Sm),J=new Set([gm()]),X=rz0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")X6(Sm,"off")}async function tz0(){let $=PT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
|
|
298
298
|
`);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(`
|
|
299
299
|
`))}async function ez0($){await bm(),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(`
|
|
300
|
-
`))}var lz0=500,pz0="worktree-created",Sm="externalWorktreeSync";var TT=l(()=>{T2();xQ();kJ();_T();DT();C4();D7();u4()});var jj;var km=l(()=>{jj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.
|
|
300
|
+
`))}var lz0=500,pz0="worktree-created",Sm="externalWorktreeSync";var TT=l(()=>{T2();xQ();kJ();_T();DT();C4();D7();u4()});var jj;var km=l(()=>{jj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.139",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 hm={};P$(hm,{repoSlug:()=>fY,releasePageUrl:()=>fT,recommendedGlobalInstallCommand:()=>ET,isNewerSemver:()=>ST,fetchReleaseSummaries:()=>GF,fetchReleaseNotesRange:()=>xT,fetchReleaseNotes:()=>wT,compareSemver:()=>V3,checkLatestVersion:()=>yY,breakingVersionsCrossed:()=>YF,UPDATE_SCRIPT_URL:()=>Vj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>IT,CURRENT_VERSION:()=>R$,BREAKING_VERSIONS:()=>cJ});function fY(){let $=jj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function ET(){return`npm install -g ${IT}@latest`}function YF($,Z,J=cJ){let[X,z]=V3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>V3(G,X)>0&&V3(G,z)<=0)}async function ZY0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),_j);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 ST($,Z){return V3($,Z)>0}function V3($,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 yY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:R$,latest:Z,hasUpdate:ST(Z,R$)};if(PH()&&!$.force)return null;let J=await ZY0(IT);if(!J)return null;return{current:R$,latest:J,hasUpdate:ST(J,R$)}}function mm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function wT($){let Z=fY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),_j);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 xT($){let Z=fY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),_j);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=mm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(V3(U,$.current)<=0)return null;if(V3(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 GF($=12){let Z=fY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),_j);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=mm(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 fT($){let Z=fY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var R$,IT,Vj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,cJ,_j=3000;var d8=l(()=>{km();j5();R$=jj.version,IT=jj.name;OZ=`curl -fsSL ${Vj} | sh`;cJ=[]});var cm={};P$(cm,{stampResetGate:()=>Cj,resetGateBlockers:()=>um,enforceResetGate:()=>gT,LAST_RUN_VERSION_KEY:()=>yT});function um($,Z=R$,J=cJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=V3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>V3(G,X)>0&&V3(G,z)<=0)}function gT(){let $=$$(),Z=N4()[yT],J=um(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${R$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
|
|
301
301
|
`)),process.exit(1)}if(Z!==R$)Cj()}function Cj(){try{S2({[yT]:R$})}catch{}}var yT="app.lastRunVersion";var Dj=l(()=>{I2();d8();u4()});import{existsSync as lm,readFileSync as JY0}from"fs";import{homedir as XY0}from"os";import{join as pm,resolve as dm}from"path";import{fileURLToPath as QY0}from"url";function kT($=process.env){return`${$$($)} skill install`}function Aj(){let $=QY0(import.meta.url);return[dm($,"../../../../../.agents/skills/kobe"),dm($,"../../skills/rove")].find((J)=>lm(pm(J,"SKILL.md")))??null}function Pj($={}){let Z=$.source!==void 0?$.source:Aj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??YY0,"--skill",e3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function gY($={}){return`npx ${Pj($).join(" ")}`}async function mT($,Z){return await Bun.spawn(["npx",...Pj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Rj($={}){let Z=$.home??XY0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>zY0.map((z)=>pm(X,z)))}function GY0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function WF($){let Z=Rj($).find((z)=>lm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:bT,stale:!1};let J=null;try{J=GY0(JY0(Z,"utf8"))}catch{J=null}let X=J===null||J<bT;return{installed:!0,installedVersion:J,currentVersion:bT,stale:X}}function WY0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function nm($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (Oj(),Lj));if(Z())return;let J=$$(),X=kT(),z=WF();if(!z.installed){if(x5(vT)==="1")return;X6(vT,"1"),process.stderr.write(`
|
|
302
302
|
${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
|
|
303
303
|
${X}
|
|
@@ -311,7 +311,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
|
|
|
311
311
|
${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
|
|
312
312
|
Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??WY0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??mT)();if(B===0)process.stderr.write(`${J}: skill updated.
|
|
313
313
|
`);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
|
|
314
|
-
`)}else if(U.startsWith("d"))X6(G,"1")}var bT=
|
|
314
|
+
`)}else if(U.startsWith("d"))X6(G,"1")}var bT=30,zY0,YY0="Sma1lboy/rove",vT="skillHintSeen";var HF=l(()=>{u4();VQ();C4();zY0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var Tj=()=>{};var q1=LY((HY0,Sj)=>{(function(){function $(J0,S0){Object.defineProperty(X.prototype,J0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(J0){if(J0===null||typeof J0!=="object")return null;return J0=D0&&J0[D0]||J0["@@iterator"],typeof J0==="function"?J0:null}function J(J0,S0){J0=(J0=J0.constructor)&&(J0.displayName||J0.name)||"ReactClass";var $1=J0+"."+S0;u0[$1]||(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,J0),u0[$1]=!0)}function X(J0,S0,$1){this.props=J0,this.context=S0,this.refs=W1,this.updater=$1||j0}function z(){}function G(J0,S0,$1){this.props=J0,this.context=S0,this.refs=W1,this.updater=$1||j0}function W(){}function H(J0){return""+J0}function U(J0){try{H(J0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var $1=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&J0[Symbol.toStringTag]||J0.constructor.name||"Object";return $1.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(J0)}}function B(J0){if(J0==null)return null;if(typeof J0==="function")return J0.$$typeof===c0?null:J0.displayName||J0.name||null;if(typeof J0==="string")return J0;switch(J0){case i:return"Fragment";case p:return"Profiler";case d:return"StrictMode";case $0:return"Suspense";case O0:return"SuspenseList";case b0:return"Activity"}if(typeof J0==="object")switch(typeof J0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),J0.$$typeof){case k:return"Portal";case Z0:return J0.displayName||"Context";case Y0:return(J0._context.displayName||"Context")+".Consumer";case n:var S0=J0.render;return J0=J0.displayName,J0||(J0=S0.displayName||S0.name||"",J0=J0!==""?"ForwardRef("+J0+")":"ForwardRef"),J0;case Q0:return S0=J0.displayName||null,S0!==null?S0:B(J0.type)||"Memo";case w0:S0=J0._payload,J0=J0._init;try{return B(J0(S0))}catch($1){}}return null}function M(J0){if(J0===i)return"<>";if(typeof J0==="object"&&J0!==null&&J0.$$typeof===w0)return"<...>";try{var S0=B(J0);return S0?"<"+S0+">":"<...>"}catch($1){return"<...>"}}function O(){var J0=X1.A;return J0===null?null:J0.getOwner()}function N(){return Error("react-stack-top-frame")}function j(J0){if(u1.call(J0,"key")){var S0=Object.getOwnPropertyDescriptor(J0,"key").get;if(S0&&S0.isReactWarning)return!1}return J0.key!==void 0}function A(J0,S0){function $1(){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))}$1.isReactWarning=!0,Object.defineProperty(J0,"key",{get:$1,configurable:!0})}function C(){var J0=B(this.type);return r5[J0]||(r5[J0]=!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.")),J0=this.props.ref,J0!==void 0?J0:null}function _(J0,S0,$1,U1,n1,x$){var A$=$1.ref;return J0={$$typeof:G0,type:J0,key:S0,props:$1,_owner:U1},(A$!==void 0?A$:null)!==null?Object.defineProperty(J0,"ref",{enumerable:!1,get:C}):Object.defineProperty(J0,"ref",{enumerable:!1,value:null}),J0._store={},Object.defineProperty(J0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(J0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(J0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty(J0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze(J0.props),Object.freeze(J0)),J0}function y(J0,S0){return S0=_(J0.type,S0,J0.props,J0._owner,J0._debugStack,J0._debugTask),J0._store&&(S0._store.validated=J0._store.validated),S0}function E(J0){T(J0)?J0._store&&(J0._store.validated=1):typeof J0==="object"&&J0!==null&&J0.$$typeof===w0&&(J0._payload.status==="fulfilled"?T(J0._payload.value)&&J0._payload.value._store&&(J0._payload.value._store.validated=1):J0._store&&(J0._store.validated=1))}function T(J0){return typeof J0==="object"&&J0!==null&&J0.$$typeof===G0}function P(J0){var S0={"=":"=0",":":"=2"};return"$"+J0.replace(/[=:]/g,function($1){return S0[$1]})}function w(J0,S0){return typeof J0==="object"&&J0!==null&&J0.key!=null?(U(J0.key),P(""+J0.key)):S0.toString(36)}function v(J0){switch(J0.status){case"fulfilled":return J0.value;case"rejected":throw J0.reason;default:switch(typeof J0.status==="string"?J0.then(W,W):(J0.status="pending",J0.then(function(S0){J0.status==="pending"&&(J0.status="fulfilled",J0.value=S0)},function(S0){J0.status==="pending"&&(J0.status="rejected",J0.reason=S0)})),J0.status){case"fulfilled":return J0.value;case"rejected":throw J0.reason}}throw J0}function g(J0,S0,$1,U1,n1){var x$=typeof J0;if(x$==="undefined"||x$==="boolean")J0=null;var A$=!1;if(J0===null)A$=!0;else switch(x$){case"bigint":case"string":case"number":A$=!0;break;case"object":switch(J0.$$typeof){case G0:case k:A$=!0;break;case w0:return A$=J0._init,g(A$(J0._payload),S0,$1,U1,n1)}}if(A$){A$=J0,n1=n1(A$);var K4=U1===""?"."+w(A$,0):U1;return N0(n1)?($1="",K4!=null&&($1=K4.replace(DX,"$&/")+"/"),g(n1,S0,$1,"",function(x7){return x7})):n1!=null&&(T(n1)&&(n1.key!=null&&(A$&&A$.key===n1.key||U(n1.key)),$1=y(n1,$1+(n1.key==null||A$&&A$.key===n1.key?"":(""+n1.key).replace(DX,"$&/")+"/")+K4),U1!==""&&A$!=null&&T(A$)&&A$.key==null&&A$._store&&!A$._store.validated&&($1._store.validated=2),n1=$1),S0.push(n1)),1}if(A$=0,K4=U1===""?".":U1+":",N0(J0))for(var g$=0;g$<J0.length;g$++)U1=J0[g$],x$=K4+w(U1,g$),A$+=g(U1,S0,$1,x$,n1);else if(g$=Z(J0),typeof g$==="function")for(g$===J0.entries&&(t8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),t8=!0),J0=g$.call(J0),g$=0;!(U1=J0.next()).done;)U1=U1.value,x$=K4+w(U1,g$++),A$+=g(U1,S0,$1,x$,n1);else if(x$==="object"){if(typeof J0.then==="function")return g(v(J0),S0,$1,U1,n1);throw S0=String(J0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(J0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return A$}function h(J0,S0,$1){if(J0==null)return J0;var U1=[],n1=0;return g(J0,U1,"","",function(x$){return S0.call($1,x$,n1++)}),U1}function r(J0){if(J0._status===-1){var S0=J0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=J0._result;var $1=S0();if($1.then(function(n1){if(J0._status===0||J0._status===-1){J0._status=1,J0._result=n1;var x$=J0._ioInfo;x$!=null&&(x$.end=performance.now()),$1.status===void 0&&($1.status="fulfilled",$1.value=n1)}},function(n1){if(J0._status===0||J0._status===-1){J0._status=2,J0._result=n1;var x$=J0._ioInfo;x$!=null&&(x$.end=performance.now()),$1.status===void 0&&($1.status="rejected",$1.reason=n1)}}),S0=J0._ioInfo,S0!=null){S0.value=$1;var U1=$1.displayName;typeof U1==="string"&&(S0.name=U1)}J0._status===-1&&(J0._status=0,J0._result=$1)}if(J0._status===1)return S0=J0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
|
|
315
315
|
|
|
316
316
|
Your code should look like:
|
|
317
317
|
const MyComponent = lazy(() => import('./MyComponent'))
|
package/dist/cli/kobe-run.js
CHANGED
|
@@ -297,7 +297,7 @@ ${G}
|
|
|
297
297
|
`)}let z=$Y0();for(let G of RT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await km()}catch{}}function $Y0(){try{for(let $ of V5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function km(){let $=tz0();if($.length===0)return;let Z=x5(Em),J=new Set([vm()]),X=ez0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")X6(Em,"off")}async function ZY0(){let $=RT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
|
|
298
298
|
`);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(`
|
|
299
299
|
`))}async function JY0($){await km(),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(`
|
|
300
|
-
`))}var iz0=500,oz0="worktree-created",Em="externalWorktreeSync";var ST=l(()=>{T2();xQ();kJ();CT();AT();C4();D7();b4()});var Vj;var hm=l(()=>{Vj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.
|
|
300
|
+
`))}var iz0=500,oz0="worktree-created",Em="externalWorktreeSync";var ST=l(()=>{T2();xQ();kJ();CT();AT();C4();D7();b4()});var Vj;var hm=l(()=>{Vj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.139",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 cm={};P$(cm,{repoSlug:()=>fY,releasePageUrl:()=>yT,recommendedGlobalInstallCommand:()=>wT,isNewerSemver:()=>IT,fetchReleaseSummaries:()=>GF,fetchReleaseNotesRange:()=>fT,fetchReleaseNotes:()=>xT,compareSemver:()=>V3,checkLatestVersion:()=>yY,breakingVersionsCrossed:()=>YF,UPDATE_SCRIPT_URL:()=>_j,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>ET,CURRENT_VERSION:()=>R$,BREAKING_VERSIONS:()=>cJ});function fY(){let $=Vj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function wT(){return`npm install -g ${ET}@latest`}function YF($,Z,J=cJ){let[X,z]=V3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>V3(G,X)>0&&V3(G,z)<=0)}async function QY0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Cj);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 IT($,Z){return V3($,Z)>0}function V3($,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 yY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:R$,latest:Z,hasUpdate:IT(Z,R$)};if(PH()&&!$.force)return null;let J=await QY0(ET);if(!J)return null;return{current:R$,latest:J,hasUpdate:IT(J,R$)}}function um($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function xT($){let Z=fY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Cj);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 fT($){let Z=fY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Cj);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=um(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(V3(U,$.current)<=0)return null;if(V3(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 GF($=12){let Z=fY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Cj);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=um(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 yT($){let Z=fY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var R$,ET,_j="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,cJ,Cj=3000;var d8=l(()=>{hm();j5();R$=Vj.version,ET=Vj.name;OZ=`curl -fsSL ${_j} | sh`;cJ=[]});var lm={};P$(lm,{stampResetGate:()=>Dj,resetGateBlockers:()=>dm,enforceResetGate:()=>bT,LAST_RUN_VERSION_KEY:()=>gT});function dm($,Z=R$,J=cJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=V3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>V3(G,X)>0&&V3(G,z)<=0)}function bT(){let $=$$(),Z=N4()[gT],J=dm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${R$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
|
|
301
301
|
`)),process.exit(1)}if(Z!==R$)Dj()}function Dj(){try{S2({[gT]:R$})}catch{}}var gT="app.lastRunVersion";var Aj=l(()=>{I2();d8();b4()});import{existsSync as nm,readFileSync as zY0}from"fs";import{homedir as YY0}from"os";import{join as im,resolve as pm}from"path";import{fileURLToPath as GY0}from"url";function mT($=process.env){return`${$$($)} skill install`}function Pj(){let $=GY0(import.meta.url);return[pm($,"../../../../../.agents/skills/kobe"),pm($,"../../skills/rove")].find((J)=>nm(im(J,"SKILL.md")))??null}function Rj($={}){let Z=$.source!==void 0?$.source:Pj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??HY0,"--skill",e3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function gY($={}){return`npx ${Rj($).join(" ")}`}async function hT($,Z){return await Bun.spawn(["npx",...Rj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Tj($={}){let Z=$.home??YY0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>WY0.map((z)=>im(X,z)))}function qY0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function WF($){let Z=Tj($).find((z)=>nm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:vT,stale:!1};let J=null;try{J=qY0(zY0(Z,"utf8"))}catch{J=null}let X=J===null||J<vT;return{installed:!0,installedVersion:J,currentVersion:vT,stale:X}}function UY0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function om($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (jj(),Oj));if(Z())return;let J=$$(),X=mT(),z=WF();if(!z.installed){if(x5(kT)==="1")return;X6(kT,"1"),process.stderr.write(`
|
|
302
302
|
${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
|
|
303
303
|
${X}
|
|
@@ -311,7 +311,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
|
|
|
311
311
|
${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
|
|
312
312
|
Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??UY0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??hT)();if(B===0)process.stderr.write(`${J}: skill updated.
|
|
313
313
|
`);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
|
|
314
|
-
`)}else if(U.startsWith("d"))X6(G,"1")}var vT=
|
|
314
|
+
`)}else if(U.startsWith("d"))X6(G,"1")}var vT=30,WY0,HY0="Sma1lboy/rove",kT="skillHintSeen";var HF=l(()=>{b4();VQ();C4();WY0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var Sj=()=>{};var q1=LY((BY0,Ij)=>{(function(){function $(J0,S0){Object.defineProperty(X.prototype,J0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(J0){if(J0===null||typeof J0!=="object")return null;return J0=D0&&J0[D0]||J0["@@iterator"],typeof J0==="function"?J0:null}function J(J0,S0){J0=(J0=J0.constructor)&&(J0.displayName||J0.name)||"ReactClass";var $1=J0+"."+S0;u0[$1]||(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,J0),u0[$1]=!0)}function X(J0,S0,$1){this.props=J0,this.context=S0,this.refs=W1,this.updater=$1||j0}function z(){}function G(J0,S0,$1){this.props=J0,this.context=S0,this.refs=W1,this.updater=$1||j0}function W(){}function H(J0){return""+J0}function U(J0){try{H(J0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var $1=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&J0[Symbol.toStringTag]||J0.constructor.name||"Object";return $1.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(J0)}}function B(J0){if(J0==null)return null;if(typeof J0==="function")return J0.$$typeof===c0?null:J0.displayName||J0.name||null;if(typeof J0==="string")return J0;switch(J0){case i:return"Fragment";case p:return"Profiler";case d:return"StrictMode";case $0:return"Suspense";case O0:return"SuspenseList";case b0:return"Activity"}if(typeof J0==="object")switch(typeof J0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),J0.$$typeof){case k:return"Portal";case Z0:return J0.displayName||"Context";case Y0:return(J0._context.displayName||"Context")+".Consumer";case n:var S0=J0.render;return J0=J0.displayName,J0||(J0=S0.displayName||S0.name||"",J0=J0!==""?"ForwardRef("+J0+")":"ForwardRef"),J0;case Q0:return S0=J0.displayName||null,S0!==null?S0:B(J0.type)||"Memo";case w0:S0=J0._payload,J0=J0._init;try{return B(J0(S0))}catch($1){}}return null}function M(J0){if(J0===i)return"<>";if(typeof J0==="object"&&J0!==null&&J0.$$typeof===w0)return"<...>";try{var S0=B(J0);return S0?"<"+S0+">":"<...>"}catch($1){return"<...>"}}function O(){var J0=X1.A;return J0===null?null:J0.getOwner()}function N(){return Error("react-stack-top-frame")}function j(J0){if(u1.call(J0,"key")){var S0=Object.getOwnPropertyDescriptor(J0,"key").get;if(S0&&S0.isReactWarning)return!1}return J0.key!==void 0}function A(J0,S0){function $1(){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))}$1.isReactWarning=!0,Object.defineProperty(J0,"key",{get:$1,configurable:!0})}function C(){var J0=B(this.type);return r5[J0]||(r5[J0]=!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.")),J0=this.props.ref,J0!==void 0?J0:null}function _(J0,S0,$1,U1,n1,x$){var A$=$1.ref;return J0={$$typeof:G0,type:J0,key:S0,props:$1,_owner:U1},(A$!==void 0?A$:null)!==null?Object.defineProperty(J0,"ref",{enumerable:!1,get:C}):Object.defineProperty(J0,"ref",{enumerable:!1,value:null}),J0._store={},Object.defineProperty(J0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(J0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(J0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty(J0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze(J0.props),Object.freeze(J0)),J0}function y(J0,S0){return S0=_(J0.type,S0,J0.props,J0._owner,J0._debugStack,J0._debugTask),J0._store&&(S0._store.validated=J0._store.validated),S0}function E(J0){T(J0)?J0._store&&(J0._store.validated=1):typeof J0==="object"&&J0!==null&&J0.$$typeof===w0&&(J0._payload.status==="fulfilled"?T(J0._payload.value)&&J0._payload.value._store&&(J0._payload.value._store.validated=1):J0._store&&(J0._store.validated=1))}function T(J0){return typeof J0==="object"&&J0!==null&&J0.$$typeof===G0}function P(J0){var S0={"=":"=0",":":"=2"};return"$"+J0.replace(/[=:]/g,function($1){return S0[$1]})}function w(J0,S0){return typeof J0==="object"&&J0!==null&&J0.key!=null?(U(J0.key),P(""+J0.key)):S0.toString(36)}function v(J0){switch(J0.status){case"fulfilled":return J0.value;case"rejected":throw J0.reason;default:switch(typeof J0.status==="string"?J0.then(W,W):(J0.status="pending",J0.then(function(S0){J0.status==="pending"&&(J0.status="fulfilled",J0.value=S0)},function(S0){J0.status==="pending"&&(J0.status="rejected",J0.reason=S0)})),J0.status){case"fulfilled":return J0.value;case"rejected":throw J0.reason}}throw J0}function g(J0,S0,$1,U1,n1){var x$=typeof J0;if(x$==="undefined"||x$==="boolean")J0=null;var A$=!1;if(J0===null)A$=!0;else switch(x$){case"bigint":case"string":case"number":A$=!0;break;case"object":switch(J0.$$typeof){case G0:case k:A$=!0;break;case w0:return A$=J0._init,g(A$(J0._payload),S0,$1,U1,n1)}}if(A$){A$=J0,n1=n1(A$);var K4=U1===""?"."+w(A$,0):U1;return N0(n1)?($1="",K4!=null&&($1=K4.replace(DX,"$&/")+"/"),g(n1,S0,$1,"",function(x7){return x7})):n1!=null&&(T(n1)&&(n1.key!=null&&(A$&&A$.key===n1.key||U(n1.key)),$1=y(n1,$1+(n1.key==null||A$&&A$.key===n1.key?"":(""+n1.key).replace(DX,"$&/")+"/")+K4),U1!==""&&A$!=null&&T(A$)&&A$.key==null&&A$._store&&!A$._store.validated&&($1._store.validated=2),n1=$1),S0.push(n1)),1}if(A$=0,K4=U1===""?".":U1+":",N0(J0))for(var g$=0;g$<J0.length;g$++)U1=J0[g$],x$=K4+w(U1,g$),A$+=g(U1,S0,$1,x$,n1);else if(g$=Z(J0),typeof g$==="function")for(g$===J0.entries&&(t8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),t8=!0),J0=g$.call(J0),g$=0;!(U1=J0.next()).done;)U1=U1.value,x$=K4+w(U1,g$++),A$+=g(U1,S0,$1,x$,n1);else if(x$==="object"){if(typeof J0.then==="function")return g(v(J0),S0,$1,U1,n1);throw S0=String(J0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(J0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return A$}function h(J0,S0,$1){if(J0==null)return J0;var U1=[],n1=0;return g(J0,U1,"","",function(x$){return S0.call($1,x$,n1++)}),U1}function r(J0){if(J0._status===-1){var S0=J0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=J0._result;var $1=S0();if($1.then(function(n1){if(J0._status===0||J0._status===-1){J0._status=1,J0._result=n1;var x$=J0._ioInfo;x$!=null&&(x$.end=performance.now()),$1.status===void 0&&($1.status="fulfilled",$1.value=n1)}},function(n1){if(J0._status===0||J0._status===-1){J0._status=2,J0._result=n1;var x$=J0._ioInfo;x$!=null&&(x$.end=performance.now()),$1.status===void 0&&($1.status="rejected",$1.reason=n1)}}),S0=J0._ioInfo,S0!=null){S0.value=$1;var U1=$1.displayName;typeof U1==="string"&&(S0.name=U1)}J0._status===-1&&(J0._status=0,J0._result=$1)}if(J0._status===1)return S0=J0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
|
|
315
315
|
|
|
316
316
|
Your code should look like:
|
|
317
317
|
const MyComponent = lazy(() => import('./MyComponent'))
|
package/dist/cli/rove-run.js
CHANGED
|
@@ -297,7 +297,7 @@ ${G}
|
|
|
297
297
|
`)}let z=$Y0();for(let G of RT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await km()}catch{}}function $Y0(){try{for(let $ of V5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function km(){let $=tz0();if($.length===0)return;let Z=x5(Em),J=new Set([vm()]),X=ez0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")X6(Em,"off")}async function ZY0(){let $=RT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
|
|
298
298
|
`);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(`
|
|
299
299
|
`))}async function JY0($){await km(),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(`
|
|
300
|
-
`))}var iz0=500,oz0="worktree-created",Em="externalWorktreeSync";var ST=l(()=>{T2();xQ();kJ();CT();AT();C4();D7();b4()});var Vj;var hm=l(()=>{Vj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.
|
|
300
|
+
`))}var iz0=500,oz0="worktree-created",Em="externalWorktreeSync";var ST=l(()=>{T2();xQ();kJ();CT();AT();C4();D7();b4()});var Vj;var hm=l(()=>{Vj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.139",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 cm={};P$(cm,{repoSlug:()=>fY,releasePageUrl:()=>yT,recommendedGlobalInstallCommand:()=>wT,isNewerSemver:()=>IT,fetchReleaseSummaries:()=>GF,fetchReleaseNotesRange:()=>fT,fetchReleaseNotes:()=>xT,compareSemver:()=>V3,checkLatestVersion:()=>yY,breakingVersionsCrossed:()=>YF,UPDATE_SCRIPT_URL:()=>_j,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>ET,CURRENT_VERSION:()=>R$,BREAKING_VERSIONS:()=>cJ});function fY(){let $=Vj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function wT(){return`npm install -g ${ET}@latest`}function YF($,Z,J=cJ){let[X,z]=V3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>V3(G,X)>0&&V3(G,z)<=0)}async function QY0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Cj);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 IT($,Z){return V3($,Z)>0}function V3($,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 yY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:R$,latest:Z,hasUpdate:IT(Z,R$)};if(PH()&&!$.force)return null;let J=await QY0(ET);if(!J)return null;return{current:R$,latest:J,hasUpdate:IT(J,R$)}}function um($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function xT($){let Z=fY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Cj);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 fT($){let Z=fY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Cj);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=um(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(V3(U,$.current)<=0)return null;if(V3(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 GF($=12){let Z=fY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Cj);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=um(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 yT($){let Z=fY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var R$,ET,_j="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,cJ,Cj=3000;var d8=l(()=>{hm();j5();R$=Vj.version,ET=Vj.name;OZ=`curl -fsSL ${_j} | sh`;cJ=[]});var lm={};P$(lm,{stampResetGate:()=>Dj,resetGateBlockers:()=>dm,enforceResetGate:()=>bT,LAST_RUN_VERSION_KEY:()=>gT});function dm($,Z=R$,J=cJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=V3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>V3(G,X)>0&&V3(G,z)<=0)}function bT(){let $=$$(),Z=N4()[gT],J=dm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${R$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
|
|
301
301
|
`)),process.exit(1)}if(Z!==R$)Dj()}function Dj(){try{S2({[gT]:R$})}catch{}}var gT="app.lastRunVersion";var Aj=l(()=>{I2();d8();b4()});import{existsSync as nm,readFileSync as zY0}from"fs";import{homedir as YY0}from"os";import{join as im,resolve as pm}from"path";import{fileURLToPath as GY0}from"url";function mT($=process.env){return`${$$($)} skill install`}function Pj(){let $=GY0(import.meta.url);return[pm($,"../../../../../.agents/skills/kobe"),pm($,"../../skills/rove")].find((J)=>nm(im(J,"SKILL.md")))??null}function Rj($={}){let Z=$.source!==void 0?$.source:Pj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??HY0,"--skill",e3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function gY($={}){return`npx ${Rj($).join(" ")}`}async function hT($,Z){return await Bun.spawn(["npx",...Rj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Tj($={}){let Z=$.home??YY0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>WY0.map((z)=>im(X,z)))}function qY0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function WF($){let Z=Tj($).find((z)=>nm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:vT,stale:!1};let J=null;try{J=qY0(zY0(Z,"utf8"))}catch{J=null}let X=J===null||J<vT;return{installed:!0,installedVersion:J,currentVersion:vT,stale:X}}function UY0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function om($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (jj(),Oj));if(Z())return;let J=$$(),X=mT(),z=WF();if(!z.installed){if(x5(kT)==="1")return;X6(kT,"1"),process.stderr.write(`
|
|
302
302
|
${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
|
|
303
303
|
${X}
|
|
@@ -311,7 +311,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
|
|
|
311
311
|
${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
|
|
312
312
|
Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??UY0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??hT)();if(B===0)process.stderr.write(`${J}: skill updated.
|
|
313
313
|
`);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
|
|
314
|
-
`)}else if(U.startsWith("d"))X6(G,"1")}var vT=
|
|
314
|
+
`)}else if(U.startsWith("d"))X6(G,"1")}var vT=30,WY0,HY0="Sma1lboy/rove",kT="skillHintSeen";var HF=l(()=>{b4();VQ();C4();WY0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var Sj=()=>{};var q1=LY((BY0,Ij)=>{(function(){function $(J0,S0){Object.defineProperty(X.prototype,J0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(J0){if(J0===null||typeof J0!=="object")return null;return J0=D0&&J0[D0]||J0["@@iterator"],typeof J0==="function"?J0:null}function J(J0,S0){J0=(J0=J0.constructor)&&(J0.displayName||J0.name)||"ReactClass";var $1=J0+"."+S0;u0[$1]||(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,J0),u0[$1]=!0)}function X(J0,S0,$1){this.props=J0,this.context=S0,this.refs=W1,this.updater=$1||j0}function z(){}function G(J0,S0,$1){this.props=J0,this.context=S0,this.refs=W1,this.updater=$1||j0}function W(){}function H(J0){return""+J0}function U(J0){try{H(J0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var $1=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&J0[Symbol.toStringTag]||J0.constructor.name||"Object";return $1.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(J0)}}function B(J0){if(J0==null)return null;if(typeof J0==="function")return J0.$$typeof===c0?null:J0.displayName||J0.name||null;if(typeof J0==="string")return J0;switch(J0){case i:return"Fragment";case p:return"Profiler";case d:return"StrictMode";case $0:return"Suspense";case O0:return"SuspenseList";case b0:return"Activity"}if(typeof J0==="object")switch(typeof J0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),J0.$$typeof){case k:return"Portal";case Z0:return J0.displayName||"Context";case Y0:return(J0._context.displayName||"Context")+".Consumer";case n:var S0=J0.render;return J0=J0.displayName,J0||(J0=S0.displayName||S0.name||"",J0=J0!==""?"ForwardRef("+J0+")":"ForwardRef"),J0;case Q0:return S0=J0.displayName||null,S0!==null?S0:B(J0.type)||"Memo";case w0:S0=J0._payload,J0=J0._init;try{return B(J0(S0))}catch($1){}}return null}function M(J0){if(J0===i)return"<>";if(typeof J0==="object"&&J0!==null&&J0.$$typeof===w0)return"<...>";try{var S0=B(J0);return S0?"<"+S0+">":"<...>"}catch($1){return"<...>"}}function O(){var J0=X1.A;return J0===null?null:J0.getOwner()}function N(){return Error("react-stack-top-frame")}function j(J0){if(u1.call(J0,"key")){var S0=Object.getOwnPropertyDescriptor(J0,"key").get;if(S0&&S0.isReactWarning)return!1}return J0.key!==void 0}function A(J0,S0){function $1(){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))}$1.isReactWarning=!0,Object.defineProperty(J0,"key",{get:$1,configurable:!0})}function C(){var J0=B(this.type);return r5[J0]||(r5[J0]=!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.")),J0=this.props.ref,J0!==void 0?J0:null}function _(J0,S0,$1,U1,n1,x$){var A$=$1.ref;return J0={$$typeof:G0,type:J0,key:S0,props:$1,_owner:U1},(A$!==void 0?A$:null)!==null?Object.defineProperty(J0,"ref",{enumerable:!1,get:C}):Object.defineProperty(J0,"ref",{enumerable:!1,value:null}),J0._store={},Object.defineProperty(J0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(J0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(J0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty(J0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze(J0.props),Object.freeze(J0)),J0}function y(J0,S0){return S0=_(J0.type,S0,J0.props,J0._owner,J0._debugStack,J0._debugTask),J0._store&&(S0._store.validated=J0._store.validated),S0}function E(J0){T(J0)?J0._store&&(J0._store.validated=1):typeof J0==="object"&&J0!==null&&J0.$$typeof===w0&&(J0._payload.status==="fulfilled"?T(J0._payload.value)&&J0._payload.value._store&&(J0._payload.value._store.validated=1):J0._store&&(J0._store.validated=1))}function T(J0){return typeof J0==="object"&&J0!==null&&J0.$$typeof===G0}function P(J0){var S0={"=":"=0",":":"=2"};return"$"+J0.replace(/[=:]/g,function($1){return S0[$1]})}function w(J0,S0){return typeof J0==="object"&&J0!==null&&J0.key!=null?(U(J0.key),P(""+J0.key)):S0.toString(36)}function v(J0){switch(J0.status){case"fulfilled":return J0.value;case"rejected":throw J0.reason;default:switch(typeof J0.status==="string"?J0.then(W,W):(J0.status="pending",J0.then(function(S0){J0.status==="pending"&&(J0.status="fulfilled",J0.value=S0)},function(S0){J0.status==="pending"&&(J0.status="rejected",J0.reason=S0)})),J0.status){case"fulfilled":return J0.value;case"rejected":throw J0.reason}}throw J0}function g(J0,S0,$1,U1,n1){var x$=typeof J0;if(x$==="undefined"||x$==="boolean")J0=null;var A$=!1;if(J0===null)A$=!0;else switch(x$){case"bigint":case"string":case"number":A$=!0;break;case"object":switch(J0.$$typeof){case G0:case k:A$=!0;break;case w0:return A$=J0._init,g(A$(J0._payload),S0,$1,U1,n1)}}if(A$){A$=J0,n1=n1(A$);var K4=U1===""?"."+w(A$,0):U1;return N0(n1)?($1="",K4!=null&&($1=K4.replace(DX,"$&/")+"/"),g(n1,S0,$1,"",function(x7){return x7})):n1!=null&&(T(n1)&&(n1.key!=null&&(A$&&A$.key===n1.key||U(n1.key)),$1=y(n1,$1+(n1.key==null||A$&&A$.key===n1.key?"":(""+n1.key).replace(DX,"$&/")+"/")+K4),U1!==""&&A$!=null&&T(A$)&&A$.key==null&&A$._store&&!A$._store.validated&&($1._store.validated=2),n1=$1),S0.push(n1)),1}if(A$=0,K4=U1===""?".":U1+":",N0(J0))for(var g$=0;g$<J0.length;g$++)U1=J0[g$],x$=K4+w(U1,g$),A$+=g(U1,S0,$1,x$,n1);else if(g$=Z(J0),typeof g$==="function")for(g$===J0.entries&&(t8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),t8=!0),J0=g$.call(J0),g$=0;!(U1=J0.next()).done;)U1=U1.value,x$=K4+w(U1,g$++),A$+=g(U1,S0,$1,x$,n1);else if(x$==="object"){if(typeof J0.then==="function")return g(v(J0),S0,$1,U1,n1);throw S0=String(J0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(J0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return A$}function h(J0,S0,$1){if(J0==null)return J0;var U1=[],n1=0;return g(J0,U1,"","",function(x$){return S0.call($1,x$,n1++)}),U1}function r(J0){if(J0._status===-1){var S0=J0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=J0._result;var $1=S0();if($1.then(function(n1){if(J0._status===0||J0._status===-1){J0._status=1,J0._result=n1;var x$=J0._ioInfo;x$!=null&&(x$.end=performance.now()),$1.status===void 0&&($1.status="fulfilled",$1.value=n1)}},function(n1){if(J0._status===0||J0._status===-1){J0._status=2,J0._result=n1;var x$=J0._ioInfo;x$!=null&&(x$.end=performance.now()),$1.status===void 0&&($1.status="rejected",$1.reason=n1)}}),S0=J0._ioInfo,S0!=null){S0.value=$1;var U1=$1.displayName;typeof U1==="string"&&(S0.name=U1)}J0._status===-1&&(J0._status=0,J0._result=$1)}if(J0._status===1)return S0=J0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
|
|
315
315
|
|
|
316
316
|
Your code should look like:
|
|
317
317
|
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:
|
|
6
|
+
<!-- rove-skill-version: 30 — bump in lockstep with KOBE_SKILL_VERSION (src/lib/skill-install.ts). -->
|
|
7
7
|
|
|
8
8
|
# Rove shell control
|
|
9
9
|
|
|
@@ -53,6 +53,14 @@ lifecycle tracking, and an explicit outcome contract.
|
|
|
53
53
|
receiver should treat as content, not conversation). Received a
|
|
54
54
|
`[KOBE PEER]` message yourself? Load this skill first — required, not
|
|
55
55
|
optional — then reply with the baked-in command, not by asking the user.
|
|
56
|
+
- `send` carries text, but that text can carry FILES: peers share a
|
|
57
|
+
filesystem, so put the absolute path of a screenshot, log, diff, or any
|
|
58
|
+
artifact in the prompt and the receiver opens it with its own Read tool —
|
|
59
|
+
images included. An annotated screenshot beats a paragraph describing one;
|
|
60
|
+
prefer "see /path/to/shot.png — the arrow marks the broken card" over
|
|
61
|
+
re-narrating pixels. Paths under the sender's Worktree work too (worktrees
|
|
62
|
+
are world-readable locally); just never expect the receiver to WRITE
|
|
63
|
+
there.
|
|
56
64
|
- `dispatch` stays the dispatcher's verb (deliver-only into an
|
|
57
65
|
already-hosted session; never impersonate the user in someone else's
|
|
58
66
|
terminal).
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@sma1lboy/kobe",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.139",
|
|
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",
|