Search by

jcergolj / ai-pair-review

jcergolj

AI-powered code review using Claude Code CLI. Reviews for SOLID principles, design patterns, and code quality via composer commands.

This package's canonical repository appears to be gone and the package has been frozen as a result. Email us for help if needed.

Package info

github.com/jcergolj/ai-pair-review

Language:Shell

pkg:composer/jcergolj/ai-pair-review

Statistics

Installs: 196

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1 2025-10-22 13:11 UTC

This package is auto-updated.

Last update: 2026-08-22 15:12:16 UTC


README

🤖 AI-powered code review for Laravel projects using Claude Code CLI.

Automatically reviews your code for SOLID principles, design patterns, and code quality via composer commands.

Features

  • 🎯 SOLID Principles - Detects violations of Single Responsibility, Open/Closed, etc.
  • 🏗️ Design Patterns - Suggests Strategy, Factory, Repository, Observer patterns
  • 🔧 Code Quality - Identifies code smells and refactoring opportunities
  • ✅ Laravel Best Practices - N+1 queries, proper Eloquent usage, security
  • 📝 Comprehensive Reports - Detailed analysis with actionable improvement plans
  • 📋 Ready-to-Use Commands - Includes Claude prompts you can copy and paste
  • ⚡ Simple & Fast - No interactive prompts, just run and get results
  • 🔗 VS Code Integration - Auto-opens review files for easy access

Quick Start

Install and Setup

# Install the package
composer require --dev jcergolj/ai-pair-review

# Setup scripts and directories  
php artisan ai-review:install

Usage

# Review all uncommitted changes
composer ai-review

# Review only staged changes  
composer ai-review-staged

# Integration with existing workflow
composer analyse && composer ai-review

How It Works

Simple Code Review Process

  1. Run: composer ai-review (or composer ai-review-staged)
  2. AI Analysis: Claude AI analyzes your uncommitted PHP changes
  3. Automatic Save: Complete analysis saved to .ai/code-reviews/YYYY-MM-DD-HH-MM-SS/review.md
  4. Review Issues: Open the file to see detailed issues with File, Problem, and Fix information
  5. Copy & Apply: Use the included "Ready-to-Use Claude Command" to implement fixes
  6. Manual Control: You choose which issues to fix by copying them to Claude

File Outputs

  • Detailed Review: .ai/code-reviews/YYYY-MM-DD-HH-MM-SS/review.md - Full AI analysis for decision-making
  • Claude Command: .ai/code-reviews/YYYY-MM-DD-HH-MM-SS/claude-command.txt - Ready-to-copy command with all issues
  • Auto-open: Review file automatically opens in VS Code if available
  • Organized: Each review session gets its own timestamped folder

What You Get

Each review includes:

  • Summary: Overview of code changes and quality
  • Prioritized Issues: High/Medium/Low priority with specific file locations
  • Detailed Analysis: File names, line numbers, problems, and suggested fixes
  • Separate Command File: Clean Claude prompt with all issues ready to copy
  • Positive Feedback: Recognition of good practices in your code

Implementing Fixes

You get two files for maximum convenience:

1. Review File (review.md)

Contains detailed analysis for your decision-making:

  • Complete issue breakdown
  • File locations and line numbers
  • Priority levels (High/Medium/Low)
  • Specific problems and suggested fixes

2. Claude Command File (claude-command.txt)

Ready-to-use command with complete issue context:

  • Full Details: Each issue includes File, Problem, and Fix information
  • Line Numbers: Specific locations for precise fixes
  • Complete Context: Everything Claude needs to implement the fix
  • Copy-Ready: Just copy the entire file and paste into Claude
# Quick copy approach
cat .ai/code-reviews/2024-10-22-15-45-30/claude-command.txt | pbcopy

# Then paste into Claude Code CLI
claude
# Paste and press enter

Using Claude Web Interface

  1. Open: .ai/code-reviews/YYYY-MM-DD-HH-MM-SS/claude-command.txt
  2. Copy the entire file contents
  3. Paste into Claude web interface at https://claude.ai
  4. Review and apply the suggested changes

Customizing Before Use

Edit the claude-command.txt file to:

  • Remove entire issues you don't want to fix (including all sub-bullets)
  • Focus on specific priority levels only
  • Add your own project-specific context
  • Modify instructions to match your coding standards

Example Files Structure

.ai/code-reviews/2024-10-22-15-45-30/
├── review.md          # Detailed analysis
└── claude-command.txt # Clean command ready to copy

claude-command.txt example:

I need you to implement the following code improvements in my Laravel project:

## Issues to Fix:

- [ ] **Duplicate Job Dispatch in CompletedOrderController**
  - File: app/Http/Controllers/Webhooks/CompletedOrderController.php:27-35
  - Problem: The `AllocateOneDirectToClientTokenJob` is dispatched twice with identical conditions and parameters (lines 27-30 and lines 32-35). This will cause the same job to run twice for every OneDirectToClient order, leading to duplicate emails, potential data inconsistencies, and unnecessary queue processing.
  - Fix: Remove one of the duplicate `AllocateOneDirectToClientTokenJob::dispatchIf()` calls. Keep only lines 27-30 or 32-35, but not both.

- [ ] **Missing type hints for parameters**
  - File: UserController.php:25
  - Problem: Method parameters lack type declarations
  - Fix: Add proper type hints for better code safety

## Context:
- This is a Laravel application
- Follow SOLID principles and design patterns
[... rest of context and instructions ...]

Integration with Existing Workflow

Basic Integration

# Your existing scripts + AI review
composer pint
composer phpstan  
composer ai-review  # <- Add this
composer test

Advanced Integration

Add to your composer.json:

{
    "scripts": {
        "analyse-with-ai": [
            "@analyse",
            "@ai-review"
        ]
    }
}

Then run: composer analyse-with-ai

Code Review Storage

All AI-generated code reviews are automatically stored in the .ai/code-reviews/ folder in your project root. Each review is saved as a markdown file with a timestamp:

.ai/
├── scripts/
│   └── ai-reviewer.sh
├── ignore.yml
└── code-reviews/
    ├── code-review-20251021_143022.md
    ├── code-review-20251021_151204.md
    └── code-review-20251022_094515.md

Interactive Triage System

When issues are found, you'll be prompted for each one:

Issue 1 of 3:
- [ ] Single Responsibility Violation (UserService.php:21)

Action: [f]ix, [s]kip this time, [i]gnore forever, [q]uit: i
🚫 Added to ignore list

Issue 2 of 3:
- [ ] Missing Type Declarations (UserService.php:21)

Action: [f]ix, [s]kip this time, [i]gnore forever, [q]uit: f
✓ Added to fix list

Options:

  • [f]ix - Add to your fix list for immediate action
  • [s]kip - Skip for this review, will appear again next time
  • [i]gnore forever - Never show this issue again (until fresh changes)
  • [q]uit - Exit the triage process

Smart Ignore System

Issues you ignore are stored in .ai/ignore.yml:

# AI Code Review Ignore File
ignored_issues:
  - "- [ ] Use more descriptive variable names in legacy code"
  - "- [ ] Consider extracting UserService.formatName to a helper"
last_commit_hash: "abc123def456"

Key features:

  • Persistent: Ignored issues won't appear in subsequent reviews
  • Fresh start: When you commit changes, ignore list automatically resets
  • Team-friendly: .ai/ignore.yml is gitignored (personal preferences)

This folder is automatically created on the first review and contains:

  • Timestamped files - Each review gets a unique filename
  • Editable markdown - Remove items you don't want to fix
  • Actionable checklists - Ready to submit to Claude Code for implementation

After Committing

# Review the detailed analysis
cat .ai/code-reviews/2024-10-21-14-30-22/review.md

# Copy the ready-to-use command
cat .ai/code-reviews/2024-10-21-14-30-22/claude-command.txt | pbcopy
# Then paste into Claude Code CLI or web interface

# Or edit the command file first, then copy
nano .ai/code-reviews/2024-10-21-14-30-22/claude-command.txt

Managing Ignore List

# View your current ignore list
cat .ai/ignore.yml

# Reset ignore list manually (starts fresh)
rm .ai/ignore.yml

# Ignore list resets automatically when you commit changes

Example Review

Found 3 new issue(s) to triage:

Issue 1 of 3:
- [ ] Single Responsibility Violation (UserService.php:21)

Action: [f]ix, [s]kip this time, [i]gnore forever, [q]uit: f
✓ Added to fix list

Issue 2 of 3:
- [ ] Missing Type Declarations (UserService.php:21)

Action: [f]ix, [s]kip this time, [i]gnore forever, [q]uit: f
✓ Added to fix list

Issue 3 of 3:
- [ ] Use more descriptive variable names (UserService.php:45)

Action: [f]ix, [s]kip this time, [i]gnore forever, [q]uit: i
🚫 Added to ignore list

═══════════════════════════════════════════════════════════
                      TRIAGE SUMMARY
═══════════════════════════════════════════════════════════

✅ Issues to fix (2):
   • - [ ] Single Responsibility Violation (UserService.php:21)
   • - [ ] Missing Type Declarations (UserService.php:21)

📋 To implement fixes, run:
claude "Please implement the following improvements:
• - [ ] Single Responsibility Violation (UserService.php:21)
• - [ ] Missing Type Declarations (UserService.php:21)"

Generated review file:

## Issues Found

### High Priority
- [ ] Single Responsibility Violation (UserService.php:21)
  - Problem: Class handles creation, emails, logging, subscriptions
  - Fix: Extract to CreateUserAction, UserRegistered event, SubscriptionStrategy

- [ ] Missing Type Declarations (UserService.php:21)
  - Problem: No return type, array instead of DTO
  - Fix: Add `: User` return type, create `RegisterUserData` DTO

### Medium Priority
- [ ] Strategy Pattern Opportunity (UserService.php:40)
  - Suggestion: Replace conditionals with SubscriptionStrategy interface

### Low Priority
- [ ] Use Eloquent Mass Assignment
  - Suggestion: Replace manual properties with User::create()

What Gets Reviewed

🎯 SOLID Principles

  • Single Responsibility - One class, one reason to change
  • Open/Closed - Open for extension, closed for modification
  • Liskov Substitution - Proper use of abstractions
  • Interface Segregation - Focused, cohesive interfaces
  • Dependency Inversion - Depend on abstractions, not concretions

🏗️ Architecture & Patterns

  • Design pattern usage (Strategy, Factory, Repository, Observer, etc.)
  • Dependency injection
  • Domain-Driven Design principles
  • God objects and procedural code

🔧 Code Quality

  • Code smells (long methods, feature envy, data clumps)
  • Duplicated code
  • Complex conditionals → polymorphism
  • Better use of collections

✅ Laravel Best Practices

  • Eloquent relationships and query optimization
  • N+1 query detection
  • Service providers and facades
  • Security (authorization, validation, mass assignment)
  • Proper use of Form Requests, Events, Jobs

📝 Type Safety

  • Missing type declarations
  • Interface opportunities
  • Value objects instead of primitives

Configuration

Basic Configuration

Edit .pre-commit-config in your project root:

# Enable/disable AI review
AI_REVIEW=true

Disable AI Review

# Disable for one commit
AI_REVIEW=false git commit -m "Quick fix"

# Skip hook entirely (emergency)
git commit --no-verify -m "Hotfix"

Ignore System Configuration

The ignore system automatically creates .ai/ignore.yml to track issues you don't want to see again.

Structure:

# AI Code Review Ignore File
ignored_issues:
  - "- [ ] Use more descriptive variable names in legacy UserHelper"
  - "- [ ] Consider extracting formatUserData to separate class"
last_commit_hash: "abc123def456789"

Key behaviors:

  • Issues persist: Ignored issues won't appear until fresh changes
  • Auto-reset: When you commit new changes, ignore list resets (fresh start)
  • Personal: .ai/ignore.yml is gitignored - each developer has their own preferences
  • Team-friendly: Doesn't interfere with team workflow

Manual management:

# View ignored issues
cat .ai/ignore.yml

# Reset ignore list manually
rm .ai/ignore.yml

# Ignore list automatically resets on new commits

Large Changes & Token Limits

Claude has token limits (~200k tokens, roughly 800k characters). The hook automatically handles large changes:

  • ⚠️ Warning at 300KB - Shows size and suggests splitting commits
  • 🛑 Block at 500KB - Offers options:
    • Skip AI review and commit normally
    • Truncate diff for partial review
    • Abort to split changes
  • 🚨 Token errors - Clear error messages with suggestions

Best practices for large changes:

# Instead of committing everything at once
git add .
git commit -m "Large refactor"

# Split into focused commits
git add app/Services/UserService.php
git commit -m "Extract user registration logic"

git add app/Events/UserRegistered.php
git commit -m "Add user registration event"

git add app/Listeners/SendWelcomeEmail.php
git commit -m "Add welcome email listener"

Commands

Install

php artisan ai-review:install

Installs the AI review system and creates:

your-project/
├── .ai/
│   ├── scripts/
│   │   └── ai-reviewer.sh          # Main review script
│   ├── ignore.yml                  # Personal ignore list (gitignored)
│   └── code-reviews/               # Generated reviews (gitignored)
├── .gitignore                      # Updated with AI review entries

Options:

  • --force - Overwrite existing files

Uninstall

php artisan ai-review:uninstall

Removes the pre-commit hooks.

Requirements

  • PHP 8.4+
  • Laravel 12+
  • Git repository
  • Claude Code CLI installed and in PATH (default)

Note: Currently uses Claude Code CLI, but can be easily modified to use other AI providers (OpenAI, Gemini, Ollama, etc.). See EXTEND_TO_OTHER_AI.md for instructions.

Install Claude Code from https://claude.ai/code

Team Setup

Option 1: Commit config to repository

git add .pre-commit-config
git commit -m "Add AI review config"

Team members run:

composer install
php artisan ai-review:install

Option 2: Auto-install on composer install

Add to your project's composer.json:

{
  "scripts": {
    "post-install-cmd": [
      "@php artisan ai-review:install --quiet || true"
    ]
  }
}

Non-Laravel Projects

The hooks work with any PHP project! To install manually:

# From vendor directory
cp vendor/jcergolj/ai-pair-review/stubs/pre-commit .git/hooks/
cp vendor/jcergolj/ai-pair-review/stubs/ai-reviewer.sh .git/hooks/
cp vendor/jcergolj/ai-pair-review/stubs/.pre-commit-config .
'chmod +x .git/hooks/*

Support Other Languages

Edit .git/hooks/ai-reviewer.sh line 17:

# For Python
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.py$' || true)

# For JavaScript/TypeScript
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|jsx|ts|tsx)$' || true)

# For all languages
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM || true)

Troubleshooting

"Claude CLI not found"

Install Claude Code from https://claude.ai/code

The hook will skip gracefully if Claude is not installed.

Hook not running

# Check hooks are installed
ls -la .git/hooks/

# Reinstall
php artisan ai-review:install --force

Review file not opening

Install VS Code CLI or the review is still saved to .ai/code-reviews/YYYY-MM-DD-HH-MM-SS/review.md

Slow reviews

For large commits (10+ files), reviews may take 20-30 seconds. Consider:

  • Smaller, more focused commits
  • Temporarily disable: AI_REVIEW=false git commit

Examples

Before Review

class UserService {
    public function register(array $data) {
        $user = User::create($data);
        Mail::to($user)->send(new WelcomeEmail());
        Log::info("Registered: {$user->email}");
        return $user;
    }
}

After AI Suggestions

// Single Responsibility - one action
class RegisterUserAction {
    public function execute(RegisterUserData $data): User {
        $user = User::create($data->toArray());
        event(new UserRegistered($user));
        return $user;
    }
}

// Event for cross-cutting concerns
class SendWelcomeEmail {
    public function handle(UserRegistered $event): void {
        $event->user->notify(new WelcomeNotification());
    }
}

// Value object for type safety
class RegisterUserData {
    public function __construct(
        public readonly string $name,
        public readonly Email $email,
        public readonly HashedPassword $password,
    ) {}
}

Why Use This?

📚 Educational

Learn SOLID principles by seeing them applied to your actual code

🔍 Quality

Catch architectural issues before code review

⚡ Fast

Get instant expert feedback on every commit

🎯 Actionable

Edit the review to keep what matters, submit to Claude for automatic fixes

Publishing to Packagist

To share this package publicly:

1. Create GitHub repository

cd ai-pair-review
git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/jcergolj/ai-pair-review.git
git push -u origin main

2. Tag a release

git tag -a v1.0.0 -m "First release"
git push origin v1.0.0

3. Submit to Packagist

  1. Go to https://packagist.org/packages/submit
  2. Enter your GitHub URL: https://github.com/jcergolj/ai-pair-review
  3. Click Submit

4. Install in any project

composer require --dev jcergolj/ai-pair-review
php artisan ai-review:install

Customization

Customize What Gets Reviewed

The AI review prompt is fully customizable! See CUSTOMIZE_PROMPT.md for the complete guide with examples.

Quick start:

# Open the reviewer script
code .git/hooks/ai-reviewer.sh

# Edit the REVIEW_PROMPT variable (starts at line 33)

Popular customizations:

  • Security Focus - Prioritize vulnerabilities and security issues
  • Performance Focus - Catch N+1 queries, caching opportunities
  • Team Standards - Enforce your company's specific coding rules
  • Educational Mode - Get detailed explanations for learning
  • Strict Mode - Catch every small issue
  • Lenient Mode - Only report critical problems

See CUSTOMIZE_PROMPT.md for copy-paste templates and examples.

Save Reviews to Custom Location

Edit .ai/scripts/ai-reviewer.sh around line 210:

# Save to a different location
mkdir -p "$PROJECT_ROOT/.reviews"
REVIEW_FILE="$PROJECT_ROOT/.reviews/code-review-$TIMESTAMP.md"

Extending to Other AI Providers

While this package uses Claude Code CLI by default, it's built on standard Git hooks and can be easily modified to use:

  • OpenAI GPT-4 (via API)
  • Google Gemini (via API)
  • Ollama (local, offline)
  • GitHub Copilot CLI
  • Any other AI service

The pre-commit hook is just a bash script - modify .git/hooks/ai-reviewer.sh to call your preferred AI provider.

Full guide with examples: EXTEND_TO_OTHER_AI.md

Quick example for OpenAI:

# Replace line 118 in .git/hooks/ai-reviewer.sh
REVIEW_OUTPUT=$(curl -s https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{"model":"gpt-4","messages":[...]}' | jq -r '.choices[0].message.content')

Contributing

Contributions welcome!

Especially wanted:

  • Support for additional AI providers
  • Improved prompts
  • Bug fixes
  • Documentation improvements
  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Submit a pull request

License

MIT License - see LICENSE file

Credits

Built with Claude Code CLI by Anthropic

Support