Derive exported Docker image versions from .nvmrc through generated package metadata. Align active setup translations with patched Node release floors and verify actual CLI exports, real Docker/agentenv, package and website workflows. Eight built-test shards pass; three unrelated managed source failures reproduce on clean main and remain tracked in #6650. Refs #6480 Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
55 lines
2.1 KiB
JavaScript
55 lines
2.1 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";
|
|
|
|
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 skillVersion = /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(skill)?.[1];
|
|
if (skillVersion === undefined)
|
|
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",
|
|
});
|