UNPKG

quallaa-cli

Version:

Sets up core infrastructure services for AI-assisted development

132 lines 5.55 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.initCommand = void 0; const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const inquirer_1 = __importDefault(require("inquirer")); const ora_1 = __importDefault(require("ora")); const banner_1 = require("../ui/brand/banner"); const leads_1 = require("../capture/leads"); const project_1 = require("./generate/project"); const claude_1 = require("./generate/claude"); const setup_1 = require("./setup"); exports.initCommand = new commander_1.Command('init') .description('Initialize a new project with infrastructure services') .option('-n, --name <name>', 'Project name') .option('-r, --role <role>', 'Your role (founder, product, marketing, operations)') .option('--skip-lead-capture', 'Skip lead capture (not recommended)') .action(async (options) => { (0, banner_1.displayWelcome)(); try { let leadInfo = null; if (!options.skipLeadCapture) { console.log(chalk_1.default.cyan('\n📋 First, let\'s get to know you')); console.log(chalk_1.default.gray('This helps us improve your experience and provide support\n')); leadInfo = await (0, leads_1.captureLeadInfo)(); } console.log(chalk_1.default.cyan('\n🎯 Project Configuration')); const projectName = options.name || await askProjectName(); const role = options.role || await askRole(); const services = await askServices(); const config = { name: projectName, role: role, services, leadInfo, }; const spinner = (0, ora_1.default)('Creating project structure...').start(); await (0, project_1.generateProject)(config); spinner.succeed('Project structure created'); spinner.start('Generating CLAUDE.md with role-specific context...'); await (0, claude_1.generateClaudeMd)(config); spinner.succeed('CLAUDE.md generated'); if (await confirmServiceSetup()) { await (0, setup_1.setupAllServices)(config); } console.log(chalk_1.default.green('\n✅ Project initialized successfully!')); console.log(chalk_1.default.gray(`\nNext steps:`)); console.log(chalk_1.default.gray(` 1. cd ${projectName}`)); console.log(chalk_1.default.gray(` 2. npm install`)); console.log(chalk_1.default.gray(` 3. npm run dev`)); console.log(chalk_1.default.gray(`\nOpen your project in VS Code and Claude will have all the context it needs!`)); if (leadInfo) { console.log(chalk_1.default.yellow('\n📣 We\'re testing this system and would love your feedback!')); console.log(chalk_1.default.gray('We\'ll reach out in a few days to hear about your experience.\n')); } } catch (error) { console.error(chalk_1.default.red('\nError:'), error); process.exit(1); } }); async function askProjectName() { const { projectName } = await inquirer_1.default.prompt([ { type: 'input', name: 'projectName', message: 'Project name:', default: 'my-quallaa-app', validate: (input) => { if (!/^[a-z0-9-]+$/.test(input)) { return 'Project name must contain only lowercase letters, numbers, and hyphens'; } return true; }, }, ]); return projectName; } async function askRole() { const { role } = await inquirer_1.default.prompt([ { type: 'list', name: 'role', message: 'What\'s your role?', choices: [ { name: 'Technical Co-Founder / First Engineer', value: 'founder' }, { name: 'Product Manager / Product Owner', value: 'product' }, { name: 'Marketing Lead / Growth Hacker', value: 'marketing' }, { name: 'Operations Manager / Business Manager', value: 'operations' }, ], }, ]); return role; } async function askServices() { const { services } = await inquirer_1.default.prompt([ { type: 'checkbox', name: 'services', message: 'Which services do you want to set up?', choices: [ { name: 'Vercel (Hosting & Deployment)', value: 'vercel', checked: true }, { name: 'Supabase (Database & Auth)', value: 'supabase', checked: true }, { name: 'GitHub (Version Control)', value: 'github', checked: true }, { name: 'Resend (Email)', value: 'resend', checked: true }, { name: 'Typesense (Search) - Optional', value: 'typesense', checked: false }, ], validate: (input) => { if (input.length === 0) { return 'Please select at least one service'; } return true; }, }, ]); return services; } async function confirmServiceSetup() { const { proceed } = await inquirer_1.default.prompt([ { type: 'confirm', name: 'proceed', message: 'Would you like to set up these services now?', default: true, }, ]); return proceed; } //# sourceMappingURL=init.js.map