refactor(templates): pyproject URLs to Forgejo, remove dependabot, sync project-template skill #8

Closed
opened 2026-08-07 09:45:55 +03:00 by slaid098 · 1 comment
Owner

Контекст

PR #1-#3 адаптировали основной репо opencode-config под Forgejo. Cookiecutter templates (backend/, cli/, fullstack/) всё ещё содержат GitHub-эру: hardcoded github.com URLs в pyproject.toml, .github/dependabot.yml (GitHub-only фича). .github/workflows/ci.yml в шаблонах оставляем (Forgejo понимает .github/workflows/, рабочий CI — не трогаем). project-template/SKILL.md Template GITHUB переписан на Template FORGEJO в PR #2 — этот PR синхронизирует реальные template-файлы с skill-инструкциями.

Задача

  1. 3 pyproject.toml в templates — [project.urls] github.com → git.slaid098.dev:

    • .opencode/templates/cli/{{cookiecutter.project_name}}/pyproject.toml L39-41:
      • Homepage = "https://github.com/slaid098/{{ cookiecutter.project_name }}" → https://git.slaid098.dev/slaid098/{{ cookiecutter.project_name }}
      • Repository = ... → то же
      • Issues = "https://github.com/slaid098/{{ cookiecutter.project_name }}/issues" → https://git.slaid098.dev/slaid098/{{ cookiecutter.project_name }}/issues
    • .opencode/templates/backend/{{cookiecutter.project_name}}/pyproject.toml L47-49 — то же
    • .opencode/templates/fullstack/{{cookiecutter.project_name}}/backend/pyproject.toml L47-49 — то же
  2. 5 .github/dependabot.yml — удалить:

    • .opencode/templates/cli/{{cookiecutter.project_name}}/.github/dependabot.yml
    • .opencode/templates/backend/{{cookiecutter.project_name}}/.github/dependabot.yml
    • .opencode/templates/fullstack/{{cookiecutter.project_name}}/.github/dependabot.yml
    • .opencode/templates/fullstack/{{cookiecutter.project_name}}/backend/.github/dependabot.yml
    • (5-й если есть в fullstack корневой — проверить)
    • Forgejo не имеет встроенного dependabot. Альтернатива — renovate.json (опционально, НЕ в этом PR — пользователь сам решит когда добавить). Просто удалить dependabot.yml — новые проекты будут без auto-dependency-updates. Это OK.
  3. .github/workflows/ci.yml в templates — НЕ трогать:

    • Forgejo понимает .github/workflows/ (act_runner совместим с GitHub Actions синтаксисом)
    • Шаблоны создают проекты с рабочим CI (.github/workflows/ci.yml)
    • actions/* references в шаблонах — оставить как есть (на Forgejo act_runner работает через https://code.forgejo.org/actions/* mirror, или preinstalled из runner image — зависит от инстанса)
    • Если в шаблонах используется actions/setup-uv — проверить (на code.forgejo.org его нет, 404). Если есть — заменить на preinstalled uv approach (как в основном репо ci.yml, последний коммит "drop setup-uv"). Если нет — ничего не делать.
  4. project-template/SKILL.md — синхронизировать с реальными template-файлами:

    • PR #2 переписал Template GITHUB → Template FORGEJO (curl POST/PATCH к Forgejo API)
    • Этот PR проверяет: Template FORGEJO в skill соответствует реальным template-файлам (pyproject URLs, нет dependabot.yml, ci.yml на месте)
    • Если в PR #2 Template FORGEJO упоминает renovate.json — добавить renovate.json template (опционально, если пользователь хочет auto-updates) или убрать упоминание
    • Проверить: project-template/SKILL.md L124 (финальный репорт) — GitHub: https://github.com/<owner>/<project_name> → Forgejo: https://git.slaid098.dev/<owner>/<project_name> (если ещё не обновлено в PR #2)
  5. Cookiecutter hooks/ — НЕ трогать:

    • pre_gen_project.py (валидация project_name) — нейтральна
    • post_gen_project.py (cleanup) — нейтральна
    • Не содержат GitHub-специфики

Контракты

  • pyproject.toml [project.urls]: 3 файла × 3 URLs = 9 замен (Homepage, Repository, Issues)
  • dependabot.yml: 5 файлов удалить (или 4 если в fullstack корневой нет — проверить)
  • .github/workflows/ci.yml: 5 файлов — НЕ трогать (рабочий CI)
  • project-template/SKILL.md: синхронизация с PR #2 (Template FORGEJO)
  • Cookiecutter variables: {{ cookiecutter.project_name }} — НЕ менять (плейсхолдер)

Инварианты

  • .github/workflows/ci.yml в шаблонах — НЕ трогать (Forgejo понимает, рабочий CI)
  • actions/* references в шаблонах — оставить (работает через code.forgejo.org mirror или preinstalled)
  • actions/setup-uv — если есть в шаблонах, проверить и заменить на preinstalled (он НЕ существует на code.forgejo.org, 404)
  • Cookiecutter hooks/ — НЕ трогать (нейтральны)
  • renovate.json — НЕ добавляем в этом PR (опциональная фича, пользователь решит сам)
  • project-template/SKILL.md — PR #2 уже переписал Template GITHUB → FORGEJO, этот PR только синхронизирует

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

  • pyproject.toml URLs — если cookiecutter variable {{ cookiecutter.project_name }} содержит special chars — URL-encoding? (нет, Forgejo принимает дефисы/подчёркивания)
  • dependabot.yml удаление — если в .github/ папке после удаления dependabot.yml остаётся только workflows/ — папка не пустая, OK. Если .github/ становится пустой — удалить папку (но workflows/ есть, не пустая)
  • actions/setup-uv в шаблонах — проверить rg "setup-uv" .opencode/templates/. Если найдено — заменить на preinstalled подход (удалить step, uv уже в runner image)
  • project-template/SKILL.md L124 — если PR #2 уже обновил URL — не дублировать правку

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

  • PR #2 (skills) — зависимость: project-template/SKILL.md Template FORGEJO должен быть создан ДО синхронизации с template-файлами
  • PR #3 (config) — зависимость: pyproject.toml основного репо обновлен ДО template'ов (консистентность)
  • project-template/SKILL.md — может потребоваться обновить L124 (финальный репорт URL) если PR #2 не сделал
  • Cookiecutter hooks/ — НЕ затрагиваются
  • Новые проекты (созданные через /project-template) — будут с Forgejo URLs в pyproject.toml, без dependabot.yml, с рабочим .github/workflows/ci.yml

Вне scope

  • .github/workflows/ci.yml → .forgejo/workflows/ — НЕ делаем (рабочий CI, Forgejo понимает оба)
  • actions/* → code.forgejo.org/actions/* в шаблонах — НЕ делаем (act_runner сам резолвит через mirror)
  • renovate.json template — НЕ добавляем (опционально, отдельная задача)
  • Cookiecutter hooks/ — НЕ трогаем
  • project-template/SKILL.md Template FORGEJO — уже в PR #2 (этот PR только синхронизирует)
  • Витрина slaid098-dev — отдельный репо

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

  • rg "github.com" .opencode/templates/ → 0 совпадений (в pyproject.toml URLs)
  • rg "dependabot" .opencode/templates/ → 0 совпадений (5 файлов удалены)
  • .github/workflows/ci.yml в шаблонах — НЕ изменён (5 файлов на месте)
  • rg "setup-uv" .opencode/templates/ → 0 (если было — заменено на preinstalled)
  • project-template/SKILL.md L124 — Forgejo: https://git.slaid098.dev/... (если PR #2 не обновил)
  • Smoke-test: cookiecutter .opencode/templates/backend --no-input project_name=test-forgejo → генерирует проект с Forgejo URLs в pyproject.toml, без dependabot.yml, с ci.yml
  • Cookiecutter hooks/ — не изменены
## Контекст PR #1-#3 адаптировали основной репо opencode-config под Forgejo. Cookiecutter templates (`backend/`, `cli/`, `fullstack/`) всё ещё содержат GitHub-эру: hardcoded `github.com` URLs в `pyproject.toml`, `.github/dependabot.yml` (GitHub-only фича). `.github/workflows/ci.yml` в шаблонах оставляем (Forgejo понимает `.github/workflows/`, рабочий CI — не трогаем). `project-template/SKILL.md` Template GITHUB переписан на Template FORGEJO в PR #2 — этот PR синхронизирует реальные template-файлы с skill-инструкциями. ## Задача 1. **3 `pyproject.toml` в templates** — `[project.urls]` github.com → git.slaid098.dev: - `.opencode/templates/cli/{{cookiecutter.project_name}}/pyproject.toml` L39-41: - `Homepage = "https://github.com/slaid098/{{ cookiecutter.project_name }}"` → `https://git.slaid098.dev/slaid098/{{ cookiecutter.project_name }}` - `Repository = ...` → то же - `Issues = "https://github.com/slaid098/{{ cookiecutter.project_name }}/issues"` → `https://git.slaid098.dev/slaid098/{{ cookiecutter.project_name }}/issues` - `.opencode/templates/backend/{{cookiecutter.project_name}}/pyproject.toml` L47-49 — то же - `.opencode/templates/fullstack/{{cookiecutter.project_name}}/backend/pyproject.toml` L47-49 — то же 2. **5 `.github/dependabot.yml` — удалить:** - `.opencode/templates/cli/{{cookiecutter.project_name}}/.github/dependabot.yml` - `.opencode/templates/backend/{{cookiecutter.project_name}}/.github/dependabot.yml` - `.opencode/templates/fullstack/{{cookiecutter.project_name}}/.github/dependabot.yml` - `.opencode/templates/fullstack/{{cookiecutter.project_name}}/backend/.github/dependabot.yml` - (5-й если есть в fullstack корневой — проверить) - Forgejo не имеет встроенного dependabot. Альтернатива — `renovate.json` (опционально, НЕ в этом PR — пользователь сам решит когда добавить). Просто удалить dependabot.yml — новые проекты будут без auto-dependency-updates. Это OK. 3. **`.github/workflows/ci.yml` в templates — НЕ трогать:** - Forgejo понимает `.github/workflows/` (act_runner совместим с GitHub Actions синтаксисом) - Шаблоны создают проекты с рабочим CI (`.github/workflows/ci.yml`) - `actions/*` references в шаблонах — оставить как есть (на Forgejo act_runner работает через `https://code.forgejo.org/actions/*` mirror, или preinstalled из runner image — зависит от инстанса) - Если в шаблонах используется `actions/setup-uv` — проверить (на code.forgejo.org его нет, 404). Если есть — заменить на preinstalled uv approach (как в основном репо ci.yml, последний коммит "drop setup-uv"). Если нет — ничего не делать. 4. **`project-template/SKILL.md` — синхронизировать с реальными template-файлами:** - PR #2 переписал Template GITHUB → Template FORGEJO (curl POST/PATCH к Forgejo API) - Этот PR проверяет: Template FORGEJO в skill соответствует реальным template-файлам (pyproject URLs, нет dependabot.yml, ci.yml на месте) - Если в PR #2 Template FORGEJO упоминает `renovate.json` — добавить `renovate.json` template (опционально, если пользователь хочет auto-updates) или убрать упоминание - Проверить: `project-template/SKILL.md` L124 (финальный репорт) — `GitHub: https://github.com/<owner>/<project_name>` → `Forgejo: https://git.slaid098.dev/<owner>/<project_name>` (если ещё не обновлено в PR #2) 5. **Cookiecutter `hooks/` — НЕ трогать:** - `pre_gen_project.py` (валидация project_name) — нейтральна - `post_gen_project.py` (cleanup) — нейтральна - Не содержат GitHub-специфики ## Контракты - `pyproject.toml` `[project.urls]`: 3 файла × 3 URLs = 9 замен (Homepage, Repository, Issues) - `dependabot.yml`: 5 файлов удалить (или 4 если в fullstack корневой нет — проверить) - `.github/workflows/ci.yml`: 5 файлов — НЕ трогать (рабочий CI) - `project-template/SKILL.md`: синхронизация с PR #2 (Template FORGEJO) - Cookiecutter variables: `{{ cookiecutter.project_name }}` — НЕ менять (плейсхолдер) ## Инварианты - `.github/workflows/ci.yml` в шаблонах — НЕ трогать (Forgejo понимает, рабочий CI) - `actions/*` references в шаблонах — оставить (работает через code.forgejo.org mirror или preinstalled) - `actions/setup-uv` — если есть в шаблонах, проверить и заменить на preinstalled (он НЕ существует на code.forgejo.org, 404) - Cookiecutter `hooks/` — НЕ трогать (нейтральны) - `renovate.json` — НЕ добавляем в этом PR (опциональная фича, пользователь решит сам) - `project-template/SKILL.md` — PR #2 уже переписал Template GITHUB → FORGEJO, этот PR только синхронизирует ## Граничные случаи - `pyproject.toml` URLs — если cookiecutter variable `{{ cookiecutter.project_name }}` содержит special chars — URL-encoding? (нет, Forgejo принимает дефисы/подчёркивания) - `dependabot.yml` удаление — если в `.github/` папке после удаления dependabot.yml остаётся только `workflows/` — папка не пустая, OK. Если `.github/` становится пустой — удалить папку (но workflows/ есть, не пустая) - `actions/setup-uv` в шаблонах — проверить `rg "setup-uv" .opencode/templates/`. Если найдено — заменить на preinstalled подход (удалить step, uv уже в runner image) - `project-template/SKILL.md` L124 — если PR #2 уже обновил URL — не дублировать правку ## Влияние на связанные компоненты - PR #2 (skills) — зависимость: `project-template/SKILL.md` Template FORGEJO должен быть создан ДО синхронизации с template-файлами - PR #3 (config) — зависимость: `pyproject.toml` основного репо обновлен ДО template'ов (консистентность) - `project-template/SKILL.md` — может потребоваться обновить L124 (финальный репорт URL) если PR #2 не сделал - Cookiecutter `hooks/` — НЕ затрагиваются - Новые проекты (созданные через `/project-template`) — будут с Forgejo URLs в pyproject.toml, без dependabot.yml, с рабочим `.github/workflows/ci.yml` ## Вне scope - `.github/workflows/ci.yml` → `.forgejo/workflows/` — НЕ делаем (рабочий CI, Forgejo понимает оба) - `actions/*` → `code.forgejo.org/actions/*` в шаблонах — НЕ делаем (act_runner сам резолвит через mirror) - `renovate.json` template — НЕ добавляем (опционально, отдельная задача) - Cookiecutter `hooks/` — НЕ трогаем - `project-template/SKILL.md` Template FORGEJO — уже в PR #2 (этот PR только синхронизирует) - Витрина slaid098-dev — отдельный репо ## Критерии приемки - [ ] `rg "github.com" .opencode/templates/` → 0 совпадений (в pyproject.toml URLs) - [ ] `rg "dependabot" .opencode/templates/` → 0 совпадений (5 файлов удалены) - [ ] `.github/workflows/ci.yml` в шаблонах — НЕ изменён (5 файлов на месте) - [ ] `rg "setup-uv" .opencode/templates/` → 0 (если было — заменено на preinstalled) - [ ] `project-template/SKILL.md` L124 — `Forgejo: https://git.slaid098.dev/...` (если PR #2 не обновил) - [ ] Smoke-test: `cookiecutter .opencode/templates/backend --no-input project_name=test-forgejo` → генерирует проект с Forgejo URLs в pyproject.toml, без dependabot.yml, с ci.yml - [ ] Cookiecutter `hooks/` — не изменены
Author
Owner

Code Review Summary

CI green (run #133). Код чистый, логика корректна:

  • backup.yml: cron 03:00, docker.sock mount, rclone heredoc (YAML de-indent → column 0 — валидный INI), upload с date-stamped path, ротация head -n $((COUNT-RETENTION)) корректно выбирает старейшие, set -e гарантирует что ротация не запустится при падении upload
  • setup.sh: парсинг --restore-from r2 (оба синтаксиса), валидация R2 vars, rclone install, latest backup через sort | tail -1, stop/extract/start
  • Секретов в коде нет — все через ${{ secrets.* }} (workflow) и ${VAR} из .env (setup.sh)

Watch out (не блокирующее, проверить на E2E): unzip -o ./restore/forgejo-dump.zip -d ./app_data/forgejo/ — нужно empirically проверить структуру forgejo dump zip. Если zip содержит app.ini и data/ в корне, а контейнер ожидает /data/gitea/conf/app.ini, то extract path должен быть ./app_data/forgejo/gitea/. Уточним при E2E тесте.

Verdict: APPROVE

## Code Review Summary CI green (run #133). Код чистый, логика корректна: - backup.yml: cron 03:00, docker.sock mount, rclone heredoc (YAML de-indent → column 0 — валидный INI), upload с date-stamped path, ротация `head -n $((COUNT-RETENTION))` корректно выбирает старейшие, `set -e` гарантирует что ротация не запустится при падении upload - setup.sh: парсинг `--restore-from r2` (оба синтаксиса), валидация R2 vars, rclone install, latest backup через `sort | tail -1`, stop/extract/start - Секретов в коде нет — все через `${{ secrets.* }}` (workflow) и `${VAR}` из .env (setup.sh) Watch out (не блокирующее, проверить на E2E): `unzip -o ./restore/forgejo-dump.zip -d ./app_data/forgejo/` — нужно empirically проверить структуру `forgejo dump` zip. Если zip содержит `app.ini` и `data/` в корне, а контейнер ожидает `/data/gitea/conf/app.ini`, то extract path должен быть `./app_data/forgejo/gitea/`. Уточним при E2E тесте. ### Verdict: APPROVE
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/opencode-config#8
No description provided.