This repository is a Claude Code plugin marketplace. Each plugin lives in its own directory under plugins/ and is installed separately.
No plugins have been published yet. See Adding a plugin.
Requires Claude Code. From inside a session, add the marketplace and install a plugin in one step:
/plugin install <plugin> --marketplace devsantara/agents
Or from your shell, add the marketplace once and then install any plugin from it by name:
claude plugin marketplace add devsantara/agents
claude plugin install <plugin>@devsantaraThe install id is <plugin>@devsantara. To pick up a new release later, run claude plugin update <plugin>@devsantara.
.
├── .changeset/ # Changesets config and pending changesets
├── .claude-plugin/
│ └── marketplace.json # Catalog listing every plugin in plugins/
├── scripts/
│ └── sync-plugin-versions.js # Copies package.json versions into plugin.json
└── plugins/
└── <plugin>/ # Plugin root
├── .claude-plugin/
│ └── plugin.json # Plugin manifest: name, version, metadata
├── skills/<name>/SKILL.md
├── agents/<name>.md
├── hooks/hooks.json
├── .mcp.json
├── package.json # Name and version, for Changesets only
├── CHANGELOG.md # Generated on release
└── README.md
Inside a plugin, each kind of component lives in a fixed directory, created only when it is needed:
| Location | Contents |
|---|---|
skills/<name>/SKILL.md |
Skills, one directory per skill |
agents/<name>.md |
Subagents, one Markdown file each |
hooks/hooks.json |
Hook configuration, under a top-level "hooks" key |
.mcp.json |
MCP server definitions |
Only plugin.json belongs in a plugin's .claude-plugin/. Components saved there don't load. Inside hook commands and MCP configs, refer to plugin files as ${CLAUDE_PLUGIN_ROOT}/... rather than by relative path.
-
Create
plugins/<plugin>/.claude-plugin/plugin.jsonwith at leastname,version,description, andauthor. Startversionat0.0.0. Use a kebab-casenameand treat it as permanent, because installs are recorded under it. -
Create
plugins/<plugin>/package.jsonwith the samenameandversion, so Changesets can version the plugin:{ "name": "<plugin>", "version": "0.0.0", "private": true } -
Add the plugin's components and a
README.mdat the plugin root. -
Add an entry to
pluginsin.claude-plugin/marketplace.json. The entrynamemust match thenameinplugin.json, andsourceis the path from the repository root:{ "name": "<plugin>", "source": "./plugins/<plugin>", "description": "What the plugin provides" } -
List the plugin under Plugins above.
-
Add a changeset for the first release with
pnpm changeset, for example aminorbump with the summary "Initial release" to ship0.1.0. Without it, the plugin is tagged and released as0.0.0.
Install the release tooling once with pnpm:
pnpm installLoad one plugin's working copy for a session, without installing it:
claude --plugin-dir ./plugins/<plugin>Or load every plugin in the repository at once:
claude --plugin-dir ./pluginsAfter editing files, run /reload-plugins in that session to apply the changes. Validate the marketplace and each plugin you changed before every commit. Until the first plugin is added, the marketplace check reports Marketplace has no plugins defined, which --strict treats as a failure:
claude plugin validate --strict .
claude plugin validate --strict ./plugins/<plugin>If a component doesn't show up, check the Errors tab of /plugin, or run claude --plugin-dir ./plugins plugin list.
Plugins are versioned independently with Changesets. version in a plugin's plugin.json pins installed copies: users only receive changes when it changes. Never edit it by hand. Changesets bumps the plugin's package.json, and scripts/sync-plugin-versions.js copies that version into plugin.json.
-
In the pull request that changes a plugin, add a changeset. Pick the plugin, the bump type, and write a summary for the changelog:
pnpm changeset
Commit the generated
.changeset/*.mdfile with the change. A change that needs no release, such as docs or tooling, needs no changeset. -
When the pull request merges to
main, the Release workflow opens or updates achore(release): version pluginspull request. It bumps each changed plugin's version, updates itsCHANGELOG.md, and deletes the consumed changesets. -
Merging that pull request releases the plugins: the workflow tags each one as
<plugin>@<version>and creates a GitHub release from its changelog entry.
To cut the version bump locally instead, run pnpm run version with a GITHUB_TOKEN set (the changelog links pull requests and commits), then commit the result.
Never change a published plugin's name; change displayName for a different label.