最近、Claude Codeがアホになったという話がめっちゃ話題です。
私もそう感じていたので、Claude Codeをダウングレードすることにしました。
TL;DR
- 筆者は、知らない間にClaude CodeをNative Installで使用していた
- Claude Codeには
claude install
という、特定バージョンをインストールするコマンドが用意されていることに気づかなかった - 適当にnpmで特定バージョンをインストールしたところ、Claudeが競合してしまった
- Native InstallされているClaudeを削除しようとしたら、削除方法がどこにも載ってなく、めっちゃ大変だった
Native Install
Claude Codeには、npm経由でインストールする方法と、Native Installを行う方法があります。
基本的には皆さん初回インストール時にはnpmで入れていると思うのですが、何らかの理由でAuto Updatorが動作しない(権限エラーなど)場合があり、そういった場合にはClaude Code上で /migrate-installer
コマンドを実行することで、勝手にNative Installに変えてくれて、権限エラーなどが回避できるようになっています。
現在インストールされているのがどのような方法なのかは、/doctor
コマンドを実行するか
$ claude doctor
Diagnostics
└ Currently running: native (1.0.98)
└ Path: /home/minato86/.local/bin/claude
└ Invoked: /home/minato86/.local/share/claude/versions/1.0.98
└ Config install method: native
└ Auto-updates enabled: disabled
└ Search: OK (bundled)
のような感じでチェックできます。
Currently runningがnativeになっている場合は、Native Installを利用していることになります。
ダウングレードしたい
Claude Codeをダウングレードしたい場合
claude config set -g autoUpdates false
を実行し、Configで自動アップデートを停止した上で、~/.claude/settings.json
に
{
"model": "opus",
"env": {
"DISABLE_AUTOUPDATER": "1"
}
}
を追記し、env上でも自動アップデートを停止します。(なんで二重で管理されてるのかはわからないけど)
そして
などのバージョンを入力すればダウングレード可能です。
しかしながら、私はそれに気づかず、npmでダウングレードをしようとしたところclaudeが競合してしまいました。
競合するとどうなる?
Claudeは、/home/user/.local/bin
を自動的に .bashrc
などの最下部に追記します。
よって、Claude CodeのNative Installが優先されます(多くの場合npmのPATHはもっと前に書いてあると思うので)
この場合、claude doctor
を実行すると以下のようになります
$ claude doctor
Diagnostics
└ Currently running: native (1.0.98)
└ Path: /home/minato86/.local/bin/claude
└ Invoked: /home/minato86/.local/share/claude/versions/1.0.98
└ Config install method: native
└ Auto-updates enabled: disabled
└ Search: OK (bundled)
Warning: Multiple installations found
└ npm-global at /home/minato86/.nvm/versions/node/v22.17.0/bin/claude
└ native at /home/minato86/.local/bin/claude
Warning: Multiple installations found
と表示され、競合していることがわかります。
こうなってしまった場合の解決はまぁ簡単で、npmでインストールしたものを削除すればいいです。
結局どっちを選ぶべきなの?
問題は、Native InstallしたClaude Codeを削除する方法がどこにも載ってないし、コマンドも用意されていないということです。
ここにもインストール方法しか載ってないし、アンインストール方法がありません。
Claude Code Uninstallと調べるとこのサイトがヒットするんですが、ここにもnpmのアンインストール方法しか載ってません
これは流石に気持ちが悪いので、個人的にはnpmでインストールしておいて、Native Installにも変更しないことを強く推奨します。
npmのClaude Codeを取り戻そう
時間がない方は、Claude Code Native Installからnpmの戻すやり方まとめに飛んでください。
以下では解決までの道筋を書き記しています。
まずは単純に、バイナリファイルを消してみます
$ rm /home/minato86/.local/bin/claude
$ claude
-bash: /home/minato86/.local/bin/claude: No such file or directory
当然Claude Codeがねぇぞと言われますね。
$ source ~/.bashrc
$ claude
╭───────────────────────────────────────────────────╮
│ ✻ Welcome to Claude Code! │
│ │
│ /help for help, /status for your current setup │
│ │
│ cwd: /home/minato86 │
╰───────────────────────────────────────────────────╯
再読み込みさせると、Claude Codeが起動します。
これでアンインストール完了!と思いきや、そううまくはいきません。
一度Claudeを起動した後終了し、whichコマンドを実行してみると
$ which claude
/home/minato86/.local/bin/claude
なんと消したはずのファイルが復活しています。
環境変数を再読み込みさせてみます。
$ claude --version
1.0.33 (Claude Code)
$ source ~/.bashrc
$ claude --version
1.0.98 (Claude Code)
1.0.33は、npmでインストールしているバージョンです。しかし、一度Claude Codeを起動すると、最新バージョンがなぜか復活しています。
まず、/home/user/.local/bin/claude
はシンボリックリンクです。なのでこれは実体ではないんですね。
$ readlink /home/minato86/.local/bin/claude
/home/minato86/.local/state/claude/launcher/claude-v0.0.8.sh
実体はlauncherなようです。
#!/bin/bash
printf '\033]0;claude\007'
VERSIONS_DIR="/home/minato86/.local/share/claude/versions"
LATEST_LINK="/home/minato86/.local/state/claude/latest"
if [[ -L "$LATEST_LINK" ]] && [[ -x "$LATEST_LINK" ]]; then
exec "$LATEST_LINK" "$@"
fi
if [[ -d "$VERSIONS_DIR" ]]; then
for VERSION_FILE in $(ls -t "$VERSIONS_DIR" 2>/dev/null); do
FULL_PATH="$VERSIONS_DIR/$VERSION_FILE"
if [[ -f "$FULL_PATH" ]] && [[ -x "$FULL_PATH" ]]; then
exec "$FULL_PATH" "$@"
fi
done
fi
echo "Error: No Claude CLI binary found." >&2
echo "Looked for:" >&2
echo " Latest symlink: $LATEST_LINK" >&2
echo " Versions directory: $VERSIONS_DIR" >&2
.local/state/claude/latest
もsymlinkだったので、実体は .local/share/claude/versions
にあるようです。
npmで実行する際はいらなさそうなので全部消してしまいましょう。
$ rm -rf /home/minato86/.local/share/claude/
$ rm -rf /home/minato86/.local/state/claude/
$ rm /home/minato86/.local/bin/claude
消したら確認してみます。
$ source ~/.bashrc
$ claude --version
1.0.33 (Claude Code)
Claude Codeのバージョンがnpmのものになっていますね。
$ claude
(Claudeの画面略)
$ claude --version
1.0.33 (Claude Code)
$ which claude
/home/minato86/.local/bin/claude
$ claude doctor
Claude CLI Diagnostic
Currently running: native (1.0.33)
Path: /home/minato86/.nvm/versions/node/v22.17.0/bin/node
Invoked: /home/minato86/.nvm/versions/node/v22.17.0/bin/claude
Auto-updates: Yes
Config install method: native
Config auto-updates: disabled
Warning: Multiple installations found
- npm-global at /home/minato86/.nvm/versions/node/v22.17.0/bin/claude
- native at /home/minato86/.local/bin/claude
Press Enter to continue…
なんと、また .local/bin/claude
が復活しています。中身を確認してみましょう。
$ readlink /home/minato86/.local/bin/claude
/home/minato86/.local/state/claude/launcher/claude-v0.0.8.sh
またシンボリックリンクが作成されており、launcherも復活しています。
~/.local/share/claude/versions$ ls
1.0.98
バージョンも復活していますね。
~/.local/state$ ls
claude gh opencode pnpm
stateも復活しています。
ここにきて、claude doctor
の結果を思い出します。
$ claude doctor
Claude CLI Diagnostic
Currently running: native (1.0.33)
Path: /home/minato86/.nvm/versions/node/v22.17.0/bin/node
Invoked: /home/minato86/.nvm/versions/node/v22.17.0/bin/claude
Auto-updates: Yes
Config install method: native
Config auto-updates: disabled
Warning: Multiple installations found
- npm-global at /home/minato86/.nvm/versions/node/v22.17.0/bin/claude
- native at /home/minato86/.local/bin/claude
Press Enter to continue…
まず、バージョンが1.0.33ということは、紛れもなくnpmのバージョンを実行しているはずですが、なぜかnativeと認識されているようです。
また、Config install method: native
という部分。つまり、Claude自体がNative Installを行うようにConfigに書き込んでいるようです。
つまり
Claude CodeのNative Installの関連ファイルを消す
↓
npmのClaude Codeが起動する
↓
Claude CodeがConfigを読み取り「Native Installを構成されているからNative Installしなければ!」と認識する
↓
バックグラウンドで処理が行われ、Native Installに変わる
ということが起こっていそうです。
ここで、Claude Codeにおいて重要なこと、自動的に作成される構成ファイル・ディレクトリを抑えておく必要があります。
先ほど削除したファイルたちは、Claude Code Native Installに関わるファイルたちでした。
そのほかに、Claude Codeは、npmでもNativeでも必ず作成される構成ファイルたちがあります。
この2つです。~/.claude
には、主にキャッシュファイルやヒストリー、ステートを管理するための状態ファイルやクレデンシャルなどが保管されているようです。
詳しくは↓
そして重要なのが、~/.claude.json
です。ここに claude config set -g
で設定したグローバルセッティングが保存されています。
先ほど確認した通り、Native Installを行うと、その情報が ~/.claude.json
にも保存されているようです。
つまり、Claude CodeがNative Install用に設定されているのにnpmでインストールしたClaude Codeを実行してもClaude CodeはNative Installをしようとしちゃうよね。ということみたいです。
確認してみます。
まずはconfigを変更します。
別のPCで確認したところ、npmでインストールした場合のinstallMethodはunknownになるようなので、それに合わせます
claude config set -g installMethod unknown
確認してみます
$ claude config ls -g
{
"installMethod": "unknown",
正しく設定が変更できてるようです。
続いて、先ほどと同様に、Claude Code Native Installの関連ファイルをすべて削除し、~/.bashrc
からClaude Codeが追加した環境変数も消しておきます。
.bashrc
- export PATH="/home/minato86/.local/bin:$PATH"
結果….
$ claude --version
1.0.33 (Claude Code)
$ claude doctor
Claude CLI Diagnostic
Currently running: npm-global (1.0.33)
Path: /home/minato86/.nvm/versions/node/v22.17.0/bin/node
Invoked: /home/minato86/.nvm/versions/node/v22.17.0/bin/claude
Auto-updates: No
Config install method: unknown
Config auto-updates: disabled
Update permissions: No (requires sudo)
Recommendation: Run '/migrate-installer' to enable auto-updates
This migrates to a local installation in ~/.claude/local
Press Enter to continue…
無事Claude Codeをnpm版に戻すことができました 🎉
特にこの後、勝手にNative Installに戻ったりもありませんでした。
Claude Code Native Installからnpmの戻すやり方まとめ
以上を踏まえて、Claude CodeのNative Installをnpmに戻す方法をまとめました。
基本的に、Claude Codeの状態ファイルなどには手を加えないので、これまでの履歴やログイン情報は消えません。
1. Configを変更する
Configを変更して、Native Installを使用しないように設定します。
claude config set -g installMethod unknown
2. 環境変数を削除する
Claude Codeは自動的に環境変数を追加しているので、削除します。
下記はBash環境ですが、適宜読み替えてください。
.bashrc
- export PATH="/home/minato86/.local/bin:$PATH"
3. 関連ファイルを削除する
Claude Code Native Installの関連ファイルをすべて削除します。
rm ~/.local/bin/claude
rm -rf ~/.local/state/claude/
rm -rf ~/.local/share/claude/
4. 環境変数を再読み込みする
ターミナルを再起動するか
で環境変数を再読み込みします。
5. npmでClaude Codeを入れる
npm install -g @anthropic-ai/claude-code
バージョン指定したい方は指定して入れてください。
あとは通常通りClaude Codeを実行すればOKです。
おわりに
外出先でこの問題に遭遇し、Claude Code Native Installとnpmが競合してぐちゃぐちゃになってしまい、うまく動かない事態になってしまいました(結局家帰って詳細に調査するまでお仕事はCodexにやってもらった)
/doctorなんて便利なコマンドがあるなら削除もいい感じにやってほしいもんですが、とりあえず同様の問題が起きた場合への備忘録ができたということで。
Views: 0