# One setup, every AI CLI with agnostic-AI

> Source: <https://agnostic-ai.org/>
> Published: 2026-09-23 23:10:16+00:00

### 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 installer[All install options](https://agnostic-ai.org/docs/installation/)

`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.

```
# Generated by agnostic-ai. Do not edit this file directly; edit specs under .agnostic-ai/ and run `agnostic-ai sync`.
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](https://agnostic-ai.org/docs/alternatives-why-not-symlinks/)

`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](https://agnostic-ai.org/docs/spec-format/#settings), [review](https://agnostic-ai.org/docs/spec-format/#reviews), [environment](https://agnostic-ai.org/docs/spec-format/#environments), [ignore](https://agnostic-ai.org/docs/spec-format/#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](https://agnostic-ai.org/docs/targets/claude/) | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNative | 
| [Codex](https://agnostic-ai.org/docs/targets/codex/) | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | Commands [Opt-in](https://agnostic-ai.org/docs/targets/codex/#config-keys) | 
| [Cursor](https://agnostic-ai.org/docs/targets/cursor/) | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNative | 
| [Gemini](https://agnostic-ai.org/docs/targets/gemini/) | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNative | 
| [Copilot](https://agnostic-ai.org/docs/targets/copilot/) | AgentsNative | SkillsNative | RulesNative | HooksNative | MCPNative | CommandsNo output | 

What shipped in agnostic-ai, and what changed upstream in the tools it targets.
