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
JavaScript
/**
* ═══════════════════════════════════════════════════════════════════════════════
* 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);
});