Files
SysDevCleaner/README.md
HeagBoKaT b01cf37e66 Первый выпуск 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>
2026-09-11 14:55:00 +03:00

277 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SysDevCleaner
<img src="sysdevcleaner.png" width="96" align="right" alt="значок SysDevCleaner">
Приложение для полного анализа Windows: находит кеши, временный мусор, остатки
разработки и тяжёлые программы, объясняет, что каждая находка означает, и даёт
удалить ровно то, что вы отметили.
Нужен Python 3.10+ и одна зависимость — [Dear PyGui](https://github.com/hoffstadt/DearPyGui)
(`pip install dearpygui`); `SysDevCleaner.bat` ставит её сам при первом запуске.
Если Dear PyGui недоступен, приложение откатывается на запасной интерфейс
на tkinter из стандартной библиотеки.
## Запуск
| Что запустить | Зачем |
|---|---|
| `SysDevCleaner.bat` | запуск с графическим интерфейсом |
| `SysDevCleaner-no-admin.bat` | то же, но без повышения прав |
| `sysdevcleaner-cli.bat` | консольный режим |
| `python run.py` | запуск из исходников |
| `python -m sysdevcleaner` | то же самое |
| `build-exe.bat` | собрать `dist\SysDevCleaner.exe` |
| `python make_icon.py` | перерисовать значок `sysdevcleaner.ico` |
## Права администратора
Приложение **всегда запускается с правами администратора**: без них недоступны
`Windows\Temp`, кеш обновлений Windows, Prefetch, `Windows.old` и история
Defender — а это обычно самая крупная добыча (у автора на тестовой машине
8.5 ГБ из 17.5 ГБ).
Как это сделано:
* собранный `SysDevCleaner.exe` несёт манифест UAC (`requireAdministrator`) —
Windows поднимает права ещё до старта Python;
* при запуске из исходников приложение само перезапускается через
`ShellExecuteW` с глаголом `runas` (см. `sysdevcleaner/winui.py`).
Отказ в UAC не фатален: программа продолжит работу с обычными правами, честно
напишет об этом в заголовке окна и в шапке, а недоступные пункты покажет
отдельной рекомендацией. Чтобы сознательно запуститься без повышения —
`SysDevCleaner-no-admin.bat` или переменная окружения `SYSDEVCLEAN_NO_ELEVATE=1`.
Консольный режим права не повышает: elevation открыл бы отдельное окно, и вывод
команды потерялся бы. Запускайте `sysdevcleaner-cli.bat` из консоли администратора,
если нужен полный охват.
## Заголовок окна
`dpg.create_viewport(title=...)` отдаёт заголовок в ANSI-функцию Windows как
UTF-8 байты, из-за чего русское название превращалось в
«SysDevCleaner вЂ" анализ...». Поэтому окно создаётся со служебным
ASCII-заголовком, а настоящее имя ставится через `SetWindowTextW` (UTF-16) —
`sysdevcleaner/winui.py`.
## Выбор дисков
По умолчанию сканируются все диски. Чтобы ограничить область, снимите лишние
флажки в строке **«Сканировать диски»** под заголовком окна — рядом появится
подпись вроде «только D:». Кнопка **«все»** возвращает полный охват.
Фильтр применяется ко всему сразу: к правилам путей, к поиску проектов, крупных
файлов и дубликатов, к списку дисков в отчёте. «Просканировать только D:»
действительно не трогает C:.
На вкладке «Обзор» у каждого диска есть кнопка **«только этот»** — один клик
ограничивает область этим диском и сразу запускает сканирование.
В консоли то же самое делает `--drive`:
```bash
python -m sysdevcleaner --drive D --categories projects
```
## Сборка в exe
```bash
build-exe.bat
```
Готовый файл появится в `dist\SysDevCleaner.exe` (~15 МБ, одним файлом).
Скрипт сам доставит PyInstaller и Dear PyGui, если их нет, **вошьёт в сборку
JetBrains Mono Nerd Font** (иначе на чужой машине без этого шрифта интерфейс
останется с кириллицей, но без иконок) и **встроит манифест UAC**, чтобы exe
сразу запрашивал права администратора.
Значок берётся из `sysdevcleaner.ico` — он ставится и на сам exe, и на окно
приложения (`create_viewport(small_icon=…, large_icon=…)`), поэтому иконка
одинакова в проводнике, на панели задач и в заголовке. Перерисовать:
`python make_icon.py` — метла рисуется геометрией, без зависимости от шрифта,
чтобы оставаться разборчивой на 16×16.
Ключи `build_exe.py`:
| Ключ | Что делает |
|---|---|
| `--onedir` | папка вместо одного файла: запускается быстрее, без распаковки во временный каталог |
| `--no-admin` | не встраивать манифест UAC (по умолчанию он есть) |
| `--no-font` | не вшивать шрифт, брать системный |
| `--console` | оставить окно консоли, чтобы видеть ошибки |
| `--icon ФАЙЛ` | свой значок `.ico` |
Шрифт можно подменить без пересборки: положите свой TTF в папку `fonts` рядом
с `SysDevCleaner.exe`.
## Шрифт и кириллица
Интерфейс построен на Dear PyGui, а тот рисует текст встроенным шрифтом
ProggyClean, в котором **нет кириллицы** — без настройки весь русский текст
превращается в пустые квадраты. Решение живёт в `sysdevcleaner/gui/fonts.py`:
1. после `create_context()`, но **до** `setup_dearpygui()` регистрируем свой TTF
внутри `dpg.font_registry()` — на шаге `setup_dearpygui()` собирается атлас
глифов, и позже добавить символы уже нельзя;
2. вызываем `dpg.bind_font()` внутри того же блока, пока шрифт заведомо жив;
3. на Dear PyGui **1.x** дополнительно просим диапазоны
`mvFontRangeHint_Default` и `mvFontRangeHint_Cyrillic`. Начиная с **2.0** эти
вызовы — no-op: диапазоны определяются автоматически по содержимому шрифта.
Мы их всё равно делаем ради совместимости с 1.x, но глушим предупреждения.
По умолчанию берётся **JetBrains Mono Nerd Font** — в нём есть и полная
кириллица, и иконочные глифы, поэтому отдельный иконочный шрифт не нужен
(иконки в `sysdevcleaner/gui/icons.py`). Если его нет, подхватывается обычный
JetBrains Mono, затем Segoe UI, Calibri, Tahoma, Arial — тогда интерфейс
останется читаемым, но без иконок.
Можно положить любой свой TTF в папку `fonts/` рядом с приложением — она имеет
приоритет над системными шрифтами.
Важная деталь: берутся только иконки из BMP (U+E000–U+F8FF). Набор Material
Design Icons в Nerd Font лежит выше U+FFFF, а Dear ImGui собран с 16-битным
`ImWchar` и такие символы не отрисует.
## Что ищется
**Система Windows** — временные файлы пользователя и системы, кеш Windows Update,
оптимизация доставки, `Windows.old`, Prefetch, дампы аварийных завершений и
`MEMORY.DMP`, отчёты WER, кеш эскизов и значков, кеш шрифтов, INetCache, кеш
шейдеров DirectX, Корзина, `$PatchCache$`, логи установки Panther, история
проверок Defender, LiveKernelReports.
**Браузеры** — Chrome, Edge, Brave, Opera, Opera GX, Vivaldi, Yandex, Chromium,
Firefox, Tor. Для каждого профиля отдельно: HTTP-кеш, Code Cache, GPUCache,
кеши шейдеров и WebGPU, Service Worker, Media Cache, IndexedDB, отчёты Crashpad.
**Кеши разработки** — npm, Yarn, pnpm, Bun, Deno, node-gyp, Electron,
Playwright/Puppeteer, Cypress, pip, Poetry, uv, Conda, PyInstaller, NuGet,
Maven, Gradle, Cargo, Go (модули и сборка), JDK, Android SDK и образы
эмулятора, Flutter/Dart, Composer, RubyGems, Terraform, Helm, vcpkg/Conan,
ccache/sccache, Unity, Unreal DDC, Docker Desktop.
**IDE** — VS Code (и Insiders/VSCodium), Cursor, Windsurf, JetBrains (индексы,
кеши, данные старых версий), Visual Studio и его установщик, Xamarin, Eclipse,
NetBeans.
**Артефакты внутри проектов** — рекурсивный обход ваших папок с кодом:
`node_modules`, `.next`, `.nuxt`, `.turbo`, `.parcel-cache`, `.angular`,
`.svelte-kit`, `.astro`, `coverage`, `__pycache__`, `.pytest_cache`,
`.mypy_cache`, `.ruff_cache`, `.tox`, `.venv`, `target`, `bin`/`obj`, `.vs`,
`build`, `cmake-build-*`, `.gradle`, `.dart_tool`, `vendor`, `Pods`,
`Library` (Unity), `Intermediate`/`DerivedDataCache` (Unreal), `.terraform`,
`dist`, `out`.
**Приложения** — Discord, Slack, Teams, Telegram, Spotify, Steam, Epic,
Battle.net, EA/Origin, Adobe Media Cache, OBS, Zoom, Office, OneDrive, кеши
шейдеров NVIDIA и AMD, плюс автоматический поиск кешей любых Electron-программ.
**Пакетные менеджеры** — Chocolatey, Scoop, winget, Package Cache.
**Дополнительно (включается в настройках)** — крупные файлы от заданного
размера, дубликаты файлов (сверка по содержимому), список установленных
программ с реальным размером на диске и давностью использования.
## Как это устроено
Каждая находка получает уровень риска, и это определяет, что приложение
отмечает само:
| Риск | Что это значит | Отмечается автоматически |
|---|---|---|
| **Безопасно** | мусор, который система пересоздаёт сама | да |
| **Низкий риск** | кеш; после удаления первый запуск будет медленнее | нет |
| **Средний риск** | потеря состояния, нужна пересборка или повторная закачка | нет |
| **Высокий риск** | можно сломать проект — только осознанное решение | нет |
Защита от ошибок:
- корни дисков, `Windows`, `Program Files`, профиль пользователя и папки
«Документы», «Рабочий стол», «Загрузки» и т.п. нельзя удалить — проверка
срабатывает и при выборе, и повторно перед самим удалением;
- для каталогов вроде `%TEMP%` удаляется **содержимое**, а не сам каталог;
- по умолчанию всё уходит **в Корзину** — можно вернуть;
- есть **пробный запуск**: показывает точный план, ничего не трогая;
- приложение предупреждает, если браузер или редактор сейчас запущен, — занятые
файлы всё равно не удалятся;
- каждая очистка пишется в журнал
`%LOCALAPPDATA%\SysDevCleaner\journal\clean-*.json` — видно, что и когда было
удалено.
## Вкладки
- **Обзор** — заполненность дисков, сводка по категориям и рекомендации:
что чистить в первую очередь, где заброшенные проекты, какие программы весят
много и давно не запускались.
- **Очистка** — находки, сгруппированные по категориям в раскрывающиеся
разделы. У каждой строки свой флажок, у раздела — флажок «отметить всю
категорию». Клик по названию показывает подробности внизу, наведение —
полный путь во всплывающей подсказке. Есть фильтр по названию и пути.
- **Программы** — установленное ПО с сортировкой по размеру, простою, имени или
издателю и поиском по названию. Колонка «простой» показывает, сколько дней не
менялись файлы программы. Клик по строке открывает папку установки, кнопка —
запускает штатный деинсталлятор.
- **Настройки** — какие категории сканировать, где искать проекты, включение
поиска крупных файлов и дубликатов.
- **Журнал** — история очисток и ошибки доступа последнего сканирования.
## Консольный режим
```bash
python -m sysdevcleaner --categories devcache,projects --top 40
```
```bash
python -m sysdevcleaner --root "D:\code" --big-files 500 --duplicates 50 --report отчёт.txt
```
```bash
python -m sysdevcleaner --clean safe --dry-run
```
Ключи:
- `--categories` — `windows,browsers,devcache,projects,apps,logs,pkg` или `all`
- `--drive БУКВА` — сканировать только этот диск (можно повторять)
- `--root ПАПКА` — где искать проекты (можно повторять)
- `--big-files МБ`, `--duplicates МБ` — включить дополнительный анализ
- `--no-programs` — не собирать список установленных программ
- `--report ФАЙЛ` — сохранить подробный отчёт
- `--clean УРОВЕНЬ` — удалить находки с риском не выше `safe`/`low`/`medium`/`high`
- `--dry-run` — показать план, ничего не удаляя
- `--permanent` — удалять мимо Корзины
- `--yes` — без подтверждения
## Структура
```
build_exe.py сборка в exe через PyInstaller
make_icon.py генерация значка
sysdevcleaner/
core/
model.py структуры данных, уровни риска и категории
rules.py каталог правил: 228 правил путей (496 шаблонов) + 43 правила артефактов
util.py размеры, защита путей, удаление в Корзину, список процессов
scanner.py раскрытие правил в находки, параллельный подсчёт размеров
devscan.py рекурсивный поиск артефактов внутри проектов
heavy.py крупные файлы и дубликаты (хеш по началу/середине/концу + полная сверка)
programs.py инвентаризация установленного ПО через реестр
advisor.py рекомендации и текстовый отчёт
cleaner.py удаление с журналом и повторной проверкой безопасности
winui.py заголовок окна через Unicode-API и повышение прав
gui/
app.py интерфейс на Dear PyGui
fonts.py подключение TTF и кириллица (см. раздел «Шрифт и кириллица»)
icons.py иконки Nerd Font
dpg_theme.py тёмная и светлая темы для Dear PyGui
app_tk.py запасной интерфейс на tkinter
theme_tk.py темы для запасного интерфейса
cli.py консольный режим
```
## Что приложение не делает
Не трогает реестр, не «оптимизирует» систему, не отключает службы и не удаляет
ничего без вашей отметки. Список установленных программ показывается для
анализа — удаление запускает штатный деинсталлятор, а не вычищает файлы само.