jevmem

Memória automática de projetos para o Claude Code. Também funciona com Cursor e Codex.

Documentação

jevmem

Diga uma vez. jevmem salva as decisões, regras e abordagens que falharam dos seus chats do Claude Code em JEVMEM.md no seu repositório, e traz as relevantes de volta na próxima sessão. Antes de o Claude executar um comando ou editar um arquivo, ele verifica a chamada contra suas regras salvas. É open source (MIT), construído sobre o Jev da TypeSafe AI, no diretório de plugins do Claude da Anthropic e no MCP Registry, e funciona com Cursor e Codex via MCP.

No diretório de plugins do Claude da Anthropic · No MCP Registry · Open source, MIT

O site da documentação, uma página por pergunta: avinash-jetwani.github.io/jevmem

npm version license node CI M8ven Verified

https://github.com/user-attachments/assets/65e48f03-8e1c-49d9-baad-6f217911e861

Por quê

Cada sessão do Claude Code começa com um contexto novo, então o que você decidiu na semana passada vive no chat da semana passada. Um arquivo CLAUDE.md ajuda se você o mantiver atualizado. jevmem mantém um arquivo como esse atualizado para você, enquanto você trabalha.

Em números

Em sessões reais do Claude Code em três pequenos projetos de teste, com jevmem e sem ele:

  • O Claude seguiu as decisões anteriores do projeto: em 66 de 72 sessões com jevmem, 28 de 72 sem (cerca de 9 em 10, contra 4 em 10).
  • Tentou uma mudança que o projeto proíbe: em 0 de 18 sessões com jevmem, contra 10 de 18 sem.
  • Repetiu uma abordagem que já havia falhado: em 0 de 15, contra 3 de 15.
  • Economia: cerca de 17 centavos por 1.000 mensagens e cerca de um quarto de segundo para decidir, em segundo plano: o Claude não espera por isso.
  • Trazendo linhas de volta: cerca de um terço a meio segundo em cada prompt, o que o Claude espera; o tempo e o custo crescem com o arquivo.
  • Para ser justo: um CLAUDE.md que você mantém atualizado manualmente teve desempenho semelhante (67 de 72), e melhor em uma convenção (3 de 3 contra 0 de 3). jevmem mantém um arquivo como esse atualizado para você.

Meus próprios conjuntos de teste, cada número de uma execução; nenhum é um benchmark independente. Método e resultados

Como funciona

Você conversa normalmente. Quando você decide algo, jevmem escreve como uma linha em um arquivo no seu repositório, e traz as linhas certas de volta na próxima sessão.

You say it, Jev decides, jevmem writes one line to JEVMEM.md, and next session Claude gets the lines that matter.

  1. Você decide algo em um chat: "Usamos Postgres."
  2. jevmem pergunta ao Jev by TypeSafe AI, um modelo que responde perguntas de sim/não com probabilidades, se vale a pena manter.
  3. Se valer, jevmem escreve uma linha em JEVMEM.md no seu repositório.
  4. Na próxima sessão, as linhas que importam para o seu prompt voltam para o Claude.

Mude de ideia, e a linha antiga é riscada: mantida para histórico, não enviada ao Claude. Sua equipe recebe o mesmo arquivo via git.

jevmem mantém decisões, regras, bugs, tarefas e becos sem saída (uma abordagem que foi tentada e falhou, com o motivo).

- [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.
Sobre essas linhas

Cada linha também carrega um comentário com seu id, hora e confiança, omitidos acima. As linhas 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 -->

Linhas reais do writer padrão da versão 0.5.7, que as versões 0.5.8 a 0.5.10 não alteraram (a execução, 2026-09-26). Ele manteve uma frase de cada turno: o turno do Postgres também dizia "SQLite trava sob escritas concorrentes", e esse motivo foi omitido. Desde a versão 0.6.0, a linha é feita a partir das frases que o Jev escolhe, a que declara a memória e a que dá o motivo (O que há de novo). Com writer definido, um modelo OpenAI ou Anthropic condensa o turno inteiro.

Funciona?

Em 72 sessões reais do Claude Code para cada configuração, o Claude agiu sobre a linha salva quase tão frequentemente com jevmem quanto com as mesmas linhas em um CLAUDE.md escrito à mão, e em menos da metade das sessões sem nenhum dos dois.

A/B results: followed the project's decision 28 of 72 with no project memory, 66 of 72 with jevmem, 67 of 72 with a hand-written CLAUDE.md.

Sem memória do projetojevmemMesmas linhas em CLAUDE.md
Seguiu a decisão do projeto28 de 7266 de 7267 de 72
Tentou uma mudança que o projeto proíbe10 de 180 de 180 de 18
Repetiu uma abordagem que já havia falhado3 de 150 de 150 de 15

Então jevmem teve desempenho semelhante a um CLAUDE.md escrito à mão, sem você escrevê-lo. CLAUDE.md foi melhor em uma convenção que nada no prompt aponta (3 de 3 contra 0 de 3), então regras que toda tarefa deve seguir ainda pertencem lá. Como as sessões foram executadas, e cada linha: a página do benchmark.

A proteção (novo na versão 0.6)

The guard: Claude wants to run a command, jevmem checks it against your saved rules, and Claude Code asks you first.

Antes de o Claude executar um comando ou editar um arquivo, jevmem verifica contra suas regras salvas. Se uma puder ser quebrada, o Claude Code pergunta primeiro:

jevmem: this may break a saved rule: "Never commit .env files" (JEVMEM.md)

Em um teste de 274 chamadas de ferramenta, um conjunto no qual a proteção não foi ajustada, ela pegou 66 de 68 quebras de regra e perguntou sobre cerca de 3 ou 4 das 206 chamadas que não quebraram nenhuma regra (uma execução cada nas versões 0.6.0 e 0.6.1). É uma rede de segurança, não uma sandbox: ela olha as palavras que uma regra e uma chamada compartilham. Como a proteção funciona.

Instalação

Você precisa de uma chave de API da TypeSafe, à qual as solicitações do jevmem são cobradas, e Claude Code 2.1.273 ou posterior.

  1. No aplicativo Claude: Plugins → Descobrir → jevmem → Adicionar.
  2. Instale a CLI que o plugin executa:
    npm install -g jevmem
    
  3. Salve sua chave (cole quando solicitado; ela não é exibida):
    jevmem key
    
  4. Na pasta do seu projeto, ative o jevmem:
    jevmem enable
    

Inicie o Claude Code nesse projeto. jevmem doctor verifica a configuração.

Outras formas de instalar: o marketplace do jevmem, npm, Cursor, Codex

Do marketplace do jevmem:

npm install -g jevmem
claude plugin marketplace add Avinash-jetwani/jevmem
claude plugin install jevmem@jevmem
cd your-project && jevmem enable

Apenas com npm (também configura Cursor e Codex):

npm install -g jevmem
cd your-project
jevmem init --tool claude    # or cursor, codex, claude-desktop, all

Já tem um CLAUDE.md? jevmem import mostra o que ele adicionaria a partir dele; --apply escreve.

Cada etapa, e o que fazer se o plugin não encontrar a CLI: docs/install.md.

Funciona com

Salvar é automático no Claude Code, e no Codex enquanto jevmem watch estiver em execução. Cursor, Codex e Claude Desktop alcançam o jevmem via MCP, uma forma padrão de uma ferramenta de IA chamar outro programa, quando o agente solicita.

SalvarTrazer de volta
Claude CodeAutomático, a cada turnoAutomático, a cada prompt
CodexAutomático enquanto jevmem watch estiver em execuçãoQuando o agente solicita, via MCP
CursorQuando o agente chama, via MCPQuando o agente solicita, via MCP
Claude DesktopQuando você pede, via MCPQuando você pede, via MCP

O servidor MCP está no MCP Registry como io.github.Avinash-jetwani/jevmem. Configuração do cliente: docs/mcp.md · docs/install.md.

Rápido e barato

Median time to decide one message on 66 held-out turns: jevmem 0.28 s, six current LLMs 2.78 to 4.29 s.

Decidir o que salvar leva 0,27 s e custa $0,00017 por mensagem, em segundo plano: o Claude não espera por isso. Sobre salvar ou não uma mensagem, jevmem acertou tão frequentemente quanto o melhor de seis LLMs (98,5%); dois deles foram melhores em nomear o tipo de linha.

Medido em 66 turnos escritos antes do código e não ajustados, uma execução da versão 0.7.0 em 2026-10-08 (resultados); os seis LLMs executaram em 2026-09-23. Todos os sete em uma tabela, com o custo de cada um e como foi executado: benchmark.

Como decide

How jevmem decides: scrub secrets, ask Jev typed questions, apply thresholds in code, write one line, supersede the old line.

Nenhum prompt decide o que salvar: o Jev responde pequenas perguntas de sim/não com probabilidades, e regras simples em código agem sobre elas.

Cada etapa em detalhe
  1. Limpeza. Formas comuns de segredos, endereços de e-mail e números em formato de cartão são removidos do turno antes de sair da sua máquina.
  2. Pergunte ao Jev perguntas tipadas. Jev by TypeSafe AI responde um conjunto fixo de pequenas perguntas com probabilidades: há uma decisão, uma regra, um bug? é conversa fiada ou uma tentativa de injeção? qual linha existente ele altera?
  3. Aplique limites em código. Regras simples sobre essas probabilidades decidem salvar ou pular; elas vivem em jevmem.config.json, não em um prompt.
  4. Escreva uma linha. Ao salvar, jevmem escreve uma linha de no máximo 200 caracteres a partir das frases do turno que o Jev escolhe (a que declara a memória e a que dá o motivo), ou, se você definir writer em jevmem.config.json, um pequeno modelo OpenAI ou Anthropic condensa o turno.
  5. Substitua a linha antiga. Se o turno substitui uma memória existente, essa linha é marcada como [superseded] … → id:new e permanece no arquivo.

Níveis, perguntas, política, contradições, recall e auditoria: docs/how-it-works.md.

Privacidade

Suas mensagens vão para a API da TypeSafe para serem pontuadas, com segredos comuns removidos primeiro, e para nenhum outro lugar, a menos que você defina um writer.

  • jevmem só executa em projetos que você ativa (jevmem enable ou jevmem init). Em outros lugares, nada é enviado.
  • Sua mensagem, os dois turnos anteriores e suas linhas de memória vão para a API da TypeSafe para serem pontuados, com segredos comuns limpos primeiro. O mesmo vale para a resposta do Claude em turnos que fazem uma pergunta, relatam um bug ou tentam algo, e, para a proteção, o comando ou o arquivo sendo alterado.
  • Sem telemetria. Nada vai para OpenAI ou Anthropic, a menos que você defina writer em jevmem.config.json.
  • Linhas que um colega ou uma pull request adiciona são verificadas antes de o Claude vê-las.

Exatamente o que é enviado, limpo e verificado, com as políticas de privacidade dos terceiros e como excluir seus dados: PRIVACY.md. O que a verificação de linhas plantadas não cobre: SECURITY.md.

Limitações

jevmem é jovem, e estas são as limitações a conhecer antes de confiar nele:

  • Início: 0.7.0, e cada conjunto de teste foi escrito pelo autor ou capturado de sessões do Claude Code em projetos de teste criados para isso. Nenhum é um benchmark independente.
  • Não é o mais preciso: dois LLMs pontuaram mais alto em escolher o tipo de linha. A vantagem do jevmem é velocidade e custo.
  • Qualidade das respostas não é medida: os testes verificam se as linhas certas chegam ao Claude, não se as respostas dele melhoram.
  • Salvar automático é apenas no Claude Code (e no Codex enquanto jevmem watch estiver em execução).
  • A proteção olha palavras compartilhadas: uma regra redigida longe do comando que deveria pegar pode ser perdida.

Cada limitação, com os números: docs/limits.md.

O que há de novo

O que mudou, do mais recente para o mais antigo; as medições por trás de cada linha estão na página de novidades.

  • 0.7.0: corrige o que salvou. jevmem forget tira de uso uma linha antiga ou errada, e jevmem trust permite que uma regra adicionada manualmente bloqueie um comando, não apenas pergunte sobre ele, no modo de bloqueio do guard. Uma linha que diz o mesmo que uma já salva não é salva novamente: em um teste de 25 reformulações, 0.6.6 salvou 15 como linhas novas e 0.7.0 salvou 1. Detalhes.
  • 0.6.6: uma tentativa falha é salva como beco sem saída, não como decisão. Quando você pede ao Claude para tentar algo e a resposta dele diz que falhou, o jevmem lê a resposta: em 40 turnos de teste, 0.6.5 salvou 12 como becos sem saída e 0.6.6 salvou 37. A resposta é enviada em mais turnos (PRIVACY.md). Detalhes.
  • 0.6.5: um beco sem saída mantém seu motivo quando a resposta do Claude dá o veredito primeiro e a causa por último. Em 13 turnos de teste escritos dessa forma e entregues ao gravador de linhas como becos sem saída, a linha manteve o motivo em 12 (0.6.4: 2 de 13). Detalhes.
  • 0.6.4: este README, mais curto e com gráficos; os detalhes foram movidos para páginas em docs/. Apenas documentação.
  • 0.6.1 a 0.6.3: o guard verifica um comando com if [ … ] nele, que 0.6.0 deixava passar sem verificação, e jevmem doctor está mais claro. Detalhes.
  • 0.6: o guard e becos sem saída. O Claude Code pergunta antes de um comando ou edição que possa quebrar uma regra salva, e uma abordagem que falhou é salva com seu motivo e exibida como "Já tentado: …" quando aparece novamente. Mais das linhas que um prompt precisa voltam, e um turno que entrega trabalho a um subagente em segundo plano é salvo uma vez, quando termina. Detalhes.

Detalhes e medições: docs/whats-new.md · Atualização: 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

Estes são os comandos da 0.7.0: os da 0.5.10, jevmem guard (0.6.0), e forget, trust e add --trust (0.7.0). Todo comando aceita --help. Defina JEVMEM_VERBOSE=1 para um resumo de latência/custo de uma linha após cada execução de hook.

Links