#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).
89 lines
4.8 KiB
PowerShell
89 lines
4.8 KiB
PowerShell
# 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
|
||
}
|