UNPKG

task-engine-ai-core

Version:

Revolutionary AI-driven task management system with complete transformation trilogy: Frontend v0.1.0, Backend v0.2.0, CLI v0.3.0 - Enterprise-grade performance with 95% improvements

206 lines (181 loc) • 6.11 kB
#!/usr/bin/env node /** * Task Engine AI - New IDE Setup Script * Helps configure Task Engine AI for different IDEs */ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import inquirer from 'inquirer'; import chalk from 'chalk'; import os from 'os'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const IDE_CONFIGS = { vscode: { name: 'VS Code', configFile: 'vscode-mcp.json', paths: { windows: '%APPDATA%\\Code\\User\\globalStorage\\rooveterinaryinc.roo-cline\\config\\mcp_servers.json', macos: '~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/config/mcp_servers.json', linux: '~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/config/mcp_servers.json' } }, cursor: { name: 'Cursor', configFile: 'cursor-mcp.json', paths: { windows: '%APPDATA%\\Cursor\\User\\globalStorage\\cursor-ai.cursor\\config\\mcp_servers.json', macos: '~/Library/Application Support/Cursor/User/globalStorage/cursor-ai.cursor/config/mcp_servers.json', linux: '~/.config/Cursor/User/globalStorage/cursor-ai.cursor/config/mcp_servers.json' } }, windsurf: { name: 'Windsurf', configFile: 'windsurf-mcp.json', paths: { windows: '%APPDATA%\\Windsurf\\User\\globalStorage\\windsurf-ai.windsurf\\config\\mcp_servers.json', macos: '~/Library/Application Support/Windsurf/User/globalStorage/windsurf-ai.windsurf/config/mcp_servers.json', linux: '~/.config/Windsurf/User/globalStorage/windsurf-ai.windsurf/config/mcp_servers.json' } } }; function getOS() { const platform = os.platform(); if (platform === 'win32') return 'windows'; if (platform === 'darwin') return 'macos'; return 'linux'; } function expandPath(pathStr) { if (pathStr.startsWith('~')) { return path.join(os.homedir(), pathStr.slice(1)); } if (pathStr.includes('%APPDATA%')) { return pathStr.replace('%APPDATA%', process.env.APPDATA || ''); } return pathStr; } async function main() { console.log(chalk.blue.bold('\nšŸš€ Task Engine AI - IDE Setup\n')); // Check if CLI is installed try { const { execSync } = await import('child_process'); execSync('task-engine --version', { stdio: 'ignore' }); console.log(chalk.green('āœ… Task Engine AI CLI is installed')); } catch (error) { console.log(chalk.red('āŒ Task Engine AI CLI not found. Please run: npm install -g task-engine-ai-core')); process.exit(1); } // Select IDE const { ide } = await inquirer.prompt([ { type: 'list', name: 'ide', message: 'Which IDE do you want to configure?', choices: Object.entries(IDE_CONFIGS).map(([key, config]) => ({ name: config.name, value: key })) } ]); const ideConfig = IDE_CONFIGS[ide]; const currentOS = getOS(); const configPath = expandPath(ideConfig.paths[currentOS]); const sourceConfigPath = path.join(__dirname, 'mcp-configs', ideConfig.configFile); console.log(chalk.yellow(`\nšŸ“ Configuration for ${ideConfig.name}:`)); console.log(chalk.gray(`Source: ${sourceConfigPath}`)); console.log(chalk.gray(`Target: ${configPath}`)); // Check if source config exists if (!fs.existsSync(sourceConfigPath)) { console.log(chalk.red(`āŒ Configuration file not found: ${sourceConfigPath}`)); process.exit(1); } // Ask for project root const { projectRoot } = await inquirer.prompt([ { type: 'input', name: 'projectRoot', message: 'Enter your project root path:', default: process.cwd() } ]); // Ask for API keys const { setupApiKeys } = await inquirer.prompt([ { type: 'confirm', name: 'setupApiKeys', message: 'Do you want to configure API keys now?', default: false } ]); let apiKeys = {}; if (setupApiKeys) { apiKeys = await inquirer.prompt([ { type: 'password', name: 'ANTHROPIC_API_KEY', message: 'Anthropic API Key (optional):', mask: '*' }, { type: 'password', name: 'OPENAI_API_KEY', message: 'OpenAI API Key (optional):', mask: '*' }, { type: 'password', name: 'PERPLEXITY_API_KEY', message: 'Perplexity API Key (optional):', mask: '*' } ]); } // Read and modify config const configContent = fs.readFileSync(sourceConfigPath, 'utf8'); let config = JSON.parse(configContent); // Update project root const updateProjectRoot = (obj) => { if (typeof obj === 'object' && obj !== null) { for (const key in obj) { if (key === 'TASK_MASTER_PROJECT_ROOT') { obj[key] = projectRoot; } else if (typeof obj[key] === 'object') { updateProjectRoot(obj[key]); } } } }; updateProjectRoot(config); // Update API keys if (setupApiKeys) { const updateApiKeys = (obj) => { if (typeof obj === 'object' && obj !== null) { for (const key in obj) { if (apiKeys[key] && apiKeys[key].trim()) { obj[key] = apiKeys[key]; } else if (typeof obj[key] === 'object') { updateApiKeys(obj[key]); } } } }; updateApiKeys(config); } // Create target directory if it doesn't exist const targetDir = path.dirname(configPath); if (!fs.existsSync(targetDir)) { fs.mkdirSync(targetDir, { recursive: true }); } // Write config file fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); console.log(chalk.green(`\nāœ… Configuration saved to: ${configPath}`)); console.log(chalk.yellow('\nšŸ“‹ Next steps:')); console.log(chalk.gray('1. Restart your IDE')); console.log(chalk.gray('2. Look for Task Engine AI tools in the command palette')); console.log(chalk.gray('3. Try running: "Initialize Task Engine AI Project"')); if (!setupApiKeys) { console.log(chalk.yellow('\nšŸ’” Tip: You can add API keys later by editing the config file')); } } main().catch(console.error);