diff --git a/.gitignore b/.gitignore index e7af1a6..d471d7e 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,10 @@ env/ # Database *.db +*.db-journal + +# Frontend build +backend/public/ *.sqlite *.sqlite3 diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..c928566 --- /dev/null +++ b/DEPLOYMENT.md @@ -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 +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 в разработке +- 📚 Документация + +**Запускайте и наслаждайтесь!** 🎉 + diff --git a/README.md b/README.md index a7c6943..9f98f5c 100644 --- a/README.md +++ b/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 +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 +cd platform/review + +# 2. Настройте .env +nano backend/.env + +# 3. Запустите +./start.sh # или start.bat + +# 4. Откройте +http://localhost:8000 +``` + +**Готово!** 🚀 diff --git a/backend/app/main.py b/backend/app/main.py index ce15750..5c73583 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -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") diff --git a/frontend/src/pages/ReviewDetail.tsx b/frontend/src/pages/ReviewDetail.tsx index 708bc60..056d222 100644 --- a/frontend/src/pages/ReviewDetail.tsx +++ b/frontend/src/pages/ReviewDetail.tsx @@ -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; diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 5c5a888..7f00471 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -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: { diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..2608502 --- /dev/null +++ b/start.bat @@ -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 + diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..bdd6f75 --- /dev/null +++ b/start.sh @@ -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 +