context-forge
Version:
AI orchestration platform with autonomous teams, enhancement planning, migration tools, 25+ slash commands, checkpoints & hooks. Multi-IDE: Claude, Cursor, Windsurf, Cline, Copilot
170 lines ⢠8.04 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.techStack = techStack;
const inquirer_1 = __importDefault(require("inquirer"));
const chalk_1 = __importDefault(require("chalk"));
async function techStack(projectType) {
console.log(chalk_1.default.blue('\nš ļø Step 4 of 7: Technology Stack'));
console.log(chalk_1.default.gray('Choose the technologies that best fit your project.\n'));
const answers = {};
let stepCounter = 1;
// Frontend selection (skip for API-only projects)
if (projectType !== 'api') {
console.log(chalk_1.default.cyan(`š ${stepCounter++}. Frontend Framework`));
const frontendAnswer = await inquirer_1.default.prompt([
{
type: 'list',
name: 'frontend',
message: 'Select your frontend framework:',
choices: [
{ name: 'š Next.js (React-based, full-stack)', value: 'nextjs' },
{ name: 'āļø React (SPA)', value: 'react' },
{ name: 'š
Vue.js', value: 'vuejs' },
{ name: 'š¶ļø Angular', value: 'angular' },
{ name: 'š¦ Svelte/SvelteKit', value: 'svelte' },
{ name: 'š Vanilla JavaScript', value: 'vanilla' },
{ name: 'ā None (API only)', value: 'none' },
],
},
]);
answers.frontend = frontendAnswer.frontend;
// Styling options for frontend projects
if (frontendAnswer.frontend !== 'none') {
console.log(chalk_1.default.cyan(`šØ ${stepCounter++}. Styling Framework`));
const stylingAnswer = await inquirer_1.default.prompt([
{
type: 'list',
name: 'styling',
message: 'Select your styling approach:',
choices: [
{ name: 'šŖļø Tailwind CSS', value: 'tailwind' },
{ name: 'š¦ CSS Modules', value: 'css-modules' },
{ name: 'š Styled Components', value: 'styled-components' },
{ name: 'š Emotion', value: 'emotion' },
{ name: 'š Sass/SCSS', value: 'sass' },
{ name: 'š Plain CSS', value: 'css' },
],
},
]);
answers.styling = stylingAnswer.styling;
// State management for React/Vue/Angular
if (['react', 'nextjs', 'vuejs', 'angular'].includes(frontendAnswer.frontend)) {
console.log(chalk_1.default.cyan(`š ${stepCounter++}. State Management`));
const stateAnswer = await inquirer_1.default.prompt([
{
type: 'list',
name: 'stateManagement',
message: 'Select state management solution:',
choices: getStateManagementChoices(frontendAnswer.frontend),
},
]);
answers.stateManagement = stateAnswer.stateManagement;
}
}
}
// Backend selection (skip for frontend-only projects)
if (projectType !== 'web' && projectType !== 'mobile' && projectType !== 'desktop') {
console.log(chalk_1.default.cyan(`š ${stepCounter++}. Backend Framework`));
const backendAnswer = await inquirer_1.default.prompt([
{
type: 'list',
name: 'backend',
message: 'Select your backend framework:',
choices: [
{ name: 'ā” FastAPI (Python)', value: 'fastapi' },
{ name: 'š Express.js (Node.js)', value: 'express' },
{ name: 'š Django (Python)', value: 'django' },
{ name: 'š¶ļø Flask (Python)', value: 'flask' },
{ name: 'ā Spring Boot (Java)', value: 'spring-boot' },
{ name: 'š Ruby on Rails', value: 'rails' },
{ name: 'šµ ASP.NET Core (C#)', value: 'aspnet' },
{ name: 'š¹ Go (Gin/Echo)', value: 'go' },
{ name: 'ā None (Frontend only)', value: 'none' },
],
},
]);
answers.backend = backendAnswer.backend;
}
// Database selection
if (answers.backend !== 'none' || projectType === 'fullstack') {
console.log(chalk_1.default.cyan(`š¾ ${stepCounter++}. Database`));
const databaseAnswer = await inquirer_1.default.prompt([
{
type: 'list',
name: 'database',
message: 'Select your database:',
choices: [
{ name: 'š PostgreSQL', value: 'postgresql' },
{ name: 'š¬ MySQL', value: 'mysql' },
{ name: 'š MongoDB', value: 'mongodb' },
{ name: 'š¾ SQLite', value: 'sqlite' },
{ name: 'ā” Redis + PostgreSQL', value: 'redis-postgresql' },
{ name: 'ā” Redis + MongoDB', value: 'redis-mongodb' },
{ name: 'š Supabase (PostgreSQL)', value: 'supabase' },
{ name: 'š„ Firebase', value: 'firebase' },
{ name: 'ā None', value: 'none' },
],
},
]);
answers.database = databaseAnswer.database;
}
// Authentication method
if (answers.backend !== 'none' || answers.frontend !== 'none') {
console.log(chalk_1.default.cyan(`š ${stepCounter++}. Authentication`));
const authAnswer = await inquirer_1.default.prompt([
{
type: 'list',
name: 'auth',
message: 'Authentication method:',
choices: [
{ name: 'š JWT-based', value: 'jwt' },
{ name: 'š OAuth 2.0 (Google, GitHub)', value: 'oauth' },
{ name: 'šŖ Session-based', value: 'session' },
{ name: '⨠Magic links', value: 'magic-links' },
{ name: 'š Supabase Auth', value: 'supabase-auth' },
{ name: 'š„ Firebase Auth', value: 'firebase-auth' },
{ name: 'š Auth0', value: 'auth0' },
{ name: 'š¤ Clerk', value: 'clerk' },
{ name: 'ā None', value: 'none' },
],
},
]);
answers.auth = authAnswer.auth;
}
console.log(chalk_1.default.green('\nā Technology stack configured\n'));
return answers;
}
function getStateManagementChoices(framework) {
switch (framework) {
case 'react':
case 'nextjs':
return [
{ name: 'Redux Toolkit', value: 'redux-toolkit' },
{ name: 'Zustand', value: 'zustand' },
{ name: 'MobX', value: 'mobx' },
{ name: 'Recoil', value: 'recoil' },
{ name: 'Context API (built-in)', value: 'context' },
{ name: 'TanStack Query (React Query)', value: 'tanstack-query' },
{ name: 'None', value: 'none' },
];
case 'vuejs':
return [
{ name: 'Vuex', value: 'vuex' },
{ name: 'Pinia', value: 'pinia' },
{ name: 'None', value: 'none' },
];
case 'angular':
return [
{ name: 'NgRx', value: 'ngrx' },
{ name: 'Akita', value: 'akita' },
{ name: 'RxJS (built-in)', value: 'rxjs' },
{ name: 'None', value: 'none' },
];
default:
return [{ name: 'None', value: 'none' }];
}
}
//# sourceMappingURL=techStack.js.map