@mickdarling/dollhousemcp
Version:
DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.
97 lines • 12.7 kB
JavaScript
/**
* Version comparison and parsing utilities
*/
/**
* Compare two semantic versions
* @returns -1 if version1 < version2, 0 if equal, 1 if version1 > version2
*/
export function compareVersions(version1, version2) {
// Normalize versions by removing 'v' prefix
const v1 = version1.replace(/^v/, '');
const v2 = version2.replace(/^v/, '');
// Split version and pre-release parts
const [v1main, v1pre] = v1.split('-');
const [v2main, v2pre] = v2.split('-');
// Compare main version parts (x.y.z)
const v1parts = v1main.split('.').map(part => parseInt(part) || 0);
const v2parts = v2main.split('.').map(part => parseInt(part) || 0);
const maxLength = Math.max(v1parts.length, v2parts.length);
for (let i = 0; i < maxLength; i++) {
const v1part = v1parts[i] || 0;
const v2part = v2parts[i] || 0;
if (v1part < v2part)
return -1;
if (v1part > v2part)
return 1;
}
// If main versions are equal, compare pre-release versions
// Version without pre-release is greater than version with pre-release
if (!v1pre && v2pre)
return 1; // 1.0.0 > 1.0.0-beta
if (v1pre && !v2pre)
return -1; // 1.0.0-beta < 1.0.0
if (!v1pre && !v2pre)
return 0; // 1.0.0 == 1.0.0
// Both have pre-release, compare lexicographically
return v1pre.localeCompare(v2pre);
}
/**
* Parse version from command output
*/
export function parseVersionFromOutput(output, tool) {
// Git version output: "git version 2.39.2"
// npm version output: "8.19.2" or JSON with version info
if (tool === 'git') {
const match = output.match(/git version (\d+\.\d+\.\d+)/);
return match ? match[1] : null;
}
else if (tool === 'npm') {
// npm might return just the version number or JSON
const cleanOutput = output.trim();
if (cleanOutput.match(/^\d+\.\d+\.\d+/)) {
return cleanOutput.split('\n')[0]; // First line if multiple lines
}
// Try to parse as JSON if it looks like JSON
try {
const parsed = JSON.parse(cleanOutput);
return parsed.npm || parsed.version || null;
}
catch {
// If not JSON, try to extract version pattern
const match = cleanOutput.match(/(\d+\.\d+\.\d+)/);
return match ? match[1] : null;
}
}
return null;
}
/**
* Validate dependency version against requirements
*/
export function validateDependencyVersion(actualVersion, requirements, toolName) {
const minComparison = compareVersions(actualVersion, requirements.minimum);
const maxComparison = compareVersions(actualVersion, requirements.maximum);
// Check minimum version requirement
if (minComparison < 0) {
return {
valid: false,
error: `${toolName} version ${actualVersion} is below minimum required version ${requirements.minimum}`
};
}
// Check maximum version requirement
if (maxComparison > 0) {
return {
valid: false,
error: `${toolName} version ${actualVersion} is above maximum tested version ${requirements.maximum}`
};
}
// Check if it's the recommended version
const recComparison = compareVersions(actualVersion, requirements.recommended);
if (recComparison !== 0) {
return {
valid: true,
warning: `${toolName} version ${actualVersion} works but ${requirements.recommended} is recommended for optimal stability`
};
}
return { valid: true };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO0lBQ2hFLDRDQUE0QztJQUM1QyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV0QyxzQ0FBc0M7SUFDdEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV0QyxxQ0FBcUM7SUFDckMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFbkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMs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QUN0QixPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUs7WUFDWixLQUFLLEVBQUUsR0FBRyxRQUFRLFlBQVksYUFBYSxvQ0FBb0MsWUFBWSxDQUFDLE9BQU8sRUFBRTtTQUN0RyxDQUFDO0lBQ0osQ0FBQztJQUVELHdDQUF3QztJQUN4QyxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRSxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUk7WUFDWCxPQUFPLEVBQUUsR0FBRyxRQUFRLFlBQVksYUFBYSxjQUFjLFlBQVksQ0FBQyxXQUFXLHVDQUF1QztTQUMzSCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmVyc2lvbiBjb21wYXJpc29uIGFuZCBwYXJzaW5nIHV0aWxpdGllc1xuICovXG5cbi8qKlxuICogQ29tcGFyZSB0d28gc2VtYW50aWMgdmVyc2lvbnNcbiAqIEByZXR1cm5zIC0xIGlmIHZlcnNpb24xIDwgdmVyc2lvbjIsIDAgaWYgZXF1YWwsIDEgaWYgdmVyc2lvbjEgPiB2ZXJzaW9uMlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKHZlcnNpb24xOiBzdHJpbmcsIHZlcnNpb24yOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBOb3JtYWxpemUgdmVyc2lvbnMgYnkgcmVtb3ZpbmcgJ3YnIHByZWZpeFxuICBjb25zdCB2MSA9IHZlcnNpb24xLnJlcGxhY2UoL152LywgJycpO1xuICBjb25zdCB2MiA9IHZlcnNpb24yLnJlcGxhY2UoL152LywgJycpO1xuICBcbiAgLy8gU3BsaXQgdmVyc2lvbiBhbmQgcHJlLXJlbGVhc2UgcGFydHNcbiAgY29uc3QgW3YxbWFpbiwgdjFwcmVdID0gdjEuc3BsaXQoJy0nKTtcbiAgY29uc3QgW3YybWFpbiwgdjJwcmVdID0gdjIuc3BsaXQoJy0nKTtcbiAgXG4gIC8vIENvbXBhcmUgbWFpbiB2ZXJzaW9uIHBhcnRzICh4LnkueilcbiAgY29uc3QgdjFwYXJ0cyA9IHYxbWFpbi5zcGxpdCgnLicpLm1hcChwYXJ0ID0+IHBhcnNlSW50KHBhcnQpIHx8IDApO1xuICBjb25zdCB2MnBhcnRzID0gdjJtYWluLnNwbGl0KCcuJykubWFwKHBhcnQgPT4gcGFyc2VJbnQocGFydCkgfHwgMCk7XG4gIFxuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCh2MXBhcnRzLmxlbmd0aCwgdjJwYXJ0cy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1heExlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdjFwYXJ0ID0gdjFwYXJ0c1tpXSB8fCAwO1xuICAgIGNvbnN0IHYycGFydCA9IHYycGFydHNbaV0gfHwgMDtcbiAgICBcbiAgICBpZiAodjFwYXJ0IDwgdjJwYXJ0KSByZXR1cm4gLTE7XG4gICAgaWYgKHYxcGFydCA+IHYycGFydCkgcmV0dXJuIDE7XG4gIH1cbiAgXG4gIC8vIElmIG1haW4gdmVyc2lvbnMgYXJlIGVxdWFsLCBjb21wYXJlIHByZS1yZWxlYXNlIHZlcnNpb25zXG4gIC8vIFZlcnNpb24gd2l0aG91dCBwcmUtcmVsZWFzZSBpcyBncmVhdGVyIHRoYW4gdmVyc2lvbiB3aXRoIHByZS1yZWxlYXNlXG4gIGlmICghdjFwcmUgJiYgdjJwcmUpIHJldHVybiAxOyAgIC8vIDEuMC4wID4gMS4wLjAtYmV0YVxuICBpZiAodjFwcmUgJiYgIXYycHJlKSByZXR1cm4gLTE7ICAvLyAxLjAuMC1iZXRhIDwgMS4wLjBcbiAgaWYgKCF2MXByZSAmJiAhdjJwcmUpIHJldHVybiAwOyAgLy8gMS4wLjAgPT0gMS4wLjBcbiAgXG4gIC8vIEJvdGggaGF2ZSBwcmUtcmVsZWFzZSwgY29tcGFyZSBsZXhpY29ncmFwaGljYWxseVxuICByZXR1cm4gdjFwcmUubG9jYWxlQ29tcGFyZSh2MnByZSk7XG59XG5cbi8qKlxuICogUGFyc2UgdmVyc2lvbiBmcm9tIGNvbW1hbmQgb3V0cHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlcnNpb25Gcm9tT3V0cHV0KG91dHB1dDogc3RyaW5nLCB0b29sOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gR2l0IHZlcnNpb24gb3V0cHV0OiBcImdpdCB2ZXJzaW9uIDIuMzkuMlwiXG4gIC8vIG5wbSB2ZXJzaW9uIG91dHB1dDogXCI4LjE5LjJcIiBvciBKU09OIHdpdGggdmVyc2lvbiBpbmZvXG4gIFxuICBpZiAodG9vbCA9PT0gJ2dpdCcpIHtcbiAgICBjb25zdCBtYXRjaCA9IG91dHB1dC5tYXRjaCgvZ2l0IHZlcnNpb24gKFxcZCtcXC5cXGQrXFwuXFxkKykvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gIH0gZWxzZSBpZiAodG9vbCA9PT0gJ25wbScpIHtcbiAgICAvLyBucG0gbWlnaHQgcmV0dXJuIGp1c3QgdGhlIHZlcnNpb24gbnVtYmVyIG9yIEpTT05cbiAgICBjb25zdCBjbGVhbk91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gICAgaWYgKGNsZWFuT3V0cHV0Lm1hdGNoKC9eXFxkK1xcLlxcZCtcXC5cXGQrLykpIHtcbiAgICAgIHJldHVybiBjbGVhbk91dHB1dC5zcGxpdCgnXFxuJylbMF07IC8vIEZpcnN0IGxpbmUgaWYgbXVsdGlwbGUgbGluZXNcbiAgICB9XG4gICAgLy8gVHJ5IHRvIHBhcnNlIGFzIEpTT04gaWYgaXQgbG9va3MgbGlrZSBKU09OXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2xlYW5PdXRwdXQpO1xuICAgICAgcmV0dXJuIHBhcnNlZC5ucG0gfHwgcGFyc2VkLnZlcnNpb24gfHwgbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElmIG5vdCBKU09OLCB0cnkgdG8gZXh0cmFjdCB2ZXJzaW9uIHBhdHRlcm5cbiAgICAgIGNvbnN0IG1hdGNoID0gY2xlYW5PdXRwdXQubWF0Y2goLyhcXGQrXFwuXFxkK1xcLlxcZCspLyk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXBlbmRlbmN5IHZlcnNpb24gYWdhaW5zdCByZXF1aXJlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVwZW5kZW5jeVZlcnNpb24oXG4gIGFjdHVhbFZlcnNpb246IHN0cmluZywgXG4gIHJlcXVpcmVtZW50czogeyBtaW5pbXVtOiBzdHJpbmc7IG1heGltdW06IHN0cmluZzsgcmVjb21tZW5kZWQ6IHN0cmluZyB9LFxuICB0b29sTmFtZTogc3RyaW5nXG4pOiB7IHZhbGlkOiBib29sZWFuOyB3YXJuaW5nPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgY29uc3QgbWluQ29tcGFyaXNvbiA9IGNvbXBhcmVWZXJzaW9ucyhhY3R1YWxWZXJzaW9uLCByZXF1aXJlbWVudHMubWluaW11bSk7XG4gIGNvbnN0IG1heENvbXBhcmlzb24gPSBjb21wYXJlVmVyc2lvbnMoYWN0dWFsVmVyc2lvbiwgcmVxdWlyZW1lbnRzLm1heGltdW0pO1xuICBcbiAgLy8gQ2hlY2sgbWluaW11bSB2ZXJzaW9uIHJlcXVpcmVtZW50XG4gIGlmIChtaW5Db21wYXJpc29uIDwgMCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcjogYCR7dG9vbE5hbWV9IHZlcnNpb24gJHthY3R1YWxWZXJzaW9ufSBpcyBiZWxvdyBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gJHtyZXF1aXJlbWVudHMubWluaW11bX1gXG4gICAgfTtcbiAgfVxuICBcbiAgLy8gQ2hlY2sgbWF4aW11bSB2ZXJzaW9uIHJlcXVpcmVtZW50XG4gIGlmIChtYXhDb21wYXJpc29uID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcjogYCR7dG9vbE5hbWV9IHZlcnNpb24gJHthY3R1YWxWZXJzaW9ufSBpcyBhYm92ZSBtYXhpbXVtIHRlc3RlZCB2ZXJzaW9uICR7cmVxdWlyZW1lbnRzLm1heGltdW19YFxuICAgIH07XG4gIH1cbiAgXG4gIC8vIENoZWNrIGlmIGl0J3MgdGhlIHJlY29tbWVuZGVkIHZlcnNpb25cbiAgY29uc3QgcmVjQ29tcGFyaXNvbiA9IGNvbXBhcmVWZXJzaW9ucyhhY3R1YWxWZXJzaW9uLCByZXF1aXJlbWVudHMucmVjb21tZW5kZWQpO1xuICBpZiAocmVjQ29tcGFyaXNvbiAhPT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgIHdhcm5pbmc6IGAke3Rvb2xOYW1lfSB2ZXJzaW9uICR7YWN0dWFsVmVyc2lvbn0gd29ya3MgYnV0ICR7cmVxdWlyZW1lbnRzLnJlY29tbWVuZGVkfSBpcyByZWNvbW1lbmRlZCBmb3Igb3B0aW1hbCBzdGFiaWxpdHlgXG4gICAgfTtcbiAgfVxuICBcbiAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbn0iXX0=