rust-switcher 1.0.13

Windows keyboard layout switcher and text conversion utility
Documentation
# Rust Switcher Task Board


Небольшая доска задач для проекта Rust Switcher.
Статусы: `todo`, `in-progress`, `done`.

Легенда:
- 🧱 todo
- 🛠️ in-progress
- ✅ done

Источник статусов "проверено по коду" на 2026-02-28.

## Текущие задачи


|| Задача | Owner | Статус | Проверено по коду | Комментарий |
|:-:|:------|:------|:------:|:------------------|:-----------|
| 1 | Улучшить покрытие модульными тестами | qqrm | 🛠️ in-progress | частично реализовано | Фокус: B-07.1, B-07.2, B-07.3. Уже есть тесты в `domain/text/last_word.rs`, `tests/config_validator_tests.rs`, `tests/on_hotkey_tests.rs` |
| 2 | B-02.3 Tray UX: AutoConvert toggle и меню | qqrm | ✅ done | реализовано | ЛКМ по иконке: show/hide окна (через debounce/timer). ПКМ: контекстное меню с AutoConvert, Show/Hide, Dark/Light, Exit. Double click: toggle AutoConvert |

## Backlog


Правило: backlog задачи можно брать сверху вниз. Если задача зависит от другой, это явно указано.

### B-01 Стабильный старт и применение конфига


| ID | Задача | Статус | DoD |
|:--:|:------|:------:|:----|
| B-01.1 | Применять runtime и config на старте (autostart, delay, hotkeys) | ✅ done | На старте читается config, обновляется UI, синхронизируется чекбокс автозапуска и применяются runtime hotkeys/sequences |
| B-01.2 | Синхронизировать RegisterHotKey и LL hook sequences с конфигом при старте | ✅ done | На старте и после Apply применяется один и тот же путь `apply_config_runtime` + `register_from_config` |

### B-02 Tray UX


| ID | Задача | Статус | DoD |
|:--:|:------|:------:|:----|
| B-02.3 | Ожидаемый Tray UX | ✅ done | ЛКМ: show/hide окна. ПКМ: контекстное меню без показа окна. Double click: toggle AutoConvert. Меню содержит AutoConvert (checked), Show/Hide, Dark/Light, Exit |

### B-03 Autostart


| ID | Задача | Статус | DoD |
|:--:|:------|:------:|:----|
| B-03.1 | Tooltip на чекбоксе автозапуска про перенос exe | 🧱 todo | Tooltip показывается при hover и явно предупреждает, что перенос файла ломает автозапуск |
| B-03.2 | Чеклист автозапуска для релиза | 🧱 todo | Документированы и пройдены ручные проверки: enable, disable, reboot, move exe |

### B-06 Логи и диагностика


| ID | Задача | Статус | DoD |
|:--:|:------|:------:|:----|
| B-06.1 | В релизе по умолчанию логи выключены | 🧱 todo | Release сборка не пишет лог, если явно не включен флаг |
| B-06.2 | Явный режим диагностики | 🧱 todo | Есть понятный переключатель (флаг настройка), который включает логирование и ротацию |

### B-07 Тесты


| ID | Задача | Статус | DoD |
|:--:|:------|:------:|:----|
| B-07.1 | Тесты HotkeySequence state machine | 🛠️ in-progress | Есть базовые тесты `keyboard_sequence_tests.rs` для `chord_matches`; расширенные сценарии (gap/debounce/reset/конфликты) остаются в backlog |
| B-07.2 | Инварианты mapping RU EN | 🛠️ in-progress | Есть псевдо-property тесты в `mapping_invariants_tests.rs` (roundtrip + punctuation rules), но можно расширять покрытие |
| B-07.3 | Конвертация selection edge cases | 🧱 todo | Пустой буфер, multi line, слишком длинно, locked clipboard, retry budget |

### B-08 UI мелочи


| ID | Задача | Статус | DoD |
|:--:|:------|:------:|:----|
| B-08.1 | Кнопка GitHub или Report an issue | 🧱 todo | Открывает URL репозитория в браузере |
| B-08.2 | Привести вкладку Hotkeys в соответствие реальности | 🛠️ in-progress | UI показывает active sequences и поддерживает capture/apply; остается UX-задача по устранению дефолтного дубля Convert smart/Convert selection |

### B-09 Отложено сознательно


| ID | Задача | Статус | Комментарий |
|:--:|:------|:------:|:-----------|
| D-01 | Last phrase | 🧱 todo | Сложно и сейчас не берем. Нужно отдельное проектирование эвристики и UX |
| D-02 | Нативный Linux GUI | 🧱 todo | Делать после стабилизации Windows v1, с выделением core и платформенных слоев |

### B-10 Очень дальний конец roadmap


| ID | Задача | Статус | DoD |
|:--:|:------|:------:|:----|
| X-02 | Темы: Light Dark и Follow system | 🧱 todo | Есть ручной выбор темы и режим follow system, UI реально меняет палитру, реакция без перезапуска |

## Выполненные задачи


| ID | Задача | Owner | Статус | Комментарий |
|:--:|:------|:------|:------:|:-----------|
| 1 | Вынести уведомления в отдельный thread | qqrm | ✅ done | Реализован backend и очередь, критические пути не блокируются |
| 4 | Частотный анализ (RU EN) для решения автоконвертации через Lingua | qqrm | ✅ done | Lingua RU EN используется для эвристики автоконвертации |
| B-01.3 | Apply всегда пишет новый конфиг, даже если старый сломан или не читается | qqrm | ✅ done | Apply не зависит от успешного чтения существующего файла |
| B-04.1 | Worker thread для notify с каналом | qqrm | ✅ done | Уведомления не блокируют критические пути, backend обрабатывает постановку задач |
| B-04.2 | Ограничение частоты notify | qqrm | ✅ done | Спам уведомлений невозможен, есть dedupe и базовое ограничение частоты |