@sma1lboy/kobe 0.8.83 → 0.8.84
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/skills/kobe/SKILL.md +7 -4
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -281,7 +281,7 @@ ${z}`,Z);this.line=J,this.column=X,this.codeblock=z}}});function cO($,Z){let J=$
|
|
|
281
281
|
`)){let U=H.trim();if(!U)continue;if(!UJ(U))continue;let K;try{K=JSON.parse(U)}catch{continue}if(!_P(K)||typeof K.type!=="string")continue;let F=typeof K.timestamp==="string"?K.timestamp:new Date().toISOString(),L=_P(K.data)?K.data:{};if(K.type==="session.start"){let M=typeof L.sessionId==="string"?L.sessionId:void 0;if(M)z=M;continue}if(K.type==="user.message"){let M=typeof L.content==="string"?L.content:"";if(!M)continue;if(!W)W=Buffer.from(M.slice(0,O90),"utf8").toString("utf8");J.push({role:"user",blocks:[{type:"text",text:M}],timestamp:F,sessionId:z});continue}if(K.type==="assistant.message"){let M=[],_=typeof L.content==="string"?L.content:"";if(_)M.push({type:"text",text:_});let R=Array.isArray(L.toolRequests)?L.toolRequests:[];for(let V of R){if(!_P(V))continue;let C=typeof V.id==="string"?V.id:typeof V.toolCallId==="string"?V.toolCallId:"tool",f=typeof V.name==="string"?V.name:typeof V.toolName==="string"?V.toolName:"tool";M.push({type:"tool_call",callId:C,name:f,input:V.arguments??{}})}if(M.length>0)J.push({role:"assistant",blocks:M,timestamp:F,sessionId:z});continue}if(K.type==="tool.execution_start"){let M=typeof L.toolCallId==="string"?L.toolCallId:void 0,_=typeof L.toolName==="string"?L.toolName:"tool";if(M)X.set(M,_);continue}if(K.type==="tool.execution_complete"){let M=typeof L.toolCallId==="string"?L.toolCallId:void 0;if(!M)continue;let _=X.get(M)??(typeof L.toolName==="string"?L.toolName:"tool"),R=L.result??(L.success===!1?{success:!1}:void 0);J.push({role:"assistant",blocks:[{type:"tool_result",callId:M,output:R,isError:L.success===!1}],timestamp:F,sessionId:z});continue}if(K.type==="session.shutdown")Y=Fb(L)}return{messages:J,toolNameById:X,sessionId:z,usageMetrics:Y,firstUserMessage:W}}function _P($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var ez,M90,O90=200;var _b=a(()=>{rz();JL();ez={copilotDir(){let $=process.env.COPILOT_HOME?.trim();if($)return $;return YQ.join(q90(),".copilot")},async readdir($){try{return await Y90($)}catch{return[]}},async readFile($){return await qH($)},stat:H90,async rm($){await W90($,{recursive:!0,force:!0})}};M90=MH({initial:N90,parseChunk:($,Z)=>F90($,Z)})});var qL,Vb,Cb;var UL=a(()=>{qL=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Vb=["\xB7","\u2722","\u2731","\u2736","\u273B","\u273D"],Cb=[...Vb,...[...Vb].reverse()]});import{readFile as Db,stat as j90}from"fs/promises";class BL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function Pb($){return S4($).createTurnDetector()}function Ab($,Z="claude",J=0){let X=null,z=0;for(let Y of $.split(`
|
|
282
282
|
`)){z++;let W=Tb(Y);if(!W)continue;let H=PP(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=Sb(W,J),K={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||K.timestampMs>=X.timestampMs)X=K}return X}function A90($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=PP($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&C90.has(Z.type)}function D90($,Z="codex"){let J=null,X=0;for(let z of $.split(`
|
|
283
283
|
`)){X++;let Y=Tb(z);if(!Y||!A90(Y))continue;let W=Sb(Y,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function Tb($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return PP(J)?J:null}catch{return null}}function Sb($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function PP($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var Rb=($)=>j90($).then((Z)=>Z.mtimeMs,()=>0),_90,AP,V90,DP,FK,C90;var RP=a(()=>{XP();YL();k7();_90={listSessionFiles:($)=>FH($),readFile:($)=>Db($,"utf8"),statMtimeMs:Rb};AP=class AP extends BL{deps;vendor="claude";cache=new Map;constructor($=_90){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let Y of Z.slice(0,4)){let W=this.cache.get(Y.path),H;if(W&&Y.mtimeMs>0&&W.mtimeMs===Y.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(Y.path).catch(()=>"");H=Ab(U,Y.path,Y.mtimeMs)}if(z.set(Y.path,{mtimeMs:Y.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??Rb)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:Ab(J,$,Z),mtimeMs:Z}}};V90={findLatestRollout:($)=>LP($),readFile:($)=>Db($,"utf8")};DP=class DP extends BL{deps;vendor="codex";cache=null;constructor($=V90){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=D90(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};FK=class FK extends BL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};C90=new Set(["task_complete","turn_complete","turn_aborted"])});function S90($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:TP,detectAccount:async()=>({binary:{found:!1,error:"custom engine: kobe has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new OK($),createTurnDetector:()=>new FK($)}}function S4($){return f7($)?SP[$]:S90($)}function Ib($){return S4($).history!==TP}function IP($){let Z=S4($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:Eb}function LH($,Z){let J=Z?IP(Z):Eb;for(let X of[...J].sort((z,Y)=>Y.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function KL($,Z){let J=S4($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((Y)=>z.startsWith(Y))?"working":"rest"}function wb(){return Object.values(SP).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var TP,P90,R90,T90,SP,Eb;var k7=a(()=>{g7();BJ();Py();XP();hy();ny();ay();YL();Bb();Mb();_b();EP();UL();RP();TP={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},P90={async listSessionIdsForWorktree($){return[...await FH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>fy($),async transcriptPath($,Z){return(await FH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>xy($)},R90={listSessionIdsForWorktree:($)=>Yb($),readHistory:($)=>Hb($),transcriptPath:async($)=>await OP($)??null,latestTranscriptMtimeForWorktree:($)=>Wb($)},T90={listSessionIdsForWorktree:($)=>Ob($),readHistory:($)=>jb($),transcriptPath:async()=>null,latestTranscriptMtimeForWorktree:($)=>Lb($)},SP={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:P90,detectAccount:($)=>UH($),createHookAdapter:()=>new GP,createTurnDetector:()=>new AP,capabilities:Ay,identity:Dy,spinnerFrames:Cb,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>py()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:R90,detectAccount:($)=>BH($),createHookAdapter:()=>new jP,createTurnDetector:()=>new DP,capabilities:iy,identity:oy,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]},quotaUsage:()=>Nb()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:T90,detectAccount:($)=>KH($),createHookAdapter:()=>new OK("copilot"),createTurnDetector:()=>new FK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],history:TP,detectAccount:($)=>$L($),createHookAdapter:()=>new OK("kimi"),createTurnDetector:()=>new FK("kimi")}};Eb=[...new Set(Object.values(SP).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function wP($){return S4($).createHookAdapter()}class OK{vendor;constructor($){this.vendor=$}supportsHooks(){return!1}globalSettingsPath(){return""}activityDetailFromPayload(){return}sessionFromPayload(){return}async installActivityHooks(){}async removeActivityHooks(){}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async installWorktreeWatchHook(){}async removeWorktreeWatchHook(){}}var EP=a(()=>{k7()});function NL($){return I90.includes($)}function xb($){return E90.includes($)}var I90,E90;var xP=a(()=>{I90=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end","tool-pre","tool-post","tool-failed","pre-compact","post-compact","subagent-start","subagent-stop"];E90=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var db={};x4(db,{runHookSubcommand:()=>v90,readTextWithTimeout:()=>yb,parseWorktreeRemovePath:()=>mb,parseWorktreeAddPath:()=>kb,ensureGlobalKobeHooks:()=>yP});import{readFileSync as w90}from"fs";import{homedir as x90}from"os";import{join as gP,resolve as fP}from"path";async function yb($,Z=f90){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function bb(){try{let $=await yb(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function fb($,Z){for(let J=0;J<$.length;J++){if($[J]===Z)return $[J+1];if($[J].startsWith(`${Z}=`))return $[J].slice(Z.length+1)}return}function y90($){return!!$&&typeof $==="object"&&!Array.isArray($)}function vb($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function kb($){let Z=vb($),J=new Set(["-b","-B","--reason"]);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="add")continue;let z=X+2;while(z<Z.length){let Y=Z[z];if(Y==="&&"||Y==="||"||Y===";"||Y==="|"||Y===">"||Y===">>")break;if(Y.startsWith("-")){z+=J.has(Y)?2:1;continue}return Y}}return}function mb($){let Z=vb($);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="remove")continue;let X=J+2;while(X<Z.length){let z=Z[X];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){X+=1;continue}return z}}return}async function b90(){let $=await bb(),Z=y90($.tool_input)?$.tool_input:{},J=typeof Z.command==="string"?Z.command:"";if(!J.includes("worktree"))return;let X=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=kb(J),Y=z?void 0:mb(J);if(!z&&!Y)return;let W=await oX();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:fP(X,z)});else if(Y)await W.request("worktree.archiveRemoved",{worktreePath:fP(X,Y)})}finally{W.close()}}async function v90($){let[Z,...J]=$;if(Z==="setup"){await u90(J);return}if(Z===g90){try{await b90()}catch{}return}try{if(!Z||!NL(Z))return;let X=await bb(),z=fb(J,"--task-id"),Y=typeof X.cwd==="string"&&X.cwd?X.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=fb(J,"--engine"),K=hb().filter((_)=>!U||_.vendor===U),F;for(let _ of K)if(F=_.activityDetailFromPayload(Z,X),F)break;let L;for(let _ of K)if(L=_.sessionFromPayload(X),L)break;let M=await oX();if(!M)return;try{let _=z??W;await M.request("engine.reportEvent",{..._?{taskId:_}:{cwd:Y},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...F?{detail:F}:{},...L?{sessionId:L.sessionId}:{},...L?.transcriptPath?{transcriptPath:L.transcriptPath}:{}})}finally{M.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[kobe hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function k90(){return C8.map(($)=>wP($)).filter(($)=>$.supportsWorktreeSync())}function hb(){return C8.map(($)=>wP($)).filter(($)=>$.supportsHooks())}function ub(){return gP(x90(),".claude","settings.json")}function m90($){if(!$||$==="off")return;if($==="global")return ub();if($.startsWith("repo:"))return gP(fP($.slice(5)),".claude","settings.json");return $}async function yP(){try{let $=h90();for(let Z of hb()){let J=Z.globalSettingsPath();if(!J)continue;await Z.installActivityHooks(J,{toolEvents:$}),await Z.installWorktreeWatchHook(J)}await cb()}catch{}}function h90(){try{for(let $ of M5().plugins){if(!$.enabled)continue;try{let Z=w90(gP($.root,C2),"utf8");if(n2(Z).manifest.events.some((J)=>J.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function cb(){let $=k90();if($.length===0)return;let Z=v7(gb),J=new Set([ub()]),X=m90(Z);if(X)J.add(X);for(let z of $)for(let Y of J)await z.removeWorktreeSyncHook(Y);if(Z!=="off")m3(gb,"off")}async function u90($){await cb(),process.stdout.write(["kobe 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 kobe previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo kobe already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `kobe adopt`.",""].join(`
|
|
284
|
-
`))}var f90=500,g90="worktree-created",gb="externalWorktreeSync";var bP=a(()=>{L2();ZQ();qJ();EP();xP();v$();g7()});var ML;var lb=a(()=>{ML={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.8.
|
|
284
|
+
`))}var f90=500,g90="worktree-created",gb="externalWorktreeSync";var bP=a(()=>{L2();ZQ();qJ();EP();xP();v$();g7()});var ML;var lb=a(()=>{ML={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.8.84",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/skills","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:"KOBE_DEV=1 bun --conditions=browser ./src/cli/index.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.12","@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 nb={};x4(nb,{repoSlug:()=>$G,releasePageUrl:()=>cP,recommendedGlobalInstallCommand:()=>mP,isNewerSemver:()=>vP,fetchReleaseSummaries:()=>jK,fetchReleaseNotesRange:()=>uP,fetchReleaseNotes:()=>hP,compareSemver:()=>z3,checkLatestVersion:()=>ZG,breakingVersionsCrossed:()=>LK,UPDATE_SCRIPT_URL:()=>FL,UPDATE_COMMAND:()=>o9,PACKAGE_NAME:()=>kP,CURRENT_VERSION:()=>V4,BREAKING_VERSIONS:()=>NJ});function $G(){let $=ML.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function mP(){return`npm install -g ${kP}@latest`}function LK($,Z,J=NJ){let[X,z]=z3($,Z)<=0?[$,Z]:[Z,$];return J.filter((Y)=>z3(Y,X)>0&&z3(Y,z)<=0)}async function d90($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),OL);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 Y=await z.json();if(typeof Y.version!=="string")return null;return Y.version}catch{return null}finally{clearTimeout(J)}}function vP($,Z){return z3($,Z)>0}function z3($,Z){let J=(Y)=>Y.split("-")[0]??Y,X=J($).split(".").map((Y)=>Number.parseInt(Y,10)),z=J(Z).split(".").map((Y)=>Number.parseInt(Y,10));for(let Y=0;Y<3;Y++){let W=X[Y]??0,H=z[Y]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function ZG($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:V4,latest:Z,hasUpdate:vP(Z,V4)};if(lW()&&!$.force)return null;let J=await d90(kP);if(!J)return null;return{current:V4,latest:J,hasUpdate:vP(J,V4)}}function pb($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function hP($){let Z=$G();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),OL);try{let Y=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(!Y.ok)return null;let W=await Y.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 uP($){let Z=$G();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),OL);try{let Y=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(!Y.ok)return[];let W=await Y.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=pb(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(z3(U,$.current)<=0)return null;if(z3(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 jK($=12){let Z=$G();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),OL);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 Y=await z.json();if(!Array.isArray(Y))return[];return Y.map((W)=>{let H=pb(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 cP($){let Z=$G();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var V4,kP,FL="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",o9,NJ,OL=3000;var R8=a(()=>{lb();R5();V4=ML.version,kP=ML.name;o9=`curl -fsSL ${FL} | sh`;NJ=[]});var ob={};x4(ob,{stampResetGate:()=>LL,resetGateBlockers:()=>ib,enforceResetGate:()=>lP,LAST_RUN_VERSION_KEY:()=>dP});function ib($,Z=V4,J=NJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=z3($,Z)<=0?[$,Z]:[Z,$];return J.filter((Y)=>z3(Y,X)>0&&z3(Y,z)<=0)}function lP(){let $=j$()[dP],Z=ib($);if(Z.length>0){let J=typeof $==="string"?$:"unknown";console.error([`kobe ${V4}: cannot start \u2014 version ${Z.join(", ")} introduced breaking changes`,`(last run: ${J}). Your daemon/session state may be incompatible.`,"","Run:"," kobe reset # stop daemon + PTY host + sessions (tasks kept)"," kobe reset --hard # additionally wipe the task index + UI state","","Then relaunch kobe. Worktrees are never touched."].join(`
|
|
285
285
|
`)),process.exit(1)}if($!==V4)LL()}function LL(){try{d2({[dP]:V4})}catch{}}var dP="app.lastRunVersion";var jL=a(()=>{j2();R8()});import{existsSync as rb,readFileSync as l90}from"fs";import{homedir as p90}from"os";import{join as sb,resolve as ab}from"path";import{fileURLToPath as n90}from"url";function _L(){let $=n90(import.meta.url);return[ab($,"../../../../../.agents/skills/kobe"),ab($,"../../skills/kobe")].find((J)=>rb(sb(J,"SKILL.md")))??null}function VL($={}){let Z=$.source!==void 0?$.source:_L(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??o90,"--skill","kobe",...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function JG($={}){return`npx ${VL($).join(" ")}`}async function iP($,Z){return await Bun.spawn(["npx",...VL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function CL($={}){let Z=$.home??p90(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>i90.map((z)=>sb(X,z)))}function a90($){let Z=$.match(/kobe-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function _K($){let Z=CL($).find((z)=>rb(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:pP,stale:!1};let J=null;try{J=a90(l90(Z,"utf8"))}catch{J=null}let X=J===null||J<pP;return{installed:!0,installedVersion:J,currentVersion:pP,stale:X}}function r90(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function tb($={}){let Z=_K();if(!Z.installed){if(v7(nP)==="1")return;m3(nP,"1"),process.stderr.write(`
|
|
286
286
|
kobe: the kobe agent skill isn't installed \u2014 install it so your coding agent can drive kobe via \`kobe api\`:
|
|
287
287
|
${jH}
|
|
@@ -295,7 +295,7 @@ kobe: your kobe agent skill is out of date (${X}; this kobe wants v${Z.currentVe
|
|
|
295
295
|
kobe: a new version of the kobe agent skill is available (${X} \u2192 v${Z.currentVersion}).
|
|
296
296
|
Update now? [y]es / [n]o / [d]on't notify for this version: `);let Y=(await($.ask??r90)()).trim().toLowerCase();if(Y==="y"||Y==="yes"){let W=await($.install??iP)();if(W===0)process.stderr.write(`kobe: skill updated.
|
|
297
297
|
`);else process.stderr.write(`kobe: skill update failed (exit ${W}) \u2014 run \`${jH}\` manually.
|
|
298
|
-
`)}else if(Y.startsWith("d"))m3(J,"1")}var pP=
|
|
298
|
+
`)}else if(Y.startsWith("d"))m3(J,"1")}var pP=20,i90,jH="kobe skill install",o90="Sma1lboy/kobe",nP="skillHintSeen";var VK=a(()=>{v$();i90=[".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var AL=()=>{};var q1=kz((s90,DL)=>{(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=P0&&J0[P0]||J0["@@iterator"],typeof J0==="function"?J0:null}function J(J0,S0){J0=(J0=J0.constructor)&&(J0.displayName||J0.name)||"ReactClass";var e0=J0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,J0),u0[e0]=!0)}function X(J0,S0,e0){this.props=J0,this.context=S0,this.refs=G1,this.updater=e0||L0}function z(){}function Y(J0,S0,e0){this.props=J0,this.context=S0,this.refs=G1,this.updater=e0||L0}function W(){}function H(J0){return""+J0}function U(J0){try{H(J0);var S0=!1}catch(l1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&J0[Symbol.toStringTag]||J0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(J0)}}function K(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 l:return"Fragment";case n:return"Profiler";case d:return"StrictMode";case Q0:return"Suspense";case C0:return"SuspenseList";case k0: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 v:return"Portal";case t:return J0.displayName||"Context";case Z0:return(J0._context.displayName||"Context")+".Consumer";case r:var S0=J0.render;return J0=J0.displayName,J0||(J0=S0.displayName||S0.name||"",J0=J0!==""?"ForwardRef("+J0+")":"ForwardRef"),J0;case z0:return S0=J0.displayName||null,S0!==null?S0:K(J0.type)||"Memo";case x0:S0=J0._payload,J0=J0._init;try{return K(J0(S0))}catch(e0){}}return null}function F(J0){if(J0===l)return"<>";if(typeof J0==="object"&&J0!==null&&J0.$$typeof===x0)return"<...>";try{var S0=K(J0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function L(){var J0=J1.A;return J0===null?null:J0.getOwner()}function M(){return Error("react-stack-top-frame")}function _(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 R(J0,S0){function e0(){H4||(H4=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty(J0,"key",{get:e0,configurable:!0})}function V(){var J0=K(this.type);return d5[J0]||(d5[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 C(J0,S0,e0,U1,l1,I4){var _4=e0.ref;return J0={$$typeof:H0,type:J0,key:S0,props:e0,_owner:U1},(_4!==void 0?_4:null)!==null?Object.defineProperty(J0,"ref",{enumerable:!1,get:V}):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:l1}),Object.defineProperty(J0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:I4}),Object.freeze&&(Object.freeze(J0.props),Object.freeze(J0)),J0}function f(J0,S0){return S0=C(J0.type,S0,J0.props,J0._owner,J0._debugStack,J0._debugTask),J0._store&&(S0._store.validated=J0._store.validated),S0}function T(J0){I(J0)?J0._store&&(J0._store.validated=1):typeof J0==="object"&&J0!==null&&J0.$$typeof===x0&&(J0._payload.status==="fulfilled"?I(J0._payload.value)&&J0._payload.value._store&&(J0._payload.value._store.validated=1):J0._store&&(J0._store.validated=1))}function I(J0){return typeof J0==="object"&&J0!==null&&J0.$$typeof===H0}function S(J0){var S0={"=":"=0",":":"=2"};return"$"+J0.replace(/[=:]/g,function(e0){return S0[e0]})}function x(J0,S0){return typeof J0==="object"&&J0!==null&&J0.key!=null?(U(J0.key),S(""+J0.key)):S0.toString(36)}function b(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 k(J0,S0,e0,U1,l1){var I4=typeof J0;if(I4==="undefined"||I4==="boolean")J0=null;var _4=!1;if(J0===null)_4=!0;else switch(I4){case"bigint":case"string":case"number":_4=!0;break;case"object":switch(J0.$$typeof){case H0:case v:_4=!0;break;case x0:return _4=J0._init,k(_4(J0._payload),S0,e0,U1,l1)}}if(_4){_4=J0,l1=l1(_4);var U$=U1===""?"."+x(_4,0):U1;return F0(l1)?(e0="",U$!=null&&(e0=U$.replace(iJ,"$&/")+"/"),k(l1,S0,e0,"",function(j7){return j7})):l1!=null&&(I(l1)&&(l1.key!=null&&(_4&&_4.key===l1.key||U(l1.key)),e0=f(l1,e0+(l1.key==null||_4&&_4.key===l1.key?"":(""+l1.key).replace(iJ,"$&/")+"/")+U$),U1!==""&&_4!=null&&I(_4)&&_4.key==null&&_4._store&&!_4._store.validated&&(e0._store.validated=2),l1=e0),S0.push(l1)),1}if(_4=0,U$=U1===""?".":U1+":",F0(J0))for(var f4=0;f4<J0.length;f4++)U1=J0[f4],I4=U$+x(U1,f4),_4+=k(U1,S0,e0,I4,l1);else if(f4=Z(J0),typeof f4==="function")for(f4===J0.entries&&(y8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),y8=!0),J0=f4.call(J0),f4=0;!(U1=J0.next()).done;)U1=U1.value,I4=U$+x(U1,f4++),_4+=k(U1,S0,e0,I4,l1);else if(I4==="object"){if(typeof J0.then==="function")return k(b(J0),S0,e0,U1,l1);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 _4}function u(J0,S0,e0){if(J0==null)return J0;var U1=[],l1=0;return k(J0,U1,"","",function(I4){return S0.call(e0,I4,l1++)}),U1}function o(J0){if(J0._status===-1){var S0=J0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=J0._result;var e0=S0();if(e0.then(function(l1){if(J0._status===0||J0._status===-1){J0._status=1,J0._result=l1;var I4=J0._ioInfo;I4!=null&&(I4.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=l1)}},function(l1){if(J0._status===0||J0._status===-1){J0._status=2,J0._result=l1;var I4=J0._ioInfo;I4!=null&&(I4.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=l1)}}),S0=J0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}J0._status===-1&&(J0._status=0,J0._result=e0)}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
|
|
299
299
|
|
|
300
300
|
Your code should look like:
|
|
301
301
|
const MyComponent = lazy(() => import('./MyComponent'))
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kobe
|
|
3
|
-
description: Use when controlling kobe tasks, parallel coding attempts, hosted agent sessions, task lifecycle, or the daemon-owned issue tracker from a shell.
|
|
3
|
+
description: Use when controlling kobe 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 — `kobe api send`, never a peer/MCP side channel.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- kobe-skill-version:
|
|
6
|
+
<!-- kobe-skill-version: 20 — bump in lockstep with KOBE_SKILL_VERSION (src/lib/skill-install.ts). -->
|
|
7
7
|
|
|
8
8
|
# kobe shell control
|
|
9
9
|
|
|
@@ -36,8 +36,11 @@ lifecycle tracking, and an explicit outcome contract.
|
|
|
36
36
|
If that tab died it falls back to the dispatcher task's live canonical
|
|
37
37
|
engine tab; nothing alive fails loud (`DISPATCHER_UNREACHABLE`) — it
|
|
38
38
|
never spawns a new engine, so a failed reply is visible, not fake-ok.
|
|
39
|
-
- Messaging another
|
|
40
|
-
through the user, a side file, or a generic peer channel
|
|
39
|
+
- Messaging another agent session on this machine → `send`, and ONLY `send`
|
|
40
|
+
— never relay through the user, a side file, or a generic peer channel
|
|
41
|
+
(an MCP server offering to message "other instances" is exactly that
|
|
42
|
+
channel: it reaches a process, not a task, so nothing it delivers is
|
|
43
|
+
attributable, watchable, or replyable). Sent from
|
|
41
44
|
inside a kobe task, the prompt arrives prefixed `[KOBE PEER] from
|
|
42
45
|
"<title>" (task <id> — load the kobe agent skill FIRST …)`, so the
|
|
43
46
|
receiver knows who is talking, that this skill is required reading, and
|
package/package.json
CHANGED