Nel setup degli agenti AI è fondamentale definire quali azioni possono eseguire in autonomia. Claude Code permette di configurare questi permessi attraverso il file .claude/settings.json, dove possiamo specificare cosa l’agente può e non può fare.

Struttura di Esempio

Per comprendere meglio la configurazione dei permessi, ecco un esempio di come potrebbe essere organizzata la cartella git di un utente con diversi progetti:

/home/utente/git/
├── progetto_01/                  # Sito web in Flask (PROGETTO CORRENTE)
│   ├── app.py
│   ├── requirements.txt
│   ├── templates/
│   │   └── index.html
│   ├── static/
│   │   ├── css/
│   │   └── js/
│   └── .claude/
│       └── settings.json
├── progetto_02/                  # Sito statico HTML/CSS
│   ├── index.html
│   ├── about.html
│   ├── css/
│   │   └── style.css
│   └── images/
└── progetto_03/                  # API REST in Node.js
    ├── package.json
    ├── server.js
    ├── routes/
    │   └── api.js
    └── models/
        └── user.js

In questo scenario, stiamo lavorando su progetto_01 (il sito Flask). La configurazione dei permessi permetterà a Claude di:

  • Leggere tutti e tre i progetti (utile per prendere spunto)
  • Modificare solo progetto_01 (il progetto corrente)
  • Non toccare progetto_02 e progetto_03 (protetti nel DENY)

Permessi ALLOW

Nella sezione allow possiamo definire i comandi che Claude può eseguire autonomamente senza chiedere conferma. In base alle nostre esigenze di sviluppo, possiamo autorizzare operazioni come navigazione nel filesystem, comandi git, esecuzione di script Python, gestione Docker e altro ancora. La scelta dipende dal livello di libertà che vogliamo concedere all’agente.

Permessi DENY

Allo stesso tempo è necessario definire quali operazioni Claude NON deve eseguire. Ad esempio, se sul nostro PC abbiamo una cartella con diversi progetti, per sicurezza possiamo impedire a Claude di modificare file al di fuori del progetto corrente. Questo previene modifiche accidentali alla documentazione o alle variabili di altri progetti.

Nella sezione deny possiamo bloccare operazioni pericolose come la cancellazione di cartelle importanti o modifiche a progetti esterni. Possiamo comunque permettere la lettura di altri progetti: questo è utile quando vogliamo replicare una funzione o un documento da un altro progetto, senza doverlo riscrivere da zero.

json
{
  "permissions": {
    "allow": [
      # Comandi di base per navigazione e analisi
      "Bash(ls:*)",
      "Bash(grep:*)",
      "Bash(find:*)",
      "Bash(date:*)",
      "Bash(tail:*)",
      "Bash(wc:*)",
      "Bash(diff:*)",
      # Operazioni limitate al progetto corrente
      "Bash(mkdir:/home/utente/git/progetto_01/*)",
      "Bash(mv:/home/utente/git/progetto_01/*)",
      "Bash(rm:/home/utente/git/progetto_01/*)",
      "Bash(cp:/home/utente/git/progetto_01/*)",
      "Bash(touch:/home/utente/git/progetto_01/*)",
      "Bash(echo * >> /home/utente/git/progetto_01/*)",
      # Gestione di GIT
      "Bash(git rev-parse:*)",
      "Bash(git status:*)",
      "Bash(git log:*)",
      "Bash(git diff:*)",
      "Bash(git add:*)",
      "Bash(git commit:*)",
      # Ambiente di sviluppo
      "Bash(nix-shell:*)",
      "Bash(python:*)",
      "Bash(python3:*)",
      "Bash(docker:*)",
      "Bash(docker-compose:*)",
      "Bash(make:*)",
      "Bash(pip:*)",
      "Bash(pip3:*)",
      "Bash(uvicorn:*)",
      "Bash(flask:*)",
      "Bash(pytest:*)",
      "Bash(psql:*)",
      "Bash(curl:*)"
    ],
    "deny": [
      # Da usare in caso di NixOS in modo che non faccia un rebuild
      "Bash(nixos-rebuild:*)",
      # Assicura che il sistema ed i folder siano preservati
      "Bash(rm -rf /*)",
      "Bash(rm /home/utente/Documents/*)",
      "Bash(rm /home/utente/Downloads/*)",
      "Bash(rm /home/utente/Pictures/*)",
      "Bash(rm /home/utente/Music/*)",
      "Bash(rm /home/utente/Videos/*)",
      "Bash(rm /home/utente/.config/*)",
      "Bash(rm -r /home/utente/Documents/*)",
      "Bash(rm -r /home/utente/Downloads/*)",
      "Bash(rm -rf /home/utente/Documents/*)",
      "Bash(rm -rf /home/utente/Downloads/*)",
      "Bash(mv /home/utente/Documents/*)",
      "Bash(mv /home/utente/Downloads/*)",
      # Assicura la Protezione di "PROGETTO_02"
      "Bash(rm /home/utente/git/progetto_02/*)",
      "Bash(rm -r /home/utente/git/progetto_02/*)",
      "Bash(rm -rf /home/utente/git/progetto_02/*)",
      "Bash(mv /home/utente/git/progetto_02/*)",
      "Bash(mkdir /home/utente/git/progetto_02/*)",
      "Bash(touch /home/utente/git/progetto_02/*)",
      "Bash(cp /home/utente/git/progetto_02/*)",
      "Bash(ln /home/utente/git/progetto_02/*)",
      "Bash(chmod /home/utente/git/progetto_02/*)",
      # Assicura la Protezione di "PROGETTO_03"
      "Bash(rm /home/utente/git/progetto_03/*)",
      "Bash(rm -r /home/utente/git/progetto_03/*)",
      "Bash(rm -rf /home/utente/git/progetto_03/*)",
      "Bash(mv /home/utente/git/progetto_03/*)",
      "Bash(mkdir /home/utente/git/progetto_03/*)",
      "Bash(touch /home/utente/git/progetto_03/*)",
      "Bash(cp /home/utente/git/progetto_03/*)",
      "Bash(ln /home/utente/git/progetto_03/*)",
      "Bash(chmod /home/utente/git/progetto_03/*)",
    ]
  }
}