目录

当 Hermes Agent 偷走了你的 node

nvm use v22.22.1node -v` 仍是 v22.23.1?

不是 nvm 坏了,是 Hermes Agent 安装脚本在 ~/.local/bin 里留了三个“卧底”:nodenpmnpx


一、现象: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/node

nvm current 明明是 v22.22.1,终端里的 node 却是另一份。


二、凶手:Hermes Agent 的安装器

Hermes Agent 官方安装脚本(curl ... install.sh | bash)为了“自带 Node 运行时不污染系统”,会做这样一组动作(参考其 install_node 逻辑):

  1. 下载 Node v22 LTS 解压到 ~/.hermes/node/
  2. 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
  3. ~/.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 装进了 ~/.local prefix)
  • 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 → 唯一来源 nvm
  • codex/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 掉就清净了。