🛠️ 第6章 AGENTS.md:给 Agent 的项目说明书
📄 一句话概括

三类项目三份模板,差别不在长度,在「哪一段是重点」。 新项目重点是入口,遗留项目重点是禁区,团队项目重点是分工。 Demo 拿同一个体检器过三份模板,五项全过,最长那份二十四行。

📝 本章和前面几章的关系

这一章最后一篇,把前面四篇收成三份能直接抄的模板。 为什么分三类?因为三类项目的风险完全不一样: 新项目怕乱、遗留项目怕动、团队项目怕撞。 Demo 写了一个五项体检器:三段齐不齐、地图路径真不真、入口跑不跑得动、禁区够不够、 长度合不合适。三份模板全过,长度从十七行到二十四行。

一、新项目模板

新项目的风险是「乱」——目录还没定型,入口还没固定。 所以模板重点是入口:先把「怎么跑、怎么验」这两条钉死。 新项目模板可以很短。 Demo 里那份十七行,三段各两三行——因为还没有历史包袱要标。 一个提醒:新项目的 AGENTS.md 要跟着长。 第一次提交时写三段,等目录长出来再补地图,别一开始就想写全——写全了也是猜的。

二、遗留项目模板

遗留项目的风险是「动」——它看起来能跑,但某块代码一动就崩。 所以模板重点是禁区:把「哪里别碰」标出来。 Demo 里那份多了一句: 「src/legacy/ 是历史包袱,别顺手重构」。 这一句是新项目模板没有的,也是遗留项目模板的核心。 为什么这一句这么重要? 因为 Agent 看到一个写得差的目录,第一反应是「整理一下」。 它不知道那块代码没有测试覆盖,动了没人能验。 还有一条给遗留项目的建议:把「测试只有三成覆盖」写进地图。 它不是禁令,是提示——提示它「别相信测试全绿就等于没问题」。

三、团队项目模板

团队项目的风险是「撞」——两个人改同一个文件,或者改到别人负责的目录。 所以模板重点是分工:多一段「谁能改哪块」。 Demo 里那份二十四行,多出来的七行全是分工。 这一段在单人项目里是废话,在团队项目里是刚需—— 因为 Agent 不知道你们谁负责哪块,它只知道文件在哪儿。 三类模板的共同点比差别更重要: 三段结构一样、入口写法一样、禁区形状一样。 差别只在「哪一段写得多」。 所以你可以从任意一份抄起,再按项目类型加长某一段。

四、本章小结

这一章五篇,收成一张表:

问题 答案在哪一节 一句话
说明书里写什么 6.1 地图、入口、禁区
写在哪儿 6.2 根目录通用,子目录局部
打架听谁的 6.2 硬规则永远赢
团队和个人的界线 6.3 进不进仓库
人多怎么协调 6.4 矩阵、交接、值班
从哪儿抄 6.5 三类模板选一份

下一章进第二件:Rules、Hooks 与 Approvals。 AGENTS.md 是「告诉它该怎么做」,下一章是「不这么做就拦住」。 两者的区别是:前者靠它自觉,后者靠系统强制。 先约束,再放权。 这句话是第 7 章的标题,也是这四件套的顺序——没有约束的放权,叫放任。

五、动手 Demo:三类模板:拿同一个体检器过一遍

这个 Demo 写三份模板,用同一个体检器查五项。 体检器里两项能真跑(地图路径存在、入口命令退出码),另外三项只能看(三段齐不齐、禁区条数、 长度)。 三份全过,但过程不一样——团队项目那份地图路径一开始只对了三分之一。

def _audit(base, text):
    secs = _sections(text)
    has3 = all(k in secs for k in (u"项目地图", u"关键入口", u"禁区"))
    exist = sum(1 for p in paths if os.path.isdir(os.path.join(base, p)))
    entry_ok = 0
    for it in secs.get(u"关键入口", []):
        code, _ = py(base, u"tasks.py", args=[m.group(2)])
        entry_ok += 1 if code == 0 else 0
    ban = len(secs.get(u"禁区", []))
    return has3, u"%d/%d" % (exist, len(paths)), entry_ok, ban

实跑输出:

--------------------------------------------------------------------
三类模板:拿同一个体检器过一遍
--------------------------------------------------------------------


  ① 三份模板,同一个仓库
  --------------------------------------------------------------------
| 模板 | 三段 | 地图路径 | 入口能跑 | 禁区 | 长度 |
|---|:---:|:---:|:---:|---|---:|
| 新项目 | 齐 | 2/2 | 2 条 | 2 条 | 17 行 |
| 遗留项目 | 齐 | 3/3 | 2 条 | 2 条 | 18 行 |
| 团队项目 | 齐 | 3/3 | 2 条 | 2 条 | 24 行 |

  三份都过。差异只在长度,而且都不长——最长那份二十四行。
  ! 越复杂的环境,说明书越长——但长的部分是「分工」和「别动什么」,不是「怎么做」。
  步骤写进脚本,规矩写进 AGENTS.md,别混。

  ② 遗留项目模板多出来的那一句
  --------------------------------------------------------------------
  `src/`:源码,注意 `src/legacy/` 是历史包袱,别顺手重构
  这一句是遗留项目模板的核心:它告诉你「哪里别碰」。新项目没有这种地方——所有代码都在长身体。
  ! 遗留项目的风险不在「它写得差」,在「它写得差但看起来能跑」。
  Agent 不知道哪块有坑,所以你得把坑标出来。标一个「别动」比标十个「注意」有用。

  ③ 团队模板多出来的是分工
  --------------------------------------------------------------------
  前端只改 `src/web/`
  后端只改 `src/api/`
  `tests/` 谁改谁负责跑
  这一段在单人项目里是废话,在团队项目里是刚需——因为 Agent 不知道你们谁负责哪块,
  它只知道文件在哪儿。

  ④ 体检器的五项
  --------------------------------------------------------------------
| 项 | 怎么查 | 不过会怎样 |
|---|---|---|
| 三段齐 | 标题在不在 | 缺哪段它就少一份约束 |
| 地图路径 | 目录真不真存在 | 它去翻不存在的目录 |
| 入口能跑 | 真跑一遍看退出码 | 它自己发明命令 |
| 禁区条数 | 至少两条 | 等于没划边界 |
| 长度 | 看行数 | 太长没人读,也没人维护 |

  ! 五项里只有第二项和第三项能真跑,另外三项靠人看。
  这就是为什么 AGENTS.md 永远需要人写——它要判断「什么算禁区」,这个判断没法自动化。

三份都过,长度十七、十八、二十四行。 这个长度是有意的——超过三十行的说明书,三个月后一定过期。 「团队项目」那一版的地图路径一开始只有三分之一对, 因为模板里写了 src/api/、src/web/,而仓库里还没建这两个目录。 这说明一件事:模板不是抄完就完,得对着真仓库改一遍。 体检器五项里,只有两项能真跑。 剩下三项靠人看——而「什么算禁区」这个判断,永远没法自动化。 所以 AGENTS.md 不会过时成「自动生成的文档」。 它能被检查,但没法被生成——因为里面装的是你对这个项目的判断,不是项目本身的信息。

30 秒实验

  1. 从三份模板里挑一份,抄进你的仓库。 抄完把地图那几条对着真目录改一遍。
  2. 跑一遍体检器那五项。 入口那项最好真跑——写错的入口比没写更糟。
  3. 过一个月再来看一次。 地图有没有过期?禁区还成不成立?

常见误区

  1. 「模板抄完就能用。」 模板里的路径是别人的。 抄完必须对着自己的目录改一遍,否则地图那一段全是错的。
  2. 「说明书越长越专业。」 长的部分得有人维护。 二十四行能维护,四十四行三个月后就是谎话。
  3. 「三类模板差不多,用一份就行。」 差别在「哪一段写得多」。 遗留项目不标禁区,它就会去重构那块没测试的代码。
自测三问(点开对答案) 1. 三类项目的风险各是什么?模板重点各在哪一段? —— **新项目怕乱(重点入口)、遗留项目怕动(重点禁区)、团队项目怕撞(重点分工)。** 2. 为什么体检器五项里只有两项能真跑? —— **因为「三段齐不齐」「禁区够不够」「长度合不合适」要人判断。** **尤其「什么算禁区」,那是你的判断,不是项目的信息。** 3. 这一章和下一章的分工是什么? —— **这一章是「告诉它该怎么做」,下一章是「不这么做就拦住」。** **前者靠自觉,后者靠系统强制。**

第 6 章到这里收住。下一章进第二件:Rules、Hooks 与 Approvals。 核心一句话:先约束,再放权。

相关笔记