opencode-config/.opencode/skills/run-pipeline/SKILL.md
Sergey 1d35c5ed1c
refactor(pipeline): update templates and agent prompts for 6-phase (#209)
* refactor(run-pipeline): drop Template B and handoff refs for 6-phase

* refactor(agents): switch reviewer and memory-syncer to PR body

* refactor(docs): update pipeline to 6 phases and drop DOCS refs

* fix(docs): update RU pipeline row and memory-syncer description

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 04:02:03 +03:00

156 lines
No EOL
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: run-pipeline
description: Autonomous PR pipeline executor. Delegates 6 phases to subagents, does not improvise order, does not merge on red CI. Also when user says "запусти пайплайн", "pipeline", "run pipeline".
---
# Run Pipeline
Автономная процедура-loop для проведения PR через 6 фаз. Source of truth для
порядка и действий — `pipeline-status` tool. NEXT action из tool явно
указывает `subagent_type` + `template` (кроме MERGE — `merge-pr` tool).
## ПРОТОКОЛ (ЖЁСТКО)
Каждая итерация (БЕЗ ИСКЛЮЧЕНИЙ):
1. Вызови tool `pipeline-status({pr_number: M})` — вернёт статус всех фаз + строку `NEXT: <action>`.
2. Если вывод содержит `Status: COMPLETE` → финальный репорт пользователю, exit.
3. Если вывод содержит `AMBIGUOUS` → репорт пользователю с причиной, STOP.
4. Иначе — исполни action из строки `NEXT:` (используй prompt templates A, C, D, E, F ниже).
5. 1 строка прогресса пользователю (формат: `✅ <phase> — <action executed>`).
6. Re-loop (шаг 1).
### ЗАПРЕЩЕНО
- ЛЮБОЙ action БЕЗ предшествующего вызова `pipeline-status` = protocol violation.
- Импровизировать порядок. Решать сам какой subagent запускать — читай `NEXT:`.
- Пропускать вызов `pipeline-status`, даже если «кажется, что фаза уже ✅» — скрипт решает.
- Делать bash `sleep` для ожидания CI — `pipeline-status` сам блокирует до 5 мин (polling Actions API внутри `check_ci`). Один вызов → финальный статус.
- Merge при CI ❌ (transitive guard в скрипте).
- Передавать `--admin` flag в `merge-pr` (или raw `gh pr merge`) — никогда.
- Параллелить subagents (последовательно: action → `pipeline-status` → next action).
### Остановы
- Subagent error → 1 retry, потом STOP + report пользователю.
- `AMBIGUOUS` в выводе `pipeline-status` → STOP + report.
- 5 итераций подряд без прогресса (та же фаза ❌) → STOP + report.
## Prompt templates
### Template A (implement_issue)
```
Реализуй issue #N в текущем репо (working directory = корень репо).
1. Checkout new branch `type/scope/kebab-description` от master.
2. Реализуй по спеке issue (точно, без отклонений). Если спека содержит ошибки,
зафикь и продолжай — не додумывай.
3. Коммиты через `commit({ message: "type(scope): description" })` tool (НЕ
raw `git commit` — заблокирован deny). Формат: ≤72 chars, English, no
period, no body unless necessary. Минимум 3-4 логических коммита.
Перед КАЖДЫМ `commit` — `git status` для проверки staged set. `commit`
tool НЕ делает `git add` — коммитит только уже staged файлы. Используй
`git add <конкретные-пути>`, НЕ `git add -A` (иначе лишние файлы уйдут в
коммит). Если в индексе лишнее (например `memory-save` stage'нул всё
через `git add -A`) — не коммить: сначала `git restore --staged <file>`.
4. Push ветку (`git push -u origin HEAD`), затем создай PR через tool:
`create-pr({ title: "type(scope): description", body: "## Что сделано\n...\n\n## Почему\n...\n\n## Watch out\n...\n\n## Pending\n...\n\nCloses #N", issue_number: N })`.
PR body ОБЯЗАТЕЛЬНО содержит 4 heading'а: `## Что сделано`, `## Почему`,
`## Watch out`, `## Pending`. Заполни осмысленно (для Watch out/Pending
можно `—` если реально нет контента).
5. Верни PR номер M.
Если найдёшь баг вне scope текущей задачи — загрузи skill `bug-discovery` через `skill("bug-discovery")` и следуй протоколу. НЕ чини баг сам. Сообщи оркестратору: "Created issue #N: ...".
```
### Template C (code_review)
```
Review PR#M в текущем репо.
1. `gh pr view M --json headRefName,body,title`.
2. `git diff origin/HEAD...HEAD`.
3. Load project skills: `find .opencode/skills/ -name "SKILL.md"`, грузи каждый
через `skill("<name>")`.
4. Проверь: code quality, architecture, error handling, security, testing,
duplication, project-specific rules, PR hygiene.
5. Оставь review через tool `post-review` (НЕ `gh pr review --approve` —
GitHub блокирует self-approve; НЕ raw bash-вызов `gh`) — tool гарантирует
heading `## Code Review Summary` + verdict-enum которые парсит
`pipeline-status.py`:
`post-review({ pr_number: M, verdict: "APPROVE|REQUEST_CHANGES|NEEDS_DISCUSSION", body: "..." })`.
Tool добавляет heading + verdict line автоматически — НЕ форматируй их
вручную. Если tool вернул строку начинающуюся с `⚠️ ...failed` — СООБЩИ
оркестратору о сбое и STOP (не fallback на raw bash).
6. НЕ МЕРДЖИТЬ — merge делает основной агент через run-pipeline.
Если найдёшь баг вне scope текущей задачи — загрузи skill `bug-discovery` через `skill("bug-discovery")` и следуй протоколу. НЕ чини баг сам. Сообщи оркестратору: "Created issue #N: ...".
```
### Template D (fix_ci)
```
CI упал на PR#M. Чтобы получить <run-id>: `gh run list --branch <headRefName> --limit 1 --json databaseId,conclusion`.
Log: `gh run view <run-id> --log-failed` output:
<log>
1. `gh pr checkout M`.
2. Проанализируй log, найди причину.
3. Исправь (минимальные изменения, whitespace/formatting/logic fix).
4. Перед коммитом — `git status` для проверки staged set (`commit` tool НЕ
делает `git add` — коммитит только staged; используй
`git add <конкретные-пути>`, НЕ `git add -A`). Коммит через
`commit({ message: "fix(ci): <description>" })` tool (НЕ raw
`git commit`), push.
5. Не трогай логику unrelated файлов.
Если найдёшь баг вне scope текущей задачи — загрузи skill `bug-discovery` через `skill("bug-discovery")` и следуй протоколу. НЕ чини баг сам. Сообщи оркестратору: "Created issue #N: ...".
```
### Template E (memory_sync)
```
Дистиллируй PR#M в memory file
`<memory_dir>/repos/{host}/{org}/{repo}.md`
(default `~/.local/share/opencode/opencode-memory`, override через `OPENCODE_MEMORY_DIR`;
`{host}/{org}/{repo}` вычисли через
`git remote get-url origin` — см. `memory-syncer.md:38`).
1. Прочитай PR body через `gh pr view M --json body,title` (+ `gh issue view`
для контекста issue, если PR ссылается на issue). Текущее состояние — уже
смерженный default branch (checkout/pull НЕ нужны, запрещены permission
set'ом memory-syncer'а).
2. Найди durable gotchas (не статусы, не "сейчас делаем"). Паттерны, указатели,
non-obvious API quirks. Источник: PR body `## Watch out` (gotchas) +
`## Pending` (follow-ups) + diff (`git diff` текущего state vs parent).
3. Добавь записи формата `- [YYYY-MM-DD, PR#M] <summary>` в конец файла
(секция "Handoff digest").
4. Квитанция ВСЕГДА (даже если durable нет): `- [date, PR#M] — (нет durable-записей)`.
5. `memory-save` для commit + reindex + push.
6. Проверь `git status` основного репо — если staged что-то в memory dir,
репорт пользователю (guard от случайного коммита в master).
Если найдёшь баг вне scope текущей задачи — загрузи skill `bug-discovery` через `skill("bug-discovery")` и следуй протоколу. НЕ чини баг сам. Сообщи оркестратору: "Created issue #N: ...".
```
### Template F (merge)
MERGE phase — main agent вызывает tool напрямую (НЕ subagent, НЕ raw bash).
`pipeline-status` сам решает, можно ли мержить (CI gate внутри скрипта —
transitive guard). После `NEXT: ...merge-pr...` → один вызов:
```
merge-pr({ pr_number: M })
```
Если вернулась `⚠️ merge-pr failed ...` → репорт пользователю, STOP (НЕ retry
через raw bash — это нарушит orchestrator-контракт). Если `PR #M merged
successfully ...` → 1 строка прогресса и re-loop (`pipeline-status` покажет
`Status: COMPLETE` или перейдёт на MEMORY phase — 6-я фаза).
## API Restrictions
Использовать только Actions API (`pipeline-status`, `gh run list`, `gh run view`, `gh api repos/.../actions/runs`). **Запрещено** `gh pr checks` и `gh pr view --json statusCheckRollup` — 403 на fine-grained PAT (scope `Checks: read` не существует).
## Rules
- `pipeline-status` — единственный source of truth для порядка шагов и действий.
- Скрипт read-only (только `gh api`/`gh pr view`, без мутаций).
- После каждой фазы → 1 строка прогресса юзеру.
- Если subagent error → 1 retry, потом STOP + report пользователю.
- `merge-pr({ pr_number: M })` tool — единственный способ мержить PR (без
`--admin`, без raw bash). См. Template F.
- Если reviewer вердикт `REQUEST_CHANGES` → dispatch subagent (general) с prompt "fix reviewer comments: <list>", commit, push → re-loop (`pipeline-status` проверит CI автоматически).