OSS · Extensão do Chrome + Web UI + Desktop · Node.js
claude-shift
Uma máquina, várias contas do Claude Code.
Gerencia várias contas do Claude Code no mesmo computador. shift use troca a conta ativa sincronizando os dois arquivos que o Claude Code realmente lê (~/.claude/.credentials.json para os tokens, ~/.claude.json para o oauthAccount que aparece no /status). Um servidor local consulta api.anthropic.com/api/oauth/usage em intervalo configurável e grava a utilização de 5 horas e semanal em SQLite. O popup do Chrome mostra cada conta com um gráfico SVG cruzado e deixa você trocar a ativa direto do popup. A mesma UI do popup também roda no navegador (127.0.0.1:19867) e como app desktop Tauri v2: um arquivo de UI, quatro entradas.
Comandos CLI
Um shell script sobre helpers em Node. Todos os comandos funcionam sozinhos; server e popup são opcionais.
| Comando | O que faz |
|---|---|
shift list | Lista todas as contas registradas com a ativa marcada. |
shift use <name> | Troca a ativa. Faz sync back do token refresh e atualiza o oauthAccount em ~/.claude.json. |
shift usage | Mostra 5 horas e semanal com horas de reset por conta. |
shift seed <name> | Faz uma requisição mínima para iniciar a janela de 5 horas agora. Útil antes de sessão longa. |
shift add <name> | Registra o credentials.json atual como <name>. Token duplicado gera aviso (-f para forçar). |
shift rm <name> | Remove o registro. Remover a ativa requer -f. |
shift server | Sobe o servidor local (127.0.0.1:19867). Faz polling de usage e grava em SQLite. |
Uma UI, quatro entradas
O popup conversa com um servidor local em 127.0.0.1:19867 que consulta a API de usage em intervalo configurável e grava snapshots em SQLite. Cada conta ganha uma barra de 5 horas e uma semanal; o modal de análise desenha um gráfico SVG cruzado em 6h / 24h / 7d. O card ativo carrega o badge 使用中; os demais mostram o botão 切替, que dispara a mesma pipeline do shift use por trás. O servidor também serve o mesmo popup.html estaticamente, então a UI idêntica abre numa aba do navegador em 127.0.0.1:19867 e numa janela desktop Tauri v2 (residente na bandeja; msi / dmg / deb saem do CI). Um bug corrigido uma vez atualiza todas as entradas.
Instalação
Clone o repositório e registre as contas uma de cada vez. Cada conta é capturada logo depois do /login dentro do Claude Code.
# 1. Clone and install
git clone https://github.com/kenimo49/claude-shift
cd claude-shift
npm install
chmod +x shift.sh
# 2. Register accounts, one at a time
# Inside Claude Code, run /login for the account you want to register.
# Immediately after, register it:
./shift.sh add my-account-a
# Repeat /login + add for every account you want to manage.
# 3. Start the usage server (optional, needed for popup)
./shift.sh server --interval 5
# 4. Load the Chrome extension
# chrome://extensions → Developer mode → Load unpacked → extension/ Cinco coisas que valem saber
Cada uma custou um incidente real. Deixo documentado para quem for ler depois pular direto.
-
A exibição da conta fica em ~/.claude.json, não no arquivo de credenciais
Trocar só ~/.claude/.credentials.json faz o /status seguir mostrando a conta anterior enquanto o novo token autentica cada request. O desencontro é silencioso e confuso. shift use busca o profile em api.anthropic.com/api/oauth/profile com o novo token e escreve os dois arquivos de forma consistente.
-
Tokens refresh precisam ser sincronizados de volta antes da sobrescrita
O arquivo de token no disco é atualizado pelo Claude Code durante a sessão. Sobrescrever com a conta destino sem sincronizar o arquivo atual de volta para o slot da própria conta descarta esse refresh e pode exigir novo login. shift use grava as credenciais atuais no slot da conta anteriormente ativa antes de substituir.
-
A janela de 5 horas começa no primeiro uso, não no relógio
Duas contas Max/Team iniciadas às 10:00 e às 15:00 dão duas janelas de 5 horas independentes que podem ser encadeadas. shift seed faz uma requisição mínima para iniciar a janela sob demanda, útil para posicionar uma janela nova bem antes de uma sessão longa.
-
O intervalo de polling do popup é configurável e persiste
O servidor aceita --interval N (minutos) na inicialização e um POST /config vindo do popup. O valor é gravado em ~/.claude-shift/config.json e recarregado no próximo tick. Padrão 10 minutos; o ícone de engrenagem no popup altera o valor sem reiniciar o servidor.
-
O app desktop é uma casca Tauri sem assets de UI
O executável (~8 MB) só abre um WebView em 127.0.0.1:19867 e gerencia o ciclo de vida do servidor: reutiliza um servidor vivo, faz spawn de node cli/server.js se não houver, e mostra uma página de erro caso contrário. Distribuir para outra máquina exige Node 20+, o repositório e a variável CLAUDE_SHIFT_REPO (ver docs/desktop-setup.md). Com WSL2 mirrored networking, o exe do Windows alcança direto um servidor rodando dentro do WSL.
Artigos relacionados
Ferramentas relacionadas para devs
- hook-chain-lens A read-only CLI that reads every Claude Code hook scope (user, project, local, plugin) and prints what will actually fire in this cwd, in what order, from where.
- private-lint Git-hook gate that blocks personal and private names (family names, personal emails, client domains) before commit and push. Pure Bash; detection patterns stay machine-local, never in any repo, and a full-history audit covers the moment before you flip a repository public.
- quake-lens Earthquake statistics CLI + MCP server in pure-stdlib Python: Gutenberg-Richter b-value (Aki MLE) and Omori-Utsu aftershock decay (Ogata MLE) from public catalogs.
- rhythm-lens Measures the rhythm of Japanese, English and Portuguese Markdown (sentence-length burstiness, paragraph structure) against measured human/AI distributions from two published papers. A writing feedback instrument, not an AI detector.