Skip to main content
Glama

CodeGraph CLI MCP Server

by Jakedismo
analyzer-agent.ts15.6 kB
import { BaseAgent } from '../core/agents/base-agent.js'; import { AgentType, AgentConfig, Task, TaskResult, AgentCapability, TaskError } from '../core/agents/agent-types.js'; export interface CodeAnalysisTask { sourceCode: string; language: string; analysisType: 'syntax' | 'semantic' | 'quality' | 'security' | 'performance'; options?: { includeMetrics?: boolean; includeWarnings?: boolean; severity?: 'low' | 'medium' | 'high'; }; } export interface AnalysisResult { issues: Issue[]; metrics?: CodeMetrics; suggestions: Suggestion[]; score: number; } export interface Issue { type: 'error' | 'warning' | 'info'; severity: 'low' | 'medium' | 'high' | 'critical'; message: string; line?: number; column?: number; rule?: string; category: string; } export interface CodeMetrics { linesOfCode: number; complexity: number; maintainabilityIndex: number; duplicateLines?: number; testCoverage?: number; } export interface Suggestion { type: 'refactor' | 'optimize' | 'fix'; description: string; impact: 'low' | 'medium' | 'high'; effort: 'minimal' | 'moderate' | 'significant'; } export class AnalyzerAgent extends BaseAgent { private analysisEngines = new Map<string, AnalysisEngine>(); constructor(agentId: string = 'analyzer-001') { const config: AgentConfig = { agentId, type: AgentType.ANALYZER, capabilities: [ { name: 'syntax_analysis', version: '1.0.0', description: 'Analyze code syntax and structure', inputSchema: { type: 'object', properties: { sourceCode: { type: 'string' }, language: { type: 'string' } }, required: ['sourceCode', 'language'] }, outputSchema: { type: 'object', properties: { issues: { type: 'array' }, score: { type: 'number' } } } }, { name: 'semantic_analysis', version: '1.0.0', description: 'Analyze code semantics and logic flow', inputSchema: { type: 'object', properties: { sourceCode: { type: 'string' }, language: { type: 'string' }, context: { type: 'object', nullable: true } }, required: ['sourceCode', 'language'] } }, { name: 'quality_analysis', version: '1.0.0', description: 'Analyze code quality metrics and maintainability', inputSchema: { type: 'object', properties: { sourceCode: { type: 'string' }, language: { type: 'string' }, includeMetrics: { type: 'boolean', default: true } } } }, { name: 'security_analysis', version: '1.0.0', description: 'Analyze code for security vulnerabilities', inputSchema: { type: 'object', properties: { sourceCode: { type: 'string' }, language: { type: 'string' }, severity: { type: 'string', enum: ['low', 'medium', 'high'] } } } }, { name: 'performance_analysis', version: '1.0.0', description: 'Analyze code for performance issues and optimizations', inputSchema: { type: 'object', properties: { sourceCode: { type: 'string' }, language: { type: 'string' }, context: { type: 'object', nullable: true } } } } ], maxConcurrency: 5, timeout: 30000, metadata: { hostname: 'analyzer-node-1', platform: process.platform, version: '1.0.0', startTime: new Date(), tags: ['code-analysis', 'quality', 'security'] } }; super(config); this.initializeAnalysisEngines(); } protected async onInitialize(): Promise<void> { console.log(`Initializing AnalyzerAgent ${this.getId()}`); await this.loadAnalysisRules(); await this.calibrateEngines(); } protected async onStart(): Promise<void> { console.log(`Starting AnalyzerAgent ${this.getId()}`); this.emit('analyzer:ready', { agentId: this.getId(), capabilities: this.getCapabilities(), engines: Array.from(this.analysisEngines.keys()) }); } protected async onStop(): Promise<void> { console.log(`Stopping AnalyzerAgent ${this.getId()}`); await this.cleanup(); } protected async handleTask(task: Task): Promise<TaskResult> { const startTime = Date.now(); try { // Validate task payload if (!task.payload?.data) { throw new TaskError('Invalid task payload', task.id, 'INVALID_PAYLOAD'); } const analysisTask = task.payload.data as CodeAnalysisTask; // Validate required fields if (!analysisTask.sourceCode || !analysisTask.language) { throw new TaskError('Missing required fields: sourceCode, language', task.id, 'MISSING_FIELDS'); } // Perform analysis based on type let result: AnalysisResult; switch (analysisTask.analysisType) { case 'syntax': result = await this.performSyntaxAnalysis(analysisTask); break; case 'semantic': result = await this.performSemanticAnalysis(analysisTask); break; case 'quality': result = await this.performQualityAnalysis(analysisTask); break; case 'security': result = await this.performSecurityAnalysis(analysisTask); break; case 'performance': result = await this.performPerformanceAnalysis(analysisTask); break; default: throw new TaskError(`Unknown analysis type: ${analysisTask.analysisType}`, task.id, 'UNKNOWN_TYPE'); } const processingTime = Date.now() - startTime; return { success: true, data: { analysis: result, metadata: { analysisType: analysisTask.analysisType, language: analysisTask.language, processingTime, engine: this.analysisEngines.get(analysisTask.language)?.name || 'default' } }, completedAt: new Date(), processingTime }; } catch (error) { const processingTime = Date.now() - startTime; return { success: false, error: error instanceof Error ? error.message : String(error), completedAt: new Date(), processingTime }; } } private initializeAnalysisEngines(): void { // TypeScript/JavaScript engine this.analysisEngines.set('typescript', new TypeScriptAnalysisEngine()); this.analysisEngines.set('javascript', new JavaScriptAnalysisEngine()); // Python engine this.analysisEngines.set('python', new PythonAnalysisEngine()); // Java engine this.analysisEngines.set('java', new JavaAnalysisEngine()); // Generic engine for unsupported languages this.analysisEngines.set('generic', new GenericAnalysisEngine()); } private async loadAnalysisRules(): Promise<void> { // Load language-specific analysis rules for (const [language, engine] of this.analysisEngines) { await engine.loadRules(); } } private async calibrateEngines(): Promise<void> { // Calibrate analysis engines for optimal performance for (const [language, engine] of this.analysisEngines) { await engine.calibrate(); } } private async cleanup(): Promise<void> { // Cleanup analysis engines for (const [language, engine] of this.analysisEngines) { await engine.cleanup(); } } private async performSyntaxAnalysis(task: CodeAnalysisTask): Promise<AnalysisResult> { const engine = this.getAnalysisEngine(task.language); return engine.analyzeSyntax(task.sourceCode, task.options); } private async performSemanticAnalysis(task: CodeAnalysisTask): Promise<AnalysisResult> { const engine = this.getAnalysisEngine(task.language); return engine.analyzeSemantics(task.sourceCode, task.options); } private async performQualityAnalysis(task: CodeAnalysisTask): Promise<AnalysisResult> { const engine = this.getAnalysisEngine(task.language); return engine.analyzeQuality(task.sourceCode, task.options); } private async performSecurityAnalysis(task: CodeAnalysisTask): Promise<AnalysisResult> { const engine = this.getAnalysisEngine(task.language); return engine.analyzeSecurity(task.sourceCode, task.options); } private async performPerformanceAnalysis(task: CodeAnalysisTask): Promise<AnalysisResult> { const engine = this.getAnalysisEngine(task.language); return engine.analyzePerformance(task.sourceCode, task.options); } private getAnalysisEngine(language: string): AnalysisEngine { return this.analysisEngines.get(language.toLowerCase()) || this.analysisEngines.get('generic')!; } } // Abstract analysis engine abstract class AnalysisEngine { abstract name: string; async loadRules(): Promise<void> { // Override in concrete implementations } async calibrate(): Promise<void> { // Override in concrete implementations } async cleanup(): Promise<void> { // Override in concrete implementations } abstract analyzeSyntax(code: string, options?: any): Promise<AnalysisResult>; abstract analyzeSemantics(code: string, options?: any): Promise<AnalysisResult>; abstract analyzeQuality(code: string, options?: any): Promise<AnalysisResult>; abstract analyzeSecurity(code: string, options?: any): Promise<AnalysisResult>; abstract analyzePerformance(code: string, options?: any): Promise<AnalysisResult>; } // TypeScript analysis engine class TypeScriptAnalysisEngine extends AnalysisEngine { name = 'TypeScript Analyzer'; async analyzeSyntax(code: string, options?: any): Promise<AnalysisResult> { const issues: Issue[] = []; const suggestions: Suggestion[] = []; // Simulate syntax analysis const lines = code.split('\n'); let complexity = 0; for (let i = 0; i < lines.length; i++) { const line = lines[i]; // Check for common syntax issues if (line.includes('var ')) { issues.push({ type: 'warning', severity: 'medium', message: 'Use let/const instead of var', line: i + 1, rule: 'no-var', category: 'syntax' }); suggestions.push({ type: 'fix', description: 'Replace var with let or const', impact: 'low', effort: 'minimal' }); } if (line.includes('==') && !line.includes('===')) { issues.push({ type: 'warning', severity: 'medium', message: 'Use strict equality (===) instead of ==', line: i + 1, rule: 'strict-equality', category: 'syntax' }); } // Calculate complexity if (line.includes('if') || line.includes('for') || line.includes('while')) { complexity++; } } const metrics: CodeMetrics = { linesOfCode: lines.length, complexity, maintainabilityIndex: Math.max(0, 100 - complexity * 2 - issues.length * 5) }; const score = Math.max(0, 100 - issues.length * 10); return { issues, metrics: options?.includeMetrics ? metrics : undefined, suggestions, score }; } async analyzeSemantics(code: string, options?: any): Promise<AnalysisResult> { // Simulate semantic analysis return { issues: [], suggestions: [], score: 85 }; } async analyzeQuality(code: string, options?: any): Promise<AnalysisResult> { // Simulate quality analysis return { issues: [], suggestions: [{ type: 'refactor', description: 'Consider breaking down large functions', impact: 'medium', effort: 'moderate' }], score: 78 }; } async analyzeSecurity(code: string, options?: any): Promise<AnalysisResult> { // Simulate security analysis const issues: Issue[] = []; if (code.includes('eval(')) { issues.push({ type: 'error', severity: 'critical', message: 'Avoid using eval() - potential code injection vulnerability', rule: 'no-eval', category: 'security' }); } return { issues, suggestions: [], score: issues.length > 0 ? 30 : 95 }; } async analyzePerformance(code: string, options?: any): Promise<AnalysisResult> { // Simulate performance analysis return { issues: [], suggestions: [{ type: 'optimize', description: 'Consider using Map instead of object for frequent lookups', impact: 'medium', effort: 'minimal' }], score: 82 }; } } // Simplified engines for other languages class JavaScriptAnalysisEngine extends TypeScriptAnalysisEngine { name = 'JavaScript Analyzer'; } class PythonAnalysisEngine extends AnalysisEngine { name = 'Python Analyzer'; async analyzeSyntax(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 90 }; } async analyzeSemantics(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 85 }; } async analyzeQuality(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 88 }; } async analyzeSecurity(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 92 }; } async analyzePerformance(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 80 }; } } class JavaAnalysisEngine extends AnalysisEngine { name = 'Java Analyzer'; async analyzeSyntax(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 88 }; } async analyzeSemantics(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 83 }; } async analyzeQuality(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 85 }; } async analyzeSecurity(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 90 }; } async analyzePerformance(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 87 }; } } class GenericAnalysisEngine extends AnalysisEngine { name = 'Generic Analyzer'; async analyzeSyntax(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 75 }; } async analyzeSemantics(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 70 }; } async analyzeQuality(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 70 }; } async analyzeSecurity(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 75 }; } async analyzePerformance(code: string, options?: any): Promise<AnalysisResult> { return { issues: [], suggestions: [], score: 70 }; } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Jakedismo/codegraph-rust'

If you have feedback or need assistance with the MCP directory API, please join our Discord server