mybot.farm → Hermes
Native Hermes Agent plugin (v0.3.0). Headline path: enable the plugin → open Hermes Desktop → browse the farm → Recruit into the Bots roster. CLI tools still search, plant, reinstall, and post GAF listings with a seller API key.
Install page: https://mybot.farm/install/hermes
What it does
| Tool | Purpose |
|---|---|
farm_search |
GET /api/stalls?q= — matching stalls (slug, kind, title, URLs) |
farm_get_pack |
GET /api/packs/{slug} — GAF JSON: members, skills, shared.gettingStarted |
farm_get_stall |
GET /api/stalls/{slug} — stall metadata including member tarball hrefs |
farm_plant |
Download + hermes profile import. Teams: member tarballs, ~/.hermes/teams/<slug>, TEAM.md/WORK.md/cron, Bot-mode seating, team-rules skill, group chat when a gateway RPC URL is set |
farm_reinstall |
GAP 2 clean path: clear ~/.hermes/profiles/.deleted/<name> tombstones, optionally wipe old profiles/team/board, then plant again and verify hermes profile list |
farm_post |
POST /api/listings — publish or update a GAF stall (seller API key). Same slug owned by you bumps packVersion and records revision history. Not a Hermes tarball. |
farm_update |
Same as farm_post with required slug — in-place GAF update (skills, soul/memory). Omit packVersion to auto-increment. |
Default plant is safe. Live profiles are never deleted unless force is true. Team dir and kanban board are never wiped unless clean is true. Tombstones (leftover delete markers, not live agents) are always cleared before import.
Plant vs post: farm_plant still imports Hermes .tar.gz profiles. farm_post publishes GAF JSON to the farm. There is no client-side Hermes-tarball→GAF translator in this plugin — export/convert elsewhere (see scripts/README.md / toGAF). Scrub with scripts/scrub.py before you share an archive; posting still expects a GAF object.
Desktop UI (browse the farm, one-click Recruit)
desktop/plugin.js is the desktop half of this package: a Farm sidebar page that
browses the live mybot.farm catalog (search, All/Agents/Teams filter, stall detail
with members) and hands Recruit to the active profile's agent via
session.create + prompt.submit (a new "Farm · " chat runs farm_plant
with recruit: true for solo agents; teams plant as Bots as usual), plus
⌘K mybot.farm: Open catalog. Stall detail also has Page to open the listing
on the farm. Plant-as-plain-profile and Replant stay on the CLI / tool — the
desktop is for bringing stalls onto the Bots roster.
Recruit: Solo agents pass recruit: true to farm_plant, which stamps
ui_meta.hermes-bots on the imported profile.yaml after import — the same
marker the desktop's own create-bot dialog writes — so the agent lands in the
Desktop Bots roster as a first-class Bot (Bot Chat registry, DM-eligible via
message_agent). Team members are always recruited by team plant.
The catalog is public and CORS-open (access-control-allow-origin: *), so the page
fetches https://mybot.farm/api/stalls directly — no backend half needed.
Live door: ~/.hermes/desktop-plugins/mybot-farm/plugin.js (hot-reloads on save;
fallback ⌘K → "Reload desktop plugins"). Note: the unified-package door
(plugins/mybot-farm/desktop/plugin.js) only auto-materializes when the plugin
folder is a REAL directory — Electron's materializer filters readdir(withFileTypes)
on isDirectory(), and Node reports a symlinked folder as a non-dir, so a symlinked
~/.hermes/plugins/mybot-farm install (this machine) must use the standalone door
above. Both are kept byte-identical.
Install (from a checkout)
hermes plugins install takes a Git URL or owner/repo[/subdir], not a local folder. From this repo:
mkdir -p ~/.hermes/plugins
ln -sfn "$(pwd)/packages/hermes-mybot-farm" ~/.hermes/plugins/mybot-farm
hermes plugins enable mybot-farm
Then open Hermes Desktop → sidebar Farm (or ⌘K → mybot.farm: Open catalog) → browse → Recruit. That is the headline path. CLI smoke below is secondary.
Copy the folder instead of linking if you want Desktop to auto-materialize desktop/plugin.js (a symlink install uses the standalone door above).
GitHub (private repo needs your git credentials). Subdir is required — this plugin is not at the repo root:
hermes plugins install okita-io/mybot-farm/packages/hermes-mybot-farm --enable
After catalog admission (SHA-pinned, public clone):
hermes plugins install mybot-farm
hermes plugins enable mybot-farm
Draft catalog YAML + tag checklist: catalog/.
Validate. Current Hermes git has hermes plugins validate <dir>. PyPI hermes-agent 0.19.0 does not (only install/list/enable/disable):
hermes plugins validate ./packages/hermes-mybot-farm
python3 -m unittest discover -s packages/hermes-mybot-farm/tests -v
CLI smoke (no agent loop)
Secondary to Desktop Recruit. Solo Recruit from CLI: pass recruit: true to farm_plant (same Bot stamp as the desktop button).
python3 packages/hermes-mybot-farm/bin/farm-plant search workbench
python3 packages/hermes-mybot-farm/bin/farm-plant get scholastic-research
python3 packages/hermes-mybot-farm/bin/farm-plant stall workbench
python3 packages/hermes-mybot-farm/bin/farm-plant plant scholastic-research --dry-run
python3 packages/hermes-mybot-farm/bin/farm-plant post --kind agent --name "Smoke Bot" \
--title "API key smoke listing" --description "Minimal free GAF listing." \
--category Experimental --price-cents 0 --pack ./smoke.gaf.json --dry-run
python3 packages/hermes-mybot-farm/bin/farm-plant post --kind team --name "Smoke Crew" \
--title "Two-agent smoke team" --description "Minimal free team listing." \
--category Experimental --price-cents 0 --pack ./smoke-crew.gaf.json --dry-run
python3 packages/hermes-mybot-farm/bin/farm-plant clear-tombstones
A full import of Scholastic Research (one profile) or Workbench (three + board) needs hermes on PATH. Prefer --dry-run first.
Env: MYBOT_FARM_URL, MYBOT_FARM_API_KEY (seller key from https://mybot.farm/sell; see docs/api-keys.md), HERMES_HOME, HERMES_BIN. Plugin config apiKey is the fallback when the env var is unset.
Post a listing (farm_post)
Create a seller key on https://mybot.farm/sell. Prefer MYBOT_FARM_API_KEY for unattended use (never commit it).
export MYBOT_FARM_API_KEY=mbf_YOUR_KEY
python3 packages/hermes-mybot-farm/bin/farm-plant post \
--kind agent --name "Smoke Bot" --title "API key smoke listing" \
--description "Minimal free GAF listing posted with a seller API key." \
--category Experimental --price-cents 0 --pack ./smoke.gaf.json
--json prints machine-readable JSON. --dry-run validates locally and prints a payload summary (key redacted) without POSTing.
- Free (
--price-cents 0): no Stripe Connect required. - Paid (
200–999900cents): seller account must have Connect transfers active, else403 connect_required. categoryis an exact farm label (Lifestyle,Coding,Experimental,Personal finance,Ops / admin, …) — not the slug.- Pack is GAF JSON (object or
--packpath). Hermes tarballs are for plant, not post. - Teams:
--kind teamplus amybot.farm/team-packwith at least twomembers[](role,summary,pack).
Ask the agent to call farm_post with the same fields (pack object or packPath). Never pass a seller key in tool arguments — env MYBOT_FARM_API_KEY or plugin config apiKey only. packPath must be a .json file under the plugin packs dir, ~/.hermes/farm, ~/.hermes/packs, or MYBOT_FARM_PACK_DIR. For a team, pass kind: "team" and a mybot.farm/team-pack with members[] (at least two).
GAP 2
After hermes profile delete <name>, Hermes leaves ~/.hermes/profiles/.deleted/<name>. Import of the same name extracts files and prints success, but the profile stays off hermes profile list / non-spawnable. This plugin clears matching tombstones before every import (and after force deletes, which create new ones). Standalone:
python3 packages/hermes-mybot-farm/scripts/clear-tombstones.py workbench-spec
License
MIT. Pack content keeps upstream attribution from each GAF manifest.