memo

Локальная библиотека заметок с семантическим поиском.

Как этим пользоваться — MANUAL.md. Пошаговая инструкция для человека: установка, команды, подключение к агенту, что мониторит демон, что можно удалять. Остальной README — для разработки.

Markdown на диске — истина, .db рядом — пересобираемый кэш. Агент (или человек) пишет и читает обычные .md-файлы своими штатными средствами: memo не требует ни специального API записи, ни изменения привычек. Он следит за файловой системой, держит рядом с каждой папкой-темой индекс (SQLite + sqlite-vec + FTS5) и отвечает на смысловые вопросы гибридным поиском (BM25 + вектор + RRF).

Статус

Реализовано и принято на эталонном корпусе. 38 тестов, мутационная проверка, сквозной recall@5 = 20/20.

Что Вердикт приёмки
юнит-тесты всех модулей ✅
мутационная проверка (13 мутаций) ✅ все убиты
индексация: 3 коллекции, повторный прогон — 0 обновлений ✅
recall@5 на эталонном корпусе (sem 20/20, lex 3/3) ✅
MCP-протокол живым клиентом + холодный старт ✅

Идея

  • Коллекций (папок-тем) — сколько угодно; они не мешают друг другу.
  • Коллекция — каталог, в котором есть *.md напрямую (не в подкаталогах). Вложенные папки без своих заметок коллекциями не считаются — иначе одни и те же файлы индексируются по нескольку раз.
  • Индекс каждой коллекции живёт в её .memo/index.db и удаляется без потерь — пересобирается.
  • Поиск — обычный read-only инструмент; записи в markdown он не делает никогда.
  • Только локально: эмбеддинг на CPU, сеть не нужна ни при индексации, ни при поиске.

Состав (JVM-first, один Gradle-проект)

memo-cli     # memo index|search|status — ручные проверки и приёмка без агента
memo-core    # чанкер по заголовкам, sqlite-схема, инкрементальная переиндексация, гибридный поиск
memo-watch   # демон: WatchService + debounce + реконсиляция по mtime
memo-mcp     # MCP-сервер (stdio): memo_search / memo_status / memo_reindex

memo-core не знает ни про watcher, ни про MCP — это драйверы поверх ядра.

Быстрый старт

./gradlew installDist          # собрать все дистрибутивы

CLI=memo-cli/build/install/memo/bin/memo
$CLI model                     # скачать модель (необязательно — скачается сама при первом запуске)
$CLI index  ~/notes            # проиндексировать дерево (коллекции найдутся сами)
$CLI search ~/notes "чем чинят карточку в jellyfin"
$CLI search ~/notes "76.132" --mode lex --json
$CLI status ~/notes

MCP-сервер (stdio), регистрируется как обычный MCP-сервер:

{
  "mcpServers": {
    "memo": {
      "command": "/opt/memo/memo-mcp",
      "env": { "MEMO_MODEL_DIR": "/opt/memo/models/siglip2" }
    }
  }
}

Инструменты: memo_search(path, query, k, mode), memo_status(path), memo_reindex(path). memo_search сам создаёт индекс, если его ещё нет — можно просто писать .md и сразу искать.

Демон слежения (для правок мимо агента — людьми, git, сторонними редакторами):

memo-watch/build/install/memo-watch/bin/memo-watch ~/notes

Приёмка

bash scripts/accept.sh          # полный прогон: сборка, тесты, мутации, индекс, recall, MCP
bash scripts/accept.sh --fast   # то же без мутационной проверки (самая долгая)

Правило проекта: «зелёная сборка» ничего не доказывает. Тесты проверяются мутациями (e2e/mutations.tsv): боевой код ломается, и нужный тест обязан упасть. Выжившая мутация — дыра в покрытии, а не удача. Приёмка идёт на реальном корпусе (scripts/make_e2e_corpus.sh), а не на моках.

Документы

Документ Что внутри
MANUAL.md инструкция для человека: как пользоваться, команды, подключение к агенту
docs/SPEC.md полная спека: модель данных, индекс, маршрутизация, watcher, интерфейс, приёмка
TASK.md ТЗ для исполнителя: стек, схема БД, контракты, чего не делать
TESTING.md тест-план: приёмочные проверки, команды, признаки провала
docs/orders/ журнал заказов исполнителю — с доказательствами дефектов, а не «сделай хорошо»

Зависимости (проверено 02.10.2026)

Что Координата Откуда
SQLite + sqlite-vec + FTS5 pw.binom.db:ksqlite:0.1.4 Maven Central
Текстовый эмбеддинг (SigLIP2 int8, 768 dims) pw.binom.ai.embeddingtext:api:5 + :siglip:5 http://nexus.xx/repository/caffeine/

Модель (в артефакты не входит, скачивается отдельно):

mkdir -p models/siglip2
curl -fSL -o models/siglip2/text_model_int8.onnx http://static.binom.pw/models/siglip2/text_model_int8.onnx  # 283M
curl -fSL -o models/siglip2/tokenizer.model     http://static.binom.pw/models/siglip2/tokenizer.model           # 4.2M

Требования

JDK 21. Индекс и поиск работают офлайн после скачивания модели.

Лицензия

Apache-2.0.

S
Description
Локальная библиотека заметок: markdown — истина, пересобираемый sqlite-vec индекс, watcher, MCP-поиск (Kotlin/JVM)
Readme Apache-2.0 269 KiB
Languages
Kotlin 82.1%
Shell 9.7%
Python 8.2%