Сборка и участие в разработке
Спасибо за интерес к разработке Polynya! В этом файле описано, как развернуть окружение, собрать ядро и модули, прогнать тесты и предложить свои изменения.
1. Инструменты и зависимости
Проект написан на чистом Rust без внешних UI-фреймворков (используются только крейты windows 0.62, serde / serde_json, toml и embed-resource на этапе сборки).
Для сборки понадобятся:
- Windows 11 (x64 или ARM64);
- Rust — версия закреплена в
rust-toolchain.toml,rustupпоставит ее сам. Подходит и GNU toolchain с MinGW-w64, и MSVC (полный Windows SDK для обычной компиляции не требуется); релизы собираются на MSVC. - Inno Setup 6.5+ — только для сборки установщика (
winget install JRSoftware.InnoSetup).
2. Сборка проекта
Весь проект организован как единый Cargo workspace (ядро polynya, крейт протокола proto и 4 встроенных модуля в modules/{agents,notify,picker,start}).
Собрать всё разом в релизном профиле:
cargo build --release --workspace
После сборки в target/release/ появятся:
polynya.exe— ядро острова и CLI-клиент;polynya-agents.exe,polynya-notify.exe,polynya-picker.exe— бинарники встроенных модулей;polynya-start.exe— модуль своего "Пуска". Он лежит в репозитории (modules/start), как иmodules/devtoolsна Node.js, но в релизы оба пока не входят.
Примечание про версионирование: скрипт build.rs автоматически вычисляет версию из git (на теге vX.Y.Z ставит X.Y.Z, между тегами — X.Y.Z+коммитов.хэш, до первого тега — 1.0.0-dev.N+хэш) и вшивает её в VERSIONINFO исполняемого файла.
3. Локальный деплой для отладки
При запуске polynya.exe работает со своей рабочей директорией в %LOCALAPPDATA%\Polynya\. Чтобы протестировать свежую сборку локально:
- Остановите работающий остров командой
polynya quit(резидентные модули завершатся вместе с ним). - Скопируйте собранный
polynya.exeв%LOCALAPPDATA%\Polynya\, а бинарники модулей (вместе с ихmodule.toml) — по папкам%LOCALAPPDATA%\Polynya\modules\<id>\. - Важно: запускайте
polynya.exeчерезexplorer.exeили из обычного (не повышенного!) терминала. Если ваша IDE или терминал запущены от имени администратора, дочерний процесс острова унаследует повышенный токен, что сломает общение с Everything через UIPI.
Логирование при отладке
Общий лог ядра и всех модулей пишется в %LOCALAPPDATA%\Polynya\logs\polynya.log. Чтобы включить подробный вывод (тайминги обхода каталога, решения по баннерам, параметры снимка панели), добавьте в %APPDATA%\Polynya\config.ini строку:
log = debug
4. Тестирование
В проекте 85 автоматических тестов, покрывающих логику очереди и серий уведомлений, парсинг манифестов, сериализацию протокола proto, математику цвета APCA/OKLCH, слияние конфигов ИИ-агентов, парсер калькулятора и CLI.
Запуск всех модульных тестов:
cargo test --release --workspace
Для проверки интеграции с реальным окружением Windows (получение миниатюр медиасессий GSMTC, системная геолокация и т.д.) есть набор изолированных тестов:
cargo test --release --workspace -- --ignored
Перед отправкой Pull Request убедитесь, что все тесты в --workspace проходят без ошибок.
Стиль кода
- Форматирование:
cargo fmt --all(настройки вrustfmt.toml). Комментарииrustfmtне переносит - держите их в пределах ~100 символов вручную. - Комментарии: на английском; объясняют почему, а не пересказывают код. Модуль начинается с
//!, публичные элементы описываются через///. unsafe: у каждого блока - комментарий// SAFETY:с настоящим обоснованием (кто владеет хэндлом, сколько живет буфер). Линтclippy::undocumented_unsafe_blocksвключен на весь workspace:cargo clippy --workspaceне должен выдавать новых предупреждений.- Шапка файла: каждый исходник начинается с двух строк
CopyrightиSPDX-License-Identifier(GPL-3.0-or-later, у крейтаproto-MIT).
5. Вспомогательные скрипты (tools/)
В обычной разработке пересобирать ассеты не нужно (готовые файлы уже лежат в репозитории и вшиваются при компиляции), но если вы правите логотип или манифест пакета уведомлений:
tools/package.ps1— пересобирает неподписанный sparse-пакет.msixдля модуляnotify(сам скачивает легковесныйmakeappxиз NuGet-пакетаMicrosoft.Windows.SDK.BuildTools). Важно: при любом изменении манифеста пакета обязательно поднимите номер версии и в самом манифесте, и в константеVERSIONвнутриsrc/package.rs, чтобы ядро увидело обновление при старте.tools/release.ps1— собирает файлы релиза для одной архитектуры вtarget/dist: установщик (installer/polynya.issчерезinstaller/build.ps1, который скачивает установщик Everything и сверяет его SHA-256), портативный архив и архив модулей к нему. WorkflowReleaseзапускает его для обеих архитектур по тегуvX.Y.Zи создает черновик релиза.tools/logo.pyиtools/ascii.py— генерируют.ico, растровые и векторные варианты логотипа с зерном, а также цветную ASCII-разметкуassets/logo/mark-ascii.jsonиз исходникаassets/logo/mark.svg.
6. Правила локализации и текста (i18n)
Интерфейс поддерживает 4 языка: русский (ru), английский (en), китайский (zh) и японский (ja). Строки ядра живут в src/i18n.rs, строки модулей — в их коде и файлах module.toml. При добавлении новых строк придерживайтесь общих правил проекта:
- Регистр: самостоятельные заголовки и названия параметров пишутся с заглавной буквы; составные статусы вида "объект + состояние" — со строчной (например:
"Caps Lock включен","#ff0000 скопирован"). - Многоточие: у длящихся процессов и плейсхолдеров ввода ставится единый символ
…("Думает…","Введите город…"); в предметных строках действий агентов многоточие не ставится ("Редактирует main.rs"). - Тон и терминология: строго нейтральная форма без местоимения "ты" и без первого лица. Для системных команд используются точные формулировки самой ОС Windows на соответствующем языке ("Завершение работы" / "Shut down" / "关机" / "シャットダウン"). Строки подтверждения (
confirm) формулируются только как короткий вопрос.
Документация ведется на тех же четырех языках: основная версия - английская (README.md, docs/*.md), переводы лежат в README.<язык>.md и docs/<язык>/. Юридические тексты (LICENSE, TRADEMARKS.md) существуют только на английском.
7. Лицензионное соглашение для контрибьюторов
Отправляя Pull Request в этот репозиторий, вы соглашаетесь с тем, что ваш код:
- в составе ядра и встроенных модулей распространяется на условиях LICENSE (GNU GPLv3 + дополнительные условия Раздела 7);
- в составе крейта
protoи документации протокола распространяется на условиях proto/LICENSE (MIT License).