Blog
Tutorials·14 min read

Maîtriser Claude Code Partie 4 : Commandes Personnalisées

Construis ta propre bibliothèque de commandes. Transforme des workflows complexes en raccourcis clavier avec les commandes slash personnalisées, les arguments, le frontmatter et les hooks.

Jo Vinkenroye·January 15, 2026
Maîtriser Claude Code Partie 4 : Commandes Personnalisées

Voilà ce que j'ai remarqué après quelques semaines d'utilisation de Claude Code : je tapais les mêmes prompts encore et encore. « Revois ce code pour les problèmes de sécurité. » « Génère des tests en suivant les patterns du projet. » « Crée un commit avec un bon message. »

Moi en train de taper "revois ce code pour les problèmes de sécurité" pour la 47e fois - Encore
Moi en train de taper "revois ce code pour les problèmes de sécurité" pour la 47e fois - Encore

Chaque prompt répété, ce sont des frappes gaspillées. Les commandes slash personnalisées règlent ce problème.

Que sont les commandes personnalisées ?

Les commandes personnalisées sont des fichiers markdown qui deviennent des commandes slash. Place un fichier appelé review.md dans le bon dossier, et soudain /review est une commande que tu peux lancer à tout moment.

.claude/commands/
├── review.md → /review
├── test.md → /test
└── git/
├── commit.md → /git:commit
└── pr.md → /git:pr

La magie : ces commandes peuvent accepter des arguments, spécifier quels outils Claude peut utiliser, définir des hooks qui s'exécutent automatiquement, et même forcer un modèle spécifique. Ce ne sont pas de simples prompts sauvegardés — ce sont des workflows programmables.

Ta première commande en 60 secondes

Étape 1 : Créer le répertoire

Mkdir -p .claude/commands

Étape 2 : Créer un fichier de commande

Cat > .claude/commands/review.md << 'EOF'
Review the staged changes for:
- Security vulnerabilities
- Performance issues
- Missing error handling
- Type safety problems
Format as: Critical (must fix) → Warnings → Suggestions
EOF

Étape 3 : Utilise-la

/review

C'est tout. Claude exécute tes instructions comme si tu les avais tapées toi-même.

Arguments : rendre les commandes dynamiques

Les commandes statiques sont utiles, mais les commandes dynamiques sont puissantes. Le placeholder $ARGUMENTS capture tout ce qui suit le nom de la commande.

Arguments basiques

# .claude/commands/explain.md
Explain how $ARGUMENTS works in this codebase.
Show me the key files, the data flow, and any gotchas.

Utilisation :

/explain the authentication system
/explain the payment processing flow
/explain how websockets connect to the backend

Tout ce que tu tapes après /explain devient $ARGUMENTS.

Arguments positionnels

Besoin de plus de contrôle ? Utilise $1, $2, $3 pour des positions spécifiques :

# .claude/commands/fix-issue.md
Fix GitHub issue #$1.
Priority: $2
Additional context: $3
1. Read the issue description
2. Find the relevant code
3. Implement the fix
4. Write tests
5. Create a commit referencing the issue

Utilisation :

/fix-issue 1234 high "user reported login failures on mobile"

Ici $1 = "1234", $2 = "high", $3 = "user reported login failures on mobile".

Frontmatter : les super-pouvoirs des commandes

La vraie puissance vient du frontmatter YAML en haut de ton fichier de commande. Il te permet de configurer les permissions, les hints, les modèles et bien plus.

Les bases

---
Description: Review code for security issues
Argument-hint: [file-or-directory]
---
Review $ARGUMENTS for security vulnerabilities including:
- SQL injection
- XSS
- Authentication bypasses

La description apparaît quand tu lances /help. L'argument-hint indique aux utilisateurs quoi passer.

Pré-approuver les permissions d'outils

Marre d'approuver les mêmes commandes git à chaque fois ? Utilise allowed-tools :

---
Description: Smart git commit
Allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*), Bash(git diff:*)
Argument-hint: [optional message]
---
Analyze the staged changes and create a commit.
If a message is provided, use it: $ARGUMENTS
Otherwise, generate a descriptive message following conventional commits.
Requirements:
- Use format: type(scope): description
- Keep summary under 72 characters
- Body explains WHY, not WHAT

Maintenant /git:commit s'exécute sans demandes de permission pour ces commandes git spécifiques.

Forcer un modèle spécifique

Certaines commandes fonctionnent mieux avec des modèles spécifiques :

---
Description: Deep architecture analysis
Model: claude-sonnet-4-5-20250929
---
Analyze the architecture of $ARGUMENTS.
Consider:
- Design patterns in use
- Coupling between modules
- Scalability implications
- Technical debt indicators

Utilise Haiku pour les tâches rapides, Sonnet pour un travail équilibré, Opus pour le raisonnement complexe :

---
Description: Quick code explanation
Model: claude-3-5-haiku-20241022
---
Briefly explain what $ARGUMENTS does in 2-3 sentences.

Hooks dans les commandes

Les commandes peuvent définir leurs propres hooks qui s'exécutent pendant l'exécution :

---
Description: Format and commit
Hooks:
PostToolUse:
- matcher: "Edit|Write"
hooks:
- type: command
command: "npx prettier --write $FILE_PATH"
---
Make the requested changes to $ARGUMENTS.
After each edit, files will be auto-formatted.

Ça lance Prettier après chaque modification de fichier — mais uniquement tant que cette commande est active.

Espaces de noms avec les répertoires

Organise les commandes liées dans des sous-répertoires. Le nom du dossier devient un espace de noms :

.claude/commands/
├── git/
│ ├── commit.md → /git:commit
│ ├── pr.md → /git:pr
│ ├── branch.md → /git:branch
│ └── squash.md → /git:squash
├── test/
│ ├── unit.md → /test:unit
│ ├── e2e.md → /test:e2e
│ └── coverage.md → /test:coverage
└── docs/
├── readme.md → /docs:readme
└── api.md → /docs:api

Ça garde ta sortie /help organisée et les commandes faciles à découvrir.

Commandes globales vs projet

Commandes projet (équipe)

Ton-projet/.claude/commands/
  • Disponibles uniquement dans ce projet
  • Commite dans git — toute l'équipe les obtient
  • Idéales pour les workflows spécifiques au projet

Commandes personnelles (toi)

~/.claude/commands/
  • Disponibles dans tous les projets
  • Boosters de productivité personnels
  • Non partagées avec l'équipe

Répartition recommandée

Garde en global (personnel) :

  • /explain — Explication de code universelle
  • /debug — Processus de débogage systématique
  • /review — Checklist de revue de code générale

Garde spécifique au projet (équipe) :

  • /deploy — Tes étapes de déploiement
  • /test:e2e — Ta configuration de tests
  • /git:commit — Les conventions de commit de ton équipe
  • /onboard — Contexte spécifique au projet pour les nouveaux devs

10 commandes à piquer

Voici des commandes éprouvées. Copie-les, modifie-les, fais-en les tiennes.

Les Dix Commandements de Claude Code
Les Dix Commandements de Claude Code

1. /review — Revue de code

---
Description: Comprehensive code review
Argument-hint: [file or leave empty for staged changes]
---
Review $ARGUMENTS (or staged changes if not specified).
## Check For
- Security: OWASP Top 10, auth issues, data exposure
- Performance: N+1 queries, memory leaks, blocking calls
- Correctness: Edge cases, error handling, type safety
- Maintainability: Complexity, naming, duplication
## Output Format
### 🚨 Critical (blocks merge)
### ⚠️ Warnings (should fix)
### 💡 Suggestions (nice to have)

2. /git:commit — Commits intelligents

---
Description: Analyze changes and create commit
Allowed-tools: Bash(git *)
---
1. Run `git diff --staged` to see changes
2. Analyze what was changed and why
3. Create a commit message:
- Format: type(scope): description
- Types: feat, fix, refactor, docs, test, chore
- Under 72 chars
- Body explains WHY if non-obvious
4. Execute the commit

3. /test:generate — Création de tests

---
Description: Generate comprehensive tests
Argument-hint: [file-to-test]
---
Generate tests for $ARGUMENTS.
## Include
- Happy path (expected usage)
- Edge cases (empty, null, boundaries)
- Error scenarios (invalid input, failures)
- Integration points (mocks for external deps)
## Requirements
- Match existing test patterns in this project
- Use the testing framework already in use
- Clear test names: "should [expected] when [condition]"

4. /debug — Débogage systématique

---
Description: Debug an issue systematically
Argument-hint: [description of the problem]
---
Debug: $ARGUMENTS
## Process
1. Clarify: What's expected vs actual behavior?
2. Reproduce: What triggers the issue?
3. Isolate: Which component/function is responsible?
4. Trace: Follow the data flow
5. Fix: Implement and verify the solution
## Output
- Root cause
- Affected code paths
- Fix with explanation
- Prevention strategy

5. /security — Audit de sécurité

---
Description: Security vulnerability scan
Argument-hint: [file, directory, or leave empty for full scan]
Allowed-tools: Read, Grep, Glob
---
Audit $ARGUMENTS for security vulnerabilities.
## Check For
- Injection: SQL, command, XSS, template
- Auth: Weak passwords, session issues, CSRF
- Data: Exposure, logging secrets, insecure storage
- Config: Debug mode, default creds, missing headers
- Dependencies: Known CVEs
## Output
Severity-ranked findings with:
- Location (file:line)
- Risk explanation
- Remediation steps

6. /refactor — Amélioration du code

---
Description: Refactor while maintaining behavior
Argument-hint: [file-or-function]
---
Refactor $ARGUMENTS.
## Goals
- Reduce complexity
- Improve readability
- Apply DRY
- Better naming
- Smaller functions (single responsibility)
## Constraints
- NO behavior changes
- Keep public API intact
- Existing tests must pass
Explain each change.

7. /explain — Explication de code

---
Description: Explain code for someone new
Argument-hint: [file, function, or concept]
Model: claude-3-5-haiku-20241022
---
Explain $ARGUMENTS.
## Cover
- What it does (purpose)
- How it works (step by step)
- Why it's designed this way
- Dependencies and side effects
- Potential gotchas
Assume reader knows the language but not this codebase.

8. /optimize — Analyse de performance

---
Description: Analyze and optimize performance
Argument-hint: [file-or-function]
---
Analyze $ARGUMENTS for performance.
## Examine
- Time complexity (Big O)
- Space complexity
- I/O operations
- Database queries (N+1?)
- Unnecessary allocations
## Output
- Current bottlenecks
- Specific optimizations
- Expected improvement
- Trade-offs involved

9. /ship — Checklist pré-déploiement

---
Description: Pre-deployment verification
Allowed-tools: Bash(npm *), Bash(git *)
---
Pre-deploy checklist:
- [ ] Tests pass (`npm test`)
- [ ] Lint clean (`npm run lint`)
- [ ] Build succeeds (`npm run build`)
- [ ] No console.log/debugger statements
- [ ] Env vars documented
- [ ] No hardcoded secrets
- [ ] Error handling complete
- [ ] Migrations ready
Run checks and report: Ready 🚀 or Blocked 🛑 with issues.

10. /catchup — Restauration du contexte

Cette commande implémente le pattern /clear + /catchup de la Partie 2 pour une gestion efficace du contexte.

---
Description: Rebuild context after /clear
Allowed-tools: Bash(git *)
---
I just cleared context. Help me catch up.
1. Run `git diff main...HEAD --stat` to see what's changed
2. Summarize the changes on this branch
3. Read the key modified files
4. Tell me where we likely are in this feature
$ARGUMENTS (if any additional context)

Au-delà du code : commandes créatives

Les commandes ne se limitent pas aux workflows de code. Tu peux intégrer n'importe quelle API ou service que Claude peut appeler. En voici deux que j'ai utilisées en écrivant cette série de blog :

/meme — Générer des mèmes

---
Description: Generate a meme using Imgflip API
Argument-hint: "top text" "bottom text" [template]
---
Generate a meme using the Imgflip API.
## API Details
- Endpoint: https://api.imgflip.com/caption_image
- Username: $IMGFLIP_USER
- Password: $IMGFLIP_PASS
## Popular Templates
- drake (181913649) - Drake Hotline Bling
- distracted (112126428) - Distracted Boyfriend
- changemymind (129242436) - Change My Mind
- twobuttons (87743020) - Two Buttons
- pikachu (155067746) - Surprised Pikachu
## Instructions
1. Parse the arguments: $ARGUMENTS
2. Use curl to POST to the API with template_id, text0, text1
3. Return the generated meme URL
4. Download to ./public/assets/blog/ if requested

J'ai utilisé cette commande pour générer le mème « distracted boyfriend » dans la Partie 5 — le développeur distrait par « juste shippe-le » pendant que « écris les tests d'abord » regarde d'un air désapprobateur.

/imagen — Génération d'images par IA

C'est l'une de mes préférées. L'API Imagen de Google te permet de générer des images directement depuis Claude Code. Voici une implémentation complète :

---
Description: Generate an image using Google Imagen
Argument-hint: "prompt" [output-path]
Allowed-tools: Bash(node *)
---
Generate an image using Google Imagen.
## Instructions
1. Parse the prompt from: $ARGUMENTS
2. Run: node ~/.claude/scripts/generate-image.js "prompt" "./output.png"
3. Report the saved file path

La vraie magie est dans le script. Voici une implémentation complète que tu peux déposer dans ~/.claude/scripts/generate-image.js :

#!/usr/bin/env node
Const https = require('https');
Const fs = require('fs');
Const path = require('path');
Const API_KEY = process.env.GOOGLE_AI_API_KEY || 'your-api-key-here';
// Note: Check https://ai.google.dev/gemini-api/docs/imagen for the latest model ID
Const MODEL = 'imagen-4.0-generate-001';
Async function generateImage(prompt, outputPath) {
const requestBody = {
instances: [{ prompt }],
parameters: {
sampleCount: 1,
aspectRatio: '16:9',
personGeneration: 'dont_allow'
}
};
const body = JSON.stringify(requestBody);
const options = {
hostname: 'generativelanguage.googleapis.com',
port: 443,
path: `/v1beta/models/${MODEL}:predict?key=${API_KEY}`,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body)
}
};
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
const response = JSON.parse(data);
if (response.error) {
reject(new Error(response.error.message));
return;
}
if (response.predictions?.[0]) {
const imageData = response.predictions[0].bytesBase64Encoded;
const dir = path.dirname(outputPath);
if (dir && !fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(outputPath, Buffer.from(imageData, 'base64'));
resolve(outputPath);
}
});
});
req.on('error', reject);
req.write(body);
req.end();
});
}
Const [prompt, outputPath = `./generated-${Date.now()}.png`] = process.argv.slice(2);
GenerateImage(prompt, outputPath).then(p => console.log(`Saved: ${p}`));

Obtenir une clé API :

  1. Va sur Google AI Studio
  2. Crée une nouvelle clé API
  3. Soit définis la variable d'environnement GOOGLE_AI_API_KEY, soit colle-la directement dans le script

Exemples d'utilisation :

/imagen "a minimalist logo for a coding blog, orange and white"
/imagen "abstract geometric pattern" ./public/hero.png
/imagen "futuristic terminal interface, dark theme, neon accents"

Paramètres de l'API :

  • sampleCount — Nombre d'images à générer (1-4, par défaut : 4)
  • aspectRatio — Dimensions de sortie : 1:1, 3:4, 4:3, 9:16, 16:9 (par défaut : 1:1)
  • personGeneration — Contrôle les personnes dans les images :
    • dont_allow — Bloquer complètement les personnes
    • allow_adult — Adultes seulement (par défaut)
    • allow_all — Adultes et enfants
  • imageSize — Résolution : 1K ou 2K (modèles Standard/Ultra uniquement)

Modèles disponibles :

  • imagen-4.0-generate-001 — Standard, meilleure qualité
  • imagen-4.0-ultra-generate-001 — Ultra, qualité maximale
  • imagen-4.0-fast-generate-001 — Rapide, latence réduite
  • imagen-3.0-generate-001 — Génération précédente

Certaines images de couverture et illustrations de cette série ? Générées avec /imagen. Les mèmes que tu vois ici ? Créés avec /meme.

Le point clé : s'il y a une API, tu peux l'encapsuler dans une commande. Publication sur les réseaux sociaux, traduction, génération d'images, recherche de données — tout devient une commande slash.

Principes de conception des commandes

Objectif unique — Une commande fait une seule chose bien. /review fait de la revue, /test fait des tests. Ne fabrique pas des couteaux suisses.

Format de sortie clair — Dis à Claude exactement comment présenter les résultats. Des puces ? Des catégories ? Des niveaux de sévérité ? Sois explicite.

Inclure des contraintes — Qu'est-ce que Claude ne doit PAS faire ? « Pas de changements de comportement » ou « Ne pas modifier les tests » empêche les dépassements de périmètre.

Utiliser le modèle approprié — Haiku pour les recherches rapides, Sonnet pour la plupart des tâches, Opus pour le raisonnement complexe. Adapte le modèle au travail.

Pré-approuver les outils sûrs — Si une commande a toujours besoin de git ou npm, utilise allowed-tools pour éviter les demandes de permission.

Déboguer les commandes

Si une commande ne fonctionne pas :

  1. Vérifie le chemin — Est-elle dans .claude/commands/ ou ~/.claude/commands/ ?
  2. Vérifie l'extension — Doit être .md
  3. Lance /help — Ta commande devrait apparaître dans la liste
  4. Vérifie le frontmatter — Le YAML doit être valide (indentation correcte, guillemets autour des chaînes avec caractères spéciaux)

La suite

Les commandes personnalisées encodent tes workflows en actions réutilisables. Mais que se passe-t-il si tu veux partager des commandes au-delà de ton équipe ? Si tu veux des commandes qui fonctionnent à travers différents projets sans copier de fichiers partout ?

C'est là que les Skills entrent en jeu. Dans la Partie 5 : Skills, nous explorerons comment packager des commandes pour une distribution plus large et créer une automatisation plus sophistiquée.

Quick Reference

Créer des commandes

mkdir -p .claude/commands — Créer le répertoire

.claude/commands/nom.md — Commande basique

.claude/commands/git/commit.md — Avec espace de noms (/git:commit)

Champs du frontmatter

Description — Affiché dans /help

Argument-hint — Indication d'utilisation

Allowed-tools — ex. Bash(git *), Read, Write

Model — Surcharger le modèle

Placeholders d'arguments

$ARGUMENTS — Tout après la commande

$1, $2, $3 — Arguments positionnels

Voir les commandes/help

Stay Updated

Get notified about new posts on automation, productivity tips, indie hacking, and web3.

No spam, ever. Unsubscribe anytime.

Comments

Related Posts