Files
team-planner/CONTEXT.md
vigdorov 593c573985
Some checks failed
continuous-integration/drone/push Build is failing
migrate to ci-templates
2026-02-08 14:11:40 +03:00

282 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Контекст проекта Team Planner
> Этот файл обновляется агентами для передачи контекста. **Обновляй его после каждой значимой работы!**
---
## Текущий статус
**Этап:** Фаза 3.2 завершена ✅
**Фаза MVP:** Базовый функционал + авторизация + расширенный функционал + AI-оценка + мини-ТЗ + история ТЗ + полный просмотр идеи готовы
**Следующий этап:** Фаза 4 — Права доступа
**Последнее обновление:** 2026-01-15
---
## Что сделано
| Дата | Что сделано |
|------|-------------|
| 2026-02-08 | **Инфра:** Миграция CI/CD на ci-templates (service.yaml + .drone.yml), удалены Dockerfile/k8s/nginx/docker-compose |
| 2025-12-29 | Созданы REQUIREMENTS.md, CLAUDE.md, CONTEXT.md |
| 2025-12-29 | Создан ARCHITECTURE.md (C4, sequences, API, UI prototypes, спецификация) |
| 2025-12-29 | Создан ROADMAP.md — план разработки по фазам |
| 2025-12-29 | Создан DEVELOPMENT.md — правила локальной разработки |
| 2025-12-29 | **Фаза 0:** docker-compose.yml для PostgreSQL |
| 2025-12-29 | **Фаза 0:** Backend (NestJS + TypeORM + PostgreSQL + class-validator) |
| 2025-12-29 | **Фаза 0:** Frontend (Vite + React + MUI + Zustand + TanStack + dnd-kit) |
| 2025-12-29 | **Фаза 1:** Backend Ideas module (entity, DTO, service, controller) |
| 2025-12-29 | **Фаза 1:** Frontend — API сервис (services/ideas.ts) |
| 2025-12-29 | **Фаза 1:** Frontend — Zustand store для фильтров и пагинации |
| 2025-12-29 | **Фаза 1:** Frontend — React Query хуки (useIdeas.ts) |
| 2025-12-29 | **Фаза 1:** Frontend — IdeasTable с TanStack Table |
| 2025-12-29 | **Фаза 1:** Frontend — Фильтры (статус, приоритет, модуль, поиск) |
| 2025-12-29 | **Фаза 1:** Frontend — Inline-редактирование ячеек (double-click) |
| 2025-12-29 | **Фаза 1:** Frontend — Модалка создания идеи |
| 2025-12-29 | **Фаза 1:** Frontend — Skeleton loader и empty state |
| 2025-12-29 | **Фаза 1:** Frontend — Удаление идей |
| 2025-12-31 | Исправлен баг: Select в inline-редактировании закрывался при клике (MenuProps.disablePortal) |
| 2025-12-31 | Локализация интерфейса на русский язык |
| 2026-01-13 | **Фаза 2:** Backend — PATCH /api/ideas/reorder endpoint (ReorderIdeasDto, транзакция) |
| 2026-01-13 | **Фаза 2:** Frontend — Drag & Drop с dnd-kit (DraggableRow, drag handle) |
| 2026-01-13 | **Фаза 2:** Исправлены баги D&D: setNodeRef, сортировка по order, оптимистичные обновления, DragOverlay |
| 2026-01-13 | Добавлены Selenium E2E тесты (tests/e2e/) — Фаза 1 ✅, Фаза 2 частично |
| 2026-01-13 | **Авторизация:** Backend Auth модуль (JWT + Keycloak JWKS) |
| 2026-01-13 | **Авторизация:** Frontend AuthProvider (keycloak-js, auto token refresh) |
| 2026-01-14 | E2E тесты переписаны с Selenium на Playwright (tests/e2e/*.spec.ts) |
| 2026-01-14 | **Фаза 2:** Улучшен Drag & Drop — добавлен @dnd-kit/modifiers, исправлен race condition с drag handle, restrictToVerticalAxis |
| 2026-01-14 | **Production:** Настроен Keycloak для production (team-planner.vigdorov.ru), обновлён Dockerfile с Keycloak переменными |
| 2026-01-14 | **UI:** Страница логина (LoginPage) — кнопка "Войти", описание приложения, контакт для получения доступа |
| 2026-01-14 | **UI:** Кнопка выхода на главной странице (IconButton с Logout) |
| 2026-01-14 | **Infra:** Добавлен KEYCLOAK_REALM_URL в k8s/backend-deployment.yaml |
| 2026-01-14 | **Keycloak Theme:** Кастомная тема для Keycloak (MUI стиль) — keycloak-theme/ |
| 2026-01-14 | **CI/CD:** Добавлены steps build-keycloak-theme и deploy-keycloak-theme в .drone.yml |
| 2026-01-14 | **Фаза 2:** Цветовая маркировка — ColorPickerCell, цветной фон строки, фильтр по цвету |
| 2026-01-14 | **Фаза 2:** Комментарии — backend модуль (entity, service, controller, миграция), frontend (CommentsPanel, раскрывающаяся панель) |
| 2026-01-14 | **UX:** Хук useAuth для данных пользователя, имя в header, автор комментариев из Keycloak |
| 2026-01-14 | **Фаза 2:** Управление командой — backend (TeamMember entity, CRUD, summary), frontend (TeamPage, табы навигации) |
| 2026-01-14 | **Фаза 2:** Динамические роли — Role entity вместо enum, CRUD API (/api/roles), RolesManager UI, миграция данных |
| 2026-01-15 | **Testing:** E2E тесты Фазы 2 (Playwright) — 54 теста покрывают D&D, цвета, комментарии, команду |
| 2026-01-15 | **Testing:** Рефакторинг тестов на data-testid — стабильные селекторы вместо tbody/tr/.nth() |
| 2026-01-15 | **Testing:** Добавлены data-testid во все компоненты фронтенда (IdeasTable, TeamPage, CommentsPanel и др.) |
| 2026-01-15 | **Docs:** Создан E2E_TESTING.md — гайд по написанию e2e тестов, соглашения по data-testid |
| 2026-01-15 | **Фаза 3:** Backend AI модуль (ai.service.ts, ai.controller.ts, POST /api/ai/estimate) |
| 2026-01-15 | **Фаза 3:** Миграция AddAiEstimateFields — поля estimatedHours, complexity, estimateDetails, estimatedAt в Idea |
| 2026-01-15 | **Фаза 3:** Frontend AI сервис (services/ai.ts, hooks/useAi.ts) |
| 2026-01-15 | **Фаза 3:** Frontend AiEstimateModal — модалка с результатом оценки (часы, сложность, разбивка по ролям, рекомендации) |
| 2026-01-15 | **Фаза 3:** Кнопка AI-оценки в таблице идей (AutoAwesome icon) + колонка "Оценка" |
| 2026-01-15 | **Infra:** Добавлены AI_PROXY_BASE_URL, AI_PROXY_API_KEY в k8s/backend-deployment.yaml |
| 2026-01-15 | **Testing:** E2E тесты Фазы 3 (Playwright) — 11 тестов покрывают AI-оценку (модалка, загрузка, результат, разбивка, просмотр) |
| 2026-01-15 | **Фаза 3:** Просмотр сохранённых результатов AI-оценки — клик по ячейке "Оценка" открывает модалку с деталями |
| 2026-01-15 | **Фаза 3.1:** Backend миграция для полей specification, specificationGeneratedAt |
| 2026-01-15 | **Фаза 3.1:** Backend POST /api/ai/generate-specification endpoint + buildSpecificationPrompt |
| 2026-01-15 | **Фаза 3.1:** Backend обновлён buildPrompt() — включает ТЗ в AI-оценку для лучшей точности |
| 2026-01-15 | **Фаза 3.1:** Frontend SpecificationModal компонент (генерация/просмотр/редактирование ТЗ) |
| 2026-01-15 | **Фаза 3.1:** Frontend кнопка ТЗ в таблице (Description icon) — серая если нет ТЗ, синяя если есть |
| 2026-01-15 | **Фаза 3.1:** Frontend интеграция useGenerateSpecification hook + сохранение редактированного ТЗ |
| 2026-01-15 | **Testing:** E2E тесты Фазы 3.1 (Playwright) — 9 тестов покрывают генерацию, просмотр, редактирование ТЗ |
| 2026-01-15 | **Фаза 3.1:** Markdown-рендеринг ТЗ в режиме просмотра (react-markdown), raw markdown в режиме редактирования |
| 2026-01-15 | **Фаза 3.1:** История ТЗ — SpecificationHistory entity, миграция, GET/DELETE/POST restore endpoints |
| 2026-01-15 | **Фаза 3.1:** Frontend история ТЗ — табы (Текущее ТЗ / История), просмотр/восстановление/удаление версий |
| 2026-01-15 | **Фаза 3.1:** При перегенерации ТЗ старая версия автоматически сохраняется в историю |
| 2026-01-15 | **Фаза 3.1:** AI-промпты (ТЗ и оценка) теперь учитывают комментарии к идее |
| 2026-01-15 | **Планирование:** Добавлены новые требования — права доступа, аудит, WebSocket, темная тема, экспорт |
| 2026-01-15 | **Документация:** Обновлены REQUIREMENTS.md, ARCHITECTURE.md, ROADMAP.md — добавлены Фазы 4-8 |
| 2026-01-15 | **Планирование:** Добавлена Фаза 3.2 — Полный просмотр идеи (все поля доступны для просмотра и редактирования) |
| 2026-01-15 | **Фаза 3.2:** Добавлены колонки pain, aiRole, verificationMethod в таблицу идей |
| 2026-01-15 | **Фаза 3.2:** ColumnVisibility компонент — управление видимостью колонок (Settings icon), сохранение в localStorage |
| 2026-01-15 | **Фаза 3.2:** IdeaDetailModal компонент — просмотр всех полей идеи, режим редактирования, интеграция с ТЗ и AI-оценкой |
| 2026-01-15 | **Фаза 3.2:** Кнопка "Подробнее" (Visibility icon) в actions колонке для открытия детального просмотра |
| 2026-01-15 | **Фаза 3.2:** Исправлен баг — статус ТЗ сохраняется при редактировании идеи в модалке |
| 2026-01-15 | **Testing:** E2E тесты Фазы 3.2 (Playwright) — 15 тестов покрывают детальный просмотр, редактирование, column visibility |
| 2026-01-15 | **CI/CD:** Keycloak theme вынесен в отдельный pipeline с проверкой изменений через git diff |
---
## Текущая задача
> Смотри [ROADMAP.md](ROADMAP.md) для полного плана разработки
**Готово:** Фазы 0-3.2 завершены ✅
**Следующий шаг:** Фаза 4 — Права доступа 📋
### Фаза 3.2: Полный просмотр идеи ✅
**Колонки в таблице:**
- [x] Колонки pain, aiRole, verificationMethod
- [x] Column visibility (скрытие/показ колонок, localStorage)
**Модалка IdeaDetailModal:**
- [x] Режим просмотра (readonly по умолчанию)
- [x] Режим редактирования (кнопка "Редактировать")
- [x] Кнопки "Сохранить" / "Отмена"
- [x] Быстрый доступ к ТЗ и AI-оценке
**E2E тесты:**
- [x] Column visibility, модалка, редактирование, сохранение (15 тестов)
### Новые требования (Фазы 4-8):
**Фаза 4: Права доступа**
- [ ] Гранулярные права (18 различных прав)
- [ ] Панель администратора
- [ ] Автор идеи (readonly)
- [ ] Admin определяется через K8s Secret
**Фаза 5: Аудит и история**
- [ ] Логирование всех действий
- [ ] Восстановление удалённых данных
- [ ] Настраиваемый срок хранения (по умолчанию 30 дней)
**Фаза 6: Real-time и WebSocket**
- [ ] Многопользовательская работа
- [ ] Индикаторы присутствия
- [ ] Конкурентное редактирование
**Фаза 7: Темная тема**
- [ ] Переключатель светлая/тёмная
- [ ] Автоопределение системной темы
**Фаза 8: Экспорт**
- [ ] Экспорт идеи в DOCX
---
## Файловая структура
```
team-planner/
├── CLAUDE.md # Точка входа для агентов
├── DEVELOPMENT.md # Правила локальной разработки
├── CONTEXT.md # Этот файл — текущий контекст
├── REQUIREMENTS.md # Требования к продукту
├── ARCHITECTURE.md # Архитектура, API, UI
├── ROADMAP.md # План разработки
├── E2E_TESTING.md # Гайд по E2E тестированию ✅
├── docker-compose.yml # PostgreSQL и сервисы
├── .drone.yml # CI/CD pipeline (Drone CI)
├── keycloak-theme/ # Кастомная тема Keycloak ✅
│ ├── Dockerfile # Образ keycloak-team-planner
│ └── team-planner/
│ └── login/ # Тема страницы логина (MUI стиль)
│ ├── template.ftl
│ ├── login.ftl
│ ├── theme.properties
│ ├── resources/css/login.css
│ └── messages/messages_ru.properties
├── tests/
│ ├── package.json # Зависимости для тестов
│ ├── playwright.config.ts # Конфигурация Playwright
│ └── e2e/ # Playwright E2E тесты ✅
│ ├── auth.setup.ts # Авторизация для тестов (Keycloak)
│ ├── phase1.spec.ts # Тесты Фазы 1 (17 тестов)
│ ├── phase2.spec.ts # Тесты Фазы 2 (37 тестов — D&D, цвета, комментарии, команда)
│ ├── phase3.spec.ts # Тесты Фазы 3 (20 тестов — AI-оценка + мини-ТЗ)
│ └── phase3.2.spec.ts # Тесты Фазы 3.2 (15 тестов — детальный просмотр, column visibility) ✅
├── backend/ # NestJS API
│ ├── src/
│ │ ├── auth/ # Модуль авторизации ✅
│ │ │ ├── jwt.strategy.ts # JWT валидация через JWKS
│ │ │ ├── jwt-auth.guard.ts # Глобальный guard
│ │ │ └── decorators/public.decorator.ts # @Public() для открытых endpoints
│ │ ├── ideas/ # Модуль идей (готов + reorder + history)
│ │ │ ├── entities/
│ │ │ │ ├── idea.entity.ts # Idea + specification поля
│ │ │ │ └── specification-history.entity.ts # История ТЗ
│ │ │ ├── dto/
│ │ │ │ └── reorder-ideas.dto.ts # DTO для изменения порядка
│ │ │ ├── ideas.controller.ts # PATCH /ideas/reorder
│ │ │ └── ideas.service.ts # reorder() с транзакцией
│ │ ├── team/ # Модуль команды (Фаза 2) — TeamMember + Role entities
│ │ ├── comments/ # Модуль комментариев (Фаза 2)
│ │ └── ai/ # AI-оценка + мини-ТЗ + история (Фаза 3 + 3.1) ✅
│ │ ├── ai.module.ts
│ │ ├── ai.service.ts # estimateIdea + generateSpecification + history + комментарии в промптах
│ │ ├── ai.controller.ts # /estimate, /generate-specification, /specification-history/*
│ │ └── dto/
│ └── ...
└── frontend/ # React приложение
├── src/
│ ├── components/
│ │ ├── AuthProvider/ # Keycloak авторизация ✅
│ │ ├── LoginPage/ # Страница логина ✅
│ │ ├── IdeasTable/
│ │ │ ├── IdeasTable.tsx # Таблица с DndContext
│ │ │ ├── DraggableRow.tsx # Сортируемая строка (useSortable)
│ │ │ ├── columns.tsx # Колонки + drag handle (13 колонок)
│ │ │ ├── ColumnVisibility.tsx # Управление видимостью колонок ✅
│ │ │ └── ...
│ │ ├── IdeasFilters/ # Фильтры
│ │ ├── CreateIdeaModal/ # Модалка создания
│ │ ├── TeamPage/ # Страница команды (Фаза 2)
│ │ │ ├── TeamPage.tsx # Табы: Участники / Роли
│ │ │ ├── TeamMemberModal.tsx # Модалка участника
│ │ │ └── RolesManager.tsx # Управление ролями
│ │ ├── CommentsPanel/ # Комментарии к идеям
│ │ ├── AiEstimateModal/ # Модалка AI-оценки (Фаза 3) ✅
│ │ ├── SpecificationModal/ # Модалка мини-ТЗ (Фаза 3.1) ✅
│ │ └── IdeaDetailModal/ # Модалка детального просмотра (Фаза 3.2) ✅
│ ├── hooks/
│ │ ├── useIdeas.ts # React Query хуки + useReorderIdeas
│ │ └── useAi.ts # useEstimateIdea + useGenerateSpecification + history hooks ✅
│ ├── services/
│ │ ├── api.ts # Axios + auth interceptors
│ │ ├── keycloak.ts # Keycloak instance ✅
│ │ ├── ideas.ts # API методы + reorder()
│ │ ├── team.ts # API команды
│ │ ├── roles.ts # API ролей
│ │ ├── comments.ts # API комментариев
│ │ └── ai.ts # AI Proxy API (Фаза 3 + 3.1) ✅
│ ├── store/
│ │ └── ideas.ts # Zustand store
│ └── types/
│ └── idea.ts # TypeScript типы
└── ...
```
---
## Ключевые решения
| Решение | Выбор | Причина |
|---------|-------|---------|
| ORM | TypeORM | Указано в требованиях |
| State Management | Zustand | Простота, минимальный boilerplate |
| UI Library | MUI | Богатый набор компонентов |
| Таблица | TanStack Table | Гибкость, виртуализация |
| Drag & Drop | dnd-kit | Современный, хорошая поддержка |
| Data Fetching | React Query | Кэширование, оптимистичные обновления |
| Язык интерфейса | Русский | Требование проекта |
| Авторизация | Keycloak | Внешний IdP, OIDC, редиректы |
| Keycloak Theme | Custom FreeMarker | Единый стиль с приложением (MUI) |
| E2E тесты | Playwright | Быстрее Selenium, лучше API, auto-wait |
| CI/CD | Drone CI | Kubernetes pipeline, автодеплой |
---
## Блокеры / Проблемы
*Пока нет*
---
## Заметки
- **Интерфейс на русском языке** — все тексты, лейблы, placeholder'ы должны быть на русском
- AI-интеграция через ai-proxy: `/Users/vigdorov/dev/gptunnel-service/INTEGRATION.md`
- **Многопользовательский режим НУЖЕН** — WebSocket, real-time обновления (Фаза 6)
- **Экспорт НУЖЕН** — экспорт идеи в DOCX (Фаза 8)
- **Права доступа НУЖНЫ** — гранулярная система прав, панель админа (Фаза 4)
- **Аудит НУЖЕН** — история действий с восстановлением (Фаза 5)
- Warning о React Compiler и TanStack Table можно игнорировать
- **Drag & Drop:** dnd-kit с useSortable + @dnd-kit/modifiers (restrictToVerticalAxis), DragHandle через React Context, CSS.Translate для совместимости с таблицами, reorder через транзакцию
- **Keycloak:** auth.vigdorov.ru, realm `team-planner`, client `team-planner-frontend`
- **Keycloak Theme:** Кастомная тема `team-planner` в стиле MUI, образ `registry.vigdorov.ru/library/keycloak-team-planner`
- **Production URL:** https://team-planner.vigdorov.ru (добавлен в Valid redirect URIs и Web origins клиента Keycloak)
- **CI/CD:** Drone CI (.drone.yml) — 3 pipeline'а: main-pipeline (backend/frontend), infra-pipeline (k8s), keycloak-theme-pipeline (отдельный с git diff проверкой)
- **E2E тесты:** Все компоненты имеют `data-testid` для стабильных селекторов. Перед написанием тестов читай E2E_TESTING.md!
- **AI Proxy:** Интеграция с ai-proxy-service (K8s namespace `ai-proxy`), модель `claude-3.7-sonnet`, env: AI_PROXY_BASE_URL, AI_PROXY_API_KEY
- **История ТЗ:** При перегенерации старая версия сохраняется в `specification_history`, можно просмотреть/восстановить/удалить
- **Комментарии в AI:** Промпты для генерации ТЗ и оценки трудозатрат теперь включают комментарии к идее для лучшей точности
- **Keycloak Theme CI:** Отдельный pipeline проверяет `git diff HEAD~1 HEAD -- keycloak-theme/` и пропускает сборку/деплой если нет изменений (экономия ресурсов, нет влияния на Keycloak)