ā” Test analysis skill. Best for: 'what's tested', 'find test coverage', 'audit test quality', 'missing tests', 'edge cases'. Uses claudemem AST with callers analysis for efficient test discovery.
This skill uses claudemem's callers analysis for test coverage investigation.
| Task | claudemem | Native Tools |
|---|---|---|
| Find tests for function | callers shows test files |
Grep *.test.ts |
| Coverage gaps | No test callers = untested | Manual checking |
| Test distribution | Caller analysis | Unknown |
| Test relationships | AST direct mapping | Text search |
Primary commands:
claudemem --agent callers <name> - Find tests that call this functionclaudemem --agent map "test spec" - Map test infrastructureVersion: 3.3.0 Role: QA Engineer / Test Specialist Purpose: Test coverage investigation using AST callers analysis and automated test-gaps detection
You are investigating this codebase as a QA Engineer. Your focus is on:
callers is Perfect for Test AnalysisThe callers command shows you:
# Who calls this function? (tests will appear as callers)
claudemem --agent callers processPayment
# Filter: callers from test files are your tests
# src/services/payment.test.ts:45 ā This is a test!
# Find all test files
claudemem --agent map "test spec describe it"
# Find test utilities
claudemem --agent map "test helper mock stub"
# Find fixtures
claudemem --agent map "fixture factory builder"```
### Test Coverage Gaps (v0.4.0+ Required)
```bash
# Find high-importance untested code automatically
claudemem --agent test-gaps
# Output:
# file: src/services/payment.ts
# line: 45-89
# name: processPayment
# pagerank: 0.034
# production_callers: 4
# test_callers: 0
# ---
# This is CRITICAL - high PageRank but no tests!
Why test-gaps is better than manual analysis:
Handling Empty Results:
GAPS=$(claudemem --agent test-gaps)
if [ -z "$GAPS" ] || echo "$GAPS" | grep -q "No test gaps"; then
echo "Excellent test coverage! All high-importance code has tests."
echo ""
echo "Optional: Check lower-importance code:"
echo " claudemem --agent test-gaps --min-pagerank 0.005"
else
echo "Test Coverage Gaps Found:"
echo "$GAPS"
fi
Limitations Note: Test detection relies on file naming patterns:
*.test.ts, *.spec.ts, *_test.go, etc.Method 1: Automated (v0.4.0+ Required - Recommended)
# Let claudemem find all gaps automatically
GAPS=$(claudemem --agent test-gaps)
if [ -z "$GAPS" ]; then
echo "No high-importance untested code found!"
else
echo "$GAPS"
fi
# Focus on critical gaps only
claudemem --agent test-gaps --min-pagerank 0.05```
**Method 2: Manual (for specific functions, v0.3.0 compatible)**
```bash
# Get callers for a function
claudemem --agent callers importantFunction
# If NO callers from *.test.ts or *.spec.ts files:
# This function has NO tests!
# For each critical function, check callers
claudemem --agent callers authenticateUserclaudemem --agent callers processPaymentclaudemem --agent callers saveToDatabase
# Note which have test callers and which don't
which claudemem && claudemem --version
# Must be 0.3.0+
Use AskUserQuestion (see ultrathink-detective for template)
# Check claudemem installation and index
claudemem --version && ls -la .claudemem/index.db 2>/dev/null
Before proceeding with investigation, verify the index is current:
# First check if index exists
if [ ! -d ".claudemem" ] || [ ! -f ".claudemem/index.db" ]; then
# Use AskUserQuestion to prompt for index creation
# Options: [1] Create index now (Recommended), [2] Cancel investigation
exit 1
fi
# Count files modified since last index
STALE_COUNT=$(find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \) \
-newer .claudemem/index.db 2>/dev/null | grep -v "node_modules" | grep -v ".git" | grep -v "dist" | grep -v "build" | wc -l)
STALE_COUNT=$((STALE_COUNT + 0)) # Normalize to integer
if [ "$STALE_COUNT" -gt 0 ]; then
# Get index time with explicit platform detection
if [[ "$OSTYPE" == "darwin"* ]]; then
INDEX_TIME=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" .claudemem/index.db 2>/dev/null)
else
INDEX_TIME=$(stat -c "%y" .claudemem/index.db 2>/dev/null | cut -d'.' -f1)
fi
INDEX_TIME=${INDEX_TIME:-"unknown time"}
# Get sample of stale files
STALE_SAMPLE=$(find . -type f \( -name "*.ts" -o -name "*.tsx" \) \
-newer .claudemem/index.db 2>/dev/null | grep -v "node_modules" | grep -v ".git" | head -5)
# Use AskUserQuestion (see template in ultrathink-detective)
fi
claudemem index
# Run test-gaps FIRST - it does the work for you
GAPS=$(claudemem --agent test-gaps)
if [ -z "$GAPS" ]; then
echo "No gaps found at default threshold"
echo "Optionally check with lower threshold:"
claudemem --agent test-gaps --min-pagerank 0.005else
# This gives you a prioritized list of:
# - High-PageRank symbols
# - With 0 test callers
# - Sorted by importance
echo "$GAPS"
fi
# Find test configuration
claudemem --agent map "jest vitest mocha config"
# Find test utilities and mocks
claudemem --agent map "mock stub spy helper"```
### Phase 2: Identify Critical Functions
```bash
# Map the feature area
claudemem --agent map "payment processing"
# High-PageRank functions are most critical to test
# For each critical function, check callers
claudemem --agent callers PaymentService
# Look for callers from test files:
# src/services/payment.test.ts:23 ā TEST CALLER
# src/controllers/checkout.ts:45 ā NOT A TEST
# Functions with NO test callers = untested
# Make a list of untested critical functions
# For functions with test callers, read the tests
# Check: Are they testing edge cases? Error paths?
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā TEST INFRASTRUCTURE ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Framework: Vitest 2.x ā
ā Test Files: 156 files (*.spec.ts, *.test.ts) ā
ā Test Utils: src/__tests__/utils/ ā
ā Search Method: claudemem v0.3.0 (callers analysis) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
| Function | Test Callers | Coverage |
|---------------------|--------------|----------|
| authenticateUser | 5 tests | ā
Good |
| processPayment | 3 tests | ā
Good |
| calculateDiscount | 0 tests | ā None |
| sendEmail | 1 test | ā ļø Low |
| updateUserProfile | 0 tests | ā None |
š“ HIGH PRIORITY - No Test Callers:
āāā calculateDiscount (PageRank: 0.034)
āāā callers show: 4 production callers, 0 test callers
āāā updateUserProfile (PageRank: 0.028)
āāā callers show: 3 production callers, 0 test callers
ā ļø MEDIUM PRIORITY - Few Test Callers:
āāā sendEmail (PageRank: 0.021)
āāā callers show: 1 test, no edge case tests
š OBSERVATIONS:
1. calculateDiscount has 4 production callers but 0 test callers
ā Critical business logic untested!
2. sendEmail has 1 test caller
ā Only happy path tested, no error scenarios
3. authenticateUser has 5 test callers
ā Good coverage including edge cases
# Step 1: Map the feature
claudemem --agent map "payment"
# Step 2: For each function, check callers
claudemem --agent callers processPaymentclaudemem --agent callers validateCardclaudemem --agent callers chargeCustomer
# Step 3: Count test callers vs production callers
# Step 1: Find high-PageRank (important) functions
claudemem --agent map
# Step 2: Check callers for each
claudemem --agent callers importantFunc1claudemem --agent callers importantFunc2
# Step 3: Functions with 0 test callers = gap
# Step 1: Find test callers
claudemem --agent callers targetFunction
# Step 2: Read each test file at the caller line
# Step 3: Check: Does test cover edge cases? Errors?
After EVERY claudemem command, validate results:
When checking test coverage:
CALLERS=$(claudemem --agent callers processPayment)
EXIT_CODE=$?
# Check for command failure
if [ "$EXIT_CODE" -ne 0 ]; then
DIAGNOSIS=$(claudemem status 2>&1)
# Use AskUserQuestion for recovery
fi
# Validate we got callers, not an error
if echo "$CALLERS" | grep -qi "error\|failed"; then
# Actual error, not 0 callers
# Use AskUserQuestion
fi
# Count test vs production callers
TEST_CALLERS=$(echo "$CALLERS" | grep -E "\.test\.|\.spec\.|_test\." | wc -l)
PROD_CALLERS=$(echo "$CALLERS" | grep -v -E "\.test\.|\.spec\.|_test\." | wc -l)
# Report coverage ratio
if [ "$TEST_CALLERS" -eq 0 ]; then
echo "WARNING: No test coverage found for this function"
fi
RESULTS=$(claudemem --agent map "test spec describe")
if [ -z "$RESULTS" ]; then
echo "WARNING: No test infrastructure found"
# May indicate:
# 1. Tests in non-standard locations
# 2. Index doesn't include test files
# 3. Wrong query terms
# Use AskUserQuestion
fi
CRITICAL: Never use grep/find/Glob without explicit user approval.
If claudemem fails or returns irrelevant results:
claudemem status// Fallback options (in order of preference)
AskUserQuestion({
questions: [{
question: "claudemem test coverage analysis failed or found no tests. How should I proceed?",
header: "Test Coverage Issue",
multiSelect: false,
options: [
{ label: "Reindex codebase", description: "Run claudemem index (~1-2 min)" },
{ label: "Try different query", description: "Search for different test patterns" },
{ label: "Use grep (not recommended)", description: "Traditional search - loses caller analysis" },
{ label: "Cancel", description: "Stop investigation" }
]
}]
})
See ultrathink-detective skill for complete Fallback Protocol documentation.
| Anti-Pattern | Why Wrong | Correct Approach |
|---|---|---|
grep "test" |
No caller relationships | claudemem --agent callers func |
| Assume tests exist | Miss coverage gaps | Verify with callers analysis |
| Count test files | Doesn't show what's tested | Check callers per function |
| Skip PageRank | Miss critical gaps | Focus on high-PageRank untested |
cmd | head/tail |
Hides test coverage gaps | Use full output |
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā ā ā ā Anti-Pattern 7: Truncating Claudemem Output ā ā ā ā FORBIDDEN (any form of output truncation): ā ā ā BAD: claudemem --agent map "query" | head -80 ā ā ā BAD: claudemem --agent callers X | tail -50 ā ā ā BAD: claudemem --agent search "x" | grep -m 10 "y" ā ā ā BAD: claudemem --agent map "q" | awk 'NR <= 50' ā ā ā BAD: claudemem --agent callers X | sed '50q' ā ā ā BAD: claudemem --agent search "x" | sort | head -20 ā ā ā BAD: claudemem --agent map "q" | grep "pattern" | head -20 ā ā ā ā CORRECT (use full output or built-in limits): ā ā ā GOOD: claudemem --agent map "query" ā ā ā GOOD: claudemem --agent search "x" -n 10 ā ā ā GOOD: claudemem --agent map "q" --tokens 2000 ā ā ā GOOD: claudemem --agent search "x" --page-size 20 --page 1 ā ā ā GOOD: claudemem --agent context Func --max-depth 3 ā ā ā ā WHY: Output is pre-optimized; truncation hides critical results ā ā ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
After completing investigation, report search feedback to improve future results.
Report feedback ONLY if you used the search command during investigation:
| Result Type | Mark As | Reason |
|---|---|---|
| Read and used | Helpful | Contributed to investigation |
| Read but irrelevant | Unhelpful | False positive |
| Skipped after preview | Unhelpful | Not relevant to query |
| Never read | (Don't track) | Can't evaluate |
# Track during investigation
SEARCH_QUERY="your original query"
HELPFUL_IDS=""
UNHELPFUL_IDS=""
# When reading a helpful result
HELPFUL_IDS="$HELPFUL_IDS,$result_id"
# When reading an unhelpful result
UNHELPFUL_IDS="$UNHELPFUL_IDS,$result_id"
# Report at end of investigation (v0.8.0+ only)
if claudemem feedback --help 2>&1 | grep -qi "feedback"; then
timeout 5 claudemem feedback \
--query "$SEARCH_QUERY" \
--helpful "${HELPFUL_IDS#,}" \
--unhelpful "${UNHELPFUL_IDS#,}" 2>/dev/null || true
fi
Include in investigation report:
Search Feedback: [X helpful, Y unhelpful] - Submitted (v0.8.0+)
callers reveals test coverage - Tests are just callers from test filesMaintained by: MadAppGang Plugin: code-analysis v2.7.0 Last Updated: December 2025 (v3.3.0 - Cross-platform compatibility, inline templates, improved validation)