@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
JavaScript
/**
* 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