fix(tools): create-pr omits head field, Forgejo POST /pulls returns 422 #9
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?
Контекст
Tool
create-pr(create-pr.ts) вызываетrunGh(["pr", "create", "--title", title, "--body", body], repo, {cwd})БЕЗ флагов--headи--base. В GitHub-режимеgh pr createавтоопределяет head из текущей ветки и base из дефолтной ветки репо.В Forgejo-режиме
callForgejoGhв_shared.ts:126-144извлекает--head/--baseиз argv черезargs.indexOf("--head")— если флаги отсутствуют,headиbaseостаютсяundefinedи НЕ попадают в POST body (...(head ? {head} : {})). Forgejo APIPOST /repos/{repo}/pullsтребует полеhead(название ветки источника) — без него возвращает HTTP 422{"message":"[Head]: Required"}.Воспроизведение: попытка создать PR через
create-prtool на веткеrefactor/tools/forgejo-first-dispatch→Forgejo API POST /repos/slaid098/opencode-config/pulls → HTTP 422: {"message":"[Head]: Required"}.Обнаружено при работе над issue #5 (PR для cut GitHub fallback) — на шаге создания PR упал с 422.
Задача
_shared.ts:callForgejoGhдляpr create— если--headотсутствует в argv, определить head из текущей git-ветки (git rev-parse --abbrev-ref HEADчерезspawnSyncсopts.cwd), а base — из дефолтной ветки репо (ForgejoGET /repos/{repo}→default_branch, или хардкодmainс fallback).headиbaseв POST body всегда (не опционально).create-prна feature-ветке без--head/--base→ PR создаётся, head=текущая ветка, base=default branch.Контракты
callForgejoGhимеет доступ кopts.cwd(передаётся изcontext.worktree)spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {cwd})→ текущая веткаGET /repos/{repo}→{default_branch: "main", ...}{title, body, head, base}(все поля обязательны для Forgejo, кроме body которое может быть пустым)Инварианты
create-prНЕ меняется (параметры title/body/issue_number/repo те же)--head/--baseесли переданы — имеют приоритет над автоопределениемghbinary) не затрагивается (только Forgejo dispatch вcallForgejoGh)Граничные случаи
(HEAD detached at SHA)→ head не определяется → понятная ошибка "cannot determine head branch (detached HEAD)"default_branchendpoint недоступен → fallback на"main"Влияние на связанные компоненты
_shared.ts:callForgejoGh(pr create ветка, ~L126-144) — основная правкаcreate-pr.ts— без изменений (контракт сохранён)merge-pr.ts,post-review.ts,create-issue.ts— без изменений (не используютpr create)Вне scope
gh pr mergedispatch (работает,merge-prне передаёт head/base)gh pr commentdispatch (работает)gh issue createdispatch (работает, labels баг в issue #4)Критерии приемки
create-pr({title, body, issue_number: N})на feature-ветке (без--head) → PR создаётся на Forgejoheadв POST body = текущая git-ветка,base=default_branchрепо--head/--baseесли переданы — переопределяют автоопределение