import { execFileSync } from "node:child_process"; import { existsSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; const defaultRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const disabledBrowserPackages = new Set([ "agentos-sidecar-browser", "agentos-native-sidecar-browser", ]); function readCargoMetadata(root) { const stdout = execFileSync( "cargo", ["metadata", "--format-version", "1", "--no-deps"], { cwd: root, encoding: "utf8", }, ); return JSON.parse(stdout); } /** * Resolve Cargo's default workspace selection into package names. Browser * sources remain workspace members for explicit maintenance, but must not * enter the native formatting gate while browser support is disabled. */ export function defaultRustfmtPackages(metadata) { if (!Array.isArray(metadata.workspace_default_members)) { throw new Error("Cargo metadata is missing workspace_default_members"); } if (!Array.isArray(metadata.packages)) { throw new Error("Cargo metadata is missing packages"); } const packagesById = new Map( metadata.packages.map((pkg) => [pkg.id, pkg.name]), ); const names = metadata.workspace_default_members.map((id) => { const name = packagesById.get(id); if (!name) { throw new Error(`Cargo default workspace member is unknown: ${id}`); } return name; }); const disabled = names.filter((name) => disabledBrowserPackages.has(name)); if (disabled.length > 0) { throw new Error( `disabled browser packages must not be Cargo default members: ${disabled.join(", ")}`, ); } if (names.length === 0) { throw new Error("Cargo default workspace member list is empty"); } return [...new Set(names)].sort((left, right) => left.localeCompare(right)); } export function rustfmtCheckArgs(metadata) { return [ "fmt", "--check", ...defaultRustfmtPackages(metadata).flatMap((name) => ["--package", name]), ]; } function parseArgs(argv) { let root = defaultRoot; for (let index = 0; index < argv.length; index += 1) { const arg = argv[index]; if (arg === "--root") { const value = argv[++index]; if (!value) throw new Error("--root requires a path"); root = value; continue; } if (arg.startsWith("--root=")) { root = arg.slice("--root=".length); continue; } throw new Error(`unknown argument: ${arg}`); } return { root: resolve(root) }; } export function main(argv = process.argv.slice(2)) { const { root } = parseArgs(argv); if (!existsSync(resolve(root, "Cargo.toml"))) { throw new Error(`Cargo.toml not found under ${root}`); } const metadata = readCargoMetadata(root); execFileSync("cargo", rustfmtCheckArgs(metadata), { cwd: root, stdio: "inherit", }); console.log( `Rust formatting ok (${defaultRustfmtPackages(metadata).length} non-browser packages)`, ); } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { main(); }