Возможности
Копирование существующей настройки
Эта страница переведена с английского машинным способом. Исправления приветствуются. Редактировать эту страницу на GitHub
Если вы пользовались Claude Code до ccam, ваша настройка находится в ~/.claude и ~/.claude.json. ccam migrate копирует её в группу общего доступа, поэтому каждый аккаунт, который делит эти элементы через группу, начинает с уже имеющейся у вас настройки. Исходная папка только читается, а обычный claude работает как прежде. Выполните команду один раз после первого ccam add и снова каждый раз, когда аккаунт начинает делить MCP-серверы.
Использование
ccam migrate # ~/.claude into group default, checklist on a terminal
ccam --dry-run migrate # show the plan, copy nothing
ccam migrate --settings --mcp # only these items, no checklist
ccam migrate --history --yes # conversation history only, no questions
ccam migrate ~/.claude-work --group workВ терминале, без флагов элементов и без --yes, ccam сначала показывает список с флажками:
Copy into group default
From /home/me/.claude
? Choose what to copy (Space to toggle)
› [x] MCP servers
[x] settings.json
[x] global CLAUDE.md
[x] agents, commands, skills
[ ] conversation history
Enter show the plan · Esc cancelПробел (или x) переключает элемент под курсором, клавиши со стрелками или j/k перемещают курсор, Enter показывает план, а Esc, q или Ctrl+C выводят Cancelled.. Элементы, для которых в источнике ничего нет, помечены как not found. Если снять все флажки, ccam выводит Nothing selected. и завершается.
Затем ccam выводит план и спрашивает подтверждение перед копированием:
$ ccam migrate --yes
Copy from /home/me/.claude into group default (/home/me/.local/share/ccam/groups/default):
mcp ~/.claude.json new: fs, linear
sign-ins linear → personal; skipped: work (not logged in yet)
settings settings.json new: 61 B
memory CLAUDE.md new: 11 B
extensions agents/ add 1 file the group lacks (6 B)
skills/ add 1 file the group lacks (13 B)
not found, skipped: commands/, plugins/, output-styles/, rules/
Conversation history (projects/, history.jsonl) is not included; add --history to copy it.
✓ Copied into group default: 2 MCP servers, settings.json, CLAUDE.md, agents/, skills/, MCP sign-ins for personal
MCP sign-ins were not copied to: work (not logged in yet). Sign in to those servers there with /mcp.
Accounts that share these through group default:
mcp personal, work
settings personal, work
memory personal, work
extensions personal, workГруппа доходит только до тех аккаунтов, которые делят через неё элемент, поэтому итог перечисляет их для каждого элемента. Для аккаунтов, которые этого не делают, ccam выводит команды ccam share <name> --<item> on, включающие общий доступ.
Параметры
| Параметр | Действие | По умолчанию |
|---|---|---|
[folder] |
Папка Claude Code, из которой копировать | ~/.claude |
--settings |
Копировать settings.json |
выкл. |
--memory |
Копировать глобальный CLAUDE.md |
выкл. |
--extensions |
Копировать agents/, commands/, skills/, plugins/, output-styles/, rules/ |
выкл. |
--mcp |
Копировать пользовательские MCP-серверы (mcpServers в .claude.json) |
выкл. |
--history |
Копировать историю разговоров (projects/, history.jsonl) |
выкл. |
-g, --group string |
Группа общего доступа, в которую копировать | default |
-y, --yes |
Копировать без вопросов; при конфликте сохраняется копия группы | выкл. |
--dry-run (глобальный) |
Вывести план и остановиться до любых вопросов и копирования | выкл. |
Без флагов элементов в терминале выбор делается в списке с флажками. Вне терминала или с --yes ccam копирует всё, кроме истории разговоров. История по умолчанию не включается, потому что projects/ может быть большой.
--group on означает default. --group off и --group local отклоняются с сообщением --group takes a group name, not "off". ccam migrate учитывает --dry-run, и список с флажками появляется и в пробном запуске, чтобы можно было заранее посмотреть результат выбора.
Как это работает
internal/cli/migrate.go выбирает элементы, затем migrate.Build читает источник и группу и возвращает план. Ничего не записывается до Plan.Apply, то есть до вашего подтверждения.
- Поиск источника.
checkSourceотклоняет путь, который отсутствует, не является папкой или не содержит ни одной известной записи Claude Code.migrate.ClaudeJSONнаходит.claude.json, относящийся к папке: внутри неё или, для~/.claudeбез собственного файла внутри,~/.claude.jsonрядом с ней. Именно там его хранит Claude Code, когдаCLAUDE_CONFIG_DIRне задана. - Сопоставление элементов с путями. Каждый путь берётся из
share.Layout, того же списка разрешённых путей, что используетccam share. MCP-серверы читаются из.claude.jsonчерезmcp.LocalServers, который использует сканерprofile.TopLevelValue, а не разбирает весь файл. - Копирование, а не перемещение. Файлы попадают в
~/.local/share/ccam/groups/<group>/черезfsutil.AtomicWriteилиfsutil.CopyFile; MCP-серверы попадают вmcp.jsonгруппы.
Каждый элемент сопоставляет один исходный путь одному пути в группе:
Две строки истории показаны пунктиром, потому что они копируются только с --history. .credentials.json и .claude.json перечислены в share.Never и никогда не попадают в группу: Build возвращает внутреннюю ошибку, если один из них вдруг окажется в структуре, а обход папки пропускает их по имени.
buildEntry назначает каждому пути состояние, которое и описывает каждая строка плана:
- Missing: нет в источнике или на месте ожидаемой папки находится файл. Указывается один раз для элемента как
not found, skipped. - Linked: исходный путь уже указывает на копию группы, например когда источником является папка профиля ccam.
- Same: в группе уже есть идентичное содержимое.
- New: в группе этого нет, поэтому копируется целиком.
- Merge: папка есть с обеих сторон.
copyMissingдобавляет только файлы, которых нет в группе; отличающиеся файлы остаются в версии группы, и план сообщаетgroup copies kept. Дляplugins/реестрыinstalled_plugins.jsonиknown_marketplaces.jsonобъединяются, а абсолютные пути плагинов переписываются так, чтобы указывать на папку группы. - Conflict: файл есть с обеих сторон, но с разным содержимым. Вы выбираете для каждого файла:
keep group,use mine, а такжеmerge JSONдля файлов.json(глубокое объединение, при котором в спорных значениях побеждает группа) илиmerge by lineдляhistory.jsonl. MCP-сервер с отличающимся определением тоже считается конфликтом, с вариантамиkeep groupилиuse mine. Первый вариант в списке выбирается по умолчанию при нажатии Enter;--yesвсегда сохраняет копию группы.
Сам список с флажками реализован в tui.MigratePicker на основе компонента checklist, который использует ccam add; migrate.Found помечает отсутствующие элементы с помощью вызовов lstat и списка MCP-серверов.
Входы MCP
MCP-серверы, которые входят через OAuth, хранят свои токены в файле входа, .credentials.json в разделе mcpOAuth, а не в списке серверов. Claude Code использует в качестве ключа каждой записи <name>| плюс первые 16 символов хэша sha256 от полей сервера type, url и headers. Ключ не зависит от папки, поэтому скопированная запись работает в другом аккаунте, если определение сервера идентично. Поэтому buildLogins в internal/migrate/logins.go копирует только записи серверов, которые в итоге оказываются в группе в определении из источника: новых, уже совпадающих или конфликтных, для которых вы выбрали use mine. Входы серверов плагинов (ключи, начинающиеся с plugin:) копируются, когда вы копируете расширения и в источнике есть plugins/.
Записи попадают в собственный .credentials.json каждого получающего аккаунта, записываемый через fsutil.AtomicWrite с правами 0600. В группу они никогда не попадают. Аккаунт получает их, только если делит mcp (или, для серверов плагинов, extensions) через целевую группу, и добавляются только ключи, которых у него нет: уже имеющиеся записи, возможно более новые, сохраняются. Строка плана sign-ins перечисляет серверы, получающие аккаунты и пропущенные аккаунты. ccam пропускает аккаунт и называет его с причиной, если аккаунт:
- зарегистрирован на месте через
ccam import, поскольку обычныйclaudeможет использовать его файл входа; - запущен, поскольку Claude Code перезаписывает его файл входа (проверяется ещё раз непосредственно перед записью, сообщается как
started meanwhile); - ещё не вошёл;
- хранит вход в Связке ключей macOS, в которую ccam не записывает.
В пропущенном аккаунте войдите в серверы через /mcp. Аккаунт, который начнёт делить MCP-серверы позже, получит входы, когда вы снова выполните ccam migrate; итог сообщает об этом строкой Then run `ccam migrate` again to give them the MCP sign-ins too.
Безопасность и особые случаи
- Источник только читается. Ни один файл в нём не перемещается, не связывается и не изменяется, а вход источника никогда не записывается, в том числе в macOS, где он может читаться из Связки ключей.
- Перед заменой файла группы, через
use mine, объединение или новые MCP-серверы в существующемmcp.json, копия группы сохраняется в<group>/.ccam-backup/<time>/. Имя папки уникально для каждого запуска, поэтому два запуска в одну и ту же секунду не перезаписывают резервные копии друг друга. Итог выводит путь. - С
--yesпри каждом конфликте сохраняется копия группы, и ccam подсказывает, как выбрать иначе: выполнить ту же команду без--yes. - Если ничего не изменилось бы, ccam выводит
Nothing to copy.; если при каждом конфликте сохраняется копия группы, выводитсяNothing to copy: the group keeps its own copies. - Если копирование прервалось на середине, ccam останавливается с сообщением
The source folder was not changed. Group files replaced so far are saved inи путём к папке резервной копии. - Отсутствующий источник завершается сообщением
no Claude Code folder at <path>. Give the folder to copy from: ccam migrate <folder>.