Standard parts bought in
Sheet 1 drew the assembly. These are the parts nobody on this drawing made. A Rove plugin is a directory with a rove-plugin.toml manifest — that is the whole requirement. There is no required SDK, because the entire Rove CLI is the plugin API.
also
Anything you can script against your fleet, you can ship to someone else.
Note 1 — Mating interface Fig. 1
A plugin bolts on through one face: the manifest. Rove reads it, and from then on the plugin is ordinary argv that Rove knows when to launch — on a daemon event, on demand, or as a pane tab in a task workspace.
There is no required SDK. Anything you can already script against your fleet — a rove api verb, a shell one-liner, a binary you wrote — is a plugin the moment you put a manifest beside it. A TypeScript SDK, @sma1lboy/rove-plugin-sdk, exists and is optional; it is drawn in hidden line for exactly that reason.
Note 2 — Parts list First-party examples
| Item | Part no. | Description | Source | Qty |
|---|---|---|---|---|
| 1 | Sma1lboy/rove-plugins/notify | Desktop or ntfy notification when an agent finishes a turn or needs input | First party | 1 |
| 2 | Sma1lboy/rove-plugins/github-start | Start a task straight from a GitHub issue or pull request | First party | 1 |
| 3 | Sma1lboy/rove-plugins/worktree-include | Copy chosen ignored files into every new worktree | First party | 1 |
| 4 | Sma1lboy/rove-plugins/linear-start | Pick a Linear issue with fzf and start a task on its branch | First party | 1 |
| 5 | Sma1lboy/rove-plugins/browser | A real Chromium rendered as terminal cells in a pane tab | First party | 1 |
| 6 | Sma1lboy/rove-plugins/lazygit | Open lazygit on the task worktree, in a terminal-tab pane | First party | 1 |
Fit a part with rove plugin install <part no.>. One repository holds all six, so the trailing segment selects one — that is what owner/repo/subdir is for. rove plugin list reports what is fitted.
These six ship as examples, not as a curated shelf. Each one is a workflow that does not belong in every install: a notification channel, two starting points from an issue tracker, a file-copy rule, a browser, a git UI.
The browser and lazygit parts both arrive as [[panes]] — a terminal tab inside the task workspace, running in the task's own worktree. Nothing about a pane is special-cased for them.
Note 3 — Engine contribution Fig. 2
A plugin can contribute an engine. An [[engines]] entry registers one with a display name, a launch command, a screen manifest and an identity — the same four things the built-in engines supply, entering the same socket.
One difference, and it is deliberate. The built-in contrib catalogue only offers an engine once it finds that engine's binary; a plugin engine is offered without that look-up. Installing the plugin is the opt-in — you already said yes when you fitted the part, so there is nothing left to detect.
The screen manifest is what lets Rove read state off a terminal it has never seen: rules that map lines on screen to working, blocked, and the rest. Sheet 1's sidebar marks come from exactly that.
Note 4 — Manifest specimen rove-plugin.toml
id = "acme.lazygit" name = "Lazygit" version = "0.1.0" min_rove_version = "0.9.0" [[panes]] id = "git" title = "lazygit" command = ["lazygit"] # cwd = the task worktree
Specimen only — nine lines, of which the first four are the whole requirement. Everything after the blank line is one optional contribution.
Four fields identify the part: an id, a name, a version, and the oldest Rove it works on. A manifest carrying only those four is valid, and a plugin that does nothing else is a plugin.
Everything below the blank line is a contribution — something the plugin adds to the product. Panes, events, actions and engines are each a table array, so a manifest may carry none of them, one of them, or all four.
command is argv, not a shell string. Rove launches it directly.
Note 5 — Catalogue in service Fig. 3
Caution — read the manifest first
These are community repositories, listed automatically and reviewed by nobody. A plugin runs with your shell's privileges, so read the manifest before you install.
A plugin is not sandboxed and it is not inspected. Whatever your own commands can reach — your files, your keys, your network — it can reach too.
The manifest is short by design, and it lists every command Rove will ever launch. Read it before you install.
Stars, language and push date come from the GitHub API on page load. The six first-party parts in Note 2 are seeded from this repository, because a subdirectory cannot carry a topic.
Discovery is not curated. Every public repository carrying the GitHub topic rove-plugin is on this list. Nobody approves it, nobody ranks it, and nobody can keep you out — the listing is a search.
The legacy topic kobe-plugin is searched too, so parts published under the old name stay listed without being touched.
A catalogue with no gate at the front prints its caution on the same sheet. Rove checks that a manifest parses and shows you the commands it holds. It does not judge them, and it cannot: an argv array is the whole interface.
Note 6 — To publish a part The topic is the whole submission
- Put a manifest in a public repository. A rove-plugin.toml at the repo root, or in a subdirectory if you keep several plugins in one repo.
- Add the GitHub topic rove-plugin. Repo page → the gear next to About → Topics.
- Done. It appears in Note 5 on the next load, and anyone can run rove plugin install you/your-repo.
There is no submission form, no review queue and no registry to get into. The topic is read straight off GitHub each time this sheet is opened.
Publishing is three steps because there is nothing to publish to. The catalogue in Note 5 is a search that runs in your browser, so the only thing that puts a part on it is the topic on your own repository.
Full authoring reference: docs.rove.run — the plugin authoring page carries the event catalogue, the environment contract, and the placement rules a pane can ask for.
A part you publish is read by strangers with your commands in their hands. Keep the manifest legible, and put the commands it launches in the README beside it.