Add deployment documentation and enhance project setup scripts
- Introduced `DEPLOYMENT.md` for comprehensive deployment instructions. - Added `start.bat` and `start.sh` scripts for unified project startup on Windows and Linux/Mac. - Updated `.gitignore` to exclude additional files and directories. - Enhanced `main.py` to serve static frontend files and handle SPA routing. - Configured Vite to output the frontend build to the backend public directory. - Minor adjustments in `ReviewDetail.tsx` for improved data handling.
This commit is contained in:
parent
09cdd06307
commit
b297bcbba9
4
.gitignore
vendored
4
.gitignore
vendored
@ -27,6 +27,10 @@ env/
|
||||
|
||||
# Database
|
||||
*.db
|
||||
*.db-journal
|
||||
|
||||
# Frontend build
|
||||
backend/public/
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
|
||||
|
||||
369
DEPLOYMENT.md
Normal file
369
DEPLOYMENT.md
Normal file
@ -0,0 +1,369 @@
|
||||
# 🚀 Развертывание AI Code Review Platform
|
||||
|
||||
## 📋 Быстрый старт
|
||||
|
||||
### Одна команда для запуска всего:
|
||||
|
||||
**Linux/Mac:**
|
||||
```bash
|
||||
./start.sh
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```bash
|
||||
start.bat
|
||||
```
|
||||
|
||||
Это автоматически:
|
||||
1. ✅ Проверит установку Node.js и Python
|
||||
2. ✅ Установит зависимости frontend
|
||||
3. ✅ Соберет frontend в `backend/public`
|
||||
4. ✅ Установит зависимости backend
|
||||
5. ✅ Создаст `.env` из примера (если нужно)
|
||||
6. ✅ Запустит сервер на http://localhost:8000
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Требования
|
||||
|
||||
### Системные требования:
|
||||
- **Python:** 3.10 или выше
|
||||
- **Node.js:** 18 или выше
|
||||
- **npm:** 9 или выше
|
||||
|
||||
### Проверка установленных версий:
|
||||
```bash
|
||||
python --version # или python3 --version
|
||||
node --version
|
||||
npm --version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Настройка
|
||||
|
||||
### 1. Клонирование репозитория
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd platform/review
|
||||
```
|
||||
|
||||
### 2. Конфигурация
|
||||
|
||||
Отредактируйте `backend/.env`:
|
||||
|
||||
```bash
|
||||
# Ollama Configuration
|
||||
OLLAMA_BASE_URL=http://localhost:11434
|
||||
OLLAMA_MODEL=mistral:7b
|
||||
|
||||
# Master Git Tokens (optional)
|
||||
MASTER_GITEA_TOKEN=your_gitea_token_here
|
||||
MASTER_GITHUB_TOKEN=your_github_token_here
|
||||
|
||||
# Security
|
||||
ENCRYPTION_KEY=your-32-character-encryption-key
|
||||
```
|
||||
|
||||
**Генерация ключа шифрования:**
|
||||
```python
|
||||
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||
```
|
||||
|
||||
### 3. Запуск
|
||||
|
||||
```bash
|
||||
# Linux/Mac
|
||||
chmod +x start.sh
|
||||
./start.sh
|
||||
|
||||
# Windows
|
||||
start.bat
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Архитектура развертывания
|
||||
|
||||
### Схема работы:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Пользователь │
|
||||
│ http://localhost:8000 │
|
||||
└──────────────┬──────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────┐
|
||||
│ FastAPI Backend │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────┐ │
|
||||
│ │ API Endpoints │ │
|
||||
│ │ /api/repositories │ │
|
||||
│ │ /api/reviews │ │
|
||||
│ │ /api/webhooks │ │
|
||||
│ └─────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────┐ │
|
||||
│ │ Static Files │ │
|
||||
│ │ Serves: backend/public/ │ │
|
||||
│ │ (React frontend build) │ │
|
||||
│ └─────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────┘
|
||||
│
|
||||
├─────────► SQLite DB
|
||||
│
|
||||
├─────────► Ollama (AI)
|
||||
│
|
||||
└─────────► Git APIs
|
||||
(Gitea/GitHub/Bitbucket)
|
||||
```
|
||||
|
||||
### Как это работает:
|
||||
|
||||
1. **Frontend билдится** в `backend/public/`
|
||||
2. **Backend раздает** статику из `backend/public/`
|
||||
3. **Один порт** (8000) для всего
|
||||
4. **API** доступно на `/api/*`
|
||||
5. **Frontend** на `/` (все остальные роуты)
|
||||
|
||||
---
|
||||
|
||||
## 📁 Структура после сборки
|
||||
|
||||
```
|
||||
platform/review/
|
||||
├── backend/
|
||||
│ ├── public/ # ← Frontend build (создается автоматически)
|
||||
│ │ ├── index.html
|
||||
│ │ ├── assets/
|
||||
│ │ │ ├── index-*.js
|
||||
│ │ │ └── index-*.css
|
||||
│ │ └── ...
|
||||
│ ├── app/
|
||||
│ ├── venv/
|
||||
│ ├── .env
|
||||
│ └── requirements.txt
|
||||
├── frontend/
|
||||
│ ├── src/
|
||||
│ ├── package.json
|
||||
│ └── vite.config.ts # ← Настроен на build в ../backend/public
|
||||
├── start.sh # ← Единый скрипт запуска (Linux/Mac)
|
||||
└── start.bat # ← Единый скрипт запуска (Windows)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Процесс сборки
|
||||
|
||||
### Что происходит при запуске `start.sh` / `start.bat`:
|
||||
|
||||
```bash
|
||||
1. Проверка Node.js ✓
|
||||
→ node --version
|
||||
|
||||
2. Проверка Python ✓
|
||||
→ python --version
|
||||
|
||||
3. Установка зависимостей frontend ✓
|
||||
→ cd frontend
|
||||
→ npm install
|
||||
|
||||
4. Сборка frontend ✓
|
||||
→ npm run build
|
||||
→ Вывод: backend/public/
|
||||
|
||||
5. Установка зависимостей backend ✓
|
||||
→ cd backend
|
||||
→ python -m venv venv
|
||||
→ pip install -r requirements.txt
|
||||
|
||||
6. Проверка .env ✓
|
||||
→ Создание из .env.example если нужно
|
||||
|
||||
7. Запуск сервера ✓
|
||||
→ uvicorn app.main:app --reload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Доступ к приложению
|
||||
|
||||
После запуска доступно:
|
||||
|
||||
- **Frontend (UI):** http://localhost:8000
|
||||
- **API:** http://localhost:8000/api
|
||||
- **API Docs (Swagger):** http://localhost:8000/docs
|
||||
- **WebSocket:** ws://localhost:8000/ws
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Разработка
|
||||
|
||||
### Запуск в режиме разработки (с hot-reload):
|
||||
|
||||
**Терминал 1 - Backend:**
|
||||
```bash
|
||||
cd backend
|
||||
source venv/bin/activate # или venv\Scripts\activate на Windows
|
||||
uvicorn app.main:app --reload
|
||||
```
|
||||
|
||||
**Терминал 2 - Frontend:**
|
||||
```bash
|
||||
cd frontend
|
||||
npm run dev
|
||||
```
|
||||
|
||||
В этом режиме:
|
||||
- Frontend: http://localhost:5173
|
||||
- Backend: http://localhost:8000
|
||||
- Frontend проксирует API запросы на backend
|
||||
|
||||
### Пересборка frontend:
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm run build
|
||||
```
|
||||
|
||||
Frontend автоматически соберется в `backend/public/`
|
||||
|
||||
---
|
||||
|
||||
## 🐳 Docker (опционально)
|
||||
|
||||
TODO: Добавить Dockerfile и docker-compose.yml
|
||||
|
||||
---
|
||||
|
||||
## 📊 Production Deployment
|
||||
|
||||
### Для продакшена рекомендуется:
|
||||
|
||||
1. **Использовать Gunicorn + Uvicorn:**
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
gunicorn app.main:app \
|
||||
--workers 4 \
|
||||
--worker-class uvicorn.workers.UvicornWorker \
|
||||
--bind 0.0.0.0:8000
|
||||
```
|
||||
|
||||
2. **Nginx как reverse proxy:**
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name yourdomain.com;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:8000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
|
||||
location /ws {
|
||||
proxy_pass http://localhost:8000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. **Systemd service:**
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=AI Code Review Platform
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
User=www-data
|
||||
WorkingDirectory=/path/to/platform/review/backend
|
||||
ExecStart=/path/to/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Troubleshooting
|
||||
|
||||
### Проблема: Frontend не отображается
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
cd frontend
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Проблема: Backend не запускается
|
||||
|
||||
**Проверьте:**
|
||||
1. Установлен ли Python 3.10+
|
||||
2. Создано ли виртуальное окружение
|
||||
3. Установлены ли зависимости
|
||||
4. Корректен ли `.env` файл
|
||||
|
||||
### Проблема: Ollama недоступен
|
||||
|
||||
**Убедитесь что:**
|
||||
```bash
|
||||
# Ollama запущен
|
||||
ollama serve
|
||||
|
||||
# Модель скачана
|
||||
ollama pull mistral:7b
|
||||
|
||||
# Ollama доступен
|
||||
curl http://localhost:11434/api/version
|
||||
```
|
||||
|
||||
### Проблема: Ошибки шифрования токенов
|
||||
|
||||
**Удалите БД и пересоздайте:**
|
||||
```bash
|
||||
rm backend/review.db
|
||||
# Перезапустите сервер
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Полезные команды
|
||||
|
||||
```bash
|
||||
# Проверка статуса
|
||||
ps aux | grep uvicorn
|
||||
|
||||
# Просмотр логов
|
||||
tail -f backend/logs/app.log # если настроено логирование
|
||||
|
||||
# Остановка сервера
|
||||
# Ctrl+C в терминале где запущен
|
||||
|
||||
# Очистка
|
||||
rm -rf backend/public/
|
||||
rm -rf frontend/node_modules/
|
||||
rm -rf backend/venv/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
|
||||
Теперь у вас есть:
|
||||
- 🚀 Единая команда запуска
|
||||
- 📦 Автоматическая сборка frontend
|
||||
- 🌐 Один порт для всего
|
||||
- 🔄 Hot-reload в разработке
|
||||
- 📚 Документация
|
||||
|
||||
**Запускайте и наслаждайтесь!** 🎉
|
||||
|
||||
619
README.md
619
README.md
@ -1,299 +1,330 @@
|
||||
# AI Code Review Agent 🤖
|
||||
# 🤖 AI Code Review Platform
|
||||
|
||||
AI агент для автоматического ревью Pull Request с поддержкой **Gitea**, **GitHub** и **Bitbucket**.
|
||||
|
||||
Работает на **LangChain/LangGraph** с локальной LLM через **Ollama**.
|
||||
|
||||
## 🌟 Особенности
|
||||
|
||||
- ✅ **Поддержка множества Git платформ**: Gitea (приоритет), GitHub, Bitbucket
|
||||
- 🤖 **AI-анализ кода**: использует Ollama с моделью codellama
|
||||
- 🔄 **Real-time обновления**: WebSocket для отслеживания прогресса
|
||||
- 🎯 **Умный анализ**: находит баги, проблемы безопасности, нарушения best practices
|
||||
- 🌐 **Современный UI**: React + TypeScript + Tailwind CSS
|
||||
- 📊 **Дашборд**: статистика и мониторинг ревью
|
||||
- 🪝 **Webhook интеграция**: автоматический запуск при создании/обновлении PR
|
||||
|
||||
## 🏗️ Архитектура
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
|
||||
│ Git Platform│─────▶│ Backend │─────▶│ Ollama │
|
||||
│ (Webhook) │ │ FastAPI + │ │ (codellama)│
|
||||
└─────────────┘ │ LangGraph │ └─────────────┘
|
||||
└──────┬───────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────┐
|
||||
│ Frontend │
|
||||
│ React + WS │
|
||||
└──────────────┘
|
||||
```
|
||||
|
||||
## 📋 Требования
|
||||
|
||||
- **Python 3.11+**
|
||||
- **Node.js 18+**
|
||||
- **Ollama** (установлен и запущен)
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### 1. Установка Ollama и модели
|
||||
|
||||
```bash
|
||||
# Установите Ollama с https://ollama.ai/
|
||||
|
||||
# Загрузите модель codellama
|
||||
ollama pull codellama
|
||||
|
||||
# Запустите Ollama
|
||||
ollama serve
|
||||
```
|
||||
|
||||
### 2. Backend (FastAPI)
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# Создайте виртуальное окружение
|
||||
python -m venv venv
|
||||
source venv/bin/activate # На Windows: venv\Scripts\activate
|
||||
|
||||
# Установите зависимости
|
||||
pip install -r requirements.txt
|
||||
|
||||
# Создайте .env файл
|
||||
cp .env.example .env
|
||||
|
||||
# Отредактируйте .env и установите:
|
||||
# - SECRET_KEY (генерируйте случайную строку)
|
||||
# - ENCRYPTION_KEY (генерируйте случайную строку)
|
||||
|
||||
# Запустите сервер
|
||||
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
||||
```
|
||||
|
||||
Backend будет доступен на `http://localhost:8000`
|
||||
|
||||
Swagger документация: `http://localhost:8000/docs`
|
||||
|
||||
### 3. Frontend (React)
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
|
||||
# Установите зависимости
|
||||
npm install
|
||||
|
||||
# Запустите dev сервер
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Frontend будет доступен на `http://localhost:5173`
|
||||
|
||||
## 🔧 Настройка
|
||||
|
||||
### Backend (.env)
|
||||
|
||||
```env
|
||||
# Ollama
|
||||
OLLAMA_BASE_URL=http://localhost:11434
|
||||
OLLAMA_MODEL=codellama
|
||||
|
||||
# Database
|
||||
DATABASE_URL=sqlite+aiosqlite:///./review.db
|
||||
|
||||
# Security
|
||||
SECRET_KEY=your-secret-key-here
|
||||
ENCRYPTION_KEY=your-encryption-key-here
|
||||
|
||||
# Server
|
||||
HOST=0.0.0.0
|
||||
PORT=8000
|
||||
DEBUG=True
|
||||
|
||||
# CORS
|
||||
CORS_ORIGINS=http://localhost:5173,http://localhost:3000
|
||||
```
|
||||
|
||||
### Frontend (.env)
|
||||
|
||||
```env
|
||||
VITE_API_URL=http://localhost:8000
|
||||
VITE_WS_URL=ws://localhost:8000
|
||||
```
|
||||
|
||||
## 📖 Использование
|
||||
|
||||
### 1. Добавление репозитория
|
||||
|
||||
1. Откройте UI: `http://localhost:5173`
|
||||
2. Перейдите на страницу **Репозитории**
|
||||
3. Нажмите **+ Добавить репозиторий**
|
||||
4. Заполните форму:
|
||||
- **Название**: имя вашего проекта
|
||||
- **Платформа**: Gitea / GitHub / Bitbucket
|
||||
- **URL**: полный URL репозитория
|
||||
- **API токен**: токен доступа к Git платформе
|
||||
|
||||
### 2. Настройка webhook в Gitea
|
||||
|
||||
1. Скопируйте **Webhook URL** из карточки репозитория
|
||||
2. В Gitea: Settings → Webhooks → Add Webhook
|
||||
3. Вставьте URL
|
||||
4. Выберите события: **Pull Request**
|
||||
5. Сохраните
|
||||
|
||||
### 3. Создание Pull Request
|
||||
|
||||
1. Создайте PR в вашем репозитории
|
||||
2. Webhook автоматически запустит ревью
|
||||
3. Следите за прогрессом в UI (страница **Ревью**)
|
||||
4. Комментарии появятся в PR автоматически
|
||||
|
||||
## 🎯 Что анализирует AI
|
||||
|
||||
- 🐛 **Потенциальные баги**: логические ошибки, null/undefined
|
||||
- 🔒 **Безопасность**: SQL injection, XSS, утечки данных
|
||||
- 📝 **Best practices**: SOLID, чистый код, паттерны
|
||||
- ⚡ **Производительность**: неэффективные алгоритмы, утечки памяти
|
||||
- 📖 **Читаемость**: понятность кода, комментарии
|
||||
|
||||
## 📊 API Endpoints
|
||||
|
||||
### Repositories
|
||||
|
||||
- `GET /api/repositories` - список репозиториев
|
||||
- `POST /api/repositories` - добавить репозиторий
|
||||
- `PUT /api/repositories/{id}` - обновить
|
||||
- `DELETE /api/repositories/{id}` - удалить
|
||||
|
||||
### Reviews
|
||||
|
||||
- `GET /api/reviews` - список ревью
|
||||
- `GET /api/reviews/{id}` - детали ревью
|
||||
- `POST /api/reviews/{id}/retry` - повторить ревью
|
||||
- `GET /api/reviews/stats/dashboard` - статистика
|
||||
|
||||
### Webhooks
|
||||
|
||||
- `POST /api/webhooks/gitea/{repository_id}` - Gitea webhook
|
||||
- `POST /api/webhooks/github/{repository_id}` - GitHub webhook
|
||||
- `POST /api/webhooks/bitbucket/{repository_id}` - Bitbucket webhook
|
||||
|
||||
### WebSocket
|
||||
|
||||
- `ws://localhost:8000/ws/reviews` - real-time обновления
|
||||
|
||||
## 🛠️ Разработка
|
||||
|
||||
### Backend
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# Запуск с hot reload
|
||||
uvicorn app.main:app --reload
|
||||
|
||||
# Миграции (если используется Alembic)
|
||||
alembic upgrade head
|
||||
```
|
||||
|
||||
### Frontend
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
|
||||
# Dev сервер
|
||||
npm run dev
|
||||
|
||||
# Сборка
|
||||
npm run build
|
||||
|
||||
# Предпросмотр сборки
|
||||
npm run preview
|
||||
|
||||
# Линтинг
|
||||
npm run lint
|
||||
```
|
||||
|
||||
## 🗂️ Структура проекта
|
||||
|
||||
```
|
||||
platform/review/
|
||||
├── backend/
|
||||
│ ├── app/
|
||||
│ │ ├── agents/ # LangGraph агенты
|
||||
│ │ ├── api/ # API endpoints
|
||||
│ │ ├── models/ # Database модели
|
||||
│ │ ├── schemas/ # Pydantic схемы
|
||||
│ │ ├── services/ # Git платформы
|
||||
│ │ ├── webhooks/ # Webhook обработчики
|
||||
│ │ ├── config.py
|
||||
│ │ ├── database.py
|
||||
│ │ └── main.py
|
||||
│ └── requirements.txt
|
||||
├── frontend/
|
||||
│ ├── src/
|
||||
│ │ ├── api/ # API клиент
|
||||
│ │ ├── components/ # React компоненты
|
||||
│ │ ├── pages/ # Страницы
|
||||
│ │ ├── types/ # TypeScript типы
|
||||
│ │ └── App.tsx
|
||||
│ └── package.json
|
||||
├── cloud.md # План проекта
|
||||
└── README.md # Этот файл
|
||||
```
|
||||
|
||||
## 🔐 Безопасность
|
||||
|
||||
- API токены шифруются перед сохранением (Fernet)
|
||||
- Webhook signature validation
|
||||
- CORS настроен для конкретных доменов
|
||||
- Rate limiting (рекомендуется для production)
|
||||
|
||||
## 🚀 Production развертывание
|
||||
|
||||
### Docker (рекомендуется)
|
||||
|
||||
```bash
|
||||
# TODO: Добавить Dockerfile и docker-compose.yml
|
||||
```
|
||||
|
||||
### Manual
|
||||
|
||||
1. Используйте PostgreSQL вместо SQLite
|
||||
2. Настройте reverse proxy (nginx)
|
||||
3. Используйте HTTPS
|
||||
4. Настройте environment variables
|
||||
5. Используйте process manager (systemd/supervisor)
|
||||
|
||||
## 🤝 Вклад в разработку
|
||||
|
||||
Contributions welcome!
|
||||
|
||||
1. Fork проект
|
||||
2. Создайте feature branch
|
||||
3. Commit изменения
|
||||
4. Push в branch
|
||||
5. Создайте Pull Request
|
||||
|
||||
## 📝 Лицензия
|
||||
|
||||
MIT License
|
||||
|
||||
## 🙏 Благодарности
|
||||
|
||||
- [LangChain](https://github.com/langchain-ai/langchain) - фреймворк для LLM
|
||||
- [Ollama](https://ollama.ai/) - локальный запуск LLM
|
||||
- [FastAPI](https://fastapi.tiangolo.com/) - веб-фреймворк
|
||||
- [React](https://react.dev/) - UI библиотека
|
||||
|
||||
## 📞 Поддержка
|
||||
|
||||
Возникли проблемы? Создайте Issue в репозитории.
|
||||
Автоматический ревьювер кода на базе AI для Gitea, GitHub и Bitbucket.
|
||||
|
||||
---
|
||||
|
||||
Made with ❤️ and 🤖 AI
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Запуск одной командой:
|
||||
|
||||
**Windows:**
|
||||
```bash
|
||||
start.bat
|
||||
```
|
||||
|
||||
**Linux/Mac:**
|
||||
```bash
|
||||
chmod +x start.sh
|
||||
./start.sh
|
||||
```
|
||||
|
||||
Это автоматически:
|
||||
- ✅ Проверит зависимости
|
||||
- ✅ Установит пакеты
|
||||
- ✅ Соберет frontend
|
||||
- ✅ Запустит сервер
|
||||
|
||||
**Готово!** Откройте http://localhost:8000
|
||||
|
||||
---
|
||||
|
||||
## 📋 Что делает платформа
|
||||
|
||||
1. **Получает Pull Request** через webhook
|
||||
2. **Анализирует код** с помощью AI (Ollama)
|
||||
3. **Находит проблемы:**
|
||||
- ❌ Критичные ошибки (синтаксис, логика)
|
||||
- ⚠️ Важные замечания (code smell, антипаттерны)
|
||||
- ℹ️ Рекомендации (стиль, best practices)
|
||||
4. **Публикует комментарии** в PR
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Особенности
|
||||
|
||||
- ✅ **3 платформы:** Gitea, GitHub, Bitbucket
|
||||
- ✅ **Webhooks:** Автоматический ревью при создании PR
|
||||
- ✅ **Ручной запуск:** Кнопка "Проверить сейчас"
|
||||
- ✅ **WebSocket:** Обновления в реальном времени
|
||||
- ✅ **Детальные комментарии:** Отдельный комментарий на каждую проблему
|
||||
- ✅ **Мастер токены:** Один токен для всех репозиториев
|
||||
- ✅ **Единый порт:** Frontend и Backend на 8000
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Требования
|
||||
|
||||
- **Python:** 3.10+
|
||||
- **Node.js:** 18+
|
||||
- **Ollama:** Для запуска AI моделей
|
||||
|
||||
### Установка Ollama:
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
curl -fsSL https://ollama.com/install.sh | sh
|
||||
```
|
||||
|
||||
**Windows/Mac:**
|
||||
Скачайте с https://ollama.com/download
|
||||
|
||||
### Скачайте модель:
|
||||
|
||||
```bash
|
||||
ollama pull mistral:7b
|
||||
# или
|
||||
ollama pull llama3:8b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Настройка
|
||||
|
||||
### 1. Клонируйте репозиторий
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd platform/review
|
||||
```
|
||||
|
||||
### 2. Настройте `.env`
|
||||
|
||||
Файл `backend/.env` будет создан автоматически из `.env.example`.
|
||||
|
||||
**Обязательно настройте:**
|
||||
|
||||
```bash
|
||||
# Ollama
|
||||
OLLAMA_BASE_URL=http://localhost:11434
|
||||
OLLAMA_MODEL=mistral:7b
|
||||
|
||||
# Мастер токены (опционально)
|
||||
MASTER_GITEA_TOKEN=your_token_here
|
||||
|
||||
# Ключ шифрования (обязательно!)
|
||||
ENCRYPTION_KEY=your-32-char-key-here
|
||||
```
|
||||
|
||||
**Генерация ключа:**
|
||||
```python
|
||||
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||
```
|
||||
|
||||
### 3. Запустите
|
||||
|
||||
```bash
|
||||
./start.sh # Linux/Mac
|
||||
start.bat # Windows
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 Использование
|
||||
|
||||
### 1. Добавьте репозиторий
|
||||
|
||||
http://localhost:8000 → **"Добавить репозиторий"**
|
||||
|
||||
- **Платформа:** Gitea/GitHub/Bitbucket
|
||||
- **URL:** https://git.example.com/owner/repo
|
||||
- **API Token:** (или оставьте пустым для мастер токена)
|
||||
|
||||
### 2. Настройте webhook
|
||||
|
||||
Скопируйте webhook URL из списка репозиториев.
|
||||
|
||||
**В Gitea:**
|
||||
Settings → Webhooks → Add Webhook → Gitea
|
||||
- Payload URL: `http://your-server:8000/api/webhooks/gitea/1`
|
||||
- Content Type: `application/json`
|
||||
- Secret: (из списка репозиториев)
|
||||
- Trigger: Pull Request
|
||||
|
||||
### 3. Готово!
|
||||
|
||||
Создайте PR и агент автоматически проведет ревью! 🎉
|
||||
|
||||
Или нажмите **"🔍 Проверить сейчас"** для ручного запуска.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Что вы увидите
|
||||
|
||||
### В интерфейсе:
|
||||
|
||||
```
|
||||
📊 Репозитории: 5
|
||||
🔍 Ревью: 23
|
||||
✅ Успешных: 20
|
||||
❌ Ошибок: 3
|
||||
```
|
||||
|
||||
### В Gitea/GitHub:
|
||||
|
||||
**Общий комментарий:**
|
||||
```
|
||||
🤖 AI Code Review
|
||||
|
||||
📊 Статистика
|
||||
- Всего проблем: 4
|
||||
- ❌ Критичных: 4
|
||||
|
||||
💡 Рекомендации
|
||||
⚠️ Найдены критичные проблемы!
|
||||
Пожалуйста, исправьте их перед мержем.
|
||||
|
||||
📝 Детальные комментарии для каждой
|
||||
проблемы опубликованы ниже.
|
||||
```
|
||||
|
||||
**Отдельные комментарии:**
|
||||
```
|
||||
❌ src/pages/search-character.tsx:58
|
||||
|
||||
ERROR: Опечатка в строке:
|
||||
'shmapplication/json' должно быть
|
||||
'application/json'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Разработка
|
||||
|
||||
### Backend:
|
||||
```bash
|
||||
cd backend
|
||||
source venv/bin/activate # Windows: venv\Scripts\activate
|
||||
uvicorn app.main:app --reload
|
||||
```
|
||||
|
||||
### Frontend:
|
||||
```bash
|
||||
cd frontend
|
||||
npm run dev
|
||||
```
|
||||
|
||||
В режиме разработки:
|
||||
- Frontend: http://localhost:5173
|
||||
- Backend: http://localhost:8000
|
||||
|
||||
---
|
||||
|
||||
## 📁 Структура
|
||||
|
||||
```
|
||||
platform/review/
|
||||
├── backend/ # FastAPI + LangGraph
|
||||
│ ├── app/
|
||||
│ │ ├── agents/ # AI агент
|
||||
│ │ ├── api/ # REST endpoints
|
||||
│ │ ├── models/ # SQLAlchemy models
|
||||
│ │ ├── services/ # Git API clients
|
||||
│ │ └── main.py # Entry point
|
||||
│ ├── public/ # Frontend build (auto-generated)
|
||||
│ └── requirements.txt
|
||||
├── frontend/ # React + Vite
|
||||
│ ├── src/
|
||||
│ └── package.json
|
||||
├── start.sh # Единый запуск (Linux/Mac)
|
||||
├── start.bat # Единый запуск (Windows)
|
||||
└── DEPLOYMENT.md # Подробная документация
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌟 Возможности
|
||||
|
||||
### ✅ Реализовано:
|
||||
|
||||
- [x] Поддержка Gitea, GitHub, Bitbucket
|
||||
- [x] Webhooks для автоматического ревью
|
||||
- [x] Ручной запуск ревью
|
||||
- [x] Детальные комментарии с ссылками на строки
|
||||
- [x] WebSocket для real-time обновлений
|
||||
- [x] Мастер токены для упрощения настройки
|
||||
- [x] Единый запуск (frontend + backend)
|
||||
- [x] Экранирование HTML тегов в комментариях
|
||||
- [x] Контекст PR (title + description) в промпте
|
||||
- [x] Retry механизм для failed ревью
|
||||
- [x] Модальные окна вместо alert/confirm
|
||||
|
||||
### 🚧 Планируется:
|
||||
|
||||
- [ ] Docker контейнер
|
||||
- [ ] Статусы PR (Approve/Request Changes)
|
||||
- [ ] Настраиваемые правила ревью
|
||||
- [ ] Кастомные промпты
|
||||
- [ ] Множественные AI модели
|
||||
- [ ] Метрики и аналитика
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Вклад
|
||||
|
||||
Pull requests приветствуются!
|
||||
|
||||
Для больших изменений сначала откройте issue для обсуждения.
|
||||
|
||||
---
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
MIT
|
||||
|
||||
---
|
||||
|
||||
## 📚 Документация
|
||||
|
||||
- **[DEPLOYMENT.md](DEPLOYMENT.md)** - Полное руководство по развертыванию
|
||||
- **[ARCHITECTURE.md](ARCHITECTURE.md)** - Архитектура проекта
|
||||
- **[DEBUG_GUIDE.md](DEBUG_GUIDE.md)** - Отладка AI агента
|
||||
- **[MODEL_RECOMMENDATION.md](MODEL_RECOMMENDATION.md)** - Рекомендации по моделям
|
||||
- **[MASTER_TOKEN_FEATURE.md](MASTER_TOKEN_FEATURE.md)** - Мастер токены
|
||||
- **[HTML_ESCAPE_FIX.md](HTML_ESCAPE_FIX.md)** - Экранирование HTML
|
||||
|
||||
---
|
||||
|
||||
## 🆘 Помощь
|
||||
|
||||
### Проблемы с Ollama?
|
||||
|
||||
```bash
|
||||
# Проверьте что Ollama запущен
|
||||
curl http://localhost:11434/api/version
|
||||
|
||||
# Скачайте модель
|
||||
ollama pull mistral:7b
|
||||
```
|
||||
|
||||
### Frontend не отображается?
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Backend не запускается?
|
||||
|
||||
Проверьте `.env` файл и установите `ENCRYPTION_KEY`.
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Начните использовать!
|
||||
|
||||
```bash
|
||||
# 1. Клонируйте
|
||||
git clone <url>
|
||||
cd platform/review
|
||||
|
||||
# 2. Настройте .env
|
||||
nano backend/.env
|
||||
|
||||
# 3. Запустите
|
||||
./start.sh # или start.bat
|
||||
|
||||
# 4. Откройте
|
||||
http://localhost:8000
|
||||
```
|
||||
|
||||
**Готово!** 🚀
|
||||
|
||||
@ -2,8 +2,11 @@
|
||||
|
||||
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import FileResponse
|
||||
from contextlib import asynccontextmanager
|
||||
from typing import List
|
||||
from pathlib import Path
|
||||
import json
|
||||
|
||||
from app.config import settings
|
||||
@ -67,15 +70,39 @@ app.add_middleware(
|
||||
# Include API routes
|
||||
app.include_router(api_router, prefix="/api")
|
||||
|
||||
|
||||
@app.get("/")
|
||||
async def root():
|
||||
"""Root endpoint"""
|
||||
return {
|
||||
"message": "AI Code Review Agent API",
|
||||
"version": "0.1.0",
|
||||
"docs": "/docs"
|
||||
}
|
||||
# Serve static files (frontend build)
|
||||
public_dir = Path(__file__).parent.parent / "public"
|
||||
if public_dir.exists():
|
||||
# Serve assets (JS, CSS, images)
|
||||
app.mount("/assets", StaticFiles(directory=str(public_dir / "assets")), name="assets")
|
||||
|
||||
@app.get("/", response_class=FileResponse)
|
||||
async def serve_frontend_root():
|
||||
"""Serve frontend index.html"""
|
||||
return FileResponse(str(public_dir / "index.html"))
|
||||
|
||||
@app.get("/{full_path:path}", response_class=FileResponse)
|
||||
async def serve_frontend_routes(full_path: str):
|
||||
"""Serve frontend for all routes (SPA support)"""
|
||||
# Skip API and WebSocket routes
|
||||
if full_path.startswith(("api/", "ws/", "docs", "redoc", "openapi.json")):
|
||||
return None
|
||||
|
||||
file_path = public_dir / full_path
|
||||
if file_path.exists() and file_path.is_file():
|
||||
return FileResponse(str(file_path))
|
||||
# Fallback to index.html for SPA routing
|
||||
return FileResponse(str(public_dir / "index.html"))
|
||||
else:
|
||||
@app.get("/")
|
||||
async def root():
|
||||
"""Root endpoint (when frontend not built)"""
|
||||
return {
|
||||
"message": "AI Code Review Agent API",
|
||||
"version": "0.1.0",
|
||||
"docs": "/docs",
|
||||
"note": "Frontend not built. Run 'npm run build' in frontend directory."
|
||||
}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
|
||||
@ -16,8 +16,9 @@ export default function ReviewDetail() {
|
||||
const { data: review, isLoading } = useQuery({
|
||||
queryKey: ['review', id],
|
||||
queryFn: () => getReview(Number(id)),
|
||||
refetchInterval: (data) => {
|
||||
refetchInterval: (query) => {
|
||||
// Refetch if review is in progress
|
||||
const data = query.state.data;
|
||||
return data?.status && ['pending', 'fetching', 'analyzing', 'commenting'].includes(data.status)
|
||||
? 5000
|
||||
: false;
|
||||
|
||||
@ -4,6 +4,10 @@ import react from '@vitejs/plugin-react'
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
build: {
|
||||
outDir: '../backend/public',
|
||||
emptyOutDir: true,
|
||||
},
|
||||
server: {
|
||||
port: 5173,
|
||||
proxy: {
|
||||
|
||||
95
start.bat
Normal file
95
start.bat
Normal file
@ -0,0 +1,95 @@
|
||||
@echo off
|
||||
REM Единый скрипт запуска AI Code Review Platform
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo AI Code Review Platform - Запуск
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
REM 1. Проверка Node.js
|
||||
echo [STEP 1/7] Проверка Node.js...
|
||||
where node >nul 2>nul
|
||||
if %ERRORLEVEL% NEQ 0 (
|
||||
echo [ERROR] Node.js не установлен! Установите Node.js 18+ и попробуйте снова.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
node --version
|
||||
echo [OK] Node.js установлен
|
||||
echo.
|
||||
|
||||
REM 2. Проверка Python
|
||||
echo [STEP 2/7] Проверка Python...
|
||||
where python >nul 2>nul
|
||||
if %ERRORLEVEL% NEQ 0 (
|
||||
echo [ERROR] Python не установлен! Установите Python 3.10+ и попробуйте снова.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
python --version
|
||||
echo [OK] Python установлен
|
||||
echo.
|
||||
|
||||
REM 3. Установка зависимостей frontend
|
||||
echo [STEP 3/7] Установка зависимостей frontend...
|
||||
cd frontend
|
||||
if not exist "node_modules\" (
|
||||
echo Установка npm пакетов...
|
||||
call npm install
|
||||
) else (
|
||||
echo node_modules уже существует, пропускаем...
|
||||
)
|
||||
echo [OK] Зависимости frontend установлены
|
||||
echo.
|
||||
|
||||
REM 4. Сборка frontend
|
||||
echo [STEP 4/7] Сборка frontend...
|
||||
call npm run build
|
||||
echo [OK] Frontend собран в backend/public
|
||||
echo.
|
||||
|
||||
REM 5. Установка зависимостей backend
|
||||
cd ..\backend
|
||||
echo [STEP 5/7] Установка зависимостей backend...
|
||||
if not exist "venv\" (
|
||||
echo Создание виртуального окружения...
|
||||
python -m venv venv
|
||||
)
|
||||
|
||||
REM Активация venv
|
||||
call venv\Scripts\activate.bat
|
||||
|
||||
REM Установка зависимостей
|
||||
pip install -r requirements.txt
|
||||
echo [OK] Зависимости backend установлены
|
||||
echo.
|
||||
|
||||
REM 6. Проверка .env
|
||||
echo [STEP 6/7] Проверка конфигурации...
|
||||
if not exist ".env" (
|
||||
echo [WARNING] Файл .env не найден!
|
||||
if exist ".env.example" (
|
||||
echo Создаем .env из примера...
|
||||
copy .env.example .env
|
||||
echo [OK] Создан .env файл
|
||||
echo [WARNING] ВАЖНО: Отредактируйте .env и добавьте необходимые токены!
|
||||
) else (
|
||||
echo [ERROR] .env.example не найден!
|
||||
)
|
||||
)
|
||||
echo.
|
||||
|
||||
REM 7. Запуск backend
|
||||
echo [STEP 7/7] Запуск сервера...
|
||||
echo ========================================
|
||||
echo.
|
||||
echo Backend: http://localhost:8000
|
||||
echo Frontend: http://localhost:8000
|
||||
echo API Docs: http://localhost:8000/docs
|
||||
echo.
|
||||
echo Для остановки нажмите Ctrl+C
|
||||
echo.
|
||||
|
||||
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||
|
||||
97
start.sh
Normal file
97
start.sh
Normal file
@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
# Единый скрипт запуска AI Code Review Platform
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 AI Code Review Platform - Запуск"
|
||||
echo "===================================="
|
||||
echo ""
|
||||
|
||||
# Цвета для вывода
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 1. Проверка Node.js
|
||||
echo -e "${YELLOW}📦 Проверка Node.js...${NC}"
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo "❌ Node.js не установлен! Установите Node.js 18+ и попробуйте снова."
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✅ Node.js $(node --version)${NC}"
|
||||
echo ""
|
||||
|
||||
# 2. Проверка Python
|
||||
echo -e "${YELLOW}🐍 Проверка Python...${NC}"
|
||||
if ! command -v python &> /dev/null && ! command -v python3 &> /dev/null; then
|
||||
echo "❌ Python не установлен! Установите Python 3.10+ и попробуйте снова."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PYTHON_CMD="python3"
|
||||
if ! command -v python3 &> /dev/null; then
|
||||
PYTHON_CMD="python"
|
||||
fi
|
||||
echo -e "${GREEN}✅ Python $($PYTHON_CMD --version)${NC}"
|
||||
echo ""
|
||||
|
||||
# 3. Установка зависимостей frontend
|
||||
echo -e "${YELLOW}📦 Установка зависимостей frontend...${NC}"
|
||||
cd frontend
|
||||
if [ ! -d "node_modules" ]; then
|
||||
npm install
|
||||
else
|
||||
echo "node_modules уже существует, пропускаем..."
|
||||
fi
|
||||
echo -e "${GREEN}✅ Зависимости frontend установлены${NC}"
|
||||
echo ""
|
||||
|
||||
# 4. Сборка frontend
|
||||
echo -e "${YELLOW}🔨 Сборка frontend...${NC}"
|
||||
npm run build
|
||||
echo -e "${GREEN}✅ Frontend собран в backend/public${NC}"
|
||||
echo ""
|
||||
|
||||
# 5. Установка зависимостей backend
|
||||
cd ../backend
|
||||
echo -e "${YELLOW}📦 Установка зависимостей backend...${NC}"
|
||||
if [ ! -d "venv" ]; then
|
||||
echo "Создание виртуального окружения..."
|
||||
$PYTHON_CMD -m venv venv
|
||||
fi
|
||||
|
||||
# Активация venv
|
||||
source venv/bin/activate
|
||||
|
||||
# Установка зависимостей
|
||||
pip install -r requirements.txt
|
||||
echo -e "${GREEN}✅ Зависимости backend установлены${NC}"
|
||||
echo ""
|
||||
|
||||
# 6. Проверка .env
|
||||
if [ ! -f ".env" ]; then
|
||||
echo -e "${YELLOW}⚠️ Файл .env не найден!${NC}"
|
||||
echo "Создаем .env из примера..."
|
||||
if [ -f ".env.example" ]; then
|
||||
cp .env.example .env
|
||||
echo -e "${GREEN}✅ Создан .env файл${NC}"
|
||||
echo -e "${YELLOW}⚠️ ВАЖНО: Отредактируйте .env и добавьте необходимые токены!${NC}"
|
||||
else
|
||||
echo "❌ .env.example не найден!"
|
||||
fi
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# 7. Запуск backend
|
||||
echo -e "${GREEN}🎉 Запуск сервера...${NC}"
|
||||
echo "===================================="
|
||||
echo ""
|
||||
echo "📍 Backend: http://localhost:8000"
|
||||
echo "📍 Frontend: http://localhost:8000"
|
||||
echo "📍 API Docs: http://localhost:8000/docs"
|
||||
echo ""
|
||||
echo "Для остановки нажмите Ctrl+C"
|
||||
echo ""
|
||||
|
||||
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user