All plugins

lazy-plugin

A dashboard page in Hermes Desktop where you describe a plugin and watch it get built. Say what you want — or start from a skill the agent wrote, or a job that runs on a schedule — and your own agent drafts the plan in a chat turn you can read, the code comes from four fixed templates, and the page shows a receipt: plan, files, validator result, and a real try-out of every tool (purrs, needs a key, blocked upstream, held back, half-built, broken — with the exact failing line). The build never runs what it wrote: the try-out is your click, a key only travels to a public https host, and a file tool stays inside its own data dir. Nothing installs itself, and publishing is a SHA-pinned catalog PR you send. Also callable as lazyplugin_create from any conversation. Disclosure — the Desktop "try it" button runs every generated tool for real on your machine (generated `command` tools execute the drafted argv; declared keys are only sent to public https hosts named in the code, never Hermes' own keys), and "publish" uses your `gh` login to create a public GitHub repo for the generated plugin and open a pull request to NousResearch/hermes-agent in one click; builds from `lazyplugin_create` never run generated code.

RegeneratusLabsToolsv0.9.8Updated 2 hours ago

About

A dashboard page in Hermes Desktop where you describe a plugin and watch it get built. Say what you want — or start from a skill the agent wrote, or a job that runs on a schedule — and your own agent drafts the plan in a chat turn you can read, the code comes from four fixed templates, and the page shows a receipt: plan, files, validator result, and a real try-out of every tool (purrs, needs a key, blocked upstream, held back, half-built, broken — with the exact failing line). The build never runs what it wrote: the try-out is your click, a key only travels to a public https host, and a file tool stays inside its own data dir. Nothing installs itself, and publishing is a SHA-pinned catalog PR you send. Also callable as lazyplugin_create from any conversation. Disclosure — the Desktop "try it" button runs every generated tool for real on your machine (generated `command` tools execute the drafted argv; declared keys are only sent to public https hosts named in the code, never Hermes' own keys), and "publish" uses your `gh` login to create a public GitHub repo for the generated plugin and open a pull request to NousResearch/hermes-agent in one click; builds from `lazyplugin_create` never run generated code.

Lazy Plugin

A page in Hermes Desktop where you describe a plugin and watch it get built — then proves it runs
before you install anything.

The Lazy Plugin page

What it is

A Hermes plugin that builds Hermes plugins — on the desktop page, from a chat turn, or as
lazyplugin_create inside any conversation. What makes it different from a scaffolder is what
happens after the files are written: the new plugin is loaded, its tools are called for real, and
the result is graded. A plugin that validates but cannot run shows up as broken, on screen, before
you install it.

Where a build starts

| Start from | Why it works |
|---|---|
| a sentence | you know the job; it becomes tools |
| a skill the agent wrote | the procedure is already written — turn it into something that runs without the model |
| a job that runs on a schedule | recurring work with a history — make it a tool call instead of a turn |

The loop

page ──▶ a real chat turn, in the chat pane (you watch it happen)
          └─▶ spec in words: name, 1–5 tools, what each reads/fetches, what it returns
              └─▶ lazyplugin_create ─▶ fixed templates write the code
                  └─▶ hermes plugins validate ─▶ the exact ✗ line if it fails
                      └─▶ every tool dispatched once ─▶ works · needs a key · blocked upstream · half-built · broken
                          └─▶ the page shows the receipt, then you decide about installing

The model writes the spec. Templates write the code. Model-authored Python is how you get
plausible garbage that dies on import; model-authored intent rendered through fixed templates
always registers, declares exactly the capabilities it provides, and cannot carry injected code.

Handler bodies are limited to four shapes:

  • command — runs the spec's argv as a list, never a shell string
  • http — GET/POST the spec's URL, with a declared url parameter winning over it
  • file — read/write the spec's path, or a declared path argument
  • stub — raises NotImplementedError carrying the described behaviour

A spec that cannot work is refused before any file is written: name shape, description length,
unique snake_case tool names, and a real target — an http tool needs an absolute URL, a command tool
needs argv, a file tool needs a path or a declared path parameter.

The part a skill cannot do

A skill can describe a plugin. It cannot execute one inside the host and hand back a verdict.

Every build ends with a dispatch: the new tool is called through the real registry, exactly as the
model would call it, and graded.

| Verdict | Means |
|---|---|
| purrs | the tool was called and returned real results |
| needs a key | sound package, wants an environment variable you have not set |
| blocked upstream | our side works; the far end answered 403/404 |
| half-built | the handler was never written — the spec fell to a stub |
| broken | it would not load, or the handler raised |

The receipt is a straight line — plan · files · check · try-out — and every row is either a tick
or the exact failing line. No green badge without the line underneath it.

Never installs by itself

Generated plugins land in $HERMES_HOME/lazy-plugin/created/<name>/ as files you can read. Nothing is
linked into ~/.hermes/plugins until you ask:

hermes plugins validate $HERMES_HOME/lazy-plugin/created/<name>
ln -s $HERMES_HOME/lazy-plugin/created/<name> ~/.hermes/plugins/<name>
hermes plugins enable <name>

Install re-runs the validator first and refuses to clobber an existing plugin. A generated plugin
that fails its try-out is refused too — a scaffold you can install is a trap.

Publishing

There is no upload endpoint and no self-serve registry: the catalog is a human-merged gate. A PR
adds plugin-catalog/<name>.yaml to NousResearch/hermes-agent pinning a full 40-character commit
SHA of a public repo.

Publish does the mechanical half with your own gh login — validate, commit, create the public
repo, pin the SHA, write the entry from the real manifest, then offer the catalog PR. A maintainer
still decides; nothing here merges anything.

Using it from chat

lazyplugin_create is an ordinary tool, so it runs inside a turn and the host resolves whatever model
and credential that profile has — API key, OAuth proxy, cloud or local. The plugin holds no key, names
no provider, and makes no model call of its own: the agent that runs the build is yours, on your
profile. Install it anywhere and the agent already knows how to build plugins.

Tools

| Tool | Does |
|---|---|
| lazyplugin_create | build from idea, or from source_kind + source_name |
| lazyplugin_sources | list the agent's own skills and scheduled jobs |
| lazyplugin_built | list what has been generated, with paths |

Tests

python3 -m venv .venv && .venv/bin/pip install pytest fastapi httpx
.venv/bin/python -m pytest tests -q          # 107 passed
hermes plugins validate .                    # every catalog gate

Limits, honestly

  • The four handler shapes cover most small tools. Anything needing real state, retries or pagination
    wants a hand-written plugin, and the spec validator will refuse shapes it cannot render safely.
  • The try-out uses sample arguments (date → today, domain → example.com). A tool that needs a
    specific id will come back broken even if the code is fine — the receipt says why.
  • A build never calls the code it just generated: templates are rendered, the contract is checked,
    and the try-out waits for your click on the page. When a tool declares a key, the try-out will
    only carry it to a public https host the handler names, and never to one of Hermes' own
    credentials — that case is graded refused with the variable and the host quoted.
  • A file tool reads and writes inside the plugin's own data dir (~/.hermes/plugin-data/<name>/).
    It cannot be pointed at ~/.hermes/.env or anywhere else on the host, by a spec or by a call.
  • Builds are agent turns, so they cost tokens and they take as long as your model thinks.

MIT.

README from the reviewed commit 0adb8ff; it updates when the author re-pins.

More by RegeneratusLabs

5 plugins by RegeneratusLabs in the catalog.

RegeneratusLabsethics-filterScore any decision across six ethics modules — environmental, fairness, transparency, leadership, framework, compliance — and get GREEN, AMBER or RED back with the reasoning attached. Ships /ethics and the ethics_evaluate tool. Disclosure — reads the rubrics and constitution templates bundled in the plugin and appends one JSONL record per scored evaluation (decision text, context and reasoning included) to $ETHICS_FILTER_AUDIT, default ~/.ethics-filter/audit.jsonl outside the Hermes profile and shared by every profile; that file is never rewritten or deleted. With auto_score=true it asks the host agent's own model to score through Hermes, holding no separate key; no other network calls.Communitytools4RegeneratusLabshermes-bandCompose and render original music on your own machine — an arrangement is data (tempo, key, chords, parts) rendered to exact-length wav and mp3. No music API, no model download, no per-track cost. Disclosure — renders by running the host's fluidsynth and ffmpeg against a local General MIDI soundfont and writes the wav, mp3 and per-part midi/wav stems into ~/hermes-band-out/<name>/ (configurable via output_dir). Long renders take tens of seconds and run in the foreground of the tool call. No network calls, no credentials.Communitytools4RegeneratusLabssoul-finderBuild or fix your agent's SOUL.md — the personality file behind every reply. A few plain questions draft one from scratch; /soul audits a stale one and ships a diff. Disclosure — reads $HERMES_HOME/SOUL.md and writes it only through the agent's own file tools after you approve the draft (the bundled skill can suggest copying the approved file into other profiles' SOUL.md, again only on approval); on a profile with no real SOUL.md it makes a one-time offer through a system-prompt section and an injected first-run message, and writes two booleans (nudge_sent, flow_complete) to its own plugin-data state so the offer happens once. No network I/O, no credentials.Communitytools1RegeneratusLabsstashA capture bin for the Desktop sidebar: paste links, YouTube urls, image urls, uploaded images or plain notes and they wait there, out of the chat. One item per line, so a block of links becomes several items; titles and thumbnails are filled in server-side, so capture costs no model calls. Each row carries a Chat button that opens a new session with that item as the opening message. Adds stash_add, stash_list and stash_update, so the agent reads and empties the same store the page writes. Disclosure — saving an item issues one GET to that url from the Hermes host (4 s timeout, 400 KB cap) to read its <title> and og: metadata, refused for loopback, link-local, private and reserved targets and re-checked on every redirect hop; YouTube urls also use www.youtube.com/oembed and i.ytimg.com thumbnails, and the Desktop page loads each item's og:image thumbnail directly from whatever host the page names. No credentials, no telemetry, no shell commands, no Python dependencies beyond the FastAPI Hermes already ships. Items are plain JSON at ~/.hermes/stash/items.json (shared by every profile) and uploads (max 8 MB) in ~/.hermes/stash/media/.CommunityDesktop app