🕌

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