The repo root is the plugin, and one plugin holds every skill¶
.claude-plugin/marketplace.json declares source: "./", so the repo root is the
plugin: marketplace liulab, plugin lab, and every skill under skills/ inside
that single plugin. A marketplace may declare several plugins from subdirectories, and this
one deliberately does not.
Why one plugin¶
The skills are not independent. lab-jupyter takes an sbatch command verbatim from
lab-containers; both defer to lab-hpc for the preflight, the alias vocabulary and the
safety rules. A machine carrying lab-hpc at one version and lab-containers at another
is a combination nothing here tests and nobody would think to check — the failure shows up
as an agent running a command against a cluster, which is the worst place to find it.
One plugin makes the update atomic. claude plugin update lab@liulab moves all of
the skills or none of them, so the version on a machine is one number and a cross-reference
is always answered by the copy it was written against.
What it costs¶
- A user who wants only the Jupyter recipe installs all of them. Cheap: the skills are Markdown, and an unused description costs only its share of the trigger listing.
- Every description loads on every machine that installs the plugin, so adding a skill spends a little of everyone's context whether they use it or not. That pressure is real and is what keeps the descriptions keyword-dense instead of chatty — but it is judgement, not a threshold: the 1536-character limit caps one description, never their sum.
- Splitting later means a new plugin name, which every installed machine has to install by hand. Reversal is not free, which is why this is recorded.
Why the plugin is called lab¶
It was lab-compute while the repo was liulab-compute-skills and held only cluster
skills. When the repo became the home for every lab skill, cluster or not, both were renamed
in 2026.10.1. lab beat lab-skills because the plugin name is the prefix people type:
/lab:lab-edison. The per-user directory moved with it, from ~/.claude/compute/ to
~/.claude/lab/, and both preflights refuse while the old one exists, so no machine reads
two copies of a key file.
Why the root, rather than a subdirectory¶
A subdirectory plugin would put the skills one level down and leave the root as packaging around them. There is nothing else in this repo to package: the tests, the docs and the templates all exist to serve the skills. Making the root the plugin means the thing you clone and the thing you install are the same tree, with no path prefix to keep in step between the manifest and the layout.