neuralmind.uk / NeuralMind v4.10.0 — Hermes can install the NeuralMind plugin itself, and the plugin says why when it can’t work Edit this page on GitHub ↗

NeuralMind v4.10.0 — Hermes can install the NeuralMind plugin itself, and the plugin says why when it can’t work

Type: Minor release Theme: Hermes-Agent plugin, ready for Hermes’s own installer; and, for Claude Code, an opt-in that trims noisy install logs

v4.9.0 gave Hermes-Agent NeuralMind’s context in every turn through a plugin, installed with neuralmind install-hermes-plugin. Three things stood between that plugin and a Hermes user finding and installing it the Hermes way:

v4.10.0 fixes all three. It also adds an opt-in for Claude Code that trims the progress lines of pip install and neuralmind build output, with the full output one Read away: noisy install logs, trimmed.

Hermes can install it

The plugin’s directory, neuralmind/hermes_plugin/, now carries its own plugin.yaml and a README, so Hermes’s own installer can install it from a clone of this repository:

pip install -U neuralmind                       # the plugin runs NeuralMind; it doesn't bundle it
neuralmind build /path/to/project
hermes plugins install dfrostar/neuralmind#neuralmind/hermes_plugin --enable

neuralmind install-hermes-plugin works as before and stays the simplest way in: it copies the plugin, records the Python interpreter that has NeuralMind, and enables it.

It says why when it can’t work

When the plugin can’t start NeuralMind, finds one older than 4.9, or a call times out, it logs one warning per Hermes process, naming the fix:

hermes logs --level WARNING | grep -i neuralmind
# WARNING hermes_plugins.neuralmind: NeuralMind plugin: /home/you/.local/bin/neuralmind is
#   NeuralMind 4.3.5, too old for this plugin: turns get no session recap. Install NeuralMind
#   4.9 or later so the `neuralmind` command is on Hermes's PATH, or run
#   `neuralmind install-hermes-plugin` to point the plugin at it.

An older NeuralMind still answers, so before this the only sign was a missing recap. The version check runs once per Hermes process, in the background, off the turn’s path. As before, nothing breaks the turn: it goes ahead without NeuralMind’s context.

Fixed: a reinstall after an uninstall stays on

neuralmind install-hermes-plugin --uninstall now runs Hermes’s own hermes plugins remove neuralmind, which removes the directory and every entry naming the plugin in that home’s config.yaml, so installing it again later turns it back on. A fresh install also enables the plugin whatever an earlier one left on the disabled list; only a re-run over an existing install respects a hermes plugins disable neuralmind you ran. Hermes won’t remove a symlinked plugins/neuralmind, so for one the command still disables the plugin and removes the link, never what it points to. If hermes plugins remove fails, even after it has already deleted the directory, the command disables the plugin instead and says Hermes’s config may still name it.

The install’s last line also stopped saying “Each Hermes turn now gets NeuralMind’s related files…” when the plugin wasn’t enabled (left disabled, --no-enable, Hermes not set up yet, or hermes not on PATH). It now reads “Once it’s enabled, each Hermes turn gets …” in those cases.

Opt-in for Claude Code: noisy install logs, trimmed (NEURALMIND_BASH_REPLACE=1)

An opt-in mode in which a PostToolUse hook replaces tool output rather than adding to it, for one kind of output only: the progress lines of an install or an index build. It is off by default, and the compression benchmark gates it: every output it replaces has to keep the lines pre-registered as the ones a reader needs. With the variable unset, the hooks behave exactly as before: they inject nothing.

The earlier hooks returned compressed text as additionalContext, which Claude Code adds next to the tool result, so they cost tokens. This one returns updatedToolOutput, which Claude Code uses instead of the result. Because a replacement can hide what an agent needs, it is narrow on purpose:

What Claude sees

A fresh pip install -r requirements.txt reaches Claude as 77 lines, mostly Collecting …, Downloading … and progress bars. With the opt-in it is:

[neuralmind: 74 progress lines elided: Collecting ×24, Downloading ×48, progress bar ×2]
Installing collected packages: urllib3, typing-extensions, pygments, …
Successfully installed Jinja2-3.1.6 MarkupSafe-3.0.4 … requests-2.32.3 rich-13.9.4 …
[neuralmind: pip install progress lines elided where marked; every other line is verbatim. Full output: /path/to/project/.neuralmind/bash_outputs/33026abbedf96248.txt]

Measured

On the compression benchmark, which drives the real hook with Claude Code-shaped payloads over a committed corpus of real command outputs:

Bash calls Calls Replaced Tokens, no hook Tokens, opt-in Change
Noisy logs (installs, builds) 5 4 8,253 1,490 −81.9%
Content (tests, diagnostics, diffs, listings, files, searches) 14 0 31,473 31,473 +0.0%

Turning it on

Hooks inherit Claude Code’s environment. Set the variable in .claude/settings.json, or in your shell before launching claude:

{
  "env": { "NEURALMIND_BASH_REPLACE": "1" }
}

No reinstall is needed: the registered compress-bash hook reads the variable on every call. NEURALMIND_BYPASS=1 still switches off every hook action, this one included.

Reading a kept output isn’t a step between files

The Read hook records which file the agent read after which, for the synapse layer. A Read of a file under .neuralmind/, such as a full output this opt-in kept, is NeuralMind’s own state, not the codebase, so it’s no longer recorded. (The hook reading Claude Code’s nested file.content payload, which this work first fixed, shipped in v4.8.1.)

New in the repo

Not changed

Also in this release

Two fixes found while fixing v4.9.1. Neither loses data.

What the agent sees

On Hermes, nothing new in a turn: the same recap and recall v4.9.0 added, appended to the user message. What changes is that more installs actually deliver it, and when one doesn’t, Hermes’s log says why. Tested against Hermes v0.21.5 (a 0.21.5+5355 main-branch build) in live hermes chat sessions: the first-turn recap, recall, edits made with patch and write_file, a resumed session (recall only), a subagent (skipped), a directory that hasn’t been built (nothing), both ways of installing, and uninstalling. What the context changes in Hermes’s answers still isn’t measured.

In Claude Code, nothing changes unless you set NEURALMIND_BASH_REPLACE=1; then install and build logs arrive as shown in What Claude sees.

Per-agent expectations

Agent What changes
Hermes-Agent It can install the plugin itself (hermes plugins install dfrostar/neuralmind#neuralmind/hermes_plugin), and update it with hermes plugins update neuralmind. When the plugin can’t run NeuralMind, finds an old one, or times out, Hermes’s log says so. Uninstalling and installing again leaves it enabled.
Claude Code Nothing by default. With NEURALMIND_BASH_REPLACE=1, pip install and neuralmind build results arrive without their progress lines and end with the path of the full output; every other result is unchanged.
Cursor / Cline / generic MCP clients Nothing.
Other agents with a shell Nothing.

Use cases

Settings

One new setting, NEURALMIND_BASH_REPLACE (unset by default): see Turning it on. NEURALMIND_PROJECT and NEURALMIND_HERMES_TIMEOUT work as in v4.9.0, and a timeout is now logged.

Upgrading

pip install -U neuralmind, then re-run neuralmind install-hermes-plugin: the plugin it installed is a copy, and a re-run keeps an earlier pin and leaves a plugin you disabled disabled. A plugin Hermes installed is updated with hermes plugins update neuralmind instead. NEURALMIND_BASH_REPLACE needs no hook reinstall: the registered compress-bash hook reads it on every call.

Privacy: ONNX Runtime telemetry

NeuralMind runs its embedding model with ONNX Runtime, and ONNX Runtime has telemetry of its own. Its official builds turn it on by default, uploading usage events to Microsoft from Linux and macOS (version 1.30’s privacy notes say so; we haven’t checked when that started). So a NeuralMind process could send ONNX Runtime’s telemetry even though NeuralMind itself sends none. From this release, importing NeuralMind sets ORT_DISABLE_TELEMETRY=1, ONNX Runtime’s switch for turning that off, before the runtime starts. A test checks that the variable is set and that onnxruntime isn’t loaded by the import itself. It overrides a value you set yourself. On Windows, ONNX Runtime writes trace events to ETW instead, which are recorded only when a Windows trace session is collecting them; the variable doesn’t change that.