179 lines
8.0 KiB
Markdown
179 lines
8.0 KiB
Markdown
# ZBrain — Claude Code Context
|
||
|
||
Этот файл читается Claude Code при работе в репозитории ZBrain. Описывает контекст проекта, конвенции, и где что искать.
|
||
|
||
## Что это за проект
|
||
|
||
ZBrain — централизованная база знаний для AI-агентов ZETIT. Это:
|
||
- **Веб-админка** для управления несколькими gbrain instance'ами
|
||
- **MCP-прокси** между Claude Code и gbrain с auth, rate limit, audit
|
||
- **Многотенантная архитектура** с изоляцией БД на каждый брейн
|
||
|
||
Полное описание — в [README.md](README.md), архитектура — в [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
|
||
|
||
## Контекст пользователя
|
||
|
||
Этот проект разрабатывается **Зуевым Алексеем (ZETIT, ИП)**. Окружение:
|
||
- **Продакшен серверы** работают на Ubuntu 22.04
|
||
- **Сеть** — за FNA-прокси (`fna.zetit.ru:3128`, логин `client_001`)
|
||
- **Git** — на git.zetit.ru (внутренний). Этот репо: `git@git.zetit.ru:zuevav/ZBrain.git`
|
||
- **gbrain** — vendored mirror на `git@git.zetit.ru:zuevav/gbrain-mirror.git`
|
||
- **Параллельные проекты** — ZetitConnect (тоже Node/React/Postgres), TeleraPharma инфра, личные проекты
|
||
- **Стиль работы** — детальные spec'и + поэтапная реализация через Claude Code
|
||
|
||
## Технологический стек
|
||
|
||
| Слой | Технология |
|
||
|------|-----------|
|
||
| Backend runtime | Node.js 22 LTS + TypeScript 5.6 |
|
||
| Backend framework | Express 4 |
|
||
| ORM | Drizzle ORM |
|
||
| Frontend | React 18 + Vite + TypeScript |
|
||
| Styling | Tailwind CSS + shadcn/ui |
|
||
| State | React Query + Zustand |
|
||
| Forms | React Hook Form + Zod |
|
||
| DB | PostgreSQL 16 + pgvector |
|
||
| Auth | passport.js (local + yandex + github) |
|
||
| Package manager | bun (workspaces) |
|
||
| Testing | Vitest |
|
||
| Deployment | Docker Compose + systemd для gbrain instances |
|
||
|
||
## Структура репозитория
|
||
|
||
```
|
||
ZBrain/
|
||
├── apps/
|
||
│ ├── api/ # Backend Express app
|
||
│ │ └── src/
|
||
│ │ ├── routes/ # HTTP routes
|
||
│ │ ├── services/ # бизнес-логика
|
||
│ │ ├── middleware/ # auth, RBAC, rate limit
|
||
│ │ ├── db/ # Drizzle schema и миграции
|
||
│ │ └── lib/ # утилиты
|
||
│ └── web/ # Frontend React app
|
||
│ └── src/
|
||
│ ├── pages/ # страницы (роуты)
|
||
│ ├── components/ # переиспользуемые компоненты
|
||
│ ├── hooks/ # React hooks
|
||
│ └── api/ # клиент к /api
|
||
├── packages/
|
||
│ ├── shared/ # типы и схемы общие для api+web
|
||
│ └── mcp-proxy/ # MCP proxy (валидация токенов, rate limit, audit)
|
||
├── deploy/ # Docker, systemd, nginx конфиги
|
||
├── docs/ # документация
|
||
└── scripts/ # bash скрипты для VM
|
||
```
|
||
|
||
## Конвенции кода
|
||
|
||
### TypeScript
|
||
|
||
- `strict: true`, `noUncheckedIndexedAccess: true`
|
||
- Все API ответы типизированы через `@zbrain/shared` types
|
||
- Все request bodies валидируются через Zod schemas из `@zbrain/shared`
|
||
- Никаких `any` без `// FIXME` комментария
|
||
|
||
### Express routes
|
||
|
||
```typescript
|
||
// apps/api/src/routes/brains.ts
|
||
import { Router } from 'express';
|
||
import { requireAuth, requireRole } from '../middleware/auth.js';
|
||
import { CreateBrainSchema } from '@zbrain/shared';
|
||
|
||
export const brainsRouter = Router();
|
||
|
||
brainsRouter.get('/', requireAuth, async (req, res) => {
|
||
const brains = await brainService.list(req.user);
|
||
res.json({ items: brains });
|
||
});
|
||
|
||
brainsRouter.post('/', requireAuth, requireRole(['owner', 'admin']), async (req, res) => {
|
||
const body = CreateBrainSchema.parse(req.body);
|
||
const brain = await brainService.create(body, req.user);
|
||
res.status(201).json(brain);
|
||
});
|
||
```
|
||
|
||
### React components
|
||
|
||
- Functional components с hooks (без class components)
|
||
- Props типизированы через interface
|
||
- Используем shadcn/ui компоненты, не пишем свои базовые (Button, Input)
|
||
- React Query для всех server-state, Zustand только для UI state
|
||
|
||
### Стиль ошибок
|
||
|
||
```typescript
|
||
// API возвращает структуру ApiError из @zbrain/shared
|
||
res.status(400).json({
|
||
error: 'Validation failed',
|
||
code: 'VALIDATION_ERROR',
|
||
details: zodError.flatten(),
|
||
});
|
||
```
|
||
|
||
## Что точно делать НЕ надо
|
||
|
||
- **НЕ обращаться к gbrain напрямую из Claude Code** — только через brainhub-proxy
|
||
- **НЕ хранить токены в plain text** — всегда хеш SHA-256
|
||
- **НЕ логировать секреты** — пароли, токены, API ключи никогда не в logs
|
||
- **НЕ создавать прямые SQL запросы** — только через Drizzle ORM
|
||
- **НЕ забывать про audit log** для любых мутаций
|
||
- **НЕ забывать про RBAC** — каждый mutate endpoint проверяет роль
|
||
- **НЕ выставлять admin API на публичный порт 3010** — только /mcp и /oauth
|
||
|
||
## Что делать ВСЕГДА
|
||
|
||
- Перед началом нового спринта читать [docs/ROADMAP.md](docs/ROADMAP.md)
|
||
- Перед написанием нового API endpoint смотреть в [packages/shared/src/types.ts](packages/shared/src/types.ts) — может тип уже есть
|
||
- При изменении схемы БД — миграция через Drizzle, не вручную в Postgres
|
||
- При добавлении нового permission/role — обновлять [docs/SECURITY.md](docs/SECURITY.md)
|
||
- При нестандартном архитектурном решении — создавать ADR в [docs/DECISIONS/](docs/DECISIONS/)
|
||
- Закоммитить миграции и schema файлы вместе с кодом, который их использует
|
||
- Тесты для критичной логики (auth, MCP proxy, RBAC). UI можно без unit тестов в первой версии.
|
||
|
||
## Полезные команды
|
||
|
||
```bash
|
||
# Установка
|
||
bun install
|
||
|
||
# Локальная разработка (запустить Postgres сначала)
|
||
docker compose -f deploy/docker/docker-compose.dev.yml up -d
|
||
bun run db:migrate
|
||
bun run dev
|
||
|
||
# Миграции
|
||
bun run --cwd apps/api drizzle-kit generate
|
||
bun run db:migrate
|
||
|
||
# Запуск API + Web в watch mode
|
||
bun run dev
|
||
|
||
# Production build
|
||
bun run build
|
||
|
||
# Тесты
|
||
bun run test
|
||
```
|
||
|
||
## Текущее состояние
|
||
|
||
> Обновляй этот раздел после каждого закрытого спринта.
|
||
|
||
- [x] **S0**: Инфраструктура VM (bootstrap скрипт готов)
|
||
- [ ] **S1**: Первый gbrain instance (create-brain.sh готов, нужно тестирование)
|
||
- [ ] **S2**: Brainhub каркас + локальный auth
|
||
- [ ] **S3**: MCP Proxy + Tokens
|
||
- [ ] **S4**: CRUD брейнов + источники + sync
|
||
- [ ] **S5**: Dashboard + Projects + Connect
|
||
- [ ] **S6**: OAuth + публичный контур
|
||
- [ ] **S7**: Hardening
|
||
|
||
## Связанные проекты
|
||
|
||
- **gbrain** (vendored) — https://github.com/garrytan/gbrain (mirror в git.zetit.ru/zuevav/gbrain-mirror)
|
||
- **ZetitConnect** — паттерны переиспользуем (Node/Express/React/Postgres стек)
|
||
- **ZetitClaude Code setup** — FNA proxy конфигурация, tmux/zsh wrappers
|