gendesign/.claude/commands/work-as-backend.md
lekss361 edc5823622 chore(bots): per-role launcher scripts + move bot pipeline to forgejo MCP
(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).
2026-05-30 10:38:10 +03:00

5 KiB
Raw Blame History

name description
work-as-backend Запустить окно как 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)

# 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 запускает цикл.