import { spawn } from "node:child_process"; import { createInterface } from "node:readline"; export async function readLine(): Promise { if (!process.stdin.isTTY) { const chunks: Buffer[] = []; for await (const chunk of process.stdin) { chunks.push(Buffer.from(chunk)); } return Buffer.concat(chunks).toString("utf8").trim(); } const rl = createInterface({ input: process.stdin, output: process.stderr }); return new Promise((resolve) => { rl.once("line", (line) => { rl.close(); resolve(line.trim()); }); }); } export async function openInBrowser(url: string): Promise { const platform = process.platform; const cmd = platform === "darwin" ? ["open", url] : platform === "win32" ? ["cmd", "/c", "start", "", url] : ["xdg-open", url]; await new Promise((resolve, reject) => { const child = spawn(cmd[0]!, cmd.slice(1), { stdio: "ignore" }); child.on("error", reject); child.on("close", (code) => { if (code === 0) resolve(); else reject(new Error(`open browser exited with code ${code}`)); }); }); }