Aller au contenu
Développement medium

Claude Code CLI : settings.json avancé et permissions par projet

9 min de lecture

Logo Claude Code - settings.json avancé et permissions par projet

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.

  • Les 4 scopes de configuration et leur ordre de priorité
  • La structure d’un settings.json de projet avec $schema
  • La syntaxe des règles allow, deny et ask
  • La différence entre settings.json (partagé via git) et settings.local.json (personnel, ignoré)
  • Vérifier la configuration active avec /status

Claude Code lit la configuration depuis 4 emplacements, du plus spécifique au plus général :

ScopeFichierUsageSuivi git
Managedmanaged-settings.json (système)Politique d’entreprise imposéeN/A
Local.claude/settings.local.jsonPréférences personnelles du projetIgnoré
Project.claude/settings.jsonRègles partagées de l’équipeSuivi
User~/.claude/settings.jsonPréférences globales utilisateurN/A

Ordre de priorité : Managed > Local > Project > User. Les tableaux (allow, deny, ask) sont fusionnés entre scopes, pas écrasés.

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.allowCommandes pré-autorisées, pas de prompt
permissions.denyCommandes toujours refusées, non contournables
permissions.askCommandes qui demandent confirmation à chaque fois
envVariables d’environnement injectées dans chaque session
includeCoAuthoredByActive ou coupe l’attribution Co-Authored-By: Claude
cleanupPeriodDaysRétention des transcriptions de conversation
defaultModeMode de permission par défaut (default, acceptEdits, plan)

Les règles utilisent une syntaxe simple Outil(motif) :

Bash(uv run ruff check *) -> commande shell préfixée par uv run ruff check
Bash(git status) -> commande exacte, sans argument
Read(./.env) -> lecture d'un fichier précis
Read(./secrets/**) -> lecture récursive d'un dossier
Edit(src/**) -> édition d'un chemin via motif
WebFetch(domain:github.com) -> accès réseau restreint à un domaine

Règles importantes :

  • Un * à la fin couvre tout suffixe (Bash(uv run *) autorise toutes les sous-commandes uv run)
  • Les motifs deny ont priorité sur allow au sein d’un même scope
  • deny au niveau Managed ne peut jamais être contourné
  1. Placez-vous dans le projet

    Fenêtre de terminal
    cd ~/Projets/lab-claude
  2. Créez .claude/settings.json partagé

    {
    "$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
    }
  3. Validez la syntaxe JSON

    Fenêtre de terminal
    python3 -c "import json; json.load(open('.claude/settings.json'))" && echo "JSON valide"
  4. Démarrez une session et vérifiez

    Fenêtre de terminal
    claude

    Puis dans la session :

    /status
  5. Confirmez que .claude/settings.local.json est bien ignoré

    Fenêtre de terminal
    git check-ignore .claude/settings.local.json

Deux fichiers, deux usages distincts :

FichierContenu recommandé
.claude/settings.jsonRègles stables, pertinentes pour toute l’équipe (allow de uv run, deny des secrets)
.claude/settings.local.jsonPré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.

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 :

/status

Vous y trouvez :

  • Les scopes chargés et leur chemin sur disque
  • Les règles allow, deny, ask résultantes après fusion
  • Le mode de permission actif

Pourquoi ces règles dans le settings.json partagé :

  • Bash(uv run ruff check *) et Bash(uv run pytest *) : validations répétées à chaque cycle, aucune raison de prompter
  • Bash(git status), Bash(git diff *), Bash(git log *) : lecture seule, sans risque
  • Bash(git push *) et Bash(git commit *) dans ask : action visible côté équipe, confirmation souhaitable
  • Read(./.env) et Read(./secrets/**) en deny : protection systématique des secrets
  • Bash(rm -rf *), Bash(curl *), Bash(wget *) en deny : opérations destructives ou exfiltration réseau
  • includeCoAuthoredBy: false : l’attribution par défaut peut gêner dans certains workflows de revue
SymptômeCause probableCorrection
Claude redemande une autorisation pourtant dans allowMotif trop restrictif ou syntaxe incorrecteAjouter * en suffixe ou vérifier la casse exacte
deny non respectéRègle placée dans le mauvais scopeVérifier avec /status d’où vient la règle
Éditeur ne complète pas le JSON$schema absent ou incorrectAjouter la ligne $schema en tête du fichier
settings.local.json apparaît dans git statusProjet créé avant le fichierAjouter .claude/settings.local.json au .gitignore manuellement
Permissions perso poussées sur le dépôtRègle mise dans settings.json au lieu de .local.jsonDéplacer la règle vers le fichier local
  • J’ai identifié les 4 scopes et leur ordre de priorité
  • J’ai créé .claude/settings.json avec $schema en tête
  • J’ai au moins une entrée dans allow, deny et ask
  • 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.json est bien ignoré par git
  • Le settings.json transforme les garde-fous en contrat durable du projet
  • deny protège, allow accélère, ask garde la main sur les actions visibles
  • settings.json se partage, settings.local.json reste local
  • /status est le seul juge de ce qui est vraiment actif
  • Plus les règles sont explicites, moins vous interrompez les sessions

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn