// Automated code review analyzing security, performance, maintainability, and test coverage. Activated during code reviews or when conducting analysis.
| name | code-review |
| description | Automated code review analyzing security, performance, maintainability, and test coverage. Activated during code reviews or when conducting analysis. |
| allowed-tools | ["Read","Grep","Glob"] |
This skill provides comprehensive automated code review with focus on security, performance, maintainability, and test coverage.
Check for:
Common Vulnerabilities:
// โ SQL Injection risk
const query = `SELECT * FROM users WHERE id = ${userId}`;
// โ
Use parameterized queries
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);
// โ XSS vulnerability
element.innerHTML = userInput;
// โ
Sanitize input
element.textContent = userInput;
// or use a sanitization library
// โ Hardcoded secret
const API_KEY = "sk_live_abc123xyz789";
// โ
Use environment variables
const API_KEY = process.env.API_KEY;
Check for:
Common Issues:
// โ N+1 query problem
for (const user of users) {
const posts = await db.query('SELECT * FROM posts WHERE user_id = ?', [user.id]);
}
// โ
Single query with JOIN
const usersWithPosts = await db.query(`
SELECT users.*, posts.*
FROM users
LEFT JOIN posts ON users.id = posts.user_id
`);
// โ Unnecessary re-renders
function Component({ data }) {
const processedData = expensiveOperation(data); // Runs every render
return <div>{processedData}</div>;
}
// โ
Memoization
function Component({ data }) {
const processedData = useMemo(() => expensiveOperation(data), [data]);
return <div>{processedData}</div>;
}
Check for:
Metrics:
// โ High complexity (complexity: 10+)
function processOrder(order) {
if (order.type === 'standard') {
if (order.amount > 100) {
if (order.customer.isPremium) {
if (order.items.length > 5) {
// Deep nesting continues...
}
}
}
}
}
// โ
Refactored (complexity: 3)
function processOrder(order) {
if (!isProcessable(order)) {
return handleInvalidOrder(order);
}
const discount = calculateDiscount(order);
return applyDiscount(order, discount);
}
function isProcessable(order) {
return order.type === 'standard' && order.amount > 0;
}
Check for:
Coverage Goals:
๐ Code Analysis Results
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ Performance
โ
3 optimization opportunities found
- UsersList component: Recommend React.memo (line 45)
- API call results: Add caching (line 128)
- Array operations: Parallelize with Promise.all (line 201)
๐ Security
โ
No critical issues detected
โ ๏ธ 1 warning
- Input validation: Add sanitization for user-generated content (line 89)
๐ ๏ธ Maintainability
โ ๏ธ 2 method extractions recommended
- validateUserInput: Complexity 15 โ recommend <10 (line 156)
- processPaymentData: Length 120 lines โ recommend <50 (line 234)
โ
Test Coverage
๐ 85% (target: 90%)
- Add 3 error handling test cases
- Test invalid email format (auth.test.ts)
- Test network timeout (api.test.ts)
- Test concurrent updates (user.test.ts)
- Add 2 edge case tests
- Test empty array input (utils.test.ts)
- Test boundary values (validation.test.ts)
๐ Documentation
โ ๏ธ 2 functions missing proper documentation
- calculateTotalPrice(): Add JSDoc (line 45)
- formatUserData(): Missing parameter descriptions (line 123)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Priority: ๐ด 1 Critical, ๐ก 5 High, ๐ข 8 Medium
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Execute during review:
# Automated checks script
pnpm run lint
pnpm tsc --noEmit
pnpm test -- --coverage
pnpm audit
# Run automated checks
pnpm run lint
pnpm tsc --noEmit
pnpm test -- --coverage
pnpm audit
# Generate coverage report
pnpm test -- --coverage --coverageReporters=html
# Check bundle size
pnpm run build
pnpm run analyze
Focus on:
Structure feedback:
## Review Comments
### ๐ด Critical Issues
1. **Security**: SQL injection vulnerability in user search (line 45)
- Use parameterized queries
- Add input validation
### ๐ก High Priority
1. **Performance**: N+1 query in getUserPosts (line 123)
- Recommend eager loading with JOIN
- Estimated improvement: 80% faster
### ๐ข Suggestions
1. **Maintainability**: Extract validation logic (line 200)
- Create separate validator function
- Improves testability
### โ
Positive Feedback
- Clean error handling implementation
- Good test coverage for new features
- Clear commit messages
Long Method (>50 lines):
// Smell: Method too long
function processOrder(order) {
// 100+ lines of code
}
// Fix: Extract smaller functions
function processOrder(order) {
validateOrder(order);
calculateTotal(order);
applyDiscounts(order);
finalizeOrder(order);
}
Large Class (>300 lines):
// Smell: God object
class UserManager {
// 500+ lines handling everything
}
// Fix: Split responsibilities
class UserAuthenticator { }
class UserProfileManager { }
class UserNotificationService { }
Duplicate Code:
// Smell: Copy-paste code
function calculatePriceA(items) {
let total = 0;
for (const item of items) {
total += item.price * item.quantity;
}
return total * 1.1; // tax
}
function calculatePriceB(products) {
let sum = 0;
for (const product of products) {
sum += product.price * product.quantity;
}
return sum * 1.1; // tax
}
// Fix: Extract common logic
function calculateSubtotal(items) {
return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
}
function applyTax(amount) {
return amount * 1.1;
}
function calculatePrice(items) {
return applyTax(calculateSubtotal(items));
}