Slash command custom in Claude Code: /commit, /review-pr, /deploy e altri
Come creare slash command personalizzati in Claude Code: struttura YAML, placeholder, allowed-tools, esempi pratici e anti-pattern da evitare.

Claude Code arriva con una manciata di slash command pronti: /help, /clear, /compact, /model. Utili, ma il valore vero sta nel fatto che puoi definire i tuoi. Un file markdown in una cartella, e hai uno shortcut riusabile per i flussi che ripeti ogni giorno: creare un commit, aprire una PR, rivedere codice, fare deploy, generare changelog.
Non e’ magia, e’ un prompt template con un po’ di frontmatter YAML. Ma proprio perche’ e’ semplice vale la pena capirlo bene, specie se lavori in team.
Cosa sono, in pratica
Uno slash command custom e’ un file .md che Claude Code legge al volo quando digiti /nome-comando. Il contenuto del file viene iniettato come prompt, con eventuali placeholder sostituiti. Nessun eseguibile, nessun plugin da installare: solo markdown.
Le due location che contano:
- Personali:
~/.claude/commands/— visibili solo a te, su qualsiasi progetto - Di progetto:
.claude/commands/nella root del repo — committati in git, condivisi col team
Il nome del file e’ il nome del comando. commit.md diventa /commit. Le sottocartelle creano namespace: .claude/commands/git/commit.md diventa /git:commit.
Anatomia di un comando
La struttura minima e’ frontmatter YAML opzionale + corpo markdown con le istruzioni. Campi riconosciuti dal frontmatter:
description: una riga, appare nell’autocomplete quando digiti/argument-hint: suggerimento sugli argomenti attesi (es.[message] | [ticket-id])allowed-tools: whitelist dei tool che Claude puo’ usare dentro il comandomodel: forza un modello specifico per quel comando
Il corpo e’ il prompt vero e proprio. Puoi usare placeholder dinamici: $ARGUMENTS prende tutto quello che segue il comando come una stringa unica, $1, $2, $3 prendono i singoli argomenti posizionali. In aggiunta, se prefissi una riga con ! Claude Code esegue quel comando shell prima di inviare il prompt e ne include l’output nel contesto.
Un /commit che funziona
Esempio concreto: un comando che analizza il diff corrente, decide se serve uno o piu’ commit, e li crea seguendo conventional commits.
---
description: Crea commit conventional partendo dal diff staged o unstaged
argument-hint: [nota opzionale da aggiungere al corpo]
allowed-tools: Bash(git:*), Read, Grep
---
Contesto corrente del repo:
- Status: !`git status --short`
- Diff staged: !`git diff --cached --stat`
- Diff unstaged: !`git diff --stat`
- Ultimi 5 commit: !`git log --oneline -5`
Istruzioni:
1. Se non c'e' nulla di staged, esegui `git add -A` solo dopo avermelo detto
2. Analizza il diff e raggruppa i cambi per intento logico
3. Se ci sono cambi non correlati, proponi piu' commit separati
4. Usa formato conventional: `type(scope): subject` in minuscolo, imperativo, max 72 char
5. Se l'utente ha passato una nota ($ARGUMENTS), aggiungila al body del commit
6. Non pushare mai automaticamente
7. Mostra il messaggio finale prima di eseguire `git commit`
Salvato come .claude/commands/commit.md, diventa /commit. Lanciato con /commit ref #1234, la stringa ref #1234 finisce in $ARGUMENTS.
Placeholder: $ARGUMENTS vs posizionali
La differenza conta quando il comando prende input strutturato. Un /review-pr 1234 main dove il primo argomento e’ il numero PR e il secondo il branch base, si scrive cosi’:
---
description: Review di una PR GitHub
argument-hint: [pr-number] [base-branch]
allowed-tools: Bash(gh:*), Bash(git:*), Read, Grep
---
Recupera la PR #$1 e confrontala con $2.
1. !`gh pr view $1 --json title,body,files,additions,deletions`
2. !`gh pr diff $1`
3. Analizza i cambi contro la base $2
4. Produci review strutturata: bug, security, performance, leggibilita'
5. Non postare il commento automaticamente, mostramelo prima
Se invece usi $ARGUMENTS prendi tutto come un blob unico — comodo quando il comando e’ free-form (es. /brainstorm idea per onboarding).
allowed-tools: la gabbia che ti salva
Il campo allowed-tools limita cosa il comando puo’ invocare. Un /deploy che fa partire script in produzione non dovrebbe avere accesso a tool generici: va scoped stretto. La sintassi supporta pattern per i Bash:
Bash(git:*): solo comandigitBash(npm run test:*): solo test runnerRead, Grep, Glob: sola lettura, zero scritturaWebFetch(domain:docs.claude.com): fetch solo su domini whitelisted
Se non specifichi nulla, il comando eredita i permessi della sessione. Meglio essere espliciti: ti risparmia brutte sorprese e rende il comando riproducibile fra utenti con profili diversi.
Personali vs di progetto
Regola pratica: nei ~/.claude/commands/ ci vanno le abitudini tue (stile commit, template email, scorciatoie per il tuo stack preferito). Nei .claude/commands/ del repo ci va tutto quello che serve anche ai colleghi: /deploy, /run-migration, /release, /check-env.
Committare .claude/commands/ nel repo ha un effetto collaterale positivo: nuovo sviluppatore clona, apre Claude Code, scrive / e vede i comandi standard del progetto. E’ documentazione eseguibile. Ed e’ un formato leggibile da umani, quindi non hai dipendenza vincolante dall’IDE.
Anti-pattern da evitare
- Comandi chilometrici: se il prompt supera 150-200 righe, spezzalo o spostalo in una skill. Gli slash command eccellono per task focalizzati
- Side effect non dichiarati: un
/fixche pusha su main senza avvisare e’ un bug in attesa. Dichiara sempre cosa tocca il filesystem o la rete - Troppa specificita’:
/commit-for-payment-module-v2non serve. Parametrizza con$ARGUMENTS - Hardcode di path assoluti: rendi il comando portabile, usa path relativi alla root del repo
- Duplicati fra personale e progetto: la versione di progetto vince, ma crea confusione. Tieni i nomi distinti
Dove si incastrano con il resto
Gli slash command sono uno dei tre meccanismi di estensione di Claude Code. Gli altri due sono https://www.smartworkers.cloud/?p=3421 per reagire automaticamente a eventi (pre/post tool use), e https://www.smartworkers.cloud/?p=3423 per impacchettare conoscenza di dominio riusabile. Regola grossolana: slash command per azioni esplicite che lanci tu, hook per automazione passiva, skill per expertise che Claude carica on-demand.
Dopo tre o quattro comandi salvati ti accorgi che il terminale inizia a comportarsi come un IDE custom cucito sul tuo workflow. La domanda interessante non e’ “quali comandi esistono”, e’ “quale parte del tuo lavoro e’ abbastanza ripetitiva da meritare un file markdown di 30 righe?”

Blogger dal 2001, Nativo Digitale, Developer.
Da 15 anni mi occupo di IT per una grande Azienda.
Lavoro per abbattere il Digital Divide.
Visita i miei altri progetti
sardiniamobility.com
www.cyberness.it