Версия. В index.html номер стоял руками в двух местах, а в app.js был
запасным значением '0.1.1'. Номер сборки приходил из API и обновлялся,
версия — нет: владелец обновился до e6eab12 и увидел v0.1.1. Подъём
версии в пяти местах бэкенда до экрана не доходил вовсе. Теперь версия
берётся только из API; если сервер её не передал, пишется Н/Д с причиной,
а не правдоподобный номер.
Установка. Отказ остановки прежнего хаба прерывал установку целиком, и
владелец получал голый код 15. Теперь неудачная остановка не отменяет
установку: причина показывается, работа продолжается, и если файл
действительно занят, об этом скажет копирование с именем файла.
Копирование файлов получило повтор: процесс мог не успеть отпустить файл
после остановки. Пять попыток с паузой вместо отказа с первой.
599 passed, ruff clean.
Co-Authored-By: Claude Opus 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.