aide-cli
Version:
AIDE - The companion control system for Claude Code with intelligent task management
159 lines (136 loc) • 4.34 kB
JavaScript
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;