ARTICLE · 1179185
AI 工具装了三份,怎样统一到最新版?
我先说结论:"安装成功"这四个字,不能证明你正在用新版。
就在写这篇之前,我给这台 Mac 做了一次体检,目标是那个我天天用的命令行 AI 编程工具 opencode 。结果是这样的:
~/.opencode/bin/opencode —— 1.18.35 ,排在 PATH 第一顺位/opt/homebrew/bin/opencode —— 2.0.25 ,包管理器装的/Applications/OpenCode.app —— 1.18.35 ,桌面版我在终端敲下 opencode,跑起来的是 1.18.35,三份里最旧的那份。
没有报错,没有提醒,也没有任何一次安装失败。三次安装,每次都告诉我"已是最新"——它们说的都对,只是各自对着不同的通道说话。
这不是 opencode 独有的毛病。凡是"一个命令名 + 多条分发通道"的工具,都会有这一天:命令行一份、包管理器一份、桌面版一份,升级路径各走各的,最后谁在 PATH 前面谁说了算。
下面把这次的排查与统一过程完整记下来:三分钟怎么查、为什么会分裂、桌面版的自更新为什么永远升不上去、统一的正确顺序、要备份什么、哪些改动是破坏性的。
一、三分钟体检:你有几份,跑的是哪份
不用懂这些工具的源码,先跑这三条:
which-aopencode# 列出所有能找到的实例,顺序=解析顺序 opencode--version# 真正执行的那个是什么版本 ls-la"$(whichopencode)"# 它本身是不是软链接(包管理器装的会指向自己的目录)看第一条就够了。which -a 的输出顺序就是系统解析顺序,第一条就是你的日常版本。我这台机器上,第一条是老安装脚本留在 ~/.opencode/bin 里的那份,第二条才是包管理器装的——按这个顺序,终端里的每一条命令都由第一份执行。
再加两条辅助判断:
brewlist--versions|grepopencode# 包管理器这份登记的是什么版本桌面版则要看应用包本身,而不是关于窗口里那行字:
plutil-p/Applications/OpenCode.app/Contents/Info.plist|grep-iversion 顺带一条经验:这类工具的老线与新线,版本号形态完全不同。老线打 1.18.35,新线打 v2.0.26。所以看到 1.x,说明你跑的是被淘汰的那条线,不管它看起来多新。
二、为什么会分裂:三条通道,三个"最新"
下面是这次核对出来的实况(版本与下载地址均为 2026-10-10 的核对结果;这类工具更新很快,你动手前请再核一次):
六个格子,三个"最新"。你要是按任意一条通道去查,得到的都是正确答案;三条合起来看,才会发现它们指向两个不兼容的大版本。

官方迁移文档里有一句话是这件事的关键:新旧两个大版本共用同一个命令名,并且官方不再让它们默认并行安装——装新版之前,要先把包管理器装的旧版移除掉。
换句话说,今天没有"装多了没关系"这个选项。同一个名字,谁在 PATH 前面谁就是"你的版本",而这往往取决于你一两年前写进 shell 配置里的某一行。
三、统一的操作顺序:先退后进,一次只留一份
原则只有一句:新的一份先立起来、验证能跑,再删旧的那份。
命令行:装到官方通道,卸掉包管理器那份
opencodeservicestop mkdir-p~/.opencode/v1-backup cp-a~/.opencode/bin/opencode~/.opencode/v1-backup/opencode-1.18.35 curl-fsSLhttps://opencode.ai/v2/install|bash brewuninstallopencode 第 3 步为什么不直接 brew install 一个"最新版"就完事?因为包管理器的目录与官方安装脚本的落地目录不是同一个。这个工具的自升级走的也是官方安装脚本,而它的落地目录就是 ~/.opencode/bin——装在那里,以后升级不会再分裂;装到包管理器目录,就等于给自己留了下一次分裂的种子。

桌面版:自更新到不了新版,只能手工换
这里是整件事里最容易卡死的地方,也是我原来以为"等它自己更新就行"的错觉所在。
桌面版老版的更新配置写的是"从 GitHub Releases 取最新"。而新版桌面版根本没发布在 Releases 上——它只挂在官方的文件目录里。于是老版每次检查更新,问的都是一个永远只会回答"你就是最新"的地方。它永远升不上去,而且永远不会报错。
替换流程:
ditto 把新应用拷进 /Applications(别用普通复制,会丢掉签名相关属性)把第 2 步做扎实,后面就不用赌:版本号对得上、 bundle id 对得上、签名公证通过,才往下走。这三条任意一条不对,都停下来重新下载。
四、升级前要知道的三处破坏性改动
官方迁移文档列了三条,都是"改了就回不去"的那种:
tui.json 合并成一个全局 cli.json,这一步官方会自动迁移判断自己疼不疼,就看这三条有没有命中你的用法。我这台机器没挂插件、也没有终端配置文件,所以三条全躲过去了;配置目录、凭据、会话数据库都在原处,升级完直接可用。
如果你挂了插件,顺序要反过来:先确认插件有新版适配,再动主程序。
备份纪律,三句话:
~/.opencode/v1-backup/,不在 PATH 上)五、验收到这一步才算完
升级不是"命令跑完了",而是"这几项都对了":
which -a <命令> 只剩一条路径,没有第二份在旁边等着--version 输出的是新线版本号(v2.0.x,不再是 1.18.x)我这台的验收结果:命令行与桌面版都是 2.0.26 ,五条凭据全部沿用,模型列表正常,冒烟任务返回预期结果,旧的命令行二进制安安静静躺在备份目录里。
六、我把这三条写成了固定规则
这次之后,我把教训固化成了三句话,写进了交给助手读的项目规则里——写下来,下一个来接手这台机器的助手就不用再踩一遍:
which -a,再 --version,两句话的事。回到开头那个问题:装了三份,不是手滑,是因为今天很多 AI 工具把"最新"分散在好几条通道上,每条通道说的都对,而你的系统只听 PATH 的。
所以真正该问的不是"这个工具怎么用",而是"我到底在跑哪一份"。这个问题交给助手去做一次体检,比自己记那些目录要靠谱得多。
你机器上有几个版本的 AI 工具?如果不确定,把 which -a 的结果发给我看看。
本文由 AI 辅助创作,作者进行了实测验证和编辑修改。















































































