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
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).
| Resultado | Puntuación |
|---|---|
| Aprendizaje conversacional vs ingesta bruta | +23 puntos (76.6% vs 53.0%, p<0.0001) |
| Efecto de arquitectura vs modelo | La 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-codeoroampal init --opencode
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 Code | OpenCode | |
|---|---|---|
| Inyección de contexto | Hooks (stdout) | Plugin (prompt del sistema) |
| Captura de intercambios | Stop hook | Evento session.idle del plugin |
| Puntuación | LLM principal vía herramienta score_memories | Sidecar independiente (tu modelo elegido, deshabilitado por defecto hasta que se configure) |
| Autocuración | Los hooks reinician automáticamente el servidor en caso de fallo | El 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.pyde 4,700 líneas ahora es un paqueteroampal/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 switchya 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 localroampal/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);statusreporta un puerto colgado como detenido, no como error; los servidores compartidos se retiran solos después de 30 minutos inactivos (unroampal starten primer plano está exento); yroampal start --profile Xsobrevive al reinicio por inactividad mediante un pin de lanzamiento persistido. Los nuevosroampal profile bind <name>/unbindfijan 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 realstore_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" yroampal 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 ejecutesroampal sidecar setup(o--listpara 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
MemoryErrorrastreado 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/statuspara 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.jsondel hook MCP. El archivo acumulaba una entrada por cadaconversation_idvisto sin limpieza, impulsando amplificación de E/S en cada escritura y dejando banderasscored_this_turn=Trueatascadas que podían envenenar el respaldo de puntuación entre sesiones. El nuevo pase_cleanup_completion_stateelimina 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\pluginscomo respaldo ya que algunas aplicaciones Electron resuelven rutas de configuración de manera diferente en Windows. Corrige los casos restantes del problema #11 donderoampal init --forcereportaba é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
directoryde la sesión activa víaclient.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 --forceahora 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=archivedmá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-Profilepara que un solo servidor FastAPI pueda servir limpiamente múltiples perfiles simultáneamente. Corrige el problema #7 donde elROAMPAL_PROFILEpor proyecto de OpenCode Desktop enopencode.jsonse 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
- Tú escribes un mensaje
- Roampal inyecta contexto relevante automáticamente (hooks en Claude Code, plugin en OpenCode)
- La IA responde con plena conciencia de tu historial, preferencias y lo que funcionó antes
- El resultado se puntúa — el buen consejo se promueve, el mal consejo se degrada
- 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):
- Indicador
--profile <name> - Variable de entorno
ROAMPAL_PROFILE=<name>(configurada por proyecto enopencode.jsono.claude.jsonenv: {}) - Enlace de directorio (v0.6.0) —
roampal profile bind workfija el directorio actual (y todos los subdirectorios) al perfilwork; 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 entornoROAMPAL_PROFILEconfigurada para la configuración de ese proyecto aún gana sobre el enlace - Valor predeterminado persistido
roampal profile use <name> - 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:
| Herramienta | Descripción | Plataformas |
|---|---|---|
search_memory | Búsqueda profunda en todas las colecciones | Ambas |
add_to_memory_bank | Almacena hechos permanentes (identidad, preferencias, objetivos) | Ambas |
update_memory | Corrige o actualiza memorias existentes | Ambas |
delete_memory | Elimina información desactualizada | Ambas |
score_memories | Puntúa resultados de intercambios anteriores | Claude Code |
record_response | Almacena conclusiones clave de intercambios significativos | Ambas |
Cómo funciona la puntuación: Los hooks de Claude Code solicitan al LLM principal llamar a
score_memoriesen cada turno. OpenCode usa un sidecar independiente que puntúa silenciosamente en segundo plano — el modelo nunca ve una solicitud de puntuación yscore_memoriesno está registrado como herramienta. Si el sidecar no está disponible, una advertencia solicita al usuario ejecutarroampal sidecar setup. Elige tu modelo de puntuación duranteroampal inito medianteroampal sidecar setup.
Cómo se Compara Roampal
| Característica | Roampal Core | Claude Code integrado (CLAUDE.md / memoria automática) | OpenCode integrado |
|---|---|---|---|
| Aprende de resultados | Sí — el mal consejo se degrada, el buen consejo se promueve | No | No |
| Recuperación semántica | Sí — TagCascade + reordenamiento con cross-encoder | No — los archivos se cargan completos, sin búsqueda | Sin sistema de memoria |
| Inyección de contexto | Automática — memorias relevantes por consulta | CLAUDE.md completo cada sesión, memoria automática bajo demanda | Ninguna |
| Extracción de hechos atómicos | Sí — resúmenes + hechos, recuperación de doble vía | No — guarda lo que Claude decide que es útil | No |
| Funciona entre proyectos | Sí — memoria compartida en todos los proyectos | Solo por proyecto (por repositorio git) | Sin memoria |
| Escala con el historial | Sí — 5 colecciones, promoción/degradación/decadencia | CLAUDE.md sin límite, memoria automática primeras 200 líneas | Sin memoria |
| Totalmente local / privado | Sí — ChromaDB en tu máquina | Sí | 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 proyectoroampal/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.jsontenga la entrada MCProampal-corecon 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.
- Apoya el desarrollo: roampal.gumroad.com
- Ideas de funciones y comentarios: Discord
- Informes de errores: GitHub Issues
- ¿Necesitas ayuda con memoria de IA? Contacta: roampal@protonmail.com | LinkedIn