Claude-skill-registry ast-grep Structural Code Search & Refactoring
Find and replace code patterns structurally using ast-grep. Use when you need to match code by its AST structure (not just text), such as finding all functions with specific signatures, replacing API patterns across files, or detecting code anti-patterns that regex cannot reliably match.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/ast-grep-search" ~/.claude/skills/majiayu000-claude-skill-registry-ast-grep-structural-code-search-refactoring && rm -rf "$T"
skills/data/ast-grep-search/SKILL.mdast-grep Structural Code Search & Refactoring
Structural code search and refactoring using
ast-grep — matches code by its AST (abstract syntax tree) rather than text patterns.
When to Use ast-grep vs Grep/ripgrep
| Use ast-grep when... | Use grep/rg when... |
|---|---|
| Pattern depends on code structure | Simple text or regex match |
| Need to match any number of arguments | Searching logs, docs, config |
| Refactoring across many files | One-off literal string search |
| Finding anti-patterns (empty catch, etc.) | Language doesn't matter |
| Replacing while preserving variables | Quick filename/line check |
Decision rule: If your search pattern contains wildcards for "any expression," "any arguments," or "any function name," use ast-grep.
Pattern Syntax
| Pattern | Matches | Example |
|---|---|---|
| Single AST node | |
| Zero or more nodes | |
| Single node (no capture) | |
| Same node repeated | Finds (not ) |
Essential Commands
Search for Patterns
# Find structural patterns ast-grep -p 'console.log($$$)' --lang js ast-grep -p 'def $FUNC($$$): $$$' --lang py ast-grep -p 'fn $NAME($$$) -> $RET { $$$ }' --lang rs # Search in specific directory ast-grep -p 'import $PKG' --lang js src/ # JSON output for parsing ast-grep -p 'pattern' --lang js --json=compact
Search and Replace
# Preview changes (default - shows matches) ast-grep -p 'var $V = $X' -r 'const $V = $X' --lang js # Apply changes to all files ast-grep -p 'var $V = $X' -r 'const $V = $X' --lang js -U # Interactive review ast-grep -p 'oldAPI($$$ARGS)' -r 'newAPI($$$ARGS)' --lang py -i # Convert function syntax ast-grep -p 'function($$$ARGS) { return $EXPR }' \ -r '($$$ARGS) => $EXPR' --lang js -U # Update import paths ast-grep -p "import $NAME from '@old/$PATH'" \ -r "import $NAME from '@new/$PATH'" --lang ts -U
Language Codes
| Code | Language | Code | Language |
|---|---|---|---|
| JavaScript | | Python |
| TypeScript | | Rust |
| JSX | | Go |
| TSX | | Java |
| C++ | | Ruby |
| C | | PHP |
Common Patterns by Language
JavaScript/TypeScript
# Find React hooks ast-grep -p 'const [$STATE, $SETTER] = useState($INIT)' --lang jsx # Find async functions ast-grep -p 'async function $NAME($$$) { $$$ }' --lang js # Find type assertions ast-grep -p '$EXPR as $TYPE' --lang ts # Find empty catch blocks ast-grep -p 'try { $$$ } catch ($E) { }' --lang js # Find eval usage (security) ast-grep -p 'eval($$$)' --lang js # Find innerHTML (XSS risk) ast-grep -p '$ELEM.innerHTML = $$$' --lang js # Find specific imports ast-grep -p "import { $$$IMPORTS } from '$PKG'" --lang js
Python
# Find class definitions ast-grep -p 'class $NAME($$$BASES): $$$' --lang py # Find decorated functions ast-grep -p '@$DECORATOR\ndef $FUNC($$$): $$$' --lang py # Find dangerous shell calls ast-grep -p 'os.system($$$)' --lang py # Find SQL concatenation (injection risk) ast-grep -p '"SELECT * FROM " + $VAR' --lang py
Rust
# Find unsafe blocks ast-grep -p 'unsafe { $$$ }' --lang rs # Find impl blocks ast-grep -p 'impl $TRAIT for $TYPE { $$$ }' --lang rs # Find public functions ast-grep -p 'pub fn $NAME($$$) { $$$ }' --lang rs
Go
# Find goroutines ast-grep -p 'go $FUNC($$$)' --lang go # Find defer statements ast-grep -p 'defer $FUNC($$$)' --lang go # Find error handling ast-grep -p 'if err != nil { $$$ }' --lang go
Common Refactoring Recipes
# Replace deprecated API calls ast-grep -p 'oldAPI.$METHOD($$$)' -r 'newAPI.$METHOD($$$)' --lang js -U # Rename a function across files ast-grep -p 'oldName($$$ARGS)' -r 'newName($$$ARGS)' --lang py -U # Remove console.log statements ast-grep -p 'console.log($$$)' -r '' --lang js -U # Convert require to import ast-grep -p 'const $NAME = require($PKG)' \ -r 'import $NAME from $PKG' --lang js -i # Add error handling wrapper ast-grep -p 'await $EXPR' \ -r 'await $EXPR.catch(handleError)' --lang ts -i
Command-Line Flags
| Flag | Purpose |
|---|---|
| Search pattern |
| Replacement pattern |
| Target language |
| Review changes one by one |
| Apply all changes |
| JSON output (, , ) |
| Lines after match |
| Lines before match |
| Lines around match |
| Debug pattern parsing |
YAML Rules (Scan Mode)
For reusable rules, use
ast-grep scan with YAML configuration:
# Scan with config ast-grep scan -c sgconfig.yml # Run specific rule ast-grep scan -r rule-name # Initialize a rules project ast-grep new project my-linter ast-grep new rule no-console-log
Minimal rule file:
id: no-empty-catch language: JavaScript severity: warning message: Empty catch block hides errors rule: pattern: try { $$$ } catch ($E) { } fix: | try { $$$ } catch ($E) { console.error($E) }
For comprehensive YAML rule syntax, constraints, transformations, and testing, see REFERENCE.md.
Agentic Optimizations
| Context | Command |
|---|---|
| Quick structural search | |
| Count matches | |
| File list only | |
| Batch refactor | |
| Scan with rules | |
| Debug pattern | |
Quick Reference
# 1. Search for pattern ast-grep -p 'pattern' --lang js src/ # 2. Preview rewrite ast-grep -p 'old' -r 'new' --lang js # 3. Apply rewrite ast-grep -p 'old' -r 'new' --lang js -U # 4. Scan with rules ast-grep scan -c sgconfig.yml # 5. Debug pattern ast-grep -p 'pattern' --debug-query --lang js
Context7 Integration
For latest AST-Grep documentation, follow this two-step process.
Step 1: Use mcp__context7__resolve-library-id with query ast-grep to resolve the library identifier.
Step 2: Use mcp__context7__get-library-docs with the resolved library ID to fetch current documentation.
Reference
For additional information, consult the AST-Grep Official Documentation at ast-grep.github.io, the AST-Grep GitHub Repository at github.com/ast-grep/ast-grep, the Pattern Playground at ast-grep.github.io/playground.html, and the Rule Configuration Reference at ast-grep.github.io/reference/yaml.html.