gendesign/_wt-cadval/scripts/start-bot.ps1
bot-backend 542ff1c9ca docs(tradein/domclick): два комментария описывали пул, которого нет с миграции 253
Оба места утверждали, что у Домклика один выделенный резидентный прокси и
пула нет. Это перестало быть правдой ещё в #2800 (миграция 253 сняла
резервацию узла), но текст остался — и именно на него опирался тикет #3189,
поставленный под «калибровку» ограничения, которого не существует.
Свип к тому же ходит через пул давно (serp.py:359), а бэкфилл подключён к
нему в PR #3222.

Заодно докстринг называл не тот ограничитель: свип кладёт не счётчик
провалов lease, а break по первому DomClickBlockedError (#2854) — до
ротации дело не доходит ни при каком счётчике, отсюда buckets_completed=0.

Только комментарии, поведение не меняется. Миграция 175 уже применена, а
_schema_migrations трекает по имени файла без checksum — правка текста
её не перезапустит.
2026-08-29 18:57:25 +03:00

89 lines
4.9 KiB
PowerShell
Raw 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.

# 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-<role> -> /loop.
#
# Требует: scripts/setup-bot-env.ps1 уже выполнен (FORGEJO_TOKEN_<ROLE>, *_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/<role>.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"