mirror of
https://github.com/morluto/rea.git
synced 2026-11-11 01:13:39 +00:00
* fix(cli): refuse an unsupported Node.js release before linking The dispatcher imported the compiled runtime before checking the runtime range, so a release outside `engines.node` failed while linking a module that imports `createZstdDecompress`. Callers saw a module-linking stack trace from every command, including `--version` and `doctor`, instead of the refusal the installer and `engines` already promise. Check `engines.node` from the package read the dispatcher already performs, before the first compiled import. The helper has no imports of its own: the dispatcher must admit the runtime before any dependency can be resolved. Fixes #9296 * fix(cli): ship and align runtime admission * fix(ci): cover packaged runtime admission helper * test(cli): assert Node admission with structured range results Export satisfiesNodeRange and cover caret, minimum, union, and non-release versions. The dispatcher proves the compiled runtime never loads by the absence of its marker file, and compares stderr to the helper's own message. --------- Co-authored-by: 2SinceJuly <202121119+2SinceJuly@users.noreply.github.com> Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com>
64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
import { spawnSync } from "node:child_process";
|
|
import { access } from "node:fs/promises";
|
|
import { dirname, join } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
|
|
const pathExists = async (path) => {
|
|
try {
|
|
await access(path);
|
|
return true;
|
|
} catch (cause) {
|
|
if (
|
|
typeof cause === "object" &&
|
|
cause !== null &&
|
|
"code" in cause &&
|
|
cause.code === "ENOENT"
|
|
)
|
|
return false;
|
|
throw cause;
|
|
}
|
|
};
|
|
|
|
const run = (command, args) => {
|
|
const result = spawnSync(command, args, {
|
|
cwd: root,
|
|
encoding: "utf8",
|
|
maxBuffer: 4 * 1_024 * 1_024,
|
|
});
|
|
if (result.error !== undefined) throw result.error;
|
|
if (result.status !== 0) {
|
|
if (result.stdout.length > 0) process.stdout.write(result.stdout);
|
|
if (result.stderr.length > 0) process.stderr.write(result.stderr);
|
|
throw new Error(
|
|
`Prepack command failed with status ${String(result.status)}: ${command} ${args.join(" ")}`,
|
|
);
|
|
}
|
|
};
|
|
|
|
if (await pathExists(join(root, "src"))) {
|
|
const packageManagerPath = process.env.npm_execpath;
|
|
if (packageManagerPath === undefined)
|
|
throw new Error("Prepack could not resolve the active package manager");
|
|
run(process.execPath, [packageManagerPath, "run", "build:cached"]);
|
|
run(process.execPath, ["scripts/generate-skill-metadata.mjs", "--check"]);
|
|
} else {
|
|
for (const path of [
|
|
"scripts/lib/cli-process-environment.mjs",
|
|
"scripts/lib/runtime-admission.mjs",
|
|
"dist/main.js",
|
|
"dist/mcp/main.js",
|
|
"dist/cli-runtime/cli.js",
|
|
"dist/cli-runtime/cliOutput.js",
|
|
"dist/cli-runtime/cliBuiltinArguments.js",
|
|
"dist/cli-runtime/cliResultOutput.js",
|
|
"dist/cli-runtime/mcpDoctor.js",
|
|
"dist/mcpDoctor.js",
|
|
"dist/cli.js",
|
|
"dist/cliOutput.js",
|
|
"skills/reverse-engineer-anything/SKILL.md",
|
|
])
|
|
await access(join(root, path));
|
|
}
|