Plugins
A plugin bundles related customizations — skills, hooks, sub-agent definitions, MCP server configs, and output styles — into a single installable directory. The plugin system (ADR 0030) is a thin orchestrator: it parses a plugin.json manifest, namespaces items, expands ${CALIBAN_PLUGIN_ROOT}, and is designed to feed everything into the same per-surface loaders that project and user files use.
The caliban plugin command manages installs, and the manifest parses every component
type. At startup, though, the binary currently wires in only each plugin's skills.
Bundled hooks, MCP servers, agents, and commands are parsed but not yet loaded. Plugin
output styles are picked up only from the user install directory, by the output-styles
loader. The sections below describe the full design; treat the non-skill surfaces as
planned.
What a plugin contains
my-plugin/
plugin.json # required manifest
skills/
my-workflow/
SKILL.md
hooks/
hooks.json
agents/
reviewer.md
output-styles/
concise.md
mcp/
.mcp.json
commands/
recap.md
All subdirectories are optional. When a components entry is omitted from the manifest, the loader scans the conventional subdirectory automatically.
The manifest (plugin.json)
{
"name": "my-plugin",
"version": "1.0.0",
"description": "Short description shown in /plugins and trust prompts",
"author": "Alice <alice@example.com>",
"license": "MIT",
"homepage": "https://example.com/my-plugin",
"components": {
"skills": ["skills/my-workflow"],
"hooks": "hooks/hooks.json",
"agents": ["agents/reviewer.md"],
"output_styles": "output-styles/concise.md",
"mcp_servers": "mcp/.mcp.json",
"commands": ["commands/recap.md"]
},
"caliban": {
"min_version": "0.5.0",
"platforms": ["macos", "linux"]
}
}
| Field | Required | Description |
|---|---|---|
name | Yes | Matches the directory name. Must be [a-z0-9_-]{1,32}. |
version | Yes | Semver string. |
description | No | One-line description. |
author | No | Free-form author string. |
license | No | SPDX identifier. |
homepage | No | URL. |
components | No | Paths to bundled files (string or array). |
caliban.min_version | No | Skip when the running caliban is older. |
caliban.platforms | No | Limit to macos, linux, or windows. |
For MCP servers bundled as inline config (matching Claude Code's .mcp.json shape), use the top-level mcpServers key instead of components.mcp_servers.
Discovery roots
Caliban scans three roots at startup. A plugin with the same name in an earlier root replaces later ones — no manifest merging.
| Priority | Root | Scope |
|---|---|---|
| 1 (highest) | <workspace>/.caliban/plugins/<name>/ | Project |
| 2 | $XDG_DATA_HOME/caliban/plugins/<name>/ (user install dir) | User |
| 3 | /etc/caliban/plugins/<name>/ (platform analogues) | Managed (org policy) |
Which plugins load is filtered at startup by the CALIBAN_ENABLED_PLUGINS environment variable (comma-separated names). Managed plugins ignore the filter. caliban plugin enable/disable records the choice in the plugins.enabled setting, but startup does not read that setting yet.
Namespacing
Items loaded from a plugin carry a <plugin>:<item> prefix:
- Skills:
my-plugin:my-workflow - Output styles:
my-plugin:concise - MCP servers:
my-plugin:my-server
This prevents collisions with bare-named items at the project or user level. Hooks merge additively across plugins.
The caliban plugin command
# List all installed plugins and their status
caliban plugin list
# Show the manifest of an installed plugin as JSON
caliban plugin info <name>
# Install a plugin from a marketplace
caliban plugin install <name>@<marketplace-url>
# Install a plugin from a local directory
caliban plugin install --dir /path/to/my-plugin
# Update a plugin to the latest marketplace version
caliban plugin update <name>
# Remove a plugin
caliban plugin remove <name>
# Enable / disable a plugin (affects whether it loads at startup)
caliban plugin enable <name>
caliban plugin disable <name>
caliban plugin help prints the full reference.
Marketplace trust
First-time marketplace installs display the manifest, its sha256 hash, and the install URL and prompt for acknowledgement. Acknowledged installs are recorded in $XDG_DATA_HOME/caliban/trust/plugins.json. Re-installs of the same manifest hash skip the prompt; version bumps re-prompt. Sideloads (local --dir installs) skip trust gating because the operator already has filesystem access.
${CALIBAN_PLUGIN_ROOT} expansion
Inside plugin-bundled hook commands and MCP server configs, ${CALIBAN_PLUGIN_ROOT} expands to the plugin's absolute root directory. ${CLAUDE_PLUGIN_ROOT} is a supported alias so existing Claude Code plugins port verbatim.
The --no-plugins flag (or CALIBAN_NO_PLUGINS=1) disables plugin discovery entirely for a single run, treating all plugin roots as empty. This is useful for debugging or for CI environments that should not pick up locally installed plugins.
Related pages
- Skills
- Hooks
- MCP Servers
- Output Styles
- Slash Command Index —
/pluginsoverlay