Aynı Bilgisayarda İki Claude Code Hesabı Kullanmak

yazılım claude code

Esenlikler,

Kısa özet

# 1. .zshrc'ye ekle
alias claude-work="CLAUDE_CONFIG_DIR=~/.claude-work claude"

# 2. Yeni terminal aç ve iş hesabıyla login ol
claude-work

# 3. Artık ikisi ayrı terminallerde aynı anda çalışıyor
claude        # → kişisel hesap
claude-work   # → iş hesabı

İnternette bahsedilen Keychain çakışma bug’ı v2.1.39 itibarıyla düzeltilmiş. Detaylar ve bu sonuca nasıl ulaştığım aşağıda.


Claude Code’u hem kişisel hem iş projelerimde kullanıyorum. Bir süredir sadece kendi hesabımı kullanıyordum, sonrasında iş yerinden Team hesabı gelince artık iş için onu, kişisel işler için kendi hesabımı kullanarak devam edecektim. Bunun için logout & login yapmak gerekiyormuş. İkisini de aynı anda ve ikisi için de subscription bazlı kullanmak ise kulağa basit geliyor ama değilmiş. Metehan’ın isteği ile bunu bir yazı olarak yazmaya karar verdim.

İnternette ne yazıyor?

Claude Code’da native çoklu hesap desteği yok. Anthropic mühendislerinden biri GitHub’da CLAUDE_CONFIG_DIR environment variable’ını öneriyor. Her profil için ayrı config dizini, alias’larla geçiş:

alias claude-work="CLAUDE_CONFIG_DIR=~/.claude-work claude"

Buraya kadar güzel. Ama GitHub Issue #20553’e göre macOS Keychain’de ciddi bir bug var. Claude Code tüm profiller için aynı Keychain entry’sini kullanıyormuş. İki profili aynı anda açınca token’lar birbirini eziyor, 8 saatte bir ikisine de yeniden giriş gerekiyor.

Çözüm olarak profillerden birinde API key kullanmak diğerinde de subscription kullanmak öneriliyor fakat API key token bazlı ücretlendiriliyor. Team aboneliği varken bu para çöpe gidiyor.

Binary’nin içine bakmak

Bir şekilde ikisinde de subscription kullanabilir miyiz diye Claude Code ile Claude Code’u incelemeye başladım.

Claude Code Bun ile bundle’lanmış bir Mach-O binary. İçinde gömülü JavaScript var. strings ile binary’den anlamlı parçalar çıkarmaya başladım:

strings ~/.local/share/claude/versions/2.1.39 \
  | grep -E "credential|OAUTH_FILE_SUFFIX"

Ve credential service name’i oluşturan fonksiyonu buldum:

function Nu(T = "") {
  let R = q9();  // config dir path
  let _ = !process.env.CLAUDE_CONFIG_DIR
    ? ""
    : `-${sha256(R).substring(0, 8)}`;
  return `Claude Code${OAUTH_FILE_SUFFIX}${T}${_}`;
}

CLAUDE_CONFIG_DIR set edilince Keychain entry adına config dizininin SHA-256 hash’inin ilk 8 karakteri ekleniyor:

ProfilKeychain Entry
Default (~/.claude)Claude Code-credentials
~/.claude-workClaude Code-credentials-a1b2c3d4

Her profil kendi Keychain entry’sini kullanıyor. Çakışma yok. İnternetteki bug raporları eski sürümler içinmiş. v2.1.39’da sorun çoktan düzeltilmiş.

.zshrc’ye tek bir alias yetti. Default claude kişisel hesap, claude-work iş hesabı. İlk çalıştırmada login, sonrası otomatik. İkisi aynı anda farklı terminallerde açık.

Session taşımanın sancısı

Profili kurduktan sonra eski konuşmalarımı yeni profile taşımak istedim. .jsonl dosyalarını kopyalamak kolay. Ama /resume ile eski session’lara dönmek öyle değil.

Bir asimetri var. In-session /resume bir internal listeye bakıyor; kopyalanan session’lar bu listede olmadığı için “Session not found” diyor. Ama CLI’dan --resume ile çağırınca direkt dosyayı diskten okuyor. Bu çalışıyor.

claude-work --resume SESSION_ID

Yeni session’lar için /resume sorunsuz. Sadece kopyalananlar için bu yol gerekiyor.

Binary’den dökülen birkaç şey daha

İncelerken belgelenmemiş birkaç environment variable buldum:

  • CLAUDE_CODE_OAUTH_TOKEN — direkt OAuth token inject etme
  • CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR — token’ı file descriptor’dan okuma
  • CLAUDE_CODE_SESSION_ACCESS_TOKEN — session-level access token

Normal kullanımda gerekmez ama otomasyon senaryolarında işe yarayabilir.