# 06 — Tasks: Onboarding & MVP Core (for Cursor) Цей документ містить чіткі технічні задачі для Cursor. Кожна задача сформульована у форматі, який Cursor розуміє найкраще: - контекст - специфікації - API - acceptance criteria - очікуваний вивід (list of files + diff) Всі задачі беруть дані з: - 01_product_brief_mvp.md - 02_architecture_basics.md - 03_api_core_snapshot.md - 04_ui_ux_onboarding_chat.md - 05_coding_standards.md ## BLOCK A — ONBOARDING (5 кроків) ### Task A1 — Create route `/onboarding` + base layout **Context:** Onboarding складається з 5 кроків. Потрібен базовий контейнер зі state machine. **Specs:** - Створити сторінку `/onboarding`. - Додати компонент `OnboardingLayout`. - Зберігати поточний крок у локальному стані. - Кроки: `welcome`, `team`, `privacy`, `channel`, `agent`, `invite`. - У верхній частині: step indicator. **Acceptance Criteria:** - `/onboarding` відкривається без помилок. - Є stepper з актуальною позначкою (1–5). - Немає реальних API-викликів (тільки каркас). **Cursor Output:** - Список файлів для змін. - Код. ### Task A2 — Onboarding Step 1: Welcome Screen **Specs:** - Заголовок: "Створимо твою MicroDAO". - Підзаголовок: "5 кроків — і твоя спільнота буде готова до роботи." - Кнопка: "Почати". - При натисканні — перехід на Step 2. **Acceptance Criteria:** - Стиль згідно з 04_ui_ux_onboarding_chat.md. - Робоча кнопка. ### Task A3 — Step 2: Create Team (API: POST /teams) **Specs:** - Форма: - `Назва спільноти` (required) - `Опис` (optional) - Виклик: `POST /teams` - Результат: зберегти `teamId` у state onboarding. **Acceptance Criteria:** - Форма валідна: без назви кнопка disabled. - Після успішного виклику → Step 3. - Обробка помилок через toast. ### Task A4 — Step 3: Privacy mode (PATCH /teams/{id}) **Specs:** UI: дві великі карточки: - PUBLIC: - Текст: "Є публічний канал. Гості можуть читати та приєднатися." - CONFIDENTIAL: - Текст: "Тільки запрошені учасники. Чати зашифровані." При натисканні — PATCH `/teams/{teamId}`. **Acceptance Criteria:** - Виділяється вибраний режим. - Успішний PATCH → Step 4. ### Task A5 — Step 4: Create first channel (POST /channels) **Specs:** - Поля: - Назва каналу - Тип: public | group - Виклик: ```json { "team_id": "...", "type": "...", "title": "...", "mode": "public" | "confidential" } ``` **Acceptance Criteria:** - Після успіху → Step 5. - Канал створений і додається до списку каналів у state. ### Task A6 — Step 5: Agent & memory settings (POST /agents) **Specs:** UI: - toggle: "Увімкнути приватного агента" - select: мова агента - select: профіль агента - select: memory depth API: 1. Якщо toggle ON → `POST /agents` body: ```json { "owner_kind": "team", "owner_id": "t_123", "name": "Team Assistant", "role": "general", "scopes": ["chat"] } ```text 2. Якщо OFF → skip **Acceptance Criteria:** - Вибір зберігається в onboarding state. - API викликається тільки якщо агент включений. - Після успіху → Step 6. ### Task A7 — Step 6: Invite (UI only) **Specs:** UI: - Заголовок: "Спільнота створена!" - Показати посилання-запрошення (stub: `/invite?t=ID`). - Кнопка: "Перейти в чат". **Acceptance Criteria:** - Немає API. - При натисканні — redirect до `/t/:teamId/c/:channelId`. ## BLOCK B — CHAT CORE ### Task B1 — Channel List in Sidebar **Specs:** - Зробити компонент `SidebarChannels`. - Отримати список каналів командою: - Використати локальний state (оновлює онбординг). - У реальному додатку — GET `/teams/{id}/channels` (можна додати). - Показати активний канал. **Acceptance Criteria:** - Sidebar показує всі канали. - Active канал підсвічений. ### Task B2 — Messages Stream (GET /channels/{id}/messages) **Specs:** - Компонент: `MessagesStream`. - Пагінація: cursor-based scroll. - Рендер: avatar + name + time + text. - Confidential → body_enc (можна stub дешифрування). **Acceptance Criteria:** - Стрічка відображає повідомлення. - При скролі догори → підвантаження старих. ### Task B3 — Composer (POST /messages) **Specs:** - Компонент: `MessageComposer`. - Input + кнопка "Надіслати". - Enter → відправка. - Shift+Enter → новий рядок. **Acceptance Criteria:** - Повідомлення додається в стрічку без перезавантаження. - Порожній інпут → заборонити надсилання. ### Task B4 — Follow-up creation (POST /followups) **Specs:** - Контекстне меню у повідомленні: "Створити follow-up". - Модалка: назва (автоматично), assignee (список членів), due. - API: POST `/followups`. **Acceptance Criteria:** - Follow-up створюється успішно. - Помилки показуються через toast. ## BLOCK C — PROJECTS & TASKS ### Task C1 — Project List (GET /projects) **Specs:** - Вкладка "Проєкти". - Список проєктів (назва). - Кнопка "Створити проєкт". **Acceptance Criteria:** - Працює рендер списку. - Порожній стан: "Проєкти ще не створені". ### Task C2 — Create Project (POST /projects) **Specs:** - Модалка → створення нового проєкту. - Поля: назва, visibility (public/confidential). - API: POST `/projects`. **Acceptance Criteria:** - Новий проєкт зʼявляється в списку. ### Task C3 — Tasks Board (GET/POST /projects/{id}/tasks) **Specs:** - 3 колонки: backlog, in_progress, done. - Карточка задачі: title + status. - При кліку → змінити статус. **Acceptance Criteria:** - Задачі змінюють статус (PATCH можна stub: просто оновлювати client state). - Мінімальний Kanban працює. ## BLOCK D — AGENTS ### Task D1 — Agents List (GET /agents) **Specs:** - Вкладка "Агенти". - Показати всіх агентів команди. **Acceptance Criteria:** - Один агент "Team Assistant" відображається. ### Task D2 — Agent Chat (stub) **Specs:** - Створити окремий чат з агентом: - `MessageComposer` - потік повідомлень (локальний state) - В API-запиті викликати зовнішній LLM (можна mock) - Зберігати історію до reload. **Acceptance Criteria:** - Агент відповідає у вигляді тексту. - Історія видно в UI. ## BLOCK E — FINALIZATION ### Task E1 — Route redirect after onboarding **Specs:** - Після Step 6 redirect: `/t/:teamId/c/:channelId` **Acceptance Criteria:** - Після онбордингу користувач потрапляє у свій перший канал. ### Task E2 — Mobile adaptation **Specs:** - Sidebar → Drawer - Composer sticky bottom - Onboarding → одна колонка **Acceptance Criteria:** - Мобільна версія не ламається. ### Task E3 — Error Handling Audit **Specs:** Перевірити всі виклики API: - login - teams - channels - messages - followups - projects - tasks - agents **Acceptance Criteria:** - Усі помилки показуються через toast. - Немає uncaught exceptions у консолі. ## Кінець документа Цей файл є головним TODO для Cursor. Кожна задача може бути надіслана як окремий prompt, Cursor повинен завжди відповідати: - списком файлів, - diff, - коротким summary.