> ## 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.

# Plugin

> Installa e condividi pacchetti di skill da una repo, un URL git o una cartella locale.

<Note>
  I plugin sono in **beta**. Il comportamento e la configurazione potrebbero cambiare nelle release future.
</Note>

Un **plugin** è un pacchetto di [skill](/it/cli/extensibility/skills/overview) che puoi
installare da una repo GitHub, un URL git o una cartella locale e riutilizzare in
più progetti. Quando installi un plugin, le sue skill diventano disponibili come
slash command `/<plugin>:<skill>` e possono includere automaticamente anche altri
plugin da cui dipendono.

Un plugin è semplicemente una sorgente che contiene:

```
my-plugin/
├── .devin-plugin/
│   └── plugin.json     # Il manifest del plugin
└── skills/
    └── review/
        └── SKILL.md    # Uno skill ordinario
```

La directory `skills/` contiene skill standard: i plugin non introducono alcun nuovo formato di skill. Vedi [Creazione di skill](/it/cli/extensibility/skills/creating-skills) per il
formato `SKILL.md`.

***

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

La sorgente di un plugin può essere un `owner/repo` GitHub, un URL git o un percorso locale:

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

# Da qualsiasi host git
devin plugins install https://gitlab.com/acme/review-tools.git

# Da una cartella locale (ideale per la creazione di plugin)
devin plugins install ./my-plugin
```

Prima dell'installazione, Devin mostra cosa aggiunge il plugin — le skills che mette a disposizione,
gli eventuali plugin richiesti che verranno installati automaticamente e qualsiasi policy che introduce
(ad esempio, se vieta altri plugin). Usa `-y` / `--yes` per saltare la
richiesta di conferma.

I plugin vengono installati a livello di **utente** e sono disponibili in tutti i tuoi
progetti.

***

<div id="managing-plugins">
  ## Gestire i plugin
</div>

```bash theme={null}
# Elenca i plugin installati, le loro versioni e se qualcuno è bloccato dalla policy
devin plugins list

# Mostra le skill di un plugin e i relativi elenchi required/optional/forbidden
devin plugins info review-tools

# Esegue nuovamente il fetch di un plugin (o di tutti i plugin) all'ultima versione
devin plugins update review-tools
devin plugins update

# Rimuove un plugin (i plugin required installati automaticamente vengono mantenuti)
devin plugins remove review-tools
```

I plugin locali sono collegati direttamente alla cartella sorgente, quindi le modifiche sono immediate:
`devin plugins install ./my-plugin` → modifica `skills/<name>/SKILL.md` → le modifiche
si applicano alla sessione successiva, senza dover eseguire `update`.

***

<div id="the-manifest">
  ## Il manifest
</div>

`.devin-plugin/plugin.json` descrive il plugin. Solo `name` è obbligatorio e
deve essere univoco tra i plugin installati (corrisponde allo spazio dei nomi `/<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/*", "*"]
}
```

Campi di metadati supportati: `name`, `version`, `description`, `author`
(`{ name, email }`), `homepage`, `repository`, `license` e `keywords`.

Una voce di dipendenza è una **sorgente** — una stringa in forma abbreviata oppure un oggetto:

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

Tutte le forme GitHub della stessa repo (`owner/repo`, l'URL HTTPS, l'URL `.git`,
la forma SSH) si riferiscono alla stessa identità del plugin.

***

<div id="dependencies-and-governance">
  ## Dipendenze e governance
</div>

Un plugin può dichiarare tre elenchi, consentendo a un singolo plugin di fungere da raccolta curata e sottoposta a governance
di altri plugin.

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

Installati automaticamente (in modo ricorsivo) quando viene installato il plugin. Se un plugin richiesto
è bloccato da una policy, l'intera installazione fallisce — non è prevista un'installazione parziale.

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

Un'**allow-list** di plugin che questo plugin autorizza. **Non** vengono
installati automaticamente; l'elenco serve solo come eccezione a una voce vietata
(vedi sotto).

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

Una **deny-list**. Ogni voce è una delle seguenti:

* Un'identità esatta del plugin, scritta come `owner/repo`, un URL git o un percorso locale.
* Un **pattern glob** — qualsiasi voce che contenga `*`. `*` corrisponde a qualsiasi sequenza di
  caratteri, incluso `/`. I pattern vengono prima normalizzati nello spazio delle
  identità canoniche, quindi `acme/*` diventa `https://github.com/acme/*` (tutte le
  repo GitHub di `acme`), `*/secrets` corrisponde a una repo chiamata `secrets`
  di qualsiasi owner e `https://gitlab.com/acme/*` corrisponde a qualsiasi repo
  in quel percorso.
* Il solo `"*"`, che corrisponde a tutti gli altri plugin (un blocco totale impossibile da aggirare).

Le regole della policy sono:

* **Deny ha la precedenza.** Un plugin viene bloccato se un qualsiasi plugin installato lo vieta (tramite la sua
  identità esatta, un glob corrispondente o `"*"`).
* **Override del plugin stesso.** I `requiredPlugins`, gli `optionalPlugins` di un plugin e il plugin
  stesso sono esclusi dalla propria lista di plugin vietati. Quindi
  `forbiddenPlugins: ["*"]` insieme a `optionalPlugins: [B, C]` significa "consenti
  me stesso, B e C; vieta tutto il resto."
* **Nessuna nuova autorizzazione tra plugin diversi.** Le allow-list di un plugin non possono autorizzare di nuovo
  ciò che **un altro** plugin vieta. Un plugin installato con
  `forbiddenPlugins: ["*"]` è un blocco totale impossibile da aggirare.
* **Aperto per impostazione predefinita.** Se nessun plugin installato vieta nulla, nulla viene bloccato.

La policy viene applicata in due momenti:

* **In fase di installazione** — l'installazione di un plugin bloccato (o di uno i cui plugin richiesti
  non possono essere soddisfatti, o il cui nome è in conflitto con quello di un plugin installato) viene
  rifiutata.
* **In fase di caricamento** — se un plugin viene bloccato dopo l'installazione (per esempio, perché un
  plugin che lo vieta viene installato successivamente), rimane sul disco ma le sue skill vengono
  ignorate all'avvio della sessione, con un avviso che indica il plugin che lo vieta.
