fix(tools): remove github.com fallback from create-readme clone URL #19
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/create-readme/forgejo-clone-url"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Удалён мёртвый 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.tsexecute() — добавлен 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.comtest_clone_url_missing_forgejo_url_errors— отсутствие FORGEJO_URL → fail-loud errortest_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 (commit50ad724) сделал 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заданном поведение идентично текущему.github.comclone URL в других репо НЕ мигрируются автоматически — нужен ручной вызовcreate-readme(вне scope, описано в issue #16 "Вне scope").github.comв пояснении ("would reference dead github.com — ADR-093") — это намеренно, для понятности причины ошибки. Тесты проверяют факт ошибки, не отсутствие слова в сообщении.check-permissions.py:114(no-any-return) — на main, НЕ введён этим PR (см. memory opencode-config-004.md PR#14 запись).Pending
create-prtool баг #9: PR #18 (commit6f09abb) пофиксил head field — этот PR создан через raw curl fallback (баг #9 НЕ до конца пофиксен: HTTP 422Head: Requiredпри вызовеcreate-prtool). Баг #9 требует отдельного фикса.Closes #16
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
args.include_clone !== false && !process.env.FORGEJO_URL—undefined/true→ guard срабатывает (clone line включается по умолчанию),false→ обходит (clone line опускается).!process.env.FORGEJO_URLловит иundefined, и пустую строку""(оба falsy в JS).generateReadme()(строка 282) — корректный порядок, не маскирует ошибки валидации.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". Тесты проверяют факт ошибки, не отсутствие слова в сообщении.## Что сделано,## Почему,## Watch out,## Pending) заполнены осмысленно,Closes #16присутствует. Watch out корректно отмечает pre-existing mypy error (не введён этим PR) и что существующие README не мигрируются автоматически.Suggestions (info, not blocking)
""технически недостижим: guard в execute() (line 279) срабатывает раньшеgenerateReadme(), а приinclude_clone: falsecloneLine всё равно""(line 64-66). Author осознаёт это (PR body: "defensive, недостижима т.к. guard в execute() срабатывает раньше"). Оставить как safety net — валидный выбор; альтернативно можно убрать ветку: ""совсем и сделатьcloneUrlunconditional (guard гарантирует FORGEJO_URL presence). Не блокирующее — defensive coding оправдан для tool, генерирующего пользовательский контент.FORGEJO_URLдля clone URL generation. На практике FORGEJO_URL всегда задан в Docker-окружении, поэтому это не breaking change для агентов. При желании можно добавить одну строку в skill: "FORGEJO_URL must be set wheninclude_cloneis not false (clone URL is built from it)". Не обязательно — error message self-explanatory.Verdict: APPROVE