8 · Skills personalizzate
Il modulo 7 si è chiuso con “commands/ è la forma breve, skills/ è la forma completa”: questo
modulo è quella forma completa. Una skill è un’istruzione confezionata — una
cartella con dentro un file SKILL.md — che Claude carica solo quando serve: come le schede di un
ricettario, che consulti solo quando cucini quel piatto. La differenza rispetto a un semplice comando:
una skill può portarsi dietro file di supporto, può decidere chi la invoca (tu, Claude, o entrambi), e
può attivarsi da sola quando la richiesta la riguarda. È il meccanismo con cui insegni a Claude il
tuo mestiere senza pagarlo in contesto a ogni sessione.
Obiettivi
Sezione intitolata “Obiettivi”- Scrivere una
SKILL.mdcorretta e sapere quali campi del frontmatter servono davvero. - Scegliere tra
CLAUDE.md, regola e skill in base a quando l’informazione deve essere in contesto. - Controllare chi invoca una skill: tu, Claude, o entrambi.
- Far girare una skill in un subagent per non consumare il contesto principale.
- Capire se una skill funziona davvero, invece di sperarlo.
Concetti chiave
Sezione intitolata “Concetti chiave”Il vantaggio delle skill è il caricamento pigro. Il corpo di una skill si carica solo quando viene
usata: materiale di riferimento lungo costa quasi nulla finché non serve. È la differenza sostanziale
rispetto al CLAUDE.md, che si carica per intero a ogni sessione.
Il criterio di scelta è quindi temporale, non di contenuto:
| Serve… | Va in |
|---|---|
| Sempre, in ogni sessione | CLAUDE.md |
| Quando Claude tocca certi file | Regola in .claude/rules/ con paths: |
| Quando serve quella procedura | Skill |
| Sempre, senza eccezioni, come codice | Hook |
Il segnale che una cosa è diventata una skill: hai una sezione di CLAUDE.md che è cresciuta fino a
diventare una procedura invece di un fatto. Oppure incolli in chat le stesse istruzioni per la terza
volta.
Due parti, un file. Ogni skill ha una SKILL.md con frontmatter YAML tra --- che dice a Claude
quando usarla, e contenuto markdown con le istruzioni da seguire. Il nome della directory diventa il
comando.
Il corpo resta in contesto per tutta la sessione. Quando una skill viene invocata, il contenuto entra nella conversazione come un singolo messaggio e ci resta. Claude Code non rilegge il file nei turni successivi. Due conseguenze pratiche: ogni riga è un costo di token ricorrente, quindi il corpo va tenuto conciso; e le indicazioni che devono valere per tutto un task vanno scritte come istruzioni permanenti, non come passi da eseguire una volta.
La description è il meccanismo di attivazione. Claude vede all’avvio solo nomi e descrizioni delle
skill: è su quel testo che decide se una skill è pertinente. Una descrizione vaga produce una skill che non
si attiva mai; una troppo ampia produce una skill che si attiva sempre.
Dove vivono le skill
Sezione intitolata “Dove vivono le skill”| Livello | Percorso | Vale per |
|---|---|---|
| Enterprise | Vedi le impostazioni gestite | Tutti nell’organizzazione |
| Personale | ~/.claude/skills/<nome>/SKILL.md |
Tutti i tuoi progetti |
| Progetto | .claude/skills/<nome>/SKILL.md |
Solo questo progetto |
| Plugin | <plugin>/skills/<nome>/SKILL.md |
Dove il plugin è abilitato |
Le skill si caricano anche da directory .claude/skills/ annidate sotto la working directory: quando
Claude legge o modifica un file in una sottodirectory, le skill di quel .claude/skills/ diventano
disponibili. Un pacchetto di un monorepo può così fornire le proprie skill, anche se la sessione è partita
dalla root del repo.
La risoluzione dei conflitti di nome è quella vista nel modulo 7: enterprise > personale > progetto, la skill batte il comando, i plugin usano un namespace a parte.
La struttura di una skill
Sezione intitolata “La struttura di una skill”Directory.claude/skills/
Directorysecurity-review/
- SKILL.md obbligatorio — panoramica e navigazione
- checklist.md Riferimento dettagliato, caricato quando serve
- examples.md Esempi d’uso, caricati quando servono
Directoryscripts/
- scan.py Script di utilità: eseguito, non caricato in contesto
I file di supporto tengono SKILL.md focalizzata sull’essenziale. Documentazione lunga, specifiche API o
raccolte di esempi non devono entrare in contesto ogni volta che la skill parte. Vanno referenziati da
SKILL.md, così Claude sa cosa contengono e quando aprirli:
## Risorse aggiuntive
- Per i dettagli completi delle API, vedi [reference.md](reference.md)- Per esempi d'uso, vedi [examples.md](examples.md)Riferimento del frontmatter
Sezione intitolata “Riferimento del frontmatter”Se parti da zeroFrontmatter e YAML in trenta secondi
Il frontmatter è il blocchetto di opzioni racchiuso tra due righe ---
in cima al file. È scritto in YAML: righe chiave: valore, e l’indentazione
(gli spazi a inizio riga) fa da struttura. Due regole d’oro quando lo copi: non toccare gli spazi,
e non usare il Tab — solo spazi. Tutto quello che sta sotto il secondo --- è il contenuto
normale del file.
Tutti i campi sono opzionali, con una precisazione: se ometti description, viene usato il primo
paragrafo del contenuto — quindi qualcosa che descriva la skill c’è sempre. Scriverla
esplicitamente resta la scelta giusta, perché è il testo su cui Claude decide quando attivarla.
---name: my-skilldescription: What this skill doesdisable-model-invocation: trueallowed-tools: Read Grep---
Le istruzioni della skill...I campi booleani accettano yes, no, on, off, 1 e 0 in qualsiasi combinazione di maiuscole,
oltre a true e false.
Identità e attivazione
Sezione intitolata “Identità e attivazione”| Campo | Cosa fa |
|---|---|
name |
Nome mostrato negli elenchi. Default: il nome della directory |
description |
Cosa fa la skill e quando usarla. Se omesso, viene usato il primo paragrafo del markdown. Metti il caso d’uso principale per primo: description e when_to_use insieme vengono troncati a 1.536 caratteri nel listing |
when_to_use |
Contesto aggiuntivo su quando invocarla — frasi trigger, esempi di richieste. Si somma a description e conta verso lo stesso limite |
argument-hint |
Suggerimento mostrato nell’autocomplete, es. [issue-number] o [filename] [format] |
arguments |
Argomenti posizionali con nome, per la sostituzione $nome. Accetta una stringa separata da spazi o una lista YAML |
Chi la invoca
Sezione intitolata “Chi la invoca”| Campo | Cosa fa |
|---|---|
disable-model-invocation |
true impedisce a Claude di caricarla da solo. Per i workflow che vuoi lanciare a mano con /nome. Impedisce anche il preload nei subagent e l’esecuzione da un task programmato. Default: false |
user-invocable |
false quando solo Claude deve invocarla: sparisce dal menu / e digitare /nome non la esegue. Per conoscenza di sfondo che l’utente non deve lanciare. Default: true |
Tool e modello
Sezione intitolata “Tool e modello”| Campo | Cosa fa |
|---|---|
allowed-tools |
Tool che Claude può usare senza chiedere permesso, durante il turno che invoca la skill. Il permesso decade al tuo messaggio successivo |
disallowed-tools |
Tool rimossi dal pool disponibile mentre la skill è attiva. Per skill autonome che non devono mai chiamare certi tool, per esempio AskUserQuestion in un loop di background |
model |
Modello da usare mentre la skill è attiva. Vale per il resto del turno corrente e non viene salvato nelle impostazioni. Accetta gli stessi valori di /model, o inherit |
effort |
Livello di effort: low, medium, high, xhigh, max. I livelli disponibili dipendono dal modello |
Esecuzione in subagent
Sezione intitolata “Esecuzione in subagent”| Campo | Cosa fa |
|---|---|
context |
fork fa girare la skill in un contesto di subagent separato |
agent |
Quale tipo di subagent usare, quando context: fork è impostato |
background |
Solo con context: fork. false aspetta il risultato nel turno che ha invocato la skill, invece di farlo girare in background. Default: true |
hooks |
Hook che Claude Code registra quando la skill viene invocata, e che restano attivi per il resto della sessione |
La sintassi dei valori di allowed-tools merita una riga, perché ricorre in tutto il corso:
Read da solo pre-approva un tool intero; Bash(git add *) pre-approva il tool Bash solo per i
comandi che iniziano con git add — il pattern tra parentesi restringe, e l’asterisco è il jolly.
Lo spazio prima di * conta: Bash(git add *) approva git add src/, non git addqualcosa.
Due tipi di contenuto
Sezione intitolata “Due tipi di contenuto”Contenuto di riferimento — conoscenza che Claude applica al lavoro corrente: convenzioni, pattern, guide di stile, conoscenza di dominio. Gira inline, così Claude la usa insieme al contesto della conversazione.
---name: api-conventionsdescription: API design patterns for this codebase---
When writing API endpoints:- Use RESTful naming conventions- Return consistent error formats- Include request validationContenuto di task — istruzioni passo-passo per un’azione specifica: deploy, commit, generazione di
codice. Di solito lo invochi tu con /nome invece di lasciare decidere a Claude.
---name: deploydescription: Deploy the application to productioncontext: forkdisable-model-invocation: true---
Deploy the application:1. Run the test suite2. Build the application3. Push to the deployment targetArgomenti e contesto dinamico
Sezione intitolata “Argomenti e contesto dinamico”Gli argomenti funzionano come per i comandi del modulo 7:
$ARGUMENTS per tutto, $ARGUMENTS[N] o $N per posizione.
Il contesto dinamico !`comando` esegue il comando prima che il contenuto arrivi a Claude e
sostituisce il segnaposto con l’output:
---name: pr-summarydescription: Summarize changes in a pull requestcontext: forkagent: Exploreallowed-tools: Bash(gh *)---
## Pull request context
!`gh pr diff`
## Your task
Riassumi la PR per un revisore che non ha seguito il lavoro.Visibilità dalle impostazioni
Sezione intitolata “Visibilità dalle impostazioni”skillOverrides controlla la visibilità di una skill dalle impostazioni, invece che dal suo
frontmatter. Serve per le skill di cui non vuoi toccare il SKILL.md — tipiche quelle committate in un
repo condiviso.
| Valore | Elencata a Claude | Nel menu / |
|---|---|---|
"on" (default) |
Nome e descrizione | Sì |
"name-only" |
Solo il nome | Sì |
"user-invocable-only" |
Nascosta | Sì |
"off" |
Nascosta | Nascosta |
{ "skillOverrides": { "legacy-context": "name-only", "deploy": "off" }}Il menu /skills lo scrive per te: evidenzia una skill, premi Spazio per ciclare gli stati, Invio per
salvare. Le skill dei plugin non sono influenzate da skillOverrides: si gestiscono con /plugin.
Esempio guidato: dalla prima skill a una che funziona
Sezione intitolata “Esempio guidato: dalla prima skill a una che funziona”-
Crea la directory.
Terminal window mkdir -p ~/.claude/skills/summarize-changesTerminal window New-Item -ItemType Directory -Force "$env:USERPROFILE\.claude\skills\summarize-changes" -
Scrivi
SKILL.md.~/.claude/skills/summarize-changes/SKILL.md ---description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.---## Current changes!`git diff HEAD`## InstructionsSummarize the changes above in two or three bullet points, then list any risksyou notice such as missing error handling, hardcoded values, or tests that needupdating. If the diff is empty, say there are no uncommitted changes.Guarda la
description: dice cosa fa e quando usarla, con le frasi che l’utente direbbe davvero — “what changed”, “commit message”, “review their diff”. È quello il meccanismo di attivazione. -
Testala in due modi. Apri un progetto git, fai una piccola modifica e lancia
claude.Lasciando decidere a Claude:
What did I change?Invocandola direttamente:
/summarize-changesDevono produrre la stessa cosa. Se il primo modo non attiva la skill, il problema è la
description. -
Verifica che Claude la veda.
What skills are available?Se la skill non è in elenco, controlla il percorso e lancia
/reload-skills. -
Aggiungi un file di supporto. Le istruzioni lunghe non devono stare in
SKILL.md. Il comando qui sotto usa un heredoc, una sintassi di bash per scrivere un file di più righe in un colpo solo: tutto ciò che sta tra<<'EOF'e la rigaEOFfinisce nel file. In alternativa puoi semplicemente creare il file con un editor di testo qualsiasi — il risultato è identico, ed è la strada su Windows.Terminal window # scrive il file rischi.md con tutto il testo fino alla riga "EOF"cat > ~/.claude/skills/summarize-changes/rischi.md <<'EOF'# Catalogo dei rischi da cercare## CredenzialiChiavi API, token, password, URL di connessione con credenziali inline.Cerca anche i file `.env` aggiunti allo staging.## Errori silenziati`catch` vuoti, `except: pass`, promise senza `.catch`, errori loggatie poi ignorati.## Confini non validatiInput esterni usati senza validazione: parametri di query, body dirichieste, variabili d'ambiente, argomenti da riga di comando.EOFPoi referenzialo da
SKILL.md, aggiungendo in fondo:## Risorse aggiuntive- Per il catalogo completo dei rischi, vedi [rischi.md](rischi.md)Il file viene letto solo quando serve: non pesa sul contesto di ogni invocazione.
-
Falla girare in un subagent — un aiutante separato con la sua finestra di contesto, protagonista del modulo 11. Se la skill legge molti file, fai stare quelle letture fuori dal tuo contesto. Aggiungi al frontmatter:
context: forkagent: Explorebackground: falsebackground: falsefa aspettare il risultato nello stesso turno, invece di lanciarla in background. -
Blindala per l’uso manuale. Se è una skill con effetti collaterali che non vuoi che Claude lanci da solo:
disable-model-invocation: trueallowed-tools: Bash(git add *) Bash(git commit *) Bash(git status *)Ora
/summarize-changesesegue i comandi git senza chiederti conferma a ogni passo, ma Claude non la invoca mai di sua iniziativa.
Capire se una skill funziona
Sezione intitolata “Capire se una skill funziona”Vedere una skill attivarsi ti dice che Claude l’ha trovata, non che ha fatto quello che volevi. Le due cose vanno misurate separatamente:
- Attivazione — Claude la invoca sui prompt su cui dovrebbe? Scrivi cinque richieste che dovrebbero attivarla e cinque che non dovrebbero, e provale.
- Output — quando si attiva, il risultato è quello che ti aspetti? Definisci prima cosa consideri corretto.
Esiste anche una skill dedicata, skill-creator, per far girare delle eval su una skill — test
automatici che misurano se la skill produce davvero il comportamento per cui l’hai scritta.
Esercizio
Sezione intitolata “Esercizio”Trasforma una parte del tuo CLAUDE.md in una skill, e misura la differenza.
- Trova nel tuo
CLAUDE.mduna sezione che è diventata una procedura invece che un fatto. - Misura quanto costa oggi in contesto.
- Spostala in una skill, con la
descriptiongiusta. - Verifica che si attivi quando serve e non quando non serve.
- Misura di nuovo.
Soluzione
Passi 1–2. La candidata tipica è una sezione tipo “Come si fa il rilascio” o “Checklist prima della
PR”: otto passi che valgono una volta a settimana ma che paghi in ogni sessione. Misura con /context
e annota la riga del CLAUDE.md di progetto.
Passo 3. Sposta il contenuto e — questa è la parte che conta — riscrivi la description. Nel
CLAUDE.md non serviva, perché il contenuto c’era sempre. In una skill è tutto:
---description: Procedura di rilascio in produzione. Usala quando l'utente chiede di rilasciare, fare una release, taggare una versione, o chiede "come si mette in produzione".disable-model-invocation: trueargument-hint: "[versione]"---
Rilascia la versione $ARGUMENTS.
1. Verifica che `main` sia allineato con il remoto e che la CI sia verde2. `npm run typecheck` e `npm test` — entrambi devono passare3. Aggiorna il CHANGELOG con le modifiche da `git log --oneline <ultimo-tag>..HEAD`4. Bump della versione in `package.json`5. Commit `chore(release): v$ARGUMENTS`, tag `v$ARGUMENTS`, push con `--follow-tags`6. Verifica che il deploy sia partito e riporta l'URL
Fermati e chiedi conferma prima del passo 5. Non procedere se il passo 2 fallisce.I termini del mestiere dentro la skill, per chi non li mastica: “la CI è verde” = i controlli
automatici del repository passano; il CHANGELOG è il file che elenca cosa cambia a ogni versione;
il “bump” è l’incremento del numero di versione; il tag è l’etichetta git che marca il punto
esatto di una release (e --follow-tags la spedisce su GitHub insieme al commit).
Nota due scelte deliberate: disable-model-invocation: true, perché un rilascio non deve partire perché
Claude ha ritenuto pertinente; e le due frasi finali, scritte come istruzioni permanenti — restano in
contesto per tutta la sessione, quindi devono valere per tutta la sessione.
Passo 4. La verifica dell’attivazione va fatta con disable-model-invocation temporaneamente
tolto, altrimenti stai testando solo l’invocazione manuale. Cinque prompt che devono attivarla:
come rilascio la 2.3.0?possiamo fare una release?è ora di taggare la versionemettiamo in produzionequal è la procedura di deploy?E cinque che non devono:
questo test fallisceaggiungi un endpointperché la CI è rossa?riassumi le modifichecome si chiama questa funzione in inglese?Se “perché la CI è rossa?” attiva la skill di rilascio, la descrizione è troppo ampia: contiene concetti (CI, produzione) che compaiono in contesti diversi. Restringila.
Rimetti disable-model-invocation: true quando hai finito di testare.
Passo 5. Rilancia /context in una sessione nuova. Il CLAUDE.md è più corto; al suo posto paghi solo
la riga di descrizione nel listing delle skill. Il corpo lo paghi le due volte al mese in cui rilasci.
Errori comuni e troubleshooting
Sezione intitolata “Errori comuni e troubleshooting”La skill non si attiva
Sezione intitolata “La skill non si attiva”- Controlla che la
descriptioncontenga le parole che diresti davvero. È il criterio con cui Claude decide. - Verifica che compaia: chiedi
What skills are available?. - Riformula la richiesta avvicinandola alla descrizione — serve a capire se il problema è lì.
- Invocala direttamente con
/nome-skill, se è invocabile dall’utente.
Se il YAML del frontmatter è malformato, Claude Code carica il corpo con metadati vuoti: /nome-skill
funziona ancora, ma Claude non ha nessuna description su cui fare match. È il caso più insidioso, perché
sembra funzionare. Lancia con --debug per vedere l’errore di parsing.
Le descrizioni vengono troncate
Sezione intitolata “Le descrizioni vengono troncate”Claude Code carica in contesto un listing di nomi e descrizioni. Il listing contiene sempre tutti i nomi, ma se hai molte skill le descrizioni vengono accorciate per stare nel budget — che è l’1% della finestra di contesto del modello. Quando il listing sfora, vengono tolte per prime le descrizioni delle skill che invochi meno.
Rimedi, in ordine di preferenza:
| Rimedio | Come |
|---|---|
| Accorcia il testo alla fonte | Caso d’uso principale per primo; il limite per voce è 1.536 caratteri |
| Libera budget | "name-only" in skillOverrides per le skill a bassa priorità |
| Alza il budget | skillListingBudgetFraction (es. 0.02 = 2%) o SLASH_COMMAND_TOOL_CHAR_BUDGET |
| Alza il cap per voce | skillListingMaxDescChars |
/doctor stima il costo in contesto del listing e i suoi maggiori contributori. La riga Skills di
/context riporta la dimensione dopo l’applicazione del budget, quindi corrisponde a quello che il
modello riceve davvero.
Tabella dei sintomi
Sezione intitolata “Tabella dei sintomi”| Sintomo | Causa | Soluzione |
|---|---|---|
| La skill non parte mai da sola | description vaga o troncata |
Riscrivila con le parole dell’utente; controlla il budget del listing |
| La skill parte troppo spesso | description troppo ampia |
Rendila più specifica, o disable-model-invocation: true |
/nome funziona ma Claude non la invoca mai |
Frontmatter YAML malformato | --debug mostra l’errore di parsing |
| La skill smette di influenzare il comportamento dopo la prima risposta | Il contenuto è ancora lì, ma il modello sta scegliendo altro | Rafforza description e istruzioni, o usa un hook |
| Dopo una compattazione la skill non ha più effetto | Ne hai invocate molte: le più vecchie cadono per prime dai 25.000 token totali | Ri-invocala per ripristinare il contenuto pieno |
| Metà delle istruzioni della skill viene ignorata | Il troncamento tiene i primi 5.000 token | Metti le istruzioni importanti in cima a SKILL.md |
| La skill nuova non compare | Directory non ri-scansionate | /reload-skills |
| Una skill di un repo clonato ha permessi che non ti aspettavi | allowed-tools non è gated dal workspace trust |
Rivedi il frontmatter delle skill committate prima di lanciare Claude Code nel repo |
I comandi !`...` non eseguono |
La skill è sincronizzata da claude.ai | Comportamento previsto: le skill sincronizzate non eseguono comandi locali |
Cheat-sheet
Sezione intitolata “Cheat-sheet”Struttura minima
.claude/skills/<nome>/SKILL.md → /<nome>---description: Cosa fa e quando usarla, con le parole dell'utente---
Le istruzioni.Frontmatter, i campi che userai davvero
| Campo | Quando |
|---|---|
description |
Sempre |
when_to_use |
Quando servono frasi trigger esplicite |
disable-model-invocation: true |
Workflow con effetti collaterali, da lanciare a mano |
user-invocable: false |
Conoscenza di sfondo che l’utente non deve invocare |
allowed-tools |
Per evitare conferme ripetute durante il turno |
disallowed-tools |
Per togliere tool a una skill autonoma |
context: fork + agent |
Quando la skill legge molto e non deve consumare il tuo contesto |
argument-hint |
Quando accetta argomenti |
model / effort |
Quando il task richiede più o meno potenza del solito |
Sostituzioni e sintassi
$ARGUMENTS |
Tutto ciò che segue il nome |
$0, $1, $2 |
Argomenti posizionali |
!`comando` |
Esegue e inserisce l’output prima che Claude legga |
Numeri
| Cosa | Valore |
|---|---|
SKILL.md consigliata |
Sotto 500 righe |
description + when_to_use |
Troncate a 1.536 caratteri nel listing |
| Budget del listing | 1% della finestra di contesto |
| Re-iniezione dopo compattazione | 5.000 token per skill, 25.000 totali |
| Skill concatenabili | La prima più altre cinque |
Pagine ufficiali consultate, verificate il 16 agosto 2026:
- Extend Claude with skills — struttura, frontmatter completo, file di supporto, argomenti, subagent,
skillOverrides, troubleshooting - Commands reference — skill bundled e comandi built-in
- Subagents —
context: forke preload delle skill - Hooks — hook nelle skill e quando servono al posto delle istruzioni
- Settings —
skillListingBudgetFractioneskillListingMaxDescChars - How Claude remembers your project — quando usare una skill al posto di
CLAUDE.mdo di una regola
Corso indipendente, non affiliato ad Anthropic o Google. Claude e Claude Code sono marchi di Anthropic; Antigravity e Gemini sono marchi di Google.