Files
voidea/template/AI_CONTEXT.md
T

317 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Полная спецификация проекта для ИИ-ассистента
Этот файл — единственный источник истины для ИИ, работающего с проектом.
Прочитай его полностью перед началом любой работы. Если какой-то аспект не описан — спроси.
---
## 1. РОЛИ
- **Ты — ИИ-ассистент.** Твоя задача: писать код, соответствующий правилам проекта.
- **Пользователь — владелец проекта.** Он принимает все стратегические решения.
- **Агенты — автоматические участники.** Они следят за качеством, версиями и эволюцией.
---
## 2. СТРУКТУРА ПРОЕКТА (MUST FOLLOW)
```
project/
├── app/ # Backend (Python FastAPI)
│ ├── __init__.py
│ ├── main.py # FastAPI app, lifespan, middleware
│ ├── api/
│ │ └── v1/ # Версионированные роуты
│ │ ├── __init__.py # api_v1_router = APIRouter(prefix="/api/v1")
│ │ ├── auth.py # POST /login, /register, /refresh, /oauth
│ │ ├── users.py # GET/PATCH /me
│ │ ├── ideas.py # CRUD /ideas + POST /analyze
│ │ ├── agents.py # GET /agents + POST /run
│ │ ├── sync.py # POST /sync/pull, /sync/push
│ │ └── admin.py # GET /users, /health, /logs
│ ├── core/
│ │ ├── __init__.py
│ │ ├── config.py # Pydantic Settings из .env
│ │ ├── base.py # SQLBase, CoreModel, UUIDMixin, TimestampMixin
│ │ ├── database.py # Engine + async_session_maker + get_db
│ │ ├── security.py # JWT create/decode, password hash
│ │ ├── exceptions.py # HTTPException подклассы
│ │ ├── dependencies.py # get_db, get_current_user, require_admin
│ │ └── metrics.py # Middleware для сбора метрик
│ ├── models/ # SQLAlchemy модели
│ ├── schemas/ # Pydantic схемы (Request/Response)
│ ├── services/ # Бизнес-логика
│ ├── integrations/ # AI провайдеры, внешние API
│ ├── tasks/ # Celery задачи (или прямой вызов)
│ └── agents/ # Системные агенты
├── webui/ # Frontend (React + Vite + Tailwind)
│ ├── src/
│ │ ├── main.tsx
│ │ ├── App.tsx # BrowserRouter + Routes
│ │ ├── index.css # Tailwind directives
│ │ ├── api/ # HTTP-клиент, типы запросов
│ │ ├── auth/ # AuthContext, login/register
│ │ ├── components/ # Layout, ProtectedRoute
│ │ └── pages/ # Dashboard, IdeaView, Admin
│ └── vite.config.ts # Vite + React + PWA proxy
├── tests/ # pytest тесты
├── docs/ # Документация
├── CHANGELOG/ # Версионирование
├── migrations/ # Alembic миграции
├── .env.example
└── project.yaml
```
## 3. ПРАВИЛА КОДИРОВАНИЯ (MUST FOLLOW)
### 3.1 Python
- **Версия:** Python 3.12+
- **Типизация:** `from __future__ import annotations` во всех файлах, `X | None` вместо `Optional[X]`
- **Строки:** двойные кавычки `"` для строковых литералов, одинарные `'` для docstrings
- **Длина строки:** 88 символов (ruff format)
- **Импорты:** абсолютные, порядок: stdlib → third-party → local (алфавитный внутри групп)
- **Docstrings:** Google-style для всех публичных классов/функций/методов
- **Именование:** классы PascalCase, функции/переменные snake_case, константы UPPER_SNAKE
- **Линтер:** ruff (E, F, W, I, N, UP)
- **Форматтер:** ruff format
### 3.2 SQL
- **Ключевые слова:** UPPERCASE (SELECT, FROM, WHERE)
- **Таблицы/поля:** snake_case
- **Индексы:** `ix_tablename_column`
- **Уникальность:** `uq_tablename_column`
### 3.3 TypeScript/React
- **Форматтер:** Prettier (100 символов)
- **Типы:** strict TypeScript, `any` запрещён
- **Импорты:** абсолютные через `@/` alias
- **Стили:** Tailwind CSS, никаких CSS-in-JS
- **Асинхронность:** async/await, `.then()` запрещён
- **Состояние:** zustand или React Context
## 4. АРХИТЕКТУРА (MUST FOLLOW)
### 4.1 Слои (зависимости только внутрь)
```
API → Services → Integrations → Data → Core
```
- **API** не знает про БД. Не создаёт сессий. Только Depends(get_db).
- **Services** не знают про HTTP. Не импортируют FastAPI/fastapi. Работают с БД через сессию.
- **Integrations** не знают про бизнес-логику. Оборачивают внешние API.
- **Data** (models) — SQLAlchemy модели и репозитории.
- **Core** — конфиг, базовые классы, утилиты, безопасность.
### 4.2 Сервисы
Сервис — это класс, который принимает `db: AsyncSession` в конструкторе:
```python
class IdeaService:
def __init__(self, db: AsyncSession):
self.db = db
async def get_by_id(self, idea_id: str) -> Idea | None:
result = await self.db.execute(select(Idea).where(Idea.id == idea_id))
return result.scalar_one_or_none()
```
### 4.3 API
API-роуты — это функции, которые:
1. Принимают `Depends(get_db)` и `Depends(get_current_user)`
2. Создают сервис с сессией
3. Вызывают метод сервиса
4. Возвращают Pydantic response
```python
@router.get("/{idea_id}", response_model=IdeaResponse)
async def get_idea(
idea_id: str,
user: Annotated[User, Depends(get_current_user)],
db: AsyncSession = Depends(get_db),
):
service = IdeaService(db)
idea = await service.get_by_id(idea_id)
if not idea or str(idea.user_id) != str(user.id):
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
return _to_response(idea)
```
### 4.4 Зависимости (dependencies.py)
- `get_db()` — yield async_session_maker(), commit/rollback/close
- `get_current_user(credentials, db)` — decode JWT → find user in DB
- `require_admin(user)` — check is_superuser
ВАЖНО: `get_current_user` принимает `db = Depends(get_db)`, а не создаёт свою сессию.
### 4.5 Config
```python
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
server_host: str = "0.0.0.0"
server_port: int = 8020
database_url: str = "sqlite+aiosqlite:///./app.db"
jwt_secret_key: str = ""
log_level: str = "INFO"
@property
def is_sqlite(self) -> bool:
return "sqlite" in self.database_url
```
## 5. БАЗА ДАННЫХ
### 5.1 Поддержка SQLite и PostgreSQL
Для портабельности между SQLite (dev) и PostgreSQL (prod) используем:
- **UUID поля:** `String(36)` во всех моделях (храним UUID как строку)
- **JSON/Array:** `JSON` вместо `JSONB` и `ARRAY`
- **Автовыбор:** через `settings.database_url` и `settings.is_sqlite`
### 5.2 Модели
```python
class UUIDMixin:
id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4()))
class TimestampMixin:
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
```
## 6. AI-ИНТЕГРАЦИЯ
### 6.1 Паттерн FallbackChain
```python
class AIProvider(ABC):
async def analyze(self, prompt: str, **kwargs) -> AIResult: ...
class FallbackChain:
def __init__(self, providers: list[AIProvider], max_retries: int = 2):
...
async def analyze(self, prompt: str, **kwargs) -> AIResult:
# Try each provider in order, max_retries per provider
# 1st retry after 2s, 2nd after 5s
# All fail → AIResult(success=False, error="All providers failed")
```
### 6.2 Где хранить промпты
- **YAML-файл** (`docs/agent_prompts.yaml`) для настроек (system_prompt, temperature, max_tokens, provider)
- **MD-файлы** (`docs/specs/agents/`) для детальных спецификаций
- Загрузка через `PromptLoader` (пытается YAML → falls back к MD)
## 7. АГЕНТЫ (IF APPLICABLE)
### 7.1 Ядро (4 агента, с первого коммита)
1. **DocAgent** — пишет документацию
2. **AuditAgent** — проверяет правила
3. **EvolutionAgent** — версионирует агентов
4. **SupervisorAgent** — следит за всеми агентами
### 7.2 Архитектура агента
```python
class BaseAgent(ABC):
name: str
version: str = "1.0.0"
description: str = ""
triggers: list[AgentTrigger]
async def run(self, context: dict | None = None) -> AgentResult: ...
async def health_check(self) -> bool: ...
def compute_checksum(self) -> str: ... # SHA256 от __file__
def bump_version(self, version_type: str = "patch") -> str: ...
```
### 7.3 Agent Versioning
- Каждый агент: независимое A.B.C
- SHA256 checksum файла агента сравнивается с хранимым
- Не совпал → авто-бамп patch + запись в `CHANGELOG/agents/<name>.md`
- EvolutionAgent бампает minor (новая capability) и major (breaking change)
- Формат changelog:
```markdown
# agent_name Changelog
<!-- checksum: sha256hash -->
## 1.0.1 (2026-05-10)
- Fixed: описание
## 1.0.0 (2026-05-09)
- Initial version
```
## 8. ФОНОВЫЕ ЗАДАЧИ
### 8.1 Celery (production) / Прямой вызов (dev)
```python
# tasks/analysis.py
@celery_app.task(bind=True, max_retries=2, name="analyze_idea")
def analyze_idea(self, idea_id: str, role: str) -> dict:
return asyncio.run(_analyze_idea_async(idea_id, role))
# services/analysis_service.py
class AnalysisService:
async def start_analysis(self, idea_id: str) -> dict:
if settings.celery_broker_url:
task = analyze_idea.delay(idea_id, role)
else:
task = await _analyze_local(idea_id, role)
...
```
## 9. ТЕСТИРОВАНИЕ
- **Фреймворк:** pytest с asyncio_mode=auto
- **Unit-тесты:** `tests/unit/` — изолированные, mocked зависимости
- **Integration-тесты:** `tests/integration/` — с БД, реальные запросы
- **Smoke-тесты:** `tests/smoke/` — минимум 1 на endpoint
- **Покрытие:** > 80% (критический код: auth, security, payments — 100%)
## 10. БЕЗОПАСНОСТЬ
- JWT: HS256, access_token 60min, refresh_token 30d
- Пароли: bcrypt (passlib)
- .env в .gitignore — всегда
- Pydantic валидация на всех входах
- RBAC: user, admin (is_superuser)
## 11. РЕШЕНИЯ (SHOULD ASK)
Перед каждым из этих выборов — остановись и спроси пользователя:
| Решение | Опции по умолчанию |
|---------|-------------------|
| База данных | SQLite (dev) → PostgreSQL (prod) |
| Фоновые задачи | Прямой вызов (dev) → Celery (prod) |
| AI провайдеры | FallbackChain с 2 провайдерами |
| Аутентификация | Email+password + JWT |
| Агенты | 4 ядерных + остальные по необходимости |
| Фронтенд | React + Vite + Tailwind + PWA |
| CI/CD | GitHub Actions |
## 12. ЧТО ДЕЛАТЬ ЕСЛИ НЕ ЗНАЕШЬ
1. Поищи в `docs/` — там описано 90% ситуаций
2. Если не нашёл — открой `notes/encountered-issues.md` — может это уже было
3. Если и там нет — посмотри на `notes/improvements.md` — может это запланированное улучшение
4. Если ничего не помогло — **спроси пользователя с рекомендацией**
---
*Этот файл сгенерирован на основе реального опыта. Обновляется при изменении проекта.*