ast-grep — busca estrutural de código

Busca estrutural de código via ast-grep — use quando a forma do código e as relações entre elementos importam, não apenas o texto. Ex.: 'encontrar funções async sem tratamento de erro', 'refatorar foo(a, b) para foo({ a, b })'. Use Grep para buscas simples por nome.

O que é ast-grep — busca estrutural de código?

Esta skill fornece uma interface para o ast-grep, uma ferramenta de busca e refatoração baseada em AST (Árvore Sintática Abstrata). Diferente de ferramentas de busca textual como grep, o ast-grep entende a estrutura do código, permitindo encontrar padrões como 'funções async sem tratamento de erro' ou transformar chamadas de função como `foo(a, b)` em `foo({ a, b })`. A skill descreve um fluxo de trabalho que começa com a criação de um snippet de teste para validar a regra de busca, depois a escrita da regra usando padrões (`pattern`) e relações sintáticas (`has`, `inside`), seguido de testes com `--stdin` antes de aplicar a busca no código real. Destaca também 'gotchas' cruciais, como o uso obrigatório de `stopBy: end` em regras relacionais para evitar que a busca pare no primeiro nó não correspondente, a necessidade de escapar metavariáveis `$VAR` no shell, e a limitação de que metavariáveis devem ser o conteúdo único de um nó AST. A skill é útil para desenvolvedores que usam agentes de IA como Claude Code, Cursor ou Codex para realizar refatorações e buscas estruturais precisas em bases de código JavaScript/TypeScript e outras linguagens suportadas pelo ast-grep.

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

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

ast-grep

Fluxo de Trabalho

  1. Escreva um snippet de teste representando o código alvo
  2. Escreva a regra (comece com pattern, evolua para kind + has/inside se necessário)
  3. Teste com --stdin antes de buscar no código
  4. Busque no código assim que a regra corresponder

Armadilhas Críticas

Sempre use stopBy: end em regras relacionais

Sem isso, has/inside param no primeiro nó não correspondente em vez de percorrer toda a subárvore:

# ERRADO — não encontrará correspondências aninhadas profundamente
has:
  pattern: await $EXPR

# CERTO
has:
  pattern: await $EXPR
  stopBy: end

Escape metavariáveis no shell

$VAR é interpretado pelo shell. Escape ou use aspas simples:

# Com aspas duplas: escape com barra invertida
ast-grep scan --inline-rules "id: test
language: javascript
rule:
  pattern: await \$EXPR" .

# Com aspas simples: nenhum escape necessário
ast-grep scan --inline-rules 'id: test
language: javascript
rule:
  pattern: await $EXPR' .

Metavariáveis devem ser o conteúdo único de um nó AST

Isso não funciona: obj.on$EVENT, "Hello $WORLD", a $OP b, $jq

Use $$OP para nós não nomeados (operadores, pontuação). Use $$$ARGS para zero ou mais nós.

Testando com --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

Depurando com --debug-query

Quando as regras não correspondem, inspecione a AST para encontrar os valores corretos de kind:

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

Formatos: cst (todos os nós), ast (apenas nomeados), pattern (como o ast-grep vê seu padrão).

Sintaxe de regras

Veja references/rule_reference.md para a referência completa de regras (regras atômicas, relacionais, compostas e metavariáveis).

Individual skills in this repo

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

Habilidades Relacionadas