This site is a mirror of ama.ne.jp.

icon of Amane Katagiri Claude Code/Codexのアカウントをプロジェクトごとに切り替えるかる~い方法

この記事の成果のみを手元で再現したい人に適したプロンプト:

.ai-profileというファイルにプロファイル名を書くと、配下のディレクトリでのclaude/codexコマンドを当該プロファイルでの起動に置き換えるツールを現在のシェル向けに書いて。プロファイル同士は設定や履歴を共有し、アカウントのみ切り替える仕組みにする。既存ツールがあればそのラッパーで実現すること。

ひとつの環境でいろいろなプロジェクトに携わっているとき、Claude CodeやCodexといったコーディングエージェントでトークンを燃やすアカウントを切り替えたいことがあります。個人で使うものと仕事で使うもの、仕事の中でも予算管理の都合で異なるアカウントを使い分けたいケースもあるでしょう。

この課題自体は、AIの発展やコーディングエージェントの普及によって新たに生じた問題ではありません。 gcloudaws といったクラウドサービス管理CLIが操作するリソースに紐付くアカウントを変えたいとか、PythonやNode.jsが使用するバージョンや仮想環境を切り替えたいといった目的で、昔から多くのエンジニアが独自のツールやハックで解決を目指してきました。

これらのコーディングエージェントも例に漏れず、共通設定を維持したまま複数のアカウントを並行で使い分ける仕組みはまだほとんど整備されていません。Claude CodeおよびCodexでアカウントを切り替えるには「都度ログインし直す」か「プロファイルのディレクトリごと切り替える」という、大きく分けて2つの方法がありますが、いずれも利便性や並行性に欠けます。

都度ログインし直す場合は、操作が面倒な上に異なるアカウントでの並行作業はできません。プロファイルのディレクトリを切り替える場合は、デフォルトでは設定ファイルやスキル、プラグインなどは引き継がれないので、「アカウントのみ切り替える」という目的に対しては荒すぎる解決策です。

そのため、これらを組み合わせた以下のような方法でアカウント情報のみ分離するのが定番の手法となっています:

  • 複数のプロファイルディレクトリを用意して、それぞれにアカウント情報を用意する。
  • 各プロファイルディレクトリ間で共有したい設定ファイルは、メインのプロファイルディレクトリにリンクしておく。
  • 起動時にプロファイルディレクトリを指定して、ユーザーにはアカウント情報のみ切り替わったように見せる。

このようなツールはGitHubを探せばいくつか見つかりますし、半自動化くらいの完成度でよければ自分で実装してしまうのも十分に現実的でしょう。

今回は、これらの分離手法を実現するclausonaを採用して、さらに「ディレクトリ単位でアカウント情報を切り替えられるようにする」という要件を加えて小さなラッパーを書いてみました。典型的ないわゆるdirenvっぽい動作ですが、簡単に実現できる既存ツールが見つからなかったのです。

clausonaのインストールと設定を終えてから、 ~/.bashrc に以下を追記します:

__ai_profile() {
    local dir="$PWD"

    while true; do
        if [[ -f "$dir/.ai-profile" ]]; then
            tr -d '[:space:]' < "$dir/.ai-profile"
            return 0
        fi

        [[ "$dir" == "/" ]] && return 1
        dir="$(dirname "$dir")"
    done
}
claude() {
    local profile
    profile="$(__ai_profile)"

    if [[ -n "$profile" ]]; then
        command clausona run "claude:$profile" -- "$@"
    else
        command claude "$@"
    fi
}
codex() {
    local profile
    profile="$(__ai_profile)"

    if [[ -n "$profile" ]]; then
        command clausona run "codex:$profile" -- "$@"
    else
        command codex "$@"
    fi
}
aip() {
    if [[ $# -eq 0 ]]; then
        if [[ -f .ai-profile ]]; then
            cat .ai-profile
        else
            echo "No .ai-profile"
        fi
        return
    fi

    printf '%s\n' "$1" > .ai-profile
    echo "AI profile: $1"
}

ai-profile.sh

~/.config/git/ignore に以下を追記するのもよいアイデアです! 個人用のローカル設定をgitがグローバルに無視するようになります:

.ai-profile

使い方はこうです:

$ tree ~/workspace/
/home/amane/workspace/
├── business
│   ├── our-business-project
│   ├── our-business-project-2
│   └── our-business-project-3
├── my-personal-project
├── my-personal-project-2
└── my-personal-project-3

$ cd ~/workspace/
$ aip personal
AI profile: personal
$ cd my-personal-project/
$ claude
(clausonaのpersonalプロファイルで起動する...)

$ cd ~/workspace/business/
$ aip business
AI profile: business
$ cd our-business-project/
$ codex
(clausonaのbusinessプロファイルで起動する...)

なかなか便利ですね! 中身としては、ディレクトリを1階層ずつ遡って特定のファイル名の中身を起動パラメータに使うという、まぁ、別に説明するほどたいした動きをするものではありません。シンプルな要望はシンプルに実現するのが一番よい、ということですね。

こんなのシンプルすぎて友達に自慢できない? 気に入らないところがあれば、冒頭のプロンプトと共にお手持ちのコーディングエージェントに指示して自分専用のラッパーを作ってみてください。clausona以外のお気に入りのツールと組み合わせるのも、シェルに現在のプロファイル名を表示するのもカッコいいでしょう。

「読んだ」を押すと、あなたがボタンを押した事実を明示的に通知してこのページに戻ります。このページに戻ってからブラウザの「戻る」ボタンを押すと、何度か同じページが表示されることがあります。