Paths: File paths (
shared/,references/) are relative to skills repo root. Locate this SKILL.md directory and go up one level for repo root.
Config Syncer
Type: L3 Worker Category: 0XX Shared
Synchronizes skills (via symlinks) and MCP/hook settings from Claude Code (source of truth) to Gemini CLI and Codex CLI. Converts formats: JSON for Gemini, TOML for Codex.
Input / Output
| Direction | Content |
|-----------|---------|
| Input | OS info, disabled flags per agent, targets (gemini/codex/both), dry_run flag, optional runId, optional summaryArtifactPath |
| Output | Structured summary envelope with payload.status = completed / skipped / error, plus per-target sync outcomes in changes / detail |
If summaryArtifactPath is provided, write the same summary JSON there. If not provided, return the summary inline and remain fully standalone. If runId is not provided, generate a standalone run_id before emitting the summary envelope.
Config Paths by OS
| Agent | Windows | macOS / Linux |
|-------|---------|---------------|
| Claude (primary) | %USERPROFILE%\.claude.json | ~/.claude.json |
| Claude (fallback) | %USERPROFILE%\.claude\settings.json | ~/.claude/settings.json |
| Gemini | %USERPROFILE%\.gemini\settings.json | ~/.gemini/settings.json |
| Codex | %USERPROFILE%\.codex\config.toml | ~/.codex/config.toml |
Workflow
Discover State --> Sync Skills --> Sync MCP --> Sync Hooks --> Report
Phase 1: Discover State
- Read Claude settings (source of truth):
~/.claude.json(primary) +~/.claude/settings.json(fallback)- Merge: primary overrides fallback by server name
- Read target configs (if exist):
- Gemini:
~/.gemini/settings.json→ extractmcpServers - Codex:
~/.codex/config.toml→ extract[mcp_servers.*]
- Gemini:
- Check existing symlinks:
~/.gemini/skills,~/.codex/skills - Display current state table
Phase 2: Sync Skills (symlinks/junctions)
For each target where disabled is not true:
| OS | Command |
|----|---------|
| Windows | cmd /c mklink /J "{target}" "{source}" |
| macOS/Linux | ln -s "{source}" "{target}" |
Decision logic:
| Condition | Action |
|-----------|--------|
| disabled: true for this agent | SKIP, report "disabled" |
| Link exists, points correctly | SKIP, report "already linked" |
| Link exists, points wrong | WARN, ask user before replacing |
| Real directory exists (not link) | WARN, skip (avoid data loss) |
| No link exists | Create link |
Phase 3: Sync MCP Settings
IF agent disabled: true → SKIP for that target.
3a: Claude to Gemini (JSON to JSON)
| Claude Field | Gemini Field | Notes |
|---|---|---|
| type: "http" + url | url | HTTP (Gemini auto-detects streamable/SSE) |
| command + args | command + args | stdio (same format) |
| env | env | Same format |
| headers | headers | Same format |
Gemini-only fields (preserve during merge, not mapped from Claude):
timeout, trust, includeTools, excludeTools
3b: Claude to Codex (JSON to TOML)
| Claude JSON | Codex TOML | Notes |
|---|---|---|
| command | command | Same |
| args | args | JSON array to TOML array |
| env | [mcp_servers.{name}.env] | Nested table |
| type: "http" + url | url | Codex auto-detects by url presence |
| headers | http_headers | Different key name |
Codex-only fields (preserve during merge, not mapped from Claude):
bearer_token_env_var, enabled_tools, disabled_tools, startup_timeout_sec, tool_timeout_sec, enabled, required
Merge strategy (both targets): Claude servers override target by key name. Target-only servers preserved. Backup .bak before writing.
Phase 4: Sync Hooks
4a: Claude to Gemini (event name + tool name mapping)
| Claude Event | Gemini Event | Notes |
|---|---|---|
| PreToolUse | BeforeTool | Same concept, different name |
| PostToolUse | AfterTool | Same concept, different name |
| Stop | AfterAgent | Agent completion |
| SessionStart | SessionStart | Same name |
Tool name mapping in hook matchers:
| Claude Tool Name | Gemini Tool Name |
|---|---|
| Read | read_file |
| Edit | edit_file |
| Write | write_file |
| Grep | search_files |
Hook scripts must support both tool name formats (same mapping as matchers above).
4b: Claude to Codex
Codex does NOT support hooks. SKIP hook sync for Codex. Report "hooks not supported by Codex CLI".
Phase 4c: Gemini MCP Policy
Gemini CLI policy engine blocks MCP tool calls by default (error: "Tool execution denied by policy") even with --yolo. Fix: ensure ~/.gemini/policies/allow-mcp.toml exists.
| Condition | Action |
|-----------|--------|
| File exists with mcpName allow rule | SKIP |
| File missing or no allow rule | Create ~/.gemini/policies/allow-mcp.toml |
File content:
[[rule]]
mcpName = "*"
decision = "allow"
priority = 200
Phase 5: Report
Config Sync:
| Action | Target | Status |
|----------------|--------|--------------------------------|
| Skills symlink | Gemini | created -> ~/.claude/plugins |
| Skills symlink | Codex | already linked |
| MCP sync | Gemini | 4 servers synced (2 new) |
| MCP sync | Codex | 4 servers synced (1 new) |
| Hooks sync | Gemini | 3 events synced |
| Hooks sync | Codex | skipped (not supported) |
| MCP policy | Gemini | allow-mcp.toml created |
Critical Rules
- Claude = source of truth. Never write TO Claude settings. Read-only source
- Non-destructive merge. Target-only servers and settings preserved. Only Claude servers added/updated
- No data loss. Real directories (not symlinks) at target path → warn and skip, never delete
- Backup before write. Create
.bakcopy before modifying any config file - Respect
disabledflags. Skip all operations for disabled agents - Idempotent. Safe to run multiple times. Already-synced state is skipped
Anti-Patterns
| DON'T | DO |
|-------|-----|
| Write TO Claude settings from targets | Claude is read-only source |
| Delete target-only MCP servers during sync | Preserve target-only servers |
| Create symlinks inside symlinks (circular) | Check link target before creating |
| Modify config files without backup | Always create .bak first |
| Try to sync hooks to Codex | Report "not supported", skip |
| Auto-replace mispointed symlinks | Ask user before replacing |
Definition of Done
- [ ] Claude settings read successfully (both config locations)
- [ ] Skills symlinks created/verified for each non-disabled target
- [ ] MCP settings synced with correct format conversion (JSON for Gemini, TOML for Codex)
- [ ] Hook events and tool names mapped for Gemini
- [ ] Codex hooks skipped with report
- [ ] Gemini MCP policy file verified/created
- [ ] Backup files created before any config modification
- [ ] Final report table displayed
Version: 1.0.0 Last Updated: 2026-03-20