gendesign/scripts/start-bot.ps1
lekss361 2df8f78747 chore(bots): per-window MCP isolation via --strict-mcp-config
Каждое bot-окно грузит ТОЛЬКО нужные роли серверы (не все 7+ в каждом окне).
Выигрыш: не спавнить heavy-серверы зря (docker postgres в frontend/qa), right-size
eager-набор, чистый tool-surface на роль. (Контекст tool-search и так бережёт —
deferred ≈ бесплатно; это про процессы + eager + ясность.)

- .claude/mcp/{analyst,backend,frontend,reviewer,qa}.json — self-contained per-role
  конфиги. Секреты НЕ инлайнятся: ${OBSIDIAN_API_KEY}/${GENDESIGN_DB_URI}/
  ${GLITCHTIP_TOKEN} через env-подстановку (.mcp.json env expansion, подтв. в доках).
  Матрица: forgejo+obsidian+context7 eager везде; pg-gendesign eager у backend/reviewer,
  deferred у analyst; UI (playwright/a11y/lighthouse/shadcn) только frontend/qa; fetch+
  glitchtip у backend; glitchtip у qa.
- start-bot.ps1: извлекает MCP-секреты из ~/.claude.json (единый источник) → export →
  запускает `claude --strict-mcp-config --mcp-config .claude/mcp/<role>.json`.

Main/интерактивное окно (без start-bot.ps1) по-прежнему видит полный .mcp.json+user.
2026-05-30 11:05:24 +03:00

75 lines
3.7 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
# 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.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
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 ""
Write-Host "В окне Claude (Opus 4.8 для reviewer): /work-as-$Role -> затем /loop" -ForegroundColor Cyan
# --strict-mcp-config: грузим ТОЛЬКО серверы этой роли (игнорируем .mcp.json + ~/.claude.json)
claude --strict-mcp-config --mcp-config "$mcpConfig"