UNPKG

@andrebuzeli/advanced-memory-markdown-mcp

Version:

Advanced Memory Bank MCP v3.1.5 - Sistema avançado de gerenciamento de memória com isolamento de projetos por IDE, sincronização sob demanda, backup a cada 30min, apenas arquivos .md principais sincronizados, pasta reasoning temporária com limpeza automát

126 lines 5.68 kB
/** * Sync Manager - Gerencia sincronização entre MEMORY_BANK_ROOT e pasta local .memory-bank * * IMPORTANTE - NOME DO PROJETO: * - O projectName DEVE ser exatamente o nome da pasta RAIZ do projeto aberto no IDE * - NÃO é uma subpasta, NÃO é um subprojeto - é a pasta raiz que foi aberta no IDE * - O nome deve ser uma cópia EXATA sem adicionar ou remover nada * * Funcionalidades: * - Sincronização automática entre MEMORY_BANK_ROOT e .memory-bank local * - Criação automática de arquivos .md por projeto (memory.md, task.md, plan.md) * - Detecção de mudanças em tempo real * - Sincronização somente leitura na pasta .memory-bank local */ import * as fs from 'fs/promises'; import * as path from 'path'; import * as os from 'os'; import * as crypto from 'crypto'; import { ProjectStructureManager } from './project-structure-manager.js'; export class SyncManager { projectManager; memoryBankRoot; tempDir; constructor() { this.projectManager = new ProjectStructureManager(); // MEMORY_BANK_ROOT configurado via variável de ambiente this.memoryBankRoot = process.env.MEMORY_BANK_ROOT || path.join(os.homedir(), '.memory-bank-root'); this.tempDir = path.join(os.tmpdir(), 'advanced-memory-mcp'); } /** * Gera um identificador único para o projeto baseado no projectPath * Isso evita conflitos entre múltiplas instâncias de IDEs */ generateProjectIdentifier(projectName, projectPath) { const normalizedPath = path.resolve(projectPath).toLowerCase(); const hash = crypto.createHash('md5').update(normalizedPath).digest('hex').substring(0, 8); const uniqueId = `${projectName}-${hash}`; return { projectName, projectPath, uniqueId }; } // Métodos de detecção de projeto local removidos // Sincronização local removida - usando apenas MEMORY_BANK_ROOT // Métodos de sincronização local removidos // Métodos auxiliares de detecção removidos // Auto sync removido - usando apenas MEMORY_BANK_ROOT /** * Ensures project structure exists in MEMORY_BANK_ROOT * Creates project folder and .md files automatically if they don't exist */ async ensureProjectStructure(projectName) { const projectPath = path.join(this.memoryBankRoot, projectName); try { // Create project directory if it doesn't exist await fs.mkdir(projectPath, { recursive: true }); // Create required .md files if they don't exist const requiredFiles = [ { name: 'memory.md', content: this.getDefaultMemoryContent() }, { name: 'task.md', content: this.getDefaultTaskContent() }, { name: 'plan.md', content: this.getDefaultPlanContent() } ]; for (const file of requiredFiles) { const filePath = path.join(projectPath, file.name); try { await fs.access(filePath); } catch { // File doesn't exist, create it await fs.writeFile(filePath, file.content, 'utf8'); } } // Estrutura criada apenas no MEMORY_BANK_ROOT } catch (error) { console.error(`Failed to ensure project structure for ${projectName}:`, error); throw error; } } // Sincronização local removida - usando apenas MEMORY_BANK_ROOT /** * Lists all projects in MEMORY_BANK_ROOT */ async listProjects() { try { await fs.mkdir(this.memoryBankRoot, { recursive: true }); const entries = await fs.readdir(this.memoryBankRoot, { withFileTypes: true }); return entries .filter(entry => entry.isDirectory()) .map(entry => entry.name) .sort(); } catch (error) { console.error('Failed to list projects:', error); return []; } } /** * Obtém o caminho completo para um arquivo específico do projeto * Usa o projectName original para manter compatibilidade com estrutura existente */ getProjectFilePath(projectName, fileName) { return path.join(this.memoryBankRoot, projectName, fileName); } /** * Obtém o caminho completo para um arquivo específico do projeto usando identificador único * Usado quando há necessidade de isolamento entre instâncias */ getProjectFilePathWithId(projectIdentifier, fileName) { return path.join(this.memoryBankRoot, projectIdentifier.uniqueId, fileName); } /** * Default content templates for .md files */ getDefaultMemoryContent() { return `# Memory Bank\n\n## Tópicos de Memória\n\n<!-- Este arquivo é gerenciado automaticamente pelo Advanced Memory Bank MCP -->\n<!-- Não edite manualmente - use as ferramentas MCP para modificar o conteúdo -->\n\n`; } getDefaultTaskContent() { return `# Task Manager\n\n## Tasks\n\n<!-- Nenhuma tarefa criada ainda -->\n\n---\n\n<!-- Este arquivo é gerenciado automaticamente pelo Advanced Memory Bank MCP -->\n<!-- Não edite manualmente - use as ferramentas MCP para modificar o conteúdo -->\n\n`; } getDefaultPlanContent() { return `# Plan Manager\n\n## Planejamentos do Projeto\n\n<!-- Este arquivo é gerenciado automaticamente pelo Advanced Memory Bank MCP -->\n<!-- Não edite manualmente - use as ferramentas MCP para modificar o conteúdo -->\n\n`; } } //# sourceMappingURL=sync-manager.js.map