Claude Codeのアカウント使い分け——もう誤爆してしょんぼりしない

タイトルは決意表明です。

Claude Codeで、個人のアカウントと仕事のアカウントを使い分ける必要が出てきました。
さすがに毎回/loginだとやり忘れそうで誤爆が怖いですし、「今どっちだっけ」という確認手段も欲しいです。
というわけでClaude Codeのマルチアカウント使い分けの備忘録を書いておきます。

## 使い分けの方法

CLAUDE_CONFIG_DIRで使い分けたいアカウント毎にディレクトリを作ることで、認証情報を分けられます。設定やセッション履歴なんかも分けて保存できます。

Terminal window
CLAUDE_CONFIG_DIR=~/.claude_work claude

CLAUDE_CONFIG_DIR自体は未作成でも大丈夫です。勝手に作ってくれます。

余談ですがFeatureリクエストは挙がっているので、いつか実装されるかもしれませんね。Feature Request: Multi-Account Profile Support · Issue #20131 · anthropics/claude-code

参考:環境変数 - Claude Code Docs

### 注意

今まで~/.claude/settings.jsonに書いていた内容は新しいディレクトリ(アカウント)の方には引き継がれないため、適宜コピーしておきましょう。

## さらに快適にするための設定

使い分け自体は前述のとおりです。ここからは一緒に設定しておいたほうがいいことを書いておきます。

### codexも一緒に切り替えよう

筆者はClaudeに対して/codex:reviewなどでレビューさせることがよくあります(直接Codexに聞くと目が滑る)。
Codexもアカウントを使い分ける人は、起動時に一緒に渡しておきましょう。

Terminal window
CLAUDE_CONFIG_DIR=~/.claude_work CODEX_HOME=~/.codex_work claude

### 入力を省略する

毎回CLAUDE_CONFIG_DIRを入力するのは面倒です。miseやdirenvのようにディレクトリごとに環境変数を設定しておくと便利です。

筆者の場合は履歴に残したかったため、zeno.zshで展開してます。エイリアスと違って展開だとちょっと引数を変えたいときとかに便利です。
※「zeno.zshって何?」という方は別の記事をご覧ください。

zenoのスニペット設定
import type { Snippet } from "jsr:@yuki-yano/zeno";
// 長いコマンドの展開
export const commandSnippets: Snippet[] = [
{
name: "my claude code",
keyword: "mcc",
snippet: "CLAUDE_CONFIG_DIR=~/.claude claude",
},
{
name: "my claude code continue",
keyword: "mccc",
snippet: "CLAUDE_CONFIG_DIR=~/.claude claude --continue",
},
{
name: "work claude code",
keyword: "wcc",
snippet: "CLAUDE_CONFIG_DIR=~/.claude_work CODEX_HOME=~/.codex_work claude",
},
{
name: "work claude code continue",
keyword: "wccc",
snippet:
"CLAUDE_CONFIG_DIR=~/.claude_work CODEX_HOME=~/.codex_work claude --continue",
},
];

### ステータスラインにどっちなのか表示

ディレクトリ毎に環境変数を設定しようがzeno.zshで展開しようが、「今どっちで起動しているんだっけ」という不安はつきまといます。
なぜなら新しいリポジトリなどで設定し忘れる可能性があるからです。

というわけでステータスラインにアカウントを表示しておくと安心です。
筆者は右下にworkmineを表示してます。

ステータスラインの右側にアカウントの区別を表示

ccstatuslineで設定しました。

※ccstatuslineは別の記事Claude Codeのステータスラインを秒でおしゃれに――ccstatuslineの使い方で解説しています。

#### 具体的な設定内容

単にCLAUDE_CONFIG_DIRで判定してます。

[ "$(basename "$CLAUDE_CONFIG_DIR")" = ".claude_work" ] && echo work || true
[ "$(basename "$CLAUDE_CONFIG_DIR")" != ".claude_work" ] && echo mine || true

設定ファイルとしては次のように記述してます。

.config/ccstatusline/settings.json
{
"version": 3,
"lines": [
[
// ...
{
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"type": "flex-separator"
},
{
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"type": "custom-command",
"commandPath": "[ \"$(basename \"$CLAUDE_CONFIG_DIR\")\" = \".claude_work\" ] && echo work || true",
"color": "hex:F8F8F8",
"backgroundColor": "hex:001C23",
"bold": true
},
{
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"type": "custom-command",
"commandPath": "[ \"$(basename \"$CLAUDE_CONFIG_DIR\")\" != \".claude_work\" ] && echo mine || true",
"color": "hex:F8F8F8",
"backgroundColor": "hex:001C23"
}
],
[]
],
}

workの方だけ太字にしたかったため、ウィジェットを分けてます。

### tmuxのレイアウトにデカデカと表示

筆者はvde-layoutを使ってタスクごとにレイアウトを分けてます。

※vde-layoutはターミナルのレイアウトをYAMLファイルで宣言的に定義して、コマンドを叩くだけで サクッとレイアウトを適用できる ツールです。詳しい使い方は次の記事を参考にしてください。

このvde-layoutで立ち上げたtmuxのペインにて「どのアカウントを使うレイアウトなのか」を目立つように表示しています。

レイアウトにデカく`my-dev`と表示されている例

この表示に使っているコマンドはfigletです。

Terminal window
figlet -f larry3d "my-dev"

これだけやれば誤爆しないと思います。誤爆したら疲れていると思うので休みましょう。