roampal-core

Memoria persistente para Claude Code con aprendizaje basado en resultados. Rastrea lo que ayudó vs falló, inyecta automáticamente contexto mediante hooks.

Documentación

roampal-core

Servidor MCP de Memoria Persistente Basada en Resultados

Tests PyPI Latest release Downloads Stars License Python Discord

Dos comandos. Tu asistente de codificación con IA obtiene memoria basada en resultados.
Funciona con Claude Code y OpenCode.


Puntos de Referencia

85.8% en el benchmark LoCoMo corregido (no adversarial, precisión de respuesta de extremo a extremo) — validado en 1,986 preguntas en 10 conversaciones con doble evaluación. Todas las cifras de esta sección provienen del artículo y de roampal-labs (ver citas al final de esta sección).

ResultadoPuntuación
Aprendizaje conversacional vs ingesta bruta+23 puntos (76.6% vs 53.0%, p<0.0001)
Efecto de arquitectura vs modeloLa arquitectura contribuye ~10x más
Resiliencia a envenenamiento (1,135 memorias adversariales)Solo -2.6 a -4.2 puntos
Recuperación TagCascade (primero etiquetas + reordenamiento CE)+1.9 Hit@1 vs CE puro (p<0.0001)

El pipeline de benchmark se ejecuta en una sola GPU sin dependencias en la nube. Roampal en sí se ejecuta en CPU — no se requiere GPU. Metodología completa, datos y scripts de evaluación: roampal-labs

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


Inicio Rápido

pip install roampal
roampal init

Detecta automáticamente las herramientas instaladas. Reinicia tu editor y comienza a chatear.

Apunta a una herramienta específica: roampal init --claude-code o roampal init --opencode

roampal init demo

Diferencias de Plataforma

El bucle principal es idéntico — ambas plataformas inyectan contexto, capturan intercambios y puntúan resultados. El mecanismo de entrega difiere:

Claude CodeOpenCode
Inyección de contextoHooks (stdout)Plugin (prompt del sistema)
Captura de intercambiosStop hookEvento session.idle del plugin
PuntuaciónLLM principal vía herramienta score_memoriesSidecar independiente (tu modelo elegido, deshabilitado por defecto hasta que se configure)
AutocuraciónLos hooks reinician automáticamente el servidor en caso de falloEl plugin reinicia automáticamente el servidor en caso de fallo

Claude Code solicita al LLM principal puntuar cada intercambio vía la herramienta score_memories. OpenCode nunca se autopuntúa — un sidecar independiente (una llamada API separada) revisa cada intercambio como tercero, eliminando el sesgo de autoevaluación. La herramienta score_memories no está registrada en OpenCode. La puntuación está deshabilitada por defecto hasta que la configures explícitamente vía roampal sidecar setup. Durante la configuración, Roampal detecta modelos locales (Ollama, LM Studio, etc.) y te permite elegir un modelo de puntuación. Los modelos gratuitos de Zen están disponibles como opción explícita de aceptación para usuarios sin modelo local o clave API — se enrutan a través del proxy de OpenCode que puede registrar datos. Un modelo barato o local funciona muy bien — la puntuación no necesita un modelo potente.

v0.6.0: Ciclo de vida del servidor + vinculación de perfil por directorio + red de seguridad de deduplicación. El monolito roampal/cli.py de 4,700 líneas ahora es un paquete roampal/cli/ dividido en módulos por dominio, protegido por instantáneas de salida doradas, invariantes de tabla de despacho y una suite de equivalencia byte-idéntica. Cambios visibles para el usuario además: enrutamiento de perfil por solicitud (los hooks/MCP/plugin siempre nombran su perfil; un nombre no registrado ahora falla explícitamente con un 404 "Créalo primero" en lugar de escribir silenciosamente en el almacén predeterminado); roampal profile switch ya no mata el servidor en ejecución (cada sesión recoge el nuevo perfil en su próximo intercambio); los servidores generados se ejecutan con aislamiento -E [-P] y un cwd neutral (un proyecto que contiene un directorio local roampal/ ya no puede ocultar la instalación — y las instalaciones de sitio de usuario, p. ej., Microsoft Store Python, funcionan de nuevo — un borrador anterior de este endurecimiento de generación usaba la bandera aislada -I, que también oculta el directorio de paquetes de sitio del usuario); status reporta un puerto colgado como detenido, no como error; los servidores compartidos se retiran solos después de 30 minutos inactivos (un roampal start en primer plano está exento); y roampal start --profile X sobrevive al reinicio por inactividad mediante un pin de lanzamiento persistido. Los nuevos roampal profile bind <name> / unbind fijan un directorio (y sus subdirectorios) a un perfil — "este proyecto siempre usa el perfil X" es un comando en lugar de editar manualmente el JSON de entorno. Una prueba de guardia de regresión de deduplicación (3 hechos distintos a través de la ruta real store_memory_bank, más vectores de modelo real grabados y un control negativo que recrea el régimen roto de v0.5.9 en ambas direcciones) hace que cualquier cambio futuro de incrustador o constante de distancia falle la suite al primer contacto en lugar de colapsar silenciosamente las escrituras. Corrección de privacidad (OpenCode): desde v0.3.7 el plugin de OpenCode enviaba texto de intercambio a Zen (opencode.ai) cuando no se elegía ningún modelo de puntuación — incluso después de "Omitir" y roampal sidecar disable — rompiendo la regla de v0.5.3 de "nada sale de tu máquina sin una elección explícita", que solo se había aplicado en el lado del servidor. v0.6.0 lo aplica en el plugin: Zen solo después de una aceptación explícita, y sin llamadas de puntuación hasta que se elija un modelo. Si usas OpenCode y nunca elegiste un modelo de puntuación, la puntuación ahora está desactivada hasta que ejecutes roampal sidecar setup (o --list para elegir sin el menú). Sin cambio de RAM — la huella de v0.5.9 y el estado del modelo se mantienen sin cambios.

v0.5.9: Corrección de huella de memoria + actualización de incrustador/reordenador + observabilidad de fallos — provocado por un fallo de MemoryError rastreado al arena de memoria de CPU de ONNX Runtime que nunca liberaba buffers de scratch por forma, agravado por archivos de modelo FP16 que se convertían a FP32 al cargar. Deshabilita el arena y la caché de patrón de memoria en ambos modelos, cambia el incrustador a su propia exportación INT8 medida (el mismo modelo mpnet — la actualización planificada a e5-base se retuvo para v0.6.0 después de que una puerta de precisión detectara una regresión en la guardia de casi-duplicados) y el cross-encoder a su propia exportación INT8, y comparte una sesión de cross-encoder entre todos los perfiles en lugar de una por perfil. La huella de proceso medida cae de ~2,355MB a ~484MB en aislamiento (~5x), y la búsqueda es más rápida tanto en las rutas de incrustación como de reordenamiento en lugar de intercambiar memoria por latencia. Una re-incrustación de fondo por colección migra automáticamente los vectores existentes al nuevo incrustador en el primer inicio — nunca bloquea al cliente MCP, nunca mezcla familias de modelos dentro de una colección. También añade registro basado en archivos, manejo de MemoryError/ExceptionGroup, un latido RSS y un endpoint /api/status para que el próximo incidente como este deje un rastro, y los estados degradados (incrustador caído, reordenador caído, migración en progreso) se muestran al usuario en lugar de devolver silenciosamente un resultado vacío.

v0.5.8: Lanzamiento de resiliencia a fallos — habilita SQLite WAL + durabilidad FULL en el catálogo ChromaDB para que las terminaciones bruscas (conflictos de puerto en Windows, muertes de procesos externos, pérdida de energía) ya no corrompan o vacíen la base de datos. Reescribe SessionManager.mark_scored() para realizar un reemplazo atómico de archivo temporal, garantizando que la transcripción JSONL sobreviva a un fallo a mitad de escritura. También incluye 16 nuevas pruebas automatizadas que cubren ambas correcciones, corrige la deuda de pruebas preexistente que dejaba la suite completa en rojo en Windows, y añade herramientas de desarrollo (pytest-timeout, pytest-forked, build, twine). No se requiere migración de datos; WAL se aplica en el próximo inicio del servidor.

v0.5.7: Recolección de basura al inicio para el _completion_state.json del hook MCP. El archivo acumulaba una entrada por cada conversation_id visto sin limpieza, impulsando amplificación de E/S en cada escritura y dejando banderas scored_this_turn=True atascadas que podían envenenar el respaldo de puntuación entre sesiones. El nuevo pase _cleanup_completion_state elimina entradas de más de 30 días o sin transcripción coincidente, aplica un límite máximo de 500 entradas y escribe atómicamente. El TTL de transcripción JSONL se aumentó de 7 a 30 días para mantenerse en sintonía con el TTL del archivo de estado. Se envía junto con Roampal Desktop v0.3.3.

v0.5.6: Lanzamiento de endurecimiento — cierra las brechas de cobertura restantes de la auditoría de verificación v0.5.5.x. Barrido fantasma después de la limpieza archivada, limpieza automática bajo presión de capacidad, observabilidad de deduplicación, permisos de eliminación endurecidos, pruebas de ciclo archivar-luego-añadir, alineación del prompt del sidecar con el benchmark, cola de puntuación asíncrona (reintento diferido por sesión), reescritura de calidad de definición de herramientas MCP (TDQS), autodetección de OpenCode Go en el asistente de configuración del sidecar y corrección de extracción de nombre de usuario.

v0.5.5.2: Hotfix — la instalación del plugin en Windows ahora verifica que la copia tuvo éxito (verificación de tamaño posterior a la copia + respaldo manual de lectura/escritura para interferencia de OneDrive/antivirus). También instala en %APPDATA%\opencode\plugins como respaldo ya que algunas aplicaciones Electron resuelven rutas de configuración de manera diferente en Windows. Corrige los casos restantes del problema #11 donde roampal init --force reportaba éxito pero el plugin estaba vacío o en el directorio incorrecto.

v0.5.5.1: Hotfix — OpenCode Desktop ahora cambia correctamente de perfil cuando cambias de proyecto en la interfaz (problema #10). El plugin lee el directory de la sesión activa vía client.session.get() en lugar de almacenar en caché el perfil en la carga del módulo, por lo que un plugin singleton en un espacio de trabajo multiproyecto sigue alcanzando el perfil correcto por mensaje. También: roampal init --force ahora sobrescribe el archivo del plugin de OpenCode (problema #11), con errores más claros cuando Desktop mantiene un bloqueo de archivo.

v0.5.5: Eliminación suave para memory_bank — la eliminación dura de ChromaDB no elimina realmente los vectores de HNSW, causando coincidencias fantasma de deduplicación que bloquean nuevas memorias después de la eliminación por GUI. Reemplazado con actualización de metadatos status=archived más filtro de estado en todas las rutas de consulta/deduplicación. También: mutex de puntuación → cola asíncrona (elimina solicitudes descartadas), corrección de contaminación de resumen del sidecar (delimitación con separadores).

v0.5.4: La vinculación de perfil ahora es por solicitud, no por proceso. Cada cliente (servidor MCP, plugin de OpenCode, hooks de Python para Claude Code / Cursor) envía un encabezado X-Roampal-Profile para que un solo servidor FastAPI pueda servir limpiamente múltiples perfiles simultáneamente. Corrige el problema #7 donde el ROAMPAL_PROFILE por proyecto de OpenCode Desktop en opencode.json se ignoraba porque el FastAPI singleton vinculaba el perfil una vez al inicio.

v0.5.3: La puntuación del sidecar ahora requiere configuración explícita (sin respaldo automático a Zen o localhost). Los modelos locales pequeños (qwen2.5:3b, etc.) que devuelven matrices JSON simples en lugar de respuestas con forma de OpenAI se manejan de manera transparente mediante tolerancia de forma en el lado del servidor.

Cómo Funciona

Cuando escribes un mensaje, Roampal inyecta automáticamente contexto relevante antes de que tu IA lo vea:

Tú escribes:

fix the auth bug

Tu IA ve:

═══ 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

Sin llamadas manuales. Sin cambios en el flujo de trabajo. Simplemente funciona.

El Bucle

  1. Tú escribes un mensaje
  2. Roampal inyecta contexto relevante automáticamente (hooks en Claude Code, plugin en OpenCode)
  3. La IA responde con plena conciencia de tu historial, preferencias y lo que funcionó antes
  4. El resultado se puntúa — el buen consejo se promueve, el mal consejo se degrada
  5. Repite — el sistema se vuelve más inteligente en cada intercambio

Cinco Colecciones de Memoria

| Colección | Propósito | Duración | |------------|---------|----------| | working | Contexto de la sesión actual | 24h — se promueve si es útil, se elimina en caso contrario | | history | Conversaciones pasadas | 30 días, con puntuación de resultados | | patterns | Soluciones probadas | Persistente mientras sea útil, promovido desde el historial | | memory_bank | Identidad, preferencias, objetivos | Permanente | | books | Documentos de referencia subidos | 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

Perfiles de Memoria Nombrados (v0.5.1)

Ejecuta almacenes de memoria separados para diferentes contextos — por proyecto, por cliente (Claude Code vs OpenCode), trabajo vs hogar. Los perfiles se gestionan completamente a través de la CLI; no hay archivos de configuración que 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

Registra un directorio existente como perfil (sin migración de datos):

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

Precedencia (la más alta gana; los niveles de entorno/configuración son por shell y por archivo de configuración, el enlace es una propiedad del directorio):

  1. Indicador --profile <name>
  2. Variable de entorno ROAMPAL_PROFILE=<name> (configurada por proyecto en opencode.json o .claude.json env: {})
  3. Enlace de directorio (v0.6.0) — roampal profile bind work fija el directorio actual (y todos los subdirectorios) al perfil work; la búsqueda sube desde tu directorio de trabajo actual y el directorio enlazado más cercano gana. Un comando por proyecto, pero no toda la configuración: cualquier variable de entorno ROAMPAL_PROFILE configurada para la configuración de ese proyecto aún gana sobre el enlace
  4. Valor predeterminado persistido roampal profile use <name>
  5. Respaldo "default"

Las sesiones siempre nombran el perfil al que resuelven — un encabezado explícito, el directorio de trabajo actual de un proyecto, o un valor predeterminado persistido — y el servidor compartido nunca adivina un perfil desde su propio directorio de trabajo o entorno.

Herramientas MCP

Tu IA obtiene estas herramientas de memoria:

HerramientaDescripciónPlataformas
search_memoryBúsqueda profunda en todas las coleccionesAmbas
add_to_memory_bankAlmacena hechos permanentes (identidad, preferencias, objetivos)Ambas
update_memoryCorrige o actualiza memorias existentesAmbas
delete_memoryElimina información desactualizadaAmbas
score_memoriesPuntúa resultados de intercambios anterioresClaude Code
record_responseAlmacena conclusiones clave de intercambios significativosAmbas

Cómo funciona la puntuación: Los hooks de Claude Code solicitan al LLM principal llamar a score_memories en cada turno. OpenCode usa un sidecar independiente que puntúa silenciosamente en segundo plano — el modelo nunca ve una solicitud de puntuación y score_memories no está registrado como herramienta. Si el sidecar no está disponible, una advertencia solicita al usuario ejecutar roampal sidecar setup. Elige tu modelo de puntuación durante roampal init o mediante roampal sidecar setup.

Cómo se Compara Roampal

CaracterísticaRoampal CoreClaude Code integrado (CLAUDE.md / memoria automática)OpenCode integrado
Aprende de resultadosSí — el mal consejo se degrada, el buen consejo se promueveNoNo
Recuperación semánticaSí — TagCascade + reordenamiento con cross-encoderNo — los archivos se cargan completos, sin búsquedaSin sistema de memoria
Inyección de contextoAutomática — memorias relevantes por consultaCLAUDE.md completo cada sesión, memoria automática bajo demandaNinguna
Extracción de hechos atómicosSí — resúmenes + hechos, recuperación de doble víaNo — guarda lo que Claude decide que es útilNo
Funciona entre proyectosSí — memoria compartida en todos los proyectosSolo por proyecto (por repositorio git)Sin memoria
Escala con el historialSí — 5 colecciones, promoción/degradación/decadenciaCLAUDE.md sin límite, memoria automática primeras 200 líneasSin memoria
Totalmente local / privadoSí — ChromaDB en tu máquinaSíSí
Arquitectura
┌─────────────────────────────────────────────────────────┐
│  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    │
└─────────────────────────────────────────────────────────┘

Consulta dev/docs/ para detalles técnicos completos.

Requisitos

  • Python 3.10+ (3.13 compatible; 3.11+ obtiene la protección completa de lanzamiento -P — en 3.10 la carpeta de lanzamiento neutral por sí sola protege contra un proyecto roampal/ que sombrea la instalación. Nota: Python 3.10 llega al final de su vida útil en octubre de 2026)
  • Uno de: Claude Code u OpenCode
  • Plataformas: Windows, macOS, Linux (macOS y Python 3.13 están probados en CI a partir de v0.6.0; desarrollado principalmente en Windows)
  • RAM: ~500MB disponibles (reordenador cross-encoder + embeddings + ChromaDB); la migración de primera ejecución después de una actualización no añade un pico significativo
  • Disco: ~500MB para modelos (embedding multilingüe + reordenador, descargados automáticamente en el primer uso)
  • CPU: Cualquier procesador x86-64 moderno con AVX2 (Intel Haswell 2013+ / AMD Excavator 2015+)
  • GPU: No requerida — toda la inferencia se ejecuta en CPU mediante ONNX Runtime

Solución de Problemas

¿Los hooks no funcionan? (Claude Code)
  • Reinicia Claude Code (los hooks se cargan al inicio)
  • Verifica el servidor HTTP: curl http://127.0.0.1:27182/api/health
¿MCP no se conecta? (Claude Code)
  • Verifica que ~/.claude.json tenga la entrada MCP roampal-core con la ruta correcta de Python
  • Revisa el panel de salida de Claude Code para errores de MCP
¿El contexto no aparece? (OpenCode)
  • Asegúrate de haber ejecutado roampal init --opencode
  • Verifica que el servidor se haya iniciado automáticamente: curl http://127.0.0.1:27182/api/health
  • Si no, inícialo manualmente: roampal start
¿El servidor se bloquea y se recupera?

Esto es esperado. Roampal tiene auto-reparación — si el servidor HTTP deja de responder, se reinicia automáticamente y se reintenta.

¿Aún atascado? Pide ayuda a tu IA — puede leer registros y depurar problemas de Roampal directamente.

Soporte

Roampal Core es completamente gratuito y de código abierto.

roampal-core MCP server

Licencia

Apache 2.0