From 0a753ad4c79577b34da34ff0f7cdeeec6f92569b Mon Sep 17 00:00:00 2001 From: AnRil Date: Fri, 22 May 2026 02:01:09 +0700 Subject: [PATCH] docs(v0.5.5): CHANGELOG + badge --- CHANGELOG.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++- CLAUDE.md | 2 +- README.md | 2 +- 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c65ac2c..eaee982 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,75 @@ ## [Unreleased] +## [0.5.5] — 2026-05-22 + +Большой sweep по ревизии: 4 спринта правок (≈14 пунктов), все 135 тестов +зелёные. Главное — UI больше не залипает при retry'ях I/O, GSI порт не +зависает в TIME_WAIT после выхода, sandbox включён, шрифты self-hosted. + +### Security + +- **`sandbox: true`** на обоих BrowserWindow. Preload использует только + contextBridge + ipcRenderer (sandbox-safe), никаких Node-built-ins. + OS-уровневый sandbox изолирует renderer на уровне процессов — даже + RCE в зависимости рендерера не получит Node-доступа через preload. +- **CSP ужесточён.** Убраны `https://fonts.googleapis.com` и + `https://fonts.gstatic.com` origins (шрифты теперь self-hosted), + добавлены `connect-src 'self'`, `base-uri 'self'`, + `frame-ancestors 'none'`. + +### Added + +- **Self-hosted шрифты.** Plus Jakarta Sans, Bricolage Grotesque, + JetBrains Mono подключены через `@fontsource/*` пакеты — в bundle + лежат локально, без интернета шрифты работают, CSP без внешних + origins. +22 .woff/.woff2 (~500KB) в installer. +- **`src/main/logger.ts`** — структурный logger с уровнями + (debug/info/warn/error) и ротацией. Пишет в + `%APPDATA%/Exercise Reminder/logs/latest.log` (≤1MB) и дублирует + в console. При 1MB ротируется в `prev.log`. `LAUDE_DEBUG=1` + включает debug-уровень. Подключён в hot paths: store, updater, + GSI server, registry, dota2 provider — особенно полезно для + диагностики «челленджи не срабатывают» (видно token verify, + POST_GAME detection, фильтрацию challenges). +- `` синхронизируется с `settings.language` через + ThemeProvider — screen readers корректно произносят язык. +- `dev:simulateMatchEnd` channel вынесен в IPC enum + (`IPC.devSimulateMatchEnd`). +- `test:coverage` npm script. + +### Changed + +- **`broadcastState` больше не шлёт `history`** через IPC. Раньше + каждый markDone/snooze отправлял весь state включая до 10k + history-записей (~500KB JSON) к каждому BrowserWindow. Теперь + `AppState` (renderer-facing) без `history`, а `PersistedState` + (internal) с историей. Renderer и так дёргал `getHistory()` + отдельно, поведение не изменилось — только perf. +- **`lib/icon.tsx`**: `import * as Lucide` (wildcard, ~500KB всех + 1500+ иконок в bundle) → explicit named imports + ICON_MAP. + В bundle только 18 ICON_CHOICES. +- **ChallengeEditor**: multiplier клампится в UI до [0.5, 1000] + (совпадает с validate.ts). Раньше save с 9999 молча отклонялся + IPC-валидатором. + +### Fixed + +- **`atomicWrite` spin-loop → async setTimeout.** Раньше при retry + на EBUSY/EPERM (антивирус, OneDrive) main process замораживался + на 50/200/800ms × до 3 итераций ≈ секунда залипания UI. Сейчас + async sleep — event-loop живёт. Аналогичный фикс в + `games/steam-launch-options.ts`. Сохранён sync-вариант для + `flushNow` в `before-quit` (там event-loop уже не работает). +- **`before-quit` дожидается `stopGamesRegistry`** через + `e.preventDefault()` + `app.exit(0)`. Раньше GSI HTTP server + не успевал `closeAllConnections` до exit, и следующий запуск + получал EADDRINUSE на порту 4701 (TIME_WAIT) — GSI молча не + работал. +- **IPC `getState` не мутирует кэш.** Раньше `state.settings.startWithWindows` + перезаписывалось напрямую, разъезжаясь с persisted-disk-значением + до следующего mutation. Сейчас возвращается поверхностная копия. + ## [0.5.4] — 2026-05-19 Обновление приложения теперь по-настоящему фоновое + почти моментальный @@ -222,7 +291,8 @@ иконки), системный трей, автозапуск с Windows, native-уведомления, NSIS-инсталлятор, auto-update через electron-updater. -[Unreleased]: https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/compare/v0.5.4...HEAD +[Unreleased]: https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/compare/v0.5.5...HEAD +[0.5.5]: https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/releases/tag/v0.5.5 [0.5.4]: https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/releases/tag/v0.5.4 [0.5.3]: https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/releases/tag/v0.5.3 [0.5.2]: https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/releases/tag/v0.5.2 diff --git a/CLAUDE.md b/CLAUDE.md index 7fe4320..6d7e861 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ ## TL;DR -**Laude / Exercise Reminder** — Windows desktop приложение на Electron 33, которое напоминает делать упражнения и опционально парсит статистику матчей Dota 2 (через GSI) в количество повторений. Текущая версия — **0.5.4**. Один разработчик (AnRil), один remote — self-hosted Gitea. +**Laude / Exercise Reminder** — Windows desktop приложение на Electron 33, которое напоминает делать упражнения и опционально парсит статистику матчей Dota 2 (через GSI) в количество повторений. Текущая версия — **0.5.5**. Один разработчик (AnRil), один remote — self-hosted Gitea. ## Стек diff --git a/README.md b/README.md index 066ff1d..aa7ce43 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Windows desktop приложение, которое напоминает делать упражнения во время работы за компьютером. Опционально подключается к Dota 2 и после каждого матча превращает статистику (смерти, убийства, ассисты) в количество повторений. -[![release](https://img.shields.io/badge/release-v0.5.4-orange)](https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/releases/latest) +[![release](https://img.shields.io/badge/release-v0.5.5-orange)](https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude/releases/latest) [![tests](https://img.shields.io/badge/tests-135%20passing-green)]() [![platform](https://img.shields.io/badge/platform-Windows%2010%2F11-blue)]()