Funciones
Administrar cuentas
Esta página se tradujo automáticamente del inglés. Las correcciones son bienvenidas. Editar esta página en GitHub
Cada cuenta de ccam es una carpeta de configuración de Claude Code independiente con su propio inicio de sesión. Estos comandos crean cuentas, inician sesión en ellas, las listan, les cambian el nombre y las quitan, y registran carpetas que ya tienes.
Uso
ccam add # wizard on a terminal: name, shared items, shortcut, login
ccam add work --shortcut ccwork # no wizard: log in, then create the ccwork command
ccam add side --no-login --share history=team
ccam login side # run claude auth login inside the account
ccam logout side # remove the login token
ccam list # table of accounts; ccam ls is the same
ccam list --json # machine-readable
ccam use 2 # make slot 2 the default account
ccam rename side personal
ccam remove personal # asks, then moves the folder to the trash
ccam import # find ~/.claude and ~/.claude-* and ask about each
ccam import ~/.claude-ops --name ops
ccam completion zsh > "${fpath[1]}/_ccam"Siempre que un comando acepta <name|number>, puedes indicar el nombre de la cuenta o su número de posición, la columna # de ccam list.
ccam add sin opciones en una terminal abre un asistente. Pide el nombre, luego muestra una lista de selección de los elementos compartidos (todo está marcado excepto el historial de conversaciones), después pregunta Create a shortcut command for work? [y/N] y, si respondes y, Shortcut name [ccwork]:. Cualquiera de --share, --shortcut o --no-login, o una tubería en lugar de una terminal, omite el asistente; en ese caso el nombre es obligatorio y no se crea ningún atajo salvo que --shortcut indique uno.
ccam list muestra la posición, el nombre, el atajo, el correo electrónico, los elementos compartidos y el último uso, con * delante de la cuenta predeterminada:
$ ccam list
# Name Shortcut Email Shared Last used
* 1 work ccwork user@example.com mcp settings md ext -
2 personal - me@side.dev settings md ext history@team -Con --json, cada cuenta es un objeto con slot, shortcut, name, email, default, dir, last_used (se omite si la cuenta nunca se inició) y share. share asigna a cada elemento (mcp, settings, memory, extensions, history) su nombre de grupo o "local".
Opciones
| Opción | Qué hace | Valor predeterminado |
|---|---|---|
ccam add --no-login |
Crea la cuenta sin iniciar sesión; inicia sesión más tarde con ccam login <name> |
desactivada |
ccam add --share <item=group> |
Comparte un elemento con un grupo, o item=local para mantenerlo privado. Se puede repetir |
mcp, settings, memory, extensions en default; history local |
ccam add --shortcut <command> |
Crea también este atajo en ~/.local/bin |
ninguno |
ccam list --json |
Imprime las cuentas en JSON | desactivada |
ccam remove -y, --yes |
Quita sin preguntar | desactivada |
ccam import --name <name> |
Nombre de cuenta para la carpeta que indicas | se deriva del nombre de la carpeta |
ccam import -y, --yes |
Importa todas las carpetas encontradas sin preguntar | desactivada |
--dry-run |
La respetan ccam list y ccam completion, que no cambian nada. La rechazan add, login, logout, use, rename, remove e import, con --dry-run is not supported by `ccam add`; nothing was changed (con el nombre del comando) |
desactivada |
ccam login, ccam logout, ccam use y ccam rename no tienen opciones propias. ccam completion acepta bash o zsh; cualquier otro valor falla con only bash and zsh are supported.
Los nombres de cuenta tienen de 1 a 32 caracteres entre a-z, 0-9, - y _, y empiezan con una letra o un dígito. Un nombre no puede tener solo dígitos, porque ccam 2 significa la posición 2. Tampoco puede ser un comando de ccam (add, list, ls, run, use, next, usage, u, share, mcp, login, logout, rename, remove, rm, import, migrate, doctor, shims, shortcut, completion, help, version, statusline, update), así que ccam <name> nunca es ambiguo. La lista es config.Reserved en internal/config.
Cómo funciona
ccam add work --shortcut ccwork ejecuta estos pasos en addProfile (internal/cli/profiles.go):
config.ValidateNamecomprueba el nombre yshim.Checkcomprueba el atajo antes de crear nada.profile.Addcrea~/.local/share/ccam/profiles/work/con el modo0700y le asigna a la cuenta el número de posición libre más bajo (Config.NextSlot), de modo que el número de una cuenta quitada se reutiliza. La primera cuenta pasa a ser la predeterminada.applyShareenlaza la carpeta nueva y vacía con sus grupos de uso compartido medianteshare.Buildy despuésApply, por ejemplosettings.jsoncongroups/default/settings.json. Si esto falla, se elimina la carpeta nueva, porque una carpeta sobrante bloquearía cada reintento confolder already exists.- La cuenta se guarda en
~/.config/ccam/config.tomlmediantefsutil.AtomicWrite: un archivo temporal,fsyncy luegorename, así que un fallo nunca deja la configuración a medias. runLogininiciaclaude auth loginconCLAUDE_CONFIG_DIRapuntando a la carpeta de la cuenta. Si el inicio de sesión falla, la cuenta se conserva, y ccam imprime el error y te indica que ejecutesccam login workmás tarde.profile.ReadEmailextraeoauthAccount.emailAddressdeprofiles/work/.claude.json. Ese archivo puede ocupar varios megabytes, así queTopLevelValuebusca esa única clave en lugar de analizar el archivo completo.shim.Installenlaza~/.local/bin/ccworkcon el binario de ccam, que buscaargv[0]enconfig.tomlal iniciar.
Un inicio de sesión puede tardar minutos, y mientras tanto otro ccam puede guardar la configuración. Por eso los comandos que esperan guardan mediante env.update, que vuelve a cargar config.toml, aplica el único cambio (aquí, el correo electrónico) y guarda. ccam remove vuelve a cargar después de su pregunta por el mismo motivo.
ccam login ejecuta los pasos 5 y 6 para una cuenta existente. ccam logout ejecuta claude auth logout en la cuenta y borra el correo electrónico guardado. ccam use solo reescribe default en config.toml.
Iniciar sesión en una máquina remota
Por SSH, la parte del navegador de claude auth login puede fallar. Claude Code espera el inicio de sesión en un servidor de retorno en http://localhost:<port>/callback del servidor, pero el navegador que completa el inicio de sesión se ejecuta en tu computadora, donde esa dirección no lleva a ninguna parte, y el navegador muestra un error como ERR_CONNECTION_REFUSED. La dirección sigue llevando el código de un solo uso, así que ccam puede entregarlo:
runLogin no le cede tu terminal a Claude Code. Conecta la entrada estándar de Claude Code a una tubería y relayLogin copia en ella cada línea que escribes, de modo que un código pegado en la solicitud Paste code here de Claude Code sigue llegando. Cuando una línea es una dirección de retorno, callbackURL la acepta solo si el host es localhost, 127.0.0.1 o [::1], se indica un puerto, la ruta es /callback y están presentes tanto code como state; http:// se puede omitir. Después, deliverCallback solicita esa dirección en el servidor con un límite de 10 segundos y sin seguir redirecciones, como lo habría hecho el navegador. La solicitud llega al servidor de retorno del claude auth login que está esperando (la línea discontinua del diagrama). Claude Code recibe el código y guarda el inicio de sesión, en Linux en .credentials.json dentro de la carpeta de la cuenta. Una línea pegada nunca puede hacer que ccam se conecte a otro host.
ccam imprime esto antes de que empiece el inicio de sesión:
On a remote machine? If the browser ends on a http://localhost:…/callback page that does not load, paste that address here.Si todo sale bien, imprime → Passed the sign-in to Claude Code on this machine.
Mientras el inicio de sesión espera una entrada en una terminal, ccam desactiva el eco y el modo de línea de la terminal y muestra un * por cada carácter que escribes, para que un código o una dirección de retorno pegados no aparezcan en pantalla. readLine se encarga de editar la línea: Enter envía la línea, Backspace borra un carácter y Ctrl+D en una línea vacía termina la entrada. La terminal se restaura cuando termina el inicio de sesión, y también con Ctrl+C, SIGTERM o SIGHUP, que siguen cerrando ccam. Sin una terminal en la entrada estándar y la salida de error estándar, las líneas se copian tal como llegan.
Cambiar el nombre, quitar e importar
ccam rename y ccam remove actúan sobre la carpeta de la cuenta y sobre lo que ccam guarda en otros lugares con el nombre de la cuenta. nameState lista esas rutas: ~/.local/state/ccam/last-used/<name>, ~/.local/state/ccam/mcp/<name> y las cachés de uso ~/.local/state/ccam/usage/<name>.json y <name>.statusline.json. ccam remove work las procesa en este orden:
ccam remove primero se niega si la cuenta está en ejecución y luego pregunta. Si la cuenta comparte extensiones, RewritePluginPaths reescribe los archivos installed_plugins.json y known_marketplaces.json del grupo, porque Claude Code guarda rutas absolutas de plugins que pueden pasar por la carpeta de esta cuenta. profile.Trash mueve la carpeta a ~/.local/share/ccam/trash/<name>-<time>/, la cuenta sale de config.toml, las rutas de nameState se eliminan para que una cuenta posterior con el mismo nombre no las herede, y se quita el enlace del atajo. Para recuperarla, mueve la carpeta de vuelta desde la papelera.
ccam rename cambia el nombre de la carpeta, reescribe las rutas de plugins de su plugins/ de la carpeta anterior a la nueva, conserva la cuenta predeterminada y mueve las rutas de nameState al nombre nuevo. El atajo conserva su nombre. Si falla la reescritura de los plugins, la carpeta recupera su nombre anterior, ya que la configuración no se guarda.
ccam import registra una carpeta donde está, como dir en config.toml. Nunca la mueve ni la copia: un token de actualización copiado haría que las copias se cerraran la sesión entre sí. Sin una carpeta como argumento, busca carpetas ~/.claude y ~/.claude-* no registradas y pregunta por cada una; los nombres salen de la carpeta (~/.claude es main, ~/.claude-work es work, ~/.claude-2 es acct2), y una carpeta de la que no se puede derivar un nombre aparece con el comando --name que debes usar. Sin CLAUDE_CONFIG_DIR, Claude Code guarda .claude.json en tu carpeta personal junto a ~/.claude, así que cuando importas ~/.claude y no tiene su propio .claude.json, ccam crea el enlace ~/.claude/.claude.json a ~/.claude.json. Así, claude a secas y ccam main ven la misma cuenta. Las cuentas importadas no comparten nada hasta que ejecutas ccam share, y no se crea ningún atajo.
ccam completion bash|zsh imprime un script de autocompletado que también completa los nombres de cuenta.
Seguridad y casos límite
ccam renameyccam removese niegan mientras la cuenta está en ejecución (refuseRunning), conwork is running; quit its Claude Code session first, porque la sesión sigue escribiendo en la carpeta.ccam removeen una cuenta importada solo anula su registro:✓ main unregistered (folder ... left in place). Tu~/.claudeno se mueve a la papelera.ccam addrechaza un nombre cuya carpeta ya existe enprofiles/y te remite accam import.ccam importrechaza una carpeta que ya está registrada, una ruta que no es una carpeta y un nombre que ya está en uso.ccam logoutyccam loginno comprueban si la cuenta está en ejecución.- Si el reenvío no puede llegar a Claude Code, por ejemplo porque el inicio de sesión ya terminó, imprime
ccam: could not pass the sign-in to Claude Code:con el motivo. Un error HTTP suele significar que el código venció; vuelve a iniciar el inicio de sesión.