Why agnostic-ai
Every AI coding tool wants its own config: CLAUDE.md, AGENTS.md, .cursor/rules/*.mdc, skills, hooks, MCP servers. Each one has its own path, format, and keys. Use two tools and you keep two copies. They drift.
The same server, four formats
One MCP server, written once in .agnostic-ai/mcps/github.yaml:
name: github
type: http
url: https://api.githubcopilot.com/mcp/
agnostic-ai sync writes it where each tool reads it:
| Tool | File | Shape |
|---|---|---|
| Claude Code | .mcp.json | mcpServers.github.url |
| Codex | .codex/config.toml | [mcp_servers.github] with url |
| Gemini CLI | .gemini/settings.json | mcpServers.github.httpUrl |
| Zed | .zed/settings.json | context_servers.github.url |
Hooks differ the same way. The event before a tool call is PreToolUse in Claude Code and BeforeTool in Gemini CLI.
Why the usual fixes fall short
- A symlink shares bytes. It cannot turn YAML into TOML or rename a key. On Windows it needs admin rights or Developer Mode, and Git for Windows checks it out as a text file by default.
- Copy and paste works until someone edits one copy.
- One
AGENTS.mdis read by many tools, and it carries plain instructions well. It cannot carry skills, hooks, MCP servers, agents, rules scoped to some files, or per-tool frontmatter such as a model name. - Your own script works for the formats you know today. Tools change their formats often, and the script is yours to fix each time.
What agnostic-ai does
- One source. Plain Markdown and YAML in
.agnostic-ai/, committed with your code. - Native output.
syncwrites each tool's own files for 25 targets,AGENTS.mdincluded. - A CI gate.
sync --checkfails the build when a generated file drifts from its spec. - Easy to adopt.
init --from allimports the config you already have and keeps its behavior. - Safe on shared files. Sync keeps your hand-written keys in files such as
.claude/settings.json, andrevertundoes async --backup. - Easy to leave. The generated files are yours and keep working without agnostic-ai.
When you do not need it
One tool: use its own files. Two tools that read the same Markdown at the same path: a symlink is enough. agnostic-ai pays off once a second tool wants a different format.
Start
Install agnostic-ai, then at your project root:
agnostic-ai init --from all
agnostic-ai sync --plan
agnostic-ai sync
New project with no config yet? Follow Getting started.