当 Hermes Agent 偷走了你的 node
nvm use v22.22.1后node -v` 仍是 v22.23.1?
不是 nvm 坏了,是 Hermes Agent 安装脚本在 ~/.local/bin 里留了三个“卧底”:node、npm、npx。
一、现象:nvm 切换“失效”
macOS + nvm 用户常有的操作:
nvm use v22.22.1
Now using node v22.22.1 (npm v10.9.8)
node -v
# v22.23.1 ❓
which node
# /Users/me/.local/bin/nodenvm current 明明是 v22.22.1,终端里的 node 却是另一份。
二、凶手:Hermes Agent 的安装器
Hermes Agent 官方安装脚本(curl ... install.sh | bash)为了“自带 Node 运行时不污染系统”,会做这样一组动作(参考其 install_node 逻辑):
- 下载 Node v22 LTS 解压到
~/.hermes/node/ - 把
node/npm/npx软链到~/.local/bin/ln -sf ~/.hermes/node/bin/node ~/.local/bin/node ln -sf ~/.hermes/node/bin/npm ~/.local/bin/npm ln -sf ~/.hermes/node/bin/npx ~/.local/bin/npx - 把
~/.local/bin写进你的 shell profile(export PATH="$HOME/.local/bin:$PATH")
Hermes 自己启动会用 ~/.hermes/node/bin/node 绝对路径,没问题。
但你的交互终端 PATH 里,~/.local/bin 排在了 nvm 的 .../v22.22.1/bin 前面——于是 node 永远先命中 Hermes 那份 v22.23.1。
⚠️ 这不是 bug,是 Hermes 故意做的“运行时隔离”,但副作用是:和 nvm 共用一台机器时,node 命令被抢答。
顺带连带反应:
npm list -g在 nvm 上下文看不到 codex/gemini/picgo(它们被你之前npm i -g装进了~/.localprefix)opencode在 nvm v22.22.1/bin 里,却能跑(PATH 向后扫到了)- 你以为 nvm 没生效,其实是 PATH 优先级问题
三、最小代价修复(我最终选的方案)
不需要卸 Hermes,不需要卸 brew node,不需要改 .zprofile 顺序——
rm ~/.local/bin/node ~/.local/bin/npm ~/.local/bin/npx重启终端(或新开 tab):
nvm use v22.22.1
which node # ~/.nvm/versions/node/v22.22.1/bin/node ✅
node -v # v22.22.1 ✅
which codex # ~/.local/bin/codex(仍在)
codex --version # 正常,env node 现在走 nvm 的 node ✅Hermes Agent 自身完全不受影响——它只认 ~/.hermes/node/bin/node 绝对路径,不依赖那三个软链。
四、为什么这是“最舒服”的解法
| 方案 | 代价 |
|---|---|
| 卸 brew node | 可行,但不是根因 |
改 .zprofile 把 nvm 锁 PATH 最前 |
有效,但要防后续脚本再插队 |
删 ~/.local/bin 里 node/npm/npx 软链 |
一刀,根因消失,Hermes 自活,nvm 夺回 node |
删完后环境收敛成:
node/npm/npx→ 唯一来源 nvmcodex/gemini/picgo/claude/uv→ 在~/.local/bin,运行时借 nvm 的 node- Hermes →
~/.hermes/node自闭环
五、以后装“自带 Node 的 AI 工具”要注意
Hermes、Claude Code、Codex CLI、Gemini CLI、OpenCode……只要安装器往 ~/.local/bin 写 node 软链,都可能和 nvm 打架。
诊断三连永远是:
which node
echo $PATH | tr ':' '\n' | grep -E 'nvm|local|brew'
npm config get prefix看到 node 不在 ~/.nvm/... 下,先怀疑是不是某个 Agent 的软链抢了位。
一行教训:AI Agent 可以自带 Node,但别让它的软链躺在
~/.local/bin里和你抢node这个名字。rm掉就清净了。