![]()
轻量级 AI 编程桌宠,实时映射助手工作状态
Clyde 是一只住在桌面上的宠物,能实时感知 AI 编程助手在做什么:提问时思考,跑工具时打字,子代理工作时杂耍,弹卡片审批权限,任务完成时庆祝,你离开时睡觉。
支持 Claude Code、Codex CLI 和 Copilot CLI,三者可同时运行。
git clone https://github.com/QingJ01/Clyde.git
cd Clyde
npm install
npm start # Tauri 开发模式,前端热更新
前置条件 — Node.js v18+、Rust stable、平台相关 Tauri 依赖。
Agent 配置 — 全部零配置:
- Claude Code — 启动时自动注册 command hook + HTTP 权限 hook
- Codex CLI — 自动轮询 ~/.codex/sessions/ 日志
- Copilot CLI — 检测到 ~/.copilot 时自动配置
12 种动画状态,由实时 Agent 事件驱动:
| Agent 事件 | Clyde 的反应 | 预览 |
|---|---|---|
| 空闲 | 眼球跟随鼠标,身体微倾 | ![]() |
| 提交提示词 | 思考 | ![]() |
| 工具执行中 | 打字 | ![]() |
| 3+ 个会话活跃 | 建造 | ![]() |
| 1 个子代理 | 杂耍 | ![]() |
| 2+ 个子代理 | 指挥 | ![]() |
| 工具执行失败 | 报错闪烁 | ![]() |
| 任务完成 | 开心弹跳 | ![]() |
| 通知 | 惊跳 | ![]() |
| 上下文压缩 | 扫地 | ![]() |
| 创建 Worktree | 搬箱子 | ![]() |
| 60 秒无活动 | 打哈欠 → 打盹 → 倒下 → 睡觉 | ![]() |
拖到左/右屏幕边缘(或右键"极简模式"),Clyde 藏到边缘只露半身,悬停时探头,收起状态下仍能显示迷你通知和庆祝动画。
Claude Code 请求工具权限时,Clyde 在宠物旁弹出浮动卡片 — 允许、拒绝或选择建议规则(如"始终允许 Read")。多个请求从宠物位置向上堆叠。如果你先在终端回答了,气泡自动消失。
Clyde 还会实时跟踪 Claude 的权限模式。当模式切换时(如通过 /permissions 切换到"自动编辑"),宠物旁会弹出短暂通知:
| 模式 | 含义 |
|---|---|
| 正常审批 | 工具调用需要你的批准 |
| 自动编辑 | 编辑操作自动通过,其他工具仍可能需要审批 |
| 跳过审批 | 不会再弹出权限审批气泡 |
| 仅规划 | 不执行工具,只做规划 |
src-tauri/src/ Rust 后端
├── lib.rs 应用入口 + Tauri 命令
├── state_machine.rs 多会话状态追踪 + 优先级
├── http_server.rs Axum HTTP (POST /state, /permission)
├── hooks.rs Hook 部署 + settings.json 注册
├── permission.rs 权限气泡窗口
├── mini.rs 边缘吸附、探头、抛物线跳跃
├── tick.rs 50ms 光标轮询(眼球、睡眠、探头)
├── tray.rs 系统托盘菜单
├── windows.rs 窗口边界 + 命中测试
├── focus.rs 按 PID 聚焦终端 (Win/Mac/Linux)
├── codex_monitor.rs Codex JSONL 日志轮询
├── prefs.rs 偏好持久化
└── i18n.rs 中英文字符串
src/windows/ Svelte 5 前端(3 个窗口)
├── pet/ SVG 渲染器
├── hit/ 不可见点击层
└── bubble/ 权限审批卡片
hooks/ JS hook 脚本(编译时嵌入)
├── clyde-hook.js Claude Code 命令 hook
├── server-config.js 端口发现
├── auto-start.js SessionStart 自动拉起
├── copilot-hook.js Copilot CLI hook
└── install.js 手动 hook 注册 CLI
assets/svg/ 35 个动画帧
| 层 | 技术 | 为什么选它 |
|---|---|---|
| 桌面框架 | Tauri v2 | 打包体积 ~5 MB(Electron 动辄 150 MB+);原生系统 API(透明窗口、托盘、全局快捷键);Rust 后端直接调用,零 IPC 序列化开销 |
| 后端语言 | Rust | 无 GC、零成本抽象;50 ms 定时器 + 多会话状态机跑在单进程里,CPU 占用趋近于零;Mutex + Arc 天然线程安全 |
| 前端框架 | Svelte 5 | 编译时生成极小运行时(无虚拟 DOM),三个窗口 JS 合计 < 30 KB;$state / $props 响应式模型让 SVG 渲染逻辑极简 |
| HTTP 服务 | Axum | 构建在 Tokio 上的异步 Web 框架;类型安全路由 + 提取器;与 Tauri 共享同一 Tokio 运行时,无额外线程池 |
| 构建工具 | Vite | 开发时毫秒级热更新;生产构建 Tree-shaking 极致精简 |
组合优势: Rust 处理所有状态逻辑和系统交互,Svelte 只做最薄的渲染层,Tauri 把两者粘合成一个 < 10 MB 的跨平台桌面应用。整个架构没有任何运行时解释器(Node.js、Python 等),冷启动 < 1 秒,常驻内存 < 30 MB。
| 限制 | 说明 |
|---|---|
| Codex: 无终端聚焦 | JSONL 轮询不携带终端 PID |
| Copilot: 无权限气泡 | Copilot hook 协议仅支持拒绝 |
| HTTP 服务无认证 | 仅绑定 127.0.0.1;计划添加 token 认证 |
| 无自动更新 | 请从 GitHub Releases 下载新版本 |
这是 macOS Gatekeeper 拦截未签名应用,并非真的损坏。修复方法:
xattr -cr "/Applications/Clyde on Desk.app"
codesign --force --deep --sign - "/Applications/Clyde on Desk.app"
第一条命令清除隔离标记,第二条添加本地临时签名(Apple Silicon 必需)。
如果 Claude Code 请求工具权限时 Clyde 没有弹出审批卡片:
/hooks,检查 PermissionRequest 是否有 [http] hooknode hooks/install.js~/.claude/settings.json 中的 PermissionRequest 条目,重启 Clyde~/.claude/settings.json 中正确的格式应为:
"PermissionRequest": [
{
"matcher": "",
"hooks": [
{ "type": "http", "url": "http://127.0.0.1:23333/permission", "timeout": 600 }
]
}
]
权限气泡仅在 Claude Code 触发
PermissionRequest事件的工具调用时出现。
欢迎 Issue、建议和 PR — 提交 Issue 或直接提 PR。
npm test # cargo test(19 个单元测试)
QingJ01
核心贡献者 |
rullerzhou-afk
原项目作者 |
yujiachen-y
项目初始贡献者 |
AooooooZzzz
项目初始贡献者 |
purefkh
项目初始贡献者 |
|
Tobeabellwether
项目初始贡献者 |
Jasonhonghh
项目初始贡献者 |
crashchen
项目初始贡献者 |
hongbigtou
项目初始贡献者 |
InTimmyDate
项目初始贡献者 |
NeizhiTouhu
项目初始贡献者 |
$ claude mcp add Clyde \
-- python -m otcore.mcp_server <graph>