Back

Plug

Package manager for Claude Code skills

Sharing Claude Code extensions across a team without emailing Markdown files around.

Problem

  • Claude Code extensions are Markdown files in a .claude/ folder
  • That works for one person on one repo, not for a team
  • Good commands spread by Slack paste and then drift
  • Four projects end up with four slightly different copies
  • No way to hand out shared security rules to every engineer
  • No way to update those rules once they change

Solution

  • Interactive TUI plus a /plug skill inside Claude Code
  • Any GitHub repo is a package source — public or private
  • Official vault: 14 packages, 7 always-on skills, 7 commands
  • Install per project or per machine against a tracked manifest
  • Vaults resolve in a user-defined order, first match wins
  • Published on npm as plugvault, CI on every push

Outcome

  • Teams share extensions without emailing Markdown around
  • Private company vaults use existing GitHub access controls
  • A reviewer reads the actual skill text in the pull request
  • What lands in .claude/ is byte-identical to GitHub
  • Update and remove operate on the manifest, not a directory scan
  • MIT licensed and fully public

14

official packages

2

clients, one contract

npm

plugvault

MIT

open source

Architecture Review

System design · Pipeline · Decisions

System Architecture

How It Works

  1. 1

    Discover

    The client pulls the index from every registered vault and caches it for an hour. The terminal UI is a full-screen browser with tabs for what is available, what is installed, and which vaults are configured.

  2. 2

    Resolve

    A requested name is matched against the merged index in vault order. First match wins, so an internal vault can shadow a public package of the same name. A vault-qualified form exists when you need to be explicit.

  3. 3

    Install

    Files are fetched and written where Claude actually reads them: a skill at .claude/skills/<name>/SKILL.md, a command at .claude/commands/<name>.md, under the project or ~/.claude/ depending on scope.

  4. 4

    Track

    The manifest records package name, version, and which vault it came from. Update, remove, and list operate on that record, not the directory listing, so multi-file packages and hand-written files stay distinct.

  5. 5

    Publish

    Adding a package means creating a folder with meta.json and an entry file, adding one index row, and opening a pull request. Every package in the official vault went in through that path.

Key Decisions

GitHub repositories are the registry. There is no package server.

A registry is a JSON index committed to a repo. A hosted API would have needed its own accounts and something to keep running. Using repos means private distribution comes free from GitHub access controls. What I gave up: no download counts, no central moderation, no way to yank a bad package.

A package is a folder you can read in a pull request

Each package is registry/<name>/ holding meta.json and a Markdown entry file. Inlining into one large manifest would have been simpler to fetch and horrible to review. The file that lands in .claude/ is byte-identical to the one on GitHub.

Two clients, one contract

The terminal UI is Node and Ink. The Claude Code skill runs inside the conversation with no Node runtime at all. Both perform resolve, fetch, write, record in the same order, which is the only reason it is safe to have two of them.

Vaults resolve in a user-defined order, first match wins

An organisation registers its internal vault ahead of the public one, and its version of a package shadows the community version by the same name. Unqualified installs can silently resolve somewhere you did not expect.

The manifest is the source of truth, not the file tree

Scanning .claude/ and inferring what is installed falls apart the moment a package spans more than one file, and it cannot tell a Plug-managed file from one you wrote yourself. The trade-off is drift: hand-edit the folder and the manifest is quietly wrong.

Plug — Architecture

Plug architecture

Evaluation

There's no evaluation harness yet, and that's the honest gap. CI unit tests catch regressions in resolution and path routing, but they don't test whether a package installs correctly from a fresh machine, into both scopes, and whether removing it leaves nothing behind. Dogfooding covers the common path. Private vault authentication, multi-file packages, and removal with dependents are verified by hand. An install matrix in a clean container per case would replace all of that manual checking.

What I'd Change

  • Version the registry format from the first commit
  • Pin content to a commit, not a branch
  • Generate the index instead of maintaining it by hand
  • Keep the docs generated from one source

Get in Touch

Let's build
something great.