Возможности

Проверка и исправление

Обновлено 19 октября 2026 г.
Проверено с ccam 0.6.0 и Claude Code 2.1.302

Эта страница переведена с английского машинным способом. Исправления приветствуются. Редактировать эту страницу на GitHub

На этой странице

ccam doctor проверяет вашу установку ccam: исполняемый файл Claude Code, папку, вход и ссылки общего доступа каждого аккаунта, общие MCP-серверы, эндпоинт использования и ваши короткие команды. ccam doctor --fix исправляет то, что можно исправить без потери данных, и предварительно перемещает каждый заменяемый файл в папку резервных копий. Запускайте его, когда ccam <name> останавливается из-за проблемы со ссылкой общего доступа, после того как вы восстановили файлы вручную, или после обновления Claude Code.

Использование

ccam doctor                  # check everything, change nothing
ccam doctor --fix            # check, then repair what is safe to repair
ccam --dry-run doctor --fix  # report only: what --fix would repair

Каждый результат занимает одну строку с отметкой: ✓ всё в порядке, · информация, ! предупреждение, ✗ ошибка. Результаты по аккаунтам начинаются с имени аккаунта.

$ ccam doctor
✓ Claude Code 2.1.302 (Claude Code) (/home/me/.local/bin/claude)
! personal: folder permissions are 755 (should be 0700)
! personal: .credentials.json permissions are 644 (should be 0600)
✓ personal: login valid (me@example.com)
✗ personal: /home/me/.local/share/ccam/profiles/personal/settings.json: set to shared but is a real file, not a link
· personal: unknown entries (Claude Code layout may have changed): newthing
! work: not logged in → `ccam login work`
✓ work: share links OK
! missing shortcuts in /home/me/.local/bin: ccp

`ccam doctor --fix` repairs what it can.

С --fix каждый исправленный результат заканчивается на → fixed:

$ ccam doctor --fix
✓ Claude Code 2.1.302 (Claude Code) (/home/me/.local/bin/claude)
! personal: folder permissions are 755 (should be 0700) → fixed
! personal: .credentials.json permissions are 644 (should be 0600) → fixed
✓ personal: login valid (me@example.com)
✗ personal: /home/me/.local/share/ccam/profiles/personal/settings.json: set to shared but is a real file, not a link → fixed
· personal: unknown entries (Claude Code layout may have changed): newthing
! work: not logged in → `ccam login work`
✓ work: share links OK
! missing shortcuts in /home/me/.local/bin: ccp → fixed

Параметры

Параметр Действие По умолчанию
--fix Исправить то, что безопасно исправить (для изменённых файлов создаются резервные копии) выкл.
--dry-run (глобальный) Выполнить все проверки, но ничего не исправлять, даже с --fix выкл.

ccam doctor не принимает аргументов. Он учитывает --dry-run: ccam --dry-run doctor --fix выводит те же результаты, что и ccam doctor, и ничего не меняет.

Код возврата равен 1, если остался хотя бы один неисправленный результат ✗, и 0 в остальных случаях. Предупреждения и информация никогда не приводят к ошибке. Если запуск без --fix завершился ошибкой, ccam в конце выводит пустую строку и `ccam doctor --fix` repairs what it can.. Если конфигурацию не удаётся загрузить, команда также завершается с 1 и ошибкой ccam:.

Как это работает

internal/cli/doctor.go загружает ~/.config/ccam/config.toml и вызывает doctor.Run в internal/doctor/doctor.go, который выполняет проверки в фиксированном порядке и возвращает результаты. --fix передаётся как Options.Fix, а в пробном запуске устанавливается в false.

Средний блок выполняется один раз для каждого аккаунта. Проверки и то, что делает --fix для каждой из них:

  1. Версия Claude Code (checkClaude). Находит исполняемый файл claude так же, как это делает запуск, и выполняет claude --version. Если версия не начинается с 2.1.302, то есть с версии, для которой проверялась структура папок ccam (doctor.LayoutVersion), добавляется · ccam was verified against the folder layout of Claude Code 2.1.302. Any 'unknown entries' below may mean the layout changed. Отсутствующий исполняемый файл или ошибка --version считаются ошибкой. Не исправляется.
  2. Данные входа в окружении (checkAuthEnv). Предупреждает, если задана CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY или ANTHROPIC_AUTH_TOKEN: каждый аккаунт, запущенный из этой оболочки, наследует её, и Claude Code предпочитает её собственному входу аккаунта. Не исправляется; удалите переменную сами.
  3. Папка (checkProfile). Отсутствующая папка аккаунта считается ошибкой и завершает проверки этого аккаунта. Права, в которых установлены биты группы или остальных, дают предупреждение; --fix выполняет chmod 0700.
  4. Файл входа (checkCredentials). .credentials.json проверяется через lstat. Символическая ссылка считается ошибкой, потому что у каждого аккаунта должен быть собственный токен, и не исправляется. Права, отличные от 0600, дают предупреждение; --fix выполняет chmod 0600. Затем читается вход (в macOS сначала из Связки ключей). Отсутствие входа даёт предупреждение со ссылкой на ccam login <name>. Истёкший токен обновления даёт ошибку login expired; истёкший токен доступа считается только информацией, так как Claude Code обновит его при следующем запуске. Ничего из этого не исправляется.
  5. Ссылки общего доступа (share.Check). Сравнивает каждый путь в share.Layout с настройками общего доступа аккаунта, используя только lstat и readlink. Сообщает о четырёх видах проблем: отсутствующая ссылка, ссылка, указывающая в другое место, настоящий файл там, где должна быть ссылка, и оставшаяся ссылка для элемента, который теперь локальный. Отсутствующая ссылка даёт предупреждение, остальные случаи считаются ошибками.
  6. Неизвестные записи (checkUnknownEntries). Перечисляет имена верхнего уровня в папке аккаунта, которых ccam не знает (share.Known), как подсказку, что структура Claude Code изменилась. Только информация.
  7. Пути плагинов (checkPlugins). Реестры плагинов (installed_plugins.json, known_marketplaces.json) хранят абсолютные пути. В plugins/ каждой группы пути, проходящие через папку одного аккаунта, ломаются, когда этот аккаунт удаляют или переименовывают. --fix переписывает их на папку группы через profile.RewritePluginPaths, атомарно записывая файл реестра.
  8. MCP-серверы (checkMCP). Загружает mcp.json каждой группы один раз. Файл, который не удаётся прочитать, считается ошибкой; сервер, не прошедший mcp.Validate, даёт предупреждение. Не исправляется.
  9. Формат ответа об использовании (checkUsageFormat). Запрашивает эндпоинт использования без кэша и с обычным ограничением в 3 секунды для одного аккаунта за другим, пока какой-нибудь не ответит. Если ответ больше не разбирается, выводится предупреждение, что ccam usage переходит на кэш строки состояния. Это единственная проверка, которая обращается к сети.
  10. Короткие команды (checkShims). Только если у аккаунта есть короткая команда. Отсутствующие ссылки в ~/.local/bin дают предупреждение; --fix вызывает shim.Install, который только создаёт отсутствующие ссылки и никогда не трогает другие файлы. Папка bin, которой нет в PATH, даёт предупреждение и не исправляется.

При запуске отсутствующая ссылка создаётся на месте, но всё, что может привести к потере данных, останавливает запуск и отправляет сюда:

$ ccam work
ccam: stopped because of share link problems:
  /home/me/.local/share/ccam/profiles/work/CLAUDE.md: set to shared but is a real file, not a link
Repair them with `ccam doctor --fix`, then run again

При любой проблеме со ссылкой общего доступа --fix вызывает share.Build, передавая настройки общего доступа аккаунта и как текущее, и как целевое состояние, а затем Plan.Apply. Build заново выводит каждый шаг из того, что находится на диске, и строит тот же план, что и ccam share, поэтому исправление следует тем же правилам, что и включение общего доступа.

Здесь settings.json является настоящим файлом. Поскольку в группе уже есть другой settings.json, для конфликта выбирается вариант по умолчанию, KeepGroup, и копия группы остаётся. Файл аккаунта перемещается в .ccam-backup/<time>/settings.json внутри папки аккаунта, а os.Symlink связывает путь с группой. Другие случаи:

  • Если у группы ещё нет копии, файл аккаунта перемещается в группу и становится её первым содержимым.
  • Для папки файлы, которых нет в группе, перемещаются в группу; остальное попадает в резервную копию.
  • Для history.jsonl по умолчанию используется merge by line: строки группы, затем ваши новые строки. Прежняя копия группы сохраняется в .ccam-backup/<time>/group/.
  • Ссылка на другую группу заменяется. Ссылка на папку вне ccam попадает в резервную копию, а её содержимое становится начальным содержимым группы, если группа пуста.
  • Оставшаяся ссылка для элемента, который теперь локальный, удаляется, и аккаунт получает копию содержимого группы.

Кроме удаления ссылок, каждый шаг перемещает данные в группу или в папку резервных копий. Ничего не удаляется.

Безопасность и особые случаи

  • Обычный ccam doctor никогда ничего не меняет. В скриптах для надёжности используйте --dry-run вместе с --fix.
  • doctor --fix не проверяет, запущен ли аккаунт. Завершите Claude Code для аккаунта, прежде чем исправлять его ссылки общего доступа, потому что сессия продолжает записывать в эти файлы.
  • Если исправить общий доступ не удалось, ccam сообщает could not repair share links: <error> для этого аккаунта и пропускает для него проверку неизвестных записей. Остальные аккаунты всё равно проверяются.
  • Если ccam share прерывается на середине, он сначала сохраняет целевые настройки и предлагает завершить работу командой ccam doctor --fix.
  • О символической ссылке на .credentials.json, истёкшем входе и данных входа в окружении сообщается, но они никогда не изменяются.
  • Перезапись реестров плагинов выполняется атомарно, но не копируется в .ccam-backup/.