These skills have always been installable via skills.sh (npx skills add mattpocock/skills), which copies editable skill files into a user's project across Claude Code, Codex, and other Agent-Skills-standard harnesses. A recurring request is a plug-and-play distribution: subscribe to the set as a read-only, always-current bundle you don't edit, rather than a fork you own. That is exactly what native plugin systems provide.
We ship a native Claude Code plugin and, for now, defer a native Codex plugin. The split is forced by how each ecosystem's plugin manifest selects skills, against this repo's bucketed layout.
Skills live in bucket folders under skills/ — engineering/ and productivity/ are promoted (shipped); misc/, personal/, in-progress/, and deprecated/ are not. A plugin must expose only the promoted set, which spans two of those bucket folders.
-
Claude Code —
.claude-plugin/plugin.jsonacceptsskillsas an array of explicit skill-directory paths. We list the promoted skills one by one, exclude everything else with zero ambiguity, and add.claude-plugin/marketplace.jsonso the repo is its own single-plugin marketplace. Verified end to end:claude plugin validate . --strictpasses, andmarketplace add→installresolves all promoted skills. -
Codex —
.codex-plugin/plugin.jsonacceptsskillsonly as a single path string (arrays are rejected withmissing or invalid plugin.json), and Codex discoversSKILL.mdfiles recursively under it. There is no way to name two bucket folders, or to curate a subset, from one path. Two escape hatches were tested and rejected:- Pointing at
./skills/would also shipdeprecated/,in-progress/,personal/, andmisc/— retired, draft, and personal skills we deliberately don't promote. - A curated flat directory of symlinks into the buckets does not survive install: Codex copies the plugin tree into its cache and drops symlinks, so the skills arrive empty.
- Pointing at
The only robust ways to give Codex a single promoted-only path are (a) restructure so skills/ contains only promoted skills (moving the non-promoted buckets out — a large blast radius across CLAUDE.md, scripts/link-skills.sh, the bucket READMEs, and the local dev workflow that relies on in-progress/ and personal/), or (b) commit duplicate copies of promoted skills into a flat directory (a sync burden and a second source of truth). Both are structural decisions, not something to bundle into shipping the Claude plugin. This is very likely the original, half-remembered reason a plugin wasn't shipped earlier: the manifest formats didn't cleanly express a curated subset of a bucketed repo.
- Ship the Claude Code plugin now (
.claude-plugin/plugin.json+.claude-plugin/marketplace.json), curated to the promoted set, as the headline v1.2 deliverable. - Keep skills.sh as the universal installer — it already serves Codex and other harnesses today, so no Codex user is left without an install path.
- Defer the native Codex plugin until we decide between restructuring
skills/to promoted-only vs. committing a generated flat copy. Revisit when Codex either supports askillsarray / include-list or preserves symlinks on install.
- Every promoted skill has an entry in
.claude-plugin/plugin.json'sskillsarray (this already stood as aCLAUDE.mdrule; it now also gates the plugin's contents). .claude-plugin/plugin.json'sversiontrackspackage.json's version — bump both together on release. Claude uses the pluginversionto decide when installed users see an update.
mattpocock-skills was accepted into Claude Code's official marketplace — configured name claude-plugins-official, source repo anthropics/claude-plugins-official — which every Claude Code install has by default. claude plugins install mattpocock-skills is now the documented route, and the marketplace add → install path above is superseded. The install wording lives in .agents/install-block.md.
The official listing points at this repo's git URL and reads .claude-plugin/plugin.json directly, so it does not depend on .claude-plugin/marketplace.json. That file is retained only as a fallback for installing the repo directly (an unreleased commit, or a fork).
Verified 2026-08-05, on Claude Code 2.1.222, against the live listing:
claude plugins install mattpocock-skillsresolves with no marketplace added first, and reportsmattpocock-skills@claude-plugins-official.claude plugin details mattpocock-skillsthen reports version 1.2.0 and loads the promoted skills.- The listing's
sourceis{"source": "url", "url": "https://github.com/mattpocock/skills.git", "sha": …}— the sha is pinned, so a release reaches installed users when that pin moves, not the moment we tag. At the time of writing the pin sits two commits behindmain, which is why it lists 22 skills rather than the 24 inplugin.json. - The in-session
/plugin install mattpocock-skillswas not exercised —/pluginis unavailable in headless (claude -p) sessions. It runs the same resolver as the CLI, and the documented example form is/plugin install <name>@claude-plugins-official.