Первый выпуск 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:
276
README.md
Normal file
276
README.md
Normal file
@@ -0,0 +1,276 @@
|
||||
# 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 консольный режим
|
||||
```
|
||||
|
||||
## Что приложение не делает
|
||||
|
||||
Не трогает реестр, не «оптимизирует» систему, не отключает службы и не удаляет
|
||||
ничего без вашей отметки. Список установленных программ показывается для
|
||||
анализа — удаление запускает штатный деинсталлятор, а не вычищает файлы само.
|
||||
Reference in New Issue
Block a user