A Claude Code plugin marketplace.
/plugin marketplace add robbiegal/plugin-marketplace
/plugin install cutlist@robbiegal-tools
/cutlist:cutlist-doctor
Each plugin ships a doctor. Run it first — both of these call external binaries they cannot install for you, and the doctor is what tells you which one is missing instead of a render failing halfway.
The marketplace is named robbiegal-tools, not after this repository — that is
the name you install against, and it is registered once per user. The plugins
themselves live in their own repositories; this repo is only the catalogue.
| Plugin | What it does |
|---|---|
| cutlist | Cuts, grades, annotates, redacts and mixes a finished video from raw footage using ffmpeg, then proves the delivered file frame by frame — because an encoder exits 0 on a render that is entirely black. |
| presentation-coach | Audits a rehearsal recording against its slide deck — timing, pace, fillers, figures the speaker got wrong, slides never mentioned, and vocal delivery — and tracks progress across dry runs. |
A github shorthand source ({"source": "github", "repo": "owner/name"})
clones over SSH by default. On a machine with no SSH key — which is most
machines, including ones where gh is authenticated and every other git
operation works — the marketplace adds cleanly and then the plugin install
fails with Permission denied (publickey). That is a confusing failure,
because the marketplace step succeeded moments earlier by falling back to
HTTPS on its own.
The user-side fix is CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1, but requiring an
environment variable to install is not a reasonable ask. An explicit url
source clones over HTTPS for everyone, and picks up gh's credential helper
for private repositories.
- Adding a plugin: append an entry to
.claude-plugin/marketplace.json. Users pick it up with/plugin marketplace update. - Renaming or removing one needs a top-level
renamesmap, or existing users getplugin-not-foundrather than a migration. - Whether an update reaches anyone is decided by version resolution: an
explicit
versionin the plugin's ownplugin.jsonwins, and a stale one silently blocks every update.