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

Plain Markdown and YAML in your repo. No account, no service. import brings an existing setup in.

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 allImport existing AI tool files first.

agnostic-ai sync --dry-runPreview every native file before writing it.

agnostic-ai syncWrite 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.

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

agnostic-ai init --from all