gendesign/scripts/setup-bot-env.ps1
lekss361 297eb29d65 feat(claude): env-vars refactor + stale-claim cron (Phase 2 finalization)
#11: slash-commands и _autonomous_pickup.md теперь читают persistent User-scope
env vars напрямую (FORGEJO_TOKEN_<ROLE>) вместо file-based из ~/.claude/secrets/.

Один раз: scripts/setup-bot-env.ps1 (запускается user'ом локально, кладёт
токены из vault в Windows User registry). После этого окна grab credentials
через [System.Environment]::GetEnvironmentVariable() — никаких файлов.

Все 5 work-as-*.md обновлены (analyst/backend/frontend/reviewer/qa).

#12: stale-claim cleanup — cron каждые 30 минут.

- scripts/cleanup-stale-claims.sh — bash, parses Forgejo API + Python для JSON
- .forgejo/workflows/stale-claims.yml — cron schedule `*/30 * * * *`

Освобождает issues застрявшие в status/wip >4h:
  - assignees=[]
  - +status/ready -status/wip
  - comment "stale claim released, worker likely crashed"

Использует secret FORGEJO_BOT_QA_TOKEN (минимум прав = write:issue).

Setup: secret нужно завести в Forgejo Actions UI после merge —
git.gendsgn.ru/lekss361/gendesign/-/settings/actions/secrets.

Refs: PRs #608, #609. Closes TODO с PR #608 (stale-claim cron).
2026-05-28 00:24:45 +03:00

89 lines
4.8 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.

# setup-bot-env.ps1
# Set Windows User-scope env vars для autonomous multi-agent workflow.
#
# Запускается ОДИН РАЗ на каждой машине пользователя. Не нужен admin.
# Effect: 7 User-scope env vars persistent в registry.
#
# Где взять токены:
# 1. Vault meta/00_credentials.md (sensitive, не в git) — секция "Forgejo bot-users"
# 2. Или сгенерировать новые: см. там же секция "Rotation / revocation"
#
# Безопасность:
# - Скрипт ожидает чтобы ты ВПИСАЛ tokens сам перед запуском (placeholder ниже)
# - НЕ коммить скрипт с реальными токенами!
# - После запуска env vars в registry — можешь удалить локальную копию
# ──────────────────────────────────────────────────────────────────────
# REPLACE PLACEHOLDERS BELOW WITH ACTUAL TOKENS FROM VAULT
# ──────────────────────────────────────────────────────────────────────
$tokens = @{
"FORGEJO_TOKEN_ANALYST" = "REPLACE_ME_FROM_VAULT"
"FORGEJO_TOKEN_BACKEND" = "REPLACE_ME_FROM_VAULT"
"FORGEJO_TOKEN_FRONTEND" = "REPLACE_ME_FROM_VAULT"
"FORGEJO_TOKEN_REVIEWER" = "REPLACE_ME_FROM_VAULT"
"FORGEJO_TOKEN_QA" = "REPLACE_ME_FROM_VAULT"
"FORGEJO_URL_BOTS" = "https://git.gendsgn.ru"
"FORGEJO_REPO_BOTS" = "lekss361/gendesign"
}
# ──────────────────────────────────────────────────────────────────────
# Validation
# ──────────────────────────────────────────────────────────────────────
$placeholderCount = ($tokens.Values | Where-Object { $_ -eq "REPLACE_ME_FROM_VAULT" }).Count
if ($placeholderCount -gt 0) {
Write-Error "$placeholderCount placeholders не заменены. Открой vault meta/00_credentials.md, секция 'Forgejo bot-users', и вставь реальные PAT'ы вместо REPLACE_ME_FROM_VAULT."
exit 1
}
# ──────────────────────────────────────────────────────────────────────
# Apply
# ──────────────────────────────────────────────────────────────────────
Write-Host "=== Setting 7 User-scope env vars (persistent) ===" -ForegroundColor Cyan
foreach ($k in $tokens.Keys) {
[System.Environment]::SetEnvironmentVariable($k, $tokens[$k], "User")
Set-Item -Path "env:$k" -Value $tokens[$k]
if ($k -like "FORGEJO_TOKEN_*") {
$suffix = $tokens[$k].Substring($tokens[$k].Length - 4)
Write-Host " $k = ****$suffix"
} else {
Write-Host " $k = $($tokens[$k])"
}
}
# ──────────────────────────────────────────────────────────────────────
# Verify
# ──────────────────────────────────────────────────────────────────────
Write-Host ""
Write-Host "=== Verify (read back from User scope) ===" -ForegroundColor Cyan
$allOK = $true
foreach ($k in $tokens.Keys) {
$stored = [System.Environment]::GetEnvironmentVariable($k, "User")
if ($stored -eq $tokens[$k]) {
Write-Host " $k`: OK (len=$($stored.Length))"
} else {
Write-Host " $k`: MISMATCH (stored len=$($stored.Length))" -ForegroundColor Red
$allOK = $false
}
}
Write-Host ""
if ($allOK) {
Write-Host "✓ All 7 env vars set successfully." -ForegroundColor Green
Write-Host ""
Write-Host "Запуск окна:"
Write-Host " claude"
Write-Host " # в чате:"
Write-Host " /work-as-backend # любая из 5: analyst/backend/frontend/reviewer/qa"
Write-Host " # pre-flight выполнится сам через env vars"
Write-Host " /loop dynamic # или другой cadence"
} else {
Write-Host "✗ Some env vars failed to set." -ForegroundColor Red
exit 1
}