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