Engram
Previne regressão fornecendo dados de Blast Radius para IA com base no seu histórico do git
Documentação
Engram
O Motor de "Contexto Ausente" para Agentes de IA.
Engram dá ao seu agente de IA o contexto que ele não consegue ver apenas no código.
Embora os LLMs sejam excelentes em analisar os arquivos específicos que você fornece, eles não têm o contexto mais amplo do histórico e das diretrizes do seu repositório. Engram preenche essa lacuna ao revelar dependências ocultas (via histórico do git) e comportamentos exigidos (via intenções de teste) que a IA não teria acesso, perderia ou ignoraria.
Por que Engram?
- Histórico Temporal: Responde "O que geralmente muda quando este arquivo muda?" para evitar o ciclo de "consertar uma coisa, quebrar outra".
- Intenção de Teste: Extrai strings de intenção de teste (ex.: "should handle negative balance") para que a IA entenda qual comportamento preservar.
- Memória Organizacional: Um armazenamento persistente para você ou o LLM registrar restrições arquiteturais não documentadas, garantindo que as lições aprendidas não se percam ao iniciar uma nova conversa.
Feito para Privacidade. Público para Integridade.
- Local-Primeiro: Todo o processamento acontece no seu hardware local.
- Zero Telemetria: Não rastreamos seu uso, seu código ou sua identidade.
- Audite você mesmo: O código-fonte está disponível abaixo.
Exemplo do Mundo Real: O Bug que os Testes Não Conseguem Pegar
Um serviço TypeScript (TransactionExportService) escreve linhas delimitadas por pipe como TXN-001|2024-11-15|250.00|COMPLETED.
Um cron job JavaScript legado (legacy-mainframe-sync.js) os analisa usando índices de array codificados - parts[2] para o valor, parts[3] para o status.
Não há imports entre eles. Sem tipos compartilhados. Nada no código os conecta.
A tarefa: "Adicione um campo currency ao lado do valor."
Sem Engram
O agente de IA atualiza o serviço TypeScript e os testes. O formato de exportação se torna ID|DATE|AMOUNT|CURRENCY|STATUS. Todos os testes passam. O PR é enviado.
O problema: O script legado ainda lê parts[3] esperando um status como COMPLETED - mas agora recebe USD. parseFloat("USD") retorna NaN. O mainframe recebe dados corrompidos. Nada falhou. Nada alertou. Quebra silenciosa em produção.
Com Engram
Antes de escrever qualquer código, o agente chama get_impact_analysis. Engram verifica o histórico do git e retorna:
Risco Crítico (0.99):
bin/legacy-mainframe-sync.js— Alterados juntos em 21 de 21 commits (100%)
O agente lê o arquivo sinalizado, encontra o parser posicional e atualiza ambos os arquivos juntos. Mesma funcionalidade, zero quebras.
Após a correção, o agente chama save_project_note:
"O formato da linha de exportação é consumido por bin/legacy-mainframe-sync.js usando índices posicionais codificados. Qualquer alteração na ordem dos campos DEVE ser espelhada lá. Formato atual: ID|DATE|AMOUNT|CURRENCY|STATUS (índices 0-4)."
Agora todo agente futuro recebe esse aviso automaticamente - antes de escrever uma única linha de código.
O Que Ele Faz
1. Grafo Temporal
- O quê: Minera o histórico do git para encontrar arquivos que são frequentemente commitados junto com o seu arquivo alvo.
- Por quê: Para revelar dependências ocultas. Se
A.tseB.tsmudaram juntos 40 vezes no último ano, sua IA precisa saber sobreB.tsantes de editarA.ts.
2. Grafo de Validação
- O quê: Localiza automaticamente testes relevantes e extrai suas strings de intenção específicas (ex.:
it("should validate JWT expiration")). - Por quê: Para fornecer diretrizes comportamentais. A IA pode verificar seu plano contra seus requisitos de teste existentes sem precisar ler toda a suíte de testes.
- Frameworks Suportados:
- JS/TS: Vitest, Jest, Mocha, Playwright, Cypress (
it,test,describe) - JVM (Java/Kotlin/Scala): JUnit 4, JUnit 5 (@DisplayName), Kotest, ScalaTest
- Rust: Nativo
#[test] - Python: Pytest, Unittest (
def test_...) - Go: Nativo
func Test...
- JS/TS: Vitest, Jest, Mocha, Playwright, Cypress (
3. Grafo de Conhecimento
- O quê: Um armazenamento persistente onde o LLM pode salvar/recuperar "memórias" sobre decisões arquiteturais, casos extremos ou peculiaridades do projeto.
- Por quê: Para preencher a lacuna entre sessões. Se a IA aprender que "Auth requer reinicialização ao alterar a configuração", ela salva essa nota para que o próximo agente de IA também saiba.
Chamadas de Ferramentas
1. get_impact_analysis - Cálculo do raio de impacto para um arquivo alvo
Para um determinado arquivo, retorna os arquivos impactados, suas intenções de teste e quaisquer notas armazenadas.
Exemplo:
{
"file_path": "src/Auth.ts",
"repo_root": "/path/to/repo"
}
Retorna:
{
"summary": "Changing src/Auth.ts may affect 2 files. 1 critical risk, 1 medium risk.\n\n⚠️ Critical Risk (0.89): src/Session.ts\n Changed together in 48 of 50 commits (96%)\n Notes: Session requires Redis connection\n\n⚠ High Risk (0.72): src/Auth.test.ts\n Changed together in 31 of 50 commits (62%)\n Current test behaviour (may need updating):\n - should login with valid credentials\n - should reject invalid password\n - should handle OAuth callback",
"formatted_files": [
{
"path": "src/Session.ts",
"risk_level": "Critical",
"risk_score": 0.89,
"description": "Changed together in 48 of 50 commits (96%)",
"memories": ["Session requires Redis connection"]
},
{
"path": "src/Auth.test.ts",
"risk_level": "High",
"risk_score": 0.72,
"description": "Changed together in 31 of 50 commits (62%)",
"test_intents": [
"should login with valid credentials",
"should reject invalid password",
"should handle OAuth callback"
]
}
],
"coupled_files": [...],
"commit_count": 50
}
2. save_project_note - Lembrar contexto sobre arquivos
Armazena notas persistentes que aparecem automaticamente em futuras análises de impacto.
Exemplo:
{
"file_path": "src/Auth.ts",
"note": "Uses JWT tokens, must validate expiry timestamp",
"repo_root": "/path/to/repo"
}
3. read_project_notes - Recuperar contexto salvo
Busca notas por conteúdo ou caminho de arquivo, ou lista todo o conhecimento do projeto.
Exemplo:
{
"query": "Redis",
"repo_root": "/path/to/repo"
}
Desempenho
Engram é construído para ser invisível até que você precise. Ele usa uma Estratégia de Indexação Adaptativa que respeita sua CPU e escala de projetos paralelos a monorepos massivos.
Benchmark contra o Linux Kernel
Levamos desempenho a sério. Engram é submetido a benchmark contra o repositório Linux Kernel (1,2 milhão+ de commits).
Metas de Desempenho
Repositórios Padrão (A Maioria dos Projetos)
- Primeira Execução: < 2 segundos (Indexação histórica completa)
- Execuções Posteriores: < 200ms
Repositórios Massivos (ex.: Linux Kernel)
- Primeira Execução (por arquivo): < 2 segundos (Indexação filtrada por caminho)
- Execuções Posteriores: < 200ms
Arquitetura
┌─────────────┐
│ AI Agent │ ← MCP protocol over stdio
└──────┬──────┘
│
┌──────▼──────────────┐
│ Node.js Adapter │ ← TypeScript MCP server
│ (adapter/) │
└──────┬──────────────┘
│ spawns & communicates via JSON
┌──────▼──────────────┐
│ Rust Core Binary │ ← Fast git indexing + SQLite
│ (core/) │
└──────┬──────────────┘
│ reads
┌──────▼──────────────┐
│ .engram/engram.db │ ← Persistent SQLite database
└─────────────────────┘
Por Dentro
- Estratégia Adaptativa: Engram detecta automaticamente o tamanho do repositório. Para repositórios pequenos, indexa tudo. Para repositórios massivos, alterna para uma estratégia filtrada por caminho para evitar bloquear o agente.
- Baixa Pegada: Sem daemons pesados em segundo plano. A indexação acontece sob demanda dentro de orçamentos de tempo rigorosos, utilizando
rusqlitee modo WAL para concorrência de alto rendimento. - Filtragem Inteligente: Ignora automaticamente ruídos como lockfiles, ativos binários e código gerado automaticamente para manter o sinal alto.
Configuração
Engram é um servidor MCP e funciona com qualquer cliente compatível com MCP.
Claude Code
claude mcp add --scope user --transport stdio engram -- npx -y @spectra-g/engram-adapter
Cursor
Configurações > Geral > Servidores MCP > Adicionar Novo Servidor MCP:
- Nome:
engram - Tipo:
command - Comando:
npx -y @spectra-g/engram-adapter
Instrução de Sistema (Recomendado)
Para garantir que sua IA use Engram de forma eficaz, adicione isto às regras do seu projeto (.cursorrules ou CLAUDE.md).
## Engram Workflow Policy
You have access to a tool called `engram` (specifically `get_impact_analysis` and `save_project_note`).
You MUST follow this strictly sequential workflow for EVERY code modification request:
### Phase 1: Analysis (MANDATORY START)
1. **Blast Radius Check**: Before reading code or proposing changes, you MUST call `get_impact_analysis` on the target file(s).
2. **Context Loading**:
* **Coupling**: If "High" or "Critical" risk files are returned, evaluate if they are *functionally related*.
* *Action:* Read the file (`read_file`) if it poses a logical regression risk.
* *Ignore:* Skip files that appear coincidental (e.g., lockfiles, gitignore, bulk formatting updates).
* **Memories**: Pay close attention to any "Memories" returned in the analysis summary.
* **Tests**: If `test_intents` are present, treat them as strict behavioural constraints. If absent, proceed with standard code analysis.
### Phase 2: Execution
3. **Fix/Refactor**: Proceed with the code changes. Update tests if the behaviour is intentionally changing.
### Phase 3: Knowledge Capture (MANDATORY END)
4. **Save Learnings**: Before finishing, ask: *"Would a future developer be **surprised** by something I discovered?"*
* **IF YES** (Hidden dependencies, non-obvious bugs, env quirks): You MUST use `save_project_note`.
* **IF NO** (Typos, standard refactors, documented behaviour): Do NOT save a note.
Desenvolvimento e Benchmarking
Compilar a partir do Código-Fonte
Requer Rust (1.70+) e Node.js (18+).
npm run build:all # Build Rust core + TypeScript adapter
npm run test:all # Run standard test suite
Benchmarking de Desempenho
Para verificar o desempenho contra o kernel Linux (requer um clone local de linux como diretório irmão):
# 1. Clone linux kernel to ../linux
# 2. Run the ignored performance tests
npm run test:all-local
Contribuindo
Aceitamos relatórios de bugs e correções da comunidade. Observe que, ao contribuir para este repositório, você concede à spectra-g uma licença perpétua e irrevogável para incluir suas alterações tanto no código-fonte público quanto nas versões licenciadas comercialmente do software.
Licença
Este projeto é licenciado sob a PolyForm Noncommercial License 1.0.0.
- Pessoal/Sem Fins Lucrativos: Uso gratuito.
- Uso Comercial: Requer uma licença comercial.