• #Node.js
  • #Volta
  • #mise
  • #Claude Code
  • #Windows
  • #PowerShell
  • #開発環境
開発misc-dev完了

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 で headwhich が動かない

最初に 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 -vv22.22.2(mise 側)
C:\Program Files\Volta\node.exePATH から除外済み
ユーザー環境変数の Volta 参照削除済み
Claude Code公式ネイティブインストーラー版(C:\Users\numbe\.local\bin\claude.exe
claude --version2.1.119 (Claude Code)

今後プロジェクトで使うときはいつも通り。

cd C:\Users\numbe\Git_repo\eurekapu-nuxt4
claude --resume

詰まったポイント5つの総括

#詰まりどころ解決策
1PowerShell で head / which を打っていたSelect-Object -First / Get-Command を使う
2mise は入っていたが PATH の優先順位で Volta が勝っていたGet-Command node -All で並び順を確認
3環境変数編集画面が「2047文字超え」で保存を拒否した[Environment]::SetEnvironmentVariable(...) で直接書き換え
4環境変数を更新してもセッションの $env:Path に反映されない保存済みは [Environment]::GetEnvironmentVariable(..., "User") で見る
5npm 版 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

関連記事