diff-review
Diff Review - Multi-Agent Code Review
Review code diffs using multiple AI reviewers in parallel, then merge findings into a unified report.
Usage
/diff-review [<commit-hash>] [--reviewer=<gemini|codex|claude|auto|all>]
Parameters
<commit-hash>(optional): Review a specific commit instead of uncommitted changes. Accepts full or short hash.--reviewer(optional): Select reviewer modegemini: Use Gemini CLI onlycodex: Use Codex CLI onlyclaude: Use Claude only (spawns new session)auto: Auto-select best reviewer based on code (readsreviewers/auto-select.md)allor omitted: Multi-Agent Mode - use all three reviewers in parallel
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)
Workflow
Step 0: Check Prerequisites
Verify CLI availability:
# Check Gemini CLI
which gemini || echo "GEMINI_NOT_FOUND"
# Check Codex CLI
which codex || echo "CODEX_NOT_FOUND"
If neither CLI is found for multi-agent mode: Warn user and suggest installation.
If only some CLIs available: Proceed with available reviewers only.
Step 1: Parse Parameters
IF <commit-hash> is provided:
Set REVIEW_MODE = "commit"
Set COMMIT_HASH = <commit-hash>
ELSE:
Set REVIEW_MODE = "uncommitted"
IF --reviewer is specified:
IF --reviewer=auto:
Read reviewers/auto-select.md and follow its logic
ELSE IF --reviewer=gemini|codex|claude:
Set SINGLE_REVIEWER_MODE = true
Set REVIEWER = specified value
ELSE IF --reviewer=all:
Set MULTI_AGENT_MODE = true
ELSE:
Set MULTI_AGENT_MODE = true (default)
Step 2: Get Git Diff
If REVIEW_MODE = "commit":
# Verify the commit exists
git rev-parse --verify $COMMIT_HASH
# Get commit metadata
git --no-pager log -1 --format="%H%n%s%n%an%n%ai" $COMMIT_HASH
# Get diff stats for the commit
git --no-pager diff --stat ${COMMIT_HASH}~1 $COMMIT_HASH
# Get full diff for analysis
git --no-pager diff ${COMMIT_HASH}~1 $COMMIT_HASH
# Count changed files
git --no-pager diff --name-only ${COMMIT_HASH}~1 $COMMIT_HASH | wc -l
# Count total changed lines
git --no-pager diff --numstat ${COMMIT_HASH}~1 $COMMIT_HASH | awk '{added+=$1; removed+=$2} END {print added+removed}'
If commit hash is invalid: Report "❌ Invalid commit hash: $COMMIT_HASH" and stop.
If REVIEW_MODE = "uncommitted":
# Get diff stats (staged + unstaged)
git --no-pager diff --stat HEAD 2>/dev/null || git --no-pager diff --stat
# Get full diff for 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: Auto-detect Expertise
Read expertise/_index.md to get detection rules.
For each expertise defined:
- Check if diff content matches
trigger_patterns - Check if changed files match
file_patterns - If matched, load the corresponding
expertise/*.mdfile
Store matched expertise prompts for injection into reviewer prompts.
Step 4: Execute Review
Multi-Agent Mode (default)
Execute all three reviewers in parallel using the exact commands below.
⚠️ CRITICAL: Each CLI has different syntax. Do NOT mix them up!
- Gemini:
git diff | gemini -p "prompt"(accepts stdin pipe ✅) - Codex:
codex exec "prompt"(non-interactive headless mode, reads codebase directly ✅) - Claude: Spawn subagent via Task tool
Construct [FULL_PROMPT] for each reviewer by combining:
- The reviewer's role file (e.g.,
reviewers/gemini-role.md) - Any matched expertise prompts from Step 3
- The review target context (commit hash, diff stats)
All three reviewers MUST receive the same review instructions — only the delivery mechanism differs.
PARALLEL:
Task 1: Run Gemini Review
- Load reviewers/gemini-role.md
- Inject matched expertise prompts
- Execute:
# For specific commit (pipe the diff as context):
git --no-pager diff ${COMMIT_HASH}~1 $COMMIT_HASH | gemini -p "[FULL_PROMPT]"
# For uncommitted changes:
git --no-pager diff HEAD | gemini -p "[FULL_PROMPT]"
- Store result as GEMINI_RESULT
Task 2: Run Codex Review
- Load reviewers/codex-role.md
- Inject matched expertise prompts
- Execute using `codex exec` (NOT `codex review`):
# For specific commit:
codex exec --sandbox read-only --ephemeral "Review commit ${COMMIT_HASH}. [FULL_PROMPT]"
# For uncommitted changes:
codex exec --sandbox read-only --ephemeral "Review all uncommitted changes. [FULL_PROMPT]"
- ⚠️ Do NOT use: `codex -p` (doesn't exist), `codex review` (flag conflicts with prompt)
- `codex exec` reads the codebase directly — no need to pipe diff
- `--sandbox read-only` = safe, `--ephemeral` = don't save session
- Store result as CODEX_RESULT
Task 3: Run Claude Review
- Load reviewers/claude-role.md
- Inject matched expertise prompts
- In Claude Code: use Task tool to spawn a subagent with diff + prompt
- Store result as CLAUDE_RESULT
END PARALLEL
Then proceed to Step 5: Coordinate & Merge.
Single Reviewer Mode
Execute only the selected reviewer using the commands above for the chosen reviewer. Output result directly to terminal, then STOP (skip Step 5).
Step 5: Coordinate & Merge (Multi-Agent Mode Only)
Load reviewers/coordinator.md and provide it with:
- GEMINI_RESULT
- CODEX_RESULT
- CLAUDE_RESULT
The Coordinator will:
- Parse all three reviews into structured format
- Identify similar issues across reviewers
- Merge similar issues while preserving source attribution
- Preserve unique issues found by only one reviewer
- Sort by severity: Critical > High > Medium > Low
- Generate unified report using
templates/report.md
⚠️ All emoji in the report template (🔵🟢🟣🚨⚠️📝💡📊📋📎 etc.) MUST be preserved in the final output. Do not strip or replace them.
Step 6: Save Report (MANDATORY)
⚠️ This step is NOT optional. You MUST save the report to a file.
# Generate filename
# For commit review:
REPORT_FILE="diff-review-$(echo $COMMIT_HASH | cut -c1-7)-$(TZ='America/New_York' date +%Y%m%d-%H%M%S).md"
# For uncommitted changes:
REPORT_FILE="diff-review-$(TZ='America/New_York' date +%Y%m%d-%H%M%S).md"
You MUST do BOTH of the following:
- Output the full report to terminal
- Write the report to
$REPORT_FILEin the current working directory
# Write report to file — THIS IS REQUIRED, DO NOT SKIP
cat << 'EOF' > "$REPORT_FILE"
[full report content here]
EOF
# Confirm to user
echo "📄 Report saved to: $REPORT_FILE"
Report includes:
- Review target (commit hash + message, or "uncommitted changes")
- Summary table (severity counts)
- Merged issues with source attribution
- Raw outputs in collapsible sections
File naming convention:
- Commit review:
diff-review-<short-hash>-YYYYMMDD-HHMMSS.md - Uncommitted:
diff-review-YYYYMMDD-HHMMSS.md
General Review Guidelines
These guidelines apply to all reviewers:
Code Quality
- Logic correctness
- Error handling completeness
- Edge case coverage
- Code readability
Security
- Input validation
- Authentication/authorization issues
- Sensitive data exposure
- Injection vulnerabilities
Performance
- Algorithmic efficiency
- Resource management (memory, connections)
- Unnecessary computations
- Caching opportunities
Best Practices
- DRY principle adherence
- SOLID principles
- Proper abstractions
- Documentation completeness
Fallback Handling
If a reviewer fails:
IF GEMINI fails:
Log: "⚠️ Gemini review failed: [error]"
Continue with other reviewers
IF CODEX fails:
Log: "⚠️ Codex review failed: [error]"
Continue with other reviewers
IF CLAUDE fails:
Log: "⚠️ Claude review failed: [error]"
Continue with other reviewers
IF ALL reviewers fail:
Output: "❌ All reviewers failed. Please check CLI installations."
Provide installation links
If only one reviewer succeeds:
Output that reviewer's result directly without coordination step.
If two reviewers succeed:
Proceed with coordination using available results.