Skip to main content

为什么用 ast-grep

有些约定是结构性的:“这里永远不要调用这个函数”、“总是传这个选项”。模型能发现它们,但也可能漏掉或凭空想象。ast-grep 规则匹配的是语法树,因此匹配本身就是证据。引用了本次运行匹配到的规则的发现会跳过模型检查并直接发布。 示例是一个结账服务,只有一条约定:金额是由 Money 辅助类处理的整数分,永远不用浮点数。

步骤 1 — 在代码库中编写规则

在默认分支上提交一个规则文件。Kodus 从每个拉取请求的目标分支读取它,因此拉取请求无法放宽用来检查它的规则。
rules/money.yml
每条规则的 message 就是评论中作为规则引用的内容,所以请为阅读拉取请求的人来写它。 再把背后的理由写进一份 doc,覆盖模式无法捕捉的情况:
docs/money.md

步骤 2 — 创建智能体

New agent → Templates → Blank,然后:
Name
Instructions

步骤 3 — 指向规则

在 Tools → Advanced → Structural search (ast-grep rules) 中,单独一行填写路径:
提示会列出找到的规则:2 rules in rules/money.yml: no-parsefloat-amount, no-tofixed-amount。您也可以直接粘贴内联 YAML 而不是路径;这样规则就保存在智能体中,而不是在代码库中。

步骤 4 — 评论

点击 Save。

步骤 5 — Try it

在一个对价格使用了 parseFloat 的拉取请求上运行 Try it。该发现会被 kept,其评论引用规则:
智能体基于 docs/money.md 提出的发现会改为引用该 doc;如果引文不在目标分支上的 doc 中,则会被丢弃。

检查清单

  • 规则文件已提交到默认分支
  • 每条规则都有 id、rule 和易读的 message
  • 字段提示列出了每一条规则
  • glob 只覆盖该约定适用的代码
  • 已在一个已知存在违规的拉取请求上试运行
该字段的详细说明,请参阅 ast-grep 规则。