Cherry-picked from @mondweep's PR #22 (claude/learn-codebase-project-011CUcEk2EiY5twQZMy3jpfX) This is the agent that generated the complexity analysis report showing: - 5,448 LOC across 5 files - Cyclomatic Complexity: 127 average - 14 issues (12 critical, 2 high) Files added: - src/agents/CodeComplexityAnalyzerAgent.ts (604 lines) • Complete QE agent with BaseAgent pattern • Cyclomatic & cognitive complexity analysis • AI-powered refactoring recommendations • Quality scoring (0-100) • Memory integration (aqe/complexity/* namespace) - tests/agents/CodeComplexityAnalyzerAgent.test.ts (529 lines) • 13+ comprehensive test scenarios • Initialization, analysis, recommendations tests • Memory & event integration tests • Performance benchmarks - examples/complexity-analysis/ (3 files, 871 lines) • demo.ts - Interactive usage example • analyze-codebase.ts - Multi-file analysis • analyze-traccar.ts - External project analysis • README.md - Comprehensive learning guide (463 lines) - .claude/agents/qe-code-complexity.md (291 lines) • Claude Code integration • Natural language interface • Usage examples & patterns Benefits: ✅ Educational resource for team ✅ Working example of BaseAgent pattern ✅ Demonstrates lifecycle hooks, memory, events ✅ Production-ready complexity analyzer ✅ No conflicts with current refactoring work Original PR: https://github.com/proffesor-for-testing/agentic-qe/pull/22 Author: @mondweep (Mondweep Chakravorty) 🤖 Cherry-picked with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Mondweep Chakravorty <mondweep@users.noreply.github.com> Co-Authored-By: Claude <noreply@anthropic.com>
Code Complexity Analyzer - Learning Example
This example demonstrates the complete Agentic QE Fleet architecture through a practical Code Complexity Analyzer agent.
🎯 What You'll Learn
By studying this example, you'll understand:
- BaseAgent Pattern - How all agents extend the base class with lifecycle hooks
- Memory System - Storing and retrieving agent data for coordination
- Event-Driven Architecture - How agents communicate via events
- Learning Integration - How agents improve over time
- Testing Patterns - Comprehensive test coverage strategies
- Agent Coordination - How multiple agents work together
📁 Files Created
Agent Implementation
Location: src/agents/CodeComplexityAnalyzerAgent.ts
The main agent class demonstrating:
- Custom configuration and thresholds
- Core analysis methods (cyclomatic, cognitive complexity)
- Memory integration for storing results
- Event emission for coordination
- Lifecycle hooks (pre-task, post-task, error handling)
- Quality scoring algorithm
- AI-powered recommendation generation
Key Features:
export class CodeComplexityAnalyzerAgent extends BaseAgent {
// Analyzes code complexity metrics
async analyzeComplexity(request: ComplexityAnalysisRequest): Promise<ComplexityAnalysisResult>
// Lifecycle hooks
protected async onPreTask(data: { assignment: any }): Promise<void>
protected async onPostTask(data: PostTaskData): Promise<void>
protected async onTaskError(data: { assignment: any; error: Error }): Promise<void>
}
Comprehensive Tests
Location: tests/agents/CodeComplexityAnalyzerAgent.test.ts
Test suite covering:
- ✅ Initialization and capabilities
- ✅ Complexity analysis (simple and complex code)
- ✅ Issue detection (cyclomatic, cognitive, size)
- ✅ Recommendation generation
- ✅ Memory integration
- ✅ Event integration
- ✅ Lifecycle hooks
- ✅ Quality scoring
- ✅ Performance benchmarks
Test Structure:
describe('CodeComplexityAnalyzerAgent', () => {
describe('initialization', () => { /* ... */ })
describe('complexity analysis', () => { /* ... */ })
describe('recommendations', () => { /* ... */ })
describe('memory integration', () => { /* ... */ })
describe('event integration', () => { /* ... */ })
describe('lifecycle hooks', () => { /* ... */ })
describe('quality scoring', () => { /* ... */ })
describe('performance', () => { /* ... */ })
});
Interactive Demo
Location: examples/complexity-analysis/demo.ts
Interactive demonstration showing:
- Agent initialization with custom config
- Simple code analysis (high score)
- Complex code analysis (issues detected)
- Multiple file analysis
- Memory storage verification
- Agent coordination patterns
Claude Code Integration
Location: .claude/agents/qe-code-complexity.md
Agent definition for Claude Code enabling:
- Natural language task execution
- Capability documentation
- Usage examples
- Integration patterns
🚀 Running the Example
Prerequisites
# Install dependencies (if not already installed)
cd /home/user/agentic-qe
npm install
Run the Interactive Demo
# Run the demo to see the agent in action
npx ts-node examples/complexity-analysis/demo.ts
Expected Output:
🚀 CodeComplexityAnalyzerAgent Demo
Step 1: Initializing agent...
✅ Agent initialized
Step 2: Analyzing simple code...
Results:
Quality Score: 100/100
Issues Found: 0
Analysis Time: 15ms
Cyclomatic Complexity: 1.00
Cognitive Complexity: 1.00
Lines of Code: 12
Function Count: 3
Step 3: Analyzing complex code with issues...
Results:
Quality Score: 65/100
Issues Found: 2
Analysis Time: 8ms
Cyclomatic Complexity: 23.00
Cognitive Complexity: 29.00
⚠️ Issues Detected:
1. [HIGH] cyclomatic
Current: 23, Threshold: 10
Consider breaking down complex logic into smaller functions
2. [MEDIUM] cognitive
Current: 29, Threshold: 15
Reduce nesting levels and simplify control flow
💡 Recommendations:
1. Apply Extract Method refactoring to reduce cyclomatic complexity
2. Use early returns to reduce nesting levels
3. Extract nested loops into separate methods
... [more steps]
✅ Demo completed successfully!
Run the Tests
# Run tests for the complexity analyzer agent
npm test tests/agents/CodeComplexityAnalyzerAgent.test.ts
Use from Claude Code CLI
# Analyze a single file
claude "Use qe-code-complexity to analyze src/services/order-processor.ts"
# Analyze multiple files
claude "Run complexity analysis on all files in src/services/"
# Get refactoring recommendations
claude "Analyze src/utils/validator.ts and suggest refactorings"
🧠 Architecture Deep Dive
1. BaseAgent Lifecycle
// Initialization sequence
constructor(config) → super(...) → setupEventHandlers() → setupLifecycleHooks()
↓
initialize() → executeHook('pre-initialization')
→ loadKnowledge()
→ restoreState()
→ status = IDLE
// Task execution sequence
executeTask(task) → onPreTask(assignment) // Load context
→ analyzeComplexity(request) // Do work
→ onPostTask(result) // Store results
→ emit('complexity:analysis:completed') // Notify
// Error handling
executeTask(task) → onPreTask(assignment)
→ analyzeComplexity(request)
→ ERROR!
→ onTaskError(error) // Handle error
→ store error in memory
2. Memory Coordination Pattern
// Store results for other agents
await memoryStore.store(
`aqe/complexity/${agentId}/latest-result`,
result,
86400 // 24 hour TTL
);
// Other agents retrieve results
const complexityData = await memoryStore.retrieve(
`aqe/complexity/${agentId}/latest-result`
);
// Test generator can now prioritize complex code
if (complexityData.score < 70) {
await generateExtraTests(complexityData.issues);
}
3. Event-Driven Coordination
// Complexity analyzer emits events
eventBus.emit('complexity:analysis:completed', {
agentId: this.agentId,
result: analysisResult,
timestamp: new Date()
});
// Test generator subscribes
eventBus.on('complexity:analysis:completed', async (event) => {
const criticalAreas = event.result.issues
.filter(i => i.severity === 'critical')
.map(i => i.file);
await testGeneratorAgent.generateTests({
focusAreas: criticalAreas,
extraCoverage: true
});
});
// Coverage analyzer subscribes
eventBus.on('complexity:analysis:completed', async (event) => {
await coverageAnalyzerAgent.prioritizeAreas({
highComplexity: event.result.issues.map(i => i.file)
});
});
4. Configuration Customization
const agent = new CodeComplexityAnalyzerAgent({
type: QEAgentType.QUALITY_ANALYZER,
capabilities: [],
context: { /* ... */ },
memoryStore,
eventBus,
// Customize thresholds
thresholds: {
cyclomaticComplexity: 10, // Fail above 10
cognitiveComplexity: 15, // Fail above 15
linesOfCode: 300 // Fail above 300 LOC
},
// Toggle features
enableRecommendations: true, // Generate AI recommendations
enableLearning: true // Learn from past analyses
});
💡 Key Concepts Demonstrated
1. Separation of Concerns
- BaseAgent: Handles lifecycle, events, memory access
- CodeComplexityAnalyzerAgent: Focuses only on complexity analysis
- Tests: Verify behavior in isolation
- Demo: Shows real-world usage
2. Memory as Coordination Mechanism
Instead of direct agent-to-agent communication:
// ❌ BAD: Direct coupling
await testGeneratorAgent.useComplexityData(complexityAgent.getData());
// ✅ GOOD: Memory-based coordination
await memoryStore.store('aqe/complexity/result', data);
const data = await memoryStore.retrieve('aqe/complexity/result');
3. Event-Driven Decoupling
Agents don't need to know about each other:
// Agent A emits
eventBus.emit('complexity:analysis:completed', data);
// Agent B, C, D subscribe independently
eventBus.on('complexity:analysis:completed', handlerB);
eventBus.on('complexity:analysis:completed', handlerC);
eventBus.on('complexity:analysis:completed', handlerD);
4. Learning from Experience
// Pre-task: Load historical data
protected async onPreTask() {
const history = await this.memoryStore.retrieve('history');
// Adjust thresholds based on past analyses
}
// Post-task: Store for learning
protected async onPostTask(data) {
await this.memoryStore.store('history', data.result);
// Future analyses benefit from this data
}
🔍 Code Walkthrough
1. Agent Structure
export class CodeComplexityAnalyzerAgent extends BaseAgent {
// Configuration
private thresholds: { /* ... */ };
private enableRecommendations: boolean;
// Core methods
async analyzeComplexity(request): Promise<Result> { /* ... */ }
private async analyzeFile(file): Promise<Metrics> { /* ... */ }
private detectIssues(metrics): Issue[] { /* ... */ }
private calculateQualityScore(metrics, issues): number { /* ... */ }
private async generateRecommendations(issues): Promise<string[]> { /* ... */ }
// Lifecycle hooks
protected async onPreTask(data): Promise<void> { /* ... */ }
protected async onPostTask(data): Promise<void> { /* ... */ }
protected async onTaskError(data): Promise<void> { /* ... */ }
}
2. Analysis Flow
async analyzeComplexity(request) {
// 1. Store request for coordination
await this.memoryStore.store('current-request', request);
// 2. Analyze each file
for (const file of request.files) {
const metrics = await this.analyzeFile(file);
const issues = this.detectIssues(file.path, metrics);
// ...
}
// 3. Calculate overall quality
const score = this.calculateQualityScore(overall, issues);
// 4. Generate recommendations
const recommendations = await this.generateRecommendations(issues);
// 5. Store results
await this.memoryStore.store('latest-result', result);
// 6. Emit event
this.eventBus.emit('complexity:analysis:completed', { result });
return result;
}
3. Test Structure
describe('CodeComplexityAnalyzerAgent', () => {
let agent, memoryStore, eventBus;
beforeEach(async () => {
// Setup test environment
memoryStore = new SwarmMemoryManager(':memory:');
await memoryStore.initialize();
eventBus = new EventEmitter();
agent = new CodeComplexityAnalyzerAgent({ /* ... */ });
await agent.initialize();
});
afterEach(async () => {
// Cleanup
await agent.terminate();
await memoryStore.close();
});
it('should analyze simple code', async () => {
const result = await agent.analyzeComplexity({ /* ... */ });
expect(result.score).toBeGreaterThan(90);
});
});
📚 Next Steps
After understanding this example:
-
Explore Other Agents
TestGeneratorAgent- See test generation patternsCoverageAnalyzerAgent- Learn O(log n) algorithmsFlakyTestHunterAgent- Study ML integration
-
Build Your Own Agent
- Extend
BaseAgent - Define custom capabilities
- Implement lifecycle hooks
- Add comprehensive tests
- Extend
-
Study Agent Coordination
- Check
FleetManagerfor multi-agent orchestration - Review
SwarmMemoryManagerfor distributed coordination - Explore
LearningEnginefor continuous improvement
- Check
-
Integrate with Real Projects
- Use agents in your CI/CD pipeline
- Coordinate multiple agents for comprehensive QE
- Track quality metrics over time
🎓 Learning Resources
- BaseAgent Source:
src/agents/BaseAgent.ts - Memory System:
src/core/memory/SwarmMemoryManager.ts - Event System: Node.js EventEmitter
- Learning Engine:
src/learning/LearningEngine.ts - Test Patterns: All files in
tests/agents/
🤝 Contributing
Want to enhance this example?
- Add more complexity metrics (Halstead, maintainability index)
- Integrate with real static analysis tools (ESLint, SonarQube)
- Add visualization of complexity trends
- Implement ML-based threshold learning
- Create integration with CI/CD platforms
📝 Summary
This example shows you everything you need to build agents in the Agentic QE Fleet:
✅ Extend BaseAgent with custom logic ✅ Use lifecycle hooks for coordination ✅ Store results in memory for other agents ✅ Emit events for real-time coordination ✅ Write comprehensive tests ✅ Integrate with Claude Code
You now understand the complete architecture! 🎉
Use this as a template for building your own specialized QE agents.