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:
- Якщо toggle ON →
POST /agentsbody:
{
"owner_kind": "team",
"owner_id": "t_123",
"name": "Team Assistant",
"role": "general",
"scopes": ["chat"]
}
- Якщо 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.