Come ho smesso di temere Claude Code e ho imparato ad amare i Guard Hooks
Immagina questo: sei comodamente seduto in poltrona, sorseggiando il caffè, mentre il tuo agente AI preferito (che sia Claude Code, Cursor o GitHub Copilot CLI) allegramente riferisce di aver completato un task di refactoring. Improvvisamente, rm -rf o, ancora più divertente, sudo rm -rf / lampeggia sul terminale. Il caffè ti va di traverso, e ore di lavoro non retribuito — quelle modifiche che non hai ancora committato — evaporano nel nulla digitale.
Sensazione familiare di impotenza di fronte alle "allucinazioni" delle reti neurali? Nella mia pratica, questi momenti si sono verificati un paio di volte, e ogni volta è stata una lezione dolorosa. Ecco perché il progetto destructive_command_guard (o semplicemente dcg) ha immediatamente attirato la mia attenzione. Non è una "piattaforma rivoluzionaria", solo un cane da guardia molto veloce e coraggioso per il tuo terminale.
Cos'è questa bestia
In breve, dcg è un hook ad alte prestazioni scritto in Rust. Intercetta il processo di comunicazione tra te (o il tuo agente AI) e la riga di comando. Il suo unico compito è intercettare un comando distruttivo prima che abbia la possibilità di rompere qualcosa.
Lo strumento supporta praticamente tutto ciò che è attualmente in voga nel mondo dello sviluppo AI: Claude Code, Codex CLI, Gemini CLI, Copilot CLI, Cursor IDE, Grok e persino opzioni esotiche come Hermes Agent. L'utilità funziona su Linux, macOS e Windows (tramite WSL o nativamente tramite PowerShell).
Perché un grep normale non ti salverà
Potrebbe sembrare, perché costruire un intero progetto Rust quando puoi scrivere un semplice script Bash o Python? L'autore del progetto, Jeffrey Emanuel, ha percorso questa strada: la prima versione era in Python. Ma è rapidamente diventato chiaro che le attività moderne richiedono un approccio più sfumato.
Il contesto è tutto
dcg non si limita a cercare la stringa rm -rf. Analizza il contesto. Se un agente scrive "don't use rm -rf /" nella documentazione, l'hook capirà che si tratta di dati e non bloccherà la scrittura del file. Ma non appena si tratta di eseguire effettivamente il comando — il blocco scatta.
Per questo, viene utilizzato un sistema di verifica a tre livelli:
- Ricerca rapida di sottostringhe (Quick Reject) tramite istruzioni SIMD. Questo richiede microsecondi.
- Normalizzazione del comando (gli spazi extra vengono rimossi, i percorsi assoluti vengono sostituiti con quelli relativi).
- Verifica rispetto a pattern complessi utilizzando espressioni regolari.
Protezione contro le minacce "nascoste"
Una caratteristica interessante — la scansione di Heredocs e script inline. Se un agente decide di chiamare rm -rf, un semplice filtro da riga di comando lo lascerà passare. dcg scava all'interno di questi costrutti, li analizza usando AST (Abstract Syntax Trees) e trova chiamate di funzione sospette.
Cosa blocca esattamente
Out of the box, anche se non hai configurato nulla, dcg protegge contro le cose più spaventose:
rm -rf,sudo rm -rf /,dd if=/dev/zero.git push --forceal di fuori delle cartelle temporanee.- Formattazione del disco, eliminazione di partizioni e altri piaceri di sistema.
Ma la parte migliore sono i "pack" (pacchetti di sicurezza). Ce ne sono più di 50 nel repository. Puoi attivare la protezione per tecnologie specifiche nel tuo dcg.toml:
[packs]
enabled = [
"database.postgresql", # Заблокирует DROP TABLE
"kubernetes.kubectl", # Не даст удалить namespace по ошибке
"cloud.aws", # Спасет от случайного terminate-instances
"containers.docker", # Ограничит docker system prune
]
Come funziona nella pratica
Diciamo che il tuo agente ha deciso di perdere il controllo e resettare tutte le modifiche. Vedrai qualcosa di simile nel terminale:
════════════════════════════════════════════════════════════════
BLOCKED dcg
────────────────────────────────────────────────────────────────
Reason: git reset --hard destroys uncommitted changes
Command: git reset --hard HEAD~5
Tip: Consider using 'git stash' first to save your changes.
════════════════════════════════════════════════════════════════
Il blocco arriva con consigli utili. Nella maggior parte dei casi, l'agente, dopo aver ricevuto un tale rifiuto, capisce l'errore e suggerisce un percorso più sicuro, ad esempio usando git stash.
Budella tecniche e prestazioni
Ciò che mi ha conquistato è stato l'approccio alle prestazioni. L'autore dichiara una latenza sub-millisecondo. Per chi ama i dettagli:
- Rust + SIMD: vengono utilizzate istruzioni vettoriali del processore per una ricerca rapidissima di parole chiave.
- Dual Regex Engine: i pattern semplici vengono gestiti da un motore veloce con tempo di esecuzione lineare, mentre quelli complessi (dove servono lookahead/lookbehind) vengono elaborati da un
regexpiù potente ma più lento. - Zero-allocazione: nei percorsi critici, il programma cerca di non allocare memoria heap, cosa critica quando l'hook viene chiamato a ogni pressione di tasto o comando dell'agente.
A proposito, il progetto implementa una filosofia fail-open. Se dcg non riesce ad analizzare il comando entro il budget di tempo allocato (200ms di default), lo lascia passare. Questo viene fatto affinché lo strumento non diventi mai un "freno" che ostacola il lavoro normale. Secondo me, un compromesso ragionevole tra sicurezza e praticità.
Come integrare nel tuo flusso di lavoro
Il modo più semplice per provarlo è eseguire lo script di installazione dalla README. Determinerà il tuo OS, scaricherà il binario giusto e configurerà le impostazioni nelle configurazioni degli agenti AI.
Per Claude Code, sembra l'aggiunta di una sezione a claude_desktop_config.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{ "type": "command", "command": "dcg" }]
}
]
}
}
E se lavori in un team e vuoi assicurarti che nessuno abbia committato un git push --force distruttivo o una pipeline CI rotta, c'è una modalità scan:
dcg scan --staged
Puoi agganciarlo a un pre-commit hook, e controllerà tutti i file che stai cercando di pushare su Git.
Alcune parole sui lati negativi
Non esistono strumenti perfetti. Cosa può andare storto?
- Falsi positivi: Nonostante l'analisi avanzata, a volte
dcgpuò bloccare comandi perfettamente legittimi. Per questo caso, c'è un'"uscita di emergenza" tramite la variabile d'ambienteDCG_BYPASSo il sistemaDCG_UNLOCK_CODE. - Complessità di configurazione: Se hai bisogno di qualcosa di specifico, dovrai approfondire le configurazioni TOML.
- Rust Nightly: Se vuoi compilare il progetto da sorgente, avrai bisogno della versione nightly di Rust, poiché vengono utilizzate funzionalità della edition 2024.
A chi serve
Se usi agenti AI più di una volta a settimana e ti fidi che eseguano comandi nel terminale — installalo senza esitazione. È un'assicurazione economica. Questo è particolarmente rilevante per i principianti che potrebbero non notare immediatamente che il comando di "pulizia cache" suggerito dalla rete neurale in realtà cancella metà del sistema.
Per gli sviluppatori esperti, è più un modo per risparmiare nervi. Tutti sappiamo quanto sia facile premere Ctrl+C in autopilot, e poi cercare freneticamente quando è stato l'ultimo backup.
dcg è quello strumento che gira silenziosamente in background e "non chiede cibo" finché non arriva un momento critico. Non fa magia, si limita ad analizzare bene le stringhe e sa come sono fatti i comandi cattivi. In un mondo in cui deleghiamo sempre più la scrittura e l'esecuzione del codice alle macchine, questi "fusibili digitali" stanno diventando un attributo obbligatorio dell'ambiente di lavoro.
Vale la pena provarlo almeno per vedere quanto è veloce il software Rust moderno. E tu hai mai permesso al tuo AI di eliminare file? Com'è andata a finire?
Progetti correlati