chore(deploy): migrate userscript URLs and CI from GitHub to Forgejo #2

Closed
opened 2026-08-08 15:45:53 +03:00 by slaid098 · 0 comments
Owner

Контекст

Зачем: GitHub аккаунт slaid098 удалён — все raw.githubusercontent.com URL мёртвые, git remote на github.com не отвечает, deploy CI падает. Юзеры не могут установить скрипт (install-ссылка 404) и не получают автообновления (@updateURL 404). Последний рабочий деплой на dist = версия 1.0.4; source уже 1.0.5 (PR#47), но деплой не прошёл.

Контекст (подтверждено эмпирически):

  • Forgejo-копия репо жива: https://git.slaid098.dev/slaid098/opencode-voice-dictation (public, Forgejo 16.0.2, has_actions:true). Ветка main на Forgejo = bc673e7 (синхронна локальному HEAD).
  • Raw URL формат Forgejo работает: https://git.slaid098.dev/<owner>/<repo>/raw/branch/<branch>/<path> (проверено: assets/icon.png → HTTP 200, image/png, 1384 байт).
  • Runner жив: ci.yml run #2 → success (act_runner + docker, actions клонируются с data.forgejo.org/actions/... — официального Forgejo-зеркала GitHub Actions).
  • dist ветка на Forgejo ОТСУТСТВУЕТ (HTTP 404 на /branches/dist). Причина: deploy CI run #3 → failure. Из логов: peaceiris/actions-gh-pages@v4 не найден в Forgejo action-зеркале (data.forgejo.org/peaceiris/actions-gh-pages → 404 "repository not found").
  • Версия на мёртвом dist (GitHub): @version 1.0.4. Source: 1.0.5 в vite.config.ts:11 и package.json:3 (синхронно, PR#47).

Задача

1. vite.config.ts — заменить 4 мёртвых GitHub URL на Forgejo (строки 10, 19, 20-21, 22-23)

  • namespace (строка 10): https://github.com/slaid098/opencode-voice-dictation → https://git.slaid098.dev/slaid098/opencode-voice-dictation
  • icon (строка 19): https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/main/assets/icon.png → https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/main/assets/icon.png
  • updateURL (строки 20-21): https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.meta.js → https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.meta.js
  • downloadURL (строки 22-23): https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js → https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.user.js
  • НЕ трогать connect: ["*"] (строка 17) — наменено для кастомных STT-прокси (AGENTS.md ## @connect).

2. README.md — 2 install-ссылки → Forgejo raw

  • Строка 43 (EN): https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js → https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.user.js
  • Строка 107 (RU): та же замена.

3. Version bump 1.0.5 → 1.0.6 (СИНХРОННО в двух файлах — AGENTS.md ## Version bump)

  • vite.config.ts:11: version: "1.0.5" → version: "1.0.6"
  • package.json:3: "version": "1.0.5" → "version": "1.0.6"
  • Обоснование: юзеры на мёртвом 1.0.4 получат автоапдейт через новый @updateURL на Forgejo. Без bump'а Tampermonkey/Violentmonkey не подтянут смену домена.

4. .github/workflows/deploy.yml — заменить peaceiris/actions-gh-pages@v4 на plain git push

Текущий шаг (строки 38-44) использует peaceiris/actions-gh-pages@v4 с secrets.GITHUB_TOKEN — мёртв в Forgejo (404 в action-зеркале). Заменить на plain git push:

  • actions/checkout@v7 с fetch-depth: 0 (нужен для push в другую ветку)
  • actions/setup-node@v6 (уже есть) — node-version: "22", cache: "npm"
  • npm ci → lint → typecheck → knip → test → build (без изменений, строки 21-36 остаются)
  • НОВЫЙ deploy step (заменить строки 38-44): скопировать ./dist в orphan-коммит и force-push в origin/dist:
    - name: Deploy to dist branch
      run: |
        cd dist
        git init -b dist
        git config user.name "forgejo-actions"
        git config user.email "actions@noreply.git.slaid098.dev"
        git add -A
        git commit -m "deploy: ${GITHUB_SHA::7}"
        git remote add origin "https://${GITHUB_TOKEN}@git.slaid098.dev/slaid098/opencode-voice-dictation.git"
        git push --force origin dist
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    
  • .nojekyll (на старом GitHub dist) НЕ нужен — Forgejo не использует Jekyll. Не добавлять.
  • permissions: contents: write (строки 7-8) — оставить, нужно для push.

5. Удалить .github/dependabot.yml

Dependabot не работает на Forgejo (пакет github-actions инертен). Файл .github/dependabot.yml (12 строк) удалить целиком.

6. Git remote — переключить origin на Forgejo

git remote set-url origin https://git.slaid098.dev/slaid098/opencode-voice-dictation.git

(выполняется в ветке PR; проверка: git remote -v показывает Forgejo URL для fetch+push)

7. AGENTS.md — обновить строку 20 (описание dist деплоя)

Текущая строка 20 упоминает peaceiris/actions-gh-pages@v4 и "raw files on the dist branch". Обновить: убрать peaceiris, указать что деплой через plain git push в dist ветку, raw URL на Forgejo (git.slaid098.dev).

Контракты

  • Raw URL формат Forgejo: https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/<branch>/<path> — проверено эмпирически (HEAD/GET → 200).
  • @updateURL и @downloadURL указывают на dist ветку (raw). @icon — на main ветку (raw).
  • Version в vite.config.ts и package.json обязаны совпадать (рассинхрон = userscript-менеджеры не видят автообновление, AGENTS.md ## Version bump).
  • dist ветка создаётся первым прогоном нового deploy CI (orphan branch, force-push).
  • Deploy trigger: push: branches: [main] (без изменений).
  • GITHUB_TOKEN в Forgejo Actions = Gitea-совместимый auto-provided secret (алиас для FORGEJO_TOKEN в runner-контексте).

Инварианты

  • @connect * НЕ сужать обратно к api.groq.com (AGENTS.md ## @connect — ломает кастомные STT-прокси).
  • COMPOSER_SELECTORS порядок НЕ менять (ADR 0001–0004, AGENTS.md ## Composer selectors).
  • assets/icon.png НЕ удалять, путь НЕ менять (AGENTS.md ## @icon).
  • whisperPrompt default "" НЕ трогать (ADR-0007, PR#47).
  • Version bump СИНХРОННО в vite.config.ts + package.json (AGENTS.md ## Version bump).
  • ADR append-only: НЕ редактировать docs/decisions/0005-*.md — если нужен ADR о миграции, создать новый 0008-*.md.

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

  • dist ветка не существует на Forgejo → первый deploy создаёт orphan branch через git init -b dist + git push --force (корректно).
  • Runner не может push в dist (permissions) → permissions: contents: write + GITHUB_TOKEN (Forgejo auto-provided). Если падает — CI-фаза пайплайна покажет ошибку, исправим в итерации.
  • git push --force перезаписывает чужие коммиты в dist — намеренно (orphan, clean rebuild каждый деплой, keep_files: false семантика сохранена).
  • Старый GitHub dist (с 1.0.4) остаётся мёртвым на raw.githubusercontent.com — юзеры оттуда не обновятся (404), но новый @updateURL на Forgejo сработает только при ручной переустановке скрипта (домен @updateURL сменился → userscript-менеджер не опрашивает старый URL). Bump 1.0.5→1.0.6 гарантирует что при переустановке юзер получит актуальную версию.

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

  • src/** — НЕ трогать (нет URL-ссылок в исходниках, подтверждено grep).
  • tests/** — НЕ трогать (нет URL-ссылок).
  • package.json — только version (строка 3). repository/homepage/bugs полей нет — не добавлять.
  • biome.json, knip.json, tsconfig.json, vitest.config.ts — без URL, не трогать.
  • docs/decisions/**, docs/handoff/** — исторические ADR/handoff, append-only. НЕ редактировать (новый ADR-0008 — опционально, вне scope этого PR).
  • AGENTS.md:20 — обновить описание деплоя (пункт 7).
  • Forgejo Actions runner: act_runner + docker, ubuntu-latest label маппится. actions/checkout@v7 и actions/setup-node@v6 клонируются с data.forgejo.org/actions/... (official Forgejo mirror).

Вне scope

  • ❌ ADR-0008 о миграции на Forgejo (отдельный PR, append-only)
  • ❌ package.json repository/homepage/bugs поля (не критично, не добавляем)
  • ❌ Очистка мёртвых GitHub-ссылок в docs/handoff/** и docs/decisions/** (исторические, append-only)
  • ❌ Renovate config (взамен Dependabot) — отдельная задача
  • ❌ Миграция ci.yml (уже работает на Forgejo, run #2 success)
  • ❌ Настройка branch protection на Forgejo (отдельная задача, через curl к Forgejo API)

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

  • vite.config.ts — 4 URL (namespace, icon, updateURL, downloadURL) указывают на git.slaid098.dev, не на github.com/raw.githubusercontent.com
  • README.md — 2 install-ссылки (строки 43 EN + 107 RU) указывают на Forgejo raw
  • vite.config.ts:11 + package.json:3 = "1.0.6" (синхронно)
  • .github/workflows/deploy.yml — нет peaceiris/actions-gh-pages, есть plain git push --force origin dist
  • .github/dependabot.yml удалён
  • git remote -v → origin = https://git.slaid098.dev/slaid098/opencode-voice-dictation.git (fetch+push)
  • AGENTS.md:20 — обновлено (нет peaceiris, указан Forgejo)
  • npm run lint → pass (biome)
  • npm run typecheck → pass (tsc --noEmit)
  • npm run test → pass (vitest)
  • npm run build → dist/opencode-voice-dictation.user.js + .meta.js с @version 1.0.6 и Forgejo URL в header
  • После merge + CI: dist ветка существует на Forgejo, https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.user.js → HTTP 200
  • @connect * остался (не сужен)
## Контекст Зачем: GitHub аккаунт `slaid098` удалён — все `raw.githubusercontent.com` URL мёртвые, git remote на `github.com` не отвечает, deploy CI падает. Юзеры не могут установить скрипт (install-ссылка 404) и не получают автообновления (`@updateURL` 404). Последний рабочий деплой на dist = версия 1.0.4; source уже 1.0.5 (PR#47), но деплой не прошёл. Контекст (подтверждено эмпирически): - Forgejo-копия репо жива: `https://git.slaid098.dev/slaid098/opencode-voice-dictation` (public, Forgejo 16.0.2, `has_actions:true`). Ветка `main` на Forgejo = `bc673e7` (синхронна локальному HEAD). - Raw URL формат Forgejo работает: `https://git.slaid098.dev/<owner>/<repo>/raw/branch/<branch>/<path>` (проверено: `assets/icon.png` → HTTP 200, `image/png`, 1384 байт). - Runner жив: `ci.yml` run #2 → `success` (act_runner + docker, actions клонируются с `data.forgejo.org/actions/...` — официального Forgejo-зеркала GitHub Actions). - `dist` ветка на Forgejo ОТСУТСТВУЕТ (HTTP 404 на `/branches/dist`). Причина: deploy CI run #3 → `failure`. Из логов: `peaceiris/actions-gh-pages@v4` не найден в Forgejo action-зеркале (`data.forgejo.org/peaceiris/actions-gh-pages` → 404 "repository not found"). - Версия на мёртвом `dist` (GitHub): `@version 1.0.4`. Source: `1.0.5` в `vite.config.ts:11` и `package.json:3` (синхронно, PR#47). ## Задача ### 1. `vite.config.ts` — заменить 4 мёртвых GitHub URL на Forgejo (строки 10, 19, 20-21, 22-23) - `namespace` (строка 10): `https://github.com/slaid098/opencode-voice-dictation` → `https://git.slaid098.dev/slaid098/opencode-voice-dictation` - `icon` (строка 19): `https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/main/assets/icon.png` → `https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/main/assets/icon.png` - `updateURL` (строки 20-21): `https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.meta.js` → `https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.meta.js` - `downloadURL` (строки 22-23): `https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js` → `https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.user.js` - НЕ трогать `connect: ["*"]` (строка 17) — наменено для кастомных STT-прокси (AGENTS.md `## @connect`). ### 2. `README.md` — 2 install-ссылки → Forgejo raw - Строка 43 (EN): `https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js` → `https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.user.js` - Строка 107 (RU): та же замена. ### 3. Version bump 1.0.5 → 1.0.6 (СИНХРОННО в двух файлах — AGENTS.md `## Version bump`) - `vite.config.ts:11`: `version: "1.0.5"` → `version: "1.0.6"` - `package.json:3`: `"version": "1.0.5"` → `"version": "1.0.6"` - Обоснование: юзеры на мёртвом 1.0.4 получат автоапдейт через новый `@updateURL` на Forgejo. Без bump'а Tampermonkey/Violentmonkey не подтянут смену домена. ### 4. `.github/workflows/deploy.yml` — заменить `peaceiris/actions-gh-pages@v4` на plain `git push` Текущий шаг (строки 38-44) использует `peaceiris/actions-gh-pages@v4` с `secrets.GITHUB_TOKEN` — мёртв в Forgejo (404 в action-зеркале). Заменить на plain git push: - `actions/checkout@v7` с `fetch-depth: 0` (нужен для push в другую ветку) - `actions/setup-node@v6` (уже есть) — `node-version: "22"`, `cache: "npm"` - `npm ci` → lint → typecheck → knip → test → build (без изменений, строки 21-36 остаются) - НОВЫЙ deploy step (заменить строки 38-44): скопировать `./dist` в orphan-коммит и force-push в `origin/dist`: ```yaml - name: Deploy to dist branch run: | cd dist git init -b dist git config user.name "forgejo-actions" git config user.email "actions@noreply.git.slaid098.dev" git add -A git commit -m "deploy: ${GITHUB_SHA::7}" git remote add origin "https://${GITHUB_TOKEN}@git.slaid098.dev/slaid098/opencode-voice-dictation.git" git push --force origin dist env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` - `.nojekyll` (на старом GitHub dist) НЕ нужен — Forgejo не использует Jekyll. Не добавлять. - `permissions: contents: write` (строки 7-8) — оставить, нужно для push. ### 5. Удалить `.github/dependabot.yml` Dependabot не работает на Forgejo (пакет `github-actions` инертен). Файл `.github/dependabot.yml` (12 строк) удалить целиком. ### 6. Git remote — переключить origin на Forgejo ```bash git remote set-url origin https://git.slaid098.dev/slaid098/opencode-voice-dictation.git ``` (выполняется в ветке PR; проверка: `git remote -v` показывает Forgejo URL для fetch+push) ### 7. `AGENTS.md` — обновить строку 20 (описание dist деплоя) Текущая строка 20 упоминает `peaceiris/actions-gh-pages@v4` и "raw files on the `dist` branch". Обновить: убрать `peaceiris`, указать что деплой через plain `git push` в `dist` ветку, raw URL на Forgejo (`git.slaid098.dev`). ## Контракты - Raw URL формат Forgejo: `https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/<branch>/<path>` — проверено эмпирически (HEAD/GET → 200). - `@updateURL` и `@downloadURL` указывают на `dist` ветку (raw). `@icon` — на `main` ветку (raw). - Version в `vite.config.ts` и `package.json` обязаны совпадать (рассинхрон = userscript-менеджеры не видят автообновление, AGENTS.md `## Version bump`). - `dist` ветка создаётся первым прогоном нового deploy CI (orphan branch, force-push). - Deploy trigger: `push: branches: [main]` (без изменений). - `GITHUB_TOKEN` в Forgejo Actions = Gitea-совместимый auto-provided secret (алиас для `FORGEJO_TOKEN` в runner-контексте). ## Инварианты - `@connect *` НЕ сужать обратно к `api.groq.com` (AGENTS.md `## @connect` — ломает кастомные STT-прокси). - `COMPOSER_SELECTORS` порядок НЕ менять (ADR 0001–0004, AGENTS.md `## Composer selectors`). - `assets/icon.png` НЕ удалять, путь НЕ менять (AGENTS.md `## @icon`). - `whisperPrompt` default `""` НЕ трогать (ADR-0007, PR#47). - Version bump СИНХРОННО в `vite.config.ts` + `package.json` (AGENTS.md `## Version bump`). - ADR append-only: НЕ редактировать `docs/decisions/0005-*.md` — если нужен ADR о миграции, создать новый `0008-*.md`. ## Граничные случаи - `dist` ветка не существует на Forgejo → первый deploy создаёт orphan branch через `git init -b dist` + `git push --force` (корректно). - Runner не может push в `dist` (permissions) → `permissions: contents: write` + `GITHUB_TOKEN` (Forgejo auto-provided). Если падает — CI-фаза пайплайна покажет ошибку, исправим в итерации. - `git push --force` перезаписывает чужие коммиты в `dist` — намеренно (orphan, clean rebuild каждый деплой, `keep_files: false` семантика сохранена). - Старый GitHub `dist` (с 1.0.4) остаётся мёртвым на `raw.githubusercontent.com` — юзеры оттуда не обновятся (404), но новый `@updateURL` на Forgejo сработает только при ручной переустановке скрипта (домен `@updateURL` сменился → userscript-менеджер не опрашивает старый URL). Bump 1.0.5→1.0.6 гарантирует что при переустановке юзер получит актуальную версию. ## Влияние на связанные компоненты - `src/**` — НЕ трогать (нет URL-ссылок в исходниках, подтверждено grep). - `tests/**` — НЕ трогать (нет URL-ссылок). - `package.json` — только `version` (строка 3). `repository`/`homepage`/`bugs` полей нет — не добавлять. - `biome.json`, `knip.json`, `tsconfig.json`, `vitest.config.ts` — без URL, не трогать. - `docs/decisions/**`, `docs/handoff/**` — исторические ADR/handoff, append-only. НЕ редактировать (новый ADR-0008 — опционально, вне scope этого PR). - `AGENTS.md:20` — обновить описание деплоя (пункт 7). - Forgejo Actions runner: `act_runner` + docker, `ubuntu-latest` label маппится. `actions/checkout@v7` и `actions/setup-node@v6` клонируются с `data.forgejo.org/actions/...` (official Forgejo mirror). ## Вне scope - ❌ ADR-0008 о миграции на Forgejo (отдельный PR, append-only) - ❌ `package.json` repository/homepage/bugs поля (не критично, не добавляем) - ❌ Очистка мёртвых GitHub-ссылок в `docs/handoff/**` и `docs/decisions/**` (исторические, append-only) - ❌ Renovate config (взамен Dependabot) — отдельная задача - ❌ Миграция `ci.yml` (уже работает на Forgejo, run #2 success) - ❌ Настройка branch protection на Forgejo (отдельная задача, через `curl` к Forgejo API) ## Критерии приемки - [ ] `vite.config.ts` — 4 URL (namespace, icon, updateURL, downloadURL) указывают на `git.slaid098.dev`, не на `github.com/raw.githubusercontent.com` - [ ] `README.md` — 2 install-ссылки (строки 43 EN + 107 RU) указывают на Forgejo raw - [ ] `vite.config.ts:11` + `package.json:3` = `"1.0.6"` (синхронно) - [ ] `.github/workflows/deploy.yml` — нет `peaceiris/actions-gh-pages`, есть plain `git push --force origin dist` - [ ] `.github/dependabot.yml` удалён - [ ] `git remote -v` → `origin` = `https://git.slaid098.dev/slaid098/opencode-voice-dictation.git` (fetch+push) - [ ] `AGENTS.md:20` — обновлено (нет `peaceiris`, указан Forgejo) - [ ] `npm run lint` → pass (biome) - [ ] `npm run typecheck` → pass (tsc --noEmit) - [ ] `npm run test` → pass (vitest) - [ ] `npm run build` → `dist/opencode-voice-dictation.user.js` + `.meta.js` с `@version 1.0.6` и Forgejo URL в header - [ ] После merge + CI: `dist` ветка существует на Forgejo, `https://git.slaid098.dev/slaid098/opencode-voice-dictation/raw/branch/dist/opencode-voice-dictation.user.js` → HTTP 200 - [ ] `@connect *` остался (не сужен)
Sign in to join this conversation.
No labels
bug
chore
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/opencode-voice-dictation#2
No description provided.