pofium/ob2h/ob2h
Claude Code and agent skill by pofium/ob2h
- community
Checking that the SKILL.md file is still in the repository.
Long-term memory, knowledge graph and dreaming backend of this Hermes agent. Use for any recall about the user, past conversations, projects, preferences, and for saving new important facts. Also use for developing/maintaining the ob2h project itself.
Install
npx vskill@latest install pofium/ob2h/ob2hSKILL.md
OB2H — долговременная память этого агента (Rust, MCP + MemoryProvider)
Поведение: память включена ВСЕГДА
- Каждый ход диалога попадает в ob2h автоматически: MemoryProvider-плагин
(sync_turn/session_ingest), без плагина (Mode 0) — вызывай session_log после содержательных ответов сам, не дожидаясь просьбы.
- Вопросы о пользователе, его проектах, прошлых обсуждениях, предпочтениях → сначала
recall (memory_search / блок <agent_memory>), потом ответ.
- Устные «запомни…» →
memory_saveс importance 0.8+; устойчивые факты — сkey. - Документы/длинные тексты →
knowledge_extract; вопросы о связях «кто/что/чем связано» →
graph_reason. Ночью/по гейтам авто-дрим обновляет MEMORY/SOUL/USER.md и граф.
- В памяти встречаются факты с ДРУГОЙ машины пользователя (origin=pc/vps): пути и среды
с чужого origin не существуют локально — используй их как контекст, а не как цели для файловых операций.
Как вызывать память, когда прямых инструментов нет (MCP-коннектор)
- Часть сессий видит ob2h-инструменты как НЕ зарегистрированные: вызов
memory_save
/memory_search/graph_search/omnes_stats напрямую возвращает Unknown tool. Рабочий путь — коннектор: mcp__ob2h__server_invoke_tool(tool_name=..., tool_input={...}), схему конкретного инструмента брать через mcp__ob2h__server_get_tool_schema (она же перечисляет ВСЕ доступные имена инструментов сервера).
- Кириллица в
tool_inputчерез коннектор проходит нормально — отдельный JSON-RPC-драйв
к ob2h serve нужен только если коннектор сам отвалился с ошибкой транспорта.
- Проверяй запись ЧТЕНИЕМ обратно (
memory_searchпо ключу), а не по ответуsaved.
Полный текст записи и замена устаревших фактов
memory_searchотдаёт сниппеты ~200 символов — для правки существующей записи этого
мало. Полный текст брать из БД read-only: sqlite3.connect("file:<data>/ob2h.db?mode=ro", uri=True), таблица memories (колонки key, content, category, importance, trust, origin, deleted_at).
- Устаревший факт НЕ удалять:
memory_update(key=...)с текстом «оригинал целиком +
пометка [УСТАРЕЛО <дата>: заменено — см. <новый ключ>]». История сохраняется, а recall больше не тянет мёртвый адрес без оговорки.
- Один факт = одна запись с осмысленным
key(напр.hmem-<тема>-<дата>); зеркальные
копии m_* (cat=general) создаёт сам плагин из MEMORY.md — их не править руками.
Режимы подключения (не путать при диагностике)
| Режим | Как выглядит | Что важно | |
|---|---|---|---|
| A: плагин (целевой) | memory.provider: ob2h в config.yaml, плагин в {{HERMES_HOME}}/plugins/ob2h/ | Один процесс ob2h serve (спавнит плагин); захват/recall происходят САМИ; индикатор 🧠 = prefetch сработал; mcp_servers.ob2h следует удалить | |
| B: переходный | плагин И mcp_servers.ob2h одновременно | Работает (WAL+busy_timeout+dream-lock), но два процесса — лучше уйти в A | |
| 0: MCP-only (фолбэк) | только mcp_servers.ob2h в config.yaml | Захват только через явные вызовы инструментов |
Что это
- Один Rust-бинарник: MCP-сервер stdio + SQLite WAL + FTS5-trigram (русский)
- локальные Candle-эмбеддинги
paraphrase-multilingual-MiniLM-L12-v2(384d,
кэш ~/.cache/huggingface/hub/); LLM для экстракции/дрима — DeepSeek.
- Пути этой машины: проект
{{PROJECT_DIR}}, бинарник{{BINARY}},
данные/БД {{DATA_DIR}} (ob2h.db, workspace/: SOUL.md/USER.md/memory/MEMORY.md + daily/*.jsonl — файлы создаются лениво, workspace_read отсутствующего = ""), Hermes home {{HERMES_HOME}} (config.yaml, plugins/ob2h, ob2h.json).
- Инструменты (36 шт): memory_save/search/update/forget/context, memory_feedback (trust ±),
memory_merge (слияние дублей), workspace_read/write, session_log, session_ingest, knowledge_extract, graph_search (mode=classic|ppr)/reason (scope=docs|memory|all)/stats, dream_run/status/log/restore, omnes_stats/backup, project_init/scan/scan_status/ context/graph_search/report/impact, project_call_path (callers/callees/call-path), ralph_start/iteration/verdict/context/report, ast_diff, ast_history.
- Детерминированный AST-граф кода:
project_scanизвлекает классы, функции, трейты и связи
со 100% точностью (Graphify-подход) без вызовов LLM; скан идёт в фоне и не упирается в таймаут MCP-клиента — по умолчанию инструмент ждёт до 45 с, долгий скан отвечает «still running», результат досматривается project_scan_status (там же сводка из БД). CLI для этого агенту не нужен. project_report и project_context выделяют центральные хабы архитектуры (God Nodes). CLI для этого агенту не нужен. project_report и project_context выделяют центральные хабы архитектуры (God Nodes).
- Регрессионный bench кодового графа (v1.7.1):
ob2h bench --mode code --project <id>
против data/bench/golden_code.jsonl — recall/MRR PPR-поиска; используется для обоснования изменений PPR-весов (вердикт 2026-10-03: дефолт не менять — выдача не зависит от весов кодовых рёбер, цели находятся на этапе сидов).
- Форматы сканера (v1.7): 31 расширение кода (rs/py/ts/tsx/js/jsx/go/sql/c/cpp/cc/cxx/
h/hpp/hxx/php/dart/java/cs/kt/kts/swift/rb/vue/svelte/scala/lua/ex/exs/sh/bash) + веб-разметка и стили (html/htm, css/scss, blade), контракты (proto, graphql/gql, openapi.json|yaml), IaC (Dockerfile, .tf/.hcl, docker-compose|compose.yml|yaml, k8s|deploy|helm|chart/*.yaml|yml), манифесты (Cargo.toml, package.json, pyproject.toml, requirements.txt, go.mod, pubspec.yaml, composer.json; lock-файлы исключены), спец-языки (.ipynb без outputs, .sol, .zig). Импорты внешних пакетов сливаются с манифестами в узлы pkg:<eco>:<name> (версия в description).
- Полезные запросы v1.7:
project_graph_search("pkg:rust:serde_json")— пакет и его
потребители; project_graph_search("cssclass:<имя>") — где определён CSS-класс; project_impact("openapi.yaml") / project_impact("Dockerfile") / project_impact("Cargo.toml") — что заденет правка контракта/образа/зависимости; project_call_path проходит фронт → route: → хендлер (INFERRED-мосты SERVES_ENDPOINT/PROVIDES_RPC).
- AutoDreamWorker: гейты ≥4ч и ≥10 событий, lock, git-история правок, бэкапы
(full/quick, verify, раздельная ротация), ночной bench-гейт (откат дрима при деградации recall/MRR). CLI: ob2h stats | doctor [--fix] | dream run/status/log/restore | bench [--mode history] | backup [--scope quick] [verify <path>] | db quantize-embeddings | memory dedup [--dry-run] | install/uninstall | plugin install/uninstall/status | skill-install | agent install/status | update check/apply/status (v1.8.0, ADR-15) | project init/scan/list/report/dead-code/repo-map | ralph findings-to-memory | sync status/verify/export/import/apply-inbox/push/pull.
Синхронизация двух машин (PC ↔ VPS)
- Обмен — gzip-дельта-бандлы v2 JSONL поверх SSH (
{{DATA_DIR}}/sync/peers.json:
origin=pc|vps, приоритеты, пути; инициатива на PC — push/pull, VPS — apply-inbox+export). Только изменённое (курсор по updated_at); в бандле память+trust+memory_links+удаления; поле-уровневый merge с журналом sync/conflicts.jsonl (не молчаливый LWW); ralph_* вне бандлов (ADR-K6). Идемпотентно; сверка дрейфа — ob2h sync verify.
- Живую БД
{{DATA_DIR}}/ob2h.dbНИКОГДА не синкать файловой синхронизацией (WAL = порча),
только папку бандлов. Диагностика обмена: ob2h sync status.
Критичные питфоллы
- OB2H_LLM_API_KEY = ИМЯ env-переменной с ключом (напр.
DEEPSEEK_API_KEY), не сам
ключ (развязка в коде, коммит 82d7e3f; фолбэк на литерал и на <data_dir>/.env). Симптом обратного: 401 Your api key: ****_KEY is invalid.
- «chunks записались, entities=0» в knowledge_extract — упавший LLM-вызов (см. п.1);
теперь инструмент сам возвращает [Error]/[Подсказка] с числом упавших чанков.
- Снабжение LLM — три эшелона (2026-11): явный
OB2H_LLM_*→ основная LLM
harness-системы (автодетект по clientInfo при initialize: hermes/zcode/codex читают свой конфиг; форс — OB2H_LLM_HARNESS) → локальная мини-модель Qwen/Qwen3-0.6B (~1.4 GB, качается при первом вызове; OB2H_LOCAL_LLM=0 — выкл).
- Логи:
{{DATA_DIR}}/logs/ob2h.log(cwd сервера от Hermes = домашняя папка — до фикса
82d7e3f логи могут лежать в ~/logs, искать оба места).
- Пересборка (Windows): exe блокируется, пока процесс жив (Hermes/плагин держит).
cargo build --release падает os error 5 → сначала Get-Process ob2h | Stop-Process -Force (убьёт MCP в текущей сессии Hermes — спросить пользователя). Пересборка (Linux/VPS): cd <репо> && git pull && cargo build --release && install -m755 target/release/ob2h /usr/local/bin/ob2h — замена живого бинарника безопасна, подхватится после рестарта гейтвея (systemctl --user restart hermes-gateway).
- ob2h ТОЛЬКО для этого Hermes: не добавлять другим агентам, не оборачивать в
mcp-compressor (пользователь запретил явно).
- Живой сервер держит БД; read-only проверки через sqlite URI
file:...?mode=ro
безопасны параллельно с WAL.
- Плагин не активен после установки: проверить
memory.provider: ob2hв config.yaml и
ob2h plugin status; провал prefetch НЕ роняет агент — падение в тихий Mode 0.
- project_* — всегда передавай `id` явно. Без
idсервер молча подставляет
«активный проект» своей сессии (Zero-Config-привязка к воркспейсу IDE): скан/поиск уходят в чужой проект и возвращают 0 результатов. Симптом: в логе есть «Зарегистрирован проект …», но нет «Начало AST-сканирования проекта '<id>'», в БД projects.last_scanned_at=NULL. Долгий скан через project_scan не падает по таймауту: ответ «still running» → полли project_scan_status id=<id>, пока не придёт «job: done» (или «job: failed» с причиной).
- Синк после перерыва: watermark (sync_state.last_export_at) может «перепрыгнуть»
записи, вставленные ПОСЛЕ последнего экспорта, но ДО его завершения — они выпадают из дельт навсегда. Диагностика: сверка ключей памяти обеих сторон read-only sqlite (file:...?mode=ro), лечение: откат курсора в sync_state на дату пропуска + обычный (НЕ --full) экспорт.
- `sync export --full` на VPS с RAM < 8 ГБ = OOM-kill (exit 137): полный бандл
несёт весь граф (600k+ узлов). Карантин: data/sync/oversize/ вне inbox, чтобы ночной apply-inbox не падал. Дельту за месяц тоже может раздуть граф — если нужен только перенос памяти, собрать минимальный бандл вручную (header + строки mem/mlink), уникальный bundle_id обязателен — скопированный из эталона даст no-op «уже применён».
- `sync verify` требует в peers.json пира `data_dir` и `bin` (удалённая сторона
выполняет OB2H_DATA_DIR=<data_dir> <bin> sync local-stats); без них — ошибка.
- При импорте на другой стороне через scp — файл кладётся в inbox пира,
применяется его sync apply-inbox; прямой sync import <файл> на удалённой машине тоже работает.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/ob2h/SKILL.md
Popularity
- Repository stars
- 82
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/pofium/ob2h/ob2h)