All checks were successful
Enterprise AI Code Review / ai-review (pull_request) Successful in 39s
Implements code diff explainer that translates technical changes into plain language for non-technical stakeholders (PMs, designers, new team members). Features: - Plain-language explanations without jargon - File-by-file breakdown with 'what' and 'why' context - Architecture impact analysis - Breaking change detection - Perfect for onboarding and cross-functional reviews Implementation: - Added explain_diff.md prompt template with plain-language guidelines - Implemented _handle_explain_diff_command() in PRAgent - Added _format_diff_explanation() for readable markdown - Updated PRAgent.can_handle() to route explain-diff commands - Added 'explain-diff' to config.yml commands list Workflow Safety (prevents duplicate runs): - Added '@codebot explain-diff' to ai-comment-reply.yml conditions - Excluded from ai-chat.yml to prevent duplication - Only triggers on PR comments (not issues) - Manual command only (no automatic triggering) Testing: - 9 comprehensive tests in TestDiffExplanation class - Tests command detection, formatting, plain-language output - Verifies prompt formatting and empty section handling Documentation: - Updated README.md with explain-diff command and examples - Added detailed implementation guide in CLAUDE.md - Included plain-language rules and use cases Related: Milestone 2 high-priority feature - code diff explainer
535 lines
15 KiB
Markdown
535 lines
15 KiB
Markdown
# OpenRabbit
|
||
|
||
Enterprise-grade AI code review system for **Gitea** with automated PR review, issue triage, interactive chat, and codebase analysis.
|
||
|
||
---
|
||
|
||
## Features
|
||
|
||
| Feature | Description |
|
||
|---------|-------------|
|
||
| **PR Review** | Inline comments, security scanning, severity-based CI failure |
|
||
| **PR Summaries** | Auto-generate comprehensive PR summaries with change analysis and impact assessment |
|
||
| **Issue Triage** | On-demand classification, labeling, priority assignment via `@codebot triage` |
|
||
| **Chat** | Interactive AI chat with codebase search and web search tools |
|
||
| **@codebot Commands** | `@codebot summarize`, `changelog`, `explain-diff`, `explain`, `suggest`, `triage`, `review-again` in comments |
|
||
| **Codebase Analysis** | Health scores, tech debt tracking, weekly reports |
|
||
| **Security Scanner** | 17 OWASP-aligned rules for vulnerability detection |
|
||
| **Enterprise Ready** | Audit logging, metrics, Prometheus export |
|
||
| **Gitea Native** | Built for Gitea workflows and API |
|
||
|
||
---
|
||
|
||
## Quick Start
|
||
|
||
### 1. Set Repository/Organization Secrets
|
||
|
||
```
|
||
OPENAI_API_KEY - OpenAI API key (or use OpenRouter/Ollama)
|
||
SEARXNG_URL - (Optional) SearXNG instance URL for web search
|
||
```
|
||
|
||
**For Gitea:**
|
||
```
|
||
AI_REVIEW_TOKEN - Bot token with repo + issue permissions
|
||
```
|
||
|
||
**For GitHub:**
|
||
The built-in `GITHUB_TOKEN` is used automatically.
|
||
|
||
### 2. Add Workflows to Repository
|
||
|
||
Workflows are located in `.gitea/workflows/`.
|
||
|
||
#### Gitea Example
|
||
|
||
#### Gitea PR Review Workflow
|
||
|
||
```yaml
|
||
# .gitea/workflows/enterprise-ai-review.yml
|
||
name: AI PR Review
|
||
on: [pull_request]
|
||
|
||
jobs:
|
||
ai-review:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 0
|
||
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
repository: YourOrg/OpenRabbit
|
||
path: .ai-review
|
||
token: ${{ secrets.AI_REVIEW_TOKEN }}
|
||
|
||
- uses: actions/setup-python@v5
|
||
with:
|
||
python-version: "3.11"
|
||
|
||
- run: pip install requests pyyaml
|
||
|
||
- name: Run AI Review
|
||
env:
|
||
AI_REVIEW_TOKEN: ${{ secrets.AI_REVIEW_TOKEN }}
|
||
AI_REVIEW_REPO: ${{ gitea.repository }}
|
||
AI_REVIEW_API_URL: https://your-gitea.example.com/api/v1
|
||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||
run: |
|
||
cd .ai-review/tools/ai-review
|
||
python main.py pr ${{ gitea.repository }} ${{ gitea.event.pull_request.number }}
|
||
```
|
||
|
||
See `.gitea/workflows/` for all workflow examples.
|
||
|
||
### 3. Create Labels (Automatic Setup)
|
||
|
||
**Option A: Automatic Setup (Recommended)**
|
||
|
||
Create an issue and comment:
|
||
```
|
||
@codebot setup-labels
|
||
```
|
||
|
||
The bot will automatically:
|
||
- Detect your existing label schema (e.g., `Kind/Bug`, `Priority - High`)
|
||
- Map existing labels to OpenRabbit's auto-labeling system
|
||
- Create only the missing labels you need
|
||
- Follow your repository's naming convention
|
||
|
||
**Option B: Manual Setup**
|
||
|
||
Create these labels in your repository for auto-labeling:
|
||
- `priority: critical`, `priority: high`, `priority: medium`, `priority: low`
|
||
- `type: bug`, `type: feature`, `type: question`, `type: documentation`
|
||
- `ai-approved`, `ai-changes-required`, `ai-reviewed`
|
||
|
||
---
|
||
|
||
## Project Structure
|
||
|
||
```
|
||
tools/ai-review/
|
||
├── agents/ # Agent implementations
|
||
│ ├── base_agent.py # Abstract base agent
|
||
│ ├── issue_agent.py # Issue triage & @codebot commands
|
||
│ ├── pr_agent.py # PR review with security scan
|
||
│ ├── codebase_agent.py # Codebase health analysis
|
||
│ └── chat_agent.py # Interactive chat with tool calling
|
||
├── clients/ # API clients
|
||
│ ├── gitea_client.py # Gitea REST API wrapper
|
||
│ └── llm_client.py # Multi-provider LLM client with tool support
|
||
├── security/ # Security scanning
|
||
│ └── security_scanner.py # 17 OWASP-aligned rules
|
||
├── enterprise/ # Enterprise features
|
||
│ ├── audit_logger.py # JSONL audit logging
|
||
│ └── metrics.py # Prometheus-compatible metrics
|
||
├── prompts/ # AI prompt templates
|
||
├── main.py # CLI entry point
|
||
└── config.yml # Configuration
|
||
|
||
.github/workflows/ # GitHub Actions workflows
|
||
├── ai-review.yml # PR review workflow
|
||
├── ai-issue-triage.yml # Issue triage workflow
|
||
├── ai-codebase-review.yml # Codebase analysis
|
||
├── ai-comment-reply.yml # @codebot command responses
|
||
└── ai-chat.yml # Interactive AI chat
|
||
|
||
.gitea/workflows/ # Gitea Actions workflows
|
||
├── enterprise-ai-review.yml
|
||
├── ai-issue-triage.yml
|
||
├── ai-codebase-review.yml
|
||
├── ai-comment-reply.yml
|
||
└── ai-chat.yml
|
||
```
|
||
|
||
---
|
||
|
||
## CLI Commands
|
||
|
||
```bash
|
||
# Review a pull request
|
||
python main.py pr owner/repo 123
|
||
|
||
# Triage an issue
|
||
python main.py issue owner/repo 456
|
||
|
||
# Respond to @codebot command
|
||
python main.py comment owner/repo 456 "@codebot explain"
|
||
|
||
# Analyze codebase
|
||
python main.py codebase owner/repo
|
||
|
||
# Chat with the AI bot
|
||
python main.py chat owner/repo "How does authentication work?"
|
||
python main.py chat owner/repo "Find all API endpoints" --issue 789
|
||
```
|
||
|
||
---
|
||
|
||
## @codebot Commands
|
||
|
||
### Issue Commands
|
||
|
||
In any issue comment:
|
||
|
||
| Command | Description |
|
||
|---------|-------------|
|
||
| `@codebot help` | **Help:** Show all available commands with examples |
|
||
| `@codebot setup-labels` | **Setup:** Automatically create/map repository labels for auto-labeling |
|
||
| `@codebot triage` | Full issue triage with auto-labeling and analysis |
|
||
| `@codebot summarize` | Summarize the issue in 2-3 sentences |
|
||
| `@codebot explain` | Explain what the issue is about |
|
||
| `@codebot suggest` | Suggest solutions or next steps |
|
||
| `@codebot` (any question) | Chat with AI using codebase/web search tools |
|
||
|
||
### Pull Request Commands
|
||
|
||
In any PR comment:
|
||
|
||
| Command | Description |
|
||
|---------|-------------|
|
||
| `@codebot summarize` | Generate a comprehensive PR summary with changes, files affected, and impact |
|
||
| `@codebot changelog` | Generate Keep a Changelog format entries ready for CHANGELOG.md |
|
||
| `@codebot explain-diff` | Explain code changes in plain language for non-technical stakeholders |
|
||
| `@codebot review-again` | Re-run AI code review on current PR state without new commits |
|
||
|
||
#### PR Summary (`@codebot summarize`)
|
||
|
||
**Features:**
|
||
- 📋 Generates structured summary of PR changes
|
||
- ✨ Categorizes change type (Feature/Bugfix/Refactor/Documentation/Testing)
|
||
- 📝 Lists what was added, modified, and removed
|
||
- 📁 Shows all affected files with descriptions
|
||
- 🎯 Assesses impact scope (small/medium/large)
|
||
- 🤖 Automatically generates on PRs with empty descriptions
|
||
|
||
**When to use:**
|
||
- When a PR lacks a description
|
||
- To quickly understand what changed
|
||
- For standardized PR documentation
|
||
- Before reviewing complex PRs
|
||
|
||
**Example output:**
|
||
```markdown
|
||
## 📋 Pull Request Summary
|
||
This PR implements automatic PR summary generation...
|
||
|
||
**Type:** ✨ Feature
|
||
|
||
## Changes
|
||
✅ Added:
|
||
- PR summary generation in PRAgent
|
||
- Auto-summary for empty PR descriptions
|
||
|
||
📝 Modified:
|
||
- Updated config.yml with new settings
|
||
|
||
## Files Affected
|
||
- ➕ `tools/ai-review/prompts/pr_summary.md` - New prompt template
|
||
- 📝 `tools/ai-review/agents/pr_agent.py` - Added summary methods
|
||
|
||
## Impact
|
||
🟡 **Scope:** Medium
|
||
Adds new feature without affecting existing functionality
|
||
```
|
||
|
||
#### Changelog Generator (`@codebot changelog`)
|
||
|
||
**Features:**
|
||
- 📋 Generates Keep a Changelog format entries
|
||
- 🏷️ Categorizes changes (Added/Changed/Fixed/Removed/Security)
|
||
- ⚠️ Detects breaking changes automatically
|
||
- 📊 Includes technical details (files, LOC, components)
|
||
- 📝 Ready to copy-paste into CHANGELOG.md
|
||
|
||
**When to use:**
|
||
- Preparing release notes
|
||
- Maintaining CHANGELOG.md
|
||
- Customer-facing announcements
|
||
- Version documentation
|
||
|
||
**Example output:**
|
||
```markdown
|
||
## 📋 Changelog for PR #123
|
||
|
||
### ✨ Added
|
||
- User authentication system with JWT tokens
|
||
- Password reset functionality via email
|
||
|
||
### 🔄 Changed
|
||
- Updated database schema for user table
|
||
- Refactored login endpoint for better error handling
|
||
|
||
### 🐛 Fixed
|
||
- Session timeout bug causing premature logouts
|
||
- Security vulnerability in password validation
|
||
|
||
### 🔒 Security
|
||
- Fixed XSS vulnerability in user input validation
|
||
|
||
---
|
||
|
||
### ⚠️ BREAKING CHANGES
|
||
- **Removed legacy API endpoint /api/v1/old - migrate to /api/v2**
|
||
|
||
---
|
||
|
||
### 📊 Technical Details
|
||
- **Files changed:** 15
|
||
- **Lines:** +450 / -120
|
||
- **Main components:** auth/, api/users/, database/
|
||
```
|
||
|
||
#### Diff Explainer (`@codebot explain-diff`)
|
||
|
||
**Features:**
|
||
- 📖 Translates technical changes into plain language
|
||
- 🎯 Perfect for non-technical stakeholders (PMs, designers)
|
||
- 🔍 File-by-file breakdown with "what" and "why"
|
||
- 🏗️ Architecture impact analysis
|
||
- ⚠️ Breaking change detection
|
||
- 📊 Technical summary for reference
|
||
|
||
**When to use:**
|
||
- New team members reviewing complex PRs
|
||
- Non-technical reviewers need to understand changes
|
||
- Documenting architectural decisions
|
||
- Learning from others' code
|
||
|
||
**Example output:**
|
||
```markdown
|
||
## 📖 Code Changes Explained (PR #123)
|
||
|
||
### 🎯 Overview
|
||
This PR adds user authentication using secure tokens that expire after 24 hours, enabling users to log in securely without storing passwords in the application.
|
||
|
||
### 🔍 What Changed
|
||
|
||
#### ➕ `auth/jwt.py` (new)
|
||
**What changed:** Creates secure tokens for logged-in users
|
||
**Why it matters:** Enables the app to remember who you are without constantly asking for your password
|
||
|
||
#### 📝 `api/users.py` (modified)
|
||
**What changed:** Added a login page where users can sign in
|
||
**Why it matters:** Users can now create accounts and access their personal data
|
||
|
||
---
|
||
|
||
### 🏗️ Architecture Impact
|
||
Introduces a security layer across the entire application, ensuring only authenticated users can access protected features.
|
||
|
||
**New dependencies:**
|
||
- PyJWT (for creating secure tokens)
|
||
- bcrypt (for password encryption)
|
||
|
||
**Affected components:**
|
||
- API (all endpoints now check authentication)
|
||
- Database (added user credentials storage)
|
||
|
||
---
|
||
|
||
### ⚠️ Breaking Changes
|
||
- **All API endpoints now require authentication - existing scripts need to be updated**
|
||
|
||
---
|
||
|
||
### 📊 Technical Summary
|
||
- **Files changed:** 5
|
||
- **Lines:** +200 / -10
|
||
- **Components:** auth/, api/
|
||
```
|
||
|
||
#### Review Again (`@codebot review-again`)
|
||
|
||
**Features:**
|
||
- ✅ Shows diff from previous review (resolved/new/changed issues)
|
||
- 🏷️ Updates labels based on new severity
|
||
- ⚡ No need for empty commits to trigger review
|
||
- 🔧 Respects latest `.ai-review.yml` configuration
|
||
|
||
**When to use:**
|
||
- After addressing review feedback in comments
|
||
- When AI flagged a false positive and you explained it
|
||
- After updating `.ai-review.yml` security rules
|
||
- To re-evaluate severity after code clarification
|
||
|
||
**Example:**
|
||
```
|
||
The hardcoded string at line 45 is a public API URL, not a secret.
|
||
@codebot review-again
|
||
```
|
||
|
||
**New to OpenRabbit?** Just type `@codebot help` in any issue to see all available commands!
|
||
|
||
### Label Setup Command
|
||
|
||
The `@codebot setup-labels` command intelligently detects your existing label schema and sets up auto-labeling:
|
||
|
||
**For repositories with existing labels (e.g., `Kind/Bug`, `Priority - High`):**
|
||
- Detects your naming pattern (prefix/slash, prefix-dash, or colon-style)
|
||
- Maps your existing labels to OpenRabbit's schema
|
||
- Creates only missing labels following your pattern
|
||
- Zero duplicate labels created
|
||
|
||
**For fresh repositories:**
|
||
- Creates OpenRabbit's default label set
|
||
- Uses `type:`, `priority:`, and status labels
|
||
|
||
**Example output:**
|
||
```
|
||
@codebot setup-labels
|
||
|
||
✅ Found 18 existing labels with pattern: prefix_slash
|
||
|
||
Detected Categories:
|
||
- Kind (7 labels): Bug, Feature, Documentation, Security, Testing
|
||
- Priority (4 labels): Critical, High, Medium, Low
|
||
|
||
Proposed Mapping:
|
||
| OpenRabbit Expected | Your Existing Label | Status |
|
||
|---------------------|---------------------|--------|
|
||
| type: bug | Kind/Bug | ✅ Map |
|
||
| priority: high | Priority - High | ✅ Map |
|
||
| ai-reviewed | (missing) | ⚠️ Create |
|
||
|
||
✅ Created Kind/Question (#cc317c)
|
||
✅ Created Status - AI Reviewed (#1d76db)
|
||
|
||
Setup Complete! Auto-labeling will use your existing label schema.
|
||
```
|
||
|
||
---
|
||
|
||
## Interactive Chat
|
||
|
||
The chat agent is an interactive AI assistant with tool-calling capabilities:
|
||
|
||
**Tools Available:**
|
||
- `search_codebase` - Search repository files and code
|
||
- `read_file` - Read specific files
|
||
- `search_web` - Search the web via SearXNG
|
||
|
||
**Example:**
|
||
```
|
||
@codebot How do I configure rate limiting in this project?
|
||
```
|
||
|
||
The bot will search the codebase, read relevant files, and provide a comprehensive answer.
|
||
|
||
---
|
||
|
||
## Configuration
|
||
|
||
Edit `tools/ai-review/config.yml`:
|
||
|
||
```yaml
|
||
provider: openai # openai | openrouter | ollama
|
||
|
||
model:
|
||
openai: gpt-4.1-mini
|
||
openrouter: anthropic/claude-3.5-sonnet
|
||
ollama: codellama:13b
|
||
|
||
agents:
|
||
issue:
|
||
enabled: true
|
||
auto_label: true
|
||
pr:
|
||
enabled: true
|
||
inline_comments: true
|
||
security_scan: true
|
||
codebase:
|
||
enabled: true
|
||
chat:
|
||
enabled: true
|
||
searxng_url: "" # Or set SEARXNG_URL env var
|
||
|
||
interaction:
|
||
respond_to_mentions: true
|
||
mention_prefix: "@codebot" # Customize your bot name here!
|
||
commands:
|
||
- summarize
|
||
- explain
|
||
- suggest
|
||
```
|
||
|
||
---
|
||
|
||
## Customizing the Bot Name
|
||
|
||
The default bot name is `@codebot`. To change it:
|
||
|
||
**Step 1:** Edit `tools/ai-review/config.yml`:
|
||
```yaml
|
||
interaction:
|
||
mention_prefix: "@yourname" # e.g., "@assistant", "@reviewer", etc.
|
||
```
|
||
|
||
**Step 2:** Update all workflow files in `.gitea/workflows/`:
|
||
- `ai-comment-reply.yml`
|
||
- `ai-chat.yml`
|
||
- `ai-issue-triage.yml`
|
||
|
||
Look for and update:
|
||
```yaml
|
||
if: contains(github.event.comment.body, '@codebot')
|
||
```
|
||
|
||
Change `@codebot` to your new bot name.
|
||
|
||
---
|
||
|
||
## Security Scanning
|
||
|
||
17 rules covering OWASP Top 10:
|
||
|
||
| Category | Examples |
|
||
|----------|----------|
|
||
| Injection | SQL injection, command injection, XSS |
|
||
| Access Control | Hardcoded secrets, private keys |
|
||
| Crypto Failures | Weak hashing (MD5/SHA1), insecure random |
|
||
| Misconfiguration | Debug mode, CORS wildcard, SSL bypass |
|
||
|
||
---
|
||
|
||
## Documentation
|
||
|
||
| Document | Description |
|
||
|----------|-------------|
|
||
| [Getting Started](docs/getting-started.md) | Quick setup guide |
|
||
| [Configuration](docs/configuration.md) | All options explained |
|
||
| [Agents](docs/agents.md) | Agent documentation |
|
||
| [Security](docs/security.md) | Security rules reference |
|
||
| [Workflows](docs/workflows.md) | GitHub & Gitea workflow examples |
|
||
| [API Reference](docs/api-reference.md) | Client and agent APIs |
|
||
| [Enterprise](docs/enterprise.md) | Audit logging, metrics |
|
||
| [Troubleshooting](docs/troubleshooting.md) | Common issues |
|
||
|
||
---
|
||
|
||
## LLM Providers
|
||
|
||
| Provider | Model | Use Case |
|
||
|----------|-------|----------|
|
||
| OpenAI | gpt-4.1-mini | Fast, reliable |
|
||
| OpenRouter | claude-3.5-sonnet | Multi-provider access |
|
||
| Ollama | codellama:13b | Self-hosted, private |
|
||
|
||
---
|
||
|
||
## Enterprise Features
|
||
|
||
- **Audit Logging**: JSONL logs with daily rotation
|
||
- **Metrics**: Prometheus-compatible export
|
||
- **Rate Limiting**: Configurable request limits
|
||
- **Custom Security Rules**: Define your own patterns via YAML
|
||
- **Tool Calling**: LLM function calling for interactive chat
|
||
|
||
---
|
||
|
||
## License
|
||
|
||
MIT
|