Files
reverse-engineering-anything/scripts/generate-package-metadata.mjs
T

63 lines
2.4 KiB
JavaScript

import { readFile } from "node:fs/promises";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
import { ensureGeneratedFile } from "./lib/generated-file.mjs";
import { importVerifierSource } from "./lib/verifier-source-loader.mjs";
const { parseSkillManifestMetadata } = await importVerifierSource(
new URL("../src/domain/skillManifest.ts", import.meta.url).href,
import.meta.url,
);
const arguments_ = new Set(process.argv.slice(2));
for (const argument of arguments_)
if (argument !== "--check")
throw new Error(`Unknown package metadata option: ${argument}`);
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
const packageJson = JSON.parse(
await readFile(join(root, "package.json"), "utf8"),
);
const lock = JSON.parse(
await readFile(join(root, "package-lock.json"), "utf8"),
);
const pinnedNodeVersion = (await readFile(join(root, ".nvmrc"), "utf8")).trim();
if (
!/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/u.test(pinnedNodeVersion)
)
throw new Error(".nvmrc must pin an exact major.minor.patch Node.js version");
const skill = await readFile(
join(root, ".agents/skills/reverse-engineer-anything/SKILL.md"),
"utf8",
);
const skillMetadata = parseSkillManifestMetadata(skill);
if (!skillMetadata.ok) throw skillMetadata.error;
const skillVersion = skillMetadata.value.version;
if (skillVersion === null)
throw new Error("Missing reverse-engineer-anything skill metadata version");
const versionOf = (name) => {
const value = lock.packages?.[`node_modules/${name}`]?.version;
if (typeof value !== "string")
throw new Error(`Missing locked ${name} version`);
return value;
};
const source = `/** Generated by scripts/generate-package-metadata.mjs; do not edit. */
export const PACKAGE_METADATA = {
name: ${JSON.stringify(packageJson.name)},
version: ${JSON.stringify(packageJson.version)}, // x-release-please-version
pinnedNodeVersion: ${JSON.stringify(pinnedNodeVersion)},
serverSdkVersion: ${JSON.stringify(versionOf("@modelcontextprotocol/server"))},
clientSdkVersion: ${JSON.stringify(versionOf("@modelcontextprotocol/client"))},
coreSdkVersion: ${JSON.stringify(versionOf("@modelcontextprotocol/core"))},
skillVersion: ${JSON.stringify(skillVersion)},
} as const;
`;
const outputPath = join(root, "src/generatedPackageMetadata.ts");
await ensureGeneratedFile({
path: outputPath,
source,
check: arguments_.has("--check"),
generateCommand: "npm run metadata:generate",
});