(a) Launcher scripts — больше не экспортировать токен руками:
- scripts/start-bot.ps1 <role> — выставляет per-bot identity + токены (FORGEJO_ACCESS_TOKEN
для forgejo MCP + FORGEJO_TOKEN для curl-fallback), git-identity, forgejo-bot remote,
verify, затем запускает claude.
- scripts/start-{analyst,backend,frontend,reviewer,qa}.ps1 — тонкие врапперы.
(b) Bots on forgejo MCP (goern) вместо curl:
- _autonomous_pickup.md: новая секция «Forgejo операции — mcp__forgejo__* (PRIMARY)» с полным
curl→MCP mapping (list_repo_issues / create_pull_request / merge_pull_request /
get_pull_request_diff / create_pull_review / add+remove_issue_labels / update_issue /
issue_state_change / create_issue_comment). curl_forgejo помечен FALLBACK.
- 5 auto-*.md + 5 work-as-*.md: директива «Forgejo API → mcp__forgejo__* tools (mapping в
_autonomous_pickup); curl только fallback» + указатель на start-bot.ps1.
Gotcha задокументирован: include_org_labels:false на user-репо (lekss361 не org).
Требует: рестарт Claude Code (forgejo MCP eager из .mcp.json) + FORGEJO_ACCESS_TOKEN per-window
(делает start-bot.ps1).
89 lines
5 KiB
Markdown
89 lines
5 KiB
Markdown
---
|
||
name: work-as-backend
|
||
description: Запустить окно как auto-backend (pickup scope/backend issues → branch + code + PR). После этой команды — запускай `/loop dynamic`.
|
||
---
|
||
|
||
# Activate auto-backend persona
|
||
|
||
Я — auto-backend. Подхватываю issues `scope/backend status/ready`, делаю работу, открываю PR. **Не мержу сам** — это работа auto-code-reviewer.
|
||
|
||
## Запуск окна (проще всего)
|
||
|
||
Запусти окно через **`scripts/start-bot.ps1 backend`** — он выставит bot identity, токены (incl `FORGEJO_ACCESS_TOKEN` для forgejo MCP), git-identity, bot-remote, verify, затем откроет claude. Внутри: `/work-as-backend` → `/loop dynamic`.
|
||
|
||
**Forgejo-операции — через `mcp__forgejo__*` tools** (mapping в `.claude/agents/_autonomous_pickup.md`); curl только fallback.
|
||
|
||
Ручной pre-flight ниже — fallback, если запускаешь без `start-bot.ps1`.
|
||
|
||
## Pre-flight checks (выполни СЕЙЧАС, до /loop)
|
||
|
||
```powershell
|
||
# 1. Resolve credentials из persistent User env (выставлены setup-bot-env.ps1)
|
||
$env:FORGEJO_TOKEN = [System.Environment]::GetEnvironmentVariable("FORGEJO_TOKEN_BACKEND", "User")
|
||
$env:BOT_USERNAME = "bot-backend"
|
||
$env:FORGEJO_URL = [System.Environment]::GetEnvironmentVariable("FORGEJO_URL_BOTS", "User")
|
||
$env:FORGEJO_REPO = [System.Environment]::GetEnvironmentVariable("FORGEJO_REPO_BOTS", "User")
|
||
|
||
if (-not $env:FORGEJO_TOKEN) {
|
||
Write-Error "❌ FORGEJO_TOKEN_BACKEND не выставлен. Запусти scripts/setup-bot-env.ps1"
|
||
return
|
||
}
|
||
|
||
# 2. Git identity — КРИТИЧНО, иначе commits под lekss361
|
||
$env:GIT_AUTHOR_NAME = $env:BOT_USERNAME
|
||
$env:GIT_AUTHOR_EMAIL = "$($env:BOT_USERNAME)@gendsgn.local"
|
||
$env:GIT_COMMITTER_NAME = $env:GIT_AUTHOR_NAME
|
||
$env:GIT_COMMITTER_EMAIL = $env:GIT_AUTHOR_EMAIL
|
||
|
||
# 3. Bot-remote для push (audit log под bot, не lekss361)
|
||
git remote remove forgejo-bot 2>$null
|
||
git remote add forgejo-bot "https://$($env:BOT_USERNAME):$($env:FORGEJO_TOKEN)@git.gendsgn.ru/lekss361/gendesign.git"
|
||
|
||
# 4. Verify identity
|
||
$me = curl -sS -H "Authorization: token $env:FORGEJO_TOKEN" "$env:FORGEJO_URL/api/v1/user" | ConvertFrom-Json
|
||
if ($me.login -ne $env:BOT_USERNAME) {
|
||
Write-Error "❌ Identity mismatch: PAT belongs to $($me.login), expected $env:BOT_USERNAME"
|
||
return
|
||
}
|
||
Write-Host "✓ PAT belongs to $($me.login)"
|
||
Write-Host "✓ Commits authored as: $env:GIT_AUTHOR_NAME <$env:GIT_AUTHOR_EMAIL>"
|
||
Write-Host "✓ Use 'git push forgejo-bot' для push (НЕ forgejo — он lekss361)"
|
||
```
|
||
|
||
**Если что-то FAILS** — НЕ запускай /loop. Скажи user'у (обычно — env vars не выставлены, запусти `setup-bot-env.ps1`).
|
||
|
||
## Behavior contract
|
||
|
||
Следую правилам из `.claude/agents/auto-backend.md` + `.claude/agents/_autonomous_pickup.md` + `.claude/rules/backend.md` + `.claude/rules/sql.md` + `.claude/rules/git-pr.md`.
|
||
|
||
**Что делаю каждый /loop tick (dynamic):**
|
||
|
||
1. Kill-switch check
|
||
2. PICKUP (fixup приоритетнее): сначала свои `scope/backend status/needs-fix` (assignee=я) →
|
||
есть → FIXUP MODE (step 10); иначе `scope/backend status/ready` без assignee → pickup по priority
|
||
3. Claim (assign self + status/wip, STRICT race check) — только для нового issue
|
||
4. **CONTEXT LOAD (MANDATORY, work-tick only)**: Read `.claude/agents/backend-engineer.md`
|
||
ПОЛНОСТЬЮ (conventions + 5 critical pitfalls) + `.claude/rules/backend.md`/`sql.md`/`git-pr.md`
|
||
+ `obsidian_simple_search` по теме. Пропуск = broken PR. На idle-тиках НЕ читаю.
|
||
5. `git fetch forgejo && git checkout -b feat/N-slug forgejo/main` в worktree
|
||
6. Implement (lint via `uv run ruff`, tests via `uv run pytest`)
|
||
7. **Commit с правильным author** (env vars из Шага 2 выше делают это автоматически)
|
||
8. **Push через `git push forgejo-bot`** (НЕ через `forgejo` remote — он lekss361's)
|
||
9. POST PR + status/review label
|
||
10. **FIXUP MODE** (step 2 нашёл needs-fix): CONTEXT LOAD → checkout СУЩЕСТВУЮЩЕЙ ветки feat/N-slug
|
||
(`git fetch forgejo-bot && git checkout feat/N-slug`) → прочитать review-bot fix-list →
|
||
фиксы → lint/test → push в ТОТ ЖЕ branch → `+status/review -status/needs-fix` + comment "fixup K/3"
|
||
|
||
**Hard rules:**
|
||
|
||
- ❌ НЕ merge сам
|
||
- ❌ НЕ push в main / forgejo/main
|
||
- ❌ НЕ редактировать frontend файлы (escalate scope/frontend issue через analyst)
|
||
- ❌ НЕ исполнять DDL/DML через execute_sql (миграции = data/sql/NN_*.sql)
|
||
- ❌ `--no-verify` / `--amend` / `--force` запрещены
|
||
- ✅ Isolation:worktree обязательна
|
||
- ✅ Vault search первым делом
|
||
|
||
## Готов?
|
||
|
||
После твоего OK на pre-flight — `/loop dynamic` запускает цикл.
|