v0.2.0 to v0.3.0

86 added, 182 removed. Audit A to A.

---
name: agent-config-sync
- version: 0.2.0
+ version: 0.3.0
type: protocol
- author: Lukas Geiger + Claude
+ author: Lukas Geiger + Claude + Codex
created: 2026-06-20
- updated: 2026-06-20
+ updated: 2026-07-27
description: >
- Synchronisiert MCP-Server UND Skills uebergreifend ueber ALLE bekannten Agent-Apps und CLIs
- (Claude Code, Claude Desktop, Codex CLI, Antigravity/Gemini, Kimi Code, Cursor, Cline,
- Windsurf, GitHub Copilot, ...) auf einem oder mehreren Systemen. Aktiviert sich, wenn ein
- MCP-Server oder Skill in mehreren Agent-Tools verfuegbar gemacht werden soll, der User fragt
- "sync mcp/skills ueber alle agents", "warum hat Tool X den Server/Skill nicht", "MCP/Skills
- ueberall verteilen", "config-sync zwischen agents", oder ein neues Agent-Tool an den
- gemeinsamen Stand angeschlossen werden soll. Liest eine Registry (welche Tools syncen wie),
- eine Config (Anbieter-Standardspezifikationen: wo + welches Format) und einen Lauf-Cache
- (aufgeloeste reale Pfade), wendet Sync-Regeln an (pull vs. verteilen) und verifiziert.
- Enthaelt einen Lernmechanismus: unbekannte/veraltete Config-Orte werden per Systemsuche,
- WebSearch und Context7 nachgeschlagen und in der Config aktualisiert. Loest den aelteren,
- auf Claude Code <-> Claude Desktop beschraenkten Skill mcp-config-sync ab (umschliesst ihn
- als Spezialfall). Claude-MCP-Profile werden via ellmos-controlcenter-mcp-Backend verwaltet
- (resolve_profile / switch_profile), nicht durch eigene Logik.
-
+ Anbieterneutraler Sync-Planer für MCP-Konfigurationen, Skills und Regeldateien
+ über Agent-Anbieter und App-Klassen. Er inventarisiert live erkennbare
+ Möglichkeiten, bietet Auswahlachsen an und lässt den User Quelle der Wahrheit,
+ Ziele, Richtung und Konfliktstrategie bestimmen. Truth kann eine Endpoint-
+ Konfiguration, eine Datei oder eine geordnete Menge mehrerer Dateien sein.
standalone: true
anthropic_compatible: true
bach_compatible: true
bach_origin: false
-
category: infrastructure
- tags: [mcp, skills, sync, multi-agent, claude-code, claude-desktop, codex, gemini, antigravity, kimi, cursor, cline, windsurf, copilot, config, registry, windows, macos, controlcenter]
+ tags: [mcp, skills, rules, sync, provider-neutral, discovery, multi-agent]
language: de
status: active
-
aliases: [mcp-skill-sync, multi-agent-sync, tool-config-sync, agent-sync]
-
dependencies:
tools: [python]
- services: [ellmos-controlcenter-mcp]
+ services: []
protocols: []
python: []
-
provenance:
origin: "custom"
origin_path: "skills/infrastructure/agent-config-sync/"
- origin_version: "0.2.0"
+ origin_version: "0.3.0"
last_sync_from_origin: null
last_sync_to_origin: null
local_changes_since_sync: false
---
<img src="banner.png" width="100%" alt="agent-config-sync banner">
# Agent Config Sync
- Ein **uebergreifendes Sync-Protokoll** fuer MCP-Server **und** Skills ueber alle bekannten
- Agent-Apps und CLIs. Statt fuer jedes App-Paar ein eigenes Skript zu pflegen, beschreibt
- dieser Skill *deklarativ*, **welche** Tools auf einem System leben, **was** sie teilen sollen
- (MCP / Skills / beides) und **wie** (pull, push, bidirektional/verteilen). Ein generischer
- Ablauf liest diese Deklaration und fuehrt den Sync aus.
-
- **Claude-MCP-Profile-Backend:** Fuer `claude-code` und `claude-desktop` wird
- **`ellmos-controlcenter-mcp`** als Backend genutzt (MCP-Tool `resolve_profile`/`switch_profile`).
- `sync.py` enthaelt keine eigene Claude-Profil-Logik; der Agent ruft die ControlCenter-MCP-Tools
- zur Laufzeit auf. Direkt lesbare JSON-Profildateien (z.B. `shared.json`) werden weiterhin
- direkt gelesen.
-
- **Loest `mcp-config-sync` ab:** Der aeltere Skill `mcp-config-sync` ist als
- Registry-Beziehung `claude-pair` (pull, scope mcp) in diesem Skill umschlossen.
- Sobald `agent-config-sync` produktiv eingesetzt wird, sollte `mcp-config-sync` auf
- `status: deprecated` gesetzt werden.
-
- ## Verhaeltnis zu bestehenden Skills (keine Duplikation)
+ Der Skill trennt drei Entscheidungen:
- | Skill | Zustaendigkeit | Verhaeltnis |
- |---|---|---|
- | **agent-config-sync** (dieser) | Sync von **MCP-Servern + Skills** ueber **alle** Agent-Tools, regelbasiert | Achse 1 (Inter-Agent) + Inter-IDE-Verteilung |
- | `mcp-config-sync` | nur MCP, nur Claude Code <-> Claude Desktop, 1 Skript | **Spezialfall**, der hier umschlossen wird (siehe `references/legacy-mcp-config-sync.md`); bleibt vorerst als Legacy bestehen |
- | `agents-bridge` | leitet fremde Agents per Redirect-Datei auf die EINE Regel-Quelle `CLAUDE.md` | **Regel**-Sync (Wissen/Workflows), NICHT Tool-Config. Komplementaer. |
- | `system-onboarding` | Erstaufsetzen eines neuen Systems (Reihenfolge der Installation) | liefert die Config-Ort-Tabellen, auf denen dieser Skill aufbaut |
+ 1. **Endpoints:** Welche installierten Agenten, CLIs, IDEs oder Desktop-Apps?
+ 2. **Ressourcen:** MCP, Skills, Regeln oder eine explizite Teilmenge?
+ 3. **Truth:** Welche Quelle(n), Richtung und Konfliktregel?
- **Was dieser Skill NICHT ist:** kein Regel-/CLAUDE.md-Sync (das macht `agents-bridge`), kein
- System-Erstsetup (das macht `system-onboarding`), kein Plugin-/Extension-Marktplatz-Abgleich
- (die Toolkits sind komplementaer, siehe `mcp-config-sync/references/plugin-extension-parity.md`).
+ Keine dieser Entscheidungen wird aus dem Anbieter des aufrufenden Agenten
+ abgeleitet.
- ## Die drei Datenebenen
+ ## Ablauf
- Der Skill trennt bewusst **Was-soll-passieren** von **Wie-sehen-die-Anbieter-aus** von
- **Wo-liegt-es-real**:
+ ### 1. System inventarisieren
- ```
- REGISTRY (lokal/privat) was syncen welche Tools wie? (Beziehungen, Modus, Scope)
- | liest
- v
- CONFIG (publizierbar) Anbieter-Standardspezifikationen: pro Tool wo + Format
- | loest Pfade auf nach
- v
- CACHE (lokal/privat) aufgeloeste reale Verzeichnisse/Dateien (Lauf-Cache)
+ ```bash
+ python scripts/sync.py --discover
+ python scripts/sync.py --offer
```
- | Datei | Inhalt | Privacy |
- |---|---|---|
- | `REGISTRY.md` + `registry.example.json` | welche Tools vorhanden, Sync-Paare/-Gruppen, Modus, Scope | Template publizierbar; **reale `registry.json` lokal/gitignored** |
- | `CONFIG.md` + `config.json` | je Anbieter: Config-Ort (Platzhalter `<HOME>`), Format, Merge-Key, Eigenheiten, Quellen-Stand | publizierbar (neutral) |
- | `CACHE.md` + `cache.json` | aufgeloeste reale Pfade auf DIESEM System | **lokal/gitignored** |
-
- ## Ablauf (Protokoll)
+ `--discover` prüft bekannte CLI-Kommandos und konfigurierte Oberflächen.
+ „Bekannt“ bedeutet nur im Katalog geführt; „erkannt“ benötigt lokale Evidenz.
+ `--offer` bildet daraus:
- ### 0. Lock + Vorsicht
- - Bei aktiver `LOCK*.txt` im Zielbereich: nichts schreiben (LOCK-System beachten).
- - Default ist **read-only**: `--status`/`--plan` veraendern nichts. `--apply` nur mit
- `--yes` und nach Anzeige des Plans.
+ - Anbieterachse: ein Anbieter über mehrere App-Klassen,
+ - App-Klassenachse: eine Klasse über mehrere Anbieter,
+ - Gesamtachse: alle erkannten Endpoints.
- ### 1. Registry lesen
- - `registry.json` (Fallback: `registry.example.json`) laden.
- - Liefert: vorhandene Tools auf diesem `host`, die Sync-Beziehungen (Paare/Gruppen),
- je Beziehung Modus (`pull` | `push` | `bidirectional`) und Scope (`mcp` | `skills` | `both`).
+ ### 2. User-Auswahl erfassen
- ### 2. Config lesen (Anbieter-Specs)
- - `config.json` laden: je Anbieter Config-Ort (mit `<HOME>`-Platzhalter), Format
- (`json` | `toml` | `dir`), `mcp_key` (z.B. `mcpServers`), `skills_dir`, Eigenheiten.
+ Der User darf konkrete Namen oder eine Achse nennen. Danach explizit festhalten:
- ### 3. Cache aufloesen
- - Platzhalter (`<HOME>`, `<APPDATA>`, ...) gegen das reale System aufloesen → `cache.json`.
- - Pruefen, ob die Datei/der Ordner existiert. **Fehlt sie → Lernmechanismus (Schritt 6).**
+ - Mitglieder/Ziele,
+ - Ressourcen (`mcp`, `skills`, `rules`),
+ - Modus (`push`, `pull`, `bidirectional`),
+ - Truth-Quelle(n),
+ - Konfliktstrategie.
- ### 4. Plan bilden (pull vs. verteilen)
- - Pro Beziehung den **Quellzustand** lesen und mit dem **Zielzustand** vergleichen.
- - **pull**: ein designierter Master/Hub wird gelesen, Ziele bekommen dessen Stand.
- - **push/verteilen**: ein Quell-Tool verteilt an mehrere Ziele.
- - **bidirectional**: Vereinigung; bei Konflikt (gleicher Key, anderer Wert) → eskalieren,
- nicht raten.
- - Fuer **mcp**: nur den `mcp_key`-Block ersetzen, restliche Config-Felder erhalten;
- Format-Konvertierung JSON↔TOML, wo noetig (Codex = TOML).
- - Fuer **skills**: Verzeichnis-Abgleich (`skills_dir`); App-spezifische Eigenheiten
- beachten (z.B. Claude Desktop liest `~/.claude/skills/` NICHT direkt → Bridge-Skill,
- siehe `mcp-config-sync/references/skills-sync-options.md`).
- - Ausgabe: menschenlesbarer **Plan** (welche Datei, welche Keys, add/update/remove).
+ Ohne gewählte Truth-Quelle bleibt der Plan blockiert.
- ### 5. Anwenden + Verifizieren (nur `--apply --yes`)
- - Vor jedem Schreiben **Backup mit Zeitstempel**.
- - Schreiben (Format-erhaltend, nur Ziel-Block).
- - **Verifikation:** Ziel erneut lesen, Soll/Ist vergleichen; Diff ausgeben.
- - Hinweis: Apps ggf. neu starten (Claude Desktop komplett beenden), damit Aenderungen greifen.
+ ### 3. Truth modellieren
- ### 6. Lernmechanismus (Selbstheilung der Config)
- Wird ausgeloest, wenn ein Config-Ort fehlt, ein Anbieter unbekannt ist oder ein Format
- nicht passt:
+ Eine Truth kann sein:
- 1. **Config-Ort veraltet/nicht gefunden** → **Systemsuche** nach den bekannten Dateinamen:
- - MCP-Server-Suche: ellmos-FileCommander (`fc_search_files`/`fc_search`) oder `Glob`
- ueber die Home-/AppData-Wurzeln nach `*config*.json`, `config.toml`,
- `claude_desktop_config.json`, `settings.json`, `mcp.json`.
- - Gefundenen realen Pfad in `cache.json` eintragen; wenn er dauerhaft vom Config-Standard
- abweicht, `config.json` (mit Stand-Hinweis) aktualisieren.
- 2. **Unbekannter Anbieter** (Tool, das in `config.json` fehlt) → **WebSearch** nach
- "<tool> MCP config file location" / "<tool> custom rules file", Ergebnis verifizieren,
- neuen Anbieter-Eintrag in `config.json` anlegen (mit `sources`-Feld + Datum).
- 3. **Format-/Schema-Unsicherheit** → aktuelle Spezifikation per **WebSearch** UND
- **Context7** (`resolve-library-id` → `query-docs`, z.B. "Model Context Protocol",
- "claude code mcp config", "codex config.toml") nachschlagen; `config.json` korrigieren.
+ - ein Endpoint, etwa eine existierende MCP-Konfiguration,
+ - eine frei gewählte Datei,
+ - mehrere geordnete Dateien, etwa globale `AGENTS.md` plus Projektregeln,
+ - ein Verzeichnis für Skills.
- > Jede automatische Config-Aenderung dokumentiert sich selbst: Feld `sources` + `updated`
- > im betroffenen Anbieter-Eintrag setzen.
+ Mehrere Regeldateien brauchen eine explizite Strategie:
+ `ordered-overlay`, `generated-loader`, `copy` oder `redirect`. Konflikte werden
+ nicht geraten. `CLAUDE.md`, `AGENTS.md`, `GPT.md` oder andere Namen sind
+ gleichberechtigte mögliche Quellen; keine davon ist global voreingestellt.
- ## Aufruf
+ ### 4. Plan, Apply, Verifikation
```bash
- # Status: Pfade aufloesen, Existenz pruefen, cache.json aktualisieren (read-only fuer Agent-Configs)
- PYTHONIOENCODING=utf-8 python scripts/sync.py --status
-
- # Plan: was wuerde ein Sync tun? (read-only, kein Schreiben)
- PYTHONIOENCODING=utf-8 python scripts/sync.py --plan
-
- # Anwenden: block-replace pro Relation, Backup + Verifikation (bestaetigung erforderlich)
- PYTHONIOENCODING=utf-8 python scripts/sync.py --apply --yes
-
- # Tests ausfuehren (nutzen nur Fixtures -- keine echten Configs)
- PYTHONIOENCODING=utf-8 python -m pytest skills/infrastructure/agent-config-sync/tests/ -v
+ python scripts/sync.py --status
+ python scripts/sync.py --plan
+ python scripts/sync.py --apply --yes
```
- ### ControlCenter-Backend (Claude-Provider)
+ `--apply` unterstützt derzeit MCP-Block-Transfers und Skill-Verzeichnisse.
+ Regeldatei-Topologien werden geplant, aber nur über einen vom User gewählten
+ Adapter umgesetzt; dadurch wird keine mehrteilige Truth versehentlich
+ plattkopiert.
- Fuer `claude-code`- und `claude-desktop`-Targets wird kein direkter Config-Write gemacht.
- Stattdessen den **`ellmos-controlcenter-mcp`**-Server nutzen:
+ ## Registry
- ```
- resolve_profile() -- aktives Profil und Serverinhalt lesen
- switch_profile() -- Profil wechseln / MCP-Config-Datei neu erzeugen
+ Die publizierte `registry.example.json` enthält keine aktive Relation und keinen
+ Hub. Eine lokale, gitignorierte `registry.json` hält nur die User-Entscheidung.
+ Selektoren dürfen Provider und App-Klassen kombinieren:
+
+ ```json
+ {
+ "name": "selected-cli-sync",
+ "selection": {
+ "providers": ["openai", "anthropic"],
+ "app_classes": ["cli"]
+ },
+ "mode": "push",
+ "source": "codex-cli",
+ "scope": "mcp"
+ }
```
- Der `--plan`-Output zeigt explizit, welche ControlCenter-Aktion noetig ist.
+ Siehe `REGISTRY.md` für Datei-Truth und Mehrfachquellen.
- ## Privacy / Konventionen
+ ## Abgrenzung
- - **Publizierbar (neutral):** `SKILL.md`, `CONFIG.md`, `config.json`, `REGISTRY.md`,
- `registry.example.json`, `CACHE.md`, `cache.example.json`, `scripts/`. Nur Platzhalter
- (`<HOME>`, `~`, `<HOST>`, `<USER>`), KEINE echten Personen-Pfade/Hostnames.
- - **Lokal/privat (gitignored):** `registry.json`, `cache.json` (die mit echten Pfaden
- gefuellten Instanzen fuer DIESES System). Muster in der `.SKILLS/.gitignore` ergaenzt.
- - **Quelle = `skills/...`.** NICHT nach `~/.claude/skills/` deployen — das entscheidet der
- User spaeter via `skill_sync.py`. Nicht committen/pushen ohne Freigabe.
+ - `mcp-config-sync` ist der MCP-spezifische Einstieg in diesen Skill.
+ - `agents-bridge` erzeugt Bootstrap-/Redirect-Regeln für fremde Agenten.
+ - `ellmos-agent-bridge` routet und koordiniert Partner zur Laufzeit.
+ - ControlCenter kann ein Adapter sein, ist aber keine notwendige zentrale Truth.
- ## Aufbau dieses Skills
+ ## Sicherheit
- ```
- agent-config-sync/
- ├── SKILL.md (diese Datei — das Protokoll, DE)
- ├── SKILL.en.md (englische Version)
- ├── REGISTRY.md Doku: was syncen welche Tools wie
- ├── registry.example.json Template (publizierbar)
- ├── registry.json reale Instanz fuer dieses System (LOKAL, gitignored)
- ├── CONFIG.md Doku: Anbieter-Standardspezifikationen
- ├── config.json je Anbieter: Ort + Format + Eigenheiten (publizierbar)
- ├── CACHE.md Doku: Lauf-Cache aufgeloester Pfade
- ├── cache.example.json Template (publizierbar)
- ├── cache.json aufgeloeste reale Pfade (LOKAL, gitignored)
- ├── scripts/
- │ └── sync.py Funktionale Implementierung (--status/--plan/--apply)
- ├── tests/
- │ └── test_sync.py Pytest-Tests (nur Fixtures, keine echten Config-Writes)
- └── references/
- └── legacy-mcp-config-sync.md wie der alte MCP-Skill hier aufgeht
- ```
+ - Discovery, Offer und Plan sind read-only für Agent-Konfigurationen.
+ - `--apply` braucht `--yes`, Backups und Re-Read-Verifikation.
+ - Unverifizierte Formate und Pfade bleiben gesperrt.
+ - Lokale Registry/Cache-Dateien bleiben privat und gitignored.
## Changelog
- ### 0.2.0 (2026-06-20)
- - `--apply` implementiert: format-erhaltendes JSON-block-replace, TOML-Abschnitt-replace
- (Codex), Backup + Verifikation je Schritt, Skills-Verzeichnis-Abgleich.
- - Test-Suite (`tests/test_sync.py`, 15 Tests, nur Fixtures -- keine echten Config-Writes).
- - ControlCenter-Backend-Anbindung: Claude-Provider-Writes delegieren an
- `ellmos-controlcenter-mcp` (resolve_profile/switch_profile); keine eigene Profil-Logik.
- - Test-Isolation via `--root`-Flag und `AGENT_CONFIG_SYNC_TEST_ROOT`-Env-Guard.
- - Nutzerneutral: Platzhalter in SKILL.md/CONFIG/Templates; `registry.json`/`cache.json` gitignored.
- - Versionierungs-Konformitaet: `last_sync_from_origin: null` (originaerer custom-Skill),
- `status: active`, in `registry/components.json` aufgenommen.
- - Supersede-Relation zu `mcp-config-sync` in `references/legacy-mcp-config-sync.md` und
- SKILL.md-Kopftext modelliert.
- - i18n: SKILL.md (DE, primaer) + SKILL.en.md (EN, vollstaendig).
+ ### 0.3.0 (2026-07-27)
- ### 0.1.0 (2026-06-20)
- - Initiales Scaffold: Protokoll-SKILL.md, Registry/Config/Cache-Modell (Template + Doku),
- Lernmechanismus (Systemsuche/WebSearch/Context7), `scripts/sync.py`-Stub
- (`--status`/`--plan`). Umschliesst `mcp-config-sync` als Spezialfall.
+ - Anbieter- und App-Klassenachsen sowie lokale Discovery/Offers.
+ - Kein voreingestellter Claude-Hub.
+ - Frei wählbare einzelne oder mehrere Truth-Dateien.
+ - Regeldateien als eigener Scope; Apply bleibt bis zur Adapterwahl fail-closed.