Найдено и проверено живым прогоном на этой машине (реальный GTK-рабочий
стол, реальные профили agy) — не по чтению кода.
1. Значок .desktop-записи был .ico. Измерено:
GdkPixbuf.Pixbuf.new_from_file на HermesHub.ico падает с "Compressed
icons are not supported". .desktop-файл с нерендерящейся иконкой меню
приложений и файловый менеджер просто показывают пустым — без ошибки,
молча. PNG в тех же ассетах уже был и загружается (проверено: 256x256).
Подставлен app_icon_256.png.
2. Хаб нельзя было остановить иначе как из терминала. На Windows сервер
стартует из HermesHubWeb.exe, который держит значок в системном трее —
оттуда «Exit» останавливает процесс. На Linux сервер остаётся в фоне
после закрытия окна браузера (так и задумано — не переустанавливать
каждый раз), но ни кнопки в интерфейсе (её нет ни на одной платформе),
ни трея, ни пункта меню не было вовсе. launcher/hermes-hub-stop.sh —
недостающий эквивалент «Exit из трея»: доступен из меню приложений
через собственный .desktop-пункт, использует ту же функцию, что и
install/uninstall. Проверено живым прогоном: сервер запущен, остановлен
через новый лаунчер, curl после этого получает connection refused.
3. uninstall-linux.sh не останавливал работающий хаб перед удалением файлов
— та же причина, что install уже чинил для установки: с
--purge-user-data это ещё и rm -rf каталогов, на которые у живого
процесса открыты файловые дескрипторы. Измерено: сервер, запущенный в
песочнице, оставался в списке процессов после uninstall-linux.sh до этой
правки. Добавлена та же остановка, тем же кодом.
4. stop_running_hub была вписана отдельно в install-linux.sh и
uninstall-linux.sh — две копии, которые разошлись бы при правке одной
незамеченной для другой. Вынесена в installer/lib_stop_running_hub.sh,
источается обоими скриптами и новым лаунчером остановки.
Всё проверено дважды: прямым запуском install-linux.sh/uninstall-linux.sh
в изолированной песочнице (не ~/.hermes) и через собранный
dist/hermes-hub-setup.sh — тот самый файл, который уходит в релиз.
Тесты: 738 -> 740 passed, 2 skipped, 4 deselected. Новый тест на .ico падает
на прежней версии install-linux.sh (проверено git stash) и проходит после
фикса. ruff check . чисто.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Canonical Binary:HermesHubSetup.exe (built from HermesHubSetup.cs)
Build Script:build_installer.ps1 (compiles HermesHubSetup.cs using standard .NET Framework csc.exe present on all Windows 10/11 machines without extra toolchains).
Development & Helper Scripts
HermesHubSetup.py: Internal development helper script for testing installer logic in Python. Not distributed as a primary installer artifact.
install.ps1: Deprecated legacy bootstrap script for earlier development environments.
Testing Policy (S7)
Unit Tests: Must NEVER modify user Windows Registry (HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall) or Start Menu shortcuts.
Integration Tests: Executed against isolated sandbox mock directories.
Live VM Tests: Real Windows installer execution is reserved for disposable CI/VM environments.