Возможности
Управление аккаунтами
Эта страница переведена с английского машинным способом. Исправления приветствуются. Редактировать эту страницу на GitHub
Каждый аккаунт ccam представляет собой отдельную папку конфигурации Claude Code с собственным входом. Эти команды создают аккаунты, выполняют вход, выводят список, переименовывают и удаляют аккаунты, а также регистрируют уже существующие папки.
Использование
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"Везде, где команда принимает <name|number>, можно указать имя аккаунта или номер его слота, то есть столбец # в выводе ccam list.
ccam add в терминале без параметров открывает мастер. Он спрашивает имя, затем показывает список общих элементов с флажками (отмечено всё, кроме истории разговоров), затем задаёт вопрос Create a shortcut command for work? [y/N] и после ответа y спрашивает Shortcut name [ccwork]:. Любой из параметров --share, --shortcut или --no-login, а также конвейер вместо терминала отключают мастер; тогда имя обязательно, а короткая команда создаётся, только если её имя задано через --shortcut.
ccam list показывает слот, имя, короткую команду, email, общие элементы и время последнего использования, а перед аккаунтом по умолчанию ставит *:
$ 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 -С --json каждый аккаунт выводится как объект с полями slot, shortcut, name, email, default, dir, last_used (отсутствует, если аккаунт ни разу не запускался) и share. share сопоставляет каждому элементу (mcp, settings, memory, extensions, history) имя группы или "local".
Параметры
| Параметр | Действие | По умолчанию |
|---|---|---|
ccam add --no-login |
Создать аккаунт без входа; войти позже можно командой ccam login <name> |
выкл. |
ccam add --share <item=group> |
Сделать элемент общим с группой или указать item=local, чтобы оставить его личным. Можно повторять |
mcp, settings, memory, extensions в default; history локально |
ccam add --shortcut <command> |
Дополнительно создать эту короткую команду в ~/.local/bin |
нет |
ccam list --json |
Вывести аккаунты в формате JSON | выкл. |
ccam remove -y, --yes |
Удалить без вопросов | выкл. |
ccam import --name <name> |
Имя аккаунта для указанной папки | выводится из имени папки |
ccam import -y, --yes |
Импортировать все найденные папки без вопросов | выкл. |
--dry-run |
Учитывается командами ccam list и ccam completion, которые ничего не меняют. Команды add, login, logout, use, rename, remove и import отклоняют его с сообщением --dry-run is not supported by `ccam add`; nothing was changed (с именем команды) |
выкл. |
У ccam login, ccam logout, ccam use и ccam rename нет собственных параметров. ccam completion принимает bash или zsh; любое другое значение завершается ошибкой only bash and zsh are supported.
Имя аккаунта содержит от 1 до 32 символов из a-z, 0-9, - и _ и начинается с буквы или цифры. Имя не может состоять только из цифр, потому что ccam 2 означает слот 2. Имя также не может совпадать с командой 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), поэтому ccam <name> никогда не бывает неоднозначным. Этот список задан в config.Reserved в internal/config.
Как это работает
ccam add work --shortcut ccwork выполняет следующие шаги в addProfile (internal/cli/profiles.go):
config.ValidateNameпроверяет имя, аshim.Checkпроверяет короткую команду, прежде чем что-либо будет создано.profile.Addсоздаёт~/.local/share/ccam/profiles/work/с правами0700и назначает аккаунту наименьший свободный номер слота (Config.NextSlot), поэтому номер удалённого аккаунта используется повторно. Первый аккаунт становится аккаунтом по умолчанию.applyShareсвязывает новую пустую папку с её группами общего доступа черезshare.Buildи затемApply, напримерsettings.jsonсgroups/default/settings.json. Если это не удалось, новая папка удаляется, потому что оставшаяся папка блокировала бы каждую повторную попытку ошибкойfolder already exists.- Аккаунт сохраняется в
~/.config/ccam/config.tomlчерезfsutil.AtomicWrite: временный файл,fsync, затемrename, поэтому сбой никогда не оставляет конфигурацию записанной наполовину. runLoginзапускаетclaude auth loginсCLAUDE_CONFIG_DIR, указывающим на папку аккаунта. Если вход не удался, аккаунт остаётся, а ccam выводит ошибку и предлагает позже выполнитьccam login work.profile.ReadEmailберётoauthAccount.emailAddressизprofiles/work/.claude.json. Этот файл может занимать несколько мегабайт, поэтомуTopLevelValueищет один ключ, а не разбирает весь файл.shim.Installсвязывает~/.local/bin/ccworkс исполняемым файлом ccam, который при запуске ищетargv[0]вconfig.toml.
Вход может занять несколько минут, и за это время другой ccam может сохранить конфигурацию. Поэтому команды, которые ждут, сохраняют через env.update: он заново читает config.toml, применяет одно изменение (здесь email) и сохраняет. По той же причине ccam remove заново читает конфигурацию после своего вопроса.
ccam login выполняет шаги 5 и 6 для существующего аккаунта. ccam logout запускает claude auth logout в аккаунте и удаляет сохранённый email. ccam use только перезаписывает default в config.toml.
Вход на удалённой машине
Через SSH браузерная часть claude auth login может не сработать. Claude Code ждёт завершения входа на сервере обратного вызова по адресу http://localhost:<port>/callback на сервере, но браузер, в котором завершается вход, работает на вашем компьютере, где этот адрес никуда не ведёт, и браузер показывает ошибку, например ERR_CONNECTION_REFUSED. Адрес при этом всё равно содержит одноразовый код, поэтому ccam может его доставить:
runLogin не отдаёт ваш терминал Claude Code. Он подключает стандартный ввод Claude Code к каналу, а relayLogin копирует туда каждую введённую вами строку, поэтому код, вставленный в ответ на приглашение Claude Code Paste code here, всё равно доходит. Если строка является адресом обратного вызова, callbackURL принимает её, только если хост равен localhost, 127.0.0.1 или [::1], порт указан, путь равен /callback и присутствуют и code, и state; http:// можно опустить. Затем deliverCallback запрашивает этот адрес на сервере с ограничением в 10 секунд и без перехода по перенаправлениям, как сделал бы браузер. Запрос попадает на сервер обратного вызова ожидающего claude auth login (пунктирная линия на схеме). Claude Code получает код и сохраняет вход, в Linux в .credentials.json в папке аккаунта. Вставленная строка никогда не может заставить ccam обратиться к другому хосту.
Перед началом входа ccam выводит:
On a remote machine? If the browser ends on a http://localhost:…/callback page that does not load, paste that address here.При успехе он выводит → Passed the sign-in to Claude Code on this machine.
Переименование, удаление и импорт
ccam rename и ccam remove работают с папкой аккаунта и с тем, что ccam хранит под именем аккаунта в других местах. nameState перечисляет эти пути: ~/.local/state/ccam/last-used/<name>, ~/.local/state/ccam/mcp/<name> и кэши использования ~/.local/state/ccam/usage/<name>.json и <name>.statusline.json. ccam remove work обрабатывает их в таком порядке:
Сначала ccam remove отказывается работать, если аккаунт запущен, затем задаёт вопрос. Если аккаунт делит расширения, RewritePluginPaths переписывает файлы группы installed_plugins.json и known_marketplaces.json, потому что Claude Code хранит абсолютные пути к плагинам, которые могут проходить через папку этого аккаунта. profile.Trash перемещает папку в ~/.local/share/ccam/trash/<name>-<time>/, аккаунт удаляется из config.toml, пути nameState удаляются, чтобы будущий аккаунт с тем же именем их не унаследовал, а ссылка короткой команды удаляется. Чтобы восстановить аккаунт, верните папку из корзины.
ccam rename переименовывает папку, переписывает пути плагинов в её plugins/ со старой папки на новую, сохраняет статус аккаунта по умолчанию и переносит пути nameState на новое имя. Короткая команда сохраняет своё имя. Если переписать пути плагинов не удалось, папке возвращается прежнее имя, так как конфигурация не сохраняется.
ccam import регистрирует папку там, где она находится, как dir в config.toml. Он никогда не перемещает и не копирует её: скопированный токен обновления заставил бы копии выводить друг друга из аккаунта. Без аргумента с папкой он ищет незарегистрированные папки ~/.claude и ~/.claude-* и спрашивает про каждую; имена берутся из папки (~/.claude становится main, ~/.claude-work становится work, ~/.claude-2 становится acct2), а папка, для которой имя вывести нельзя, выводится вместе с командой --name, которую нужно использовать. Без CLAUDE_CONFIG_DIR Claude Code хранит .claude.json в домашней папке рядом с ~/.claude, поэтому, когда вы импортируете ~/.claude и в ней нет собственного .claude.json, ccam создаёт ссылку ~/.claude/.claude.json на ~/.claude.json. После этого обычный claude и ccam main видят один и тот же аккаунт. Импортированные аккаунты ничего не делят, пока вы не выполните ccam share, и короткая команда для них не создаётся.
ccam completion bash|zsh выводит скрипт автодополнения, который также дополняет имена аккаунтов.
Безопасность и особые случаи
ccam renameиccam removeотказываются работать, пока аккаунт запущен (refuseRunning), с сообщениемwork is running; quit its Claude Code session first, потому что сессия продолжает записывать в папку.ccam removeдля импортированного аккаунта только отменяет его регистрацию:✓ main unregistered (folder ... left in place). Ваша~/.claudeне перемещается в корзину.ccam addотклоняет имя, папка для которого уже существует вprofiles/, и предлагаетccam import.ccam importотклоняет уже зарегистрированную папку, путь, который не является папкой, и занятое имя.ccam logoutиccam loginне проверяют, запущен ли аккаунт.- Если передать вход в Claude Code не удаётся, например после завершения входа, выводится
ccam: could not pass the sign-in to Claude Code:с причиной. Ошибка HTTP обычно означает, что срок действия кода истёк; начните вход заново.