refactor(release): adopt global create_release.py from opencode-config #32

Closed
opened 2026-08-12 18:36:12 +03:00 by slaid098 · 0 comments
Owner

Контекст

Issue #65 в opencode-config создаст глобальную утилиту create_release.py.opencode/scripts/), которая:

  • Читает имя проекта из pyproject.toml
  • Парсит ОС из RUNNER_OS/RUNNER_ARCH раннера → windows-x64
  • Формирует asset filename {name}-{os}-{arch}.zip (например voice-assistant-windows-x64.zip)
  • Формирует body релиза: секция "Системные требования" из env RELEASE_PLATFORM + bullets секции CHANGELOG
  • Скачивается через curl из opencode-config (одна версия, не хранится локально)

Сейчас voice_assistant использует локальный scripts/create_release.py (PR #17, #18) с хардкодом voice-assistant.zip — без ОС в имени, без секции "Системные требования" в body. Пользователь на странице релиза не видит для какой ОС сборка.

PR #31 добавил Windows 10+ в README и pyproject classifier, но это не видно на странице релиза. Стандарт (issue #65): платформа в asset filename + body, детерминированно в CI.

Задача

  1. .github/workflows/release.yml:

    • Шаг "Create Forgejo release" — заменить вызов локального scripts/create_release.py на download глобального через curl:
      - name: Create Forgejo release
        env:
          RELEASE_PLATFORM: "Windows 10+ (64-bit)"
        run: |
          curl -fsSL "$FORGEJO_URL/slaid098/opencode-config/raw/branch/main/.opencode/scripts/create_release.py" \
            -o scripts/create_release.py
          python scripts/create_release.py
      
    • Шаг Compress-Archive: проверить, нужно ли менять имя voice-assistant.zip → утилита сама формирует имя при upload (имя в multipart filename=), поэтому локальный zip можно оставить voice-assistant.zip — утилита переименует при upload. ИЛИ переименовать здесь для консистентности. Решить в implementation.
  2. scripts/create_release.py (локальный): УДАЛИТЬ — заменён глобальным из opencode-config

  3. scripts/release_notes.py (локальный): проверить — используется ли отдельно от create_release.py:

    • Если используется только в tests/test_create_release.py — оставить (тесты экстрактора), но обновить тесты
    • Если не используется нигде кроме create_release.py — удалить (логика в глобальном create_release.py)
    • Решить в implementation после аудита
  4. tests/test_create_release.py:

    • Если release_notes.py остаётся — тесты экстрактора оставить, обновить импорты
    • Если release_notes.py удаляется — удалить тесты (тестируется глобальная утилита в opencode-config issue #65)
    • Решить в implementation
  5. README.md: убрать "Python 3.13" из секции «Требования» / «Requirements» (Python встроен в exe через PyInstaller, юзеру ставить не надо). Оставить только Windows 10+ (64-bit). Секция "Требования" в README — для pip-установки исходников, для exe-юзера источник правды = release body (секция "Системные требования").

  6. CHANGELOG.md: НЕ трогать (платформа не в CHANGELOG — детерминированно в CI через RELEASE_PLATFORM env var)

  7. pyproject.toml: classifier Operating System :: Microsoft :: Windows :: Windows 10 оставить (для pip-установки, не для exe-релиза)

Контракты

Что меняется

  • .github/workflows/release.yml — download глобального create_release.py через curl, env RELEASE_PLATFORM
  • scripts/create_release.py — УДАЛИТЬ (заменён глобальным)
  • scripts/release_notes.py — УДАЛИТЬ или оставить (решить в implementation, зависит от использования в тестах)
  • tests/test_create_release.py — обновить или удалить (зависит от release_notes.py)
  • README.md — убрать Python 3.13 из «Требования»

Что НЕ меняется

  • CHANGELOG.md — НЕ трогать (платформа не в CHANGELOG)
  • pyproject.toml — НЕ трогать (classifier для pip, не для exe)
  • Код в src/ — НЕ трогать
  • scripts/install_autorun.bat / remove_autorun.bat — НЕ трогать (ссылаются на voice-assistant.exe внутри zip, не на имя zip)
  • scripts/gen_phrases.py — НЕ трогать

Зависимости

  • Блокируется issue #65 в opencode-config — глобальный create_release.py должен быть создан и слит первым. Этот issue можно реализовать только после merge PR из issue #65.

Инварианты

  • release.yml остаётся рабочим: download create_release.py через curl → python create_release.py → релиз создаётся
  • Asset filename после миграции: voice-assistant-windows-x64.zip (формируется глобальной утилитой)
  • Body релиза после миграции: секция "Системные требования" (Windows 10+ 64-bit) + bullets секции v0.1.0
  • CI проходит: ruff/mypy/pytest (если удаляем release_notes.py — проверить что не сломали импорты в тестах)
  • Идемпотентность сохраняется (глобальная утилита делает delete+create)

Граничные случаи

  • release_notes.py используется в tests/test_create_release.py (12 тестов экстрактора) — если удаляем release_notes.py, нужно либо удалить тесты, либо переписать их на вызов глобальной утилиты (но глобальная в opencode-config, не в voice_assistant — тестировать её здесь нельзя). Решение: удалить тесты экстрактора из voice_assistant (они будут в opencode-config issue #65).
  • release.yml шаг Compress-Archive создаёт voice-assistant.zip — глобальная утилита при upload берёт это имя или формирует своё? Утилита формирует voice-assistant-windows-x64.zip для multipart filename= параметра, но загружает содержимое локального voice-assistant.zip. Проверить что multipart upload с другим filename= работает (Forgejo API должен принимать имя из multipart, не из пути файла).
  • FORGEJO_URL env var — доступна ли в release.yml? Ранее использовался GITHUB_SERVER_URL (Forgejo runner auto-set). Проверить какой URL использовать для curl-download: $GITHUB_SERVER_URL/slaid098/opencode-config/raw/branch/main/.opencode/scripts/create_release.py или $FORGEJO_URL/.... В bash-окружении Forgejo runner: $GITHUB_SERVER_URL = https://git.slaid098.dev.

Влияние на связанные компоненты

  • .github/workflows/release.yml — основной файл изменений
  • scripts/create_release.py — УДАЛИТЬ
  • scripts/release_notes.py — УДАЛИТЬ или оставить (решить в implementation)
  • tests/test_create_release.py — обновить или удалить
  • README.md — секция «Требования» (убрать Python)
  • CHANGELOG.md — НЕ трогать
  • pyproject.toml — НЕ трогать
  • src/ — НЕ трогать

Вне scope

  • Глобальный create_release.py — issue #65 в opencode-config (блокировка)
  • PATCH существующего релиза v0.1.0 на Forgejo — отдельная операция после merge этого PR (переименовать asset + PATCH body)
  • Миграция video_uniq — отдельный issue в video_uniq (будущее)
  • Multi-platform support — будущее (стандарт описан в SKILL.md issue #65)

Критерии приемки

  • release.yml — шаг "Create Forgejo release" скачивает create_release.py через curl из opencode-config
  • release.yml — env RELEASE_PLATFORM: "Windows 10+ (64-bit)" добавлен
  • scripts/create_release.py (локальный) — УДАЛЁН
  • scripts/release_notes.py — УДАЛЁН или оставлен (с обоснованием в PR body)
  • tests/test_create_release.py — обновлён или удалён (с обоснованием)
  • README.md — «Требования»: убран Python 3.13, оставлено только Windows 10+ (64-bit)
  • CI проходит (ruff/mypy/pytest)
  • Зависимость от issue #65 в opencode-config — указана в PR body (блокировка до merge)
    ``
## Контекст Issue #65 в opencode-config создаст глобальную утилиту `create_release.py` (в `.opencode/scripts/`), которая: - Читает имя проекта из `pyproject.toml` - Парсит ОС из `RUNNER_OS`/`RUNNER_ARCH` раннера → `windows-x64` - Формирует asset filename `{name}-{os}-{arch}.zip` (например `voice-assistant-windows-x64.zip`) - Формирует body релиза: секция "Системные требования" из env `RELEASE_PLATFORM` + bullets секции CHANGELOG - Скачивается через curl из opencode-config (одна версия, не хранится локально) Сейчас voice_assistant использует локальный `scripts/create_release.py` (PR #17, #18) с хардкодом `voice-assistant.zip` — без ОС в имени, без секции "Системные требования" в body. Пользователь на странице релиза не видит для какой ОС сборка. PR #31 добавил Windows 10+ в README и pyproject classifier, но это не видно на странице релиза. Стандарт (issue #65): платформа в asset filename + body, детерминированно в CI. ## Задача 1. **`.github/workflows/release.yml`**: - Шаг "Create Forgejo release" — заменить вызов локального `scripts/create_release.py` на download глобального через curl: ```yaml - name: Create Forgejo release env: RELEASE_PLATFORM: "Windows 10+ (64-bit)" run: | curl -fsSL "$FORGEJO_URL/slaid098/opencode-config/raw/branch/main/.opencode/scripts/create_release.py" \ -o scripts/create_release.py python scripts/create_release.py ``` - Шаг Compress-Archive: проверить, нужно ли менять имя `voice-assistant.zip` → утилита сама формирует имя при upload (имя в multipart `filename=`), поэтому локальный zip можно оставить `voice-assistant.zip` — утилита переименует при upload. ИЛИ переименовать здесь для консистентности. Решить в implementation. 2. **`scripts/create_release.py`** (локальный): УДАЛИТЬ — заменён глобальным из opencode-config 3. **`scripts/release_notes.py`** (локальный): проверить — используется ли отдельно от create_release.py: - Если используется только в `tests/test_create_release.py` — оставить (тесты экстрактора), но обновить тесты - Если не используется нигде кроме create_release.py — удалить (логика в глобальном create_release.py) - Решить в implementation после аудита 4. **`tests/test_create_release.py`**: - Если `release_notes.py` остаётся — тесты экстрактора оставить, обновить импорты - Если `release_notes.py` удаляется — удалить тесты (тестируется глобальная утилита в opencode-config issue #65) - Решить в implementation 5. **`README.md`**: убрать "Python 3.13" из секции «Требования» / «Requirements» (Python встроен в exe через PyInstaller, юзеру ставить не надо). Оставить только `Windows 10+ (64-bit)`. Секция "Требования" в README — для pip-установки исходников, для exe-юзера источник правды = release body (секция "Системные требования"). 6. **`CHANGELOG.md`**: НЕ трогать (платформа не в CHANGELOG — детерминированно в CI через `RELEASE_PLATFORM` env var) 7. **`pyproject.toml`**: classifier `Operating System :: Microsoft :: Windows :: Windows 10` оставить (для pip-установки, не для exe-релиза) ## Контракты ### Что меняется - `.github/workflows/release.yml` — download глобального `create_release.py` через curl, env `RELEASE_PLATFORM` - `scripts/create_release.py` — УДАЛИТЬ (заменён глобальным) - `scripts/release_notes.py` — УДАЛИТЬ или оставить (решить в implementation, зависит от использования в тестах) - `tests/test_create_release.py` — обновить или удалить (зависит от release_notes.py) - `README.md` — убрать Python 3.13 из «Требования» ### Что НЕ меняется - `CHANGELOG.md` — НЕ трогать (платформа не в CHANGELOG) - `pyproject.toml` — НЕ трогать (classifier для pip, не для exe) - Код в `src/` — НЕ трогать - `scripts/install_autorun.bat` / `remove_autorun.bat` — НЕ трогать (ссылаются на `voice-assistant.exe` внутри zip, не на имя zip) - `scripts/gen_phrases.py` — НЕ трогать ### Зависимости - **Блокируется issue #65 в opencode-config** — глобальный `create_release.py` должен быть создан и слит первым. Этот issue можно реализовать только после merge PR из issue #65. ## Инварианты - `release.yml` остаётся рабочим: download `create_release.py` через curl → python `create_release.py` → релиз создаётся - Asset filename после миграции: `voice-assistant-windows-x64.zip` (формируется глобальной утилитой) - Body релиза после миграции: секция "Системные требования" (Windows 10+ 64-bit) + bullets секции v0.1.0 - CI проходит: ruff/mypy/pytest (если удаляем `release_notes.py` — проверить что не сломали импорты в тестах) - Идемпотентность сохраняется (глобальная утилита делает delete+create) ## Граничные случаи - `release_notes.py` используется в `tests/test_create_release.py` (12 тестов экстрактора) — если удаляем `release_notes.py`, нужно либо удалить тесты, либо переписать их на вызов глобальной утилиты (но глобальная в opencode-config, не в voice_assistant — тестировать её здесь нельзя). Решение: удалить тесты экстрактора из voice_assistant (они будут в opencode-config issue #65). - `release.yml` шаг Compress-Archive создаёт `voice-assistant.zip` — глобальная утилита при upload берёт это имя или формирует своё? Утилита формирует `voice-assistant-windows-x64.zip` для multipart `filename=` параметра, но загружает содержимое локального `voice-assistant.zip`. Проверить что multipart upload с другим `filename=` работает (Forgejo API должен принимать имя из multipart, не из пути файла). - `FORGEJO_URL` env var — доступна ли в release.yml? Ранее использовался `GITHUB_SERVER_URL` (Forgejo runner auto-set). Проверить какой URL использовать для curl-download: `$GITHUB_SERVER_URL/slaid098/opencode-config/raw/branch/main/.opencode/scripts/create_release.py` или `$FORGEJO_URL/...`. В bash-окружении Forgejo runner: `$GITHUB_SERVER_URL` = `https://git.slaid098.dev`. ## Влияние на связанные компоненты - `.github/workflows/release.yml` — основной файл изменений - `scripts/create_release.py` — УДАЛИТЬ - `scripts/release_notes.py` — УДАЛИТЬ или оставить (решить в implementation) - `tests/test_create_release.py` — обновить или удалить - `README.md` — секция «Требования» (убрать Python) - `CHANGELOG.md` — НЕ трогать - `pyproject.toml` — НЕ трогать - `src/` — НЕ трогать ## Вне scope - Глобальный `create_release.py` — issue #65 в opencode-config (блокировка) - PATCH существующего релиза v0.1.0 на Forgejo — отдельная операция после merge этого PR (переименовать asset + PATCH body) - Миграция video_uniq — отдельный issue в video_uniq (будущее) - Multi-platform support — будущее (стандарт описан в SKILL.md issue #65) ## Критерии приемки - [ ] `release.yml` — шаг "Create Forgejo release" скачивает `create_release.py` через curl из opencode-config - [ ] `release.yml` — env `RELEASE_PLATFORM: "Windows 10+ (64-bit)"` добавлен - [ ] `scripts/create_release.py` (локальный) — УДАЛЁН - [ ] `scripts/release_notes.py` — УДАЛЁН или оставлен (с обоснованием в PR body) - [ ] `tests/test_create_release.py` — обновлён или удалён (с обоснованием) - [ ] `README.md` — «Требования»: убран Python 3.13, оставлено только `Windows 10+ (64-bit)` - [ ] CI проходит (ruff/mypy/pytest) - [ ] Зависимость от issue #65 в opencode-config — указана в PR body (блокировка до merge) ``
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/voice_assistant#32
No description provided.