docs: fix README dev/production commands, update FRONTEND_PLAN status, remove broken links #9

Merged
admin merged 1 commits from docs/phase2-fix-documentation into main 2026-04-07 15:37:42 +00:00
3 changed files with 15 additions and 16 deletions

View File

@@ -1,7 +1,7 @@
--- ---
name: Frontend implementation plan name: Frontend implementation plan
overview: Собрать минималистичный frontend для календаря забегов по UI-инструкции, строго в рамках текущего API-контракта, с отдельной внешней задачей на недостающие backend-поля для completed-забегов. overview: Собрать минималистичный frontend для календаря забегов по UI-инструкции, строго в рамках текущего API-контракта.
todos: todos:
- id: frontend-structure - id: frontend-structure
@@ -20,8 +20,8 @@ status: completed
content: Сделать блок PR и сравнение стартов с fallback для отсутствующего поля place content: Сделать блок PR и сравнение стартов с fallback для отсутствующего поля place
status: completed status: completed
- id: backend-dependency-task - id: backend-dependency-task
content: Подготовить отдельную задачу для другого агента на расширение API полем place и последующую интеграцию во frontend content: "Расширение API полем finishPlace: миграция 002, маппер, DTO, фронтенд-интеграция — выполнено"
status: pending status: completed
isProject: false isProject: false
--- ---
@@ -30,7 +30,7 @@ isProject: false
## Исходные опоры ## Исходные опоры
- UI и UX принципы берём строго из [d:\vaka.pro\calendar_run\agent-frontend-ui-instructions.md](d:/vaka.pro/calendar_run/agent-frontend-ui-instructions.md): минимализм, воздух, акцент на данных, спокойная палитра, быстрые сценарии. - UI и UX принципы: минимализм, воздух, акцент на данных, спокойная палитра, быстрые сценарии (дизайн-токены в `frontend/src/styles/tokens.css`).
- Продуктовые ограничения и структура экранов сверяем с [d:\vaka.pro\calendar_run\PLAN.md](d:/vaka.pro/calendar_run/PLAN.md). - Продуктовые ограничения и структура экранов сверяем с [d:\vaka.pro\calendar_run\PLAN.md](d:/vaka.pro/calendar_run/PLAN.md).
- Интеграционный контракт берём из [d:\vaka.pro\calendar_run\docs\backend-api-for-frontend.md](d:/vaka.pro/calendar_run/docs/backend-api-for-frontend.md). - Интеграционный контракт берём из [d:\vaka.pro\calendar_run\docs\backend-api-for-frontend.md](d:/vaka.pro/calendar_run/docs/backend-api-for-frontend.md).
- Общий контекст запуска/окружения — [d:\vaka.pro\calendar_run\README.md](d:/vaka.pro/calendar_run/README.md) и [d:\vaka.pro\calendar_run\docs\backend.md](d:/vaka.pro/calendar_run/docs/backend.md). - Общий контекст запуска/окружения — [d:\vaka.pro\calendar_run\README.md](d:/vaka.pro/calendar_run/README.md) и [d:\vaka.pro\calendar_run\docs\backend.md](d:/vaka.pro/calendar_run/docs/backend.md).
@@ -40,7 +40,7 @@ isProject: false
- Только frontend + интеграция с текущим API. - Только frontend + интеграция с текущим API.
- Статус `зарегистрирован` трактуется как UI-вариант `planned` (без изменения backend-контракта). - Статус `зарегистрирован` трактуется как UI-вариант `planned` (без изменения backend-контракта).
- Для completed-забегов обязательно показываем `темп`; считаем на фронте из `finishTime` и `distanceKm`. - Для completed-забегов обязательно показываем `темп`; считаем на фронте из `finishTime` и `distanceKm`.
- Для completed-забегов поле `место` обязательно по UX, но в API отсутствует: выделяем отдельную задачу другому агенту на расширение backend (`place`) и считаем это внешней зависимостью. - Для completed-забегов поле `место` (`finishPlace`) доступно в API (миграция 002, маппер, DTO); фронтенд отображает его в карточке и таблице сравнения.
## Архитектура frontend ## Архитектура frontend
@@ -61,14 +61,13 @@ isProject: false
- Переключение `Будущие` / `Прошедшие`. - Переключение `Будущие` / `Прошедшие`.
- Карточка старта: `title`, `date`, `distanceKm`, статус-лейбл. - Карточка старта: `title`, `date`, `distanceKm`, статус-лейбл.
- Карточка старта: - Карточка старта:
- Базовые поля + `finishTime`, вычисляемый `pace`, `notes`. - Базовые поля + `finishTime`, вычисляемый `pace`, `finishPlace`, `notes`.
- `place` — вывод включается после backend-расширения.
- PR блок: - PR блок:
- Дистанции: 5K, 10K, 21.1, 42.2 (согласно UI-инструкции). - Дистанции: 5K, 10K, 21.1, 42.2 (согласно UI-инструкции).
- Расчёт по completed-забегам с валидным `finishTime`. - Расчёт по completed-забегам с валидным `finishTime`.
- Сравнение стартов (ключевая фича): - Сравнение стартов (ключевая фича):
- Таблица/карточки по годам с `time`, `pace`, `place`. - Таблица/карточки по годам с `time`, `pace`, `finishPlace`.
- До появления `place` в API — graceful-degradation: колонка в состоянии «нет данных». - Если `finishPlace` не заполнено — graceful-degradation: колонка в состоянии «нет данных».
## UX и визуальные требования ## UX и визуальные требования
@@ -78,10 +77,10 @@ isProject: false
- Консистентные состояния загрузки/ошибок/пустых данных. - Консистентные состояния загрузки/ошибок/пустых данных.
- A11y-базис: фокус-стили, клавиатурная навигация, контраст, корректная разметка интерактивных элементов. - A11y-базис: фокус-стили, клавиатурная навигация, контраст, корректная разметка интерактивных элементов.
## Отдельная зависимая задача (другой агент) ## Зависимая задача (выполнена)
- Создать отдельную backend-задачу: добавить поле `place` в модель `Race` (миграция + API + документация контракта). - Поле `finishPlace` добавлено в модель `Race`: миграция `002_finish_place_and_registered_status.sql`, маппер `race.ts`, DTO, API-документация.
- После доставки backend-изменения: обновить frontend-типы, формы и блок сравнения, заменить placeholder на реальное значение. - Frontend-типы, карточка и блок сравнения используют `finishPlace`.
## Порядок реализации ## Порядок реализации
@@ -91,7 +90,6 @@ isProject: false
4. Реализовать карточку старта с вычислением `pace` на клиенте. 4. Реализовать карточку старта с вычислением `pace` на клиенте.
5. Реализовать PR и блок сравнения стартов с fallback для `place`. 5. Реализовать PR и блок сравнения стартов с fallback для `place`.
6. Добавить состояния пустых данных/ошибок/загрузки и а11y-полировку. 6. Добавить состояния пустых данных/ошибок/загрузки и а11y-полировку.
7. Подготовить handoff-note с зависимостью на backend-задачу (`place`) и интеграционным чеклистом.
## Definition of Done для frontend ## Definition of Done для frontend
@@ -99,4 +97,4 @@ isProject: false
- API-интеграция работает по текущему контракту без локальных обходов хранилища. - API-интеграция работает по текущему контракту без локальных обходов хранилища.
- `pace` считается корректно для completed-забегов. - `pace` считается корректно для completed-забегов.
- `registered` не ломает модель: визуально интерпретируется в рамках `planned`. - `registered` не ломает модель: визуально интерпретируется в рамках `planned`.
- Для `place` есть явная внешняя задача и безопасный fallback в UI. - `finishPlace` интегрирован; при отсутствии значения — безопасный fallback в UI.

View File

@@ -55,7 +55,7 @@ PostgreSQL: `snake_case` столбцы, маппинг в `[backend/src/mappers
- Маршруты: дашборд (`/`), список стартов (`/races`), карточка (`/races/:id`). - Маршруты: дашборд (`/`), список стартов (`/races`), карточка (`/races/:id`).
- Дашборд: ближайший старт, последний результат, PR, сезон, PR по ключевым дистанциям, сравнение завершённых стартов, при необходимости — лёгкая визуализация прогресса. - Дашборд: ближайший старт, последний результат, PR, сезон, PR по ключевым дистанциям, сравнение завершённых стартов, при необходимости — лёгкая визуализация прогресса.
- Список: будущие / прошедшие; фильтрация по году и месяцу через API. - Список: будущие / прошедшие; фильтрация по году и месяцу через API.
- Стили: BEM и дизайн-токены; ориентир по духу — `[agent-frontend-ui-instructions.md](agent-frontend-ui-instructions.md)`. - Стили: BEM и дизайн-токены (см. `frontend/src/styles/tokens.css`).
## Критерии готовности текущей итерации ## Критерии готовности текущей итерации

View File

@@ -14,7 +14,8 @@
2. Корень: `cp .env.example .env`, задайте `DB_*` (и при необходимости `CORS_ORIGIN`). 2. Корень: `cp .env.example .env`, задайте `DB_*` (и при необходимости `CORS_ORIGIN`).
3. Postgres: из корня `docker compose up -d` (см. [`docker-compose.yml`](docker-compose.yml)) — в compose используются те же `DB_NAME`, `DB_USER`, `DB_PASSWORD` из `.env`. 3. Postgres: из корня `docker compose up -d` (см. [`docker-compose.yml`](docker-compose.yml)) — в compose используются те же `DB_NAME`, `DB_USER`, `DB_PASSWORD` из `.env`.
4. `cd backend && npm run db:migrate && npm run seed` 4. `cd backend && npm run db:migrate && npm run seed`
5. `npm run build && npm run dev` 5. Dev-режим: `npm run dev`
6. Или production: `npm run build && npm start`
Без PostgreSQL (только smoke API): в `.env` задайте `CALENDAR_RUN_MOCK_DB=1`; **`db:migrate` и `seed` с mock не использовать**. Без PostgreSQL (только smoke API): в `.env` задайте `CALENDAR_RUN_MOCK_DB=1`; **`db:migrate` и `seed` с mock не использовать**.