# Задание A32: удаление десктопного приложения ## Дата поступления 2026-08-25 ## База Проверочный HEAD на момент выдачи: **`c35bc48`**. ## Ветка `antigravity/remove-desktop` ## Когда выполнять **После A29 и A30.** Оба работают в веб-слое, и удалять десктоп раньше, чем веб доберёт остаток паритета, нельзя. Пункт P0-1 — проверка этого паритета, и он выполняется первым. Два прохода: **Flash** реализует, **Pro** проводит аудит. --- ## Порядок работы с git ``` cd <каталог репозитория>; git fetch origin --prune; git status git checkout main; git pull --ff-only origin main git checkout -b antigravity/remove-desktop git commit -m "..." <- сначала коммит git push -u origin antigravity/remove-desktop ``` В `main` напрямую не пушить. --- ## Задача Владелец решил перейти на веб полностью: «десктоп надо вообще вырезать и удалить, он не нужен». Решение принято давно, но удаление ни разу не назначалось: в заданиях стояло «десктоп не трогать, он выводится из обращения», и это защищало его от правок, а не убирало. ## Что осталось — снято исполнением на `c35bc48` ``` src/antigravity_provider/router/ui/ 20 файлов, ~6 910 строк hermes_hub_app.py ~1 345 строк, CustomTkinter cli_commands.py:481 команда запуска десктопа ``` Виндовый установщик: ``` HermesHubSetup.cs:288-289 копирует HermesHub.exe в каталог установки и в hermes home HermesHubSetup.cs:575 создаёт ярлык «Hermes Hub (Desktop).lnk» рядом с «Hermes Hub (Web).lnk» HermesHubSetup.cs:140 проверка зависимостей ТРЕБУЕТ customtkinter, иначе установка не считается успешной HermesHubSetup.cs:188 ставит customtkinter и pillow в venv pyproject.toml:40 customtkinter>=6.0.0 в зависимостях ``` Линуксовый установщик десктоп уже не ставит: там только `fastapi uvicorn pydantic psutil pyyaml`, а `.desktop` ведёт на веб-лаунчер. **Сервер фактически уже без десктопа.** Последствия, не сводящиеся к лишнему весу: на Windows GUI-библиотека ставится ради программы, которой не пользуются, и её отсутствие ломает установку. Два ярлыка в меню «Пуск» — прямой путь снова открыть старое окно вместо веба; у владельца это уже случалось, он жаловался, что «открывается старая программа и тормозит при передвижении окна». ## P0-1. Сначала паритет, потом удаление **Выполняется первым и является условием остального.** Составить список того, что десктоп умеет, и сверить с вебом по каждому пункту. Особое внимание тому, что исторически жило только в десктопе: - мастер подключения аккаунтов (`router/ui/add_account_wizard.py`) — в вебе есть свой, но состав шагов сверить; - вход Antigravity и Claude по ссылке — сделан в вебе, проверить на всех провайдерах; - каталог моделей (`router/ui/model_catalog.py`); - граф маршрутизации (`router/ui/routing_graph.py`); - всё из `router/ui/views/`. **Результат — таблица «умение → где в вебе → проверено».** Непокрытое умение удалять нельзя: сначала оно появляется в вебе, и только потом удаляется десктоп. Если что-то не покрыто, а A29 и A30 его не закрывают, — назвать это в отчёте и остановиться, а не удалять молча. ## P0-2. Удаление кода После пройденного P0-1: 1. `src/antigravity_provider/router/ui/**` целиком. 2. `hermes_hub_app.py`. 3. Команду запуска десктопа из `cli_commands.py` и проверку `customtkinter` там же. 4. Тесты, проверявшие десктоп. **Тесты, проверяющие общую логику, не выбрасывать** — перенести на веб-поверхность, если они там применимы. Осторожно: часть общего кода могла переехать в `router/ui/` исторически. Перед удалением проверить, не импортирует ли что-то из веба или из маршрутизатора модули оттуда. Импорт, обёрнутый в `except ImportError`, — отдельная опасность: он не даст ошибки, просто тихо отключит функцию. Такое в проекте уже было и стоило раунда. ## P0-3. Зависимости и установщики 1. `customtkinter` и `pillow` убрать из `pyproject.toml`, из установки в `HermesHubSetup.cs` и из проверки зависимостей. **Проверить, не нужен ли `pillow` чему-то ещё** — он используется не только GUI. 2. Копирование `HermesHub.exe` убрать; сам `launcher/HermesHub.cs` и `launcher/HermesHub.exe` удалить. 3. Ярлык «Hermes Hub (Desktop)» убрать. Оставшийся ярлык переименовать в просто «Hermes Hub» — скобка «(Web)» теряет смысл, когда вариант один. 4. **Удаление старой установки должно убирать и старый ярлык.** Иначе у владельца в меню «Пуск» останется ярлык на несуществующую программу — это хуже, чем два рабочих. ## P0-4. Проверка на живой установке Мало собрать — надо поставить. 1. Собрать оба установщика, поставить на Windows, убедиться: ярлык один, он открывает веб, `customtkinter` не требуется, установка проходит без него. 2. Проверить обновление **поверх старой установки** с десктопом: старые файлы и ярлык убираются, учётные данные и настройки уцелевают. 3. Линуксовый установщик не сломан. Пункт 2 обязателен: у владельца на трёх машинах стоит версия с десктопом, и обновление пойдёт именно поверх неё. ## P0-5. Аудит вторым проходом 1. **Таблица паритета из P0-1 проверена выборочно**, а не принята на слово. 2. **Тихие импорты.** Поиском убедиться, что не осталось `from ...router.ui` под `except ImportError`. 3. **Установить и запустить**, а не только собрать. 4. **Обновление поверх старой установки** проверено на самом деле. 5. **Побочные изменения** объяснить. 6. **Пропущенный пункт назвать пропущенным.** --- ## Ограничения - Ничего, кроме десктопа, не удалять. Общая логика, маршрутизатор, адаптеры, обновлятор остаются. - Веб-слой не переписывать: он зона A29 и A30. - Правило честности без исключений. - Тег `v0.1.1` не создавать. ## Критерии приёмки 1. Ветка в `origin`, `git status` чист. 2. Таблица паритета приложена; непокрытых умений нет либо они названы, и удаление по ним не проводилось. 3. `router/ui/**` и `hermes_hub_app.py` удалены; `from ...router.ui` в коде не встречается. 4. `customtkinter` отсутствует в зависимостях, в установке и в проверке; установка проходит без него. 5. Ярлык один, ведёт на веб; ярлык на десктоп удаляется при обновлении поверх старой установки. 6. Обновление поверх версии с десктопом проверено: аккаунты, настройки и цепочки ролей уцелели. 7. Линуксовый установщик работает. 8. `ruff check .` чисто; релизный гейт не ухудшен. 9. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, `X passed / Y skipped / Z failed`. На `main` сейчас **451 passed, 2 skipped**. ## Главное Владелец работает только в вебе. Десктоп тянет за собой GUI-зависимость, второй ярлык и восемь тысяч строк, которые никто не открывает, — и время от времени запускается вместо веба. ## Порядок сдачи Передать точный `FINAL_COMMIT_SHA`.