CodeIsland changelog

CodeIsland changelog

Back to CodeIsland

25 releases since April 2026 · GitHub releases, checked Oct 26, 2026

  1. 1.0.40Latest

    English

    Important

    • Only you approve a request. When an agent's activity suggested that a pending approval had been answered in the terminal, CodeIsland answered it "allow", on any tool step in the same session from any agent. Claude Code's and Codex's approvals carry no id and subagents share their parent's session, so a subagent reading a file could approve the parent's pending command. A request CodeIsland drops on its own is now answered with no decision, so the agent asks in its own prompt, and it counts as stale only on a step from the same agent with the same tool and input. A session ending, a hook going away or a replaced request no longer answers "deny" for you either, and requests are matched to their own card, so another host can't answer a local one by its id. A request too large for the island to read (over 10 MB) is left to its agent as well, instead of being denied
    • iPhone Buddy can't answer requests for now. The Mac accepted every iPhone Buddy that found it without checking which device it was, so any nearby device running the app could approve, deny or answer a pending request. Until Buddy can pair with the Mac it still shows your sessions but can't answer for you; Settings → iPhone Buddy says so
    • A second CodeIsland quits instead of taking over. Launching another copy while one was running took the hook socket away from the first. The second copy now quits; to run a development build alongside, give it its own CODEISLAND_SOCKET_PATH (scripts/dev-hot-restart.sh --socket-path …). That script now stops only the build it started, never the installed app

    Security

    • Hide never answers a request for you. In some cases Hide approved a hidden child's request automatically. Now a Codex or Cursor child's request shows on a card of its own (or goes back to Codex's auto-review), and a plugin-proxied request goes back undecided so the agent asks you itself. A request that's waiting is also never denied because its card was folded or hidden by a background pass
    • Remote sessions can't act on this Mac. A remote session's process id is never watched or signalled here, its transcript path is never read from this Mac's disk, Smart Suppress never inspects this Mac's terminals for it, and links in its replies open only on the web. "Always allow" on a remote Codex request now holds for that session instead of writing a rule into this Mac's ~/.codex, and a remote Codex request is never handed to auto-review because of this Mac's Codex settings. A hook could also name any program as its Herdr binary, and CodeIsland ran it while checking whether the Herdr pane was in front: it now only runs a program called herdr, and never for a remote session. Rules an earlier version saved for a remote request stay in ~/.codex/rules/codeisland.rules until you remove them
    • Hooks only talk to a socket you own. /tmp/codeisland-<uid>.sock is a predictable path, and on a Mac shared by several accounts another user could create it first: CodeIsland then failed to listen without saying so, and every hook (the bridge, the pi, Oh My Pi, OpenCode and OpenClaw plugins, the remote hook) sent its events, prompts and commands there, where an answer could approve a tool and rewrite its input. Every client now checks that the socket belongs to its own user before sending anything, and the bridge also checks who is listening; if the path is held by someone else, Settings → Hooks says by whom, with a Try Again button. The bridge's debug log, which holds every hook's raw input, is now readable only by you and is never written through a link
    • Your session file and hook scripts are yours alone. ~/.codeisland was readable by the other accounts on the Mac, and its sessions.json holds every session's last prompt and reply. The folder is now private to you (files 0600, scripts 0700), and existing installs are tightened at launch
    • The bridge log records what each hook was, not what it said. Since June it wrote every hook's full input (prompts, commands, file contents) to /tmp/codeisland-bridge.log, without a size limit. It now writes one line per hook (event, source, session, tool and field names, no values), keeps about 5 MB, and logs whole payloads only with CODEISLAND_DEBUG=1
    • Diagnostics exports leave out secrets and conversations. The export copied each CLI's settings verbatim, API tokens in env included, and the whole sessions file. Settings are now redacted (env values, keys, tokens, passwords, auth headers, well-known key formats), and sessions keep their structure with prompts cut to 80 characters and no replies, as the export's description says
    • Links in replies open only on the web. In every session, a link in an agent's reply opens only if it is http, https or mailto; a file: or app link, which an agent could write to run something when clicked, does nothing
    • OpenCode's terminal title can't carry escape codes. The plugin wrote the session title to the terminal with only newlines removed, so a title holding control characters could send other terminal sequences (such as a clipboard write). They are now removed (plugin v11)
    • Host settings can't turn into commands. Every ssh call now ends its options before the host, so a host or user field starting with - (such as -oProxyCommand=…) can't become an ssh option, and the values CodeIsland puts into commands on the host are shell-quoted. A host with an empty id no longer connects

    Remote hosts

    • Remote hosts no longer lose events. The remote hook sent its event and closed the connection at once, and macOS's network listener silently drops a connection whose client has already closed before it is set up, so remote sessions lost events (5 to 23 of 80 in a test run even with an idle island, nearly all of them while the island was busy), and a lost Stop or SessionEnd left a card behind. The island now accepts hook connections with a plain socket on a background queue, where the kernel keeps every request until it is read, however early its hook closed. Remote tool steps still leave right after sending, so a tool call on a remote host doesn't wait for a round trip; lifecycle events wait briefly for the island's answer so an older CodeIsland doesn't lose them either
    • One reading of every hook, local or remote. The bridge's understanding of hooks (which agent sent it, Cursor's imported Claude hooks, Cline, Hermes, Gemini answers and more) moved into a single component the island also runs on events from remote hosts, so a fix lands for both at once. The remote hook now sends facts about its environment instead of interpreting events itself; it is updated on the next connect. docs/hook-edge-protocol.md describes the protocol for other clients such as the community Windows bridge
    • Each remote host talks to the island over a socket of its own. Remote hooks reached the same socket as local ones and said themselves which host they came from, so anything on a remote host that could reach the forwarded socket could leave the host out and be taken for a local session, or claim to be another host. Each connected host now gets its own socket in a private folder, the island stamps every request arriving there with that host whatever it claims, and the Mac's own socket refuses requests that claim to come from a remote host. The SSH tunnel starts only after the host's socket is listening, so it never leads to a socket someone else holds. On the remote host, the forwarded socket is now set to the SSH user alone; a new per-host option, Agents Run as Other Users, opens it to the other accounts there for agents that run in containers or under sudo
    • A remote host can't wear the island down. Each host now has limits (1 MB per request, 300 s to finish sending one, 64 open connections, 32 requests waiting for an answer), so one host can't use up the island's memory or connections and starve local agents' approvals
    • The island's socket on a remote host sits in a private folder. The forwarded socket is now /tmp/codeisland-<uid>/island.sock, in a folder only the SSH user can enter, checked before the tunnel starts and again once it is up; if a check fails, the host says why instead of connecting. On the Mac, each host's socket moved into your private temporary folder, which no other account can create first. The remote hook also asks the kernel who is listening before it sends anything. An agent started before the update still runs the old hook command, which now tries that folder first, so a tunnel an older version left running can't swallow its events. On an SSH host, Hermes asks once more to approve CodeIsland's hooks, because their command changed (see Hermes in the README)
    • Remote tool steps that arrive out of order keep the running tool. A long tool result from a remote host can arrive after the next tool has started; the card no longer marks the newer tool finished because of it

    Fixes

    • A grep that Claude Code runs is no longer mistaken for its session. Claude Code's own binary is also the grep, find and rg that its shell and Grep tool run, and its background helpers. Session discovery could bind a card to one of those processes, so the card disappeared when the grep finished, and an orphaned grep could be sent SIGTERM and its card removed. Cards now follow only Claude Code's CLI, and CodeIsland never signals one of its helpers
    • Claude Code sessions sharing a folder keep their own process. With several sessions open in one folder (several terminals in your home folder, say), discovery gave the newest transcript to whichever process it found first: a card could follow another session's process and disappear when that terminal closed, and the other session got no card until its next hook. CodeIsland now pairs each process with the session Claude Code itself records for it; with older Claude Code it works as before
    • An interrupted turn no longer rings "done". Stopping a turn yourself (Esc in Claude Code, a stopped Hermes turn, a cancelled Cline task) played the task-complete chime as if it had finished. It now ends quietly; each agent's card behaves as before
    • A subagent's failure no longer hides its parent's completion push. A subagent that ended on an error pushed that error under its parent's card, and the push dedupe then dropped the parent's own "done" moments later, so the phone heard "error" for a turn that finished fine. Only a session's own failure pushes now
    • Smart Suppress covers queued completion cards too. A completion card that waited behind another one appeared even when its session's terminal tab was the one in front. The tab check now runs whenever a card actually appears, right away or out of the queue
    • Follow-up reminders from several sessions all ring. Reminders shared the failed-turn sound's debounce, so a second session's reminder right after another's stayed silent
    • A Cursor Task folded into its chat stays quiet. With Agent Sub-Sessions on Merge into main or Hide, a Task whose own Stop folds its card away no longer rings, pushes or opens a completion card for a card that no longer exists
    • An aborted AiWork stream isn't chased as finished. It no longer gets a "still waiting · finished" reminder and push
    • A turn that ends without a card hands the island on. A Hermes gateway chat, or a Stop with On completion set to Glance dot or Do nothing, kept the island's active spot instead of passing it to another working session
    • Agent Sub-Sessions treats every kind of child the same way. Codex subagent threads, Cursor Tasks, plugin-proxied sessions (such as omo in OpenCode) and children that name their parent (pi, Oh My Pi) now go through one set of rules. With Show separately, a Codex thread or Cursor Task whose parent is known keeps its own card but stays quiet (no chime, completion card or push), as pi children already did; its approvals and questions still alert you. A child stays where it started: switching the setting mid-run, or Cursor's process becoming ambiguous, no longer moves it between cards
    • Codex subagent fixes. With Merge into main, a folded thread's follow-up turns show up again (they were dropped), and a thread's Stop no longer ends its parent's turn early. A rollout that says a thread is a root beats a same-process guess, Desktop threads only fold into Desktop cards, and Desktop grandchildren fold into the right card
    • Codex "Always" says exactly what it saves. The rule came from a prefix_rule anywhere in the request, including text the model wrote, and the card never showed it, so a request to run ls -la could save a rule allowing every bash command. The rule now comes from the command itself (its first three words), and the link names it: "Always allow commands starting with git push --force — saved to ~/.codex/rules". A request no rule can describe is allowed for the session instead
    • Codex's state database is read while Codex has it closed. Codex deletes the database's WAL files whenever its last connection closes (an idle Codex Desktop, for one), and every read CodeIsland made then failed, so Desktop threads, subagent links, finding a thread's transcript and the end-of-turn check came up empty. CodeIsland now reads the closed database as a snapshot, and never creates or changes anything in ~/.codex
    • pi is recognized by its own program only. pi and Oh My Pi were matched by the start of a program's name, so pinentry (which gpg starts to sign a commit), pigz or pico in a pi session's folder could be taken for pi: the card followed it and went when it exited, and once orphaned it could be sent SIGTERM. Now only pi, omp or pi's npm package counts
    • An approval waits as long as its agent does. A held approval or question was cancelled after 5 minutes although the agent waits up to a day, so an approval left while you stepped away could no longer be answered. It now stays answerable until its agent gives up. When one waiting hook is killed, only its own request goes away: the other requests of the same session used to be denied with it
    • A launch leaves hook configs that are already current alone. Every launch rewrote about 15 of your CLI configs (Codex, Cursor, Gemini, Qwen, Factory, Trae and others) with nothing changed but their key order, so dotfiles under git showed a diff after each launch. A config is now written only when its hooks need to change
    • Smaller fixes. A malformed _ppid in a hook can no longer crash CodeIsland; remote card keys no longer get the host prefix twice; a SessionStart no longer unlinks a child from its parent; guesses by process id never match a card on another host; subagent rows created by a request take the hook's agent type

    Performance

    • Less work on the main thread. Session titles, model names, Cursor's YOLO badge and the end-of-turn check for desktop apps are read in the background now, and session discovery runs entirely off the main thread. A title that came from a hook or from Codex's app-server is no longer cleared by a session store that has none, so a Codex subagent card split out of its parent keeps its agent's name. A pending approval or question no longer makes every hook re-split the card's text for an ESP32 Buddy that isn't connected (137 ms a hook behind a 1 MB prompt), and sessions.json keeps the first 64 K characters of each prompt and reply instead of re-encoding a whole pasted log on every save
    • Silent tool steps no longer ask the window server whether the screen is locked. With sounds on, every tool hook read the lock state on the main thread before checking whether that event plays a sound at all

    中文

    重要

    • 只有你能批准请求。 以前 agent 的活动一旦显示某个挂起的审批「已经在终端里回答过」,CodeIsland 就会替它回答「允许」,而且同一会话里任何 agent 的任何工具步骤都算数。Claude Code 和 Codex 的审批请求不带 id,子代理又和父会话共用会话,于是一个子代理读一下文件,就可能批准父会话正在等待的命令。现在 CodeIsland 自行撤掉的请求一律回复「不做决定」,由 agent 在自己的提示里询问你;而且只有同一个 agent 的、工具和输入都一致的步骤,才会让请求被视为过期。会话结束、hook 退出、请求被取代时,也不会再替你回答「拒绝」;请求只和它自己的卡片匹配,其他主机无法凭 id 回答本机的请求。灵动岛读不完的超大请求(超过 10 MB)现在也交给 agent 自己处理,不再直接拒绝
    • iPhone Buddy 暂时不能替你回答请求。 Mac 以前会接受任何找到它的 iPhone Buddy,并不核对是哪台设备,于是附近任何运行这个 App 的设备都能批准、拒绝或回答挂起的请求。在 Buddy 能与 Mac 配对之前,它仍会显示你的会话,但不能替你作答;「设置 → iPhone Buddy」里有说明
    • 第二个 CodeIsland 会直接退出,不再抢占。 以前在一个实例运行时再启动一份,会把 hook socket 从第一个手里抢走。现在第二份会直接退出;如果要同时运行开发版,请给它单独的 CODEISLAND_SOCKET_PATH(scripts/dev-hot-restart.sh --socket-path …)。这个脚本现在只会停掉它自己启动的构建,不会再停掉已安装的 App

    安全

    • 「隐藏」不再替你回答请求。 以前「隐藏」在某些情况下会自动批准被隐藏的子会话的请求。现在 Codex 或 Cursor 子会话的请求会显示在它自己的卡片上(或交回 Codex 的自动审查),插件代理的请求原样交回、不作决定,由 agent 自己来问你。正在等待的请求也不会因为卡片被后台流程折叠或隐藏而被拒绝
    • 远程会话不能再在本机上执行操作。 远程会话的进程号不会在本机被监控或发送信号,它的 transcript 路径不会从本机磁盘读取,智能抑制不会为它检查本机终端,它回复里的链接只会在浏览器中打开。对远程 Codex 请求点「总是允许」,现在只在该会话内有效,不再往本机的 ~/.codex 写规则;远程 Codex 请求也不会因为本机的 Codex 设置而交给自动审查。另外,hook 可以把任意程序声明为 Herdr 可执行文件,CodeIsland 在检查 Herdr 面板是否在前台时会运行它;现在只运行名为 herdr 的程序,远程会话则一律不运行。旧版本为远程请求保存的规则仍留在 ~/.codex/rules/codeisland.rules 里,不需要的话请自行删除
    • hook 只会连到属于你自己的 socket。 /tmp/codeisland-<uid>.sock 是可预测的路径,在多个账户共用的 Mac 上,别的用户可以抢先创建它:CodeIsland 会无声地监听失败,而所有 hook(bridge,pi、Oh My Pi、OpenCode、OpenClaw 插件,远程 hook)都会把事件、提示词和命令发到那里,对方的答复还能批准工具调用、改写工具输入。现在每个客户端在发送任何内容之前,都会确认 socket 属于自己的用户,bridge 还会核对正在监听的是谁;路径被别人占用时,「设置 → Hooks」会说明被谁占用,并提供「重试」按钮。bridge 的调试日志记录着每个 hook 的原始输入,现在只有你自己能读,也不会再通过链接写入
    • 会话文件和 hook 脚本只属于你自己。 ~/.codeisland 以前其他账户也能读,而其中的 sessions.json 存着每个会话最近的提示词和回复。现在这个目录只有你能访问(文件 0600,脚本 0700),已有的安装会在启动时自动收紧权限
    • bridge 日志只记录 hook 是什么,不记录它说了什么。 从 6 月起,它会把每个 hook 的完整输入(提示词、命令、文件内容)写进 /tmp/codeisland-bridge.log,而且没有大小限制。现在每个 hook 只记一行(事件、来源、会话、工具和字段名,不含值),最多保留约 5 MB,只有设置 CODEISLAND_DEBUG=1 时才记录完整内容
    • 诊断导出不再包含密钥和对话内容。 导出以前会原样复制各个 CLI 的设置(包括 env 里的 API token)和整个会话文件。现在设置会先脱敏(env 的值、各类 key、token、密码、认证头、常见密钥格式),会话只保留结构,提示词截到 80 个字符、不含回复,和导出说明一致
    • 回复里的链接只会在浏览器中打开。 在所有会话里,agent 回复中的链接只有 http、https 或 mailto 才能打开;file: 或 app 链接(agent 可以借此让你点击后运行某些东西)点了不会有反应
    • OpenCode 写入的终端标题不能再夹带控制字符。 插件写终端标题时只去掉了换行,标题里的控制字符可以发出其他终端序列(比如写入剪贴板)。现在会全部去掉(插件 v11)
    • 主机设置不会变成命令。 现在每个 ssh 调用都会在主机名之前结束选项,以 - 开头的主机或用户字段(比如 -oProxyCommand=…)不会再被当成 ssh 选项;CodeIsland 放进远程命令里的值也都做了 shell 转义。id 为空的主机不再连接

    远程主机

    • 远程主机不再丢事件。 远程 hook 发完事件就立刻关闭连接,而 macOS 的网络监听器会悄悄丢掉「建立前客户端就已关闭」的连接,于是远程会话会丢事件(即使灵动岛空闲,一轮测试里 80 个也会丢 5 到 23 个;灵动岛忙时几乎全丢),丢了 Stop 或 SessionEnd 就会留下僵尸卡片。现在灵动岛改用后台队列上的普通 socket 接收 hook 连接,内核会把每个请求保留到被读取为止,不管 hook 多早关闭。远程的工具事件仍然发完就走,远程主机上的每次工具调用不用等一次往返;生命周期事件会短暂等待灵动岛的回复,这样旧版 CodeIsland 也不会丢
    • 本机和远程的 hook 用同一套解读。 bridge 对 hook 的理解(是哪个 agent 发来的、Cursor 导入的 Claude hook、Cline、Hermes、Gemini 的答复格式等)收进了一个组件,灵动岛也用它处理来自远程主机的事件,修一处两边同时生效。远程 hook 改为只发送环境信息、不再自己解读事件,下次连接时会自动更新。docs/hook-edge-protocol.md 说明了这个协议,供社区的 Windows bridge 等其他客户端参考
    • 每台远程主机通过自己的 socket 与灵动岛通信。 以前远程 hook 和本机 hook 连的是同一个 socket,由 hook 自己说明来自哪台主机,于是远程主机上任何能连到转发 socket 的程序,都可以不写主机、被当成本机会话,或者冒充另一台主机。现在每台连接的主机在一个私有目录里有自己的 socket,灵动岛给从那里进来的每个请求盖上这台主机的章,不管它自称什么;本机的 socket 则拒绝自称来自远程主机的请求。SSH 隧道只在这台主机的 socket 开始监听之后才建立,因此不会通向别人占用的 socket。远程主机上转发出来的 socket 现在只有 SSH 用户本人能用;新增的主机选项「Agent 以其他用户身份运行」,可以为在容器或 sudo 下运行的 agent,向那台主机上的其他账户开放
    • 远程主机无法拖垮灵动岛。 每台主机现在都有上限(单个请求 1 MB、发完一个请求最多 300 秒、同时打开 64 个连接、同时等待答复的请求 32 个),一台主机无法耗尽灵动岛的内存或连接,进而让本机 agent 的审批失效
    • 远程主机上的 socket 放进了私有目录。 转发出来的 socket 现在是 /tmp/codeisland-<uid>/island.sock,所在目录只有 SSH 用户能进入;隧道建立前会检查一次,建立后再检查一次,检查不通过时主机会说明原因,而不是继续连接。在 Mac 上,各主机的 socket 移到了你的私有临时目录,其他账户无法抢先创建。远程 hook 在发送任何内容之前,也会先向内核确认正在监听的是谁。更新前就已启动的 agent 仍在用旧的 hook 命令,现在它会先找这个目录,旧版本遗留的隧道不会再吞掉它的事件。在 SSH 主机上,Hermes 会再请你批准一次 CodeIsland 的 hook,因为命令变了(见 README 中 Hermes 的说明)
    • 远程工具事件乱序到达时,不会误报正在运行的工具已结束。 远程主机上较长的工具结果,可能在下一个工具开始之后才到达;卡片不会再因此把新工具标记为已完成

    修复

    • Claude Code 跑的 grep 不再被当成它的会话。 Claude Code 自己的可执行文件同时也是它的 shell 和 Grep 工具调用的 grep、find、rg,以及它的后台辅助进程。会话发现可能把卡片绑到这些进程上:grep 一结束卡片就消失;成了孤儿的 grep 还可能被发 SIGTERM,连同卡片一起移除。现在卡片只跟随 Claude Code 的 CLI 进程,CodeIsland 也不会再向它的辅助进程发信号
    • 同一文件夹里的 Claude Code 会话各自跟随自己的进程。 同一个文件夹里开着多个会话时(比如主目录里开了好几个终端),会话发现会把最新的转录交给它最先找到的那个进程:卡片可能跟着别的会话的进程走,那个终端一关卡片就消失,而另一个会话要等到下一次 hook 才有卡片。现在 CodeIsland 按 Claude Code 自己为每个进程记录的会话来配对…
  2. 1.0.39

    English

    Important: v1.0.36 to v1.0.38 contained v1.0.35's app

    • Releases ship the code they list again. v1.0.36, v1.0.37 and v1.0.38 carried v1.0.35's app and hook bridge under new version numbers. After the build Mac moved to Xcode 27, SwiftPM's new default build system wrote its products to .build/out/Products/Release, while the release script kept copying from .build/<arch>-apple-macosx/release, where the v1.0.35 build still sat. Everything those three releases list arrives with this one. The release script now pins SwiftPM's native build system (the new one also writes both architectures to the same folder, so the second overwrote the first, and records the 14.0 deployment target as the SDK, which runs AppKit in its old-SDK compatibility mode), asks SwiftPM where the products are (#379, thanks @Naitellos), deletes the previous ones before building and refuses a binary with the wrong architecture or SDK

    That includes MiniMax Code and Xiaomi MiMo support, the redesigned session list, approval and question cards, Claude plan limits on the collapsed island, Hermes prompts and titles, and every fix in those three releases. See the changelog for the full list.

    Fixes

    • Remote hosts reconnect after the Mac wakes. An SSH host only retried after its tunnel dropped, 10 times with growing gaps, then gave up for good, and nothing listened for wake or the network. With the lid closed every attempt failed at once and each dark wake fired the next overdue one, so a long sleep used them all up and the host stayed down until you clicked Connect. Waking up (including the displays coming on after Power Nap) or the network coming back now reconnects every host you still want connected, with a fresh backoff and a short wait for Wi-Fi; offline, a failure waits for the network instead of using up an attempt; after the fast retries it keeps trying every 15 minutes. A host you disconnected stays disconnected, one you connected by hand is restored too, and a failed host that is still retrying shows a Disconnect button. A host that failed slowly no longer retries every few seconds forever, and Disconnect while a connection is being prepared no longer leaves an ssh tunnel running (#375, thanks @KingsleyCl)
    • Cursor sessions show as Cursor, not Claude. Cursor also runs the Claude Code hooks in ~/.claude/settings.json ("Include third-party Plugins, Skills, and other configs", on by default), with its own payload. CodeIsland's Claude hook carries no --source, and Cursor's processes are never used to guess a source, so those events, most of a Cursor agent's tool activity, landed on cards labelled Claude. A payload carrying cursor_version now counts as Cursor's own (Cursor CLI under cursor-agent), locally and over Remote-SSH; Claude Code itself running inside Cursor stays Claude. A prompt or finished turn that reaches both of CodeIsland's hooks rings once instead of twice, cards already saved as Claude switch on their next event, Cursor Task cards still fold under their chat, and a hook Cursor runs never waits on the island or answers in a format Cursor can't use (#377, thanks @4pure)
    • Only the session you started rings when pi or Oh My Pi subagents finish. pi-subagents runs each background child as a pi session of its own that loads the same CodeIsland extension, and Oh My Pi loads it into every task subagent, so each child got a card and rang the completion sound: one parent with two children chimed three times. The extensions (pi v5, Oh My Pi v9) now tell CodeIsland which session a child works for (_parent_session_id, which any agent can send), and Agent Sub-Sessions applies to them: Show separately keeps each child on its own card that never chimes, pops a completion card or sends a push; Merge into main folds it into the parent's card as a subagent; Hide hides it. A child's approvals and questions still alert you and are never answered automatically. A subagent compacting its context no longer shows its parent card as Compacting. Restart pi or Oh My Pi (or /reload) after updating (#378, thanks @uniStark)
    • Clicking a Codex or Claude Code card in tmux lands on its own pane. Several Codex sessions started from one shared background process all inherited the pane that process started in, so clicking any of them switched to the same pane. CodeIsland now finds the pane each session really runs in from the process tree, matches a session that shares a process by its pane's title and folder, and when the hook's pane is known to be another session's and nothing else matches, brings the terminal forward without switching panes instead of guessing. When a pane can't be checked at all (several clients, a detached session, tmux not answering) the hook's pane is used as before. A Codex CLI session no longer opens Codex.app just because the desktop app is running, Claude Code sessions missing terminal info pick up their Ghostty/tmux details from their process, and Settings… (⌘,) or reopening the app shows the real settings window instead of a blank one (#373, thanks @cynicalight)
    • Codex app-servers started by ChatGPT's bundled tools keep their CLI identity. A codex app-server started by one of ChatGPT's bundled tool hosts (such as Contents/Resources/cua_node/bin/node_repl) shares ChatGPT's bundle id, so it was taken for Desktop's shared app-server and its threads were keyed as Desktop threads. Only an app-server whose parent is the app's own executable in Contents/MacOS counts as Desktop now (#372, thanks @burgerseater)

    Performance

    • The island stays responsive with many Claude sessions open. With Agent Sub-Sessions set to Merge into main or Hide, every hook event and discovery scan walked all of ~/.cursor/projects on the main thread once per Claude card, looking for a Cursor Task transcript with that card's id. With a large Cursor history that took most of the main thread (80% of samples with 18 cards), and hovering or expanding the island stuttered. The lookup now reads an index built in the background, each card is looked up at most five times in its first two minutes, and remote cards and Show separately never walk at all. Session discovery also lists each Claude project folder once per scan instead of reading every transcript's date once per Claude process (#374, thanks @x4vierli)

    中文

    重要:v1.0.36 至 v1.0.38 实际装的是 v1.0.35

    • 发布包重新装着它列出的代码。 v1.0.36、v1.0.37、v1.0.38 实际装的是 v1.0.35 的主程序和 hook 桥接程序,只换了版本号。构建机升级到 Xcode 27 后,SwiftPM 新的默认构建系统把产物写到 .build/out/Products/Release,发版脚本却仍从 .build/<架构>-apple-macosx/release 复制,那里一直放着 v1.0.35 的构建结果。这三个版本列出的改动都随本版本一起送达。发版脚本现在固定使用 SwiftPM 的 native 构建系统(新构建系统还会把两个架构写进同一个目录,后编译的覆盖先编译的,并把 14.0 的部署目标记成 SDK 版本,让 AppKit 以旧 SDK 兼容模式运行),向 SwiftPM 询问产物位置(#379,感谢 @Naitellos),构建前删除旧产物,架构或 SDK 不对的二进制拒绝打包

    其中包括 MiniMax Code 和小米 MiMo 支持、重新设计的会话列表与审批/提问卡片、收起状态下的 Claude 用量额度、Hermes 的提示和标题,以及这三个版本里的所有修复。完整列表见更新日志。

    修复

    • Mac 唤醒后,远程主机会自动重连。 以前 SSH 主机只在隧道断开后按递增间隔重试 10 次,之后就永久放弃,也不监听唤醒和网络变化。合盖时每次重试都会立刻失败,每次 DarkWake 又会触发下一次到期的重试,睡得久了 10 次用完,主机就一直断着,直到手动点「连接」。现在系统唤醒(包括 Power Nap 之后屏幕点亮)或网络恢复时,会对仍需保持连接的主机重置退避并重连,并稍等 Wi‑Fi 就绪;离线时失败会等网络恢复,不消耗重试次数;快速重试用完后每 15 分钟再试一次。手动断开的主机保持断开,手动连上的主机唤醒后也会恢复,仍在重试的失败主机会多出「断开」按钮。连接很慢才失败的主机不再每隔几秒无限重试,在连接准备阶段点「断开」也不会再留下运行中的 ssh 隧道(#375,感谢 @KingsleyCl)
    • Cursor 的会话显示为 Cursor,不再是 Claude。 Cursor 也会运行 ~/.claude/settings.json 里的 Claude Code hooks(「Include third-party Plugins, Skills, and other configs」,默认开启),传的是 Cursor 自己的 payload。CodeIsland 的 Claude hook 不带 --source,Cursor 的进程又不参与来源推断,于是这些事件(Cursor agent 的大部分工具调用)都落到了标成 Claude 的卡片上。现在带 cursor_version 的 payload 算作 Cursor 自己的事件(在 cursor-agent 下算 Cursor CLI),本机和 Remote-SSH 都一样;在 Cursor 里运行的 Claude Code 本身仍是 Claude。同一个提示或回合结束同时触发 CodeIsland 的两个 hook 时只响一次,不再响两次;已存成 Claude 的卡片在下一个事件到达时自动改过来;Cursor 的子任务卡片仍会折叠到所属对话下;Cursor 运行的 hook 不会等待灵动岛审批,也不会输出 Cursor 无法识别的答复(#377,感谢 @4pure)
    • pi 和 Oh My Pi 的子代理完成时,只有你自己启动的会话会响。 pi-subagents 把每个后台子代理作为独立的 pi 会话运行,加载的是同一个 CodeIsland 扩展;Oh My Pi 也会把扩展加载进每个任务子代理。于是每个子代理都有自己的卡片,各响一次完成提示音:一个父会话带两个子代理会响三次。现在扩展(pi v5、Oh My Pi v9)会告诉 CodeIsland 子代理属于哪个会话(_parent_session_id,其他 agent 也可以发送),「Agent 子会话」设置也对它们生效:「独立显示」时子代理保留自己的卡片,但不响铃、不弹完成卡片、不推送;「合并到主会话」时并入父卡片,作为子任务显示;「隐藏」时不显示。子代理的审批和提问仍会提醒,也不会被自动批准。子代理压缩上下文时,父卡片也不再显示「Compacting」。更新后需重启 pi 或 Oh My Pi(或执行 /reload)(#378,感谢 @uniStark)
    • 在 tmux 里点 Codex 或 Claude Code 的卡片,会跳到它自己的 pane。 从同一个后台进程启动的多个 Codex 会话,都继承了这个进程最初所在的 pane,点哪张卡都切到同一个 pane。现在按进程树找到每个会话实际所在的 pane;共享进程的会话按 pane 的标题和目录匹配;如果确定 hook 给的 pane 属于别的会话、又找不到唯一匹配,就只把终端提到前台,不再猜。完全无法验证时(多个 client、session 已 detach、tmux 没有响应)照旧使用 hook 的 pane。Codex 桌面版开着时,点命令行会话不会再打开 Codex.app;缺少终端信息的 Claude Code 会话会从进程里补全 Ghostty/tmux 信息;按 ⌘, 或「设置...」、以及重新打开 app,都会显示真正的设置窗口,不再出现空白窗口(#373,感谢 @cynicalight)
    • ChatGPT 内置工具启动的 Codex app-server 保持命令行身份。 ChatGPT 内置工具(例如 Contents/Resources/cua_node/bin/node_repl)启动的 codex app-server 和 ChatGPT 共用同一个 bundle id,之前被当成桌面版共享的 app-server,它的对话被算作桌面版对话。现在只有父进程是 App 自己 Contents/MacOS 里的可执行文件时,才算桌面版(#372,感谢 @burgerseater)

    性能

    • 开着很多 Claude 会话时,刘海不再卡顿。 「Agent 子会话」设为合并到主会话或隐藏时,每个 hook 事件和每次会话发现扫描,都会为每张 Claude 卡在主线程上遍历一遍 ~/.cursor/projects,查找对应 id 的 Cursor Task 记录。Cursor 历史多时,主线程大部分时间耗在这里(18 张卡时 80% 的采样),悬停和展开刘海明显卡顿。现在改为查后台建好的索引,每张卡只在头两分钟里最多查五次,远程卡片和「独立显示」模式完全不遍历。会话发现也改为每轮扫描每个 Claude 项目目录只列一次,不再为每个 Claude 进程逐个读取 transcript 的修改时间(#374,感谢 @x4vierli)
  3. 1.0.38

    English

    Fixes

    • Codex Desktop threads show up again on current ChatGPT builds. Newer ChatGPT releases moved Codex's binary from ChatGPT.app/Contents/Resources/codex to Contents/Resources/codex-cli/CodexCLI.app/Contents/MacOS/codex, and CodeIsland only knew the old place. Its process scan never found Desktop's app-server, so Desktop threads were never read from Codex's state database, and the live app-server connection could not start (it retried every 10 seconds while ChatGPT ran). Both now find the new binary. Because the same file also runs Codex CLI, discovery tells the two apart by what the process runs and who started it: the app-server ChatGPT starts is Desktop; ChatGPT's cloud exec-server, one-shot commands like login, and CodeIsland's own app-server connection are skipped; a terminal session or the app-server Claude Code's Codex plugin starts is a CLI session

    中文

    修复

    • 新版 ChatGPT 下,Codex 桌面版对话重新显示在刘海上。 新版 ChatGPT 把 Codex 程序从 ChatGPT.app/Contents/Resources/codex 挪到了 Contents/Resources/codex-cli/CodexCLI.app/Contents/MacOS/codex,CodeIsland 只认旧位置:进程扫描找不到桌面版的 app-server,于是从不读 Codex 状态库里的桌面版对话;和 app-server 的实时连接也起不来(ChatGPT 运行期间每 10 秒重试一次)。现在两处都能找到新位置的程序。由于终端里的 Codex 用的也是这个程序,发现流程按进程在跑什么、由谁启动来区分:ChatGPT 启动的 app-server 是桌面版;ChatGPT 的云端 exec-server、login 这类一次性命令,以及 CodeIsland 自己的 app-server 连接都会跳过;终端会话和 Claude Code 的 Codex 插件起的 app-server 按命令行会话处理
  4. 1.0.37

    English

    Fixes

    • One card per Codex conversation with ChatGPT Desktop open. Two cases showed the same Codex conversation twice. A Codex task started from Claude Code's Codex plugin (/codex:rescue) runs its own codex app-server, whose transcript carries the same source as a Desktop thread; it was taken for one and got a second, Desktop-badged card. Transcripts now count as Desktop only when their originator is Desktop's, so the plugin's tasks (and the threads they spawn) stay on the card their hooks build. Separately, newer ChatGPT builds start Codex's app-server from ChatGPT.app/Contents/Resources/codex-cli/ without a bundle id in its environment, so Desktop threads' hooks were keyed as CLI sessions next to the Desktop card. The bridge now recognises a Codex process running app-server directly under ChatGPT and marks its hooks as Desktop; terminal Codex and the plugin's app-server, which use the same binary, are unaffected. With Plugin Sub-Sessions merged, a Desktop thread's own hooks are no longer folded into another thread as its sub-session. Thanks @Junyu06

    中文

    修复

    • 开着 ChatGPT 桌面版时,一个 Codex 对话只显示一张卡。 有两种情况会让同一个 Codex 对话出现两张卡。一是在 Claude Code 里用 Codex 插件(/codex:rescue)起的任务:插件自己起一个 codex app-server,对话记录里的 source 和桌面版一样,于是被当成桌面版对话,多出一张带桌面版标记的卡。现在只有 originator 是桌面版的对话记录才算桌面版,插件的任务(以及它派生的子任务)留在 hook 建的那张卡上(#368、#369)。二是新版 ChatGPT 从 ChatGPT.app/Contents/Resources/codex-cli/ 启动 Codex 的 app-server,环境变量里没有 bundle id,桌面版对话的 hook 被当成命令行会话,和桌面版那张卡并排出现。现在桥接程序发现 Codex 进程在跑 app-server 且父进程就是 ChatGPT 时,把它的 hook 标为桌面版;终端里的 Codex 和插件起的 app-server 用的是同一个程序,不受影响。「插件子会话」设为合并时,桌面版对话自己的 hook 也不会再被当成别的对话的子会话吞掉(#370、#371)。感谢 @Junyu06
  5. 1.0.36

    English

    New

    • MiniMax Code CLI on the island. mcode sessions show up as their own cards — live status, running tool, prompts and replies. mcode loads shell hooks only through a plugin, so CodeIsland writes a local plugin pack at ~/.minimax/plugins/codeisland/ (honours $MINIMAX_DATA_DIR) when MiniMax Code is installed; the next mcode session picks it up. Approvals can be answered from the island for 10 seconds — the longest mcode lets a plugin hook wait — after which mcode's own prompt takes over. Settings → Hooks → MiniMax Code CLI
    • Xiaomi MiMo and MiMo Code on the island. The Xiaomi MiMo desktop app (mainland and overseas editions) runs MiMo Code as its engine, and both load plugins from ~/.config/mimocode/plugins/, so CodeIsland installs one plugin there (no MiMo config file is edited) and covers both: live status, running tool, session titles, completion alerts, and approvals and questions answered from the island or in MiMo, whichever comes first. Clicking a desktop session brings Xiaomi MiMo to the front; a mimo CLI session jumps back to its terminal. Restart MiMo once after updating so it loads the plugin. Settings → Hooks → MiMo Code / Xiaomi MiMo
    • Hermes cards show the prompt, the reply and the session title. Hermes fires on_session_end after every turn, not when a session ends, and CodeIsland read it as the latter: each reply deleted the card, and the next turn started a blank one showing only a status and a session id. The end of a turn now settles the card like any other agent's (completion card and sound; a stopped turn shows as interrupted), a new pre_llm_call hook puts the prompt on the card as soon as it's sent, and a new on_session_finalize hook removes the card when the session really ends (/new, quitting hermes, closing a desktop conversation, the gateway shutting down). Gateway chats (Telegram, Discord, Slack, WhatsApp, email and the rest, and the API server) update their card without a completion card or sound, and an idle one goes after 10 minutes; the CLI, the TUI, the desktop app and ACP editors behave like any other agent. The title Hermes generates, which no hook carries — and, while a hook isn't approved yet, the latest prompt and reply — come from Hermes's own session store ($HERMES_HOME/state.db, opened read-only off the main thread; for SSH hosts the remote hook reads the store there). The bridge also stops forwarding the full conversation Hermes attaches to every turn hook. Hermes asks once before running each new hook: answer y the next time you start hermes in a terminal. The gateway and the desktop app can't ask and skip a hook nobody approved, so approve them in a terminal once or set hooks_auto_accept: true in config.yaml (#364, thanks @geminiwhale)
    • Click-to-jump reaches the exact Claude Desktop session. A Claude Code session run from Claude Desktop's Code tab only raised Claude Desktop, which stayed on whichever session it last showed. The bridge now forwards the id Claude Desktop gives each Code-tab session (CLAUDE_CODE_HOST_SESSION_ID), and a click opens claude://code/continue?session=<id> — the link Claude Desktop's own Dock menu uses — so the card lands on its session. Sessions without the id (not started from Claude Desktop, or not yet seen by an updated bridge) raise the app as before
    • Claude plan limits on the collapsed island. With "Show Claude plan limits" on, a chip (window, ring, percent) takes the left wing's tool slot while no tool is running, and its tooltip lists every window. "Collapsed island shows" picks Auto, 5-hour, weekly, weekly (model-specific: the window the server keeps for one model) or nothing. Auto shows a weekly window: one ahead of pace or past 80% first, else one late in the week with plenty left (green ring: budget worth spending before it resets), else the tighter one; the 5-hour window takes over only while it can really block you (past 50% and more than 10 points ahead of pace). The chip's percent carries a small pace mark: points ahead of (amber) or behind (green) spending the window evenly; the panel footer gives the same in its tooltip. The tooltip adds the lead as window time and when the budget runs out at this rate, or where it lands at reset; the mark is hidden for the first 10% of a window and after it resets, and on menu-bar-height bars (external displays) it stays in the tooltip. On notched screens the bar grows to the left by just what the chip needs, so the chip never reaches under the notch and the right wing stays put. While the chip is on, limits also refresh with the island collapsed: once at launch, on Stop as before, and every 10 minutes to catch resets. With the setting off, the collapsed bar is unchanged
    • Question cards can be dismissed. A question card used to stay up until it was answered: moving away or clicking elsewhere never folds a card, and Skip is an answer (for AskUserQuestion it denies the tool call). A new Hide button closes the card without answering, like the one on approval cards: the agent keeps waiting, so you can answer in the terminal, and the collapsed bar's question badge reopens the card. A closed question doesn't come back on its own, isn't followed up by reminders, and isn't acted on by the skip shortcut; a new question, even from the same session, opens as usual

    Improvements

    • A session list that leads with what needs you. Every card says its status in a word — NEEDS YOU, WORKING, THINKING, DONE, STOPPED, or ERROR when a turn failed — with a matching stripe down its edge; the project name's colour no longer carries it alone. Sessions waiting on you come first, then the working ones, then the rest by latest activity. The order holds while the pointer is on the list, so nothing moves under your cursor (with "Group by status", which now lists Waiting before Running, a card also keeps its section until the pointer leaves). Your prompt (›), the agent's reply (●) and the running tool (a ▸ chip) each get their own marker, where "$" used to mark both. The inline approval buttons follow the redesigned approval card: Allow once is the one filled button, Deny is outlined, and "Always allow <tool>" is a link. New: Settings → Appearance → Session list density → Compact shows one line per session and opens only the sessions that need you, so eight fit on a 14" MacBook without scrolling
    • Approval and question cards with one clear answer. The approval card says what is being asked — "Bash wants to run a command", "Edit wants to change Dashboard.tsx", "github wants to call create_pull_request" — under the agent, project and branch asking, with its place in the queue ("1 of 3"). Allow once is the only filled button, in the trailing slot; Deny is outlined; Hide (was Dismiss) is plain text; Always is now a link that states its scope: "Always allow Bash this session", or for Codex where the rule is saved (~/.codex/rules, or ~/.codex/config.toml for an MCP tool). The question card follows the same order: Confirm / Submit filled (dimmed until there is something to send), Skip outlined, Hide as text. A button shows its keyboard shortcut only once you have turned that shortcut on. Card text follows Settings → Appearance → Content Font Size, and a command taller than the window scrolls instead of being cut off
    • A clearer panel header and usage footer. The grouping tabs are spelled out — ALL · STATUS · AGENT — in brighter pixel type with taller click targets (beside a notch that leaves too little room they fall back to ALL · STA · AGT). Quit asks once: the first click turns the power button into a red "QUIT?" pill, and only a second click within 3 seconds quits; waiting, moving the pointer away or the panel closing puts the button back, VoiceOver announces the question, and Reduce Motion swaps the two without sliding. With plan limits on, the footer is one line that leads with what can stop you — each window's bar, percent (warning colours near the cap) and reset countdown — with the token sparkline at its end; the token totals and the pace numbers moved into its tooltip. Without plan limits the token line uses words instead of arrows ("last 5h: 422K in · 96K out Today: 922K in · 233K out"), and its tooltip breaks "in" down into new input, cache writes and cache reads
    • Cards that fit, and say who's asking. An approval card now names the agent and project it belongs to, like the question card. A tall session list, a long question or a long option list scrolls inside the window instead of running off its bottom edge, so the last session, the footer and the Hide / Skip buttons stay reachable; the whole question is shown instead of three lines
    • Accessibility: dim panel text meets WCAG AA contrast; Reduce Motion holds the mascots still and stops the shimmer and pulsing badges; the panel's icon buttons and pixel tabs have VoiceOver labels and tooltips, and Hide / Skip / Always explain themselves (Always says whether the rule lasts for the session or is saved, as Codex does)

    Fixes

    • Installing Codex hooks no longer appends a duplicate [features] table that stopped Codex from starting, and configs already broken that way are repaired
    • Codex's Interrupt and SessionEnd hooks stay within Codex's 3 s cap, locally and on remote hosts
    • Codex Auto Review chosen per turn in the Codex app is respected, and auto-review (guardian) and /review threads follow Plugin Sub-Sessions
    • A completion card can no longer send the main thread into an endless layout loop that froze the app and the hooks waiting on it
    • On notched screens the collapsed bar's question badge and finished dot no longer slide under the notch
    • AiWork sessions the watcher drops (the agent is gone, or monitoring for that surface was turned off) no longer leave an empty completion card behind
    • Claude Code (Homebrew or the native installer) is no longer mistaken for the app whose terminal it runs in, so with Plugin Sub-Sessions on "Hide" its approvals, and those of OpenCode / MiMo Code, are no longer approved automatically
    • Claude Code installed with Homebrew on Apple Silicon gets the PostToolUseFailure and StopFailure hooks again (its version was never detected)
    • OpenCode session titles reach the island
    • Hermes hooks installed on SSH hosts actually run — Hermes executes hook commands without a shell, so the VAR=value python3 ~/… form was taken for a program name; they are now env … python3 <absolute path> and replace the old entries on the next connect
    • The standalone Qoder App, which shares the ~/.qoder hooks with the Qoder IDE, is recognised: its sessions carry a Qoder badge (the IDE's now reads Qoder IDE) and a click brings the app forward
    • On a Mac without DeepSeek Harness or Cline, CodeIsland no longer creates a ~/.dsh file (which made DeepSeek Harness look installed, and is removed at launch) or a ~/Documents/Cline/Hooks folder, and Cline's hook scripts are no longer rewritten every few minutes

    中文

    新功能

    • MiniMax Code CLI 上岛。 mcode 会话以独立卡片显示——实时状态、正在运行的工具、prompt 与回复。mcode 只能通过插件加载 shell hook,因此检测到 MiniMax Code 时,CodeIsland 会在 ~/.minimax/plugins/codeisland/ 写入一个本地插件包(支持 $MINIMAX_DATA_DIR),下一次 mcode 会话启动即生效。权限审批可以在刘海上处理 10 秒——这是 mcode 允许插件 hook 等待的上限——超时后交回 mcode 自己的确认界面。设置 → Hooks → MiniMax Code CLI
    • Xiaomi MiMo 与 MiMo Code 上岛。 Xiaomi MiMo 桌面端(国内版与海外版)的内核就是 MiMo Code,两者都从 ~/.config/mimocode/plugins/ 加载插件,所以 CodeIsland 在这里装一个插件(不改 MiMo 的配置文件)就同时支持两者:实时状态、正在运行的工具、会话标题、完成提醒;审批和提问可以在刘海上处理,也可以照常在 MiMo 里处理,以先操作的为准。点击桌面端会话会把 Xiaomi MiMo 切到前台,mimo 命令行会话照常跳回终端。更新后请重启一次 MiMo 以加载插件。设置 → Hooks → MiMo Code / Xiaomi MiMo
    • Hermes 卡片显示 prompt、回复和会话标题。 Hermes 的 on_session_end 其实在每一轮结束时都会触发,并不是会话结束,CodeIsland 却把它当成了会话结束:每次回复完卡片就被删掉,下一轮再新建一张只有状态和会话 ID 的空卡片。现在一轮结束时卡片像其他 Agent 一样回到空闲(弹出完成卡片、播放提示音;被中途停止的一轮标为已中断),新增的 pre_llm_call hook 让 prompt 一发出就显示在卡片上,新增的 on_session_finalize hook 在会话真正结束时移除卡片(/new、退出 hermes、关闭桌面端对话、gateway 停止)。Gateway 聊天(Telegram、Discord、Slack、WhatsApp、邮件等,以及 API Server)只更新卡片,不弹完成卡片、不响提示音,空闲 10 分钟后移除;命令行、TUI、桌面 App 和 ACP 编辑器与其他 Agent 一致。没有任何 hook 携带的会话标题(由 Hermes 自动生成),以及相应 hook 尚未获准时的最新 prompt 和回复,改从 Hermes 自己的会话库读取($HERMES_HOME/state.db,只读、在主线程之外;SSH 远程主机上由远程 hook 在那边读取)。桥接程序也不再转发 Hermes 附在每个轮次 hook 上的完整对话。Hermes 在首次运行每个新 hook 前会询问一次:下次在终端启动 hermes 时回答 y 即可。Gateway 和桌面 App 无法询问,会跳过未批准的 hook,所以请在终端里批准一次,或在 config.yaml 里设置 hooks_auto_accept: true(#364,感谢 @geminiwhale)
    • 点击跳转能定位到 Claude 桌面 App 里的具体会话。 在 Claude 桌面 App 的 Code 标签里跑的 Claude Code 会话,以前点击只会唤醒 App,停在它上次显示的会话上。现在桥接程序会转发 App 给每个会话的 id(CLAUDE_CODE_HOST_SESSION_ID),点击时打开 claude://code/continue?session=<id>(App 自己 Dock 菜单用的就是这个链接),直接进入对应会话。拿不到 id 的会话(不是从 App 启动的,或者更新后还没触发过 hook)照旧只唤醒 App
    • 收起态也能看 Claude 套餐额度。 开启「显示 Claude 套餐额度」后,没有工具在运行时,左翼的工具位显示一个 chip(窗口、圆环、百分比),悬停可看全部窗口。「收起时显示」可选自动、5 小时、周、周(特定模型:服务端为某个模型单独设的周额度)或不显示。「自动」显示周额度:进度超前或超过 80% 的优先;否则本周已过半、还剩很多的那条(圆环标绿:值得在重置前用掉的额度);再否则更紧的那条。只有 5 小时窗口真会卡住你时(用量过半且比匀速超前 10 个百分点以上)才让给它。chip 的百分比下方挂一个小的速度标记:比匀速消耗多用(橙)或少用(绿)的百分点,展开面板底栏在悬停提示里给出同样的信息;悬停提示再给出超前 / 落后折合多少窗口时间,以及照此速度多久用完、或重置时大约用到多少。窗口前 10% 的时间和窗口重置之后不显示标记;菜单栏高度的药丸(外接显示器)放不下,只在悬停提示里显示。刘海屏上药丸只向左加宽 chip 放不下的那一截,chip 不会钻到刘海底下,右翼位置也不变。chip 开启时,收起状态下也会刷新:启动时取一次,照旧由 Stop hook 驱动,另有 10 分钟一次的刷新以赶上窗口重置。设置关闭时收起栏完全不变
    • 提问卡片可以关闭了。 以前提问卡片不回答就一直停在那里:鼠标移开或点别处都不会收起卡片,而「跳过」本身就是一种回答(对 AskUserQuestion 来说是拒绝这次工具调用)。现在多了和审批卡片一样的「收起」按钮:只关掉卡片、不作答,Agent 继续等待,你可以回终端回答,也可以点收起栏上的提问角标重新打开。关掉的提问不会自己弹回来,不再跟进提醒,跳过快捷键也不会动它;新的提问(哪怕来自同一个会话)照常弹出

    改进

    • 会话列表先给你看要处理的。 每张卡片用文字标出状态——待处理、运行中、思考中、已完成、已中断,这一轮失败时显示「出错」——左侧配同色竖条,状态不再只靠项目名的颜色。等你处理的会话排在最前,然后是运行中的,其余按最近活动排序。鼠标停在列表上时顺序保持不变,卡片不会在指针下挪动(「按状态分组」现在把等待中排在运行中之前,指针离开前卡片也留在原来的分组里)。你的 prompt(›)、Agent 的回复(●)和正在运行的工具(▸ 标签)各有各的符号,不再都用「$」。内联审批按钮与改版后的审批卡片一致:「允许一次」是唯一的实心按钮,「拒绝」是描边按钮,「始终允许 <工具>」是链接。新增:设置 → 外观 → 会话列表密度 → 紧凑,每个会话只占一行,只展开需要你处理的会话,14 寸 MacBook 不滚动就能放下 8 个
    • 审批与提问卡片:该按哪个一目了然。 审批卡片在发起请求的 Agent、项目和分支下方直接写明要做什么——「Bash 请求运行命令」「Edit 请求修改 Dashboard.tsx」「github 请求调用 create_pull_request」,并标出排队位置(「第 1/3 个」)。「允许一次」是唯一的实心按钮,位于最右侧;「拒绝」为描边按钮;「收起」改为纯文字;「始终允许」改为写明范围的链接:「本会话始终允许 Bash」,Codex 则写明规则保存在哪里(~/.codex/rules,MCP 工具为 ~/.codex/config.toml)。提问卡片按同样的层级排列:「确认 / 提交」为实心按钮(没有可提交的内容时置灰),「跳过」为描边按钮,「收起」为文字。只有在设置里开启了对应的快捷键,按钮上才会显示它。卡片文字跟随「设置 → 外观 → 内容字体大小」;比窗口还长的命令可以滚动查看,不再被截断
    • 更清楚的面板标题栏与用量底栏。 分组标签写全为 ALL · STATUS · AGENT,像素字更亮、点击区域更高(刘海旁空间不够时退回 ALL · STA · AGT)。退出要确认一次:第一次点击会把电源按钮变成红色的「退出?」,3 秒内再点一次才会退出;超时、鼠标移开或面板收起都会恢复原样,VoiceOver 会读出提示,开启「减弱动态效果」时直接切换、不做滑动。开启套餐额度后,底栏合并成一行,先列出会卡住你的额度——每个窗口的进度条、百分比(接近上限时变色)和重置倒计时——走势图放在行尾;token 总量和进度偏差移入悬停提示。未开启套餐额度时,token 行用文字代替箭头(「近 5 小时:输入 422K · 输出 96K 今日:输入 922K · 输出 233K」),悬停提示把「输入」拆成新输入、缓存写入与缓存读取
    • 卡片放得下,也看得出是谁在问。 审批卡片和提问卡片一样,显示所属的 Agent 与项目。会话列表、长问题、长选项列表过高时在窗口内滚动,不再超出窗口底边,最后一个会话、底栏以及「收起 / 跳过」按钮始终够得着;问题完整显示,不再截成三行
    • 无障碍: 面板上的浅色文字达到 WCAG AA 对比度;开启「减弱动态效果」后吉祥物静止,闪光与脉动角标停止;面板的图标按钮和像素标签有 VoiceOver 标签与提示,「收起 / 跳过 / 始终允许」会说明各自的作用(「始终允许」会说明规则是本次会话有效还是像 Codex 那样永久保存);「Dismiss」的中文从「忽略」改为「收起」

    修复

    • 安装 Codex hook 不再在配置末尾追加重复的 [features] 表导致 Codex 无法启动,已经被这样写坏的配置也会自动修复(#354)
    • Codex 的 Interrupt 与 SessionEnd hook 超时不再超过 Codex 的 3 秒上限(本机与远程)
    • Codex App 里按轮选择的「自动审查」会被尊重,自动审查(guardian)与 /review 线程遵循「插件子会话」设置(#348)
    • 完成卡片不会再让主线程陷入无限布局循环、卡死 App 和等待中的 hook(#357)
    • 刘海屏上收起栏的提问角标和完成小圆点不再被刘海挡住
    • AiWork 会话被监视器移除后(Agent 已结束,或关闭了该界面的监控),不再留下一张空的完成卡片
    • Claude Code(Homebrew 或官方安装器安装)不再被误认成它所在终端的那个 App,因此「插件子会话」设为「隐藏」时,它以及 OpenCode / MiMo Code 的审批不再被自动放行
    • Apple Silicon 上用 Homebrew 安装的 Claude Code 重新装上 PostToolUseFailure 与 StopFailure hook(之前检测不到它的版本)
    • OpenCode 的会话标题能显示到刘海上了
    • SSH 远程主机上安装的 Hermes hook 终于能运行——Hermes 不经 shell 直接执行 hook 命令,VAR=value python3 ~/… 被当成了程序名,现在改为 env … python3 <绝对路径>,下次连接时替换旧条目
    • 独立的 Qoder App(与 Qoder IDE 共用 ~/.qoder 的 hook)能被识别了:会话显示 Qoder 标签(IDE 的标签改为 Qoder IDE),点击会把 Qoder App 切到前台(#366、#367)
    • 没有安装 DeepSeek Harness 或 Cline 的 Mac 上,CodeIsland 不再创建 ~/.dsh 文件(它会让 DeepSeek Harness 显示为已安装,启动时会被清理掉)或 ~/Documents/Cline/Hooks 文件夹,Cline 的 hook 脚本也不再每隔几分钟被重写一遍
  6. 1.0.35

    English

    New

    • Task progress on session cards. The agent's own checklist — Claude Code's TaskCreate / TaskUpdate and TodoWrite, Codex's plan — shows as a segmented bar with "2/5" and the step it's on; click for the full list. It fades once everything is done, and a plan the agent abandoned no longer lingers on an idle card. Settings → Appearance → Show task progress (on)
    • Session recap. When Claude Code writes its "while you were away" summary, the idle card shows it under the last reply (↻). A new prompt retires it. Settings → Appearance → Show session recap (on)
    • Model and reasoning effort on each card ("Opus 5.5 1M · xhigh", "gpt-5.6-sol · max"), read from the transcript; subagents show their own model. Off by default — Settings → Appearance
    • Replies render as Markdown. The completion card shows the finished reply in full — headings, lists, task checkboxes, tables, code blocks with a copy button — in a scrollable area sized to the window. One-line previews in the session list are now clean text instead of raw **, # and table pipes, and so are the previews sent to the iPhone / Watch / ESP32 Buddy
    • Pushes to your phone or team chat. Settings → Behavior → Push notifications sends approvals, questions (with numbered options), finished turns, turn errors and follow-up reminders to Bark, ntfy, DingTalk, Lark / Feishu, WeCom, Slack or Telegram — several at once, each with its own event choices and a Send test button that shows the service's real reply. By default a push only goes out while you're away (locked, screen saver, displays asleep, or 5 minutes without input), and a request that arrived while you were at the Mac is pushed when you leave. Team-chat channels send titles only unless you turn on details; commands and replies go through credential redaction. Off by default
    • Follow-up reminders. Settings → Behavior → Follow-up reminders (off / 1 / 2 / 3 / 5 min): an approval or question still waiting rings again (up to 3 times), a finished turn you haven't looked at rings once. Reminders stop when you answer or jump to the session and wait a round while its terminal is in front or your pointer is on the card; one that came due while the screen was locked plays right after you unlock, and one held back while you're away from the Mac still reaches your phone. Also covers waits the island can only show — Claude Desktop Cowork permission prompts, Cursor's in-IDE questions, AiWork — and those reach your phone too
    • Claude Desktop Cowork on the island. Cowork runs in a sandbox where hooks never fire, so CodeIsland reads the session files Claude Desktop keeps on your Mac (read-only): title, live status, running tool, latest reply, completion sound, and a waiting state for permission prompts. Click to open the conversation in Claude Desktop. Stopping a turn is treated as an interrupt, not a failure. Settings → Hooks → Claude Desktop
    • Several accounts. Register extra Claude Code, Codex and Grok config directories (e.g. a second CLAUDE_CONFIG_DIR) in Settings → Hooks. Each gets its own hooks and status line; sessions, transcripts and usage cover all of them, and each running process is matched to the directory in its own environment. A directory that turns out to be the main one (or shares its settings file through a symlink) is never written twice or unhooked by mistake

    Improvements

    • Error sound only when a turn dies. A single failed tool call (a command exiting non-zero, an edit that didn't match) no longer plays the "task error" jingle; Claude Code's StopFailure (API error, rate limit) does, once per burst
    • Quieter when you're not there. Event sounds mute while the screen is locked or the screen saver runs (Settings → Sound, on). The boot jingle no longer plays when CodeIsland starts at login
    • Questions get their own auto-expand switch. Turn off "Auto-expand on question" to keep the island collapsed: the sound plays, a badge appears, and one click opens the card. Keyboard shortcuts now act only on the card you can see — with a card hidden, approve / deny opens it instead of acting blind
    • Polish: hover-to-expand delay (0.1–1.0 s); content font up to 16 pt; the volume slider goes much quieter at the low end; "Show project name" switch for screen sharing; About links this version's release notes and explains when the app can't update itself (running from the disk image or a translocated copy)

    Reliability

    • Reliability: AppleScript for terminal jumps and Smart Suppress checks now runs out of process instead of on background threads inside the app; hook config files that are symlinks stay symlinks when CodeIsland edits them

    中文

    新功能

    • 会话卡片显示任务进度。 Agent 自己的任务清单(Claude Code 的 TaskCreate / TaskUpdate 与 TodoWrite、Codex 的计划)显示为分段进度条、「2/5」和当前步骤,点击展开完整清单。全部完成后自动淡出;Agent 半途放弃的计划不会一直留在空闲卡片上。设置 → 外观 → 显示任务进度(默认开)
    • 会话回顾。 Claude Code 写下「离开期间」总结时,空闲卡片会在最后一条回复下方显示它(↻),有新的提问后自动失效。设置 → 外观 → 显示会话回顾(默认开)
    • 模型与推理强度标签(「Opus 5.5 1M · xhigh」「gpt-5.6-sol · max」),从 transcript 读取;子 Agent 显示它自己的模型。默认关闭,设置 → 外观
    • 回复按 Markdown 渲染。 完成卡片完整显示本轮回复:标题、列表、任务复选框、表格、带复制按钮的代码块,放在按窗口高度自适应的滚动区域里。会话列表里的单行预览改为干净的纯文本,不再出现 **、# 和表格竖线;发给 iPhone / Watch / ESP32 Buddy 的预览同样如此
    • 推送到手机或群聊。 设置 → 行为 → 推送通知,可把审批、提问(附编号选项)、完成、整轮出错和跟进提醒推送到 Bark、ntfy、钉钉、飞书 / Lark、企业微信、Slack 或 Telegram;可同时启用多个通道,每个通道单独选择事件,「发送测试」显示服务端的真实返回。默认只在你离开时推送(锁屏、屏保、显示器睡眠,或 5 分钟无操作),你在 Mac 前时到达的请求会在你离开时补推。群聊类通道默认只推标题,可单独开启详情;命令和回复会做凭据脱敏。默认关闭
    • 跟进提醒。 设置 → 行为 → 跟进提醒(关 / 1 / 2 / 3 / 5 分钟):还在等待的审批或提问会再次提醒(最多 3 次),你还没看的完成结果提醒一次。你作答或跳转到该会话后停止提醒;它的终端在前台、或指针停在卡片上时顺延一轮;锁屏期间到点的提醒会在解锁后立即补上;你不在 Mac 前时被压下的提醒仍会推到手机。也覆盖只能在岛上显示的等待——Claude Desktop Cowork 的权限请求、Cursor 在 IDE 里的提问、AiWork——并同样推送到手机
    • Claude Desktop Cowork 上岛。 Cowork 跑在沙盒里,hook 不会触发,CodeIsland 改为只读地读取 Claude Desktop 保存在本机的会话文件:标题、实时状态、正在运行的工具、最新回复、完成提示音,以及权限请求时的等待状态。点击在 Claude Desktop 里打开对应对话。在 Desktop 里停止回合按中断处理,不算失败。设置 → Hooks → Claude Desktop
    • 多账号。 在 设置 → Hooks 登记额外的 Claude Code、Codex、Grok 配置目录(比如第二个 CLAUDE_CONFIG_DIR),每个目录单独安装 hook、单独显示状态;会话、transcript 和用量统计覆盖所有目录,每个运行中的进程按它自己的环境变量归到对应目录。如果某个目录其实就是主目录(或通过软链共享同一个设置文件),不会被重复写入,也不会被误卸载 hook

    改进

    • 只有整轮失败才响错误音。 单个工具失败(命令非零退出、编辑没匹配上)不再响「任务错误」;Claude Code 的 StopFailure(API 错误、限流)才响,连续失败只响一次
    • 你不在时更安静。 锁屏或屏保期间事件音自动静音(设置 → 声音,默认开)。开机登录自启时不再播放启动音
    • 提问有了单独的自动展开开关。 关掉「提问时自动展开」后岛保持收起:响提示音、显示角标,点一下打开卡片。键盘快捷键现在只作用于你看得见的卡片——卡片被隐藏时,批准 / 拒绝快捷键会先打开卡片,而不是盲目执行
    • 细节打磨: 悬停展开延迟可调(0.1–1.0 秒);内容字号最大 16pt;音量滑块低端可以调得更轻;新增「显示项目名」开关,方便共享屏幕;关于页可查看本版本更新说明,并在无法自动更新时说明原因(从磁盘映像或被系统隔离的副本运行)

    可靠性

    • 可靠性: 终端跳转和智能抑制检测用到的 AppleScript 改为进程外执行,不再在 App 内的后台线程跑;hook 配置文件是软链接时,CodeIsland 编辑后仍保持软链接
  7. 1.0.34

    English

    New

    • OpenCode 2 support. OpenCode 2 replaced its plugin API wholesale, so the CodeIsland plugin never loaded there. One plugin file now serves OpenCode 1.x (server()) and 2 (setup()), with events, approvals and questions mapped to the released v2 API. (#332, thanks @BrikerMan)
    • Claude plan limits, opt-in. Turn on "Show Claude plan limits" and the expanded panel gets a footer with the same 5-hour / weekly windows /usage shows: mini bar, percent, reset countdown. It reads your own Claude Code login, never refreshes the token, and reads or sends nothing while it is off. (#338, thanks @mutoe)
    • AiWork (GUI and CLI/TUI), read-only. Status, running tool and streaming replies reach the notch with nothing to install; approvals and answers stay in AiWork. (#336, thanks @x4vierli)
    • Codex shows what it's doing. Richer task-level status and the agent's latest public output while a turn runs, over SSH too. Reasoning, encrypted content, tool results and subagent messages are never shown. (#343, thanks @954708775)
    • T3 Code awareness. Sessions running under T3 Code get a T3 Code chip, and click-to-jump opens the T3 thread. (#321, thanks @lapinvert)
    • Open / close speed slider in Settings → Appearance (0.5×–2.0×); motion stays interruptible at every setting. (#298/#337, thanks @Luthiel and @Mrjamedd)

    Fixes

    • Multiple sessions no longer cross answers. Answering one session's question card could hand that answer to the next session's question when it slid into the same slot. Each request now gets its own card, and a mismatched submission is refused. (#333, thanks @moluoyingxiong)
    • AskUserQuestion is no longer "denied by hook" while a background subagent runs. Subagent activity was mistaken for "answered in the terminal". (#340/#345, thanks @seahindeniz and @halindrome)
    • Oh My Pi 18.2.x: the extension loads again. OMP stopped exporting the native Ask renderer and the extension threw at load, silently cutting off sessions, approvals and questions. Installed copies upgrade to v8 automatically. (#346/#347, thanks @johnpoint and @haixing23)
    • A question card no longer steals keyboard focus when it appears. It used to swallow what you were typing in your editor; it now focuses only if you've already clicked into the island. (#297, thanks @Jruesch72)
    • Grok: /resume no longer leaves two cards. The resumed session was merged into the old card before its SessionStart arrived, and the old card lingered. (#318, thanks @nevermorewei; #331)
    • Remote hosts: custom CLIs install instead of always showing "skipped", and a skipped tool now says why. The remote side honours $CLAUDE_CONFIG_DIR, and remote Claude cards show the last reply again. (#342, thanks @SeasonPilot; #271, thanks @halindrome)
    • iPhone Buddy: an answer to a question that wasn't at the head of the queue is no longer dropped.

    Worth knowing

    • Google Antigravity is now observe-only. Its hook can refuse a tool call but never approve one, so the island's Allow did nothing and Antigravity asked again. The island now shows the running tool and leaves every decision to Antigravity's own prompt. (#339, thanks @maskilx)
    • Trae / Trae CN hooks were rewritten to the six events TRAE documents; the names installed before never fired. Turn on global hooks in Trae's settings. Trae CN is recognised by its real bundle, and later turns are no longer dropped. (#341, thanks @duyinghua; #334, thanks @CXH888888)
    • Codex will ask you to review five new hooks once in /hooks (PreCompact, PostCompact, SubagentStart, SubagentStop, Interrupt).

    Docs

    • Both READMEs rewritten: the full 30+ tool list with an animated mascot for every tool, setup notes, where each integration installs, a privacy note, and new screenshots rendered from the real UI.

    中文

    新功能

    • 支持 OpenCode 2。 OpenCode 2 整体换了插件 API,原插件在 v2 下根本不会加载。现在同一个插件文件同时支持 1.x(server())和 2.x(setup()),事件、审批和提问都按正式版 v2 API 适配。(#332,感谢 @BrikerMan)
    • Claude 套餐额度(可选开启)。 打开「显示 Claude 套餐额度」后,展开面板底部会显示和 /usage 一样的 5 小时 / 每周窗口:迷你进度条、百分比、重置倒计时。使用你自己的 Claude Code 登录,从不刷新 token;关闭时不读取、不发送任何内容。(#338,感谢 @mutoe)
    • AiWork(GUI 与 CLI/TUI),只读展示。 状态、正在执行的工具和流式回复都会进刘海,无需安装任何东西;审批和作答仍在 AiWork 里完成。(#336,感谢 @x4vierli)
    • Codex 显示它在干什么。 回合进行中显示更细的任务级状态和 Agent 最新的公开输出,SSH 远程同样支持。推理、加密内容、工具结果和子 Agent 消息永远不显示。(#343,感谢 @954708775)
    • 识别 T3 Code。 运行在 T3 Code 下的会话会多一个 T3 Code 标签,点击跳转打开对应的 T3 线程。(#321,感谢 @lapinvert)
    • 展开 / 收起速度滑块,在 设置 → 外观(0.5×–2.0×),任何档位下动画都能被打断。(#298/#337,感谢 @Luthiel 和 @Mrjamedd)

    修复

    • 多会话不再串答案。 答完一个会话的提问卡片后,下一个会话的卡片顶上来时可能拿到你刚给上一个会话的答案。现在每个请求一张独立卡片,对不上的答案直接拒收。(#333,感谢 @moluoyingxiong)
    • 后台子 Agent 运行时,AskUserQuestion 不再被「denied by hook」。 子 Agent 的活动被误当成「已在终端里回答」。(#340/#345,感谢 @seahindeniz 和 @halindrome)
    • Oh My Pi 18.2.x:扩展恢复加载。 OMP 不再导出原生 Ask 渲染器,扩展一加载就抛错,会话、审批和提问都悄悄断了。已安装的扩展会自动升级到 v8。(#346/#347,感谢 @johnpoint 和 @haixing23)
    • 提问卡片出现时不再抢键盘焦点。 之前会吞掉你在编辑器里正在敲的字;现在只有你已经点进刘海时才自动聚焦。(#297,感谢 @Jruesch72)
    • Grok:/resume 后不再出现两张卡片。 之前新会话在 SessionStart 到达前就被合并进旧卡片,旧卡片还一直不消失。(#318,感谢 @nevermorewei;#331)
    • 远程主机:自定义 CLI 会正常安装,不再一直显示 skipped,被跳过时也会写明原因。远程端遵循 $CLAUDE_CONFIG_DIR,远程 Claude 卡片重新显示最近一条回复。(#342,感谢 @SeasonPilot;#271,感谢 @halindrome)
    • iPhone Buddy: 回答不在队首的提问时,答案不再被丢掉。(#333)

    需要注意

    • Google Antigravity 改为只观察。 它的 hook 只能拒绝、不能批准工具调用,刘海上点允许没用,Antigravity 还会再问一遍。现在刘海只显示正在运行的工具,每个决定都交给 Antigravity 自己的弹窗。(#339,感谢 @maskilx)
    • Trae / Trae CN 的 hook 已按 TRAE 官方文档的 6 个事件重写,之前装的事件名从来不会触发。需要在 Trae 设置里打开全局 Hook。Trae CN 按真实包名识别,后续轮次不再被丢掉。(#341,感谢 @duyinghua;#334,感谢 @CXH888888)
    • Codex 会要求你在 /hooks 里审核一次 5 个新 hook(PreCompact、PostCompact、SubagentStart、SubagentStop、Interrupt)。

    文档

    • 中英 README 全面重写:完整的 30+ 工具列表,每个工具都配了吉祥物动图,加入配置说明、各集成安装位置、隐私说明,以及用真实界面渲染的新截图。
  8. 1.0.33

    English

    Fixes

    • Qoder IDE is recognised again after its rename. 1.25.1 renamed the bundle to Qoder IDE.app and its executable from Electron to Qoder; every path CodeIsland identified the IDE by still spelled the old name, so an updated install stopped being detected. Both names are matched now — the rename doesn't reach installs that haven't updated. (#327, thanks @JackThinking)
    • Codex: "Always Allow" on an MCP tool no longer invalidates the entire config.toml. Writing a tools table under a server with no declared transport — the built-in codex_app namespace, say — made Codex reject the whole file, surfacing days later as unrelated settings failing to save. Those calls are now approved in-session and never written. (#328, thanks @ArminStoic)
    • **Codex: MCP approvals land under the *declared* server key, and broken configs are repaired at launch.** __ is the tool-name separator, so a hyphenated server arrives as davinci_resolve and writing that back created a second, transport-less table. CodeIsland now maps it onto the real key, and on launch cleans up configs already broken — touching only tables carrying its own stamp, and re-pointing rather than dropping an approval you granted. (#316, thanks @unaisshemim)
    • iPhone Buddy: an approval or answer from the phone acts on the session whose card you were looking at. The phone always sent the session id; the Mac was discarding it and acting on the head of the queue. A Bluetooth round trip leaves a wide window for another request to arrive first. (#320, thanks @huangfengjing)
    • The "reply complete" placeholder is localized instead of a hardcoded Chinese string. (#322, thanks @erikh3)

    New

    • Herdr pane focus. Click-to-jump focuses the exact live agent pane before raising its hosting terminal, and both jump validation and smart suppression ask Herdr instead of the outer terminal — falling back to ordinary terminal activation when Herdr routing is unavailable or stale. (#239/#323, thanks @erikh3)
    • DeepSeek Harness (DSH). Plugin-native, so there are no shell hooks: the dsh-island cordis plugin forwards DSH's built-in events over the socket and CodeIsland renders them as their own session card. (#317/#315, thanks @cdxiaodong)
    • The question card's session row is a jump target. Click it and the terminal that asked comes to the front, so you can read the conversation before answering — and unlike Skip, the question stays queued and answerable. (#325, thanks @mutoe)
    • The terminal badge names the multiplexer a session runs in. A CLI under tmux inside iTerm2 now reads as both, so several sessions in one terminal window are finally distinguishable. Herdr reads the same way. (#326, thanks @mutoe)

    Docs

    • The Codex hook-review step is finally written down. Codex won't run a hook it hasn't been shown, and says so only in its own TUI (1 hook needs review before it can run.) — which from CodeIsland's side is indistinguishable from Codex not being supported at all. (#324, thanks @nogeek-net)
    • Buddy setup is findable: which switch to use, why macOS asks for both Local Network *and* Bluetooth, and a link to the hardware Buddy build guide that nothing pointed at before. (#318, thanks @nevermorewei)
    • The star-history chart renders again after GitHub's stargazer API restriction left it showing a placeholder. (#319, thanks @FaintFlower)

    Code Island Buddy (iPhone) — ships with the next App Store update, not this one

    • With several sessions the compact Dynamic Island was static on both sides: the leading total only drops after cleanup, and the trailing slot held the literal word "Sessions". It now shows active/total, and its dot shows the most demanding status in the group rather than the featured session's — so an approval waiting in another session is no longer invisible. (#330, thanks @caishengwei)

    中文

    修复

    • Qoder IDE 改名后重新能被识别。 1.25.1 把 bundle 改成 Qoder IDE.app、可执行文件从 Electron 改成 Qoder,而 CodeIsland 用来认这个 IDE 的路径全是旧名字,升级后完全认不出来。现在两个名字都匹配——改名不会自动传播到还没升级的安装。(#327,感谢 @JackThinking)
    • Codex:对 MCP 工具点「Always Allow」不再让整份 config.toml 失效。 往没有声明 transport 的 server 下写 tools 表(比如内置的 codex_app 命名空间)会让 Codex 判定整份配置无效,症状却是几天后某个毫不相干的设置保存不了。这类调用现在只在当前会话内放行,不写盘。(#328,感谢 @ArminStoic)
    • Codex:MCP 授权写到真正声明过的 server key 下面,已写坏的配置启动时自动修复。 __ 是工具名分隔符,带连字符的 server 到我们手上变成 davinci_resolve,照原样写回去会造出第二张没有 transport 的表。现在会映射回真实的 key;启动时清理已经被写坏的配置——只动 CodeIsland 自己盖了注释戳的表,能对应上真实 server 的会改指过去而不是删掉你授过的权。(#316,感谢 @unaisshemim)
    • iPhone Buddy:手机上的批准或作答作用于你当时看着的那张卡片对应的会话。 手机一直在发会话 id,是 Mac 端把它丢掉了、按队列头处理;而蓝牙一个来回留给其它请求插队的窗口相当大。(#320,感谢 @huangfengjing)
    • 「回复完成」占位文案改走本地化,不再是硬编码中文。(#322,感谢 @erikh3)

    新增

    • Herdr 面板精确跳转。 点击跳转会先聚焦到对应的 Agent 面板,再唤起宿主终端;跳转校验和智能通知抑制也改为询问 Herdr 而不是外层终端。Herdr 路由不可用或过期时回落到原有的终端跳转。(#239/#323,感谢 @erikh3)
    • DeepSeek Harness(DSH)。 插件原生运行时,没有 shell hook:由 dsh-island cordis 插件把 DSH 的内置事件转发到 socket,CodeIsland 渲染成独立的会话卡片。(#317/#315,感谢 @cdxiaodong)
    • 提问卡片的会话行可以点击跳转。 点一下就把提问的那个终端唤到前台,可以先读完对话再回答;和 Skip 不同,问题仍然排在队列里、仍然可以回答。(#325,感谢 @mutoe)
    • 终端徽章标出会话所在的复用器。 iTerm2 里跑在 tmux 中的 CLI 两个都显示,同一个终端窗口里的多个会话终于能区分开。Herdr 同理。(#326,感谢 @mutoe)

    文档

    • 终于把 Codex 的 hook review 这一步写下来了。Codex 不会执行没给它过目的 hook,而且只在自己的 TUI 里提示(1 hook needs review before it can run.)——从 CodeIsland 这边看,跟「不支持 Codex」一模一样。(#324,感谢 @nogeek-net)
    • Buddy 的用法能找到了:开关在哪、macOS 为什么会同时要本地网络和蓝牙权限,以及之前没有任何入口的硬件 Buddy 制作指南链接。(#318,感谢 @nevermorewei)
    • star history 图恢复显示;GitHub 限制 stargazer API 之后它一直是一张占位图。(#319,感谢 @FaintFlower)

    Code Island Buddy(iPhone)—— 随下一次 App Store 更新发布,不在本次更新内

    • 多会话时,缩小状态的灵动岛两边都是死的:左边的总数要等回收才减,右边是写死的「会话」二字。现在右边显示 活跃/总数,圆点显示整组里最需要处理的状态而不是主推会话的状态——别的会话里等待批准不再看不见。(#330,感谢 @caishengwei)
  9. 1.0.32

    English

    Performance

    • Idle CPU drops from ~10% to ~1%. A live TimelineView keeps SwiftUI re-running the whole panel layout every display cycle, so a collapsed island with nothing running now holds a static sleeping frame; the 3s running-app enumeration and the 500ms observation poll are gone too (#299, thanks @cbingb666 for the stack sample that made this findable)

    Approval routing

    • Answers now go to the card's own session instead of the head of the queue — with several sessions waiting, an answer could reach the wrong CLI (#308, thanks @halindrome)
    • A dismissed approval no longer silences every later permission request from every session (#309, thanks @halindrome)
    • Fix the approval / question card rendering blank after ~2s on some displays — a very tall transparent panel had its compositing dropped by the macOS 26 WindowServer (#304, thanks @LikeSundayLikeRain)

    New integrations

    • Grok CLI — native $GROK_HOME hooks, with imported Claude/Cursor hook copies suppressed so each event is delivered exactly once (#291, thanks @hyiiiii)
    • Windows, as a community-maintained port under windows/ — C#/WPF, near feature parity, no impact on the macOS build (#275, thanks @feelingsa)
    • Qoder CN (国行 qoderclicn) — process detection, ~/.qoder-cn config root, transcripts, and a one-click installer entry (#289, thanks @someBrown)

    Integration fixes

    • Codex Desktop: restore discovery and lifecycle tracking, keeping app-server, rollout, hook and SQLite channels on one card (#280, thanks @hyiiiii)
    • Antigravity sessions no longer stick on "thinking" — its Stop hook was written in a shape Antigravity silently ignores; existing installs repair automatically
    • CodeBuddy: the boot-time auth notification no longer mints a second, never-updating session card, and a permission prompt shows as waiting instead of spinning (#288/#290, thanks @someBrown)
    • Hermes sessions settle to idle again — its one per-turn hook is now installed, backed by a timeout for daemon-backed agents (#303, thanks @al9000-max)
    • Remote SSH: Codex approval requests now reach the island — the remote installer never registered PermissionRequest (#306, thanks @Em-perseon)
    • OMP: the terminal's native Ask and the island now race — whichever you answer first wins and cancels the other (#264, thanks @haixing23)
    • pi: approving on the island marks the tool call so a co-installed permission-gate can skip its terminal prompt (#286, thanks @cat0825)
    • Cursor Tasks without a foldable transcript path merge or hide via a narrow same-PID parent fallback; mascot and badge always agree on the brand (#296, thanks @zephyr110)
    • Qoder: omit the scalar answer key that its strict AskUserQuestion schema rejects (#300, thanks @ri-char)

    Click-to-jump

    • Reaches Orca worktree terminals (per-terminal switch, so two worktrees of one repo are distinguishable) and Zed's integrated terminal (#302/#307, thanks @chelswcs and @Felictycf)
    • Terminal.app no longer aborts on a tab-less invisible window, which used to skip every later window (#294, thanks @kuznetsov-m)

    Settings & UI

    • Menu-bar icon is now a monochrome template image, per macOS convention — it follows light/dark, menu-bar tint and the pressed state (#313, thanks @RooobinYe)
    • New: Auto-Expand on Approval (on by default). Turn it off and the island stays collapsed on approvals — the sound still plays and the card is one click away (#292, thanks @chris-tim)
    • New: Always-proceed Agents — permission requests from listed agents are approved without a card, for CLIs already running in their own Turbo/YOLO mode (#283, thanks @fajarnuha)
    • Sound behaviour is now testable, and pinned: a burst of queued approvals chimes once (#312, thanks @halindrome)

    中文

    性能

    • 空闲 CPU 从约 10% 降到约 1%。只要屏幕上还有一个活着的 TimelineView,SwiftUI 就每个显示周期重跑整个面板布局;现在灵动岛收起且无任务时渲染静态睡眠帧,同时去掉 3 秒一次的运行程序枚举和 500 毫秒轮询(#299,感谢 @cbingb666 提供的堆栈采样)

    审批路由

    • 作答现在投递到卡片所属的会话,而不是队列头——多个会话同时等待时,答案可能发给错误的 CLI(#308,感谢 @halindrome)
    • 关掉一张审批卡不再让之后所有会话的权限请求集体静默(#309,感谢 @halindrome)
    • 修复部分屏幕上审批 / 提问卡片约 2 秒后变空白——过高的透明面板被 macOS 26 WindowServer 停止合成(#304,感谢 @LikeSundayLikeRain)

    新增集成

    • Grok CLI——接入 $GROK_HOME 原生 hooks,并抑制 Grok 导入的 Claude/Cursor hook 副本,保证每个事件只投递一次(#291,感谢 @hyiiiii)
    • Windows 支持,作为社区维护的移植放在 windows/ 目录——C#/WPF,功能基本对齐,不影响 macOS 构建(#275,感谢 @feelingsa)
    • Qoder 国行版(qoderclicn)——进程识别、~/.qoder-cn 配置根、transcript 读取,以及设置里一键安装(#289,感谢 @someBrown)

    集成修复

    • Codex Desktop:恢复会话发现与生命周期跟踪,app-server / rollout / hook / SQLite 四条通道归到同一张卡(#280,感谢 @hyiiiii)
    • Antigravity 会话不再卡在「思考中」——它的 Stop hook 之前写成了 Antigravity 会静默忽略的格式,已安装的配置会自动修复(#297)
    • CodeBuddy:启动时的登录通知不再多出一张永不更新的会话卡;权限提示现在显示为「等待批准」而不是一直转圈(#288/#290,感谢 @someBrown)
    • Hermes 会话恢复回到空闲——装上它唯一的每轮 hook,并为守护进程型 agent 加了沉默超时兜底(#303,感谢 @al9000-max)
    • 远程 SSH:Codex 的审批请求终于能到岛上了——远程安装器此前从未注册 PermissionRequest(#306,感谢 @Em-perseon)
    • OMP:终端原生 Ask 与灵动岛现在并行竞速——先答的一端生效并取消另一端(#264,感谢 @haixing23)
    • pi:在岛上批准后会标记该工具调用,共存的 permission-gate 可据此跳过终端里的二次确认(#286,感谢 @cat0825)
    • Cursor Task 在没有可折叠 transcript 路径时,改用收紧的同 PID 父卡兜底来合并 / 隐藏;吉祥物与角标的品牌始终一致(#296,感谢 @zephyr110)
    • Qoder:去掉其严格 AskUserQuestion schema 会拒绝的标量 answer 字段(#300,感谢 @ri-char)

    点击跳转

    • 支持 Orca 的 worktree 终端(按终端精确切换,同一仓库的两个 worktree 可区分)与 Zed 内置终端(#302/#307,感谢 @chelswcs 和 @Felictycf)
    • Terminal.app 不再因为一个无标签页的隐形窗口而中断,之前会导致其后所有窗口都被跳过(#294,感谢 @kuznetsov-m)

    设置与界面

    • 菜单栏图标改为黑白模板图,遵循 macOS 惯例——跟随浅色 / 深色、菜单栏着色与按下状态(#313,感谢 @RooobinYe)
    • 新增「权限请求时自动展开」(默认开启)。关闭后收到审批时灵动岛保持收起——提示音照常,卡片点一下就能打开(#292,感谢 @chris-tim)
    • 新增「免确认的 Agent」——名单内 agent 的权限请求直接放行、不弹卡片,适合本身已开 Turbo/YOLO 模式的 CLI(#283,感谢 @fajarnuha)
    • 提示音行为现在可测试并已加断言:一串排队的审批只响一次(#312,感谢 @halindrome)
  10. 1.0.31

    English

    • ZCode approval buttons — allow / always allow / deny from the island; safely falls back to ZCode's own dialog when CodeIsland isn't running; restart ZCode once after updating (#258, thanks @JamesJian-tech)
    • Support Codex Desktop hosted by ChatGPT.app, with live running/idle state from turn lifecycle events (#267, thanks @Haoo-7); SessionEnd hook timeout capped at upstream's 3s limit (#279, thanks @hexsean)
    • Restore OpenCode plugin for current releases — new v2 events mapped, plugin auto-repairs to the ESM build (#257, thanks @x22x22)
    • Detect Kimi Code CLI under ~/.kimi-code; legacy ~/.kimi still works (#274, thanks @zephyr110)
    • Fold Cursor Tasks under Agent Sub-Sessions (separate / merge / hide) with closed-task tombstones (#262, thanks @zephyr110)
    • Cursor questions no longer stick on "thinking" — waiting card with the question text and an "Answer in Cursor" hint
    • Add Trae CLI Next hooks (~/.trae/cli/hooks.json, TraeX event schema) (#266, thanks @Hayak3)
    • Add Qoder PermissionRequest hooks + Qoder on SSH remote hosts (#272/#273, thanks @ri-char)
    • Honor $CLAUDE_CONFIG_DIR with auto-detection and a Settings override (#269/#270, thanks @halindrome)
    • Fix overnight CPU pegging one core (transcript tailer offset drift; also fixes silently dropped messages on split lines)
    • Fix the island detaching from the notch after display reconfigure / wake
    • Island width slider now works on notched displays
    • iOS companion: English localization + foreground auto-reconnect — arrive with Buddy's next App Store update

    中文

    • ZCode 审批按钮上线——允许 / 始终允许 / 拒绝都能在岛上操作;CodeIsland 未运行时安全回落原生弹窗;升级后需重启一次 ZCode(#258,感谢 @JamesJian-tech)
    • 支持 ChatGPT.app 托管的 Codex Desktop,按 turn 生命周期实时显示运行/空闲(#267,感谢 @Haoo-7);SessionEnd hook 超时按上游 3 秒上限收紧(#279,感谢 @hexsean)
    • 恢复对新版 OpenCode 的插件支持——映射 v2 新事件,插件自动修复为 ESM 版本(#257,感谢 @x22x22)
    • 识别迁移到 ~/.kimi-code 的 Kimi Code CLI,旧路径继续兼容(#274,感谢 @zephyr110)
    • Cursor Task 纳入「Agent 子会话」设置(独立 / 合并 / 隐藏),已结束 Task 不再被复活(#262,感谢 @zephyr110)
    • Cursor 提问不再卡在「思考中」——转为等待态并显示问题与「请到 Cursor 中作答」提示(#265)
    • 新增 Trae CLI Next 支持(~/.trae/cli/hooks.json,TraeX 事件名)(#266,感谢 @Hayak3)
    • 新增 Qoder 审批 hook 及 SSH 远程主机支持(#272/#273,感谢 @ri-char)
    • 支持 $CLAUDE_CONFIG_DIR——自动探测 + 设置项覆盖(#269/#270,感谢 @halindrome)
    • 修复过夜后单核 CPU 满转(transcript tailer 偏移漂移;同时修复分片长行消息静默丢失)(#278)
    • 修复显示器重配置 / 唤醒后灵动岛脱离刘海的问题(#263)
    • 灵动岛宽度滑块在有刘海的屏幕上生效(#268)
    • iOS 配套 app:英文本地化(#260)+ 回前台自动重连(#261)——随 Buddy 下一次 App Store 更新到达
  11. 1.0.30

    English

    • Add ZCode (Z.ai) integration — hooks written silently to ~/.zcode/cli/config.json with a strict event-name whitelist; restart ZCode after enabling (#245, thanks @JamesJian-tech for the plugin-structure intel)
    • Add QoderWork integration — Qoder's standalone desktop assistant, Claude-format hooks in ~/.qoderwork/settings.json; restart QoderWork after enabling
    • Add Traditional Chinese (zh-Hant) localization, hand-tuned Taiwan wording for all 287 strings (#251, thanks @hongyinull)
    • Add Quiet Hours — mute all event sounds inside a configured window (spans midnight); a small moon on the collapsed pill explains the silence
    • Add git branch / worktree indicator on session cards (⎇ branch, ⧉ for linked worktrees) — made for parallel-worktree agent workflows
    • Add Glance completion mode — on completion, light a green dot on the collapsed island instead of expanding; clears the moment you expand (three-way setting: expand / glance / off)
    • Add Claude token-usage footer under the session list — 5-hour and today windows aggregated from local transcripts (no API calls) with a 12-hour activity sparkline and cache-detail tooltip
    • Add Terax terminal click-to-jump (#253, thanks @wangmian0)
    • Complete cursor-cli / qoder-cli routing: dedicated process matching, real project names for Cursor sessions, grouped under their IDEs in the CLI tab; remote cwd filters honor workspace_roots and never drop lifecycle/approval hooks of tracked sessions (#248/#240/#255, thanks @zephyr110)
    • Every CLI row in settings now has an icon — pixel-mascot icons for Kiro & OpenClaw, deterministic monogram tiles for the rest (including custom CLIs)
    • Fix Codex "Always Allow" writing broken Starlark rules for multiline commands — newlines are now escaped, existing broken files need the bad rule removed once (#250/#252, thanks @hexsean)
    • Fix blocking AskUserQuestion cards staying collapsed under Smart Suppress — OMP (and every provider) waits on the island, so the card now always opens (#256, thanks @haixing23)
    • Fix legitimate dot-named repos (.dotfiles, .config) displaying their parent folder's name
    • Fix remote SSH sessions showing the local machine's git branch when directory layouts match
    • Fix zellij-inside-Terax losing precise pane focus on click-to-jump
    • Fix the ZCode installer flipping a user's explicit hooks master switch back on
    • Usage scanning is incremental (per-file byte offsets) — day-long multi-MB transcripts are read once, not on every panel expansion
    • Claude sessions running in $HOME keep model detection; Cursor project-path decoding moved off the render path

    中文

    • 新增 ZCode(智谱 Z.ai)集成——hooks 静默写入 ~/.zcode/cli/config.json,严格事件名白名单防御;勾选后需重启 ZCode 生效(#245,感谢 @JamesJian-tech 提供插件结构情报)
    • 新增 QoderWork 集成——Qoder 生态的独立桌面助手,Claude 格式 hooks 写入 ~/.qoderwork/settings.json;勾选后需重启 QoderWork(#249)
    • 新增繁体中文本地化,287 条文案逐条采用台湾用语校对(#251,感谢 @hongyinull)
    • 新增「静默时段」——设定时间段内静音全部音效(支持跨午夜);静默期间收起的岛上会显示小月亮说明为何无声
    • 会话卡片新增 Git 分支 / worktree 指示器(⎇ 分支名,linked worktree 附 ⧉ 标记)——为并行 worktree 跑多 agent 的工作流而生
    • 新增 Glance 完成模式——任务完成时不弹面板,只在收起的岛上亮起绿点,展开即熄灭(完成提醒三选一:展开 / 绿点 / 无动作)
    • 会话列表底部新增 Claude 用量统计——本地 transcript 聚合 5 小时窗口与今日用量(零网络请求),附 12 小时活动迷你柱状图与缓存明细悬浮提示
    • 新增 Terax 终端点击跳转(#253,感谢 @wangmian0)
    • 补全 cursor-cli / qoder-cli 路由:独立进程匹配、Cursor 会话显示真实项目名、CLI 分组归入所属 IDE;远程目录过滤识别 workspace_roots,且不再误拦已跟踪会话的生命周期/审批 hook(#248/#240/#255,感谢 @zephyr110)
    • 设置里每个 CLI 行都有图标了——Kiro 与 OpenClaw 使用像素吉祥物图标,其余(含自定义 CLI)使用稳定配色的首字母图标
    • 修复 Codex「始终允许」对多行命令写出损坏的 Starlark 规则——换行符现已转义,已损坏的规则文件需手动删除坏段一次(#250/#252,感谢 @hexsean)
    • 修复智能抑制下阻塞式 AskUserQuestion 卡片不展开——OMP(及所有 provider)都在等岛上作答,卡片现在始终弹出(#256,感谢 @haixing23)
    • 修复合法的 dot 开头仓库(.dotfiles、.config)显示成父目录名的问题
    • 修复远程 SSH 会话在两端目录结构相同时显示本机 Git 分支的问题
    • 修复 Terax 内运行 zellij 时点击跳转丢失精确 pane 聚焦的问题
    • 修复 ZCode 安装器会把用户显式关闭的 hooks 总开关重新打开的问题
    • 用量扫描改为增量式(按文件记录字节偏移)——日级长会话的大 transcript 只读一次,不再每次展开面板重读
    • 在 $HOME 下直接运行的 Claude 会话保留模型识别;Cursor 项目路径解码移出渲染路径
  12. 1.0.29

    New integrations 🦞

    • OpenClaw — auto-installed TypeScript plugin pack with the new Molty space-lobster mascot
    • Claude Code Desktop — local Code-tab sessions recognized, tagged, and click-to-jump opens the right desktop window
    • Kiro gets its own pixel-ghost mascot; settings gallery completed

    Answer agent questions from the island

    • The OMP / pi ask tool now pops the island's question UI — answer on your Mac (or iPhone/Watch) and it flows back to the agent; skip to fall through to the terminal

    Quality of life

    • Per-host working-directory filter for shared remote SSH accounts
    • The island auto-dodges Bartender & friends on external screens
    • Gentler hover: quick pass-throughs no longer pop the panel; width slider steps by 1% (#208, thanks @Lucker-QY)
    • Approval buttons show their enabled keyboard shortcuts

    Mascot motion polish — all 18 characters: irregular natural blinks, asymmetric breathing, dream twitches, humanized typing with "reading the output" pauses, de-synced float rhythms

    Performance — idle CPU down ~38% (8.5% → 5.3%): every mascot's frame loop now pauses when hidden/asleep, idle scenes render at 8fps, wake no longer replays missed frames

    Fixes

    • launchd daemons (Hermes gateway) no longer SIGTERM'd in a restart loop
    • Watch companion crash-on-launch loop hardened (#246; ships with the next App Store companion build)
    • Remote SSH install no longer wipes user-authored hooks
    • cursor-cli / qoder-cli mascot mapping (#248, thanks @zephyr110)
    • No more Bluetooth permission prompt for users who never enabled the iPhone companion

    Plus everything since v1.0.28: native iPad companion layout, German localization, Google Antigravity approval details, host-GUI-client jump, pi/omp mascot setting.

    新集成 🦞

    • OpenClaw——自动安装插件包,附全新太空龙虾吉祥物 Molty(#235)
    • Claude Code 桌面版——本地 Code 会话可识别、点击跳转到对应窗口(#211)
    • Kiro 拥有专属像素幽灵吉祥物;设置图鉴补全

    在岛上回答 agent 提问

    • OMP / pi 的 ask 提问接入灵动岛问答 UI——在 Mac(或 iPhone/手表)作答后自动回填给 agent,跳过则回落终端(#244)

    体验优化

    • 远程 SSH 主机按工作目录过滤会话(共享账号隐私)(#240)
    • 外接屏自动避开 Bartender 等菜单栏图标(#219)
    • hover 更跟手:快速划过不再误弹面板;宽度滑块 1% 步长(#208,感谢 @Lucker-QY)
    • 审批按钮显示已启用的快捷键

    吉祥物动画质感——全部 18 个角色:不规则眨眼、非对称呼吸、睡梦小动作、拟人打字停顿、漂浮节奏去同步(#15)

    性能——空闲 CPU 降低约 38%(8.5% → 5.3%):所有吉祥物帧循环在隐藏/睡眠时暂停、空闲动画 8fps、唤醒不回放积压帧

    修复

    • launchd 守护进程(Hermes gateway)不再被反复 SIGTERM(#243)
    • 手表端启动崩溃循环加固(#246,随下次 App Store companion 版本生效)
    • 远程 SSH 不再覆盖用户自定义 hooks(#242)
    • cursor-cli / qoder-cli 吉祥物映射(#248,感谢 @zephyr110)
    • 未启用 iPhone 配件不再弹蓝牙权限

    以及 v1.0.28 以来的全部改进:iPad 原生布局(#238)、德语本地化(#234)、Google Antigravity 审批详情(#233)、宿主客户端跳转(#237)、pi/omp 吉祥物设置(#228)。

  13. 1.0.28

    English

    • Add Code Island Buddy companion app for iPhone & Apple Watch — Live Activity / Dynamic Island / Lock Screen / StandBy, with opt-in Mac broadcasting (off by default)
    • Add support for Pi / Oh My Pi sessions with a dedicated mascot
    • Add support for Google Antigravity (Gemini-based) hooks as a new agent source
    • Detect Superset terminal sessions (window-level focus; Superset exposes no per-tab focus API)
    • Surface Codex Desktop plan-mode user-input questions as interactive prompts
    • Fix Hermes hooks never firing at runtime — install to ~/.hermes/config.yaml (where Hermes actually reads) instead of settings.json
    • Fix "Always allow" not sticking for MCP tools, which kept re-prompting the same approval
    • Fix Claude Code shown with the Cursor icon when run inside Cursor's integrated terminal
    • Fix the approval panel not auto-dismissing after you approve a request in the terminal
    • Fix the global shortcut silently breaking after switching apps — now uses a Carbon hotkey that needs no Accessibility permission
    • Fix CPU spiking to 100% after sleep/wake by pausing the idle mascot animation while hidden or asleep
    • Fix remote SSH reconnection failing (ssh exited 255) by clearing the stale forwarding socket first
    • Fix Warp tab activation across multiple windows and tabs

    中文

    • 新增 Code Island Buddy iPhone / Apple Watch 伴侣 App——Live Activity / 灵动岛 / 锁屏 / 待机显示,Mac 端可选开启镜像广播(默认关闭)
    • 新增 Pi / Oh My Pi 会话支持,配专属吉祥物
    • 新增 Google Antigravity(基于 Gemini)hooks 支持,作为独立 agent 来源
    • 识别 Superset 终端会话(窗口级聚焦;Superset 未提供单 tab 聚焦接口)
    • 把 Codex 桌面版 plan 模式的用户询问渲染成可交互弹窗
    • 修复 Hermes hooks 运行时不触发——改为写入 Hermes 真正读取的 ~/.hermes/config.yaml 而非 settings.json
    • 修复 MCP 工具"始终允许"不生效、同一审批反复弹出
    • 修复在 Cursor 集成终端里运行 Claude Code 被错误显示为 Cursor 图标
    • 修复在终端里批准后审批面板不自动消失
    • 修复全局快捷键切换应用后静默失效——改用免辅助功能权限的 Carbon 热键
    • 修复休眠唤醒后 CPU 飙到 100%——隐藏或休眠时暂停空闲吉祥物动画
    • 修复 remote SSH 重连失败(ssh exited 255)——连接前先清理残留转发 socket
    • 修复 Warp 跨多窗口 / 标签页的标签激活
  14. 1.0.27

    中文

    • 修复 Cursor / Trae / Qoder / Factory 点击灵动岛跳到"最近用过的窗口"而不是正在对话的那个——现在按项目目录匹配对应 workspace 窗口
    • SSH 远程主机也会安装自定义 CLI 的 hooks(claude / nested 格式)——此前远程只配置内置 CLI

    English

    • Fix Cursor / Trae / Qoder / Factory click-to-jump raising the most-recently-used window instead of the one running the clicked session — now matches the workspace window by project folder
    • Install custom CLI hooks on SSH remote hosts too (claude / nested hook formats) — previously only the built-in CLIs were configured remotely
  15. 1.0.26

    中文

    • 新增 pi / Oh My Pi (OMP) 编码 agent 集成
    • 远程 SSH socket 按用户隔离(/tmp/codeisland-<uid>.sock),修复多用户共享主机上的事件串话
    • 修复 SSH 隧道在 ControlMaster 多路复用下 ssh -N 立即退出、被误报为 ssh exited (0) 的问题
    • 修复 iTerm2 全屏 / 跨 Space 时点击会话跳到错误窗口

    English

    • Add pi / Oh My Pi (OMP) coding agent integration
    • Isolate the remote SSH socket per user to fix event cross-talk on shared hosts
    • Fix the SSH tunnel being misreported as ssh exited (0) under ControlMaster multiplexing
    • Fix iTerm2 click-to-jump landing on the wrong fullscreen / cross-Space window
  16. 1.0.25

    English

    New tools & features

    • Cline support — the VSCode-extension agent is now tracked end to end (file-based hooks, click to jump back to VSCode)
    • Zellij & Kaku multiplexers — active-pane detection for jump-back and visibility suppression; tmux pane resolution hardened and pane hints persisted across app restarts
    • Buddy (ESP32) overhaul — Bluetooth pairing state machine, priority write queue, extended protocol (model / stats / subagent / event / tool-history / pairing), and recovery from CoreBluetooth authorization changes; signing script gains an ad-hoc fallback for local Bluetooth testing
    • Dynamic Island width is now adjustable on real notch displays too, not just external screens

    Fixes

    • AskUserQuestion in plan mode — fix the undefined is not an object (evaluating 'H.map') crash and answers coming back empty; the answer key now matches Claude Code's question-text lookup, so plan-mode questions no longer re-prompt in a loop
    • Parallel tool calls auto-denied — batches like "Read 4 files" that share a tool_use_id are no longer collapsed as duplicates and denied; each request now waits for its own decision
    • Respect user-deleted hook events — auto-repair no longer re-adds Codex (or other CLI) hook events you removed by hand; only a fully-absent or stale config is repaired
    • Hermes on SSH remotes — the remote install script now configures Hermes too, so SSH-monitored Hermes sessions emit events
    • Codex — clean up the legacy codex_hooks config key, defer to Codex auto-review mode instead of popping an approval card, and persist always-allow rules
    • Permissions not blanket-denied — activity events (Stop, or a parallel PostToolUse from Notion/MCP plugins) no longer drain a pending approval before you can react
    • Cursor sub-agents — parallel sub-agent processes collapse onto a single session card instead of flooding 10+
    • Default mascot is honored whenever no session is actively working, not just when there are zero sessions
    • WezTerm-family pane resolution by cli tty, complete IDE responses for flat-hook tools, and preserved remote OpenCode host identity

    中文

    新增工具与功能

    • Cline 支持 — VSCode 扩展形态的 agent 现在可全程跟踪(基于文件的 hooks,点击跳回 VSCode)
    • Zellij & Kaku 多路复用器 — 识别活跃 pane 用于跳转和可见性抑制;tmux pane 解析加固,pane 线索在 app 重启后保留
    • Buddy(ESP32)大改 — 蓝牙配对状态机、优先级写队列、扩展协议(model / stats / subagent / event / 工具历史 / 配对),以及从 CoreBluetooth 授权变化中恢复;签名脚本新增 ad-hoc fallback 便于本地测蓝牙
    • 灵动岛宽度 现在在真实刘海屏上也能调节,不再只对外接屏生效

    修复

    • plan mode 下的 AskUserQuestion — 修复 undefined is not an object (evaluating 'H.map') 崩溃及回答变空;answer key 改为与 Claude Code 的 question-text 查找一致,plan mode 不再循环重弹问题
    • 并行工具调用被自动拒绝 — 像"Read 4 个文件"这种共享 tool_use_id 的批量请求不再被当成重复项合并拒绝,每个请求各自等待你的决定
    • 尊重用户删除的 hook event — auto-repair 不再把你手动删掉的 Codex(或其他 CLI)hook event 补回;只有完全缺失或损坏的配置才会被修复
    • SSH 远程的 Hermes — 远程安装脚本现在也会配置 Hermes,SSH 监控的 Hermes 会话能正常上报事件
    • Codex — 清理旧版 codex_hooks 配置项、自动审查模式下不再弹审批卡、持久化 always-allow 规则
    • 权限不再被一锅端拒绝 — 活动事件(Stop,或 Notion/MCP 插件并行的 PostToolUse)不再在你反应过来之前把待审批清空
    • Cursor 子 agent — 并行子 agent 进程合并到一张会话卡,不再刷出 10+ 张
    • 默认角色 — 只要没有会话在实际工作就会生效,而不仅是完全没有会话时
    • WezTerm 系终端按 cli tty 解析 pane、flat-hook 工具的 IDE 响应补全、保留远程 OpenCode 主机标识

    Migration notes

    升级后建议到 设置 → Hooks → Reinstall Hooks 一次,让新版 codeisland-bridge 与 hook 配置(Cline / 远程 Hermes / Codex 调整等)落到位生效。Codex 用户若曾手动精简过 ~/.codex/hooks.json 的 event,本版起 auto-repair 会尊重你的删除、不再补回。

  17. 1.0.24

    English

    • Add Wear OS Buddy companion app — approve / deny / skip directly from your watch over BLE, full Bash command preview on incoming approvals (#144, PR by @liushaoxiong10)
    • Distinguish cursor-agent and qodercli from the desktop IDEs they share config files with — sessions render as "Cursor CLI" / "Qoder CLI" and click-jumps go to the host terminal instead of the IDE
    • Add Settings → Sessions → "Plugin Sub-Sessions" (separate / merge / hide) for events fired by plugins running inside another agent like omo inside OpenCode
    • Register Codex's PermissionRequest hook so shell-escalation / managed-network approvals trigger the panel + sound instead of the session sitting silently in "running" forever
    • Add Settings → Behavior → "Auto-Expand Panel on Agent Completion" toggle (default on, preserves current behavior)
    • Prefer ~/.config/opencode/opencode.jsonc over opencode.json so OpenCode users on the recommended format no longer see CodeIsland resurrect a sibling .json on every install / repair pass
    • Show "+N Sub" badge on session cards with active subagents; hover any subagent icon to see agent type + current tool
    • Empty default for the auto-approve tools list — every tool call now flows through the approval path; the previous default silently approved 9 internal tools (TaskCreate / TaskUpdate / TodoWrite / EnterPlanMode etc.) which hid those calls
    • Fix App hangs silently on launch — detectClaudeVersion / ConfigInstaller.install / verifyAndRepair / TerminalActivator.runProcess no longer block the main thread; all subprocess waits now have hard timeouts (5–10s) and the slow paths dispatch off-main
    • Harden UserPromptSubmit prompt extraction (nested payload/data containers, userPrompt / text fallback fields, preserve leading/trailing whitespace) and add a 100-entry hook event ring buffer to diagnostics export — future "prompt not showing" reports can be triaged from one zip
    • Fix update flow leaving "Update Failed" banner after the "Up to date" alert (#137 → PR #138 by @Drswith)
    • Skip Sparkle initialization in DEBUG builds without a bundle ID so Xcode runs no longer crash on launch (#133, PR by @jerry0804)
    • Polish Turkish translation for stylistic consistency (#135, PR by @Ardakilic)

    中文

    • 新增 Wear OS Buddy 手表伴侣 — 通过 BLE 直接在手表上 approve / deny / skip 审批,待审批时显示完整的 Bash 命令预览 (#144, PR by @liushaoxiong10)
    • 区分 cursor-agent / qodercli 与对应的桌面 IDE — 会话显示为 "Cursor CLI" / "Qoder CLI",点击跳转到承载它的终端而不是桌面 IDE
    • 新增 设置 → 会话 → "插件子会话" 三选一(独立 / 合并到主会话 / 隐藏),处理 OpenCode 里 omo 这类插件触发的 hook 事件
    • 注册 Codex 的 PermissionRequest hook — shell 提权 / 网络访问审批现在会触发审批面板和声音,而不是默默卡在 "running"
    • 新增 设置 → 行为 → "Agent 完成时自动展开面板" 开关(默认开,保持原行为)
    • 当 ~/.config/opencode/opencode.jsonc 存在时优先写入它 — OpenCode 推荐用 .jsonc 格式,主端不再每次安装都重新创建一个 .json 兄弟文件
    • session 卡片上显示 "+N Sub" 标签提示有 N 个活跃 subagent,hover 任意 subagent icon 查看 agent type + 当前工具
    • 自动批准工具列表默认清空 — 每次工具调用都走审批流程;之前默认会静默批准 9 个内部工具(TaskCreate / TaskUpdate / TodoWrite / EnterPlanMode 等),那些调用在面板上看不到
    • 修复启动卡死 — detectClaudeVersion / ConfigInstaller.install / verifyAndRepair / TerminalActivator.runProcess 不再阻塞主线程,所有子进程等待都有 5–10s 硬超时,慢路径都搬到后台
    • 加强 UserPromptSubmit 提示词提取(支持 nested payload/data 容器、新增 userPrompt / text 字段 fallback、保留代码片段前后空格),并在 diagnostics 导出里加 100 条 hook event ring buffer — 后续"提问不展示"类问题可以从一个 zip 里直接定位
    • 修复 Sparkle 检查更新流程:在已显示"已是最新版本"后又弹"更新失败"的 bug (#137 → PR #138 by @Drswith)
    • DEBUG 模式下没 bundle ID 时跳过 Sparkle 初始化,避免 Xcode 直接跑时启动崩溃 (#133, PR by @jerry0804)
    • 润色土耳其语翻译(统一 Title Case + 修正 "ERTELE" 误译)(#135, PR by @Ardakilic)

    Migration notes

    升级后请到 设置 → Hooks → Reinstall Hooks 一次,让新版 codeisland-bridge 落到 ~/.codeisland/ —— 这样 #123 plugin sub-sessions / #134 cursor-cli + qoder-cli 区分 / #145 Codex permission hook / #103 增强诊断 才会生效。已显式调过自动批准列表的用户不受 default 清空影响(UserDefaults register 不会覆盖已 set 的值)。

  18. 1.0.23

    English

    • Add ESP32 BLE companion device — port mascot animations to a real desk pet
    • Make auto-approve tools configurable in Settings; default no longer auto-approves ExitPlanMode so plan-mode exit prompts an approval dialog
    • Fix TraeCli YAML hook injection corruption on mixed indentation; preserve user comments via surgical merge
    • Respect $CODEX_HOME in codex auto-config (local + ssh)
    • Add WorkBuddy bundle ID for one-click jump from CodeIsland
    • Fix remote SSH sessions being force-flipped to idle on local timeout
    • Fix Ghostty click-to-jump no-op via System Events Accessibility fallback
    • Fix Terminal.app: minimized window not raising + multi-tab clicks all jumping to same tab (root cause: AppleScript tty variable shadowed Terminal.app's tab tty property)
    • Add configurable cwd-substring blocklist for hook events — filter out background plugins like claude-mem
    • Add webhook forwarding for hook events to external HTTP endpoints — pipe agent activity into DingTalk / Lark / Slack receivers
    • Add minimum Kiro CLI support — install hooks into ~/.kiro/agents/codeisland.json (launch with kiro --agent codeisland)

    中文

    • 新增 ESP32 BLE 桌面伴侣设备——把吉祥物动画移植到实体小屏
    • "自动批准工具"可在设置里逐项配置,默认不再自动批准 ExitPlanMode,退出 plan 模式会弹审批
    • 修复 TraeCli YAML 在混合缩进下 hook 注入损坏的问题,并通过 surgical 合并保留用户注释
    • codex 自动配置遵循 $CODEX_HOME(本地和 ssh 都生效)
    • 新增 WorkBuddy 一键跳转
    • 修复远程 SSH 任务被本地 timeout 误判完成
    • 修复 Ghostty 点击灵动岛无反应——加 System Events Accessibility 兜底
    • 修复 Terminal.app 最小化无法打开 + 多终端点哪个都跳同一 tab(真 root cause:AppleScript 局部变量 tty 跟 tab property tty 同名导致 Strategy 1 静默失效)
    • 设置里新增"忽略指定路径的 Hook"——按子串过滤 claude-mem 等后台插件触发的事件
    • 设置里新增"Webhook 转发"——hook 事件以 JSON POST 到外部端点,方便对接钉钉/飞书/Slack
    • 新增 Kiro CLI 最小可用支持——hooks 写到 ~/.kiro/agents/codeisland.json,启动用 kiro --agent codeisland
  19. 1.0.22

    English

    New

    • Sparkle-based auto-update — CodeIsland now self-updates via the Sparkle 2 framework with ed25519 signed appcast. No more opening GitHub Releases by hand; the About page tells you when an update is ready. (Users installed via Homebrew stay managed by brew upgrade.) From v1.0.22 onwards, Sparkle is in charge.
    • Session monitoring engine overhaul — four deep improvements after studying the space for a week:
    • Precise tool_use_id matching — Claude's PreToolUse / PermissionRequest / PostToolUse now pair by id, fixing a real bug where concurrent tool invocations could cancel each other's pending approval in the same session.
    • Warp terminal: exact pane jumping — reads Warp's SQLite state to find the exact tab running your session, then sends ⌘<n> via a CGEvent to switch. Handles firmlink path normalization (/tmp ↔ /private/tmp) and prefers active > focused > newest when multiple panes match.
    • Live JSONL tailing for Claude — streams the transcript file via DispatchSource.makeFileSystemObjectSource + inode change detection. AI output now shows up in the island panel as it streams, not only when the Stop hook fires.
    • Codex Desktop (app-server) support — subscribes to Codex.app's JSON-RPC app-server so thread lifecycle and waitingOnApproval states render on the island for users of the Codex desktop app, not only the CLI.
    • Click-to-jump on approval card (#108 by @alvis-HaoH) — clicking the permission approval jumps to the terminal tab and auto-collapses after the jump validates.
    • pi-mono support — pi-mono, the 38k★ TS-plugin-based Claude client.
    • Third-party CLI extensibility + bridge hardening — hookEventName alias and nested payload.session_id compatibility in the bridge; non-blocking alarm window tightened from 8s to 4s; Hermes/Gemini events no longer get dropped on the floor.
    • Default mascot setting + smart-suppress in IDE terminals (#102 #112) — pick any mascot as the idle indicator; smart-suppress now applies when a recognized IDE terminal is frontmost.
    • Performance benchmark guardrails — micro-benchmarks for scanLines, HookEvent.init, drainMessages, WarpPaneResolver — CI will catch hot-path regressions now. Transcript tailer got quickTypeProbe byte-prefilter: real-world mixed transcript 11.76ms → 5.49ms (-53%).

    Bug fixes

    • #100 — Approval/question cards rendered fully transparent on macOS 26 until a hover forced a redraw; also "vanished when mouse approached the notch, reappeared near the buttons." Root cause: compositingGroup + blur in BlurFadeModifier's identity state triggered a macOS 26 compositor regression where the offscreen layer never fully rendered. Dropped the compositingGroup; blur + opacity now apply directly without the offscreen buffer.
    • #104 — Returning from a fullscreen space to a non-fullscreen one could leave the island hidden for up to 1.5s (or longer if fullscreen detection misreported). fullscreenLatch now clears immediately on space change when the new space is not fullscreen.
    • #116 — Clicking a Terminal.app session in the notch only shook the card because activateTerminalApp relied on a custom title that most users never set. Rewritten as a single AppleScript that tries tty → auto tab name → custom title → deminiaturize-first-minimized fallback.
    • #103 — Qwen hook PermissionRequest hung until Qwen's internal timeout because the installer was omitting the per-entry timeout field on Claude-style hook writes. Now emits the correct ms-unit timeouts (86400000 for PermissionRequest, 5000 otherwise).
    • #105 #106 #107 #119 — Hook installer used to destructively reformat ~/.claude/settings.json / ~/.opencode/opencode.json (stripped comments, reordered keys, escaped slashes). Now preserves user formatting, keys, and comments across install/uninstall.
    • Copilot — the hook installer no longer clobbers a user-set Copilot version field.
    • Compiler warnings — SessionSnapshot, ChatMessage, ToolHistoryEntry, SubagentState, AgentStatus now declare Sendable; Codex supervisor bundle id marked nonisolated. Release build is now 0-warning.

    中文

    新功能

    • 基于 Sparkle 的自动更新 — CodeIsland 现在通过 Sparkle 2 框架实现自动更新,appcast 由 ed25519 签名。不用再去 GitHub Releases 手动下载,About 页会在有新版本时提示。(Homebrew 安装的版本继续交给 brew upgrade 管理。)从 v1.0.22 开始,Sparkle 接管后续升级。
    • 会话监测引擎全面升级 — 一周深挖后做了四项改进:
    • tool_use_id 精准配对 — Claude 的 PreToolUse / PermissionRequest / PostToolUse 按 id 配对。修了一个真 bug:多工具并发时 PostToolUse 会误删同 session 其他待审批请求。
    • Warp 终端精准 pane 跳转 — 读 Warp SQLite 找到运行当前会话的确切 tab,然后 CGEvent 发 ⌘<n> 切过去。处理了 firmlink 路径归一化(/tmp ↔ /private/tmp),多 pane 匹配按 active > focused > newest 排序。
    • Claude 会话 JSONL 实时 tail — 用 DispatchSource.makeFileSystemObjectSource + inode 换盘检测增量读 transcript 文件。流式输出实时显示在岛上面板,不用等 Stop 事件触发。
    • Codex Desktop(app-server)支持 — 订阅 Codex.app 的 JSON-RPC app-server,thread 生命周期和 waitingOnApproval 状态都能精确映射到岛。Codex 桌面 app 用户(不只是 CLI)也能享受权限审批识别。
    • 审批卡片点击跳转 (#108, by @alvis-HaoH) — 点权限审批跳转到终端 tab,跳转验证成功后自动收起岛。
    • pi-mono 支持 — pi-mono 是 38k★ 的 TS 插件式 Claude 客户端。
    • 第三方 CLI 扩展性 + bridge 加固 — bridge 兼容 hookEventName 别名和嵌套 payload.session_id;非阻塞 alarm 窗口从 8s 收紧到 4s;Hermes/Gemini 等 fork CLI 的 hook 事件不再静默丢弃。
    • 默认角色设置 + IDE 终端智能抑制 (#102 #112) — 无会话时可以选任意 mascot 作为岛上默认角色;智能抑制现在对所有被识别为 IDE 终端的前台 app 生效。
    • 性能 benchmark 回归闸 — 为 scanLines / HookEvent.init / drainMessages / WarpPaneResolver 加了微基准,CI 会抓热路径回归。Transcript tailer 新增 quickTypeProbe 字节预筛:真实混合场景 11.76ms → 5.49ms (-53%)。

    Bug 修复

    • #100 — macOS 26 上权限/询问卡片一弹出就透明,hover 才显形;而且"鼠标移向刘海 → 消失、移回按钮位置 → 重现"。根因是 BlurFadeModifier 在 identity 态里用了 compositingGroup + blur,macOS 26 的 SwiftUI 合成器对这个组合有回归:offscreen 层的渲染结果异常,直到某个 invalidation 触发重新合成。去掉了 compositingGroup,blur+opacity 直接作用在子视图上,不再触发合成器 bug。
    • #104 — 从全屏 space 切回非全屏 space 时,岛可能被隐藏最长 1.5s(全屏检测误报时更久)。fullscreenLatch 现在在 space 切换时立即清除,不再等 1.5s poller。
    • #116 — Terminal.app session 点击跳转只看到卡片抖一下。原因:activateTerminalApp 依赖大多数用户从没设过的 custom title,匹配不到就什么都不干。重写为单个 AppleScript:tty → auto tab name → custom title → deminiaturize 最后一个兜底。
    • #103 — Qwen 的 hook PermissionRequest 会挂起直到 Qwen 内部超时。原因:installer 在写 Claude 风格 hook entry 时漏了 per-entry 的 timeout 字段,Qwen 靠这个控制每条 hook 的超时。现在正确填 ms 单位超时(PermissionRequest 86400000 = 24h,其他 5000 = 5s)。
    • #105 #106 #107 #119 — Hook installer 之前会破坏性重排 ~/.claude/settings.json / ~/.opencode/opencode.json(删注释、改字段顺序、escape 反斜杠)。现在 install/uninstall 全过程保留用户格式、字段顺序和注释。
    • Copilot — hook installer 不再覆盖用户手动设置的 Copilot version 字段。
    • 编译警告清理 — SessionSnapshot / ChatMessage / ToolHistoryEntry / SubagentState / AgentStatus 全部声明 Sendable;Codex supervisor bundle id 标 nonisolated。Release build 0 warning。

    Thanks to contributors: @alvis-HaoH @Hatiaa and everyone who opened issues or shared reproduction steps this cycle.

  20. 1.0.21

    English

    New

    • TraeCli support — 11th supported CLI, with YAML config merge / remove that preserves user-authored blocks (PR #98)
    • Inline approval in session list — click an approval on the session list and Allow / Always / Deny / Details stay right there without stealing the surface (PR #98)
    • Dismiss button on permission prompts — temporarily collapse the card; the same session's next permission request brings it back (PR #93)
    • Auto-reconnect for remote SSH — hosts marked "Auto Connect" now retry with 5/15/45/120/300s backoff when the tunnel drops
    • Per-host SSH_AUTH_SOCK — optional field in the Add Host form, lets 1Password / Bitwarden / Secretive agents sign the handshake without launchctl setenv hacks
    • Japanese + Korean localization (PR #72) — now en / zh / ja / ko / tr
    • PID ancestry tracking for sh -c wrappers — hooks executed through a transient shell now correctly attribute to the long-lived CLI process
    • Event normalization for snake_case hooks — TraeCli/Coco style pre_tool_use, session_start, permission_request, etc. map to canonical names
    • dev-hot-restart script — scripts/dev-hot-restart.sh watches Sources/Tests, rebuilds on change, and only restarts the running app if the build succeeds (PR #94)

    Bug fixes

    • #89 — Stop clobbering user opencode.json: when the file is unparseable (comments, typos, non-object root), the installer now bails out instead of overwriting it with a 2-key minimal config. First write drops a timestamped .codeisland.bak.* alongside the original.
    • #92 — autoScreenPoller dropped from 1s to 5s; CGWindowListCopyWindowInfo was a measurable Energy Impact hit and NSWorkspace notifications already cover the common paths
    • #92 — SSH stderr readability handler is now cleared on ssh process exit; the leaked handler was pinning CPU at 100% after tunnel drops (reported by @jiz4oh)
    • #95 — Source inference from process ancestry when a hook arrives without --source. omo-triggered OpenCode events no longer fall back to "claude" and no longer double-up with the real OpenCode session (thanks @edso404 for the full trace)
    • #101 — Fenced code blocks in chat previews now keep their newlines and the language identifier no longer leaks into the code body (thanks @senshinya for the root cause)
    • Infer source now covers all supported CLIs, not just the one named by --source

    Chore / docs

    • .gitignore reorganized with categories; *.log / *.tmp globs (PR #96)
    • README intro and About tagline bumped to "11 tools" everywhere
    • Trailing whitespace cleanup in ConfigInstaller
    • Post-merge: hardcoded Chinese strings in the inline approval UI localized via L10n
    • dev-hot-restart.sh SIGTERM-first with SIGKILL fallback, absolute --app-path preserved, seen counter initialized from wc -c

    中文

    新功能

    • TraeCli 支持 — 第 11 个支持的 CLI,YAML 配置 merge / remove 保留用户原有块 (PR #98)
    • 会话列表内 inline 审批 — 会话卡片上直接 Allow / Always / Deny / 详情,不再抢占面板 (PR #98)
    • 权限请求忽略按钮 — 暂时收起卡片,同会话下次权限请求会重新弹出 (PR #93)
    • 远程 SSH 自动重连 — 勾了"Auto Connect"的 host 断开后按 5/15/45/120/300 秒退避重连
    • 每主机 SSH_AUTH_SOCK — Add Host 表单可选项,1Password / Bitwarden / Secretive 类 SSH agent 不再需要 launchctl setenv hack
    • 日语 + 韩语本地化 (PR #72) — 现在覆盖 en / zh / ja / ko / tr
    • PID 沿 ancestry 追踪 — 通过 sh -c 启动的 hook 现在能正确归到长生命周期 CLI 进程
    • snake_case hook 事件归一化 — TraeCli/Coco 的 pre_tool_use / session_start / permission_request 等统一映射到标准事件名
    • dev-hot-restart 脚本 — scripts/dev-hot-restart.sh 监听 Sources/Tests,构建成功才重启运行中的 app (PR #94)

    Bug 修复

    • #89 — 不再覆盖用户 opencode.json:文件含注释/语法错误/根不是 object 时,installer 直接 bail out,不再把整个文件换成 2-key 最小 config。首次写入前会留一份 .codeisland.bak.<时间戳> 备份
    • #92 — autoScreenPoller 1s → 5s;CGWindowListCopyWindowInfo 对 Energy Impact 可见,NSWorkspace 通知已经覆盖主场景
    • #92 — ssh 子进程退出时清理 stderr readability handler;之前 handler 没清会在关闭 FD 上被紧密回调,pin 住 100% CPU (@jiz4oh 反馈)
    • #95 — hook 不带 --source 时沿进程 ancestry 推断 source。omo 触发的 OpenCode 事件不再误落回 "claude",也不再和真实 OpenCode 会话双显 (感谢 @edso404 的完整定位)
    • #101 — 聊天预览里的围栏代码块保留换行,语言标识不再混入代码内容 (感谢 @senshinya 的根因分析)

    杂项 / 文档

    • .gitignore 重新分类,加 *.log / *.tmp 通配符 (PR #96)
    • README 和 About 全部统一为 "11 tools / 11 种工具"
    • ConfigInstaller 行尾空格清理
    • 合并后修复:inline 审批 UI 里硬编码的中文改走 L10n
    • dev-hot-restart.sh 优先 SIGTERM 再 SIGKILL,绝对路径 --app-path 保留,seen 计数从 wc -c 初始化

    Thanks to contributors: @lkangd @liushaoxiong10 @alvis-HaoH @leizhiyuan @jiz4oh @Hatiaa @senshinya @edso404 @xiangzi-jiangxin

Show 5 older releases
  1. 1.0.20

    English

    New: Haptic Feedback on Hover

    • Trackpad haptic feedback when hovering over the notch (opt-in in Settings → Behavior)
    • Three intensity levels: Light / Medium / Strong
    • Uses macOS NSHapticFeedbackManager — silently no-ops on non-Force Touch devices

    New: Configurable Notch Height Modes (PR #80)

    • Align panel to real notch height, menu bar height, or a custom value (15–60pt slider)
    • Fixes 1px gap on MacBook Air 15-inch and other models
    • Settings → Appearance → Top Bar Height

    New: Qwen Code Support

    • Full support: hook installation, PID detection, dedicated purple hexstar mascot
    • Hook format compatible with Claude Code (timeout in milliseconds)

    Bug Fixes

    • #75 — Bare thinking idle timeout increased from 60s to 300s (GPT-5.4 xhigh mode can think for 5 min)
    • #73 — Fix Ghostty quick terminal triggered by app.activate() during terminal jump
    • Fix force-unwrap crash in NotchPanelView (cwd!) and ConfigInstaller (lines.last!)
    • Fix HookServer socket permission TOCTOU — set umask(0o077) before listener creation
    • Fix HookServer connection context memory leak — added 5-minute timeout cleanup
    • Fix deprecated .foregroundColor() API → .foregroundStyle()
    • Remove unused hasNotch variable (compiler warning)
    • Fix settings close flicker (PR #70)
    • Defer completion card collapse when mouse is inside panel (PR #69)

    New Mascots & Icons

    • Dedicated mascot and icon for: Qwen, Trae, StepFun, AntiGravity, WorkBuddy, Hermes

    中文

    新增:悬停触控板震动

    • 鼠标悬停在刘海上时触发触控板震动反馈(设置 → 行为 中开启)
    • 三档强度可选:轻 / 中 / 强
    • 基于 macOS NSHapticFeedbackManager,Force Touch 触控板自动生效

    新增:Notch 高度模式可配置 (PR #80)

    • 面板对齐真实 notch 高度、菜单栏高度或自定义值(15–60pt 滑块)
    • 修复 MacBook Air 15 寸等机型面板与 notch 的 1px 间隙
    • 设置 → 外观 → 顶部高度对齐

    新增:Qwen Code 完整支持

    • Hook 安装、PID 检测、专属紫色六角星 mascot
    • Hook 格式与 Claude Code 兼容(timeout 单位为毫秒)

    Bug 修复

    • #75 — Bare thinking idle 超时从 60s 提升到 300s(GPT-5.4 xhigh 模式思考可达 5 分钟)
    • #73 — 修复跳转 Ghostty 时 app.activate() 触发 quick terminal
    • 修复 NotchPanelView 中 cwd! 和 ConfigInstaller 中 lines.last! 的 force-unwrap 崩溃
    • 修复 HookServer socket 权限 TOCTOU — 创建 listener 前设置 umask(0o077)
    • 修复 HookServer connectionContext 内存泄漏 — 添加 5 分钟超时清理
    • 修复弃用 API .foregroundColor() → .foregroundStyle()
    • 移除未使用的 hasNotch 变量(编译器警告)
    • 修复设置关闭闪烁 (PR #70)
    • 修复鼠标在面板内时 completion 卡片过早收起 (PR #69)

    新增 Mascot 和 Icon

    • 为 Qwen、Trae、StepFun、AntiGravity、WorkBuddy、Hermes 添加专属 mascot 和品牌 icon

    Thanks to contributors: @Hatiaa @lkangd @yuancafe

  2. 1.0.19

    English

    In-App Updates

    • Update check, download progress, and installation now happen entirely within Settings → About — no more popup dialogs
    • Real-time download progress bar with percentage
    • Homebrew users see the brew upgrade command inline

    New CLI Support (PR #64)

    • Built-in support for Trae, Trae CN, StepFun, CodyBuddyCN, AntiGravity, WorkBuddy, Hermes
    • Custom third-party CLI extensibility in Settings → Hooks

    Turkish Language (PR #67)

    • Full Turkish (Türkçe) localization

    Bug Fixes

    • Fix v1.0.18 startup crash caused by resource bundle lookup (PR #66)
    • Harden SSH remote host input validation — prevent crash on invalid config
    • Deduplicate CLI hook event configs (~100 lines removed)
    • Fix zh localization indentation issue

    中文

    应用内更新

    • 检查更新、下载进度、安装全部在 设置 → 关于 页面内完成,不再弹出系统对话框
    • 实时下载进度条显示百分比
    • Homebrew 用户直接显示 brew upgrade 命令

    新增 CLI 支持 (PR #64)

    • 内置支持 Trae、Trae CN、StepFun、CodyBuddyCN、AntiGravity、WorkBuddy、Hermes
    • 设置 → Hooks 中可自定义第三方 CLI

    土耳其语支持 (PR #67)

    • 完整的土耳其语 (Türkçe) 本地化

    Bug 修复

    • 修复 v1.0.18 启动闪退问题 (PR #66)
    • 加固 SSH 远程主机输入校验,防止无效配置导致闪退
    • 精简 CLI Hook 事件配置(减少 ~100 行重复代码)
    • 修复中文本地化缩进问题
  3. 1.0.18

    English

    Bug Fixes (7 issues resolved)

    • #44 — Qoder stuck in "thinking" after interrupt: native app timeout reduced from 300s to 30s
    • #46 — IDEA stale sessions reappearing: PID liveness check on session restore, dead-PID sessions skipped
    • #45 — Claude Code session end error: graceful socket shutdown (1s delay) + Python hook error handling + bridge exit(0)
    • #52 — Hover frame drops in permanent status bar: debounced idle hover (0.3s un-hover delay) + ChatMessageRow render optimization (Equatable view extraction)
    • #56 — Configurable island width: 50%–150% slider in Appearance → Panel for non-notch displays
    • #32 — Hooks migrated from ~/.claude/hooks/ to ~/.codeisland/ with automatic legacy cleanup
    • #36 — Interaction cards: covered by existing approval cards + multi-question AskUserQuestion wizard

    Terminal Activation Improvements

    • IDE window matching uses shortest-title heuristic to avoid same-name project confusion
    • Terminal not running → fallback to app launch instead of silent failure (iTerm, Terminal.app, Ghostty)
    • Alacritty/Warp/Hyper/Tabby/Rio: window-level matching via System Events title search
    • tmux detached sessions: skip stale inner TTY, fall back to CWD or app-level activation
    • Native app source fallback: prefer desktop app when termBundleId is missing

    Session Lifecycle Hardening

    • Native app sessions (OpenCode, Codex, etc.) auto-removed when desktop app quits
    • Dedup guard: CLI discovery no longer merges into stale native app sessions
    • Discovery zombie prevention: tighter freshness window (30s) when process start time unknown
    • Stuck approval/question sessions timeout after 300s without process monitor
    • Codex: added SessionEnd hook event for faster cleanup

    中文

    Bug 修复(7 个 issue)

    • #44 — qoder 打断后卡在 thinking:native app 超时从 300 秒降到 30 秒
    • #46 — IDEA 退出后旧 session 重现:恢复时检查 PID 存活,死进程 session 直接跳过
    • #45 — Claude Code session 结束报错:socket 延迟 1 秒删除 + Python hook 错误处理 + bridge exit(0)
    • #52 — 常驻状态栏 hover 掉帧:idle hover 延迟 un-hover 防震荡 + ChatMessageRow 渲染优化(Equatable 视图提取)
    • #56 — 灵动岛宽度可设置:外观 → 面板中 50%–150% 滑块,仅影响非刘海屏
    • #32 — hook 文件从 ~/.claude/hooks/ 迁移到 ~/.codeisland/,自动清理旧路径
    • #36 — 交互确认卡片:已有 approval 卡片 + 多问题 AskUserQuestion 向导覆盖

    终端跳转改进

    • IDE 窗口匹配:最短标题启发式,避免同名项目跳错
    • 终端未运行时 fallback 启动 app,不再静默失败(iTerm、Terminal.app、Ghostty)
    • Alacritty/Warp/Hyper/Tabby/Rio:通过 System Events 标题搜索实现窗口级匹配
    • tmux detached:跳过失效的内层 TTY,回退到 CWD 或 app 级激活
    • Native app 源 fallback:termBundleId 缺失时优先跳转桌面 app

    Session 生命周期加固

    • Native app session(OpenCode、Codex 等)桌面 app 退出后自动清理
    • Dedup 防护:CLI 发现不再合并到已退出的 native app session
    • 发现机制防僵尸:processStart 未知时使用 30 秒严格窗口(原 5 分钟)
    • 无 monitor 的 approval/question session 300 秒后超时重置
    • Codex:添加 SessionEnd hook 事件加速清理

    Thanks to issue reporters: @syuim @caibaicheng @WangNingkai @igoobit @angao @Jason213

  4. 1.0.17

    English

    • Multi-source session discovery — Qoder, CodeBuddy, Factory (Droid), Cursor, and Copilot sessions are now discovered from disk, not just via hooks
    • PID reuse protection — ProcessIdentity tracks PID + start time to prevent stale PID confusion
    • Source-aware process scanning — fallback PID lookup now scans the correct process family per CLI source, no more cross-source misbinding
    • Configurable session rotation interval — choose 3/5/8/10 seconds in Settings → Behavior (default 5s)
    • Show project name while session is working — collapsed bar now shows the project name during all non-idle states, not just during tool use
    • Instant switch on session stop — when one of multiple active sessions finishes, the bar immediately switches to the remaining active session
    • Native app orphan protection — Cursor, Qoder, Codex desktop, and other native app processes are no longer killed when their parent terminal closes
    • Discovery PID contamination guard — heuristic discovery results can no longer overwrite a known-good alive PID or attach a wrong monitor
    • Model backfill retry — model detection retries with cooldown instead of giving up permanently on first miss
    • Legacy hook cleanup — properly removes old "vibe-island" and "vibeisland" hook entries during reinstall
    • Fix cleanup timer dead-monitor sessions now removed promptly via grace period instead of waiting 10 minutes
    • Fix in-flight "Stop" hook event race condition that prevented session removal
    • Fix process takeover detection during auto-update/restart
    • Fix modelReadAttempted Set leak on session removal

    中文

    • 多源 session 发现 — 现在可以从磁盘发现 Qoder、CodeBuddy、Factory (Droid)、Cursor、Copilot 的 session,不再仅依赖 hook
    • PID 复用保护 — ProcessIdentity 同时追踪 PID 和进程启动时间,防止 PID 复用导致的错误
    • 源感知进程扫描 — PID 回退查找现在按 CLI 类型扫描正确的进程族,不再跨源错绑
    • 可配置会话轮转间隔 — 在设置 → 行为中选择 3/5/8/10 秒(默认 5 秒)
    • 工作中显示项目名 — 收缩栏在所有非空闲状态下都显示项目名,不再仅限工具执行时
    • 会话结束立即切换 — 多个活跃 session 中一个结束时,立刻切换到剩余的活跃 session
    • 原生应用孤儿保护 — Cursor、Qoder、Codex 桌面端等原生应用进程在父终端关闭时不再被强杀
    • 发现 PID 污染防护 — 启发式发现结果不再覆盖已知的可信 PID 或挂载错误 monitor
    • 模型检测重试 — 模型识别改为带冷却时间的重试,不再首次失败就永久放弃
    • 旧版 hook 清理 — 重新安装时正确清理旧的 "vibe-island" 和 "vibeisland" hook 条目
    • 修复清理定时器对死 monitor session 的处理,现在通过宽限期及时移除而非等待 10 分钟
    • 修复 in-flight "Stop" hook 事件竞态导致 session 无法移除的问题
    • 修复自动更新/重启时的进程接管检测
    • 修复 session 移除时 modelReadAttempted Set 泄漏
  5. 1.0.16

    English

    • Developer ID signed + notarized — no more Gatekeeper warnings, double-click to open directly
    • Fix mascot animation flickering between working and idle every ~2 seconds
    • Fix Warp terminal opening macOS Terminal.app on completion
    • Click entire session card to jump to terminal, not just the small icon
    • Fix smart suppress not accurately identifying tabs — prefer showing notifications over silently dropping them
    • Fix long-running bash commands being incorrectly marked as idle after 5 minutes
    • Fix stuck "thinking" state when CLI encounters API timeout/error (auto-reset after 2 min)
    • Merge PR #43: fix Ghostty tab focus for tmux sessions
    • Route terminal detection by bundle ID instead of TERM_PROGRAM to avoid Warp misrouting
    • Hardened runtime enabled for all binaries
    • Automated notarization + DMG creation in build script

    中文

    • 开发者证书签名 + 公证 — 不再弹 Gatekeeper 警告,双击直接打开
    • 修复小人动画在工作和空闲之间每 ~2 秒闪烁的问题
    • 修复使用 Warp 终端时完成后弹出 macOS Terminal.app 的问题
    • 点击整个 session 卡片即可跳转终端,不再只能点小图标
    • 修复智能抑制无法精确识别标签页的问题 — 不确定时优先弹通知
    • 修复长时间 bash 命令被错误标记为空闲的问题
    • 修复 CLI 遇到 API 超时/错误时卡在 "thinking" 状态的问题(2 分钟自动恢复)
    • 合并 PR #43:修复 tmux 下 Ghostty 标签页跳转
    • 终端检测改用 bundle ID 路由,避免 Warp 误路由
    • 所有二进制启用 Hardened Runtime
    • 构建脚本自动化公证 + DMG 制作