UNPKG

@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
/** * 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==