A marketplace of endjin's plugins and skills for AI coding agents. It uses the Claude Code plugin marketplace format, which GitHub Copilot CLI also reads natively — so one repo serves both tools. The skills themselves use the cross-tool Agent Skills standard (SKILL.md), which is also understood by VS Code, Cursor, and Codex CLI.
endjin-marketplace/
├── .claude-plugin/
│ └── marketplace.json # Marketplace catalog (required)
└── plugins/
├── code-review-tools/ # One directory per plugin
│ ├── .claude-plugin/
│ │ └── plugin.json # Plugin manifest
│ └── skills/
│ └── explain-diff-html/
│ └── SKILL.md # One directory per skill
└── writing-tools/
├── .claude-plugin/
│ └── plugin.json
└── skills/
└── clear-technical-writing/ # Skills can ship references/ and scripts/ alongside SKILL.md
├── SKILL.md
├── references/
└── scripts/
Each plugin entry in marketplace.json references its directory with an explicit relative path (e.g. "source": "./plugins/code-review-tools").
Add the marketplace (once), then install plugins from it:
# From a local checkout (relative or absolute path)
/plugin marketplace add ./endjin-marketplace
# Or, once pushed to GitHub
/plugin marketplace add endjin/endjin-marketplace
# Install a plugin
/plugin install code-review-tools@endjin
# Activate in the current session (new sessions pick plugins up automatically)
/reload-pluginsTo get the latest plugin changes later (versions track git commits, so every push to main is a new version):
# Update this marketplace and its installed plugins, then reload
/plugin marketplace update endjin
/reload-plugins
# Or update all registered marketplaces at once
/plugin marketplace updateSkills are namespaced by plugin: for example, explain-diff-html (which builds a rich, self-contained HTML explanation of a code change, branch, or PR — with background, intuition, a code walkthrough, and an interactive quiz) is invoked as /code-review-tools:explain-diff-html, or Claude invokes it automatically based on its description when you ask for a rich explanation of a diff. Similarly, clear-technical-writing (which writes and rewrites technical text — docs, ADRs, runbooks, changelogs, error messages — so it is plain, consistent, and inclusive) is invoked as /writing-tools:clear-technical-writing, or automatically when you ask for clear, plain, or simplified technical writing.
Non-interactive (CI, scripts):
claude plugin marketplace add endjin/endjin-marketplace
claude plugin install code-review-tools@endjin --scope project
claude plugin marketplace update endjinCopilot CLI's plugin system mirrors Claude Code's and reads .claude-plugin/marketplace.json and plugin.json directly, so this marketplace works from Copilot CLI with no changes.
Register the marketplace and install (docs):
copilot plugin marketplace add endjin/endjin-marketplace
copilot plugin install code-review-tools@endjinOr declaratively, in ~/.copilot/settings.json (user) or .github/copilot/settings.json (repo):
{
"extraKnownMarketplaces": {
"endjin": { "source": { "source": "github", "repo": "endjin/endjin-marketplace" } }
},
"enabledPlugins": { "code-review-tools@endjin": true }
}Portability caveats for future plugins:
- Skills are fully portable;
commands/, output styles, and therenamesfield are Claude Code-only (Copilot ignores them). - Copilot supports only a subset of hook events (command handlers only) and ignores rich agent frontmatter (
model,permissionMode, etc.). - Never add an explicit
skillsfield toplugin.json— both tools auto-discoverskills/, and an explicit field breaks compatibility.
-
Create
plugins/<plugin-name>/(kebab-case) with.claude-plugin/plugin.json:{ "name": "<plugin-name>", "description": "What the plugin does", "author": { "name": "endjin", "url": "https://endjin.com" } } -
Add components at the plugin root (not inside
.claude-plugin/):skills/<skill-name>/SKILL.md— model-invoked skills; frontmatterdescriptionis required and tells Claude when to use itcommands/<name>.md— flat slash-command style skillsagents/<name>.md— subagent definitionshooks/hooks.json— hooks (use${CLAUDE_PLUGIN_ROOT}for script paths).mcp.json— MCP server definitions
-
Register it in
.claude-plugin/marketplace.jsonunderplugins:{ "name": "<plugin-name>", "source": "./plugins/<plugin-name>", "description": "..." } -
Validate before committing:
claude plugin validate .
Plugin version is omitted deliberately: without it, every git commit counts as a new version and users pick up changes on /plugin marketplace update. If you add a version to a plugin, users only receive updates when you bump it.
- Plugins cannot reference files outside their own directory (
../sharedbreaks after install). - Only
plugin.jsonlives in a plugin's.claude-plugin/folder; everything else goes at the plugin root. - Marketplace and plugin names must be kebab-case with no spaces.
- After installing or updating in an active session, run
/reload-plugins.