# Launch a Claude Code window pre-configured as a GenDesign autonomous bot. # # Usage: .\scripts\start-bot.ps1 reviewer # roles: analyst | backend | frontend | reviewer | qa # # Выставляет per-bot identity + токены (для forgejo MCP И curl-fallback), bot-remote, # verify, затем запускает `claude`. Внутри окна: /work-as- -> /loop. # # Требует: scripts/setup-bot-env.ps1 уже выполнен (FORGEJO_TOKEN_, *_BOTS в User env). param( [Parameter(Mandatory = $true)] [ValidateSet('analyst', 'backend', 'frontend', 'reviewer', 'qa')] [string]$Role ) $ErrorActionPreference = 'Stop' $roleUp = $Role.ToUpper() $bot = "bot-$Role" $token = [Environment]::GetEnvironmentVariable("FORGEJO_TOKEN_$roleUp", "User") if (-not $token) { Write-Error "FORGEJO_TOKEN_$roleUp не выставлен в User env. Запусти scripts/setup-bot-env.ps1 сначала." return } $url = [Environment]::GetEnvironmentVariable("FORGEJO_URL_BOTS", "User") $repo = [Environment]::GetEnvironmentVariable("FORGEJO_REPO_BOTS", "User") # forgejo MCP (goern) читает FORGEJO_ACCESS_TOKEN — MCP-процесс наследует его при старте claude. $env:FORGEJO_ACCESS_TOKEN = $token # curl-fallback + in-session pre-flight $env:FORGEJO_TOKEN = $token $env:BOT_USERNAME = $bot $env:FORGEJO_URL = $url $env:FORGEJO_REPO = $repo # Авто-компакция: ужимать контекст на 60% ёмкости (default ~95%) — 8h+ loop-окна копят # MCP-результаты (forgejo/playwright/postgres) в контекст; раннее срабатывание держит per-request # контекст меньше → меньше расход weekly-квоты. Подними/опусти, если нужно иначе. # Переопредели per-window: задай $env:CLAUDE_AUTOCOMPACT_PCT_OVERRIDE до запуска скрипта. if (-not $env:CLAUDE_AUTOCOMPACT_PCT_OVERRIDE) { $env:CLAUDE_AUTOCOMPACT_PCT_OVERRIDE = '60' } # git identity — иначе commit author = lekss361 $env:GIT_AUTHOR_NAME = $bot $env:GIT_AUTHOR_EMAIL = "$bot@gendsgn.local" $env:GIT_COMMITTER_NAME = $bot $env:GIT_COMMITTER_EMAIL = "$bot@gendsgn.local" # bot-remote для push audit-log (токен в URL — только локально) git remote remove forgejo-bot 2>$null | Out-Null git remote add forgejo-bot "https://$($bot):$token@git.gendsgn.ru/lekss361/gendesign.git" # verify: PAT принадлежит ожидаемому боту $me = (curl.exe -sS -H "Authorization: token $token" "$url/api/v1/user" | ConvertFrom-Json).login if ($me -ne $bot) { Write-Error "Identity mismatch: PAT принадлежит '$me', ожидался '$bot'. Проверь FORGEJO_TOKEN_$roleUp." return } # MCP-секреты для per-role конфига (.claude/mcp/.json через ${VAR}-подстановку). # Единый источник — существующий ~/.claude.json; в role-файлах секретов НЕТ. $claudeJson = Join-Path $env:USERPROFILE ".claude.json" if (Test-Path $claudeJson) { $ms = (Get-Content $claudeJson -Raw | ConvertFrom-Json).mcpServers if ($ms.obsidian) { $env:OBSIDIAN_API_KEY = $ms.obsidian.env.OBSIDIAN_API_KEY } if ($ms.'postgres-gendesign') { $env:GENDESIGN_DB_URI = $ms.'postgres-gendesign'.env.DATABASE_URI } if ($ms.'postgres-tradein') { $env:TRADEIN_DB_URI = $ms.'postgres-tradein'.env.DATABASE_URI } if ($ms.glitchtip) { $env:GLITCHTIP_TOKEN = $ms.glitchtip.env.GLITCHTIP_TOKEN } } # fallback: obsidian-ключ может жить в project .mcp.json if (-not $env:OBSIDIAN_API_KEY -and (Test-Path "$PSScriptRoot\..\.mcp.json")) { $env:OBSIDIAN_API_KEY = (Get-Content "$PSScriptRoot\..\.mcp.json" -Raw | ConvertFrom-Json).mcpServers.obsidian.env.OBSIDIAN_API_KEY } $mcpConfig = (Resolve-Path "$PSScriptRoot\..\.claude\mcp\$Role.json").Path # Модель per-role: reviewer на Opus (merge-authority — нужен сильный reasoning на verdict), # остальные loop-роли на Sonnet (pickup+code+PR+smoke; дешевле по weekly-квоте, отдельный пул). # Subagent'ы наследуют модель сессии, если в их frontmatter не задан model: override. $model = if ($Role -eq 'reviewer') { 'opus' } else { 'sonnet' } Write-Host "OK bot=$bot" -ForegroundColor Green Write-Host "OK identity + tokens + forgejo-bot remote" -ForegroundColor Green Write-Host "OK per-role MCP (--strict-mcp-config): $mcpConfig" -ForegroundColor Green Write-Host "OK model: $model" -ForegroundColor Green Write-Host "" Write-Host "В окне Claude ($model): /work-as-$Role -> затем /loop" -ForegroundColor Cyan # --strict-mcp-config: грузим ТОЛЬКО серверы этой роли (игнорируем .mcp.json + ~/.claude.json) claude --model $model --strict-mcp-config --mcp-config "$mcpConfig"