agnostic-ai

One spec.
Every AI CLI.

You write CLAUDE.md, then .cursor/rules, then GEMINI.md, then AGENTS.md. The same content in four formats. Switch tools and you rewrite everything. agnostic-ai keeps one source of truth and emits each tool's native config, byte-stable across runs.

25
AI CLIs supported
20
enabled by default
1
source of truth

Same content, N formats, endless drift.

Every AI coding tool invented its own config file. The instructions are identical; only the wrapper differs. Copy-paste keeps them in sync until it doesn't, and a stale GEMINI.md is a silent bug.

Without agnostic-ai
  • Write the same rule into CLAUDE.md, .cursor/rules, GEMINI.md, AGENTS.md
  • Edit one, forget the others. They drift apart.
  • Onboard a new tool: hand-port everything again.
  • No way to tell in review which files fell behind.
With agnostic-ai
  • Write it once in plain Markdown + YAML frontmatter.
  • Run sync; every tool gets its native format.
  • New tool? Add one line to targets.
  • sync --check fails CI the moment output drifts.

One source of truth, 25 tools, each native.

Author agents, skills, rules, hooks, commands, and MCP servers under .agnostic-ai/. Stateless adapters translate them into every target's documented location and shape, aligned with the AGENTS.md open standard. 16 targets emit by default; Amp and Warp are opt-in.

Claude Code.claude/ · CLAUDE.md
default
Codex CLIAGENTS.md · .codex/
default
Gemini CLIGEMINI.md · .gemini/
default
Cursor.cursor/rules
default
GitHub Copilot.github/
default
Cline.clinerules
default
Windsurf / Devin.devin/rules
default
Continue.continue/rules
default
Zed.agents/skills
default
OpenCode.opencode/
default
Antigravity.agent/
default
AiderCONVENTIONS.md
default
Junie (JetBrains).junie/AGENTS.md
default
Kiro (AWS).kiro/steering
default
Crush (Charm).agents/skills · crush.json
default
Trae (ByteDance).trae/rules
default
Qoder (Alibaba).qoder/rules
default
OpenHands.agents/skills
default
Factory Droid.factory/droids
default
Kilo Code.kilo/agents · kilo.jsonc
default
AmpAGENTS.md · .agents/
opt-in
WarpAGENTS.md · .warp/
opt-in
Jules (Google)AGENTS.md (cloud)
opt-in
Goose (Block).goosehints
opt-in
Augment.augment/rules · .augment/agents
opt-in

Two layers, one command.

Drop a file in .agnostic-ai/, run agnostic-ai sync. Each target gets two things: a slim shared entry-point that points at the canonical body, and the real spec rendered into that tool's native per-file location.

Write once

One Markdown file with YAML frontmatter under .agnostic-ai/rules/, agents/, skills/, hooks/, or mcps/. Plain, reviewable, tool-agnostic.

Emit native

Stateless adapters write each target's format at the path it auto-loads. Same input, same bytes. Diffable and reviewable. Run targets in parallel with --jobs.

Never drift

sync --check re-emits in memory and fails CI on any difference, printing a per-file diff of what drifted. import pulls existing configs back into specs; the round-trip stays byte-stable.

$brew install --cask Chemaclass/tap/agnostic-ai

macOS. Upgrades with brew update && brew upgrade --cask Chemaclass/tap/agnostic-ai.

agnostic-ai upgrade detects which of these you used and prints the matching command; --check also flags another agnostic-ai shadowing it on PATH.

.agnostic-ai/rules/conventional-commits.md
---
name: conventional-commits
description: Always use Conventional Commits.
globs: "**/*"
alwaysApply: true
---

Use Conventional Commits. Subject under
72 chars. Body explains why, not what.
agnostic-ai
sync
CLAUDE.md  (shared pointer)
# AI Project Conventions

Every supported AI tool reads this
body from its native entry-point.
.cursor/rules/conventional-commits.mdc
---
description: Always use Conventional…
globs: "**/*"
---
<!-- Generated by agnostic-ai -->
Use Conventional Commits. Subject…

Byte-stable, reviewable

Stateless adapters mean same input, same output. Generated files diff cleanly and are safe to commit or ignore.

Round-trip safe

A provenance marker plus style preservation keeps import then sync byte-stable. Adopt gradually from what you already have.

Scoped rules

rules/backend/auth.md routes to .cursor/rules/backend/auth.mdc and Copilot's applyTo: backend/** automatically.

CI gate in one line

Drop the check action into your workflow and PRs fail the moment generated config drifts from source.

Write the rule once.
Every AI tool obeys it.

$ go install github.com/chemaclass/agnostic-ai/cmd/agnostic-ai@latest