UNPKG

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

239 lines (204 loc) • 10.2 kB
#!/usr/bin/env node /** * ═══════════════════════════════════════════════════════════════════════════════ * UNINSTALL SCRIPT — OverMind-MCP * ═══════════════════════════════════════════════════════════════════════════════ * Désinstallation propre : supprime containers, volumes, images, config. * * Usage: * overmind uninstall # interactif (recommandé) * overmind uninstall --force # skip prompts,Tout supprime * ═══════════════════════════════════════════════════════════════════════════════ */ import { execSync } from 'child_process'; import { existsSync, rmSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; import { createInterface } from 'readline'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const INSTALL_DIR = join(process.env.HOME || process.env.USERPROFILE || process.env.HOMEPATH, '.overmind'); const FORCE = process.argv.includes('--force'); // ───────────────────────────────────────────────────────────────────────────── // UTILS // ───────────────────────────────────────────────────────────────────────────── function p(prompt) { return new Promise((resolve) => { const rl = createInterface({ input: process.stdin, output: process.stdout }); rl.question(prompt, (answer) => { rl.close(); resolve(answer); }); }); } async function yesNo(question, def = false) { const answer = await p(`${question} ${def ? '[Y/n]' : '[y/N]'}: `); return answer.toLowerCase().startsWith('y'); } function log(msg) { console.log(msg); } function section(title) { console.log(`\n╔${'═'.repeat(68)}╗`); console.log(`║ ${title.padEnd(66)} ║`); console.log(`╚${'═'.repeat(68)}╝`); } function cmd(command, label) { try { execSync(command, { stdio: 'pipe' }); log(`✅ ${label}`); return true; } catch (e) { const msg = e.message || ''; if (msg.includes('No such container') || msg.includes('no such container')) { log(`⚠️ ${label} (déjà absent)`); } else if (msg.includes('No such volume')) { log(`⚠️ ${label} (volume déjà absent)`); } else { log(`❌ ${label} — ${msg.split('\n')[0]}`); } return false; } } // ───────────────────────────────────────────────────────────────────────────── // DETECTION & LISTING // ───────────────────────────────────────────────────────────────────────────── function listContainers() { // ⚠️ CORRECTION CRITIQUE: Ne cibler que les containers OverMind, pas les containers personnels // Les containers personnels comme "postgres-pgvector" ne doivent JAMAIS être supprimés const overmindContainers = [ 'overmind-postgres-pgvector', // Container créé par OverMind 2.2.0+ ]; return overmindContainers.filter((containerName) => { try { execSync(`docker inspect ${containerName}`, { stdio: 'pipe' }); return true; } catch { return false; } }); } function listVolumes() { // ⚠️ CORRECTION CRITIQUE: Ne cibler que les volumes OverMind, pas les volumes personnels const overmindVolumes = [ 'overmind_postgres_data', ]; return overmindVolumes.filter((volumeName) => { try { execSync(`docker volume inspect ${volumeName}`, { stdio: 'pipe' }); return true; } catch { return false; } }); } function listImages() { const imgs = ['pgvector/pgvector:pg16']; return imgs.filter((img) => { try { execSync(`docker image inspect ${img}`, { stdio: 'pipe' }); return true; } catch { return false; } }); } // ───────────────────────────────────────────────────────────────────────────── // MAIN // ───────────────────────────────────────────────────────────────────────────── async function main() { console.log(`\n╔${'═'.repeat(68)}╗`); console.log(`║ ║`); console.log(`║ 🧹 OVERMIND-MCP — DÉSINSTALLATION PROPRE ║`); console.log(`║ ║`); console.log(`╚${'═'.repeat(68)}╝`); // ⚠️ AVERTISSEMENT DE SÉCURITÉ console.log('\n⚠️ SÉCURITÉ: Ce script ne supprime QUE les containers/volumes OverMind.'); console.log(' Vos containers personnels (comme postgres-pgvector) sont PROTÉGÉS.'); console.log(' Seuls les containers commençant par "overmind-" seront supprimés.\n'); // ── 1. Containers actifs ────────────────────────────────────────────── const containers = listContainers(); const volumes = listVolumes(); const images = listImages(); const hasInstallDir = existsSync(INSTALL_DIR); if (!containers.length && !volumes.length && !images.length && !hasInstallDir) { log('\n✅ OverMind-MCP ne laisse aucune trace détectable.'); log(' Supprimez le package manuellement :\n npm uninstall -g overmind-mcp\n'); return; } log('\n📋 Éléments OverMind détectés sur cette machine :\n'); if (containers.length) { log(' Containers :'); containers.forEach((c) => log(` - ${c}`)); } else { log(' Containers : aucun'); } if (volumes.length) { log(' Volumes Docker :'); volumes.forEach((v) => log(` - ${v}`)); } else { log(' Volumes Docker : aucun'); } if (images.length) { log(' Images Docker (↺ réutilisables) :'); images.forEach((i) => log(` - ${i}`)); } else { log(' Images Docker : aucune'); } if (hasInstallDir) { log(` Config ~/.overmind/ : présent`); } else { log(' Config ~/.overmind/ : absent'); } if (FORCE) { log('\n⚠️ Mode --force : suppression sans confirmation.\n'); } else { log('\n⏳ Les données des volumes Docker seront DÉTRUITES.\n'); const confirm = await yesNo('Procéder à la désinstallation ?'); if (!confirm) { log('\n🛑 Annulé.'); return; } } // ── 2. Stop & remove containers ─────────────────────────────────────── section('SUPPRESSION CONTENEURS'); for (const c of containers) { cmd(`docker stop ${c}`, `Stop ${c}`); cmd(`docker rm -f ${c}`, `Remove ${c}`); } // ── 3. Remove volumes ───────────────────────────────────────────────── if (FORCE || await yesNo('\n🗑️ Supprimer les volumes Docker (DESTRUCTIF) ?')) { section('SUPPRESSION VOLUMES'); for (const v of volumes) { cmd(`docker volume rm ${v}`, `Remove volume ${v}`); } } else { log('\n⚠️ Volumes conservés (données PostgreSQL intactes).'); } // ── 4. Remove images ──────────────────────────────────────────────────── if (FORCE || await yesNo('\n🗑️ Supprimer les images OverMind Docker (~3-4 GB) ?')) { section('SUPPRESSION IMAGES'); for (const img of images) { cmd(`docker rmi ${img}`, `Remove image ${img}`); } } else { log('\n⚠️ Images conservées.'); } // ── 5. Remove ~/.overmind ────────────────────────────────────────────── if (FORCE || await yesNo('\n📁 Supprimer ~/.overmind/ (config + .env avec credentials) ?')) { section('SUPPRESSION CONFIG'); if (existsSync(INSTALL_DIR)) { try { rmSync(INSTALL_DIR, { recursive: true, force: true }); log(`✅ ~/.overmind/ supprimé`); } catch (e) { log(`❌ ~/.overmind/ : ${e.message.split('\n')[0]}`); } } else { log('⚠️ ~/.overmind/ déjà absent'); } } else { log('\n⚠️ Config ~/.overmind/ conservée.'); } // ── Done ─────────────────────────────────────────────────────────────── section('DÉSINSTALLATION TERMINÉE'); console.log(` ✅ OverMind-MCP a été retiré proprement. 📋 Pour désinstaller complètement le package NPM : npm uninstall -g overmind-mcp 💡 Si vous réinstallez plus tard : npm install -g overmind-mcp overmind-setup --full # (si vous voulez le Mode Avancé) ══════════════════════════════════════════════════════════════════════ `); } main().catch((e) => { console.error('\n❌ ERREUR FATALE:', e.message); process.exit(1); });