fix(tools): remove github.com fallback from create-readme clone URL #19

Merged
slaid098 merged 1 commit from fix/create-readme/forgejo-clone-url into main 2026-08-07 13:43:46 +03:00
Owner

Что сделано

Удалён мёртвый fallback на github.com/slaid098 в create-readme.ts:63 (clone URL для Quick Start секции README). Добавлен fail-loud guard в execute(): если include_clone !== false и FORGEJO_URL не задан (или пустая строка) → tool возвращает явную ошибку ❌ FORGEJO_URL env var required (clone URL would reference dead github.com — ADR-093), НЕ генерирует README с нерабочим URL.

Конкретно:

  • .opencode/tools/create-readme.ts:63 — fallback ветка https://github.com/slaid098/... заменена на пустую строку (defensive, недостижима т.к. guard в execute() срабатывает раньше)
  • .opencode/tools/create-readme.ts execute() — добавлен guard после валидации args, до generateReadme(): if (args.include_clone !== false && !process.env.FORGEJO_URL) return "❌ FORGEJO_URL env var required..."
  • tests/test_create_readme_tool.py — 5 новых тестов:
    • test_clone_url_uses_forgejo_url_env — clone URL = https://git.slaid098.dev/slaid098/.git, github.com отсутствует
    • test_clone_url_no_github_fallback — regression guard: README не содержит github.com
    • test_clone_url_missing_forgejo_url_errors — отсутствие FORGEJO_URL → fail-loud error
    • test_clone_url_empty_forgejo_url_errors — пустая строка FORGEJO_URL → fail-loud error (граничный случай)
    • test_clone_url_skip_guard_when_include_clone_false — include_clone: false + нет FORGEJO_URL → success (инвариант: clone line опускается, guard не срабатывает)

Почему

ADR-093: GitHub аккаунт slaid098 удалён, Forgejo git.slaid098.dev — единственный хостинг. PR #10 (commit 50ad724) сделал clone URL динамическим из FORGEJO_URL, но fallback-ветка (строка 63) осталась на github.com/slaid098 — мёртвый код, генерирующий нерабочий URL если FORGEJO_URL не задан. Issue #1 Fix #1 expected fallback на github.com (написан ДО ADR-093), но после ADR-093 fallback стал мёртвым. Обнаружено reviewer PR #15.

Контракты (из issue #16):

  • FORGEJO_URL задан → https://git.slaid098.dev/slaid098/.git (без изменений)
  • FORGEJO_URL НЕ задан/пустой → ошибка (НЕ fallback на мёртвый github.com)
  • include_clone: false → clone line опускается, guard НЕ срабатывает (без изменений)

Watch out

  • Внешний контракт create-readme НЕ меняется (параметры те же). При FORGEJO_URL заданном поведение идентично текущему.
  • Существующие README с github.com clone URL в других репо НЕ мигрируются автоматически — нужен ручной вызов create-readme (вне scope, описано в issue #16 "Вне scope").
  • Сообщение об ошибке упоминает github.com в пояснении ("would reference dead github.com — ADR-093") — это намеренно, для понятности причины ошибки. Тесты проверяют факт ошибки, не отсутствие слова в сообщении.
  • Pre-existing mypy error check-permissions.py:114 (no-any-return) — на main, НЕ введён этим PR (см. memory opencode-config-004.md PR#14 запись).

Pending

  • Issue #1 Fix #2-5 (headRefName, branch protection, release, gh issue list) — отдельные задачи, вне scope.
  • create-pr tool баг #9: PR #18 (commit 6f09abb) пофиксил head field — этот PR создан через raw curl fallback (баг #9 НЕ до конца пофиксен: HTTP 422 Head: Required при вызове create-pr tool). Баг #9 требует отдельного фикса.

Closes #16

## Что сделано Удалён мёртвый fallback на `github.com/slaid098` в `create-readme.ts:63` (clone URL для Quick Start секции README). Добавлен fail-loud guard в `execute()`: если `include_clone !== false` и `FORGEJO_URL` не задан (или пустая строка) → tool возвращает явную ошибку `❌ FORGEJO_URL env var required (clone URL would reference dead github.com — ADR-093)`, НЕ генерирует README с нерабочим URL. Конкретно: - `.opencode/tools/create-readme.ts:63` — fallback ветка `https://github.com/slaid098/...` заменена на пустую строку (defensive, недостижима т.к. guard в execute() срабатывает раньше) - `.opencode/tools/create-readme.ts` execute() — добавлен guard после валидации args, до `generateReadme()`: `if (args.include_clone !== false && !process.env.FORGEJO_URL) return "❌ FORGEJO_URL env var required..."` - `tests/test_create_readme_tool.py` — 5 новых тестов: - `test_clone_url_uses_forgejo_url_env` — clone URL = `https://git.slaid098.dev/slaid098/.git`, github.com отсутствует - `test_clone_url_no_github_fallback` — regression guard: README не содержит `github.com` - `test_clone_url_missing_forgejo_url_errors` — отсутствие FORGEJO_URL → fail-loud error - `test_clone_url_empty_forgejo_url_errors` — пустая строка FORGEJO_URL → fail-loud error (граничный случай) - `test_clone_url_skip_guard_when_include_clone_false` — `include_clone: false` + нет FORGEJO_URL → success (инвариант: clone line опускается, guard не срабатывает) ## Почему ADR-093: GitHub аккаунт slaid098 удалён, Forgejo `git.slaid098.dev` — единственный хостинг. PR #10 (commit `50ad724`) сделал clone URL динамическим из `FORGEJO_URL`, но fallback-ветка (строка 63) осталась на `github.com/slaid098` — мёртвый код, генерирующий нерабочий URL если `FORGEJO_URL` не задан. Issue #1 Fix #1 expected fallback на github.com (написан ДО ADR-093), но после ADR-093 fallback стал мёртвым. Обнаружено reviewer PR #15. Контракты (из issue #16): - `FORGEJO_URL` задан → `https://git.slaid098.dev/slaid098/.git` (без изменений) - `FORGEJO_URL` НЕ задан/пустой → ошибка (НЕ fallback на мёртвый github.com) - `include_clone: false` → clone line опускается, guard НЕ срабатывает (без изменений) ## Watch out - Внешний контракт `create-readme` НЕ меняется (параметры те же). При `FORGEJO_URL` заданном поведение идентично текущему. - Существующие README с `github.com` clone URL в других репо НЕ мигрируются автоматически — нужен ручной вызов `create-readme` (вне scope, описано в issue #16 "Вне scope"). - Сообщение об ошибке упоминает `github.com` в пояснении ("would reference dead github.com — ADR-093") — это намеренно, для понятности причины ошибки. Тесты проверяют факт ошибки, не отсутствие слова в сообщении. - Pre-existing mypy error `check-permissions.py:114` (no-any-return) — на main, НЕ введён этим PR (см. memory opencode-config-004.md PR#14 запись). ## Pending - Issue #1 Fix #2-5 (headRefName, branch protection, release, gh issue list) — отдельные задачи, вне scope. - `create-pr` tool баг #9: PR #18 (commit `6f09abb`) пофиксил head field — этот PR создан через raw curl fallback (баг #9 НЕ до конца пофиксен: HTTP 422 `Head: Required` при вызове `create-pr` tool). Баг #9 требует отдельного фикса. Closes #16
fix(tools): remove github.com fallback from create-readme clone URL
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 3s
CI / bootstrap (pull_request) Successful in 5s
CI / lint (pull_request) Successful in 26s
CI / complexity (pull_request) Successful in 26s
CI / typecheck (pull_request) Successful in 30s
CI / test (3.13) (pull_request) Successful in 1m39s
4c37f1bc48
Author
Owner

Code Review Summary

Чистый, хорошо протестированный PR: убран мёртвый fallback на github.com/slaid098 в clone URL, добавлен fail-loud guard с корректной логикой обхода для include_clone: false. 5 новых тестов покрывают happy path, regression, boundary cases (пустая строка FORGEJO_URL) и инвариант include_clone=false. CI green, PR body полный с обоснованием ADR-093.

Positives

  • Guard logic корректна: args.include_clone !== false && !process.env.FORGEJO_URL — undefined/true → guard срабатывает (clone line включается по умолчанию), false → обходит (clone line опускается). !process.env.FORGEJO_URL ловит и undefined, и пустую строку "" (оба falsy в JS).
  • Guard placement: размещён после валидации args (строки 254-277), до generateReadme() (строка 282) — корректный порядок, не маскирует ошибки валидации.
  • Тесты покрывают контракты из issue #16: happy path (FORGEJO_URL → clone URL без github.com), regression guard (нет github.com нигде), missing env → error, empty string → error (boundary), include_clone: false + no FORGEJO_URL → success (invariant). Тест test_clone_url_skip_guard_when_include_clone_false дополнительно проверяет что clone line действительно отсутствует в README.
  • Единственное упоминание github.com в create-readme.ts — в сообщении об ошибке (line 280: "would reference dead github.com — ADR-093"). Это намеренно (поясняет причину ошибки), задокументировано в PR body "Watch out". Тесты проверяют факт ошибки, не отсутствие слова в сообщении.
  • PR body: все 4 секции (## Что сделано, ## Почему, ## Watch out, ## Pending) заполнены осмысленно, Closes #16 присутствует. Watch out корректно отмечает pre-existing mypy error (не введён этим PR) и что существующие README не мигрируются автоматически.

Suggestions (info, not blocking)

  • create-readme.ts:63 — fallback "" технически недостижим: guard в execute() (line 279) срабатывает раньше generateReadme(), а при include_clone: false cloneLine всё равно "" (line 64-66). Author осознаёт это (PR body: "defensive, недостижима т.к. guard в execute() срабатывает раньше"). Оставить как safety net — валидный выбор; альтернативно можно убрать ветку : "" совсем и сделать cloneUrl unconditional (guard гарантирует FORGEJO_URL presence). Не блокирующее — defensive coding оправдан для tool, генерирующего пользовательский контент.
  • repo-readme/SKILL.md — skill не документирует требование FORGEJO_URL для clone URL generation. На практике FORGEJO_URL всегда задан в Docker-окружении, поэтому это не breaking change для агентов. При желании можно добавить одну строку в skill: "FORGEJO_URL must be set when include_clone is not false (clone URL is built from it)". Не обязательно — error message self-explanatory.

Verdict: APPROVE

## Code Review Summary Чистый, хорошо протестированный PR: убран мёртвый fallback на `github.com/slaid098` в clone URL, добавлен fail-loud guard с корректной логикой обхода для `include_clone: false`. 5 новых тестов покрывают happy path, regression, boundary cases (пустая строка FORGEJO_URL) и инвариант `include_clone=false`. CI green, PR body полный с обоснованием ADR-093. ### Positives - **Guard logic корректна**: `args.include_clone !== false && !process.env.FORGEJO_URL` — `undefined`/`true` → guard срабатывает (clone line включается по умолчанию), `false` → обходит (clone line опускается). `!process.env.FORGEJO_URL` ловит и `undefined`, и пустую строку `""` (оба falsy в JS). - **Guard placement**: размещён после валидации args (строки 254-277), до `generateReadme()` (строка 282) — корректный порядок, не маскирует ошибки валидации. - **Тесты покрывают контракты из issue #16**: happy path (FORGEJO_URL → clone URL без github.com), regression guard (нет github.com нигде), missing env → error, empty string → error (boundary), `include_clone: false` + no FORGEJO_URL → success (invariant). Тест `test_clone_url_skip_guard_when_include_clone_false` дополнительно проверяет что clone line действительно отсутствует в README. - **Единственное упоминание `github.com`** в create-readme.ts — в сообщении об ошибке (line 280: "would reference dead github.com — ADR-093"). Это намеренно (поясняет причину ошибки), задокументировано в PR body "Watch out". Тесты проверяют факт ошибки, не отсутствие слова в сообщении. - **PR body**: все 4 секции (`## Что сделано`, `## Почему`, `## Watch out`, `## Pending`) заполнены осмысленно, `Closes #16` присутствует. Watch out корректно отмечает pre-existing mypy error (не введён этим PR) и что существующие README не мигрируются автоматически. ### Suggestions (info, not blocking) - **create-readme.ts:63** — fallback `""` технически недостижим: guard в execute() (line 279) срабатывает раньше `generateReadme()`, а при `include_clone: false` cloneLine всё равно `""` (line 64-66). Author осознаёт это (PR body: "defensive, недостижима т.к. guard в execute() срабатывает раньше"). Оставить как safety net — валидный выбор; альтернативно можно убрать ветку `: ""` совсем и сделать `cloneUrl` unconditional (guard гарантирует FORGEJO_URL presence). Не блокирующее — defensive coding оправдан для tool, генерирующего пользовательский контент. - **repo-readme/SKILL.md** — skill не документирует требование `FORGEJO_URL` для clone URL generation. На практике FORGEJO_URL всегда задан в Docker-окружении, поэтому это не breaking change для агентов. При желании можно добавить одну строку в skill: "FORGEJO_URL must be set when `include_clone` is not false (clone URL is built from it)". Не обязательно — error message self-explanatory. ### Verdict: APPROVE
slaid098 deleted branch fix/create-readme/forgejo-clone-url 2026-08-07 13:43:46 +03:00
Sign in to join this conversation.
No reviewers
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!19
No description provided.