refactor(config): remove gh from Dockerfile, clean env.example, opencode.json permissions, ADRs #7
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Контекст
PR #1 (tools) и PR #2 (skills) вырезали GitHub-fallback из кода и промптов. Этот PR завершает адаптацию: Dockerfile (убрать
ghCLI),.env.example(удалитьGITHUB_TOKEN),opencode.json(удалить 24gh*permission rules),AGENTS.md(секция про git-host),pyproject.toml/README.md(URLs), и создание ADRs для документирования решения.Задача
Dockerfile(62 строки):ghCLI установку (L29-35:cli.github.com/packagesapt source +ghpackage)git config --system credential.helper '!gh auth git-credential'(L39)cloudflareddownload URL (L37):https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64→ альтернативный CDN (Cloudflare有自己的 CDN:https://pkg.cloudflareclient.com/cloudflared/releases/latest/cloudflared-linux-amd64или оставить github.com — cloudflared releases только там; решение: оставить, это не наш код, пометить комментарием что downloads с github.com для cloudflared, не для наших репо)gh—memory-doctor.ts(L38,rg --version),memory-search.ts(L120,rg),commit.ts(git) — не зависят отgh, OK.env.example(51 строка):# GitHub+GITHUB_TOKEN=your-github-token-here(L18-19)OPENCODE_MEMORY_REMOTE(L50):https://github.com/your-username/your-opencode-memory.git→https://git.slaid098.dev/slaid098/opencode-memory.git(Forgejo URL)# Forgejo (self-hosted)секцию (L21-23) сFORGEJO_URL/FORGEJO_TOKEN— это primaryopencode.jsonpermission.bash— удалить 24gh*правила:gh pr create*,gh pr merge*,gh pr list*,gh pr status*,gh run*,gh issue*,gh pr diff*,gh pr view*,gh pr comment*,gh pr review*,gh api repos/*/actions/runs*,gh api repos/*/issues*,gh run list*,gh run view*gh repo delete *: deny), L250 (gh pr close *: ask)gh pr create *: deny,gh pr merge *: deny,gh issue create *: deny,gh api * -X DELETE *: deny,gh api -X DELETE *: deny,gh api * --method DELETE *: deny,gh api * --method delete *: deny,gh repo transfer *: deny"curl * -X DELETE *FORGEJO_URL*": "deny"(если будет прямой curl в skills — запретить delete операции)permission.readсекцию (L165-173) без изменений (нейтральна)AGENTS.md— добавить секцию про git-host после## Pipeline:pyproject.toml(L48-50):Homepage = "https://github.com/slaid098/opencode-config"→https://git.slaid098.dev/slaid098/opencode-configRepository = "https://github.com/slaid098/opencode-config"→https://git.slaid098.dev/slaid098/opencode-configIssues = "https://github.com/slaid098/opencode-config/issues"→https://git.slaid098.dev/slaid098/opencode-config/issuesREADME.md(L46, L85):git clone https://github.com/slaid098/opencode-config.git→git clone https://git.slaid098.dev/slaid098/opencode-config.git(2 места: Quick Start EN + RU)Создать ADRs:
docs/decisions/092-forgejo-dispatch.md— документировать существующий Forgejo dispatch (env-presence fallback в_shared.ts+ 3 oracle-скриптах, реализованный до этого ADR). Ссылается на PR #1.docs/decisions/093-forgejo-first.md— стратегия перехода: GitHub мёртв → Forgejo primary,ghCLI убран, fallback вырезан. Ссылается на PR #1, #2, #3.docs/decisions/094-host-agnostic-docs.md— описания skills/agents/tools host-agnostic ("issue", не "GitHub issue") — задел на будущие зеркала (GitLab/Codeberg). Ссылается на PR #2.docs/decisions/095-curl-in-skills-where-no-tool.md— для операций без tool'а (label/release/repo create/edit) используемcurlк Forgejo API в bash-блоке skill'а, НЕ создаём новые tools (решение пользователя: tools только где нужен детерминированный формат). Ссылается на PR #2.Пометить устаревшие ADRs:
docs/decisions/022-pr-53-git-insteadof.md— добавить в начало> **STATUS: SUPERSEDED** — setup-memory.sh удалён, GitHub-специфика, миграция на Forgejo (ADR-093).docs/decisions/005-pr-25-reviewer-echo-bypass.md—> **STATUS: SUPERSEDED** — GitHub fine-grained PAT 403, Forgejo не имеет GraphQL Checks API (ADR-093).docs/decisions/023-pr-55-parse-remote-url.md—> **STATUS: SUPERSEDED** — GitHub PAT в URL, Forgejo использует token-in-URL напрямую (ADR-093).Контракты
Dockerfile: после правкиdocker buildдолжен собираться безgh— проверитьrg "gh" Dockerfile→ 0.env.example:rg "GITHUB_TOKEN" .env.example→ 0;rg "github.com" .env.example→ 0 (кроме cloudflared если оставили)opencode.json:rg "gh " .opencode/opencode.json→ 0 (в permission.bash секции)AGENTS.md: новая секция## Git Hostпосле## Pipelinepyproject.toml:rg "github.com" pyproject.toml→ 0README.md:rg "github.com" README.md→ 0Инварианты
Dockerfileдолжен собираться (docker build .не падает) — это критично, образ пересобирается приdocker-compose restartopencode.jsonпосле удаления 24gh*правил — остальная permission.bash секция НЕ сломана (valid JSON)cloudflareddownload URL — оставить github.com (Cloudflare публикует releases только там), пометить комментарием "downloads cloudflared binary, not our code".env.example— template для пользователей, не наш.env(наш.envне трогаем)Граничные случаи
Dockerfileбезgh— если какой-то tool всё ещё вызываетspawnSync("gh")(не вырезан в PR #1) → runtime ошибка. PR #1 должен быть смержен ДО этого PR.opencode.jsonконфликт правил L206 allow vs L329 deny — после удаления обоих конфликта нетopencode.jsonпосле удаления — если остался"gh repo delete *": "deny"(L249) — тоже удалить (этоgh*rule).env.exampleOPENCODE_MEMORY_REMOTE— если пользователь уже скопировал.env.exampleв.envс GitHub URL, наш.envне меняется (только template)cloudflared— если Cloudflare уберёт releases с github.com → tunnel skill сломается, но это не наша проблема (Cloudflare CDN)AGENTS.mdновая секция — проверить что не нарушает existing структуру заголовковВлияние на связанные компоненты
ghspawnSync вырезан из кода ДО удаленияghиз Dockerfile (иначе runtime ошибка)ghинструкции удалены из skills ДО удаленияgh*permission rules (иначе skills инструктируют вызвать запрещённое)docker-compose.yml— проверьenvironment:секцию, нет лиGITHUB_TOKENпроброса (по аудиту нет, толькоenv_file: .env)Dockerfile—memory-doctor.ts(L38rg --version),memory-search.ts(L120rg),commit.ts(git) — не зависят отgh, OKcheck-permissions.py(L14-17, 19-28, 31-34, 59-61) — DANGEROUS_PATTERNS содержатgh *паттерны. После удаленияgh*правил из opencode.json — паттерны в check-permissions.py становятся неактуальны. Обновить: удалитьgh *паттерны или пометить как deprecated.permission.bashв agent frontmatter (memory-syncer L19/L31-33, reviewer L33-55/L69) — удалены в PR #2, этот PR не трогает agent filespre-commit-config.yaml(L2, L9) —repo: https://github.com/astral-sh/ruff-pre-commit,repo: https://github.com/pre-commit/mirrors-mypy— оставить (pre-commit hooks тянутся с github.com, это не наш код, работает через git clone)Вне scope
check-permissions.pyDANGEROUS_PATTERNS — обновить (удалитьgh *паттерны), но это в этом PR (см. Влияние)pre-commit-config.yamlURLs — оставить (не наш код)Критерии приемки
docker build .succeeds withoutghinstalled (проверитьdocker build -t opencode-config-test . 2>&1 | tail -20)rg "gh " Dockerfile→ 0 совпаденийrg "GITHUB_TOKEN" .env.example→ 0 совпаденийrg "github.com" .env.example→ 0 (или только cloudflared с комментарием)rg "gh " .opencode/opencode.json→ 0 в permission.bash секцииopencode.jsonvalid JSON после правки (python3 -c "import json; json.load(open('.opencode/opencode.json'))")AGENTS.mdсодержит секцию## Git Hostпосле## Pipelinerg "github.com" pyproject.toml→ 0rg "github.com" README.md→ 0docs/decisions/092-forgejo-dispatch.mdexistsdocs/decisions/093-forgejo-first.mdexistsdocs/decisions/094-host-agnostic-docs.mdexistsdocs/decisions/095-curl-in-skills-where-no-tool.mdexistsdocs/decisions/022-pr-53-git-insteadof.mdсодержитSUPERSEDEDв началеdocs/decisions/005-pr-25-reviewer-echo-bypass.mdсодержитSUPERSEDEDв началеdocs/decisions/023-pr-55-parse-remote-url.mdсодержитSUPERSEDEDв началеcheck-permissions.py—gh *паттерны удалены или помечены deprecateddocker-compose restart(после merge) — opencode поднимается безgh, tools работают