@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.
132 lines • 15.8 kB
JavaScript
/**
* Check and validate system dependencies
*/
import { safeExec } from '../utils/git.js';
import { DEPENDENCY_REQUIREMENTS } from '../config/constants.js';
export class DependencyChecker {
versionManager;
constructor(versionManager) {
this.versionManager = versionManager;
}
/**
* Check all system dependencies
*/
async checkDependencies() {
const [gitStatus, npmStatus] = await Promise.all([
this.checkGit(),
this.checkNpm()
]);
return {
git: gitStatus,
npm: npmStatus
};
}
/**
* Check Git installation and version
*/
async checkGit() {
try {
const { stdout: gitOutput } = await safeExec('git', ['--version']);
const gitVersion = this.versionManager.parseVersionFromOutput(gitOutput, 'git');
if (!gitVersion) {
return {
installed: true,
error: 'Could not parse Git version from output'
};
}
const validation = this.versionManager.validateDependencyVersion(gitVersion, DEPENDENCY_REQUIREMENTS.git, 'Git');
return {
installed: true,
version: gitVersion,
valid: validation.valid,
error: validation.error,
warning: validation.warning
};
}
catch (error) {
return {
installed: false,
error: 'Git is not installed or not accessible in PATH'
};
}
}
/**
* Check npm installation and version
*/
async checkNpm() {
try {
const { stdout: npmOutput } = await safeExec('npm', ['--version']);
const npmVersion = this.versionManager.parseVersionFromOutput(npmOutput, 'npm');
if (!npmVersion) {
return {
installed: true,
error: 'Could not parse npm version from output'
};
}
const validation = this.versionManager.validateDependencyVersion(npmVersion, DEPENDENCY_REQUIREMENTS.npm, 'npm');
return {
installed: true,
version: npmVersion,
valid: validation.valid,
error: validation.error,
warning: validation.warning
};
}
catch (error) {
return {
installed: false,
error: 'npm is not installed or not accessible in PATH'
};
}
}
/**
* Format dependency status for display
*/
formatDependencyStatus(status) {
const lines = ['**Dependency Check Results:**\n'];
// Git status
lines.push('**Git:**');
if (!status.git.installed) {
lines.push(`❌ ${status.git.error}`);
}
else if (status.git.error) {
lines.push(`❌ Version ${status.git.version || 'unknown'} - ${status.git.error}`);
}
else if (status.git.warning) {
lines.push(`⚠️ Version ${status.git.version} - ${status.git.warning}`);
}
else {
lines.push(`✅ Version ${status.git.version} - OK`);
}
lines.push('');
// npm status
lines.push('**npm:**');
if (!status.npm.installed) {
lines.push(`❌ ${status.npm.error}`);
}
else if (status.npm.error) {
lines.push(`❌ Version ${status.npm.version || 'unknown'} - ${status.npm.error}`);
}
else if (status.npm.warning) {
lines.push(`⚠️ Version ${status.npm.version} - ${status.npm.warning}`);
}
else {
lines.push(`✅ Version ${status.npm.version} - OK`);
}
// Overall status
const hasErrors = status.git.error || status.npm.error;
const hasWarnings = status.git.warning || status.npm.warning;
lines.push('\n**Overall Status:**');
if (hasErrors) {
lines.push('❌ Some dependencies do not meet requirements. Update may fail.');
}
else if (hasWarnings) {
lines.push('⚠️ All dependencies work but some are not at recommended versions.');
}
else {
lines.push('✅ All dependencies meet requirements!');
}
return lines.join('\n');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwZW5kZW5jeUNoZWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXBkYXRlL0RlcGVuZGVuY3lDaGVja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBbUJqRSxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLGNBQWMsQ0FBaUI7SUFFdkMsWUFBWSxjQUE4QjtRQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxFQUFFO1NBQ2hCLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxTQUFTO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxRQUFRO1FBQ3BCLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVoRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU87b0JBQ0wsU0FBUyxFQUFFLElBQUk7b0JBQ2YsS0FBSyxFQUFFLHlDQUF5QztpQkFDakQsQ0FBQztZQUNKLENBQUM7WUFF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QUksV0FBVyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1FBQ25GLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVjayBhbmQgdmFsaWRhdGUgc3lzdGVtIGRlcGVuZGVuY2llc1xuICovXG5cbmltcG9ydCB7IHNhZmVFeGVjIH0gZnJvbSAnLi4vdXRpbHMvZ2l0LmpzJztcbmltcG9ydCB7IFZlcnNpb25NYW5hZ2VyIH0gZnJvbSAnLi9WZXJzaW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBERVBFTkRFTkNZX1JFUVVJUkVNRU5UUyB9IGZyb20gJy4uL2NvbmZpZy9jb25zdGFudHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY3lTdGF0dXMge1xuICBnaXQ6IHtcbiAgICBpbnN0YWxsZWQ6IGJvb2xlYW47XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICB2YWxpZD86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgd2FybmluZz86IHN0cmluZztcbiAgfTtcbiAgbnBtOiB7XG4gICAgaW5zdGFsbGVkOiBib29sZWFuO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgdmFsaWQ/OiBib29sZWFuO1xuICAgIGVycm9yPzogc3RyaW5nO1xuICAgIHdhcm5pbmc/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBEZXBlbmRlbmN5Q2hlY2tlciB7XG4gIHByaXZhdGUgdmVyc2lvbk1hbmFnZXI6IFZlcnNpb25NYW5hZ2VyO1xuICBcbiAgY29uc3RydWN0b3IodmVyc2lvbk1hbmFnZXI6IFZlcnNpb25NYW5hZ2VyKSB7XG4gICAgdGhpcy52ZXJzaW9uTWFuYWdlciA9IHZlcnNpb25NYW5hZ2VyO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgYWxsIHN5c3RlbSBkZXBlbmRlbmNpZXNcbiAgICovXG4gIGFzeW5jIGNoZWNrRGVwZW5kZW5jaWVzKCk6IFByb21pc2U8RGVwZW5kZW5jeVN0YXR1cz4ge1xuICAgIGNvbnN0IFtnaXRTdGF0dXMsIG5wbVN0YXR1c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLmNoZWNrR2l0KCksXG4gICAgICB0aGlzLmNoZWNrTnBtKClcbiAgICBdKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgZ2l0OiBnaXRTdGF0dXMsXG4gICAgICBucG06IG5wbVN0YXR1c1xuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBHaXQgaW5zdGFsbGF0aW9uIGFuZCB2ZXJzaW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrR2l0KCk6IFByb21pc2U8RGVwZW5kZW5jeVN0YXR1c1snZ2l0J10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBzdGRvdXQ6IGdpdE91dHB1dCB9ID0gYXdhaXQgc2FmZUV4ZWMoJ2dpdCcsIFsnLS12ZXJzaW9uJ10pO1xuICAgICAgY29uc3QgZ2l0VmVyc2lvbiA9IHRoaXMudmVyc2lvbk1hbmFnZXIucGFyc2VWZXJzaW9uRnJvbU91dHB1dChnaXRPdXRwdXQsICdnaXQnKTtcbiAgICAgIFxuICAgICAgaWYgKCFnaXRWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5zdGFsbGVkOiB0cnVlLFxuICAgICAgICAgIGVycm9yOiAnQ291bGQgbm90IHBhcnNlIEdpdCB2ZXJzaW9uIGZyb20gb3V0cHV0J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52ZXJzaW9uTWFuYWdlci52YWxpZGF0ZURlcGVuZGVuY3lWZXJzaW9uKFxuICAgICAgICBnaXRWZXJzaW9uLCBcbiAgICAgICAgREVQRU5ERU5DWV9SRVFVSVJFTUVOVFMuZ2l0LFxuICAgICAgICAnR2l0J1xuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFsbGVkOiB0cnVlLFxuICAgICAgICB2ZXJzaW9uOiBnaXRWZXJzaW9uLFxuICAgICAgICB2YWxpZDogdmFsaWRhdGlvbi52YWxpZCxcbiAgICAgICAgZXJyb3I6IHZhbGlkYXRpb24uZXJyb3IsXG4gICAgICAgIHdhcm5pbmc6IHZhbGlkYXRpb24ud2FybmluZ1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFsbGVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdHaXQgaXMgbm90IGluc3RhbGxlZCBvciBub3QgYWNjZXNzaWJsZSBpbiBQQVRIJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBucG0gaW5zdGFsbGF0aW9uIGFuZCB2ZXJzaW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrTnBtKCk6IFByb21pc2U8RGVwZW5kZW5jeVN0YXR1c1snbnBtJ10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBzdGRvdXQ6IG5wbU91dHB1dCB9ID0gYXdhaXQgc2FmZUV4ZWMoJ25wbScsIFsnLS12ZXJzaW9uJ10pO1xuICAgICAgY29uc3QgbnBtVmVyc2lvbiA9IHRoaXMudmVyc2lvbk1hbmFnZXIucGFyc2VWZXJzaW9uRnJvbU91dHB1dChucG1PdXRwdXQsICducG0nKTtcbiAgICAgIFxuICAgICAgaWYgKCFucG1WZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5zdGFsbGVkOiB0cnVlLFxuICAgICAgICAgIGVycm9yOiAnQ291bGQgbm90IHBhcnNlIG5wbSB2ZXJzaW9uIGZyb20gb3V0cHV0J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52ZXJzaW9uTWFuYWdlci52YWxpZGF0ZURlcGVuZGVuY3lWZXJzaW9uKFxuICAgICAgICBucG1WZXJzaW9uLCBcbiAgICAgICAgREVQRU5ERU5DWV9SRVFVSVJFTUVOVFMubnBtLFxuICAgICAgICAnbnBtJ1xuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFsbGVkOiB0cnVlLFxuICAgICAgICB2ZXJzaW9uOiBucG1WZXJzaW9uLFxuICAgICAgICB2YWxpZDogdmFsaWRhdGlvbi52YWxpZCxcbiAgICAgICAgZXJyb3I6IHZhbGlkYXRpb24uZXJyb3IsXG4gICAgICAgIHdhcm5pbmc6IHZhbGlkYXRpb24ud2FybmluZ1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFsbGVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICducG0gaXMgbm90IGluc3RhbGxlZCBvciBub3QgYWNjZXNzaWJsZSBpbiBQQVRIJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgZGVwZW5kZW5jeSBzdGF0dXMgZm9yIGRpc3BsYXlcbiAgICovXG4gIGZvcm1hdERlcGVuZGVuY3lTdGF0dXMoc3RhdHVzOiBEZXBlbmRlbmN5U3RhdHVzKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJyoqRGVwZW5kZW5jeSBDaGVjayBSZXN1bHRzOioqXFxuJ107XG4gICAgXG4gICAgLy8gR2l0IHN0YXR1c1xuICAgIGxpbmVzLnB1c2goJyoqR2l0OioqJyk7XG4gICAgaWYgKCFzdGF0dXMuZ2l0Lmluc3RhbGxlZCkge1xuICAgICAgbGluZXMucHVzaChg4p2MICR7c3RhdHVzLmdpdC5lcnJvcn1gKTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5naXQuZXJyb3IpIHtcbiAgICAgIGxpbmVzLnB1c2goYOKdjCBWZXJzaW9uICR7c3RhdHVzLmdpdC52ZXJzaW9uIHx8ICd1bmtub3duJ30gLSAke3N0YXR1cy5naXQuZXJyb3J9YCk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMuZ2l0Lndhcm5pbmcpIHtcbiAgICAgIGxpbmVzLnB1c2goYOKaoO+4jyBWZXJzaW9uICR7c3RhdHVzLmdpdC52ZXJzaW9ufSAtICR7c3RhdHVzLmdpdC53YXJuaW5nfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKGDinIUgVmVyc2lvbiAke3N0YXR1cy5naXQudmVyc2lvbn0gLSBPS2ApO1xuICAgIH1cbiAgICBcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBcbiAgICAvLyBucG0gc3RhdHVzXG4gICAgbGluZXMucHVzaCgnKipucG06KionKTtcbiAgICBpZiAoIXN0YXR1cy5ucG0uaW5zdGFsbGVkKSB7XG4gICAgICBsaW5lcy5wdXNoKGDinYwgJHtzdGF0dXMubnBtLmVycm9yfWApO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzLm5wbS5lcnJvcikge1xuICAgICAgbGluZXMucHVzaChg4p2MIFZlcnNpb24gJHtzdGF0dXMubnBtLnZlcnNpb24gfHwgJ3Vua25vd24nfSAtICR7c3RhdHVzLm5wbS5lcnJvcn1gKTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5ucG0ud2FybmluZykge1xuICAgICAgbGluZXMucHVzaChg4pqg77iPIFZlcnNpb24gJHtzdGF0dXMubnBtLnZlcnNpb259IC0gJHtzdGF0dXMubnBtLndhcm5pbmd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goYOKchSBWZXJzaW9uICR7c3RhdHVzLm5wbS52ZXJzaW9ufSAtIE9LYCk7XG4gICAgfVxuICAgIFxuICAgIC8vIE92ZXJhbGwgc3RhdHVzXG4gICAgY29uc3QgaGFzRXJyb3JzID0gc3RhdHVzLmdpdC5lcnJvciB8fCBzdGF0dXMubnBtLmVycm9yO1xuICAgIGNvbnN0IGhhc1dhcm5pbmdzID0gc3RhdHVzLmdpdC53YXJuaW5nIHx8IHN0YXR1cy5ucG0ud2FybmluZztcbiAgICBcbiAgICBsaW5lcy5wdXNoKCdcXG4qKk92ZXJhbGwgU3RhdHVzOioqJyk7XG4gICAgaWYgKGhhc0Vycm9ycykge1xuICAgICAgbGluZXMucHVzaCgn4p2MIFNvbWUgZGVwZW5kZW5jaWVzIGRvIG5vdCBtZWV0IHJlcXVpcmVtZW50cy4gVXBkYXRlIG1heSBmYWlsLicpO1xuICAgIH0gZWxzZSBpZiAoaGFzV2FybmluZ3MpIHtcbiAgICAgIGxpbmVzLnB1c2goJ+KaoO+4jyBBbGwgZGVwZW5kZW5jaWVzIHdvcmsgYnV0IHNvbWUgYXJlIG5vdCBhdCByZWNvbW1lbmRlZCB2ZXJzaW9ucy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaCgn4pyFIEFsbCBkZXBlbmRlbmNpZXMgbWVldCByZXF1aXJlbWVudHMhJyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxufSJdfQ==