# Общий доступ между аккаунтами

> Как ccam share связывает настройки, CLAUDE.md, расширения и историю с папкой группы, используя план, резервные копии и выбор при конфликтах, и как off копирует данные обратно.

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

У каждого аккаунта своя папка, но большая часть её содержимого не обязана быть отдельной. `ccam share` включает или отключает общий доступ для одного аккаунта и одного элемента за раз: файл или папка аккаунта перемещается в папку группы и заменяется символической ссылкой, поэтому каждый аккаунт группы читает и записывает одну и ту же копию. Используйте его после `ccam add`, чтобы изменить, что делит аккаунт, или чтобы выделить несколько аккаунтов в отдельную группу.

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

```sh
ccam share work                       # show what work shares, and with which group
ccam share work --history on          # share conversation history with the default group
ccam share side --history team        # share it with the group team instead
ccam share work --settings off        # give work its own copy of settings.json again
ccam share work --memory off --fresh  # stop sharing CLAUDE.md and start with no file
ccam share work --settings on --yes --prefer merge   # no questions; merge JSON on conflicts
ccam --dry-run share work --history on               # print the plan, change nothing
```

Без параметров элементов `ccam share` выводит текущее состояние:

```console
$ ccam share work
Sharing for work
  MCP servers                        shared (group default)  --mcp
  settings.json                      shared (group default)  --settings
  global CLAUDE.md                   shared (group default)  --memory
  agents, commands, skills, plugins  shared (group default)  --extensions
  conversation history               local                   --history
```

С параметрами ccam выводит план, спрашивает про каждый файл, который отличается от копии группы, и задаёт вопрос `Proceed? [y/N]`, прежде чем что-либо изменить. Новый аккаунт делит всё, кроме истории разговоров; раздел [Общие MCP-серверы, настройки и история](https://ccam.dev/ru/docs/sharing.md) описывает каждый элемент с точки зрения пользователя.

## Параметры

| Параметр | Действие | По умолчанию |
| --- | --- | --- |
| `--mcp <on\|off\|group>` | MCP-серверы | без изменений |
| `--settings <on\|off\|group>` | `settings.json` | без изменений |
| `--memory <on\|off\|group>` | глобальный `CLAUDE.md` | без изменений |
| `--extensions <on\|off\|group>` | `agents/`, `commands/`, `skills/`, `plugins/`, `output-styles/`, `rules/` | без изменений |
| `--history <on\|off\|group>` | `projects/` и `history.jsonl` | без изменений |
| `--fresh` | при отключении общего доступа начать с пустого состояния вместо копирования содержимого группы | выкл. |
| `--prefer <group\|mine\|merge>` | как решать конфликты | спрашивать; с `--yes` вариант по умолчанию для каждого элемента |
| `-y`, `--yes` | выполнить без вопросов; конфликты решаются по `--prefer` | выкл. |
| `-h`, `--help` | справка по `share` | |
| `--dry-run` (глобальный) | учитывается: спрашивает про конфликты, выводит план и ничего не меняет | выкл. |

Значение `on` означает группу `default`, `off` означает локальный (не общий) элемент, а любое другое значение считается именем группы. Имена групп становятся именами папок внутри `~/.local/share/ccam/groups/`, поэтому `ccam share side --history ../x` завершается ошибкой `invalid group name: "../x"`. Аккаунт указывается по имени или номеру, и меняются только названные вами элементы.

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

Участвующие файлы:

- `~/.config/ccam/config.toml`: таблица `[profile.share]` каждого аккаунта, по одному значению на элемент.
- `~/.local/share/ccam/profiles/<name>/`: `CLAUDE_CONFIG_DIR` аккаунта.
- `~/.local/share/ccam/groups/<group>/`: общие копии.

1. `internal/cli/share.go` читает конфигурацию, применяет каждое значение `--<item>` к копии настроек аккаунта через `config.Share.Set` и отказывается работать, если аккаунт запущен.
2. `share.Build` сравнивает текущие настройки с целевыми и составляет список шагов. Он только читает диск: `os.Lstat` и `os.Readlink` для каждого пути в `share.Layout`. План представляет собой список операций: перемещение в пустое место группы (adopt), перемещение файлов, которых нет в группе (merge dir), запись решённого конфликта в группу, резервное копирование, удаление ссылки, создание ссылки, копирование обратно, перезапись путей плагинов и объединение реестра плагинов.
3. Конфликты решаются в ответ на вопрос или через `--prefer`.
4. `Plan.Describe` выводит план, и ccam спрашивает подтверждение.
5. Целевые настройки записываются в `config.toml` до того, как что-либо перемещается. Если `Plan.Apply` останавливается на середине, `ccam doctor --fix` и повторный запуск строят план к сохранённой цели и завершают изменение.
6. `Plan.Apply` выполняет шаги по порядку. Каждый шаг перемещает данные в группу или в папку резервных копий; ничего не удаляется.

`share.Layout` представляет собой список разрешённых путей, которые охватывает каждый элемент. Всё, чего нет в этом списке, никогда не попадает в группу. `share.Never` называет `.credentials.json` и `.claude.json`, и `Build` останавливается с внутренней ошибкой, если один из них вдруг появится в структуре. У элемента `mcp` нет путей: список серверов хранится внутри `.claude.json`, поэтому [общий доступ к MCP](https://ccam.dev/ru/features/mcp.md) работает через `mcp.json` группы, а `--mcp` меняет только настройку.

Вот что происходит с одной папкой, `projects/`, когда `side` включает общий доступ к истории, а в группе уже есть содержимое:

Если в группе по этому пути ещё ничего нет, аккаунт делит его первым, и его папка перемещается туда как есть, без резервной копии. Иначе `mergeDir` перемещает в группу каждый файл, которого в ней нет, а файлы, существующие с обеих сторон, остаются в папке аккаунта, поэтому сохраняется версия группы. Затем папка аккаунта перемещается в `.ccam-backup/<time>/` внутри папки аккаунта, а `os.Symlink` ставит на её место ссылку. Файлы разговоров называются по идентификатору сессии, поэтому истории из нескольких аккаунтов объединяются без конфликтов.

Перемещение использует `rename(2)`, а между файловыми системами переходит на копирование и удаление. Относительная ссылка внутри перемещаемого дерева, указывавшая за его пределы, переписывается в абсолютную (`fsutil.PortableLink`), чтобы она по-прежнему разрешалась с нового места. Реестры `plugins/` (`installed_plugins.json`, `known_marketplaces.json`) хранят абсолютные пути через папку аккаунта; ccam перенаправляет их на папку группы, а если в группе уже есть реестр, объединяет с ним записи аккаунта.

Отключение элемента возвращает ссылку обратно:

ccam удаляет ссылку, только если она указывает внутрь папки групп, а затем копирует текущее содержимое группы в аккаунт через `CopyTree`. С `--fresh` копирование пропускается, и аккаунт начинает с пустого места по этому пути. Группа сохраняет своё содержимое для остальных аккаунтов. Перенос элемента из одной группы в другую удаляет ссылку и создаёт ссылку на новую группу, оставляя старую группу как есть; план сообщает об этом в строке `Note:`.

Отдельный файл, который существует с обеих сторон с разным содержимым, считается конфликтом:

`share.NewConflict` перечисляет варианты, подходящие для файла. Для `history.jsonl` предлагаются `merge by line`, `keep group` и `use mine`, с объединением на первом месте. Для других файлов `.json` предлагаются `keep group`, `use mine` и `merge JSON`. Для всего остального предлагаются `keep group` и `use mine`. Первый вариант выбирается по умолчанию:

```console
history.jsonl differs from the group's copy.
  mine:  ~/.local/share/ccam/profiles/side/history.jsonl
  group: ~/.local/share/ccam/groups/default/history.jsonl
  1) merge by line
  2) keep group
  3) use mine
Choice [1]:
```

`merge JSON` (`MergeJSONBytes`) рекурсивно объединяет объекты, соединяет массивы без повторов и сохраняет значение группы, когда обе стороны задают одному ключу разные значения, поэтому остальные аккаунты не замечают изменений в поведении. `merge by line` сохраняет строки группы, а затем добавляет ваши строки, которых в ней нет. Каждый вариант, кроме `keep group`, сначала сохраняет копию группы в `.ccam-backup/<time>/group/` в папке аккаунта, а затем записывает результат через `fsutil.AtomicWrite`. Ваш собственный файл всегда попадает в резервную копию.

`--prefer group`, `mine` или `merge` решает каждый конфликт без вопросов; `merge` означает `merge JSON` или `merge by line`, в зависимости от того, что предлагается для файла, а файл, для которого нет ни того, ни другого, получает вариант по умолчанию. `--yes` без других параметров берёт вариант по умолчанию для каждого файла.

При каждом запуске `share.Check` сравнивает каждый путь структуры с настройкой, используя только `lstat` и `readlink`, поэтому проверка достаточно дешёвая для пути запуска. Отсутствующая ссылка создаётся на месте, потому что терять нечего. Настоящий файл там, где должна быть ссылка, ссылка не туда или устаревшая ссылка останавливают запуск:

```console
ccam: stopped because of share link problems:
  ~/.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
```

`ccam doctor --fix` выполняет `share.Build` с сохранёнными настройками с обеих сторон: он выводит каждый шаг из того, что находится на диске, при конфликтах сохраняет содержимое группы и создаёт резервную копию всего, что заменяет.

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

- **Запущенные аккаунты.** ccam отказывается менять общий доступ, пока Claude Code работает от имени аккаунта (`account work is running; quit it first, then change its sharing`), потому что сессия продолжает записывать в перемещаемые файлы, и строки, добавленные за это время, были бы потеряны. `--dry-run` всё равно выводит план.
- **Резервные копии.** Каждый план получает собственную папку `.ccam-backup/<time>/` в папке аккаунта, с числовым суффиксом, если два плана начинаются в одну и ту же секунду. ccam никогда их не удаляет.
- **Частичные сбои.** Если шаг не удался, ccam выводит ошибку и место, где лежат оригиналы, и предлагает завершить работу командой `ccam doctor --fix`. Цель уже сохранена, поэтому исправление продолжает движение к ней.
- **Ваши собственные ссылки.** Если путь уже является созданной вами ссылкой, например на репозиторий dotfiles, а группа пуста, ccam копирует цель ссылки в группу, а саму ссылку перемещает в резервную копию. Цель не затрагивается.
- **Файлы входа.** `.credentials.json` и `.claude.json` никогда не связываются, не перемещаются и не копируются в группу.
- **Два аккаунта в одной папке.** Аккаунты, которые делят историю, записывают одни и те же файлы. Когда второй аккаунт той же группы истории запускается в папке, где уже работает первый, ccam предупреждает и спрашивает, прежде чем продолжить.

## См. также

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