roampal-core

Memória persistente para Claude Code com aprendizado baseado em resultados. Rastreia o que ajudou versus falhou, injeta contexto automaticamente via hooks.

Documentação

roampal-core

Servidor MCP de Memória Persistente Baseada em Resultados

Tests PyPI Latest release Downloads Stars License Python Discord

Dois comandos. Seu assistente de codificação com IA ganha memória baseada em resultados.
Funciona com Claude Code e OpenCode.


Benchmarks

85,8% no benchmark LoCoMo corrigido (não adversarial, precisão de resposta ponta a ponta) — validado em 1.986 perguntas em 10 conversas com dupla avaliação. Todos os números nesta seção são provenientes do artigo e do roampal-labs (veja as citações no final desta seção).

ResultadoPontuação
Aprendizado conversacional vs. ingestão bruta+23 pontos (76,6% vs 53,0%, p<0,0001)
Arquitetura vs. efeito do modeloArquitetura ~10x maior contribuinte
Resiliência a envenenamento (1.135 memórias adversariais)-2,6 a -4,2 pontos apenas
Recuperação TagCascade (tags primeiro + reclassificação CE)+1,9 Hit@1 vs. CE puro (p<0,0001)

O pipeline de benchmark roda em uma única GPU sem dependências de nuvem. O Roampal em si roda em CPU — nenhuma GPU é necessária. Metodologia completa, dados e scripts de avaliação: roampal-labs

Artigo: "Beyond Ingestion: What Conversational Memory Learning Reveals on a Corrected LoCoMo Benchmark" (Logan Teague, abril de 2026)


Início Rápido

pip install roampal
roampal init

Detecta automaticamente as ferramentas instaladas. Reinicie seu editor e comece a conversar.

Direcione para uma ferramenta específica: roampal init --claude-code ou roampal init --opencode

roampal init demo

Diferenças entre Plataformas

O ciclo principal é idêntico — ambas as plataformas injetam contexto, capturam trocas e avaliam resultados. O mecanismo de entrega difere:

Claude CodeOpenCode
Injeção de contextoHooks (stdout)Plugin (prompt do sistema)
Captura de trocasStop hookEvento session.idle do plugin
AvaliaçãoLLM principal via ferramenta score_memoriesSidecar independente (seu modelo escolhido, desabilitado por padrão até ser configurado)
AutocorreçãoHooks reiniciam o servidor automaticamente em caso de falhaPlugin reinicia o servidor automaticamente em caso de falha

O Claude Code solicita que o LLM principal avalie cada troca por meio da ferramenta score_memories. O OpenCode nunca se autoavalia — um sidecar independente (uma chamada de API separada) revisa cada troca como terceiro, eliminando o viés de autoavaliação. A ferramenta score_memories não é registrada no OpenCode. A avaliação é desabilitada por padrão até que você a configure explicitamente via roampal sidecar setup. Durante a configuração, o Roampal detecta modelos locais (Ollama, LM Studio, etc.) e permite que você escolha um modelo de avaliação. Os modelos gratuitos Zen estão disponíveis como uma opção explícita de adesão para usuários sem modelo local ou chave de API — eles roteiam pelo proxy do OpenCode, que pode registrar dados. Um modelo barato ou local funciona muito bem — a avaliação não precisa de um modelo poderoso.

v0.6.0: Ciclo de vida do servidor + vinculação de perfil por diretório + rede de segurança de deduplicação. O monolito de 4.700 linhas roampal/cli.py agora é um pacote roampal/cli/ dividido em módulos por domínio, protegido por snapshots de saída dourada, invariantes de tabela de despacho e uma suíte de equivalência byte-idêntica. Mudanças visíveis ao usuário por cima: roteamento de perfil por solicitação (hooks/MCP/plugin sempre nomeiam seu perfil; um nome não registrado agora falha explicitamente com um 404 "Crie primeiro" em vez de gravar silenciosamente no armazenamento padrão); roampal profile switch não mata mais o servidor em execução (cada sessão capta o novo perfil na próxima troca); servidores gerados rodam com isolamento -E [-P] e um cwd neutro (um projeto contendo um diretório roampal/ local não pode mais ocultar a instalação — e instalações no site do usuário, por exemplo, Python da Microsoft Store, funcionam novamente — um rascunho anterior desse endurecimento de spawn usava o sinalizador isolado -I, que também oculta o diretório de pacotes do site do usuário); status relata uma porta pendurada como parada, não como erro; servidores compartilhados se aposentam após 30 minutos ociosos (um roampal start em primeiro plano é isento); e roampal start --profile X sobrevive ao respawn ocioso por meio de um pino de lançamento persistido. Novos roampal profile bind <name> / unbind fixam um diretório (e seus subdiretórios) a um perfil — "este projeto sempre usa o perfil X" é um comando em vez de editar manualmente o JSON de env. Um teste de guarda de regressão de deduplicação (3 fatos distintos pelo caminho real store_memory_bank, mais vetores de modelo real gravados e um controle negativo que recria o regime quebrado v0.5.9 de ambas as maneiras) faz qualquer troca futura de embedder ou mudança de constante de distância falhar na suíte no primeiro toque, em vez de colapsar silenciosamente as gravações. Correção de privacidade (OpenCode): desde v0.3.7, o plugin do OpenCode enviava o texto da troca para Zen (opencode.ai) sempre que nenhum modelo de avaliação era escolhido — inclusive após "Skip" e roampal sidecar disable — quebrando a regra v0.5.3 de "nada sai da sua máquina sem uma escolha explícita", que só havia sido aplicada no lado do servidor. A v0.6.0 a aplica no plugin: Zen apenas após adesão explícita, e nenhuma chamada de avaliação até que um modelo seja escolhido. Se você usa OpenCode e nunca escolheu um modelo de avaliação, a avaliação agora está desligada até você executar roampal sidecar setup (ou --list para escolher sem o menu). Sem mudança de RAM — a pegada v0.5.9 e o estado do modelo são mantidos inalterados.

v0.5.9: Correção de pegada de memória + atualização de embedder/reranker + observabilidade de falhas — acionada por uma falha MemoryError rastreada até o arena de memória da CPU do ONNX Runtime que nunca libera buffers de rascunho por forma, agravada por arquivos de modelo FP16 que são convertidos para FP32 no carregamento. Desabilita o arena e o cache de padrão de memória em ambos os modelos, muda o embedder para sua própria exportação INT8 medida (mesmo modelo mpnet — a atualização planejada para e5-base foi adiada para v0.6.0 depois que um portão de precisão detectou uma regressão de guarda de quase-duplicatas) e o cross-encoder para sua própria exportação INT8, e compartilha uma sessão de cross-encoder entre todos os perfis em vez de uma por perfil. A pegada de processo medida cai de ~2.355MB para ~484MB em isolamento (~5x), e a busca fica mais rápida nos caminhos de embed e rerank, em vez de trocar memória por latência. Uma re-embed em segundo plano, por coleção, migra vetores existentes para o novo embedder automaticamente no primeiro início — nunca bloqueando o cliente MCP, nunca misturando famílias de modelos dentro de uma coleção. Também adiciona registro em arquivo, tratamento de MemoryError/ExceptionGroup, um heartbeat RSS e um endpoint /api/status para que o próximo incidente como este deixe um rastro, e estados degradados (embedder inativo, reranker inativo, migração em andamento) sejam exibidos ao usuário em vez de retornar silenciosamente um resultado vazio.

v0.5.8: Versão de resiliência a falhas — habilita WAL do SQLite + durabilidade FULL no catálogo ChromaDB para que terminações forçadas (conflitos de porta no Windows, mortes de processos externos, queda de energia) não corrompam ou esvaziem mais o banco de dados. Reescreve SessionManager.mark_scored() para realizar uma substituição atômica de arquivo temporário, garantindo que a transcrição JSONL sobreviva a uma falha no meio da gravação. Também inclui 16 novos testes automatizados cobrindo ambas as correções, corrige dívida de teste pré-existente que deixava a suíte completa vermelha no Windows e adiciona ferramentas de desenvolvimento (pytest-timeout, pytest-forked, build, twine). Nenhuma migração de dados é necessária; o WAL é aplicado no próximo início do servidor.

v0.5.7: Coleta de lixo na inicialização para o _completion_state.json do hook MCP. O arquivo acumulava uma entrada por conversation_id já visto sem limpeza, gerando amplificação de I/O em cada gravação e deixando sinalizadores scored_this_turn=True presos que podiam envenenar o fallback de avaliação entre sessões. A nova passagem _cleanup_completion_state descarta entradas com mais de 30 dias ou sem transcrição correspondente, impõe um teto rígido de 500 entradas e grava atomicamente. O TTL da transcrição JSONL foi aumentado de 7 → 30 dias para permanecer em sincronia com o TTL do arquivo de estado. Acompanha o Roampal Desktop v0.3.3.

v0.5.6: Versão de endurecimento — fecha lacunas de cobertura restantes da auditoria de verificação v0.5.5.x. Varredura fantasma após limpeza arquivada, limpeza automática sob pressão de capacidade, observabilidade de deduplicação, permissões de exclusão endurecidas, testes de ciclo arquivar-depois-adicionar, alinhamento do prompt do sidecar com o benchmark, fila de avaliação assíncrona (repetição adiada por sessão), reescrita de qualidade da definição de ferramenta MCP (TDQS), autodetecção do OpenCode Go no assistente de configuração do sidecar e correção da extração do nome do usuário.

v0.5.5.2: Hotfix — a instalação do plugin no Windows agora verifica se a cópia foi bem-sucedida (verificação de tamanho pós-cópia + fallback manual de leitura/gravação para interferência do OneDrive/antivírus). Também instala em %APPDATA%\opencode\plugins como fallback, já que alguns aplicativos Electron resolvem caminhos de configuração de forma diferente no Windows. Corrige casos restantes do problema #11, onde roampal init --force relatava sucesso, mas o plugin estava vazio ou no diretório errado.

v0.5.5.1: Hotfix — o OpenCode Desktop agora alterna corretamente os perfis quando você troca de projeto na interface (problema #10). O plugin lê o directory da sessão ativa via client.session.get() em vez de armazenar em cache o perfil no carregamento do módulo, para que um plugin singleton em um espaço de trabalho multiprojeto ainda atinja o perfil certo por mensagem. Também: roampal init --force agora realmente sobrescreve o arquivo do plugin do OpenCode (problema #11), com erros mais claros quando o Desktop segura um bloqueio de arquivo.

v0.5.5: Exclusão suave para memory_bank — a exclusão rígida do ChromaDB não remove realmente os vetores do HNSW, causando correspondências fantasma de deduplicação que bloqueiam novas memórias após exclusão pela interface. Substituída por atualização de metadados status=archived mais filtro de status em todos os caminhos de consulta/deduplicação. Também: mutex de avaliação → fila assíncrona (elimina solicitações descartadas), correção de contaminação de resumo do sidecar (cercamento de delimitador).

v0.5.4: A vinculação de perfil agora é por solicitação, não por processo. Cada cliente (servidor MCP, plugin do OpenCode, hooks Python para Claude Code / Cursor) envia um cabeçalho X-Roampal-Profile para que um único servidor FastAPI possa atender vários perfis simultaneamente. Corrige o problema #7, onde o ROAMPAL_PROFILE por projeto do OpenCode Desktop em opencode.json era ignorado porque o FastAPI singleton vinculava o perfil uma vez na inicialização.

v0.5.3: A avaliação por sidecar agora exige configuração explícita (sem fallback automático para Zen ou localhost). Modelos locais pequenos (qwen2.5:3b, etc.) que retornam arrays JSON simples em vez de respostas no formato OpenAI são tratados de forma transparente via tolerância de forma no lado do servidor.

Como Funciona

Quando você digita uma mensagem, o Roampal injeta automaticamente contexto relevante antes que sua IA o veja:

Você digita:

fix the auth bug

Sua IA vê:

═══ KNOWN CONTEXT ═══
• JWT refresh pattern fixed auth loop [id:patterns_a1b2] (3d, 90% proven, patterns)
• User prefers: never stage git changes [id:mb_c3d4] (memory_bank)
═══ END CONTEXT ═══

fix the auth bug

Sem chamadas manuais. Sem mudanças no fluxo de trabalho. Simplesmente funciona.

O Ciclo

  1. Você digita uma mensagem
  2. Roampal injeta contexto relevante automaticamente (hooks no Claude Code, plugin no OpenCode)
  3. A IA responde com plena consciência do seu histórico, preferências e do que funcionou antes
  4. Resultado avaliado — bons conselhos são promovidos, maus conselhos são rebaixados
  5. Repita — o sistema fica mais inteligente a cada troca

Cinco Coleções de Memória

| Coleção | Finalidade | Retenção | |------------|---------|----------| | `working` | Contexto da sessão atual | 24h — promovido se útil, excluído caso contrário | | `history` | Conversas passadas | 30 dias, com pontuação de resultados | | `patterns` | Soluções comprovadas | Persistente enquanto útil, promovido do histórico | | `memory_bank` | Identidade, preferências, objetivos | Permanente | | `books` | Documentos de referência enviados | Permanente |

Comandos

roampal init                # Auto-detect and configure installed tools
roampal init --claude-code  # Configure Claude Code explicitly
roampal init --opencode     # Configure OpenCode explicitly
roampal init --no-input     # Non-interactive setup (CI/scripts)
roampal start               # Start the HTTP server manually
roampal stop                # Stop the HTTP server
roampal status              # Check if server is running
roampal status --json       # Machine-readable status (for scripting)
roampal stats               # View memory statistics
roampal stats --json        # Machine-readable statistics (for scripting)
roampal doctor              # Diagnose installation issues
roampal summarize           # Summarize long memories (retroactive cleanup)
roampal context             # Output recent exchange context
roampal ingest <file>       # Add documents to books collection
roampal books               # List all ingested books
roampal remove <title>      # Remove a book by title
roampal sidecar status      # Check scoring model configuration (OpenCode)
roampal sidecar setup       # Configure scoring model (OpenCode)
roampal sidecar test        # Test scoring model response format (OpenCode)
roampal retag               # Re-extract tags on memories using sidecar LLM
roampal sidecar disable     # Disable scoring (removes config, retrieval still works)

# Choose a scoring model without the menu (v0.6.0) — for scripts and AI-driven installs.
# Ask the user first: the choice decides where exchange text is sent.
roampal sidecar setup --list [--json]                  # Every choice, where its data goes, the command that selects it
roampal sidecar setup --model qwen3:1.7b               # A detected local/API model (name from --list)
roampal sidecar setup --auto                           # The recommended detected LOCAL model (never cloud or paid)
roampal sidecar setup --url <base_url> --model <name> --key-env <ENV_VAR>   # Custom endpoint; key read from an env var
roampal sidecar setup --go <model>                     # OpenCode Go
roampal sidecar setup --zen                            # Opt in to free Zen cloud models (data sent to opencode.ai)

# Sidecar scope flags (v0.5.3+) — OpenCode merges project-local over user-global config:
roampal sidecar setup --scope user       # Write only to user-global config (~/.config/opencode/)
roampal sidecar setup --scope project    # Write only to project-local opencode.json in cwd ancestry
roampal sidecar setup                    # Auto-detects: uses project-local if shadow exists, otherwise user-global

# Sidecar scope flags for disable (v0.5.3+):
roampal sidecar disable --scope user       # Clear only from user-global config
roampal sidecar disable --scope project    # Clear only from project-local opencode.json
roampal sidecar disable                    # Auto-detects scope same as setup

# Named memory profiles (v0.5.1) — isolate memory per project, per client, etc.
roampal profile list                         # List registered profiles
roampal profile show                         # Show active profile and its path
roampal profile create <name>                # Create auto-located profile
roampal profile register <name> --path <dir> # Register an existing directory
roampal profile use <name>                   # Persist as user-global default
roampal profile unuse                        # Clear persistence
roampal profile switch <name>                # Persist as active (no server kill — sessions pick it up on the next exchange)
roampal profile delete <name>                # Remove from registry (cascades directory bindings)
roampal profile bind <name>                  # Bind cwd directory to profile (v0.6.0)
roampal profile bind <name> --path <dir>     # Bind a specific directory
roampal profile unbind --path <dir>          # Remove a binding
roampal reembed                              # Re-embed vectors after an embedder model change (v0.5.9+)
roampal help                                 # Show the command help
roampal start --profile <name>               # Launch with a default profile: sessions with nothing configured (hook/MCP resolve the launch pin explicitly) route there; survives idle respawn; cleared by bare start/stop

Perfis de Memória Nomeados (v0.5.1)

Execute armazenamentos de memória separados para diferentes contextos — por projeto, por cliente (Claude Code vs OpenCode), trabalho vs casa. Os perfis são gerenciados inteiramente pela CLI; sem arquivos de configuração para editar manualmente.

roampal profile create work          # auto-located at <appdata>/Roampal/data/work/
roampal profile switch work          # persist as active
# sessions without their own explicit profile config pick 'work' up on the next exchange

Registre um diretório existente como um perfil (sem migração de dados):

roampal profile register project-a --path /existing/custom/path

Precedência (a maior vence; camadas de env/config são por shell e escopo de arquivo de configuração, a vinculação é uma propriedade do diretório):

  1. Flag --profile <name>
  2. Variável de ambiente ROAMPAL_PROFILE=<name> (definida por projeto em opencode.json ou .claude.json env: {})
  3. Vinculação de diretório (v0.6.0) — roampal profile bind work fixa o diretório atual (e todos os subdiretórios) ao perfil work; a busca sobe a partir do seu diretório de trabalho atual e o diretório vinculado mais próximo vence. Um comando por projeto, mas não toda a configuração: qualquer variável de ambiente ROAMPAL_PROFILE definida para a configuração daquele projeto ainda vence a vinculação
  4. Padrão persistido roampal profile use <name>
  5. Fallback "default"

As sessões sempre nomeiam o perfil ao qual resolvem — um cabeçalho explícito, o diretório de trabalho atual de um projeto ou um padrão persistido — e o servidor compartilhado nunca adivinha um perfil a partir do seu próprio diretório de trabalho ou ambiente.

Ferramentas MCP

Sua IA recebe estas ferramentas de memória:

FerramentaDescriçãoPlataformas
search_memoryBusca profunda em todas as coleçõesAmbas
add_to_memory_bankArmazena fatos permanentes (identidade, preferências, objetivos)Ambas
update_memoryCorrige ou atualiza memórias existentesAmbas
delete_memoryRemove informações desatualizadasAmbas
score_memoriesPontua resultados de trocas anterioresClaude Code
record_responseArmazena principais conclusões de trocas significativasAmbas

Como funciona a pontuação: Os hooks do Claude Code solicitam ao LLM principal que chame score_memories a cada turno. O OpenCode usa um sidecar independente que pontua silenciosamente em segundo plano — o modelo nunca vê um prompt de pontuação e score_memories não é registrado como ferramenta. Se o sidecar estiver indisponível, um aviso solicita ao usuário que execute roampal sidecar setup. Escolha seu modelo de pontuação durante roampal init ou via roampal sidecar setup.

Como o Roampal se Compara

RecursoRoampal CoreClaude Code integrado (CLAUDE.md / memória automática)OpenCode integrado
Aprende com resultadosSim — conselhos ruins rebaixados, bons promovidosNãoNão
Recuperação semânticaSim — TagCascade + reclassificação com cross-encoderNão — arquivos carregados por completo, sem buscaSem sistema de memória
Injeção de contextoAutomática — memórias relevantes por consultaCLAUDE.md completo a cada sessão, memória automática sob demandaNenhuma
Extração de fatos atômicosSim — resumos + fatos, recuperação em duas viasNão — salva o que o Claude decide ser útilNão
Funciona entre projetosSim — memória compartilhada entre todos os projetosSomente por projeto (por repositório git)Sem memória
Escala com históricoSim — 5 coleções, promoção/rebaixamento/decadênciaCLAUDE.md ilimitado, memória automática nas primeiras 200 linhasSem memória
Totalmente local / privadoSim — ChromaDB na sua máquinaSimSim
Arquitetura
┌─────────────────────────────────────────────────────────┐
│  pip install roampal && roampal init                    │
│    Claude Code: hooks + MCP → ~/.claude/                │
│    OpenCode:    plugin + MCP → ~/.config/opencode/      │
└─────────────────────────────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│  HTTP Hook Server (port 27182)                          │
│    Auto-started on first use, self-heals on failure     │
│    Manual control: roampal start / roampal stop         │
└─────────────────────────────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│  User types message                                     │
│    → Hook/plugin calls HTTP server for context          │
│    → AI sees relevant memories, responds                │
│    → Exchange stored, scored (hooks or sidecar)         │
└─────────────────────────────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│  Single-Writer Backend                                  │
│    FastAPI → UnifiedMemorySystem → ChromaDB             │
│    All clients share one server, isolated by session    │
└─────────────────────────────────────────────────────────┘

Veja dev/docs/ para detalhes técnicos completos.

Requisitos

  • Python 3.10+ (3.13 suportado; 3.11+ recebe a proteção completa de lançamento -P — no 3.10, a pasta de lançamento neutra sozinha protege contra um projeto roampal/ que sombreia a instalação. Nota: Python 3.10 atinge o fim da vida útil em outubro de 2026)
  • Um de: Claude Code ou OpenCode
  • Plataformas: Windows, macOS, Linux (macOS e Python 3.13 são testados em CI a partir da v0.6.0; desenvolvido principalmente no Windows)
  • RAM: ~500MB disponíveis (reclassificador cross-encoder + embeddings + ChromaDB); a migração na primeira execução após uma atualização não adiciona pico significativo
  • Disco: ~500MB para modelos (embedding multilíngue + reclassificador, baixados automaticamente no primeiro uso)
  • CPU: Qualquer processador x86-64 moderno com AVX2 (Intel Haswell 2013+ / AMD Excavator 2015+)
  • GPU: Não é necessária — toda inferência roda na CPU via ONNX Runtime

Solução de Problemas

Hooks não funcionando? (Claude Code)
  • Reinicie o Claude Code (hooks carregam na inicialização)
  • Verifique o servidor HTTP: curl http://127.0.0.1:27182/api/health
MCP não conectando? (Claude Code)
  • Verifique se ~/.claude.json tem a entrada MCP roampal-core com o caminho correto do Python
  • Verifique o painel de saída do Claude Code para erros de MCP
Contexto não aparecendo? (OpenCode)
  • Certifique-se de ter executado roampal init --opencode
  • Verifique se o servidor iniciou automaticamente: curl http://127.0.0.1:27182/api/health
  • Se não, inicie manualmente: roampal start
Servidor trava e se recupera?

Isso é esperado. O Roampal tem autocura — se o servidor HTTP parar de responder, ele é reiniciado e tentado novamente automaticamente.

Ainda travado? Peça ajuda à sua IA — ela pode ler logs e depurar problemas do Roampal diretamente.

Suporte

O Roampal Core é completamente gratuito e de código aberto.

roampal-core MCP server

Licença

Apache 2.0