Funktionen

Eine vorhandene Einrichtung kopieren

Zuletzt aktualisiert am 19. Oktober 2026
Geprüft mit ccam 0.6.0 und Claude Code 2.1.302

Diese Seite wurde maschinell aus dem Englischen übersetzt. Korrekturen sind willkommen. Diese Seite auf GitHub bearbeiten

Auf dieser Seite

Wenn du Claude Code schon vor ccam benutzt hast, liegt deine Einrichtung in ~/.claude und ~/.claude.json. ccam migrate kopiert sie in eine Gruppe, sodass jedes Konto, das diese Elemente über die Gruppe teilt, mit der Einrichtung startet, die du schon hast. Der Quellordner wird nur gelesen, und einfaches claude funktioniert weiter wie bisher. Führe es einmal nach deinem ersten ccam add aus und erneut, sobald ein Konto anfängt, MCP-Server zu teilen.

Verwendung

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

In einem Terminal, ohne Elementoptionen und ohne --yes, zeigt ccam zuerst eine Checkliste:

 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

Die Leertaste (oder x) schaltet das Element unter dem Cursor um, die Pfeiltasten oder j/k bewegen die Auswahl, Enter zeigt den Plan, und Esc, q oder Ctrl+C gibt Cancelled. aus. Elemente, für die die Quelle nichts enthält, sind mit not found markiert. Wenn du alles abwählst, gibt ccam Nothing selected. aus und hört auf.

Dann gibt ccam den Plan aus und fragt nach, bevor es kopiert:

$ 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

Eine Gruppe erreicht nur die Konten, die ein Element über sie teilen, daher listet die Zusammenfassung sie pro Element auf. Für Konten, die das nicht tun, gibt ccam die ccam share <name> --<item> on-Befehle aus, die das Teilen einschalten.

Optionen

Option Wirkung Standard
[folder] Der Claude Code-Ordner, aus dem kopiert wird ~/.claude
--settings settings.json kopieren aus
--memory Die globale CLAUDE.md kopieren aus
--extensions agents/, commands/, skills/, plugins/, output-styles/, rules/ kopieren aus
--mcp Benutzer-MCP-Server kopieren (mcpServers in .claude.json) aus
--history Den Gesprächsverlauf kopieren (projects/, history.jsonl) aus
-g, --group string Die Gruppe, in die kopiert wird default
-y, --yes Ohne Nachfrage kopieren; bei einem Konflikt bleibt die Kopie der Gruppe aus
--dry-run (global) Den Plan ausgeben und vor jeder Frage und jedem Kopieren anhalten aus

Ohne Elementoption entscheidet in einem Terminal die Checkliste. Außerhalb eines Terminals oder mit --yes kopiert ccam alles außer dem Gesprächsverlauf. Der Verlauf ist standardmäßig ausgenommen, weil projects/ groß sein kann.

--group on bedeutet default. --group off und --group local werden mit --group takes a group name, not "off" abgelehnt. ccam migrate beachtet --dry-run, und die Checkliste erscheint auch bei einem Probelauf, damit du dir eine Auswahl vorab ansehen kannst.

So funktioniert es

internal/cli/migrate.go wählt die Elemente aus, dann liest migrate.Build die Quelle und die Gruppe und gibt einen Plan zurück. Bis Plan.Apply wird nichts geschrieben, und das erst nach deiner Bestätigung.

  1. Die Quelle finden. checkSource lehnt einen Pfad ab, der fehlt, kein Ordner ist oder keinen bekannten Claude Code-Eintrag enthält. migrate.ClaudeJSON findet die .claude.json, die zum Ordner gehört: darin, oder bei einem ~/.claude ohne eigene Datei die ~/.claude.json daneben. Dort speichert Claude Code sie, wenn CLAUDE_CONFIG_DIR nicht gesetzt ist.
  2. Elemente Pfaden zuordnen. Jeder Pfad stammt aus share.Layout, derselben Positivliste, die ccam share verwendet. Die MCP-Server werden mit mcp.LocalServers aus .claude.json gelesen, das den Scanner profile.TopLevelValue verwendet, statt die ganze Datei zu parsen.
  3. Kopieren, nie verschieben. Dateien gehen mit fsutil.AtomicWrite oder fsutil.CopyFile nach ~/.local/share/ccam/groups/<group>/; MCP-Server gehen in die mcp.json der Gruppe.

Jedes Element ordnet einen Quellpfad einem Gruppenpfad zu:

Die beiden Verlaufszeilen sind gestrichelt, weil sie nur mit --history kopiert werden. .credentials.json und .claude.json stehen in share.Never und erreichen die Gruppe nie: Build gibt einen internen Fehler zurück, falls eine davon je in der Struktur auftaucht, und der Durchlauf durch den Ordner überspringt sie anhand des Namens.

buildEntry gibt jedem Pfad einen Zustand, und den beschreibt jede Zeile des Plans:

  • Fehlend: nicht in der Quelle, oder eine Datei, wo ein Ordner erwartet wird. Wird pro Element einmal als not found, skipped aufgeführt.
  • Verlinkt: Der Quellpfad führt bereits auf die Kopie der Gruppe, zum Beispiel wenn die Quelle ein ccam-Profilordner ist.
  • Gleich: Die Gruppe hat bereits identischen Inhalt.
  • Neu: Der Gruppe fehlt er, daher wird er vollständig kopiert.
  • Zusammenführen: ein Ordner auf beiden Seiten. copyMissing fügt nur die Dateien hinzu, die der Gruppe fehlen; abweichende Dateien bleiben so, wie die Gruppe sie hat, und der Plan meldet group copies kept. Bei plugins/ werden die Register installed_plugins.json und known_marketplaces.json zusammengeführt, und die absoluten Plugin-Pfade werden auf den Ordner der Gruppe umgeschrieben.
  • Konflikt: eine Datei auf beiden Seiten mit unterschiedlichem Inhalt. Du wählst pro Datei: keep group, use mine, dazu merge JSON bei .json-Dateien (eine tiefe Zusammenführung, bei der die Gruppe bei widersprüchlichen Werten gewinnt) oder merge by line bei history.jsonl. Ein MCP-Server mit abweichender Definition ist ebenfalls ein Konflikt, mit keep group oder use mine. Die erste aufgeführte Wahl ist der Standard, wenn du Enter drückst; --yes behält immer die Kopie der Gruppe.

Die Checkliste selbst ist tui.MigratePicker, gebaut auf der Komponente checklist, die auch ccam add verwendet; migrate.Found markiert fehlende Elemente anhand von lstat-Aufrufen und der Liste der MCP-Server.

MCP-Anmeldungen

MCP-Server, die sich per OAuth anmelden, speichern ihre Tokens in der Anmeldedatei, .credentials.json unter mcpOAuth, nicht in der Serverliste. Claude Code bildet den Schlüssel jedes Eintrags aus <name>| plus den ersten 16 Zeichen eines sha256-Hashes aus type, url und headers des Servers. Der Schlüssel hängt nicht vom Ordner ab, daher funktioniert ein kopierter Eintrag in einem anderen Konto, solange die Serverdefinition identisch ist. buildLogins in internal/migrate/logins.go kopiert deshalb nur die Einträge von Servern, die die Gruppe am Ende in der Definition der Quelle hat: neu, bereits gleich oder ein Konflikt, bei dem du use mine gewählt hast. Anmeldungen von Plugin-Servern (Schlüssel, die mit plugin: beginnen) werden mitkopiert, wenn du Erweiterungen kopierst und die Quelle plugins/ hat.

Die Einträge gehen in die eigene .credentials.json jedes empfangenden Kontos, geschrieben mit fsutil.AtomicWrite im Modus 0600. In die Gruppe gelangen sie nie. Ein Konto erhält sie nur, wenn es mcp (oder bei Plugin-Servern extensions) über die Zielgruppe teilt, und es werden nur die Schlüssel hinzugefügt, die ihm fehlen: Einträge, die es schon hat, vielleicht neuere, bleiben erhalten. Die Planzeile sign-ins listet die Server, die empfangenden Konten und die übersprungenen auf. ccam überspringt ein Konto und nennt es mit dem Grund, wenn es:

  • mit ccam import an Ort und Stelle registriert ist, da einfaches claude seine Anmeldedatei verwenden könnte;
  • gerade läuft, da Claude Code seine Anmeldedatei neu schreibt (wird direkt vor dem Schreiben erneut geprüft und als started meanwhile gemeldet);
  • noch nicht angemeldet ist;
  • seine Anmeldung im macOS-Schlüsselbund speichert, in den ccam nicht schreibt.

Melde dich in einem übersprungenen Konto mit /mcp bei den Servern an. Ein Konto, das MCP-Server erst später teilt, bekommt die Anmeldungen, wenn du ccam migrate erneut ausführst; die Zusammenfassung weist mit Then run `ccam migrate` again to give them the MCP sign-ins too. darauf hin.

Sicherheit und Sonderfälle

  • Die Quelle wird nur gelesen. Keine Datei darin wird verschoben, verlinkt oder geändert, und die Anmeldung der Quelle wird nie geschrieben, auch nicht unter macOS, wo sie womöglich aus dem Schlüsselbund gelesen wird.
  • Bevor eine Gruppendatei ersetzt wird, durch use mine, eine Zusammenführung oder neue MCP-Server in einer vorhandenen mcp.json, wird die Kopie der Gruppe in <group>/.ccam-backup/<time>/ gesichert. Der Ordnername ist pro Lauf eindeutig, sodass zwei Läufe in derselben Sekunde ihre Sicherungen nicht gegenseitig überschreiben. Die Zusammenfassung gibt den Pfad aus.
  • Mit --yes behält jeder Konflikt die Kopie der Gruppe, und ccam sagt, wie du stattdessen wählen kannst: Führe denselben Befehl ohne --yes aus.
  • Würde sich nichts ändern, gibt ccam Nothing to copy. aus; behält jeder Konflikt die Kopie der Gruppe, Nothing to copy: the group keeps its own copies.
  • Schlägt ein Kopiervorgang mittendrin fehl, hält ccam mit The source folder was not changed. Group files replaced so far are saved in an, gefolgt vom Sicherungsordner.
  • Eine fehlende Quelle endet mit no Claude Code folder at <path>. Give the folder to copy from: ccam migrate <folder>.