十九个智能体 CLI,同一种集成深度
在终端里启动一个 CLI,只是集成中最容易的那一成。剩下的是状态、会话、工具和中断——而每个 CLI 都需要一条不同的路子。
NeuroSquad 0.1.137 新增了九个智能体 CLI——Gemini CLI、GitHub Copilot CLI、Amp、Factory Droid、aider、Goose、Kimi Code、Cline 和 Auggie——并把 Cursor CLI 和 Crush 提升到与其他成员相同的水平。总数达到十九个,而“支持”一词第一次对它们所有人都意味着同一件事。
三天前还不是这样。第一个版本就能在卡片里运行十个 CLI,但只有 Claude Code 是深度集成的:它的状态来自它自己的钩子,重启后会话能够恢复,它能通过箭头拿到工具。其他的只是跑在终端里,大多靠启发式判断来盯着。这篇文章讲的就是如何补上这个差距——在一天之内的三个版本里。
1 个达到 Claude Code 的集成深度
10 可在卡片中运行
- Claude Code
- Hermes Agent
- OpenCode
- Codex CLI
- pi
- omp
- Kilo Code
- Qwen Code
- Cursor CLI
- Crush
- Gemini CLI
- GitHub Copilot CLI
- Amp
- Factory Droid
- aider
- Goose
- Kimi Code
- Cline
- Auggie
“同一种深度”指的是什么
我们把应用为 Claude Code 做的所有事情写成了一份约四十项能力的清单,每个 CLI 都有一份自己的文档,逐行对照这份清单。每一行只可能是三种情况之一:原生(CLI 本身具备,应用直接使用)、模拟(借助该 CLI 的另一种机制实现,并写明怎么做),或者不可能——附上证明,通常是 CLI 自己源代码中的一行。
对画布使用者来说最重要的几行:
- 会话恢复:重启应用或卡片后,智能体接着同一段对话继续。
- 精确状态:工作中、等你处理、已完成——来自 CLI 自身的事件,并附上它具体在问什么。
- 通过箭头使用工具:应用的 MCP 工具,加上已连接的 MCP 服务器和技能。
- 卡片模式:智能体通过卡片(用终端跑命令,用浏览器上网)而不是自带的内置工具来工作,而且在危险模式下同样有效。
- 安全中断:由预算刹车触发,不会丢失会话。
- 按卡片统计的用量和模型、上下文指示和压缩,以及达到速率限制后的自动继续。
每个 CLI 都需要一条不同的路子
清单是同一份,机制却几乎从不相同。对 Claude Code,应用会在你的设置之上叠加一个设置文件,它的钩子用一行 curl 上报每一次状态变化。下面是其他几个是怎么做到的。
OpenCode 用的是一个插件——所有卡片共用一个文件——负责上报会话状态和权限请求。它的配置通过一个环境变量传入,这个变量是用排除法选出来的:用于内联 JSON 的那个变量已经在承载 OpenRouter 署名请求头,同一个变量有两个写入方就会互相覆盖;而用于配置目录的那个变量,会让你的全局指令文件失效。中断它也得小心:在 OpenCode 里,输入框为空时按 Ctrl+C 会直接关闭应用,而预算刹车以前发的恰恰就是这个。现在它改为连按两次 Escape。
Hermes Agent 会读取一个管理员级别的配置层,应用把它指向每张卡片专属的一个文件,并按叶子节点逐项合并到你的配置之上。一次实测发现,它的交互模式只有在 MCP 服务器写在你的原始配置里时才会去连接——所以卡片会在提示符就绪后自己输入 /reload-mcp,第一个提示词要等出现 Agent updated 之后才会插入。另一个发现是:模型提供方出错时,Hermes 永远不会发出会话结束事件,卡片就一直停在“工作中”;现在只要一轮尚未结束,应用还会在终端里留意 Hermes 打印出的提供方错误。
Gemini CLI 和它的分支 Qwen Code 一样有一个系统设置路径,但只有当那个文件归管理员所有、且普通用户不可写时,它才会加载。放在应用文件夹里的文件会被跳过,并给出一条安全警告。Gemini 认的是主目录覆盖,所以每张 Gemini 卡片都用一个自己的主目录运行,里面放着它的设置层——而你真实 ~/.gemini 里的其他一切,包括会话和登录信息,都通过目录联接链接进来。卡片的会话就是你的会话:gemini --resume 在普通终端里也能用,反之亦然。
aider 没有 MCP 客户端,没有钩子,也没有插件 API。不过它是个 Python 程序,而 Python 会在一切代码之前,先从路径中导入 sitecustomize 模块。aider 卡片启动时,PYTHONPATH 的第一位是一个专用文件夹,其中的模块会在 aider 的六个模块加载时逐个打补丁——每个补丁都有防护,如果以后的 aider 改了某个方法的名字,只会关掉那一个功能——然后再把自己的变量移除,这样 aider 启动的任何东西都不会继承它们。
Kilo Code 默认会连接到一个正在运行的 Kilo 守护进程,而不是启动自己的工作进程;可守护进程有它自己的环境——卡片会悄无声息地丢掉自己的配置、工具和 MCP 令牌。现在每张 Kilo 卡片启动时都会打开关闭这种连接的开关。Codex CLI 以前在卡片停止后还能活下来:npm 包装脚本退出了,codex.exe 却还在跑。现在卡片直接启动真正的可执行文件。
“不可能”也是一种答案
有些行填不上,而把这一点说清楚,本身就是工作的一部分。有几个 CLI——Auggie、Droid、Goose、Kimi——不允许调用方指定会话 id;应用会记下它们自己生成的 id,并据此恢复会话。Auggie 没有压缩命令,因为上下文窗口满了它会自己总结历史;所以它的卡片上干脆没有“压缩”按钮。Cline 只在会话启动时读取一次服务器的工具列表,之后不会刷新——所以会话中途画的箭头要到下次启动才生效,文档里也写明了这一点。
Kimi Code 有同样的限制,但在它身上做成了模拟:Kimi 卡片从一开始就拿到所有内置工具组,由箭头在调用时决定是否放行。一张在会话中途新建的笔记卡片,在同一个会话里就被写入了内容。
Amp 是最坦率的一个例子。它的智能体循环——包括模型调用——运行在 Amp 的服务器上;本地 CLI 只负责执行工具。所以对 Amp 来说,OpenRouter 及其署名都是不可能的,应用围绕它所做的一切,都是对着一个本地伪造的 Amp 服务器验证的。
怎么测的
每个 CLI 都装在临时文件夹里,从不全局安装,并由一个独立的应用构建来运行,它有自己的配置文件和一个临时主目录,所以没有读写任何人的真实配置。大多数 CLI 都指向本地回环接口上的一个小型脚本化模型服务器——它会回答 PING、调用工具、卡住十五秒、返回 429——这样速率限制、卡顿和权限提示都能按需制造,而不必干等。
同一个服务器还记录了请求头,OpenRouter 署名就是这样核对的:每个与 OpenRouter 通信的 CLI 现在都会发送 NeuroSquad 的请求头,包括使用 CLI 自己的 OpenRouter 登录的卡片,而且每一个都是在拦截服务器上实测的,而不是照搬文档。
一路上还顺带修了两个小问题:Kilo Code 卡片不再因为共享的守护进程而丢失设置,Qwen Code 访问应用 MCP 服务器的令牌也不再写入磁盘。完整列表见 0.1.128、0.1.133 和 0.1.137 的更新日志。




















