Sari la conținutul principal

Claude Code Hooks: Un ghid practic pentru automatizarea fluxurilor de lucru

Află cum funcționează automatizarea bazată pe hook-uri și începe să folosești hook-urile Claude Code pentru a automatiza sarcini de programare precum testarea, formatarea și primirea notificărilor.
Actualizat 22 iul. 2026  · 15 min. citire

Explorează cu AI

Deschide în ChatGPTDeschide în ClaudeDeschide în Perplexity

Când lucrezi cu Claude Code, vei observa o problemă comună: scrie cod bun, dar uită pași importanți precum formatarea, rularea testelor sau respectarea protocoalelor de securitate. Ajungi să repeți aceleași memento-uri mereu. Claude Code Hooks îți permit să automatizezi aceste memento-uri rulând comenzi shell automat în puncte specifice ale fluxului tău de lucru.

În acest tutorial, îți arăt cum să configurezi hook-uri pentru formatarea codului, rularea testelor, notificări și protecția fișierelor. Vei construi un sistem de automatizare care impune standardele tale de dezvoltare fără intervenție manuală.

Pentru mai multe despre Claude Code, consultă ghidul nostru de bune practici Claude Code și tutorialul nostru Claude Skills. Dacă vrei să înveți cum să configurezi instrucțiuni la nivel de proiect, vezi ghidul nostru despre scrierea unui CLAUDE.md.

Pe scurt

  • Claude Code Hooks sunt comenzi shell care rulează automat în puncte specifice din ciclul de viață al lui Claude Code (înainte/după apelurile uneltelor, la pornirea sesiunii, când Claude se oprește)

  • Configurează-le în .claude/settings.json (proiect) sau ~/.claude/settings.json (global) folosind JSON cu evenimente, matchere și comenzi

  • Folosește hook-urile PreToolUse pentru a bloca operațiuni periculoase înainte să se întâmple (cod de ieșire 2 = blocare)

  • Folosește hook-urile PostToolUse pentru sarcini de curățare precum formatarea, linting-ul sau rularea testelor după ce Claude scrie cod

  • Hook-urile primesc context JSON pe stdin și comunică rezultate prin coduri de ieșire, stdout și stderr

Ce sunt Claude Code Hooks?

Claude Code Hooks sunt comenzi shell care rulează automat când au loc evenimente specifice în timpul sesiunii tale de programare cu AI. Gândește-te la ele ca la declanșatoare automate care execută scripturile tale personalizate în momente preciseînainte ca Claude să scrie un fișier, după ce rulează o comandă sau când îți trimite o notificare.

Sistemul funcționează monitorizând acțiunile lui Claude Code și comparându-le cu reguli pe care le definești într-un fișier de configurare. Când apare o potrivire, comanda specificată de tine rulează cu acces la context despre ce tocmai s-a întâmplat. Asta îți oferă control asupra comportamentului lui Claude și îți permite să automatizezi sarcini repetitive care altfel ar necesita intervenție manuală.

Iată un hook de bază care rulează un formatter de cod de fiecare dată când Claude scrie un fișier Python:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "python -m black ."
          }
        ]
      }
    ]
  }
}

Acest hook are trei părți: 

  • Evenimentul: PostToolUse (după ce Claude termină o acțiune)

  • Matcher-ul: Write (doar când scrie fișiere)

  • Comanda: python -m black . (formatează fișierele Python din directorul curent)

Hook-ul primește informații detaliate despre ce a făcut Claude prin date JSON trimise la intrarea scriptului, astfel încât poți construi o automatizare mai sofisticată care răspunde la modificări specifice ale fișierelor.

Dacă vrei să mergi mai departe cu automatizarea în Claude Code, tutorialul nostru Claude Code Routines îți arată cum să programezi hook-uri și agenți să ruleze recurent în cloud.

Hai să vedem cum creezi hook-uri de la zero și le înregistrezi în Claude Code.

Cerințe preliminare

Ai nevoie de câteva lucruri înainte să începi:

  • Claude Code instalat și pornit: Ar trebui să te simți confortabil să folosești Claude Code pentru sarcini de programare de bază

  • Familiaritate cu linia de comandă: Hook-urile rulează comenzi shell, deci trebuie să știi să scrii comenzi terminal de bază pentru sistemul tău de operare

  • Acces la un editor de text: Vei edita fișiere de configurare JSON pentru a-ți seta hook-urile

  • Director de proiect: Un proiect de cod în care poți testa în siguranță hook-uri fără să afectezi lucru important

Nu trebuie să fii expert în scripting shell, dar înțelegerea rulării unor comenzi precum ls, cd și a operațiunilor de bază pe fișiere te va ajuta să urmezi exemplele. Dacă ești la început cu bash sau terminalul, îți recomandăm cursul nostru Introduction to Shell.

Primele tale hook-uri în Claude Code

Acum că știi ce sunt hook-urile, să configurăm prima ta automatizare. Procesul presupune alegerea evenimentului potrivit pentru nevoile tale, configurarea unei reguli simple și testarea ei cu o comandă de bază.

Înțelegerea evenimentelor hook

Claude Code expune peste 25 de evenimente hook. Tabelul de mai jos acoperă cele 10 pe care le vei folosi cel mai des. Pentru lista completă, vezi documentația oficială a hook-urilor.

PreToolUse și PostToolUse sunt cele mai comune evenimente. PreToolUse rulează înainte ca Claude să efectueze o acțiune precum scrierea unui fișier sau rularea unei comenzi, ceea ce îl face perfect pentru validare sau blocarea operațiunilor periculoase. PostToolUse rulează după ce Claude finalizează o acțiune, fiind potrivit pentru sarcini de curățare precum formatarea codului sau rularea testelor.

UserPromptSubmit se declanșează când trimiți un prompt lui Claude, înainte ca acesta să îți proceseze cererea. Îl poți folosi pentru a adăuga context conversației sau pentru a valida că prompturile respectă anumite cerințe.

Notification rulează când Claude îți trimite alerte, precum solicitări de permisiuni pentru a rula o comandă sau când are nevoie de inputul tău. PermissionRequest se declanșează când Claude Code afișează un dialog de permisiune, permițându-ți să aprobi sau să respingi automat solicitarea în numele utilizatorului.

Stop și SubagentStop se declanșează când Claude termină de răspuns, fiind utile pentru verificări finale sau generarea de rapoarte. Diferența este că Stop pornește când Claude își încheie răspunsul general, în timp ce SubagentStop o face când un ajutor pornit de o unealtă („subagent”) își termină treaba.

Evenimentele rămase, PreCompact, SessionStart și SessionEnd, gestionează situații specifice ciclului de viață. PreCompact rulează chiar înainte ca Claude să scurteze istoricul conversației. „SessionStart” pornește la începutul unei noi sesiuni pentru a seta valorile implicite, iar SessionEnd se declanșează la închiderea sesiunii, permițând curățarea sau raportarea finală.

Numele evenimentului

Momentul declanșării

Cazuri principale de utilizare

PreToolUse

Înainte ca Claude să efectueze o acțiune (de ex., scrierea unui fișier, rularea unei comenzi).

Validarea acțiunilor sau blocarea operațiunilor periculoase.

PostToolUse

După ce Claude finalizează o acțiune.

Sarcini de curățare, formatarea codului sau rularea testelor.

UserPromptSubmit

Când trimiți un prompt, înainte de începerea procesării.

Adăugarea de context conversației sau validarea cerințelor promptului.

Notification

Când Claude trimite alerte (de ex., cere input sau permisiune).

Gestionarea alertelor de sistem și a solicitărilor de atenție ale utilizatorului.

PermissionRequest

Când este afișat un dialog de permisiune.

Aprobarea sau respingerea automată a cererilor în numele utilizatorului.

Stop

Când Claude își încheie răspunsul general.

Verificări finale sau generarea de rapoarte pentru răspunsul principal.

SubagentStop

Când un ajutor lansat de o unealtă ("subagent") își termină treaba.

Verificări finale specifice activităților subagentului.

PreCompact

Chiar înainte ca istoricul conversației să fie scurtat.

Gestionarea curățării conversației și păstrarea contextului.

SessionStart

La începutul unei noi sesiuni.

Inițializare și setarea valorilor implicite.

SessionEnd

Când sesiunea se închide.

Curățare finală sau raportare de sfârșit de sesiune.

Înțelegerea matcher-elor

Matcher-ele sunt filtrele care decid ce acțiuni ale lui Claude Code declanșează un hook. Tehnic, sunt șiruri interpretate ca expresii regulate, deci poți folosi potriviri exacte sau modele mai flexibile. 

Cele mai relevante matchere sunt unele simple precum Write (se declanșează când Claude scrie un fișier) sau Edit (se declanșează la editare), și combinații precum Edit|Write pentru a acoperi mai multe acțiuni. 

Poți folosi și prefixe precum Notebook.* pentru a potrivi toate uneltele care încep cu „Notebook.” Dacă vrei ca hook-ul să se declanșeze la fiecare acțiune, folosește regex-ul universal .*, un șir gol ("") sau lasă matcher necompletat.

Deoarece matcherele fac diferența între majuscule și minuscule și acționează doar asupra numelor acțiunilor, e bine să le păstrezi cât mai specifice. Când ai nevoie de control mai fin (de exemplu, limitarea hook-ului la anumite tipuri de fișiere) poți citi payload-ul JSON pe care Claude îl transmite hook-ului și să aplici acolo propriile tale regex-uri sau condiții.

Crearea primului tău hook în Claude Code

Claude Code oferă două moduri de a configura hook-uri: prin comanda interactivă /hooks sau editând direct fișierele de configurare. Să începem cu abordarea interactivă, fiind mai prietenoasă pentru începători.

Folosind comanda /hooks:

  1. Deschide Claude Code și tastează /hooks în interfața de chat

  2. Alege evenimentul declanșator (selectează PostToolUse pentru acest exemplu)

  3. Selectează „Add new hook” din meniu

  4. Setează modelul matcher-ului (introdu Write pentru a viza scrierea de fișiere)

  5. Introdu comanda ta:

    • Mac: say "Task complete"

    • Windows: powershell -c [console]::beep()

    • Linux: spd-say "Task complete"

  6. Salvează configurația și revino la Claude Code apăsând Esc de trei ori

Comanda /hooks va actualiza automat fișierul de setări și va reîncărca configurația. O poți folosi oricând pentru a-ți vedea hook-urile existente sau pentru a face modificări.

Dacă preferi să editezi direct fișierele de configurare, hook-urile se află în ~/.claude/settings.json pentru setări globale, .claude/settings.json în directorul proiectului (fă commit în repo pentru hook-uri partajate în echipă) sau .claude/settings.local.json pentru hook-uri personale, ignorate de git implicit. Pentru exemplul nostru de mai sus, ar arăta astfel:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "say 'Task complete'"
          }
        ]
      }
    ]
  }
}

După ce editezi manual fișierul, repornește Claude Code sau folosește comanda /hooks pentru a reîncărca configurația. Acum, de fiecare dată când Claude scrie un fișier, vei auzi o notificare audio.

Testarea hook-ului tău

Înainte de a merge mai departe, verifică dacă hook-ul chiar funcționează:

  1. Cere-i lui Claude să scrie orice fișier Python (de ex., „Creează un fișier hello.py care printează hello world”)

  2. Ar trebui să auzi notificarea audio când Claude finalizează operația de scriere

  3. Dacă nu auzi nimic, verifică transcriptul lui Claude Code apăsând Ctrl-O pentru a vedea eventuale mesaje de eroare

  4. Probleme frecvente includ comanda hook-ului negăsită, permisiuni greșite pe fișier sau erori de sintaxă în fișierul de configurare

Obținerea acestui test de bază te scutește de depanare mai târziu când construiești hook-uri mai complexe. Dacă tocmai ai editat manual fișierul de setări, ai schimbat matcher-ul sau evenimentul ori ai instalat unelte noi pe care vrei să le folosești într-o comandă de hook, poate ajuta să redeschizi /hooks sau să repornești Claude pentru a reîncărca configurația.

Acest tipar de bază (eveniment, matcher, comandă) stă la baza tuturor automatizărilor cu hook-uri. Îl poți extinde adăugând mai multe comenzi care rulează simultan când același eveniment se declanșează. De exemplu, ai putea dori și să redai un sunet, și să creezi un backup atunci când Claude scrie un fișier. 

Poți, de asemenea, să creezi matchere separate pentru diferite unelte în cadrul aceluiași eveniment, astfel încât scrierea fișierelor să declanșeze acțiuni diferite față de editarea codului. Toate hook-urile care se potrivesc aceluiași model de unealtă rulează în paralel. Dacă configurezi mai multe matchere pentru același eveniment, fiecare hook rulează atunci când matcher-ul său este declanșat.

Lucrul cu intrările hook-urilor

Când Claude Code declanșează un hook, trimite informații despre ce tocmai s-a întâmplat prin intrarea standard (stdin), un flux de date care ajunge direct în comanda ta când rulează. Aceste date fac ca hook-urile să fie puternice, nu doar scripturi care rulează la întâmplare. 

Claude Code împachetează aceste informații ca JSON și le transmite oricărei comenzi pe care ai configurat-o, fie că e o comandă simplă de terminal, fie un script personalizat.

Anatomia intrărilor hook-urilor

Fiecare hook primește un obiect JSON cu câmpuri de bază despre sesiunea curentă:

{
  "session_id": "abc123",
  "transcript_path": "/Users/you/.claude/projects/my-project/conversation.jsonl", 
  "cwd": "/Users/you/my-project",
  "hook_event_name": "PostToolUse"
}

Să traducem fiecare componentă:

  • session_id: identifică conversația curentă

  • transcript_path: indică istoricul conversației

  • cwd: arată directorul de lucru

  • hook_event_name: îți spune ce eveniment s-a declanșat

Având acest context, hook-urile tale pot lua decizii inteligente: poți urmări care conversație a declanșat o acțiune, poți accesa întreg istoricul chatului dacă e nevoie sau poți rula comenzi în directorul corect.

Variații ale intrărilor în funcție de eveniment

Evenimentele de unelte precum PreToolUse și PostToolUse includ detalii suplimentare despre acțiune, aici devenind hook-urile cu adevărat utile pentru automatizare. În PreToolUse, tool_input este specificat, iar tool_response suplimentar în PostToolUse:

{
  "session_id": "abc123",
  "hook_event_name": "PostToolUse",
  "tool_name": "Write",
  "tool_input": {
    "file_path": "/path/to/file.py",
    "content": "print('Hello world')"
  },
  "tool_response": {
    "filePath": "/path/to/file.py", 
    "success": true
  }
}

În intrarea hook-ului, file_path arată calea fișierului care este scris sau editat, în timp ce content conține textul exact pe care unealta urmează să îl scrie. După execuție, răspunsul uneltei reflectă filePath final (observă camelCase) pentru a confirma ce fișier a fost atins efectiv, împreună cu un flag success ce indică dacă operațiunea s-a încheiat corect. 

Aceste informații detaliate înseamnă că hook-urile tale pot răspunde diferit în funcție de ce s-a întâmplat. Ai putea formata doar fișierele Python, face backup doar pentru directoarele importante sau trimite notificări doar când se modifică anumite tipuri de fișiere.

Evenimente precum UserPromptSubmit sunt mai simple deoarece nu implică unelte:

{
  "session_id": "abc123",
  "hook_event_name": "UserPromptSubmit", 
  "prompt": "Write a function to calculate factorial"
}

Reține că hook-urile UserPromptSubmit nu folosesc matchere în configurația lor. Se declanșează la toate prompturile, nu la operațiuni de unelte. Asta le face perfecte pentru logarea conversațiilor, adăugarea automată de context al proiectului sau validarea prompturilor înainte ca Claude să le proceseze.

Citirea intrărilor hook-ului în practică

Hai să creăm un hook care loghează fiecare prompt al utilizatorului. Asta rezolvă problema pierderii firului a ceea ce i-ai cerut lui Claude, mai ales în sesiuni lungi. Mai întâi, configurația hook-ului:

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/log_prompts.py"
          }
        ]
      }
    ]
  }
}

Apoi, creează scriptul Python la ~/.claude/log_prompts.py cu următorul conținut:

#!/usr/bin/env python3
import json
import sys
from datetime import datetime

# Read JSON data from stdin
input_data = json.load(sys.stdin)

# Extract information
session_id = input_data.get("session_id", "unknown")
prompt = input_data.get("prompt", "")
timestamp = datetime.now().isoformat()

# Log the prompt
log_entry = f"{timestamp} | Session: {session_id[:8]} | {prompt}\n"
with open("prompt_history.txt", "a") as f:
    f.write(log_entry)

Scriptul citește datele JSON pe care le trimite Claude Code și loghează promptul cu contextul sesiunii. Astfel creezi un istoric căutabil al interacțiunilor tale, care devine neprețuit când trebuie să-ți amintești cum ai rezolvat o problemă după câteva săptămâni.

Lucrul cu ieșirile hook-urilor

După ce comanda hook-ului rulează, trebuie să-i spună lui Claude Code ce s-a întâmplat și dacă să continue normal. Acest mecanism de control transformă hook-urile din simple unelte de logare în automatizări puternice ale fluxului de lucru care pot ghida comportamentul lui Claude. Asta se întâmplă prin trei canale: ieșirea standard (stdout), eroarea standard (stderr) și codurile de ieșire.

Canale de ieșire și coduri de ieșire

Ieșirea standard (stdout) reprezintă ieșirea normală. De exemplu, dacă printezi ceva, ajunge în stdout. Pentru cele mai multe hook-uri, asta apare în transcriptul lui Claude Code când apeși Ctrl-O, oferindu-ți o evidență a ceea ce a făcut automatizarea ta fără a aglomera conversația principală.

Eroarea standard (stderr) se referă la mesaje de eroare. Poți scrie în stderr folosind 

  • Python: print("message", file=sys.stderr) sau

  • Linie de comandă: echo "message" >&2

Diferența cheie este că stderr poate fi trimis direct către Claude pentru procesare automată, permițându-i să răspundă la problemele detectate de hook-urile tale.

Codurile de ieșire îi spun lui Claude Code ce să facă în continuare:

  • Cod de ieșire 0: Succes (afișează stdout utilizatorului)

  • Cod de ieșire 2: Eroare blocantă (trimite stderr către Claude)

  • Alte coduri: Eroare neblocantă (afișează stderr utilizatorului, dar continuă)

Acest sistem îți oferă control fin asupra momentului când Claude ar trebui să se oprească, să continue sau să primească feedback despre ce a descoperit automatizarea ta. Să vedem exemple pentru cele mai importante două coduri de ieșire.

Cod de ieșire 0: Funcționare normală

Majoritatea hook-urilor folosesc codul 0 pentru a indica faptul că totul a mers bine. Iată un hook complet care loghează operațiunile pe fișiere și notifică utilizatorul:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "python3 -c \"import datetime; open('activity.log','a').write('File written: ' + datetime.datetime.now().isoformat() + '\\n'); print('Logged file operation')\""
          }
        ]
      }
    ]
  }
}

Acest hook rulează două comenzi: logarea într-un fișier, apoi printarea unui mesaj în transcript. Există multe moduri de a face asta, dar această abordare este cross-platform și evită dependența de specificul liniei de comandă.

Deoarece nu există un cod de ieșire explicit, se presupune 0. Mesajul printat apare în transcriptul lui Claude Code, oferindu-ți feedback că logarea a reușit. Acest tipar este perfect pentru a construi trasee de audit sau pentru a urmări ce modificări face Claude în timp asupra proiectului tău.

Cod de ieșire 2: Blocare cu feedback

Codul de ieșire 2 trimite mesajul tău de eroare direct către Claude, permițându-i să răspundă automat. Aici hook-urile devin un mecanism de siguranță, nu doar automatizare. Iată un hook care blochează operațiunile periculoase pe fișiere:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/security_check.py"
          }
        ]
      }
    ]
  }
}

Va trebui să creezi scriptul de verificare a securității la ~/.claude/security_check.py:

#!/usr/bin/env python3
import json
import sys

# Read hook input
input_data = json.load(sys.stdin)
tool_input = input_data.get("tool_input", {})
file_path = tool_input.get("file_path", "")

# Check for dangerous patterns
dangerous_paths = ["/etc/", "/usr/", "production.conf"]
is_dangerous = any(pattern in file_path for pattern in dangerous_paths)

if is_dangerous:
    # Block the operation and tell Claude why
    print(f"Blocked modification of {file_path} - this appears to be a system or production file", file=sys.stderr)
    sys.exit(2)  # Sends stderr message to Claude
else:
    # Allow the operation
    print(f"Approved modification of {file_path}")
    sys.exit(0)  # Shows stdout in transcript

Când acest hook detectează o cale periculoasă, iese cu codul 2. Claude Code trimite mesajul de pe stderr către Claude, care îți poate explica de ce operațiunea a fost blocată și îți poate sugera alternative. Asta previne deteriorarea accidentală a fișierelor de sistem, menținându-l pe Claude informat despre politicile tale de securitate.

Construirea unui hook inteligent de notificare pentru Claude Code

Hai să construim hook-ul nostru îmbunătățit de notificare care combină procesarea intrărilor cu gestionarea inteligentă a ieșirilor. Asta rezolvă problema zgomotului din hook-ul inițial care avertiza la fiecare schimbare de fișier:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/smart_notify.py"
          }
        ]
      }
    ]
  }
}

Creează scriptul de notificare la ~/.claude/smart_notify.py:

#!/usr/bin/env python3
import json
import sys
import os
import subprocess

# Read the hook input
input_data = json.load(sys.stdin)
tool_input = input_data.get("tool_input", {})
file_path = tool_input.get("file_path", "")

# Categorize file importance
important_extensions = [".py", ".js", ".ts", ".java", ".cpp"]
config_files = ["Dockerfile", "requirements.txt", "package.json"]

is_code = any(file_path.endswith(ext) for ext in important_extensions)
is_config = any(filename in file_path for filename in config_files)

if is_code:
    # Important: notify and log
    print(f"Code file modified: {os.path.basename(file_path)}")
    subprocess.run(["say", "Code updated"], check=False)  # Mac
    sys.exit(0)  # Show message in transcript
elif is_config:
    # Very important: louder notification
    print(f"Configuration file changed: {os.path.basename(file_path)}")
    subprocess.run(["say", "Configuration updated - review changes"], check=False)
    sys.exit(0)
else:
    # Not important: silent success
    sys.exit(0)

Acest hook citește intrarea pentru a înțelege ce fișier a fost modificat, ia decizii despre importanța notificării în funcție de tipul fișierului, folosește stdout pentru a înregistra schimbări importante în transcript, declanșează alerte audio diferite în funcție de tipul fișierului și iese mereu cu codul 0 deoarece acestea sunt acțiuni informaționale, nu blocante.

Combinația dintre analiza intrărilor și controlul ieșirilor creează un hook care se comportă inteligent în funcție de context, oferind nivelul potrivit de feedback atât ție, cât și lui Claude Code. În loc să primești notificări enervante pentru fiecare fișier temporar, auzi doar despre schimbările care contează cu adevărat pentru proiectul tău.

Te rugăm să reții că acest exemplu folosește comanda say, disponibilă pe macOS. Pe Linux, poți folosi notify-send, iar pe Windows o comandă PowerShell, pentru a obține notificări similare.

Capcane frecvente cu Claude Code Hooks

Câteva lucruri care îi încurcă pe cei mai mulți în prima săptămână cu hook-uri:

Instrucțiunile echo din profilul shell-ului strică hook-urile. Hook-urile rulează în shell-uri neinteractive care încarcă ~/.zshrc sau ~/.bashrc. Dacă profilul tău are instrucțiuni echo necondiționate, acestea preprind text la stdout-ul hook-ului și strică parsarea JSON. Înfășoară-le într-o verificare pentru shell interactiv:

if [[ $- == *i* ]]; then
  echo "Welcome back"
fi

Hook-urile Stop pot intra în buclă infinită. Un hook Stop care iese cu codul 2 îl forțează pe Claude să continue munca. Dacă scriptul tău nu verifică stop_hook_active din JSON-ul de intrare și nu iese curat când este true, vei rula în buclă până la timeout. Include întotdeauna o condiție de ieșire timpurie.

Matcher-ele fac diferența între majuscule și minuscule. bash nu se potrivește cu Bash. Folosește exact numele uneltei așa cum apare în Claude Code.

Ieșirea este limitată la 10.000 de caractere. Dacă hook-ul tău generează mai mult, este trunchiat înainte de a fi injectat în contextul lui Claude. Păstrează stdout concis și suprafețează doar ceea ce modelul are nevoie pentru a acționa.

Confuzie între hook-uri la nivel de echipă și personale. Hook-urile din .claude/settings.json sunt partajate cu echipa (fă-le commit în repo). Pentru hook-uri personale pe care nu vrei să le partajezi, folosește .claude/settings.local.json, care este ignorat de git implicit.

Hook-uri vs. skill-uri: când să le folosești

Hook-urile și Claude Skills au scopuri diferite și funcționează cel mai bine împreună. Un skill este un fișier markdown care îl învață pe Claude cum să facă ceva (proceduri, convenții, șabloane). Un hook este o comandă shell care impune o regulă determinist, indiferent de ce decide Claude.

Distincția contează: un skill este o sugestie pe care modelul o poate ignora sub presiune; un hook se declanșează de fiecare dată. Scrie un skill pentru a documenta procedura de migrare a echipei. Scrie un hook PostToolUse pentru a rula linterul de migrare pe fiecare fișier .sql pe care îl scrie Claude. Skill-ul îl face pe Claude competent; hook-ul îl face responsabil.

Nevoie

Folosește un skill

Folosește un hook

Cunoștințe procedurale pe care Claude le încarcă atunci când sunt relevante

Da

Nu

Impune strict, nu poate fi omis

Nu

Da

Rulează determinist de fiecare dată

Nu

Da

Rezistă unui model care se comportă necorespunzător

Nu

Da

Tipare avansate pentru Claude Code Hooks

Dincolo de notificări și logare de bază, hook-urile pot rezolva probleme reale de flux de lucru de dezvoltare cu care se confruntă echipele zilnic. Iată câteva idei pe care le poți adapta pentru propriile proiecte.

Partea bună este că nu trebuie să construiești manual aceste hook-uri. Îi poți da pur și simplu lui Claude Code una dintre ideile de prompt de mai jos, împreună cu referința Hook-uri din documentația sa, și îți va genera codul și JSON-ul relevante pentru configurare.

Fiecare dintre aceste tipare poate fi personalizat pentru uneltele și fluxul tău. Începe cu cele care îți rezolvă cele mai mari frustrări zilnice, apoi extinde-ți automatizarea pe măsură ce devii confortabil cu dezvoltarea de hook-uri.

Hook-uri avansate pentru securitate și conformitate

Hook-urile sunt grozave pentru impunerea regulilor de securitate și a standardelor de conformitate. Iată patru cazuri de utilizare.

Scanner pentru chei API

  • Problemă: Comiterea accidentală a secretelor în versionare

  • Declanșatoare: Înainte de a scrie orice fișier

  • Soluție: Scanarea conținutului fișierului pentru chei API, tokenuri și parole folosind regex

„Creează un script Python care citește JSON-ul de intrare al hook-ului, extrage conținutul fișierului și folosește regex pentru a detecta formate comune de secrete precum api_key=, token: sau password=.  Pentru orice potrivire suspectă, fă verificare locală și niciodată nu trimite secrete brute extern. 

Trimite doar fragmente mascate (de ex., păstrează 4 caractere la început/sfârșit) sau hash-uri către API-ul Anthropic pentru a analiza șirurile suspecte și a determina dacă sunt secrete reale versus nume de variabile. Ieși cu codul 2 și oferă-i lui Claude feedback despre secretele detectate și alternative mai sigure.”

Impunător de antet licență

  • Problemă: Proiecte open-source care nu au antetele de licență necesare în fișiere noi

  • Declanșatoare: Înainte de a scrie fișiere de cod sursă

  • Soluție: Validarea ca fișierele noi .py, .js, .java să conțină textul de licență corect

„Parsează intrarea hook-ului pentru a obține conținutul fișierului și verifică dacă primele 10 linii conțin text de licență folosind potriviri de șiruri. Pentru validare mai sofisticată, trimite antetul fișierului către Claude prin API-ul Anthropic pentru a verifica dacă include notificări de copyright și informații de licență corecte. Blochează crearea fișierului cu codul 2 dacă lipsesc antetele și furnizează-i lui Claude șablonul corect de licență pentru a-l adăuga.”

Paznic pentru fișiere de producție

  • Problemă: Modificarea accidentală a fișierelor critice de configurare a sistemului

  • Declanșatoare: Înainte de editarea fișierelor în directoare sensibile

  • Soluție: Blocarea modificărilor în /etc/, nginx.conf, database.yml și alte configurații critice

„Extrage calea fișierului din JSON-ul de intrare al hook-ului și verifică dacă se potrivește cu modele precum /etc/, production.yml sau alte nume critice de fișiere. Folosește API-ul lui Claude pentru a analiza calea fișierului și a determina dacă este un fișier de configurare care ar putea afecta sistemele de producție. Ieși cu codul 2 și oferă îndrumări specifice despre practici de dezvoltare mai sigure când sunt detectate căi periculoase.”

Optimizer de imagini

  • Problemă: Fișiere imagine mari care încetinesc aplicațiile și depozitele

  • Declanșatoare: După adăugarea de fișiere imagine noi

  • Soluție: Compresia fișierelor PNG/JPEG menținând calitatea vizuală

„Parsează intrarea hook-ului pentru a obține calea fișierului și verifică dacă este un fișier imagine folosind potrivirea extensiei. Rulează unelte de compresie precum imageoptim sau apelează API-ul TinyPNG pentru a comprima imaginea păstrând calitatea. Loghează rezultatele compresiei în stdout ca să poți vedea economiile de spațiu în transcriptul lui Claude.”

Hook-uri avansate pentru automatizarea controlului versiunilor

Fluxurile Git și documentația sunt zone unde hook-urile sunt de asemenea foarte utile. Să analizăm câteva idei.

Validator de branch Git

  • Problemă: Membrii echipei împing accidental schimbări pe branch-uri protejate

  • Declanșatoare: Înainte de orice operațiune de scriere sau editare de fișier

  • Soluție: Verificarea branch-ului Git curent și blocarea operațiunilor pe main/master/production

„Folosește o comandă bash simplă git branch --show-current pentru a obține numele branch-ului curent și compară-l cu o listă de branch-uri protejate. Dacă ești pe un branch protejat, ieși cu codul 2 și trimite-i lui Claude un mesaj de eroare care explică politicile de protecție a branch-urilor. Pentru reguli complexe de denumire a branch-urilor, folosește API-ul lui Claude pentru a analiza numele și a determina dacă se potrivesc modelelor de protecție.”

Auto-commit inteligent

  • Problemă: Uitarea de a face commit schimbărilor sau mesaje de commit slabe

  • Declanșatoare: După orice modificare de fișier

  • Soluție: Stagiu și commit automat cu mesaje descriptive generate de AI

„Citește căile fișierelor modificate din intrarea hook-ului, rulează git diff pentru a obține schimbările și trimite diff-ul către API-ul lui Claude cu un prompt care cere un mesaj de commit concis. Folosește mesajul generat cu comenzile git add și git commit pentru a comite automat schimbările. Include numele fișierelor și tipurile de schimbări în promptul către API pentru ca mesajele de commit să urmeze standardele convenționale.”

Generator de documentație

  • Problemă: Documentația API iese din sincron cu schimbările din cod

  • Declanșatoare: După modificarea fișierelor de interfață (controllere, modele, API-uri)

  • Soluție: Rularea automată a uneltelor de documentare precum JSDoc, Sphinx sau generatoare OpenAPI

„Verifică calea fișierului modificat pentru a determina dacă este un endpoint API, un fișier de model sau de interfață folosind potriviri de modele. Trimite conținutul fișierului către API-ul lui Claude, cerându-i să extragă schimbările API și să genereze actualizări de documentație. Rulează unealta de documentare potrivită (jsdoc, sphinx-build etc.) și comite documentația actualizată automat.

Hook-uri avansate pentru colaborare și integrarea fluxului de lucru

În final, hook-urile pot ajuta la menținerea tuturor membrilor echipei la curent.

Integrare Slack

  • Problemă: Echipa nu este conștientă de schimbările importante în codebase-urile partajate

  • Declanșatoare: Când sunt trimise notificări pentru operațiuni semnificative

  • Soluție: Postarea de mesaje formatate în canalele echipei cu nume de fișiere și rezumate ale schimbărilor

„Extrage informații despre fișiere din intrarea hook-ului și filtrează pentru tipuri importante de fișiere precum cod sursă sau fișiere de configurare. Folosește API-ul lui Claude pentru a genera un rezumat lizibil de om al schimbărilor pe baza numelor și tipurilor de fișiere. Trimite mesajul formatat către Slack folosind URL-uri de webhook cu mențiuni ale membrilor echipei pentru schimbări critice.”

Dispatcher de webhook-uri

  • Problemă: Declanșatoare manuale pentru pipeline-uri CI/CD care cauzează întârzieri la deployment

  • Declanșatoare: Când apar evenimente specifice (schimbări de config, fișiere de deployment modificate)

  • Soluție: Apelarea API-urilor externe pentru a declanșa build-uri, deployment-uri sau alte procese automate

„Verifică calea fișierului modificat față de modele precum Dockerfile, package.json sau configurații de deployment pentru a determina dacă ar trebui declanșat CI/CD. Folosește biblioteca requests în Python pentru a apela URL-uri de webhook cu headere de autentificare și payload despre schimbări. Include căi de fișiere și metadate ale schimbărilor în payload astfel încât sistemele externe să poată lua decizii inteligente despre ce să construiască sau să livreze.”

Actualizator de pagină de status

  • Problemă: Clienții nu sunt conștienți de activități de mentenanță sau deployment

  • Declanșatoare: Când sunt modificate fișiere de deployment sau infrastructură

  • Soluție: Actualizează paginile de status ale serviciilor cu notificări de mentenanță

„Parsează intrarea hook-ului pentru schimbări ale fișierelor de infrastructură precum manifesturi Kubernetes sau configuri Terraform folosind modele de cale de fișier. Generează mesaje de mentenanță folosind API-ul lui Claude pe baza tipului de schimbări de infrastructură detectate. Postează actualizări de status către servicii precum StatusPage.io sau PagerDuty folosind API-urile lor REST cu tipuri de incidente și durate estimate potrivite.”

Notifier de status al echipei

  • Problemă: Conflicte când mai mulți dezvoltatori lucrează pe aceleași funcționalități fără să știe

  • Declanșatoare: Când începi o nouă sesiune Claude Code

  • Soluție: Avertizarea canalelor echipei că începi lucrul la un anumit proiect sau componentă

„Citește directorul proiectului din intrarea hook-ului și folosește API-ul lui Claude pentru a analiza fișierele recente sau istoricul git ca să înțelegi ce tip de muncă se face. Trimite un mesaj formatat către canalele de comunicare ale echipei cu numele tău, numele proiectului și aria de focus. Include durata estimată a muncii și invită membrii echipei să se coordoneze dacă lucrează la funcționalități înrudite.”

Gânduri finale

Claude Code Hooks transformă asistenții AI imprevizibili în fluxuri de lucru automatizate care rulează exact când ai nevoie. În acest tutorial, ai învățat cum să setezi hook-uri atât cu comanda interactivă /hooks, cât și prin configurare manuală, să înțelegi datele de intrare JSON care alimentează automatizarea inteligentă și să controlezi comportamentul lui Claude prin coduri de ieșire și ieșiri structurate. 

Tiparele practice pe care le-am acoperit includ validatori de securitate care blochează operațiuni periculoase și notificări inteligente care reduc zgomotul. Aceste exemple arată cum hook-urile rezolvă probleme reale de dezvoltare, oferindu-ți control deplin asupra asistentului tău AI. Acum că înțelegi elementele de bază, poți construi automatizări care se potrivesc nevoilor specifice ale fluxului de lucru al echipei tale. 

Pentru a afla mai multe despre lucrul cu unelte AI, consultă cursul DataCamp Understanding Prompt Engineering, care acoperă strategii de prompting ce funcționează direct cu dezvoltarea de hook-uri. Pentru abilități AI mai largi în programare, încearcă cursul nostru Intermediate ChatGPT pentru a-ți dezvolta abilitățile care fac asistenții AI parteneri mai de încredere în fluxul tău de dezvoltare.

Întrebări frecvente despre Claude Code Hooks

Ce sunt Claude Code Hooks?

Claude Code Hooks sunt declanșatoare automate care execută comenzi shell atunci când au loc evenimente specifice în timpul sesiunii tale Claude Code. Ele rezolvă problema în care Claude scrie cod bun, dar uită pași importanți precum formatarea, rularea testelor sau verificările de securitate. În loc să-i amintești manual de fiecare dată, hook-urile automatizează aceste memento-uri rulând comenzi automat: de exemplu, formatarea codului Python după ce Claude îl scrie, rularea testelor după modificări sau blocarea schimbărilor periculoase la fișiere sensibile. Hook-urile îți monitorizează sesiunea, detectează evenimentele potrivite și execută comenzile configurate, cu acces la context detaliat despre ce a făcut Claude.

Cum folosesc hook-urile în Claude Code?

Poți seta hook-uri în două moduri. Cel mai ușor este folosind comanda interactivă /hooks din Claude Code, care te ghidează în selectarea unui eveniment (precum PostToolUse), a unui model de matcher (precum Write pentru scrierea de fișiere) și a comenzii tale (precum python -m black .). Alternativ, poți edita manual configurația la ~/.claude/settings.json (global) sau .claude/settings.json (specific proiectului) pentru a defini hook-uri în JSON. Odată configurate, hook-urile sunt încărcate și active automat. Îți poți vedea, modifica sau reîncărca hook-urile oricând rulând din nou /hooks sau repornind Claude Code.

Care e diferența între hook-urile PreToolUse și PostToolUse?

PreToolUse rulează înainte ca Claude să execute o acțiune (precum scrierea sau editarea unui fișier), ceea ce le face ideale pentru validare și blocarea operațiunilor periculoase. Poți inspecta ce urmează să facă Claude și să îl oprești dacă este nevoie, ieșind cu codul 2. Hook-urile PostToolUse rulează după ce Claude finalizează o acțiune, fiind perfecte pentru sarcini de curățare precum formatarea codului, rularea testelor sau logarea a ceea ce s-a întâmplat. Folosește PreToolUse când ai nevoie de control preventiv și PostToolUse când ai nevoie de automatizare reactivă.

Cum transmit informații despre ce a făcut Claude către scriptul meu de hook?

Claude Code trimite informații detaliate prin intrarea standard (stdin) sub formă de JSON, conținând context precum calea fișierului, conținutul scris, ID-ul sesiunii și altele. Scriptul tău de hook citește acest JSON folosind json.load(sys.stdin) în Python sau metode similare în alte limbaje. Acest payload JSON îți permite să iei decizii inteligente în hook, de exemplu, să formatezi doar fișierele Python verificând extensia, sau să blochezi modificările în directoare specifice inspectând calea fișierului.

Ce face codul de ieșire 2 și când ar trebui să îl folosesc?

Codul de ieșire 2 îi spune lui Claude Code că o operațiune ar trebui blocată și îi trimite mesajul tău de eroare (scris în stderr) direct lui Claude. Claude îți poate explica apoi problema și îți poate sugera alternative. Folosește codul 2 pentru verificări de securitate (blocarea modificărilor periculoase pe fișiere), validări de conformitate (antete lipsă obligatorii) sau bariere de siguranță (prevenirea commit-urilor pe branch-uri protejate). Pentru hook-uri informaționale care nu ar trebui să blocheze operațiuni, folosește codul 0 sau alte coduri.

Pot hook-urile Claude Code să provoace bucle infinite?

Da, hook-urile Stop pot intra în buclă la nesfârșit dacă nu sunt gestionate cu grijă. Un hook Stop care iese cu codul 2 îl forțează pe Claude să continue să lucreze. Dacă scriptul tău nu verifică stop_hook_active din JSON-ul de intrare al hook-ului și nu iese curat când este true, Claude va răspunde, va declanșa din nou hook-ul Stop, va fi blocat din nou și va repeta până când sesiunea expiră. Include întotdeauna la începutul scripturilor Stop un gardian care verifică acest câmp și returnează imediat codul 0 când este deja activ.

Ce tipuri de hook-uri suportă Claude Code în afară de comenzi shell?

Claude Code suportă cinci tipuri de hook-uri: command (comenzi shell, cel mai comun), http (POST către un URL pentru integrări webhook), mcp_tool (apelează o unealtă pe un server MCP conectat), prompt (trimite un prompt către un model Claude pentru evaluare într-o singură tură) și agent (lansează un subagent care poate folosi unelte pentru a verifica condiții). Pentru cele mai multe cazuri, hook-urile command acoperă ce ai nevoie. Vezi documentația oficială a hook-urilor pentru detalii despre fiecare tip.

Subiecte

Învață programarea asistată de AI cu DataCamp!

course

Programare asistată de AI pentru dezvoltatori

1 oră 30 min
8K
Îmbunătățește-ți codarea cu AI—ghidează-ți asistentul de codare să scrie, testeze și documenteze cod eficient.
Vezi detaliiRight Arrow
Începeți Cursul
Vezi mai multRight Arrow