refactor: harness CLI — объект первым, действие вторым

- грамматика: harness <объект> <действие> (skills / agents / mcp / catalog / hermes / opencode)
- skills list теперь показывает каталог: что доступно к установке, с отметками ✓/·
- skills installed — прежний вид «что реально стоит» (включая не из каталога)
- фикс: установленные скиллы не находились — Path.rglob не разворачивает симлинки, перешёл на os.walk(followlinks=True)
- в листинге каталога виден sha источника и признак «⚠ сдвинут»
- README переписан под новую грамматику
This commit is contained in:
eka
2026-09-23 12:38:55 +05:00
parent 7e2ea5a275
commit da70365701
2 changed files with 464 additions and 310 deletions
+117 -92
View File
@@ -6,44 +6,99 @@
```
dev/harness/
├── agents/ # Определения агентов OpenCode (leader, fixer, devops, admin, ...)
├── agents/ # Определения агентов OpenCode (leader, fixer, devops, admin, ...)
├── catalog/ # Скиллы: git submodule'ы на внешние репы
│ ├── jakubkrehel-skills/ # → github.com/jakubkrehel/skills (11 скиллов UI)
│ └── developer-documentation-skill/ # → NateBJones-Projects/… (доки; ставится вручную)
├── scripts/
│ └── harness # Основной CLI-скрипт
│ └── harness # Основной CLI-скрипт
└── README.md
```
## Грамматика
**Объект — первым, действие — вторым:** `harness <объект> <действие> [аргументы]`
| Объект | Что это | Действия |
|--------|---------|----------|
| `status` | среда целиком | — |
| `skills` | скиллы из каталога | `list`, `installed`, `install`, `remove` |
| `agents` | агенты (только OpenCode) | `list`, `install`, `remove` |
| `mcp` | MCP-серверы Hermes | `list`, `add`, `rm` |
| `catalog` | внешние репозитории каталога | `list`, `update` |
| `hermes` | сам Hermes | `config`, `restart`, `update` |
| `opencode` | сам OpenCode | `install`, `restart` |
```bash
./scripts/harness status
./scripts/harness skills list
./scripts/harness skills install jakubkrehel-skills better-ui --target all
./scripts/harness agents install leader
./scripts/harness mcp list
./scripts/harness catalog update
./scripts/harness hermes restart
```
## Быстрый старт
```bash
./scripts/harness status # Статус всей среды
./scripts/harness list catalog # Что есть в каталоге скиллов
./scripts/harness list skills # Установленные скиллы
./scripts/harness list agents # Агенты: доступные в репо + установленные
./scripts/harness list mcp # MCP-серверы Hermes
./scripts/harness status # Обзор среды
./scripts/harness skills list # Что доступно в каталоге (+ отметки установки)
./scripts/harness skills installed # Что реально стоит у агентов
./scripts/harness agents list # Агенты: доступные в репо + установленные
./scripts/harness mcp list # MCP-серверы Hermes
./scripts/harness catalog list # Источники каталога
```
## Команды
## `skills` — скиллы из каталога
### Установка скиллов
### `skills list` — что доступно к установке
Показывает содержимое каталога и где скилл уже стоит. `✓` — установлено, `·` — нет.
```bash
# Установить скилл из каталога
./scripts/harness install skill jakubkrehel-skills better-ui --target opencode
./scripts/harness install skill jakubkrehel-skills better-ui --target hermes
./scripts/harness install skill jakubkrehel-skills better-ui --target all
# Можно писать через слэш
./scripts/harness install skill jakubkrehel-skills/better-ui --target all
# Все скиллы из репозитория разом
./scripts/harness install skill jakubkrehel-skills --all --target opencode
./scripts/harness install skill jakubkrehel-skills --all --target all
./scripts/harness skills list
./scripts/harness skills list --target opencode
```
Скиллы ставятся симлинками в соответствующие директории:
```
Доступно из каталога (/mnt/data/Agent/dev/harness/catalog)
✓ — установлено, · — нет
jakubkrehel-skills 11 скиллов 267330e
├─ better-ui hermes · opencode ✓
├─ better-colors hermes · opencode ·
...
```
Для git-источников показывается короткий sha; `⚠ сдвинут` — submodule ушёл вперёд
и это ещё не закоммичено.
### `skills installed` — что реально стоит
Полное дерево каталогов агента, включая скиллы не из каталога.
```bash
./scripts/harness skills installed
./scripts/harness skills installed --target hermes
```
### `skills install` / `skills remove`
```bash
# Один скилл
./scripts/harness skills install jakubkrehel-skills better-ui --target opencode
./scripts/harness skills install jakubkrehel-skills/better-ui --target all
# Все скиллы источника
./scripts/harness skills install jakubkrehel-skills --all --target opencode
# Удалить
./scripts/harness skills remove better-ui
./scripts/harness skills remove better-ui --target hermes
```
Скиллы ставятся **симлинками**:
| Агент | Куда ставится |
|-------|--------------|
@@ -51,33 +106,21 @@ dev/harness/
| OpenCode | `~/.claude/skills/<name>/` |
| OpenCode | `~/.config/opencode/skills/<name>/` |
### Управление скиллами
```bash
./scripts/harness list skills # Все скиллы
./scripts/harness list skills --target hermes # Только Hermes
./scripts/harness remove skill better-ui # Удалить отовсюду
./scripts/harness remove skill better-ui --target hermes
```
### Агенты (только OpenCode)
## `agents` — агенты (только OpenCode)
Источник — `harness/agents/*.md`. Имя агента = имя файла без `.md`.
```bash
# Список: что есть в репо + что уже установлено
./scripts/harness list agents
./scripts/harness list agents --scope global # только глобальные
./scripts/harness list agents --scope project --project ~/work/myrepo
./scripts/harness agents list
./scripts/harness agents list --scope global
./scripts/harness agents list --scope project --project ~/work/myrepo
# Установить одного / всех
./scripts/harness install agent leader # в ~/.config/opencode/agents/
./scripts/harness install agent --all --scope global # всех, глобально
./scripts/harness install agent devops --scope project --project ~/work/myrepo
./scripts/harness agents install leader # в ~/.config/opencode/agents/
./scripts/harness agents install --all --scope global
./scripts/harness agents install devops --scope project --project ~/work/myrepo
# Удалить
./scripts/harness remove agent leader # отовсюду
./scripts/harness remove agent leader --scope global
./scripts/harness agents remove leader
./scripts/harness agents remove leader --scope global
```
| `--scope` | Куда ставится |
@@ -89,60 +132,47 @@ dev/harness/
`mode: all` (кроме `leader` — `primary`), чтобы лидер мог вызывать их как сабагентов.
> **Hermes агентов не поддерживает** — только runtime-делегирование через
> `delegate_task`. Пользовательских определений агентов у него нет, поэтому
> `install agent` работает только для OpenCode.
> `delegate_task`. Пользовательских определений агентов у него нет.
### MCP-серверы (Hermes)
## `mcp` — MCP-серверы Hermes
```bash
# Добавить MCP по URL (HTTP SSE)
./scripts/harness configure hermes mcp add my-server http://localhost:8000/mcp
./scripts/harness mcp list
# Добавить MCP через команду (STDIO)
./scripts/harness configure hermes mcp add github npx \
# По URL (HTTP/SSE)
./scripts/harness mcp add my-server http://localhost:8000/mcp
# Командой (stdio)
./scripts/harness mcp add github npx \
--env GITHUB_TOKEN=ghp_xxx \
--arg -y --arg @modelcontextprotocol/server-github
# Список MCP
./scripts/harness list mcp
# Удалить MCP
./scripts/harness configure hermes mcp rm my-server
./scripts/harness mcp rm my-server
```
### Конфигурация Hermes
`add` и `rm` сами перезапускают `hermes-gateway`, чтобы изменения подхватились.
## `catalog` — внешние репозитории
```bash
# Посмотреть конфиг
./scripts/harness configure hermes
# Установить параметры
./scripts/harness configure hermes --set model.default=gpt-4o
./scripts/harness configure hermes --set model.provider=openai
./scripts/harness configure hermes --set agent.max_turns=200
./scripts/harness catalog list # источники, содержимое, sha, признак «сдвинут»
./scripts/harness catalog update # git submodule update --remote / git pull для клонов
```
После изменения конфига скрипт автоматически перезапускает Hermes.
### Установка/обновление бинарников
## `hermes` / `opencode` — сам агент
```bash
./scripts/harness install opencode # curl-установщик opencode.ai
./scripts/harness install hermes # hermes update + рестарт сервисов
./scripts/harness hermes config # показать конфиг
./scripts/harness hermes config --set model.default=gpt-4o
./scripts/harness hermes config --set agent.max_turns=200
./scripts/harness hermes restart # systemctl --user restart hermes-gateway + webui
./scripts/harness hermes update # hermes update + рестарт сервисов
./scripts/harness opencode install # curl-установщик opencode.ai
./scripts/harness opencode restart # systemctl --user restart opencode + openchamber
```
### Перезапуск
```bash
./scripts/harness restart hermes # systemctl --user restart hermes-gateway + webui
./scripts/harness restart opencode # systemctl --user restart opencode + openchamber
```
### Обновление каталога
```bash
./scripts/harness update catalog # git pull во всех репах внутри catalog/
```
`hermes config --set` меняет `~/.hermes/config.yaml` и перезапускает сервисы.
## Как добавить скилл в каталог
@@ -154,19 +184,16 @@ git submodule add https://github.com/user/skills-repo.git catalog/user-skills
git commit -m "chore: add user-skills to catalog"
```
После этого `harness list catalog` покажет все найденные скиллы, а
`harness update catalog` подтянет свежие коммиты во всех submodule'ах.
Обычный клон (`git clone` внутрь `catalog/`) тоже работает — `update catalog`
обновит его через `git pull`, но такой каталог не попадёт в коммит репы
(вложенная репа не станет submodule автоматически).
После этого `harness skills list` покажет найденные скиллы, а
`harness catalog update` подтянет свежие коммиты во всех submodule'ах.
### Раскладка репозитория и ручная установка
CLI `harness` понимает одну раскладку — `<репа>/skills/<name>/SKILL.md`.
Репозитории с другой структурой он показывает как `(no skills/)`, и их скиллы
ставятся вручную. Ограничение только у CLI: сам OpenCode сканирует рекурсивно
(`skills/**/SKILL.md`, а через `skills.paths` — `**/SKILL.md` на любой глубине).
CLI понимает одну раскладку — `<репа>/skills/<name>/SKILL.md`. Репозитории с другой
структурой (`SKILL.md` в корне, `.agents/skills/`, вложенные категории) он показывает
без списка скиллов, и такие скиллы ставятся вручную. Ограничение только у CLI: сам
OpenCode сканирует рекурсивно (`skills/**/SKILL.md`, а через `skills.paths` —
`**/SKILL.md` на любой глубине).
Пример — `developer-documentation-skill` держит `SKILL.md` в корне репы:
@@ -186,7 +213,7 @@ ln -s /mnt/data/Agent/dev/harness/catalog/developer-documentation-skill \
## Как добавить агента
Положить `.md` файл в `agents/` репозитория — и он сразу виден через `harness list agents`.
Положить `.md` файл в `agents/` репозитория — и он сразу виден через `harness agents list`.
Формат — как у OpenCode:
@@ -215,9 +242,7 @@ permission:
## Поддерживаемые форматы
- **Скиллы** — `SKILL.md` с YAML frontmatter (`name`, `description`); родной формат OpenCode и Hermes.
Скиллы из `catalog/*/skills/<name>/SKILL.md` видны через `harness list catalog`.
- **Агенты** — `<name>.md` с frontmatter (`description`, `mode`, ...); формат OpenCode.
Лежат в `agents/<name>.md`.
## Совместимость