🏗️ Five Conceptual Layers
GitHub repos, git URLs, npm packages, local directories, URL-hosted JSON
plugin.json declara commands, hooks, MCP servers, LSP, skills, agents
~/.claude/plugins/cache/{mkt}/{plugin}/{version}/ -- snapshots imutaveis por versao
DFS closure walk no install; fixed-point demote no load. Cross-marketplace deps bloqueadas
reconcile -> autoupdate -> load -> hook registration -> command registration -> MCP connect
🌍 Marketplace Sources
Seis tipos de fonte suportados:
Clona owner/repo via SSH/HTTPS
HTTPS, SSH, file://
Partial clone + sparse-checkout
Fetch JSON direto
Instalado em cache compartilhado
Diretorio ou JSON local
Name Protection: BLOCKED_OFFICIAL_NAME_PATTERN regex bloqueia nomes como official-claude-plugins. Nomes reservados verificam que a org fonte e anthropics/ no GitHub.
📄 The Manifest Schema
Cada plugin opcionalmente entrega um plugin.json. Campos-chave:
| Campo | Descricao |
|---|---|
| name | Kebab-case, usado para namespacing: /plugin:cmd |
| dependencies | Nomes bare herdam marketplace do plugin declarante |
| commands | Diretorio auto-scan + inline content |
| mcpServers | Suporta .mcpb/.dxt bundles ou config inline |
| userConfig | Valores configuraveis. Sensitive -> keychain, nao settings.json |
Sem plugin.json, auto-discovery encontra commands/*.md, agents/*.md, skills/*/SKILL.md, hooks/hooks.json.
📦 Versioned Cache
Plugins sao instalados em cache imutavel content-addressed:
~/.claude/plugins/cache/{marketplace}/{plugin}/{version}/
// Prioridade de versao:
1. plugin.json version field
2. Versao fornecida pelo marketplace
3. Git SHA pre-resolvido (12 chars)
4. 'unknown' como fallback
Para monorepo plugins, versao = {sha12}-{pathHash8} para evitar colisoes no mesmo commit.
🔗 Dependency Resolution
Install-time: DFS Closure
- Deteccao de ciclo via DFS stack
- Cross-marketplace bloqueado por default
- Deps ja habilitadas sao puladas
Load-time: Fixed-Point Demote
- Roda em cada sessao do cache-only set
- Loop fixed-point: demotar A pode revelar que B depende de A
- Semantica apt-style: presenca, nao import
🛡️ Security & Policy
Enterprise admins podem forcar-desabilitar plugins via managed-settings.json. Check isPluginBlockedByPolicy() roda no install, no enable e na UI.
Plugins podem ser instalados em 4 escopos: User, Project, Local e Managed (read-only).
Sensitive userConfig: valores marcados sensitive: true vao para o OS keychain, nao settings.json. Disponiveis em MCP server env mas nunca substituidos em conteudo skill/agent enviado ao modelo.
🔄 Background Autoupdate
No startup, autoupdate roda silenciosamente sem bloquear o REPL. Updates sao non-in-place: nova versao e cacheada em novo path, sessao atual continua com versao antiga. REPL e notificado e mostra prompt de restart.