C Claude Code Internals
EN | ES

Plugins

Los plugins extienden Claude Code con paquetes modulares que agrupan comandos, skills, agentes, estilos de salida, hooks, servidores MCP, servidores LSP, canales y configuraciones. Se instalan desde un marketplace, se cargan via CLI o vienen integrados como built-ins.

9 tipos de capacidades 6 formatos de fuente en marketplace 3 fuentes de plugins 11 subcomandos /plugin
i Un paquete, muchas capacidades
Un único plugin puede aportar cualquier combinación de slash commands, skills, agentes, estilos de salida, hooks, servidores MCP, servidores LSP, canales de mensajería y anulaciones de configuración. El único archivo obligatorio es .claude-plugin/plugin.json. Todo lo demás es opcional y se auto-detecta por convención de directorios.

Fuentes de Plugins y Almacenamiento

Fuente Formato ID Descripción
Marketplace plugin@marketplace Instalado desde un repositorio de marketplace
Sesión (basado en ruta) Cargado via flag CLI --plugin-dir
Built-in plugin@builtin Integrado en Claude Code (actualmente ninguno registrado)

Ubicaciones de almacenamiento

# Archivos de plugin en caché
~/.claude/plugins/cache/{marketplace}/{plugin}/{version}/

# Lista de plugins habilitados
~/.claude/settings.json → enabledPlugins: [...]

# Opciones por plugin
~/.claude/settings.json → pluginConfigs: {...}

Estructura de Directorios del Plugin

my-plugin/
├── .claude-plugin/
│   ├── plugin.json        # Manifiesto (OBLIGATORIO)
│   └── marketplace.json   # Para editores
├── commands/              # Slash commands (auto-detectado)
│   ├── build.md
│   └── deploy.md
├── agents/                # Agentes personalizados (auto-detectado)
│   └── test-runner.md
├── skills/                # Skills (auto-detectado)
│   └── my-skill/
│       └── SKILL.md
├── output-styles/         # Estilos de salida (auto-detectado)
│   └── conciso.md
├── hooks/
│   └── hooks.json         # Configuraciones de hooks
└── .mcp.json              # Servidores MCP (opcional)

El manifiesto en .claude-plugin/plugin.json es el único archivo obligatorio. Claude Code auto-detecta capacidades desde los directorios estándar sin necesidad de declaración en el manifiesto.

Directorios auto-detectados

commands/ Cualquier .md → slash commands
agents/ Cualquier .md → tipos de agente personalizados
skills/ Dirs con SKILL.md → skills
output-styles/ Cualquier .md → estilos de salida
hooks/hooks.json Configuraciones de hooks
.mcp.json Configuraciones de servidores MCP

Manifiesto del Plugin (plugin.json)

Schema completo

{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "Qué hace este plugin",
  "author": {
    "name": "Nombre del Autor",
    "email": "[email protected]",
    "url": "https://ejemplo.com"
  },
  "homepage": "https://ejemplo.com/plugin",
  "repository": "https://github.com/org/plugin",
  "license": "MIT",
  "keywords": ["testing", "despliegue"],
  "dependencies": [
    "otro-plugin",
    "dep-plugin@otro-marketplace"
  ],

  "commands": { ... },
  "agents": [ ... ],
  "skills": [ ... ],
  "outputStyles": [ ... ],
  "hooks": { ... },
  "mcpServers": { ... },
  "lspServers": { ... },
  "channels": [ ... ],
  "userConfig": { ... },
  "settings": { ... }
}

Campos de metadatos

Campo Req. Descripción
name kebab-case, sin espacios
version No Semver (ej. "1.2.3")
description No Descripción corta
author No name obligatorio si es objeto
license No Identificador SPDX
keywords No Palabras clave de búsqueda
dependencies No "nombre" o "nombre@marketplace"

Capacidades del Plugin (9 tipos)

Comandos

Slash commands como /build, /deploy.

"commands": {
  "build": {
    "source": "./commands/build.md",
    "description": "Construir el proyecto",
    "argumentHint": "[objetivo]",
    "model": "claude-sonnet-4-6",
    "allowedTools": ["Bash", "Read"]
  },
  "about": {
    "content": "# Acerca de\nContenido inline.",
    "description": "Mostrar info del plugin"
  }
}

También acepta: string de ruta única o array de rutas.

Agentes

Tipos de agentes de IA personalizados con sus propias herramientas y modelo.

"agents": [
  "./agents/test-runner.md",
  "./agents/reviewer.md"
]

Los archivos .md de agente usan el mismo formato de frontmatter que los agentes definidos por el usuario (tools, model, disallowedTools).

Skills

Directorios de skill que contienen SKILL.md.

"skills": [
  "./skills/my-skill",
  "./skills/another-skill"
]

Auto-detectado: cualquier directorio en skills/ que contenga SKILL.md.

Estilos de Salida

Formato de respuesta personalizado.

---
name: Conciso
description: Respuestas cortas y directas
keepCodingInstructions: true
forceForPlugin: false
---

Responde en 1-2 frases. Sin preámbulo.

forceForPlugin: true anula la configuración del usuario cuando el plugin está activo.

Hooks

Compatible con los 27 eventos de hook. Tres formatos de declaración:

// Objeto inline
"hooks": { "PostToolUse": [...] }

// Referencia a archivo
"hooks": "./hooks/extra.json"

// Array mezclando ambos
"hooks": [
  "./hooks/formatting.json",
  { "Stop": [...] }
]

Servidores MCP

Integraciones de herramientas externas. Variables especiales disponibles:

"mcpServers": {
  "my-server": {
    "type": "stdio",
    "command": "node",
    "args": ["`${plugin_root}`/server.js"],
    "env": {
      "API_KEY": "`${user_config.API_KEY}`"
    }
  }
}

También acepta: ./archivo.json, ./server.mcpb o URL remota.

Servidores LSP

Language server protocol para inteligencia de código.

command — comando de inicio (obligatorio)
extensionToLanguage — ext → ID de lenguaje (obligatorio)
transport — stdio / socket
restartOnCrash / maxRestarts
startupTimeout / shutdownTimeout (ms)

Canales

Canales de mensajería para el modo asistente KAIROS.

"channels": [{
  "server": "my-chat-server",
  "displayName": "Chat del Equipo",
  "userConfig": {
    "CHANNEL_ID": {
      "type": "string",
      "title": "ID del Canal"
    }
  }
}]

server debe coincidir con una clave en mcpServers. El servidor MCP debe declarar la capacidad claude/channel.

Configuración (Settings)

Anulaciones de configuración cuando el plugin está habilitado.

"settings": {
  "agent": {
    "my-agent": {
      "tools": ["Read", "Grep"],
      "model": "haiku"
    }
  }
}

Actualmente solo se soporta la clave "agent". Se fusiona en la cascada de settings cuando está habilitado.

Configuración de Usuario (userConfig)

Los plugins pueden definir opciones que se solicitan al habilitarlos. Los valores se inyectan como $`${user_config.CLAVE}` en configs MCP/LSP, hooks y contenido de skills — y como variables de entorno CLAUDE_PLUGIN_OPTION_CLAVE en comandos de hook.

Ejemplo de schema

"userConfig": {
  "API_KEY": {
    "type": "string",
    "title": "Clave API",
    "description": "Tu clave API",
    "required": true,
    "sensitive": true      // guardado en Keychain
  },
  "MAX_RESULTS": {
    "type": "number",
    "title": "Máx. Resultados",
    "default": 10,
    "min": 1,
    "max": 100
  },
  "VERBOSE": {
    "type": "boolean",
    "default": false
  },
  "PROJECT_DIR": { "type": "directory" },
  "CONFIG_FILE": { "type": "file" }
}

Tipos de opción de configuración

Tipo Entrada Campos extra
string Texto multiple (array)
number Numérico min, max
boolean Toggle
directory Selector de ruta
file Selector de archivo

Almacenamiento

No sensible: settings.json → pluginConfigs[pluginId].options
Sensible: macOS Keychain o .credentials.json

Sistema de Marketplace

Formatos de fuente de plugin

Tipo Formato
Ruta relativa "./plugins/my-plugin"
NPM { "source": "npm", "package": "@org/plugin" }
Pip { "source": "pip", "package": "my-plugin" }
Git URL { "source": "url", "url": "...", "ref": "main" }
GitHub { "source": "github", "repo": "owner/repo" }
Subdirectorio Git { "source": "git-subdir", "url": "...", "path": "plugins/my" }

Anti-suplantación

Los nombres de marketplace se validan contra registros conocidos. Un marketplace no puede suplantar los plugins de otro. Las dependencias cruzadas requieren declarar explícitamente allowCrossMarketplaceDependenciesOn.

extraKnownMarketplaces en settings.json

{
  "extraKnownMarketplaces": [
    {
      "type": "github",
      "repo": "org/plugins",
      "ref": "main"
    },
    {
      "type": "url",
      "url": "https://plugins.example.com/marketplace.json"
    },
    {
      "type": "npm",
      "package": "@org/marketplace"
    },
    {
      "type": "directory",
      "path": "/marketplace/local"
    },
    {
      "type": "settings",
      "name": "marketplace-inline",
      "plugins": [
        { "name": "my-plugin", "source": "./ruta" }
      ]
    }
  ]
}

Flujo de Instalación y Carga

Instalación (10 pasos)

1. Usuario ejecuta /plugin install o habilita desde el menú
2. Resolver fuente del marketplace (extraKnownMarketplaces → por defecto)
3. Encontrar plugin en marketplace.json, resolver tipo de fuente
4. Descargar: npm pack, GitHub sparse checkout, git clone o pip install
5. Caché en ~/.claude/plugins/cache/{marketplace}/{plugin}/{version}/
6. Validar manifiesto + auto-detectar commands/, agents/, skills/…
7. Verificar dependencias — detectar y reportar deps circulares
8. Solicitar valores de userConfig si están definidos
9. Añadir a enabledPlugins en settings.json
10. Cargar capacidades del plugin en la sesión

Carga al inicio (5 pasos)

1. assemblePluginLoadResult() — carga en paralelo desde marketplace, sesión (--plugin-dir) y fuentes built-in
2. mergePluginSources() — plugins de sesión anulan marketplace por nombre; la política gana sobre todo
3. verifyAndDemote() — dependencias insatisfechas degradan el plugin a deshabilitado
4. createPluginFromPath() por plugin — lee manifiesto, auto-detecta dirs, carga hooks y .mcp.json
5. Registrar capacidades: comandos, skills, agentes, estilos, hooks, servidores MCP, servidores LSP

Caché y auto-actualización

Se verifica la versión en cada inicio. La caché soporta modo ZIP. Si forceRemoveDeletedPlugins: true en el marketplace, los plugins eliminados se deshabilitan automáticamente.

Comando /plugin

Alias: /plugins, /marketplace

Comando Descripción
/plugin Abrir menú interactivo de gestión de plugins
/plugin install [nombre@marketplace] Instalar un plugin desde el marketplace
/plugin manage Gestionar plugins instalados (habilitar/deshabilitar/configurar)
/plugin uninstall <nombre> Eliminar un plugin
/plugin enable <nombre> Habilitar un plugin deshabilitado
/plugin disable <nombre> Deshabilitar un plugin
/plugin validate [ruta] Validar un manifiesto de plugin
/plugin marketplace add <fuente> Añadir una fuente de marketplace
/plugin marketplace remove <nombre> Eliminar una fuente de marketplace
/plugin marketplace update [nombre] Actualizar índice del marketplace
/plugin marketplace list Listar marketplaces configurados

Permisos y Políticas Enterprise

Controles de política

Configuración Descripción
allowedPlugins Lista blanca de plugins permitidos (nombre o nombre@marketplace)
deniedPlugins Lista negra — siempre tiene precedencia sobre la lista blanca (fail-closed)
strictPluginOnlyCustomization Bloquear superficies (ej. mcp) solo a plugins — servidores MCP configurados por el usuario bloqueados

Nomenclatura de servidores MCP del plugin

plugin:<nombrePlugin>:<nombreServidor>

Se deduplican contra servidores configurados manualmente — el manual gana. Siguen el mismo sistema de permisos que las herramientas MCP regulares.

Formato de ID de plugin

// String
"mi-plugin@mi-marketplace"

// Objeto con opciones
{
  "id": "mi-plugin@mi-marketplace",
  "version": "^1.0.0",
  "required": true,
  "config": { "API_KEY": "valor" }
}

Ambas partes validadas: [a-z0-9][-a-z0-9._]*

! No hay plugins built-in registrados actualmente
El scaffolding del sistema de plugins está completo — manifiestos, marketplace, instalación, carga y controles de política están todos implementados. Sin embargo, src/plugins/bundled/index.ts actualmente no registra ningún plugin built-in. La infraestructura existe para migrar skills integrados a forma de plugin activable por el usuario, pero en el estado actual del código el registro built-in está vacío.