feat: create autonomous Nivora package repository

Maintain a validated cross-distribution package catalog.
Automate upstream updates, isolated builds, diagnostics, and direct publication.
Build the official GitHub Desktop sources for Linux with working OAuth.
This commit is contained in:
Александр
2026-07-25 00:49:32 +10:00
commit f405ae2bcf
168 changed files with 8483 additions and 0 deletions
+106
View File
@@ -0,0 +1,106 @@
# Сопровождение Nivora
## Инварианты
- В репозитории ровно 19 каталогов с `Staplerfile`.
- Каталог совпадает с `name` и командой в README.
- Upstream-версия не меняется из-за патча рецепта; для этого повышается `release`.
- Desktop-id, AppStream component-id, units и пути данных не меняются без отдельной миграции.
- `provides` и `conflicts` остаются пустыми, а `replaces` содержит только собственное
базовое имя пакета.
Stapler сам добавляет текущее `name` в generated `Provides` и `Conflicts`. Рецепты не
добавляют переходные package ID и не зависят от других Stapler-каталогов.
## Названия
| Package ID | Основание |
|:--|:--|
| `clash-verge-rev` | Upstream-репозиторий и release title: Clash Verge Rev |
| `claude-desktop` | Upstream DEB: `Package: claude-desktop`; desktop-id `com.anthropic.Claude` сохранён |
| `codex` | Отображаемое имя `Codex`; команда и desktop-id `codex-app` сохранены |
| `github-desktop` | Официальный upstream `desktop/desktop`; Linux-сборка без стороннего форка |
| `nivora-stplr` | Собственный helper Nivora |
## Локальные проверки
```bash
tools/run_checks.sh
tools/package_updates.sh check-all
tools/verify_artifacts.sh --all
tools/test_package_lifecycle.sh
```
`run_checks.sh` выполняет `bash -n`, ShellCheck, Python compile, unit-тесты, validator и чтение
всех `Staplerfile` через `stplr-spec`.
`verify_artifacts.sh` сопоставляет готовые RPM с `files()`, проверяет владельцев путей,
права, desktop-файлы, systemd units, иконки, лицензии и метаданные совместимости.
`test_package_lifecycle.sh` собирает настоящие DEB текущей версии и использует настоящие
RPM из clean-build. Минимальные fixtures изображают предыдущую версию того же пакета Nivora.
В одноразовых Ubuntu и ALT-контейнерах через APT проверяются:
1. обновление с предыдущей версии Nivora на текущую;
2. `Provides`, `Replaces` и `Conflicts`;
3. наличие команды, desktop-файла или systemd unit;
4. сохранение пользовательского состояния после обновления и удаления.
Полный жизненный цикл проверяется для восьми критичных пакетов. Остальные пакеты
покрываются validator, clean-build и проверкой payload.
Локально DEB собираются в привилегированном контейнере. На GitHub-hosted runner используется
`NIVORA_DEB_BUILD_MODE=host`: закреплённый stplr запускается непосредственно на одноразовом
Ubuntu runner, потому что вложенный sandbox stplr запрещён внутри Docker. Ubuntu 24.04 может
дополнительно блокировать непривилегированные user namespaces через AppArmor: тест временно
снимает только это ограничение, проверяет полный набор namespaces перед сборкой и
восстанавливает исходное значение при завершении. Для совместимости с моделью привилегий
Stapler временный builder включается в группу `wheel`, отсутствующую в Ubuntu по умолчанию.
Транзакционные сценарии в обоих режимах остаются изолированными в контейнерах.
## Обновление пакета
```bash
stplr-spec update-package package
stplr-spec verify-checksums --path package/Staplerfile
tools/run_checks.sh
tools/clean_build.sh package
```
Нестандартная логика обнаружения версий находится в `tools/package_updates.sh`, а каждый
`.stapler/update-check` вызывает его для своего package ID.
Плановый workflow обновляет пакеты автономно и отправляет проверенные изменения
прямо в `main`. Он запускается ежедневно в 03:00 по Владивостоку
(`17:00 UTC`). Каждый пакет обрабатывается в отдельном временном worktree, поэтому
несовместимое обновление одного upstream не блокирует остальные. При сбое workflow
сохраняет на 30 дней диагностический artifact с полным логом, фазой сбоя, diff и
получившимся `Staplerfile`; успешно собранные пакеты всё равно публикуются. Для
каждого несовместимого пакета создаётся один постоянный issue: повторные сбои
обновляют его, а успешное восстановление автоматически закрывает. Ожидаемый сбой
отдельного пакета помечается предупреждением и не делает весь этап обновления
неуспешным.
## Clean-build
```bash
tools/clean_build.sh package
tools/clean_build.sh --all
tools/verify_artifacts.sh --all
```
Скрипт всегда выполняет сборку в собственном одноразовом контейнере ALT и не
подключает сторонние Stapler-каталоги.
## Проверка жизненного цикла
Для каждого критичного пакета нужно:
1. Собрать fixture предыдущей версии и текущий RPM/DEB.
2. Создать тестовый файл в каталоге данных.
3. Обновить пакет до текущей версии.
4. Проверить `Provides/Replaces/Conflicts`, payload и тестовый файл.
5. Проверить удаление пакета без удаления пользовательского состояния.
Автоматизированная проверка выполняется командой `tools/test_package_lifecycle.sh` в
одноразовых контейнерах, а не на рабочей системе сопровождающего.
+52
View File
@@ -0,0 +1,52 @@
# Claude Desktop
Пакет `claude-desktop` переупаковывает DEB из APT-источника Anthropic и сохраняет upstream
desktop-id `com.anthropic.Claude`.
```bash
sudo stplr install nivora/claude-desktop
```
## Два независимых приложения
- `claude-desktop` запускает основное приложение Claude.
- `claude-alt` и `claude-code-alt` запускают отдельное приложение ClaudeAlt.
- `claude-desktop-account2` — дополнительное имя запуска ClaudeAlt.
- Команда `claude` не создаётся, чтобы не конфликтовать с Claude Code CLI.
ClaudeAlt имеет отдельные executable/resources tree, Electron `productName`, Wayland `app_id`,
X11 `WM_CLASS`, desktop-файл, Chromium-профиль, Cowork VM socket, оконную и
tray-иконки. В системном лотке используется штатный глиф Claude: оранжевый у
основного приложения и бирюзовый у ClaudeAlt. Большие app-иконки окон при этом
остаются отдельными. Поэтому окружение рабочего стола группирует Claude и ClaudeAlt
как разные приложения, а `requestSingleInstanceLock()` и Cowork runtime каждого
приложения работают независимо.
Новая установка ClaudeAlt хранит cookies, OAuth, IndexedDB и Chromium locks в
`${XDG_CONFIG_HOME:-~/.config}/ClaudeAlt`. Если уже существует прежний каталог
`${XDG_CONFIG_HOME:-~/.config}/Claude-Account-2`, launcher использует его, чтобы после обновления
не потерять авторизацию второго аккаунта. Глобальные данные Claude Code в `~/.claude` могут
по-прежнему использоваться обоими приложениями.
## Настройка
| Переменная | Назначение |
|:--|:--|
| `CLAUDE_ALT_DATA_DIR` | Явно задать каталог профиля ClaudeAlt |
| `CLAUDE_DESKTOP_ACCOUNT2_DIR` | Совместимое имя переменной прежнего второго профиля |
| `CLAUDE_ALT_EXECUTABLE` | Переопределить executable ClaudeAlt для диагностики |
Основной Claude продолжает использовать upstream desktop-id `com.anthropic.Claude`, а ClaudeAlt
использует `com.anthropic.ClaudeAlt`.
## Сетевая изоляция
Claude и ClaudeAlt имеют разные Chromium-профили, single-instance sockets,
cookies, browser storage, Crashpad-каталоги и Cowork VM sockets. Временные OAuth
callback-серверы по умолчанию получают свободный loopback-порт от ОС.
Приложения не являются сетевыми песочницами: оба выходят в Интернет с
одного хоста и публичного IP-адреса. Общий `claude://` URL handler намеренно
остаётся за основным Claude. Если в обоих приложениях вручную задать
один и тот же фиксированный OAuth callback-порт и запустить авторизацию
одновременно, второе приложение получит `EADDRINUSE`.
+57
View File
@@ -0,0 +1,57 @@
# Codex
Пакет устанавливает неофициальную Linux-перепаковку Codex Desktop и
предусмотренную Linux-реализацию Computer Use из проектов
[`codex-desktop-linux`](https://github.com/ilysenko/codex-desktop-linux) и
[`computer-use-linux`](https://github.com/agent-sh/computer-use-linux).
В пакет входят:
- приложение `codex-app`;
- bundled plugin `computer-use@openai-bundled`;
- нативный backend `codex-computer-use-linux`, собранный из исходников для
версии glibc текущего дистрибутива;
- интеграция с AT-SPI, XDG Desktop Portal и доступными средствами ввода Linux.
Патчи не включают серверную возможность в обход Codex. Они добавляют Linux в
список поддерживаемых локальных платформ и сохраняют проверку feature gate
`computer_use`, которую возвращает сервис.
## Первичная настройка
После установки полностью перезапустите Codex. Состояние backend проверяется
без изменения системы:
```bash
codex-computer-use-linux doctor
```
Рекомендуемую настройку доступности и ввода выполняет upstream-мастер:
```bash
codex-computer-use-linux setup
```
Для получения списка окон в GNOME может понадобиться отдельная настройка
расширения:
```bash
codex-computer-use-linux setup-window-targeting
```
Команда `setup` идемпотентно включает AT-SPI в текущем пользовательском сеансе;
она изменяет пользовательскую настройку доступности без отдельного запроса.
Разрешения на захват экрана и управление вводом выдаются пользователем через
системные диалоги портала.
## Диагностика
```bash
codex-computer-use-linux doctor
codex-computer-use-linux apps
codex-computer-use-linux windows
```
Если интерфейс всё ещё показывает недоступность, сначала убедитесь, что
установлен пакет Nivora с `release=2` или новее, затем закройте все процессы
Codex и запустите приложение заново.
+27
View File
@@ -0,0 +1,27 @@
# GitHub Desktop
Пакет собирает оригинальный GitHub Desktop для Linux непосредственно из
официального репозитория [`desktop/desktop`](https://github.com/desktop/desktop).
Готовые артефакты, патчи и исходники `shiftkey/desktop` либо других форков не
используются.
GitHub официально выпускает установщики только для macOS и Windows. Linux-сборка
в Nivora поэтому является неофициальным пакетом, но код приложения и закреплённые
submodule-исходники берутся только из официальных репозиториев GitHub.
Тяжёлая сборка выполняется workflow `Сборка GitHub Desktop для Linux` на
нативных GitHub-hosted runner’ах `x64` и `arm64`. Workflow публикует
детерминированно упакованные tar.gz и `SHA256SUMS` в релизе Nivora, а рецепт
скачивает эти готовые артефакты с закреплёнными контрольными суммами.
Установка:
```bash
sudo stplr install nivora/github-desktop
```
Команда запуска:
```bash
github-desktop
```
+43
View File
@@ -0,0 +1,43 @@
# Nivora Stapler Helper
`nivora-stplr` добавляет короткие команды для Stapler.
```bash
sudo stplr install nivora/nivora-stplr
```
## Команды
| Alias | Вызов Stapler |
|:--|:--|
| `sli` | `sudo stplr install` |
| `slr` | `sudo stplr remove` |
| `slu` | `sudo stplr up` |
| `slf` | `sudo stplr fix` |
| `slref` | `sudo stplr refresh` |
| `sls` | `stplr search` |
| `slii` | `stplr info` |
| `sll` | `stplr list` |
| `sl` | Диспетчер тех же команд |
Примеры:
```bash
sli --repo nivora parsec
slii nivora/codex
slu --clean
```
Короткое имя пакета не привязывается к Nivora по умолчанию. Префикс задаётся явно:
```bash
export NIVORA_STPLR_REPO=nivora
```
| Переменная | Назначение |
|:--|:--|
| `NIVORA_STPLR_REPO` | Префикс для коротких package names |
| `NIVORA_STPLR_SUDO` | Команда повышения привилегий, по умолчанию `sudo` |
| `NIVORA_STPLR_QUIET=1` | Не печатать команду перед запуском |
Helper не передаёт произвольные shell-строки через `sudo`.
+16
View File
@@ -0,0 +1,16 @@
# OpenCode
Пакет устанавливает официальный Linux desktop-артефакт OpenCode без изменений его кода и ресурсов.
```bash
sudo stplr install nivora/opencode
```
## Запуск
- из меню приложений — `OpenCode`;
- из терминала — `opencode-desktop`.
Команда `opencode-desktop` является прямой ссылкой на upstream-бинарник
`/opt/OpenCode/ai.opencode.desktop`: wrapper, лимиты памяти, GPU-fallback и другие поведенческие
патчи не применяются.
+21
View File
@@ -0,0 +1,21 @@
# Ventoy
Пакет устанавливает официальный нативный Linux GUI Ventoy и показывает его в
меню приложений под коротким названием **Ventoy**.
## Запуск
```bash
ventoy
```
При запуске Ventoy запрашивает административные права через `pkexec`, потому
что программа размечает накопители и записывает загрузочные структуры напрямую.
## Важно
- Перед установкой Ventoy внимательно проверьте выбранное устройство.
- Первичная установка стирает данные на выбранном накопителе.
- Обновление уже подготовленного Ventoy-накопителя сохраняет раздел с образами,
однако резервная копия важных данных всё равно рекомендуется.
- Пакет использует официальный архив upstream и поддерживает `amd64` и `arm64`.
+34
View File
@@ -0,0 +1,34 @@
# Модель доверия
Nivora — независимый community-репозиторий. Он не контролируется командой Stapler или
разработчиками упакованных приложений.
## Что можно проверить
- `Staplerfile` описывает sources, зависимости, сборку и состав payload.
- Локальные wrappers и hooks хранятся рядом с рецептом.
- Каждому source соответствует SHA-256.
- Валидатор запрещает HTTP, `SKIP`, отсутствующие локальные sources и незакреплённые Git URL.
## Что не гарантирует SHA-256
Контрольная сумма обнаруживает замену файла после фиксации рецепта. Она не доказывает:
- отсутствие уязвимостей в upstream-приложении;
- корректность сетевого сервиса;
- соответствие файла исходному коду без воспроизводимой upstream-сборки.
## Проприетарные пакеты
Для `Custom` и `Proprietary` Nivora переупаковывает опубликованный артефакт, но не изменяет
условия его владельца. Учётные записи, подписки, API и сетевые сервисы в пакет не входят.
## Данные пользователя
Пакетные scripts не должны удалять каталоги в `$HOME`, выполнять logout или сбрасывать учётную
запись при обычном удалении. Отдельные команды очистки Tailscale и NetBird требуют `--yes`.
## Границы CI
CI проверяет структуру, shell/Python, metadata, checksums и выбранные сборки. Разница в версиях
библиотек, драйверах, desktop-окружениях и внешних API остаётся ограничением.