11 KiB
Team Board — План реализации
Дата: 2026-02-22 | Обновлено: 2026-02-23 Метод: BMAD Planning
Текущее состояние
Tracker v0.2.0 (Python/FastAPI) ✅
- Модели: Member, AgentConfig, Project, Task, Step, Chat, Message, Attachment
- API: auth, members, projects, tasks, steps, messages, ws_router
- WS: auth, heartbeat, chat.subscribe, chat.send, message broadcast
- БД: PostgreSQL, без миграций (recreate from scratch)
Web Client v0.2.0 (Next.js) ✅
- Страницы: login, projects list, project board
- Компоненты: KanbanBoard (drag-drop + mobile tabs), TaskModal (steps, comments, assignee), ChatPanel (REST), CreateTaskModal, CreateProjectModal, AuthGuard
- BFF: Python/FastAPI (порт 8200), JWT auth, proxy к Tracker
- WS proxy через BFF с token-based auth
- Два окружения: dev.team.uix.su (активное) / team.uix.su (placeholder)
Что было исправлено в v0.2.0 (бывшие несоответствия)
- ✅ Member + AgentConfig вместо отдельной Agent модели
- ✅ Unified Message (chat_id + task_id + parent_id)
- ✅ Steps модель
- ✅ Watchers на Task (string[])
- ✅ Attachment модель
- ✅ repo_urls = array
- ✅ Правильные статусы (backlog/todo/in_progress/in_review/done)
- ✅ Task key на бэкенде (TE-1)
- ⬜ WS handler не фильтрует по listen_mode (Phase 3)
- ⬜ Нет project.subscribe (Phase 3)
- ⬜ Heartbeat — базовый (Phase 3)
Эпики
Epic 1: Новые модели БД ✅ DONE
Приоритет: MUST (всё остальное зависит от этого)
Очистить БД, создать модели с нуля по ARCHITECTURE.md v0.4. Статус: Полностью выполнен в Tracker v0.2.0
Stories:
E1-S1: Member + AgentConfig Заменить User + Agent на единую модель Member.
Member: id, name, slug, type(human|agent), role(owner|member|observer|bridge),
auth_method, password_hash?, token?, status, avatar_url
AgentConfig: member_id(FK), capabilities[], chat_listen, task_listen,
prompt, model
Acceptance: модели созданы, init_db создаёт владельца (admin)
E1-S2: Unified Message + Attachment Заменить Chat + ChatMessage на Message + Attachment.
Message: id, content, author_type, author_slug,
chat_id?(lobby/project), task_id?, parent_id?(thread),
mentions[], voice_url?, created_at
Attachment: id, message_id(FK), filename, mime_type, size, storage_path
Chat таблица остаётся (lobby, project chats), но Message может быть без chat_id (task comment). Acceptance: Message работает и для чата, и для комментариев
E1-S3: Task обновление
- status: backlog|todo|in_progress|in_review|done
- type: task|bug|epic|story
- labels: string[] (ARRAY, вместо отдельной таблицы TaskLabel)
- watchers: string[] (ARRAY of slugs)
- depends_on: UUID[] (ARRAY, вместо TaskDependency таблицы)
- assignee_slug: string (вместо assigned_agent_id FK)
- reviewer_slug: string?
- Убрать: requires_pr, pr_url (пока не нужны)
Acceptance: Task соответствует ARCHITECTURE.md
E1-S4: Step модель
Step: id, task_id(FK), title, done(bool), position(int)
Acceptance: Steps CRUD работает
E1-S5: Project обновление
- repo_urls: string[] (ARRAY, вместо git_repo)
- Убрать: key_prefix, task_counter (номера задач генерить иначе)
Acceptance: Project соответствует ARCHITECTURE.md
E1-S6: Очистка и init
- Удалить Alembic миграции
- DROP ALL + CREATE ALL при первом запуске
- Seed: создать admin (owner), lobby chat
Acceptance: чистый старт,
docker compose down -v && upработает
Epic 2: REST API (MCP-ready) ✅ DONE
Приоритет: MUST
Обновить API эндпоинты для всех MCP tools. Статус: Выполнен в Tracker v0.2.0. Все CRUD эндпоинты работают. Некоторые продвинутые (take/reject/assign, files upload) — ещё не реализованы.
Stories:
E2-S1: Auth API
POST /api/v1/auth/login— логин → JWTPOST /api/v1/auth/register— регистрация (disabled by default)- Token validation middleware Acceptance: JWT auth работает
E2-S2: Tasks API
GET /api/v1/tasks— list (фильтры: project_id, status, assignee, labels)GET /api/v1/tasks/{id}— getPOST /api/v1/tasks— createPATCH /api/v1/tasks/{id}— updateDELETE /api/v1/tasks/{id}— deletePOST /api/v1/tasks/{id}/take— take (атомарно)POST /api/v1/tasks/{id}/reject— reject с причинойPOST /api/v1/tasks/{id}/assign— assignPOST /api/v1/tasks/{id}/watch— watchDELETE /api/v1/tasks/{id}/watch— unwatch Acceptance: все эндпоинты работают, take атомарный
E2-S3: Steps API
GET /api/v1/tasks/{id}/stepsPOST /api/v1/tasks/{id}/stepsPATCH /api/v1/tasks/{task_id}/steps/{step_id}DELETE /api/v1/tasks/{task_id}/steps/{step_id}Acceptance: CRUD steps
E2-S4: Messages API (unified)
GET /api/v1/messages— list (фильтры: chat_id, task_id, parent_id, limit/offset)POST /api/v1/messages— send (chat_id или task_id)POST /api/v1/messages/{id}/reply— thread reply Acceptance: работает для чатов и комментариев задач
E2-S5: Files API
POST /api/v1/messages/{id}/attachments— uploadGET /api/v1/attachments/{id}— downloadGET /api/v1/attachments— list (фильтры: task_id, chat_id) Acceptance: upload/download работает
E2-S6: Projects API
- Обновить существующий API под новые поля (repo_urls) Acceptance: CRUD проектов работает
E2-S7: Members API
GET /api/v1/members— list (фильтр: project_id)GET /api/v1/members/{slug}— getPOST /api/v1/members— create (agent с токеном)PATCH /api/v1/members/{slug}— updatePATCH /api/v1/members/me/status— update own status Acceptance: CRUD members, генерация токенов для агентов
Epic 3: WebSocket Protocol v2 ⬜ PARTIAL
Приоритет: MUST Статус: Базовый WS (auth, chat.subscribe, chat.send, broadcast) работает. Listen_mode фильтрация, project.subscribe, heartbeat timeout — ещё нет.
Stories:
E3-S1: Auth + Heartbeat
auth→ token validation →auth.okс контекстом (проекты, online members)heartbeat→ обновление status, last_seen_at- Timeout 90s → status=offline, уведомление Acceptance: агент подключается и держит сессию
E3-S2: Project Subscribe
project.subscribe/project.unsubscribe- Подписка = получение chat + task events для этого проекта Acceptance: подписка/отписка работает
E3-S3: Event Filtering
message.new— фильтрация по chat_listen + ownershiptask.created/updated/assigned— фильтрация по task_listen + assignee/reviewer/watchers Acceptance: агент с mentions получает только своё, агент с all — всё
E3-S4: chat.send через WS
- Отправка сообщения через WS (помимо REST)
- Broadcast по подписчикам с фильтрацией Acceptance: чат работает в реальном времени
Epic 4: Web Client обновление ⬜ PARTIAL
Приоритет: SHOULD
Stories:
E4-S1: TaskModal — комментарии
- Лента сообщений (Message с task_id) внизу модалки
- Input для нового комментария
- Значки авторов: 👤/🤖/⚙️ Acceptance: комментарии к задаче работают
E4-S2: TaskModal — Steps
- Чеклист между описанием и комментариями
- Добавление/завершение/удаление steps
- Live-обновление через WS Acceptance: steps отображаются и обновляются
E4-S3: TaskModal — watchers
- Кнопка "👁 Наблюдать" / "Отписаться"
- Список watchers в сайдбаре модалки Acceptance: подписка/отписка работает
E4-S4: Agent Management
- Страница /agents — список агентов со статусами
- Создание агента (name, slug, capabilities) → генерация токена
- Отображение токена (один раз при создании) Acceptance: можно создать агента и получить токен
E4-S5: Обновление моделей в клиенте
- api.ts: обновить типы (Member вместо Agent, Message вместо ChatMessage)
- ws.ts: обновить события (message.new, project.subscribe, heartbeat)
- ChatPanel: использовать Unified Message Acceptance: клиент работает с новым API
Epic 5: Picogent интеграция
Приоритет: COULD (после Epic 1-3)
Stories:
E5-S1: MCP Tools Provider
- Обёртка над Tracker REST API
- Все 21+ tools из BRAINSTORM-MCP-TOOLS Acceptance: агент может вызывать tools
E5-S2: Router v2
- WS event → текст → единственная сессия
- Фильтрация по listen_mode на стороне picogent (дополнительно к серверной) Acceptance: агент получает события как текст
E5-S3: Single Session
- Одна сессия на агента (не per-task)
- session.resume при reconnect Acceptance: контекст сохраняется между задачами
Порядок выполнения
Phase 1: Backend Foundation
E1 (модели) → E2 (API) → E3 (WS v2)
Phase 2: Frontend
E4-S5 (типы) → E4-S1 (комменты) → E4-S2 (steps) → E4-S4 (agents)
Phase 3: Agent
E5-S1 (MCP) → E5-S2 (router) → E5-S3 (session)
Оценка объёма
| Epic | Stories | Сложность | ~Часы |
|---|---|---|---|
| E1: Модели | 6 | Средняя | 4-6 |
| E2: REST API | 7 | Средняя | 8-12 |
| E3: WS v2 | 4 | Высокая | 6-8 |
| E4: Web Client | 5 | Средняя | 8-10 |
| E5: Picogent | 3 | Высокая | 10-14 |
| Итого | 25 | 36-50 |