Agent skill

code-review

Automated code review analyzing security, performance, maintainability, and test coverage. Activated during code reviews or when conducting analysis.

Stars 232
Forks 15

Install this agent skill to your Project

npx add-skill https://github.com/aiskillstore/marketplace/tree/main/skills/cain96/code-review

SKILL.md

AI-Powered Code Review Engine

This skill provides comprehensive automated code review with focus on security, performance, maintainability, and test coverage.

šŸ” Review Categories

1. Security Analysis

Check for:

  • Authentication/authorization vulnerabilities
  • SQL injection risks
  • XSS (Cross-Site Scripting) vulnerabilities
  • Hardcoded secrets or API keys
  • Insecure dependencies
  • CSRF protection
  • Input validation gaps
  • Sensitive data exposure

Common Vulnerabilities:

typescript
// āŒ 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;

2. Performance Analysis

Check for:

  • N+1 query problems
  • Inefficient algorithms (O(n²) when O(n) possible)
  • Unnecessary re-renders (React)
  • Memory leaks
  • Blocking operations
  • Large bundle sizes
  • Unoptimized images
  • Missing caching opportunities

Common Issues:

typescript
// āŒ 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>;
}

3. Maintainability Analysis

Check for:

  • Code complexity (cyclomatic complexity)
  • Long functions (> 50 lines)
  • Deeply nested code (> 3 levels)
  • Duplicate code
  • Unclear variable names
  • Missing documentation
  • Inconsistent coding style
  • God objects/classes

Metrics:

typescript
// āŒ 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;
}

4. Test Coverage Analysis

Check for:

  • Overall coverage percentage
  • Uncovered critical paths
  • Missing edge case tests
  • Flaky tests
  • Slow tests
  • Test quality (assertions vs test length)

Coverage Goals:

  • Critical code (auth, payment): 95%+
  • Business logic: 80%+
  • Utilities: 70%+
  • UI components: 60%+

šŸ“Š Review Output Format

šŸ” 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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

šŸŽÆ Automated Checks

Execute during review:

  1. Lint errors - Check for code style violations
  2. Type safety - Verify TypeScript strict mode compliance
  3. Test execution - Ensure all tests pass
  4. Code coverage - Check coverage thresholds
  5. Security scan - Run security vulnerability checks
  6. Performance profiling - Identify slow operations
bash
# Automated checks script
pnpm run lint
pnpm tsc --noEmit
pnpm test -- --coverage
pnpm audit

šŸ’” Suggestion Priority

šŸ”“ Critical (Fix Immediately)

  • Security vulnerabilities
  • Data loss risks
  • Production crashes
  • Breaking changes without migration

🟔 High (Fix Before Merge)

  • Performance issues (>100ms operations)
  • Memory leaks
  • Incorrect business logic
  • Missing error handling

🟢 Medium (Address Soon)

  • Code complexity issues
  • Missing documentation
  • Test coverage gaps
  • Minor performance optimizations

šŸ”µ Low (Nice to Have)

  • Style improvements
  • Variable naming suggestions
  • Additional abstractions
  • Micro-optimizations

šŸ“‹ Review Checklist

Code Quality

  • Functions are small and focused (<50 lines)
  • Variable names are clear and descriptive
  • No magic numbers (use named constants)
  • No commented-out code
  • Consistent code style
  • DRY principle followed

Security

  • Input validation implemented
  • Output encoding/escaping applied
  • Authentication checked for protected routes
  • Authorization verified for sensitive operations
  • No hardcoded credentials
  • Dependencies are up-to-date and secure

Performance

  • No N+1 queries
  • Efficient algorithms used
  • Caching implemented where appropriate
  • Database queries optimized
  • Lazy loading considered
  • No memory leaks

Testing

  • Unit tests written for new code
  • Edge cases covered
  • Integration tests for critical paths
  • Tests are fast (<100ms each)
  • Tests are deterministic (no flaky tests)
  • Mocks used appropriately

Documentation

  • Public APIs documented
  • Complex logic explained
  • README updated if needed
  • Examples provided
  • Breaking changes noted

šŸš€ Review Workflow

1. Automated Analysis

bash
# 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

2. Manual Review

Focus on:

  • Business logic correctness
  • Architecture decisions
  • API design
  • User experience
  • Edge cases

3. Provide Feedback

Structure feedback:

markdown
## 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

šŸ” Code Smell Detection

Common Code Smells

Long Method (>50 lines):

typescript
// 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):

typescript
// Smell: God object
class UserManager {
  // 500+ lines handling everything
}

// Fix: Split responsibilities
class UserAuthenticator { }
class UserProfileManager { }
class UserNotificationService { }

Duplicate Code:

typescript
// 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));
}

šŸ’Ž Best Practices

  1. Be constructive - Suggest improvements, don't just criticize
  2. Explain why - Provide context for suggestions
  3. Prioritize issues - Use severity levels
  4. Acknowledge good code - Positive feedback is important
  5. Ask questions - Seek clarification before assumptions
  6. Provide examples - Show better alternatives
  7. Be timely - Review promptly
  8. Be respectful - Remember there's a person behind the code

šŸŽ“ Resources

Didn't find tool you were looking for?

Be as detailed as possible for better results