---
title: "Claude Plugins Personal Marketplace"
description: "Reference for the cal/claude-plugins Gitea repo — personal Claude Code plugin marketplace with 20 plugins (10 agents, 10 skills), including installation, adding new plugins, and maintenance."
type: reference
domain: development
tags: [claude-code, plugins, gitea, marketplace]
---

# Claude Plugins Personal Marketplace

**Repo:** `cal/claude-plugins` on Gitea ([https://git.manticorum.com/cal/claude-plugins](https://git.manticorum.com/cal/claude-plugins))
**Local clone:** `/mnt/NV2/Development/claude-plugins/`
**License:** AGPL-3.0

## What It Is

A self-hosted Claude Code plugin marketplace containing 20 plugins (10 agents, 10 skills) extracted from local `~/.claude/` definitions. Registered via `claude plugin marketplace add https://git.manticorum.com/cal/claude-plugins.git` (stored in `~/.claude/settings.json` under `extraKnownMarketplaces`).

## Plugin Inventory

### Agents (10)

| Name | Description |
|------|-------------|
| architect | PRD creation, system design, technical specs |
| claude-researcher | Web research with multi-query decomposition |
| designer | UX/UI design review, visual design, accessibility |
| engineer | Code implementation, debugging, optimization, testing |
| issue-worker | Autonomous Gitea issue fixer — creates PRs |
| pentester | Penetration testing and vulnerability assessments |
| pr-reviewer | Automated Gitea PR reviewer |
| swarm-coder | Implementation agent for orchestrated swarms |
| swarm-reviewer | Code reviewer for orchestrated swarms |
| swarm-validator | Spec validator for orchestrated swarms |

### Skills (10)

| Name | Description |
|------|-------------|
| backlog | Surface next Gitea issue or TODO to work on |
| create-scheduled-task | Manage headless Claude scheduled tasks on systemd timers |
| json-pretty | JSON prettifier CLI tool |
| optimise-claude | Guide for writing effective CLAUDE.md files |
| playwright-cli | Browser automation for testing and screenshots |
| project-plan | Generate PROJECT_PLAN.json for task tracking |
| resume-tailoring | Tailored resume generation with company research |
| save-doc | Save documentation to KB with proper frontmatter |
| youtube-transcriber | Transcribe YouTube videos via OpenAI GPT-4o-transcribe |
| z-image | Local GPU image generation with Z-Image Turbo |

## Installation

```bash
# Marketplace is already registered. To install a plugin:
claude plugin install <name>@cal-claude-plugins --scope user

# Enable/disable:
claude plugin enable <name>@cal-claude-plugins
claude plugin disable <name>@cal-claude-plugins

# Update marketplace cache (pulls latest from Gitea):
claude plugin marketplace update cal-claude-plugins
```

## Adding a New Plugin

### Directory Structure

Each plugin lives under `plugins/<name>/` with this layout:

```
plugins/<name>/
  .claude-plugin/
    plugin.json          # name, description, version
  commands/              # user-facing slash commands (preferred)
    <verb>.md            # shows as /plugin-name:verb in autocomplete
  skills/<verb>/         # alternative to commands (legacy)
    SKILL.md             # skill definition with frontmatter
  scripts/               # helper scripts referenced by commands/skills
    tool.py
  agents/                # for agent plugins
    <name>.md            # agent definition
```

### Commands vs Skills

**Commands** (`.md` files in `commands/`) are preferred for user-facing slash commands. They appear in autocomplete as `/plugin-name:command-name`, giving a clean grouped prefix (e.g., `/json-pretty:format`).

**Skills** (`SKILL.md` in `skills/<name>/`) are the older pattern. They work but don't group as cleanly in autocomplete.

Commands reference scripts via `${CLAUDE_PLUGIN_ROOT}/scripts/` — no symlinks needed.

### plugin.json

```json
{
  "name": "my-plugin",
  "description": "One-line description of what it does.",
  "version": "1.0.0"
}
```

### Command Frontmatter

```yaml
---
description: "What this command does"
allowed-tools: Bash
---
```

### SKILL.md Frontmatter (legacy)

```yaml
---
allowed-tools: Read,Write,Edit,Glob,Grep,Bash
description: What this skill does
user-invocable: true
---
```

### Register in marketplace.json

Add an entry to `.claude-plugin/marketplace.json` in the `plugins` array:

```json
{
  "name": "my-plugin",
  "source": "./plugins/my-plugin",
  "description": "One-line description."
}
```

### Commit and Push

```bash
cd /mnt/NV2/Development/claude-plugins
git add plugins/my-plugin .claude-plugin/marketplace.json
git commit -m "feat: add my-plugin skill"
git push origin main
```

Then update the cache: `claude plugin marketplace update cal-claude-plugins`

## Important Notes

- **Commands use `${CLAUDE_PLUGIN_ROOT}`** — reference scripts via `${CLAUDE_PLUGIN_ROOT}/scripts/` instead of absolute paths or symlinks
- **SSH remote** — uses `git@git.manticorum.com:cal/claude-plugins.git` via SSH config alias (`~/.ssh/config` maps `git.manticorum.com` → `10.10.0.225` as user `git`)
- **No secrets** — repo is public; plugins are just prompt definitions, no credentials
- **Plugins requiring MCP servers** — `backlog`, `issue-worker`, and `pr-reviewer` require `gitea-mcp`; they install fine without it but those tool calls won't execute
- **sync-kb does NOT apply here** — this is a standalone repo, not part of claude-home. Changes require manual commit/push
