quallaa-cli
Version:
Sets up core infrastructure services for AI-assisted development
132 lines • 5.55 kB
JavaScript
"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