まとめ
- Codex CLIは
CODEX_HOME配下にauth.json、config.toml、sessions、history、SQLite state等を置く auth.jsonだけを分けたい場合、別のCODEX_HOMEを作って、それ以外をデフォルト側へsymlinkするCODEX_PROFILEはCodex CLI標準の環境変数ではないが、シェル関数でCODEX_PROFILE→CODEX_HOMEへ変換すればAWS profileっぽく使えるcodex_appsはChatGPT auth/runtime側に寄るため、auth.jsonを切り替えると利用アカウントも切り替わる- 通常MCP OAuth credentialを共有したい場合は
.credentials.jsonもsymlinkできるが、どのアカウントの外部サービス認証を使うかは意識する
やりたいこと
Codex CLIを複数のChatGPTアカウントで使い分けたい。
ただし、設定や履歴まで完全に分けたいわけではない。やりたいのはだいたいこれ:
default profile:
~/.codex/auth.json
alternate profile:
~/.codex-alternate/auth.json
shared:
config.toml
sessions/
history.jsonl
state_*.sqlite
logs_*.sqlite
skills/
plugins/
cache/
つまり、認証だけ分けて、Codexの作業状態は共有する。
前提確認
まず現在のCodex CLIがfile storageを使っているか確認する。
codex doctor --summary
詳細表示では、以下のように出る。
auth storage mode: File
auth file: ~/.codex/auth.json
ログイン状態だけならこれでよい。
codex login status
alternate用のCODEX_HOMEを作る
ここではデフォルトを~/.codex、もう一つを~/.codex-alternateにする。
mkdir -p "$HOME/.codex-alternate"
alternate側でログインする。
CODEX_HOME="$HOME/.codex-alternate" codex login
ログイン状態を確認する。
CODEX_HOME="$HOME/.codex-alternate" codex login status
auth.json以外を共有する
~/.codex-alternate/auth.jsonだけを残して、それ以外は~/.codexへのsymlinkにする。
Codexが動いている最中でもSQLiteのWALは基本的に扱えるが、移行作業としては一度Codex CLIを閉じてからやる方が安心。
backup="$HOME/.codex-alternate-local-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup"
find "$HOME/.codex-alternate" \
-mindepth 1 \
-maxdepth 1 \
! -name auth.json \
-exec mv {} "$backup"/ \;
find "$HOME/.codex" \
-mindepth 1 \
-maxdepth 1 \
! -name auth.json \
! -name 'auth.*' \
! -name .credentials.json \
-exec sh -c '
for src do
ln -s "$src" "$HOME/.codex-alternate/$(basename "$src")"
done
' sh {} +
確認する。
find ~/.codex-alternate -mindepth 1 -maxdepth 1 ! -type l -print
auth.jsonだけが出ればよい。
/Users/you/.codex-alternate/auth.json
代表的な共有状態はこうなる。
~/.codex-alternate/auth.json # alternate専用
~/.codex-alternate/config.toml -> ~/.codex/config.toml
~/.codex-alternate/sessions -> ~/.codex/sessions
~/.codex-alternate/history.jsonl -> ~/.codex/history.jsonl
~/.codex-alternate/state_5.sqlite -> ~/.codex/state_5.sqlite
~/.codex-alternate/logs_2.sqlite -> ~/.codex/logs_2.sqlite
~/.codex-alternate/goals_1.sqlite -> ~/.codex/goals_1.sqlite
~/.codex-alternate/memories_1.sqlite -> ~/.codex/memories_1.sqlite
~/.codex-alternate/skills -> ~/.codex/skills
~/.codex-alternate/plugins -> ~/.codex/plugins
CODEX_PROFILEで切り替える
Codex CLI標準にCODEX_PROFILEという環境変数はない。なので、シェル関数で作る。
~/.zshrcなどに追加する:
codex() {
local profile="${CODEX_PROFILE:-default}"
local codex_home
case "$profile" in
default|primary)
codex_home="$HOME/.codex"
;;
alternate|secondary)
codex_home="$HOME/.codex-alternate"
;;
*)
echo "unknown CODEX_PROFILE: $profile" >&2
echo "expected: default or alternate" >&2
return 2
;;
esac
CODEX_HOME="$codex_home" command codex "$@"
}
使い方:
codex
CODEX_PROFILE=alternate codex
execやlogin statusも同じ。
codex login status
CODEX_PROFILE=alternate codex login status
codex exec "Reply OK"
CODEX_PROFILE=alternate codex exec "Reply OK"
cxporterも同じノリにする
cxporterもCodex config/authを読むので、同じCODEX_PROFILE解決にしておくと混乱しにくい。
cxporter() {
local profile="${CODEX_PROFILE:-default}"
local codex_home
case "$profile" in
default|primary)
codex_home="$HOME/.codex"
;;
alternate|secondary)
codex_home="$HOME/.codex-alternate"
;;
*)
echo "unknown CODEX_PROFILE: $profile" >&2
echo "expected: default or alternate" >&2
return 2
;;
esac
CODEX_HOME="$codex_home" command cxporter "$@"
}
これで以下のように使える。
cxporter list --server codex_apps
CODEX_PROFILE=alternate cxporter list --server codex_apps
MCP credentialの扱い
通常MCP OAuth credentialのfile storeは.credentials.jsonに入る。これを共有したい場合はsymlinkできる。
ln -s "$HOME/.codex/.credentials.json" "$HOME/.codex-alternate/.credentials.json"
共有すると、alternate profileでも同じ外部サービス identity になる。
一方、codex_appsは通常MCPの.credentials.jsonとは別物。ChatGPT auth / Codex runtime側でconnector surfaceとauthが合成される。
default codex_apps -> ~/.codex/auth.json のChatGPT account
alternate codex_apps -> ~/.codex-alternate/auth.json のChatGPT account
codex_appsだけを.credentials.jsonで共有する、という運用は基本的にできない。
注意点
auth.jsonは共有しない- sessions/history/state/logsは混ざる
- 履歴も完全に分けたい場合は、symlinkせずに
CODEX_HOMEを完全分離する
ref
codex --helpcodex login --helpcodex doctor --summary