8.9 KiB
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
- Виклик:
{ "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.