为什么用 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 只覆盖该约定适用的代码
- 已在一个已知存在违规的拉取请求上试运行