claude-code

ccswitch переключает аккаунты Claude Code одной командой

Claude News

claude-code

Утилита ccswitch переключает Claude Code между несколькими аккаунтами одной командой, без повторного /login и без разнесения настройки по изолированным копиям: общий каталог ~/.claude остаётся один. Код опубликован на Github под лицензией MIT, для работы нужны bash, python3 и сам Claude Code.

Коротко

  • Утилита хранит по каждому аккаунту два файла: копию .credentials.json и identity.json с ключами oauthAccount и userID, а при переключении возвращает их на место, не трогая прочие настройки.
  • Команда ccswitch refresh --all по очереди оживляет припаркованные аккаунты одним небольшим вызовом API и пропускает те, чей токен доступа ещё действителен, чтобы не тратить квоту сессий.
  • Общими остаются MCP-серверы, плагины, навыки, агенты, слэш-команды, история сессий, settings.json и CLAUDE.md, тогда как схема с отдельными CLAUDE_CONFIG_DIR дублирует всё это, и со временем копии расходятся между собой.

Разделение аккаунтов через CLAUDE_CONFIG_DIR давно работает, но платить за него приходится расхождением конфигураций: MCP-сервер, добавленный в рабочий профиль, не появляется в личном. ccswitch выглядит как выбор в пользу единой настройки, и цена этого выбора названа прямо: активным остаётся один аккаунт за раз. Для тех, кому нужны два параллельных сеанса в разных терминалах, автор советует остаться на прежней схеме с отдельными каталогами.

Переключение подменяет два файла и оставляет остальной ~/.claude.json нетронутым

Claude Code держит состояние аккаунта в двух местах: в ~/.claude/.credentials.json лежат OAuth-токены доступа и обновления, а в ~/.claude.json идентичность соседствует с MCP-серверами, решениями о доверии к проектам и прочей конфигурацией. ccswitch хранит по каждому аккаунту в ~/.config/ccswitch/accounts/<name>/ копию учётных данных и файл identity.json с ключами oauthAccount и userID.

При переключении эти два фрагмента возвращаются на место, остальные ключи ~/.claude.json не трогаются, поэтому mcpServers, projects и история сессий общие для всех аккаунтов. Перед уходом с текущего аккаунта утилита записывает живой токен обратно в его слот: Claude Code обновляет токены прямо в ходе сессии, иначе в следующий раз восстановился бы устаревший.

Аккаунт заводится командой ccswitch login с одним входом через /login или ccswitch add, если вход уже выполнен. Дальше есть ccswitch list со статусом токенов, current, save, rm, rename, backup и restore для архива хранилища, doctor для диагностики и completion для bash и zsh.

ccswitch refresh --all продлевает припаркованные аккаунты одним вызовом API

Аккаунт, к которому не переключались несколько недель, может потерять refresh-токен, и тогда нужен полный ccswitch login с браузером. Команда refresh --all по очереди восстанавливает каждый сохранённый аккаунт, делает один небольшой вызов API без инструментов, сохраняет обновлённые учётные данные и возвращает активным тот аккаунт, с которого начинала.

Токен доступа живёт около восьми часов и обновляется сам, пока аккаунт активен, а refresh-токен рассчитан примерно на 28 дней. Аккаунты с ещё действующим токеном доступа пропускаются без обращения к API, так что типичный запуск не делает ничего; ccswitch list показывает остаток по каждому аккаунту.

Запуск по расписанию описан двумя способами: cron и пользовательский таймер systemd, где Persistent=true подхватывает пропущенный запуск, если ноутбук спал. В cron придётся вручную задать PATH, иначе задание не найдёт claude, а сам refresh отказывается работать, пока запущен процесс claude, поэтому час выбирают вне рабочего времени.

Хранилище создаётся с правами 700, а CLAUDE_CONFIG_DIR имеет приоритет над ~/.claude

Каталог ~/.config/ccswitch создаётся с правами 700, файлы внутри с правами 600, и в нём лежат живые сессионные токены. Архив, который делает ccswitch backup, содержит те же токены, поэтому автор советует шифровать его, если он хранится где-то ещё, кроме собственного диска.

Если переменная CLAUDE_CONFIG_DIR задана, ccswitch работает с указанным в ней каталогом вместо ~/.claude, и ccswitch doctor предупреждает об этом; при переходе со схемы отдельных каталогов переменную советуют сначала снять. Команда ccswitch use не запускается при обнаруженном процессе claude, обойти это можно флагом --force.

Конфигурация внутри репозитория не затрагивается: .mcp.json, .claude/settings.json и CLAUDE.md подгружаются из проекта независимо от того, какой аккаунт активен. Для миграции с раздельных CLAUDE_CONFIG_DIR в документации приведён рецепт: выбрать лучший каталог в качестве общего и по очереди захватить учётные данные остальных аккаунтов через ccswitch add.

Что не проверено на реальном Keychain

На macOS Claude Code хранит OAuth-креденшел в связке ключей входа, поэтому ccswitch читает и пишет его через security(1), собирая тот же элемент: сервис Claude Code-credentials и аккаунт $USER либо claude-code-user, если переменная пуста или содержит посторонние символы. Первое переключение может вызвать запрос доступа к связке ключей.

Этот путь прогонялся только против подставной реализации security(1), а не против настоящей связки, поэтому помечен как экспериментальный, о странностях просят сообщать в issue #1. Поведение в WSL должно совпадать с Linux, но не тестировалось, сроков стабильной поддержки автор не называет.

Комментарии

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.

Из Google мы используем только имя и аватар. Почту не сохраняем.