faj-cli
Version:
FAJ - A powerful CLI resume builder with AI enhancement and multi-format export
164 lines • 7.54 kB
JavaScript
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
;