Something went wrong. Try again.
A collaborative coding-agent orchestrator for atproto radl.app
Something went wrong. Try again.
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869import { spawn } from 'node:child_process'
export type GitHubAuthRunner = ( command: string, args: string[], options?: { interactive?: boolean },) => Promise<{ code: number; stdout: string; stderr: string }>
const nodeRunner: GitHubAuthRunner = (command, args, options) => new Promise((resolve, reject) => { const child = spawn(command, args, options?.interactive ? ({ stdio: 'inherit' } as never) : undefined) let stdout = '' let stderr = '' child.stdout?.on('data', (chunk: Uint8Array) => { stdout += new TextDecoder().decode(chunk) }) child.stderr?.on('data', (chunk: Uint8Array) => { stderr += new TextDecoder().decode(chunk) }) child.on('error', reject) child.on('close', (code: number | null) => resolve({ code: code ?? 1, stdout, stderr })) })
/** Resolves GitHub possession without ever writing a token to config or command arguments. */export async function resolveGitHubToken( env: Record<string, string | undefined> = process.env, runner: GitHubAuthRunner = nodeRunner,): Promise<string | undefined> { if (env.GH_TOKEN) return env.GH_TOKEN if (env.GITHUB_TOKEN) return env.GITHUB_TOKEN try { const result = await runner('gh', ['auth', 'token', '-h', 'github.com']) return result.code === 0 && result.stdout.trim() ? result.stdout.trim() : undefined } catch (error: unknown) { if ((error as { code?: string })?.code === 'ENOENT') return undefined throw error }}
export async function ensureGitHubAuth( options: { env?: Record<string, string | undefined> runner?: GitHubAuthRunner skip?: boolean } = {},): Promise<string | undefined> { const env = options.env ?? process.env const runner = options.runner ?? nodeRunner const existing = await resolveGitHubToken(env, runner) if (existing || options.skip) return existing let login try { login = await runner( 'gh', ['auth', 'login', '--hostname', 'github.com', '--git-protocol', 'https', '--web'], { interactive: true }, ) } catch (error: unknown) { if ((error as { code?: string })?.code === 'ENOENT') { throw new Error('GitHub CLI (gh) is required; install it from https://cli.github.com/') } throw error } if (login.code !== 0) throw new Error('GitHub login failed') const token = await resolveGitHubToken(env, runner) if (!token) throw new Error('GitHub login completed but gh did not provide a token') return token}