- .dmg распространяется неподписанным; инструкция для конечного пользователя
(правый клик → «Открыть» или снятие карантина xattr) — в README
- хеш и путь текущего установщика 0.1.1
- сборки Windows/Linux отложены: репозиторий в Gitea, раннеры есть у GitHub
Actions; локальная часть (desktop-check, desktop-release --target) готова
Версия — в одном месте: файл VERSION в корне, из него её берут Makefile,
deploy/install.sh (IMAGE_TAG) и desktop-обёртка (tauri.conf.json, Cargo.toml).
Публикация обновлений (scripts/desktop-release.sh):
- манифесты прошлых релизов удаляются: оставшийся <старая версия>.json
перекрывал новый релиз — обёртка спрашивает манифест своей версии и видела
«обновлений нет»;
- mktemp-каталог раскладки получает 755, каталоги на инстансе
нормализуются: rsync -a переносил режим 0700 на корень каталога обновлений,
и приложение не могло читать манифесты (404 при живых файлах);
- --remote работает без TTY и без sudo, если каталог обновлений записываем;
опции ssh — в GLCHAT_SSH_OPTS;
- предупреждение при публикации версии старше уже опубликованной.
Сервер: HEAD /updates/... (chi не выводит его из GET) — размер и тип артефакта
без скачивания; тест TestUpdatesAnswersHead.
Приёмка на живом канале: 0.1.0 → 0.1.1 на стенде (скачивание, проверка
подписи, установка, перезапуск), /Applications/glchat.app = 0.1.1.
- `--update-now` в таблице аргументов и в разделе «Автообновление»: что делает,
как запускать, что подпись проверяется так же, пример записей в журнале;
- «Локальная проверка «поверх старой версии»»: пошаговый рецепт прогона
0.1.0 → 0.1.1 на локальном сервере инстанса и три грабли — http-эндпоинт
требует временного `dangerousInsecureTransportProtocol`, путь приложения не
должен содержать символических ссылок (`/tmp` → `/private/tmp`), в headless
нужен `--update-now`;
- `.dmg`: точные команды — обычным терминалом (`make desktop-build`, с
оформлением окна) и без графической сессии (`bundle_dmg.sh --sandbox-safe`,
проверено: образ монтируется, `hdiutil verify` — VALID);
- «Что не сделано»: автообновление end-to-end проверено локально, открытым
остаётся публикация реального релиза; добавлено наблюдение, что `open --args`
из песочницы агента аргументы не доставляет (проверено на macOS 27).
Числа в README приведены к сборке, которая поставляется: холодный старт
773–898 мс (процесс 74–78 мс + страница 696–821 мс), RSS 254 МБ
(обёртка 117 + WebKit 137), в трее 256 МБ, физический след 106 МБ.
Прошлый прогон (708–740 мс, 252 МБ) снят с бинарника до правки выхода из трея —
расхождение в пределах разброса, но в документации должны стоять числа
отгружаемой сборки.
README обёртки приведён в соответствие с кодом:
- раздел «Автообновление»: раскладка каталога `UPDATES_DIR`, публикация релиза
(`make desktop-release`, `make desktop-release-upload HOST=…`), зачем нужен
`latest.json`, проверка через curl и лог обёртки; отдельно отмечено, что
владельцу внешнего прокси добавлять ничего не нужно;
- раздел «Уведомления и переход в канал»: реализованное поведение по активации
приложения и честное ограничение (ОС не сообщает, что активация вызвана
кликом по уведомлению);
- раздел «Ресурсы и холодный старт»: замеры 708–740 мс и 252 МБ RSS, как
повторить (`scripts/desktop-perf.py`);
- «Что осталось оператору»: точные команды для `.dmg`
(`make desktop-build` из обычного терминала), подписи Developer ID и
нотаризации (`APPLE_*`, `stapler validate`, `spctl`), сборки и подписи
Windows/Linux, требования к ключу обновлений; отдельно — поведение на Wayland
(нативная тряска окна не работает, остаётся CSS).
- Makefile: `desktop-check`, `desktop-build` (с ключом подписи обновлений,
без ключа — сборка без артефактов обновления) и `desktop-run`; кэши
cargo и npm держатся в .cache/, как у остальных инструментов проекта.
- desktop/README.md: сборка, запуск, аргументы командной строки, настройки,
deep links и открытые пункты Фазы 6.
- bundle.targets = all: бандлы по умолчанию для текущей ОС (macOS: .app/.dmg).
- Логирование подключается в setup и больше не роняет приложение, если
каталог логов недоступен на запись (песочница, домашний каталог только
для чтения).
- Разбор аргументов вынесен в Cli::from_args и покрыт тестами
(--instance, --minimized, --settings, --autostart on|off).
- cargo fmt по модулям обёртки.