Two kinds of files: rules and skills
Rules (CLAUDE.md, AGENTS.md, .mdc, copilot-instructions.md) load at startup or when you touch a matching file, and they stay in context. Every line costs tokens on every request, so keep them short: Anthropic suggests under 200 lines per CLAUDE.md, Cursor under 500 lines per rule, and Codex stops adding AGENTS.md content after 32 KiB by default.
Skills (SKILL.md) use progressive disclosure: only the name and description sit in context, and the body loads when a task matches. Long, situational material belongs there. The format is covered in how to write a SKILL.md.
Matrix: which agent reads which file
| Format | Path | Read by | When it loads |
|---|---|---|---|
| CLAUDE.md | ./CLAUDE.md, .claude/CLAUDE.md, ~/.claude/CLAUDE.md, CLAUDE.local.md | Claude Code; Copilot (cloud agent, code review, CLI); opencode as a fallback; Codex only via project_doc_fallback_filenames | at startup, root down to the working dir; subfolder files on demand |
| AGENTS.md | repo root and subfolders | Codex, Cursor, Copilot, Devin Desktop, Kiro, opencode, Zed, Cline, Junie; Gemini CLI via context.fileName; Claude Code since v2.1.277 | always; the file closest to the edit wins |
| GEMINI.md | ~/.gemini/GEMINI.md, working dirs and parents | Gemini CLI; Copilot (cloud agent, CLI); Zed | concatenated and sent with every prompt |
| SKILL.md | .claude/skills/, .agents/skills/, .kiro/skills/ and more | Claude Code, Codex, Cursor, Copilot, Gemini CLI, Kiro, opencode, Zed, Devin Desktop | name and description at startup, body on use |
| .claude/rules/*.md | .claude/rules/, ~/.claude/rules/ | Claude Code | always without paths; with paths, when a matching file is touched |
| .cursor/rules/*.mdc | .cursor/rules/ | Cursor | always, by globs, by description, or manually |
| .cursorrules | root | Cursor (legacy), Cline, Zed | always |
| copilot-instructions.md | .github/ | Copilot; Zed | always in repo context |
| *.instructions.md | .github/instructions/ | Copilot | when the path matches applyTo |
| .clinerules | .clinerules/ or .cline/rules/ | Cline | always, or by paths |
| .devin/rules/*.md | .devin/rules/ (fallback .windsurf/rules/) | Windsurf / Devin Desktop | by trigger: always_on, model_decision, glob, manual; 12,000 characters per file |
| Kiro steering | .kiro/steering/*.md | Kiro | by inclusion: always, fileMatch, manual, auto |
Zed is the odd one. From the list .rules → .cursorrules → .windsurfrules → .clinerules → .github/copilot-instructions.md → AGENT.md → AGENTS.md → CLAUDE.md → GEMINI.md it uses only the first file it finds. A stale .rules in the root will shadow your AGENTS.md.
AGENTS.md and CLAUDE.md in one repo
Since v2.1.277 Claude Code reads AGENTS.md natively, but by default only when there is no CLAUDE.md, .claude/CLAUDE.md or CLAUDE.local.md in the working directory or above. If CLAUDE.md exists, AGENTS.md is silently skipped. The documented bridge is a line @AGENTS.md inside CLAUDE.md. Details in AGENTS.md vs CLAUDE.md.
The shared .agents/skills folder
.agents/skills/ (and ~/.agents/skills/) is read by Codex, Cursor, Copilot, Gemini CLI, opencode, Zed and Devin Desktop. It is the closest thing to a common home for skills.
Two exceptions. The Claude Code docs do not mention this path; Claude Code looks in .claude/skills/. Kiro reads only .kiro/skills/. On the other hand, Cursor, Copilot, opencode and, when enabled, Devin Desktop all pick up .claude/skills/.
Installers handle the split for you. npx skills add owner/repo -a claude-code drops the skill into .claude/skills/; with -a codex it goes to .agents/skills/. Per-platform steps: Claude Code, Codex, Cursor.
Slash commands: still a mess of formats
| Agent | Where | Format |
|---|---|---|
| Claude Code | .claude/commands/*.md | Markdown; merged into skills, old files still work |
| Codex | ~/.codex/prompts/*.md | deprecated in favor of skills |
| Gemini CLI | .gemini/commands/*.toml | TOML with a prompt field |
| Copilot (VS Code) | .github/prompts/*.prompt.md | Markdown + frontmatter |
| Devin Desktop | .devin/workflows/*.md | Markdown, run with /name |
The direction is clear: Claude Code and Codex are folding commands into skills, and Cursor does the same with /migrate-to-skills. Write new commands as skills from the start.
Converters: one source for every agent
GitHub stars as of 2026-10-24.
| Tool | What it does | Coverage |
|---|---|---|
| rulesync (1,551★, MIT) | generates rules, MCP, commands, subagents, skills and hooks from .rulesync/; imports from CLAUDE.md, .cursorrules, copilot-instructions | about 65 targets |
| ruler (2,950★, MIT) | writes AGENTS.md for most agents from .ruler/, merges MCP into native configs | 31 rows in the README table |
| block/ai-rules (139★, Apache-2.0) | rules and MCP from ai-rules/ | 11 agents |
| vercel-labs/skills (36,354★, MIT) | an installer, not a converter: puts SKILL.md into each agent's folder | Claude Code, Codex, Cursor, OpenCode and 75 more per the README |
| openskills (10,808★) | installs skills and lists them in AGENTS.md | any agent that reads AGENTS.md; last push 2026-01-18 |
Our take. One person, one agent: skip converters and use the native file. A team on two or more agents: keep rules in AGENTS.md, skills in .agents/skills/, and add an @AGENTS.md bridge in CLAUDE.md for Claude Code. Once MCP and hooks for three agents join the rules, use rulesync; it covers the most features and works in both directions.