[2026-06-25] taiga-vault: family/how-to/htpc-emulators-setup.md family/how-to/htpc-gaming-plans.md family/how-to/kraken-access.md family/how-to/openmediavault-rpi5.md family/how-to/time-machine.md family/how-to/wireguard-vpn.md personal/documents/todo-list.md personal/plans/extract-stable-prompt-blocks.md personal/plans/hermes-whale-system-prompt.md personal/plans/thread-scoped-memory.md
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
# Docker на Mac — проблема с диском и сборкой образов
|
||||
|
||||
_Последнее обновление: 2026-06-24_
|
||||
|
||||
## Сетап
|
||||
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| Движок | Colima (не Docker Desktop!) |
|
||||
| Гипервизор | macOS Virtualization.Framework |
|
||||
| Архитектура | arm64 |
|
||||
| CPU | **8 ядер** |
|
||||
| RAM | **24 GiB** |
|
||||
| Диск VM | **100 GiB** (sparse) |
|
||||
| Mount type | virtiofs |
|
||||
|
||||
## Проблема: контейнеры (особенно Zulip) зависают во время сборки Docker образов для Валеры
|
||||
|
||||
**Симптом:** Zulip перестаёт отвечать на вебхуки, RabbitMQ паникует, PostgreSQL тормозит.
|
||||
|
||||
## 🔴 Реальный корень — переполнение диска VM (не CPU, не bind mount)
|
||||
|
||||
### Структура диска Colima VM
|
||||
|
||||
`/dev/vdb1` (98 GiB, data disk) хранит `/var/lib/docker`:
|
||||
|
||||
```
|
||||
17 GB — /var/lib/docker (Colima data)
|
||||
├── 8.2 GB — rootfs/overlayfs ← слои всех образов
|
||||
├── 8.9 GB — volumes
|
||||
│ ├── 8.4 GB — buildx_buildkit_arm64builder0_state ← 🔴 build cache volume
|
||||
│ ├── 341 MB — zulip_zulip-pgdata
|
||||
│ ├── 85 MB — dangling volume
|
||||
│ ├── 46 MB — openclaw_postgres-data
|
||||
│ └── 38 MB — zulip_zulip-data
|
||||
└── остальное — containers, buildkit metadata
|
||||
```
|
||||
|
||||
### Build cache volume — 8.4 GB и не чистится сам
|
||||
|
||||
Docker BuildKit при использовании `buildx` хранит кеш слоёв в **Docker volume**, а не в overlayfs. Это volume `buildx_buildkit_arm64builder0_state`.
|
||||
|
||||
**Почему не чистится:**
|
||||
- `docker system prune` чистит только build cache records (метаданные), НЕ volume
|
||||
- BuildKit контейнер (`moby/buildkit:buildx-stable-1`) всегда running — volume считается активным
|
||||
- BuildKit GC policy не видит этот volume как «своё» хранилище (это Docker volume, не `/var/lib/buildkit`)
|
||||
- Без ручной очистки volume растёт с каждой сборкой и не уменьшается
|
||||
|
||||
**Почему аффектит контейнеры:**
|
||||
1. Каждая сборка Валеры добавляет новые слои в этот volume
|
||||
2. Volume растёт (8.4 GB и выше)
|
||||
3. Когда `/dev/vdb1` заполняется >85-90%:
|
||||
- Docker overlayfs + containerd snapshotter начинают тормозить
|
||||
- Запись новых слоёв фейлится или идёт в разы медленнее
|
||||
- PostgreSQL и RabbitMQ WAL не могут закоммититься
|
||||
- RabbitMQ Khepri (Raft) при проблемах с WAL сбрасывает состояние (пользователи пропадают)
|
||||
- Zulip отдаёт 500 на `/api/v1/register`
|
||||
- Контейнеры тупят или падают в restart loop
|
||||
|
||||
### Чистка build cache volume (безопасно)
|
||||
|
||||
```bash
|
||||
# Остановить buildkit контейнер, удалить volume, BuildKit пересоздаст при следующем билде
|
||||
docker rm -f buildx_buildkit_arm64builder0
|
||||
docker volume rm buildx_buildkit_arm64builder0_state
|
||||
```
|
||||
|
||||
Мониторинг заполненности диска VM:
|
||||
|
||||
```bash
|
||||
colima ssh -- df -h /dev/vdb1
|
||||
```
|
||||
|
||||
### Связанные документы
|
||||
- [[tech/docker_colima_setup]] — установка и автостарт Colima
|
||||
- [[projects/balda/setup]] — Balda агенты (Валера, Клавдий)
|
||||
- [[how-to/hermes-eagle-mac]] — Hermes на Mac, Zulip Docker стек (RabbitMQ pitfall про Khepri)
|
||||
- [[how-to/openmediavault-rpi5]] — build cache на RPi (та же проблема ENOSPC)
|
||||
@@ -1,5 +1,16 @@
|
||||
# Docker + Colima Autostart Setup (macOS)
|
||||
|
||||
_Последнее обновление: 2026-06-24_
|
||||
|
||||
## Текущие параметры Colima
|
||||
|
||||
```
|
||||
colima start --cpu 8 --memory 24 --disk 100
|
||||
```
|
||||
|
||||
- virtiofs mount type
|
||||
- Build cache volume `buildx_buildkit_arm64builder0_state` занимает до 8+ GB и не чистится автоматически. См. [[tech/docker-mac-disk-issues]].
|
||||
|
||||
## 1. Install dependencies
|
||||
|
||||
``` bash
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
# Hermes Memory Architecture
|
||||
|
||||
## Обзор
|
||||
|
||||
Hermes (Whale) использует **thread-scoped memory** + кастомную memory instruction. Глобальный профиль (`USER.md`) и thread-локальная память (`MEMORY.md`) — два независимых хранилища.
|
||||
|
||||
## Состав системного промпта
|
||||
|
||||
Собирается в `agent/system_prompt.py` из трёх слоёв: stable (кешируется на сессию), context (зависит от CWD), volatile (каждый раз свежий).
|
||||
|
||||
### Stable tier
|
||||
1. **SOUL.md** — не существует (Whale), используется `DEFAULT_AGENT_IDENTITY`.
|
||||
2. **HERMES_AGENT_HELP_GUIDANCE** — ссылка на `https://hermes-agent.nousresearch.com/docs`.
|
||||
3. **TASK_COMPLETION_GUIDANCE** — «Finishing the job»: не фабриковать, не останавливаться на стабах.
|
||||
4. **Tool-aware guidance**:
|
||||
- `MEMORY_GUIDANCE` — declarative facts, не imperative, не task progress.
|
||||
- `SESSION_SEARCH_GUIDANCE` — искать в прошлом session_search.
|
||||
- `SKILLS_GUIDANCE` — сохранять сложные подходы как skills, патчить устаревшие.
|
||||
5. **Tool-use enforcement** — `TOOL_USE_ENFORCEMENT_GUIDANCE` + per-model operational guidance (deepseek → `OPENAI_MODEL_EXECUTION_GUIDANCE`).
|
||||
6. **Skills prompt** — список доступных скиллов из `~/.hermes/skills/`.
|
||||
7. **Environment hints** — macOS, home, cwd.
|
||||
8. **Active profile hint** — «default», +предупреждение не лезть в чужие профили.
|
||||
9. **Platform hints** — зависит от платформы (zulip/telegram/webhook/webui...).
|
||||
|
||||
### Context tier
|
||||
10. **system_message** — от платформы (например, содержимое входящего сообщения).
|
||||
11. **Context files** — `AGENTS.md`, `.cursorrules`, `.hermes.md` из `TERMINAL_CWD`.
|
||||
|
||||
### Volatile tier (не кешируется)
|
||||
12. **Memory** — thread-scoped MEMORY.md.
|
||||
13. **USER.md** — глобальный профиль.
|
||||
14. **Custom memory instruction** — `~/.hermes/hermes-whale/review/memory_prompt.md`.
|
||||
15. **Таймстемп** — дата старта, session ID, model, provider.
|
||||
|
||||
### Файлы конфигурации и кастомные промпты
|
||||
- `~/.hermes/hermes-whale/review/skill_prompt.md` — инжектится в background review (skill review).
|
||||
- `~/.hermes/hermes-whale/review/memory_prompt.md` — memory instruction.
|
||||
- `prefill_messages_file` — не задан.
|
||||
- `personalities` — пусто.
|
||||
- `hooks` — пусто.
|
||||
|
||||
|
||||
## Конфигурация
|
||||
|
||||
Файл: `~/.hermes/hermes-whale/config.yaml`
|
||||
|
||||
```yaml
|
||||
memory:
|
||||
memory_enabled: true
|
||||
user_profile_enabled: true
|
||||
memory_char_limit: 3000
|
||||
user_char_limit: 1375
|
||||
provider: ''
|
||||
nudge_interval: 10
|
||||
flush_min_turns: 6
|
||||
thread_scoped: true # изолированная память по треду
|
||||
prompt_path: ~/.hermes/hermes-whale/review/memory_prompt.md # кастомная инструкция
|
||||
```
|
||||
|
||||
## Файловая структура
|
||||
|
||||
```
|
||||
~/.hermes/hermes-whale/memories/
|
||||
├── MEMORY.md # глобальная (fallback для CLI/старых сессий)
|
||||
├── USER.md # глобальная (всегда)
|
||||
└── threads/
|
||||
├── agent:main:webhook:webhook:webhook:whale/
|
||||
│ └── MEMORY.md # память конкретного треда
|
||||
└── ...
|
||||
```
|
||||
|
||||
## Memory prompt
|
||||
|
||||
Файл: `~/.hermes/hermes-whale/review/memory_prompt.md`
|
||||
|
||||
### Что запоминать
|
||||
1. Документы — file paths, что изменено, почему.
|
||||
2. **После загрузки Obsidian docs** — извлекать ключевые факты в memory.
|
||||
3. Команды и инструменты — нетривиальные CLI вызовы, форматы конфигов.
|
||||
4. Статус проекта — completed, pending, blockers, next steps.
|
||||
5. Предпочтения пользователя — коррекции, фидбек.
|
||||
6. Факты окружения — пакеты, порты, пути до credentials (не сами secrets).
|
||||
7. Решения и обоснование выбора подхода.
|
||||
8. Конфиг изменения — ключи/значения/пути.
|
||||
|
||||
### Что НЕ запоминать
|
||||
- Временный debugging noise.
|
||||
- "Сейчас в процессе задачи X" — session_search покрывает.
|
||||
- Очевидные факты (rediscover за 2 сек).
|
||||
- Negative claims о сломанных инструментах — становятся persistent self-imposed constraints.
|
||||
|
||||
### Особенности редактирования
|
||||
- `patch()` для точных замен, но не перенумеровывает списки.
|
||||
- После вставки пункта mid-list — проверить нумерацию, делать второй clean patch.
|
||||
|
||||
## Команды
|
||||
|
||||
```bash
|
||||
# Проверить текущую память
|
||||
cat ~/.hermes/hermes-whale/memories/USER.md
|
||||
cat ~/.hermes/hermes-whale/memories/MEMORY.md
|
||||
|
||||
# Структура файлов памяти
|
||||
find ~/.hermes/hermes-whale/memories -type f -name "*.md"
|
||||
|
||||
# Редактировать prompt (через patch или write_file)
|
||||
```
|
||||
|
||||
## Связанное
|
||||
|
||||
- [[thread-scoped-memory]] — план реализации.
|
||||
- `personal/plans/thread-scoped-memory.md` — детали тестов, pitfalls, коммиты.
|
||||
@@ -0,0 +1,222 @@
|
||||
# Hermes Self-Improvement Review (Background Memory/Skill Review)
|
||||
|
||||
Source: codebase analysis of `hermes-agent/agent/background_review.py`, `run_agent.py`, `agent/conversation_loop.py`, `agent/agent_init.py`.
|
||||
|
||||
## Что это
|
||||
|
||||
После каждого юзерского сообщения ([run_conversation](https://github.com/NousResearch/hermes-agent)) AIAgent может запустить **фоновый daemon-thread**, который форкает ещё один AIAgent, даёт ему снимок всего разговора и просит оценить — нужно ли сохранить что-то в память (Memory) или обновить/создать скилл (Skill).
|
||||
|
||||
Основной поток продолжается немедленно. Ревью не блокирует пользователя.
|
||||
|
||||
## Where it lives
|
||||
|
||||
| File | Lines | Role |
|
||||
|------|-------|------|
|
||||
| `agent/background_review.py` | 1–597 | Центральный модуль — промпты, `_run_review_in_thread`, `spawn_background_review_thread`, `summarize_background_review_actions` |
|
||||
| `run_agent.py` | 1360–1400 | Форвардеры: `_spawn_background_review`, `_summarize_background_review_actions`, импорт констант-промптов |
|
||||
| `agent/conversation_loop.py` | 4779–4805 | Место вызова — после завершения ответа, перед возвратом `result` |
|
||||
| `agent/codex_runtime.py` | 150–162 | Аналогичный вызов для Codex Response API режима |
|
||||
| `agent/agent_init.py` | 1067–1075, 1187–1190 | Инициализация счётчиков и интервалов |
|
||||
| `agent/tool_executor.py` | 207–209, 776–778 | Сброс счётчиков при вызове `memory` или `skill_manage` |
|
||||
| `tui_gateway/server.py` | 2452–2464 | Подключение `background_review_callback` для TUI (Ink) |
|
||||
| `gateway/run.py` | 17849–17893 | Подключение `background_review_callback` для gateway-сообщений |
|
||||
|
||||
## Как триггерится
|
||||
|
||||
Два независимых счётчика:
|
||||
|
||||
### Memory review (turn-based)
|
||||
|
||||
- Счётчик: `_turns_since_memory`
|
||||
- Интервал: `_memory_nudge_interval` (default = **10**)
|
||||
- Задаётся из `config.yaml: memory.nudge_interval`
|
||||
- Инкрементится **в начале** каждого `run_conversation` (строка 559)
|
||||
- Проверка: `if _turns_since_memory >= _memory_nudge_interval` → `_should_review_memory = True`
|
||||
- Сброс: при вызове `memory` tool (строка 207 в tool_executor.py)
|
||||
- Условия: `"memory" in valid_tool_names` и `_memory_store != None`
|
||||
|
||||
Если `memory_enabled: false` → ревью не триггерится.
|
||||
|
||||
### Skills review (iteration-based)
|
||||
|
||||
- Счётчик: `_iters_since_skill`
|
||||
- Интервал: `_skill_nudge_interval` (default = **10**)
|
||||
- Инкрементится **внутри tool-call цикла** после каждого батча (строка 860)
|
||||
- Проверка: `if _iters_since_skill >= _skill_nudge_interval` → `_should_review_skills = True`
|
||||
- Сброс: при вызове `skill_manage` tool (строки 209, 778 в tool_executor.py)
|
||||
- Условия: `"skill_manage" in valid_tool_names`
|
||||
|
||||
### Финальная проверка
|
||||
|
||||
```python
|
||||
if final_response and not interrupted and (_should_review_memory or _should_review_skills):
|
||||
agent._spawn_background_review(
|
||||
messages_snapshot=list(messages),
|
||||
review_memory=_should_review_memory,
|
||||
review_skills=_should_review_skills,
|
||||
)
|
||||
```
|
||||
|
||||
## Что происходит внутри
|
||||
|
||||
### `_run_review_in_thread` (background_review.py:327–559)
|
||||
|
||||
1. **Создаёт форк AIAgent**, наследуя:
|
||||
- `model`, `provider`, `base_url`, `api_key`, `credential_pool` от родителя (чтобы попасть в тот же prefix cache у Anthropic/OpenRouter)
|
||||
- `_cached_system_prompt` — byte-идентичный, чтобы не разогревать кеш заново
|
||||
- `session_id`, `session_start` — те же
|
||||
- `_memory_store`, `_memory_enabled`, `_user_profile_enabled` — те же
|
||||
- Но `skip_memory=True` (чтобы форк не создавал свой MemoryManager)
|
||||
- `_memory_nudge_interval = 0`, `_skill_nudge_interval = 0` (чтобы не рекурсил)
|
||||
|
||||
2. **Устанавливает tool whitelist** (строки 459–472):
|
||||
```python
|
||||
review_whitelist = {
|
||||
t["function"]["name"]
|
||||
for t in get_tool_definitions(
|
||||
enabled_toolsets=["memory", "skills"],
|
||||
quiet_mode=True,
|
||||
)
|
||||
}
|
||||
```
|
||||
Вне whitelist — всё блокируется с сообщением `"Background review denied non-whitelisted tool: ..."`
|
||||
|
||||
3. **Запускает** `review_agent.run_conversation(...)` с:
|
||||
- Выбранным промптом (см. ниже) + суффикс `"You can only call memory and skill management tools. Other tools will be denied at runtime — do not attempt them."`
|
||||
- `conversation_history=messages_snapshot` — весь разговор до этого момента
|
||||
- `max_iterations=16` (жёстко, не из конфига)
|
||||
|
||||
4. **После завершения** — собирает успешные tool-результаты через `summarize_background_review_actions()`, фильтруя те, что уже были в `messages_snapshot` (чтобы не показывать старые как новые).
|
||||
|
||||
5. **Выводит** пользователю:
|
||||
```python
|
||||
f" 💾 Self-improvement review: {summary}"
|
||||
# Например: "💾 Self-improvement review: Memory updated · Skill 'xxx' patched"
|
||||
```
|
||||
Через `agent._safe_print()` и через `agent.background_review_callback()` (для TUI/gateway).
|
||||
|
||||
6. **На ошибках** — пишет в лог `"Background memory/skill review failed: ..."` и шлёт `_emit_auxiliary_failure`. Не ломает основной разговор.
|
||||
|
||||
## 3 варианта промпта
|
||||
|
||||
Выбираются в `spawn_background_review_thread()` по комбинации флагов:
|
||||
|
||||
| `review_memory` | `review_skills` | Промпт | Суть |
|
||||
|---|---|---|---|
|
||||
| ✅ | ❌ | `_MEMORY_REVIEW_PROMPT` (~10 строк) | Сохранить факты о пользователе (persona, preferences, style). Если нечего — 'Nothing to save.' |
|
||||
| ❌ | ✅ | `_SKILL_REVIEW_PROMPT` (~120 строк) | Самая большая инструкция. Искать сигналы: коррекции, frustration, новые техники, устаревшие скиллы. Приоритет: loaded skill → existing umbrella → support file → new umbrella. Запрещено: env-зависимости, негативные фиксации, session-specific. |
|
||||
| ✅ | ✅ | `_COMBINED_REVIEW_PROMPT` (~80 строк) | Смесь обоих — сначала memory, потом skills с той же логикой. |
|
||||
|
||||
## Потенциальные проблемы
|
||||
|
||||
- **Нет конфигурируемости для skills interval** — `_skill_nudge_interval` хардкожен в 10, не читается из config.yaml (в отличие от memory).
|
||||
- **Tool whitelist был фиксирован** — теперь настраивается через `review.allowed_toolsets` в config.yaml (см. ниже).
|
||||
- **Форк не имеет MCP-серверов** — MCP tools (obsidian-mcp, etc.) не регенерируются в форке.
|
||||
- **max_iterations=16** — жёстко, не из конфига. Может не хватить на комплексное ревью многоскилловых сессий.
|
||||
|
||||
## Реализованные расширения (2026-06-24)
|
||||
|
||||
Сделаны два изменения в исходном коде Hermes Agent для того, чтобы промпты и whitelist ревью были настраиваемы из `config.yaml`:
|
||||
|
||||
### 1. agent_init.py — чтение секции `review:` из config.yaml
|
||||
|
||||
Место: `agent/agent_init.py` (после блока skills config).
|
||||
|
||||
Читает секцию:
|
||||
```yaml
|
||||
review:
|
||||
# Пути к .md файлам с кастомными промптами.
|
||||
# Если файл не найден/не читается — тихо падает на встроенный хардкод.
|
||||
skill_prompt_path: ~/.hermes/review/skill_prompt.md
|
||||
memory_prompt_path: ~/.hermes/review/memory_prompt.md
|
||||
combined_prompt_path: ~/.hermes/review/combined_prompt.md
|
||||
|
||||
# Какие toolsets доступны форку ревью.
|
||||
# По дефолту: ["memory", "skills"].
|
||||
# Чтобы форк мог читать/писать .md файлы Obsidian — добавить "file".
|
||||
allowed_toolsets:
|
||||
- memory
|
||||
- skills
|
||||
# - file
|
||||
```
|
||||
|
||||
Что делает код:
|
||||
|
||||
1. Выставляет `agent._review_allowed_toolsets` (по дефолту `["memory", "skills"]`)
|
||||
2. Для каждого из трёх путей (`skill_prompt_path`, `memory_prompt_path`, `combined_prompt_path`) — пытается прочитать файл и записать содержимое в `agent._SKILL_REVIEW_PROMPT` / `agent._MEMORY_REVIEW_PROMPT` / `agent._COMBINED_REVIEW_PROMPT` соответственно.
|
||||
3. Если путь не указан, файл не найден или не читается — тихо игнорируется, остаётся встроенный хардкод.
|
||||
|
||||
### 2. background_review.py — использование `_review_allowed_toolsets` с инстанса
|
||||
|
||||
Место: `agent/background_review.py`, функция `_run_review_in_thread`, whitelist (строка ~459).
|
||||
|
||||
**Было:**
|
||||
```python
|
||||
review_whitelist = {
|
||||
t["function"]["name"]
|
||||
for t in get_tool_definitions(
|
||||
enabled_toolsets=["memory", "skills"],
|
||||
quiet_mode=True,
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
**Стало:**
|
||||
```python
|
||||
_allowed_sets = getattr(agent, "_review_allowed_toolsets", ["memory", "skills"])
|
||||
review_whitelist = {
|
||||
t["function"]["name"]
|
||||
for t in get_tool_definitions(
|
||||
enabled_toolsets=_allowed_sets,
|
||||
quiet_mode=True,
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
А также сообщение для форка динамически подставляет имена toolsets вместо хардкода `"memory and skill"`.
|
||||
|
||||
### 3. Примеры промптов
|
||||
|
||||
Созданы в `~/.hermes/review/`:
|
||||
|
||||
- **`skill_prompt.md`** — копия встроенного `_SKILL_REVIEW_PROMPT` + секция `--- Obsidian documentation update ---`, которая инструктирует форк после каждого обновления скилла читать и патчить соответствующий `.md` в `/Users/admin/obsidian/`.
|
||||
- **`memory_prompt.md`** — копия `_MEMORY_REVIEW_PROMPT` + инструкция обновлять `personal/profiles/Alex.md` при сохранении user preference.
|
||||
|
||||
### Как включить Obsidian-обновление
|
||||
|
||||
1. Раскомментировать в `~/.hermes/config.yaml`:
|
||||
```yaml
|
||||
review:
|
||||
skill_prompt_path: ~/.hermes/review/skill_prompt.md
|
||||
memory_prompt_path: ~/.hermes/review/memory_prompt.md
|
||||
allowed_toolsets:
|
||||
- memory
|
||||
- skills
|
||||
- file
|
||||
```
|
||||
2. Перезапустить Hermes (новый сессионный конфиг прочитается при старте `AIAgent.__init__`).
|
||||
3. После каждого десятого tool-батча (или любого вызова `skill_manage` раньше) форк будет: создать/обновить скилл **и** прочитать/пропатчить соответствующий Obsidian-документ через `read_file`/`patch`.
|
||||
|
||||
### Замечание по архитектуре
|
||||
|
||||
File tools работают напрямую с файловой системой, в обход obsidian-mcp. Это значит:
|
||||
- **Линки** `[[wiki]]` в Obsidian не резолвятся автоматически — форк видит сырой `.md`.
|
||||
- **Frontmatter** (YAML заголовки) — видит как часть текста, может патчить.
|
||||
- **Vault search** недоступен — только прямой путь к файлу.
|
||||
|
||||
Для большинства задач (пропатчить существующий doc, создать новый .md с frontmatter) file tools достаточно. Если нужен полный Obsidian API — надо дорабатывать подключение MCP в форке (Вариант B из первоначального исследования, пока не реализован).
|
||||
|
||||
## Related files
|
||||
|
||||
- `~/.hermes/hermes-whale/review/skill_prompt.md` — кастомный skills промпт с Obsidian-инструкцией (для всех артефактов: планы, конфиги, этапы проектов)
|
||||
- `~/.hermes/hermes-whale/review/memory_prompt.md` — кастомный memory промпт с Obsidian-инструкцией
|
||||
- `agent/agent_init.py` — чтение секции `review:` из config.yaml
|
||||
- `agent/background_review.py` — использование `_review_allowed_toolsets` и кастомных промптов
|
||||
- Config: `config.yaml → review.*` (см. секцию выше)
|
||||
|
||||
## Хронология
|
||||
|
||||
- 2026-06-24: Исследование и документирование механизма self-improvement review (Whale/Alex).
|
||||
- 2026-06-24: Реализация настройки через config.yaml: промпты (через пути к .md) + allowed_toolsets. Созданы примеры промптов с Obsidian-инструкцией.
|
||||
- 2026-06-24: Реализация thread-scoped memory + custom memory instruction (см. `personal/plans/thread-scoped-memory.md`).
|
||||
- 2026-06-24: Тесты thread-scoped memory: 9 новых тестов (76/76 passed), закоммичено в `4ebad4f69`.
|
||||
@@ -0,0 +1,104 @@
|
||||
# Obsidian MCP implementation ecosystem (2026)
|
||||
|
||||
Обзор активных реализаций Obsidian MCP серверов по состоянию на июнь 2026. Три архитектурных подхода, ~8 проектов с traction.
|
||||
|
||||
## Три архитектуры
|
||||
|
||||
| Подход | Примеры | Obsidian нужен? | Плюсы | Минусы |
|
||||
|--------|---------|----------------|-------|--------|
|
||||
| **Direct filesystem** | mcpvault, obsidian-mcp (Steven) | Нет | Простота, работает без Obsidian | Нет доступа к внутреннему API Obsidian |
|
||||
| **Local REST API plugin** | mcp-obsidian (Markus), cyanheads | Да (должен быть открыт) | Obsidian опосредует операции | Нужен плагин + API key |
|
||||
| **Native Obsidian plugin** | obsidian-mcp-plugin (aaronsb) | Да (должен быть открыт) | Полный API: граф, Dataview, Bases | Менее зрелый, только через BRAT |
|
||||
|
||||
## Детальный обзор
|
||||
|
||||
### 1. @bitbonsai/mcpvault (наш текущий) — filesystem
|
||||
|
||||
- **npm:** `@bitbonsai/mcpvault` (бывший `obsidian-mcp`, переименован март 2026 из-за trademark)
|
||||
- **Версия:** 0.12.1 (июнь 2026)
|
||||
- **Язык:** TypeScript
|
||||
- **Транспорт:** stdio только
|
||||
- **Инструменты:** 14: read_note, write_note, patch_note, list_directory, delete_note, search_notes, move_note, move_file, read_multiple_notes, update_frontmatter, get_notes_info, get_frontmatter, manage_tags, get_vault_stats, list_all_tags
|
||||
- **Проблема:** exact string match в patch_note (`fullContent.split(oldString).length - 1`), без fuzzy, без trim, без нормализации whitespace
|
||||
|
||||
### 2. cyanheads/obsidian-mcp-server — REST API, самый популярный по загрузкам
|
||||
|
||||
- **npm:** `obsidian-mcp-server`
|
||||
- **Версия:** 3.2.8 (май 2026)
|
||||
- **★:** 603 | **dl/week:** ~9,776 (самые высокие)
|
||||
- **Язык:** TypeScript, Bun/Node.js v24+
|
||||
- **Транспорт:** stdio + Streamable HTTP (dual)
|
||||
- **Инструменты:** 14
|
||||
- **Требует:** Obsidian Local REST API plugin v4.0.0+
|
||||
- **Ключевые фичи:**
|
||||
- `obsidian_replace_in_note` — regex, whole-word, flexible whitespace, case-sensitivity, capture groups. **Решает проблему exact match**.
|
||||
- `obsidian_patch_note` — surgical append/prepend/replace по heading/block/frontmatter
|
||||
- Path policy (folder-scoped permissions через env vars: OBSIDIAN_READ_PATHS, OBSIDIAN_WRITE_PATHS)
|
||||
- In-memory vault cache (configurable, default 10 min)
|
||||
- JWT/OAuth аутентификация
|
||||
- Structured logging с file rotation
|
||||
- Zod schema validation
|
||||
- Docker support (`ghcr.io/cyanheads/obsidian-mcp-server`)
|
||||
- **Вердикт:** самый production-ready
|
||||
|
||||
### 3. MarkusPfundstein/mcp-obsidian — REST API, Python
|
||||
|
||||
- **npm:** `mcp-obsidian` (Python, через uvx)
|
||||
- **★:** ~3,700 (самые звёзды)
|
||||
- **Язык:** Python 100%
|
||||
- **Транспорт:** stdio
|
||||
- **Статус:** был 17 месяцев мёртв, вернулся 15 мая 2026. Но npm всё ещё v1.0.0.
|
||||
- **Инструменты:** 7 (list_files, get_file_contents, search, patch_content, append_content, delete_file)
|
||||
- **Известные баги:** patch_content timeout/validation (#9), UTF-8 failures (#25), Dataview dependency (#70), нет multi-vault (#63)
|
||||
- **Вердикт:** watch — viable если выйдет новый npm release
|
||||
|
||||
### 4. aaronsb/obsidian-mcp-plugin (Semantic Notes Vault MCP) — native plugin
|
||||
|
||||
- **★:** 423
|
||||
- **Версия:** 0.11.33 (13 релизов с 20 апреля, очень активен)
|
||||
- **Язык:** TypeScript (плагин Obsidian)
|
||||
- **Транспорт:** HTTP (порт 3001/3443)
|
||||
- **Инструменты:** 8 категорий (vault, edit, view, graph, workflow, dataview, bases, system)
|
||||
- **Ключевые фичи:**
|
||||
- **Fuzzy text matching** для edits — прямо в описании
|
||||
- Graph traversal (multi-hop, backlinks, forward-links, path finding)
|
||||
- Dataview DQL execution
|
||||
- Bases database operations
|
||||
- Read-only mode
|
||||
- mcpb one-click install для Claude Desktop
|
||||
- **Минус:** Obsidian должен быть открыт. Установка через BRAT (не в community store).
|
||||
- **Вердикт:** если нужен graph/Dataview/Bases — лучший выбор
|
||||
|
||||
### 5. Local REST API v4.0.0+ built-in MCP
|
||||
|
||||
- **Плагин:** `coddingtonbear/obsidian-local-rest-api` (★ 2.5k)
|
||||
- **Версия:** v4.1.3 (июнь 2026)
|
||||
- С апреля 2026: Local REST API сам стал MCP сервером на `/mcp/`
|
||||
- **15 tools** (file CRUD, search, tagging, commands, open-in-ui)
|
||||
- **Транспорт:** Streamable HTTP
|
||||
- **Требует:** только установку плагина + API key (никаких дополнительных пакетов)
|
||||
|
||||
### 6. Minhao-Zhang/obsidian-mcp-server — WIP plugin
|
||||
|
||||
- **★:** 13
|
||||
- **Версия:** v1.1.0 (апрель 2025 — заброшен)
|
||||
- **Статус:** WIP. Автор: «я не знаю TypeScript». Не рекомендуется.
|
||||
|
||||
## Остальные
|
||||
|
||||
Всего ~79 Obsidian-связанных MCP серверов на PulseMCP, но ~8 имеют traction. Большинство — клоны/форки mcpvault или mcp-obsidian.
|
||||
|
||||
## Рекомендация от 2026-06-24
|
||||
|
||||
**Лучший апгрейд без смены архитектуры — cyanheads/obsidian-mcp-server.**
|
||||
|
||||
Почему:
|
||||
1. Решает exact match проблему — `obsidian_replace_in_note` с regex и flexible whitespace
|
||||
2. Самая высокая загрузка (9.7K dl/week) — стабильность доказана
|
||||
3. Dual transport (можно через stdio как Hermes native MCP, можно HTTP)
|
||||
4. Path policy — можно ограничить запись только определёнными папками
|
||||
5. Docker support
|
||||
|
||||
Минус: требует Obsidian открытым (Local REST API плагин).
|
||||
|
||||
**Если не хочется ставить плагин:** остаться на mcpvault + Hermes `patch()` для сложных строк.
|
||||
Reference in New Issue
Block a user