BMAD-METHOD/docs/memory-architecture/README.md

23 KiB

BMAD Memory Architecture Implementation Guide

Overview

This guide provides step-by-step instructions for implementing the BMAD Memory Architecture methodology within your IDE environment. The methodology is designed to work across Claude Code, Cursor AI, V0, Roocode, JetBrains, and other AI-enhanced development environments.

Quick Start Guide

1. Choose Your Implementation Path

Select the implementation approach that matches your IDE environment:

2. Implementation Phases

All implementations follow these phases:

  1. Foundation Setup (1-2 hours)
  2. Basic Memory Operations (2-4 hours)
  3. Integration & Enhancement (4-8 hours)
  4. Optimization & Monitoring (2-4 hours)

3. Prerequisites

Before starting, ensure you have:

  • Access to your chosen IDE environment
  • Basic understanding of your IDE's extension/plugin system
  • Familiarity with the BMAD Method personas you'll be using
  • Understanding of your project's data privacy requirements

Phase 1: Foundation Setup

Step 1: Create Memory Directory Structure

Create the following directory structure in your project:

. your-project/ .bmad-memory/ config/ memory-config.json retention-policies.json storage/ working/ short-term/ episodic/ semantic/ procedural/ long-term/ indices/ id-index.json type-index.json temporal-index.json logs/ memory-operations.log \.

Step 2: Initialize Memory Configuration

Create memory-config.json:

.json { "version": "1.0.0", "ide_environment": "your-ide-name", "memory_types": { "working": { "enabled": true, "storage_type": "session", "max_size_mb": 50, "retention_hours": 24 }, "short_term": { "enabled": true, "storage_type": "file", "max_size_mb": 200, "retention_days": 7 }, "episodic": { "enabled": true, "storage_type": "file", "max_size_mb": 500, "retention_months": 3 }, "semantic": { "enabled": true, "storage_type": "file", "max_size_mb": 1000, "retention_policy": "importance_based" }, "procedural": { "enabled": true, "storage_type": "file", "max_size_mb": 300, "retention_policy": "usage_based" }, "long_term": { "enabled": true, "storage_type": "file", "max_size_mb": 2000, "retention_policy": "permanent" } }, "security": { "encryption_enabled": true, "access_control": "user_based", "privacy_level": "private" }, "performance": { "cache_enabled": true, "cache_size_mb": 100, "indexing_enabled": true } } \.

Step 3: Create Retention Policies

Create retention-policies.json:

.json { "policies": { "importance_based": { "critical": "permanent", "important": "1_year", "useful": "6_months", "reference": "3_months" }, "usage_based": { "frequent": "1_year", "occasional": "6_months", "rare": "3_months", "never": "1_month" }, "privacy_based": { "public": "standard_retention", "shared": "group_retention", "private": "user_controlled", "sensitive": "strict_retention" } }, "cleanup_schedule": { "daily": ["working", "temporary"], "weekly": ["short_term"], "monthly": ["episodic", "low_importance"], "quarterly": ["full_cleanup"] } } \.

Phase 2: Basic Memory Operations

Step 1: Implement Memory Entity Structure

Create a basic memory entity template:

.json { "id": "mem_{{timestamp}}_{{random}}", "type": "semantic|episodic|procedural|working|short_term|long_term", "created": "2024-01-15T10:30:00Z", "last_accessed": "2024-01-15T10:30:00Z", "access_count": 1, "importance": 0.5, "metadata": { "source": "user_input|system_generated|imported", "owner": "user_id", "project": "project_name", "tags": ["tag1", "tag2"], "privacy": "private|shared|public", "retention_policy": "policy_name" }, "content": { "title": "Memory Title", "summary": "Brief summary of the memory", "details": "Detailed content", "format": "text|json|markdown|code", "embeddings": null }, "relationships": [ { "target_id": "mem_other_id", "type": "related|supports|contradicts|follows", "strength": 0.8, "created": "2024-01-15T10:30:00Z" } ] } \.

Step 2: Implement Basic CRUD Operations

Create Memory Operation

.```javascript // Example implementation pattern function createMemory(content, type, metadata = {}) { const memory = { id: generateMemoryId(), type: type, created: new Date().toISOString(), last_accessed: new Date().toISOString(), access_count: 1, importance: calculateInitialImportance(content, metadata), metadata: { source: 'user_input', owner: getCurrentUser(), project: getCurrentProject(), tags: extractTags(content), privacy: metadata.privacy || 'private', retention_policy: determineRetentionPolicy(type, metadata), ...metadata }, content: { title: extractTitle(content), summary: generateSummary(content), details: content, format: detectFormat(content), embeddings: null // Will be generated asynchronously }, relationships: [] };

return storeMemory(memory); } .```

Read Memory Operation

.```javascript function retrieveMemory(memoryId) { const memory = loadMemoryFromStorage(memoryId); if (memory) { memory.last_accessed = new Date().toISOString(); memory.access_count += 1; updateMemoryInStorage(memory); return memory; } return null; }

function searchMemories(query, options = {}) { const searchStrategy = determineSearchStrategy(query); const results = executeSearch(query, searchStrategy, options); return rankAndFilterResults(results, options); } .```

Update Memory Operation

.```javascript function updateMemory(memoryId, updates) { const memory = loadMemoryFromStorage(memoryId); if (!memory) return null;

// Merge updates const updatedMemory = { ...memory, ...updates, last_modified: new Date().toISOString(), version: (memory.version || 1) + 1 };

// Update indices updateIndices(updatedMemory);

return storeMemory(updatedMemory); } .```

Delete Memory Operation

.```javascript function deleteMemory(memoryId) { const memory = loadMemoryFromStorage(memoryId); if (!memory) return false;

// Clean up relationships cleanupRelationships(memoryId);

// Remove from indices removeFromIndices(memoryId);

// Secure deletion secureDeleteFromStorage(memoryId);

// Log deletion logMemoryOperation('delete', memoryId);

return true; } .```

.```javascript function implementBasicSearch() { // Direct ID lookup function findById(id) { return loadMemoryFromStorage(id); }

// Keyword search function searchByKeywords(keywords) { const results = []; const allMemories = loadAllMemories();

for (const memory of allMemories) {
  const score = calculateKeywordScore(memory, keywords);
  if (score > 0.3) {
    results.push({ memory, score });
  }
}

return results.sort((a, b) => b.score - a.score);

}

// Type-based search function searchByType(type) { return loadMemoriesByType(type); }

// Temporal search function searchByTimeRange(startDate, endDate) { return loadMemoriesByTimeRange(startDate, endDate); } } .```

Phase 3: Integration & Enhancement

Step 1: IDE-Specific Integration

Claude Code Integration

.```markdown

Claude Code Memory Integration

Setup Instructions

  1. Create memory management prompts:

.``` You are now equipped with a memory system. When I share information that should be remembered:

  1. Identify the memory type (working, episodic, semantic, procedural, long-term)
  2. Extract key information and create a memory entry
  3. Store it in the appropriate .bmad-memory/ directory
  4. Update relevant indices

When I ask questions, search your memory first before responding. .```

  1. Create memory integration workflow:

.``` For each conversation:

  • Check for relevant memories at the start
  • Create new memories for important insights
  • Update existing memories with new information
  • Maintain conversation context using memory . \.

Cursor AI Integration

.```typescript // Cursor AI Extension Integration class CursorMemoryExtension { constructor() { this.memorySystem = new MemorySystem(); this.setupEventListeners(); }

setupEventListeners() { // Listen for file changes vscode.workspace.onDidChangeTextDocument((event) => { this.handleFileChange(event); });

// Listen for cursor position changes
vscode.window.onDidChangeTextEditorSelection((event) => {
  this.handleCursorChange(event);
});

}

handleFileChange(event) { // Extract context and create memory const context = this.extractContext(event); this.memorySystem.createMemory(context, 'working'); }

provideCompletionItems(document, position) { // Use memory to enhance completions const context = this.getContext(document, position); const relevantMemories = this.memorySystem.search(context); return this.enhanceCompletions(relevantMemories); } } .```

V0 Integration

.```javascript // V0 Memory Integration class V0MemorySystem { constructor() { this.storage = new BrowserMemoryStorage(); this.setupComponentMemory(); }

setupComponentMemory() { // Hook into component generation this.onComponentGenerated = (component) => { this.storeComponentMemory(component); };

// Hook into design decisions
this.onDesignDecision = (decision) => {
  this.storeDesignMemory(decision);
};

}

storeComponentMemory(component) { const memory = { type: 'procedural', content: { title: Component: ${component.name}, details: component.code, metadata: { framework: component.framework, props: component.props, usage: component.usage } } };

this.storage.store(memory);

}

enhanceGeneration(prompt) { // Search for relevant component memories const relevantMemories = this.storage.search(prompt); return this.incorporateMemories(prompt, relevantMemories); } } .```

JetBrains Integration

.```kotlin // JetBrains Plugin Integration class JetBrainsMemoryPlugin : ApplicationComponent { private val memorySystem = MemorySystem()

override fun initComponent() {
    setupProjectListeners()
    setupEditorListeners()
}

private fun setupProjectListeners() {
    ProjectManager.getInstance().addProjectManagerListener(object : ProjectManagerListener {
        override fun projectOpened(project: Project) {
            memorySystem.loadProjectMemories(project)
        }
        
        override fun projectClosed(project: Project) {
            memorySystem.saveProjectMemories(project)
        }
    })
}

private fun setupEditorListeners() {
    EditorFactory.getInstance().addEditorFactoryListener(object : EditorFactoryListener {
        override fun editorCreated(event: EditorFactoryEvent) {
            val editor = event.editor
            setupMemoryIntegration(editor)
        }
    })
}

private fun setupMemoryIntegration(editor: Editor) {
    // Add memory-enhanced code completion
    // Add memory-based code suggestions
    // Track coding patterns for memory storage
}

} .```

Step 2: Persona Integration

.```javascript // Persona-Memory Integration class PersonaMemoryIntegration { constructor(memorySystem) { this.memorySystem = memorySystem; this.setupPersonaSpecificMemory(); }

setupPersonaSpecificMemory() { // Architect persona memory specialization this.architectMemory = { storeArchitecturalDecision: (decision) => { return this.memorySystem.createMemory({ type: 'semantic', content: decision, metadata: { persona: 'architect', category: 'architectural_decision', impact: 'high' } }); },

  getArchitecturalPatterns: (context) => {
    return this.memorySystem.search({
      query: context,
      filters: {
        persona: 'architect',
        category: 'pattern'
      }
    });
  }
};

// Product Manager persona memory specialization
this.pmMemory = {
  storeRequirement: (requirement) => {
    return this.memorySystem.createMemory({
      type: 'episodic',
      content: requirement,
      metadata: {
        persona: 'product_manager',
        category: 'requirement',
        stakeholder: requirement.stakeholder
      }
    });
  },
  
  getStakeholderFeedback: (stakeholder) => {
    return this.memorySystem.search({
      filters: {
        persona: 'product_manager',
        stakeholder: stakeholder
      }
    });
  }
};

// V0 UX/UI Architect persona memory specialization
this.uxMemory = {
  storeDesignPattern: (pattern) => {
    return this.memorySystem.createMemory({
      type: 'procedural',
      content: pattern,
      metadata: {
        persona: 'ux_ui_architect',
        category: 'design_pattern',
        component_type: pattern.type
      }
    });
  },
  
  getDesignPatterns: (componentType) => {
    return this.memorySystem.search({
      filters: {
        persona: 'ux_ui_architect',
        component_type: componentType
      }
    });
  }
};

} } .```

Step 3: Workflow Integration

.```javascript // Workflow-Memory Integration class WorkflowMemoryIntegration { constructor(memorySystem) { this.memorySystem = memorySystem; this.setupWorkflowHooks(); }

setupWorkflowHooks() { // Hook into workflow start this.onWorkflowStart = (workflow) => { const context = this.loadWorkflowContext(workflow); this.memorySystem.setWorkingContext(context); };

// Hook into workflow steps
this.onWorkflowStep = (step, result) => {
  this.memorySystem.createMemory({
    type: 'episodic',
    content: {
      title: `Workflow Step: ${step.name}`,
      details: result,
      workflow: step.workflow,
      timestamp: new Date().toISOString()
    }
  });
};

// Hook into workflow completion
this.onWorkflowComplete = (workflow, outcome) => {
  this.memorySystem.createMemory({
    type: 'semantic',
    content: {
      title: `Workflow Outcome: ${workflow.name}`,
      details: outcome,
      lessons_learned: this.extractLessons(workflow),
      success_factors: this.identifySuccessFactors(workflow)
    }
  });
};

}

enhanceWorkflowWithMemory(workflow) { // Get relevant memories for workflow const relevantMemories = this.memorySystem.search({ query: workflow.description, filters: { type: ['semantic', 'procedural'] } });

// Enhance workflow steps with memory insights
return this.incorporateMemoryInsights(workflow, relevantMemories);

} } .```

Phase 4: Optimization & Monitoring

Step 1: Performance Monitoring Setup

.```javascript // Performance Monitoring class MemoryPerformanceMonitor { constructor(memorySystem) { this.memorySystem = memorySystem; this.metrics = new PerformanceMetrics(); this.setupMonitoring(); }

setupMonitoring() { // Monitor operation latency this.memorySystem.onOperation = (operation, duration) => { this.metrics.recordLatency(operation, duration); };

// Monitor memory usage
setInterval(() => {
  this.metrics.recordMemoryUsage(this.getMemoryUsage());
}, 60000); // Every minute

// Monitor cache performance
this.memorySystem.cache.onHit = () => this.metrics.recordCacheHit();
this.memorySystem.cache.onMiss = () => this.metrics.recordCacheMiss();

}

generatePerformanceReport() { return { latency: this.metrics.getLatencyStats(), throughput: this.metrics.getThroughputStats(), memory_usage: this.metrics.getMemoryUsageStats(), cache_performance: this.metrics.getCacheStats(), recommendations: this.generateRecommendations() }; } } .```

Step 2: Quality Monitoring

.```javascript // Quality Monitoring class MemoryQualityMonitor { constructor(memorySystem) { this.memorySystem = memorySystem; this.setupQualityChecks(); }

setupQualityChecks() { // Monitor data quality setInterval(() => { this.checkDataQuality(); }, 3600000); // Every hour

// Monitor relationship integrity
setInterval(() => {
  this.checkRelationshipIntegrity();
}, 86400000); // Daily

}

checkDataQuality() { const memories = this.memorySystem.getAllMemories(); const qualityReport = { completeness: this.assessCompleteness(memories), accuracy: this.assessAccuracy(memories), consistency: this.assessConsistency(memories), freshness: this.assessFreshness(memories) };

this.reportQualityIssues(qualityReport);
return qualityReport;

} } .```

Step 3: Automated Maintenance

.```javascript // Automated Maintenance class MemoryMaintenanceSystem { constructor(memorySystem) { this.memorySystem = memorySystem; this.setupMaintenanceTasks(); }

setupMaintenanceTasks() { // Daily maintenance this.scheduleTask('daily', () => { this.cleanupWorkingMemory(); this.updateAccessStatistics(); this.optimizeIndices(); });

// Weekly maintenance
this.scheduleTask('weekly', () => {
  this.consolidateMemories();
  this.updateImportanceScores();
  this.cleanupExpiredMemories();
});

// Monthly maintenance
this.scheduleTask('monthly', () => {
  this.archiveOldMemories();
  this.optimizeStorage();
  this.generateMaintenanceReport();
});

}

scheduleTask(frequency, task) { // Implementation depends on your environment // Could use cron jobs, setTimeout, or IDE-specific scheduling } } .```

Testing Your Implementation

Step 1: Basic Functionality Tests

.```javascript // Basic Tests function runBasicTests() { console.log('Running basic memory system tests...');

// Test memory creation const memory = createMemory('Test content', 'working'); assert(memory.id, 'Memory should have an ID');

// Test memory retrieval const retrieved = retrieveMemory(memory.id); assert(retrieved.content.details === 'Test content', 'Content should match');

// Test memory search const results = searchMemories('Test'); assert(results.length > 0, 'Search should return results');

// Test memory update const updated = updateMemory(memory.id, { importance: 0.8 }); assert(updated.importance === 0.8, 'Importance should be updated');

// Test memory deletion const deleted = deleteMemory(memory.id); assert(deleted === true, 'Memory should be deleted');

console.log('Basic tests passed!'); } .```

Step 2: Integration Tests

.```javascript // Integration Tests function runIntegrationTests() { console.log('Running integration tests...');

// Test persona integration testPersonaIntegration();

// Test workflow integration testWorkflowIntegration();

// Test IDE-specific features testIDEIntegration();

console.log('Integration tests passed!'); } .```

Step 3: Performance Tests

.```javascript // Performance Tests function runPerformanceTests() { console.log('Running performance tests...');

// Test operation latency const startTime = Date.now(); for (let i = 0; i < 1000; i++) { createMemory(Test content ${i}, 'working'); } const createTime = Date.now() - startTime; console.log(Created 1000 memories in ${createTime}ms);

// Test search performance const searchStart = Date.now(); const results = searchMemories('Test'); const searchTime = Date.now() - searchStart; console.log(Search completed in ${searchTime}ms);

console.log('Performance tests completed!'); } .```

Troubleshooting Guide

Common Issues and Solutions

Issue: Memory operations are slow

Solution:

  1. Check if indexing is enabled
  2. Optimize cache settings
  3. Consider storage type (file vs. memory)
  4. Review retention policies

Issue: Search results are not relevant

Solution:

  1. Improve content summarization
  2. Add more specific tags
  3. Enhance relationship mapping
  4. Tune similarity thresholds

Issue: Memory usage is too high

Solution:

  1. Implement aggressive cleanup policies
  2. Compress old memories
  3. Archive infrequently accessed data
  4. Optimize data structures

Issue: IDE integration not working

Solution:

  1. Check IDE-specific API compatibility
  2. Verify extension/plugin permissions
  3. Review event listener setup
  4. Test with minimal implementation

Next Steps

After completing the basic implementation:

  1. Customize for Your Use Case: Adapt the memory types and retention policies to your specific needs
  2. Enhance Search: Implement semantic search using embeddings
  3. Add Analytics: Set up detailed performance and usage analytics
  4. Scale Up: Implement distributed memory for team collaboration
  5. Security Hardening: Add encryption and advanced access controls

Support and Resources

  • Memory Architecture Methodology: /bmad-agent/memory/memory-architecture.md
  • Data Structures Guide: /bmad-agent/memory/memory-data-structures.md
  • Performance Optimization: /bmad-agent/memory/memory-performance-monitoring.md
  • Security Implementation: /bmad-agent/memory/memory-security-privacy.md
  • Testing Framework: /bmad-agent/memory/memory-testing-validation.md

For additional support, refer to the IDE-specific implementation guides in the following sections.