Mac miniからMacBook Proへ、作業環境を移行しました。
開発で使用しているCodexも新しいMacへ移したかったのですが、できれば設定だけでなく、これまでのチャット内容もそのまま引き継ぎたいところです。
結論からいうと、Mac miniにある以下のディレクトリを新しいMacへコピーすることで、Codexの設定やローカルのチャット履歴を移行できました。
~/.codex
ただし、移行後にChatGPTのiPhoneアプリからCodexへリモート接続すると、接続先のコンピューター名が古いMac miniの名前のまま残る問題が発生しました。
この記事では、次の内容をまとめます。
- Codexを新しいMacへインストールする
- Codexの設定とチャット履歴を移行する
- iPhoneからリモート接続できることを確認する
- 古いまま残った接続先コンピューター名を変更する
今回の移行環境
今回、次の環境へ移行しました。
| 移行元 | 移行先 |
|---|---|
| Mac mini | MacBook Pro |
| macOS | macOS |
| Codex Appを使用 | Codex Appを使用 |
| ChatGPT iPhoneアプリからリモート接続 | 移行後も継続して利用 |
CodexのRemote機能を利用すると、Mac上で動いているCodexの作業へChatGPTのモバイルアプリから接続できます。
スマートフォンから、Codexへの指示、質問への回答、処理の承認、実行結果の確認などができる便利な機能です。
なお、Codexのローカルチャットは基本的にMac上に保存され、ChatGPTの通常のWeb・モバイル版チャット履歴へ追加されるものではありません。
そのため、Macを買い替えた場合、同じChatGPTアカウントでログインするだけではローカルのチャット履歴が完全には移行されません。
新しいMacへCodexをインストールする
まず、新しいMacへCodexをインストールします。
Codex Appを使用する場合は、OpenAIの公式サイトからCodex Appをダウンロードしてインストールします。
Mac mini側のCodexデータを確認する
Codexのローカルデータは、ホームディレクトリ以下の.codexディレクトリに保存されています。
Mac mini側で確認します。
ls -la ~/.codex
私の環境では、設定ファイル、認証情報、チャットセッション、Codex Appの状態管理ファイルなどが保存されていました。
環境によってファイル構成は異なる可能性がありますが、主に次のようなデータが含まれます。
~/.codex/
├── auth.json
├── config.toml
├── sessions/
├── skills/
├── .codex-global-state.json
└── その他の状態管理ファイル
それぞれ、おおむね次の役割を持っています。
| ファイル・ディレクトリ | 内容 |
|---|---|
config.toml | Codexの設定 |
sessions/ | ローカルのセッションやチャット履歴 |
skills/ | 追加したスキル |
auth.json | ChatGPTアカウントの認証情報 |
.codex-global-state.json | Codex Appの状態やリモート環境情報 |
Codexを終了してから移行する
コピー中にファイルが更新されないように、Mac miniと新しいMacの両方でCodex Appを終了します。
VS CodeなどでCodex拡張機能を使用している場合は、VS Codeも終了しておく方が安全です。
~/.codexを新しいMacへコピーする
新しいMac側でターミナルを開き、Mac miniから.codexディレクトリをコピーします。
Mac miniのホスト名がmac-mini.local、ユーザー名が新旧ともに同じ場合は、次のように実行できます。
rsync -av \
mac-mini.local:~/.codex/ \
~/.codex/
Mac miniへのSSH接続用パスワードを求められた場合は、Mac miniのログインパスワードを入力します。
コピー先にすでに.codexディレクトリが存在する場合は、念のためバックアップしておくと安心です。
mv ~/.codex ~/.codex.before-migration
mkdir -p ~/.codex
その後、改めてコピーします。
rsync -av \
mac-mini.local:~/.codex/ \
~/.codex/
プロジェクトの保存場所も揃える

起動後、チャットも全て元通りに戻っていました。よかった😊
なお、Codexのチャット履歴には、作業していたプロジェクトのディレクトリ情報が含まれている可能性があります。
そのため、新旧Macでユーザー名とプロジェクトの保存場所を揃えておくと、移行後も履歴を開きやすくなります。
たとえば、Mac miniで次の場所にリポジトリを置いていた場合、
/Users/name/Documents/dev/hoge
新しいMacでも同じ場所に配置します。
GitHubで管理しているリポジトリは、新しいMacで改めてcloneする方法でも問題ありません。
ただし、移行元に未コミットの変更やGit管理外ファイルがある場合は、cloneだけでは移行されません。
移行前にMac mini側で確認します。
cd /path/to/repository
git status
未コミットの変更がある場合は、必要に応じてコミットするか、別途ファイルをコピーします。
Codexを起動してチャット履歴を確認する
コピーが終わったら、新しいMacでCodex Appを起動します。
同じプロジェクトを開き、以前のチャット履歴が表示されることを確認します。
私の環境では、.codexディレクトリを移行することで、以前のCodex環境とチャット内容を新しいMacへ引き継ぐことができました。
iPhoneからリモート接続すると古いMac名が表示された
ここまでは順調だったのですが、移行後にひとつ問題が発生しました。
ChatGPTのiPhoneアプリからCodexのRemote画面を開くと、接続先として表示されるコンピューター名が、移行元のMac miniの名前のまま残っていました。
実際にCodexが動いているのはMacBook Proですが、iPhone上の表示名だけが古い状態です。
おそらく、.codexディレクトリを丸ごと移行したことで、Codexのリモート環境IDもMac miniから引き継がれたためと思われます。
新しいリモート環境として登録されたのではなく、既存の環境を新しいMacがそのまま引き継いだ状態です。
リモート接続自体は正常に動作していたため、表示名だけを変更しました。
リモート接続先のコンピューター名を変更する
必要なコマンド
この手順ではjqを使用します。
インストールされていない場合は、Homebrewでインストールします。
brew install jq
変更後の名前を指定する
以下のコマンドを上から順に実行します。
最初に、認証トークン、アカウントID、リモート環境IDを取得します。
codex_remote_token=$(jq -er \
'.tokens.access_token | select(length > 0)' \
~/.codex/auth.json)
codex_remote_account=$(jq -er \
'.tokens.account_id | select(length > 0)' \
~/.codex/auth.json)
codex_remote_environment=$(jq -er \
'."electron-local-remote-control-environment-id" | select(length > 0)' \
~/.codex/.codex-global-state.json)
次に、変更後のコンピューター名を指定します。
codex_remote_name='MacBook-Pro'
MacBook-Proの部分は、iPhoneのRemote画面に表示したい名前へ変更してください。
たとえば、次のような名前でも構いません。
codex_remote_name='Main-MacBook'
取得した環境IDと変更後の名前を確認する
取得内容を確認します。
認証トークン自体は表示しません。
echo "環境ID: ${codex_remote_environment}"
echo "変更後の名前: ${codex_remote_name}"
次のように表示されます。
環境ID: env_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
変更後の名前: MacBook-Pro
リモート環境の名前を変更する
次のコマンドで名前を変更します。
curl -fsS -X PATCH \
"https://chatgpt.com/backend-api/codex/remote/control/environments/${codex_remote_environment}" \
-H "Authorization: Bearer ${codex_remote_token}" \
-H "ChatGPT-Account-Id: ${codex_remote_account}" \
-H 'originator: Codex Desktop' \
-H 'Content-Type: application/json' \
--data "$(jq -nc \
--arg name "${codex_remote_name}" \
'{name: $name}')" |
jq '{name, display_name, host_name, online}'
正常に変更できると、環境名やオンライン状態などがJSONで表示されます。
{
"name": "MacBook-Pro",
"display_name": "MacBook-Pro",
"host_name": "MacBook-Pro.local",
"online": true
}
表示される項目や値は、Codexのバージョンによって異なる可能性があります。
サーバーから再取得して確認する
PATCHのレスポンスだけでなく、サーバーからリモート環境を再取得して確認します。
curl -fsS \
'https://chatgpt.com/backend-api/codex/remote/control/environments?limit=100' \
-H "Authorization: Bearer ${codex_remote_token}" \
-H "ChatGPT-Account-Id: ${codex_remote_account}" \
-H 'originator: Codex Desktop' |
jq --arg env_id "${codex_remote_environment}" \
'.items[]
| select(.env_id == $env_id)
| {name, display_name, host_name, online}'
変更した名前が表示されれば完了です。
iPhoneのChatGPTアプリを開き直すと、Remote画面のコンピューター名も新しい名前になりました。

すぐに反映されない場合は、Remote画面を更新するか、ChatGPTアプリを一度終了して開き直します。
使用した認証情報をシェル変数から削除する
作業が終わったら、認証情報を格納したシェル変数を削除します。
unset codex_remote_token
unset codex_remote_account
unset codex_remote_environment
unset codex_remote_name
unsetしても、ターミナルのスクロールバックやデバッグログなどに認証情報が出力されていた場合、それらが消えるわけではありません。
今回の手順ではトークン自体をechoしていませんが、シェルでset -xを有効にしている場合は、実行内容が表示される可能性があります。
念のため、次のコマンドで確認できます。
set +x
その後に作業する方が安全です。
エラーが発生した場合の確認ポイント
jq: command not found
jqがインストールされていません。
brew install jq
名前変更後もiPhone側に反映されない
次の順番で確認します。
- サーバーから再取得するコマンドで名前が変わっているか確認する
- ChatGPTアプリのRemote画面を更新する
- ChatGPTアプリを完全に終了して開き直す
- Codex Appを再起動する
- MacとiPhoneの両方で同じChatGPTアカウントを使用しているか確認する
一括実行用コマンド
変更後の名前だけ設定し、一括して実行したい場合は、次のようにまとめられます。
set +x
codex_remote_token=$(jq -er \
'.tokens.access_token | select(length > 0)' \
~/.codex/auth.json)
codex_remote_account=$(jq -er \
'.tokens.account_id | select(length > 0)' \
~/.codex/auth.json)
codex_remote_environment=$(jq -er \
'."electron-local-remote-control-environment-id" | select(length > 0)' \
~/.codex/.codex-global-state.json)
codex_remote_name='<設定するコンピューター名>'
echo "環境ID: ${codex_remote_environment}"
echo "変更後の名前: ${codex_remote_name}"
curl -fsS -X PATCH \
"https://chatgpt.com/backend-api/codex/remote/control/environments/${codex_remote_environment}" \
-H "Authorization: Bearer ${codex_remote_token}" \
-H "ChatGPT-Account-Id: ${codex_remote_account}" \
-H 'originator: Codex Desktop' \
-H 'Content-Type: application/json' \
--data "$(jq -nc \
--arg name "${codex_remote_name}" \
'{name: $name}')" |
jq '{name, display_name, host_name, online}'
curl -fsS \
'https://chatgpt.com/backend-api/codex/remote/control/environments?limit=100' \
-H "Authorization: Bearer ${codex_remote_token}" \
-H "ChatGPT-Account-Id: ${codex_remote_account}" \
-H 'originator: Codex Desktop' |
jq --arg env_id "${codex_remote_environment}" \
'.items[]
| select(.env_id == $env_id)
| {name, display_name, host_name, online}'
unset codex_remote_token
unset codex_remote_account
unset codex_remote_environment
unset codex_remote_name
codex_remote_nameは、自分のMacに合わせて変更してください。
まとめ
Mac miniからMacBook ProへCodexを移行しました。
今回行った作業は、次のとおりです。
- 新しいMacへCodexをインストール
- Mac miniの
~/.codexを新しいMacへコピー - プロジェクトを同じパスへ移行
- Codexの設定とチャット履歴を確認
- ChatGPTのiPhoneアプリからリモート接続
- 古いまま残った接続先名を内部APIで変更
.codexディレクトリを移行することで、Codexの設定やチャット履歴をかなりそのまま引き継げました。
一方で、リモート環境のIDも引き継がれたため、iPhoneから見た接続先名だけが古いMac miniのまま残りました。
リモート接続自体には問題がなかったので、今回紹介した方法で環境名だけを変更しています。
なお、環境名の変更に使用したAPIは、公式に公開された一般向けAPIではありません。
今後のアップデートで利用できなくなる可能性があるため、実行前に.codexディレクトリをバックアップし、認証情報の取り扱いにも十分注意してください。


