All plugins

hermes-beads

Native Beads (bd) work-graph plugin: fixed-argv adapter, scoped ready frontier, claim with read-back, guarded writes. Six tools over an explicit store path + actor; honest exit-code map incl. stale-13; plain bd stays fully sufficient (escape hatch). No desktop pane ships yet.

jacobhauslerToolsv0.1.2Updated 1 month ago

About

Native Beads (bd) work-graph plugin: fixed-argv adapter, scoped ready frontier, claim with read-back, guarded writes. Six tools over an explicit store path + actor; honest exit-code map incl. stale-13; plain bd stays fully sufficient (escape hatch). No desktop pane ships yet.

Hermes Beads workbench

The work graph your team keeps in a spreadsheet — now native on bd, wired into Hermes Agent.

One authoritative graph of tasks, blockers, and claims. Agents and humans read
the same bd ready / bd show state; the plugin gives agents honest tools
over it and gives humans a live pane in Hermes Desktop. Plain bd stays fully
sufficient on its own — the plugin only lowers agent effort, never gates what
bd can do.

The workbench pane: a task tree with status chips, blocked rows flagged in red

Click any row and the blocker card traces why it's blocked — the direct
blockers and the ones inherited through parents, with a breadcrumb home:

Blocker card: direct and inherited blockers with inherited-via notes

What you get

| | |
|---|---|
| Agent tools | beads_frontier (scoped ready rows, epics excluded), beads_show, beads_claim (claim with read-back — two agents never share a bead), beads_update (guarded metadata writes), beads_comment (append-only), beads_smoke |
| Fixed argv | every bd call is a fixed argv list — no shell, no interpolation; hostile ids are refused before spawn, and exit codes keep their meaning (13 means stale guard, nothing written, never "success") |
| Honest failures | named errors, never an empty list dressed up as "nothing to do"; a lost claim names the holder instead of retrying blindly |
| The pane | Hermes Desktop tree with search, blocker jumps (direct and inherited), claim buttons, and a draft editor whose changes only land through the bot door — the panel never writes behind bd's back |
| Escape hatch intact | uninstall the plugin and bd alone still does everything; nothing here locks your data into a private format or daemon |

Install — two tiers

Full contract with the tier-2 patch snippet: docs/install.md.

Tier 1 — happy path (stock core; pane absent, honestly)

hermes plugins install jacobhausler/hermes-beads
hermes plugins enable hermes-beads

Restart the backend (hermes serve) so the tools mount. Requirements:

  • bd 1.3.0+, configured by the operator — on PATH, or
    HERMES_BEADS_BD_BIN=/path/to/bd in the backend's environment (the tools
    never take a binary path from the model) — releases
    (brew install beads, or grab a tarball; verify against checksums.txt)
  • Hermes Agent ≥ 0.21 (stock — no patched core required)
  • Python 3, stdlib only; Node only for the pane's tests

You get the six beads_* agent tools and their rich JSON cards. The desktop
pane is not part of this tier: no desktop/plugin.js registered through
@hermes/plugin-sdk ships today, so Hermes Desktop does not load the pane —
nothing about it "helpfully arrives" behind your back. Verify it yourself:
scripts/verify-tier1.sh enables the plugin into a throwaway HERMES_HOME
under $TMPDIR, proves the tools mount and the pane stays absent, and scans
the shipped docs for false pane tells (this runs in CI).

Then ask your agent: "show me the ready frontier in ~/code/myproj" →
beads_frontier answers with what bd ready sees, epics excluded.

Tier 2 — full features (OPTIONAL Hermes Desktop patch; documented only)

Want the workbench pane? It exists and is fully tested under node --test,
but it only runs when Hermes Desktop loads it — and that needs an optional,
version-pinned patch to Hermes Desktop exposing the plugin-SDK entry
point that wires desktop/*.mjs to the host-injected reads/provider/
telemetry/botView (desktop/workbench.mjs:45-58). The patch is documented —
pinned to Hermes Desktop v2026.9.24, with update/reset restore notes — in
docs/install.md; the real desktop/plugin.js entry point
is a stated follow-up slice. Until it merges, Tier 2 is a proposal, not a
supported install.

How it's built

flowchart LR
    A[agent tools<br/>claim / update / comment / frontier] --> B[beads/ package<br/>fixed-argv runner + guards]
    P[desktop pane<br/>tree · search · blockers · drafts] -->|host-injected reads & door| H[host: hermes serve]
    H --> B
    B -->|fixed argv, no shell| C[(bd / embedded dolt)]
    C -.plain bd stays fully usable.-> U[you]

Two rules fall out of that picture:

  • Everything crosses one boundary. beads/native.py is the only place a
    process spawns. Fixed argv, an explicit store path and actor every time, and
    an exit-code map that mirrors what bd actually does — so a masked failure
    can't turn into a quiet "success".
  • The pane is a view, not a writer. Reads arrive injected; anything that
    mutates goes through the plugin door or refuses visibly. Delete the plugin
    directory and your beads are exactly as reachable by bd as before.

Search and drafts

beads_frontier answers "what can I pick up" in one bounded call; the pane's
search box rides the same read facade, and the draft editor stages title/
acceptance edits that only land through the bot door:

Search hits over the same bounded read facade

Draft editor: staged edits, nothing writes until the door accepts

Status and honesty

Claim atomicity is non-atomic by design on bd 1.3.0 (claim, then read back
and verify — a race is detected, not prevented); guarded writes rely on bd's
native --if-assignee/--if-status guards; content replacement (title/
description rewrite) is deliberately unsupported through the plugin — edit
content with bd directly. The plugin ships no close/reopen verb: closure is
plain bd close, always has been.

The pane's Write button stays disabled until a qualified runner door exists;
drafts and Ask/Refine are the shipped surface.

For agents and contributors

AGENTS.md is the front door: repo map, test contract, and the rules that keep
the tree publishable. The suite is stdlib-only — no pip installs, no mocks
against the boundary (the tests run a real bd binary against disposable
stores):

# Python half (needs bd on PATH, e.g. BEADS_LAB_BD=/path/to/bd)
for t in tests/test_*.py; do python3 "$t" || exit 1; done

# Desktop half (Node built-in test runner)
node --test tests/test_*.mjs

Both halves run in CI (GitHub Actions) against a pinned Hermes commit;
hermes plugins validate . is the admission gate.

License

MIT — see LICENSE.

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

More by jacobhausler

4 plugins by jacobhausler in the catalog.

jacobhauslerhermes-workflowsAgent-owned workflow graphs for Hermes — a background runner executes a JSON DAG of agent nodes, fan-outs (quorum) and human/machine gates with fingerprint replay-skip resume, cooperative steer, typed failure events and compact status payloads; ships a desktop DAG view, an inline transcript card and the authoring skill with measured budget recipes. Stock Hermes; no patched core required. Disclosure — every workflow run spawns a detached background runner (wf.py run <id>) that survives session end, gateway restart and plugin disable until the graph reaches a boundary or workflow stop; each agent node is a child hermes chat --query-file … --oneshot -Q … inheriting the runner's environment, and a node with profile set runs as that named profile (with its own credentials) only if the target's workflow_team.json lists the launcher; a gate's wait.until_argv and a fan-out's precheck_argv (run once per item before its child spawns) run agent-authored argv directly from the runner, outside Hermes' tool-approval gate (the engine uses no shell, but the shipped machine-watch and incident-response templates use until_argv to run a shell line read from a fixed-name handoff file under $HERMES_HOME, and release-lifecycle one read from a per-run handoff file in the run dir); the runner makes itself the subreaper of its children and SIGTERM/SIGKILLs any process a node leaves running (its own descendants plus pids registered in the run's .proctree_sidecar.jsonl) when the node finishes, retries or the run stops; run and amend send a one-token ping through Hermes' configured providers to check pinned model routes; at gate.held/run.done/run.failed/run.partial and fan-out straggler events the runner reads the API server key from config.yaml (or API_SERVER_KEY) and POSTs a wake turn to the configured Hermes API server — the gate.held, run.done, run.failed and run.partial wakes state they authorize no choice, repair or additional work, while the straggler wake asks the woken session to take one action (steer the open items, accept the partial, or stop the run); a transform_llm_output hook appends a ::workflow{id} card line to replies for runs the session launched in the last 30 minutes; the runner reads WORKFLOW_MAX_SEATS (that key only) from $HERMES_HOME/.env and the active profile's .env; state.db is read read-only, including every profile's session ids and profile names, and status/wait can read runs in sibling profiles' workflows dirs; opt-in settings (all default off) mirror run lifecycle events to an operator-configured https webhook with an optional bearer (outbound_bridge), present held gates into the run owner's own gateway session via plugin message injection (hooks_bridge_allow: approval_bridge, which also needs allow_gateway_injection), and append delegate_task child records to a spool under $HERMES_HOME/plugin-state (hooks_allow: subagent_accounting); state lives under $HERMES_HOME/workflows/ (or a configured runs_root). No other network of its own.Communityautomation5jacobhauslerpinned-foldersA Pinned tab in the Desktop sidebar that files your pinned chats into nested folders: drag to order and nest, folder colors, right-click menus (including Unpin), unread/working badges on collapsed folders, a filter box, open-folder-as-tabs, and layout export/import via the clipboard. Layout stays local to the app; pins belong to the backend. SDK-only build (desktop/plugin.js); no network.CommunityDesktop app3jacobhauslerhermes-rich-uiRich, evidence-backed answer cards — tables, charts, metrics, timelines, sources — rendered inline in the desktop transcript Disclosure — Image and ImageGallery cards load agent-supplied https image URLs (up to 8 per gallery) from any host when the card renders in DesktopCommunityDesktop app2

Developer Mode

Explore built-in Hermes toolsets and actions.

HermesAgent

Developer?

Create a Hermes extension for Desktop or agent workflows.

Developer Section