Volta から mise への完全移行と Codex CLI / pnpm / wrangler の再セットアップ
昨日の作業 で Node.js 管理を mise に切り替えたものの、Volta 本体は残したまま寝た。今日はその残りカスを全部片付けて、Codex CLI と pnpm と wrangler を mise 環境で動くように直す作業をやった。
途中で Codex CLI の npm パッケージが Windows 用バイナリを 404 で返してくる罠にハマり、aqua バックエンド経由で入れ直して解決した。bat ファイルが Volta の node.exe を直接参照していた件、apps/private/scripts/measure-deploy.ps1 の裸 wrangler 呼び出しが Volta グローバル前提で書かれていた件もまとめて潰した。
0. 今日のゴール
- Volta 残骸(2.9GB)をディスクから消す
- Codex CLI 0.124.0 を mise で動かす(できれば最新版)
- pnpm を PATH に戻す(昨日から消えたまま放置していた)
- Chrome native messaging host の bat ファイル群を mise 経由に書き換え
- mdx-playground の deploy スクリプトの裸 wrangler 呼び出しを潰す
1. Codex CLI を npm で入れたら 404 で爆死した
まずは素直に npm で入れようとした。
npm install -g @openai/codex
途中まで動いたが、最後に Windows 用バイナリを取りに行くところで止まった。
404 Not Found - GET https://registry.npmjs.org/@openai/codex-win32-x64
@openai/codex-win32-x64 という optionalDependencies のサブパッケージが npmjs に公開されていない。Linux/Mac 用は publish されていて、Windows 用だけ抜け落ちている状態らしい。npm 経由のインストールはここで詰む。
issue を探すと「aqua のバイナリリリース経由で入れろ」というワークアラウンドが見つかった。GitHub Releases には Rust ネイティブビルドの codex-x86_64-pc-windows-msvc.exe が置いてある。
mise の aqua バックエンドで指定すると、GitHub Releases から直接バイナリを引っ張ってくれる。
# ~/.config/mise/config.toml
[tools]
"aqua:openai/codex" = "0.123.0"
mise install
最新の 0.124.0 ではなく 0.123.0 になったが、aqua のレジストリ更新待ちなので妥協。Rust ネイティブビルドなので Node.js への依存が消えるのが副次的な利点。
codex --version
# codex 0.123.0
ChatGPT 認証で動作確認。
codex login
# ブラウザで ChatGPT にサインイン → トークン取得
codex exec -m gpt-5.4 "echo test"
返答が返ってきたので生きている。
2. pnpm が PATH から消えていた
昨日 Volta を切ったあと、pnpm --version が「コマンドが見つからない」と返すようになっていた。Volta が pnpm を shim していたのを忘れていた。
mise の aqua バックエンドで pnpm を指定する。
[tools]
"aqua:pnpm/pnpm" = "10.33.2"
mise install
pnpm --version
# 10.33.2
mdx-playground のリポジトリ直下で pnpm install が通ったので OK。
3. Chrome native messaging host の bat が Volta の node.exe を直叩きしていた
Claude Code の Stop hook で VOICEVOX 読み上げを動かす仕組みは、Chrome の native messaging host を経由している。そのエントリポイントの bat ファイルが Volta のパスを直接参照していた。
@echo off
"C:\Users\numbe\AppData\Local\Volta\bin\node.exe" "%~dp0claude-sound.js" %*
Volta を消すとこの行で死ぬ。chrome-native-host.bat も同じパターンで、合計2ファイル該当した。
mise の shim を見るように書き換え。
@echo off
"C:\Users\numbe\AppData\Local\mise\shims\node.exe" "%~dp0claude-sound.js" %*
Chrome を再起動して native messaging が通ることを確認。Stop hook で VOICEVOX が鳴ったので生きている。
4. Volta 残骸 2.9GB の削除でプロセスに掴まれていた
Volta のディレクトリを消そうとしたら、node.exe が動作中だと言われて削除を拒否された。
Remove-Item -Recurse -Force "C:\Users\numbe\AppData\Local\Volta"
# ファイルがプロセスに使用されているため、アクセスできません
Get-Process node で見ると、5プロセスが Volta の node.exe を掴んだまま残っていた。Claude Desktop 関連のサブプロセスや、過去のセッションの残骸が混ざっている。
ここで taskkill //IM node.exe //F を打つと Claude Code 自身が落ちる(CLAUDE.md にも警告あり)。プロセスごとに PID を確認して、Volta パスのものだけを個別に kill した。
Get-Process node | Where-Object { $_.Path -like "*Volta*" } | Stop-Process -Force
これで Volta パスの node.exe だけが落ちて、Claude Code 本体は生き残った。改めて Remove-Item で削除し、2.9GB が消えた。
5. measure-deploy.ps1 の裸 wrangler 呼び出し
apps/private/scripts/measure-deploy.ps1 をデプロイ時間計測のために回したら、wrangler が見つからないエラーで止まった。
該当箇所を grep で見ると「裸の wrangler 呼び出し」が残っていた。
# Before: Volta 時代のグローバル wrangler 前提
wrangler pages deploy ...
Volta は wrangler をグローバルにインストールして PATH に通す挙動だったので、これで動いていた。mise はグローバル npm パッケージを直接 shim しないので、リポジトリの devDependencies に入っている wrangler を pnpm exec 経由で呼び出す形に直す。
# After: pnpm exec で devDependencies の wrangler を呼ぶ
pnpm exec wrangler pages deploy ...
apps/private/scripts/measure-deploy.ps1 と、ルートの scripts/measure-deploy.ps1(同名で2つあった)の両方を修正。デプロイ計測スクリプトを再実行して、wrangler 呼び出しが通った。
学び
- npm の optionalDependencies は publish 漏れがあると気付きにくい: 今回の
@openai/codex-win32-x64のように、プラットフォーム別サブパッケージが npmjs に上がっていないと、Windows ユーザーだけが 404 を踏む。aqua のように GitHub Releases を直接見るバックエンドの方が、こういう publish 事故に強い - Volta が裏で何を shim していたか、抜いてみないと気付かない: pnpm が消えた件と、bat ファイルが Volta の node.exe を直接見ていた件は、Volta を抜くまで完全に忘れていた。「移行先で何を入れるか」のリストアップ時に、
Volta\binの中身を一度全部見ておけば事前に検出できた - 「裸のコマンド呼び出し」はグローバルツールに依存するアンチパターン:
wrangler ...のような書き方は、PATH に通っているグローバル版が暗黙の前提になっている。pnpm exec wrangler ...かnpx wrangler ...で devDependencies を明示的に呼ぶ形にしておけば、Node 管理ツールの切り替えに耐える
残タスク
- Codex CLI を 0.124.0 に上げる(aqua レジストリ側の更新待ち)
- 他のリポジトリにも裸 wrangler / 裸 wrangler 以外の裸グローバル呼び出しが残っていないか grep で全件チェック
- mise の
~/.config/mise/config.tomlを git 管理下に置いて、別マシンでも同じ環境を再現できるようにする