UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

1,034 lines (827 loc) 29.3 kB
--- ## Execution Modes **Choose your execution mode:** ### 1. YOLO Mode - Fast, Autonomous (0-1 prompts) - Autonomous decision making with logging - Minimal user interaction - **Best for:** Simple, deterministic tasks ### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]** - Explicit decision checkpoints - Educational explanations - **Best for:** Learning, complex decisions ### 3. Pre-Flight Planning - Comprehensive Upfront Planning - Task analysis phase (identify all ambiguities) - Zero ambiguity execution - **Best for:** Ambiguous requirements, critical work **Parameter:** `mode` (optional, default: `interactive`) --- ## Task Definition (AIOS Task Format V1.0) ```yaml task: devOptimizePerformance() responsável: Dex (Builder) responsavel_type: Agente atomic_layer: Strategy **Entrada:** - campo: task tipo: string origem: User Input obrigatório: true validação: Must be registered task - campo: parameters tipo: object origem: User Input obrigatório: false validação: Valid task parameters - campo: mode tipo: string origem: User Input obrigatório: false validação: yolo|interactive|pre-flight **Saída:** - campo: execution_result tipo: object destino: Memory persistido: false - campo: logs tipo: array destino: File (.ai/logs/*) persistido: true - campo: state tipo: object destino: State management persistido: true ``` --- ## Pre-Conditions **Purpose:** Validate prerequisites BEFORE task execution (blocking) **Checklist:** ```yaml pre-conditions: - [ ] Task is registered; required parameters provided; dependencies met tipo: pre-condition blocker: true validação: | Check task is registered; required parameters provided; dependencies met error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met" ``` --- ## Post-Conditions **Purpose:** Validate execution success AFTER task completes **Checklist:** ```yaml post-conditions: - [ ] Task completed; exit code 0; expected outputs created tipo: post-condition blocker: true validação: | Verify task completed; exit code 0; expected outputs created error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created" ``` --- ## Acceptance Criteria **Purpose:** Definitive pass/fail criteria for task completion **Checklist:** ```yaml acceptance-criteria: - [ ] Task completed as expected; side effects documented tipo: acceptance-criterion blocker: true validação: | Assert task completed as expected; side effects documented error_message: "Acceptance criterion not met: Task completed as expected; side effects documented" ``` --- ## Tools **External/shared resources used by this task:** - **Tool:** task-runner - **Purpose:** Task execution and orchestration - **Source:** .aios-core/core/task-runner.js - **Tool:** logger - **Purpose:** Execution logging and error tracking - **Source:** .aios-core/utils/logger.js --- ## Scripts **Agent-specific code for this task:** - **Script:** execute-task.js - **Purpose:** Generic task execution wrapper - **Language:** JavaScript - **Location:** .aios-core/scripts/execute-task.js --- ## Error Handling **Strategy:** retry **Common Errors:** 1. **Error:** Task Not Found - **Cause:** Specified task not registered in system - **Resolution:** Verify task name and registration - **Recovery:** List available tasks, suggest similar 2. **Error:** Invalid Parameters - **Cause:** Task parameters do not match expected schema - **Resolution:** Validate parameters against task definition - **Recovery:** Provide parameter template, reject execution 3. **Error:** Execution Timeout - **Cause:** Task exceeds maximum execution time - **Resolution:** Optimize task or increase timeout - **Recovery:** Kill task, cleanup resources, log state --- ## Performance **Expected Metrics:** ```yaml duration_expected: 5-20 min (estimated) cost_estimated: $0.003-0.015 token_usage: ~2,000-8,000 tokens ``` **Optimization Notes:** - Iterative analysis with depth limits; cache intermediate results; batch similar operations --- ## Metadata ```yaml story: N/A version: 1.0.0 dependencies: - N/A tags: - development - code updated_at: 2025-11-17 ``` --- checklists: - dev-master-checklist.md --- # Optimize Performance - AIOS Developer Task ## Purpose Analyze code for performance bottlenecks and suggest optimizations to improve runtime performance, memory usage, and scalability. ## Command Pattern ``` *optimize-performance <path> [options] ``` ## Parameters - `path`: File or directory path to analyze - `options`: Performance analysis configuration ### Options - `--patterns <types>`: Comma-separated optimization patterns to check - `--profile`: Enable runtime profiling (if applicable) - `--threshold <level>`: Minimum impact threshold for suggestions (low/medium/high) - `--report <file>`: Generate performance report - `--apply <optimization-id>`: Apply specific optimization - `--recursive`: Analyze directories recursively - `--exclude <patterns>`: Exclude file patterns - `--focus <category>`: Focus on specific category (algorithm/memory/async/database/bundle/react) ## Optimization Patterns - `algorithm_complexity`: High time complexity algorithms - `loop_optimization`: Nested loops and iterations - `memory_usage`: Memory consumption and leaks - `async_operations`: Async/await patterns - `caching`: Memoization opportunities - `database_queries`: N+1 and query optimization - `bundle_size`: JavaScript bundle optimization - `react_performance`: React-specific optimizations - `string_operations`: String manipulation - `object_operations`: Object creation and access ## Examples ```bash # Analyze single file *optimize-performance aios-core/scripts/data-processor.js # Analyze directory with specific patterns *optimize-performance aios-core/agents --patterns algorithm_complexity,async_operations --recursive # Generate performance report *optimize-performance . --recursive --report performance-report.json # Focus on database optimizations *optimize-performance aios-core/services --focus database --recursive # Apply specific optimization *optimize-performance aios-core/scripts/calculator.js --apply opt-001 ``` ## Implementation ```javascript const fs = require('fs').promises; const path = require('path'); const chalk = require('chalk'); const inquirer = require('inquirer'); const glob = require('glob').promises; class OptimizePerformanceTask { constructor() { this.taskName = 'optimize-performance'; this.description = 'Analyze and optimize code performance'; this.rootPath = process.cwd(); this.performanceOptimizer = null; this.analysisResults = []; this.appliedOptimizations = []; } async execute(params) { try { console.log(chalk.blue('⚡ AIOS Performance Optimization')); console.log(chalk.gray('Analyzing code for performance improvements\n')); // Parse parameters const config = await this.parseParameters(params); // Initialize dependencies await this.initializeDependencies(); // Get files to analyze const files = await this.getFilesToAnalyze(config); if (files.length === 0) { console.log(chalk.yellow('No files found to analyze')); return { success: true, results: [] }; } console.log(chalk.gray(`Found ${files.length} files to analyze\n`)); // Execute based on mode if (config.apply) { // Apply specific optimization await this.applyOptimization(config.apply, config); } else { // Analyze files await this.analyzeFiles(files, config); // Display results await this.displayResults(config); // Generate report if requested if (config.report) { await this.generateReport(config.report); } } return { success: true, filesAnalyzed: files.length, totalIssues: this.getTotalIssues(), criticalIssues: this.getCriticalIssues() }; } catch (error) { console.error(chalk.red(`\n❌ Performance optimization failed: ${error.message}`)); throw error; } } async parseParameters(params) { if (params.length < 1) { throw new Error('Usage: *optimize-performance <path> [options]'); } const config = { targetPath: params[0], patterns: null, profile: false, threshold: 'low', report: null, apply: null, recursive: false, exclude: [], focus: null }; // Parse options for (let i = 1; i < params.length; i++) { const param = params[i]; if (param === '--profile') { config.profile = true; } else if (param === '--recursive') { config.recursive = true; } else if (param.startsWith('--patterns') && params[i + 1]) { config.patterns = params[++i].split(',').map(p => p.trim()); } else if (param.startsWith('--threshold') && params[i + 1]) { config.threshold = params[++i]; } else if (param.startsWith('--report') && params[i + 1]) { config.report = params[++i]; } else if (param.startsWith('--apply') && params[i + 1]) { config.apply = params[++i]; } else if (param.startsWith('--exclude') && params[i + 1]) { config.exclude = params[++i].split(',').map(e => e.trim()); } else if (param.startsWith('--focus') && params[i + 1]) { config.focus = params[++i]; } } // Validate threshold if (!['low', 'medium', 'high'].includes(config.threshold)) { throw new Error('Threshold must be: low, medium, or high'); } return config; } async initializeDependencies() { try { const PerformanceOptimizer = require('../scripts/performance-optimizer'); this.performanceOptimizer = new PerformanceOptimizer({ rootPath: this.rootPath, enableProfiling: true }); // Listen to events this.performanceOptimizer.on('analyzed', (analysis) => { this.analysisResults.push(analysis); }); } catch (error) { throw new Error(`Failed to initialize dependencies: ${error.message}`); } } async getFilesToAnalyze(config) { const targetPath = path.resolve(this.rootPath, config.targetPath); const files = []; try { const stats = await fs.stat(targetPath); if (stats.isFile()) { // Single file if (this.shouldAnalyzeFile(targetPath, config)) { files.push(targetPath); } } else if (stats.isDirectory()) { // Directory const pattern = config.recursive ? '**/*.{js,jsx,ts,tsx}' : '*.{js,jsx,ts,tsx}'; const globPattern = path.join(targetPath, pattern); const matches = await glob(globPattern, { ignore: config.exclude.map(e => path.join(targetPath, '**', e)), nodir: true }); for (const match of matches) { if (this.shouldAnalyzeFile(match, config)) { files.push(match); } } } } catch (error) { console.warn(chalk.yellow(`Cannot access ${targetPath}: ${error.message}`)); } return files; } shouldAnalyzeFile(filePath, config) { // Skip test files unless analyzing tests if (filePath.includes('.test.') || filePath.includes('.spec.')) { return false; } // Skip minified files if (filePath.includes('.min.')) { return false; } // Skip build artifacts if (filePath.includes('/dist/') || filePath.includes('/build/')) { return false; } // Skip node_modules if (filePath.includes('node_modules')) { return false; } return true; } async analyzeFiles(files, config) { console.log(chalk.blue('🔍 Analyzing performance...')); const progressInterval = Math.max(1, Math.floor(files.length / 20)); for (let i = 0; i < files.length; i++) { const file = files[i]; try { const analysis = await this.performanceOptimizer.analyzePerformance(file, { patterns: config.patterns, enableProfiling: config.profile }); // Filter by threshold if (analysis.issues && analysis.issues.length > 0) { analysis.issues = this.filterByThreshold(analysis.issues, config.threshold); } // Filter by focus category if (config.focus && analysis.issues) { analysis.issues = analysis.issues.filter(issue => issue.category === config.focus ); } // Show progress if (i % progressInterval === 0) { const progress = Math.floor((i / files.length) * 100); process.stdout.write(`\rProgress: ${progress}%`); } } catch (error) { console.warn(chalk.yellow(`\nFailed to analyze ${file}: ${error.message}`)); } } console.log('\rProgress: 100%\n'); } filterByThreshold(issues, threshold) { const thresholdMap = { low: ['low', 'medium', 'high', 'critical'], medium: ['medium', 'high', 'critical'], high: ['high', 'critical'] }; const allowedImpacts = thresholdMap[threshold]; return issues.filter(issue => allowedImpacts.includes(issue.impact) || allowedImpacts.includes(issue.severity) ); } async displayResults(config) { const totalIssues = this.getTotalIssues(); if (totalIssues === 0) { console.log(chalk.green('✅ No performance issues found!')); console.log(chalk.gray('Your code is already well optimized.')); return; } console.log(chalk.blue(`\n📊 Performance Analysis Results\n`)); console.log(chalk.gray('Found ') + chalk.yellow(totalIssues) + chalk.gray(' optimization opportunities\n')); // Group by category const byCategory = this.groupByCategory(); // Display by category for (const [category, results] of Object.entries(byCategory)) { console.log(chalk.blue(`\n${this.getCategoryIcon(category)} ${this.getCategoryName(category)}`)); console.log(chalk.gray('─'.repeat(50))); for (const result of results) { this.displayFileResults(result); } } // Show performance scores this.displayPerformanceScores(); // Show top recommendations this.displayTopRecommendations(); // Show next steps console.log(chalk.blue('\n📌 Next Steps:')); console.log('1. Review critical issues first'); console.log('2. Apply optimizations incrementally'); console.log('3. Test after each optimization'); console.log('4. Monitor performance improvements'); if (config.report) { console.log(`5. View detailed report: ${config.report}`); } } displayFileResults(result) { const relativePath = path.relative(this.rootPath, result.filePath); console.log(`\n📄 ${chalk.blue(relativePath)}`); if (result.metrics?.performanceScore !== undefined) { const score = result.metrics.performanceScore; const scoreColor = score >= 80 ? chalk.green : score >= 60 ? chalk.yellow : chalk.red; console.log(` Performance Score: ${scoreColor(score + '/100')}`); } // Display issues for (const issue of result.issues) { this.displayIssue(issue); // Display suggestions for this issue const suggestion = result.suggestions?.find(s => s.issueId === issue.id || s.pattern === issue.pattern ); if (suggestion) { this.displaySuggestion(suggestion); } } } displayIssue(issue) { const impactColors = { critical: chalk.red, high: chalk.red, medium: chalk.yellow, low: chalk.gray }; const impactColor = impactColors[issue.impact || issue.severity] || chalk.gray; console.log(`\n ${impactColor(`[${(issue.impact || issue.severity || 'info').toUpperCase()}]`)} ${issue.description}`); if (issue.location) { console.log(chalk.gray(` Location: Line ${issue.location.start?.line || '?'}`)); } if (issue.type) { console.log(chalk.gray(` Type: ${issue.type}`)); } } displaySuggestion(suggestion) { console.log(chalk.green(' 💡 Suggestion:')); if (suggestion.optimizations) { for (const opt of suggestion.optimizations) { console.log(` - ${opt.description}`); if (opt.code) { console.log(chalk.gray(' Example:')); const codeLines = opt.code.split('\n'); for (const line of codeLines) { console.log(chalk.gray(` ${line}`)); } } if (opt.improvement) { console.log(chalk.green(` ${opt.improvement}`)); } } } if (suggestion.estimatedImprovement) { console.log(chalk.green(` Estimated improvement: ${suggestion.estimatedImprovement}`)); } } groupByCategory() { const grouped = {}; for (const result of this.analysisResults) { if (!result.issues || result.issues.length === 0) continue; for (const issue of result.issues) { const category = issue.category || 'other'; if (!grouped[category]) { grouped[category] = []; } // Find or create file entry let fileEntry = grouped[category].find(r => r.filePath === result.filePath); if (!fileEntry) { fileEntry = { filePath: result.filePath, issues: [], suggestions: result.suggestions || [], metrics: result.metrics }; grouped[category].push(fileEntry); } fileEntry.issues.push(issue); } } return grouped; } getCategoryIcon(category) { const icons = { algorithm: '🔄', memory: '💾', async: '⚡', database: '🗄️', bundle: '📦', react: '⚛️', caching: '💰', framework: '🏗️', other: '🔧' }; return icons[category] || icons.other; } getCategoryName(category) { const names = { algorithm: 'Algorithm Optimization', memory: 'Memory Usage', async: 'Async Operations', database: 'Database Queries', bundle: 'Bundle Size', react: 'React Performance', caching: 'Caching Opportunities', framework: 'Framework-Specific', other: 'Other Optimizations' }; return names[category] || category; } displayPerformanceScores() { console.log(chalk.blue('\n📈 Performance Summary')); console.log(chalk.gray('─'.repeat(50))); let totalScore = 0; let fileCount = 0; for (const result of this.analysisResults) { if (result.metrics?.performanceScore !== undefined) { totalScore += result.metrics.performanceScore; fileCount++; } } if (fileCount > 0) { const avgScore = Math.round(totalScore / fileCount); const scoreColor = avgScore >= 80 ? chalk.green : avgScore >= 60 ? chalk.yellow : chalk.red; console.log(`Average Performance Score: ${scoreColor(avgScore + '/100')}`); console.log(`Files Analyzed: ${fileCount}`); } // Issue breakdown const criticalCount = this.getCriticalIssues(); const highCount = this.getIssuesByImpact('high'); const mediumCount = this.getIssuesByImpact('medium'); const lowCount = this.getIssuesByImpact('low'); console.log('\nIssue Breakdown:'); if (criticalCount > 0) console.log(chalk.red(` Critical: ${criticalCount}`)); if (highCount > 0) console.log(chalk.red(` High: ${highCount}`)); if (mediumCount > 0) console.log(chalk.yellow(` Medium: ${mediumCount}`)); if (lowCount > 0) console.log(chalk.gray(` Low: ${lowCount}`)); } displayTopRecommendations() { console.log(chalk.blue('\n🎯 Top Recommendations')); console.log(chalk.gray('─'.repeat(50))); const recommendations = this.getTopRecommendations(); if (recommendations.length === 0) { console.log(chalk.gray('No specific recommendations')); return; } for (let i = 0; i < Math.min(5, recommendations.length); i++) { const rec = recommendations[i]; console.log(`\n${i + 1}. ${rec.title}`); console.log(chalk.gray(` ${rec.description}`)); if (rec.files) { console.log(chalk.gray(` Files affected: ${rec.files.length}`)); } } } getTopRecommendations() { const recommendations = []; const byCategory = this.groupByCategory(); // Algorithm complexity issues if (byCategory.algorithm?.length > 0) { const highComplexity = byCategory.algorithm.filter(r => r.issues.some(i => i.type === 'high_complexity' && i.severity === 'critical') ); if (highComplexity.length > 0) { recommendations.push({ title: 'Optimize High-Complexity Algorithms', description: 'Several functions have O(n²) or worse complexity. Consider using more efficient algorithms.', priority: 'critical', files: highComplexity }); } } // Async issues if (byCategory.async?.length > 0) { const sequentialAwaits = byCategory.async.filter(r => r.issues.some(i => i.type === 'sequential_awaits') ); if (sequentialAwaits.length > 0) { recommendations.push({ title: 'Parallelize Async Operations', description: 'Use Promise.all to run independent async operations in parallel.', priority: 'high', files: sequentialAwaits }); } } // Database issues if (byCategory.database?.length > 0) { const nPlusOne = byCategory.database.filter(r => r.issues.some(i => i.type === 'n_plus_one') ); if (nPlusOne.length > 0) { recommendations.push({ title: 'Fix N+1 Query Problems', description: 'Database queries in loops cause performance degradation. Use JOINs or batch loading.', priority: 'critical', files: nPlusOne }); } } // Memory issues if (byCategory.memory?.length > 0) { recommendations.push({ title: 'Optimize Memory Usage', description: 'Review memory allocations and potential leaks. Consider using more efficient data structures.', priority: 'medium', files: byCategory.memory }); } // Caching opportunities if (byCategory.caching?.length > 0) { recommendations.push({ title: 'Implement Caching', description: 'Add memoization or caching for expensive repeated operations.', priority: 'medium', files: byCategory.caching }); } // Sort by priority const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 }; recommendations.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority] ); return recommendations; } async applyOptimization(optimizationId, config) { console.log(chalk.blue(`\n🔧 Applying optimization: ${optimizationId}`)); // Find the optimization in results let targetOptimization = null; let targetFile = null; for (const result of this.analysisResults) { const suggestion = result.suggestions?.find(s => s.issueId === optimizationId || s.id === optimizationId ); if (suggestion) { targetOptimization = suggestion; targetFile = result.filePath; break; } } if (!targetOptimization) { throw new Error(`Optimization not found: ${optimizationId}`); } console.log(chalk.gray(`File: ${path.relative(this.rootPath, targetFile)}`)); console.log(chalk.gray(`Type: ${targetOptimization.type || 'General optimization'}`)); // Show optimization details if (targetOptimization.optimizations) { console.log(chalk.blue('\nOptimizations to apply:')); for (const opt of targetOptimization.optimizations) { console.log(` - ${opt.description}`); } } // Confirm application const { confirm } = await inquirer.prompt([{ type: 'confirm', name: 'confirm', message: 'Apply this optimization?', default: true }]); if (!confirm) { console.log(chalk.gray('Optimization cancelled')); return; } // Apply the optimization try { const result = await this.performanceOptimizer.applyOptimization( targetFile, targetOptimization ); if (result.success) { console.log(chalk.green('✅ Optimization applied successfully')); // Show changes for (const change of result.changes) { console.log(chalk.gray(` - ${change.description}`)); } this.appliedOptimizations.push({ file: targetFile, optimization: targetOptimization, result, timestamp: new Date().toISOString() }); } else { console.error(chalk.red(`Failed to apply optimization: ${result.error}`)); } } catch (error) { console.error(chalk.red(`Error applying optimization: ${error.message}`)); } } async generateReport(reportPath) { console.log(chalk.blue('\n📤 Generating performance report...')); const report = await this.performanceOptimizer.generateOptimizationReport(); // Add analysis results report.analysisResults = this.analysisResults.map(r => ({ file: path.relative(this.rootPath, r.filePath), performanceScore: r.metrics?.performanceScore, issues: r.issues.length, criticalIssues: r.issues.filter(i => i.impact === 'critical' || i.severity === 'critical' ).length, suggestions: r.suggestions?.length || 0 })); // Add applied optimizations report.appliedOptimizations = this.appliedOptimizations; await fs.writeFile(reportPath, JSON.stringify(report, null, 2)); console.log(chalk.green(`✅ Report generated: ${reportPath}`)); // Show report summary console.log(chalk.blue('\n📊 Report Summary:')); console.log(` Files analyzed: ${report.summary.filesAnalyzed}`); console.log(` Total issues: ${report.summary.totalIssues}`); console.log(` Critical issues: ${report.summary.criticalIssues}`); console.log(` Optimizations applied: ${report.summary.optimizationsApplied}`); } getTotalIssues() { return this.analysisResults.reduce((total, result) => total + (result.issues?.length || 0), 0 ); } getCriticalIssues() { return this.analysisResults.reduce((total, result) => total + (result.issues?.filter(i => i.impact === 'critical' || i.severity === 'critical' ).length || 0), 0 ); } getIssuesByImpact(impact) { return this.analysisResults.reduce((total, result) => total + (result.issues?.filter(i => i.impact === impact || i.severity === impact ).length || 0), 0 ); } } module.exports = OptimizePerformanceTask; ``` ## Integration Points ### Performance Optimizer - Core analysis engine - Pattern detection system - Optimization suggestion generator - Runtime profiling capability ### Analysis Categories - **Algorithm**: Time complexity, nested loops - **Memory**: Allocations, leaks, data structures - **Async**: Promise patterns, parallelization - **Database**: Query optimization, N+1 problems - **Bundle**: Import optimization, tree-shaking - **React**: Component rendering, memoization - **Caching**: Memoization opportunities ### Metrics Collection - Static code analysis - Complexity calculations - Performance scoring - Impact assessment ## Performance Analysis Workflow ### Detection Phase 1. Parse source code into AST 2. Run pattern detectors 3. Calculate complexity metrics 4. Identify bottlenecks 5. Score performance impact ### Analysis Phase 1. Evaluate issue severity 2. Group related issues 3. Generate optimization suggestions 4. Estimate improvements 5. Prioritize recommendations ### Optimization Phase 1. Review suggestions 2. Validate safety 3. Apply transformations 4. Test results 5. Measure improvements ## Best Practices ### Performance Analysis - Start with critical issues - Focus on hot paths - Measure before and after - Test optimizations thoroughly - Consider trade-offs ### Optimization Strategy - Profile first, optimize second - Target biggest bottlenecks - Preserve code readability - Document optimizations - Monitor regression ### Continuous Improvement - Regular performance audits - Automated performance tests - Track metrics over time - Share optimization patterns - Build performance culture ## Security Considerations - Validate optimization safety - Preserve functionality - Avoid premature optimization - Test edge cases - Monitor side effects