claude-buddy
Version:
Your friendly AI development companion for Claude Code - supercharge Claude Code with intelligent workflows and safety features
661 lines (531 loc) • 22.3 kB
Markdown
# Persona Analytics and Debugging Guide
This guide covers monitoring, analyzing, and debugging the Claude Code Buddy persona system for optimal performance and user experience.
## Table of Contents
- [Analytics Overview](#analytics-overview)
- [Performance Monitoring](#performance-monitoring)
- [Activation Debugging](#activation-debugging)
- [Learning System Analytics](#learning-system-analytics)
- [Collaboration Analysis](#collaboration-analysis)
- [User Experience Metrics](#user-experience-metrics)
- [Debugging Workflows](#debugging-workflows)
- [Optimization Strategies](#optimization-strategies)
## Analytics Overview
### System Health Dashboard
Access real-time system analytics:
```typescript
import { personaSystem } from './src/personas/index.js';
// Get comprehensive analytics
const analytics = personaSystem.getAnalytics();
console.log('System Health:', {
initialized: analytics.systemHealth.initialized,
availablePersonas: analytics.systemHealth.availablePersonas,
activePersonas: analytics.systemHealth.activePersonas,
totalInteractions: analytics.personaManager.totalInteractions,
averageConfidence: analytics.personaManager.averageConfidence,
learningEffectiveness: analytics.learning.learningEffectiveness
});
```
### Key Performance Indicators (KPIs)
Monitor these essential metrics:
1. **Activation Accuracy**: Percentage of correct persona activations
2. **Response Time**: Time from input to persona activation
3. **User Satisfaction**: Feedback ratings and effectiveness scores
4. **Learning Rate**: How quickly the system adapts to user patterns
5. **Collaboration Success**: Multi-persona workflow effectiveness
## Performance Monitoring
### Activation Performance Tracking
```typescript
// Monitor activation timing
class ActivationProfiler {
private timings: Map<string, number[]> = new Map();
async profileActivation(input: string, context: any) {
const start = performance.now();
const result = await personaSystem.processInput(input, context);
const duration = performance.now() - start;
const personas = result.personas?.activePersonas?.map(p => p.name) || [];
// Track timing by persona combination
const key = personas.sort().join('-') || 'none';
if (!this.timings.has(key)) {
this.timings.set(key, []);
}
this.timings.get(key)!.push(duration);
return { result, duration, personas };
}
getAverageTimings() {
const averages = new Map<string, number>();
for (const [key, times] of this.timings) {
const avg = times.reduce((a, b) => a + b, 0) / times.length;
averages.set(key, Math.round(avg * 100) / 100);
}
return averages;
}
}
// Usage
const profiler = new ActivationProfiler();
const { result, duration, personas } = await profiler.profileActivation(
"Review this security vulnerability",
{ files: ["auth.ts"] }
);
console.log(`Activated ${personas.join(', ')} in ${duration}ms`);
```
### Memory Usage Monitoring
```typescript
// Monitor persona system memory usage
function getMemoryUsage() {
const usage = process.memoryUsage();
return {
heapUsed: Math.round(usage.heapUsed / 1024 / 1024),
heapTotal: Math.round(usage.heapTotal / 1024 / 1024),
external: Math.round(usage.external / 1024 / 1024),
rss: Math.round(usage.rss / 1024 / 1024)
};
}
// Track memory over session
setInterval(() => {
const memory = getMemoryUsage();
const analytics = personaSystem.getAnalytics();
console.log('Memory Usage:', {
...memory,
interactions: analytics.personaManager.totalInteractions,
activePersonas: analytics.systemHealth.activePersonas
});
}, 60000); // Every minute
```
## Activation Debugging
### Detailed Activation Analysis
```typescript
// Debug persona activation decisions
async function debugActivation(input: string, context: any) {
console.log('=== Persona Activation Debug ===');
console.log('Input:', input);
console.log('Context:', JSON.stringify(context, null, 2));
// Process with debug info
const result = await personaSystem.processInput(input, context);
if (result.personas?.detectionResults) {
console.log('\nDetection Results:');
for (const rec of result.personas.detectionResults.recommendations) {
console.log(`${rec.persona}: ${rec.confidence.toFixed(2)} confidence`);
console.log(` Reasoning: ${rec.reasoning}`);
console.log(` Breakdown:`, {
keywords: rec.breakdown.keyword_matching.toFixed(2),
context: rec.breakdown.context_analysis.toFixed(2),
files: rec.breakdown.file_patterns.toFixed(2),
history: rec.breakdown.user_history.toFixed(2)
});
}
}
console.log('\nActivated Personas:');
result.personas?.activePersonas?.forEach(p => {
console.log(`- ${p.name}: ${p.confidence.toFixed(2)} (${p.activationReason})`);
if (p.reasoning) console.log(` ${p.reasoning}`);
});
if (result.personas?.collaboration) {
console.log('\nCollaboration Plan:');
console.log(`Strategy: ${result.personas.collaboration.strategy}`);
console.log(`Lead: ${result.personas.collaboration.leadPersona}`);
if (result.personas.collaboration.consultingPersonas?.length) {
console.log(`Supporting: ${result.personas.collaboration.consultingPersonas.join(', ')}`);
}
}
return result;
}
// Example usage
await debugActivation(
"Help me optimize this database query for better performance",
{
files: ["models/user.ts", "queries/search.sql"],
command: "optimize",
projectType: "web-app"
}
);
```
### Activation Pattern Analysis
```typescript
// Analyze activation patterns over time
class ActivationAnalyzer {
analyzePatterns(analytics: SystemAnalytics) {
const { personaUsage, collaborationPatterns } = analytics.personaManager;
// Most used personas
const sortedUsage = Object.entries(personaUsage)
.sort(([,a], [,b]) => b.count - a.count)
.slice(0, 5);
console.log('Top 5 Most Used Personas:');
sortedUsage.forEach(([persona, stats], index) => {
const avgConfidence = stats.totalConfidence / stats.count;
console.log(`${index + 1}. ${persona}: ${stats.count} times (avg confidence: ${avgConfidence.toFixed(2)})`);
});
// Most effective collaborations
const sortedCollabs = Object.entries(collaborationPatterns)
.sort(([,a], [,b]) => b - a)
.slice(0, 3);
console.log('\nTop 3 Collaboration Patterns:');
sortedCollabs.forEach(([pattern, count], index) => {
console.log(`${index + 1}. ${pattern}: ${count} times`);
});
return { sortedUsage, sortedCollabs };
}
identifyIssues(analytics: SystemAnalytics) {
const issues: string[] = [];
// Low confidence warnings
if (analytics.personaManager.averageConfidence < 0.7) {
issues.push(`Low average confidence: ${analytics.personaManager.averageConfidence.toFixed(2)}`);
}
// Unused personas
const { personaUsage } = analytics.personaManager;
const unusedPersonas = ['security', 'performance', 'frontend', 'backend', 'devops', 'architect', 'qa', 'refactorer', 'analyzer', 'mentor', 'scribe', 'po']
.filter(persona => !personaUsage[persona] || personaUsage[persona].count === 0);
if (unusedPersonas.length > 0) {
issues.push(`Unused personas: ${unusedPersonas.join(', ')}`);
}
// Low learning effectiveness
if (analytics.learning.learningEffectiveness < 0.5) {
issues.push(`Low learning effectiveness: ${analytics.learning.learningEffectiveness.toFixed(2)}`);
}
return issues;
}
}
// Usage
const analyzer = new ActivationAnalyzer();
const analytics = personaSystem.getAnalytics();
analyzer.analyzePatterns(analytics);
const issues = analyzer.identifyIssues(analytics);
if (issues.length > 0) {
console.log('\nPotential Issues:', issues);
}
```
## Learning System Analytics
### Learning Effectiveness Tracking
```typescript
// Monitor learning system performance
function analyzeLearningEffectiveness() {
const analytics = personaSystem.getAnalytics();
const learning = analytics.learning;
console.log('Learning System Analytics:');
console.log('Session Stats:', {
interactions: learning.sessionStats.interactions,
feedback: learning.sessionStats.feedback,
patterns: learning.sessionStats.patterns,
duration: `${Math.round(learning.sessionStats.sessionDuration / 60)}min`
});
console.log('Persistent Stats:', {
successfulPatterns: learning.persistentStats.successfulPatterns,
failedPatterns: learning.persistentStats.failedPatterns,
totalEvents: learning.persistentStats.totalLearningEvents,
successRate: `${Math.round((learning.persistentStats.successfulPatterns / learning.persistentStats.totalLearningEvents) * 100)}%`
});
console.log('Learning Effectiveness:', learning.learningEffectiveness);
console.log('Top Patterns:');
learning.topPatterns.forEach((pattern, index) => {
console.log(`${index + 1}. ${pattern.pattern} (${pattern.personas.join(', ')})`);
console.log(` Usage: ${pattern.usage}, Rating: ${pattern.rating.toFixed(1)}`);
});
console.log('Recommendations:');
learning.recommendations.forEach(rec => {
console.log(`- [${rec.priority}] ${rec.type}: ${rec.message}`);
});
}
```
### User Preference Analysis
```typescript
// Analyze user preferences and patterns
function analyzeUserPreferences() {
const analytics = personaSystem.getAnalytics();
// Analyze feedback patterns
const feedbackData = analytics.learning.topPatterns
.filter(p => p.rating >= 4.0)
.sort((a, b) => b.rating - a.rating);
console.log('User Preferences (High-Rated Patterns):');
feedbackData.slice(0, 5).forEach((pattern, index) => {
console.log(`${index + 1}. ${pattern.personas.join(' + ')}`);
console.log(` Pattern: ${pattern.pattern}`);
console.log(` Rating: ${pattern.rating.toFixed(1)}/5.0`);
console.log(` Usage: ${pattern.usage} times`);
});
// Identify preferred persona combinations
const preferredCombos = analytics.personaManager.collaborationPatterns;
const sortedCombos = Object.entries(preferredCombos)
.filter(([combo]) => combo.includes('-')) // Multi-persona combinations
.sort(([,a], [,b]) => b - a)
.slice(0, 3);
console.log('\nPreferred Collaboration Combinations:');
sortedCombos.forEach(([combo, count], index) => {
console.log(`${index + 1}. ${combo.replace('-', ' + ')}: ${count} times`);
});
}
```
## Collaboration Analysis
### Multi-Persona Workflow Analysis
```typescript
// Analyze collaboration effectiveness
function analyzeCollaboration() {
const analytics = personaSystem.getAnalytics();
// Collaboration vs single persona usage
const totalInteractions = analytics.personaManager.totalInteractions;
const collaborations = Object.values(analytics.personaManager.collaborationPatterns)
.reduce((sum, count) => sum + count, 0);
const collaborationRate = (collaborations / totalInteractions) * 100;
console.log('Collaboration Analytics:');
console.log(`Collaboration Rate: ${collaborationRate.toFixed(1)}%`);
console.log(`Single Persona: ${(100 - collaborationRate).toFixed(1)}%`);
// Most effective persona pairs
const personaPairs = Object.entries(analytics.personaManager.collaborationPatterns)
.filter(([combo]) => combo.split('-').length === 2)
.sort(([,a], [,b]) => b - a)
.slice(0, 5);
console.log('\nMost Effective Persona Pairs:');
personaPairs.forEach(([pair, count], index) => {
const [p1, p2] = pair.split('-');
console.log(`${index + 1}. ${p1} + ${p2}: ${count} collaborations`);
});
// Complex collaboration patterns (3+ personas)
const complexPatterns = Object.entries(analytics.personaManager.collaborationPatterns)
.filter(([combo]) => combo.split('-').length >= 3)
.sort(([,a], [,b]) => b - a);
if (complexPatterns.length > 0) {
console.log('\nComplex Collaboration Patterns:');
complexPatterns.slice(0, 3).forEach(([pattern, count], index) => {
const personas = pattern.split('-');
console.log(`${index + 1}. ${personas.join(' + ')}: ${count} times`);
});
}
}
```
## User Experience Metrics
### Response Quality Tracking
```typescript
// Track user satisfaction and response quality
function trackResponseQuality() {
const analytics = personaSystem.getAnalytics();
// Calculate satisfaction metrics
const topPatterns = analytics.learning.topPatterns;
const totalRatings = topPatterns.reduce((sum, p) => sum + p.usage, 0);
const weightedRating = topPatterns.reduce((sum, p) => sum + (p.rating * p.usage), 0) / totalRatings;
console.log('User Experience Metrics:');
console.log(`Average Rating: ${weightedRating.toFixed(2)}/5.0`);
console.log(`Total Rated Interactions: ${totalRatings}`);
// Quality distribution
const ratingDistribution = {
excellent: topPatterns.filter(p => p.rating >= 4.5).length,
good: topPatterns.filter(p => p.rating >= 3.5 && p.rating < 4.5).length,
average: topPatterns.filter(p => p.rating >= 2.5 && p.rating < 3.5).length,
poor: topPatterns.filter(p => p.rating < 2.5).length
};
console.log('Quality Distribution:', ratingDistribution);
// Identify improvement areas
const lowRatedPatterns = topPatterns
.filter(p => p.rating < 3.0)
.sort((a, b) => a.rating - b.rating)
.slice(0, 3);
if (lowRatedPatterns.length > 0) {
console.log('\nLow-Rated Patterns (Need Improvement):');
lowRatedPatterns.forEach((pattern, index) => {
console.log(`${index + 1}. ${pattern.personas.join(' + ')}: ${pattern.rating.toFixed(1)}/5.0`);
console.log(` Pattern: ${pattern.pattern}`);
});
}
}
```
## Debugging Workflows
### Step-by-Step Debugging Process
```typescript
// Comprehensive debugging workflow
async function debugPersonaIssue(input: string, expectedPersonas: string[]) {
console.log('=== Persona System Debug Workflow ===');
// Step 1: System Health Check
console.log('1. System Health Check');
const isReady = personaSystem.isReady();
console.log(` System Ready: ${isReady}`);
if (!isReady) {
console.log(' ❌ System not ready - initializing...');
await personaSystem.initialize();
}
// Step 2: Input Analysis
console.log('\n2. Input Analysis');
console.log(` Input: "${input}"`);
console.log(` Expected Personas: ${expectedPersonas.join(', ')}`);
// Step 3: Manual Flag Detection
console.log('\n3. Manual Flag Detection');
const hasManualFlags = input.includes('--persona-');
console.log(` Manual Flags Detected: ${hasManualFlags}`);
// Step 4: Context Preparation
console.log('\n4. Context Preparation');
const context = {
cwd: process.cwd(),
timestamp: new Date().toISOString(),
debug: true
};
console.log(` Context: ${JSON.stringify(context, null, 2)}`);
// Step 5: Activation Process
console.log('\n5. Activation Process');
const result = await debugActivation(input, context);
// Step 6: Result Validation
console.log('\n6. Result Validation');
const actualPersonas = result.personas?.activePersonas?.map(p => p.name) || [];
const matches = expectedPersonas.filter(p => actualPersonas.includes(p));
const missing = expectedPersonas.filter(p => !actualPersonas.includes(p));
const unexpected = actualPersonas.filter(p => !expectedPersonas.includes(p));
console.log(` Expected: ${expectedPersonas.join(', ')}`);
console.log(` Actual: ${actualPersonas.join(', ')}`);
console.log(` Matches: ${matches.join(', ')}`);
if (missing.length > 0) console.log(` ❌ Missing: ${missing.join(', ')}`);
if (unexpected.length > 0) console.log(` ⚠️ Unexpected: ${unexpected.join(', ')}`);
// Step 7: Recommendations
console.log('\n7. Debug Recommendations');
if (missing.length > 0) {
console.log(' - Check persona auto-activation keywords');
console.log(' - Verify confidence thresholds');
console.log(' - Review context detection logic');
}
if (unexpected.length > 0) {
console.log(' - Review keyword overlaps between personas');
console.log(' - Check for overly broad activation patterns');
}
if (actualPersonas.length === 0) {
console.log(' - Verify persona system initialization');
console.log(' - Check for configuration errors');
console.log(' - Review confidence threshold settings');
}
return { matches: matches.length, missing: missing.length, unexpected: unexpected.length };
}
// Example usage
await debugPersonaIssue(
"Review this authentication code for security vulnerabilities",
["security", "backend"]
);
```
### Performance Bottleneck Identification
```typescript
// Identify performance bottlenecks
async function identifyBottlenecks() {
console.log('=== Performance Bottleneck Analysis ===');
const testInputs = [
"Fix this security issue",
"Optimize performance of this function",
"Review frontend accessibility",
"Help with backend API design",
"Set up CI/CD pipeline"
];
const results = [];
for (const input of testInputs) {
const start = performance.now();
// Time persona activation
const activationStart = performance.now();
const result = await personaSystem.processInput(input);
const activationTime = performance.now() - activationStart;
// Time prompt generation
const promptStart = performance.now();
const personas = result.personas?.activePersonas || [];
if (personas.length > 0) {
// Simulate prompt generation timing
await new Promise(resolve => setTimeout(resolve, 1));
}
const promptTime = performance.now() - promptStart;
const totalTime = performance.now() - start;
results.push({
input,
personas: personas.map(p => p.name),
activationTime: Math.round(activationTime * 100) / 100,
promptTime: Math.round(promptTime * 100) / 100,
totalTime: Math.round(totalTime * 100) / 100
});
}
// Analyze results
const avgActivation = results.reduce((sum, r) => sum + r.activationTime, 0) / results.length;
const avgTotal = results.reduce((sum, r) => sum + r.totalTime, 0) / results.length;
const slowest = results.sort((a, b) => b.totalTime - a.totalTime)[0];
console.log('Performance Analysis:');
console.log(`Average Activation Time: ${avgActivation.toFixed(2)}ms`);
console.log(`Average Total Time: ${avgTotal.toFixed(2)}ms`);
console.log(`Slowest Case: "${slowest.input}" (${slowest.totalTime}ms)`);
// Identify bottlenecks
if (avgActivation > 100) {
console.log('⚠️ Activation time bottleneck detected');
}
if (avgTotal > 200) {
console.log('⚠️ Overall performance bottleneck detected');
}
return results;
}
```
## Optimization Strategies
### Performance Optimization
```typescript
// Optimize persona system performance
class PersonaOptimizer {
// Cache frequently used patterns
private activationCache = new Map<string, any>();
async optimizeActivation(input: string, context: any) {
const cacheKey = this.generateCacheKey(input, context);
// Check cache first
if (this.activationCache.has(cacheKey)) {
return this.activationCache.get(cacheKey);
}
// Process normally
const result = await personaSystem.processInput(input, context);
// Cache successful results
if (result.success && result.personas?.activePersonas?.length > 0) {
this.activationCache.set(cacheKey, result);
// Limit cache size
if (this.activationCache.size > 100) {
const firstKey = this.activationCache.keys().next().value;
this.activationCache.delete(firstKey);
}
}
return result;
}
private generateCacheKey(input: string, context: any): string {
const contextKey = JSON.stringify({
files: context.files || [],
command: context.command,
projectType: context.projectType
});
return `${input}:${contextKey}`;
}
// Optimize confidence thresholds based on usage
optimizeThresholds(analytics: SystemAnalytics) {
const { personaUsage, averageConfidence } = analytics.personaManager;
console.log('Threshold Optimization Recommendations:');
// Lower threshold for underused personas with high confidence
Object.entries(personaUsage).forEach(([persona, stats]) => {
const avgConfidence = stats.totalConfidence / stats.count;
if (stats.count < 5 && avgConfidence > 0.8) {
console.log(`- Lower threshold for ${persona} (low usage, high confidence)`);
}
if (stats.count > 20 && avgConfidence < 0.6) {
console.log(`- Raise threshold for ${persona} (high usage, low confidence)`);
}
});
}
}
```
### Learning System Optimization
```typescript
// Optimize learning system based on analytics
function optimizeLearning(analytics: SystemAnalytics) {
const learning = analytics.learning;
console.log('Learning System Optimization:');
// Adjust learning rate based on effectiveness
if (learning.learningEffectiveness < 0.5) {
console.log('- Increase learning rate (low effectiveness)');
console.log('- Collect more user feedback');
console.log('- Review pattern recognition algorithms');
}
// Focus on successful patterns
const successfulPatterns = learning.topPatterns.filter(p => p.rating >= 4.0);
if (successfulPatterns.length > 0) {
console.log('- Reinforce successful patterns:');
successfulPatterns.slice(0, 3).forEach(pattern => {
console.log(` * ${pattern.personas.join(' + ')}: ${pattern.rating.toFixed(1)}/5.0`);
});
}
// Address failed patterns
const failedPatterns = learning.topPatterns.filter(p => p.rating < 2.5);
if (failedPatterns.length > 0) {
console.log('- Review failed patterns:');
failedPatterns.forEach(pattern => {
console.log(` * ${pattern.personas.join(' + ')}: ${pattern.rating.toFixed(1)}/5.0`);
});
}
}
```
This comprehensive analytics and debugging guide provides tools and workflows for monitoring, analyzing, and optimizing the Claude Code Buddy persona system for maximum effectiveness and user satisfaction.