[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GDFGJV5DFBVGJK5ZK53Z7C":3,"skill-same:01M6GDFGJV5DFBVGJK5ZK53Z7C":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":54,"updatedAt":55,"install":56,"resources":69},"01M6GDFGJV5DFBVGJK5ZK53Z7C","buzz-integration-hermes",null,"Make Hermes Buzz plugin work against local Buzz relay.","zapabob\u002FSkills","zapabob","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F130830376?v=4","01M6DBMYZAGRTFQDSQYW3W764P","峯岸 亮","01M6DBMZ3GKDSJ01NZ9XTZD7JD",2,"MIT","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002Fb9\u002Fb9e8d8d0d0dc9a220e478aebd653265762fe07127811387fb07767d30bb74f44\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37],"integration","hermes","buzz","buzz integration hermes","macos","linux","windows","plugin","hermes agent","work","local","relay","make","Nostr","2026-11-10 10:12:30",false,"---\r\nname: buzz-integration-hermes\r\ndescription: Make Hermes Buzz plugin work against local Buzz relay.\r\nversion: 1.0.0\r\nauthor: Hermes Agent\r\nlicense: MIT\r\nplatforms: [windows, linux, macos]\r\ntags: [buzz, nostr, plugin, integration, relay]\r\n---\r\n\r\n\"\"\"Buzz plugin — registers toolset `buzz` with runtime-gated handlers.\r\n\r\nDesign:\r\n- Pure functions returning JSON strings.\r\n- No hard dependency on a running relay; missing prereqs surface\r\n  JSON error payloads so the agent can report them faithfully.\r\n- Docker compose shortcuts are provided for local dev when\r\n  `vendor\u002Fbuzz` contains a compose file.\r\n- `BUZZ_BIN` can point at a native `buzz` CLI for channel\u002Fmessage\u002Fkeypair tools.\r\n\"\"\"\r\n\r\n## Buzz (Block\u002FSquare Nostr agent workspace) Hermes Integration\r\n\r\n### Overview\r\nBuzz is an open-source \"human + AI agent collaborative workspace\" built on Nostr relays (Rust). This skill documents the minimal steps to make the Hermes `plugins\u002Fbuzz\u002F` toolset actually work against a local Buzz relay.\r\n\r\n### Prerequisites\r\n- Buzz repo cloned as submodule at `vendor\u002Fbuzz\u002F`\r\n- `vendor\u002Fbuzz\u002Fdocker-compose.yml` — 開発 infra 用で relay が不足。実運用\u002Fローカル検証は `vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml` を使う。\r\n- `vendor\u002Fbuzz\u002Fbuzz.exe` — 無い場合は既存の `%USERPROFILE%\\.cargo\\bin\\buzz.EXE` など PATH 内バイナリを利用できる。`plugins\u002Fbuzz\u002Ftools.py` は `vendor\u002Fbuzz\u002Ftarget\u002Frelease\u002Fbuzz.exe` も自動探索する。\r\n- `vendor\u002Fbuzz\u002F.env` — Hermes ツールは `vendor\u002Fbuzz\u002F.env` を読まない。Hermes buzz ツールに渡す場合は明示的に `BUZZ_BIN`\u002F`BUZZ_RELAY_URL` を設定するか、ツール側の `.env` 読込を確認する。\r\n\r\n## Local Same-Machine Agent Interaction\r\nFor Hermes-to-other-AI messaging on the same host, Tailscale\u002FNgrok are **not required**. Start the relay stack locally and point `BUZZ_RELAY_URL` at `http:\u002F\u002Flocalhost:3000` or the observed local relay URL. External exposure only becomes necessary when another machine must reach this relay.\r\n\r\n### Configuration\r\n1. **Start local relay stack** (`vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002F.env` first, then):\r\n   ```bash\r\n   docker compose -f vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml up -d\r\n   # Verify container health:\r\n   docker compose -f vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml ps\r\n   ```\r\n2. **Generate Nostr private key** (one-time):\r\n   ```bash\r\n   python -c \"import secrets; print(secrets.token_hex(32))\"\r\n   ```\r\n   Add to `vendor\u002Fbuzz\u002F.env`:\r\n   ```env\r\n   BUZZ_PRIVATE_KEY=\u003C64-char-hex>\r\n   BUZZ_RELAY_URL=ws:\u002F\u002Flocalhost:3000\r\n   ```\r\n\r\n2. **Hermes plugin config** — already in `plugins\u002Fbuzz\u002F__init__.py`:\r\n   - Toolset: `buzz`\r\n   - 7 tools: `buzz_relay_status\u002Fstart\u002Fstop`, `buzz_channel_create\u002Flist`, `buzz_message_send\u002Fread`\r\n   - Default relay fallback in `_run()`: `http:\u002F\u002Flocalhost:3000`\r\n\r\n3. **Tailscale exposure** (for tailnet access):\r\n   ```bash\r\n   tailscale serve --bg --set-path \u002Fbuzz --yes http:\u002F\u002Flocalhost:3000\r\n   # Available at https:\u002F\u002Fdownl.taile4f666.ts.net\u002Fbuzz\r\n   # Verify: curl -s https:\u002F\u002Fdownl.taile4f666.ts.net\u002Fbuzz\u002Fhealth\r\n   ```\r\n\r\n4. **Bitwarden backup** (one-time after key generation):\r\n   ```bash\r\n   # Store BUZZ_PRIVATE_KEY in Bitwarden (item: \"Buzz Nostr Private Key\")\r\n   # Verify: item exists, field BUZZ_PRIVATE_KEY present, no plaintext in logs\u002Fmemory\r\n   ```\r\n\r\n### CLI Argument Mapping (Critical)\r\nThe Hermes plugin must match buzz.exe's actual CLI:\r\n| Operation | buzz.exe subcommand | Key flags |\r\n|---|---|---|\r\n| Channel create | `channels create` | `--name`, `--type stream|forum`, `--visibility open|private` |\r\n| Channel list | `channels list` | `--limit` |\r\n| Message send | `messages send` | `--channel \u003CUUID>`, `--content \u003Ctext>` |\r\n| Message read | `messages get` | `--channel \u003CUUID>`, `--limit` |\r\n\r\n### Verification Checklist\r\n```python\r\nimport os, json\r\nos.environ['BUZZ_BIN'] = 'vendor\u002Fbuzz\u002Fbuzz.exe'\r\nfrom plugins.buzz.tools import buzz_relay_status, buzz_channel_list, buzz_channel_create, buzz_message_send, buzz_message_read\r\n\r\n# All should return auth_error (code 3) or user_error (code 1) — NOT CLI syntax errors\r\nfor fn in [buzz_relay_status, buzz_channel_list, buzz_channel_create, buzz_message_send, buzz_message_read]:\r\n    out = fn({})\r\n    data = json.loads(out)\r\n    assert data.get('code') in (1, 2, 3, 4, 5), f'CLI syntax error: {data}'\r\nprint('All tools reach relay correctly')\r\n\r\n# Verify .env auto-loading works\r\nfrom plugins.buzz.tools import _load_buzz_env\r\nenv = _load_buzz_env()\r\nassert 'BUZZ_PRIVATE_KEY' in env, 'Key not loaded from .env'\r\nassert env['BUZZ_PRIVATE_KEY'] == '9a844e43e2df34fac936f8a923980f55a379f6ac1505c4ae43fb2b346cd51f6f'\r\nassert 'BUZZ_RELAY_URL' in env\r\nprint('.env auto-load verified')\r\n```\r\n\r\n### Common Pitfalls\r\n- **Relay port mismatch**: `vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml` exposes **3000** for the relay HTTP\u002FWS port. Do NOT run the relay on 8080 — on this stack `llama-server` already binds 8080, so a buzz relay on 8080 gets shadowed and every request 404s with a `{\"Server\":\"llama.cpp\"}` body instead of the relay's.\r\n- **Wrong subcommand**: old plugin used `channel create` \u002F `message read` — must be `channels create` \u002F `messages get`.\r\n- **Host-authority-exact community matching (the #1 local gotcha)**: Buzz relay is multi-tenant; the community is bound to the *authority* of `RELAY_URL` (after `normalize_host`). Incoming requests are rejected `404: no community is configured for this host` unless the request `Host`\u002Fauthority matches byte-for-byte. If `RELAY_URL=wss:\u002F\u002Flocalhost`, connect with `--relay http:\u002F\u002Flocalhost:3000` — NOT `http:\u002F\u002F127.0.0.1:3000` (127.0.0.1 ≠ localhost). Setting `RELAY_URL=wss:\u002F\u002Fhost.docker.internal` DOES ensure a community *inside the container*, but requests from the Windows host to `http:\u002F\u002Fhost.docker.internal:3000` still 404'd in testing — prefer plain `localhost` for single-host local use. The relay logs `Deployment community ensured host:\u003Cauthority>` at startup; that authority is what every client request must present.\r\n- **buzz.exe global flags go BEFORE the subcommand**: `buzz channels list --format compact` errors with `unexpected argument '--format' found`. Use `buzz --format compact --private-key \u003Chex> --relay \u003Curl> channels list`. `--relay` \u002F `--private-key` \u002F `--auth-tag` \u002F `--format` are all global options (see `buzz --help`), so pass them before the subcommand.\r\n- **Process env doesn't read `.env`**: `os.environ` doesn't auto-load `.env`. Tools must implement `_load_buzz_env()` to read `BUZZ_PRIVATE_KEY` \u002F `BUZZ_RELAY_URL` from `vendor\u002Fbuzz\u002F.env` at runtime.\r\n- **`RELAY_OWNER_PUBKEY` must be 64-char hex (Nostr format), never secp compressed**: deriving the pubkey with coincurve's `format(compressed=True)` yields a 66-char `02…`\u002F`03…` string. The relay logs `WARN RELAY_OWNER_PUBKEY is not a valid 64-char hex pubkey — ignoring` and ownership bootstraps to the wrong key. Strip the prefix: `coincurve.PrivateKey(bytes.fromhex(priv)).public_key.format(compressed=True).hex()[2:]` (64 chars).\r\n- **Zero-filled `BUZZ_RELAY_PRIVATE_KEY` restart-loops the relay**: a placeholder\u002Fzero key makes the container bounce with `invalid BUZZ_RELAY_PRIVATE_KEY: Invalid secret key` (status `restarting`, never healthy). Generate with `openssl rand -hex 32` (or `python -c \"import secrets; print(secrets.token_hex(32))\"`) and pair it with the matching `RELAY_OWNER_PUBKEY` derived above.\r\n- **User-provided nsec must be bech32-decoded with checksum stripped**: when a user hands you an `nsec1...` key (not raw hex), decode it via bech32 — but **strip the final 6 checksum words BEFORE convertbits(5→8)**. Decoding the whole payload yields 36 bytes (72 hex chars) and coincurve rejects it with `Secret scalar must be greater than 0 and less than ...`. Correct sequence: `bech32_decode` → `data[:-6]` → `convertbits(5→8)` → `bytes().hex()` → expect exactly 64 chars. Use `scripts\u002Fnsec_to_hex.py` (also derives the 64-char Nostr pubkey with `--pubkey`, same `[2:]` prefix-strip rule as the owner-pubkey pitfall above). Verified 2026-08-08.\r\n- **Changing `RELAY_URL` re-seeds a NEW community — old channels vanish**: the community is seeded from `RELAY_URL`'s host at startup (`Deployment community ensured host:\u003Cauthority>`). If you change `RELAY_URL` (e.g. from `ws:\u002F\u002Flocalhost:3000` to a public `wss:\u002F\u002F\u003Cngrok-host>`), the relay creates a fresh community for the new host and channels created under the old host no longer appear. Re-create channels (`channels create --name ... --type stream --visibility open`) against the new URL. Verified 2026-08-08: channels created on `localhost` were invisible through the ngrok host until recreated.\r\n\r\n### Public \u002F Hosted Relay (Block `communities.buzz.xyz`)\r\nThe CLI alone cannot self-register on Block's hosted relay. Live probe results:\r\n- `wss:\u002F\u002Fcommunities.buzz.xyz` → 404 (no community for that host).\r\n- `wss:\u002F\u002Frelay.communities.buzz.xyz` → **403 `relay_membership_required`** (this is the real hosted relay endpoint).\r\n- `wss:\u002F\u002Fbuzz.xyz` → 404 (not a relay; serves HTML).\r\n\r\nTo join, membership is invite\u002Faccount-gated. The `buzz` CLI has **no `invite`\u002F`join`\u002F`register` subcommand** — use a Block community invite link (e.g. `https:\u002F\u002F\u003Ccommunity>.communities.buzz.xyz\u002Finvite\u002F...`) or the web\u002Fdesktop app to add your Nostr pubkey as a relay member. After membership is granted, `buzz --relay wss:\u002F\u002Frelay.communities.buzz.xyz ...` reads\u002Fwrites normally. See `references\u002Fbuzz-cli-public-relay.md` for the full probe transcript.\r\n\r\n### When to Use\r\n- When adding\u002Ffixing Hermes Buzz plugin tools\r\n- When verifying local Buzz relay integration\r\n- When exposing Buzz via Tailscale for remote agents\r\n- When Docker Desktop reports launched but `docker info` never becomes responsive\r\n\r\n### Windows Docker Desktop Daemon Recovery (WSL-hang path)\r\nIf Docker Desktop launches but the daemon remains unreachable, the root cause is usually a **hung WSL service**, not Docker itself. Verified 2026-08-08 on this host:\r\n\r\n1. **Confirm the hang signature**: `docker info` times out; `wsl -l -v` also times out (WSL hung, not Docker); `wsl -d docker-desktop -e true` times out. `wsl -l -v` may list distros as `Stopped` while `vmmemWSL`\u002F`vmwp.exe` still hold memory.\r\n2. **Read the logs** — `%LOCALAPPDATA%\\Docker\\log\\host\\`:\r\n   - `Docker Desktop.exe.log` → `[E] backend exited before becoming ready` \u002F `backend process exited`\r\n   - `com.docker.backend.exe.log` \u002F `monitor.log` → `engine linux\u002Fwsl failed to start ... DockerDesktop\u002FWsl\u002FCommandTimedOut: wsl.exe -l -v --all`\r\n   - `electron-errd-\u003Cdate>.log` → error dialog fired from backend\r\n3. **Check disk free space FIRST**: `cmd.exe \u002Fc \"dir C:\\ \u002Fa | findstr 空き\"`. WSL2's VHDX on C: cannot expand when C: is nearly full — this host had ~10GB free and WSL distros would not start. Free temp\u002Fcache (`del \u002Fq \u002Ff \u002Fs \"%LOCALAPPDATA%\\Temp\\*\"`, `npm cache clean --force`, `pip cache purge`) via the `windows-di[REDACTED_TOKEN]` skill, then retry.\r\n4. **Kill the Docker Desktop process tree**, then `wsl --shutdown` (this may itself take 30s+; run it backgrounded with a generous timeout, it is not hung forever):\r\n   ```bash\r\n   cmd.exe \u002Fc \"taskkill \u002FF \u002FIM docker-desktop.exe \u002FT & taskkill \u002FF \u002FIM com.docker.backend.exe \u002FT & taskkill \u002FF \u002FIM \\\"Docker Desktop.exe\\\" \u002FT & taskkill \u002FF \u002FIM wslrelay.exe \u002FT\"\r\n   wsl --shutdown   # then re-list: wsl -l -v\r\n   ```\r\n5. **Service restart needs admin**: `net stop wslservice` \u002F `sc config com.docker.service` → `Error 5: Access Denied` from a non-elevated shell. `sc query WslService` may show RUNNING even while WSL is functionally hung. Do not loop on these — they cannot succeed without elevation.\r\n6. **Only after `wsl -l -v` returns promptly** relaunch Docker Desktop and poll `docker info` with a bounded backoff loop, then `docker compose up`.\r\n7. **Bash env-var trap**: the `terminal` tool runs MSYS bash, where `set CARGO_TARGET_DIR=...` is a **no-op** (sets a positional parameter, not an env var). Use `export VAR=value` or inline `VAR=value cmd`. A cargo build that silently ignores `CARGO_TARGET_DIR` because of `set` looks exactly like a toolchain failure — check this before debugging MSVC\u002Fprobe errors.\r\n8. **Docker-free fallback is a big lift**: `crates\u002Fbuzz-relay` requires PostgreSQL via sqlx (workspace features are `postgres`-only, no sqlite fallback) plus Redis\u002FMinIO. A native relay without Docker means standing up Postgres+Redis on Windows — prefer fixing Docker.\r\n\r\n### External-AI Interaction Completion Rule\r\nDeclare success only after the relay is reachable from the external node and a second identity completes a send\u002Fget round trip on the same channel. A running local stack alone is not sufficient proof of cross-AI communication.\r\n\r\n### Subcommand Drift Guard\r\n`buzz.exe` CLI surface changes across releases. If channel\u002Fmessage tools fail with `unrecognized subcommand`, patch `plugins\u002Fbuzz\u002Ftools.py` to match the installed `buzz.exe --help` exactly.\r\n\r\n### Exact Authority, Scheme, and E2E Rules\r\nBuzz tenancy resolves from the request authority, including a non-default port. Keep `BUZZ_DOMAIN`, `RELAY_URL`, `BUZZ_MEDIA_BASE_URL`, `BUZZ_MEDIA_SERVER_DOMAIN`, and `BUZZ_CORS_ORIGINS` on the same hostname:port; never mix `localhost`, `host.docker.internal`, a Tailscale IP, and a MagicDNS hostname. For a non-TLS local\u002FTailscale relay, use `RELAY_URL=ws:\u002F\u002F\u003Cauthority>` on the relay and `BUZZ_RELAY_URL=http:\u002F\u002F\u003Cauthority>` for the CLI. Using `wss:\u002F\u002F` against a plain HTTP Docker port causes NIP-98 URL mismatch or TLS errors.\r\n\r\nThe relay stack is `vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml`. Plugin helpers should resolve paths from the repository root, detect both `compose.yml` and `docker-compose.yml`, and use a stable compose project name so status checks inspect the intended stack. The native CLI does not load dotenv files; load only `BUZZ_RELAY_URL` and `BUZZ_PRIVATE_KEY` from ignored local dotenv files, never print them, and rotate any key exposed in logs or conversation history.\r\n\r\nThe current CLI surface is plural: `channels list`, `channels create --name \u003CNAME> --type stream --visibility open`, `messages send --channel \u003CUUID> --content \u003CTEXT>`, and `messages get --channel \u003CUUID> --limit \u003CN>`. Global flags such as `--format`, `--private-key`, and `--relay` precede the subcommand. Do not use obsolete singular `message` or nonexistent `keypair` subcommands.\r\n\r\nVerify the real integration through the Hermes handlers in this order: `buzz_relay_status` → `buzz_channel_list` → `buzz_channel_create` → `buzz_message_send` → `buzz_message_read`. A successful self-send proves local\u002FTailscale relay CRUD, but not multi-agent exchange; only claim agent-to-agent communication after a second identity on another node joins the same channel and completes a send\u002Fget round trip. Hosted `wss:\u002F\u002Frelay.communities.buzz.xyz` returning `403 relay_membership_required` is an invite\u002Faccount membership issue, not a CLI syntax failure. See `references\u002Flocal-relay-exact-authority-and-e2e.md` for the reusable runbook.\r\n\r\n### Skill Update Hygiene\r\nThis skill governs relay integration; do not create narrow one-off skills like \"buzz-relay-on-\u003Cdate>\" for environment fixes. Capture durable class-level lessons here or in `references\u002F`, and only escalate to a new umbrella skill when the topic outgrows this relay\u002Fintegration scope.\r\n\r\n### References\r\n- `references\u002Flocal-relay-community-binding.md` — localhost vs `host.docker.internal` community-binding wall, verified working `.env`, exact-authority connect rule, and the 8080\u002Fllama-server shadowing trap.\r\n- `references\u002Flocal-relay-same-host.md` — same-host agent interaction without Tailscale\u002FNgrok, verified local binary resolution and plugin wiring state.\r\n- `references\u002Fbuzz-cli-public-relay.md` — probe results for Block's hosted relay (`wss:\u002F\u002Frelay.communities.buzz.xyz` = 403 membership_required), the no-join-subcommand limitation, and the global-flag-before-subcommand ordering rule.\r\n- `references\u002Fpublic-relay-ngrok-e2e.md` — full ngrok exposure runbook: RELAY_URL→community reseeding, 64-hex owner pubkey derivation, second-identity send\u002Fget round trip (verified 2026-08-08).\r\n- `scripts\u002Fnsec_to_hex.py` — decode a user-provided `nsec1...` to 64-char hex (with `--pubkey` for the Nostr pubkey); encodes the mandatory checksum-strip before convertbits.\r\n\r\n### Related Skills\r\n- `hermes-plugin-development` — general plugin authoring\r\n- `tailscale-serve-config` — tailnet service exposure","\"\"\"Buzz plugin — registers toolset `buzz` with runtime-gated handlers.\r\n\r\nDesign:\r\n- Pure functions returning JSON strings.\r\n- No hard dependency on a running relay; missing prereqs surface\r\n  JSON error payloads so the agent can report them faithfully.\r\n- Docker compose shortcuts are provided for local dev when\r\n  `vendor\u002Fbuzz` contains a compose file.\r\n- `BUZZ_BIN` can point at a native `buzz` CLI for channel\u002Fmessage\u002Fkeypair tools.\r\n\"\"\"\r\n\r\n## Buzz (Block\u002FSquare Nostr agent workspace) Hermes Integration\r\n\r\n### Overview\r\nBuzz is an open-source \"human + AI agent collaborative workspace\" built on Nostr relays (Rust). This skill documents the minimal steps to make the Hermes `plugins\u002Fbuzz\u002F` toolset actually work against a local Buzz relay.\r\n\r\n### Prerequisites\r\n- Buzz repo cloned as submodule at `vendor\u002Fbuzz\u002F`\r\n- `vendor\u002Fbuzz\u002Fdocker-compose.yml` — 開発 infra 用で relay が不足。実運用\u002Fローカル検証は `vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml` を使う。\r\n- `vendor\u002Fbuzz\u002Fbuzz.exe` — 無い場合は既存の `%USERPROFILE%\\.cargo\\bin\\buzz.EXE` など PATH 内バイナリを利用できる。`plugins\u002Fbuzz\u002Ftools.py` は `vendor\u002Fbuzz\u002Ftarget\u002Frelease\u002Fbuzz.exe` も自動探索する。\r\n- `vendor\u002Fbuzz\u002F.env` — Hermes ツールは `vendor\u002Fbuzz\u002F.env` を読まない。Hermes buzz ツールに渡す場合は明示的に `BUZZ_BIN`\u002F`BUZZ_RELAY_URL` を設定するか、ツール側の `.env` 読込を確認する。\r\n\r\n## Local Same-Machine Agent Interaction\r\nFor Hermes-to-other-AI messaging on the same host, Tailscale\u002FNgrok are **not required**. Start the relay stack locally and point `BUZZ_RELAY_URL` at `http:\u002F\u002Flocalhost:3000` or the observed local relay URL. External exposure only becomes necessary when another machine must reach this relay.\r\n\r\n### Configuration\r\n1. **Start local relay stack** (`vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002F.env` first, then):\r\n   ```bash\r\n   docker compose -f vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml up -d\r\n   # Verify container health:\r\n   docker compose -f vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml ps\r\n   ```\r\n2. **Generate Nostr private key** (one-time):\r\n   ```bash\r\n   python -c \"import secrets; print(secrets.token_hex(32))\"\r\n   ```\r\n   Add to `vendor\u002Fbuzz\u002F.env`:\r\n   ```env\r\n   BUZZ_PRIVATE_KEY=\u003C64-char-hex>\r\n   BUZZ_RELAY_URL=ws:\u002F\u002Flocalhost:3000\r\n   ```\r\n\r\n2. **Hermes plugin config** — already in `plugins\u002Fbuzz\u002F__init__.py`:\r\n   - Toolset: `buzz`\r\n   - 7 tools: `buzz_relay_status\u002Fstart\u002Fstop`, `buzz_channel_create\u002Flist`, `buzz_message_send\u002Fread`\r\n   - Default relay fallback in `_run()`: `http:\u002F\u002Flocalhost:3000`\r\n\r\n3. **Tailscale exposure** (for tailnet access):\r\n   ```bash\r\n   tailscale serve --bg --set-path \u002Fbuzz --yes http:\u002F\u002Flocalhost:3000\r\n   # Available at https:\u002F\u002Fdownl.taile4f666.ts.net\u002Fbuzz\r\n   # Verify: curl -s https:\u002F\u002Fdownl.taile4f666.ts.net\u002Fbuzz\u002Fhealth\r\n   ```\r\n\r\n4. **Bitwarden backup** (one-time after key generation):\r\n   ```bash\r\n   # Store BUZZ_PRIVATE_KEY in Bitwarden (item: \"Buzz Nostr Private Key\")\r\n   # Verify: item exists, field BUZZ_PRIVATE_KEY present, no plaintext in logs\u002Fmemory\r\n   ```\r\n\r\n### CLI Argument Mapping (Critical)\r\nThe Hermes plugin must match buzz.exe's actual CLI:\r\n| Operation | buzz.exe subcommand | Key flags |\r\n|---|---|---|\r\n| Channel create | `channels create` | `--name`, `--type stream|forum`, `--visibility open|private` |\r\n| Channel list | `channels list` | `--limit` |\r\n| Message send | `messages send` | `--channel \u003CUUID>`, `--content \u003Ctext>` |\r\n| Message read | `messages get` | `--channel \u003CUUID>`, `--limit` |\r\n\r\n### Verification Checklist\r\n```python\r\nimport os, json\r\nos.environ['BUZZ_BIN'] = 'vendor\u002Fbuzz\u002Fbuzz.exe'\r\nfrom plugins.buzz.tools import buzz_relay_status, buzz_channel_list, buzz_channel_create, buzz_message_send, buzz_message_read\r\n\r\n# All should return auth_error (code 3) or user_error (code 1) — NOT CLI syntax errors\r\nfor fn in [buzz_relay_status, buzz_channel_list, buzz_channel_create, buzz_message_send, buzz_message_read]:\r\n    out = fn({})\r\n    data = json.loads(out)\r\n    assert data.get('code') in (1, 2, 3, 4, 5), f'CLI syntax error: {data}'\r\nprint('All tools reach relay correctly')\r\n\r\n# Verify .env auto-loading works\r\nfrom plugins.buzz.tools import _load_buzz_env\r\nenv = _load_buzz_env()\r\nassert 'BUZZ_PRIVATE_KEY' in env, 'Key not loaded from .env'\r\nassert env['BUZZ_PRIVATE_KEY'] == '9a844e43e2df34fac936f8a923980f55a379f6ac1505c4ae43fb2b346cd51f6f'\r\nassert 'BUZZ_RELAY_URL' in env\r\nprint('.env auto-load verified')\r\n```\r\n\r\n### Common Pitfalls\r\n- **Relay port mismatch**: `vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml` exposes **3000** for the relay HTTP\u002FWS port. Do NOT run the relay on 8080 — on this stack `llama-server` already binds 8080, so a buzz relay on 8080 gets shadowed and every request 404s with a `{\"Server\":\"llama.cpp\"}` body instead of the relay's.\r\n- **Wrong subcommand**: old plugin used `channel create` \u002F `message read` — must be `channels create` \u002F `messages get`.\r\n- **Host-authority-exact community matching (the #1 local gotcha)**: Buzz relay is multi-tenant; the community is bound to the *authority* of `RELAY_URL` (after `normalize_host`). Incoming requests are rejected `404: no community is configured for this host` unless the request `Host`\u002Fauthority matches byte-for-byte. If `RELAY_URL=wss:\u002F\u002Flocalhost`, connect with `--relay http:\u002F\u002Flocalhost:3000` — NOT `http:\u002F\u002F127.0.0.1:3000` (127.0.0.1 ≠ localhost). Setting `RELAY_URL=wss:\u002F\u002Fhost.docker.internal` DOES ensure a community *inside the container*, but requests from the Windows host to `http:\u002F\u002Fhost.docker.internal:3000` still 404'd in testing — prefer plain `localhost` for single-host local use. The relay logs `Deployment community ensured host:\u003Cauthority>` at startup; that authority is what every client request must present.\r\n- **buzz.exe global flags go BEFORE the subcommand**: `buzz channels list --format compact` errors with `unexpected argument '--format' found`. Use `buzz --format compact --private-key \u003Chex> --relay \u003Curl> channels list`. `--relay` \u002F `--private-key` \u002F `--auth-tag` \u002F `--format` are all global options (see `buzz --help`), so pass them before the subcommand.\r\n- **Process env doesn't read `.env`**: `os.environ` doesn't auto-load `.env`. Tools must implement `_load_buzz_env()` to read `BUZZ_PRIVATE_KEY` \u002F `BUZZ_RELAY_URL` from `vendor\u002Fbuzz\u002F.env` at runtime.\r\n- **`RELAY_OWNER_PUBKEY` must be 64-char hex (Nostr format), never secp compressed**: deriving the pubkey with coincurve's `format(compressed=True)` yields a 66-char `02…`\u002F`03…` string. The relay logs `WARN RELAY_OWNER_PUBKEY is not a valid 64-char hex pubkey — ignoring` and ownership bootstraps to the wrong key. Strip the prefix: `coincurve.PrivateKey(bytes.fromhex(priv)).public_key.format(compressed=True).hex()[2:]` (64 chars).\r\n- **Zero-filled `BUZZ_RELAY_PRIVATE_KEY` restart-loops the relay**: a placeholder\u002Fzero key makes the container bounce with `invalid BUZZ_RELAY_PRIVATE_KEY: Invalid secret key` (status `restarting`, never healthy). Generate with `openssl rand -hex 32` (or `python -c \"import secrets; print(secrets.token_hex(32))\"`) and pair it with the matching `RELAY_OWNER_PUBKEY` derived above.\r\n- **User-provided nsec must be bech32-decoded with checksum stripped**: when a user hands you an `nsec1...` key (not raw hex), decode it via bech32 — but **strip the final 6 checksum words BEFORE convertbits(5→8)**. Decoding the whole payload yields 36 bytes (72 hex chars) and coincurve rejects it with `Secret scalar must be greater than 0 and less than ...`. Correct sequence: `bech32_decode` → `data[:-6]` → `convertbits(5→8)` → `bytes().hex()` → expect exactly 64 chars. Use `scripts\u002Fnsec_to_hex.py` (also derives the 64-char Nostr pubkey with `--pubkey`, same `[2:]` prefix-strip rule as the owner-pubkey pitfall above). Verified 2026-08-08.\r\n- **Changing `RELAY_URL` re-seeds a NEW community — old channels vanish**: the community is seeded from `RELAY_URL`'s host at startup (`Deployment community ensured host:\u003Cauthority>`). If you change `RELAY_URL` (e.g. from `ws:\u002F\u002Flocalhost:3000` to a public `wss:\u002F\u002F\u003Cngrok-host>`), the relay creates a fresh community for the new host and channels created under the old host no longer appear. Re-create channels (`channels create --name ... --type stream --visibility open`) against the new URL. Verified 2026-08-08: channels created on `localhost` were invisible through the ngrok host until recreated.\r\n\r\n### Public \u002F Hosted Relay (Block `communities.buzz.xyz`)\r\nThe CLI alone cannot self-register on Block's hosted relay. Live probe results:\r\n- `wss:\u002F\u002Fcommunities.buzz.xyz` → 404 (no community for that host).\r\n- `wss:\u002F\u002Frelay.communities.buzz.xyz` → **403 `relay_membership_required`** (this is the real hosted relay endpoint).\r\n- `wss:\u002F\u002Fbuzz.xyz` → 404 (not a relay; serves HTML).\r\n\r\nTo join, membership is invite\u002Faccount-gated. The `buzz` CLI has **no `invite`\u002F`join`\u002F`register` subcommand** — use a Block community invite link (e.g. `https:\u002F\u002F\u003Ccommunity>.communities.buzz.xyz\u002Finvite\u002F...`) or the web\u002Fdesktop app to add your Nostr pubkey as a relay member. After membership is granted, `buzz --relay wss:\u002F\u002Frelay.communities.buzz.xyz ...` reads\u002Fwrites normally. See `references\u002Fbuzz-cli-public-relay.md` for the full probe transcript.\r\n\r\n### When to Use\r\n- When adding\u002Ffixing Hermes Buzz plugin tools\r\n- When verifying local Buzz relay integration\r\n- When exposing Buzz via Tailscale for remote agents\r\n- When Docker Desktop reports launched but `docker info` never becomes responsive\r\n\r\n### Windows Docker Desktop Daemon Recovery (WSL-hang path)\r\nIf Docker Desktop launches but the daemon remains unreachable, the root cause is usually a **hung WSL service**, not Docker itself. Verified 2026-08-08 on this host:\r\n\r\n1. **Confirm the hang signature**: `docker info` times out; `wsl -l -v` also times out (WSL hung, not Docker); `wsl -d docker-desktop -e true` times out. `wsl -l -v` may list distros as `Stopped` while `vmmemWSL`\u002F`vmwp.exe` still hold memory.\r\n2. **Read the logs** — `%LOCALAPPDATA%\\Docker\\log\\host\\`:\r\n   - `Docker Desktop.exe.log` → `[E] backend exited before becoming ready` \u002F `backend process exited`\r\n   - `com.docker.backend.exe.log` \u002F `monitor.log` → `engine linux\u002Fwsl failed to start ... DockerDesktop\u002FWsl\u002FCommandTimedOut: wsl.exe -l -v --all`\r\n   - `electron-errd-\u003Cdate>.log` → error dialog fired from backend\r\n3. **Check disk free space FIRST**: `cmd.exe \u002Fc \"dir C:\\ \u002Fa | findstr 空き\"`. WSL2's VHDX on C: cannot expand when C: is nearly full — this host had ~10GB free and WSL distros would not start. Free temp\u002Fcache (`del \u002Fq \u002Ff \u002Fs \"%LOCALAPPDATA%\\Temp\\*\"`, `npm cache clean --force`, `pip cache purge`) via the `windows-di[REDACTED_TOKEN]` skill, then retry.\r\n4. **Kill the Docker Desktop process tree**, then `wsl --shutdown` (this may itself take 30s+; run it backgrounded with a generous timeout, it is not hung forever):\r\n   ```bash\r\n   cmd.exe \u002Fc \"taskkill \u002FF \u002FIM docker-desktop.exe \u002FT & taskkill \u002FF \u002FIM com.docker.backend.exe \u002FT & taskkill \u002FF \u002FIM \\\"Docker Desktop.exe\\\" \u002FT & taskkill \u002FF \u002FIM wslrelay.exe \u002FT\"\r\n   wsl --shutdown   # then re-list: wsl -l -v\r\n   ```\r\n5. **Service restart needs admin**: `net stop wslservice` \u002F `sc config com.docker.service` → `Error 5: Access Denied` from a non-elevated shell. `sc query WslService` may show RUNNING even while WSL is functionally hung. Do not loop on these — they cannot succeed without elevation.\r\n6. **Only after `wsl -l -v` returns promptly** relaunch Docker Desktop and poll `docker info` with a bounded backoff loop, then `docker compose up`.\r\n7. **Bash env-var trap**: the `terminal` tool runs MSYS bash, where `set CARGO_TARGET_DIR=...` is a **no-op** (sets a positional parameter, not an env var). Use `export VAR=value` or inline `VAR=value cmd`. A cargo build that silently ignores `CARGO_TARGET_DIR` because of `set` looks exactly like a toolchain failure — check this before debugging MSVC\u002Fprobe errors.\r\n8. **Docker-free fallback is a big lift**: `crates\u002Fbuzz-relay` requires PostgreSQL via sqlx (workspace features are `postgres`-only, no sqlite fallback) plus Redis\u002FMinIO. A native relay without Docker means standing up Postgres+Redis on Windows — prefer fixing Docker.\r\n\r\n### External-AI Interaction Completion Rule\r\nDeclare success only after the relay is reachable from the external node and a second identity completes a send\u002Fget round trip on the same channel. A running local stack alone is not sufficient proof of cross-AI communication.\r\n\r\n### Subcommand Drift Guard\r\n`buzz.exe` CLI surface changes across releases. If channel\u002Fmessage tools fail with `unrecognized subcommand`, patch `plugins\u002Fbuzz\u002Ftools.py` to match the installed `buzz.exe --help` exactly.\r\n\r\n### Exact Authority, Scheme, and E2E Rules\r\nBuzz tenancy resolves from the request authority, including a non-default port. Keep `BUZZ_DOMAIN`, `RELAY_URL`, `BUZZ_MEDIA_BASE_URL`, `BUZZ_MEDIA_SERVER_DOMAIN`, and `BUZZ_CORS_ORIGINS` on the same hostname:port; never mix `localhost`, `host.docker.internal`, a Tailscale IP, and a MagicDNS hostname. For a non-TLS local\u002FTailscale relay, use `RELAY_URL=ws:\u002F\u002F\u003Cauthority>` on the relay and `BUZZ_RELAY_URL=http:\u002F\u002F\u003Cauthority>` for the CLI. Using `wss:\u002F\u002F` against a plain HTTP Docker port causes NIP-98 URL mismatch or TLS errors.\r\n\r\nThe relay stack is `vendor\u002Fbuzz\u002Fdeploy\u002Fcompose\u002Fcompose.yml`. Plugin helpers should resolve paths from the repository root, detect both `compose.yml` and `docker-compose.yml`, and use a stable compose project name so status checks inspect the intended stack. The native CLI does not load dotenv files; load only `BUZZ_RELAY_URL` and `BUZZ_PRIVATE_KEY` from ignored local dotenv files, never print them, and rotate any key exposed in logs or conversation history.\r\n\r\nThe current CLI surface is plural: `channels list`, `channels create --name \u003CNAME> --type stream --visibility open`, `messages send --channel \u003CUUID> --content \u003CTEXT>`, and `messages get --channel \u003CUUID> --limit \u003CN>`. Global flags such as `--format`, `--private-key`, and `--relay` precede the subcommand. Do not use obsolete singular `message` or nonexistent `keypair` subcommands.\r\n\r\nVerify the real integration through the Hermes handlers in this order: `buzz_relay_status` → `buzz_channel_list` → `buzz_channel_create` → `buzz_message_send` → `buzz_message_read`. A successful self-send proves local\u002FTailscale relay CRUD, but not multi-agent exchange; only claim agent-to-agent communication after a second identity on another node joins the same channel and completes a send\u002Fget round trip. Hosted `wss:\u002F\u002Frelay.communities.buzz.xyz` returning `403 relay_membership_required` is an invite\u002Faccount membership issue, not a CLI syntax failure. See `references\u002Flocal-relay-exact-authority-and-e2e.md` for the reusable runbook.\r\n\r\n### Skill Update Hygiene\r\nThis skill governs relay integration; do not create narrow one-off skills like \"buzz-relay-on-\u003Cdate>\" for environment fixes. Capture durable class-level lessons here or in `references\u002F`, and only escalate to a new umbrella skill when the topic outgrows this relay\u002Fintegration scope.\r\n\r\n### References\r\n- `references\u002Flocal-relay-community-binding.md` — localhost vs `host.docker.internal` community-binding wall, verified working `.env`, exact-authority connect rule, and the 8080\u002Fllama-server shadowing trap.\r\n- `references\u002Flocal-relay-same-host.md` — same-host agent interaction without Tailscale\u002FNgrok, verified local binary resolution and plugin wiring state.\r\n- `references\u002Fbuzz-cli-public-relay.md` — probe results for Block's hosted relay (`wss:\u002F\u002Frelay.communities.buzz.xyz` = 403 membership_required), the no-join-subcommand limitation, and the global-flag-before-subcommand ordering rule.\r\n- `references\u002Fpublic-relay-ngrok-e2e.md` — full ngrok exposure runbook: RELAY_URL→community reseeding, 64-hex owner pubkey derivation, second-identity send\u002Fget round trip (verified 2026-08-08).\r\n- `scripts\u002Fnsec_to_hex.py` — decode a user-provided `nsec1...` to 64-char hex (with `--pubkey` for the Nostr pubkey); encodes the mandatory checksum-strip before convertbits.\r\n\r\n### Related Skills\r\n- `hermes-plugin-development` — general plugin authoring\r\n- `tailscale-serve-config` — tailnet service exposure",{"name":5,"tags":43,"author":45,"license":15,"version":46,"platforms":47,"description":7},[26,44,31,24,35],"nostr","Hermes Agent","1.0.0",[30,29,28],"main","0d1434f89f4bc6b07e9d272accd8c1013768820f","archive\u002Fskill-md-reviewed\u002Fsha256\u002Fb9\u002Fb9e8d8d0d0dc9a220e478aebd653265762fe07127811387fb07767d30bb74f44",0,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills","https:\u002F\u002Fgithub.com\u002Fzapabob","The Open University of JAPAN　2019-now\r\n\r\nTokyo University of Science　2007-2010","2026-10-26 16:29:01",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add zapabob\u002FSkills --skill buzz-integration-hermes",{"tool":62,"command":63},"bunx","bunx skills add zapabob\u002FSkills --skill buzz-integration-hermes",{"tool":65,"command":66},"pnpm","pnpm dlx skills add zapabob\u002FSkills --skill buzz-integration-hermes","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002Fb9\u002Fb9e8d8d0d0dc9a220e478aebd653265762fe07127811387fb07767d30bb74f44\u002FSKILL.md",true,[],[71,100,135,162,189,206],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":86,"publishedAt":38},"01M6GJTE1GESGGF9K028Y7753E","xurl","X\u002FTwitter via xurl CLI: post, search, DM, media, v2 API.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fxurl\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[77,80,81],{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[73,87,28,88,89,29,30,90,91,92,93,94,95,25,32,96,48,97,98,99],"openclaw","cli","github","official","search","https","social-media","api","Media","twitter","social","via","post",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":117,"publishedAt":38},"01M6GJT8S1PXQ8WPXT1HSNBWH2","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwriting-plans\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[106,109,112,113,114],{"categoryNo":107,"categoryName":108,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":110,"categoryName":111,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},{"categoryNo":115,"categoryName":116,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000036","内容创作者",[118,119,120,121,28,122,29,123,30,124,125,126,127,128,129,130,131,132,133,134],"writing","writing plans","plans","design","review","workflow","documentation","tasks","development","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":144,"publishedAt":38},"01M6GJST0H5X7WHBJ3BZK0DVKH","whisper","OpenAI's general-purpose speech recognition model. Supports 99 languages, transcription, translation to English, and language identification. Six model sizes from tiny (39M params) to large (1550M params). Use for speech-to-text, podcast transcription, or multilingual audio processing. Best for robust, multilingual ASR.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwhisper\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[141],{"categoryNo":142,"categoryName":143,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[137,28,29,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],"openai","speech","multimodal","Transformers","ASR","Audio","text","model","speech recognition","use","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":171,"publishedAt":38},"01M6GJSMRQ8EETZTYMG72P70EA","weights-and-biases","W&B: log ML experiments, sweeps, model registry, dashboards.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fweights-and-biases\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[168],{"categoryNo":169,"categoryName":170,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",[172,28,173,174,30,175,176,177,178,179,180,152,181,182,183,184,185,186,187,188],"weights and biases","tensorflow","experiments","pytorch","visualization","registry","real-time","tuning","dashboards","experiment","log","time","Experiment Tracking","Model Registry","Hyperparameter Tuning","WandB","Real-Time Visualization",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":196,"publishedAt":38},"01M6GJS19KDPRY112JTR326S06","watchers","Poll RSS, JSON APIs, and GitHub with watermark dedup.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[195],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[191,28,197,89,29,198,199,200,201,202,203,25,32,204,205],"terminal","automation","http","monitoring","cron","json","rss","devops","with",{"skillNo":207,"name":208,"nameZh":6,"description":209,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":210,"categories":211,"keywords":214,"publishedAt":38},"01M6GJRHJD2A6Q830SWF9W48BC","serving-llms-vllm","vLLM: high-throughput LLM serving, OpenAI API, quantization.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fvllm\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[212,213],{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},[215,216,217,29,218,145,219,220,221,148,222,94,223,224,225,226,227,228,229,230],"llms","vLLM","serving llms vllm","research","openai api","tensor","Inference Serving","Production","llm serving","High Throughput","PagedAttention","Continuous Batching","Quantization","Tensor Parallelism","high-throughput","throughput"]