333 lines
8.9 KiB
Markdown
333 lines
8.9 KiB
Markdown
# 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"]
|
||
}
|
||
```
|
||
|
||
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.
|