Serenaでnodenv localが反映されずnpmエラーになる問題を.zprofileで解決した話
以下、GPT5とのやり取りをまとめてもらいました(自分でも追記してます)
🧠 概要
nodenv で Node.js のバージョンを管理している環境で、LLMエージェント Serena(Cursor経由で動作)を起動したところ、次のようなエラーが発生しました。SerenaのMCPの設定自体はCursorのエディタの方で設定しています。で、エディタでもonboardingの時に下記のエラーが出ていました。
Command ‘npm install –prefix ./ typescript@5.5.4’ returned non-zero exit status 127.
🔍 原因
結論から言うと:
Serena(非対話シェルで起動するプロセス)が
.zshrcを読み込まないため、
nodenv localの設定が反映されていなかった。
macOSの挙動のポイント
| シェルの種類 | 読み込まれる設定ファイル | 有効範囲 |
|---|---|---|
| 対話シェル(通常のターミナル) | .zshrc |
手動で開いたターミナル |
| ログインシェル(GUIアプリやCursorなど) | .zprofile |
非対話 / GUIアプリ起動時 |
Cursor や Serena は GUI 経由で起動するため、nodenv の初期化 (eval "$(anyenv init -)") が呼ばれず、npm コマンドが見つからない状態になっていました。そもそもmacOSにnodeが入ってないので、Serenaが起動した際にnode自体を見つけられない、という現象です。
で、初めは nodenv global でnodeを指定すればなおりましたが各環境で違うバージョンのnodeを使っているケースもあるので、試しに「環境ごとに設定してある nodenv local を反映したい」ということで下記の手順をとっています。が、別に nodenv globalでいいんじゃね?という気持ちに段々と書いてるうちになってきたな、、、
💡 解決方法:.zprofile に初期化を追加する
非対話環境でも nodenv を有効化するために、 .zprofile に以下を追加します。
# Homebrew の環境変数を設定(Apple Silicon 用)
eval "$(/opt/homebrew/bin/brew shellenv)"
# anyenv / nodenv の初期化
if [ -s "$HOME/.anyenv/bin/anyenv" ]; then
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
fi
✅ この設定でできること
• Cursor / Serena / cursor-agent などの 非対話シェル からでも
node / npm コマンドを正しく認識。
• nodenv local や nodenv global の設定が反映される。
• TypeScript LSP の自動セットアップなど、内部的な npm install が成功する。
これなら別に nodenv globalで良くね?という気持ちにやっぱり段々となってきますね。
🔧 動作確認
Cursor 内のターミナルで以下を実行して確認:
which node
which npm
node -v
npm -v
期待される出力例:
/Users/you/.anyenv/envs/nodenv/shims/node
v22.17.1
もしここで ~/.anyenv/envs/nodenv/shims が表示されていれば成功です 🎉
⸻
🧩 まとめ
項目 内容
問題 Serena が npm を見つけられず TypeScript LSP のセットアップに失敗
原因 .zshrc は GUI / 非対話シェルで読み込まれないため、nodenv local が反映されない
対処法 .zprofile に anyenv / nodenv 初期化を追加
効果 GUI経由(Cursor, Serenaなど)でも nodenv の設定が有効に
🪄 おまけ:挙動の理解メモ
• .zshrc → 手動で開くターミナル(対話シェル)用
• .zprofile → GUIアプリ・非対話シェル用(Cursor, VSCode, cronなど)
• anyenv init - → 各言語環境(nodenv, pyenv など)の shim を PATH に追加
• brew shellenv → Apple Silicon 環境での Homebrew の PATH 設定
この2行を .zprofile に入れることで、
macOS上のほとんどのシナリオで同じ Node.js 環境を再現できます。
💬 参考環境
• macOS Sonoma 14.x (Apple Silicon)
• nodenv (via anyenv)
• Node.js 22.17.1
• Cursor + Serena (MCPサーバー)
しばらくこれで使ってみますが、どうなんだろうなぁ、、、
ツッコミどころがあればぜひお願いします。
Discussion