🌳 Yggdrasil

Хватит заново объяснять свой проект каждой новой AI-сессии.
Одна локальная память для Claude Code, Codex и любого MCP-агента — общая для всех сессий, инструментов и проектов. Ноль зависимостей. Ничего не покидает вашу машину.

Latest release PyPI Glama quality score Benchmarks AGPL-3.0 alpha

Установка · Как это работает · Цифры · Сравнение · FAQ

Читать на других языках: English · 简体中文 · Español · Français · 日本語 · Deutsch

---

Yggdrasil — a brand-new session already knows your project, and recalls a fix from another project

В каждом новом чате ваш ИИ всё забывает. Вы заново объясняете проект, решения, подводные камни — каждый раз, в каждом инструменте. **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). Свободное ПО с открытым кодом: используйте, изменяйте, размещайте у себя, распространяйте. Если вы изменяете его или предлагаете как сетевой сервис, вы обязаны открыть исходный код под той же лицензией.