# 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: - **[Claude Code Implementation](#claude-code-implementation)** - File-based memory with conversation integration - **[Cursor AI Implementation](#cursor-ai-implementation)** - Workspace-integrated memory with extension APIs - **[V0 Implementation](#v0-implementation)** - Browser-based memory with component integration - **[JetBrains Implementation](#jetbrains-implementation)** - Plugin-based memory with IDE integration - **[Universal Implementation](#universal-implementation)** - Platform-agnostic approach ### 2. Implementation Phases All implementations follow these phases: 1. **[Foundation Setup](#phase-1-foundation-setup)** (1-2 hours) 2. **[Basic Memory Operations](#phase-2-basic-memory-operations)** (2-4 hours) 3. **[Integration & Enhancement](#phase-3-integration-enhancement)** (4-8 hours) 4. **[Optimization & Monitoring](#phase-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; } \.``` ### Step 3: Implement Basic Search \.```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. \.``` 2. 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.