UNPKG

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

328 lines (317 loc) • 13.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.runRetrofitPrompts = runRetrofitPrompts; const projectInfo_1 = require("./projectInfo"); const ideSelection_1 = require("./ideSelection"); const prdInput_1 = require("./prdInput"); const projectConfig_1 = require("./projectConfig"); const inquirer_1 = __importDefault(require("inquirer")); const chalk_1 = __importDefault(require("chalk")); async function runRetrofitPrompts(basicAnalysis, detailedAnalysis, ideOverride) { console.log(chalk_1.default.blue.bold('\nšŸ”§ Retrofitting Configuration\n')); console.log(chalk_1.default.gray("Based on your project analysis, let's configure Context Forge.\n")); console.log(chalk_1.default.gray('Step 1/5: Project information...')); // Step 1: Confirm or adjust project info const confirmedInfo = await confirmProjectInfo(basicAnalysis); // Step 2: IDE selection (use override or ask) console.log(chalk_1.default.gray('Step 2/5: IDE selection...')); const targetIDEs = ideOverride || (await (0, ideSelection_1.ideSelection)()); // Step 3: PRD input (different flow for retrofit) console.log(chalk_1.default.gray('Step 3/5: PRD configuration...')); const prd = await retrofitPrdInput(basicAnalysis, detailedAnalysis); // Step 4: Project configuration console.log(chalk_1.default.gray('Step 4/5: Project settings...')); const config = await (0, projectConfig_1.projectConfig)(); // Step 5: Feature selection based on analysis console.log(chalk_1.default.gray('Step 5/5: Feature selection...')); const selectedFeatures = await retrofitFeatures(basicAnalysis, detailedAnalysis); return { ...confirmedInfo, targetIDEs, prd, techStack: mapAnalysisToTechStack(basicAnalysis), features: selectedFeatures, ...config, isRetrofit: true, plannedFeatures: prd.userStories || [], }; } async function confirmProjectInfo(analysis) { console.log(chalk_1.default.cyan('šŸ“‹ Project Information')); console.log(chalk_1.default.gray('We detected the following about your project:\n')); console.log(` • Type: ${analysis.projectType}`); console.log(` • Tech Stack: ${analysis.techStack.join(', ')}`); console.log(` • Files: ${analysis.fileStats.total} total, ${analysis.fileStats.components} components`); const { confirmInfo } = await inquirer_1.default.prompt([ { type: 'confirm', name: 'confirmInfo', message: 'Is this information correct?', default: true, }, ]); if (confirmInfo) { // Use detected information and ask for basic details const { projectName, description } = await inquirer_1.default.prompt([ { type: 'input', name: 'projectName', message: 'Project name:', default: process.cwd().split('/').pop(), validate: (input) => input.trim().length > 0 || 'Project name is required', }, { type: 'input', name: 'description', message: 'Project description:', validate: (input) => input.trim().length > 0 || 'Description is required', }, ]); return { projectName, description, projectType: analysis.projectType.toLowerCase(), }; } else { // Fall back to manual entry return await (0, projectInfo_1.projectInfo)(); } } async function retrofitPrdInput(basicAnalysis, detailedAnalysis) { console.log(chalk_1.default.cyan('\nšŸ“ Product Requirements')); const hasExistingDocs = basicAnalysis.existingDocs.length > 0; if (hasExistingDocs) { // Limit displayed docs to first 5 for readability const displayDocs = basicAnalysis.existingDocs.slice(0, 5); const moreCount = basicAnalysis.existingDocs.length - 5; const docsDisplay = moreCount > 0 ? `${displayDocs.join(', ')} (+${moreCount} more)` : displayDocs.join(', '); console.log(chalk_1.default.gray(`Found existing documentation: ${docsDisplay}`)); const { useExistingDocs } = await inquirer_1.default.prompt([ { type: 'confirm', name: 'useExistingDocs', message: 'Analyze existing documentation to understand current state?', default: true, }, ]); if (useExistingDocs) { console.log(chalk_1.default.cyan('\nšŸ“š Analyzing existing documentation...')); // TODO: Actually read and analyze the existing docs const existingContext = `Project has ${basicAnalysis.existingDocs.length} documentation files describing current implementation.`; console.log(chalk_1.default.cyan('\nšŸš€ Planning Future Development')); console.log(chalk_1.default.gray('What features or improvements are you planning to add?\n')); const { futureRequirements } = await inquirer_1.default.prompt([ { type: 'editor', name: 'futureRequirements', message: 'Describe planned features and improvements:', default: '## Planned Features\n\n- Feature 1: \n- Feature 2: \n- Feature 3: \n\n## Technical Improvements\n\n- \n\n## Timeline\n\n- ', }, ]); // Parse features from the markdown const featureLines = futureRequirements .split('\n') .filter((line) => line.trim().startsWith('- ') && line.includes(':')); const userStories = featureLines.map((line) => line.trim().substring(2)); return { content: `# Product Requirements Document - ${new Date().toLocaleDateString()} ## Current State ${existingContext} ## Future Development ${futureRequirements} ## Context This is a retrofit of an existing project. The above requirements represent the next phase of development building upon the existing codebase.`, userStories, }; } } // Generate auto-PRD suggestion based on analysis const suggestedPrd = generateAutoPrd(basicAnalysis, detailedAnalysis); console.log(chalk_1.default.gray("\nBased on your codebase analysis, here's a suggested PRD:\n")); console.log(chalk_1.default.dim(suggestedPrd.substring(0, 300) + '...')); const { prdChoice } = await inquirer_1.default.prompt([ { type: 'list', name: 'prdChoice', message: 'How would you like to handle the PRD?', choices: [ { name: 'Use AI-generated PRD based on analysis', value: 'auto' }, { name: 'Write custom PRD', value: 'custom' }, { name: 'Enhance AI-generated PRD', value: 'enhance' }, ], }, ]); switch (prdChoice) { case 'auto': return { content: suggestedPrd }; case 'custom': return await (0, prdInput_1.prdInput)(); case 'enhance': const { enhancedPrd } = await inquirer_1.default.prompt([ { type: 'editor', name: 'enhancedPrd', message: 'Enhance the generated PRD:', default: suggestedPrd, }, ]); return { content: enhancedPrd }; default: return { content: suggestedPrd }; } } async function retrofitFeatures(basicAnalysis, _detailedAnalysis) { console.log(chalk_1.default.cyan('\nšŸŽÆ Feature Selection')); // Suggest features based on analysis const suggestedFeatures = detectFeaturesFromAnalysis(basicAnalysis); if (suggestedFeatures.length > 0) { console.log(chalk_1.default.gray('Detected features in your project:')); suggestedFeatures.forEach((feature) => { console.log(` • ${feature}`); }); const { confirmFeatures } = await inquirer_1.default.prompt([ { type: 'confirm', name: 'confirmFeatures', message: 'Include these detected features?', default: true, }, ]); if (confirmFeatures) { return suggestedFeatures.map((featureName, index) => ({ id: `detected-${index}`, name: featureName, description: `Detected from project analysis: ${featureName}`, priority: 'must-have', complexity: 'medium', category: 'integration', })); } } // Manual feature selection const { features: manualFeatures } = await inquirer_1.default.prompt([ { type: 'checkbox', name: 'features', message: 'Select features for your project:', choices: [ 'Authentication & Authorization', 'Database Integration', 'API Development', 'Frontend Components', 'State Management', 'Testing Framework', 'Deployment Pipeline', 'Monitoring & Analytics', 'File Upload/Storage', 'Real-time Features', 'Search Functionality', 'Payment Integration', 'Email/Notifications', 'Admin Dashboard', 'Mobile Responsive', ], }, ]); return manualFeatures.map((featureName, index) => ({ id: `manual-${index}`, name: featureName, description: `Manually selected feature: ${featureName}`, priority: 'must-have', complexity: 'medium', category: 'integration', })); } function mapAnalysisToTechStack(analysis) { // Map the detected tech stack to our expected format const stack = {}; // Frontend if (analysis.techStack.includes('React')) stack.frontend = 'react'; else if (analysis.techStack.includes('Next.js')) stack.frontend = 'nextjs'; else if (analysis.techStack.includes('Vue.js')) stack.frontend = 'vue'; else if (analysis.techStack.includes('Angular')) stack.frontend = 'angular'; // Backend if (analysis.techStack.includes('Express.js')) stack.backend = 'express'; else if (analysis.techStack.includes('Fastify')) stack.backend = 'fastify'; else if (analysis.projectType.includes('Python')) stack.backend = 'fastapi'; // Database if (analysis.techStack.includes('MongoDB')) stack.database = 'mongodb'; else if (analysis.techStack.includes('PostgreSQL')) stack.database = 'postgresql'; else if (analysis.techStack.includes('MySQL')) stack.database = 'mysql'; else if (analysis.techStack.includes('SQLite')) stack.database = 'sqlite'; // Auth stack.auth = 'jwt'; // Default assumption return stack; } function generateAutoPrd(basicAnalysis, detailedAnalysis) { const { projectType, techStack, fileStats } = basicAnalysis; return `# Product Requirements Document ## Project Overview This is a ${projectType} application built with ${techStack.join(', ')}. ## Current State Analysis - **Total Files**: ${fileStats.total} - **Components**: ${fileStats.components} - **API Routes**: ${fileStats.routes} - **Test Coverage**: ${fileStats.tests} test files - **Configuration Files**: ${fileStats.config} ## Technology Stack ${techStack.map((tech) => `- ${tech}`).join('\n')} ## Key Features Based on the codebase analysis, this application appears to include: ${detectFeaturesFromAnalysis(basicAnalysis) .map((feature) => `- ${feature}`) .join('\n')} ${detailedAnalysis ? `## AI Insights ${detailedAnalysis.insights.map((insight) => `- ${insight}`).join('\n')} ## Recommendations ${detailedAnalysis.recommendations.map((rec) => `- ${rec}`).join('\n')}` : ''} ## Development Goals 1. Maintain existing functionality while improving code organization 2. Enhance documentation for better developer experience 3. Implement best practices for ${projectType} development 4. Ensure scalable architecture for future growth ## Success Criteria - Clear, comprehensive documentation - Well-organized codebase structure - Improved developer onboarding experience - Enhanced AI assistant integration`; } function detectFeaturesFromAnalysis(analysis) { const features = []; if (analysis.fileStats.routes > 0) features.push('API Development'); if (analysis.fileStats.components > 0) features.push('Frontend Components'); if (analysis.techStack.includes('MongoDB') || analysis.techStack.includes('PostgreSQL')) { features.push('Database Integration'); } if (analysis.fileStats.tests > 0) features.push('Testing Framework'); if (analysis.techStack.includes('TypeScript')) features.push('Type Safety'); if (analysis.techStack.includes('Tailwind CSS')) features.push('Styling System'); if (analysis.techStack.includes('Prisma')) features.push('ORM Integration'); if (analysis.techStack.includes('Docker')) features.push('Containerization'); return features; } //# sourceMappingURL=retrofit.js.map