[{"data":1,"prerenderedAt":533},["ShallowReactive",2],{"content-/volta-to-mise-migration-execution":3,"all-pages-for-dir":531,"og-image-/volta-to-mise-migration-execution":532},{"id":4,"title":5,"body":6,"category":509,"description":510,"extension":511,"meta":512,"navigation":476,"path":513,"project_name":514,"published":515,"publishedAt":516,"seo":517,"stem":518,"tags":519,"todo":528,"updatedAt":529,"__hash__":530},"pages/2026-04/2026-04-24/volta-to-mise-migration-execution.md","Volta から mise への完全移行と Codex CLI / pnpm / wrangler の再セットアップ",{"type":7,"value":8,"toc":499},"minimark",[9,13,22,30,33,38,57,59,63,66,82,85,93,99,106,109,133,142,145,160,163,183,186,188,192,199,202,216,235,245,247,251,254,271,278,281,295,298,300,304,311,326,332,339,348,355,357,361,366,369,384,391,406,415,417,420,460,462,465,495],[10,11,5],"h1",{"id":12},"volta-から-mise-への完全移行と-codex-cli-pnpm-wrangler-の再セットアップ",[14,15,16,21],"p",{},[17,18,20],"a",{"href":19},"/volta-to-mise-migration-complete","昨日の作業"," で Node.js 管理を mise に切り替えたものの、Volta 本体は残したまま寝た。今日はその残りカスを全部片付けて、Codex CLI と pnpm と wrangler を mise 環境で動くように直す作業をやった。",[14,23,24,25,29],{},"途中で Codex CLI の npm パッケージが Windows 用バイナリを 404 で返してくる罠にハマり、aqua バックエンド経由で入れ直して解決した。bat ファイルが Volta の node.exe を直接参照していた件、",[26,27,28],"code",{},"apps/private/scripts/measure-deploy.ps1"," の裸 wrangler 呼び出しが Volta グローバル前提で書かれていた件もまとめて潰した。",[31,32],"hr",{},[34,35,37],"h2",{"id":36},"_0-今日のゴール","0. 今日のゴール",[39,40,41,45,48,51,54],"ul",{},[42,43,44],"li",{},"Volta 残骸（2.9GB）をディスクから消す",[42,46,47],{},"Codex CLI 0.124.0 を mise で動かす（できれば最新版）",[42,49,50],{},"pnpm を PATH に戻す（昨日から消えたまま放置していた）",[42,52,53],{},"Chrome native messaging host の bat ファイル群を mise 経由に書き換え",[42,55,56],{},"mdx-playground の deploy スクリプトの裸 wrangler 呼び出しを潰す",[31,58],{},[34,60,62],{"id":61},"_1-codex-cli-を-npm-で入れたら-404-で爆死した","1. Codex CLI を npm で入れたら 404 で爆死した",[14,64,65],{},"まずは素直に npm で入れようとした。",[67,68,73],"pre",{"className":69,"code":70,"language":71,"meta":72,"style":72},"language-powershell shiki shiki-themes vitesse-light vitesse-light","npm install -g @openai/codex\n","powershell","",[26,74,75],{"__ignoreMap":72},[76,77,80],"span",{"class":78,"line":79},"line",1,[76,81,70],{},[14,83,84],{},"途中まで動いたが、最後に Windows 用バイナリを取りに行くところで止まった。",[67,86,91],{"className":87,"code":89,"language":90},[88],"language-text","404 Not Found - GET https://registry.npmjs.org/@openai/codex-win32-x64\n","text",[26,92,89],{"__ignoreMap":72},[14,94,95,98],{},[26,96,97],{},"@openai/codex-win32-x64"," という optionalDependencies のサブパッケージが npmjs に公開されていない。Linux/Mac 用は publish されていて、Windows 用だけ抜け落ちている状態らしい。npm 経由のインストールはここで詰む。",[14,100,101,102,105],{},"issue を探すと「aqua のバイナリリリース経由で入れろ」というワークアラウンドが見つかった。GitHub Releases には Rust ネイティブビルドの ",[26,103,104],{},"codex-x86_64-pc-windows-msvc.exe"," が置いてある。",[14,107,108],{},"mise の aqua バックエンドで指定すると、GitHub Releases から直接バイナリを引っ張ってくれる。",[67,110,114],{"className":111,"code":112,"language":113,"meta":72,"style":72},"language-toml shiki shiki-themes vitesse-light vitesse-light","# ~/.config/mise/config.toml\n[tools]\n\"aqua:openai/codex\" = \"0.123.0\"\n","toml",[26,115,116,121,127],{"__ignoreMap":72},[76,117,118],{"class":78,"line":79},[76,119,120],{},"# ~/.config/mise/config.toml\n",[76,122,124],{"class":78,"line":123},2,[76,125,126],{},"[tools]\n",[76,128,130],{"class":78,"line":129},3,[76,131,132],{},"\"aqua:openai/codex\" = \"0.123.0\"\n",[67,134,136],{"className":69,"code":135,"language":71,"meta":72,"style":72},"mise install\n",[26,137,138],{"__ignoreMap":72},[76,139,140],{"class":78,"line":79},[76,141,135],{},[14,143,144],{},"最新の 0.124.0 ではなく 0.123.0 になったが、aqua のレジストリ更新待ちなので妥協。Rust ネイティブビルドなので Node.js への依存が消えるのが副次的な利点。",[67,146,148],{"className":69,"code":147,"language":71,"meta":72,"style":72},"codex --version\n# codex 0.123.0\n",[26,149,150,155],{"__ignoreMap":72},[76,151,152],{"class":78,"line":79},[76,153,154],{},"codex --version\n",[76,156,157],{"class":78,"line":123},[76,158,159],{},"# codex 0.123.0\n",[14,161,162],{},"ChatGPT 認証で動作確認。",[67,164,166],{"className":69,"code":165,"language":71,"meta":72,"style":72},"codex login\n# ブラウザで ChatGPT にサインイン → トークン取得\ncodex exec -m gpt-5.4 \"echo test\"\n",[26,167,168,173,178],{"__ignoreMap":72},[76,169,170],{"class":78,"line":79},[76,171,172],{},"codex login\n",[76,174,175],{"class":78,"line":123},[76,176,177],{},"# ブラウザで ChatGPT にサインイン → トークン取得\n",[76,179,180],{"class":78,"line":129},[76,181,182],{},"codex exec -m gpt-5.4 \"echo test\"\n",[14,184,185],{},"返答が返ってきたので生きている。",[31,187],{},[34,189,191],{"id":190},"_2-pnpm-が-path-から消えていた","2. pnpm が PATH から消えていた",[14,193,194,195,198],{},"昨日 Volta を切ったあと、",[26,196,197],{},"pnpm --version"," が「コマンドが見つからない」と返すようになっていた。Volta が pnpm を shim していたのを忘れていた。",[14,200,201],{},"mise の aqua バックエンドで pnpm を指定する。",[67,203,205],{"className":111,"code":204,"language":113,"meta":72,"style":72},"[tools]\n\"aqua:pnpm/pnpm\" = \"10.33.2\"\n",[26,206,207,211],{"__ignoreMap":72},[76,208,209],{"class":78,"line":79},[76,210,126],{},[76,212,213],{"class":78,"line":123},[76,214,215],{},"\"aqua:pnpm/pnpm\" = \"10.33.2\"\n",[67,217,219],{"className":69,"code":218,"language":71,"meta":72,"style":72},"mise install\npnpm --version\n# 10.33.2\n",[26,220,221,225,230],{"__ignoreMap":72},[76,222,223],{"class":78,"line":79},[76,224,135],{},[76,226,227],{"class":78,"line":123},[76,228,229],{},"pnpm --version\n",[76,231,232],{"class":78,"line":129},[76,233,234],{},"# 10.33.2\n",[14,236,237,240,241,244],{},[26,238,239],{},"mdx-playground"," のリポジトリ直下で ",[26,242,243],{},"pnpm install"," が通ったので OK。",[31,246],{},[34,248,250],{"id":249},"_3-chrome-native-messaging-host-の-bat-が-volta-の-nodeexe-を直叩きしていた","3. Chrome native messaging host の bat が Volta の node.exe を直叩きしていた",[14,252,253],{},"Claude Code の Stop hook で VOICEVOX 読み上げを動かす仕組みは、Chrome の native messaging host を経由している。そのエントリポイントの bat ファイルが Volta のパスを直接参照していた。",[67,255,259],{"className":256,"code":257,"language":258,"meta":72,"style":72},"language-bat shiki shiki-themes vitesse-light vitesse-light","@echo off\n\"C:\\Users\\numbe\\AppData\\Local\\Volta\\bin\\node.exe\" \"%~dp0claude-sound.js\" %*\n","bat",[26,260,261,266],{"__ignoreMap":72},[76,262,263],{"class":78,"line":79},[76,264,265],{},"@echo off\n",[76,267,268],{"class":78,"line":123},[76,269,270],{},"\"C:\\Users\\numbe\\AppData\\Local\\Volta\\bin\\node.exe\" \"%~dp0claude-sound.js\" %*\n",[14,272,273,274,277],{},"Volta を消すとこの行で死ぬ。",[26,275,276],{},"chrome-native-host.bat"," も同じパターンで、合計2ファイル該当した。",[14,279,280],{},"mise の shim を見るように書き換え。",[67,282,284],{"className":256,"code":283,"language":258,"meta":72,"style":72},"@echo off\n\"C:\\Users\\numbe\\AppData\\Local\\mise\\shims\\node.exe\" \"%~dp0claude-sound.js\" %*\n",[26,285,286,290],{"__ignoreMap":72},[76,287,288],{"class":78,"line":79},[76,289,265],{},[76,291,292],{"class":78,"line":123},[76,293,294],{},"\"C:\\Users\\numbe\\AppData\\Local\\mise\\shims\\node.exe\" \"%~dp0claude-sound.js\" %*\n",[14,296,297],{},"Chrome を再起動して native messaging が通ることを確認。Stop hook で VOICEVOX が鳴ったので生きている。",[31,299],{},[34,301,303],{"id":302},"_4-volta-残骸-29gb-の削除でプロセスに掴まれていた","4. Volta 残骸 2.9GB の削除でプロセスに掴まれていた",[14,305,306,307,310],{},"Volta のディレクトリを消そうとしたら、",[26,308,309],{},"node.exe"," が動作中だと言われて削除を拒否された。",[67,312,314],{"className":69,"code":313,"language":71,"meta":72,"style":72},"Remove-Item -Recurse -Force \"C:\\Users\\numbe\\AppData\\Local\\Volta\"\n# ファイルがプロセスに使用されているため、アクセスできません\n",[26,315,316,321],{"__ignoreMap":72},[76,317,318],{"class":78,"line":79},[76,319,320],{},"Remove-Item -Recurse -Force \"C:\\Users\\numbe\\AppData\\Local\\Volta\"\n",[76,322,323],{"class":78,"line":123},[76,324,325],{},"# ファイルがプロセスに使用されているため、アクセスできません\n",[14,327,328,331],{},[26,329,330],{},"Get-Process node"," で見ると、5プロセスが Volta の node.exe を掴んだまま残っていた。Claude Desktop 関連のサブプロセスや、過去のセッションの残骸が混ざっている。",[14,333,334,335,338],{},"ここで ",[26,336,337],{},"taskkill //IM node.exe //F"," を打つと Claude Code 自身が落ちる（CLAUDE.md にも警告あり）。プロセスごとに PID を確認して、Volta パスのものだけを個別に kill した。",[67,340,342],{"className":69,"code":341,"language":71,"meta":72,"style":72},"Get-Process node | Where-Object { $_.Path -like \"*Volta*\" } | Stop-Process -Force\n",[26,343,344],{"__ignoreMap":72},[76,345,346],{"class":78,"line":79},[76,347,341],{},[14,349,350,351,354],{},"これで Volta パスの node.exe だけが落ちて、Claude Code 本体は生き残った。改めて ",[26,352,353],{},"Remove-Item"," で削除し、2.9GB が消えた。",[31,356],{},[34,358,360],{"id":359},"_5-measure-deployps1-の裸-wrangler-呼び出し","5. measure-deploy.ps1 の裸 wrangler 呼び出し",[14,362,363,365],{},[26,364,28],{}," をデプロイ時間計測のために回したら、wrangler が見つからないエラーで止まった。",[14,367,368],{},"該当箇所を grep で見ると「裸の wrangler 呼び出し」が残っていた。",[67,370,372],{"className":69,"code":371,"language":71,"meta":72,"style":72},"# Before: Volta 時代のグローバル wrangler 前提\nwrangler pages deploy ...\n",[26,373,374,379],{"__ignoreMap":72},[76,375,376],{"class":78,"line":79},[76,377,378],{},"# Before: Volta 時代のグローバル wrangler 前提\n",[76,380,381],{"class":78,"line":123},[76,382,383],{},"wrangler pages deploy ...\n",[14,385,386,387,390],{},"Volta は wrangler をグローバルにインストールして PATH に通す挙動だったので、これで動いていた。mise はグローバル npm パッケージを直接 shim しないので、リポジトリの devDependencies に入っている wrangler を ",[26,388,389],{},"pnpm exec"," 経由で呼び出す形に直す。",[67,392,394],{"className":69,"code":393,"language":71,"meta":72,"style":72},"# After: pnpm exec で devDependencies の wrangler を呼ぶ\npnpm exec wrangler pages deploy ...\n",[26,395,396,401],{"__ignoreMap":72},[76,397,398],{"class":78,"line":79},[76,399,400],{},"# After: pnpm exec で devDependencies の wrangler を呼ぶ\n",[76,402,403],{"class":78,"line":123},[76,404,405],{},"pnpm exec wrangler pages deploy ...\n",[14,407,408,410,411,414],{},[26,409,28],{}," と、ルートの ",[26,412,413],{},"scripts/measure-deploy.ps1","（同名で2つあった）の両方を修正。デプロイ計測スクリプトを再実行して、wrangler 呼び出しが通った。",[31,416],{},[34,418,419],{"id":419},"学び",[39,421,422,432,442],{},[42,423,424,428,429,431],{},[425,426,427],"strong",{},"npm の optionalDependencies は publish 漏れがあると気付きにくい",": 今回の ",[26,430,97],{}," のように、プラットフォーム別サブパッケージが npmjs に上がっていないと、Windows ユーザーだけが 404 を踏む。aqua のように GitHub Releases を直接見るバックエンドの方が、こういう publish 事故に強い",[42,433,434,437,438,441],{},[425,435,436],{},"Volta が裏で何を shim していたか、抜いてみないと気付かない",": pnpm が消えた件と、bat ファイルが Volta の node.exe を直接見ていた件は、Volta を抜くまで完全に忘れていた。「移行先で何を入れるか」のリストアップ時に、",[26,439,440],{},"Volta\\bin"," の中身を一度全部見ておけば事前に検出できた",[42,443,444,447,448,451,452,455,456,459],{},[425,445,446],{},"「裸のコマンド呼び出し」はグローバルツールに依存するアンチパターン",": ",[26,449,450],{},"wrangler ..."," のような書き方は、PATH に通っているグローバル版が暗黙の前提になっている。",[26,453,454],{},"pnpm exec wrangler ..."," か ",[26,457,458],{},"npx wrangler ..."," で devDependencies を明示的に呼ぶ形にしておけば、Node 管理ツールの切り替えに耐える",[31,461],{},[34,463,464],{"id":464},"残タスク",[39,466,469,479,485],{"className":467},[468],"contains-task-list",[42,470,473,478],{"className":471},[472],"task-list-item",[474,475],"input",{"disabled":476,"type":477},true,"checkbox"," Codex CLI を 0.124.0 に上げる（aqua レジストリ側の更新待ち）",[42,480,482,484],{"className":481},[472],[474,483],{"disabled":476,"type":477}," 他のリポジトリにも裸 wrangler / 裸 wrangler 以外の裸グローバル呼び出しが残っていないか grep で全件チェック",[42,486,488,490,491,494],{"className":487},[472],[474,489],{"disabled":476,"type":477}," mise の ",[26,492,493],{},"~/.config/mise/config.toml"," を git 管理下に置いて、別マシンでも同じ環境を再現できるようにする",[496,497,498],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":72,"searchDepth":123,"depth":123,"links":500},[501,502,503,504,505,506,507,508],{"id":36,"depth":123,"text":37},{"id":61,"depth":123,"text":62},{"id":190,"depth":123,"text":191},{"id":249,"depth":123,"text":250},{"id":302,"depth":123,"text":303},{"id":359,"depth":123,"text":360},{"id":419,"depth":123,"text":419},{"id":464,"depth":123,"text":464},"dev","Voltaを完全撤去してmiseに統一する作業ログ。Codex CLIをnpmで入れたら@openai/codex-win32-x64の404でコケて、aquaバックエンドのRustネイティブ版に切り替えて解決した話。pnpmが消えたのでaquaで導入、Chrome native messaging hostのbatファイルがVoltaのnodeを直接見ていた問題、measure-deploy.ps1の裸wrangler呼び出しもまとめて修正","md",{},"/volta-to-mise-migration-execution","misc-dev",false,"2026-04-24T00:00:00.000Z",{"title":5,"description":510},"2026-04/2026-04-24/volta-to-mise-migration-execution",[520,521,522,523,524,525,526,527],"mise","Volta","Codex CLI","pnpm","wrangler","aqua","Windows","開発環境","done",null,"fO0UTrM2fLoRZMp_v_BmQRouEc-nwAjMjJgBV0qu3ak",[],"https://log.eurekapu.com/favicon.svg",1777329226812]