Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Detect and set up account-locked gh aliases for multi-account GitHub. The AI reads this skill, detects accounts, asks the user which is personal/work, and runs the setup automatically.
.claude/skills/github-github-multi-account/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -2% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -41% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -25% | 0% |
When the user has multiple GitHub accounts (check with gh auth status). If you see 2+ accounts listed, this skill applies.
Run: gh auth status Look for multiple accounts. Note which usernames are listed.
Ask: "I see you have multiple GitHub accounts: {list them}. Which one is your personal account and which is your work/EMU account?"
Once the user confirms, do ALL of this for them:
powershell# 1. Define the functions $personal = "THEIR_PERSONAL_USERNAME" $work = "THEIR_WORK_USERNAME" # 2. Add to PowerShell profile $profilePath = $PROFILE.CurrentUserAllHosts if (!(Test-Path $profilePath)) { New-Item -Path $profilePath -Force | Out-Null } $existing = Get-Content $profilePath -Raw -ErrorAction SilentlyContinue if ($existing -notmatch "gh-personal") { $block = @" # === GitHub Multi-Account Aliases === function gh-personal { gh auth switch --user $personal 2>`$null | Out-Null; gh @args } function gh-work { gh auth switch --user $work 2>`$null | Out-Null; gh @args } Set-Alias ghp gh-personal Set-Alias ghw gh-work "@ Add-Content -Path $profilePath -Value $block } # 3. Create CMD wrappers $binDir = Join-Path $env:USERPROFILE ".squad\bin" if (!(Test-Path $binDir)) { New-Item -ItemType Directory -Path $binDir -Force | Out-Null } "@echo off`ngh auth switch --user $personal >nul 2>&1`ngh %*" | Out-File "$binDir\ghp.cmd" -Encoding ascii "@echo off`ngh auth switch --user $work >nul 2>&1`ngh %*" | Out-File "$binDir\ghw.cmd" -Encoding ascii # 4. Add to PATH $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") if ($userPath -notmatch [regex]::Escape($binDir)) { [Environment]::SetEnvironmentVariable("PATH", "$binDir;$userPath", "User") $env:PATH = "$binDir;$env:PATH" } # 5. Load in current session function gh-personal { gh auth switch --user $personal 2>$null | Out-Null; gh @args } function gh-work { gh auth switch --user $work 2>$null | Out-Null; gh @args } Set-Alias ghp gh-personal Set-Alias ghw gh-work
Run these and show the results:
powershellghp api user --jq '.login' # should show personal username ghw api user --jq '.login' # should show work username
"All set! From now on use ghp for personal repos and ghw for work repos. I'll use them too."
gh for repo operations — always ghp or ghwgh auth switch — the aliases handle itghp / gh-personalghw / gh-workThis repo (bradygaster/squad) is bound to the bradygaster (personal) account. All gh operations in this repo MUST use ghp / gh-personal.
At the TOP of any script touching GitHub, define:
powershellfunction gh-personal { gh auth switch --user bradygaster 2>$null | Out-Null; gh @args } function gh-work { gh auth switch --user bradyg_microsoft 2>$null | Out-Null; gh @args }
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 15,308 | 2,577 | -83% | 1 | 1 | 0% | 1,595 | 1,269 | -20% | 0 | 0 | — |
case-02 | fail→fail | 5,038 | 10,236 | +103% | 1 | 1 | 0% | 513 | 1,228 | +139% | 0 | 0 | — |
case-03 | fail→fail | 17,434 | 6,910 | -60% | 1 | 1 | 0% | 2,971 | 1,236 | -58% | 0 | 0 | — |
case-04 | pass→pass | 6,269 | 4,616 | -26% | 1 | 1 | 0% | 957 | 1,720 | +80% | 0 | 0 | — |
case-05 | pass→pass | 12,360 | 2,886 | -77% | 1 | 1 | 0% | 1,803 | 1,379 | -24% | 0 | 0 | — |
case-06 | fail→pass | 9,583 | 3,551 | -63% | 1 | 1 | 0% | 1,525 | 1,432 | -6% | 0 | 0 | — |
case-07 | pass→pass | 9,314 | 5,482 | -41% | 1 | 1 | 0% | 1,421 | 1,818 | +28% | 0 | 0 | — |
case-08 | fail→pass | 11,314 | 4,863 | -57% | 1 | 1 | 0% | 1,706 | 1,677 | -2% | 0 | 0 | — |
case-09 | fail→pass | 11,223 | 7,630 | -32% | 1 | 1 | 0% | 1,975 | 1,900 | -4% | 0 | 0 | — |
case-10 | pass→pass | 7,935 | 4,153 | -48% | 1 | 1 | 0% | 1,141 | 1,509 | +32% | 0 | 0 | — |
case-11 | pass→pass | 29,467 | 4,744 | -84% | 1 | 1 | 0% | 1,744 | 1,688 | -3% | 0 | 0 | — |
case-12 | pass→pass | 11,168 | 6,614 | -41% | 1 | 1 | 0% | 1,603 | 1,933 | +21% | 0 | 0 | — |
case-13 | pass→pass | 15,561 | 2,788 | -82% | 1 | 1 | 0% | 2,346 | 1,280 | -45% | 0 | 0 | — |
case-14 | fail→pass | 23,216 | 9,308 | -60% | 1 | 1 | 0% | 2,709 | 1,611 | -41% | 0 | 0 | — |
case-15 | fail→pass | 12,255 | 3,794 | -69% | 1 | 1 | 0% | 1,767 | 1,317 | -25% | 0 | 0 | — |
case-16 | fail→pass | 11,596 | 2,966 | -74% | 1 | 1 | 0% | 1,696 | 1,333 | -21% | 0 | 0 | — |
case-17 | pass→pass | 7,663 | 2,435 | -68% | 1 | 1 | 0% | 1,068 | 1,227 | +15% | 0 | 0 | — |
case-18 | fail→pass | 7,489 | 3,511 | -53% | 1 | 1 | 0% | 1,051 | 1,291 | +23% | 0 | 0 | — |
case-19 | pass→pass | 16,342 | 11,335 | -31% | 1 | 1 | 0% | 2,431 | 2,529 | +4% | 0 | 0 | — |
case-20 | fail→pass | 12,101 | 12,917 | +7% | 1 | 1 | 0% | 2,106 | 3,154 | +50% | 0 | 0 | — |
case-21 | pass→pass | 20,761 | 9,667 | -53% | 1 | 1 | 0% | 1,884 | 2,749 | +46% | 0 | 0 | — |
case-22 | pass→pass | 5,920 | 4,115 | -30% | 1 | 1 | 0% | 734 | 1,621 | +121% | 0 | 0 | — |
case-23 | pass→pass | 6,637 | 6,623 | -0% | 1 | 1 | 0% | 1,067 | 1,761 | +65% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 21 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +35 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.