UNPKG

@dollhousemcp/mcp-server

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.

67 lines 9.23 kB
/** * Server startup utilities including migration */ import { PortfolioManager, ElementType } from '../portfolio/PortfolioManager.js'; import { MigrationManager } from '../portfolio/MigrationManager.js'; import { logger } from '../utils/logger.js'; export class ServerStartup { portfolioManager; migrationManager; constructor() { this.portfolioManager = PortfolioManager.getInstance(); this.migrationManager = new MigrationManager(this.portfolioManager); } /** * Initialize server with migration check */ async initialize(options = {}) { logger.info('[ServerStartup] Initializing server...'); // Check if migration is needed if (!options.skipMigration) { const needsMigration = await this.migrationManager.needsMigration(); if (needsMigration) { logger.info('[ServerStartup] Legacy personas detected. Starting migration...'); const result = await this.migrationManager.migrate({ backup: options.autoBackup !== false // Default to true }); if (result.success) { logger.info(`[ServerStartup] Successfully migrated ${result.migratedCount} personas`); if (result.backedUp && result.backupPath) { logger.info(`[ServerStartup] Backup created at: ${result.backupPath}`); } } else { logger.error('[ServerStartup] Migration completed with errors:'); result.errors.forEach(err => logger.error(`[ServerStartup] - ${err}`)); } } } // Ensure portfolio structure exists const portfolioExists = await this.portfolioManager.exists(); if (!portfolioExists) { logger.info('[ServerStartup] Creating portfolio directory structure...'); await this.portfolioManager.initialize(); } // Log portfolio statistics const stats = await this.portfolioManager.getStatistics(); logger.info('[ServerStartup] Portfolio statistics:'); Object.entries(stats).forEach(([type, count]) => { if (count > 0) { logger.info(`[ServerStartup] - ${type}: ${count} elements`); } }); } /** * Get migration status without performing migration */ async getMigrationStatus() { return await this.migrationManager.getMigrationStatus(); } /** * Get the personas directory path for legacy compatibility */ getPersonasDir() { return this.portfolioManager.getElementDir(ElementType.PERSONA); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnR1cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvc3RhcnR1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFPNUMsTUFBTSxPQUFPLGFBQWE7SUFDaEIsZ0JBQWdCLENBQW1CO0lBQ25DLGdCQUFnQixDQUFtQjtJQUUzQztRQUNFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQTBCLEVBQUU7UUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBRXRELCtCQUErQjtRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXBFLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUVBQWlFLENBQUMsQ0FBQztnQkFFL0UsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO29CQUNqRCxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsa0JBQWtCO2lCQUN4RCxDQUFDLENBQUM7Z0JBRUgsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLE1BQU0sQ0FBQyxhQUFhLFdBQVcsQ0FBQyxDQUFDO29CQUN0RixJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztvQkFDekUsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDekUsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLElBQUksS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxrQkFBa0I7UUFDdEIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VydmVyIHN0YXJ0dXAgdXRpbGl0aWVzIGluY2x1ZGluZyBtaWdyYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBFbGVtZW50VHlwZSB9IGZyb20gJy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IE1pZ3JhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0dXBPcHRpb25zIHtcbiAgc2tpcE1pZ3JhdGlvbj86IGJvb2xlYW47XG4gIGF1dG9CYWNrdXA/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgU2VydmVyU3RhcnR1cCB7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSBtaWdyYXRpb25NYW5hZ2VyOiBNaWdyYXRpb25NYW5hZ2VyO1xuICBcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMubWlncmF0aW9uTWFuYWdlciA9IG5ldyBNaWdyYXRpb25NYW5hZ2VyKHRoaXMucG9ydGZvbGlvTWFuYWdlcik7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHNlcnZlciB3aXRoIG1pZ3JhdGlvbiBjaGVja1xuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZShvcHRpb25zOiBTdGFydHVwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ1tTZXJ2ZXJTdGFydHVwXSBJbml0aWFsaXppbmcgc2VydmVyLi4uJyk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgbWlncmF0aW9uIGlzIG5lZWRlZFxuICAgIGlmICghb3B0aW9ucy5za2lwTWlncmF0aW9uKSB7XG4gICAgICBjb25zdCBuZWVkc01pZ3JhdGlvbiA9IGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5uZWVkc01pZ3JhdGlvbigpO1xuICAgICAgXG4gICAgICBpZiAobmVlZHNNaWdyYXRpb24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tTZXJ2ZXJTdGFydHVwXSBMZWdhY3kgcGVyc29uYXMgZGV0ZWN0ZWQuIFN0YXJ0aW5nIG1pZ3JhdGlvbi4uLicpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5taWdyYXRpb25NYW5hZ2VyLm1pZ3JhdGUoeyBcbiAgICAgICAgICBiYWNrdXA6IG9wdGlvbnMuYXV0b0JhY2t1cCAhPT0gZmFsc2UgLy8gRGVmYXVsdCB0byB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtTZXJ2ZXJTdGFydHVwXSBTdWNjZXNzZnVsbHkgbWlncmF0ZWQgJHtyZXN1bHQubWlncmF0ZWRDb3VudH0gcGVyc29uYXNgKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmJhY2tlZFVwICYmIHJlc3VsdC5iYWNrdXBQYXRoKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgW1NlcnZlclN0YXJ0dXBdIEJhY2t1cCBjcmVhdGVkIGF0OiAke3Jlc3VsdC5iYWNrdXBQYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1tTZXJ2ZXJTdGFydHVwXSBNaWdyYXRpb24gY29tcGxldGVkIHdpdGggZXJyb3JzOicpO1xuICAgICAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaChlcnIgPT4gbG9nZ2VyLmVycm9yKGBbU2VydmVyU3RhcnR1cF0gICAtICR7ZXJyfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgcG9ydGZvbGlvIHN0cnVjdHVyZSBleGlzdHNcbiAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZXhpc3RzKCk7XG4gICAgaWYgKCFwb3J0Zm9saW9FeGlzdHMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbU2VydmVyU3RhcnR1cF0gQ3JlYXRpbmcgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5pbml0aWFsaXplKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIExvZyBwb3J0Zm9saW8gc3RhdGlzdGljc1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldFN0YXRpc3RpY3MoKTtcbiAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIFBvcnRmb2xpbyBzdGF0aXN0aWNzOicpO1xuICAgIE9iamVjdC5lbnRyaWVzKHN0YXRzKS5mb3JFYWNoKChbdHlwZSwgY291bnRdKSA9PiB7XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbU2VydmVyU3RhcnR1cF0gICAtICR7dHlwZX06ICR7Y291bnR9IGVsZW1lbnRzYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgbWlncmF0aW9uIHN0YXR1cyB3aXRob3V0IHBlcmZvcm1pbmcgbWlncmF0aW9uXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TdGF0dXMoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5nZXRNaWdyYXRpb25TdGF0dXMoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgcGVyc29uYXMgZGlyZWN0b3J5IHBhdGggZm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBnZXRQZXJzb25hc0RpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5QRVJTT05BKTtcbiAgfVxufSJdfQ==