Community编程与开发github.com

ast-grep:结构化代码搜索

通过 ast-grep 实现结构化代码搜索——当代码形状和元素关系比文本更重要时使用(例如“查找没有错误处理的异步函数”、“将 foo(a, b) 重构为 foo({ a, b })”)。简单的名称查找请使用 Grep。

ast-grep:结构化代码搜索 是什么?

该技能基于 ast-grep 工具提供结构化代码搜索能力。它专注于识别代码的抽象语法树(AST)结构模式,而非纯文本匹配。当需要查找“所有缺少错误处理的异步函数”或“将函数参数从列表形式重构为对象形式”等结构相关问题时,此技能尤为有效。它支持多种语言和平台,如 Claude Code、Cursor 等。工作流程包括:编写测试代码片段、构建规则(从简单的 pattern 开始,必要时升级为 kind + has/inside 组合)、使用 --stdin 验证规则,最后对整个代码库进行搜索。该技能还提供了关键的陷阱提示,例如必须为 has/inside 关系规则设置 stopBy: end 以确保完整子树遍历,以及正确转义 shell 中的元变量。此外,元变量必须是 AST 节点的唯一内容,不支持的写法如 "obj.on$EVENT" 等;对于未命名节点应使用 $$OP,对于零个或多个节点应使用 $$$ARGS。调试方面,可使用 --debug-query 检查 AST 结构以确定正确的 kind 值。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jlholm/noodle/tree/HEAD/.agents/skills/ast-grep

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

ast-grep

工作流程

  1. 编写一个代表目标代码的测试片段
  2. 编写规则(从 pattern 开始,必要时升级为 kind + has/inside)
  3. 使用 --stdin 进行测试,然后再搜索整个代码库
  4. 规则匹配后,搜索整个代码库

关键陷阱

始终在关系规则中使用 stopBy: end

如果不这样做,has/inside 会在第一个不匹配的节点处停止,而不是遍历完整的子树:

# 错误——会漏掉深层嵌套的匹配
has:
  pattern: await $EXPR

# 正确
has:
  pattern: await $EXPR
  stopBy: end

在 shell 中转义元变量

$VAR 会被 shell 解释。要么转义,要么用单引号:

# 双引号:使用反斜杠转义
ast-grep scan --inline-rules "id: test
language: javascript
rule:
  pattern: await \$EXPR" .

# 单引号:无需转义
ast-grep scan --inline-rules 'id: test
language: javascript
rule:
  pattern: await $EXPR' .

元变量必须是 AST 节点的唯一内容

以下写法不起作用:obj.on$EVENT, "Hello $WORLD", a $OP b, $jq

对于未命名节点(运算符、标点符号),请使用 $$OP。对于零个或多个节点,请使用 $$$ARGS。

使用 --stdin 进行测试

echo "async function test() { await fetch(); }" | ast-grep scan --inline-rules 'id: test
language: javascript
rule:
  kind: function_declaration
  has:
    pattern: await $EXPR
    stopBy: end' --stdin

使用 --debug-query 进行调试

当规则不匹配时,检查 AST 以找到正确的 kind 值:

ast-grep run --pattern 'your code here' --lang javascript --debug-query=cst

格式:cst(所有节点)、ast(仅命名节点)、pattern(ast-grep 如何看待你的模式)。

规则语法

完整的规则参考请参见 references/rule_reference.md(包含原子规则、关系规则、复合规则和元变量)。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能