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:*) -> préfixe "uv run ruff check" + n'importe quels arguments
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 :

  • La forme canonique pour « préfixe + arguments libres » est Bash(prefix:*) avec deux-points (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 incorrecteUtiliser la forme Bash(prefix:*) avec deux-points, pas Bash(prefix *)
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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn