matrixcloud / scripts /screenshots.mjs
github-actions[bot]
Deploy from 4dfd54f2
857a91b
Raw
History Blame Contribute Delete
2.16 kB
// Capture console screenshots for the docs/README.
//
// Usage (with a runtime already running, e.g. `make run`):
// npx --yes playwright@1.47 install chromium
// URL=http://localhost:8080 node scripts/screenshots.mjs
//
// It signs up a throwaway account via the API, injects the session token, then
// captures each console view into docs/assets/screenshots/*.png.
import { chromium } from "playwright";
import fs from "node:fs";
import path from "node:path";
const URL = process.env.URL || "http://localhost:8080";
const OUT = path.resolve("docs/assets/screenshots");
fs.mkdirSync(OUT, { recursive: true });
const views = [
["overview", "Overview"],
["runtimes", "Runtimes"],
["catalog", "Catalog"],
["sandboxes", "Sandboxes"],
["models", "Models"],
["agents", "Jobs"],
["policies", "Policies"],
["audit", "Audit"],
["settings", "Settings"],
["install", "Add a runtime"],
["matrixshell", "MatrixShell"],
];
async function token() {
const email = `shots+${Date.now()}@example.com`;
const r = await fetch(`${URL}/v1/auth/signup`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Maya Chen", email, password: "screenshots1" }),
});
if (!r.ok) throw new Error(`signup failed: ${r.status}`);
return (await r.json()).token;
}
const tok = await token();
const browser = await chromium.launch();
const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 }, deviceScaleFactor: 2 });
await ctx.addInitScript((t) => localStorage.setItem("matrixcloud_token", t), tok);
const page = await ctx.newPage();
for (const [route, label] of views) {
await page.goto(`${URL}/`, { waitUntil: "networkidle" });
// Click the matching nav item (or top action) by visible label.
const target = page.getByRole("button", { name: label, exact: false }).first();
try { await target.click({ timeout: 2000 }); } catch { /* overview is default */ }
await page.waitForTimeout(900);
const file = path.join(OUT, `${route}.png`);
await page.screenshot({ path: file });
console.log("captured", file);
}
await browser.close();
console.log(`\nDone → ${OUT}`);