home / skills / chudiren / ai-agent-testing-platform / code-review-router
/.trae/skills/code-review-router
npx playbooks add skill chudiren/ai-agent-testing-platform --skill code-review-routerReview the files below or copy the command above to add this skill to your agents.
---
name: code-review-router
description: Intelligently routes code reviews between Gemini CLI and Codex CLI based on tech stack, complexity, and change characteristics. Use when you want an automated code review of your current changes.
---
# Code Review Router
Routes code reviews to the optimal CLI (Gemini or Codex) based on change characteristics.
## When NOT to Use This Skill
- For non-code reviews (documentation proofreading, prose editing)
- When reviewing external/third-party code you don't control
- For commit message generation (use a dedicated commit skill)
- When you need a specific reviewer (use that CLI directly)
## Step 0: Environment Check
Verify we're in a git repository:
```bash
git rev-parse --git-dir 2>/dev/null || echo "NOT_A_GIT_REPO"
```
**If not a git repo:** Stop and inform the user: "This directory is not a git repository. Initialize with `git init` or navigate to a repo."
## Step 1: Prerequisites Check
Verify both CLIs are available:
```bash
# Check for Gemini CLI
which gemini || echo "GEMINI_NOT_FOUND"
# Check for Codex CLI
which codex || echo "CODEX_NOT_FOUND"
```
**If neither CLI is found:** Stop and inform the user they need to install at least one:
- Gemini: Check Google's Gemini CLI installation docs
- Codex: Check OpenAI's Codex CLI installation docs
**If only one CLI is available:** Use that CLI (no routing needed).
**If both are available:** Proceed with routing analysis.
## Step 2: Analyze Git Diff
Run these commands to gather diff statistics:
```bash
# Get diff stats (staged + unstaged)
git --no-pager diff --stat HEAD 2>/dev/null || git --no-pager diff --stat
# Get full diff for pattern analysis
git --no-pager diff HEAD 2>/dev/null || git --no-pager diff
# Count changed files
git --no-pager diff --name-only HEAD 2>/dev/null | wc -l
# Count total changed lines
git --no-pager diff --numstat HEAD 2>/dev/null | awk '{added+=$1; removed+=$2} END {print added+removed}'
```
**If no changes detected:** Report "Nothing to review - no uncommitted changes found." and stop.
## Step 3: Calculate Complexity Score
Initialize `complexity_score = 0`, then add points:
| Condition | Points | Detection Method |
|-----------|--------|------------------|
| Files changed > 10 | +2 | `git diff --name-only \| wc -l` |
| Files changed > 20 | +3 | (additional, total +5) |
| Lines changed > 300 | +2 | `git diff --numstat` sum |
| Lines changed > 500 | +3 | (additional, total +5) |
| Multiple directories touched | +1 | Count unique dirs in changed files |
| Test files included | +1 | Files matching `*test*`, `*spec*` |
| Config files changed | +1 | Files: `*.config.*`, `*.json`, `*.yaml`, `*.yml`, `*.toml` |
| Database/schema changes | +2 | Files: `*migration*`, `*schema*`, `*.sql`, `prisma/*` |
| API route changes | +2 | Files in `api/`, `routes/`, containing `endpoint`, `handler` |
| Service layer changes | +2 | Files in `services/`, `*service*`, `*provider*` |
## Step 4: Detect Language & Framework
Analyze file extensions and content patterns:
### Primary Language Detection
```
.ts, .tsx → TypeScript
.js, .jsx → JavaScript
.py → Python
.go → Go
.rs → Rust
.java → Java
.rb → Ruby
.php → PHP
.cs → C#
.swift → Swift
.kt → Kotlin
```
### Framework Detection (check imports/file patterns)
```
React/Next.js → "import React", "from 'react'", "next.config", pages/, app/
Vue → ".vue" files, "import Vue", "from 'vue'"
Angular → "angular.json", "@angular/core"
Django → "django", "models.py", "views.py", "urls.py"
FastAPI → "from fastapi", "FastAPI("
Express → "express()", "from 'express'"
NestJS → "@nestjs/", "*.module.ts", "*.controller.ts"
Rails → "Gemfile" with rails, app/controllers/
Spring → "springframework", "@RestController"
```
### Security-Sensitive Patterns
Detect by **file path** OR **code content**:
**File paths:**
```
**/auth/**
**/security/**
**/*authentication*
**/*authorization*
**/middleware/auth*
```
**Code patterns (in diff content):**
```
password\s*=
api_key\s*=
secret\s*=
Bearer\s+
JWT
\.env
credentials
private_key
access_token
```
**Config files:**
```
.env*
*credentials*
*secrets*
*.pem
*.key
```
## Step 5: Apply Routing Decision Tree
**Routing Priority Order** (evaluate top-to-bottom, first match wins):
### Priority 1: Pattern-Based Rules (Hard Rules)
| Pattern | Route | Reason |
|---------|-------|--------|
| Security-sensitive files/code detected | **Codex** | Requires careful security analysis |
| Files > 20 OR lines > 500 | **Codex** | Large changeset needs thorough review |
| Database migrations or schema changes | **Codex** | Architectural risk |
| API/service layer modifications | **Codex** | Backend architectural changes |
| Changes span 3+ top-level directories | **Codex** | Multi-service impact |
| Complex TypeScript (generics, type utilities) | **Codex** | Type system complexity |
| Pure frontend only (jsx/tsx/vue/css/html) | **Gemini** | Simpler, visual-focused review |
| Python ecosystem (py, Django, FastAPI) | **Gemini** | Strong Python support |
| Documentation only (md/txt/rst) | **Gemini** | Simple text review |
### Priority 2: Complexity Score (if no pattern matched)
| Score | Route | Reason |
|-------|-------|--------|
| ≥ 6 | **Codex** | High complexity warrants deeper analysis |
| < 6 | **Gemini** | Moderate complexity, prefer speed |
### Priority 3: Default
→ **Gemini** (faster feedback loop for unclear cases)
## Step 6: Execute Review
### Explain Routing Decision
Before executing, output:
```
## Code Review Routing
**Changes detected:**
- Files: [X] files changed
- Lines: [Y] lines modified
- Primary language: [language]
- Framework: [framework or "none detected"]
**Complexity score:** [N]/10
- [List contributing factors]
**Routing decision:** [Gemini/Codex]
- Reason: [primary reason for choice]
**Executing review...**
```
### CLI Commands
> **Note:** Gemini receives the diff via stdin (piped), while Codex has a dedicated `review` subcommand that reads the git context directly. If debugging, check that `git diff HEAD` produces output before running Gemini.
**For Gemini:**
```bash
# Pipe diff to Gemini with review prompt
git --no-pager diff HEAD | gemini -p "Review this code diff for: 1) Code quality issues, 2) Best practices violations, 3) Potential bugs, 4) Security concerns, 5) Performance issues. Provide specific, actionable feedback."
```
**For Codex:**
```bash
# Use dedicated 'review' subcommand for non-interactive code review
# Note: --uncommitted and [PROMPT] are mutually exclusive
codex review --uncommitted
```
## Step 7: Handle Failures with Fallback
If the chosen CLI fails (non-zero exit or error output):
1. **Report the failure:**
```
[Primary CLI] failed: [error message]
Attempting fallback to [other CLI]...
```
2. **Try the alternative CLI**
3. **If fallback also fails:**
```
Both review CLIs failed.
- Gemini error: [error]
- Codex error: [error]
Please check CLI installations and try manually.
```
## Step 8: Format Output
Present the review results clearly:
```
## Code Review Results
**Reviewed by:** [Gemini/Codex]
**Routing:** [brief reason]
---
[CLI output here]
---
**Review complete.** [X files, Y lines analyzed]
```
## Quick Reference
| Change Type | Route | Reason |
|-------------|-------|--------|
| React component styling | Gemini | Pure frontend |
| Django view update | Gemini | Python ecosystem |
| Single bug fix < 50 lines | Gemini | Simple change |
| New API endpoint + tests | Codex | Architectural |
| Auth system changes | Codex | Security-sensitive |
| Database migration | Codex | Schema change |
| Multi-service refactor | Codex | High complexity |
| TypeScript type overhaul | Codex | Complex types |