| name | file-search |
| description | This skill should be used when agents need to search codebases for text patterns or structural code patterns. Provides fast search using ripgrep for text and ast-grep for syntax-aware code search. |
| license | MIT |
File Search Skill
Search code efficiently using ripgrep for text patterns and ast-grep for structural code patterns.
Purpose
The file-search skill provides access to two powerful search tools:
- ripgrep (rg): Ultra-fast text search with regex support for finding strings, patterns, and text matches
- ast-grep (sg): Syntax-aware structural search for finding code patterns based on abstract syntax trees
Use these tools to understand codebases, find usage patterns, analyze impact of changes, and locate specific code constructs. Both tools are significantly faster than traditional grep or find commands.
When to Use This Skill
Use the file-search skill when:
- Understanding a new codebase (finding entry points, key classes)
- Finding all usages of a function, class, or variable before refactoring
- Locating specific code patterns (error handling, API calls, etc.)
- Searching for security issues (hardcoded credentials, SQL queries, eval usage)
- Analyzing dependencies and imports
- Finding TODOs, FIXMEs, or code comments
Choose ripgrep for:
- Text-based searches (strings, comments, variable names)
- Fast, simple pattern matching across many files
- When the exact code structure doesn't matter
Choose ast-grep for:
- Structural code searches (function signatures, class definitions)
- Syntax-aware matching (understanding code semantics)
- Complex refactoring (finding specific code patterns)
Invoking Search Tools
Use the execute_command tool to run ripgrep and ast-grep:
execute_command("rg 'pattern' --type py src/")
execute_command("sg --pattern 'class $NAME { $$$ }' --lang python")
Both tools are pre-installed and available via shell execution.
Targeting Your Searches
CRITICAL: Always start with targeted, narrow searches to avoid overwhelming results. Getting thousands of matches makes analysis impossible and wastes tokens.
These strategies apply to both ripgrep and ast-grep.
Scope-Limiting Strategies
Apply these strategies from the start to target searches effectively:
-
Specify File Types/Languages: Always filter by language
rg "function" --type py --type js
sg --pattern 'function $NAME($$$) { $$$ }' --lang js
-
Target Specific Directories: Search in likely locations first
rg "LoginService" src/services/
sg --pattern 'class LoginService { $$$ }' src/services/
-
Use Specific Patterns: Make patterns as specific as possible
rg "user"
rg "class.*User.*Service" --type py
sg --pattern '$X'
sg --pattern 'class $NAME extends UserService { $$$ }' --lang js
-
Limit Result Count: Use head to cap results
rg "import" --type py | head -20
rg "TODO" --count
sg --pattern 'import $X from $Y' --lang js | head -20
Progressive Search Refinement
When exploring unfamiliar code, use this workflow:
Ripgrep example:
rg "pattern" --count --type py
rg "pattern" --type py src/ --glob '!tests'
rg "pattern" --type py src/ | head -30
rg "pattern" --type py src/specific_module/
AST-grep example:
sg --pattern 'function $NAME($$$) { $$$ }' --lang js | head -10
sg --pattern 'function $NAME($$$) { $$$ }' --lang js src/
sg --pattern 'async function $NAME($$$) { $$$ }' --lang js src/
sg --pattern 'async function $NAME($$$) { $$$ }' --lang js src/services/
When You Get Too Many Results
If a search returns hundreds of matches (applies to both rg and sg):
- Add file type/language filters:
--type py (rg) or --lang python (sg)
- Narrow directory scope: Search
src/ instead of .
- Make pattern more specific: Add context around the pattern
- Use word boundaries:
-w flag for whole words only (rg)
- Pipe to head: Limit output with
| head -50
- Exclude test files:
--glob '!*test*' (rg) or avoid test directories (sg)
Example of refinement:
rg "error"
rg "error" --type py
rg "error" --type py src/
rg "raise.*Error" --type py src/
rg "raise.*Error" --type py src/services/
How to Use
Ripgrep (rg)
rg "pattern" --type py --type js
-i
-w
-l
-n
-C 3
--count
--glob '!dir'
rg "function.*login" --type js src/
rg -i "TODO" --count
rg "auth|login|session" --type py
AST-Grep (sg)
sg --pattern 'function $NAME($$$) { $$$ }' --lang js
$VAR
$$$
sg --pattern 'class $NAME { $$$ }' --lang python
sg --pattern 'import $X from $Y' --lang js
sg --pattern 'async function $NAME($$$) { $$$ }' src/
Common Search Patterns
rg -i "password\s*=\s*['\"]" --type py
rg "\beval\(" --type js
rg "TODO|FIXME|HACK"
sg --pattern 'class $NAME { $$$ }' --lang python
sg --pattern 'try { $$$ } catch ($E) { $$$ }' --lang js
rg "from requests import" --type py
rg "require\(['\"]" --type js
rg "\.old_method\(" --type py
rg "@deprecated" -A 5
File Type Filters
Common ripgrep file types: py, js, ts, rust, go, java, c, cpp, html, css, json, yaml, md
Use --type-list to see all available types, or define custom types:
rg --type-add 'config:*.{yml,yaml,toml,ini}' --type config "pattern"
Performance Tips
See "Targeting Your Searches" section for comprehensive strategies. Key tips:
rg "pattern" src/
rg "pattern" --type py --type js
rg "pattern" --glob '!{node_modules,venv,.git}'
rg -F "exact string"
rg "pattern" --count --type py
Best Practices
- Start Narrow, Then Broaden: Use specific patterns, file types, and directory scope from the start
- Count Before Viewing: Use
--count or | head -N to preview result volume
- Always Specify File Types: Use
--type (rg) or --lang (sg) to filter by language
- Exclude Common Noise: Add
--glob '!{node_modules,venv,.git,dist,build}' habitually
- Combine Tools: Use
rg for text patterns, sg for structural code patterns
- Use Context Strategically: Add
-C N for surrounding lines, but be mindful of output volume
Troubleshooting
- No matches found: Check file type filters, try
-i for case-insensitive, search partial pattern first
- Too slow: Exclude directories with
--glob, limit file types with --type, narrow search path
- AST-grep issues: Verify
--lang is correct, try simpler pattern, use rg to verify code exists
Resources