> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Plugins

> Instala y comparte conjuntos de skills desde un repositorio, una URL de git o una carpeta local.

<Note>
  Los plugins están en **beta**. El comportamiento y la configuración pueden cambiar en futuras versiones.
</Note>

Un **plugin** es un conjunto de [skills](/es/cli/extensibility/skills/overview) que puedes
instalar desde un repositorio de GitHub, una URL de git o una carpeta local y reutilizar en distintos
proyectos. Al instalar un plugin, sus skills pasan a estar disponibles como
comandos de barra diagonal `/<plugin>:<skill>`, y también puede incorporar automáticamente otros plugins de los que depende.

Un plugin es simplemente un origen que contiene:

```
my-plugin/
├── .devin-plugin/
│   └── plugin.json     # El manifiesto del plugin
└── skills/
    └── review/
        └── SKILL.md    # Un skill ordinario
```

El directorio `skills/` contiene skills normales; los plugins no introducen ningún
nuevo formato de skill. Consulta [Creación de skills](/es/cli/extensibility/skills/creating-skills) para ver el
formato de `SKILL.md`.

***

<div id="installing-a-plugin">
  ## Instalar un plugin
</div>

El origen de un plugin puede ser un `owner/repo` de GitHub, una URL de git o una ruta local:

```bash theme={null}
# Desde GitHub
devin plugins install acme/review-tools

# Desde cualquier host de git
devin plugins install https://gitlab.com/acme/review-tools.git

# Desde una carpeta local (ideal para desarrollo de plugins)
devin plugins install ./my-plugin
```

Antes de instalarlo, Devin muestra lo que agrega el plugin: las skills que proporciona,
los plugins requeridos que se instalarán automáticamente y cualquier política que introduzca
(por ejemplo, si prohíbe otros plugins). Usa `-y` / `--yes` para omitir la
confirmación.

Los plugins se instalan a nivel de **usuario** y están disponibles en todos tus
proyectos.

***

<div id="managing-plugins">
  ## Administrar plugins
</div>

```bash theme={null}
# Listar los plugins instalados, sus versiones y si alguno está bloqueado por política
devin plugins list

# Mostrar los skills de un plugin y sus listas de requeridos/opcionales/prohibidos
devin plugins info review-tools

# Volver a obtener un plugin (o todos los plugins) en la versión más reciente
devin plugins update review-tools
devin plugins update

# Eliminar un plugin (los plugins requeridos instalados automáticamente se conservan)
devin plugins remove review-tools
```

Los plugins locales se enlazan directamente con su carpeta de origen, por lo que las ediciones se reflejan al instante:
`devin plugins install ./my-plugin` → edita `skills/<name>/SKILL.md` → los cambios
se aplican en la siguiente sesión, sin necesidad de `update`.

***

<div id="the-manifest">
  ## El manifiesto
</div>

`.devin-plugin/plugin.json` describe el plugin. Solo `name` es obligatorio y
debe ser único entre los plugins instalados (es el espacio de nombres `/<name>:…`).

```jsonc theme={null}
{
  "name": "review-tools",
  "version": "1.0.0",
  "description": "Code-review skills for our team",
  "requiredPlugins": [
    "acme/secure-base",
    { "source": "github", "repo": "acme/audit-logging" }
  ],
  "optionalPlugins": [
    "acme/deploy-tools",
    { "source": "url", "url": "https://gitlab.com/acme/extra.git" }
  ],
  "forbiddenPlugins": ["sketchy-org/bad-plugin", "acme/*", "*"]
}
```

Campos de metadatos compatibles: `name`, `version`, `description`, `author`
(`{ name, email }`), `homepage`, `repository`, `license` y `keywords`.

Una entrada de dependencia es un **origen**: puede ser una cadena abreviada o un objeto:

* `"owner/repo"` → GitHub
* `"https://…"`, `"git@…"`, `"ssh://…"` → URL de git
* `{ "source": "github", "repo": "owner/repo" }`
* `{ "source": "url", "url": "https://gitlab.com/team/plugin.git" }`

Todas las formas de GitHub para el mismo repo (`owner/repo`, la URL HTTPS, la
URL `.git`, la forma SSH) se refieren a la misma identidad de plugin.

***

<div id="dependencies-and-governance">
  ## Dependencias y gobernanza
</div>

Un plugin puede declarar tres listas, lo que permite que un único plugin actúe como una colección seleccionada y gobernada de otros plugins.

<div id="requiredplugins">
  ### `requiredPlugins`
</div>

Se instalan automáticamente (de forma recursiva) cuando se instala el plugin. Si un plugin requerido
está bloqueado por una política, falla toda la instalación; no existe una instalación parcial.

<div id="optionalplugins">
  ### `optionalPlugins`
</div>

Una **lista de plugins permitidos** que este plugin admite. **No** se
instalan automáticamente; la lista solo importa como excepción frente a una entrada prohibida
(ver más abajo).

<div id="forbiddenplugins">
  ### `forbiddenPlugins`
</div>

Una **lista de bloqueo**. Cada entrada puede ser una de las siguientes:

* Una identidad exacta del plugin, escrita como `owner/repo`, una URL de git o una ruta local.
* Un **patrón glob**: cualquier entrada que contenga `*`. El `*` coincide con cualquier secuencia de
  caracteres, incluido `/`. Los patrones se normalizan primero al espacio de
  identidad canónica, por lo que `acme/*` pasa a ser `https://github.com/acme/*` (todos los
  repos de GitHub de `acme`), `*/secrets` coincide con un repo llamado `secrets` de cualquier propietario, y
  `https://gitlab.com/acme/*` coincide con cualquier repo en esa ruta.
* El valor único `"*"`, que coincide con todos los demás plugins (un bloqueo total imposible de eludir).

Las reglas de la política son:

* **La denegación prevalece.** Un plugin se bloquea si cualquier plugin instalado lo prohíbe (mediante su
  identidad exacta, un glob coincidente o `"*"`).
* **Autoexcepción.** Los `requiredPlugins`, `optionalPlugins` y el propio plugin quedan exentos de su **propia** lista de prohibidos. Por lo tanto,
  `forbiddenPlugins: ["*"]` junto con `optionalPlugins: [B, C]` significa "permitirme a mí mismo, a B y a C; prohibir todo lo demás."
* **No se puede volver a permitir entre plugins.** Las listas de permitidos de un plugin no pueden volver a permitir
  lo que **otro** plugin prohíbe. Un plugin instalado con
  `forbiddenPlugins: ["*"]` es un bloqueo total imposible de eludir.
* **Abierto de forma predeterminada.** Si ningún plugin instalado prohíbe nada, no se bloquea nada.

La política se aplica en dos momentos:

* **En el momento de la instalación**: se rechaza la instalación de un plugin bloqueado (o de uno cuyos plugins requeridos
  no pueden satisfacerse, o cuyo nombre entra en conflicto con un plugin instalado).
* **En el momento de la carga**: si un plugin queda bloqueado después de instalarse (por ejemplo, si más tarde se instala
  un plugin que lo prohíbe), permanece en disco pero sus skills se
  omiten al inicio de la sesión, con una advertencia que indica qué plugin lo prohíbe.
