Funktionen
Eine vorhandene Einrichtung kopieren
Diese Seite wurde maschinell aus dem Englischen übersetzt. Korrekturen sind willkommen. Diese Seite auf GitHub bearbeiten
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 workIn 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 cancelDie 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, workEine 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.
- Die Quelle finden.
checkSourcelehnt einen Pfad ab, der fehlt, kein Ordner ist oder keinen bekannten Claude Code-Eintrag enthält.migrate.ClaudeJSONfindet die.claude.json, die zum Ordner gehört: darin, oder bei einem~/.claudeohne eigene Datei die~/.claude.jsondaneben. Dort speichert Claude Code sie, wennCLAUDE_CONFIG_DIRnicht gesetzt ist. - Elemente Pfaden zuordnen. Jeder Pfad stammt aus
share.Layout, derselben Positivliste, dieccam shareverwendet. Die MCP-Server werden mitmcp.LocalServersaus.claude.jsongelesen, das den Scannerprofile.TopLevelValueverwendet, statt die ganze Datei zu parsen. - Kopieren, nie verschieben. Dateien gehen mit
fsutil.AtomicWriteoderfsutil.CopyFilenach~/.local/share/ccam/groups/<group>/; MCP-Server gehen in diemcp.jsonder 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, skippedaufgefü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.
copyMissingfügt nur die Dateien hinzu, die der Gruppe fehlen; abweichende Dateien bleiben so, wie die Gruppe sie hat, und der Plan meldetgroup copies kept. Beiplugins/werden die Registerinstalled_plugins.jsonundknown_marketplaces.jsonzusammengefü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, dazumerge JSONbei.json-Dateien (eine tiefe Zusammenführung, bei der die Gruppe bei widersprüchlichen Werten gewinnt) odermerge by linebeihistory.jsonl. Ein MCP-Server mit abweichender Definition ist ebenfalls ein Konflikt, mitkeep groupoderuse mine. Die erste aufgeführte Wahl ist der Standard, wenn du Enter drückst;--yesbehä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 importan Ort und Stelle registriert ist, da einfachesclaudeseine 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 meanwhilegemeldet); - 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 vorhandenenmcp.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
--yesbehält jeder Konflikt die Kopie der Gruppe, und ccam sagt, wie du stattdessen wählen kannst: Führe denselben Befehl ohne--yesaus. - 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 inan, gefolgt vom Sicherungsordner. - Eine fehlende Quelle endet mit
no Claude Code folder at <path>. Give the folder to copy from: ccam migrate <folder>.