diff --git a/IMPLEMENTATION-PLAN.md b/IMPLEMENTATION-PLAN.md new file mode 100644 index 0000000..7cfd0d0 --- /dev/null +++ b/IMPLEMENTATION-PLAN.md @@ -0,0 +1,263 @@ +# Team Board — План реализации +Дата: 2026-02-22 +Метод: BMAD Planning + +## Текущее состояние + +### Tracker (Python/FastAPI) +- Модели: Project, Task, Agent, Chat, ChatMessage, Label, TaskDependency, TaskFile +- API: CRUD для tasks, projects, agents, chats, labels +- WS: базовый handler (auth, chat.subscribe, chat.send, chat.message broadcast) +- БД: PostgreSQL, Alembic миграции (3 штуки) + +### Web Client (Next.js) +- Страницы: login, projects list, project board +- Компоненты: KanbanBoard, TaskModal, ChatPanel, Sidebar, CreateProjectModal, AuthGuard +- API client, WS client + +### Что НЕ соответствует архитектуре v0.4 +- Модель Agent отдельная (надо: Member + AgentConfig) +- ChatMessage привязана к Chat, нет task_id/parent_id (надо: Unified Message) +- Нет Steps модели +- Нет watchers на Task +- Нет Attachment модели (отдельные TaskFile) +- Project.git_repo = string (надо: repo_urls = array) +- Task статусы не совпадают (draft/ready/completed vs backlog/todo/done) +- WS handler не фильтрует по listen_mode +- Нет project.subscribe +- Нет heartbeat + +--- + +## Эпики + +### Epic 1: Новые модели БД +**Приоритет: MUST** (всё остальное зависит от этого) + +Очистить БД, создать модели с нуля по ARCHITECTURE.md v0.4. + +**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) +**Приоритет: MUST** + +Обновить API эндпоинты для всех MCP tools. + +**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 +**Приоритет: MUST** + +**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 обновление +**Приоритет: 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** |