UNPKG

synthia-ai-system

Version:

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

1 lines 66.8 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 } 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(\n code: string,\n filePath: string,\n context: any\n ): 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(\n suggestion: any,\n context: any\n ): 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(\n code: string,\n filePath: string,\n context: any\n ): 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(\n prompt: AIPrompt\n ): 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 (\n baseSystemMessage + '\\n\\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(\n content,\n filePath,\n context\n );\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: [\n ...basicAnalysis.suggestions,\n ...(aiAnalysis.suggestions || []),\n ],\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 (\n !['node_modules', '.git', 'dist', 'build', '.next'].includes(item)\n ) {\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(\n content: string,\n filePath: string\n ): {\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(\n content,\n filePath,\n issues\n );\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',\n 'else',\n 'for',\n 'while',\n 'do',\n 'switch',\n 'case',\n 'catch',\n 'try',\n '&&',\n '||',\n '?',\n ':',\n 'return',\n '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 =\n content.indexOf(`let ${varName}`) ||\n content.indexOf(`const ${varName}`) ||\n 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 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(\n analysisResult,\n context\n );\n suggestions.push(...basicSuggestions);\n\n // AI建议\n if (this.config.analysis.enableCodeAnalysis) {\n const aiSuggestions = await this.generateAISuggestions(\n analysisResult,\n context\n );\n suggestions.push(...aiSuggestions);\n }\n\n // 去重和排序\n const uniqueSuggestions = this.deduplicateSuggestions(suggestions);\n const sortedSuggestions = this.prioritizeSuggestions(\n uniqueSuggestions,\n analysisResult\n );\n\n this.spinner.succeed(`优化建议生成完成: ${sortedSuggestions.length} 个`);\n return sortedSuggestions.slice(\n 0,\n this.config.optimization.maxSuggestions\n );\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) {\n // 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, [\n 'config',\n 'router',\n 'components',\n ]),\n risk: 'low',\n autoApplicable: true,\n });\n }\n\n // 构建时间优化建议\n if (analysisResult.stats.buildTime > 30000) {\n // 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(\n analysisResult.codeAnalysis\n );\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 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(\n analysisResult,\n context\n );\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(\n suggestions: OptimizationSuggestion[]\n ): 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(\n suggestion: OptimizationSuggestion,\n _analysisResult: ProjectAnalysisResult\n ): 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(\n codeAnalysis: CodeAnalysisResult[]\n ): 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 => fileTypes.some(type => filePath.includes(type)));\n }\n}\n","import {\n readFileSync,\n writeFileSync,\n existsSync,\n copyFileSync,\n} 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(\n chalk.yellow(`跳过优化建议 ${suggestion.title}: ${error}`)\n );\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(\n suggestion.affectedFiles,\n projectPath\n );\n\n // 根据建议类型执行不同的优化\n let afterState: any;\n\n switch (suggestion.id) {\n case 'bundle-size-optimization':\n afterState = await this.applyBundleSizeOptimization(\n suggestion,\n projectPath\n );\n break;\n case 'build-time-optimization':\n afterState = await this.applyBuildTimeOptimization(\n suggestion,\n projectPath\n );\n break;\n case 'dependency-optimization':\n afterState = await this.applyD