Можливості

Копіювання наявного налаштування

Останнє оновлення 19 жовтня 2026 р.
Перевірено з ccam 0.6.0 і Claude Code 2.1.302

Цю сторінку перекладено з англійської машинним способом. Виправлення вітаються. Редагувати цю сторінку на 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

Space (або 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, тобто доки ви не підтвердите.

  1. Пошук джерела. checkSource відхиляє шлях, який відсутній, не є текою або не містить жодного відомого запису Claude Code. migrate.ClaudeJSON знаходить .claude.json, що належить теці: усередині неї або, для ~/.claude без власного файлу всередині, ~/.claude.json поруч із нею. Саме там Claude Code зберігає його, коли CLAUDE_CONFIG_DIR не задано.
  2. Зіставлення елементів зі шляхами. Кожен шлях береться з share.Layout, того самого списку дозволених шляхів, який використовує ccam share. Сервери MCP зчитуються з .claude.json через mcp.LocalServers, який використовує сканер profile.TopLevelValue замість розбору всього файлу.
  3. Копіювати, ніколи не переміщувати. Файли потрапляють до ~/.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>.