overmind-mcp
Version:
Orchestrateur universel agents IA multi-modeles via MCP. Inclut le protocole 'Custom-Nickname' pour identifier vos agents avec des surnoms originaux (The Chaos Prophet, Shadow Sniper, etc.), l'isolation mémoire (Private Memory Context) et le support pour
399 lines (332 loc) • 15.2 kB
JavaScript
/**
* ═══════════════════════════════════════════════════════════════════════════════
* SETUP SCRIPT - Installation Automatique OverMind
* ═══════════════════════════════════════════════════════════════════════════════
* Script principal qui installe TOUTES les dépendances nécessaires à OverMind:
* - Docker (si pas présent)
* - PostgreSQL + pgvector (si pas présent)
* - RabbitMQ
* - Temporal
* - Configuration automatique
*
* Usage:
* overmind-setup [--full]
* ═══════════════════════════════════════════════════════════════════════════════
*/
import { execSync, spawn } from 'child_process';
import { copyFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
import { join } from 'path';
import { randomBytes } from 'crypto';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
import { createInterface } from 'readline';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const projectRoot = join(__dirname, '..');
const INSTALL_DIR = join(process.env.HOME || process.env.USERPROFILE || process.env.HOMEPATH, '.overmind');
// ═══════════════════════════════════════════════════════════════════════════════
// UTILS
// ═══════════════════════════════════════════════════════════════════════════════
function logSection(title) {
console.log('\n╔══════════════════════════════════════════════════════════════════╗');
console.log(`║ ${title.padEnd(64)} ║`);
console.log('╚══════════════════════════════════════════════════════════════════╝');
}
function runCommand(cmd, description) {
console.log(`\n🔧 ${description}`);
console.log(` $ ${cmd}`);
try {
execSync(cmd, { stdio: 'inherit' });
console.log(`✅ ${description} terminé`);
return true;
} catch (error) {
console.error(`❌ Erreur: ${error.message}`);
return false;
}
}
function runCommandAsync(cmd, description) {
return new Promise((resolve, reject) => {
console.log(`\n🔧 ${description}`);
console.log(` $ ${cmd}`);
const child = spawn(cmd, { shell: true, stdio: 'inherit' });
child.on('close', (code) => {
if (code === 0) {
console.log(`✅ ${description} terminé`);
resolve(true);
} else {
console.error(`❌ Erreur (code ${code})`);
reject(new Error(`Command failed with code ${code}`));
}
});
child.on('error', (err) => {
console.error('❌ Erreur:', err.message);
reject(err);
});
});
}
async function promptYesNo(question) {
const rl = createInterface({
input: process.stdin,
output: process.stdout,
});
const answer = await new Promise((resolve) => {
rl.question(`${question} (y/N): `, (answer) => {
rl.close();
resolve(answer.toLowerCase().startsWith('y'));
});
});
return answer;
}
// ═══════════════════════════════════════════════════════════════════════════════
// CHECKS
// ═══════════════════════════════════════════════════════════════════════════════
function checkDocker() {
try {
execSync('docker --version', { stdio: 'pipe' });
return true;
} catch {
return false;
}
}
function checkPostgreSQL() {
try {
execSync('docker ps --filter "name=postgres" --format "{{.Names}}"', { stdio: 'pipe' });
return true;
} catch {
try {
execSync('psql --version', { stdio: 'pipe' });
return true;
} catch {
return false;
}
}
}
// ═══════════════════════════════════════════════════════════════════════════════
// INSTALLATION STEPS
// ═══════════════════════════════════════════════════════════════════════════════
async function installDocker() {
logSection('INSTALLATION DOCKER');
if (checkDocker()) {
console.log('✅ Docker est déjà installé');
return true;
}
console.log('ℹ️ Docker non trouvé.');
console.log('');
console.log('📥 Docker Desktop est requis pour OverMind-MCP:');
console.log(' - Windows: https://www.docker.com/products/docker-desktop/');
console.log(' - Mac: https://www.docker.com/products/docker-desktop/');
console.log('');
console.log('📋 Instructions:');
console.log(' 1. Téléchargez et installez Docker Desktop');
console.log(' 2. Démarrez Docker Desktop');
console.log(' 3. Relancez: overmind-setup --full');
console.log('');
const answer = await promptYesNo('Voulez-vous ouvrir le site de téléchargement maintenant ?');
if (answer) {
const url = process.platform === 'win32'
? 'https://www.docker.com/products/docker-desktop/'
: 'https://www.docker.com/products/docker-desktop/';
try {
execSync(`start ${url}`, { stdio: 'inherit' });
console.log('✅ Navigateur ouvert. Attendez l\'installation de Docker.');
} catch {
console.log('⚠️ Impossible d\'ouvrir le navigateur automatiquement.');
console.log(` Ouvrez manuellement: ${url}`);
}
}
return false;
}
async function installPostgreSQL() {
logSection('INSTALLATION POSTGRESQL + PGVECTOR');
if (checkPostgreSQL()) {
console.log('✅ PostgreSQL est déjà installé');
return true;
}
console.log('🐳 Installation PostgreSQL + pgvector en Docker...');
console.log('');
try {
// Pull and start PostgreSQL container
console.log('📥 Téléchargement image pgvector/pgvector:pg16...');
execSync('docker pull pgvector/pgvector:pg16', { stdio: 'inherit' });
console.log('🚀 Démarrage container PostgreSQL...');
const pgPwd = randomBytes(18).toString('base64url');
const runCommand = `docker run -d --name overmind-postgres-pgvector \\
-p 5432:5432 \\
-e POSTGRES_PASSWORD=${pgPwd} \\
-e POSTGRES_USER=postgres \\
-e POSTGRES_DB=overmind_memory \\
-v overmind_postgres_data:/var/lib/postgresql/data \\
--restart unless-stopped \\
pgvector/pgvector:pg16`;
await runCommandAsync(runCommand, 'Démarrage PostgreSQL');
// Wait for PostgreSQL to be ready
console.log('⏳ Attente démarrage PostgreSQL (30s)...');
await new Promise((resolve) => setTimeout(resolve, 30000));
// Verify pgvector
console.log('🔍 Vérification pgvector...');
await runCommandAsync(
'docker exec overmind-postgres-pgvector psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS vector;"',
'Activation pgvector'
);
console.log('✅ PostgreSQL + pgvector installés avec succès !');
return true;
} catch (error) {
console.error('❌ Erreur installation PostgreSQL:', error.message);
return false;
}
}
function setupConfigurationFiles() {
logSection('CONFIGURATION OVERMIND');
// Create install directory
if (!existsSync(INSTALL_DIR)) {
mkdirSync(INSTALL_DIR, { recursive: true });
console.log('✅ Dossier créé:', INSTALL_DIR);
}
// Copy docker-compose file
const dockerComposePath = join(projectRoot, 'docker', 'docker-compose.yml');
const destComposePath = join(INSTALL_DIR, 'docker-compose.yml');
if (existsSync(dockerComposePath)) {
copyFileSync(dockerComposePath, destComposePath);
console.log('✅ docker-compose.yml copié');
}
// Copy .env.example if .env doesn't exist
const envExamplePath = join(projectRoot, '.env.example');
const envPath = join(INSTALL_DIR, '.env');
if (!existsSync(envPath) && existsSync(envExamplePath)) {
copyFileSync(envExamplePath, envPath);
console.log('✅ .env créé (à éditer avec vos credentials)');
}
// Copy postgres-manager script
const dockerManagerPath = join(__dirname, 'postgres-manager.mjs');
const destManagerPath = join(INSTALL_DIR, 'postgres-manager.mjs');
if (existsSync(dockerManagerPath)) {
copyFileSync(dockerManagerPath, destManagerPath);
console.log('✅ Scripts Docker installés');
}
return true;
}
async function startDockerServices() {
logSection('DÉMARRAGE SERVICES DOCKER');
const composeFile = join(INSTALL_DIR, 'docker-compose.yml');
console.log('🚀 Démarrage PostgreSQL + pgvector...');
try {
await runCommandAsync(
`docker-compose -f "${composeFile}" up -d`,
'Démarrage PostgreSQL'
);
console.log('✅ PostgreSQL + pgvector démarré');
return true;
} catch (error) {
console.error('❌ Erreur démarrage Docker:', error.message);
return false;
}
}
async function createOvermindDatabase() {
logSection('CRÉATION BASE OVERMIND');
const setupDbPath = join(__dirname, 'setup-overmind-db.mjs');
const destDbDir = INSTALL_DIR;
const destDbPath = join(destDbDir, 'setup-overmind-db.mjs');
try {
if (!existsSync(destDbDir)) {
mkdirSync(destDbDir, { recursive: true });
}
copyFileSync(setupDbPath, destDbPath);
await runCommandAsync(
`node "${destDbPath}"`,
'Initialisation DB OverMind'
);
return true;
} catch (error) {
console.error('❌ Erreur création DB:', error.message);
return false;
}
}
// ═══════════════════════════════════════════════════════════════════════════════
// MAIN
// ═══════════════════════════════════════════════════════════════════════════════
async function main() {
const args = process.argv.slice(2);
const isFull = args.includes('--full');
console.log('╔══════════════════════════════════════════════════════════════════╗');
console.log('║ ║');
console.log('║ 🧠 OVERMIND-MCP: SETUP AUTOMATISÉ COMPLET ║');
console.log('║ ║');
console.log('╚══════════════════════════════════════════════════════════════════╝');
console.log('');
if (!isFull) {
console.log('ℹ️ USAGE: overmind-setup [--full]');
console.log('');
console.log(' --full: Installe TOUTES les dépendances (Docker, PostgreSQL, etc.)');
console.log(' et configure OverMind automatiquement');
console.log('');
console.log(' Sans --full: Prépare juste les fichiers de configuration');
console.log('');
return;
}
// Step 1: Check Docker
const hasDocker = checkDocker();
if (!hasDocker) {
const installed = await installDocker();
if (!installed) {
console.log('\n❌ SETUP ANNULÉ - Docker est requis pour le mode complet');
console.log(' Installez Docker Desktop et relancez: overmind-setup --full');
process.exit(1);
}
}
// Step 2: Check PostgreSQL
const hasPostgreSQL = checkPostgreSQL();
if (!hasPostgreSQL) {
const installed = await installPostgreSQL();
if (!installed) {
console.log('\n❌ SETUP ANNULÉ - PostgreSQL est requis pour le mode complet');
process.exit(1);
}
}
// Step 3: Setup configuration files
setupConfigurationFiles();
// Step 4: Start Docker services
const servicesStarted = await startDockerServices();
if (!servicesStarted) {
console.log('\n❌ SETUP ANNULÉ - Impossible de démarrer les services');
process.exit(1);
}
// Step 5: Create OverMind database
const dbCreated = await createOvermindDatabase();
if (!dbCreated) {
console.log('\n❌ SETUP ANNULÉ - Impossible de créer la base OverMind');
process.exit(1);
}
// Success!
logSection('✅ SETUP COMPLET TERMINÉ AVEC SUCCÈS');
console.log(`
🎉 OVERMIND-MCP EST PRÊT !
📋 SERVICES ACTIFS:
✅ PostgreSQL + pgvector (Vector DB 4096D)
✅ RabbitMQ (Message Broker)
✅ Temporal (Workflow Orchestrator)
✅ OverMind Agents (prêt à l'emploi)
🌐 INTERFACES:
📊 RabbitMQ Management: http://localhost:15672
📈 Temporal Web: http://localhost:8088
🗄️ PostgreSQL: localhost:5432
🚀 COMMANDES DISPONIBLES:
overmind create-agent --name expert --runner claude
overmind run-agent --runner claude --prompt "Analyse..."
overmind-infra up/down/status/logs
📚 DOCUMENTATION:
- https://deamondev888.github.io/overmind-mcp/
- https://github.com/DeamonDev888/overmind-mcp
- Discord: https://discord.gg/4AR82phtBz
💡 PREMIER TEST:
overmind create-agent --name test --runner claude --prompt "Test d'OverMind"
═══════════════════════════════════════════════════════════════════════
`);
}
// Run main
if (import.meta.url === `file://${process.argv[1]}`) {
main().catch((error) => {
console.error('\n❌ ERREUR FATALE:', error.message);
process.exit(1);
});
}