Code Discovery & Impact Analysis
Quick Reference: Discover patterns and find all usages before making changes.
Overview
This skill ensures Claude discovers both how to change code (patterns) and what needs changing (usages) before making modifications.
Two-Phase Process:
- Pattern Discovery - Understand how similar code is organized (search_code)
- Usage Discovery - Find ALL places that need updating (find_usage)
Prevents:
- Incomplete refactors (missing usages)
- Assumption-based coding (ignoring project patterns)
- Breaking changes (unknown dependencies)
- Inconsistent implementations (not following conventions)
When to Use This Skill
Automatically invoke BEFORE:
- Renaming functions, classes, variables, or types
- Refactoring code structure
- Changing function/method signatures
- Moving or reorganizing files
- Modifying shared utilities or common code
- Updating types/interfaces
- Making architectural changes
- Adding new features (discover similar patterns first)
Manual invocation when:
- Uncertain about project conventions
- Need to understand how similar code is structured
- Planning major changes
- Reviewing code for completeness
Depth Levels
CRITICAL: The tools behave differently based on maxResults:
Pattern Discovery (search_code)
- maxResults 1-3: Returns FULL CODE CONTENT (
contentIncluded: true) - maxResults 4+: Returns ONLY METADATA - no code (
contentIncluded: false)
Recommendation: Always use 1-3 for pattern discovery to see actual code
Usage Discovery (find_usage)
- All levels: Always includes context (surrounding code lines)
- No difference in content quality between 1, 10, or 50 results
Recommendation: Use 10-15 by default, increase only if needed
Minimal (maxResults: 1)
Pattern Discovery: Returns one complete code example Usage Discovery: Returns one usage with context
Use when:
- Verifying a known pattern (just need confirmation)
- Checking if something exists
- Very localized, low-risk changes
Light (maxResults: 2-3) - DEFAULT for search_code
Pattern Discovery: Returns 2-3 complete code examples with variations Usage Discovery: Returns 2-3 usages with context
Use when:
- Learning how code is structured (see variations)
- Understanding naming/organization conventions
- Need to see different approaches
- Adding new features following existing patterns
Why 2-3 for patterns: This is the sweet spot - gets actual code content while showing variations
Thorough (maxResults: 10-15) - DEFAULT for find_usage
Pattern Discovery: ⚠️ NOT RECOMMENDED - returns metadata only, no code Usage Discovery: Returns 10-15 usages with full context
Use when:
- Finding all usages before refactoring
- Renaming functions/classes/variables
- Moving files or modules
- Changing shared utilities
- Complete impact analysis needed
⚠️ Context Management:
- search_code: Stay at 1-3 to get actual code
- find_usage: Use 10-15 by default
- Only increase to 20-50 if
results.length == maxResults(indicates more exist)
Discovery Workflow
Step 1: Context Assessment
Ask yourself:
-
What am I changing?
- Function/class/variable name?
- File structure/organization?
- Type/interface definition?
- Shared utility or common code?
-
What's the expected impact?
- Localized (same file/module)?
- Module-wide (same feature area)?
- Cross-cutting (used across codebase)?
-
Which depth level?
- Minimal (1): Known patterns, just need reference
- Light (2-3): Learning patterns, most changes (DEFAULT for patterns)
- Thorough (4-15): Finding all usages, refactoring (DEFAULT for usages)
Step 2: Pattern Discovery
Goal: Understand how to make changes correctly
Use search_code with appropriate maxResults (≤3 for code content):
// Find similar classes/functions
search_code({
query: "Service",
types: ["class"],
pathPattern: "services",
maxResults: 3 // get actual code content
})
// Find similar file types
search_code({
query: "repository",
pathPattern: "modules",
maxResults: 2 // light search, see variations
})
Document findings:
- File naming pattern
- Organization pattern (directory structure)
- Code structure (classes? functions? decorators?)
- Import patterns
- Naming conventions
Step 3: Usage Discovery
Goal: Find ALL places that need updating
Use find_usage with appropriate maxResults (context always included):
// Find all usages before renaming
find_usage({
identifier: "oldFunctionName",
maxResults: 15, // start here, increase if results.length == maxResults
exactMatch: true
})
// Find usages in specific area
find_usage({
identifier: "ClassName",
pathPattern: "modules/feature",
maxResults: 10 // context always included regardless of count
})
⚠️ Validate completeness:
- If
results.length == maxResults: Increase limit and search again - If
results.length < maxResults: All usages found - Check for direct usages, indirect usages, dynamic usages, test files
Step 4: Impact Analysis
Create a comprehensive map:
- Files affected: [count]
- Modules impacted: [list]
- Change complexity: [low/medium/high]
- Risk assessment: [rationale]
- Required changes: [detailed list with file:line]
Step 5: Implementation with Validation
- Make all identified changes
- Follow discovered patterns
- Validate completeness:
// Verify old references are gone find_usage({ identifier: "oldName", maxResults: 10 }) // Expected: 0 results // Verify new references are correct find_usage({ identifier: "newName", maxResults: 10 }) // Check for errors check_errors({ pathPattern: "[affected area]" })
Common Scenarios
Scenario 1: Renaming a Function
1. find_usage({ identifier: "oldFunctionName", maxResults: 15 })
(increase if results.length == 15)
2. Document all locations (file:line)
3. Update function definition
4. Update all call sites
5. Validate: find_usage("oldFunctionName") → 0 results
6. Validate: find_usage("newFunctionName") → all updated
Scenario 2: Refactoring a Module
1. Pattern discovery: search_code for similar modules (maxResults: 3)
Get actual code to see structure
2. Usage discovery: find_usage for module exports (maxResults: 15)
3. Map all imports and dependencies
4. Plan refactor following discovered patterns
5. Update all usages
6. Validate with check_errors
Scenario 3: Moving a File
1. Pattern discovery: where do similar files live?
search_code({ query: "[file type]", maxResults: 2-3 })
Get code to see organization
2. Find all imports: find_usage for file exports (maxResults: 15)
3. Move file to new location
4. Update all import statements
5. Verify: check_errors()
Scenario 4: Changing Function Signature
1. find_usage({ identifier: "functionName", maxResults: 15 })
2. Analyze how function is currently called (context included in results)
3. Update function signature
4. Update every call site with new parameters
5. Validate with check_errors (catches missed call sites)
Scenario 5: Adding New Feature
1. Pattern discovery: find similar features
search_code({ query: "[similar feature]", maxResults: 2-3 })
Get actual code to see implementation
2. Document patterns from code content:
- File organization
- Naming conventions
- Code structure
- Import patterns
3. Implement new feature following patterns
4. No usage discovery needed (new code)
Output Template
Report discoveries using this format:
## Discovery & Impact Report
**Change:** [What I'm changing]
**Depth:** [quick/balanced/comprehensive]
**Impact:** [localized/module-wide/cross-cutting]
### Phase 1: Pattern Discovery
**Found:** [N] similar patterns
1. **File Organization:** [pattern]
- Location: [path pattern]
- Example: [file path]
2. **Naming:** [pattern]
- Examples: [list]
3. **Structure:** [description]
- Approach: [classes/functions/etc.]
4. **Dependencies:** [import pattern]
**Recommendation:** [How to structure the change]
### Phase 2: Usage Discovery
**Found:** [N] usages across [M] files
| File | Line | Context |
|------|------|---------|
| [path] | [line] | [usage] |
**Completeness:**
- [✓/⚠️] All usages found
- [✓/⚠️] Indirect dependencies checked
- [✓/⚠️] Test files included
### Impact Analysis
**Affected:** [modules/files]
**Complexity:** [low/medium/high]
**Risk:** [low/medium/high] - [reason]
**Changes Required:**
1. [file:line] - [change]
2. [file:line] - [change]
### Implementation Plan
1. [Step 1]
2. [Step 2]
**Validation:**
1. find_usage([old]) → 0 results
2. find_usage([new]) → all updated
3. check_errors() → no issues
**Ready:** [yes/need clarification]
Best Practices
Always Do:
- ✓ Use find_usage before renaming anything
- ✓ Check if results.length == maxResults (may need higher limit)
- ✓ Document all findings before making changes
- ✓ Validate completeness after changes
- ✓ Follow discovered patterns, don't assume generic ones
- ✓ Include test files in usage discovery
Never Do:
- ✗ Assume generic patterns without discovering project-specific ones
- ✗ Rename without running find_usage first
- ✗ Stop at maxResults if results.length == maxResults
- ✗ Skip validation after changes
- ✗ Ignore edge cases or unusual patterns
When Uncertain:
- Ask the user for clarification
- Present multiple discovered patterns
- Run comprehensive search (higher maxResults)
- Document what you found and what's unclear
Integration with Existing Skills
Works alongside:
- api-design-patterns - API-specific pattern validation
- separation-of-responsibilities - Layer separation checks
- user-access-control - Authorization pattern validation
- module-architecture - Module structure validation
Workflow:
- Use THIS skill first (discover + find usages)
- Make changes following discovered patterns
- Use specific skills for domain validation
- Use code-evaluation for final check
Checklist
Before making changes:
- [ ] Ran pattern discovery (search_code)
- [ ] Documented patterns found
- [ ] Ran usage discovery (find_usage)
- [ ] Checked if more usages exist (results.length < maxResults)
- [ ] Created impact analysis
- [ ] Planned all required changes
After making changes:
- [ ] Updated all identified locations
- [ ] Validated old references gone (find_usage → 0)
- [ ] Validated new references correct
- [ ] Ran check_errors
- [ ] Followed discovered patterns
Summary
Key Takeaways:
- search_code: Use maxResults 1-3 to get actual code content (4+ returns metadata only)
- find_usage: Always includes context, use 10-15 by default
- Always discover patterns before assuming generic ones
- Find ALL usages before renaming or refactoring
- Validate completeness after changes
- If results.length == maxResults, search again with higher limit
- Pattern discovery + usage discovery = complete changes
Remember: This skill prevents incomplete refactors and ensures changes follow project conventions. Use it proactively, not reactively.
微信扫一扫