·tips

Codex CLIで複数アカウントを切り替える

CODEX_HOMEを切り替えてCodex CLIのauth.jsonだけを分離し、sessionsや設定は共有する

3 min read
Writing style

まとめ

  • Codex CLIはCODEX_HOME配下にauth.jsonconfig.toml、sessions、history、SQLite state等を置く
  • 認証だけ分けたい場合、別のCODEX_HOMEを作ってauth.json以外をデフォルト側へsymlinkする
  • CODEX_PROFILEはCodex CLI標準の環境変数ではないが、シェル関数でCODEX_PROFILECODEX_HOMEへ変換すればAWS profileっぽく使える
  • codex_appsはChatGPT auth側に寄るため、auth.jsonを切り替えると利用アカウントも切り替わる(.credentials.jsonの共有では切り替えられない)

alternate用のCODEX_HOMEを作る

mkdir -p "$HOME/.codex-alternate"
CODEX_HOME="$HOME/.codex-alternate" codex login
CODEX_HOME="$HOME/.codex-alternate" codex login status

auth.json以外を共有する

auth.jsonだけを残して、それ以外は~/.codexへのsymlinkにする。作業前に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 {} +

確認してauth.jsonだけが出ればよい。

find ~/.codex-alternate -mindepth 1 -maxdepth 1 ! -type l -print

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
CODEX_PROFILE=alternate codex login status

注意点

  • auth.jsonは共有しない
  • sessions/history/state/logsは混ざる。完全に分けたい場合はsymlinkせずCODEX_HOMEを完全分離する
  • 通常MCPのOAuth credential(.credentials.json)を共有したい場合はsymlinkできるが、どのアカウントの外部サービス認証を使うかは意識する

ref

  • codex --help
  • codex login --help
  • codex doctor --summary