正在加载陈远的个人网站

用 Pre-commit 钩子限制 AI 生成文件体积的提示词

Matt Pocock 分享一条提示词:用 pre-commit 钩子拦截超 5000 token 的文件,迫使 Agent 拆分模块、保持代码库整洁。

原始内容

Prompt of the day: Create a pre-commit hook that prevents files over 5,000 tokens. Tokens = bytes/4. Run only on staged files. Ignore files which are not authored by agents, like lockfiles or codegen. Provide explicit instructions on how to split files in the error message. The simplest investment I ever made in my codebase. So good.

中文译文

机器翻译,保留原文供核对。

今日提示词: 创建一个预提交钩子,阻止超过 5,000 个 token 的文件。Tokens = bytes/4. 仅对已暂存的文件运行。忽略并非由 agent 编写的文件,例如锁文件或代码生成文件。 在错误信息中提供关于如何拆分文件的明确说明。 这是我在代码库中做过的最简单的投资。效果非常好。

深度解析

是什么:Matt Pocock 的「每日提示词」:让 Coding Agent 编写一个 pre-commit 钩子,阻止超过 5000 token(按 bytes/4 估算)的文件被提交;只检查暂存文件,并排除 lockfile、codegen 等非 Agent 编写的产物;报错信息中直接写明如何拆分文件。他称之为「在代码库里做过的最简单也最值的投资」。

核心设计:四个细节构成闭环——1) 用 bytes/4 近似 token 数,零依赖、钩子内可秒级执行;2) 只扫 staged 文件,把耗时控制在提交路径可接受范围;3) 排除清单避免误伤机器生成文件;4) 最关键的是把「报错」变成「行动指引」,Agent 收到失败信息后能自主完成拆分并重试,形成自我修正回路。

关键洞察:Agent 天然倾向把逻辑持续堆进同一文件,导致上下文膨胀、审查困难和认知负担上升。与其事后重构,不如在提交入口设置硬约束,用一条提示词把架构纪律固化为自动化防线。这是「提示词即基础设施」的典型案例:一次配置,长期约束所有后续 Agent 行为,成本极低、杠杆极高。

边界与风险:5000 token 是经验阈值,对数据、样式或配置文件可能过严;bytes/4 仅为粗估;钩子只能拦提交,无法阻止 Agent 在工作区内继续膨胀文件。落地时应按语言和文件类型微调排除清单与阈值。

精选追评与案例

  1. 提供可直接复用的 AGENTS.md 规则,把 token 限制落成 500 LOC 的明确约束。

    @mattpocockuk AGENTS.md - Keep every source file at or below 500 LOC. Tests, docs and CSS are exempt. Markdown is documentation, not source. Split a source file before completion if your change takes it over the limit. This works perfectly in my experience.

    中文译文 · 机器翻译

    @mattpocockuk AGENTS.md - 让每个源文件保持在 500 LOC 或以下。测试、文档和 CSS 除外。Markdown 是文档,不是源代码。如果你的改动使某个源文件超出限制,请在完成前拆分它。 根据我的经验,这非常有效。

  2. 指出代理可能删注释、挤压代码来规避限制,是设计钩子时必须防的作弊路径。

    @mattpocockuk what stops the agent from deleting comments and cramming lines together to pass the 5k limit instead of splitting?

    中文译文 · 机器翻译

    @mattpocockuk 是什么阻止 agent 通过删除注释、把多行挤在一起的方式来通过 5k 限制,而不是拆分文件?

  3. 纠正 bytes/4 估算偏差,并提醒拆分后可能出现大量互相 import 的碎片文件。

    @mattpocockuk bytes/4 is generous for code imo, symbols and json tokenize worse than prose. also curious if agents just start splitting into 40 tiny files that all import each other. did you need a rule for that too

    中文译文 · 机器翻译

    @mattpocockuk 在我看来,对代码来说 bytes/4 很宽松,符号和 json 的分词效果比普通文本更差。另外我很好奇,agent 是否会干脆开始拆成 40 个彼此互相 import 的小文件。你是否也需要为此制定一条规则?

  4. 补充拆分规则必须禁止 part1.ts/part2.ts 式伪拆分。

    @mattpocockuk Your split instructions need a “no part1.ts, part2.ts” clause.

    中文译文 · 机器翻译

    @mattpocockuk 你的拆分说明需要一条“不要 part1.ts、part2.ts”的条款。

  5. 给出 25,000 这一不同阈值和实践反馈,说明 5,000 可能过度拆分。

    @mattpocockuk Heh, I do the same, but the limit is 25,000. 5,000 creates an over-engineered mess.

    中文译文 · 机器翻译

    @mattpocockuk 嘿,我也这么做,但上限是 25,000。 5,000 会制造出过度工程的烂摊子。