[2026-09-15] eagle: personal/plans/hermes-whale-system-prompt.md personal/projects/personal-os/hermes-agent-improvements.md personal/tech/hermes-git-repo.md work/projects/cpm-web-extension-breakage-validation.md
This commit is contained in:
@@ -83,22 +83,29 @@ SOUL.md из HERMES_HOME независим и не участвует в это
|
||||
|
||||
---
|
||||
|
||||
## Отсутствующие возможности (opportunity)
|
||||
## Реализовано: prompt_overrides (2026-09-15)
|
||||
|
||||
Алекс предложил сделать стабильный слой конфигурируемым через файлы так же, как `memory_prompt.md`:
|
||||
- Вынести каждый хардкод-блок (hermes help, task completion, memory guidance, session search, skills guidance и т.д.) в отдельный `.md` файл
|
||||
- Добавить `prompt_overrides` секцию в config.yaml, где указывать пути к файлам
|
||||
- Если файла нет — fallback на хардкод
|
||||
Возможность, описанная здесь ранее как opportunity, **реализована**. Стабильный слой
|
||||
теперь конфигурируемый: каждый хардкод-блок вынесен в `.md` файл, маппинг — в
|
||||
`agent.prompt_overrides`. Если файла нет — fallback на хардкод.
|
||||
|
||||
Связанные файлы Hermes Agent:
|
||||
- `agent/system_prompt.py` — сборка system prompt, управляющая логика
|
||||
- `agent/prompt_builder.py` — константы и функции загрузки
|
||||
- `agent/agent_init.py` — чтение конфига и проброс
|
||||
Полное описание реализации: [[hermes-agent-improvements]] → секция «Вынос хардкода промптов в файлы».
|
||||
|
||||
---
|
||||
Кратко:
|
||||
- `agent/system_prompt.py` — функция `_load_prompt_block(agent, block_name, default)`, 7 констант заменены на её вызовы
|
||||
- `agent/agent_init.py` — чтение `agent.prompt_overrides` из конфига в `agent._prompt_overrides`
|
||||
- `~/.hermes/hermes-whale/config.yaml` — секция `agent.prompt_overrides` (7 путей)
|
||||
- `~/.hermes/hermes-whale/review/` — 7 файлов блоков + `memory_prompt.md`, `skill_prompt.md`
|
||||
|
||||
Итого вместо хардкода (см. таблицу stable-слоя выше) блоки #2–#8 читаются из файлов.
|
||||
Осталось в коде: `DEFAULT_AGENT_IDENTITY` (fallback), `GOOGLE_MODEL_OPERATIONAL_GUIDANCE`,
|
||||
`COMPUTER_USE_GUIDANCE`, `KANBAN_GUIDANCE`, `PLATFORM_HINTS`.
|
||||
|
||||
**Коммиты:** `hermes-agent` `207a1de16`, `~/.hermes` `7fd200c`.
|
||||
**Осталось:** перезапуск webhook — правки вступят в силу.
|
||||
|
||||
## Текущие ограничения
|
||||
|
||||
- webhook не имеет platform hint → может быть полезно добавить
|
||||
- Всё хардкоженое в `prompt_builder.py` нельзя переопределить без редактирования кода
|
||||
- Google-specific и kanban-блоки остаются хардкодом (неактуальны для Whale)
|
||||
- Нет `.hermes.md` / `AGENTS.md` в `/Users/admin/` — контекстный слой пуст
|
||||
|
||||
@@ -187,8 +187,8 @@ agent:
|
||||
2. ✅ Пропатчить `agent/system_prompt.py` — добавить `_load_prompt_block()` и заменить 7 констант
|
||||
3. ✅ Пропатчить `agent/agent_init.py` — пробросить `prompt_overrides` из конфига
|
||||
4. ✅ Обновить `config.yaml` — добавить `agent.prompt_overrides` (через копию, т.к. patch блокирован TIRITH)
|
||||
5. ⏸️ Перезапустить webhook (ждёт команды)
|
||||
6. ⏸️ Обновить Obsidian docs (этот шаг — выполнен)
|
||||
5. ✅ Закоммитить в git (2026-09-15): `hermes-agent` `207a1de16`, `~/.hermes` `7fd200c`
|
||||
6. ✅ Обновить Obsidian docs
|
||||
|
||||
### Проверка
|
||||
|
||||
@@ -201,6 +201,49 @@ agent:
|
||||
- **Конфиг всё равно просит аппрув** — при `cp` обратно TIRITH запрашивает подтверждение (overwrite project env/config file). Это нормально, нужно подтвердить.
|
||||
- **SOUL.md уже существует** — в Whale он лежит в `/Users/admin/.hermes/hermes-whale/SOUL.md`. Он НЕ выносится через prompt_overrides, т.к. уже является файлом и загружается отдельно через `load_soul_md()`.
|
||||
- **webhook не в PLATFORM_HINTS** — webhook нет в словаре `PLATFORM_HINTS` в `prompt_builder.py`, поэтому блок platform hints пустой. Это не менялось.
|
||||
- **Файлы review/*.md обязаны быть в git** — если они не закоммичены, подмены промпта теряются при любом восстановлении репо. Коммитить вместе с конфигом.
|
||||
|
||||
---
|
||||
|
||||
## Git-гигиена репозитория (2026-09-15)
|
||||
|
||||
При коммите состояния после prompt_overrides обнаружена утечка секретов и наведён порядок.
|
||||
Полное описание структуры и правил: [[hermes-git-repo]].
|
||||
|
||||
### Утечка, которую починили
|
||||
|
||||
`.env.bak` и `.env.new` (в корне и в `hermes-whale/`) содержали живые токены
|
||||
(TELEGRAM_BOT_TOKEN, OPENROUTER_API_KEY, DISCORD_BOT_TOKEN, ZULIP_API_KEY, DEEPSEEK_API_KEY),
|
||||
но `.gitignore` покрывал только `.env`. Один `git add .` затащил бы их в историю.
|
||||
|
||||
Также не игнорировался `webhook_subscriptions.json` — там per-endpoint секреты (16 символов).
|
||||
|
||||
**Fix:** расширены правила `.gitignore` (`.env` варианты, `webhook_subscriptions.json`,
|
||||
`config.yaml.bak*`, `node_modules/`). Проверка — `git check-ignore -v <file>`.
|
||||
|
||||
### Коммиты (2026-09-15)
|
||||
|
||||
| Репо | SHA | Сообщение |
|
||||
|------|-----|-----------|
|
||||
| `hermes-agent` | `207a1de16` | feat: load stable system-prompt blocks from config prompt_overrides |
|
||||
| `~/.hermes` | `7fd200c` | feat: wire prompt_overrides + whale-thread-guard multi-bot routing |
|
||||
| `~/.hermes` | `7893c35` | chore: sync skills — curator consolidation |
|
||||
| `~/.hermes` | `bdf84da` | chore(lsp): add vue/dockerfile/pyright/yaml language servers |
|
||||
| `~/.hermes` | `176ce9c` | chore: thread-scoped memory store + claude token refresh script |
|
||||
|
||||
Всё локально, **не запушено** (на момент коммита: `~/.hermes` ahead 8, `hermes-agent` ahead 20).
|
||||
|
||||
### Долги репозитория
|
||||
|
||||
1. `hermes-whale/lsp/node_modules/` — 39M бинарников в git, `.gitignore` не действует на отслеживаемые файлы.
|
||||
2. `channel_directory.json` — в `.gitignore`, но уже отслеживается.
|
||||
|
||||
### Плагин whale-thread-guard в том же коммите
|
||||
|
||||
Расширен с роутинга «Eagle/Whale» на **любого бота**: `@**BotName**` не Eagle → владение топиком
|
||||
переходит этому боту. Добавлен regex `_MENTION_RE` для детекции меншенов, словари имён
|
||||
(`WHALE_BOT_NAMES = {"Whale", "Кит"}`, `BALDA_BOT_NAMES = {"Балда", "Валера", "balda"}`).
|
||||
Стейт — `~/.hermes/thread_ownership.json`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
# Hermes — git-репозиторий конфига и агента
|
||||
|
||||
**Дата:** 2026-09-15
|
||||
**Статус:** актуально
|
||||
|
||||
## Структура (важно!)
|
||||
|
||||
Git-репозиторий лежит **в `~/.hermes/`**, а НЕ в `~/.hermes/hermes-whale/`.
|
||||
Это главный подвох: `git status` из `hermes-whale/` показывает пути вида `../config.yaml`,
|
||||
`../skills/` — потому что корень на уровень выше.
|
||||
|
||||
```
|
||||
~/.hermes/ ← git repo root (branch: main, origin/main)
|
||||
├── .gitignore
|
||||
├── .gitmodules
|
||||
├── config.yaml ← глобальный конфиг
|
||||
├── SOUL.md
|
||||
├── channel_directory.json ← в .gitignore, но УЖЕ ЗАКОММИЧЕН (см. долги)
|
||||
├── thread_ownership.json ← состояние whale-thread-guard плагина
|
||||
├── webhook_subscriptions.json ← секреты! в .gitignore (не коммитить)
|
||||
├── hermes-agent/ ← SUBMODULE: исходники Hermes Agent (Python)
|
||||
├── hermes-whale/ ← профиль Whale (конфиг + память + промпты)
|
||||
│ ├── config.yaml ← конфиг профиля Whale
|
||||
│ ├── SOUL.md ← идентичность Кита
|
||||
│ ├── review/ ← prompt_overrides: 7 .md блоков + memory/skill prompt
|
||||
│ ├── memories/
|
||||
│ │ ├── MEMORY.md, USER.md ← глобальные
|
||||
│ │ └── threads/<key>/MEMORY.md ← thread-scoped память
|
||||
│ ├── cron/jobs.json
|
||||
│ └── lsp/ ← ⚠️ 39M бинарников закоммичено (долг)
|
||||
├── memories/ ← глобальные (не профиля)
|
||||
├── plugins/whale-thread-guard/ ← роутинг ботов в Zulip
|
||||
├── scripts/refresh-claude-token.sh
|
||||
└── skills/ ← курируемые скиллы
|
||||
```
|
||||
|
||||
## Два репозитория
|
||||
|
||||
| Репо | Что | Ветка |
|
||||
|------|-----|-------|
|
||||
| `~/.hermes/` | Конфиг Whale, скиллы, память, плагины, пин сабмодуля | main |
|
||||
| `~/.hermes/hermes-agent/` | Исходники Hermes Agent (Python) — сабмодуль | main |
|
||||
|
||||
Правки Python-кода Hermes (`agent/*.py`) коммитятся **в сабмодуле**,
|
||||
затем в родительском репо обновляется пин: `git add hermes-agent`.
|
||||
Если пин не обновить — в родительском `git status` видно
|
||||
`hermes-agent (new commits, modified content)`, а сам сабмодуль чист.
|
||||
|
||||
**Как проверить, всё ли закоммичено:**
|
||||
```bash
|
||||
cd ~/.hermes && git status --porcelain | head
|
||||
cd ~/.hermes/hermes-agent && git status --porcelain # должно быть пусто
|
||||
```
|
||||
|
||||
## Правила .gitignore (обновлено 2026-09-15)
|
||||
|
||||
До 2026-09-15 игнорировался только `.env` — вариант `**`.env.bak`/`.env.new` НЕ покрывался,
|
||||
хотя в них лежали живые токены. Один `git add .` затащил бы их в историю.
|
||||
|
||||
Добавлены секции:
|
||||
|
||||
```gitignore
|
||||
# Secrets
|
||||
.env / .env.bak / .env.new / .env.local / .env.*.bak
|
||||
**/.env / **/.env.bak / **/.env.new
|
||||
|
||||
# Webhook subscriptions (содержат per-endpoint secret, 16 символов)
|
||||
webhook_subscriptions.json
|
||||
**/webhook_subscriptions.json
|
||||
|
||||
# Config/state бэкапы (могут содержать секреты)
|
||||
config.yaml.bak* / config.yaml.*.bak / config.yaml.whale-bak*
|
||||
config.yaml.work / config.yaml.transitional / config.yaml.corrupt*
|
||||
**/config.yaml.bak* / **/config.yaml.*.bak / **/config.yaml.whale-bak*
|
||||
*.tmp
|
||||
|
||||
# Node
|
||||
node_modules/ / **/node_modules/
|
||||
```
|
||||
|
||||
### Проверка игнора (обязательно после правки .gitignore)
|
||||
|
||||
```bash
|
||||
cd ~/.hermes && git check-ignore -v .env.bak .env.new \
|
||||
hermes-whale/.env.bak hermes-whale/.env.new \
|
||||
webhook_subscriptions.json config.yaml.bak
|
||||
```
|
||||
|
||||
Каждый файл должен вывести строку `.gitignore:<N>:<pattern>\t<file>`.
|
||||
|
||||
**Pitfall:** `.gitignore` НЕ влияет на уже отслеживаемые файлы.
|
||||
`hermes-whale/lsp/node_modules/` остаётся в репо несмотря на правило `node_modules/`.
|
||||
Вывод — применять `git add` по именам файлов, а не `git add .`, иначе новое правило
|
||||
может дать ложное чувство защиты.
|
||||
|
||||
## Что коммитить / что не коммитить
|
||||
|
||||
**Коммитим:**
|
||||
- `config.yaml`, `hermes-whale/config.yaml` — конфиги
|
||||
- `hermes-whale/review/*.md` — prompt_overrides (без них подмены промпта теряются!)
|
||||
- `hermes-whale/memories/`, `memories/` — память
|
||||
- `plugins/`, `skills/`, `scripts/`
|
||||
- `hermes-agent` (пин сабмодуля)
|
||||
|
||||
**Не коммитим (в .gitignore):**
|
||||
- `.env*` любые варианты
|
||||
- `webhook_subscriptions.json` — секреты
|
||||
- `config.yaml*.bak*` — 10+ бэкапов могут содержать секреты
|
||||
- `node_modules/`, `.restart_last_processed.json`, `config.yaml.zulip-router`
|
||||
- `lsp/`, `review/` в корне — дубликаты `hermes-whale/lsp/` и `hermes-whale/review/`
|
||||
|
||||
## Долги (не исправлено, требуют решения Alex)
|
||||
|
||||
1. **`hermes-whale/lsp/node_modules/` в git** — 39M бинарников + `gopls` 41MB.
|
||||
`.gitignore` не помогает (файлы уже отслеживаются). Чистка = `git rm -r --cached` + rewrite истории.
|
||||
2. **`channel_directory.json` в .gitignore, но отслеживается** — правило добавлено после коммита.
|
||||
В коммите `7fd200c` из него удалено 869 строк (файл в основном генерируемый).
|
||||
|
||||
## Команды
|
||||
|
||||
```bash
|
||||
# Статус обоих репо
|
||||
cd ~/.hermes && git status -sb
|
||||
cd ~/.hermes/hermes-agent && git status -sb
|
||||
|
||||
# Закоммитить Python-правки Hermes
|
||||
cd ~/.hermes/hermes-agent && git add agent/*.py && git commit -m "..."
|
||||
cd ~/.hermes && git add hermes-agent && git commit -m "chore: bump submodule"
|
||||
|
||||
# Проверить, что секреты не в истории
|
||||
cd ~/.hermes && git log --all --diff-filter=A --name-only --pretty=format: | grep '\.env'
|
||||
```
|
||||
|
||||
## Связанное
|
||||
|
||||
- [[hermes-whale-system-prompt]] — состав system prompt, prompt_overrides
|
||||
- [[hermes-agent-improvements]] — вынос хардкода промптов в файлы
|
||||
- [[hermes-memory-architecture]] — thread-scoped память
|
||||
Reference in New Issue
Block a user