# Code Quality Review Performs comprehensive code quality analysis focusing on organization, maintainability, testing, documentation, and software craftsmanship best practices. ## Parameters **Received from router**: `$ARGUMENTS` (after removing 'quality' operation) Expected format: `scope:"review-scope" [depth:"quick|standard|deep"]` ## Workflow ### 1. Parse Parameters Extract from $ARGUMENTS: - **scope**: What to review (required) - files, modules, features - **depth**: Quality analysis thoroughness (default: "standard") ### 2. Gather Context **Understand Code Structure**: ```bash # Check project structure ls -la cat package.json 2>/dev/null || cat requirements.txt 2>/dev/null # Find test files find . -name "*.test.*" -o -name "*.spec.*" -o -name "*_test.*" | head -20 # Check for linting configuration ls -la | grep -E "eslint|prettier|pylint|flake8|golangci" # Analyze code metrics (if tools available) npx cloc . --exclude-dir=node_modules,dist,build 2>/dev/null || echo "Code analysis" # Check for documentation find . -name "README*" -o -name "*.md" | head -10 ``` ### 3. Code Organization Review **Naming Conventions**: - [ ] Variables have clear, descriptive names - [ ] Functions/methods have verb-based names - [ ] Classes have noun-based names - [ ] Constants are UPPER_SNAKE_CASE - [ ] Boolean variables use is/has/should prefix - [ ] Names reveal intent (no cryptic abbreviations) **Function Structure**: - [ ] Functions focused on single responsibility - [ ] Functions under 50 lines (ideally under 30) - [ ] Function parameters limited (ideally 3 or fewer) - [ ] Deep nesting avoided (max 3 levels) - [ ] Early returns for guard clauses - [ ] Pure functions where possible **File Organization**: - [ ] Related code grouped together - [ ] Clear separation of concerns - [ ] Logical folder structure - [ ] Consistent file naming - [ ] Import statements organized - [ ] File length manageable (under 300 lines) **Code Duplication**: - [ ] DRY principle followed - [ ] Repeated patterns extracted to functions - [ ] Common utilities in shared modules - [ ] Magic numbers replaced with named constants - [ ] Similar code refactored to reusable components **Code Examples - Organization**: ```typescript // ❌ BAD: Poor naming and structure function p(u, d) { if (u.r === 'a') { let result = []; for (let i = 0; i < d.length; i++) { if (d[i].o === u.i) { result.push(d[i]); } } return result; } return d; } // ✅ GOOD: Clear naming and structure function filterDataByUserRole(user: User, data: DataItem[]): DataItem[] { if (user.role === 'admin') { return data.filter(item => item.ownerId === user.id); } return data; } ``` ```typescript // ❌ BAD: Long function with multiple responsibilities function processOrder(order) { // Validate order (20 lines) // Calculate totals (15 lines) // Apply discounts (25 lines) // Process payment (30 lines) // Send notifications (20 lines) // Update inventory (15 lines) // Log analytics (10 lines) // 135 lines total! } // ✅ GOOD: Decomposed into focused functions function processOrder(order: Order): OrderResult { validateOrder(order); const totals = calculateOrderTotals(order); const finalPrice = applyDiscounts(totals, order.discountCode); const payment = processPayment(finalPrice, order.paymentMethod); sendOrderNotifications(order, payment); updateInventory(order.items); logOrderAnalytics(order, payment); return { order, payment, totals }; } ``` ```typescript // ❌ BAD: Code duplication function formatUserName(user) { return user.firstName + ' ' + user.lastName; } function formatAuthorName(author) { return author.firstName + ' ' + author.lastName; } function formatCustomerName(customer) { return customer.firstName + ' ' + customer.lastName; } // ✅ GOOD: Extracted common logic interface Person { firstName: string; lastName: string; } function formatFullName(person: Person): string { return `${person.firstName} ${person.lastName}`; } // Use for all person types const userName = formatFullName(user); const authorName = formatFullName(author); const customerName = formatFullName(customer); ``` ### 4. Error Handling Review **Error Handling Patterns**: - [ ] All errors caught and handled - [ ] Error messages are meaningful - [ ] Errors logged with context - [ ] Errors don't expose sensitive data - [ ] Graceful degradation implemented - [ ] User-friendly error messages in UI - [ ] Error boundaries in React (or equivalent) **Validation**: - [ ] Input validation at boundaries - [ ] Type checking for dynamic data - [ ] Null/undefined checks where needed - [ ] Range and boundary checks - [ ] Business rule validation - [ ] Validation errors clearly communicated **Code Examples - Error Handling**: ```typescript // ❌ BAD: Silent failure async function fetchUser(id: string) { try { const response = await fetch(`/api/users/${id}`); return await response.json(); } catch (error) { return null; // Silent failure! } } // ✅ GOOD: Proper error handling async function fetchUser(id: string): Promise { try { const response = await fetch(`/api/users/${id}`); if (!response.ok) { throw new Error(`Failed to fetch user: ${response.statusText}`); } return await response.json(); } catch (error) { logger.error('Error fetching user', { id, error }); throw new UserFetchError(`Unable to retrieve user ${id}`, { cause: error }); } } ``` ```typescript // ❌ BAD: No validation function calculateDiscount(price, discountPercent) { return price * (discountPercent / 100); } // ✅ GOOD: Input validation function calculateDiscount(price: number, discountPercent: number): number { if (price < 0) { throw new Error('Price cannot be negative'); } if (discountPercent < 0 || discountPercent > 100) { throw new Error('Discount must be between 0 and 100'); } return price * (discountPercent / 100); } ``` ### 5. Type Safety Review (TypeScript/Typed Languages) **Type Usage**: - [ ] No `any` types (or justified with comments) - [ ] Explicit return types on functions - [ ] Interface/type definitions for objects - [ ] Enums for fixed sets of values - [ ] Union types for multiple possibilities - [ ] Type guards for runtime validation - [ ] Generics used appropriately **Type Quality**: - [ ] Types are precise (not overly broad) - [ ] Types are DRY (shared interfaces) - [ ] Complex types have descriptive names - [ ] Type assertions justified and minimal - [ ] Non-null assertions avoided **Code Examples - Type Safety**: ```typescript // ❌ BAD: Using any function processData(data: any) { return data.map((item: any) => item.value); } // ✅ GOOD: Proper types interface DataItem { id: string; value: number; metadata?: Record; } function processData(data: DataItem[]): number[] { return data.map(item => item.value); } ``` ```typescript // ❌ BAD: Overly broad type function getConfig(): object { return { apiUrl: 'https://api.example.com', timeout: 5000 }; } // ✅ GOOD: Specific type interface AppConfig { apiUrl: string; timeout: number; retries?: number; } function getConfig(): AppConfig { return { apiUrl: 'https://api.example.com', timeout: 5000 }; } ``` ### 6. Testing Review **Test Coverage**: - [ ] Unit tests for business logic - [ ] Integration tests for APIs - [ ] Component tests for UI - [ ] E2E tests for critical paths - [ ] Coverage >80% for critical code - [ ] Edge cases tested - [ ] Error paths tested **Test Quality**: - [ ] Tests are readable and maintainable - [ ] Tests are isolated (no interdependencies) - [ ] Tests use meaningful assertions - [ ] Tests focus on behavior, not implementation - [ ] Test names describe what they test - [ ] Mocks/stubs used appropriately - [ ] Test data is clear and minimal **Test Organization**: - [ ] Tests colocated with source (or parallel structure) - [ ] Test setup/teardown handled properly - [ ] Shared test utilities extracted - [ ] Test factories for complex objects - [ ] Consistent test patterns across codebase **Code Examples - Testing**: ```typescript // ❌ BAD: Testing implementation details it('should update state', () => { const component = mount(); component.instance().incrementCount(); // Implementation detail! expect(component.state('count')).toBe(1); }); // ✅ GOOD: Testing behavior it('should increment counter when button is clicked', () => { render(); const button = screen.getByRole('button', { name: /increment/i }); fireEvent.click(button); expect(screen.getByText('Count: 1')).toBeInTheDocument(); }); ``` ```typescript // ❌ BAD: Unclear test name and setup it('works', async () => { const result = await func(123, true, 'test', null, undefined); expect(result).toBe(true); }); // ✅ GOOD: Descriptive name and clear test it('should return true when user is authenticated and has admin role', async () => { const user = createTestUser({ role: 'admin', isAuthenticated: true }); const result = await canAccessAdminPanel(user); expect(result).toBe(true); }); ``` ### 7. Documentation Review **Code Documentation**: - [ ] Complex logic explained with comments - [ ] JSDoc/docstrings for public APIs - [ ] "Why" comments, not "what" comments - [ ] TODO/FIXME comments tracked - [ ] Outdated comments removed - [ ] Type definitions documented **Project Documentation**: - [ ] README comprehensive and up to date - [ ] Setup instructions accurate - [ ] API documentation complete - [ ] Architecture documented (ADRs) - [ ] Contributing guidelines present - [ ] Changelog maintained **Code Examples - Documentation**: ```typescript // ❌ BAD: Obvious comment // Increment the counter count++; // ❌ BAD: Outdated comment // TODO: Add validation (already done!) function saveUser(user: User) { validateUser(user); return db.users.save(user); } // ✅ GOOD: Explains why // Using exponential backoff to handle rate limiting from external API await retryWithBackoff(() => externalApi.call()); // ✅ GOOD: JSDoc for public API /** * Calculates the total price including discounts and taxes. * * @param items - Array of cart items * @param discountCode - Optional discount code to apply * @returns Total price with applied discounts and taxes * @throws {InvalidDiscountError} If discount code is invalid * * @example * ```ts * const total = calculateTotal(cartItems, 'SAVE10'); * ``` */ function calculateTotal(items: CartItem[], discountCode?: string): number { // Implementation } ``` ### 8. SOLID Principles Review **Single Responsibility Principle**: - [ ] Each class/function has one reason to change - [ ] Responsibilities clearly defined - [ ] Cohesion is high **Open/Closed Principle**: - [ ] Open for extension, closed for modification - [ ] New features don't require changing existing code - [ ] Abstractions used appropriately **Liskov Substitution Principle**: - [ ] Subtypes can replace base types - [ ] Inheritance used correctly - [ ] No broken hierarchies **Interface Segregation Principle**: - [ ] Interfaces are focused - [ ] Clients don't depend on unused methods - [ ] Small, cohesive interfaces **Dependency Inversion Principle**: - [ ] Depend on abstractions, not concretions - [ ] Dependency injection used - [ ] High-level modules independent of low-level **Code Examples - SOLID**: ```typescript // ❌ BAD: Violates Single Responsibility class User { saveToDatabase() { /* ... */ } sendEmail() { /* ... */ } generateReport() { /* ... */ } validateData() { /* ... */ } } // ✅ GOOD: Single Responsibility class User { constructor(public name: string, public email: string) {} } class UserRepository { save(user: User) { /* ... */ } } class EmailService { sendWelcomeEmail(user: User) { /* ... */ } } ``` ```typescript // ❌ BAD: Violates Dependency Inversion class OrderService { processOrder(order: Order) { const stripe = new StripePayment(); // Tight coupling! stripe.charge(order.amount); } } // ✅ GOOD: Dependency Inversion interface PaymentGateway { charge(amount: number): Promise; } class OrderService { constructor(private paymentGateway: PaymentGateway) {} processOrder(order: Order) { return this.paymentGateway.charge(order.amount); } } // Can now use any payment gateway const orderService = new OrderService(new StripePayment()); // or const orderService = new OrderService(new PayPalPayment()); ``` ### 9. Design Patterns Review **Appropriate Patterns**: - [ ] Patterns used where beneficial - [ ] Patterns not overused - [ ] Patterns implemented correctly - [ ] Patterns consistent with codebase **Common Patterns to Look For**: - Factory Pattern: Object creation - Strategy Pattern: Algorithm selection - Observer Pattern: Event handling - Decorator Pattern: Adding functionality - Singleton Pattern: Single instance (use sparingly) - Repository Pattern: Data access - Dependency Injection: Loose coupling **Anti-Patterns to Avoid**: - [ ] God Object (class doing too much) - [ ] Spaghetti Code (tangled logic) - [ ] Copy-Paste Programming - [ ] Golden Hammer (overusing one solution) - [ ] Premature Optimization - [ ] Magic Numbers/Strings ### 10. Code Metrics Analysis **Complexity Metrics**: ```bash # Cyclomatic complexity (if tools available) npx eslint . --ext .ts,.tsx --format json | grep complexity # Lines of code per file find . -name "*.ts" -exec wc -l {} \; | sort -rn | head -10 # Function length analysis # (Manual review of longest functions) ``` **Quality Indicators**: - [ ] Low cyclomatic complexity (< 10) - [ ] Limited function parameters (< 4) - [ ] Reasonable file length (< 300 lines) - [ ] Low code duplication - [ ] High cohesion, low coupling ## Review Depth Implementation **Quick Depth** (10-15 min): - Focus on obvious quality issues - Check function length and complexity - Review naming conventions - Check for code duplication - Verify basic error handling **Standard Depth** (30-40 min): - All quality categories reviewed - Test coverage analysis - Documentation review - SOLID principles check - Design pattern review - Code organization assessment **Deep Depth** (60-90+ min): - Comprehensive quality audit - Detailed metrics analysis - Complete test quality review - Architecture pattern review - Refactoring recommendations - Technical debt assessment - Maintainability scoring ## Output Format ```markdown # Code Quality Review: [Scope] ## Executive Summary **Reviewed**: [What was reviewed] **Depth**: [Quick|Standard|Deep] **Quality Rating**: [Excellent|Good|Fair|Needs Improvement] ### Overall Quality Assessment **[High|Medium|Low] Maintainability** [Brief explanation] ### Code Metrics - **Total Lines**: [X] - **Average Function Length**: [X lines] - **Cyclomatic Complexity**: [Average: X] - **Test Coverage**: [X%] - **Code Duplication**: [Low|Medium|High] ### Priority Actions 1. [Critical quality issue 1] 2. [Critical quality issue 2] --- ## Critical Quality Issues 🚨 ### [Issue 1 Title] **File**: `path/to/file.ts:42` **Category**: Organization|Error Handling|Type Safety|Testing|Documentation **Issue**: [Description of quality problem] **Impact**: [Why this matters for maintainability] **Refactoring**: [Specific improvement] ```typescript // Current code [problematic code] // Refactored code [improved code] ``` [Repeat for each critical issue] --- ## High Priority Issues ⚠️ [Similar format for high priority issues] --- ## Medium Priority Issues ℹ️ [Similar format for medium priority issues] --- ## Low Priority Issues 💡 [Similar format for low priority issues] --- ## Quality Strengths ✅ - ✅ [Good practice 1 with examples] - ✅ [Good practice 2 with examples] - ✅ [Good practice 3 with examples] --- ## Detailed Quality Analysis ### 📂 Code Organization **Structure**: [Assessment] **Strengths**: - ✅ [Well-organized aspects] **Improvements Needed**: - ⚠️ [Organization issues with file references] **Naming Quality**: [Excellent|Good|Needs Improvement] **Function Size**: Average [X] lines (Target: <30) **File Size**: Average [X] lines (Target: <300) ### 🛡️ Error Handling **Coverage**: [Comprehensive|Partial|Insufficient] **Strengths**: - ✅ [Good error handling practices] **Improvements Needed**: - ⚠️ [Missing or poor error handling with file references] ### 🔷 Type Safety (TypeScript) **Type Coverage**: [X%] **Any Types Found**: [Count and locations] **Strengths**: - ✅ [Good type usage] **Improvements Needed**: - ⚠️ [Type safety issues with file references] ### 🧪 Testing **Test Coverage**: [X%] **Coverage by Type**: - Unit Tests: [X%] - Integration Tests: [X%] - E2E Tests: [X%] **Test Quality**: [High|Medium|Low] **Strengths**: - ✅ [Well-tested areas] **Gaps**: - ⚠️ [Missing test coverage] - ⚠️ [Test quality issues] **Untested Code**: - [File/function 1 - why important] - [File/function 2 - why important] ### 📚 Documentation **Documentation Level**: [Comprehensive|Adequate|Insufficient] **Strengths**: - ✅ [Well-documented areas] **Gaps**: - ⚠️ [Missing or inadequate documentation] **README Quality**: [Excellent|Good|Needs Work] **API Documentation**: [Complete|Partial|Missing] **Code Comments**: [Appropriate|Excessive|Insufficient] ### 🏗️ SOLID Principles | Principle | Adherence | Issues | |-----------|-----------|--------| | Single Responsibility | ✅ Good / ⚠️ Some Issues / ❌ Violated | [Details] | | Open/Closed | ✅ Good / ⚠️ Some Issues / ❌ Violated | [Details] | | Liskov Substitution | ✅ Good / ⚠️ Some Issues / ❌ Violated | [Details] | | Interface Segregation | ✅ Good / ⚠️ Some Issues / ❌ Violated | [Details] | | Dependency Inversion | ✅ Good / ⚠️ Some Issues / ❌ Violated | [Details] | ### 🎨 Design Patterns **Patterns Identified**: - [Pattern 1]: [Where used, appropriateness] - [Pattern 2]: [Where used, appropriateness] **Anti-Patterns Found**: - ⚠️ [Anti-pattern 1 with location] - ⚠️ [Anti-pattern 2 with location] ### 📊 Code Metrics | Metric | Value | Target | Status | |--------|-------|--------|--------| | Avg Function Length | [X] lines | <30 | ✅ / ⚠️ / ❌ | | Max Function Length | [X] lines | <50 | ✅ / ⚠️ / ❌ | | Avg Cyclomatic Complexity | [X] | <10 | ✅ / ⚠️ / ❌ | | Max Cyclomatic Complexity | [X] | <15 | ✅ / ⚠️ / ❌ | | Test Coverage | [X%] | >80% | ✅ / ⚠️ / ❌ | | Code Duplication | [Low/Med/High] | Low | ✅ / ⚠️ / ❌ | --- ## Refactoring Recommendations ### Immediate (This Week) 1. [Refactoring 1 - estimated effort, impact] 2. [Refactoring 2 - estimated effort, impact] ### Short-term (This Month) 1. [Refactoring 1 - estimated effort, impact] 2. [Refactoring 2 - estimated effort, impact] ### Long-term (This Quarter) 1. [Strategic improvement 1] 2. [Strategic improvement 2] --- ## Technical Debt Assessment **Debt Level**: [Low|Medium|High] **Key Debt Items**: 1. [Debt item 1 - why it exists, impact, remediation] 2. [Debt item 2 - why it exists, impact, remediation] **Debt Payoff Strategy**: [Recommendation] --- ## Maintainability Score **Overall Score**: [X/10] **Component Scores**: - Organization: [X/10] - Error Handling: [X/10] - Type Safety: [X/10] - Testing: [X/10] - Documentation: [X/10] - Design: [X/10] --- ## Best Practices Compliance **Followed**: - ✅ [Practice 1] - ✅ [Practice 2] **Not Followed**: - ❌ [Practice 1 with remediation] - ❌ [Practice 2 with remediation] --- ## Review Metadata - **Reviewer**: 10x Fullstack Engineer (Quality Focus) - **Review Date**: [Date] - **Quality Issues**: Critical: X, High: X, Medium: X, Low: X - **Maintainability**: [High|Medium|Low] ``` ## Agent Invocation This operation MUST leverage the **10x-fullstack-engineer** agent with code quality expertise. ## Best Practices 1. **Readability First**: Code is read more than written 2. **Consistency**: Follow established patterns 3. **Simplicity**: Simple code is maintainable code 4. **Test Coverage**: Tests document and protect behavior 5. **Meaningful Names**: Names should reveal intent 6. **Small Functions**: Functions should do one thing well