#!/usr/bin/env node import { Command } from 'commander'; import inquirer from 'inquirer'; import chalk from 'chalk'; import ora from 'ora'; import path from 'path'; import { fileURLToPath } from 'url'; import { installer } from './lib/installer.js'; import { getPrompts } from './lib/prompts.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const program = new Command(); program .name('create-open-lovable') .description('Create a new Open Lovable project with your choice of sandbox provider') .version('1.0.0') .option('-s, --sandbox ', 'Sandbox provider (e2b or vercel)') .option('-n, --name ', 'Project name') .option('-p, --path ', 'Installation path (defaults to current directory)') .option('--skip-install', 'Skip npm install') .option('--dry-run', 'Run without making changes') .parse(process.argv); const options = program.opts(); async function main() { console.log(chalk.cyan('\nšŸš€ Welcome to Open Lovable Setup!\n')); let config = { sandbox: options.sandbox, name: options.name || 'my-open-lovable', path: options.path || process.cwd(), skipInstall: options.skipInstall || false, dryRun: options.dryRun || false }; // Interactive mode if sandbox not specified if (!config.sandbox) { const prompts = getPrompts(config); const answers = await inquirer.prompt(prompts); config = { ...config, ...answers }; } // Validate sandbox provider if (!['e2b', 'vercel'].includes(config.sandbox)) { console.error(chalk.red(`\nāŒ Invalid sandbox provider: ${config.sandbox}`)); console.log(chalk.yellow('Valid options: e2b, vercel\n')); process.exit(1); } console.log(chalk.gray('\nConfiguration:')); console.log(chalk.gray(` Project: ${config.name}`)); console.log(chalk.gray(` Sandbox: ${config.sandbox}`)); console.log(chalk.gray(` Path: ${path.resolve(config.path, config.name)}\n`)); if (config.dryRun) { console.log(chalk.yellow('šŸ” Dry run mode - no files will be created\n')); } const spinner = ora('Creating project...').start(); try { await installer({ ...config, templatesDir: path.join(__dirname, 'templates') }); spinner.succeed('Project created successfully!'); console.log(chalk.green('\nāœ… Setup complete!\n')); console.log(chalk.white('Next steps:')); console.log(chalk.gray(` 1. cd ${config.name}`)); console.log(chalk.gray(` 2. Copy .env.example to .env and add your API keys`)); console.log(chalk.gray(` 3. npm run dev`)); console.log(chalk.gray('\nHappy coding! šŸŽ‰\n')); } catch (error) { spinner.fail('Setup failed'); console.error(chalk.red('\nāŒ Error:'), error.message); if (error.stack && process.env.DEBUG) { console.error(chalk.gray(error.stack)); } process.exit(1); } } main().catch(error => { console.error(chalk.red('Unexpected error:'), error); process.exit(1); });