Claude Codeが起動しない原因と直し方:permission deniedやnative binary not installedの対処法

ターミナル画面とnpmパッケージを示すClaude Codeトラブルシューティングのイラスト AIツール
スポンサーリンク

Claude Codeが起動しないトラブルとは

Claude Codeをターミナルから起動しようとしたときに、突然以下のようなエラーが出ることがあります。

claude
zsh: permission denied: claude

または、claude コマンド自体は存在しているように見えるのに、通常起動できなかったり、簡単な疎通確認でも次のようなメッセージが出たりすることがあります。

Error: claude native binary not installed.

Either postinstall did not run (--ignore-scripts, some pnpm configs)
or the platform-native optional dependency was not downloaded
(--omit=optional).

この症状は、Claude Code本体の設定や過去の会話履歴が壊れたというより、npmでインストールされているClaude Codeの実行ファイルが中途半端な状態になっている可能性が高いです。

この記事では、実際に遭遇したケースをもとに、原因の確認方法と安全な修復手順をまとめます。

今回発生した症状

今回の環境では、作業ディレクトリで claude を起動しようとすると失敗しました。

実際に困る場面は、いつも通り claude と入力して対話セッションを開こうとしたときです。

claude

切り分けのために、コマンドの場所とバージョン表示も確認しました。

which claude

claude --version

一見すると claude コマンドが見つからないように見えますが、PATH上には次のシンボリックリンクが存在していました。

/opt/homebrew/bin/claude -> ../lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe

つまり、Homebrew配下にインストールされたnpmグローバルパッケージのClaude Codeを起動しようとしていた、という状態です。

原因はnpmグローバルインストールの破損

リンク先のファイルを確認すると、本来のClaude Code実行ファイルではなく、数百バイト程度のプレースホルダーファイルになっていました。

ls -la /opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/bin

中身を見ると、次のようなエラーメッセージを表示するだけのファイルでした。

Error: claude native binary not installed.
Either postinstall did not run
or the platform-native optional dependency was not downloaded

Claude Codeのnpmパッケージは、インストール時に環境に合ったnative binaryをoptional dependencyとして取得し、postinstallで bin/claude.exe に配置する仕組みになっています。

今回の環境はApple Silicon Macだったため、本来は以下のnative packageが必要でした。

@anthropic-ai/claude-code-darwin-arm64

ところが、native binary自体は一部存在していたものの、package.jsonなどが欠けており、npmパッケージとしては不完全な状態でした。そのため、Claude Codeのpostinstallやwrapperがnative binaryを見つけられず、起動できなくなっていました。

履歴や設定は消えるのか

このタイプのトラブルで多くの人が心配するのは、Claude Codeの過去の履歴や設定が消えるかどうかです。

結論から言うと、npmグローバルインストールを修復するだけなら、通常は履歴やプロジェクト設定は消えません。

今回修復対象になったのは、以下のようなClaude Code本体のインストール先です。

/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/
/opt/homebrew/bin/claude

一方、プロジェクトごとの設定は次のような場所にあります。

.claude/settings.local.json

また、ユーザー単位の履歴や設定は一般的にホームディレクトリ配下に保存されます。

~/.claude/
~/.config/claude/

今回の修復では、これらの履歴・設定領域には触れていません。壊れていたのは、Claude Codeを起動するための実行ファイル側でした。

まず確認するコマンド

同じような症状が出た場合は、いきなり削除や再インストールをする前に、次の順番で確認するのがおすすめです。

1. claudeコマンドの場所を確認する

which claude
type -a claude
whence -va claude

zshでは which だけだと状況が分かりにくいことがあります。type -awhence -va も併用すると、alias、function、PATH上の実体を確認できます。

2. Homebrew配下のリンクを確認する

Apple Silicon MacでHomebrewを使っている場合、npmのグローバルパッケージは /opt/homebrew 配下に入っていることがあります。

ls -la /opt/homebrew/bin/claude
readlink /opt/homebrew/bin/claude

正常なら、だいたい以下のようなリンクになっています。

/opt/homebrew/bin/claude -> ../lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe

3. 実行ファイルのサイズを確認する

ls -lh /opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe
file /opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe

今回の正常復旧後は、claude.exe は約205MBのMach-O arm64実行ファイルになっていました。

-rwxr-xr-x  205M  claude.exe
claude.exe: Mach-O 64-bit executable arm64

もし数百バイト程度のテキストファイルであれば、native binaryが正しく配置されていない可能性があります。

4. npmのグローバルインストール状態を確認する

npm list -g @anthropic-ai/claude-code --depth=0

今回の環境では、パッケージ自体は存在していました。

@anthropic-ai/claude-code@2.1.121

しかし、存在していることと正常に起動できることは別です。postinstallやoptional dependencyが失敗していると、パッケージは入っているように見えても claude は起動できません。

修復手順

基本的には、Claude Codeをnpmで再インストールするのが安全です。

npm install -g @anthropic-ai/claude-code

特定バージョンに固定したい場合は、バージョンを指定します。

npm install -g @anthropic-ai/claude-code@2.1.121

再インストール後、以下で確認します。

claude --version

これはClaude Codeの対話セッションを起動するためのコマンドではなく、バイナリが実行できる状態かを見るための軽い診断です。正常なら、次のように表示されます。

2.1.121 (Claude Code)

実際に対話セッションを確認する場合は、通常どおり以下を実行します。

claude

非対話で確認したい場合は、短いプロンプトを渡す方法もあります。

claude -p "hello"

ENOTEMPTYが出る場合の対処

再インストール時に、次のようなエラーが出る場合があります。

npm error code ENOTEMPTY
npm error syscall rename
npm error path /opt/homebrew/lib/node_modules/@anthropic-ai/claude-code
npm error dest /opt/homebrew/lib/node_modules/@anthropic-ai/.claude-code-xxxxxxx

これは、npmが既存のClaude Codeディレクトリを退避しようとしたときに、過去の一時ディレクトリが残っていて衝突している状態です。

今回もこのパターンでした。

確認します。

ls -la /opt/homebrew/lib/node_modules/@anthropic-ai

以下のような一時ディレクトリが残っている場合があります。

.claude-code-2DTsDk1V

これはClaude Codeの会話履歴ではなく、npmがパッケージ更新時に使った退避用ディレクトリです。中身が通常のパッケージファイルであることを確認したうえで、削除します。

rm -rf /opt/homebrew/lib/node_modules/@anthropic-ai/.claude-code-2DTsDk1V

同時に /opt/homebrew/bin 側にも一時リンクが残っている場合があります。

ls -la /opt/homebrew/bin | grep claude

不要なnpm退避用ファイルがあれば削除してから、再度インストールします。

npm install -g @anthropic-ai/claude-code
claude --version

ここでも claude --version は起動確認ではなく、修復直後の疎通確認として使っています。対話起動まで確認するなら、続けて claude を実行します。

起こりやすい原因

このトラブルは、他の人の環境でも起こる可能性があります。特に次のようなケースでは注意が必要です。

  • npm install -g @anthropic-ai/claude-code の途中で中断した
  • ネットワークが不安定でoptional dependencyの取得に失敗した
  • --ignore-scripts を付けてインストールした
  • --omit=optional を付けてインストールした
  • Claude Codeの自動更新や手動更新が途中で止まった
  • npmの退避用一時ディレクトリが残った
  • Node.jsやnpmのバージョン変更直後に再インストールした
  • Apple Silicon Macでdarwin-arm64のnative packageが正しく展開されなかった

Claude Codeはnative binaryを使うため、単純なJavaScript CLIよりもインストール時のpostinstallやoptional dependencyの影響を受けやすいです。

安全に作業するための注意点

削除や再インストールを行う前に、対象が「Claude Code本体のインストール先」なのか「履歴・設定ファイル」なのかを分けて考えることが大切です。

触ってよい可能性が高い場所は、npmのパッケージ領域です。

/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/
/opt/homebrew/lib/node_modules/@anthropic-ai/.claude-code-xxxxxxx
/opt/homebrew/bin/claude

一方で、安易に削除しないほうがよい場所は、ユーザー設定やプロジェクト設定です。

~/.claude/
~/.config/claude/
.claude/

特に .claude/settings.local.json には、プロジェクトごとの権限設定が入っていることがあります。今回のケースでも、このファイルは読み取り確認だけ行い、変更や削除はしていません。

まとめ

Claude Codeが permission denied で起動しない場合、原因はプロジェクトファイルや履歴ではなく、npmグローバルインストールの破損であることがあります。

今回のポイントは以下です。

  • /opt/homebrew/bin/claude は存在していたが、リンク先が壊れていた
  • bin/claude.exe がnative binaryではなくプレースホルダーだった
  • optional dependencyの @anthropic-ai/claude-code-darwin-arm64 が不完全だった
  • npmの退避用一時ディレクトリが残っていて再インストールも一度失敗した
  • 一時ディレクトリを削除し、同じバージョンで再インストールして復旧した
  • 履歴や .claude/settings.local.json は削除していない

最終的には、まず以下でバイナリの疎通を確認できました。

claude --version

そのうえで、普段通り claude を実行して対話セッションを開ける状態に戻しました。

同じ症状が出た場合は、まず claude のリンク先と bin/claude.exe の実体を確認し、必要に応じてnpmで再インストールするのが現実的な対処法です。

タイトルとURLをコピーしました