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

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

Source: https://ccam.dev/ru/features/doctor/ · Updated 2026-10-19

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

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

```sh
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
```

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

```console
$ 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`:

```console
$ 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`, даёт предупреждение и не исправляется.

### Исправление ссылок общего доступа

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

```console
$ 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/`.

## См. также

- [Общие MCP-серверы, настройки и история](https://ccam.dev/ru/docs/sharing.md)
- [Копирование существующей настройки](https://ccam.dev/ru/features/migrate.md)
- [Лимиты использования и переключение аккаунтов](https://ccam.dev/ru/docs/usage-limits.md)
- [Справочник команд](https://ccam.dev/ru/docs/commands.md)
