// Probe each bot token: identity, repo permission, and refusals. Prints statuses only. import fs from "node:fs"; import os from "node:os"; const BASE = "https://git.mosaicstack.dev/api/v1"; const S = `${os.homedir()}/.config/mosaic-dev/secrets/mosaic-stack`; const roles = process.argv.slice(2).length ? process.argv.slice(2) : ["pm", "cto", "coder", "reviewer"]; for (const r of roles) { const tok = fs.readFileSync(`${S}/${r}-gitea.token`, "utf8"); const h = { Authorization: `token ${tok}`, Accept: "application/json" }; const get = async (p) => { const res = await fetch(`${BASE}/${p}`, { headers: h }); let j = null; try { j = await res.json(); } catch {} return { s: res.status, j }; }; const me = await get("user"); const repo = await get("repos/mosaicstack/stack"); const issue = await get("repos/mosaicstack/stack/issues?limit=1"); const admin = await get("admin/users?limit=1"); const org = await get("orgs/mosaicstack/repos?limit=50"); const p = repo.j?.permissions || {}; console.log(`${r}: user=${me.s} login=${me.j?.login} admin=${me.j?.is_admin} | repo=${repo.s} push=${p.push} admin=${p.admin} pull=${p.pull} | issues=${issue.s} | admin/users=${admin.s} | org repos=${org.s} n=${Array.isArray(org.j) ? org.j.length : "-"}`); }