feat(robustness+ui): отказоустойчивость main, тесты, a11y-полировка, лицензия
Надёжность main-процесса: - глобальные uncaughtException/unhandledRejection (лог + flushNow) - safeHandle/safeOn вокруг всех IPC-хендлеров (не падаем молча, generic-ошибка наружу) - таймаут 4s на tasklist, Atomics.wait вместо busy-spin на exit-записи - единый log.error для фоновых сбоев вместо console.error/тишины Тесты (178 -> 203): meeting-detect, scheduler-gating, store (миграции/карантин/cap). UI/UX: - prefers-reduced-motion через MotionConfig + CSS media-блок - Spinner/Skeleton примитивы, loading-состояния вместо пустых заглушек - aria-live анонсы достижений и выполнения (useAnnounce) - оформленные пустые состояния, клавиатура в меню ExerciseCard Лицензия: проприетарный LICENSE + правка README/CLAUDE.md, счётчик тестов. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
38
CLAUDE.md
38
CLAUDE.md
@@ -12,7 +12,7 @@
|
||||
- **Build**: electron-vite 2 + Vite 5 + electron-builder 25 (NSIS, x64 only)
|
||||
- **UI**: React 18 + TypeScript 5 + Tailwind 3 + framer-motion + react-router (HashRouter) + zustand 5
|
||||
- **Auto-update**: electron-updater 6, generic provider, фиксированный канал
|
||||
- **Тесты**: Vitest 4 (53 теста, все зелёные)
|
||||
- **Тесты**: Vitest 4 (203 теста, все зелёные)
|
||||
- **Lint/format**: ESLint 8 (flat-ish .eslintrc.cjs) + Prettier 3 + EditorConfig
|
||||
- **Иконки**: lucide-react (whitelisted lookup через `ICON_CHOICES`)
|
||||
- **Шрифты**: Plus Jakarta Sans, Bricolage Grotesque, JetBrains Mono (Google Fonts CDN)
|
||||
@@ -38,8 +38,14 @@
|
||||
- string cap 200 chars, enum-валидация для theme/lang/notify-mode/stat
|
||||
- HH:MM regex для quietHours, dedup days
|
||||
- Strip `id` из updateExercise/updateChallenge patch
|
||||
- **Error-boundary**: все хендлеры обёрнуты в `safeHandle`/`safeOn` (`src/main/ipc.ts`) — исключение логируется в `latest.log`, наружу уходит generic `ipc-failed` (не падаем молча, не утекают детали)
|
||||
- **Dev-only**: `dev:simulateMatchEnd` gated на `!app.isPackaged`
|
||||
|
||||
### Отказоустойчивость main
|
||||
- **Глобальные хендлеры** в `src/main/index.ts`: `uncaughtException` (лог + `flushNow`) и `unhandledRejection` (лог) — процесс не исчезает молча
|
||||
- **tasklist timeout** 4s в `meeting-detect.ts` (зависший child не копится)
|
||||
- **Sync write на exit** через `Atomics.wait` (не busy-spin) в `store.ts`
|
||||
|
||||
### Auto-update (КРИТИЧНО)
|
||||
- **Фиксированный URL канала**: `…/releases/download/update-channel/latest.yml` — никогда не меняется
|
||||
- **НЕ** `…/releases/download/v${version}/…` (старая схема ломалась: установленная копия видела только свой релиз)
|
||||
@@ -122,18 +128,32 @@ npm run release -- -Bump patch
|
||||
| `src/renderer/src/pages/Dashboard.tsx` | главная |
|
||||
| `src/renderer/src/ReminderApp.tsx` | окно напоминания |
|
||||
|
||||
## Тесты (53)
|
||||
## Тесты (203)
|
||||
|
||||
```
|
||||
src/shared/types.test.ts (4)
|
||||
src/shared/quiet-hours.test.ts (7)
|
||||
src/renderer/src/lib/format.test.ts (8)
|
||||
src/renderer/src/lib/history.test.ts (13)
|
||||
src/main/games/vdf.test.ts (11)
|
||||
src/renderer/src/i18n/i18n.test.ts (10)
|
||||
src/main/validate.test.ts (68)
|
||||
src/renderer/src/lib/history.test.ts (31)
|
||||
src/renderer/src/i18n/i18n.test.ts (15)
|
||||
src/renderer/src/lib/format.test.ts (14)
|
||||
src/main/games/vdf.test.ts (11)
|
||||
src/main/store.test.ts (10) ← main: миграции/карантин/cap
|
||||
src/renderer/src/lib/achievements.test.ts (10)
|
||||
src/shared/release-notes.test.ts (9)
|
||||
src/main/scheduler.test.ts (8) ← main: gating-логика
|
||||
src/main/meeting-detect.test.ts (7) ← main: детект ВКС + кэш/timeout
|
||||
src/shared/quiet-hours.test.ts (7)
|
||||
src/main/adaptive.test.ts (6)
|
||||
src/shared/types.test.ts (4)
|
||||
src/renderer/src/lib/icon-choices.test.ts (3)
|
||||
```
|
||||
|
||||
Покрываются: helpers, история/стрики (DST), тихие часы (wrap+filter), VDF-парсер Steam, i18n с плюрализацией, дефолты.
|
||||
Покрываются: IPC-валидация, persistence (миграции/карантин/cap), scheduler-gating
|
||||
(тихие часы/ВКС/daily-goal), детект ВКС (мок child_process), helpers, история/стрики
|
||||
(DST), тихие часы (wrap+filter), VDF-парсер Steam, достижения, i18n с плюрализацией,
|
||||
дефолты.
|
||||
|
||||
Паттерн для main-тестов: `vi.mock('electron'|'./store'|'node:child_process')` +
|
||||
`vi.resetModules()` + dynamic import (сброс module-level состояния между тестами).
|
||||
|
||||
## Технический долг (не для пользователя)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user