日常写代码,Claude Code、Codex、OpenCode 经常要同时开着。每个 harness 自己的 CLI、自己的会话、自己的一套习惯。切来切去烦。想把一个 Todo 丢给某个会话,也只能复制粘贴。
现成的 Agent IDE 大多是 Electron,体积大,还常常绑死一家模型或一套协议。我不想再造一个 agent,只想要一张本地工作台:已经装在机器上的 CLI 原样接进来,用真实 PTY 跑,界面只负责编排、对照和持久化。
于是做了 CaPilot,基于 Tauri + Rust。我当时给它写过一句英文:
A light agentic desk for 30+ harnesses
项目在 GitHub:
官网:https://capilot.pages.dev(请用非微信浏览器打开)。
接进来的 harness
一等公民适配器覆盖 Bash / 系统 shell、Claude Code、Codex、OpenCode、Pi,还有实验性的 DeepSeek dsh。这些可以恢复会话、管权限、换模型、挂 hooks。
其余走 v1:二进制在 PATH 上,CaPilot 就按 spawn + 真实 PTY 接进来。Gemini、Cursor、Copilot、Aider、Goose、Qwen Code 等三十多种都在这个名单里。Agent 还是本机那份 CLI,工作台不重新实现它们。
会话都走本地 PTY,前端用 xterm.js 渲染。输出是真终端,不是假聊天气泡。
把 Todo 拖进会话
任务先做成 Todo 标签,再拖进某个会话。派工就是一次拖放,不用把需求再打一遍。
几个 harness 同时开着、不同任务分给不同会话的时候,这个最省事。工作台只负责把任务送到对应的 PTY,提示词还是我自己写。
画布
每个 worktree 有一块画布。终端块、agent 控制台、文件卡片都能拖上去,文档、代码、图片也能并排放。
终端之间可以连成 DAG:边不能自环、不能成环。跑图时会冻结一份计划,按退出码或 TCP / 输出门控往下走。图存在 Rust 侧的 canvas_graph / canvas_run 里。
我没打算做无限画布笔记。要的是一次多步骤本地任务能被看见,也能再跑一遍。
Git、编辑器、会话
| 能力 | 做什么 |
|---|---|
| 编辑器 | CodeMirror 6,改代码、看 diff |
| Git | 仓库状态、提交、对照都在应用内 |
| 会话 | SQLite 持久化,关掉再开还在 |
| 主题 | 自带 9 套皮肤,Theme Lab 可改 50 多个 CSS 变量,静图或循环视频壁纸 |
| 快捷键 | 可重映射 |
| 界面语言 | 中 / 英;PTY 里的输出不翻译 |
Linux 上视频壁纸走过一段弯路:WebKitGTK 把 <video> 交给 GStreamer,自定义协议解不出帧。排查过程写在 Linux 打包后视频壁纸零帧 里。
现在能装在哪,下一步想做什么
目前提供 Windows x64(NSIS,需要 WebView2)和 Linux x64(.deb / AppImage)。macOS 暂不支持。Agent CLI 需要自己装好,放到 PATH。
路线图下一件是 Agent 编排:MCP + Remote。本地已经能把三十多种 harness 摊在一张桌子上。下一步是让它们能被编排,也能连到远端。