| name | codebase-navigator |
| description | Semantic code search using osgrep for understanding codebases, finding implementations, and navigating large projects. Use when asked "where is", "how does", "find the code that", or any question about code location or implementation. |
Codebase Navigator
Semantic code search powered by osgrep - find code by meaning, not just keywords.
When to Use
Invoke when user:
- Asks "where is [feature] implemented?"
- Asks "how does [component] work?"
- Wants to "find the code that handles [task]"
- Needs to understand codebase architecture
- Searches for implementation patterns
Core Workflow
1. Check Index Freshness (Auto-Refresh)
Before searching, check if index is stale (>4 hours):
osgrep list
STORE=~/.osgrep/data/YOUR-STORE.lance
STORE_AGE=$(( $(date +%s) - $(stat -f %m "$STORE") ))
if [ $STORE_AGE -gt 14400 ]; then
echo "Index is $(( STORE_AGE / 3600 )) hours old - refreshing..."
osgrep index
fi
Quick version: If unsure, just use --sync:
osgrep search "query" --sync
2. First-Time Setup
If no store exists for current repo:
osgrep list
osgrep doctor
osgrep index
3. Search Semantically
Basic search:
osgrep search "natural language description of what you're looking for"
Tuned search:
osgrep search "query" --max-count 10
osgrep search "query" --per-file 3
osgrep search "query" --content
osgrep search "query" --compact
osgrep search "query" --scores
osgrep search "query" --json
3. Synthesize Results
DO NOT dump raw osgrep output. Instead:
- Read the relevant file snippets
- Understand the code in context
- Explain to user in plain language
- Cite specific files and line numbers
Query Formulation
Semantic queries work best. Transform user questions:
| User asks | osgrep query |
|---|
| "Where's the auth?" | "authentication logic and user login" |
| "How do we handle errors?" | "error handling and exception management" |
| "Find the API endpoints" | "HTTP routes and API endpoint definitions" |
| "Database queries" | "database queries and SQL execution" |
| "Config loading" | "configuration loading and environment variables" |
Tips for better queries:
- Use descriptive phrases, not keywords
- Include synonyms: "auth" → "authentication logic and user login"
- Describe the purpose: "code that validates user input"
- Be specific about what you want: "function that calculates total price"
Output Modes
Default Mode
Shows snippet preview with line numbers:
📂 src/auth/login.ts
1 │ export async function login(username: string, password: string) {
2 │ const user = await findUser(username);
Content Mode (--content)
Shows full chunk content for deeper context.
Compact Mode (--compact)
File paths only - useful for getting quick overview:
📂 src/auth/login.ts
📂 src/auth/session.ts
📂 src/middleware/auth.ts
JSON Mode (--json)
Machine-readable for programmatic use.
Scores Mode (--scores)
Shows relevance scores (0-1) - useful for understanding match quality.
Advanced Usage
Keep Index Fresh
osgrep indexes can become stale. Refresh regularly, especially after:
- Pulling new code
- Creating/deleting files
- Major refactoring
osgrep search "query" --sync
osgrep index
Symptom of stale index: Known files not appearing in results, or deleted files still showing up.
Background Server
For large codebases with frequent changes:
osgrep serve
osgrep serve --port 8080
Multiple Stores
Work with specific indexed stores:
osgrep --store myproject.lance search "query"
Query Refinement
When first search returns too many/wrong results:
Step 1: Check result quality
osgrep search "query" --scores
Step 2: Narrow with domain terms
❌ "packaging workflow" → finds ArtifactsBuilder, MCPBuilder
✅ "skill packaging automation" → finds SkillPackager
Step 3: Add specificity
❌ "validation" → too broad (25+ files)
✅ "YAML frontmatter validation for skills" → targeted
Step 4: Try synonyms if nothing found
❌ "auth" → too terse
✅ "authentication login session user credentials" → covers variations
osgrep vs grep: Decision Guide
| Use osgrep when... | Use grep/rg when... |
|---|
| Searching by concept | Searching for exact strings |
| "Where is auth handled?" | "Find TODO:" |
| "How does caching work?" | "Find sha256" |
| Unknown function names | Known function names |
| Architecture questions | Error message lookup |
| Understanding code purpose | Finding specific identifiers |
Rule of thumb: If you could type the exact string, use grep. If you're describing what code does, use osgrep.
Combining Tools
osgrep + Glob (file types)
osgrep finds code that mentions Python, not just .py files:
osgrep search "python data processing" --compact
osgrep + grep (refine)
osgrep search "checksum verification"
grep -r "sha256" --include="*.sh"
osgrep + Read (understand)
osgrep search "error handling middleware" --compact
Anti-Patterns
DON'T:
- Use osgrep for exact string matches (use grep/rg instead)
- Dump raw output without synthesis
- Skip indexing and wonder why searches fail
- Use single keywords ("auth") instead of phrases ("authentication handling")
- Expect osgrep to find technical literals like "sha256", "TODO:", error codes
DO:
- Formulate queries as natural language descriptions
- Check
osgrep list if searches return nothing
- Use
--content when you need more context
- Combine with file reading for full understanding
- Use
--scores to assess match quality
- Refine queries iteratively when results are poor
Example Session
User: "Where do we calculate shipping costs?"
Process:
osgrep search "shipping cost calculation and pricing logic"
Results show: src/orders/shipping.ts, src/utils/pricing.ts
Response:
"Shipping costs are calculated in src/orders/shipping.ts:45-67, which uses the calculateShipping() function. This calls pricing utilities from src/utils/pricing.ts for rate lookups. The calculation considers weight, distance, and shipping method."
References
For query patterns and examples:
references/query-patterns.md - Common query formulations
references/troubleshooting.md - Common issues and fixes