Первый выпуск SysDevCleaner

Анализ Windows и очистка кешей, мусора и остатков разработки.

Ядро:
- каталог правил: 228 правил путей (496 шаблонов) + 43 правила артефактов
  проектов — Windows, браузеры, кеши сборки, IDE, приложения, пакетные
  менеджеры;
- рекурсивный поиск node_modules, target, build, __pycache__, .venv и т.п.
  с проверкой маркеров проекта, чтобы не ловить ложные срабатывания;
- поиск крупных файлов и дубликатов (хеш по началу/середине/концу и полная
  сверка), инвентаризация установленных программ через реестр;
- ограничение области сканирования по дискам;
- рекомендации и текстовый отчёт.

Безопасность:
- четыре уровня риска, автоматически отмечается только «Безопасно»;
- список защищённых путей проверяется и при выборе, и перед удалением;
- для каталогов вроде %TEMP% удаляется содержимое, а не сам каталог;
- удаление в Корзину по умолчанию, пробный запуск, журнал очисток.

Интерфейс на Dear PyGui:
- JetBrains Mono Nerd Font: кириллица и иконки в одном шрифте;
- тёмная и светлая темы, адаптивная раскладка;
- заголовок окна ставится через SetWindowTextW — Dear PyGui отдаёт его
  в ANSI-функцию как UTF-8 и портит кириллицу;
- запуск всегда с правами администратора: манифест UAC в exe и
  самоперезапуск через ShellExecuteW при работе из исходников.

Сборка в один exe через PyInstaller со вшитым шрифтом и значком.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-11 14:55:00 +03:00
commit b01cf37e66
33 changed files with 6472 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
"""Иконки Nerd Font (JetBrains Mono NF).
Nerd Font добавляет к обычному шрифту иконочные глифы в зонах частного
использования Unicode. Мы берём только глифы из BMP (U+E000–U+F8FF):
набор Material Design Icons в Nerd Font лежит выше U+FFFF, а Dear ImGui
по умолчанию собран с 16-битным ``ImWchar`` и такие символы не покажет.
Используемые наборы:
* Font Awesome 4 — U+F000…U+F2E0
* Devicons — U+E700…U+E7C5
* Codicons — U+EA60…U+EBEB
"""
from __future__ import annotations
from ..core.model import Category
# --- общие ---------------------------------------------------------------
SEARCH = "" # лупа
STOP = "" # стоп
REFRESH = "" # обновить
TRASH = "" # корзина
BROOM = "" # магия/очистка
SAVE = "" # дискета
FOLDER_OPEN = "" # открытая папка
FOLDER = "" # папка
COPY = "" # копия
FILTER = "" # фильтр
GEAR = "" # шестерёнка
INFO = "" # инфо
WARNING = "" # треугольник с восклицательным знаком
CHECK = "" # галочка
CLOSE = "" # крестик
LIGHTBULB = "" # лампочка — рекомендация
BOLT = "" # молния — быстрое действие
SHIELD = "" # щит — безопасность
HISTORY = "" # история
CHART = "" # столбики
HDD = "" # диск
LIST = "" # список
PLUS = ""
MINUS = ""
UNDO = ""
SUN = ""
MOON = ""
EXPAND = ""
COLLAPSE = ""
CHEVRON_RIGHT = ""
CUBE = ""
ARCHIVE = ""
WRENCH = ""
FILE_TEXT = ""
GLOBE = ""
GAMEPAD = ""
WINDOWS = ""
COGS = ""
ELEPHANT = "" # архивный файл — «тяжёлые файлы»
CLOCK = ""
DATABASE = ""
POWER = ""
# --- иконки категорий ----------------------------------------------------
CATEGORY: dict[Category, str] = {
Category.WINDOWS: WINDOWS,
Category.BROWSERS: GLOBE,
Category.DEV_CACHE: COGS,
Category.DEV_PROJECT: CUBE,
Category.APPS: GAMEPAD,
Category.LOGS: FILE_TEXT,
Category.PACKAGE_MANAGERS: ARCHIVE,
Category.BIG_FILES: ELEPHANT,
Category.DUPLICATES: COPY,
Category.PROGRAMS: FOLDER,
}
def cat(category: Category) -> str:
"""Иконка категории с отступом, готовая к подстановке в подпись."""
return CATEGORY.get(category, LIST) + " "
def btn(icon: str, label: str) -> str:
"""Подпись кнопки: иконка, два пробела, текст."""
return f"{icon} {label}"