AGENTS.md 与 AI 约束文件: 把项目规矩写进 AI 读得到的地方

AI 工具每次会话都从零开始。你让它”重构这个组件”,它不知道:你们项目用 Provider 不用 Redux、状态变量加 _ 前缀是约定、某个 legacy 目录不能动。结果它给的方案你每次都要纠正一遍,纠正到第三次你就嫌 AI 笨了——其实是它没拿到 context。

约束文件就是把这些”项目常识”写一次,让 AI 每次自动读。

一、几种文件的区别

  • AGENTS.md:跨工具通用约定。放仓库根,是新兴开放标准,目标是让所有 AI 编程工具读同一份项目说明。
  • .cursor/rules/:Cursor 专用规则目录,可按文件路径触发不同规则(改 RN 文件读 A,改 Flutter 文件读 B)。
  • .github/copilot-instructions.md:GitHub Copilot 在仓库根读的指令。
  • .clinerules:Cline 工具读。

实务:写一份 AGENTS.md 放根目录做主,工具专用的(.cursor/rules)只放工具特有、AGENTS.md 表达不了的(比如按路径触发的规则)。别每样写一份,会烂掉。

二、该写什么(按重要性排)

1. 目录结构和不能动的地方

src/
  pages/        # 路由页面,每个对应一个 URL
  components/   # 跨页面复用组件
  legacy/       # 2022 老代码,不要重构,改 bug 才动

“不要动 legacy/“这种边界比”要做什么”更重要——AI 默认会热情地帮你重构一切,而很多老代码是碰不得的雷区。

2. 技术栈和约定

  • 状态管理用 Provider/Riverpod,不用 Redux、不用 GetX
  • 组件 props 用 TypeScript interface,不用 PropTypes
  • 样式用 CSS Variables(变量在 global.css),不要内联 style

要写”用什么””不用什么”——只写”用什么”不够,AI 会自作主张用别的。

3. 提交前自查

  • 改组件跑 npm test -- <组件名>
  • PR 要过 astro check
  • 性能改动附 Profiler 截图

让 AI 知道交付前要自检什么。

4. 提交规范

  • commit 用 conventional commits
  • PR 描述写 before/after

三、不该写什么(更重要)

不要写通用编码规范。“函数要短”、“命名要清晰”这种 AI 本来就会,写了浪费 context 还稀释重点。

不要写工具教程。“Cursor 怎么用 @file”不该出现在 AGENTS.md,那是工具的事不是项目的事。

不要写空泛原则。“代码要高质量”、“注重性能”——这种谁都会说、AI 读了没用。要写就写具体的:“首屏列表虚拟化必须用 react-window,不要手写”。

四、一个最小可用结构

# AGENTS.md

## 项目结构
(目录说明 + legacy 边界)

## 技术栈
(用什么 + 不用什么)

## 提交前自查
(命令清单)

## AI 协作约定
- 改函数前先读 prompts/refactor.md
- 不确定的设计先提方案再改代码
- legacy/ 不重构

四节,每节三五行,够了。AGENTS.md 超过 100 行基本就是没想清楚重点。

五、维护

  • 每次 onboarding 新人,让他改 AGENTS.md 里他踩过的坑——这是最准的”该加什么”信号
  • 每季度删一次,把 AI 已经默认会做的条目砍掉
  • 不要让 AGENTS.md 变成”项目宪法”,它是”项目近期注意事项”,时效性强

小结

约束文件的本质和 prompt 模板库一样:把散在各人脑子里的”项目常识”沉淀成 AI 读得到的文件。区别在于——模板库管”怎么提需求”,约束文件管”项目长什么样”。两份配齐了,AI 才能从”每次会话都从零开始的实习生”变成”读过项目说明的实习生”。

注意还是实习生。读完说明不等于会做决策,架构和业务的边界仍然得自己来。这点见 AI 辅助开发的工程化边界