docs/archive/IMPLEMENTATION-PLAN.md

270 lines
11 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.

# 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` — логин → JWT
- `POST /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}` — get
- `POST /api/v1/tasks` — create
- `PATCH /api/v1/tasks/{id}` — update
- `DELETE /api/v1/tasks/{id}` — delete
- `POST /api/v1/tasks/{id}/take` — take (атомарно)
- `POST /api/v1/tasks/{id}/reject` — reject с причиной
- `POST /api/v1/tasks/{id}/assign` — assign
- `POST /api/v1/tasks/{id}/watch` — watch
- `DELETE /api/v1/tasks/{id}/watch` — unwatch
Acceptance: все эндпоинты работают, take атомарный
**E2-S3: Steps API**
- `GET /api/v1/tasks/{id}/steps`
- `POST /api/v1/tasks/{id}/steps`
- `PATCH /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` — upload
- `GET /api/v1/attachments/{id}` — download
- `GET /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}` — get
- `POST /api/v1/members` — create (agent с токеном)
- `PATCH /api/v1/members/{slug}` — update
- `PATCH /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 + ownership
- `task.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** |