2026-07-04

我又做了一个终端 Unterm:默认用户不是人

先说个数:过去半年,我终端里跑的命令,八成以上不是我敲的。 是 Claude Code、是 Codex、是一堆 agent,一天到晚在里面干活,一个任务经常跑好几个小时。

问题就出在这儿。我在用的这些终端——iTerm、Windows Terminal、Warp——全是照「一个人坐着敲」设计的:敲一行、看一眼、再敲一行。 主要用户从我变成 agent 之后,这个默认假设在好几个地方直接失效了。我一个坑一个坑撞过去,最后干脆自己做了一个终端,叫 Unterm

真正让我动手的,是有一周我盯着自己的时间去向,发现大半天都花在给 agent 当网络运维、当安全审核、当窗口调度员——这些事没有一件是「产品」本身,但没人替我挡,我就只能自己做个东西把它们挡掉。

下面是我撞到的坑,和每个坑的填法。

Unterm 是什么,名字怎么来的

一句话:Unterm 是一个让外部 AI agent 直接操控的终端unterm.app,开源,GitHub zhitongblog/unterm)。

它跟「内置了 AI 的终端」不是一回事。它自己不带聊天框,而是把整个终端通过 MCP 协议开放出去,让 agent 来开、来敲、来读。我给它写的 slogan,就一句:

The terminal that runs every AI coding agent. (能跑起每一个 AI 编码 agent 的终端。)

背后的主张也是一句:

终端不用把 AI 塞进去,它要的是能被 AI 开着走。

能力上:一键装好 Claude Code、Codex CLI、Gemini CLI、OpenCode、Aider;本地优先、开源、可脚本化(带一个 unterm-cli);界面九种语言。

落到用起来是这样:我在 Claude Code 里说一句「帮我把这个项目的构建跑起来,跑挂了自己看日志改」,它就通过 MCP 连到 Unterm,自己开一个窗口、自己敲命令、自己读屏上的输出、报错了自己接着改,全程我不用在聊天窗和终端之间来回复制粘贴。终端第一次成了 agent 的手,而不是我手动搬运输出的中转站。 我想盯的时候盯一眼,不想盯的时候它自己往下走。

名字也简单,Un + term。term 是 terminal;Un 是「解放」——把敲键盘这件事,从人的双手里解放出来,交给 AI。 我做它的时候脑子里就一个画面:这台终端不是给我这双手用的,是给 agent 用的,我退到后面盯着就行。名字说的就是这件事。

一、代理:让 agent 看不见那堵墙

我在国内,agent 干活八成要出墙:装包、git clone、拉模型权重、调各家 API。

普通终端里,这事得我手动 export HTTPS_PROXY,一个 shell 设一次。可 agent 一开新窗口、一 fork 子进程,代理就丢了,然后卡住、超时、报一句 network error麻烦的是它不知道这是网络问题,只会以为是自己命令写错了,于是改命令、换源、重试,越弄越乱。有次我让它半夜拉个模型权重,第二天一看,它在一条早就挂掉的代理上重试了四十多分钟,日志刷满屏,一个字节没下下来。

所以我把代理做进了终端本身。Unterm 内置一个接 Clash 的代理层,所有 session 默认走同一套路由。我配了一池节点(现在是八条给 Gemini、GPT 调过的新加坡线路),终端每半分钟自己测一遍,哪条快走哪条;正在用的那条挂了,自动切到池子里最快的活节点。 而且代理是设到操作系统那一层的(Windows 改注册表、macOS 走 scutil、Linux 设环境变量),不是每个 shell 单设——之后开出来的每个窗口,天生就带着代理。

还有些细节是被 agent 逼出来的。比如 localhost 和内网地址不能走代理,否则 agent 连自己在本地起的服务都连不上——这套 no-proxy 规则得默认配好,不能等 agent 去踩了才补。再比如节点池不该我手动维护:Unterm 直接读 Clash 里的分组和每个节点的实时延迟,我在界面上点几下就搭出一个轮换池,哪些节点进池、多久轮一次,都不用去手改配置文件。

它不是万能的:整池线路都被限速,我照样没辙。 但「单条节点又抽风了」这种一天碰八回的破事,它自己就切过去了,不用我管。

二、安全:把机器交给 AI,等于把 rm -rf 也交出去

给 agent 一个裸终端,等于把整台机器交给它。rm -rfgit push --forceDROP TABLE——一行敲错,东西就没了,而且它跑得比你反应快。普通终端不知道背后坐的是 AI,把 agent 和我当成同一双手。

我不想在两个极端里二选一:要么放它裸奔,提心吊胆;要么每条命令我手动确认,那等于我自己在敲。所以 Unterm 在中间加了几道关:

默认是「保守」那一档:一个刚接进来、我还没授信的 agent,写什么都得先过我这关;等我看它跑几轮、确认靠谱,再把它常用的那些安全命令整类放开。磨合期它是慢一点,但不会一上来就把我吓一身汗。

带 agent 久了,你一定会碰上它信心十足地敲一条 rm -rf 去「清缓存」、路径却拼错一截的时刻。人在按回车前会顿半秒,agent 不会——这道闸,得终端替它补上。

三、录制:agent 跑完,我要能倒带看它干了啥

这是我用得最多、也最不敢没有的一个功能。

agent 无人值守跑三个小时,你回来想知道它到底干了什么。光看它自己写的总结不行——它可能漏、可能美化、甚至可能圆谎。 你要的是原始记录:每一条命令、每一段输出,原样都在。

所以 Unterm 把整个会话从头到尾录下来:agent 敲了什么、终端回了什么,全存成一份能回放的记录,之后能像录像一样倒带重看,也能把历史一条条列出来翻。录的时候会自动把 token、密钥打码,免得这份记录本身变成新的泄密口子。

它就是 agent 的黑匣子:出了问题,倒带看它哪一步走歪了;跑得漂亮,就留着当 demo 或者复盘素材。

举个上周的事:一个 agent 把一批测试跑挂了,还理直气壮说「修好了」。我把会话倒带到它动手改代码那一段,几分钟就看清了——它为了让测试变绿,偷偷把一个断言注释掉了。 要是只有它自己写的那份总结,我根本抓不到这一手。记录还能整段导出,我拿它当过好几次「AI 到底是怎么干活的」的讲解素材。

我敢让 agent 无人值守跑,底气有一半是这份能倒带的记录给的。

四、并行:我早就不只开一个 agent

现在的常态是三四个 agent 同时跑:一个弄前端,一个啃数据库迁移,一个补测试。普通终端里,这就是三四个黑框,我 alt-tab 来回切,切着切着就忘了谁在等我拍板、谁已经挂了在干等。

Unterm 把「管一群」做顺了:

具体到一个早上大概是这样:开三个窗口,分别派「把登录页按新设计重做」「把订单表迁到新 schema」「给结算逻辑补测试」,再广播一句「每十分钟把进度贴出来」,然后我自己去回消息。回来扫一眼三个窗口的状态,谁卡了就进哪个窗口跟它聊两句,没卡的接着放它跑。我从『一个个盯』变成了『扫一眼一排』。

我现在的活儿本来就不是写代码,是编排一队 agent(这事我在上一篇里讲过)。而编排的前提,是手里得有个称手的指挥台,不是四个互相不认识、还得我用脑子记着谁是谁的黑框。

五、窗口:agent 一多,桌面就乱

成队跑起来之后,乱的就不是命令,是空间:哪个窗口在部署、哪个是随手起来试的草稿、哪个派出去俩小时了还没回话?靠脑子记,几个就串。

我做的都是最土的秩序:

workspace 这功能听着小,用起来是真省事:我有一套固定的「发文」布局——站点目录一个窗口、内容仓库一个、跑构建一个、盯日志一个——存下来之后,每天开工一键恢复,四个窗口连 cwd 都在原位,不用每天重新 cd、重新排。

十二个没名字的窗口,和一个能叫出每个名字的工作台,差的就是这点。

那 tmux、Warp 呢?

你会问:tmux 早有多面板,Warp 也把 AI 塞进去了,你到底补什么?

tmux 我用了很多年,多面板做得很好,但它是给真人的十根手指设计的:它不知道背后是不是 agent,不管你这条命令会不会删库,也不管你在国内、每条出墙的命令都在超时里挣扎。Warp 是另一条路,把一个 AI 助手缝进了终端——但那是「AI 待在终端里」,不是「终端被 AI 开着走」:主角还是坐在屏幕前的人,agent 顶多算副驾,代理和中国网络这些事它也不接。iTerm、Windows Terminal 我也天天用,它们是好终端——但「好」的标准还是「人用着顺手」:配色、字体、快捷键、分屏,没有一个把「敲键盘的是个 agent」当成头等公民来设计。

两条路都不错,只是都没在回答我这个问题:主力从人换成 agent 之后,终端本身该长什么样。 代理、安全的闸、能倒带的记录、成队编排、按名字管窗口——在我这儿不是几个孤立的功能点,是同一个问题的几个面。

最后

满大街都是终端,我还要做一个,这事我自己也觉得得解释一句。

理由就一句:我不是想做个更好用的终端,是想做个「默认用户不是人」的终端。 上面这些没有一个来自什么路线图,全是那阵子真把我烦到的事。

还有个挺实在的点:Unterm 本身,也是我在终端里用大白话跟 AI 描述着做出来的,它的生产代码我没写。我把「要能被 agent 开、能自己切代理、能拦住 rm -rf、能整段回放」讲清楚,AI 就把它建了出来。说得清,它就建得出来——我一直是这么干活的。

世界需不需要又一个终端,我不知道。反正我需要。

延伸阅读

讨论

无需登录,匿名即可发言,请友善。
加载中…