Skip to content

Package skill as a Claude Code plugin - #2

Open
mrrobertkent wants to merge 2 commits into
robonuggets:mainfrom
mrrobertkent:feat/plugin-marketplace
Open

Package skill as a Claude Code plugin#2
mrrobertkent wants to merge 2 commits into
robonuggets:mainfrom
mrrobertkent:feat/plugin-marketplace

Conversation

@mrrobertkent

@mrrobertkent mrrobertkent commented Aug 11, 2026

Copy link
Copy Markdown

Packages the skill as a Claude Code plugin, so people can install it per project through the native /plugin workflow instead of copying the folder in by hand.

/plugin marketplace add robonuggets/gauntlet-loop
/plugin install gauntlet-loop@gauntlet-loop

They pick a scope on install — user for every project, project to commit it so a team gets it, local to keep it off tracked files — and updates arrive with /plugin update. The repo hosts its own marketplace, so there is no second repo to keep in sync.

Try it without installing anything

git clone -b feat/plugin-marketplace https://github.com/mrrobertkent/gauntlet-loop
claude --plugin-dir ./gauntlet-loop

That loads the plugin for one session and touches no config. /gauntlet-loop:gauntlet-loop works immediately.

What changed

.claude-plugin/plugin.json, .claude-plugin/marketplace.json new — makes the repo an installable, self-hosting marketplace
.claude/skills/gauntlet-loop/skills/gauntlet-loop/ moved — Claude Code resolves a plugin's skills at <plugin-root>/skills/
/gauntlet-loop/gauntlet-loop:gauntlet-loop plugin skills are namespaced
skills/migrate/, migrate/, bin/ new — the migration tool below
CHANGELOG.md, README.md version history, and a quick start covering both install paths

Your prompt is untouched. Git records SKILL.md as a rename; the only edits are three frontmatter lines — the namespaced trigger string, argument-hint: [goal], and license: CC-BY-4.0. The body is byte-identical. The credit to Matt Shumer is intact in both the README and the skill.

Natural-language triggers — "gauntlet this", "gauntlet loop" — are unaffected.

Anyone who already copied the skill in

Their copy keeps working but will never update, and it does not get replaced by the plugin — Claude Code namespaces the plugin skill rather than overriding the loose one, so installing on top leaves /gauntlet-loop and /gauntlet-loop:gauntlet-loop both live.

/gauntlet-loop:migrate cleans that up. It reads Claude Code's own project index, so it probes known paths rather than scanning the filesystem:

Found 3 hand-copied install(s) of `gauntlet-loop`:

  [ok]   ~/acme-web
         ~/acme-web/.claude/skills/gauntlet-loop (enabled)
  [ok]   ~/internal-docs
         ~/internal-docs/.claude/skills/gauntlet-loop (disabled)
  [skip] ~/side-project
         ~/side-project/.claude/skills/gauntlet-loop (enabled)
         contains files we did not ship: NOTES.md

1 skipped. Those directories were modified locally, so they are left alone.

This was a dry run. Nothing has changed.
Re-run with --write to replace the 2 recognised install(s) with the plugin.

Each one is replaced at the same scope it occupied, and internal-docs stays disabled afterwards. Beyond the dry-run default, three things it will not do:

  • It installs and verifies the plugin before removing anything, so a failed install leaves the existing skill working rather than deleting it and stranding the user.
  • It never touches a directory holding a file this project does not ship. It reports it, as above.
  • It shells out to the claude CLI for every change rather than editing settings files itself.

Source is in migrate/ — one Rust file, one dependency, no runtime needed on the user's machine.

One question

The repo is CC BY 4.0, a content licence. Good fit for a Markdown skill, awkward now that there is Rust in the tree, which I labelled CC-BY-4.0 to match rather than pick for you. If you would rather the tooling carry MIT or Apache-2.0, say which and I will change it.

Adds a plugin manifest and a self-hosting marketplace so the skill can be
installed, scoped, updated and removed through the native /plugin workflow
rather than copied into each project by hand.

- Skill moves to skills/gauntlet-loop/, where Claude Code resolves plugin
  skills. Its content is unchanged.
- Invocation becomes /gauntlet-loop:gauntlet-loop, as plugin skills are
  namespaced.
- Adds /gauntlet-loop:migrate, which replaces existing hand-copied installs
  with the plugin at the same scope, preserving each one's enabled or disabled
  state. It reports before acting and leaves locally modified copies alone.
@mrrobertkent
mrrobertkent marked this pull request as ready for review August 11, 2026 20:27
The bar has always had to be an external reference, which leaves out any
project built for a single business. With nothing to compare against, the
critic settles on a standard of its own and approves work against it.

The skill now accepts a project's own spec, gated so it only loops against
criteria that can be answered pass or fail. A resolver script reads an
optional project-owned config file, so a project that already keeps its
requirements on disk can point at them once instead of restating them every
run or leaving the skill to hunt for them. Absent that config, the skill asks.

Also moves the migration tool's source beside the skill that uses it. The
compiled binaries stay in bin/, which is what puts them on the Bash tool's PATH.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant