d14a674e22
Made-with: Cursor
6.6 KiB
6.6 KiB
PR: UI — выравнивание под макеты (редактор + пульт)
Связь с feature-pipeline (.cursor/skills/feature-pipeline/SKILL.md): критерии ниже сгруппированы по стадиям; после merge обновляют .cursor/pipeline-state.json по мере прохождения стадий.
Мета PR
| Поле | Значение |
|---|---|
| Цель | Визуальная и UX-полировка существующих экранов без новых продуктовых фич из макета |
| Область | EditorApp, SceneGraph, ControlApp, общие токены/мелкие UI-баги |
| Вне скоупа | Новые пункты меню, новые типы сцен, новые каналы микшера, если их нет в коде |
Stage 1 — Implementation (subagent: frontend-senior)
Чеклист PR
- P0-A Карточка узла графа: статусы «Авто / Цикл / Аудио» отражают реальные поля сцены (
previewVideoAutostart,settings.loopVideo, наличиеmedia.audios), а не статичный текст. - P0-B Пульт: для сцены с видео-превью явно подписано, что кисть эффектов недоступна (согласовано с
PresentationView: эффекты только для image). - P1-A Пульт: порядок секций Предпросмотр → Варианты ветвления → Музыка сцены → Быстрый микшер (вертикальный поток как в референсе).
- P1-B Сетка «Варианты ветвления» без «дыр»:
repeat(auto-fit, minmax(...))или фиксированные слоты с disabled/placeholder без новых сценариев — только визуальная сетка. - P2-A Редактор: меню «Файл» — цвет текста пункта на валидном токене (
--text0/--text1), без несуществующего--text. - P2-B Список сцен: убрать пустой статус-ряд у неактивных карточек (без лишнего вертикального зазора).
Критерии приёмки (Stage 1)
- На графе для сцены без видео-превью не отображаются вводящие в заблуждение чипы «Авто/Цикл» видео-превью; при наличии аудио — корректный индикатор аудио.
- Для сцены с видео-превью чипы «Авто»/«Цикл» совпадают с
previewVideoAutostartиscene.settings.loopVideo. - В пульте при
previewAssetType === 'video'пользователь видит одну строку-пояснение (вторичный текст), почему нет панели эффектов. - Визуальный порядок блоков пульта соответствует чеклисту P1-A; отступы между
Surfaceединообразны (gap16). - Нет регрессий drag-and-drop сцен на граф и переключения веток.
Definition of Done (Stage 1): все пункты чеклиста Stage 1 отмечены; npm run build успешен.
Stage 2 — Review (subagent: reviewer)
Чеклист PR
- Нет «мёртвых» веток UI и ложных состояний (чипы/подписи соответствуют данным).
- a11y: фокус/клавиатура на интерактивах не сломаны;
aria-*не ухудшены. - Нет лишнего diff вне файлов задачи.
Критерии приёмки (Stage 2)
- Reviewer фиксирует замечания с Severity; все high устранены или явно отклонены с причиной в PR.
- После правок по review снова выполняется
npm run build.
Definition of Done (Stage 2): review-замечания закрыты; state review: done.
Stage 3 — Tests (subagent: unit-tests)
Чеклист PR
- Добавлены или обновлены тесты на чистую логику (например, хелпер разметки чипов по
Scene, если вынесен вapp/shared). - Либо задокументировано в PR, что изменения только презентационные и покрыты smoke-тестом пайплайна.
Критерии приёмки (Stage 3)
npm run testзавершается с кодом 0.- Новые тесты не flaky, не зависят от Electron UI.
Definition of Done (Stage 3): tests: done в .cursor/pipeline-state.json.
Stage 4 — Verify (локально / hook final-verify.cjs)
Выполнить подряд:
npm run lint
npm run typecheck
npm run test
Если npm run lint падает на массовых Delete ␍ (CRLF/LF) в файлах вне PR — до отдельного chore-PR с нормализацией строк для этого чеклиста достаточно:
npx eslint app/renderer/control/ControlApp.tsx app/renderer/editor/graph/SceneGraph.tsx app/renderer/shared/ui/sceneGraphChips.ts app/renderer/shared/ui/sceneGraphChips.test.ts --max-warnings 0
npm run typecheck
npm run test
npm run build
Критерии приёмки (Stage 4)
npm run typecheck,npm run test,npm run build— exit 0.- Линт: либо полный
npm run lint— exit 0, либо (при известном eol-долге репозитория) scoped-ESLint по файлам PR — exit 0, как в блоке выше. node .cursor/hooks/final-verify.cjs— успешное завершение пайплайна только когда полныйnpm run lintзелёный (хук вызывает полный lint; при падении lint хук пишетfollowup_messageв stdout).
Синхронизация с .cursor/pipeline-state.json
После каждой стадии обновлять файл:
{
"implementation": "done",
"review": "done",
"tests": "done"
}
До начала работы — все "pending".