$npx -y skills add mvschwarz/openrig --skill openrig-herdrUse when opening OpenRig fleet terminals as a herdr wall — turning a rig, pod, mission, slice, or saved view into live interactive agent tiles via rig terminal, watching another rig read-only, or driving herdr on an agent's request ("open all my rigs + a mission as views"). Cov
| 1 | # openrig-herdr |
| 2 | |
| 3 | OpenRig decides **which** agents make up a view (a rig, a pod, a mission, a slice, or a saved |
| 4 | group); **herdr** renders the pixels. A view opens as live, interactive terminal tiles — each tile |
| 5 | is a nested `tmux attach` to a daemon-owned agent session, so you get the real session, not a |
| 6 | snapshot. OpenRig owns the semantics; herdr owns the surface. You drive it entirely through the |
| 7 | `rig terminal` CLI, which rides the installed herdr binary at arm's length — never link, embed, or |
| 8 | plugin it. |
| 9 | |
| 10 | ## The whole surface — three verbs |
| 11 | |
| 12 | ```bash |
| 13 | rig terminal open <view> [--provider herdr|cmux] [--json] # herdr is the default provider |
| 14 | rig terminal views [--json] # list openable views (saved + derived) |
| 15 | rig terminal status [--provider] [--json] # provider liveness / health |
| 16 | ``` |
| 17 | |
| 18 | `<view>` resolves, in order, to one of: |
| 19 | - a **rig name** — every live agent in that rig, auto-laid-out; |
| 20 | - **`pod:<rig>/<podNamespace>`** — every live agent in one pod of a rig (the rig's inventory filtered by pod); |
| 21 | - **`mission:<id>`** — the agents working that mission (derived live from topology); |
| 22 | - **`slice:<id>`** — the agents working that slice (derived live); |
| 23 | - a **saved-view name** — a user-defined group (see Saved views). |
| 24 | |
| 25 | ## Compose a view from a sentence |
| 26 | |
| 27 | An agent asked "open all my rigs plus a mission as views" runs one `open` per target: |
| 28 | |
| 29 | ```bash |
| 30 | rig terminal open acme-web # a whole rig, live agents as tiles |
| 31 | rig terminal open mission:site-relaunch # exactly the agents working the mission |
| 32 | rig terminal open slice:02-search-filters # the agents working one slice |
| 33 | ``` |
| 34 | |
| 35 | No hand-listing of seats: the mission/slice membership is derived from live topology at open time. |
| 36 | |
| 37 | ## Read the result honestly — partial and degrade |
| 38 | |
| 39 | The result is a partition — every seat lands in exactly one bucket, each **named**: |
| 40 | |
| 41 | - **opened** — the live agents now showing as tiles. |
| 42 | - **absent** — seats in the view that aren't currently live: **named and skipped, never silently |
| 43 | dropped.** A view that opens *some* of its seats is a success (the partial is disclosed) and exits |
| 44 | **0**. Only a view where **no** pane opens exits **non-zero**. |
| 45 | - **degraded** — an agent that structurally cannot tile, named **with the reason**. The v1 case: |
| 46 | an agent on a host registered over HTTP has no ssh path, so its tile can't be composed — it reads |
| 47 | as **"host `<id>` is http-registered; tiles need ssh"** and is skipped, never dropped. (ssh-reachable |
| 48 | hosts tile via an ssh-wrapped attach; full http-host tiling is deferred to the cross-host transport |
| 49 | seam.) |
| 50 | |
| 51 | Read `--json` to branch on the partition programmatically; the exit code alone tells you opened-something |
| 52 | (0) vs opened-nothing (non-zero). |
| 53 | |
| 54 | ## Read-only — who's interactive, who's watch-only |
| 55 | |
| 56 | Read-only is composed into the pane at open time — a read-only tile is a `tmux attach -r`, the client |
| 57 | reports `readonly=1`, and it **physically cannot send input**. The current policy, by view kind: |
| 58 | |
| 59 | - **A rig view or a `pod:` view is interactive** — you asked for that rig (or pod) directly, so you |
| 60 | can drive its agents. |
| 61 | - **`mission:` and `slice:` views are read-only by construction** — these derived views cut across |
| 62 | rigs; you watch and scroll, you don't keystroke into them. |
| 63 | - **A saved view is per-member** — each member carries its own `readOnly` (omit = interactive; |
| 64 | `true` = `attach -r`). |
| 65 | |
| 66 | So you don't have to remember to be careful: the view kind (and, for a saved view, the per-member |
| 67 | flag) sets it at open time. |
| 68 | |
| 69 | ## Safety rails (hard — the fleet-safety rail) |
| 70 | |
| 71 | - A tile is a **view** (a nested `tmux attach`) of a daemon-owned session. **Never** move, join, kill, |
| 72 | or re-parent a daemon-owned pane. Closing a tile detaches one tmux client — the daemon's session is |
| 73 | untouched and its addressing (send/capture/nudge) is unaffected. |
| 74 | - Host-local read-only viewing mutates nothing. Anything that would change a **live** daemon session's |
| 75 | shared state (e.g. flipping a tmux option on a running seat) i |