Cinquante confirmations par heure, et au bout d'un moment tu valides sans lire. On règle ça : le bon mode de permission, l'auto mode, une allowlist pour les commandes sûres, une deny list pour les dangereuses, et quelques hooks.
Le principe
Une permission, c'est l'accord que Claude doit obtenir avant d'agir sur ta machine : modifier un fichier, lancer une commande, pousser du code. Lire ton code ne demande rien.
Le problème pratique est connu. En mode manuel, Claude demande confirmation pour chaque commande, même banale. Typecheck ? Confirmation. Lint ? Confirmation. Après 50 clics en une heure, tu valides sans lire, ce qui revient à ne plus rien contrôler. Anthropic l'a mesuré : les utilisateurs de Claude Code approuvent 97 % des demandes de permission.
Deux réponses existent : laisser un classifieur trier à ta place (l'auto mode), et écrire tes propres règles (allowlist et deny list). Les deux se combinent.
Les modes de permission
Le plan mode est détaillé au chapitre 5. La doc liste deux autres modes, moins visibles :
acceptEdits: Claude crée et modifie les fichiers du projet sans demander, ainsi que quelques commandes de fichiers courantes (mkdir,touch,mv,cp,rm,sed) dans ton dossier de travail. Le reste des commandes demande toujours. Pratique si tu préfères relire les changements après coup dansgit diff.dontAsk: tout ce qui demanderait une confirmation est refusé d'office. Seuls passent les lectures et ce que tu as pré-autorisé. Il n'apparaît pas dansShift+Tab, on le lance avecclaude --permission-mode dontAsk. Il est fait pour la CI et les scripts, où personne n'est là pour répondre.
Shift+Tab fait défiler manuel, accept edits, plan, puis auto quand il est disponible. Changer de mode ne casse pas le cache (la partie de la conversation déjà traitée, que le modèle relit pour presque rien). Seule exception : le réglage de modèle opusplan, qui change de modèle en entrant et en sortant du plan mode.
L'auto mode
Un mode de permission où un second modèle, le classifieur, examine chaque action de Claude avant qu'elle tourne, à ta place. Ce qui reste dans le cadre de ta demande passe, ce qui est destructif, irréversible ou dirigé hors de ton environnement est bloqué. Résultat : tu ne cliques presque plus.
Depuis le 14 août 2026, c'est le mode de départ des nouvelles sessions Pro, Max et Team. Depuis fin septembre 2026 (v2.1.283), c'est aussi le cas sur tous les plans et fournisseurs, pour les sessions interactives dans le terminal et dans VS Code, tant que tu n'as pas fixé un autre mode toi-même. Il faut un modèle récent : Opus 4.6 ou plus récent, Sonnet 4.6 ou plus récent, Haiku 5.5, ou un modèle Fable.
Ce qu'il laisse passer, ce qu'il bloque
Ce qui passe sans te déranger : les opérations sur les fichiers de ton dossier de travail, l'installation des dépendances déclarées dans tes fichiers de lock, les requêtes HTTP en lecture, un push sur une branche du repo où tu travailles.
Ce qui est bloqué par défaut, entre autres : curl | bash, les déploiements et migrations en production, le force push, git reset --hard, terraform destroy, l'envoi de données sensibles vers l'extérieur, la suppression de fichiers qui existaient avant la session. claude auto-mode defaults affiche la liste complète.
Tes allow rules continuent de s'appliquer avant le classifieur. Sauf celles assez larges pour lancer n'importe quel code, comme Bash(python:*) : l'auto mode les met de côté tant qu'il est actif.
Quand il bloque
Une action bloquée apparaît dans /permissions, onglet Recently denied. Appuie sur r pour la relancer avec ton accord manuel.
Un "vas-y, je confirme" tapé dans le chat ne débloque rien. Pour que le classifieur prenne ton accord en compte, ton message doit nommer l'action précise et sa cible : "force-push la branche feature/login" lève le blocage, "tu peux force-push" ne le lève pas. Et cet accord ne vaut que pour cette action-là. Certaines règles ne cèdent jamais à un accord écrit (plus bas, hard_deny).
Si le classifieur bloque 3 fois de suite, ou 20 fois sur la session, l'auto mode se met en pause et Claude Code recommence à te demander. Ces seuils ne se règlent pas.
Le régler
/permissions, onglet Auto mode : pour voir et ajuster ce que le classifieur laisse passer, sans ouvrir de fichier. Les changements sont enregistrés dans~/.claude/settings.json.- La section
autoModede~/.claude/settings.jsonaccepte trois listes de règles écrites en langage courant :allow(exceptions à autoriser),soft_deny(blocages qu'un accord explicite peut lever) ethard_deny(blocages absolus). Ajoute toujours"$defaults"dans la liste, sinon tu remplaces les règles intégrées au lieu de les compléter. claude auto-mode critiquerelit tes règles perso et signale celles qui sont floues ou redondantes.claude auto-mode resetremet tout à zéro si tu t'es perdu.
{
"autoMode": {
"allow": [
"$defaults",
"Lancer les migrations Supabase sur la base locale est autorisé"
],
"hard_deny": ["$defaults", "Ne jamais lancer supabase db reset"]
}
}
Le classifieur ne lit pas autoMode dans les fichiers du projet (.claude/settings.json ou .claude/settings.local.json). C'est voulu : un repo cloné pourrait sinon s'auto-autoriser. Même chose pour le mode par défaut : "defaultMode": "auto" ne marche que dans ~/.claude/settings.json.
{
"permissions": {
"defaultMode": "auto"
}
}
Ton CLAUDE.md, lui, est lu par le classifieur. Une consigne comme "ne jamais force push" y oriente à la fois Claude et le classifieur.
L'auto mode ne remplace pas ta deny list. Le classifieur se trompe parfois, dans les deux sens. Garde tes interdits explicites (plus bas) : ils s'appliquent quel que soit le mode.
Pré-autoriser les commandes sûres
En mode manuel, ou pour que l'auto mode n'ait même pas à se poser la question, liste les commandes répétitives et sans risque.
Le raccourci : /fewer-permission-prompts
Lance /fewer-permission-prompts. Claude parcourt tes sessions passées, repère les commandes en lecture seule que tu valides tout le temps, et propose une allowlist classée par priorité dans le .claude/settings.json du projet. Tu relis, tu valides.
À la main
Crée .claude/settings.local.json à la racine de ton projet (version perso, non partagée avec l'équipe). C'est aussi là que Claude Code enregistre tes "Oui, et ne plus demander" :
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(npx supabase *)",
"Bash(npx vitest *)",
"Bash(git add *)",
"Bash(git commit *)"
]
}
}
Syntaxe wildcard : * est un joker. Bash(npm run *) autorise npm run dev, npm run build, npm run test en une seule règle. Garde l'espace avant
le * : Bash(ls *) couvre ls et ls -la, Bash(ls*) couvre aussi
lsof.
| Commande | Pourquoi c'est sûr |
|---|---|
npm run typecheck | Vérifie les types, ne modifie rien |
npm run lint | Vérifie le style, ne modifie rien |
npm run test | Lance les tests, ne modifie rien |
npm run build | Compile l'app, ne modifie pas le code source |
npx supabase | Commandes Supabase locales |
git add/commit | Sauvegarde locale (pas de push) |
Inutile d'ajouter git status, git diff ou git log, ni ls, cat, grep : Claude Code les reconnaît comme commandes en lecture seule et les lance sans demander, dans tous les modes.
Ce qui continue de demander confirmation en mode manuel : git push, npm install, les suppressions de fichiers et toute commande inconnue.
La deny list
La deny list bloque des commandes dans tous les modes, même en bypass, même si Claude pense que c'est nécessaire. Mets-la dans ~/.claude/settings.json (global, pour tous tes projets) :
{
"permissions": {
"deny": [
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(supabase db reset *)",
"Bash(git push --force *)",
"Bash(git push -f *)",
"Bash(git reset --hard *)",
"Bash(git clean -f *)"
]
}
}
rm -rf peut supprimer ton projet entier. supabase db reset détruit les
données et les credentials locaux, et un git push --force peut écraser le
travail de ton équipe. Ces lignes ne coûtent rien, et une seule fausse manip
évitée les rentabilise.
Une limite à connaître : une règle Bash compare le texte de la commande telle que Claude l'écrit. Bash(rm *) arrête rm -rf build/, pas /bin/rm -rf build/ ni bash -c 'rm -rf build/'. Elle attrape le cas courant, rien de plus.
Allow vs deny :
- allow (
.claude/settings.local.jsondu projet) : commandes autorisées sans confirmation - deny (
~/.claude/settings.jsonglobal) : commandes interdites partout, dans tous les modes
Le bypass
Le bypass (lancé avec claude --dangerously-skip-permissions) supprime presque toute demande. La deny list bloque toujours. Quelques cas te redemandent quand même : tes règles ask, et une suppression qui vise / ou ton dossier perso (rm -rf ~).
À éviter sur ta machine de tous les jours. Avec l'auto mode, tu as déjà l'essentiel de la fluidité, et un garde-fou en plus. Le bypass sert dans un conteneur ou une VM que tu peux jeter si ça tourne mal.
Hooks 101
Une commande shell que Claude Code lance tout seul quand un événement précis
se produit : avant un outil, après une modification, au démarrage d'une
session. Tu choisis l'événement, tu écris la commande, et ça tourne à chaque
fois. Contrairement à une consigne dans CLAUDE.md, Claude ne peut pas
l'oublier.
Les événements les plus utiles
| Événement | Quand il se déclenche | Exemple d'usage |
|---|---|---|
PreToolUse | Avant que Claude utilise un outil | Bloquer une commande avant qu'elle tourne |
PostToolUse | Après qu'un outil a réussi | Formater un fichier après un Edit |
UserPromptSubmit | Chaque fois que tu envoies un message | Ajouter du contexte à ta demande |
SessionStart | Au lancement ou à la reprise d'une session | Charger un index de notes |
Stop | Quand Claude termine sa réponse | Jouer un son, lancer les tests |
PreCompact | Avant une compaction du contexte | Sauvegarder des notes avant le résumé |
PreModelSwitch / PostModelSwitch | Avant et après un changement de modèle (le premier peut le bloquer) | Demander confirmation, puisque changer de modèle repart sans cache |
MessageDisplay | Pendant l'affichage d'une réponse de Claude | Masquer une clé API à l'écran (l'affichage seulement, pas l'historique) |
DirectoryAdded | Après un /add-dir en cours de session | Installer les dépendances du dossier ajouté |
Ce ne sont pas tous les événements : la doc officielle des hooks tient la liste complète. Un hook peut aussi appeler directement un outil MCP (type mcp_tool) au lieu d'une commande shell.
Exemple 1 : Prettier automatique après chaque Edit
Claude Code passe au hook les détails de l'action en JSON sur l'entrée standard. Pour un Edit ou un Write, le chemin absolu du fichier est dans tool_input.file_path. Ici, jq (à installer si tu ne l'as pas) l'extrait, puis Prettier formate le fichier. Le -I {} de xargs garde le chemin intact s'il contient des espaces.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs -I {} npx prettier --write {}"
}
]
}
]
}
}
Exemple 2 : charger ton index perso au lancement
Au démarrage de chaque session, le hook affiche ton fichier d'index (notes, règles projet), et Claude Code ajoute ce texte au contexte. Tu n'as plus à lui répéter le contexte.
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "cat ~/Claude\\ OS/brain/INDEX.md"
}
]
}
]
}
}
Attention au coût : tout ce que ce hook affiche entre dans le contexte de chaque session. Un index de 30 lignes, oui. Un fichier de 2 000 lignes, non. Le chapitre 19 explique pourquoi.
Où mettre la config
~/.claude/settings.json: hooks appliqués à tous tes projets.claude/settings.jsonà la racine d'un projet : hooks propres à ce projet (linter custom, règles d'équipe)
Note de sécurité : les hooks tournent avec tes permissions système
complètes. Un script qui fait rm, envoie une requête réseau ou lit des
fichiers sensibles s'exécutera sans rien te demander. Avant de copier un hook
trouvé sur GitHub ou sur un blog, lis chaque ligne. Si tu ne comprends pas ce
qu'il fait, ne le colle pas.
Question
En auto mode, le classifieur bloque un git push --force. Tu tapes « oui vas-y » dans le chat. Que se passe-t-il ?
Choisis une réponse pour voir l'explication.
À retenir
- Auto mode par défaut depuis le 14 août 2026 (Pro, Max, Team), puis sur tous les plans fin septembre. Pour lever un blocage, nomme l'action et sa cible.
autoModeetdefaultMode: "auto"ne marchent que dans~/.claude/settings.json.- Ta deny list globale tient dans tous les modes, bypass compris : écris-la une fois. Pour l'allowlist,
/fewer-permission-promptspart de tes vraies sessions. - Garde court ce qu'affiche un hook
SessionStart, il entre dans chaque session.
Quiz de fin de partie
Partie 3 : Les outils avancés
6 questions. La partie est validée à partir de 5 bonnes réponses.