UNPKG

synthia-ai-optimizer

Version:

Synthia Engine AI Optimizer - 集成LLM的智能构建优化建议

1 lines 65.9 kB
{"version":3,"sources":["../src/llm-client.ts","../src/code-analyzer.ts","../src/suggestion-generator.ts","../src/optimization-applier.ts","../src/index.ts"],"names":["OpenAI","chalk","ora","LLMClient","config","prompt","startTime","messages","response","responseTime","llmResponse","error","code","filePath","context","analysisResult","suggestion","systemMessage","userMessage","type","baseSystemMessage","message","_code","readFileSync","readdirSync","statSync","join","extname","CodeAnalyzer","projectPath","files","results","file","analysis","content","stats","basicAnalysis","aiAnalysis","aiResponse","extensions","scanDirectory","dir","items","item","fullPath","stat","ext","complexity","dependencies","issues","suggestions","controlFlowKeywords","keyword","regex","matches","importRegex","match","requireRegex","_filePath","functionRegex","lineNumber","varRegex","declaredVars","varName","useRegex","uses","consoleRegex","_content","issueTypes","issue","startIndex","braceCount","inFunction","endIndex","i","char","SuggestionGenerator","basicSuggestions","aiSuggestions","uniqueSuggestions","sortedSuggestions","_context","codeQualityIssues","data","index","seen","unique","key","a","b","scoreA","_analysisResult","score","estimatedSavings","codeAnalysis","hasIssues","hasHighComplexity","hasManyDependencies","fileTypes","writeFileSync","existsSync","copyFileSync","dirname","OptimizationApplier","result","beforeState","afterState","endTime","improvement","_suggestion","changes","configFiles","configFile","configPath","optimizedContent","packageJsonPath","_projectPath","optimized","state","sum","before","after","beforeSize","afterSize","absolute","percentage","backupDir","backupPath","backupDirPath","optimizationId","AIOptimizer","totalFiles","totalLines","totalSize","totalDependencies","strictness","avgComplexity","totalIssues","avgFileSize","createAIOptimizer","DEFAULT_AI_OPTIMIZER_CONFIG"],"mappings":"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","sourcesContent":["import OpenAI from 'openai'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport type { AIOptimizerConfig, LLMResponse, AIPrompt } from './types'\n\nexport class LLMClient {\n private client: OpenAI\n private config: AIOptimizerConfig\n private spinner = ora()\n\n constructor(config: AIOptimizerConfig) {\n this.config = config\n this.client = new OpenAI({\n apiKey: config.openai.apiKey,\n baseURL: config.openai.baseURL,\n })\n }\n\n /**\n * 发送提示到LLM\n */\n async sendPrompt(prompt: AIPrompt): Promise<LLMResponse> {\n this.spinner.start(`发送${prompt.type}提示到LLM...`)\n \n const startTime = Date.now()\n \n try {\n const messages = this.buildMessages(prompt)\n \n const response = await this.client.chat.completions.create({\n model: this.config.openai.model || 'gpt-4',\n messages,\n max_tokens: this.config.openai.maxTokens || 4000,\n temperature: this.config.openai.temperature || 0.1,\n })\n\n const endTime = Date.now()\n const responseTime = endTime - startTime\n\n const llmResponse: LLMResponse = {\n content: response.choices[0]?.message?.content || '',\n model: response.model,\n tokens: {\n prompt: response.usage?.prompt_tokens || 0,\n completion: response.usage?.completion_tokens || 0,\n total: response.usage?.total_tokens || 0,\n },\n responseTime,\n success: true\n }\n\n this.spinner.succeed(`LLM响应接收完成 (${responseTime}ms)`)\n return llmResponse\n\n } catch (error) {\n const endTime = Date.now()\n const responseTime = endTime - startTime\n\n this.spinner.fail(`LLM请求失败 (${responseTime}ms)`)\n console.error(chalk.red('LLM错误:'), error)\n\n return {\n content: '',\n model: this.config.openai.model || 'gpt-4',\n tokens: { prompt: 0, completion: 0, total: 0 },\n responseTime,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * 分析代码\n */\n async analyzeCode(code: string, filePath: string, context: any): Promise<LLMResponse> {\n const prompt: AIPrompt = {\n type: 'analysis',\n content: this.buildCodeAnalysisPrompt(code, filePath),\n context,\n input: { code },\n expectedFormat: 'json'\n }\n\n return this.sendPrompt(prompt)\n }\n\n /**\n * 生成优化建议\n */\n async generateOptimizationSuggestions(\n analysisResult: any,\n context: any\n ): Promise<LLMResponse> {\n const prompt: AIPrompt = {\n type: 'optimization',\n content: this.buildOptimizationPrompt(analysisResult),\n context,\n input: { stats: analysisResult },\n expectedFormat: 'json'\n }\n\n return this.sendPrompt(prompt)\n }\n\n /**\n * 解释优化建议\n */\n async explainOptimization(suggestion: any, context: any): Promise<LLMResponse> {\n const prompt: AIPrompt = {\n type: 'explanation',\n content: this.buildExplanationPrompt(suggestion),\n context,\n input: { config: suggestion },\n expectedFormat: 'markdown'\n }\n\n return this.sendPrompt(prompt)\n }\n\n /**\n * 代码审查\n */\n async reviewCode(code: string, filePath: string, context: any): Promise<LLMResponse> {\n const prompt: AIPrompt = {\n type: 'code-review',\n content: this.buildCodeReviewPrompt(code, filePath),\n context,\n input: { code },\n expectedFormat: 'json'\n }\n\n return this.sendPrompt(prompt)\n }\n\n /**\n * 构建消息\n */\n private buildMessages(prompt: AIPrompt): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n const systemMessage = this.getSystemMessage(prompt.type)\n const userMessage = this.buildUserMessage(prompt)\n\n return [\n { role: 'system', content: systemMessage },\n { role: 'user', content: userMessage }\n ]\n }\n\n /**\n * 获取系统消息\n */\n private getSystemMessage(type: string): string {\n const baseSystemMessage = `你是一个专业的前端工程化专家,专门帮助优化前端项目的构建性能、代码质量和开发体验。\n\n你的任务是根据用户提供的代码、配置和项目信息,提供专业的分析和优化建议。\n\n请确保你的建议:\n1. 基于最佳实践和行业标准\n2. 考虑项目的具体技术栈和约束\n3. 提供可操作的具体步骤\n4. 评估风险和收益\n5. 提供替代方案\n\n请用中文回复,并使用JSON格式输出结构化的结果。`\n\n switch (type) {\n case 'analysis':\n return baseSystemMessage + '\\n\\n请分析代码的性能、可维护性和最佳实践问题。'\n case 'optimization':\n return baseSystemMessage + '\\n\\n请提供具体的优化建议和实施步骤。'\n case 'explanation':\n return baseSystemMessage + '\\n\\n请详细解释优化建议的原理和实施方法。'\n case 'code-review':\n return baseSystemMessage + '\\n\\n请进行代码审查,指出问题和改进建议。'\n default:\n return baseSystemMessage\n }\n }\n\n /**\n * 构建用户消息\n */\n private buildUserMessage(prompt: AIPrompt): string {\n let message = prompt.content\n\n if (prompt.input.code) {\n message += `\\n\\n代码内容:\\n\\`\\`\\`\\n${prompt.input.code}\\n\\`\\`\\``\n }\n\n if (prompt.input.config) {\n message += `\\n\\n配置信息:\\n\\`\\`\\`json\\n${JSON.stringify(prompt.input.config, null, 2)}\\n\\`\\`\\``\n }\n\n if (prompt.input.stats) {\n message += `\\n\\n统计信息:\\n\\`\\`\\`json\\n${JSON.stringify(prompt.input.stats, null, 2)}\\n\\`\\`\\``\n }\n\n if (prompt.context) {\n message += `\\n\\n项目上下文:\\n\\`\\`\\`json\\n${JSON.stringify(prompt.context, null, 2)}\\n\\`\\`\\``\n }\n\n return message\n }\n\n /**\n * 构建代码分析提示\n */\n private buildCodeAnalysisPrompt(_code: string, filePath: string): string {\n return `请分析以下代码文件,识别性能问题、可维护性问题和最佳实践违规:\n\n文件路径: ${filePath}\n文件类型: ${this.getFileType(filePath)}\n\n请重点关注:\n1. 性能优化机会\n2. 代码质量问题\n3. 最佳实践违规\n4. 潜在的安全问题\n5. 可维护性改进\n\n请以JSON格式返回分析结果,包含问题列表和优化建议。`\n }\n\n /**\n * 构建优化提示\n */\n private buildOptimizationPrompt(analysisResult: any): string {\n return `基于以下分析结果,请提供具体的优化建议:\n\n${JSON.stringify(analysisResult, null, 2)}\n\n请为每个问题提供:\n1. 具体的解决方案\n2. 实施步骤\n3. 预期收益\n4. 风险评估\n5. 替代方案\n\n请以JSON格式返回优化建议。`\n }\n\n /**\n * 构建解释提示\n */\n private buildExplanationPrompt(suggestion: any): string {\n return `请详细解释以下优化建议:\n\n${JSON.stringify(suggestion, null, 2)}\n\n请包括:\n1. 为什么这个优化是有效的\n2. 如何实施这个优化\n3. 可能遇到的问题和解决方案\n4. 相关的技术背景知识\n5. 进一步的优化建议\n\n请用Markdown格式返回详细解释。`\n }\n\n /**\n * 构建代码审查提示\n */\n private buildCodeReviewPrompt(_code: string, filePath: string): string {\n return `请对以下代码进行全面的代码审查:\n\n文件路径: ${filePath}\n\n请检查:\n1. 代码风格和规范\n2. 性能问题\n3. 安全性问题\n4. 可维护性问题\n5. 最佳实践遵循情况\n6. 潜在的bug\n7. 代码重复\n8. 注释和文档\n\n请以JSON格式返回审查结果。`\n }\n\n /**\n * 获取文件类型\n */\n private getFileType(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase()\n \n switch (ext) {\n case 'ts':\n case 'tsx':\n return 'TypeScript'\n case 'js':\n case 'jsx':\n return 'JavaScript'\n case 'vue':\n return 'Vue'\n case 'css':\n return 'CSS'\n case 'scss':\n case 'sass':\n return 'SCSS'\n case 'html':\n return 'HTML'\n case 'json':\n return 'JSON'\n default:\n return 'Unknown'\n }\n }\n}\n","import { readFileSync, readdirSync, statSync } from 'fs-extra'\nimport { join, extname } from 'path'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport type { \n CodeAnalysisResult, \n CodeIssue, \n OptimizationSuggestion,\n AIOptimizerConfig,\n OptimizationContext \n} from './types'\nimport { LLMClient } from './llm-client'\n\nexport class CodeAnalyzer {\n private config: AIOptimizerConfig\n private llmClient: LLMClient\n private spinner = ora()\n\n constructor(config: AIOptimizerConfig) {\n this.config = config\n this.llmClient = new LLMClient(config)\n }\n\n /**\n * 分析项目代码\n */\n async analyzeProject(\n projectPath: string,\n context: OptimizationContext\n ): Promise<CodeAnalysisResult[]> {\n this.spinner.start('分析项目代码...')\n \n try {\n const files = this.getProjectFiles(projectPath)\n const results: CodeAnalysisResult[] = []\n\n for (const file of files) {\n try {\n const analysis = await this.analyzeFile(file, context)\n results.push(analysis)\n } catch (error) {\n console.warn(chalk.yellow(`跳过文件 ${file}: ${error}`))\n }\n }\n\n this.spinner.succeed(`代码分析完成: ${results.length} 个文件`)\n return results\n } catch (error) {\n this.spinner.fail('代码分析失败')\n throw error\n }\n }\n\n /**\n * 分析单个文件\n */\n async analyzeFile(\n filePath: string,\n context: OptimizationContext\n ): Promise<CodeAnalysisResult> {\n const content = readFileSync(filePath, 'utf-8')\n const stats = statSync(filePath)\n \n // 基础分析\n const basicAnalysis = this.performBasicAnalysis(content, filePath)\n \n // AI分析\n let aiAnalysis: any = {}\n if (this.config.analysis.enableCodeAnalysis) {\n try {\n const aiResponse = await this.llmClient.analyzeCode(content, filePath, context)\n if (aiResponse.success) {\n aiAnalysis = this.parseAIResponse(aiResponse.content)\n }\n } catch (error) {\n console.warn(chalk.yellow(`AI分析失败 ${filePath}: ${error}`))\n }\n }\n\n return {\n filePath,\n fileSize: stats.size,\n linesOfCode: content.split('\\n').length,\n complexity: basicAnalysis.complexity,\n dependencies: basicAnalysis.dependencies,\n issues: [...basicAnalysis.issues, ...(aiAnalysis.issues || [])],\n suggestions: [...basicAnalysis.suggestions, ...(aiAnalysis.suggestions || [])]\n }\n }\n\n /**\n * 获取项目文件\n */\n private getProjectFiles(projectPath: string): string[] {\n const files: string[] = []\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '.vue', '.css', '.scss']\n \n const scanDirectory = (dir: string) => {\n try {\n const items = readdirSync(dir)\n \n for (const item of items) {\n const fullPath = join(dir, item)\n const stat = statSync(fullPath)\n \n if (stat.isDirectory()) {\n // 跳过特定目录\n if (!['node_modules', '.git', 'dist', 'build', '.next'].includes(item)) {\n scanDirectory(fullPath)\n }\n } else if (stat.isFile()) {\n const ext = extname(item)\n if (extensions.includes(ext)) {\n files.push(fullPath)\n }\n }\n }\n } catch (error) {\n // 忽略无法访问的目录\n }\n }\n\n scanDirectory(projectPath)\n return files\n }\n\n /**\n * 执行基础分析\n */\n private performBasicAnalysis(content: string, filePath: string): {\n complexity: number\n dependencies: string[]\n issues: CodeIssue[]\n suggestions: OptimizationSuggestion[]\n } {\n const complexity = this.calculateComplexity(content)\n const dependencies = this.extractDependencies(content)\n const issues = this.detectBasicIssues(content, filePath)\n const suggestions = this.generateBasicSuggestions(content, filePath, issues)\n\n return {\n complexity,\n dependencies,\n issues,\n suggestions\n }\n }\n\n /**\n * 计算代码复杂度\n */\n private calculateComplexity(content: string): number {\n let complexity = 1 // 基础复杂度\n \n // 计算控制流复杂度\n const controlFlowKeywords = [\n 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'catch', 'try',\n '&&', '||', '?', ':', 'return', 'throw'\n ]\n \n for (const keyword of controlFlowKeywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'g')\n const matches = content.match(regex)\n if (matches) {\n complexity += matches.length\n }\n }\n \n return complexity\n }\n\n /**\n * 提取依赖关系\n */\n private extractDependencies(content: string): string[] {\n const dependencies: string[] = []\n \n // 提取 import 语句\n const importRegex = /import\\s+.*?\\s+from\\s+['\"]([^'\"]+)['\"]/g\n let match\n while ((match = importRegex.exec(content)) !== null) {\n dependencies.push(match[1])\n }\n \n // 提取 require 语句\n const requireRegex = /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g\n while ((match = requireRegex.exec(content)) !== null) {\n dependencies.push(match[1])\n }\n \n return [...new Set(dependencies)] // 去重\n }\n\n /**\n * 检测基础问题\n */\n private detectBasicIssues(content: string, _filePath: string): CodeIssue[] {\n const issues: CodeIssue[] = []\n \n // 检查长函数\n const functionRegex = /function\\s+\\w+\\s*\\([^)]*\\)\\s*{/g\n let match\n while ((match = functionRegex.exec(content)) !== null) {\n const lineNumber = content.substring(0, match.index).split('\\n').length\n const functionContent = this.extractFunctionContent(content, match.index)\n \n if (functionContent.split('\\n').length > 50) {\n issues.push({\n type: 'maintainability',\n severity: 'medium',\n message: '函数过长,建议拆分为更小的函数',\n line: lineNumber,\n fix: '将函数拆分为多个更小的函数'\n })\n }\n }\n \n // 检查未使用的变量\n const varRegex = /(?:let|const|var)\\s+(\\w+)/g\n const declaredVars = new Set<string>()\n \n while ((match = varRegex.exec(content)) !== null) {\n declaredVars.add(match[1])\n }\n \n // 检查变量使用\n for (const varName of declaredVars) {\n const useRegex = new RegExp(`\\\\b${varName}\\\\b`, 'g')\n const uses = content.match(useRegex)\n if (uses && uses.length === 1) {\n const lineNumber = content.indexOf(`let ${varName}`) || content.indexOf(`const ${varName}`) || content.indexOf(`var ${varName}`)\n if (lineNumber !== -1) {\n issues.push({\n type: 'maintainability',\n severity: 'low',\n message: `变量 '${varName}' 声明但未使用`,\n line: content.substring(0, lineNumber).split('\\n').length,\n fix: `删除未使用的变量 '${varName}'`\n })\n }\n }\n }\n \n // 检查console.log\n const consoleRegex = /console\\.(log|warn|error|info)/g\n while ((match = consoleRegex.exec(content)) !== null) {\n const lineNumber = content.substring(0, match.index).split('\\n').length\n issues.push({\n type: 'best-practice',\n severity: 'low',\n message: '生产代码中不应包含console语句',\n line: lineNumber,\n fix: '移除console语句或使用适当的日志库'\n })\n }\n \n return issues\n }\n\n /**\n * 生成基础建议\n */\n private generateBasicSuggestions(\n _content: string,\n filePath: string,\n issues: CodeIssue[]\n ): OptimizationSuggestion[] {\n const suggestions: OptimizationSuggestion[] = []\n \n // 基于问题生成建议\n const issueTypes = new Set(issues.map(issue => issue.type))\n \n if (issueTypes.has('maintainability')) {\n suggestions.push({\n id: `maintainability-${Date.now()}`,\n title: '提高代码可维护性',\n description: '重构代码以提高可读性和可维护性',\n impact: 'medium',\n difficulty: 'medium',\n estimatedSavings: {\n buildTime: 5\n },\n steps: [\n '拆分长函数',\n '提取重复代码',\n '添加类型注解',\n '改进变量命名'\n ],\n affectedFiles: [filePath],\n risk: 'low',\n autoApplicable: false\n })\n }\n \n if (issueTypes.has('performance')) {\n suggestions.push({\n id: `performance-${Date.now()}`,\n title: '优化性能',\n description: '优化代码以提高运行时性能',\n impact: 'high',\n difficulty: 'medium',\n estimatedSavings: {\n runtimePerformance: 10\n },\n steps: [\n '优化循环和条件判断',\n '减少不必要的计算',\n '使用更高效的数据结构',\n '实现缓存机制'\n ],\n affectedFiles: [filePath],\n risk: 'medium',\n autoApplicable: false\n })\n }\n \n return suggestions\n }\n\n /**\n * 提取函数内容\n */\n private extractFunctionContent(content: string, startIndex: number): string {\n let braceCount = 0\n let inFunction = false\n let endIndex = startIndex\n \n for (let i = startIndex; i < content.length; i++) {\n const char = content[i]\n \n if (char === '{') {\n braceCount++\n inFunction = true\n } else if (char === '}') {\n braceCount--\n if (inFunction && braceCount === 0) {\n endIndex = i\n break\n }\n }\n }\n \n return content.substring(startIndex, endIndex + 1)\n }\n\n /**\n * 解析AI响应\n */\n private parseAIResponse(content: string): any {\n try {\n return JSON.parse(content)\n } catch (error) {\n console.warn(chalk.yellow('AI响应解析失败,使用默认值'))\n return { issues: [], suggestions: [] }\n }\n }\n}\n","import chalk from 'chalk'\nimport ora from 'ora'\nimport type { \n OptimizationSuggestion, \n ProjectAnalysisResult,\n AIOptimizerConfig,\n OptimizationContext,\n CodeAnalysisResult\n} from './types'\nimport { LLMClient } from './llm-client'\n\nexport class SuggestionGenerator {\n private config: AIOptimizerConfig\n private llmClient: LLMClient\n private spinner = ora()\n\n constructor(config: AIOptimizerConfig) {\n this.config = config\n this.llmClient = new LLMClient(config)\n }\n\n /**\n * 生成优化建议\n */\n async generateSuggestions(\n analysisResult: ProjectAnalysisResult,\n context: OptimizationContext\n ): Promise<OptimizationSuggestion[]> {\n this.spinner.start('生成AI优化建议...')\n \n try {\n const suggestions: OptimizationSuggestion[] = []\n \n // 基础建议\n const basicSuggestions = this.generateBasicSuggestions(analysisResult, context)\n suggestions.push(...basicSuggestions)\n \n // AI建议\n if (this.config.analysis.enableCodeAnalysis) {\n const aiSuggestions = await this.generateAISuggestions(analysisResult, context)\n suggestions.push(...aiSuggestions)\n }\n \n // 去重和排序\n const uniqueSuggestions = this.deduplicateSuggestions(suggestions)\n const sortedSuggestions = this.prioritizeSuggestions(uniqueSuggestions, analysisResult)\n \n this.spinner.succeed(`优化建议生成完成: ${sortedSuggestions.length} 个`)\n return sortedSuggestions.slice(0, this.config.optimization.maxSuggestions)\n } catch (error) {\n this.spinner.fail('优化建议生成失败')\n throw error\n }\n }\n\n /**\n * 生成基础建议\n */\n private generateBasicSuggestions(\n analysisResult: ProjectAnalysisResult,\n _context: OptimizationContext\n ): OptimizationSuggestion[] {\n const suggestions: OptimizationSuggestion[] = []\n \n // 包大小优化建议\n if (analysisResult.stats.bundleSize > 1024 * 1024) { // 1MB\n suggestions.push({\n id: 'bundle-size-optimization',\n title: '优化包大小',\n description: '当前包大小超过1MB,建议进行代码分割和懒加载优化',\n impact: 'high',\n difficulty: 'medium',\n estimatedSavings: {\n bundleSize: 30\n },\n steps: [\n '启用代码分割',\n '实现路由级别的懒加载',\n '移除未使用的依赖',\n '优化图片和静态资源'\n ],\n affectedFiles: this.getAffectedFiles(analysisResult, ['config', 'router', 'components']),\n risk: 'low',\n autoApplicable: true\n })\n }\n \n // 构建时间优化建议\n if (analysisResult.stats.buildTime > 30000) { // 30s\n suggestions.push({\n id: 'build-time-optimization',\n title: '优化构建时间',\n description: '当前构建时间超过30秒,建议启用缓存和并行构建',\n impact: 'high',\n difficulty: 'easy',\n estimatedSavings: {\n buildTime: 50\n },\n steps: [\n '启用构建缓存',\n '配置并行构建',\n '优化依赖解析',\n '使用更快的构建工具'\n ],\n affectedFiles: this.getAffectedFiles(analysisResult, ['config']),\n risk: 'low',\n autoApplicable: true\n })\n }\n \n // 依赖优化建议\n if (analysisResult.stats.dependencies > 100) {\n suggestions.push({\n id: 'dependency-optimization',\n title: '优化依赖管理',\n description: '依赖数量过多,建议清理未使用的依赖',\n impact: 'medium',\n difficulty: 'easy',\n estimatedSavings: {\n bundleSize: 20,\n buildTime: 15\n },\n steps: [\n '分析依赖使用情况',\n '移除未使用的依赖',\n '合并相似功能的依赖',\n '使用更轻量的替代方案'\n ],\n affectedFiles: ['package.json'],\n risk: 'medium',\n autoApplicable: false\n })\n }\n \n // 代码质量建议\n const codeQualityIssues = this.analyzeCodeQuality(analysisResult.codeAnalysis)\n if (codeQualityIssues.length > 0) {\n suggestions.push({\n id: 'code-quality-improvement',\n title: '提升代码质量',\n description: '发现代码质量问题,建议进行重构和优化',\n impact: 'medium',\n difficulty: 'medium',\n estimatedSavings: {\n buildTime: 10,\n runtimePerformance: 15\n },\n steps: [\n '重构复杂函数',\n '添加类型注解',\n '改进错误处理',\n '增加单元测试'\n ],\n affectedFiles: codeQualityIssues.map(issue => issue.filePath),\n risk: 'medium',\n autoApplicable: false\n })\n }\n \n return suggestions\n }\n\n /**\n * 生成AI建议\n */\n private async generateAISuggestions(\n analysisResult: ProjectAnalysisResult,\n context: OptimizationContext\n ): Promise<OptimizationSuggestion[]> {\n try {\n const aiResponse = await this.llmClient.generateOptimizationSuggestions(analysisResult, context)\n \n if (!aiResponse.success) {\n console.warn(chalk.yellow('AI建议生成失败,使用基础建议'))\n return []\n }\n \n return this.parseAISuggestions(aiResponse.content)\n } catch (error) {\n console.warn(chalk.yellow(`AI建议生成失败: ${error}`))\n return []\n }\n }\n\n /**\n * 解析AI建议\n */\n private parseAISuggestions(content: string): OptimizationSuggestion[] {\n try {\n const data = JSON.parse(content)\n \n if (Array.isArray(data.suggestions)) {\n return data.suggestions.map((suggestion: any, index: number) => ({\n id: suggestion.id || `ai-suggestion-${index}`,\n title: suggestion.title || 'AI优化建议',\n description: suggestion.description || '',\n impact: suggestion.impact || 'medium',\n difficulty: suggestion.difficulty || 'medium',\n estimatedSavings: suggestion.estimatedSavings || {},\n steps: suggestion.steps || [],\n affectedFiles: suggestion.affectedFiles || [],\n risk: suggestion.risk || 'medium',\n autoApplicable: suggestion.autoApplicable || false\n }))\n }\n \n return []\n } catch (error) {\n console.warn(chalk.yellow('AI建议解析失败'))\n return []\n }\n }\n\n /**\n * 去重建议\n */\n private deduplicateSuggestions(suggestions: OptimizationSuggestion[]): OptimizationSuggestion[] {\n const seen = new Set<string>()\n const unique: OptimizationSuggestion[] = []\n \n for (const suggestion of suggestions) {\n const key = `${suggestion.title}-${suggestion.description}`\n if (!seen.has(key)) {\n seen.add(key)\n unique.push(suggestion)\n }\n }\n \n return unique\n }\n\n /**\n * 优先级排序\n */\n private prioritizeSuggestions(\n suggestions: OptimizationSuggestion[],\n analysisResult: ProjectAnalysisResult\n ): OptimizationSuggestion[] {\n return suggestions.sort((a, b) => {\n // 计算优先级分数\n const scoreA = this.calculatePriorityScore(a, analysisResult)\n const scoreB = this.calculatePriorityScore(b, analysisResult)\n \n return scoreB - scoreA // 降序排列\n })\n }\n\n /**\n * 计算优先级分数\n */\n private calculatePriorityScore(suggestion: OptimizationSuggestion, _analysisResult: ProjectAnalysisResult): number {\n let score = 0\n \n // 影响程度权重\n const impactWeights = { low: 1, medium: 2, high: 3 }\n score += impactWeights[suggestion.impact] * 10\n \n // 实施难度权重(难度越低分数越高)\n const difficultyWeights = { easy: 3, medium: 2, hard: 1 }\n score += difficultyWeights[suggestion.difficulty] * 5\n \n // 风险权重(风险越低分数越高)\n const riskWeights = { low: 3, medium: 2, high: 1 }\n score += riskWeights[suggestion.risk] * 3\n \n // 自动应用权重\n if (suggestion.autoApplicable) {\n score += 5\n }\n \n // 预计节省权重\n const estimatedSavings = suggestion.estimatedSavings\n if (estimatedSavings.bundleSize) {\n score += Math.min(estimatedSavings.bundleSize / 10, 10)\n }\n if (estimatedSavings.buildTime) {\n score += Math.min(estimatedSavings.buildTime / 5, 10)\n }\n if (estimatedSavings.runtimePerformance) {\n score += Math.min(estimatedSavings.runtimePerformance / 5, 10)\n }\n \n return score\n }\n\n /**\n * 分析代码质量\n */\n private analyzeCodeQuality(codeAnalysis: CodeAnalysisResult[]): CodeAnalysisResult[] {\n return codeAnalysis.filter(analysis => {\n const hasIssues = analysis.issues.length > 0\n const hasHighComplexity = analysis.complexity > 10\n const hasManyDependencies = analysis.dependencies.length > 20\n \n return hasIssues || hasHighComplexity || hasManyDependencies\n })\n }\n\n /**\n * 获取受影响的文件\n */\n private getAffectedFiles(\n analysisResult: ProjectAnalysisResult,\n fileTypes: string[]\n ): string[] {\n return analysisResult.codeAnalysis\n .map(analysis => analysis.filePath)\n .filter(filePath => \n fileTypes.some(type => filePath.includes(type))\n )\n }\n}\n","import { readFileSync, writeFileSync, existsSync, copyFileSync } from 'fs-extra'\nimport { join, dirname } from 'path'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport type { \n OptimizationSuggestion, \n OptimizationResult,\n AIOptimizerConfig \n} from './types'\n\nexport class OptimizationApplier {\n private config: AIOptimizerConfig\n private spinner = ora()\n private appliedOptimizations: Map<string, OptimizationResult> = new Map()\n\n constructor(config: AIOptimizerConfig) {\n this.config = config\n }\n\n /**\n * 应用优化建议\n */\n async applyOptimization(\n suggestion: OptimizationSuggestion,\n projectPath: string\n ): Promise<OptimizationResult> {\n this.spinner.start(`应用优化建议: ${suggestion.title}`)\n \n try {\n // 创建备份\n if (this.config.optimization.createBackup) {\n await this.createBackup(suggestion.affectedFiles, projectPath)\n }\n \n // 应用优化\n const result = await this.executeOptimization(suggestion, projectPath)\n \n // 记录结果\n this.appliedOptimizations.set(suggestion.id, result)\n \n this.spinner.succeed(`优化建议应用完成: ${suggestion.title}`)\n return result\n } catch (error) {\n this.spinner.fail(`优化建议应用失败: ${suggestion.title}`)\n console.error(chalk.red('应用错误:'), error)\n \n // 回滚更改\n if (this.config.optimization.createBackup) {\n await this.rollbackOptimization(suggestion.id)\n }\n \n throw error\n }\n }\n\n /**\n * 批量应用优化建议\n */\n async applyOptimizations(\n suggestions: OptimizationSuggestion[],\n projectPath: string\n ): Promise<OptimizationResult[]> {\n this.spinner.start(`批量应用 ${suggestions.length} 个优化建议...`)\n \n const results: OptimizationResult[] = []\n \n for (const suggestion of suggestions) {\n try {\n const result = await this.applyOptimization(suggestion, projectPath)\n results.push(result)\n } catch (error) {\n console.warn(chalk.yellow(`跳过优化建议 ${suggestion.title}: ${error}`))\n results.push({\n id: suggestion.id,\n type: 'code',\n before: { value: null, metrics: {} },\n after: { value: null, metrics: {} },\n improvement: { percentage: 0, absolute: 0, unit: '' },\n status: 'failed',\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n \n this.spinner.succeed(`批量应用完成: ${results.length} 个`)\n return results\n }\n\n /**\n * 执行优化\n */\n private async executeOptimization(\n suggestion: OptimizationSuggestion,\n projectPath: string\n ): Promise<OptimizationResult> {\n // 记录优化前状态\n const beforeState = await this.captureState(suggestion.affectedFiles, projectPath)\n \n // 根据建议类型执行不同的优化\n let afterState: any\n \n switch (suggestion.id) {\n case 'bundle-size-optimization':\n afterState = await this.applyBundleSizeOptimization(suggestion, projectPath)\n break\n case 'build-time-optimization':\n afterState = await this.applyBuildTimeOptimization(suggestion, projectPath)\n break\n case 'dependency-optimization':\n afterState = await this.applyDependencyOptimization(suggestion, projectPath)\n break\n case 'code-quality-improvement':\n afterState = await this.applyCodeQualityOptimization(suggestion, projectPath)\n break\n default:\n afterState = await this.applyGenericOptimization(suggestion, projectPath)\n }\n \n const endTime = Date.now()\n // 计算改进程度\n const improvement = this.calculateImprovement(beforeState, afterState)\n \n return {\n id: suggestion.id,\n type: this.getOptimizationType(suggestion),\n b