feat(pipeline-oracle): issue-number input, bootstrap NEXT, issues dashboard #80
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/pipeline-oracle/issue-input"
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?
Что сделано
pipeline-statusпринимает любой номер: PR или issue. Резолюция детерминированная:GET /pulls/{N}→ 200 PR-путь; 404 →GET /issues/{N}→ поиск открытых PR сCloses|Fixes|Resolves #N(ровно 1 →issue #N → PR #M, 0 → bootstrap, >1 → AMBIGUOUS со списком); ни PR ни issue → stderr «Не существует ни PR, ни issue с номером N», exit 1.NEXT: dispatch subagent (subagent_type=general, template=A) for issue #N, exit 0.NEXT_ACTIONSпереписаны: явные плейсхолдеры типа номера (issue #Nдля bootstrap,PR #Nдля остальных), ISSUE-фаза при существующем PR — инструкция дописатьCloses #<issue>в body (без template=A), CI-NEXT —subagent_type=general, template=D+ логи через curl/actions/runs/{id}/jobs+/actions/jobs/{id}/logs, убрано упоминание_forgejo_run_view().merge-pr,pipeline-status.timeout: 480000(8 мин запас), текст ошибки без «60s»..opencode/tools/pipeline-status.ts:pr_numberопционален; вызов без аргумента → дашборд открытых issues (#N <title> — PR #M | —), заменивший таблицу открытых PR.Почему
PR #N не существует, exit 1), ломая bootstrap пайплайна — пайплайн стартует с номера issue, а PR ещё не создан.Watch out
state=open; дополнительный фильтрmergedна всякий случай).<issue>в тексте NEXT.Pending
Closes #74
Code Review Summary
Оракул
pipeline-statusтеперь принимает номер issue (детерминированная резолюция PR/issue/bootstrap/ambiguous/ghost), поддерживает bootstrap-вывод и дашборд открытых issues без аргумента. Изменения хорошо структурированы, покрыты ~370 строками новых тестов (все ветки резолюции, пагинация, исключение merged-PR, дашборд, no-arg путь tool'а), CI зелёный. PR body полный (4 heading'а), Watch out документирует edge cases, Pending — отложенную синхронизацию run-pipeline SKILL.md.Positives
GET /pulls/{N}→ 404 →GET /issues/{N}→ поиск открытых PR по Closes/Fixes/Resolves — ровно 1 → issue-путь, 0 → bootstrap, >1 → AMBIGUOUS, ни одного → ghost exit 1. Все ветки покрыты тестами.find_open_prs_for_issueсканирует до пустой страницы (без эвристики по размеру батча) — поведение Forgejo API учтено и задокументировано в Watch out.merge-pr,pipeline-status), CI-NEXT теперь ссылается на реальные API-эндпоинты (/actions/runs/{id}/jobs+/actions/jobs/{id}/logs) вместо невызываемой_forgejo_run_view().pr_exists,list_open_pr_numbers,format_table,format_pr_row) не имеют оставшихся readers —rgпо репо чист.pr_numberопционален, no-arg → дашборд;_ts_loader.mjsкорректно маппит NaN →{}.CI_WAIT_TIMEOUT=420↔ wrappertimeout: 480000(8 мин запас).Suggestions (info, not blocking)
_forgejo_issue_list— одностраничный запрос (limit=50без пагинации), тогда как_forgejo_pr_dispatchlist пагинирован. При >50 открытых issues дашборд обрежется. Для текущего репо (5 issues) неактуально, но стоит унифицировать.format_issues_dashboardделает N+1 API-сканов: для каждого issue вызываетсяfind_open_prs_for_issue(полный пейджинг всех открытых PR). При росте числа issues это O(issues × PR-страниц) запросов. Можно один раз собрать все открытые PR и матчить по issue.CLOSURE_RE.search(body)избыточен: еслиrefsнепуст, search заведомо совпадёт; если пуст —in refsи так False. Достаточноif int(issue_number) in refs.Verdict: APPROVE