@sma1lboy/kobe 0.7.43 → 0.7.44

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
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var rM=Object.defineProperty;var oM=(f)=>f;function sM(f,Y){this[f]=oM.bind(null,Y)}var H1=(f,Y)=>{for(var J in Y)rM(f,J,{get:Y[J],enumerable:!0,configurable:!0,set:sM.bind(Y,J)})};var N=(f,Y)=>()=>(f&&(Y=f(f=0)),Y);var QX=import.meta.require;import{basename as tM}from"path";function eM(f){let Y="";for(let J=0;J<f.length;J++){let z=f[J];if(z==="*")if(f[J+1]==="*")Y+=".*",J++;else Y+="[^/]*";else if(z==="?")Y+="[^/]";else if(z&&"\\^$.|+()[]{}".includes(z))Y+=`\\${z}`;else Y+=z}return new RegExp(`^${Y}$`)}function qX(f,Y){let J;try{J=eM(f)}catch{return!1}return J.test(Y)||J.test(tM(Y))}var XH=()=>{};var w9={};H1(w9,{resolvePersistedVendor:()=>PY,prevVendorWithin:()=>QH,nextVendorWithin:()=>WJ,nextVendor:()=>fF,isBuiltinVendor:()=>Yf,coerceVendorId:()=>pJ,BUILTIN_VENDORS:()=>$J,ALL_VENDORS:()=>m1});function Yf(f){return f==="claude"||f==="codex"||f==="copilot"}function fF(f){let Y=m1.indexOf(f);return m1[(Y+1)%m1.length]??m1[0]}function WJ(f,Y){if(f.length===0)return Y;let J=f.indexOf(Y);return f[(J+1)%f.length]??f[0]??Y}function QH(f,Y){if(f.length===0)return Y;let J=f.indexOf(Y);if(J<0)return f[f.length-1]??Y;return f[(J-1+f.length)%f.length]??Y}function pJ(f){let Y=f?.trim();return Y&&Y.length>0?Y:"claude"}function PY(f,Y=[]){let J=f?.trim();if(!J)return"claude";if(Yf(J))return J;if(Y.includes(J))return J;return"claude"}var $J,m1;var $1=N(()=>{$J=["claude","codex","copilot"],m1=[...$J]});var HX;var h9=N(()=>{HX={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.7.43",description:"TUI orchestrator for Claude Code (codename)",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/index.js"},files:["dist/cli","dist/web-ui","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/kobe.git"},homepage:"https://github.com/Sma1lboy/kobe#readme",bugs:{url:"https://github.com/Sma1lboy/kobe/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/cli/index.ts","dev:sandbox":"mkdir -p .dev-sandbox/home && env KOBE_DEV=1 KOBE_HOME_DIR=$PWD/.dev-sandbox/home KOBE_TMUX_SOCKET=kobe-sandbox bun --preload @opentui/solid/preload --conditions=browser ./src/cli/index.ts","dev:sandbox:reset":"env KOBE_TMUX_SOCKET=kobe-sandbox bun ./src/cli/index.ts kill-sessions","dev:version":"bash ../../scripts/dev-version.sh",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","test:fast":"vitest run --passWithNoTests","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --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.2.4","@opentui/solid":"0.2.4",ws:"^8.18.0","solid-js":"1.9.13"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.11","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2",knip:"^6.14.2","kobe-web":"workspace:*","node-pty":"^1.1.0",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});import{createHash as P9}from"crypto";import{homedir as JF}from"os";import{join as _J}from"path";function v9(){return process.env.KOBE_DEV==="1"}function OY(){return process.env.KOBE_HOME_DIR??JF()}function Jf(){return _J(OY(),".kobe")}function mf(){return _J(OY(),".config","kobe","state.json")}function zF(){return _J(Jf(),"settings")}function m9(){return _J(zF(),"keybindings.yaml")}function qH(){return _J(Jf(),"issue-assets")}function BX(f,Y,J){let z=P9("sha1").update(`${Y}@${f}:${J??22}`).digest("hex").slice(0,16);return _J(Jf(),"ssh",`${z}.sock`)}function c9(f){let Y=P9("sha1").update(f).digest("hex").slice(0,16);return _J(Jf(),"worktree-init",Y)}var i1=()=>{};var d9={};H1(d9,{repoSlug:()=>rJ,releasePageUrl:()=>VH,recommendedGlobalInstallCommand:()=>jH,isNewerSemver:()=>HH,fetchReleaseSummaries:()=>XF,fetchReleaseNotesRange:()=>WH,fetchReleaseNotes:()=>GF,compareSemver:()=>jX,checkLatestVersion:()=>dZ,UPDATE_SCRIPT_URL:()=>WX,UPDATE_COMMAND:()=>vY,PACKAGE_NAME:()=>BH,CURRENT_VERSION:()=>t0});function rJ(){let f=HX.repository?.url;if(!f)return null;let Y=f.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Y||!Y[1]||!Y[2])return null;return`${Y[1]}/${Y[2]}`}function jH(){return`npm install -g ${BH}@latest`}async function ZF(f){let Y=new AbortController,J=setTimeout(()=>Y.abort(),VX);try{let z=f.replace("/","%2F"),Z=await fetch(`https://registry.npmjs.org/${z}/latest`,{signal:Y.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 HH(f,Y){return jX(f,Y)>0}function jX(f,Y){let J=(G)=>G.split("-")[0]??G,z=J(f).split(".").map((G)=>Number.parseInt(G,10)),Z=J(Y).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let Q=z[G]??0,q=Z[G]??0;if(Number.isNaN(Q)||Number.isNaN(q))return 0;if(Q>q)return 1;if(Q<q)return-1}return 0}async function dZ(f={}){let Y=process.env.KOBE_FAKE_UPDATE;if(Y)return{current:t0,latest:Y,hasUpdate:HH(Y,t0)};if(v9()&&!f.force)return null;let J=await ZF(BH);if(!J)return null;return{current:t0,latest:J,hasUpdate:HH(J,t0)}}function n9(f){if(typeof f!=="string")return null;return f.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function GF(f){let Y=rJ();if(!Y)return null;let J=`v${f}`,z=new AbortController,Z=setTimeout(()=>z.abort(),VX);try{let G=await fetch(`https://api.github.com/repos/${Y}/releases/tags/${J}`,{signal:z.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let Q=await G.json();if(typeof Q.body!=="string"||typeof Q.html_url!=="string")return null;return{body:Q.body,url:Q.html_url,version:f}}catch{return null}finally{clearTimeout(Z)}}async function WH(f){let Y=rJ();if(!Y)return[];let J=f.limit??100,z=new AbortController,Z=setTimeout(()=>z.abort(),VX);try{let G=await fetch(`https://api.github.com/repos/${Y}/releases?per_page=${J}`,{signal:z.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let Q=await G.json();if(!Array.isArray(Q))return[];return Q.map((q)=>{let H=n9(q.tag_name);if(!H||typeof q.html_url!=="string"||typeof q.body!=="string")return null;if(jX(H,f.current)<=0)return null;if(jX(H,f.latest)>0)return null;return{version:H,url:q.html_url,body:q.body}}).filter((q)=>q!==null)}catch{return[]}finally{clearTimeout(Z)}}async function XF(f=12){let Y=rJ();if(!Y)return[];let J=new AbortController,z=setTimeout(()=>J.abort(),VX);try{let Z=await fetch(`https://api.github.com/repos/${Y}/releases?per_page=${f}`,{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((Q)=>{let q=n9(Q.tag_name);if(!q||typeof Q.html_url!=="string")return null;return{version:q,url:Q.html_url}}).filter((Q)=>Q!==null)}catch{return[]}finally{clearTimeout(z)}}function VH(f){let Y=rJ();if(!Y)return null;return`https://github.com/${Y}/releases/tag/v${f}`}var t0,BH,WX="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",vY,VX=3000;var Df=N(()=>{h9();i1();t0=HX.version,BH=HX.name;vY=`curl -fsSL ${WX} | sh`});import{spawn as QF,spawnSync as qF}from"child_process";import{existsSync as l9}from"fs";import{mkdir as HF,readFile as BF,readdir as jF}from"fs/promises";function oJ(f){return`'${f.replace(/'/g,"'\\''")}'`}function WF(f){return/^[A-Za-z0-9_@%+=:,./-]+$/.test(f)?f:oJ(f)}function $9(f){return f.map(oJ).join(" ")}function VF(f,Y){let J=$9(f);return Y?`cd ${oJ(Y)} && ${J}`:J}function KF(f){if(!f)return"";let Y=Object.entries(f).filter(([J])=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(J));if(Y.length===0)return"";return`${Y.map(([J,z])=>`${J}=${oJ(z)}`).join(" ")} `}function iZ(f,Y={}){let J=["ssh"];if(Y.tty)J.push("-tt");if(Y.batch)J.push("-o","BatchMode=yes");if(J.push("-o","ControlMaster=auto","-o",`ControlPath=${f.controlPath}`,"-o","ControlPersist=300"),J.push("-o","StrictHostKeyChecking=accept-new"),f.port)J.push("-p",String(f.port));if(f.auth.kind==="key"&&f.auth.keyPath)J.push("-i",f.auth.keyPath);return J.push(`${f.user}@${f.host}`),J}function p9(f,Y={}){return new Promise((J)=>{let[z,...Z]=f,G="",Q="",q=!1,H=(V)=>{if(q)return;q=!0,J({stdout:G,stderr:Q,exitCode:V})},B;try{B=QF(z??"",Z,{cwd:Y.cwd,env:Y.env,shell:!1,signal:Y.signal})}catch{H(-1);return}B.stdout?.setEncoding("utf8"),B.stdout?.on("data",(V)=>{G+=V}),B.stderr?.setEncoding("utf8"),B.stderr?.on("data",(V)=>{Q+=V}),B.on("error",()=>H(-1)),B.on("close",(V)=>H(V??-1))})}class KX{isRemote=!1;run(f,Y={}){return p9(f,{cwd:Y.cwd,env:Y.env?{...process.env,...Y.env}:process.env,signal:Y.signal})}async exists(f){return l9(f)}existsSync(f){return l9(f)}async mkdirp(f){await HF(f,{recursive:!0})}async readFile(f){try{return await BF(f,"utf8")}catch{return null}}async readdir(f){try{return await jF(f)}catch{return[]}}wrapCommand(f){return f}ensureReady(){}}class Pz{spec;spawn;isRemote=!0;masterUp=!1;spawnAsync;constructor(f,Y=a9,J){this.spec=f;this.spawn=Y;this.spawnAsync=J??(this.spawn===a9?UF:async(z,Z)=>this.spawn(z,Z))}ensureReady(){if(this.masterUp)return;if(this.spawn([...iZ(this.spec,{batch:!0}),"-O","check"]).exitCode===0){this.masterUp=!0;return}let Y=[...iZ(this.spec,{batch:this.spec.auth.kind!=="password"}),"-fN"];if(this.spec.auth.kind==="password"){let J=this.spec.auth.getPassword();if(J!=null){this.spawn(["sshpass","-e",...Y],{SSHPASS:J}),this.masterUp=!0;return}}this.spawn(Y),this.masterUp=!0}async run(f,Y={}){this.ensureReady();let J=`${KF(Y.env)}${$9(f)}`,z=Y.cwd?`cd ${oJ(Y.cwd)} && ${J}`:J;return this.spawnAsync([...iZ(this.spec,{batch:!0}),z],void 0,{signal:Y.signal})}async exists(f){return(await this.run(["test","-e",f])).exitCode===0}existsSync(f){return this.ensureReady(),this.spawn([...iZ(this.spec,{batch:!0}),VF(["test","-e",f])]).exitCode===0}async mkdirp(f){await this.run(["mkdir","-p",f])}async readFile(f){let Y=await this.run(["cat",f]);return Y.exitCode===0?Y.stdout:null}async readdir(f){let Y=await this.run(["ls","-1A",f]);if(Y.exitCode!==0)return[];return Y.stdout.split(`
3
+ var rM=Object.defineProperty;var oM=(f)=>f;function sM(f,Y){this[f]=oM.bind(null,Y)}var H1=(f,Y)=>{for(var J in Y)rM(f,J,{get:Y[J],enumerable:!0,configurable:!0,set:sM.bind(Y,J)})};var N=(f,Y)=>()=>(f&&(Y=f(f=0)),Y);var QX=import.meta.require;import{basename as tM}from"path";function eM(f){let Y="";for(let J=0;J<f.length;J++){let z=f[J];if(z==="*")if(f[J+1]==="*")Y+=".*",J++;else Y+="[^/]*";else if(z==="?")Y+="[^/]";else if(z&&"\\^$.|+()[]{}".includes(z))Y+=`\\${z}`;else Y+=z}return new RegExp(`^${Y}$`)}function qX(f,Y){let J;try{J=eM(f)}catch{return!1}return J.test(Y)||J.test(tM(Y))}var XH=()=>{};var w9={};H1(w9,{resolvePersistedVendor:()=>PY,prevVendorWithin:()=>QH,nextVendorWithin:()=>WJ,nextVendor:()=>fF,isBuiltinVendor:()=>Yf,coerceVendorId:()=>pJ,BUILTIN_VENDORS:()=>$J,ALL_VENDORS:()=>m1});function Yf(f){return f==="claude"||f==="codex"||f==="copilot"}function fF(f){let Y=m1.indexOf(f);return m1[(Y+1)%m1.length]??m1[0]}function WJ(f,Y){if(f.length===0)return Y;let J=f.indexOf(Y);return f[(J+1)%f.length]??f[0]??Y}function QH(f,Y){if(f.length===0)return Y;let J=f.indexOf(Y);if(J<0)return f[f.length-1]??Y;return f[(J-1+f.length)%f.length]??Y}function pJ(f){let Y=f?.trim();return Y&&Y.length>0?Y:"claude"}function PY(f,Y=[]){let J=f?.trim();if(!J)return"claude";if(Yf(J))return J;if(Y.includes(J))return J;return"claude"}var $J,m1;var $1=N(()=>{$J=["claude","codex","copilot"],m1=[...$J]});var HX;var h9=N(()=>{HX={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.7.44",description:"TUI orchestrator for Claude Code (codename)",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/index.js"},files:["dist/cli","dist/web-ui","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/kobe.git"},homepage:"https://github.com/Sma1lboy/kobe#readme",bugs:{url:"https://github.com/Sma1lboy/kobe/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/cli/index.ts","dev:sandbox":"mkdir -p .dev-sandbox/home && env KOBE_DEV=1 KOBE_HOME_DIR=$PWD/.dev-sandbox/home KOBE_TMUX_SOCKET=kobe-sandbox bun --preload @opentui/solid/preload --conditions=browser ./src/cli/index.ts","dev:sandbox:reset":"env KOBE_TMUX_SOCKET=kobe-sandbox bun ./src/cli/index.ts kill-sessions","dev:version":"bash ../../scripts/dev-version.sh",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","test:fast":"vitest run --passWithNoTests","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --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.2.4","@opentui/solid":"0.2.4",ws:"^8.18.0","solid-js":"1.9.13","node-pty":"^1.1.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.11","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2",knip:"^6.14.2","kobe-web":"workspace:*",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});import{createHash as P9}from"crypto";import{homedir as JF}from"os";import{join as _J}from"path";function v9(){return process.env.KOBE_DEV==="1"}function OY(){return process.env.KOBE_HOME_DIR??JF()}function Jf(){return _J(OY(),".kobe")}function mf(){return _J(OY(),".config","kobe","state.json")}function zF(){return _J(Jf(),"settings")}function m9(){return _J(zF(),"keybindings.yaml")}function qH(){return _J(Jf(),"issue-assets")}function BX(f,Y,J){let z=P9("sha1").update(`${Y}@${f}:${J??22}`).digest("hex").slice(0,16);return _J(Jf(),"ssh",`${z}.sock`)}function c9(f){let Y=P9("sha1").update(f).digest("hex").slice(0,16);return _J(Jf(),"worktree-init",Y)}var i1=()=>{};var d9={};H1(d9,{repoSlug:()=>rJ,releasePageUrl:()=>VH,recommendedGlobalInstallCommand:()=>jH,isNewerSemver:()=>HH,fetchReleaseSummaries:()=>XF,fetchReleaseNotesRange:()=>WH,fetchReleaseNotes:()=>GF,compareSemver:()=>jX,checkLatestVersion:()=>dZ,UPDATE_SCRIPT_URL:()=>WX,UPDATE_COMMAND:()=>vY,PACKAGE_NAME:()=>BH,CURRENT_VERSION:()=>t0});function rJ(){let f=HX.repository?.url;if(!f)return null;let Y=f.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Y||!Y[1]||!Y[2])return null;return`${Y[1]}/${Y[2]}`}function jH(){return`npm install -g ${BH}@latest`}async function ZF(f){let Y=new AbortController,J=setTimeout(()=>Y.abort(),VX);try{let z=f.replace("/","%2F"),Z=await fetch(`https://registry.npmjs.org/${z}/latest`,{signal:Y.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 HH(f,Y){return jX(f,Y)>0}function jX(f,Y){let J=(G)=>G.split("-")[0]??G,z=J(f).split(".").map((G)=>Number.parseInt(G,10)),Z=J(Y).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let Q=z[G]??0,q=Z[G]??0;if(Number.isNaN(Q)||Number.isNaN(q))return 0;if(Q>q)return 1;if(Q<q)return-1}return 0}async function dZ(f={}){let Y=process.env.KOBE_FAKE_UPDATE;if(Y)return{current:t0,latest:Y,hasUpdate:HH(Y,t0)};if(v9()&&!f.force)return null;let J=await ZF(BH);if(!J)return null;return{current:t0,latest:J,hasUpdate:HH(J,t0)}}function n9(f){if(typeof f!=="string")return null;return f.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function GF(f){let Y=rJ();if(!Y)return null;let J=`v${f}`,z=new AbortController,Z=setTimeout(()=>z.abort(),VX);try{let G=await fetch(`https://api.github.com/repos/${Y}/releases/tags/${J}`,{signal:z.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let Q=await G.json();if(typeof Q.body!=="string"||typeof Q.html_url!=="string")return null;return{body:Q.body,url:Q.html_url,version:f}}catch{return null}finally{clearTimeout(Z)}}async function WH(f){let Y=rJ();if(!Y)return[];let J=f.limit??100,z=new AbortController,Z=setTimeout(()=>z.abort(),VX);try{let G=await fetch(`https://api.github.com/repos/${Y}/releases?per_page=${J}`,{signal:z.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let Q=await G.json();if(!Array.isArray(Q))return[];return Q.map((q)=>{let H=n9(q.tag_name);if(!H||typeof q.html_url!=="string"||typeof q.body!=="string")return null;if(jX(H,f.current)<=0)return null;if(jX(H,f.latest)>0)return null;return{version:H,url:q.html_url,body:q.body}}).filter((q)=>q!==null)}catch{return[]}finally{clearTimeout(Z)}}async function XF(f=12){let Y=rJ();if(!Y)return[];let J=new AbortController,z=setTimeout(()=>J.abort(),VX);try{let Z=await fetch(`https://api.github.com/repos/${Y}/releases?per_page=${f}`,{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((Q)=>{let q=n9(Q.tag_name);if(!q||typeof Q.html_url!=="string")return null;return{version:q,url:Q.html_url}}).filter((Q)=>Q!==null)}catch{return[]}finally{clearTimeout(z)}}function VH(f){let Y=rJ();if(!Y)return null;return`https://github.com/${Y}/releases/tag/v${f}`}var t0,BH,WX="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",vY,VX=3000;var Df=N(()=>{h9();i1();t0=HX.version,BH=HX.name;vY=`curl -fsSL ${WX} | sh`});import{spawn as QF,spawnSync as qF}from"child_process";import{existsSync as l9}from"fs";import{mkdir as HF,readFile as BF,readdir as jF}from"fs/promises";function oJ(f){return`'${f.replace(/'/g,"'\\''")}'`}function WF(f){return/^[A-Za-z0-9_@%+=:,./-]+$/.test(f)?f:oJ(f)}function $9(f){return f.map(oJ).join(" ")}function VF(f,Y){let J=$9(f);return Y?`cd ${oJ(Y)} && ${J}`:J}function KF(f){if(!f)return"";let Y=Object.entries(f).filter(([J])=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(J));if(Y.length===0)return"";return`${Y.map(([J,z])=>`${J}=${oJ(z)}`).join(" ")} `}function iZ(f,Y={}){let J=["ssh"];if(Y.tty)J.push("-tt");if(Y.batch)J.push("-o","BatchMode=yes");if(J.push("-o","ControlMaster=auto","-o",`ControlPath=${f.controlPath}`,"-o","ControlPersist=300"),J.push("-o","StrictHostKeyChecking=accept-new"),f.port)J.push("-p",String(f.port));if(f.auth.kind==="key"&&f.auth.keyPath)J.push("-i",f.auth.keyPath);return J.push(`${f.user}@${f.host}`),J}function p9(f,Y={}){return new Promise((J)=>{let[z,...Z]=f,G="",Q="",q=!1,H=(V)=>{if(q)return;q=!0,J({stdout:G,stderr:Q,exitCode:V})},B;try{B=QF(z??"",Z,{cwd:Y.cwd,env:Y.env,shell:!1,signal:Y.signal})}catch{H(-1);return}B.stdout?.setEncoding("utf8"),B.stdout?.on("data",(V)=>{G+=V}),B.stderr?.setEncoding("utf8"),B.stderr?.on("data",(V)=>{Q+=V}),B.on("error",()=>H(-1)),B.on("close",(V)=>H(V??-1))})}class KX{isRemote=!1;run(f,Y={}){return p9(f,{cwd:Y.cwd,env:Y.env?{...process.env,...Y.env}:process.env,signal:Y.signal})}async exists(f){return l9(f)}existsSync(f){return l9(f)}async mkdirp(f){await HF(f,{recursive:!0})}async readFile(f){try{return await BF(f,"utf8")}catch{return null}}async readdir(f){try{return await jF(f)}catch{return[]}}wrapCommand(f){return f}ensureReady(){}}class Pz{spec;spawn;isRemote=!0;masterUp=!1;spawnAsync;constructor(f,Y=a9,J){this.spec=f;this.spawn=Y;this.spawnAsync=J??(this.spawn===a9?UF:async(z,Z)=>this.spawn(z,Z))}ensureReady(){if(this.masterUp)return;if(this.spawn([...iZ(this.spec,{batch:!0}),"-O","check"]).exitCode===0){this.masterUp=!0;return}let Y=[...iZ(this.spec,{batch:this.spec.auth.kind!=="password"}),"-fN"];if(this.spec.auth.kind==="password"){let J=this.spec.auth.getPassword();if(J!=null){this.spawn(["sshpass","-e",...Y],{SSHPASS:J}),this.masterUp=!0;return}}this.spawn(Y),this.masterUp=!0}async run(f,Y={}){this.ensureReady();let J=`${KF(Y.env)}${$9(f)}`,z=Y.cwd?`cd ${oJ(Y.cwd)} && ${J}`:J;return this.spawnAsync([...iZ(this.spec,{batch:!0}),z],void 0,{signal:Y.signal})}async exists(f){return(await this.run(["test","-e",f])).exitCode===0}existsSync(f){return this.ensureReady(),this.spawn([...iZ(this.spec,{batch:!0}),VF(["test","-e",f])]).exitCode===0}async mkdirp(f){await this.run(["mkdir","-p",f])}async readFile(f){let Y=await this.run(["cat",f]);return Y.exitCode===0?Y.stdout:null}async readdir(f){let Y=await this.run(["ls","-1A",f]);if(Y.exitCode!==0)return[];return Y.stdout.split(`
4
4
  `).filter((J)=>J.length>0)}wrapCommand(f,Y={}){let J=Y.cwd?`cd ${oJ(Y.cwd)} && ${f}`:f;return`${iZ(this.spec,{tty:Y.tty}).map(WF).join(" ")} ${oJ(J)}`}}var a9=(f,Y)=>{let[J,...z]=f,Z=qF(J??"",z,{env:Y?{...process.env,...Y}:process.env,encoding:"utf8",shell:!1});return{stdout:Z.stdout??"",stderr:Z.stderr??"",exitCode:Z.status??-1}},UF=(f,Y,J)=>p9(f,{env:Y?{...process.env,...Y}:process.env,signal:J?.signal});var KH=()=>{};import{spawnSync as DF}from"child_process";import{platform as LF}from"os";function _9(f,Y,J){return{service:MF,account:J?`${Y}@${f}:${J}`:`${Y}@${f}`}}function DH(f=UH){return f.platform()==="darwin"}function r9(f,Y,J=UH){if(J.platform()!=="darwin")return!1;let{exitCode:z}=J.run(["security","add-generic-password","-U","-s",f.service,"-a",f.account,"-w",Y]);return z===0}function UX(f,Y=UH){if(Y.platform()!=="darwin")return null;let{stdout:J,exitCode:z}=Y.run(["security","find-generic-password","-s",f.service,"-a",f.account,"-w"]);if(z!==0)return null;return J.replace(/\n$/,"")}var UH,MF="kobe-remote-ssh";var LH=N(()=>{UH={run(f){let[Y,...J]=f,z=DF(Y??"",J,{encoding:"utf8",shell:!1});return{stdout:z.stdout??"",exitCode:z.status??-1}},platform(){return LF()}}});import{mkdirSync as FF,readFileSync as OF,renameSync as AF,writeFileSync as RF}from"fs";import{dirname as gF}from"path";function c1(){try{let f=OF(mf(),"utf8"),Y=JSON.parse(f);if(Y&&typeof Y==="object"&&!Array.isArray(Y))return Y}catch{}return{}}function o9(f){let Y=mf();FF(gF(Y),{recursive:!0});let J=`${Y}.tmp`;RF(J,JSON.stringify(f,null,2),"utf8"),AF(J,Y)}function vz(f){let Y=c1();if(f(Y)!==!1)o9(Y);return Y}function sJ(f){return vz((Y)=>{for(let[J,z]of Object.entries(f))if(z===void 0)delete Y[J];else Y[J]=z;return})}function s9(f){o9(f)}var tJ=N(()=>{i1()});var iY={};H1(iY,{statePath:()=>bF,setRepoInitOverride:()=>kF,setPersistedString:()=>l1,resolveRepoRoot:()=>mY,resolveMainRepoRoot:()=>NF,removeSavedRepo:()=>AH,remoteRepoKey:()=>YW,normalizeSavedRepos:()=>FH,isRemoteRepoKey:()=>zf,isRemoteProjectsEnabled:()=>RH,isGitRepo:()=>CF,getSavedRepos:()=>Of,getRepoInitOverride:()=>OH,getRemoteRepos:()=>gH,getRemoteRepoConfig:()=>dY,getPersistedString:()=>k1,getCustomEngineIds:()=>cY,addSavedRepo:()=>nY,addRemoteRepo:()=>CH});import{spawnSync as MH}from"child_process";import{realpathSync as t9}from"fs";function mY(f){if(zf(f))return f;let Y=MH("git",["rev-parse","--show-toplevel"],{cwd:f,encoding:"utf8",shell:!1});if(Y.status!==0)return f;let J=(Y.stdout??"").trim();if(!J)return f;try{if(t9(f)===t9(J))return f}catch{}return J}function CF(f){if(zf(f))return!1;let Y=MH("git",["rev-parse","--is-inside-work-tree"],{cwd:f,encoding:"utf8",shell:!1});return Y.status===0&&(Y.stdout??"").trim()==="true"}function NF(f){if(zf(f))return f;let Y=MH("git",["worktree","list","--porcelain"],{cwd:f,encoding:"utf8",shell:!1});if(Y.status!==0)return mY(f);return(Y.stdout??"").split(/\r?\n/).find((z)=>z.startsWith("worktree "))?.slice(9).trim()||mY(f)}function bF(){return mf()}function DX(f){let Y=f.savedRepos;if(!Array.isArray(Y))return[];return Y.filter((J)=>typeof J==="string")}function Of(){return DX(c1())}function k1(f){let Y=c1()[f];return typeof Y==="string"?Y:void 0}function l1(f,Y){sJ({[f]:Y})}function cY(){let f=c1().customEngineIds;if(!Array.isArray(f))return[];return f.filter((Y)=>typeof Y==="string"&&Y.trim().length>0)}function nY(f){let Y=mY(f),J={added:!1,path:Y,total:0};return vz((z)=>{let Z=DX(z);if(Z.includes(Y))return J={added:!1,path:Y,total:Z.length},!1;z.savedRepos=[...Z,Y],J={added:!0,path:Y,total:Z.length+1};return}),J}function FH(){let f=Of(),Y=new Set,J=[],z=!1;for(let Z of f){let G=mY(Z);if(G!==Z)z=!0;if(Y.has(G)){z=!0;continue}Y.add(G),J.push(G)}if(!z)return;sJ({savedRepos:J})}function e9(f){let Y=f.repoConfigs;if(!Y||typeof Y!=="object"||Array.isArray(Y))return{};return Y}function fW(f){if(!f||typeof f!=="object")return{};let Y=f;return{initScript:typeof Y.initScript==="string"&&Y.initScript.length>0?Y.initScript:void 0,initPrompt:typeof Y.initPrompt==="string"&&Y.initPrompt.length>0?Y.initPrompt:void 0}}function OH(f){return fW(e9(c1())[mY(f)])}function kF(f,Y){let J=mY(f),z={};return vz((Z)=>{let G={...e9(Z)},Q=fW(G[J]),q=Y.initScript===void 0?Q.initScript:Y.initScript||void 0,H=Y.initPrompt===void 0?Q.initPrompt:Y.initPrompt||void 0;if(z={...q?{initScript:q}:{},...H?{initPrompt:H}:{}},!z.initScript&&!z.initPrompt){let{[J]:B,...V}=G;Z.repoConfigs=V}else G[J]=z,Z.repoConfigs=G;return}),z}function AH(f){let Y={removed:!1,path:f,total:0};return vz((J)=>{let z=DX(J);if(!z.includes(f))return Y={removed:!1,path:f,total:z.length},!1;if(J.savedRepos=z.filter((Z)=>Z!==f),zf(f)){let Z=LX(J);if(f in Z){let G={...Z};delete G[f],J.remoteRepos=G}}Y={removed:!0,path:f,total:z.length-1};return}),Y}function zf(f){return f.startsWith("ssh://")}function RH(){return c1()["experimental.remoteProjects"]===!0}function YW(f,Y,J){return J?`ssh://${Y}@${f}:${J}`:`ssh://${Y}@${f}`}function LX(f){let Y=f.remoteRepos;if(!Y||typeof Y!=="object"||Array.isArray(Y))return{};return Y}function dY(f){return LX(c1())[f]??null}function gH(){return LX(c1())}function CH(f){let Y=YW(f.host,f.user,f.port),J=!1;return vz((z)=>{let Z={...LX(z)};Z[Y]=f,z.remoteRepos=Z;let G=DX(z);if(J=!G.includes(Y),J)z.savedRepos=[...G,Y];return}),{key:Y,added:J}}var A1=N(()=>{i1();tJ()});var ZW={};H1(ZW,{runAddRemote:()=>IF,parseRemoteFlags:()=>zW});import{createInterface as yF}from"readline";function zW(f){let Y={};for(let J=0;J<f.length;J++){let z=f[J];switch(z){case"--host":Y.host=f[++J];break;case"--user":Y.user=f[++J];break;case"--path":Y.path=f[++J];break;case"--port":{let Z=Number(f[++J]);if(!Number.isInteger(Z)||Z<=0)ef(`invalid --port "${f[J]}"`);Y.port=Z;break}case"--key":{let Z=f[J+1];if(Z&&!Z.startsWith("-"))Y.key={present:!0,path:Z},J++;else Y.key={present:!0};break}case"--password":Y.password=!0;break;case"--help":case"-h":process.stdout.write(JW),process.exit(0);break;default:ef(`unknown flag "${z}"`)}}return Y}function ef(f){process.stderr.write(`kobe add --remote: ${f}
5
5
 
6
6
  ${JW}`),process.exit(2)}async function SF(f){let Y=yF({input:process.stdin,output:process.stdout,terminal:!0}),J=process.stdout,z=!1,Z=J._writeToOutput?.bind(J);return J._writeToOutput=(G)=>{if(!z||!Z)process.stdout.write(G)},process.stdout.write(f),z=!0,new Promise((G)=>{Y.question("",(Q)=>{if(z=!1,Z)J._writeToOutput=Z;process.stdout.write(`
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.7.43",
4
+ "version": "0.7.44",
5
5
  "description": "TUI orchestrator for Claude Code (codename)",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",
@@ -49,7 +49,8 @@
49
49
  "@opentui/core": "0.2.4",
50
50
  "@opentui/solid": "0.2.4",
51
51
  "ws": "^8.18.0",
52
- "solid-js": "1.9.13"
52
+ "solid-js": "1.9.13",
53
+ "node-pty": "^1.1.0"
53
54
  },
54
55
  "devDependencies": {
55
56
  "@biomejs/biome": "1.9.4",
@@ -59,7 +60,6 @@
59
60
  "@types/node": "25.6.2",
60
61
  "knip": "^6.14.2",
61
62
  "kobe-web": "workspace:*",
62
- "node-pty": "^1.1.0",
63
63
  "typescript": "5.8.2",
64
64
  "vitest": "2.1.9"
65
65
  },