UNPKG

faj-cli

Version:

FAJ - A powerful CLI resume builder with AI enhancement and multi-format export

164 lines 7.54 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AnalyzeCommand = void 0; const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const Logger_1 = require("../../utils/Logger"); const ProjectAnalyzer_1 = require("../../core/analyzer/ProjectAnalyzer"); const ResumeManager_1 = require("../../core/resume/ResumeManager"); const ConfigManager_1 = require("../../core/config/ConfigManager"); class AnalyzeCommand { logger; projectAnalyzer; resumeManager; configManager; constructor() { this.logger = new Logger_1.Logger('AnalyzeCommand'); this.projectAnalyzer = new ProjectAnalyzer_1.ProjectAnalyzer(); this.resumeManager = ResumeManager_1.ResumeManager.getInstance(); this.configManager = ConfigManager_1.ConfigManager.getInstance(); } register(program) { program .command('analyze <paths...>') .description('Analyze projects and generate resume') .option('-o, --output <format>', 'Output format (json, md, html)', 'json') .option('--dry-run', 'Perform analysis without generating resume') .option('--no-ai', 'Skip AI resume generation') .action(async (paths, options) => { try { await this.execute(paths, options); } catch (error) { this.logger.error('Analysis failed', error); process.exit(1); } }); } async execute(paths, options) { // Check if user is configured const profile = await this.configManager.get('profile'); if (!profile || profile.role !== 'developer') { console.log(chalk_1.default.yellow('\n⚠ Developer profile not configured.')); console.log('Please run ' + chalk_1.default.cyan('faj init') + ' first.'); return; } console.log(chalk_1.default.cyan(`\n📊 Analyzing ${paths.length} project(s)...\n`)); const analyses = []; // Analyze each project for (const path of paths) { const spinner = (0, ora_1.default)(`Analyzing ${path}...`).start(); try { const analysis = await this.projectAnalyzer.analyze(path); analyses.push(analysis); spinner.succeed(`Analyzed ${path}`); // Display analysis summary console.log(chalk_1.default.gray(' Languages: ') + Array.from(analysis.languages.keys()).join(', ')); console.log(chalk_1.default.gray(' Frameworks: ') + analysis.frameworks.join(', ')); console.log(chalk_1.default.gray(' Complexity: ') + analysis.complexity); console.log(chalk_1.default.gray(' Files: ') + analysis.metrics.filesCount); console.log(chalk_1.default.gray(' Lines of code: ') + analysis.metrics.linesOfCode); console.log(); } catch (error) { spinner.fail(`Failed to analyze ${path}: ${error.message}`); if (!options.force) { throw error; } } } if (analyses.length === 0) { console.log(chalk_1.default.red('✗ No projects were successfully analyzed.')); return; } // Display highlights console.log(chalk_1.default.cyan('\n📋 Project Highlights:\n')); for (const analysis of analyses) { console.log(chalk_1.default.bold(`${analysis.path}:`)); for (const highlight of analysis.highlights) { console.log(chalk_1.default.gray(' • ') + highlight); } console.log(); } if (options.dryRun) { console.log(chalk_1.default.yellow('\n⚠ Dry run mode - resume not generated.')); // Output analysis in requested format if (options.output === 'json') { console.log(JSON.stringify(analyses, null, 2)); } return; } // Generate resume using AI if (!options.noAi) { const aiSpinner = (0, ora_1.default)('Generating resume with AI...').start(); try { await this.resumeManager.generateFromProjects(analyses); aiSpinner.succeed('Resume generated successfully!'); // Export in requested format const exported = await this.resumeManager.export(options.output); if (options.output === 'json') { console.log('\n' + exported); } else { // Save to file const filename = `resume.${options.output}`; const fs = await Promise.resolve().then(() => __importStar(require('fs/promises'))); await fs.writeFile(filename, exported, 'utf-8'); console.log(chalk_1.default.green(`\n✓ Resume saved to ${filename}`)); } console.log(chalk_1.default.cyan('\nNext steps:')); console.log(' • Review your resume: ' + chalk_1.default.cyan('faj resume show')); console.log(' • Update if needed: ' + chalk_1.default.cyan('faj resume update')); console.log(' • Publish to network: ' + chalk_1.default.cyan('faj publish')); } catch (error) { aiSpinner.fail(`Failed to generate resume: ${error.message}`); if (error.message.includes('API key')) { console.log(chalk_1.default.yellow('\nTip: Configure your AI provider with:')); console.log(chalk_1.default.cyan(' faj config ai')); } } } else { console.log(chalk_1.default.yellow('\n⚠ AI generation skipped. Resume not generated.')); } } } exports.AnalyzeCommand = AnalyzeCommand; //# sourceMappingURL=analyze.js.map