Volta から mise への移行完了 - Claude Code を入れ直すまでに詰まった5つの落とし穴
2026年3月に Volta から mise へ移行する方針 を立てていたが、Volta側で不具合が出たのを機に今日ようやく実行した。Node.js の管理を mise に切り替え、Claude Code も現行の環境で動く形で入れ直すところまでやった。
結論から言うと、単純な「Volta アンインストール → mise インストール」では済まなかった。PATH の優先順位、Windows の環境変数画面が保存を拒否する問題、npm 版 Claude Code が中身空っぽだった件など、詰まりどころが5つあったので記録に残す。
0. 今回のゴール
- Node.js 管理を Volta から mise に切り替える
- Volta を PATH から外し、
nodeコマンドは mise の shims を見るようにする - Claude Code を現環境で動く形で入れ直す(npm 版ではなく公式インストーラー版)
1. PowerShell で head や which が動かない
最初に mise の状態を見ようとして、いつものノリで打った。
mise doctor 2>&1 | head -5
返ってきたのはエラー。
head: The term 'head' is not recognized as a name of a cmdlet,
function, script file, or executable program.
which node も同じ理由で弾かれた。PowerShell に Linux/macOS のコマンドをそのまま渡していたのが原因。書き換えると動いた。
mise doctor 2>&1 | Select-Object -First 5
Get-Command node
(Get-Command node).Source
単純な話だが、頭を PowerShell モードに切り替えないとここで最初の10分を溶かす。
2. mise は動いていたが、PATH で Volta が先に解決されていた
mise doctor の出力はこう返ってきた。
version: 2026.4.19 windows-x64 (2026-04-23)
shims_on_path: yes
self_update_available: yes
mise 自体は入っていて、shims も PATH に乗っている。ここまでは正常。
ところが Get-Command node を叩くと、
CommandType Name Version Source
----------- ---- ------- ------
Application node.exe 0.0.0.0 C:\Program Files\Volta\...
node の実体が Volta を指していた。Get-Command node -All で全候補を並べると、Volta と mise の両方が登録されていて、PATH の並び順で先頭にあった Volta が勝っていた。
一時的に mise を優先させて確認した。
$env:Path = "$env:USERPROFILE\AppData\Local\mise\shims;$env:Path"
Get-Command node
node -v
# v22.22.2
mise 側の Node(v22.22.2)に切り替わった。原因は mise ではなく PATH の並び順だと確定した。
3. Windows の環境変数画面が「長すぎて保存できない」と言い出した
環境変数を恒久的に直すため、Windows の環境変数編集画面を開いた。ユーザー環境変数の Path を整理しようとしたところで、保存時にこれが出た。
この環境変数は長すぎます。
このダイアログ ボックスでは、2047 文字より長い値は設定できません。
環境変数画面には 2047 文字の制限がある。Path が長く育ちすぎたユーザーにはよくある壁。
GUI を諦めて、PowerShell から直接ユーザー環境変数を書き換えることにした。
# 現在のユーザー環境変数 Path を取得
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
# Volta 関連を除外し、重複も落とす
$newPath = ($userPath -split ';' |
Where-Object {
$_ -and
$_ -ne "C:\Program Files\Volta\" -and
$_ -ne "C:\Program Files\Volta"
} |
Select-Object -Unique) -join ';'
# 保存
[Environment]::SetEnvironmentVariable("Path", $newPath, "User")
この方法なら 2047 文字制限に引っかからない。
4. ユーザー環境変数を消したのに、まだ Volta の node が先に拾われた
新しくターミナルを開き直して再確認した。
Get-Command node -All
# Application node.exe 0.0.0.0 C:\Program Files\Volta\...
# Application node.exe 0.0.0.0 C:\Users\numbe\AppData\...
まだ Volta が先頭にいる。node -v も v22.22.0(Volta 側)を返してくる。
管理者 PowerShell を開くと mise が先頭になり node -v も v22.22.2 を返したので、残っているのはシステム環境変数側ではなく、ユーザー環境変数のもう1つの Volta エントリだった。$env:USERPROFILE\AppData\Local\Volta\bin が生き残っていた。
これも PowerShell から削った。
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
$newPath = ($userPath -split ';' |
Where-Object {
$_ -and
$_ -ne "$env:USERPROFILE\AppData\Local\Volta\bin" -and
$_ -ne "$env:USERPROFILE\AppData\Local\Volta\bin\"
} |
Select-Object -Unique) -join ';'
[Environment]::SetEnvironmentVariable("Path", $newPath, "User")
ここで落とし穴がもう1つ。削除直後の PowerShell セッションで $env:Path を見ると、まだ Volta が残っているように見えた。[Environment]::SetEnvironmentVariable(...) は保存済みのレジストリ側を書き換えるだけで、起動中のプロセスの $env:Path は書き換えない。保存済みの方を直接見ると、
[Environment]::GetEnvironmentVariable("Path", "User") -split ';' | Select-String "Volta|mise"
# C:\Users\numbe\AppData\Local\mise\shims
消えていた。ターミナルを開き直せば反映される。
5. Node は切り替わったのに claude コマンドが消えた
cd eurekapu-nuxt4 して claude --resume を叩いたら、
claude: The term 'claude' is not recognized as a name of a cmdlet...
これで気付いた。以前使っていた claude は Volta の npm global 領域に入っていた。Volta を PATH から外した瞬間、そこに入っていた Claude Code も一緒に見えなくなった。
mise 側の Node と npm で入れ直せばいい、と考えて動いた。
Get-Command node
# C:\Users\numbe\AppData\Local\mise\... ← mise側
Get-Command npm
# C:\Users\numbe\AppData\Local\mise\... ← mise側
npm prefix -g
# C:\Users\numbe\AppData\Local\mise\installs\node\22.22.2
Node も npm も mise 側。問題なさそうに見えた。
npm install -g @anthropic-ai/claude-code
# added 1 package in 1s
Get-Command claude -All
# claude: The term 'claude' is not recognized...
入れたのに、また見つからない。
mise の shim が作り直されていないのが原因だった。npm で global に何かを入れたら、mise に shim を再生成してもらう必要がある。
mise reshim node
Get-Command claude -All
# Application claude.exe 0.0.0.0 C:\Users\numbe\AppData\Local\mise\...
# Application claude 0.0.0.0 C:\Users\numbe\AppData\Local\mise\...
claude は見えるようになった。が、実行したら次のエラーに突き刺さった。
6. npm 版 claude.exe の中身は、エラーメッセージを出すだけのスクリプトだった
claude --version
このバージョンの C:\Users\numbe\AppData\Local\mise\installs\node\22.22.2\
node_modules\@anthropic-ai\claude-code\bin\claude.exe は、実行中の Windows の
バージョンと互換性がありません。コンピューターのシステム情報を確認してから、
ソフトウェアの発行元に問い合わせてください。
Windows の互換性エラー。claude.exe の実体を見に行った。
Get-ChildItem "$env:LOCALAPPDATA\mise\installs\node\22.22.2\node_modules\@anthropic-ai\claude-code\bin"
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2026/04/24 7:22 500 claude.exe
500 バイト。普通の Windows 実行ファイルが 500 バイトで収まるわけがない。
中身を見た。
Get-Content "$env:LOCALAPPDATA\mise\installs\node\22.22.2\node_modules\@anthropic-ai\claude-code\bin\claude.exe"
echo "Error: claude native binary not installed." >&2
echo "" >&2
echo "Either postinstall did not run (--ignore-scripts, some pnpm configs)" >&2
echo "or the platform-native optional dependency was not downloaded" >&2
echo "(--omit=optional)." >&2
echo "" >&2
echo "Run the postinstall manually (adjust path for local vs global install):" >&2
echo " node node_modules/@anthropic-ai/claude-code/install.cjs" >&2
echo "" >&2
echo "Or reinstall without --ignore-scripts / --omit=optional." >&2
exit 1
正体が割れた。npm 版の Claude Code は claude.exe を装ったシェルスクリプトで、本体のネイティブバイナリは optional dependency として別途ダウンロードされる仕組みになっている。mise 経由の npm インストールだと、この postinstall / optional dependency のルートが機能せず、ネイティブバイナリが降ってこない。だから 500 バイトのエラースクリプトだけが残った。
ここは npm での格闘をやめて、Anthropic 公式のネイティブインストーラーに切り替えた。
npm uninstall -g @anthropic-ai/claude-code
mise reshim node
# Claude Code 公式インストーラー
irm https://claude.ai/install.ps1 | iex
Setting up Claude Code...
Claude Code successfully installed!
Version: 2.1.119
Location: C:\Users\numbe\.local\bin\claude.exe
Installation complete!
確認した。
where.exe claude
# C:\Users\numbe\.local\bin\claude.exe
claude --version
# 2.1.119 (Claude Code)
動いた。
最終状態
| 項目 | 結果 |
|---|---|
| Node.js の管理 | mise に切り替え済み |
node -v | v22.22.2(mise 側) |
C:\Program Files\Volta\node.exe | PATH から除外済み |
| ユーザー環境変数の Volta 参照 | 削除済み |
| Claude Code | 公式ネイティブインストーラー版(C:\Users\numbe\.local\bin\claude.exe) |
claude --version | 2.1.119 (Claude Code) |
今後プロジェクトで使うときはいつも通り。
cd C:\Users\numbe\Git_repo\eurekapu-nuxt4
claude --resume
詰まったポイント5つの総括
| # | 詰まりどころ | 解決策 |
|---|---|---|
| 1 | PowerShell で head / which を打っていた | Select-Object -First / Get-Command を使う |
| 2 | mise は入っていたが PATH の優先順位で Volta が勝っていた | Get-Command node -All で並び順を確認 |
| 3 | 環境変数編集画面が「2047文字超え」で保存を拒否した | [Environment]::SetEnvironmentVariable(...) で直接書き換え |
| 4 | 環境変数を更新してもセッションの $env:Path に反映されない | 保存済みは [Environment]::GetEnvironmentVariable(..., "User") で見る |
| 5 | npm 版 claude.exe の中身がネイティブバイナリ不足のエラースクリプト | 公式の irm https://claude.ai/install.ps1 | iex で入れ直す |
今後の切り分けに使うコマンド集
同じ種類の問題にまた当たったとき、このリストを順に叩けばだいたい当たりが付く。
# Node / npm がどこを見ているか
Get-Command node -All
node -v
npm -v
npm prefix -g
# PATH に Volta / mise がどう並んでいるか
$env:Path -split ';' | Select-String "Volta|mise"
[Environment]::GetEnvironmentVariable("Path", "User") -split ';' | Select-String "Volta|mise"
[Environment]::GetEnvironmentVariable("Path", "Machine") -split ';' | Select-String "Volta|mise"
# Claude Code
where.exe claude
claude --version
mise に npm global で何か入れたあと。
mise reshim node
Claude Code の再インストール(Windows)。
irm https://claude.ai/install.ps1 | iex
関連記事
- Voltaがメンテナンス終了 - miseへの移行をどう進めるか(移行方針を立てた記事。今回の作業で Phase 4 まで完了)
- Claude Code remote-controlがVolta環境で動かないバグを直した(Volta時代のClaude Code の不具合対応)