# Контекст проекта Team Planner > Этот файл обновляется агентами для передачи контекста. **Обновляй его после каждой значимой работы!** --- ## Текущий статус **Этап:** Фаза 3.1 завершена ✅ | Новые требования (Фазы 4-8) запланированы 📋 **Фаза MVP:** Базовый функционал + авторизация + расширенный функционал + AI-оценка + мини-ТЗ + история ТЗ готовы **Следующий этап:** Фаза 4 — Права доступа **Последнее обновление:** 2026-01-15 --- ## Что сделано | Дата | Что сделано | |------|-------------| | 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 | --- ## Текущая задача > Смотри [ROADMAP.md](ROADMAP.md) для полного плана разработки **Готово:** Фазы 0-3.1 завершены ✅ **Следующий шаг:** Фаза 4 — Права доступа 📋 ### Новые требования (Фазы 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-оценка + мини-ТЗ) ├── 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 │ │ │ └── ... │ │ ├── IdeasFilters/ # Фильтры │ │ ├── CreateIdeaModal/ # Модалка создания │ │ ├── TeamPage/ # Страница команды (Фаза 2) │ │ │ ├── TeamPage.tsx # Табы: Участники / Роли │ │ │ ├── TeamMemberModal.tsx # Модалка участника │ │ │ └── RolesManager.tsx # Управление ролями │ │ ├── CommentsPanel/ # Комментарии к идеям │ │ ├── AiEstimateModal/ # Модалка AI-оценки (Фаза 3) ✅ │ │ └── SpecificationModal/ # Модалка мини-ТЗ (Фаза 3.1) ✅ │ ├── 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) — сборка backend/frontend/keycloak-theme, деплой в K8s namespace `team-planner` - **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:** Промпты для генерации ТЗ и оценки трудозатрат теперь включают комментарии к идее для лучшей точности