* feat(ai): add Cursor SDK agent support * fix(ai): harden Cursor SDK support * fix(ai): address Cursor SDK review findings * fix(ai): refresh Cursor environment handling * fix(ai): refresh Cursor discovery scans * fix(ai): enable Cursor recheck without path * Use official Cursor agent icon * Clarify Cursor SDK setup requirements * Split Cursor SDK setup status * Simplify Cursor settings copy * Improve Cursor API key error * Add safe Cursor auth diagnostics * Disable Cursor local sandbox by default * Show Cursor MCP tool names in tool cards * Add spacing inside tool call groups
77 lines
2.6 KiB
JavaScript
77 lines
2.6 KiB
JavaScript
const fs = require("node:fs");
|
|
const path = require("node:path");
|
|
const { execFileSync } = require("node:child_process");
|
|
|
|
const CURSOR_PLATFORM_PACKAGES = {
|
|
darwin: ["@cursor/sdk-darwin-arm64", "@cursor/sdk-darwin-x64"],
|
|
linux: ["@cursor/sdk-linux-arm64", "@cursor/sdk-linux-x64"],
|
|
win32: ["@cursor/sdk-win32-x64"],
|
|
};
|
|
|
|
function readJson(filePath) {
|
|
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
}
|
|
|
|
function getCursorSdkVersion(projectDir) {
|
|
const sdkPackagePath = path.join(projectDir, "node_modules", "@cursor", "sdk", "package.json");
|
|
if (fs.existsSync(sdkPackagePath)) {
|
|
return readJson(sdkPackagePath).version;
|
|
}
|
|
|
|
const lockPath = path.join(projectDir, "package-lock.json");
|
|
if (fs.existsSync(lockPath)) {
|
|
const lock = readJson(lockPath);
|
|
const lockedVersion = lock.packages?.["node_modules/@cursor/sdk"]?.version;
|
|
if (lockedVersion) return lockedVersion;
|
|
}
|
|
|
|
const packageJson = readJson(path.join(projectDir, "package.json"));
|
|
const spec = packageJson.optionalDependencies?.["@cursor/sdk"];
|
|
return typeof spec === "string" ? spec.replace(/^[^\d]*/, "") : null;
|
|
}
|
|
|
|
function npmExecutable() {
|
|
return process.platform === "win32" ? "npm.cmd" : "npm";
|
|
}
|
|
|
|
function ensureCursorSdkPlatformPackages({
|
|
projectDir,
|
|
platform,
|
|
run = execFileSync,
|
|
logger = console,
|
|
}) {
|
|
const packages = CURSOR_PLATFORM_PACKAGES[platform] || [];
|
|
if (packages.length === 0) return [];
|
|
|
|
const version = getCursorSdkVersion(projectDir);
|
|
if (!version) {
|
|
logger.warn("[beforePackCursorSdk] Cursor SDK version not found; skipping platform package install.");
|
|
return [];
|
|
}
|
|
|
|
const missingPackages = packages.filter((packageName) => (
|
|
!fs.existsSync(path.join(projectDir, "node_modules", ...packageName.split("/"), "package.json"))
|
|
));
|
|
if (missingPackages.length === 0) return [];
|
|
|
|
const packageSpecs = missingPackages.map((packageName) => `${packageName}@${version}`);
|
|
logger.log(`[beforePackCursorSdk] Installing Cursor SDK platform packages: ${packageSpecs.join(", ")}`);
|
|
run(npmExecutable(), ["install", "--no-save", "--force", "--ignore-scripts", ...packageSpecs], {
|
|
cwd: projectDir,
|
|
stdio: "inherit",
|
|
});
|
|
|
|
return missingPackages;
|
|
}
|
|
|
|
function beforePackCursorSdk(context = {}) {
|
|
const projectDir = context.appDir || process.cwd();
|
|
const platform = context.electronPlatformName || process.platform;
|
|
ensureCursorSdkPlatformPackages({ projectDir, platform });
|
|
}
|
|
|
|
module.exports = beforePackCursorSdk;
|
|
module.exports.default = beforePackCursorSdk;
|
|
module.exports.ensureCursorSdkPlatformPackages = ensureCursorSdkPlatformPackages;
|
|
module.exports.CURSOR_PLATFORM_PACKAGES = CURSOR_PLATFORM_PACKAGES;
|