Files
ZBrain/docs/ROADMAP.md
T
zuevav f4bca8449e main
2026-05-20 19:33:02 +03:00

15 KiB
Raw Blame History

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
  • Резолв :brainlocalhost: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