fix(create-pr): base field required by Forgejo POST /pulls #26

Closed
opened 2026-08-07 19:50:49 +03:00 by slaid098 · 0 comments
Owner

Контекст

PR#25 (feat(clone): add clone tool) выявил, что create-pr tool падает с HTTP 422 [Base]: Required при создании PR в Forgejo. Сабагент PR#25 был вынужден сделать fallback на raw curl с ручным base: main в JSON body.

В памяти репо (opencode-config-004.md:42,56) записано: "base опциональный (Forgejo default_branch)" — это утверждение оказалось неверным: Forgejo POST /api/v1/repos/{owner}/{repo}/pulls требует base field явно, default_branch НЕ подставляется автоматически.

PR#18 (Closes #9) пофиксил head field (тоже required), но base остался опциональным в create-pr.ts/_shared.ts — тот же класс бага, что был у head до PR#18.

Задача

Сделать base field required (fail-loud, НЕ тихо опустить) в create-pr tool — по аналогии с фикс head field в PR#18. Автоопределение base через git rev-parse --abbrev-ref origin/HEAD (default branch) или явная передача --base <branch>.

Контракты

  • create-pr tool API: base параметр — теперь required (НЕ optional). Если не передан — автоопределение через git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@' (default branch), fallback на main.
  • _shared.ts: base required для pr create (fail-loud), как head после PR#18.
  • Forgejo POST /pulls body: base: <branch> — обязательное поле (подтверждено HTTP 422 [Base]: Required в PR#25).

Инварианты

  • Внешний контракт create-pr tool НЕ меняется для вызовов, где base уже передаётся явно.
  • Автоопределение base НЕ должно ломаться на репо без origin/HEAD (fresh clone без git fetch → fallback на main).
  • Detached HEAD НЕ влияет на base (только на head).

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

  • Репо с default branch master (не main) — автоопределение через origin/HEAD корректно вернёт master.
  • Репо без origin/HEAD (fresh clone, git fetch не выполнен) — fallback на main (большинство Forgejo репо используют main).
  • Вызов create-pr с явным base — автоопределение НЕ срабатывает, переданное значение используется как есть.

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

  • create-pr.ts — автоопределение base (по образцу head из PR#18).
  • _shared.ts — base required для pr create.
  • Тесты test_create_pr_tool.py + .ts — новые тесты на автоопределение base, fallback на main, явный base.
  • run-pipeline/SKILL.md Template A — если документирует create-pr вызов, обновить (вероятно не нужно — base автоопределяется).
  • Память opencode-config-004.md:42,56 — обновить запись "base опциональный" → "base required (fail-loud, автоопределение через origin/HEAD)".

Вне scope

  • Фикс других полей Forgejo POST /pulls (title, body — уже required, работают).
  • Миграция на gh CLI (удалён, ADR-093).
  • Изменение merge-pr/post-review tools.

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

  • create-pr tool успешно создаёт PR в Forgejo БЕЗ явной передачи base (автоопределение через origin/HEAD).
  • create-pr tool успешно создаёт PR с явным base (переданное значение используется).
  • HTTP 422 [Base]: Required НЕ воспроизводится после фикса.
  • Тесты: автоопределение base, fallback на main (no origin/HEAD), явный base, detached HEAD (base НЕ зависит от HEAD).
  • Память обновлена: запись про base опциональный исправлена.
## Контекст PR#25 (`feat(clone): add clone tool`) выявил, что `create-pr` tool падает с HTTP 422 `[Base]: Required` при создании PR в Forgejo. Сабагент PR#25 был вынужден сделать fallback на raw `curl` с ручным `base: main` в JSON body. В памяти репо (`opencode-config-004.md:42,56`) записано: "`base` опциональный (Forgejo default_branch)" — это утверждение оказалось **неверным**: Forgejo `POST /api/v1/repos/{owner}/{repo}/pulls` требует `base` field явно, default_branch НЕ подставляется автоматически. PR#18 (Closes #9) пофиксил `head` field (тоже required), но `base` остался опциональным в `create-pr.ts`/`_shared.ts` — тот же класс бага, что был у `head` до PR#18. ## Задача Сделать `base` field required (fail-loud, НЕ тихо опустить) в `create-pr` tool — по аналогии с фикс `head` field в PR#18. Автоопределение `base` через `git rev-parse --abbrev-ref origin/HEAD` (default branch) или явная передача `--base <branch>`. ## Контракты - `create-pr` tool API: `base` параметр — теперь required (НЕ optional). Если не передан — автоопределение через `git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'` (default branch), fallback на `main`. - `_shared.ts`: `base` required для `pr create` (fail-loud), как `head` после PR#18. - Forgejo `POST /pulls` body: `base: <branch>` — обязательное поле (подтверждено HTTP 422 `[Base]: Required` в PR#25). ## Инварианты - Внешний контракт `create-pr` tool НЕ меняется для вызовов, где `base` уже передаётся явно. - Автоопределение `base` НЕ должно ломаться на репо без `origin/HEAD` (fresh clone без `git fetch` → fallback на `main`). - Detached HEAD НЕ влияет на `base` (только на `head`). ## Граничные случаи - Репо с default branch `master` (не `main`) — автоопределение через `origin/HEAD` корректно вернёт `master`. - Репо без `origin/HEAD` (fresh clone, `git fetch` не выполнен) — fallback на `main` (большинство Forgejo репо используют `main`). - Вызов `create-pr` с явным `base` — автоопределение НЕ срабатывает, переданное значение используется как есть. ## Влияние на связанные компоненты - `create-pr.ts` — автоопределение `base` (по образцу `head` из PR#18). - `_shared.ts` — `base` required для `pr create`. - Тесты `test_create_pr_tool.py` + `.ts` — новые тесты на автоопределение `base`, fallback на `main`, явный `base`. - `run-pipeline/SKILL.md` Template A — если документирует `create-pr` вызов, обновить (вероятно не нужно — `base` автоопределяется). - Память `opencode-config-004.md:42,56` — обновить запись "`base` опциональный" → "`base` required (fail-loud, автоопределение через `origin/HEAD`)". ## Вне scope - Фикс других полей Forgejo `POST /pulls` (title, body — уже required, работают). - Миграция на `gh` CLI (удалён, ADR-093). - Изменение `merge-pr`/`post-review` tools. ## Критерии приемки - [ ] `create-pr` tool успешно создаёт PR в Forgejo БЕЗ явной передачи `base` (автоопределение через `origin/HEAD`). - [ ] `create-pr` tool успешно создаёт PR с явным `base` (переданное значение используется). - [ ] HTTP 422 `[Base]: Required` НЕ воспроизводится после фикса. - [ ] Тесты: автоопределение `base`, fallback на `main` (no `origin/HEAD`), явный `base`, detached HEAD (base НЕ зависит от HEAD). - [ ] Память обновлена: запись про `base` опциональный исправлена.
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#26
No description provided.