Recursos
Iniciar o Claude Code
Esta página foi traduzida automaticamente do inglês. Correções são bem-vindas. Editar esta página no GitHub
ccam work inicia o Claude Code com a conta work, e tudo o que vem depois do nome vai para o claude como está. Use-o onde você digitaria claude: em um terminal, em um script ou com uma entrada enviada por pipe.
Uso
ccam work # Claude Code as the account work
ccam 2 # the account with number 2 (see ccam list)
ccam work --resume # claude --resume, as work
ccam work -p "fix the tests" --output-format json
cat log.txt | ccam work -p "find the cause"
ccam -p "summarise" # no name: the default account
ccam use work # make work the default account
ccam run work --continue # same as ccam work --continue
ccam # the picker on a terminal, the list otherwise
ccam --dry-run work -p hi # print the command instead of running itInforme o nome de uma conta ou o número dela em ccam list. O ccam não lê os argumentos depois do nome, então ccam work --help mostra a ajuda do Claude Code. Um -- depois do nome é opcional. A entrada padrão, o código de saída e os sinais se comportam como no claude.
Quando o primeiro argumento começa com - e não é uma das opções do próprio ccam, o ccam inicia a conta padrão com todos os argumentos. A padrão é a conta definida com ccam use ou, se você não definiu nenhuma, a conta com o menor número.
O seletor
ccam sem argumentos abre o seletor quando a entrada e a saída padrão são um terminal e, nos outros casos, imprime ccam list. Ele mostra o número, o e-mail, o uso de 5 horas, o último uso e os itens compartilhados de cada conta; o uso é preenchido à medida que cada conta responde.
| Tecla | O que faz |
|---|---|
Enter |
Inicia o Claude Code com a conta selecionada |
1 a 9 |
Inicia a conta com esse número |
Up/Down, k/j |
Move a seleção |
a |
Fecha o seletor e executa o assistente do ccam add |
s |
Edita os itens compartilhados da conta selecionada (Space ou x alterna, Enter aplica, Esc volta) |
d |
Torna a conta selecionada a padrão |
r |
Consulta o uso de novo, sem o cache curto |
q, Esc, Ctrl+C |
Sai |
O seletor fecha antes de agir, então o terminal é restaurado antes de o Claude Code iniciar. Depois de d ou de uma alteração de compartilhamento, ele abre de novo. Uma alteração de compartilhamento mostra o plano e pergunta antes, como o ccam share faz.
Opções
| Opção | O que faz | Padrão |
|---|---|---|
--dry-run |
Imprime o ambiente e o comando que o ccam executaria e sai | desativado |
-v, --version |
Imprime ccam <version> (só como primeiro argumento) |
|
-h, --help |
A ajuda do ccam, como ccam --help ou ccam run --help |
Regras dos argumentos:
- O ccam só lê as próprias opções antes do nome da conta. Depois do nome, todos os argumentos pertencem ao Claude Code, incluindo
--dry-rune--help. --dry-runfunciona comoccam --dry-run work,ccam run --dry-run workeccam --dry-run(a conta padrão). Ela é respeitada, não recusada.ccam run <name|number> [claude args]é a forma longa deccam <name>.ccam runsem nome usa a conta padrão.- Os nomes de conta não podem ser nomes de comandos do ccam, como
add,list,runouusage, entãoccam <word>nunca é ambíguo.
A simulação imprime uma linha que você poderia colar em um shell:
$ ccam --dry-run work -p "fix the tests"
CLAUDE_CONFIG_DIR=/home/me/.local/share/ccam/profiles/work /home/me/.local/bin/claude --mcp-config=/home/me/.local/share/ccam/groups/default/mcp.json -p 'fix the tests'Como funciona
Cada inicialização segue as mesmas etapas, da linha de comando até o exec:
Cada caixa acende quando a etapa dela é executada, e as linhas abaixo são o ambiente e os argumentos com que o Claude Code inicia.
cmd/ccam/main.gochamaapp.Main. Se o ccam foi iniciado com outro nome, é um atalho e vai direto para o inicializador.app.parseexaminaos.Argsantes de o cobra entrar em ação. Só occamsozinho (o seletor), um nome de comando do ccam (config.Reserved),-h/--helpe-v/--versionvão paracli.Execute. Todo o resto é uma inicialização.launcher.Launchlê~/.config/ccam/config.toml, o único arquivo que ele analisa.launcher.Prepareencontra a conta pelo nome ou número, descarta um--inicial e localiza o executávelclaudecomResolveClaude. A busca no PATH fica em cache em~/.local/state/ccam/claude-path, junto com o horário de modificação do arquivo, para que o ccam não percorra oPATHa cada inicialização. Um arquivo alterado ou ausente provoca uma nova busca. Um caminhoclaude_binnoconfig.tomlé usado como está. O ccam recusa umclaudeque seja o próprio ccam, comparado pelo inode, porque isso entraria em loop.checkLinkscompara a pasta da conta~/.local/share/ccam/profiles/<name>/com as configurações de compartilhamento dela usandoshare.Check, que só chamalstatereadlink, uma ou duas chamadas de sistema por item. Um link ausente é criado na hora. Qualquer coisa que possa perder dados interrompe a inicialização.applyMCPadiciona os servidores MCP compartilhados (veja abaixo).session.Registerregistra a sessão. O ccam grava um marcador com o nome do PID dele, contendo o horário de início do processo, em$XDG_RUNTIME_DIR/ccam/profile-<name>/<pid>(ou em~/.local/state/ccam/locks/semXDG_RUNTIME_DIR). Para uma conta que compartilha o histórico de conversas,historyCheckprimeiro procura uma sessão em execução emhistory-<group>-<hash>, em que o hash é o da pasta atual, e também se registra ali. Oexecmantém o PID, então o marcador passa a indicar o próprio processo do Claude Code. É um marcador, e não um bloqueio mantido, porque os processos iniciados pelo Claude Code herdariam o bloqueio e o manteriam depois do fim da sessão.Plan.Execdefine o título do terminal comoclaude · <name>(quando a saída de erro padrão é um terminal), grava o horário da inicialização em~/.local/state/ccam/last-used/<name>semfsynce chamasyscall.Exec.
O Claude Code é executado com CLAUDE_CONFIG_DIR apontando para a pasta da conta e CCAM_PROFILE com o nome da conta. O ccam remove qualquer valor dessas variáveis que tenha herdado. Para uma pasta ~/.claude registrada com ccam import no macOS, ele também define CLAUDE_SECURESTORAGE_CONFIG_DIR com um valor vazio, para que a conta e o claude simples usem o mesmo login do Acesso às Chaves.
Por que exec
syscall.Exec substitui o processo do ccam pelo claude, então o ccam não fica na memória, as teclas, os sinais e o código de saída são os do próprio Claude Code, e os argumentos continuam sendo um array, nunca uma string de shell. O trabalho posterior a uma sessão, como notar servidores adicionados com claude mcp add, acontece na próxima inicialização: o ccam compara o horário de modificação do .claude.json com ~/.local/state/ccam/mcp/<name>/seen e só analisa o arquivo quando ele mudou.
Como uma linha de comando é encaminhada
Três linhas de comando, três caminhos por internal/app:
Um atalho é reconhecido pelo argv[0], ccam <name> pelo primeiro argumento, e os dois terminam em syscall.Exec. Só um comando do ccam, como ccam usage, chega ao cobra.
Servidores MCP compartilhados
Com a estratégia padrão flag, o ccam passa os servidores MCP do grupo ao Claude Code como um argumento, colocado antes dos seus:
mcp.FlagArgs só retorna um argumento se o mcp.json do grupo existir, e Plan.InsertArgs o coloca logo depois de claude. Suas próprias opções --mcp-config ou --strict-mcp-config continuam valendo por cima. É um único argumento, --mcp-config=<path>, porque o --mcp-config do Claude Code aceita vários valores: escrito como dois argumentos, ele também leria um prompt seguinte como arquivo de configuração.
Com mcp_strategy = "sync" no config.toml, o ccam grava os servidores no .claude.json da conta e pula essa etapa se a conta já estiver em execução.
Remote Control
ccam work rc (ou ccam work remote-control) inicia o Remote Control do Claude Code como work. claude remote-control recusa --mcp-config antes do seu verbo e não aceita nenhum depois dele, e as sessões dele leem os servidores MCP só do .claude.json da conta. Por isso, a estratégia flag funciona de outro jeito aqui:
remoteControltoma como verbo do Claude Code o primeiro argumento depois da conta que não começa com-. Quando ele éremote-controlourc,mcp.FlagArgsnão acrescenta nada.mcp.Syncedcompara o horário de modificação domcp.jsondo grupo com osync-stampda conta. Se o.claude.jsonjá tiver os servidores atuais do grupo, ou se o grupo não tiver nenhum, o Remote Control inicia sem perguntar.Caso contrário, o ccam lista os servidores que faltariam às sessões e pergunta:
ccam: Remote Control sessions only get MCP servers stored in account work's .claude.json, not the shared MCP servers (ctx, fs). Copy them into .claude.json (a backup is kept)? [y/N]Com
y,mcp.Syncos copia como a estratégiasyncfaz: com o bloqueio do Claude Code, depois de um backup, mantendo os servidores próprios da conta. ComN, ou sem um terminal, o Remote Control inicia sem eles, e o ccam indicamcp_strategy = "sync", que os copia antes de cada inicialização.
O ccam pergunta a cada inicialização do Remote Control até que os servidores sejam copiados e, depois de uma cópia, só quando o mcp.json do grupo mudar de novo. Uma cópia no .claude.json prevalece sobre --mcp-config nas inicializações normais seguintes, então ccam mcp add, remove e import atualizam as cópias que outras contas têm (Servidores MCP compartilhados).
O limite de 10 ms
O ccam adiciona no máximo 10 ms (p95) antes de o Claude Code iniciar. O caminho de inicialização nunca monta a árvore de comandos do cobra, não inicia o Bubble Tea nem abre conexões de rede, e TestPackageInitIsCheap falha se as funções init() dos pacotes levarem mais de 5 ms no total. scripts/perf-check.sh mede ccam --dry-run work, ccam work e um atalho com hyperfine e falha acima de 10 ms, e BenchmarkLaunchPath em internal/launcher executa as etapas em loop. Para ver o tempo de cada etapa, defina CCAM_TRACE=1:
$ CCAM_TRACE=1 ccam --dry-run work >/dev/null
ccam trace: start 2.830ms (total 2.830ms)
ccam trace: load config 0.397ms (total 3.227ms)
ccam trace: prepare 0.112ms (total 3.339ms)
ccam trace: check links 0.238ms (total 3.578ms)
ccam trace: prelaunch 0.083ms (total 3.661ms)Segurança e casos especiais
- Um nome ou número desconhecido para com
no account "<name>"e indicaccam list. Sem nenhuma conta, o ccam pede que você adicione uma comccam add <name>. - Se um caminho compartilhado virou um arquivo comum ou aponta para o lugar errado, o ccam para com
stopped because of share link problems:, lista os problemas e pede que você executeccam doctor --fix. Ele não move dados no caminho de inicialização. - Se outro Claude Code que compartilha o histórico de conversas com esta conta (mesmo grupo) estiver em execução na mesma pasta, o ccam avisa que o histórico pode se misturar e pergunta
Run anyway? [y/N]. Sem um terminal, ele mostra o aviso e continua. --dry-runpula a sincronização de MCP, o aviso de servidor novo, a verificação do histórico, o marcador de sessão, o título e o horário do último uso, e não faz o exec. Ele ainda verifica os links de compartilhamento e cria um link ausente, como uma inicialização normal faria.ccam work rccomworkjá em execução não mexe no.claude.json, avisa e inicia o Remote Control sem os servidores do grupo; execute-o de novo depois que a sessão terminar para copiá-los. Com--dry-run, ele imprime a mensagem, mas não pergunta nem copia.- Com
mcp_strategy = "sync", uma sincronização que falha imprimeccam: MCP sync failed (launching anyway): …, e o Claude Code inicia com os servidores que já tinha.