Le problème de tout répéter
Avez-vous déjà dû expliquer la même chose à quelqu’un vingt fois ? Eh bien imaginez ça, mais avec un robot qui en plus perd la mémoire toutes les quelques heures.
“Non, Claude, le commit doit passer les tests d’abord.”
“Claude, je t’ai déjà dit d’utiliser le format type: description.”
“N’ajoute pas d’emojis, bon sang !”
C’était mon quotidien jusqu’à ce que je découvre les Skills. Dit en termes clairs : ce sont des instructions que vous écrivez une fois et que Claude suit pour toujours. Comme dresser un chien, mais sans les croquettes.
Ce que sont les Skills
Depuis la version 2.1.3, Claude Code a fusionné les anciens slash commands avec quelque chose de plus puissant : les Skills. Ce sont des fichiers Markdown avec des instructions que Claude peut exécuter de deux façons :
- Manuellement : quand vous écrivez
/mon-skill - Automatiquement : quand Claude détecte qu’il devrait l’utiliser
Ce deuxième point, c’est la magie. Vous n’avez plus besoin de vous rappeler d’invoquer la commande. Si vous avez un skill qui dit “utiliser quand l’utilisateur termine une tâche et qu’il y a des changements non commités”, Claude le fera tout seul.
C’est comme avoir un majordome qui sait quand débarrasser la table sans qu’on le lui demande.
Où ils vivent
~/.claude/skills/ # Personnels (tous vos projets)
.claude/skills/ # Du projet (partagés avec l'équipe)
~/.claude/commands/ # Legacy, fonctionne encore
.claude/commands/ # Legacy, fonctionne encore
Si vous voulez que seul vous utilisiez le skill, vous le mettez dans votre home. Si vous voulez que toute l’équipe l’ait, vous le commitez au repo. Aussi simple que ça.
Anatomie d’un Skill
Un skill est un fichier Markdown avec un frontmatter YAML et ensuite le contenu :
| |
C’est le minimum. Mais le frontmatter a pas mal d’autres options qui valent la peine d’être connues.
Champs obligatoires
name
L’identifiant du skill. Seulement minuscules, chiffres et tirets (max. 64 caractères). Doit correspondre au nom du fichier ou répertoire.
| |
description
C’est le champ le plus important. Claude l’utilise pour deux choses :
- Décider quand auto-invoquer le skill
- Comprendre ce qu’il doit faire
Maximum 1024 caractères. Incluez des mots-clés que l’utilisateur dirait naturellement.
| |
Champs optionnels
model
Force un modèle spécifique pour ce skill. Utile pour des tâches qui nécessitent plus de capacité.
| |
Si vous ne le spécifiez pas, il utilise le modèle de la conversation actuelle.
allowed-tools
Restreint les outils que Claude peut utiliser. Critique pour les skills en lecture seule ou sécurisés.
| |
Exemple pratique : un skill d’analyse qui ne doit rien toucher :
| |
context: fork
Exécute le skill dans un sous-agent isolé avec son propre contexte. L’historique de la conversation principale n’est pas contaminé.
| |
Utile pour des opérations complexes en plusieurs étapes où vous ne voulez pas encombrer le chat de bruit.
agent
Fonctionne seulement avec context: fork. Définit quel type d’agent exécute le skill.
| |
user-invocable
Contrôle s’il apparaît dans le menu des / (slash commands). Par défaut c’est true.
| |
Utile pour des skills internes qui devraient seulement s’activer automatiquement.
disable-model-invocation
Empêche Claude d’invoquer le skill par lui-même. Seul vous pouvez l’activer avec /nom.
| |
Utile pour des opérations destructives ou coûteuses qui nécessitent une décision humaine explicite.
hooks
Définit des hooks qui s’exécutent pendant le cycle de vie du skill. Supporte PreToolUse, PostToolUse et Stop.
| |
Variables de substitution
Dans le contenu du skill vous pouvez utiliser :
| Variable | Ce qu’elle contient |
|---|---|
$ARGUMENTS | Les arguments passés en invoquant /skill arg1 arg2 |
${CLAUDE_SESSION_ID} | ID de la session actuelle (utile pour les logs) |
Tableau récapitulatif
| Champ | Obligatoire | But |
|---|---|---|
name | ✓ | Identifiant du skill |
description | ✓ | Quand et pourquoi l’utiliser |
model | Forcer un modèle spécifique | |
allowed-tools | Restreindre les outils | |
context | fork pour sous-agent isolé | |
agent | Type d’agent (avec context: fork) | |
user-invocable | Montrer/cacher dans le menu / | |
disable-model-invocation | Bloquer l’auto-invocation | |
hooks | Hooks du cycle de vie |
Exemple complet
| |
Pour la référence complète, consultez la documentation officielle des Agent Skills.
Texte libre ou code déterministe ?
C’est la question à un million : si les skills sont en Markdown, est-ce que ça veut dire que Claude “interprète” toujours ce que vous écrivez ? Puis-je faire quelque chose de vraiment prévisible ?
La réponse courte : les skills sont aussi déterministes que vous les écrivez.
Pensez à un spectre :
Vague/Flexible ──────────────────────────► Déterministe
"révise le code" "exécute ces 3 commandes dans l'ordre"
Skill flexible (Claude décide)
| |
Ici Claude a toute liberté. Il peut regarder ce qu’il veut, suggérer ce qui lui semble bien. Utile pour l’exploration, dangereux pour les processus critiques.
Skill déterministe (script déguisé)
| |
C’est essentiellement un script de 3 lignes. Claude n’a pas de marge pour être créatif. Exécute, rapporte, point.
Skill avec logique conditionnelle
| |
- Si ce n’est PAS
main→ ABANDONNER avec “Seulement depuis main”
Étape 2 : État propre
| |
- S’il y a un output → ABANDONNER avec “Changements non commités”
Étape 3 : Bump + push
| |
Il y a de la logique de branches ici, mais ça reste déterministe : les conditions sont explicites.
### Skill qui invoque un script réel
Si vous avez besoin de vraie logique complexe (boucles, parsing, APIs), mettez le code dans un script et que le skill ne fasse que l'exécuter :
.claude/skills/deploy/ ├── SKILL.md └── deploy.sh
**SKILL.md :**
```markdown
---
name: deploy
description: Déploie en production
---
Exécuter :
```bash
bash .claude/skills/deploy/deploy.sh
Rapporter le résultat. NE PAS modifier le script.
**deploy.sh :**
```bash
#!/bin/bash
set -e
uv run pytest || exit 1
hugo --minify
rsync -avz public/ user@server:/var/www/
Le meilleur des deux mondes : la logique complexe vit en Bash/Python où elle appartient, et le skill est juste le déclencheur.
Quand utiliser chaque approche
| Besoin | Approche |
|---|---|
| Commandes fixes, toujours identiques | Skill déterministe |
| Logique complexe avec beaucoup de branches | Script externe |
| Analyse qui nécessite du jugement | Skill flexible avec garde-fous |
| Opérations dangereuses | allowed-tools restrictif |
Exemple réel : le skill de commit
C’est celui que j’utilise le plus. Avant je devais me rappeler : “ok, exécute les tests, puis le linter, puis le type-check, et seulement alors commite”. Maintenant je dis simplement “commite” et Claude fait tout seul.
| |
Phase 2 : Vérifications OBLIGATOIRES
| |
Si l’une échoue, NE PAS continuer.
Phase 3 : Créer le commit
git add -A- Analyser les changements
- Générer le message :
type: description git commit
Vous voyez la section "Quand Utiliser" ? C'est ce qui permet l'auto-invocation. Claude lit ça et pense : "ah, l'utilisateur vient de dire 'c'est fini', il y a des changements en attente, je devrais utiliser ce skill".
## Autre exemple : archivage de tâches
Si vous utilisez un fichier `TASKS.md` pour tracker ce que vous faites (je le faisais avant Beads), ce skill vous nettoie les tâches terminées automatiquement :
```markdown
---
name: archive-tasks
description: Archive les tâches terminées de TASKS.md vers TASKS-DONE.md.
Utiliser automatiquement quand TASKS.md a beaucoup de tâches terminées
ou dépasse les 20K tokens.
---
# Archive Tasks
## Quand Utiliser (Automatique)
- TASKS.md a plus de 50 tâches terminées `[x]`
- TASKS.md dépasse les 20'000 tokens
- L'utilisateur mentionne que TASKS.md est très gros
## Processus
1. Lire `docs/llm/TASKS.md`
2. Identifier les tâches terminées (`[x]`)
3. Déplacer vers `docs/llm/TASKS-DONE.md` avec date
4. Supprimer de TASKS.md
5. Rapporter combien ont été archivées
## Règles
- **NE PAS supprimer** les tâches en attente `[ ]`
- **PRÉSERVER** le contexte (section parent)
- **AJOUTER** la date d'archivage
Le beau c’est que vous n’avez pas besoin de vous en souvenir. Claude voit que TASKS.md est énorme et agit.
Conseils pour écrire de bons skills
1. Descriptions spécifiques
| |
2. Définissez quand appliquer
| |
3. Soyez explicite avec les interdictions
Claude a tendance à vouloir être poli et demander confirmation. Si vous ne voulez pas ça, dites-le clairement :
| |
4. Utilisez model: opus pour l’important
Si le skill fait quelque chose de critique (audit de sécurité, refactoring complexe), forcez le modèle le plus capable :
| |
5. Restreignez les outils si nécessaire
Parfois vous voulez un skill qui ne fait que lire, sans rien modifier :
| |
Skills simples vs complexes
Un skill simple est un seul fichier :
.claude/skills/review.md
Un skill complexe est un répertoire avec des ressources :
.claude/skills/deploy/
├── SKILL.md # Instructions
├── templates/
│ └── k8s-deployment.yaml
└── scripts/
└── healthcheck.sh
Claude peut lire les fichiers du répertoire comme contexte additionnel.
Ce que j’utilise
| Skill | Pour quoi | Auto-invocation |
|---|---|---|
commit | Commit avec vérifications | Quand je dis “commit” ou termine quelque chose |
check-diagnostics | Vérifier types et lint | Avant les commits |
owasp | Audit de sécurité | Manuel (c’est coûteux) |
archive-tasks | Nettoyer TASKS.md | Quand c’est très gros |
La différence avec les commands legacy
| Aspect | Skills | Commands |
|---|---|---|
| Auto-invocation | Oui | Non |
| Structure | Répertoire ou fichier | Seulement fichier |
| Recommandation | Utiliser pour tout nouveau | Legacy |
Les commands fonctionnent encore, mais les skills sont strictement meilleurs. Si vous avez de vieux commands, pas besoin de les migrer, mais pour du nouveau utilisez les skills.
Conclusion
Les skills sont essentiellement de la programmation, mais en langage naturel. Vous définissez ce que vous voulez qu’il se passe, quand, et avec quelles restrictions. Claude fait le reste.
Le mieux c’est qu’ils sont versionnés avec votre code. Si vous travaillez en équipe, tout le monde a les mêmes skills. Si vous changez quelque chose, ça reste dans l’historique git.
Est-ce que ça vaut l’effort de les écrire ? Si vous répétez la même chose plus de trois fois, absolument. Chaque skill que vous écrivez est une conversation que vous n’aurez plus jamais à avoir.
Maintenant si vous m’excusez, je dois aller apprendre à Claude que “refactoriser” ne veut pas dire “réécrire tout depuis zéro”.
TL;DR : Les skills sont des instructions en Markdown que Claude Code exécute manuellement ou automatiquement. Ils peuvent être aussi flexibles ou déterministes que vous en avez besoin : de “analyse ça” jusqu’à des scripts déguisés en prose. Si vous avez besoin de logique complexe, invoquez des scripts externes. Ils vivent dans .claude/skills/ et sont versionnés avec votre code.