You own the source
Plain Markdown and YAML in your repo. No account, no service. import brings an existing setup in.
Keep agents, skills, rules, hooks, and MCP servers in one portable source. agnostic-ai writes each tool's native files and checks them for drift.
Recommended installerAll install options
curl -fsSL https://raw.githubusercontent.com/Chemaclass/agnostic-ai/main/scripts/install.sh | bash
25 targets. 10 portable spec kinds. Byte-stable output.
---
name: reviewer
description: Reviews a diff for bugs, style, and architectural issues.
tools: [Read, Grep, Glob]
model:
claude: claude-opus-5-5
codex: gpt-6-sol
effort: high
---
Read the diff. Report bugs, unclear naming, and missing tests.
Cite every finding with a `file:line` reference.
Markdown with YAML frontmatter. The per-target model map resolves to model: claude-opus-5-5, effort keeps its name, and the three tools pass through as written.
---
name: reviewer
description: Reviews a diff for bugs, style, and architectural issues.
tools:
- Read
- Grep
- Glob
model: claude-opus-5-5
effort: high
---
<!-- Generated by agnostic-ai. Do not edit this file directly; edit specs under .agnostic-ai/ and run `agnostic-ai sync`. -->
Read the diff. Report bugs, unclear naming, and missing tests.
Cite every finding with a `file:line` reference.
TOML, not Markdown. The map resolves to gpt-6-sol, effort becomes Codex's own model_reasoning_effort, the body becomes developer_instructions, and there is no tools key at all.
name = "reviewer"
description = "Reviews a diff for bugs, style, and architectural issues."
model = "gpt-6-sol"
model_reasoning_effort = "high"
developer_instructions = """
Read the diff. Report bugs, unclear naming, and missing tests.
Cite every finding with a `file:line` reference.
"""
tools and effort are dropped. Sync says why: Cursor subagents have neither field, so use readonly: true for a coarse restriction and put effort in the model id, such as claude-opus-5[effort=high].
---
name: reviewer
description: Reviews a diff for bugs, style, and architectural issues.
---
<!-- Generated by agnostic-ai. Do not edit this file directly; edit specs under .agnostic-ai/ and run `agnostic-ai sync`. -->
Read the diff. Report bugs, unclear naming, and missing tests.
Cite every finding with a `file:line` reference.
The tool names are translated into Gemini vocabulary. No model line, because the map has no gemini key and no default. No effort line either: Gemini agents have no effort key, and sync prints a note.
---
name: reviewer
description: Reviews a diff for bugs, style, and architectural issues.
tools:
- read_file
- grep_search
- glob
---
<!-- Generated by agnostic-ai. Do not edit this file directly; edit specs under .agnostic-ai/ and run `agnostic-ai sync`. -->
Read the diff. Report bugs, unclear naming, and missing tests.
Cite every finding with a `file:line` reference.
The tools pass through untranslated, and effort keeps its name. No model line here either, for the same reason as Gemini.
---
name: reviewer
description: Reviews a diff for bugs, style, and architectural issues.
tools:
- Read
- Grep
- Glob
effort: high
---
<!-- Generated by agnostic-ai. Do not edit this file directly; edit specs under .agnostic-ai/ and run `agnostic-ai sync`. -->
Read the diff. Report bugs, unclear naming, and missing tests.
Cite every finding with a `file:line` reference.
Every AI coding tool ships its own config file. Adopt three and your instructions live in three places, drifting apart. agnostic-ai keeps one source in your repository and writes the rest.
Same input, same bytes, so they diff cleanly. sync --check fails CI when they drift.
Adding a target never changes what the others get. One rule routes to every native path and scope syntax.
Easy to stop using. The generated files are yours, and they keep working.
Why not just symlink one file? Each tool reads a different format at a different path. A symlink shares bytes. It cannot translate them. See how the formats diverge
agnostic-ai init --from all
Import existing AI tool files first.
agnostic-ai sync --dry-run
Preview every native file before writing it.
agnostic-ai sync
Write every native file for the targets you chose.
The five most complete integrations, across six of the ten spec kinds. The other four: settings, review, environment, ignore.
Native uses the target's dedicated format automatically. Opt-in links to the setting you need.
| Target | Agents | Skills | Rules | Hooks | MCP | Commands |
|---|---|---|---|---|---|---|
| Claude | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNative |
| Codex | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | Commands Opt-in |
| Cursor | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNative |
| Gemini | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNative |
| Copilot | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNo output |
What shipped in agnostic-ai, and what changed upstream in the tools it targets.