
Après la série débutant, vos sessions sont cadrées mais chaque projet redemande les mêmes autorisations. Ce guide pose une configuration durable via settings.json : vous verrouillez les permissions sensibles, pré-autorisez les commandes répétitives et partagez un socle commun avec votre équipe. Tout est appliqué sur lab-claude et vérifié avec /status.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Les 4 scopes de configuration et leur ordre de priorité
- La structure d’un
settings.jsonde projet avec$schema - La syntaxe des règles
allow,denyetask - La différence entre
settings.json(partagé via git) etsettings.local.json(personnel, ignoré) - Vérifier la configuration active avec
/status
Prérequis
Section intitulée « Prérequis »Claude Code CLIinstallé et fonctionnel- Projet fil rouge prêt :
~/Projets/lab-claude - Conventions posées dans
CLAUDE.md(voir configurer CLAUDE.md) - À l’aise avec les modes d’exécution (voir mode plan, diff et validations)
Les 4 scopes de configuration
Section intitulée « Les 4 scopes de configuration »Claude Code lit la configuration depuis 4 emplacements, du plus spécifique au plus général :
| Scope | Fichier | Usage | Suivi git |
|---|---|---|---|
| Managed | managed-settings.json (système) | Politique d’entreprise imposée | N/A |
| Local | .claude/settings.local.json | Préférences personnelles du projet | Ignoré |
| Project | .claude/settings.json | Règles partagées de l’équipe | Suivi |
| User | ~/.claude/settings.json | Préférences globales utilisateur | N/A |
Ordre de priorité : Managed > Local > Project > User. Les tableaux (allow, deny, ask) sont fusionnés entre scopes, pas écrasés.
La structure de base d’un settings.json
Section intitulée « La structure de base d’un settings.json »Commencez toujours avec $schema pour activer l’autocomplétion et la validation dans votre éditeur.
{ "$schema": "https://json.schemastore.org/claude-code-settings.json", "permissions": { "allow": [], "deny": [], "ask": [] }, "env": {}, "includeCoAuthoredBy": false, "cleanupPeriodDays": 30}Les clés les plus utiles au quotidien :
| Clé | Effet |
|---|---|
permissions.allow | Commandes pré-autorisées, pas de prompt |
permissions.deny | Commandes toujours refusées, non contournables |
permissions.ask | Commandes qui demandent confirmation à chaque fois |
env | Variables d’environnement injectées dans chaque session |
includeCoAuthoredBy | Active ou coupe l’attribution Co-Authored-By: Claude |
cleanupPeriodDays | Rétention des transcriptions de conversation |
defaultMode | Mode de permission par défaut (default, acceptEdits, plan) |
Syntaxe des règles de permissions
Section intitulée « Syntaxe des règles de permissions »Les règles utilisent une syntaxe simple Outil(motif) :
Bash(uv run ruff check *) -> commande shell préfixée par uv run ruff checkBash(git status) -> commande exacte, sans argumentRead(./.env) -> lecture d'un fichier précisRead(./secrets/**) -> lecture récursive d'un dossierEdit(src/**) -> édition d'un chemin via motifWebFetch(domain:github.com) -> accès réseau restreint à un domaineRègles importantes :
- Un
*à la fin couvre tout suffixe (Bash(uv run *)autorise toutes les sous-commandesuv run) - Les motifs
denyont priorité surallowau sein d’un même scope denyau niveau Managed ne peut jamais être contourné
Application sur lab-claude
Section intitulée « Application sur lab-claude »-
Placez-vous dans le projet
Fenêtre de terminal cd ~/Projets/lab-claude -
Créez
.claude/settings.jsonpartagé{"$schema": "https://json.schemastore.org/claude-code-settings.json","permissions": {"allow": ["Bash(uv run ruff check *)","Bash(uv run ruff format *)","Bash(uv run pytest *)","Bash(uv add *)","Bash(uv sync *)","Bash(git status)","Bash(git diff *)","Bash(git log *)"],"deny": ["Bash(rm -rf *)","Bash(curl *)","Bash(wget *)","Read(./.env)","Read(./.env.*)","Read(./secrets/**)"],"ask": ["Bash(git push *)","Bash(git commit *)"]},"env": {"PYTHONDONTWRITEBYTECODE": "1"},"includeCoAuthoredBy": false,"cleanupPeriodDays": 30} -
Validez la syntaxe JSON
Fenêtre de terminal python3 -c "import json; json.load(open('.claude/settings.json'))" && echo "JSON valide" -
Démarrez une session et vérifiez
Fenêtre de terminal claudePuis dans la session :
/status -
Confirmez que
.claude/settings.local.jsonest bien ignoréFenêtre de terminal git check-ignore .claude/settings.local.json
settings.json vs settings.local.json
Section intitulée « settings.json vs settings.local.json »Deux fichiers, deux usages distincts :
| Fichier | Contenu recommandé |
|---|---|
.claude/settings.json | Règles stables, pertinentes pour toute l’équipe (allow de uv run, deny des secrets) |
.claude/settings.local.json | Préférences personnelles temporaires (modèle préféré, allow spécifique à votre machine) |
Règle simple : si un autre développeur rejoue votre configuration sans souci, c’est du settings.json. Si ça dépend de votre machine ou de votre compte, c’est du settings.local.json.
Vérifier la configuration active
Section intitulée « Vérifier la configuration active »La commande /status affiche d’où vient chaque valeur (Managed, Local, Project, User). C’est le réflexe à avoir quand une permission semble bloquée ou accordée sans raison apparente.
Dans une session Claude :
/statusVous y trouvez :
- Les scopes chargés et leur chemin sur disque
- Les règles
allow,deny,askrésultantes après fusion - Le mode de permission actif
Exemple commenté pour lab-claude
Section intitulée « Exemple commenté pour lab-claude »Pourquoi ces règles dans le settings.json partagé :
Bash(uv run ruff check *)etBash(uv run pytest *): validations répétées à chaque cycle, aucune raison de prompterBash(git status),Bash(git diff *),Bash(git log *): lecture seule, sans risqueBash(git push *)etBash(git commit *)dansask: action visible côté équipe, confirmation souhaitableRead(./.env)etRead(./secrets/**)endeny: protection systématique des secretsBash(rm -rf *),Bash(curl *),Bash(wget *)endeny: opérations destructives ou exfiltration réseauincludeCoAuthoredBy: false: l’attribution par défaut peut gêner dans certains workflows de revue
Erreurs fréquentes
Section intitulée « Erreurs fréquentes »| Symptôme | Cause probable | Correction |
|---|---|---|
Claude redemande une autorisation pourtant dans allow | Motif trop restrictif ou syntaxe incorrecte | Ajouter * en suffixe ou vérifier la casse exacte |
deny non respecté | Règle placée dans le mauvais scope | Vérifier avec /status d’où vient la règle |
| Éditeur ne complète pas le JSON | $schema absent ou incorrect | Ajouter la ligne $schema en tête du fichier |
settings.local.json apparaît dans git status | Projet créé avant le fichier | Ajouter .claude/settings.local.json au .gitignore manuellement |
| Permissions perso poussées sur le dépôt | Règle mise dans settings.json au lieu de .local.json | Déplacer la règle vers le fichier local |
Checklist de fin de guide
Section intitulée « Checklist de fin de guide »- J’ai identifié les 4 scopes et leur ordre de priorité
- J’ai créé
.claude/settings.jsonavec$schemaen tête - J’ai au moins une entrée dans
allow,denyetask - J’ai validé la syntaxe JSON du fichier
- J’ai vérifié la configuration active avec
/status - Je sais où mettre une règle perso (
settings.local.json) vs équipe (settings.json) -
.claude/settings.local.jsonest bien ignoré par git
À retenir
Section intitulée « À retenir »- Le
settings.jsontransforme les garde-fous en contrat durable du projet denyprotège,allowaccélère,askgarde la main sur les actions visiblessettings.jsonse partage,settings.local.jsonreste local/statusest le seul juge de ce qui est vraiment actif- Plus les règles sont explicites, moins vous interrompez les sessions