Swap Accounts — Claude Code
Troca rápida entre várias contas do Claude Code direto do VSCode, com um dashboard de cota no rodapé. Uma tarja por conta (nome + % de uso das 5h/semana + horário de reset); quando a cota de uma enche, você clica na tarja de outra e continua — mantendo o mesmo contexto (histórico, projetos, settings do Claude Code).
Por que
Quem tem mais de uma conta Claude (Max/Pro/Teams) bate o limite de uso de uma e quer pular pra outra sem reconfigurar nada. O Claude Code guarda a credencial num único lugar (CLAUDE_CONFIG_DIR); esta extensão gira essa credencial entre contas que você capturou antes, e mostra a cota de cada uma pra você saber pra qual pular.
No rodapé, uma tarja por conta: ✓ Personal 12% (ativa, fundo colorido) · Work 45% · Studio ⊗ 09/08 (semana esgotada). Clique numa tarja pra trocar.
Como funciona (resumo técnico)
O Claude Code lê a conta de:
<configDir>/.credentials.json — token OAuth (claudeAiOauth.accessToken)
<configDir>/.claude.json — identidade exibida (oauthAccount)
onde configDir = CLAUDE_CONFIG_DIR (ou ~/.claude). A extensão guarda um snapshot por conta em ~/.claude-accounts/<id>/ e, ao trocar, copia o snapshot por cima do configDir e recarrega a janela — a extensão Claude Code relê o token no reload. A cota vem de GET https://api.anthropic.com/api/oauth/usage.
A troca é manual, por clique — sem rotação automática (evita o risco de rotacionar tokens no meio de uma sessão).
Instalar
Rápido (sem buildar)
- Baixe o
swap-accounts-<versão>.vsix do último release.
- Instale (precisa do
code no PATH):
code --install-extension swap-accounts-0.1.0.vsix
Developer: Reload Window.
Buildar do código
git clone https://github.com/lucasftas/swap-accounts.git
cd swap-accounts
npm install
npm run compile
npx @vscode/vsce package --allow-missing-repository --no-yarn
code --install-extension swap-accounts-0.1.0.vsix
Requisito: Node.js + code CLI no PATH (VSCode → Command Palette → "Shell Command: Install 'code' command in PATH").
Configurar as contas
Nas settings (settings.json), declare as contas — uma tarja por item, na ordem da lista:
"swapAccounts.accounts": [
{ "id": "personal", "label": "Personal", "color": "#644389" },
{ "id": "work", "label": "Work", "color": "#D6515C" }
]
id — nome da pasta-snapshot (~/.claude-accounts/<id>/). Sem espaços.
label — texto exibido na tarja.
color — cor hex (fundo quando a conta está ativa, texto quando inativa).
Popular cada conta (uma vez por conta)
O snapshot de cada conta é criado a partir da conta logada no momento:
- Logue na conta A no Claude Code (
claude auth login).
- Command Palette → "Swap Accounts: Capturar conta atual num slot" → escolha o slot (ou crie um id novo).
- Repita pra cada conta (logue na B, capture no slot B; etc).
Isso salva ~/.claude-accounts/<id>/.credentials.json + oauthAccount.json. Refaça a captura de uma conta sempre que quiser atualizar o snapshot dela (ex: token renovado).
Usar
- Trocar: clique na tarja da conta desejada no rodapé (ou Command Palette → "Swap Accounts: Trocar de conta") → confirme Recarregar. A janela recarrega e o Claude Code volta na conta nova, mesmo contexto.
- Conta esgotada/desconectada → login: se a conta estiver 429/cota estourada (5h ou semana ≥100%) ou desconectada (sem sessão salva), clicar na tarja abre o login dela em vez de trocar (trocar pra uma conta sem cota/sessão não adianta). A esgotada dá a opção "Trocar mesmo assim"; a desconectada vai direto pro login. Depois de logar, rode "Capturar conta atual num slot" pra salvar a sessão. (Também via Command Palette → "Swap Accounts: Fazer login numa conta".)
- Dashboard: cada tarja mostra as duas cotas —
$(clock) 5h% (janela de 5 horas / sessão) e $(calendar) semana%. ⊗ marca a cota que estourou. A conta ativa tem $(check) e fundo colorido; passe o mouse pra ver os % + horários de reset/volta detalhados.
- Projeção da semana (no hover): o tooltip estima quando a cota semanal chega a 100% e diz direto, pelo dia da semana —
⚠️ nesse ritmo, a cota da semana estoura na Quinta às 10h24 ou 📈 nesse ritmo, a cota da semana aguenta até resetar (Quinta). O ritmo combina dinâmico (últimas ~4h, de amostras que a extensão guarda por conta em <accountsDir>/<id>/usage-samples.json) + fixo (média desde o início do ciclo): no começo pesa o fixo (estável), depois o dinâmico assume.
- Só a conta ativa mostra cota ao vivo (token fresco). Inativas usam o snapshot, que expira ~1h após a captura → mostram
·? (estado expired, não conta como desconectada — a troca segue normal). Isso é esperado.
Settings
| Setting |
Default |
O que é |
swapAccounts.accounts |
[] |
Lista de contas (id, label, color). |
swapAccounts.accountsDir |
~/.claude-accounts |
Onde ficam os snapshots. |
swapAccounts.configDir |
$CLAUDE_CONFIG_DIR ou ~/.claude |
Config dir do Claude Code (credencial ativa). |
swapAccounts.reload |
reloadWindow |
Como aplicar: reloadWindow · command · none. |
swapAccounts.reloadCommand |
"" |
Comando shell quando reload=command (${id} = conta destino). |
swapAccounts.loginCommand |
"" |
Comando de login ao clicar numa conta 429/desconectada (${id}/${email}). Vazio = claude auth login. |
swapAccounts.refreshSeconds |
60 |
Intervalo pra reconsultar a cota. |
code-server / servidor (modo command)
No VSCode desktop, reloadWindow basta. Em code-server (ou setups onde o Claude Code roda como serviço), reiniciar o serviço é mais confiável que recarregar a aba do browser. Use:
"swapAccounts.reload": "command",
"swapAccounts.reloadCommand": "sudo systemd-run --collect --unit=claude-switch-${id} --property=Type=oneshot /home/USER/scripts/claude-switch.sh ${id}"
Nesse modo a extensão não mexe nos arquivos — delega tudo ao comando (que sabe parar o serviço antes de trocar a credencial, evitando lock). Um script de referência (claude-switch.sh, faz copy da credencial + patch do oauthAccount + restart) está em scripts/.
Notas
- Fundo colorido da tarja ativa: a API do VSCode só permite
error/warning como background de status bar item. Pra dar cor por conta, a extensão sobrescreve statusBarItem.errorBackground no seu settings.json global ao trocar de conta. Outros itens de status que usem essa cor herdam o tom da conta ativa.
- Segurança: os snapshots contêm tokens OAuth reais.
~/.claude-accounts/ fica fora de qualquer repositório; não versione essa pasta.
- macOS: se o Claude Code guardar a credencial no Keychain (sem
CLAUDE_CONFIG_DIR apontando pra arquivo), a troca por arquivo não se aplica — defina CLAUDE_CONFIG_DIR pra usar credencial em disco.
Releases
https://github.com/lucasftas/swap-accounts/releases