diff --git a/README.md b/README.md index d0853fdb8..1f4ae040b 100644 --- a/README.md +++ b/README.md @@ -240,14 +240,15 @@ the `memory-*` directories from `skills/` into your agent's skills directory. Hermes keeps its native plugin shape under [`integrations/hermes`](integrations/hermes): +Managed installation requires a Hermes Agent release containing the +[manifest-v2 installer fix](https://github.com/NousResearch/hermes-agent/pull/85893). +Hermes Agent v0.20.5 (`v2026.8.19`) and earlier are not supported. If the installer says it only +supports `manifest_version: 1`, update Hermes to a release containing that fix. + ```bash -hermes plugins install basicmachines-co/basic-memory --path integrations/hermes +hermes plugins install basicmachines-co/basic-memory/integrations/hermes ``` -If your Hermes build lacks subpath installs, use the final deprecated -`basicmachines-co/hermes-basic-memory` pointer release until host support -lands. - ### OpenClaw OpenClaw stays package-native and publishes from diff --git a/integrations/hermes/README.md b/integrations/hermes/README.md index 8aee6246e..85a9bef82 100644 --- a/integrations/hermes/README.md +++ b/integrations/hermes/README.md @@ -8,8 +8,13 @@ The plugin replaces Hermes's "no external memory provider" with a real graph: se ## Install +Managed installation requires a Hermes Agent release containing the +[manifest-v2 installer fix](https://github.com/NousResearch/hermes-agent/pull/85893). +Hermes Agent v0.20.5 (`v2026.8.19`) and earlier are not supported. If the installer says it only +supports `manifest_version: 1`, update Hermes to a release containing that fix. + ```bash -hermes plugins install basicmachines-co/basic-memory --path integrations/hermes +hermes plugins install basicmachines-co/basic-memory/integrations/hermes ``` Then activate it in `~/.hermes/config.yaml`: @@ -21,13 +26,12 @@ memory: If you run the gateway, restart it (`hermes gateway restart`). Done. -If your installed Hermes build does not support `--path`, use the final deprecated `basicmachines-co/hermes-basic-memory` pointer release until Hermes subpath installs are available. Ongoing development now lives in [`basic-memory/integrations/hermes`](https://github.com/basicmachines-co/basic-memory/tree/main/integrations/hermes). - The plugin self-installs the `basic-memory` CLI on first init via `uv tool install basic-memory` (one-time ~10s pause if it isn't already present). The bm binary lands at `~/.local/bin/bm` — the same location a manual `uv tool install basic-memory` would produce, so a later manual install or upgrade is a no-op rather than a second install. ### Prerequisites -- [Hermes Agent](https://github.com/NousResearch/hermes-agent) +- A supported [Hermes Agent](https://github.com/NousResearch/hermes-agent) release as described + above - [`uv`](https://docs.astral.sh/uv/) on PATH (used for the bootstrap install) - The `mcp` Python package in the Hermes venv. If `hermes plugins install` doesn't auto-install it (it follows `pip_dependencies` in `plugin.yaml`), run: ```bash diff --git a/scripts/validate_hermes_plugin.py b/scripts/validate_hermes_plugin.py index 82efac01e..c8825e6d7 100644 --- a/scripts/validate_hermes_plugin.py +++ b/scripts/validate_hermes_plugin.py @@ -9,6 +9,11 @@ from validate_skills import parse_frontmatter +HERMES_INSTALL_COMMAND = "hermes plugins install basicmachines-co/basic-memory/integrations/hermes" +UNSUPPORTED_HERMES_INSTALL_COMMAND = ( + "hermes plugins install basicmachines-co/basic-memory --path integrations/hermes" +) + def parse_plugin_yaml(path: Path) -> dict[str, str]: data: dict[str, str] = {} @@ -23,10 +28,12 @@ def validate_hermes_plugin(plugin_dir: Path) -> None: plugin_dir = plugin_dir.resolve() plugin_yaml = plugin_dir / "plugin.yaml" module = plugin_dir / "__init__.py" + readme = plugin_dir / "README.md" + root_readme = plugin_dir.parents[1] / "README.md" skill = plugin_dir / "skill/SKILL.md" tests = plugin_dir / "tests" - for path in [plugin_yaml, module, skill, tests]: + for path in [plugin_yaml, module, readme, root_readme, skill, tests]: if not path.exists(): raise SystemExit(f"Missing Hermes plugin file: {path}") @@ -46,6 +53,13 @@ def validate_hermes_plugin(plugin_dir: Path) -> None: if frontmatter.get("name") != "basic-memory": raise SystemExit(f"{skill}: expected name=basic-memory") + for documentation in [root_readme, readme]: + documentation_text = documentation.read_text() + if HERMES_INSTALL_COMMAND not in documentation_text: + raise SystemExit(f"{documentation}: missing supported Hermes install command") + if UNSUPPORTED_HERMES_INSTALL_COMMAND in documentation_text: + raise SystemExit(f"{documentation}: contains unsupported Hermes --path command") + print(f"validated Hermes plugin in {plugin_dir}")