Config Sync — 16 AI Tools, 1 Source
Reads .claude/rules/ (or CLAUDE.md) as canonical source and generates native config files for every major AI coding assistant.
Problem
Each AI coding tool uses a different config file:
- Claude Code →
CLAUDE.md + .claude/rules/*.md
- Codex CLI →
AGENTS.md
- Gemini CLI →
GEMINI.md
- Cursor →
.cursor/rules/*.mdc
- GitHub Copilot →
.github/copilot-instructions.md
- Windsurf →
.windsurf/rules/*.md
- Cline/Roo →
.clinerules/*.md
- Aider →
CONVENTIONS.md
- Kiro →
.kiro/steering/*.md
- Amazon Q →
.amazonq/rules/*.md
- Goose →
.goosehints
- Trae AI →
.trae/rules/*.md
- Zed →
.rules
- Amp/OpenCode/Warp →
AGENTS.md (shared)
Maintaining 16 files for the same instructions is absurd. Config-sync fixes it.
How It Works
- Source of truth:
.claude/rules/*.md (most expressive format — supports glob patterns, frontmatter conditions, always/attached/triggered modes)
- Fallback source:
CLAUDE.md at repo root if .claude/rules/ doesn't exist
- Transform: Concatenates all rule files, strips Claude-specific frontmatter, generates each format
- Output: Only generates configs for tools you select (or all by default)
Usage
Generate all configs
python3 ~/.openclaw/skills/config-sync/scripts/config-sync.py /path/to/repo
Generate specific tools only
python3 ~/.openclaw/skills/config-sync/scripts/config-sync.py /path/to/repo --tools codex,gemini,cursor
Preview without writing
python3 ~/.openclaw/skills/config-sync/scripts/config-sync.py /path/to/repo --dry-run
Init from existing CLAUDE.md
python3 ~/.openclaw/skills/config-sync/scripts/config-sync.py /path/to/repo --init
This creates .claude/rules/ from your existing CLAUDE.md as the canonical source.
Supported Tools
| Tool | Output File | Notes |
|---|
| Claude Code | .claude/rules/*.md (source, not generated) | Already the canonical format |
| Codex CLI | AGENTS.md | Flat markdown, no frontmatter |
| Gemini CLI | GEMINI.md | Flat markdown |
| Cursor | .cursor/rules/config-sync.mdc | MDC format with description + globs |
| GitHub Copilot | .github/copilot-instructions.md | Flat markdown |
| Windsurf | .windsurf/rules/config-sync.md | Flat markdown |
| Cline/Roo | .clinerules/config-sync.md | Flat markdown |
| Aider | CONVENTIONS.md | Flat markdown, concise style |
| Kiro | .kiro/steering/config-sync.md | Flat markdown |
| Amazon Q | .amazonq/rules/config-sync.md | Flat markdown |
| Goose | .goosehints | Line-per-rule, no markdown |
| Trae AI | .trae/rules/config-sync.md | Flat markdown |
| Zed | .rules | Flat markdown |
Transformation Rules
Stripped from source
- YAML frontmatter (--- blocks) — tool-specific, not portable
alwaysApply: true/false — Claude Code specific
- Glob patterns in frontmatter — converted to natural language headers
Added to each output
- Header comment:
<!-- Generated by config-sync. Edit source at .claude/rules/ -->
- Tool-specific header if needed (e.g., MDC frontmatter for Cursor)
Format adaptations
- Goose (
.goosehints): Each rule becomes one line, no markdown
- Cursor (
.mdc): Gets MDC frontmatter with description and globs: **
- Aider (
CONVENTIONS.md): Condensed to bullet points, no long explanations
- AGENTS.md: Standard markdown, used by Codex/Amp/OpenCode/Warp (4 tools, 1 file)
Workflow
- Edit
.claude/rules/*.md (your canonical source)
- Run
config-sync to generate all other formats
- Commit all generated files together
- Repeat when rules change
Auto-detect installed tools
The script checks for:
.cursor/ directory → Cursor installed
.github/copilot-instructions.md exists → Copilot in use
.windsurf/ → Windsurf installed
.clinerules/ → Cline installed
.kiro/ → Kiro installed
.amazonq/ → Amazon Q installed
.trae/ → Trae installed
AGENTS.md exists → Codex/Amp/OpenCode in use
GEMINI.md exists → Gemini CLI in use
If --tools is not specified, generates all formats (belt-and-suspenders approach).
Philosophy
One source of truth. Many outputs. Like a compiler: write once in the richest language, emit to every target.