先说结论
四个工具认的文件不一样,但底层思路趋同:都有一个“全局指令文件”+“技能/规则”两层。Claude Code 用 CLAUDE.md + SKILL.md;OpenAI Codex CLI 用 AGENTS.md 也能吃 skills;Google Gemini CLI 用分层的 GEMINI.md 同样支持 Agent Skills;Cursor 则走 .cursor/rules/*.mdc 规则文件,没有原生 SKILL.md 那种“按描述触发”的渐进披露。迁移时,Codex 和 Gemini 基本能直接复用 Agent Skills 格式,Cursor 得转成 .mdc 并丢掉触发门控。
以下数据为 2026-09-26 从 GitHub API 拉取。
三家各自认什么
| 工具 | 指令文件 | 技能/规则 | 仓库 star(2026-09-26) |
|---|---|---|---|
| Claude Code | CLAUDE.md | SKILL.md(渐进披露) | anthropics/skills 178,480 |
| OpenAI Codex CLI | AGENTS.md | skills(文档指向 developers.openai.com/codex/skills) | openai/codex 126,540 |
| Gemini CLI | GEMINI.md(分层) | skills / using-agent-skills | google-gemini/gemini-cli 107,163 |
| Cursor | (无统一单文件,靠规则) | .cursor/rules/*.mdc | awesome-cursorrules 40,838 |
把表读厚一点能看出共性:四家都在“一份全局指令文件”之外,另有一层“可复用的工作流/规则”。Claude Code 和 Gemini 明确能吃 Anthropic 的 Agent Skills 格式,Codex 文档也指向同一套 skills,只有 Cursor 用自己的 .mdc 闭环。所以“写一份合规 SKILL.md”是性价比最高的起点——它天然能被前三家复用。
Codex:AGENTS.md + skills
openai/codex(126,540 star,Apache-2.0)的 docs/ 里同时有 agents_md.md 和 skills.md 两份文档。AGENTS.md 那份原文很短,就一句:
“For information about AGENTS.md, see this documentation (https://developers.openai.com/codex/guides/agents-md).”
skills 那份同理指向 developers.openai.com/codex/skills。也就是说,Codex 既吃 AGENTS.md 这种常驻指令,也认 Anthropic 那套 Agent Skills 格式——迁移成本最低。
AGENTS.md 的写法和 CLAUDE.md 一脉相承:放项目约定、禁止事项、常用命令,Codex 每次会话启动时读一遍,当作常驻系统提示。区别是它没有 SKILL.md 那套“按需才读”的机制——AGENTS.md 是常驻的,所以更要克制篇幅,别把整本内部 wiki 塞进去,否则每一轮都要为这份长提示付输入钱。
Gemini CLI:分层的 GEMINI.md + skills
google-gemini/gemini-cli(107,163 star,Apache-2.0)的 docs/cli/ 下有一份 gemini-md.md,把上下文文件讲得很清楚:
“Context files, which use the default name GEMINI.md, are a powerful feature for providing instructional context to the Gemini model.”
它最特别的是分层加载:全局 ~/.gemini/GEMINI.md、工作区及父目录里的 GEMINI.md、以及“按需(JIT)”在工具访问某目录时向上扫描到的 GEMINI.md,全部拼接后随每次请求发往模型。同时它还有 creating-skills.md、skills.md、using-agent-skills.md——意味着它能直接消费 Anthropic 的 Agent Skills。
这种“分层 + 按需”的设计有个甜头:你可以把通用约定放全局 ~/.gemini/GEMINI.md,把某子模块专属的规矩写在该目录下的 GEMINI.md,模型访问那个目录时才把它拼进来。代价是每层都会进输入,所以同样要控制单文件体积,别在根目录 GEMINI.md 里堆几页纸。
Cursor:.mdc 规则文件
Cursor 的玩法在 PatrickJS/awesome-cursorrules(40,838 star,“Configuration files that enhance Cursor AI editor experience with custom rules and behaviors”)和 sanjeed5/awesome-cursor-rules-mdc(3,574 star,“Curated list of awesome Cursor Rules .mdc files”)里能看到:规则就是 .cursor/rules/ 下的 .mdc 文件。它走的是“按 glob 匹配或常驻生效”的模型,不是“按 description 触发、激活才读全文”的渐进披露。这是迁移时最容易丢能力的地方。
和前三家的“全局指令文件 + 按需技能”不同,Cursor 没有 SKILL.md 那种按 description 触发、激活才读全文的渐进披露。.mdc 文件要么 alwaysApply: true 常驻、要么靠 globs 按文件路径匹配才生效。好处是简单直接,坏处是你失去了“按语义触发”的精细控制——同一个技能要同时覆盖“用户说导出”和“用户打开表格文件”两种场景,在 Cursor 里得靠 glob 硬匹配,写起来比 description 啰嗦。
# Cursor 的 .mdc 大致结构(字段以 Cursor 官方文档为准)
---
description: 处理本项目 TypeScript 代码时生效
globs: "**/*.ts"
alwaysApply: false
---
禁止引入未列入依赖清单的包;提交信息用中文动词开头。同一个 skill 怎么迁移
目录映射与能力取舍:
# 指令文件:一份内容,四处改名
~/.claude/CLAUDE.md # Claude Code
~/.config/codex/AGENTS.md # Codex(路径以你本地版本为准)
~/.gemini/GEMINI.md # Gemini CLI
.cursor/rules/project.mdc # Cursor
# 技能:SKILL.md 直接给 Codex / Gemini 复用;
# 给 Cursor 时把正文搬进 .mdc,触发门控退化为 glob / alwaysApply| 从 | 到 Codex / Gemini | 到 Cursor |
|---|---|---|
| SKILL.md | 基本原样复用(它们吃 Agent Skills) | 转 .mdc,丢失“按描述触发” |
| CLAUDE.md | 改名 AGENTS.md / GEMINI.md | 放 .cursor/rules/ 下作常驻规则 |
| 渐进披露 | 保留(技能触发才读正文) | 丢失(规则常驻或按 glob) |
落到具体动作:你那份 SKILL.md,连目录原样丢给 Codex(放它认的 skills 位置)和 Gemini(放它认的 skills 位置)基本就能用,因为两者都吃 Agent Skills 格式;丢给 Cursor 时,把 frontmatter 的 description 拆成 .mdc 的 description + globs,正文原样搬进 .mdc 正文,触发逻辑从“语义”退化成“路径/常驻”。能力损失主要在触发精度,不在指令本身。
跨工具最小公约数写法
- 指令文件写纯 Markdown:四家居然都认一个“全局指令文件”,内容用纯 MD,别塞 Claude 私有语法,这样复制改名就能用。
- 技能按 Agent Skills 规范写:SKILL.md(name/description 合规)在 Codex、Gemini 上能直接吃;Cursor 用工具转。
- 触发器写进 description:规范字段,Codex/Gemini 的 skills 能读;Cursor 这边退化成 glob/alwaysApply,所以关键的“何时用”也要在正文里再写一遍。
- 用同步工具:
intellectronica/ruler(2,935 star,“apply the same rules to all coding agents”)这类项目就是干“一份规则多处同步”的。
工具同步这块再多说一句:intellectronica/ruler(2,935 star)的定位就是“把同一套规则同时应用到所有编码代理”,它帮你维护一份源规则、再分发到各工具的约定位置。如果你团队跨工具混用,与其四份各写各的、迟早漂移,不如搞一份纯 Markdown 源,用它或简单的脚本同步。注意这只能同步“常驻指令”那一层,技能级的渐进披露在 Cursor 上仍会退化。
一份可复用的纯 Markdown 指令骨架:
# 项目指令(纯 Markdown,四工具通吃)
## 技术栈
- 前端:TypeScript + React
## 约定
- 提交信息用中文,动词开头
- 不引入未列入依赖清单的包
## 禁止
- 不要改写测试目录以外的历史文件坑 / 反模式
- 以为装了 SKILL.md 在 Cursor 里就能自动触发——Cursor 没有这套门控,得转 .mdc。
- 把整本手册塞进 GEMINI.md,分层加载会把它拼进每次请求,输入暴涨。
- 指令文件用了某工具私有语法(如 Claude 专属标签),换工具直接失效。
- 只在 description 写触发词,没在正文复述“何时用”,到 Cursor 那边直接丢触发信息。
- 没验证就声称“全工具通用”——Codex/Gemini 吃 Agent Skills,Cursor 不吃,这是实打实的差异。
下一步怎么做
先把一份纯 Markdown 项目指令写顺,分别在 CLAUDE.md / AGENTS.md / GEMINI.md / .cursor/rules/ 各放一份,看各自反应;技能则严格按 本系列收录榜 里列的 Agent Skills 规范写,Codex 和 Gemini 基本能直接复用。以上迁移方式按各仓库文档与目录结构推断,我没逐工具跑通验证,动手前以你本地版本为准。
