Releases: wxtsky/CodeIsland
Release list
v1.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 (#249)
- 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 项目路径解码移出渲染路径
v1.0.29
Highlights
New integrations 🦞
- OpenClaw — auto-installed TypeScript plugin pack with the new Molty space-lobster mascot (#235)
- Claude Code Desktop — local Code-tab sessions recognized, tagged, and click-to-jump opens the right desktop window (#211)
- Kiro gets its own pixel-ghost mascot; settings gallery completed
Answer agent questions from the island
- The OMP / pi
asktool 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 (#244)
Quality of life
- Per-host working-directory filter for shared remote SSH accounts (#240)
- The island auto-dodges Bartender & friends on external screens (#219)
- 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 (#15)
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 (#243)
- 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 (#242)
- 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 (#238), German localization (#234), Google Antigravity approval details (#233), host-GUI-client jump (#237), pi/omp mascot setting (#228).
中文
新集成 🦞
- 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)。
v1.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) (#218)
- Add support for Pi / Oh My Pi sessions with a dedicated mascot (#222)
- Add support for Google Antigravity (Gemini-based) hooks as a new agent source (#215)
- Detect Superset terminal sessions (window-level focus; Superset exposes no per-tab focus API) (#213)
- Surface Codex Desktop plan-mode user-input questions as interactive prompts (#209)
- Fix Hermes hooks never firing at runtime — install to ~/.hermes/config.yaml (where Hermes actually reads) instead of settings.json (#226)
- Fix "Always allow" not sticking for MCP tools, which kept re-prompting the same approval (#224)
- Fix Claude Code shown with the Cursor icon when run inside Cursor's integrated terminal (#220)
- Fix the approval panel not auto-dismissing after you approve a request in the terminal (#216)
- Fix the global shortcut silently breaking after switching apps — now uses a Carbon hotkey that needs no Accessibility permission (#217)
- Fix CPU spiking to 100% after sleep/wake by pausing the idle mascot animation while hidden or asleep (#225)
- Fix remote SSH reconnection failing (ssh exited 255) by clearing the stale forwarding socket first (#206)
- Fix Warp tab activation across multiple windows and tabs (#205)
中文
- 新增 Code Island Buddy iPhone / Apple Watch 伴侣 App——Live Activity / 灵动岛 / 锁屏 / 待机显示,Mac 端可选开启镜像广播(默认关闭)(#218)
- 新增 Pi / Oh My Pi 会话支持,配专属吉祥物 (#222)
- 新增 Google Antigravity(基于 Gemini)hooks 支持,作为独立 agent 来源 (#215)
- 识别 Superset 终端会话(窗口级聚焦;Superset 未提供单 tab 聚焦接口)(#213)
- 把 Codex 桌面版 plan 模式的用户询问渲染成可交互弹窗 (#209)
- 修复 Hermes hooks 运行时不触发——改为写入 Hermes 真正读取的 ~/.hermes/config.yaml 而非 settings.json (#226)
- 修复 MCP 工具"始终允许"不生效、同一审批反复弹出 (#224)
- 修复在 Cursor 集成终端里运行 Claude Code 被错误显示为 Cursor 图标 (#220)
- 修复在终端里批准后审批面板不自动消失 (#216)
- 修复全局快捷键切换应用后静默失效——改用免辅助功能权限的 Carbon 热键 (#217)
- 修复休眠唤醒后 CPU 飙到 100%——隐藏或休眠时暂停空闲吉祥物动画 (#225)
- 修复 remote SSH 重连失败(ssh exited 255)——连接前先清理残留转发 socket (#206)
- 修复 Warp 跨多窗口 / 标签页的标签激活 (#205)
v1.0.27
中文
- 修复 Cursor / Trae / Qoder / Factory 点击灵动岛跳到"最近用过的窗口"而不是正在对话的那个——现在按项目目录匹配对应 workspace 窗口 (#199)
- SSH 远程主机也会安装自定义 CLI 的 hooks(claude / nested 格式)——此前远程只配置内置 CLI (#192)
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 (#199)
- Install custom CLI hooks on SSH remote hosts too (claude / nested hook formats) — previously only the built-in CLIs were configured remotely (#192)
v1.0.26
中文
- 新增 pi / Oh My Pi (OMP) 编码 agent 集成 (#197)
- 远程 SSH socket 按用户隔离(
/tmp/codeisland-<uid>.sock),修复多用户共享主机上的事件串话 (#193) - 修复 SSH 隧道在 ControlMaster 多路复用下
ssh -N立即退出、被误报为ssh exited (0)的问题 (#190) - 修复 iTerm2 全屏 / 跨 Space 时点击会话跳到错误窗口 (#198)
English
- Add pi / Oh My Pi (OMP) coding agent integration (#197)
- Isolate the remote SSH socket per user to fix event cross-talk on shared hosts (#193)
- Fix the SSH tunnel being misreported as
ssh exited (0)under ControlMaster multiplexing (#190) - Fix iTerm2 click-to-jump landing on the wrong fullscreen / cross-Space window (#198)
v1.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) (#156)
- 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 (#187)
- Dynamic Island width is now adjustable on real notch displays too, not just external screens (#172)
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 (#170, #180) - 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 (#169)
- 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 (#182)
- Hermes on SSH remotes — the remote install script now configures Hermes too, so SSH-monitored Hermes sessions emit events (#176)
- Codex — clean up the legacy
codex_hooksconfig 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 (#147)
- Cursor sub-agents — parallel sub-agent processes collapse onto a single session card instead of flooding 10+ (#148)
- Default mascot is honored whenever no session is actively working, not just when there are zero sessions (#149)
- 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)(#156)
- Zellij & Kaku 多路复用器 — 识别活跃 pane 用于跳转和可见性抑制;tmux pane 解析加固,pane 线索在 app 重启后保留
- Buddy(ESP32)大改 — 蓝牙配对状态机、优先级写队列、扩展协议(model / stats / subagent / event / 工具历史 / 配对),以及从 CoreBluetooth 授权变化中恢复;签名脚本新增 ad-hoc fallback 便于本地测蓝牙 (#187)
- 灵动岛宽度 现在在真实刘海屏上也能调节,不再只对外接屏生效 (#172)
修复
- plan mode 下的 AskUserQuestion — 修复
undefined is not an object (evaluating 'H.map')崩溃及回答变空;answer key 改为与 Claude Code 的 question-text 查找一致,plan mode 不再循环重弹问题 (#170, #180) - 并行工具调用被自动拒绝 — 像"Read 4 个文件"这种共享 tool_use_id 的批量请求不再被当成重复项合并拒绝,每个请求各自等待你的决定 (#169)
- 尊重用户删除的 hook event — auto-repair 不再把你手动删掉的 Codex(或其他 CLI)hook event 补回;只有完全缺失或损坏的配置才会被修复 (#182)
- SSH 远程的 Hermes — 远程安装脚本现在也会配置 Hermes,SSH 监控的 Hermes 会话能正常上报事件 (#176)
- Codex — 清理旧版
codex_hooks配置项、自动审查模式下不再弹审批卡、持久化 always-allow 规则 - 权限不再被一锅端拒绝 — 活动事件(Stop,或 Notion/MCP 插件并行的 PostToolUse)不再在你反应过来之前把待审批清空 (#147)
- Cursor 子 agent — 并行子 agent 进程合并到一张会话卡,不再刷出 10+ 张 (#148)
- 默认角色 — 只要没有会话在实际工作就会生效,而不仅是完全没有会话时 (#149)
- 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 会尊重你的删除、不再补回。
v1.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-agentandqoderclifrom 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 (#134) - Add Settings → Sessions → "Plugin Sub-Sessions" (separate / merge / hide) for events fired by plugins running inside another agent like omo inside OpenCode (#123)
- Register Codex's
PermissionRequesthook so shell-escalation / managed-network approvals trigger the panel + sound instead of the session sitting silently in "running" forever (#145) - Add Settings → Behavior → "Auto-Expand Panel on Agent Completion" toggle (default on, preserves current behavior) (#146)
- Prefer
~/.config/opencode/opencode.jsoncoveropencode.jsonso OpenCode users on the recommended format no longer see CodeIsland resurrect a sibling.jsonon every install / repair pass (#132) - Show "+N Sub" badge on session cards with active subagents; hover any subagent icon to see agent type + current tool (#141)
- 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.runProcessno longer block the main thread; all subprocess waits now have hard timeouts (5–10s) and the slow paths dispatch off-main (#139) - Harden
UserPromptSubmitprompt extraction (nestedpayload/datacontainers,userPrompt/textfallback 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 (#103) - 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 (#134) - 新增 设置 → 会话 → "插件子会话" 三选一(独立 / 合并到主会话 / 隐藏),处理 OpenCode 里 omo 这类插件触发的 hook 事件 (#123)
- 注册 Codex 的
PermissionRequesthook — shell 提权 / 网络访问审批现在会触发审批面板和声音,而不是默默卡在 "running" (#145) - 新增 设置 → 行为 → "Agent 完成时自动展开面板" 开关(默认开,保持原行为)(#146)
- 当
~/.config/opencode/opencode.jsonc存在时优先写入它 — OpenCode 推荐用 .jsonc 格式,主端不再每次安装都重新创建一个.json兄弟文件 (#132) - session 卡片上显示 "+N Sub" 标签提示有 N 个活跃 subagent,hover 任意 subagent icon 查看 agent type + 当前工具 (#141)
- 自动批准工具列表默认清空 — 每次工具调用都走审批流程;之前默认会静默批准 9 个内部工具(TaskCreate / TaskUpdate / TodoWrite / EnterPlanMode 等),那些调用在面板上看不到
- 修复启动卡死 —
detectClaudeVersion/ConfigInstaller.install/verifyAndRepair/TerminalActivator.runProcess不再阻塞主线程,所有子进程等待都有 5–10s 硬超时,慢路径都搬到后台 (#139) - 加强
UserPromptSubmit提示词提取(支持 nestedpayload/data容器、新增userPrompt/text字段 fallback、保留代码片段前后空格),并在 diagnostics 导出里加 100 条 hook event ring buffer — 后续"提问不展示"类问题可以从一个 zip 里直接定位 (#103) - 修复 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 的值)。
v1.0.23
English
- Add ESP32 BLE companion device — port mascot animations to a real desk pet (#131)
- Make auto-approve tools configurable in Settings; default no longer auto-approves
ExitPlanModeso plan-mode exit prompts an approval dialog (#126) - Fix TraeCli YAML hook injection corruption on mixed indentation; preserve user comments via surgical merge (#122)
- Respect
$CODEX_HOMEin codex auto-config (local + ssh) (#129) - Add WorkBuddy bundle ID for one-click jump from CodeIsland (#130)
- Fix remote SSH sessions being force-flipped to idle on local timeout (#121)
- Fix Ghostty click-to-jump no-op via System Events Accessibility fallback (#84)
- Fix Terminal.app: minimized window not raising + multi-tab clicks all jumping to same tab (root cause: AppleScript
ttyvariable shadowed Terminal.app's tabttyproperty) (#124) - Add configurable cwd-substring blocklist for hook events — filter out background plugins like claude-mem (#125)
- Add webhook forwarding for hook events to external HTTP endpoints — pipe agent activity into DingTalk / Lark / Slack receivers (#115)
- Add minimum Kiro CLI support — install hooks into
~/.kiro/agents/codeisland.json(launch withkiro --agent codeisland) (#127)
中文
- 新增 ESP32 BLE 桌面伴侣设备——把吉祥物动画移植到实体小屏 (#131)
- "自动批准工具"可在设置里逐项配置,默认不再自动批准
ExitPlanMode,退出 plan 模式会弹审批 (#126) - 修复 TraeCli YAML 在混合缩进下 hook 注入损坏的问题,并通过 surgical 合并保留用户注释 (#122)
- codex 自动配置遵循
$CODEX_HOME(本地和 ssh 都生效)(#129) - 新增 WorkBuddy 一键跳转 (#130)
- 修复远程 SSH 任务被本地 timeout 误判完成 (#121)
- 修复 Ghostty 点击灵动岛无反应——加 System Events Accessibility 兜底 (#84)
- 修复 Terminal.app 最小化无法打开 + 多终端点哪个都跳同一 tab(真 root cause:AppleScript 局部变量
tty跟 tab propertytty同名导致 Strategy 1 静默失效)(#124) - 设置里新增"忽略指定路径的 Hook"——按子串过滤 claude-mem 等后台插件触发的事件 (#125)
- 设置里新增"Webhook 转发"——hook 事件以 JSON POST 到外部端点,方便对接钉钉/飞书/Slack (#115)
- 新增 Kiro CLI 最小可用支持——hooks 写到
~/.kiro/agents/codeisland.json,启动用kiro --agent codeisland(#127)
v1.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_idmatching — 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 (#79) — subscribes to Codex.app's JSON-RPC app-server so thread lifecycle and
waitingOnApprovalstates render on the island for users of the Codex desktop app, not only the CLI.
- Precise
- 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 (#111) — pi-mono, the 38k★ TS-plugin-based Claude client.
- Third-party CLI extensibility + bridge hardening (#120) —
hookEventNamealias and nestedpayload.session_idcompatibility 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 gotquickTypeProbebyte-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 + blurin 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).
fullscreenLatchnow 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
activateTerminalApprelied on acustom titlethat most users never set. Rewritten as a single AppleScript that tries tty → auto tab name → custom title → deminiaturize-first-minimized fallback. - #103 — Qwen hook
PermissionRequesthung until Qwen's internal timeout because the installer was omitting the per-entrytimeoutfield 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,AgentStatusnow declareSendable; Codex supervisor bundle id markednonisolated. 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)支持 (#79) — 订阅 Codex.app 的 JSON-RPC app-server,thread 生命周期和
waitingOnApproval状态都能精确映射到岛。Codex 桌面 app 用户(不只是 CLI)也能享受权限审批识别。
- 审批卡片点击跳转 (#108, by @alvis-HaoH) — 点权限审批跳转到终端 tab,跳转验证成功后自动收起岛。
- pi-mono 支持 (#111) — pi-mono 是 38k★ 的 TS 插件式 Claude 客户端。
- 第三方 CLI 扩展性 + bridge 加固 (#120) — 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.
v1.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 (#92)
- Per-host SSH_AUTH_SOCK — optional field in the Add Host form, lets 1Password / Bitwarden / Secretive agents sign the handshake without
launchctl setenvhacks (#81) - Japanese + Korean localization (PR #72) — now en / zh / ja / ko / tr
- PID ancestry tracking for
sh -cwrappers — hooks executed through a transient shell now correctly attribute to the long-lived CLI process (#98) - Event normalization for snake_case hooks — TraeCli/Coco style
pre_tool_use,session_start,permission_request, etc. map to canonical names (#98) - dev-hot-restart script —
scripts/dev-hot-restart.shwatches 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 —
autoScreenPollerdropped from 1s to 5s;CGWindowListCopyWindowInfowas 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
.gitignorereorganized with categories;*.log/*.tmpglobs (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.shSIGTERM-first with SIGKILL fallback, absolute--app-pathpreserved,seencounter initialized fromwc -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 秒退避重连 (#92)
- 每主机 SSH_AUTH_SOCK — Add Host 表单可选项,1Password / Bitwarden / Secretive 类 SSH agent 不再需要
launchctl setenvhack (#81) - 日语 + 韩语本地化 (PR #72) — 现在覆盖 en / zh / ja / ko / tr
- PID 沿 ancestry 追踪 — 通过
sh -c启动的 hook 现在能正确归到长生命周期 CLI 进程 (#98) - snake_case hook 事件归一化 — TraeCli/Coco 的
pre_tool_use/session_start/permission_request等统一映射到标准事件名 (#98) - 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 —
autoScreenPoller1s → 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