Plugin anatomy
Every plugin shares one shape: a manifest, a skill, a command, an agent, and a
ds/ snapshot. Nothing is optional and nothing is shared across plugin
boundaries — each plugin installs and works standalone.
Why the snapshot mirrors the source tree
Section titled “Why the snapshot mirrors the source tree”ds/ files reference each other with relative paths — ../../styles.css,
../../assets/brand/… — that only resolve if the folder shape stays intact.
Move a file, and the path breaks in three places at once: in this repo, in
the installed plugin cache, and after a consumer runs cp -R ds/ ./patterson
into their own project.
Two invariants nothing auto-enforces
Section titled “Two invariants nothing auto-enforces”- Never flatten, rename, or move a file inside any
ds/.claude plugin validate .checks manifests — names, versions, frontmatter — not snapshot hygiene. A broken relative path is a silent failure: the page loads with no stylesheet and no logo, and nothing in CI catches it. - Dual version source of truth. A content change bumps
versionin bothplugins/<name>/.claude-plugin/plugin.jsonand the matching entry in.claude-plugin/marketplace.json, kept equal.tests/run-tests.shchecks that every plugin has a non-empty version — it does not check that the two numbers match.
See Contributing for the full list and the devcontainer that ships with these checks pre-wired.