Design doc: claude-skills/.wiki/concepts/hermes-skills-rollout-design.md (commits b3dc1251 + 5ae14fd6 + 0f65e057). Tasks created: - claude-skills#hermes-converter-mvp (ready) - claude-skills#hermes-flavour-mcp-setups (blocked-by hermes-converter-mvp) - claude-skills#hermes-installer-skill (blocked-by hermes-converter-mvp) - claude-skills#hermes-mvp-coverage (blocked-by 3 upstream) - claude-skills#hermes-converter-ci (blocked-by hermes-mvp-coverage, deferred) - common#tasks-close-normalize-body (ready, discipline pre-req) - claude-skills#using-tasks-close-coverage-gate (ready, discipline pre-req — extended 879957d9 to also cover scope-priority at recommendation time) Buffer archived from .brainstorm/ → .archive/2026-05-06-hermes-skills-rollout.md. Research clippings captured at .wiki/raw/research/hermes-agent-skills/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
19 KiB
date, topic, status, type, target_promote, sources
| date | topic | status | type | target_promote | sources |
|---|---|---|---|---|---|
| 2026-05-06 | hermes-skills-rollout | in-progress | domain | claude-skills |
Hermes Skills Rollout — design buffer
Раскатить наш claude-skills репозиторий на Hermes Agent (Nous Research). Hermes и Claude формально совместимы по agentskills.io, но различия по фронтматтеру, раскладке (категории) и body-секциям требуют конвертации, не просто копирования.
Context
Hermes — агент от Nous Research, поддерживает SKILL-формат. Юзер уже клонировал hermes-репу (упоминается в research-файле). У нас 21 скил в ~/projects/claude-skills/skills/. Нужно понять: формат, что портируется, как поддерживать.
Hermes skill format (verified by web)
Frontmatter:
| Field | Required | Notes |
|---|---|---|
name |
✅ | lowercase-hyphen |
description |
✅ | search-result style; считается по токенам (level-0) |
version |
✅ | semver, должен матчить git-tag релиза |
author, license |
⬜ | typical: MIT |
platforms |
⬜ | [macos, linux, windows] — silently hides на не-целевой OS |
metadata.hermes.tags |
⬜ | indexed labels (e.g. [devops, backups, shell]) |
metadata.hermes.category |
⬜ | grouping (определяет папку) |
metadata.hermes.related_skills |
⬜ | cross-refs |
metadata.hermes.requires_toolsets / requires_tools |
⬜ | visibility gate |
metadata.hermes.fallback_for_toolsets / fallback_for_tools |
⬜ | "show only if premium tool absent" |
metadata.hermes.config |
⬜ | non-secret prefs (key,description,default,prompt) |
metadata.hermes.required_environment_variables |
⬜ | .env injection в execute_code/terminal |
metadata.hermes.required_credential_files |
⬜ | OAuth/SA mounting |
Body sections (recommended outline):
## When to Use## Quick reference## Procedure## Pitfalls## Verification
Layout:
~/.hermes/skills/<category>/<skill-name>/
├── SKILL.md (required)
├── references/ (long tables, vendor docs — pulled by skill_view(name, file))
├── templates/
├── scripts/
└── assets/
Категории — Hermes-стандартный набор: autonomous-ai-agents, creative, data-science, devops, email, gaming, github, mcp, media, mlops, note-taking, productivity, red-teaming, research, smart-home, social-media, software-development.
Distribution: публичный git-tap. Юзер делает hermes skills tap add owner/repo. Релизы — git-теги, version фронтматтера = тег. Hub-публикация — security scan.
Design tenet: independence
Мы не зависим от Hermes built-in скилов. Где у нас и у Hermes есть аналог по функции (например llm-wiki), ставим наш. Hermes built-in тоже остаётся, но наша schema и наш темп развития — суверенны. Override через skill_manage precedence (locally modified bundled skills are preserved).
Исключение — Hermes-нативные тулы (не скилы): skills_list(), cronjob, execute_code и т.п. Это инфраструктура, не «их скил». Используем напрямую.
Hermes' inventory (key findings)
research/llm-wiki— встроен (Karpathy). Покрывает init+operate+lint. ИспользуетSCHEMA.md(не.wiki/CLAUDE.md). Секцииentities/concepts/comparisons/queries(у насentities/concepts/packages/sources)..tasks/НЕ трогает. Не drop-in замена нашему — другая schema.mcp/native-mcp— встроен MCP-клиент. Внешние сервера через~/.hermes/config.yaml > mcp_servers.<name>(stdio/HTTP, env-vars, auto-discovery,/reload-mcpкоманда).skills_list()— встроенный progressive disclosure (Level 0). Делаетfind-skillsлишним.- Hermes на Linux (
/opt/data/projectsв твоём скриншоте), модельglm-5.1(Nous, дешёвая) → caveman экономия токенов не нужна. - Cron встроен tool-сом →
using-projects-meta+ cron = автосинк фабричных проектов.
Audit (post-discoveries, factory-relevance × Hermes-side fit)
| Skill | Решение | Reasoning |
|---|---|---|
pulling-before-work |
✅ MVP | универсально, нет аналога |
using-markitdown |
✅ MVP | через execute_code |
active-platform |
✅ MVP | shell-идиома (Hermes на Linux) |
project-discipline |
✅ MVP | workflow-правила |
setup-tasks / using-tasks |
✅ adapt | Hermes' llm-wiki .tasks/ не покрывает |
setup-wiki / using-wiki |
✅ adapt | наша schema, наш контроль (override Hermes built-in llm-wiki через skill_manage precedence) |
setup-projects-meta (Hermes-flavour) |
✅ adapt-mandatory | thin wrapper: бинарь уже в ~/projects/.common/lib/projects-meta-mcp/ (общефабричная инфра), auth.toml тоже общий → только yaml-edit ~/.hermes/config.yaml + /reload-mcp. Никаких клонов/билдов на Hermes-стороне |
using-projects-meta |
✅ adapt-mandatory | тулы auto-injected; политика та же |
project-bootstrap |
⚠️ adapt | зависит от wiki-fork |
setup-context7 (Hermes-flavour) |
✅ adapt-mandatory | yaml-edit ~/.hermes/config.yaml > mcp_servers.context7, env API-key, /reload-mcp. Тот же паттерн что projects-meta. |
using-context7 |
✅ adapt-mandatory | политика та же, тулы auto-injected |
caveman×5 |
❌ skip | Hermes-модель дешёвая, мотив пропадает |
setup-interns / using-interns |
❌ skip | Hermes сам — «cheap intern» |
find-skills |
❌ skip | Hermes имеет skills_list() |
MVP locked (post-decisions):
- 4 универсальных:
pulling-before-work,active-platform,project-discipline,using-markitdown - 2 tasks:
setup-tasks,using-tasks - 2 projects-meta:
setup-projects-meta(Hermes-flavour, thin),using-projects-meta - 2 wiki:
setup-wiki,using-wiki(наша schema, override Hermes built-in) - 2 context7:
setup-context7(Hermes-flavour, thin),using-context7 - 1 bootstrap:
project-bootstrap(orchestrator над всем выше; адаптируется последним)
= 13 скилов. (Skip: caveman×5, interns×2, find-skills.)
In-flight в claude-skills (учитываем)
[setup-projects-meta-token-leak]ready (security fix — extraheader вместо URL-creds). Hermes-версия пишется сразу с правильным паттерном.[install-ps1]ready (PowerShell parity). Для Hermes-installer'а понадобится cross-platform логика.[skills-grouping-revisit]triggers на >30 скилов. С Hermes-добавкой подходим к порогу.
Категория-маппинг (черновик)
pulling-before-work,project-discipline,project-bootstrap,active-platform→software-developmentsetup-tasks,using-tasks→productivityusing-markitdown→productivityилиresearchsetup-projects-meta,using-projects-meta→mcpsetup-wiki,using-wiki(если порти́руем) →research
Recommendation: pre-converted dist-hermes/ + Hermes-side installer
Это частные скилы фабрики. Отметаем tap/Hub/публикацию. Установка — через skill_manage(action='create') на стороне Hermes.
User-flow: на фабричной машине git clone claude-skills → команда Hermes «установи скилы» → он итерирует, вызывает skill_manage per файл → скилы в ~/.hermes/skills/<category>/<name>/.
Архитектура:
claude-skills/
├── skills/ ← source-of-truth (Claude-формат)
├── dist/ ← .skill архивы для Claude (есть)
├── dist-hermes/ ← pre-converted Hermes-tree (committed, NEW)
│ ├── productivity/caveman/SKILL.md
│ ├── productivity/caveman-commit/SKILL.md
│ ├── software-development/pulling-before-work/SKILL.md
│ └── meta/claude-skills-installer/SKILL.md ← bootstrap
├── scripts/
│ ├── build.sh / build.ps1 (есть)
│ ├── install.sh (есть)
│ └── build-hermes.{sh,py} (NEW — конвертер skills/* → dist-hermes/*)
└── hermes-mapping.yaml (NEW — skill → category, replace-rules, skip-list)
Разделение труда:
- На стороне claude-skills (у нас):
build-hermes.{sh,py}читаетskills/*, применяетhermes-mapping.yaml(category, фронтматтер, секции, replace-rules для тулов), пишет вdist-hermes/. Запускается локально или в CI на push to master.dist-hermes/коммитится в репу. - На стороне Hermes (на фабрике): простая итерация по
dist-hermes/<cat>/<name>/с вызовомskill_manage(action='create', ...)per файл. Никакой conversion-логики там нет.
Почему dist-hermes коммитится, а не генерится при install:
- Аналог уже committed
dist/.skill— установившаяся практика в репе. - Hermes не нуждается в Python-окружении / нашем
hermes-mapping.yamlпарсере. - Diff в
dist-hermes/виден в PR-ах — review-able, не магия. - Bootstrap проще: clone + один Hermes-trigger.
Почему не ручной перенос в ~/.hermes/skills/:
- Анти-дрейф: claude-skills растёт. Через месяц рассинх.
- Видимость Claude-измов: конвертер падает / помечает на каждом
mcp__*/Read-рефе — авто-lint совместимости. - Reuse:
agentskills.ioоткрытый. Тот же скрипт с другим маппингом → Codex / Gemini target позже.
Trade-off: конвертер растёт нелинейно с количеством Claude-измов. Запасной план — mode: manual пер-скил в маппинге (готовый Hermes-вариант лежит в skills/<name>/SKILL.hermes.md, конвертер копирует as-is, без преобразований).
Open questions (live)
- Q1. Maintenance model → ongoing dual-target (конвертер + маппинг, регенерим при каждом релизе claude-skills). Anti-drift, видимость Claude-измов, reuse под другие агенты.
- Q2.
Hermes-tap репо / install-script→dist-hermes/(pre-converted, committed) + Hermes-side installer. Конвертация у нас в claude-skills, установка черезskill_manage(action='create')на стороне Hermes. - Q3.
Hub-публикация→ out of scope (частные скилы). - Q4. Форма Hermes-installer'а → installer-как-Hermes-скил (
dist-hermes/meta/claude-skills-installer/SKILL.md). Bootstrap: одна ручнаяskill_manageвызов для самого installer'а, дальше триггер «обнови claude-skills» — он сам итерирует поdist-hermes/<category>/<name>/и вызываетskill_manage(action='create', ...)per скил. Recursive: installer обновляется вместе со всем остальным черезgit pull && trigger update. - Q5a. caveman family → skip (Hermes на дешёвой модели, мотив пропадает).
- Q5b. wiki-fork → порти́руем наши (independence tenet — наша schema, не зависим от Hermes built-in).
- Q5c. context7 → mandatory adapt (yaml-edit паттерн).
- Q5d. projects-meta → mandatory adapt thin (бинарь + auth уже общие из
.common, только yaml-edit). - Q6.
🔴 не портируется→mode: skipвmapping.yaml+ коммитимыйdist-hermes/SKIPPED.mdс причиной per skill. Stub-скилы НЕ пишем. Silent отвергнут. - Q7. Версионирование → per-skill semver mirror из claude-skills фронтматтера (
1.0.0default если нет). Lock-step с upstream. Bump поproject-disciplineRule 3. - Q8. Layout → внутри
claude-skills/hermes/:hermes/mapping.yaml(skill→category, replace-rules, skip-list, mode)hermes/skills/<name>/SKILL.md(mode: manualoverrides)scripts/build-hermes.{sh,py}(генератор)dist-hermes/<category>/<name>/(autogenerated, committed)dist-hermes/meta/claude-skills-installer/SKILL.md(recursive bootstrap)dist-hermes/SKIPPED.md(skip-log)
Action items
Все таски в claude-skills (это его доменный roadmap).
-
hermes-converter-mvp— построить infra и пропустить через неё 4 универсальных скила.- Создать
hermes/mapping.yaml(схема: per-skillmode,category,replace-rules,skip-list+reason). - Написать
scripts/build-hermes.{sh,py}(читаетskills/<name>/SKILL.mdилиhermes/skills/<name>/для manual, применяет mapping, пишетdist-hermes/<category>/<name>/, генеритdist-hermes/SKIPPED.md). - Прогнать через 4 universal:
pulling-before-work,active-platform,project-discipline,using-markitdown. - Закоммитить
dist-hermes/для этих 4 в репу. - Pre-encode security lessons: extraheader-pattern (от
[setup-projects-meta-token-leak]) и POSIX-absolute paths (от[setup-interns-fix-paths]/[using-projects-meta-fix-paths]) — учесть при адаптации.
- Создать
-
hermes-flavour-mcp-setups— переписатьsetup-projects-metaиsetup-context7в Hermes-flavour (yaml-edit~/.hermes/config.yaml > mcp_servers,/reload-mcp). Лежат какmode: manualвhermes/skills/setup-projects-meta-hermes/иhermes/skills/setup-context7-hermes/. Pre-check на existing бинарь в~/projects/.common/lib/projects-meta-mcp/и~/.config/projects-mcp/auth.toml. Применить extraheader-pattern сразу. -
hermes-installer-skill— написатьdist-hermes/meta/claude-skills-installer/SKILL.md(Hermes loops поdist-hermes/<category>/<name>/, вызываетskill_manage(action='create', ...)per файл, рекурсивно копируетreferences//scripts//templates//assets/). Документировать bootstrap-процедуру вclaude-skills/README.md(Linux/Hermes раздел). -
hermes-mvp-coverage— расширить mapping и пропустить через converter оставшиеся 9 MVP-скилов:setup-tasks,using-tasks,setup-wiki,using-wiki,using-projects-meta,using-context7,project-bootstrap(адаптируется последним — orchestrator). Smoke-test на фабричной Linux-машине: clone → trigger installer →hermes skills listпоказывает все 13. -
(deferred)
hermes-converter-ci— GitHub-Action / Gitea-pipeline на push to master:build-hermes.{sh,py}→ diffdist-hermes/→ auto-commit (или PR). Не блокирующее MVP, делается после первой ручной валидации.
Discipline pre-requisites (не блокирующие, но желательны до старта hermes-tasks)
Из код-ревью factory-bootstrap fallout 2026-05-06 — две process-гнили, чинить чтобы новые hermes-таски попали в нормальный flow:
-
tasks-close-normalize-body(target: common) —tasks_closeMCP-инструмент сейчас меняет только эмодзи в H2 + врезает HTML-комент, body остаётся stale (**Status:** ready+**Where I stopped:** (not started)+**Next action:** <unfulfilled plan>). Должен normalize:**Status:** done, replace**Where I stopped:**с close-note narrative, reset**Next action:**→(none — kept until merged). Видно во всех 4 closed-tasks вcommon/.tasks/STATUS.md(knowledge-getfrom-meta-alias, knowledge-search-reindex, tasks-aggregate-ready-filter-ux, skip-archived-repos-in-listuserrepos). Требует фикса вsrc/tools/tasks.tsclose-handler + tests. -
using-tasks-close-coverage-gate(target: claude-skills) —using-tasksSKILL должен требовать coverage-проверку acceptance-criteria тестами перед вызовомtasks_close. Сейчас implementer закрывает по «150/150 tests pass» (existing suite), не покрывая новую логику. Ярко видно на 3 из 4 common-фиксов — acceptance criteria требовали regression-тестов, не написаны (no test forcached = nullinvalidation, no test forAggregateStatusEnumvalidation error, partial test forarchivedfilter). Также: послеfeat:/fix:коммита skill должен подсказывать «эта работа закрывает таску<slug>?» — закрытьextend-project-discipline-brainstorm-workspacesиproject-creation-lifecycle-skillтогда не пропустят (они сейчас оба ⚪ ready несмотря на215afddи23431c5shipped).