275 lines
15 KiB
Markdown
275 lines
15 KiB
Markdown
# ZBrain Roadmap
|
||
|
||
Документ для Claude Code: пошаговый план реализации с критериями готовности каждого спринта. Подходит как для последовательной разработки, так и для параллельной (некоторые спринты независимы).
|
||
|
||
## Принципы
|
||
|
||
- Каждый спринт заканчивается **рабочей фичей**, которую можно показать
|
||
- Каждый спринт мерж в `develop`, в `main` идут тегированные релизы
|
||
- Любой Claude Code инстанс может прочитать этот файл и понять, что делать дальше
|
||
- ADR (Architecture Decision Records) пишутся в `docs/DECISIONS/` для нестандартных решений
|
||
|
||
---
|
||
|
||
## Sprint 0: Инфраструктура VM (1 вечер)
|
||
|
||
**Цель**: Готовая VM, на которой работает Postgres и установлен gbrain.
|
||
|
||
**Задачи:**
|
||
- [ ] Создать VM: 4 vCPU / 8 GB RAM / 80 GB SSD / Ubuntu 22.04 LTS
|
||
- [ ] Назначить статический IP в сети ZETIT
|
||
- [ ] Добавить DNS: `brain.zetit.local` (внутренний) и `brain.zetit.ru` (внешний)
|
||
- [ ] Запустить `scripts/bootstrap-vm.sh`
|
||
- [ ] Создать Postgres пользователя `brainhub` с паролем
|
||
- [ ] Сгенерировать секреты для `.env` (SESSION_SECRET, JWT_SECRET, TOKEN_ENCRYPTION_KEY)
|
||
- [ ] Получить API ключи: OPENAI_API_KEY, ANTHROPIC_API_KEY
|
||
|
||
**Критерии готовности:**
|
||
- `systemctl status postgresql` показывает active
|
||
- `sudo -u postgres psql -d brainhub -c 'SELECT * FROM pg_extension'` возвращает vector, pg_trgm, pgcrypto
|
||
- `sudo -u zbrain bash -c 'PATH=$HOME/.bun/bin:$PATH bun --version'` работает
|
||
- `/etc/zbrain/.env` существует, заполнен, права 600
|
||
|
||
**Документировать:** реальные параметры VM (IP, hostname, дата создания) в `docs/INFRASTRUCTURE.md`
|
||
|
||
---
|
||
|
||
## Sprint 1: Первый gbrain instance (1 день)
|
||
|
||
**Цель**: Один работающий gbrain instance с импортированными тестовыми данными.
|
||
|
||
**Задачи:**
|
||
- [ ] Создать gbrain mirror в `git.zetit.ru/zuevav/gbrain-mirror`
|
||
- [ ] Запустить `scripts/create-brain.sh zetit "ZETIT MSP" 3001`
|
||
- [ ] Импортировать тестовый корпус (например, какие-то существующие markdown файлы)
|
||
- [ ] Проверить `curl http://localhost:3001/health` или эквивалент
|
||
- [ ] Прицепить локальный Claude Code напрямую к этому gbrain (без brainhub-прокси)
|
||
- [ ] Выполнить пару query и убедиться что работает
|
||
|
||
**Критерии готовности:**
|
||
- `systemctl status zbrain-gbrain-zetit` показывает active
|
||
- В БД есть страницы и эмбеддинги: `SELECT count(*) FROM pages, count(*) FROM content_chunks WHERE embedding IS NOT NULL`
|
||
- Claude Code успешно делает MCP запросы
|
||
|
||
**Известные риски:**
|
||
- gbrain v0.26 переехал на новый OAuth - возможно поломались CLI флаги. Зафиксировать рабочую версию тегом.
|
||
- FNA-прокси может блокировать какие-то OpenAI/Anthropic эндпоинты - проверить `curl --proxy ...` до запуска import.
|
||
|
||
---
|
||
|
||
## Sprint 2: Brainhub каркас + локальный auth (3-4 дня)
|
||
|
||
**Цель**: Работающий веб-интерфейс с login/logout, без функционала брейнов.
|
||
|
||
**Задачи:**
|
||
|
||
### apps/api (backend)
|
||
- [ ] Express + TypeScript скелет
|
||
- [ ] Структура: `routes/`, `services/`, `middleware/`, `db/`, `lib/`
|
||
- [ ] ORM выбрать: Drizzle (рекомендую за TS-first) или Prisma
|
||
- [ ] Миграции: создать таблицы `users`, `sessions`
|
||
- [ ] POST /api/auth/register (только для owner-команды, остальные через UI)
|
||
- [ ] POST /api/auth/login (email + password, bcrypt)
|
||
- [ ] POST /api/auth/logout
|
||
- [ ] GET /api/auth/me (current user)
|
||
- [ ] Session middleware (cookie + refresh token rotation)
|
||
- [ ] RBAC middleware: `requireRole('admin')`, `requireRole('owner')`
|
||
|
||
### apps/web (frontend)
|
||
- [ ] React + Vite + TypeScript + Tailwind + shadcn/ui
|
||
- [ ] Layout: sidebar + header + content
|
||
- [ ] Страницы: /login, /dashboard (заглушка), /profile
|
||
- [ ] React Router v6
|
||
- [ ] React Query для API
|
||
- [ ] Auth context + protected routes
|
||
|
||
**Критерии готовности:**
|
||
- На свежей БД создаётся initial owner из ENV (INITIAL_OWNER_EMAIL/PASSWORD)
|
||
- Можно войти через UI на /login
|
||
- /dashboard защищён, без auth редиректит на /login
|
||
- Cookie с session token, при logout удаляется
|
||
- Refresh token rotation работает (логин не истекает через 15 минут активной сессии)
|
||
|
||
---
|
||
|
||
## Sprint 3: MCP Proxy + Tokens (2-3 дня)
|
||
|
||
**Цель**: Claude Code на любом сервере подключается через brainhub, а не напрямую к gbrain.
|
||
|
||
**Задачи:**
|
||
|
||
### packages/mcp-proxy
|
||
- [ ] Express router, маунтится на `/mcp/:brain`
|
||
- [ ] Извлечение Bearer token из заголовков
|
||
- [ ] Кэш токенов в памяти (30s TTL) - не ходить в БД на каждый запрос
|
||
- [ ] Проверка: revoked, expired, IP allowlist, scope
|
||
- [ ] Резолв `:brain` → `localhost:PORT` через таблицу `brains`
|
||
- [ ] Прокси через `http-proxy-middleware` или nativный stream
|
||
- [ ] In-memory очередь для audit log + batch insert (раз в секунду)
|
||
- [ ] Throttled update `last_used_at` (не чаще раза в минуту на токен)
|
||
|
||
### apps/api: токены
|
||
- [ ] Таблица `access_tokens` (см. docs/SECURITY.md)
|
||
- [ ] POST /api/tokens (создание - возвращает plaintext token ОДИН РАЗ)
|
||
- [ ] GET /api/tokens (список с prefix, без full token)
|
||
- [ ] DELETE /api/tokens/:id (revoke - soft delete с revoked_at)
|
||
- [ ] GET /api/tokens/:id/usage (статистика)
|
||
|
||
### apps/web: UI для токенов
|
||
- [ ] /tokens страница со списком
|
||
- [ ] Создание токена: имя + scope checkboxes + TTL + IP allowlist
|
||
- [ ] После создания - модалка с токеном и кнопкой copy (показывается один раз!)
|
||
- [ ] Revoke с подтверждением
|
||
|
||
**Критерии готовности:**
|
||
- Создал токен в UI с scope `mcp:read:zetit`
|
||
- Подключил Claude Code: `mcpServers.zbrain.url = http://brain.zetit.local/mcp/zetit`, header `Authorization: Bearer brain_pat_...`
|
||
- Запрос идёт через brainhub, в audit log записывается
|
||
- Revoke токена через UI → следующий запрос Claude Code получает 401
|
||
- При двух токенах одного scope работают оба
|
||
|
||
---
|
||
|
||
## Sprint 4: CRUD брейнов + источники + sync (2-3 дня)
|
||
|
||
**Цель**: Создание новых брейнов через UI, добавление и синхронизация источников.
|
||
|
||
**Задачи:**
|
||
|
||
### apps/api
|
||
- [ ] Таблицы `brains`, `sources`
|
||
- [ ] POST /api/brains - создание (внутренний вызов `scripts/create-brain.sh` или эквивалент на TS)
|
||
- [ ] GET /api/brains - список со статистикой (page_count, embed_coverage)
|
||
- [ ] GET /api/brains/:id - детали
|
||
- [ ] DELETE /api/brains/:id - удаление (с подтверждением, дамп перед удалением)
|
||
- [ ] POST /api/brains/:id/sources - добавление источника (git, local_dir)
|
||
- [ ] POST /api/brains/:id/sources/:sourceId/sync - запуск sync
|
||
- [ ] GET /api/brains/:id/sources/:sourceId/sync/stream - SSE с прогрессом
|
||
- [ ] Worker queue для sync (bullmq или нативный setInterval)
|
||
- [ ] Планировщик cron-based sync (node-cron)
|
||
|
||
### apps/web
|
||
- [ ] /brains страница со списком
|
||
- [ ] /brains/new форма создания
|
||
- [ ] /brains/:id - tabs: Overview, Sources, Browse, Query, Activity
|
||
- [ ] Sources tab: список с status, кнопки Sync now / Edit / Delete
|
||
- [ ] Sync с realtime прогрессом через SSE
|
||
- [ ] Подсветка статусов: green/yellow/red
|
||
|
||
**Критерии готовности:**
|
||
- Создать брейн `community` через UI → автоматически создаётся БД, запускается gbrain, регистрируется systemd unit
|
||
- Добавить git source → запустить sync → видеть прогресс в реальном времени
|
||
- Расписание sync каждые 6 часов работает
|
||
- Удаление брейна делает дамп и убирает все артефакты
|
||
|
||
**Важно:** удаление брейна - irreversible операция, обязательно подтверждение через ввод имени брейна (как в GitHub).
|
||
|
||
---
|
||
|
||
## Sprint 5: Dashboard + Projects + Connect (2-3 дня)
|
||
|
||
**Цель**: Полноценный UI с визуализацией проектов и copy-paste готовыми сниппетами.
|
||
|
||
**Задачи:**
|
||
|
||
### apps/api
|
||
- [ ] Таблицы `projects`, `project_connections`
|
||
- [ ] CRUD endpoints для projects
|
||
- [ ] POST /api/projects/:id/connections - привязка проекта к брейну с указанием токена
|
||
- [ ] GET /api/connect/snippets/:brainId?client=claude-code|cursor|cli - генерация сниппетов
|
||
|
||
### apps/web
|
||
- [ ] /dashboard - сводка: количество брейнов, total pages, active sync jobs, recent activity
|
||
- [ ] /dashboard карточки брейнов с цифрами
|
||
- [ ] /projects - таблица проектов с привязкой к брейнам
|
||
- [ ] /projects/:id - детали + кнопка "Connect new brain"
|
||
- [ ] /brains/:id/connect - страница с готовыми сниппетами:
|
||
- Claude Code JSON (для `~/.claude/mcp.json` или `.claude/mcp.json` в проекте)
|
||
- Cursor конфиг
|
||
- Bash one-liner для CLI
|
||
- QR код с готовой строкой подключения
|
||
- [ ] Copy-to-clipboard на каждом блоке
|
||
- [ ] Глобальный поиск по всем брейнам (с уважением scope)
|
||
|
||
**Критерии готовности:**
|
||
- Dashboard загружается за <500ms
|
||
- В Projects вижу таблицу: ZetitConnect → [zetit (write), personal (read)]
|
||
- На странице Connect - готовая JSON структура с реальным URL и токеном, копируется одним кликом
|
||
- QR-код корректно сканируется и содержит JSON
|
||
|
||
---
|
||
|
||
## Sprint 6: OAuth + публичный контур (2-3 дня)
|
||
|
||
**Цель**: Авторизация через Yandex/GitHub OAuth, публичный endpoint для MCP.
|
||
|
||
**Задачи:**
|
||
|
||
### apps/api
|
||
- [ ] Зарегистрировать OAuth приложения у Yandex и GitHub
|
||
- [ ] passport.js + passport-yandex + passport-github2
|
||
- [ ] OAuth flow: /oauth/yandex, /oauth/yandex/callback (аналогично GitHub)
|
||
- [ ] Привязка к existing user по email match (с подтверждением)
|
||
- [ ] Поддержка регистрации нового пользователя через OAuth (опционально, по INVITE_ONLY флагу)
|
||
- [ ] Отдельный Express app на 3010 порту, монтирует только /mcp и /oauth
|
||
|
||
### deploy
|
||
- [ ] Получить TLS сертификат от Let's Encrypt для brain.zetit.ru
|
||
- [ ] Включить nginx public server-блок
|
||
- [ ] Проверить, что внутренний и публичный API не пересекаются (нет утечки UI на публичный)
|
||
|
||
**Критерии готовности:**
|
||
- Залогиниться через "Sign in with Yandex" - работает
|
||
- На публичном endpoint `https://brain.zetit.ru/api/brains` → 404
|
||
- На публичном endpoint `https://brain.zetit.ru/mcp/zetit` → работает с токеном
|
||
- TLS A+ rating на SSL Labs
|
||
|
||
---
|
||
|
||
## Sprint 7: Hardening (2-3 дня)
|
||
|
||
**Цель**: Production-ready: бэкапы, мониторинг, 2FA, документация.
|
||
|
||
**Задачи:**
|
||
- [ ] /audit страница в UI с фильтрами (actor, action, resource, date range)
|
||
- [ ] CSV export audit log
|
||
- [ ] 2FA (TOTP) опционально для каждого пользователя
|
||
- [ ] Проверить и настроить `scripts/backup.sh`, добавить в cron
|
||
- [ ] Тестовое восстановление из бэкапа на отдельной VM
|
||
- [ ] Prometheus endpoint /metrics: request rate, error rate, db connections, queue depth
|
||
- [ ] Health endpoint с глубокой проверкой (DB connectivity, gbrain instances)
|
||
- [ ] Alerts на падение sync, на error rate > N
|
||
- [ ] Documentation: docs/API.md, docs/SECURITY.md, docs/OPERATIONS.md
|
||
- [ ] Load test: 100 RPS на /mcp, что выдерживает
|
||
|
||
**Критерии готовности:**
|
||
- Восстановление из бэкапа прошло успешно
|
||
- Включил 2FA на owner аккаунте, работает
|
||
- /metrics возвращает prometheus formatted text
|
||
- Audit log имеет все важные события: brain.create, brain.delete, token.create, token.revoke, user.login, user.logout, mcp.call
|
||
|
||
---
|
||
|
||
## После Sprint 7: миграция данных
|
||
|
||
**Цель**: Перенести всё что нужно в соответствующие брейны.
|
||
|
||
- [ ] Создать брейны: zetit, telerapharma, personal, community (если ещё не созданы)
|
||
- [ ] Источники для zetit: ZetitConnect docs repo, ZETIT internal wiki
|
||
- [ ] Источники для telerapharma: runbook'и Exchange/MikroTik/1C
|
||
- [ ] Источники для personal: личный markdown garden, "Хлеб и молоко" docs
|
||
- [ ] Источники для community: документы Смоленская 10
|
||
- [ ] Переключить Claude Code на всех серверах с локального чтения на gbrain через brainhub
|
||
- [ ] Удалить дублированную документацию из локальных копий (оставить только в источниках)
|
||
|
||
---
|
||
|
||
## Дальнейшее развитие
|
||
|
||
- Импорт из Notion, Obsidian, Confluence через gbrain skills
|
||
- Webhook'и: уведомления в Slack/Telegram при критичных событиях
|
||
- API для интеграций с другими системами (1С, FortiGate logs)
|
||
- Mobile-friendly UI (адаптив или отдельная PWA)
|
||
- Multi-user collaboration на одном брейне (комментарии, suggestions)
|
||
- Версионирование промптов и skills через gbrain
|