Skip to content

Как это работает ​

┌────────────────────────────────────────────────────────────┐
│          Агент (Claude Code / Cursor / Codex / …)          │
└──────────────────────────────┬─────────────────────────────┘
                               │ MCP (stdio)
┌──────────────────────────────▼─────────────────────────────┐
│                     engram MCP server                      │
│  tools: remember · recall · why · check · context · …      │
│  prompts: встроенные skills · resources: engram://…        │
├───────────────┬──────────────────┬─────────────────────────┤
│  Хранилище    │  Граф            │  Компрессор контекста   │
│  CRUD, дедуп, │  соседи, линия,  │  пакеты под бюджет,     │
│  поиск FTS5   │  why, грабли     │  обзор проекта          │
├───────────────┴──────────────────┴─────────────────────────┤
│  Индексатор: ADR → решения · git → hotspots и откаты       │
└──────────────────────────────┬─────────────────────────────┘
                               │
             ┌─────────────────┴──────────────────┐
             ▼                                    ▼
   .engram/engram.db                     .engram/memories.jsonl
   SQLite + FTS5 (локальный индекс)      отсортированный JSONL (в git)

Хранение ​

engram использует встроенный в Node node:sqlite, поэтому компилировать ничего не нужно, а npx работает везде, где есть Node 22.13 или новее. Таблицы: memories, memories_fts (FTS5 с токенизатором Porter и Unicode), links, sessions, tombstones и meta. Миграции только добавляются и отслеживаются в meta.schema_version.

Ранжирование ​

score = bm25(title×6, tags×3, content×1, files×1.5)
      × вес вида        (decision, pitfall 1.25 · principle 1.2 · … · session 0.8)
      × важность        (1 + 0.15 × (importance − 3))
      × статус          (active 1 · rejected 0.85 · superseded 0.6 · archived 0.4)
      × свежесть        (теряет до 30% за год)

Слабые частичные совпадения, у которых оценка ниже 20% от лучшей, отбрасываются.

Индексатор ​

engram index запускается и во время init. Его можно запускать повторно:

  • ADR в docs/adr, docs/decisions, adr и похожих папках (список настраивается) разбираются по стилям Nygard и MADR, с front matter и строками вроде Superseded by ADR-0007. Каждый ADR становится записью decision, а если ADR ссылаются друг на друга, добавляются рёбра supersedes.
  • История git, по умолчанию последние 500 коммитов, даёт факт «Code hotspots» со списком чаще всего меняющихся файлов. Откаты и коммиты вроде «fix … again» становятся кандидатами в грабли с низкой важностью, которые агент подтверждает или отбрасывает.

Конфигурация ​

.engram/config.json:

json
{
  "project": "shop",
  "sync": { "jsonl": true },
  "context": { "budget": 2000 },
  "indexer": {
    "adrDirs": ["docs/adr", "docs/adrs", "docs/decisions", "doc/adr", "adr", "decisions"],
    "gitDepth": 500,
    "hotspotThreshold": 8
  }
}

Released under the MIT License.