plugins/skill-to-plugin-plugin/skills/SKILL.md
Package an existing local skill (a SKILL.md, optionally with scripts/, references/, or assets/) as a plugin in the apparata-plugins marketplace repo, following that repo's own "Adding a New Plugin" process: create the plugin directory, adapt the frontmatter, register it in marketplace.json, bump the version, update README.md, run the validator, then branch, commit, push, open a PR, and merge. Use this skill whenever the user wants to publish, package, add, ship, or release a skill as a plugin in the apparata-plugins marketplace — phrases like "turn this skill into a plugin", "add my skill to apparata", "publish this to the marketplace", or "make a plugin from this skill". Trigger even if they don't name the repo, as long as the intent is moving a local skill into the apparata-plugins marketplace.
npx skillsauth add memfrag/apparata-plugins skill-to-pluginInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Package a local skill as a plugin in the apparata-plugins marketplace repo and ship it to a merged PR.
The apparata-plugins repo documents its own process in its CLAUDE.md (the "Adding a New Plugin" section) and demonstrates it in every existing plugin. That is the source of truth. The steps below are a known-good default, but conventions drift — the version-bump rule, the README format, the directory layout. So read the repo's CLAUDE.md first and follow it where it differs from this skill. When a detail is ambiguous, mirror the closest existing plugin rather than inventing a structure. This is what keeps the skill from going stale as the marketplace evolves, and it's how the layout decisions below stay correct.
Source skill: from $ARGUMENTS — a directory containing SKILL.md, or a path to a SKILL.md directly. If it's not given and isn't obvious from the conversation, ask. Read its frontmatter (name, description) and note any bundled resources (scripts/, references/, assets/) — they decide the layout in step 3.
Marketplace repo: find the local clone of apparata-plugins. Don't assume a fixed path — it lives in different places on different machines. Verify a candidate by checking that <repo>/.claude-plugin/marketplace.json exists and its .name is apparata-plugins. Try, in order:
$ARGUMENTS).~/Projekt/git/Claude/apparata-plugins (the usual location).Work against the repo with explicit paths (git -C <repo> …, absolute paths). The shell's working directory is often not the repo, so relying on cd is a common way to silently operate on the wrong tree.
Read these before touching anything, so you follow current convention rather than memory:
<repo>/CLAUDE.md — the authoritative "Adding a New Plugin" checklist.<repo>/.claude-plugin/marketplace.json — the registry shape and current version.<repo>/README.md — the summary-table and detail-section format.mac-migration-plugin; a bare one like spotify-plugin if not).plugins/<skill-name>-plugin/ (the -plugin suffix is the convention).marketplace.json, this is an update, not a new plugin: edit the files in place, don't add a duplicate registry entry, and don't re-bump the version a second time for the same change.plugins/<name>-plugin/skills/SKILL.md (like spotify-plugin).plugins/<name>-plugin/skills/<skill-name>/SKILL.md with the resource dirs alongside it (like mac-migration-plugin). Check the chosen exemplar to confirm — the repo's actual layout wins over this description.Copy SKILL.md and any resource directories into the chosen location. Then adapt the frontmatter for plugin use — local skills often lack the fields a marketplace plugin needs:
name, description — keep them. The description is the triggering text; preserve its "pushy" specificity.user-invocable: true — add it so the plugin exposes a /<skill-name> slash command (every plugin here is invocable this way). Drop only if the skill is genuinely meant to be auto-trigger-only.allowed-tools: — list the tools the body actually uses. Read the instructions and infer honestly: file reads/writes → Read, Write, Edit; shell/git/scripts → Bash; confirmation prompts → AskUserQuestion; web → WebFetch. An over-broad list defeats the purpose; a missing tool breaks the skill at runtime.argument-hint: — add if the skill takes positional input (e.g. "<path-to-spec.md>" or "[output-path]").Leave the body intact. If it references its scripts, make sure the paths still resolve under the new location.
Add an entry to the plugins array:
{ "name": "<name>-plugin", "source": "./plugins/<name>-plugin", "description": "<concise one-liner>" }
The registry description is a concise, functional one-liner — not the long pushy triggering description from the frontmatter. Condense it, and match the tone/length of the existing entries.
Then bump metadata.version — per the repo's CLAUDE.md, bump the minor version (e.g. 2.3.0 → 2.4.0). Confirm the rule in CLAUDE.md in case it has changed.
Two edits, both keeping alphabetical order by display name:
| [Display Name](#anchor) | short description |.### Display Name
One sentence on what it does.
**Skill:** `/<command> [args]` — what the skill produces
**Prerequisites:** <deps, or None>
Match the surrounding entries — read two neighbors and copy their shape.
Run the repo's validator and don't proceed until it passes:
bash <repo>/scripts/validate-marketplace.sh # run from the repo root
It checks that marketplace.json is valid, every registered source exists, and no plugin directory is an unregistered orphan. If it fails, fix the cause (a common one: the new plugin dir exists but isn't registered yet, or vice versa).
Show the user the diff first (git -C <repo> diff and the new files). Then:
main), branch first: git -C <repo> switch -c add-<name>-plugin.git -C <repo> log): an imperative subject like Add <name> plugin, a body describing the skill and noting the version bump. This repo's history has no AI-attribution trailer — omit it.git -C <repo> push -u origin add-<name>-plugin.gh pr create -R <owner>/<repo> --base main --head add-<name>-plugin --title … --body ….gh pr merge -R <owner>/<repo> <branch> --merge --delete-branch, then bring local main up to date: git -C <repo> switch main && git -C <repo> pull --ff-only.git push fails with could not read Username for 'https://github.com', the origin remote is HTTPS but this non-interactive shell has no stored credentials. Check gh auth status; if it reports the git protocol as ssh and ssh -T [email protected] authenticates, switch the remote to SSH and retry: git -C <repo> remote set-url origin [email protected]:<owner>/<repo>.git. Tell the user you changed the remote — it's a persistent change.git -C <repo> and absolute paths; the cwd is frequently elsewhere.development
Extract timestamped transcripts from WWDC session videos. Use this skill whenever the user wants to read, search, or get the transcript of a WWDC session or Apple developer video — even if they just say something like "what did they say about concurrency in that talk" or "get me the transcript for session 230". Also use this when the user provides a developer.apple.com/videos URL and wants to know what the video covers.
testing
Download WWDC session videos in HD or SD quality. Use this skill whenever the user wants to download a WWDC video, save a session video to disk, or get the video file for a specific WWDC talk. Supports lookup by URL, session ID (e.g. "wwdc2025/230"), session number, or title. Also use when the user says things like "download the AlarmKit session" or "grab the HD video for session 287".
development
Fetch the WWDC session catalog from Apple's CDN by extracting the catalog URL embedded in one of the Developer.app's binaries. Use this skill whenever the user asks about WWDC sessions, WWDC videos, WWDC catalog, Apple developer conference content, or wants to browse, search, list, or look up any WWDC session or talk — even if they just say something like "what sessions are there about SwiftUI" or "find me that WWDC video about concurrency". Also use this when the user wants to download or work with WWDC session metadata.
tools
Generate a blog-post-style HTML page from a WWDC session, interleaving transcript text with slide screenshots. Use when the user wants to create a blog post, readable page, or visual summary from a WWDC talk — e.g. "create blog post from WWDC session 230", "generate HTML for that WWDC talk", "make a readable version of the AlarmKit session".