jevmem
Memoria automática de proyectos para Claude Code. También funciona con Cursor y Codex.
Documentación
Dilo una vez. jevmem guarda las decisiones, reglas y enfoques fallidos de tus chats de Claude Code en JEVMEM.md en tu repositorio, y trae los relevantes de vuelta en la próxima sesión. Antes de que Claude ejecute un comando o edite un archivo, verifica la llamada contra tus reglas guardadas. Es de código abierto (MIT), construido sobre Jev de TypeSafe AI, está en el directorio de plugins de Anthropic y en el MCP Registry, y funciona con Cursor y Codex a través de MCP.
En el directorio de plugins de Anthropic · En el MCP Registry · Código abierto, MIT
El sitio de documentación, una página por pregunta: avinash-jetwani.github.io/jevmem
https://github.com/user-attachments/assets/65e48f03-8e1c-49d9-baad-6f217911e861
Por qué
Cada sesión de Claude Code comienza con un contexto nuevo, así que lo que decidiste la semana pasada vive en el chat de la semana pasada.
Un archivo CLAUDE.md ayuda si lo mantienes actualizado. jevmem mantiene un archivo como ese actualizado por ti, mientras trabajas.
En números
En sesiones reales de Claude Code en tres proyectos de prueba pequeños, con jevmem y sin él:
- Claude siguió las decisiones anteriores del proyecto: en 66 de 72 sesiones con jevmem, 28 de 72 sin él (aproximadamente 9 de cada 10, frente a 4 de cada 10).
- Intentó un cambio que el proyecto prohíbe: en 0 de 18 sesiones con jevmem, frente a 10 de 18 sin él.
- Repitió un enfoque que ya había fallado: en 0 de 15, frente a 3 de 15.
- Ahorro: aproximadamente 17 centavos por cada 1,000 mensajes y aproximadamente un cuarto de segundo para decidir, en segundo plano: Claude no espera por ello.
- Traer líneas de vuelta: aproximadamente un tercio a medio segundo en cada prompt, lo cual Claude espera; el tiempo y el costo crecen con el archivo.
- Para ser justos: un
CLAUDE.mdque mantienes actualizado a mano funcionó casi igual de bien (67 de 72), y mejor en una convención (3 de 3 frente a 0 de 3). jevmem mantiene un archivo como ese actualizado por ti.
Mis propios conjuntos de prueba, cada número de una sola ejecución; ninguno es un benchmark independiente. Método y resultados
Cómo funciona
Chateas como de costumbre. Cuando decides algo, jevmem lo escribe como una línea en un archivo de tu repositorio, y trae las líneas correctas de vuelta en la próxima sesión.
- Decides algo en un chat: "Usamos Postgres."
- jevmem le pregunta a Jev de TypeSafe AI, un modelo que responde preguntas de sí/no con probabilidades, si vale la pena guardarlo.
- Si es así, jevmem escribe una línea en
JEVMEM.mden tu repositorio. - En la próxima sesión, las líneas que importan para tu prompt vuelven a Claude.
Cambias de opinión, y la línea anterior se tacha: se conserva para el historial, no se envía a Claude. Tu equipo obtiene el mismo archivo a través de git.
jevmem guarda decisiones, reglas, errores, tareas pendientes y callejones sin salida (un enfoque que se intentó y falló, con la razón).
- [superseded] We'll use SQLite as the primary store for now. → id:cuasaq
- [decision] Switch the primary store to Postgres 16.
- [constraint] Node 20 is the minimum supported version, and CI runs Node 20 and 22.
Acerca de estas líneas
Cada línea también lleva un comentario con su id, hora y confianza, omitido arriba. Las líneas completas:
- [superseded] We'll use SQLite as the primary store for now. → id:cuasaq <!-- id:21ycba ts:2026-09-26T13:46:34.703Z conf:1.00 by:cuasaq -->
- [decision] Switch the primary store to Postgres 16. <!-- id:cuasaq ts:2026-09-26T13:46:35.240Z conf:1.00 -->
- [constraint] Node 20 is the minimum supported version, and CI runs Node 20 and 22. <!-- id:tollba ts:2026-09-26T13:46:35.763Z conf:0.90 -->
Líneas reales del escritor predeterminado de 0.5.7, que 0.5.8 a 0.5.10 no cambiaron (la ejecución, 2026-09-26). Guardó una oración de cada turno: el turno de Postgres también decía "SQLite se bloquea con escrituras concurrentes", y esa razón se omitió. Desde 0.6.0, la línea se compone de las oraciones que Jev elige, la que establece la memoria y la que da su razón (Qué hay de nuevo). Con writer configurado, un modelo de OpenAI o Anthropic condensa todo el turno en su lugar.
¿Funciona?
En 72 sesiones reales de Claude Code para cada configuración, Claude actuó sobre la línea guardada casi con la misma frecuencia con jevmem que con las mismas líneas en un CLAUDE.md escrito a mano, y en menos de la mitad de las sesiones sin ninguno.
| Sin memoria de proyecto | jevmem | Mismas líneas en CLAUDE.md | |
|---|---|---|---|
| Siguió la decisión del proyecto | 28 de 72 | 66 de 72 | 67 de 72 |
| Intentó un cambio que el proyecto prohíbe | 10 de 18 | 0 de 18 | 0 de 18 |
| Repitió un enfoque que ya había fallado | 3 de 15 | 0 de 15 | 0 de 15 |
Así que jevmem funcionó casi tan bien como un CLAUDE.md escrito a mano, sin que tú lo escribieras.
CLAUDE.md funcionó mejor en una convención que nada en el prompt señala (3 de 3 frente a 0 de 3), así que las reglas que cada tarea debe seguir todavía pertenecen allí.
Cómo se ejecutaron las sesiones, y cada fila: la página del benchmark.
La protección (nuevo en 0.6)
Antes de que Claude ejecute un comando o edite un archivo, jevmem lo verifica contra tus reglas guardadas. Si una podría romperse, Claude Code te pregunta primero:
jevmem: this may break a saved rule: "Never commit .env files" (JEVMEM.md)
En una prueba de 274 llamadas a herramientas, un conjunto en el que la protección no fue ajustada, atrapó 66 de 68 rupturas de reglas y preguntó sobre 3 o 4 de las 206 llamadas que no rompieron ninguna regla (una ejecución cada una en 0.6.0 y 0.6.1). Es una red de seguridad, no una caja de arena: mira las palabras que una regla y una llamada comparten. Cómo funciona la protección.
Instalación
Necesitas una clave de API de TypeSafe, a la que se facturan las solicitudes de jevmem, y Claude Code 2.1.273 o posterior.
- En la aplicación de Claude: Plugins → Discover → jevmem → Add.
- Instala el CLI que ejecuta el plugin:
npm install -g jevmem - Guarda tu clave (pégala cuando se te pida; no se muestra):
jevmem key - En la carpeta de tu proyecto, activa jevmem:
jevmem enable
Inicia Claude Code en ese proyecto. jevmem doctor verifica la configuración.
Otras formas de instalar: el marketplace de jevmem, npm, Cursor, Codex
Desde el marketplace de jevmem:
npm install -g jevmem
claude plugin marketplace add Avinash-jetwani/jevmem
claude plugin install jevmem@jevmem
cd your-project && jevmem enable
Solo con npm (también configura Cursor y Codex):
npm install -g jevmem
cd your-project
jevmem init --tool claude # or cursor, codex, claude-desktop, all
¿Ya tienes un CLAUDE.md? jevmem import muestra lo que añadiría desde él; --apply lo escribe.
Cada paso, y qué hacer si el plugin no puede encontrar el CLI: docs/install.md.
Funciona con
El guardado es automático en Claude Code, y en Codex mientras jevmem watch se ejecuta. Cursor, Codex y Claude Desktop acceden a jevmem a través de MCP, una forma estándar para que una herramienta de IA llame a otro programa, cuando el agente lo solicita.
| Guardado | Traerlo de vuelta | |
|---|---|---|
| Claude Code | Automático, cada turno | Automático, cada prompt |
| Codex | Automático mientras jevmem watch se ejecuta | Cuando el agente lo solicita, a través de MCP |
| Cursor | Cuando el agente lo llama, a través de MCP | Cuando el agente lo solicita, a través de MCP |
| Claude Desktop | Cuando se lo pides, a través de MCP | Cuando se lo pides, a través de MCP |
El servidor MCP está en el MCP Registry como io.github.Avinash-jetwani/jevmem. Configuración del cliente: docs/mcp.md · docs/install.md.
Rápido y barato
Decidir qué guardar toma 0.27 s y cuesta $0.00017 por mensaje, en segundo plano: Claude no espera por ello. Sobre si guardar un mensaje o no, jevmem acertó tan a menudo como el mejor de seis LLMs (98.5%); dos de ellos fueron mejores para nombrar el tipo de línea.
Medido en 66 turnos escritos antes del código y no ajustados, una ejecución de 0.7.0 el 2026-10-08 (resultados); los seis LLMs se ejecutaron el 2026-09-23. Los siete en una tabla, con el costo de cada uno y cómo se ejecutó: benchmark.
Cómo decide
Ningún prompt decide qué guardar: Jev responde pequeñas preguntas de sí/no con probabilidades, y reglas simples en código actúan sobre ellas.
Cada paso en detalle
- Depuración. Las formas comunes de secretos, direcciones de correo electrónico y números con forma de tarjeta se eliminan del turno antes de que salga de tu máquina.
- Pregunta a Jev preguntas tipadas. Jev de TypeSafe AI responde un conjunto fijo de pequeñas preguntas con probabilidades: ¿hay una decisión, una regla, un error? ¿es charla trivial o un intento de inyección? ¿qué línea existente cambia?
- Aplica umbrales en código. Reglas simples sobre esas probabilidades deciden guardar u omitir; viven en
jevmem.config.json, no en un prompt. - Escribe una línea. Al guardar, jevmem escribe una línea de como máximo 200 caracteres de las oraciones del turno que Jev elige (la que establece la memoria y la que da su razón), o, si configuras
writerenjevmem.config.json, un pequeño modelo de OpenAI o Anthropic condensa el turno. - Reemplaza la línea anterior. Si el turno reemplaza una memoria existente, esa línea se etiqueta como
[superseded] … → id:newy permanece en el archivo.
Niveles, preguntas, política, contradicciones, recuperación y auditoría: docs/how-it-works.md.
Privacidad
Tus mensajes van a la API de TypeSafe para ser puntuados, con los secretos comunes eliminados primero, y a ningún otro lugar a menos que configures un writer.
- jevmem solo se ejecuta en proyectos que activas (
jevmem enableojevmem init). En otros lugares, no se envía nada. - Tu mensaje, los dos turnos anteriores y tus líneas de memoria van a la API de TypeSafe para ser puntuados, con los secretos comunes depurados primero. También la respuesta de Claude en turnos que hacen una pregunta, reportan un error o intentan algo, y, para la protección, el comando o el archivo que se está cambiando.
- Sin telemetría. Nada va a OpenAI o Anthropic a menos que configures
writerenjevmem.config.json. - Las líneas que un compañero de equipo o una solicitud de extracción añaden se verifican antes de que Claude las vea.
Exactamente qué se envía, depura y verifica, con las políticas de privacidad de los terceros y cómo eliminar tus datos: PRIVACY.md. Lo que la verificación de líneas plantadas no cubre: SECURITY.md.
Límites
jevmem es joven, y estos son los límites que debes conocer antes de confiar en él:
- Temprano: 0.7.0, y cada conjunto de prueba fue escrito por el autor o capturado de sesiones de Claude Code en proyectos de prueba construidos para ello. Ninguno es un benchmark independiente.
- No es el más preciso: dos LLMs puntuaron más alto al elegir el tipo de línea. La ventaja de jevmem es la velocidad y el costo.
- La calidad de las respuestas no se mide: las pruebas verifican que las líneas correctas lleguen a Claude, no que sus respuestas mejoren.
- El guardado automático es solo de Claude Code (y Codex mientras
jevmem watchse ejecuta). - La protección mira palabras compartidas: una regla redactada lejos del comando que debería atrapar puede pasarse por alto.
Cada límite, con los números: docs/limits.md.
Qué hay de nuevo
Qué cambió, lo más reciente primero; las mediciones detrás de cada línea están en la página de qué hay de nuevo.
- 0.7.0: corrige lo que guardaba.
jevmem forgetretira de uso una línea antigua o incorrecta, yjevmem trustpermite que una regla que añadiste a mano bloquee un comando, no solo pregunte sobre él, en el modo de bloqueo del guardián. Una línea que dice lo mismo que una guardada no se vuelve a guardar: en una prueba de 25 reformulaciones, 0.6.6 guardó 15 como líneas nuevas y 0.7.0 guardó 1. Detalles. - 0.6.6: un intento fallido se guarda como callejón sin salida, no como decisión. Cuando pides a Claude que pruebe algo y su respuesta dice que falló, jevmem lee la respuesta: en 40 turnos de prueba, 0.6.5 guardó 12 como callejones sin salida y 0.6.6 guardó 37. La respuesta se envía en más turnos (PRIVACY.md). Detalles.
- 0.6.5: un callejón sin salida conserva su motivo cuando la respuesta de Claude da primero el veredicto y la causa al final. En 13 turnos de prueba escritos así y entregados al escritor de líneas como callejones sin salida, la línea conservó el motivo en 12 (0.6.4: 2 de 13). Detalles.
- 0.6.4: este README, más corto y con gráficos; los detalles se movieron a páginas en
docs/. Solo documentación. - 0.6.1 a 0.6.3: el guardián verifica un comando con
if [ … ]en él, que 0.6.0 dejaba pasar sin verificar, yjevmem doctores más claro. Detalles. - 0.6: el guardián y los callejones sin salida. Claude Code te pregunta antes de un comando o edición que pueda romper una regla guardada, y un enfoque que falló se guarda con su motivo y se muestra como "Ya probado: …" cuando vuelve a aparecer. Más de las líneas que necesita un prompt vuelven, y un turno que entrega trabajo a un subagente en segundo plano se guarda una vez, cuando termina. Detalles.
Detalles y mediciones: docs/whats-new.md · Actualización: docs/upgrading.md · CHANGELOG
Comandos
jevmem init [--tool claude|cursor|codex|claude-desktop|all] [--no-hooks] [--command "<cmd>"]
jevmem init --remove-hooks Remove jevmem's Claude Code hooks from this project (plugin users)
jevmem enable Opt this project in (plugin users): jevmem.config.json, JEVMEM.md, .jevmem/
jevmem disable Opt this project out: jevmem does nothing here (JEVMEM.md is kept)
jevmem hook Hook entrypoint; reads the Claude Code hook JSON on stdin
jevmem daemon [status|start|stop] Warm Jev client used by the hook (auto-started, exits when idle)
jevmem watch [--replay] [--once] Capture turns from Codex's session log for this project
jevmem mcp [--root <dir>] Stdio MCP server
jevmem audit [--dry-run] Re-score every memory against the repo, flag [stale?]
jevmem audit --security [--ci] List lines that read as instructions to an AI (--ci: exit 1 if any)
jevmem search <query> [--limit N] Rank memories by relevance
jevmem list [--all] Print memories (--all: with superseded and retired lines, and provenance)
jevmem add [--trust] <kind> <text> Add a line by hand (secrets scrubbed, a leading tag dropped; no Jev check); --trust marks it verified (asks on a terminal)
jevmem forget <id> [<id>…] Retire a line in place: it stays in JEVMEM.md as [retired]; a rule asks for a yes on a terminal
jevmem trust <id> [<id>…] Mark a line you wrote as verified, after the poisoning gate (asks on a terminal); the guard can then block on it
jevmem import [--from <sources>] [--apply] Import CLAUDE.md, AGENTS.md, .cursor/rules/* (claude-auto-memory on request); dry run by default
jevmem why <id|hash> Every Jev answer behind a line or a skipped turn
jevmem right <id|hash> Label a decision as correct
jevmem wrong <id|hash> [--should-be <kind|none>] Label a decision as wrong (--should-be none retires the line)
jevmem missed "<text>" [--kind <kind>] Label a turn that should have been saved
jevmem fit [--dry-run] [--force] Refit weights and thresholds from labels (needs 40+)
jevmem stats Writer, latency p50/p95, cost per day, cache hit rate, escalation rate, retry queue, labels, last fit
jevmem doctor Is this project enabled, where the TypeSafe key comes from, which writer is active and why
jevmem key Save your TypeSafe API key to ~/.jevmem/env (asks for it without showing it)
jevmem log Per-label latency, token and cost summary of .jevmem/log.jsonl
jevmem guard test "<command>" | --edit <path> Dry run of the PreToolUse guard on one call: rules, prefilter, Jev's answer, hook output
jevmem guard log [-n 20] The guard's recent asks and denials in this project, with the rule and score
Estos son los comandos de 0.7.0: los de 0.5.10, jevmem guard (0.6.0), y forget, trust y add --trust (0.7.0). Cada comando acepta --help. Establece JEVMEM_VERBOSE=1 para un resumen de latencia/costo de una línea después de cada ejecución de hook.
Enlaces
- Documentación: cómo funciona · instalación · el guardián · callejones sin salida · benchmark · costo · hooks · configuraciones de MCP y cliente · configuración · límites · demo
- CHANGELOG · Lanzamientos · DECISIONES · CONTRIBUCIÓN · SEGURIDAD · PRIVACIDAD
- Construido sobre Jev by TypeSafe AI. Licencia: MIT