# Eine vorhandene Einrichtung kopieren

> Mit ccam migrate die Einstellungen, CLAUDE.md, Erweiterungen, MCP-Server und MCP-Anmeldungen eines vorhandenen ~/.claude in eine ccam-Gruppe kopieren.

Source: https://ccam.dev/de/features/migrate/ · Updated 2026-10-19

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

```sh
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:

```console
 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:

```console
$ 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>`.

## Verwandte Themen

- [MCP-Server, Einstellungen und Verlauf teilen](https://ccam.dev/de/docs/sharing.md)
- [Prüfen und reparieren](https://ccam.dev/de/features/doctor.md)
- [Mehrere Claude Code-Konten](https://ccam.dev/de/guides/multiple-claude-code-accounts.md)
- [CLAUDE_CONFIG_DIR](https://ccam.dev/de/guides/claude-config-dir.md)
