关于 ast-grep
将自然语言描述的代码结构查询转化为经过测试的 ast-grep 搜索规则,指导开发者检查工具、构造示例、搜索仓库并验证结果。
主要功能
- 01检查 ast-grep 是否可用
- 02明确语言与匹配目标
- 03按需检查 AST 结构
- 04用最小示例测试规则
- 05验证仓库搜索结果
适用场景
- 01在代码仓库中查找指定结构
- 02检查结构搜索规则是否误匹配
- 03生成可复用的 ast-grep 规则和结果报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ulpi-io/ skills --skill ast-grep安装后在 Claude Code 中输入/ast-grep确认已加载。
附带文件references/rule_reference.mdreferences/search-recipes.md
详细介绍
不可妥协的规则:
- 确认已安装
ast-grep后再使用它。 - 在搜索代码库前,先创建一个符合目标模式的最小示例。
- 如果节点类型或匹配形状不确定,使用
--debug-query检查 AST。 - 除非有具体理由不这样做,否则在关系规则中添加
stopBy: end。 - 先在示例上测试规则,再对整个代码库运行搜索。
ast-grep 代码搜索
输入
$request:要查找的结构模式,以及已知的语言、排除项或边界情况
目标
通过以下步骤生成可靠的结构化搜索:
- 确认 ast-grep 可用
- 明确目标模式和语言
- 构建可行的最小规则
- 先在示例代码上测试
- 在报告结果前验证代码库中的搜索结果
步骤 0:验证可用性并明确查询
首先使用 ast-grep --version 确认已安装 ast-grep。
如果尚未安装:
- 停止
- 告知用户,此工作流需要
ast-grep - 提供安装说明,不要假装搜索可以继续
然后明确:
- 编程语言
- 哪些内容应该匹配
- 哪些内容不应匹配
- 用户关心的任何边界情况
只有在这些信息不明确到可能导致规则错误时,才使用 AskUserQuestion。
成功标准:已明确 ast-grep 是否可用、使用的语言以及模式意图。
步骤 1:创建最小示例并检查 AST
编写一个应当匹配的最小示例片段。
需要了解以下内容时,使用 --debug-query=cst 或 --debug-query=pattern:
- 实际的节点类型
- 元变量的解析方式
- 目标结构在树中的位置
规则:
- 示例尽可能精简
- 如果节点类型名称或嵌套关系不确定,就检查 AST
- 不要仅仅因为模式“看起来很明显”就跳过这一步
加载 references/rule_reference.md 了解语法细节,并加载 references/search-recipes.md 了解常见命令形式。
成功标准:目标形状已由经过测试的示例表示,并且已充分了解 AST 结构,足以编写规则。
步骤 2:编写可行的最小规则
从最简单的可行规则开始:
- 直接结构匹配优先使用
pattern - 更复杂的结构使用
kind和关系规则 - 仅在需要时使用
all、any或not
规则:
- 除非有意设置更严格的停止条件,否则在
inside和has中添加stopBy: end - 在证明规则不够用之前,保持规则精简
- 使用内联 shell 命令时,正确转义元变量
加载 references/rule_reference.md 了解规则语义。
成功标准:规则语法有效,且对于该问题而言足够简单。
步骤 3:在示例上测试规则
使用 --stdin 或临时文件,针对示例片段测试规则。
检查:
- 是否匹配预期示例
- 是否明显过度匹配
- 关系规则是否遍历了预期范围
如果规则失败:
- 简化规则
- 重新检查 AST
- 调整节点类型名称或规则形状
- 在接触代码库之前重新测试
成功标准:规则能正确匹配已知示例。
步骤 4:搜索代码库并验证结果
规则在示例上生效后,再对代码库运行搜索。
然后验证:
- 匹配总数
- 有代表性的文件路径和行号
- 抽查 3 到 5 处,确认符合预期
- 用户明确提及的边界情况
规则:
- 如果最终发现 Grep 就足够了,应如实说明;但如果已经开始 ast-grep 搜索,就完成当前搜索
- 如果规则变得过于复杂或脆弱,应缩小查询范围,而不是返回未经验证的噪声结果
加载 references/search-recipes.md 了解常见搜索和调试流程。
成功标准:代码库搜索结果可信、可复现,且没有明显噪声。
第 5 步:报告结果和可复用规则
报告:
- 模式描述
- 语言
- 使用的规则类型
- 匹配数量
- 有代表性的文件:行号匹配结果
- 最终可复用规则或命令形式
如果没有找到匹配项,请明确说明,并解释这可能意味着:
- 不存在该模式
- 规则范围有意设得较窄
- 需要进一步澄清
成功标准:用户可以根据你的输出重新运行搜索或优化搜索条件。
约束
- 不要添加
disable-model-invocation;这是一项非破坏性的搜索技能。 - 不要添加
context: fork;用户通常希望结果出现在当前流程中。 - 不要添加
paths:;这是一个通用搜索工作流。 - 如果查询并非简单查询,不要使用未经测试的规则搜索代码仓库。
- 不要在
SKILL.md中内嵌冗长的 CLI 手册、配方目录或故障百科全书。 - 如果普通 Grep 明显足够,就不要使用 ast-grep。
何时加载参考资料
-
references/rule_reference.md用于 ast-grep 规则语法、关系规则、组合规则和元变量语义。 -
references/search-recipes.md用于安装指南、命令模式、常见用例和调试流程。
输出规范
报告:
- 搜索的结构模式
- 使用的语言和规则类型
- 匹配数量和有代表性的文件:行号结果
- 最终规则或可复用的命令形式
- 重要注意事项或后续优化建议