🌳 Yggdrasil
Хватит заново объяснять свой проект каждой новой AI-сессии.
Одна локальная память для Claude Code, Codex и любого MCP-агента — общая для всех сессий, инструментов и проектов. Ноль зависимостей. Ничего не покидает вашу машину.
Установка ·
Как это работает ·
Цифры ·
Сравнение ·
FAQ
Читать на других языках: English · 简体中文 · Español · Français · 日本語 · Deutsch
---
В каждом новом чате ваш ИИ всё забывает. Вы заново объясняете проект, решения, подводные камни — каждый раз, в каждом инструменте. **Yggdrasil — это крошечная всегда включённая память, к которой подключается любой агент.** Откройте новую сессию — в любом проекте, с любым ИИ — и он уже знает, что вы решили, что сломалось и что ещё не закрыто.
```text
$ cd ~/projects/checkout-api && claude # a brand-new session
🌳 Yggdrasil (injected automatically at session start)
• [project_status] payments refactor: idempotency keys added; open: e2e tests
• [lesson] webhook 401 → signing secret rotated; update env + redeploy
> "have I solved a flaky websocket reconnect anywhere before?"
🌳 recall → found in project `realtime-dash`:
refresh the token *before* opening the socket, then retry with capped backoff.
```
Никаких «дай-ка напомню, что мы делали вчера». Оно просто там.
## 🚀 Установка
Две команды прямо в **Claude Code** (плагин запускается через [`uv`](https://docs.astral.sh/uv/)):
```text
/plugin marketplace add VonderVuflya/Yggdrasil
/plugin install yggdrasil
```
Движок лениво стартует при первом использовании и генерирует собственный локальный токен — ни API-ключа, ни облака, ничего настраивать не нужно. В Codex и Cursor всё работает так же.
Все остальные каналы — CLI-демон, Homebrew, npm, Claude Desktop, из исходников…
| Хост / инструмент | Команда |
| --- | --- |
| **uvx** _(рекомендуемый CLI)_ | `uvx --from yggdrasil-memory ygg install` |
| **npm / npx** | `npx yggdrasil-memory install` |
| **pipx** | `pipx install yggdrasil-memory && ygg install` |
| **pip** | `pip install yggdrasil-memory && ygg install` |
| **Homebrew** _(macOS)_ | `brew install VonderVuflya/tap/yggdrasil && ygg install` |
| **Claude Desktop** _(приложение)_ | перетащите `.mcpb` из [последнего релиза](https://github.com/VonderVuflya/Yggdrasil/releases/latest) в Settings → Extensions, вставьте свой токен (`ygg token`) — после этого десктоп-приложение делит ту же память с вашими CLI-агентами ([инструкция](../packaging/mcpb/README.md)) |
| **из исходников** | `uvx --from git+https://github.com/VonderVuflya/yggdrasil.git ygg install` |
`ygg install` — одноразовая управляемая настройка: она устанавливает всегда работающий фоновый сервис, регистрирует MCP-инструменты в каждом найденном агент-хосте — **Claude Code, Codex, OpenCode** — и, если позволяет железо, рекомендует опциональные локальные модели (или выберите `none`, чтобы остаться в режиме zero-config).
OpenCode — настраивать нечего
Сначала установите [OpenCode](https://opencode.ai), затем запустите `ygg install` (или `ygg redeploy`, если Yggdrasil уже настроен) — запись создаётся автоматически и вливается в существующий `opencode.json`. Проверьте так:
```bash
opencode mcp list # -> ✓ yggdrasil connected
```
Установили OpenCode *после* Yggdrasil? Просто перезапустите `ygg install`.
Если хотите прописать вручную: схема OpenCode отличается от схемы Claude сразу в четырёх местах — серверы лежат в `mcp` (а не `mcpServers`), `type` обязателен, `command` — это один массив (а не `command` + `args`), а переменные окружения — `environment` (а не `env`), так что сниппет для Claude просто не подойдёт:
```jsonc
// ~/.config/opencode/opencode.json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"yggdrasil": {
"type": "local",
"command": ["/path/to/python3", "~/.yggdrasil/scripts/ygg_mcp_server.py"],
"enabled": true,
"environment": { "YGG_ENGINE_URL": "http://127.0.0.1:42069" }
}
}
}
```
Токен в конфиг не попадает — движок сам читает файл `~/.yggdrasil/token` с правами 0600. Если инструменты не появились, запустите `ygg doctor`.
Есть и [скилл `yggdrasil-memory`](../skills/) для любой поверхности Claude: MCP подключает *инструменты*, а скилл учит агента, *когда* ими пользоваться. Для наилучшего поведения используйте оба.
Попробовать без установки и с одноразовой БД: `uvx --from yggdrasil-memory ygg serve --reset --db /tmp/ygg.sqlite`.
Дальше просто работайте: попросите агента *«вспомни, что мы решили по этому проекту»*, скажите ему *«запомни это решение»* — в следующей сессии оно уже там. Проверить установку можно в любой момент командой `ygg doctor`.
**Уже есть история?** Заполните память из существующих транскриптов Claude Code + Codex, хранилищ Obsidian и репозиториев с `CLAUDE.md` — всё дистиллируется локально:
```bash
ygg seed --dry-run # see what it would import; drop the flag to distill for real
```
**Уходите от другого инструмента памяти?** `ygg import --from mcp-memory --path memory.json` затягивает всё его хранилище в Yggdrasil (с дедупликацией и защитой от секретов) — после этого его можно удалить.
## Зачем
- 🧠 **Постоянная память** — решения, уроки и статус проекта переживают любые сессии.
- 🔌 **Один мозг, все инструменты** — Claude Code, Codex, OpenCode и любой MCP-хост делят одну и ту же память.
- 🌐 **Кросс-проектный recall** — *«похоже на то, что вы делали в проекте B — переиспользовать?»*
- 🧹 **Курируется, а не захватывается** — агент сохраняет то немногое, что действительно важно; механизм управления дедуплицирует и архивирует, но никогда не удаляет.
- 🌱 **Самоподдержание** *(опционально)* — небольшая локальная модель консолидирует память в фоне. Ноль API-токенов.
- 🪪 **Одна идентичность везде** — опциональные имя и характер, которые подхватывает каждый агент, так что Claude Code и Codex ощущаются как один и тот же ассистент.
- 🔒 **100% локально** — ваша память живёт на вашей машине. Ни облака, ни аккаунта, ни телеметрии.
## 🧠 Как это работает
Yggdrasil — это **память + инструменты**, а *интеллект* — это ваша LLM. Он лишь следит за тем, чтобы нужная память оказалась перед нужным агентом в нужный момент.
- 🛎️ **Всегда работающий демон** — крошечный локальный сервис (~21 МБ RAM), к которому агенты обращаются через MCP-инструменты (`ygg_search`, `ygg_recall`, `ygg_remember` …).
- 🪝 **Хуки** — старт сессии автоматически впрыскивает идентичность, статус проекта и открытые задачи (~300 токенов); опциональный хук на каждый промпт автоматически вспоминает память, релевантную *каждому запросу*.
- 📌 **Ранжирование** — закреплённые и часто вспоминаемые воспоминания всплывают первыми.
- 🧹 **Управление** — дубликаты и конфликты ставятся в очередь на проверку; изменения неразрушающие (архивирование, никогда не удаление).
- 📓 **Obsidian** — каждое воспоминание — это ещё и обычная Markdown-заметка, которую можно читать, править и грепать.
## 🎛️ Уровни памяти — без настройки по умолчанию
Из коробки Yggdrasil работает на **SQLite + FTS5 с нулём зависимостей** — мгновенный поиск по ключевым словам, без моделей, ничего скачивать не нужно. Опциональные **локальные** модели через [Ollama](https://ollama.com) добавляют два независимых уровня:
| Уровень | Что добавляете | Что получаете |
| --- | --- | --- |
| **0 · по умолчанию** | ничего — SQLite + FTS5 | поиск по ключевым словам, ноль зависимостей, мгновенно — recall@1 = **0.77** |
| **1 · семантический** | модель **эмбеддингов** (`all-minilm` 45 MB · `paraphrase-multilingual` ~560 MB) | поиск по **смыслу**, в том числе между языками — recall@1 = **0.94**, recall@3 **1.00** |
| **2 · самоподдержание** | небольшая **LLM** (`qwen2.5:1.5b` ~1 GB) | фоновая дедупликация/слияние памяти (только предложения) |
Ollama только *вычисляет* векторы и запускает фоновую модель — каждое воспоминание и каждый вектор остаются в той же локальной SQLite. `ygg install` определяет ваше железо и рекомендует подходящий вариант (`ygg recommend` показывает полный каталог).
Полное меню моделей
**Эмбеддинги (семантический поиск):**
| Модель | Размер | Хорошо подходит для |
| --- | --- | --- |
| `all-minilm` | 45 MB | английский, крошечная и быстрая |
| `nomic-embed-text` | 274 MB | английский, качество получше (768d) |
| `mxbai-embed-large` | 670 MB | английский, высокое качество (1024d) |
| `paraphrase-multilingual` | ~560 MB | мультиязычная (EN/RU + 50 языков, 768d) |
| `bge-m3` | 1.2 GB | мультиязычная, топовое качество (тяжелее) |
**Бэкенд эмбеддингов** — по умолчанию Ollama. Чтобы вместо неё использовать OpenAI-совместимый сервер `/v1/embeddings` (`llama-server --embeddings` из llama.cpp, OpenRouter, LM Studio, vLLM), задайте `embed_backend`:
```bash
# local llama.cpp — no key needed
ygg config set embed_backend openai
ygg config set embed_url http://127.0.0.1:8080/v1
ygg config set embed_model bge-small-en-v1.5
ygg redeploy
# OpenRouter — free embeddings, no GPU needed
ygg config set embed_backend openai
ygg config set embed_url https://openrouter.ai/api/v1
ygg config set embed_model nvidia/llama-nemotron-embed-vl-1b-v2:free
ygg config set embed_api_key sk-or-... # or export YGG_EMBED_API_KEY
ygg redeploy
```
Ключ хранится в `~/.yggdrasil/embed_api_key` (0600), а не в `config.json`, и попадает в демон как **путь к файлу** — поэтому он не светится в `ps`, в launchd plist или systemd unit. `ygg config list` маскирует его.
Проверьте, что настройка применилась, командой `ygg doctor` — `dense` должен показывать вашу модель:
```
✓ dense active (nvidia/llama-nemotron-embed-vl-1b-v2:free)
```
Подключаете LM Studio или OpenRouter вручную? Подводные камни (два формата URL, идентификаторы моделей, JIT-загрузка, inference- и provisioning-ключи, фильтры приватности) описаны в [docs/model-backends.md](../docs/model-backends.md).
Локальный вариант по-прежнему выигрывает и в качестве, и в приватности: на корпусе из 232 памятей / 110 запросов локальная `paraphrase-multilingual` показывает recall@1 **0.964** против **0.946** у бесплатной хостинговой модели — а ваши воспоминания никогда не покидают машину. Переходите на хостинговый бэкенд, когда железо не тянет Ollama, а не в погоне за точностью.
Векторы большего размера здесь точности **не** прибавляют — на том же корпусе `mxbai-embed-large` (1024d) даёт 0.809, а `nomic-embed-text` (768d) — 0.818, и эта разница целиком укладывается в их доверительные интервалы. По-настоящему на цифру влияет то, справляется ли модель именно с *вашими* языками: обе модели англоязычные и на межъязыковых запросах проседают до 0.40–0.45, тогда как мультиязычная модель по умолчанию держит 0.95.
**Фоновая консолидация (небольшая LLM):**
| Модель | Размер | Хорошо подходит для |
| --- | --- | --- |
| `qwen2.5:0.5b` | ~400 MB | крошечная, быстрая на CPU |
| `qwen2.5:1.5b` | ~1 GB | лучший вариант по умолчанию для CPU |
| `llama3.2:3b` | ~2 GB | качество получше, медленнее на CPU |
Сам движок взаимозаменяем — любой сервис, удовлетворяющий контракту `MemoryBackend`, подключается как замена (`YGG_ENGINE_URL`); см. [docs/backend-boundary.md](../docs/backend-boundary.md).
## 🔗 Одна память на всех ваших машинах
Работаете на ноутбуке и на более мощной машине? Свяжите их один раз — и они перестанут быть двумя мозгами.
```text
# on the laptop
$ ygg link
🔗 pairing code valid 5 minutes · single use
ygg://192.168.3.152:42070/a4e0df489737#FOucjgJ1FrUB…
# on the other machine — paste it
$ ygg link ygg://192.168.3.152:42070/a4e0df489737#FOucjgJ1FrUB…
✓ linked with laptop https://192.168.3.152:42070
✓ laptop: fetch 84 · push 12 · delete 0 · tombstones 0
```
Дальше всё просто: память, записанная на одной машине, появляется на другой примерно через секунду, `ygg delete` удаляет её с **обеих**, а любая машина продолжает работать со своей локальной копией, пока другая спит — чтение никогда не ждёт сети. Когда машина возвращается, они сравнивают отпечатки и сами догоняют то, что пропустили, без каких-либо действий с вашей стороны.
Опроса **нет**. Yggdrasil вызывают несколько раз в день, поэтому записи уходят сразу по мере появления, а синхронизация запускается чтениями; простаивающие машины ничего не шлют.
**Чем это не является:** облаком. Нет ретранслятора, нет аккаунта, нет нашего сервера на пути. Машины общаются напрямую по вашей собственной сети, по TLS с закреплённым сертификатом друг друга, с ключевой парой, которая существует только на этих двух машинах. Сам код спаривания содержит сертификат машины, которая его выдала, поэтому даже самое первое соединение проверяется: если кто-то другой в сети ответит вместо неё, он будет отклонён до того, как уйдёт секрет кода. Ни один сетевой порт не открывается, пока вы не запустите `ygg link` — установка Yggdrasil оставляет всё на loopback, как и раньше.
```text
ygg link --list # what's linked, and whether writes are actually arriving
ygg link --sync # reconcile now, don't wait for a read
ygg unlink # revoke that machine's key here
```
Подробнее: что передаётся, что остаётся на месте и когда использовать ygg sync вместо этого
**Передаётся:** память, её связи и удаления. **Остаётся на месте:** как часто *вы* открывали воспоминание и на какой машине его читали — это локальное ранжирование, а не знание. Векторы эмбеддингов обычно тоже остаются локальными, с одним исключением: если обе машины используют одну и ту же модель эмбеддингов, вектор передаётся вместе с записью, так что вычислительная машина может сделать эмбеддинг за ноутбук, и ноутбуку вообще не придётся запускать модель.
**Более новая правка побеждает.** Если отредактировать воспоминание на обеих машинах до их общения, более свежая правка сохраняется на обеих (в том числе более короткая правка-исправление).
**Удаления побеждают.** Если вы удалили воспоминание на одной машине, а на другой в это же время его отредактировали, побеждает удаление, а правка теряется. Это намеренно: «я удалил утёкший токен» должно выполняться, даже когда часы двух машин расходятся. Если же вы имеете в виду *передумал*, архивируйте — ничего не теряется, а `ygg unarchive` возвращает запись на обеих машинах (побеждает более позднее решение).
**Брандмауэр обнаруживается при спаривании.** Машина, которая напечатала код, сразу перезванивает другой; если до неё не дозвониться, `ygg link` сообщает об этом и выводит одну команду, которая открывает порт только для этой машины (ufw, firewalld, Windows). `ygg link --list` и `ygg doctor` продолжают проверять и после: узел помечается ✓ только когда записи подтверждённо доставлены, иначе показываются ошибка и количество ожидающих изменений. Машина, которая получила новый адрес по DHCP, находится снова при следующем контакте.
**`ygg sync` (git) никуда не делся** и выполняет другую задачу: машины, которые не видят друг друга, рабочий ноутбук за другой сетью, bare-репозиторий на USB-флешке, которую вы носите с собой. Используйте `ygg link` для машин в одной сети, `ygg sync` — для всего остального. Оба используют одни и те же правила слияния, так что их можно запускать вместе. Если обе машины в одной сети Tailscale, `ygg link --tailscale` работает и между сетями.
**Если код спаривания показывает неверный адрес** (он предпочитает настоящие Ethernet и Wi-Fi виртуальным мостам и VPN, но всё же может ошибиться), закрепите адрес: `ygg config set sync_host 192.168.3.152` — или выведите код на другой машине: сторона, которая вводит код, всегда использует адрес, по которому реально проходит маршрут.
## 📊 Цифры
Замерено скриптом [`eval/ygg_eval.py`](../eval/ygg_eval.py) — 232 памяти, 110 размеченных запросов, веса ранжирования настроены только на *dev*-разбиении, поэтому **holdout — это несмещённая цифра** (recall@1, с моделью `paraphrase-multilingual`):
| Режим поиска | holdout recall@1 | recall@3 | лексический без зависимостей |
| --- | --- | --- | --- |
| **Внутри проекта** (реальный путь, пул ~11) | **0.94** | **1.00** | 0.76 |
| **Всё хранилище** (без фильтра, пул 232) | 0.72 | **0.87** | 0.69 |
**Внутри проекта — по пути, которым вы пользуетесь — нужное воспоминание стоит на #1 в 0.94 запросов и каждый раз попадает в топ-3 (recall@3 = 1.00).** Поиск по всему хранилищу без фильтра сложнее (recall@1 0.72, recall@3 0.87 по всем 232). Лексический режим без зависимостей уже закрывает запросы по ключевым словам и идентификаторам кода (1.00); локальная модель добавляет смысл и межъязыковой поиск (crosslingual 0.25 → 0.95). [Полный разбор в BENCHMARKS.md](../BENCHMARKS.md) показывает 95% доверительные интервалы, размеры пулов и разбивку по классам — и перепроверить можно примерно за минуту: `python3 eval/ygg_eval.py --report`.
**Размер корпуса — часть цифры.** На реальном хранилище из 4 799 воспоминаний многоязычный эмбеддер по умолчанию откатывается к лексическому baseline (recall@1 0.55); `bge-m3` держит там 0.775. Если ваше хранилище вырастет до тысяч записей, выбирайте `bge-m3` — подробности в [BENCHMARKS.md](../BENCHMARKS.md).
## 🆚 Yggdrasil против остальных
Все остальные либо автоматически захватывают транскрипты, либо продают вам облако. Ставка Yggdrasil: хранить **то немногое, что действительно важно** — курируемое и дедуплицированное, в обычных записях, которыми владеете вы, — и делить это между **всеми** инструментами и проектами.
| | **Yggdrasil** | Встроенная память (Claude Code · Codex) | [claude-mem](https://github.com/thedotmack/claude-mem) | [mem0](https://github.com/mem0ai/mem0) / OpenMemory | [basic-memory](https://github.com/basicmachines-co/basic-memory) |
| --- | --- | --- | --- | --- | --- |
| Курируемые решения / уроки / статус (не транскрипты) | ✅ | ⚠️ авто-заметки | ❌ захватывает всё | ⚠️ | ⚠️ заметки в свободной форме |
| Одна память **между инструментами** | ✅ | ❌ замкнута на вендора | ✅ | ✅ | ✅ |
| **Кросс-проектный** recall («решал это в проекте B») | ✅ | ❌ в рамках репозитория | ⚠️ | ⚠️ | ⚠️ |
| **100% локально** по умолчанию | ✅ | ✅ | ⚠️ облачная синхронизация как дополнение | ❌ сначала хостинг | ✅ |
| **Ноль зависимостей** (stdlib + SQLite) | ✅ | — | ❌ Node + Bun + демон-воркер | ❌ Docker + Qdrant + ключ LLM | ❌ |
| Работает **без LLM и без API-ключа** | ✅ | ✅ | ❌ сжимает с помощью ИИ | ❌ | ✅ |
| **Семантический поиск, полностью локальный** | ✅ опционально через Ollama | ❌ только grep | ⚠️ опциональная Chroma | ⚠️ нужен API-ключ или Docker-стек | ❌ |
| Обычный **Markdown, которым владеете вы** (готов для Obsidian) | ✅ | ✅ | ❌ | ❌ | ✅ |
**Ближайший сосед — claude-mem:** память типа «захватить всё», которая записывает и сжимает с помощью ИИ каждую сессию (Node 20+ *и* Bun, постоянный демон-воркер; Chroma опционально). Yggdrasil — противоположная ставка: маленькое хранилище с высокой плотностью сигнала вместо растущего пожарного шланга. **mem0** — это SDK плюс хостинговая платформа для создания *приложений*, которые помнят *своих пользователей* — даже в self-hosted-варианте ему нужен API-ключ LLM. **Встроенные памяти** по-настоящему полезны — и структурно изолированы: один вендор, один репозиторий, одна машина, буквальный grep. Yggdrasil — это слой над ними (а `ygg seed` умеет наполниться из тех же самых транскриптов). Совсем другой слой: [context-mode](https://github.com/mksglu/context-mode) (живое контекстное окно) и [Context7](https://github.com/upstash/context7) (свежая документация библиотек) — оба отлично сочетаются с Yggdrasil.
## 🧰 Команды
Агенты видят шесть MCP-инструментов: `ygg_health`, `ygg_bootstrap`, `ygg_search`, `ygg_recall`, `ygg_remember`, `ygg_materialize` — они регистрируются автоматически плагином или командой `ygg install`.
Полный справочник CLI ygg
**Операции с памятью**
| Команда | Что она делает |
| --- | --- |
| `ygg recall --query "…"` | **Кросс-проектный** поиск — «делал ли я это где-нибудь?» |
| `ygg search --project P --query "…"` | Поиск в рамках проекта (`--type`, `--tag`, `--limit`, `--json`) |
| `ygg remember --project P --type lesson --content "…"` | Сохранить долговечное воспоминание (защита от секретов, дедупликация) |
| `ygg bootstrap --project P` | Подтянуть память проекта перед началом работы |
| `ygg pin --id ID` · `ygg unpin --id ID` | Закрепить воспоминание, чтобы оно надёжно всплывало |
| `ygg supersede --id ID` | Архивировать устаревшее воспоминание, которое заменяет более новое |
| `ygg unarchive --id ID` | Вернуть архивное воспоминание (в том числе на связанных машинах) |
| `ygg materialize --id ID --project P` | Экспортировать одно воспоминание в заметку Obsidian |
| `ygg export-native --project P` | Записать выверенную выжимку в `AGENTS.md`/`MEMORY.md` — снабдить ею нативную память Claude Code и Codex |
| `ygg import --from TOOL --path P` | Перенести хранилище другого инструмента памяти в Yggdrasil (`mcp-memory`, `basic-memory`; сначала `--dry-run`) |
| `ygg review [--apply]` | Разобрать очередь управления — объединить дубликаты, пометить устаревшие/конфликтующие воспоминания (только архивирование, обратимо) |
| `ygg delete --id ID` · `ygg reset …` | Безвозвратно удалить одно воспоминание · массово откатить неудачный `ygg seed` (сначала запрашивает подтверждение) |
**Холодный старт**
| Команда | Что она делает |
| --- | --- |
| `ygg seed` | Дистиллировать транскрипты Claude Code + Codex, хранилища Obsidian, репозитории с `CLAUDE.md` — инкрементально, с дедупликацией, полностью локально |
| `ygg seed --dry-run` · `--force` | Только обнаружение + оценка · повторно дистиллировать всё |
| `ygg link` · `ygg link ` | Связать две **ваши** машины напрямую в одной сети — общая память в реальном времени, закреплённый TLS, без ретранслятора |
| `ygg link --list` · `ygg unlink ` | Показать связанные машины · отозвать одну |
| `ygg distill --source PATH` | Дистиллировать одну директорию/файл в уроки |
| `ygg reindex` | Дозаполнить недостающие эмбеддинги (восстанавливает плотный recall) |
**Сервис и настройка**
| Команда | Что она делает |
| --- | --- |
| `ygg install` · `ygg doctor` · `ygg update` | Управляемая настройка · диагностика с готовыми исправлениями · обновление |
| `ygg config` | Показать/изменить постоянные настройки (`list` · `get` · `set` · `unset`) |
| `ygg status` · `start` · `stop` · `restart` · `logs` | Управление всегда работающим демоном |
| `ygg hooks` · `unhooks` · `register` | Включить/выключить хук SessionStart · (пере)регистрировать MCP |
| `ygg recommend` · `token` · `uninstall` | Каталог моделей · вывести токен авторизации · удалить всё |
Дайте ему характер — отредактируйте `~/.yggdrasil/identity.json`:
```json
{ "name": "Jarvis", "persona": "concise, proactive, dry wit", "user_facts": ["prefers TypeScript", "ships small PRs"] }
```
Тяжёлый seeding, слабый ноутбук? Направьте дистилляцию на *любую* машину в вашей локальной сети — десктоп с Ollama, LM Studio, llama.cpp, **даже iPhone с приложением локального LLM-сервера**: `ygg config set distill_url http://:11434`. Yggdrasil сам определяет диалект API (Ollama или OpenAI-совместимый); ваши данные всё так же никогда не покидают вашу сеть — подробности в [docs/ygg-cli.md](../docs/ygg-cli.md).
## ❓ FAQ
В Claude Code уже есть встроенная память — зачем Yggdrasil?
Встроенные памяти привязаны к вендору, репозиторию и машине, а извлекаются буквальным совпадением текста. Yggdrasil — слой над ними: *одна и та же* память в Claude Code, Codex и любом MCP-хосте, recall *между* проектами, опциональный семантический поиск — и всё так же 100% локально. Они дополняют друг друга: оставьте нативную память и позвольте `ygg seed` дистиллировать вашу существующую историю в общий мозг.
Отправляет ли он мой код или память в облако?
Нет. Движок, база данных и опциональные модели — всё работает локально. Ни аккаунта, ни телеметрии. Единственный исходящий запрос — проверка версии на PyPI.
Если вы свяжете две свои машины командой `ygg link`, воспоминания передаются **между этими двумя машинами** по вашей собственной сети — напрямую, по TLS с закреплённым сертификатом, без ретранслятора и без нашего сервера на пути. Пока вы не запустите эту команду, ничего не слушает за пределами loopback.
Может ли вредоносный репозиторий подложить инструкции в мою память?
Вспомненная память внедряется как явно оформленные *справочные заметки, а не инструкции*, с указанием, откуда взялась каждая заметка, и пометкой, если она относится к другому проекту — поэтому агент воспринимает её как данные и спрашивает, прежде чем делать что-либо по ней. Секреты вычищаются из транскриптов до дистилляции и отклоняются при записи. И всё же: память надёжна лишь настолько, насколько надёжно то, что её записало — время от времени просматривайте `ygg review`.
Запоминает ли он всё автоматически?
Нет — по задумке. Извлечение автоматическое; *запись* — осознанная (агент вызывает `ygg_remember` для долговечных уроков). Захват всего подряд загрязняет память и сжигает токены, поэтому мы так не делаем. Опциональная фоновая модель консолидирует уже сохранённое (только предлагает).
Нужен ли мне GPU или API-ключ?
Нет. По умолчанию — чисто лексический поиск: ноль зависимостей, мгновенно. Семантический поиск подключается по желанию и использует *локальную* модель через Ollama. Установщик порекомендует ту, что подходит под ваше железо.
Насколько он тяжёлый и сколько стоит в токенах?
В простое движок занимает **~21 МБ RAM** (лексический режим по умолчанию) при ~0% CPU; на диске — десятки КБ на воспоминание. Старт сессии впрыскивает ~300 токенов; каждый вызов инструмента возвращает небольшой фрагмент. Вся тяжёлая работа (индексация, эмбеддинги, консолидация) идёт вне LLM на вашей машине.
Могу ли я редактировать или удалять воспоминания вручную?
Да. Воспоминания материализуются в Markdown-заметки в хранилище Obsidian — читайте, редактируйте или удаляйте их как любой файл. Governance и review ничего не удаляют: они архивируют, и это обратимо. Жёстко удаляете только вы — явно, командой `ygg delete` (а на связанных машинах это удаление доходит до обеих).
## 🚦 Статус и дорожная карта
**Альфа.** Счастливый путь и цикл управления покрыты гейт-тестами (`scripts/run_gates.sh`); пока не закалён под многопользовательский или продакшен-режим. Сегодня — macOS; установщики сервиса для Linux/Windows готовы и проходят финальное тестирование на устройствах.
Shipped recently: 🔗 машина-машина память (`ygg link`) · граф связей (`ygg relate`: `solves` / `supersedes` / `contradicts`).
Next: 🛰️ cross-surface (одна память для CLI, веба и телефона — HTTP-фасад уже есть, см. [docs/cross-surface.md](../docs/cross-surface.md)) · 🐧 GA для Linux/Windows.
## 🤝 Участие
Issues и PR приветствуются. Запустите `scripts/run_gates.sh` и `python3 -m unittest discover -s tests` перед отправкой — все гейты должны оставаться зелёными.
## 📜 Лицензия
**GNU AGPL v3.0** — см. [LICENSE](../LICENSE). Свободное ПО с открытым кодом: используйте, изменяйте, размещайте у себя, распространяйте. Если вы изменяете его или предлагаете как сетевой сервис, вы обязаны открыть исходный код под той же лицензией.