Claude Code : arrêter les demandes d’autorisation
Dire à Claude « autorise tout » dans la conversation ne sert à rien : les permissions sont appliquées par Claude Code, pas par le modèle. Il faut passer par la configuration.
Les modes de permission
| Mode | Ce qui passe sans demander |
|---|---|
default (Manual) |
Lectures uniquement |
acceptEdits |
Lectures, modifs de fichiers, mkdir, mv, cp… |
plan |
Lectures (Claude ne modifie rien) |
auto |
Tout, avec un contrôleur de sécurité en arrière-plan |
bypassPermissions |
Tout (à réserver aux conteneurs / VM) |
-
Changer de mode pendant une session :
- Terminal :
Shift+Tab(le mode s’affiche en bas) - VS Code : cliquer sur l’indicateur de mode sous la zone de saisie
- App desktop (onglet Code) : sélecteur à côté du bouton d’envoi
- Terminal :
-
Mode par défaut pour toutes les sessions, dans
~/.claude/settings.json(pas dans le.claudedu projet,autoetbypassPermissionsn’y sont pas pris en compte) :
{
"permissions": {
"defaultMode": "auto"
}
}
- Lancer en mode bypass en reprenant la conversation en cours :
claude --dangerously-skip-permissions --continue
Règles allow / ask / deny
- Gérer les règles en direct (effet immédiat) :
/permissions
- Exemple dans
settings.json:
{
"permissions": {
"allow": ["Bash(npm run *)", "Bash(git commit *)"],
"deny": ["Bash(git push *)"]
}
}
- Une règle
Askforce une demande même en mode bypass : vérifier qu’il n’y en a pas. - En mode auto, les règles larges comme
BashouBash(*)sont volontairement ignorées.
Pourquoi ça demande encore malgré tout
cdvers un dossier hors du workspace → ajouter le dossier :
/add-dir ~/projets/autre-dossier
cdsuivi degit→ demande volontaire (git peut lancer les hooks du dossier).- Réglage
blockReadsOutsideWorkingDirectoriesactivé : fait demander même en bypass. Supprimer cette ligne de~/.claude/settings.json:
"blockReadsOutsideWorkingDirectories": true
- Dossiers/fichiers protégés (
.git,.claude,.vscode,.bashrc,.zshrc…) : toujours une confirmation, sauf en bypass. - Suppression de dossiers critiques (
/,~, dossier de travail) : demande dans tous les modes. - Bugs connus : vérifications codées en dur sur les commandes composées avec
cd, bypass qui ne fonctionne pas toujours. Voir les issues GitHub #48762, #48225, #42366, #28183.
Onglet « Auto mode » de /permissions
- Hard deny : interdit absolu → ne pas toucher
- Soft deny : bloqué par défaut, débloquable → ne pas toucher
- Soft allow : exceptions pour des actions routinières bloquées
- Environment : ce que le contrôleur considère comme « chez toi » (dépôts, domaines, buckets), écrit en langage naturel :
Source control: github.com/mon-compte et tous ses dépôts
Trusted internal domains: monsite.com, api.monsite.com
- Toujours garder
"$defaults"dans chaque liste si on édite le fichier à la main. - Générer automatiquement les entrées Environment :
/auto-mode-setup
- Voir ce qui a été bloqué :
/permissions→ onglet Recently denied (rpour relancer).
Empêcher Claude de poser des questions
- Retirer l’outil de questions à choix multiples :
/permissions→ onglet Deny → ajouter :
AskUserQuestion
- Consigne permanente dans
~/.claude/CLAUDE.md:
Ne me pose jamais de questions. Quand quelque chose est ambigu,
choisis l'option la plus raisonnable, fais-le, et indique à la fin
ce que tu as décidé. N'utilise jamais cd, tu es déjà dans le bon dossier.
La solution radicale : hook PermissionRequest
Répond automatiquement « oui » à chaque demande d’autorisation, y compris celles codées en dur. À mettre dans ~/.claude/settings.json :
{
"hooks": {
"PermissionRequest": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PermissionRequest\",\"decision\":{\"behavior\":\"allow\"}}}'"
}
]
}
]
}
}
"matcher": "Bash"pour ne l’appliquer qu’aux commandes shell.- Vérifier que le hook est chargé :
/hooks
-
Attention : plus aucune vérification : faire des commits git réguliers.
-
Prompt pour que Claude l’installe lui-même :
Ajoute un hook PermissionRequest dans mon fichier ~/.claude/settings.json
pour que toutes les demandes d'autorisation soient acceptées automatiquement.
Lis d'abord le fichier, ne supprime rien, fusionne proprement avec la clé
"hooks" existante, utilise "matcher": "*", puis montre-moi le fichier final.