UNPKG

aide-cli

Version:

AIDE - The companion control system for Claude Code with intelligent task management

159 lines (136 loc) 4.34 kB
const { exec } = require('child_process'); const { promisify } = require('util'); const which = require('which'); const chalk = require('chalk'); const execAsync = promisify(exec); class PythonDetector { constructor() { this.candidates = [ 'python3', 'python3.12', 'python3.11', 'python3.10', 'python3.9', 'python3.8', 'python3.7', 'python', 'py' // Windows ]; this.minVersion = [3, 7]; } async findBestPython(preferredCommand = null) { console.log(chalk.gray('🔍 Detecting Python installation...')); // Si el usuario especificó un comando, intentarlo primero if (preferredCommand) { const result = await this.testPython(preferredCommand); if (result.valid) { console.log(chalk.green(`✅ Using specified Python: ${preferredCommand} (${result.version})`)); return result; } else { console.log(chalk.yellow(`⚠️ Specified Python invalid: ${preferredCommand}`)); } } // Buscar automáticamente for (const candidate of this.candidates) { try { const result = await this.testPython(candidate); if (result.valid) { console.log(chalk.green(`✅ Found Python: ${candidate} (${result.version})`)); return result; } } catch (error) { // Continúa con el siguiente candidato continue; } } throw new Error('No compatible Python installation found. Need Python 3.7+'); } async testPython(command) { try { // Verificar que el comando existe const path = await which(command); // Verificar versión const { stdout: versionOutput } = await execAsync(`${command} -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')"`); const version = versionOutput.trim(); const [major, minor] = version.split('.').map(Number); // Verificar compatibilidad const isCompatible = major > this.minVersion[0] || (major === this.minVersion[0] && minor >= this.minVersion[1]); if (!isCompatible) { return { command, path, version, valid: false, reason: `Version ${version} is below minimum required ${this.minVersion.join('.')}` }; } // Verificar que puede importar módulos básicos await execAsync(`${command} -c "import json, os, sys, pathlib, datetime"`); return { command, path, version, valid: true, major, minor }; } catch (error) { return { command, valid: false, reason: error.message }; } } async getPlatformInfo() { const os = require('os'); const platform = os.platform(); const arch = os.arch(); const release = os.release(); let platformName; switch (platform) { case 'darwin': platformName = 'macOS'; break; case 'linux': platformName = 'Linux'; break; case 'win32': platformName = 'Windows'; break; default: platformName = platform; } return { platform, platformName, arch, release, isWindows: platform === 'win32', isMacOS: platform === 'darwin', isLinux: platform === 'linux' }; } async generateSystemReport() { const platform = await this.getPlatformInfo(); console.log(chalk.blue.bold('\n📊 System Report:')); console.log(chalk.gray(` Platform: ${platform.platformName} (${platform.arch})`)); console.log(chalk.gray(` Release: ${platform.release}`)); console.log(chalk.blue('\n🐍 Python Candidates:')); for (const candidate of this.candidates) { try { const result = await this.testPython(candidate); if (result.valid) { console.log(chalk.green(` ✅ ${candidate}${result.version} (${result.path})`)); } else { console.log(chalk.yellow(` ⚠️ ${candidate}${result.reason}`)); } } catch (error) { console.log(chalk.red(` ❌ ${candidate} → not found`)); } } return platform; } } module.exports = PythonDetector;