Claude Code Hooks: Tự Động Hóa Workflow Từ A-Z (2026)

Sơ đồ lifecycle Claude Code Hooks với 5 giai đoạn từ Session Start đến Stop
Claude Code Hooks automate everything 24 events 4 handlers 2026
Claude Code Hooks: tự động hóa workflow với 24 events và 4 handler types.

Claude Code đã mang về $2,5 tỷ USD doanh thu hàng năm cho Anthropic (Anthropic Series G, tháng 2/2026). Hàng triệu developer đang dùng nó mỗi ngày. Nhưng bạn có bao giờ gặp tình huống này: Claude Code chạy xong một lệnh nguy hiểm trước khi bạn kịp phản ứng? Hoặc bạn phải tự format code thủ công sau mỗi lần Claude sửa file?

Vấn đề nằm ở chỗ: CLAUDE.md chỉ là “gợi ý” — Claude Code có thể nghe hoặc không. Hooks thì khác. Claude Code Hooks là shell commands tự động chạy tại các điểm cụ thể trong lifecycle, và chúng bắt buộc, deterministic, không bao giờ bị bỏ qua.

Mình dùng hooks hàng ngày cho blog ongboit.com — từ auto-format code sau khi Claude viết, đến notification khi task hoàn thành, đến chặn các lệnh nguy hiểm. Bài viết này chia sẻ mọi thứ mình đã học được.

TL;DR

Claude Code Hooks là shell commands chạy tự động tại 24 điểm trong lifecycle (session, tool, agent, system events). Có 4 loại handler: command, http, prompt, agent. Hooks deterministic 100% — khác với CLAUDE.md chỉ là gợi ý. Exit code 0 = tiếp tục, exit code 2 = chặn. Cấu hình trong settings.json ở 3 cấp: user, project, local. Theo khảo sát Stack Overflow 2025, 84% developer dùng AI tools hàng ngày (Stack Overflow Survey 2025, n=33.662).

Claude Code là gì
Sơ đồ lifecycle Claude Code Hooks với 5 giai đoạn từ Session
Slide 1/3: Sơ đồ lifecycle Claude Code Hooks với 5 giai đoạn từ Session
4 loại hook handler trong Claude Code Command HTTP Prompt và
Slide 2/3: 4 loại hook handler trong Claude Code Command HTTP Prompt và
Cấu hình hooks trong 3 cấp settings.json User Project và Loc
Slide 3/3: Cấu hình hooks trong 3 cấp settings.json User Project và Loc
Tại sao Hooks tồn tại? CLAUDE.md là probabilistic: bạn viết “luôn chạy prettier sau khi edit” nhưng Claude có thể quên. Hooks là deterministic: code chạy guaranteed mỗi lần, không phụ thuộc vào LLM. Đây là sidecar pattern: thay vì nhét conditionals vào core loop (CLAUDE.md), hooks chạy bên cạnh loop tại các fixed moments. Multi-stakeholder friendly: DevOps thêm security hooks, dev thêm format hooks, QA thêm test hooks: không ai cần sửa CLAUDE.md của nhau.

Claude Code Hooks Là Gì?

Claude Code Hooks là shell commands tự động chạy tại các điểm cụ thể trong lifecycle của Claude Code, được giới thiệu chính thức trong tài liệu Anthropic. Với 24 hook events và 4 handler types, hooks cung cấp automation deterministic — khác hoàn toàn với CLAUDE.md chỉ là gợi ý. Theo Pragmatic Engineer Survey 2026 (n=906), 46% developer chọn Claude Code là AI coding tool yêu thích nhất.

Claude Code Hooks are user-defined shell commands, HTTP requests, prompt evaluations, or agent-driven handlers that execute automatically at specific points in the Claude Code lifecycle. They provide deterministic, guaranteed automation — unlike CLAUDE.md instructions which are suggestions.

Nghe trừu tượng quá? Nghĩ thế này cho dễ: Hooks giống như “camera giám sát” kết hợp “bảo vệ” cho workflow của bạn. Camera giám sát (non-blocking hooks) ghi lại mọi thứ đang xảy ra — log commands, track file changes. Bảo vệ (blocking hooks) có quyền chặn lại bất kỳ hành động nào không hợp lệ — như lệnh rm -rf hay ghi vào file .env.

Điểm khác biệt cốt lõi giữa Hooks và CLAUDE.md:

Tiêu chí CLAUDE.md Hooks Skills
Bản chất Gợi ý (probabilistic) Bắt buộc (deterministic) Reusable instructions
Thực thi bởi LLM (có thể bỏ qua) OS/Shell (luôn chạy) LLM (theo instructions)
Chặn hành động? Không Có (exit code 2) Không
Cấu hình File .md settings.json SKILL.md (YAML)
Use case chính Coding style, conventions Auto-format, security, logging Reusable workflows

Cấu trúc nên nhớ: CLAUDE.md = “nên làm gì”, Hooks = “phải làm gì”, Skills = “làm như thế nào”. Ba thành phần này bổ sung cho nhau, không thay thế nhau.

24 Hook Events: Có Những Loại Nào?

Claude Code cung cấp 24 hook events chia thành 4 nhóm chính, theo tài liệu chính thức Anthropic. Trong số đó, 12 events có khả năng blocking (chặn hành động), 12 events là non-blocking (chỉ ghi nhận). Theo DataCamp (2025), việc hiểu rõ từng event là bước đầu tiên để xây dựng automation hiệu quả.

Bạn có biết tại sao các event này quan trọng đến vậy không? Vì mỗi event là một “điểm chèn” — nơi bạn có thể tự động hóa bất kỳ logic nào mà không cần Claude Code phải hiểu hay quyết định. OS chạy trực tiếp, không qua LLM.

[IMAGE: Diagram showing 24 hook events organized by 4 categories lifecycle tool agent system — claude code hooks events diagram categories]

Lifecycle Events

Event Khi nào chạy? Blocking? Use case
SessionStart Khi bắt đầu session mới Không Setup environment, log thời gian
SessionEnd Khi kết thúc session Không Cleanup, báo cáo tổng kết
UserPromptSubmit Khi user gửi prompt Validate input, inject context
Stop Khi agent dừng lại Kiểm tra kết quả, tiếp tục nếu cần
StopFailure Khi agent dừng do lỗi Không Error logging, notification
Notification Khi có thông báo Không Desktop notification, Slack alert
InstructionsLoaded Khi CLAUDE.md được load Không Log instructions version

Tool Events

Event Khi nào chạy? Blocking? Use case
PreToolUse Trước khi tool chạy Chặn lệnh nguy hiểm, validate input
PostToolUse Sau khi tool chạy thành công Không Auto-format, auto-test, logging
PostToolUseFailure Sau khi tool lỗi Không Error tracking, retry logic
PermissionRequest Khi cần quyền Auto-approve safe tools, block risky ones

Agent & Task Events

Event Khi nào chạy? Blocking? Use case
SubagentStart Khi subagent bắt đầu Không Track subagent activity
SubagentStop Khi subagent dừng Validate subagent output
TaskCreated Khi task mới được tạo Validate task parameters
TaskCompleted Khi task hoàn thành Quality gate, notification
TeammateIdle Khi teammate rảnh Không Assign new work
Elicitation Khi Claude hỏi user Auto-answer common questions
ElicitationResult Khi user trả lời Validate user response

System Events

Event Khi nào chạy? Blocking? Use case
ConfigChange Khi config thay đổi Validate config changes
CwdChanged Khi đổi thư mục làm việc Không Reload project-specific settings
FileChanged Khi file bị thay đổi Không Auto-lint, auto-test
WorktreeCreate Khi tạo worktree mới Setup worktree environment
WorktreeRemove Khi xóa worktree Không Cleanup resources
PreCompact Trước khi compact context Không Save important context
PostCompact Sau khi compact context Không Restore critical context

Trong 24 events, PreToolUsePostToolUse là hai event bạn sẽ dùng nhiều nhất, có lẽ 80% use case. PreToolUse để chặn lệnh nguy hiểm, PostToolUse để auto-format hay auto-test. Các event WorktreeCreateWorktreeRemove hữu ích khi bạn làm việc với git worktree để chạy nhiều task song song. Nếu bạn mới bắt đầu, tập trung vào PreToolUse và PostToolUse trước.

4 Loại Handler: Command, HTTP, Prompt, Agent Khác Nhau Thế Nào?

Mỗi hook cần một handler để thực thi — và Claude Code hỗ trợ 4 loại handler khác nhau. Theo Hooks Guide chính thức, command là handler phổ biến nhất, chiếm đa số các use case thực tế. Theo GitButler (2025), hooks đã thay đổi cách developer tương tác với AI coding tools.

Vậy khi nào dùng loại nào? Cũng không phức tạp lắm đâu.

4 loại hook handler trong Claude Code Command HTTP Prompt và Agent với icon minh họa

Command Handler — Phổ Biến Nhất

Command handler chạy shell commands trực tiếp trên máy của bạn. Đây là loại đơn giản nhất và phù hợp với 90% trường hợp. Bạn chỉ cần viết một script bash hoặc python, rồi trỏ hook đến nó.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write $CLAUDE_FILE_PATH"
          }
        ]
      }
    ]
  }
}

Khi nào dùng: Auto-format code, chạy tests, log activity, notification, chặn lệnh nguy hiểm. Bất cứ gì chạy được bằng shell command.

HTTP Handler — Gọi Remote Services

HTTP handler gửi request đến một URL. Hữu ích khi bạn muốn integrate với external services như Slack, Discord, hoặc custom webhook.

{
  "type": "http",
  "url": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
  "method": "POST",
  "headers": {
    "Content-Type": "application/json"
  },
  "body": "{\"text\": \"Claude Code finished a task!\"}"
}

Khi nào dùng: Slack/Discord notifications, webhook integrations, remote logging, API calls đến CI/CD systems. Nếu bạn muốn tích hợp sâu hơn với CI/CD, đọc bài Claude Code GitHub Actions để chạy Claude Code trực tiếp trong pipeline.

Prompt Handler — Đánh Giá Bằng LLM

Prompt handler gửi kết quả đến LLM để đánh giá. Khác với command handler chạy code trực tiếp, prompt handler dùng AI để phân tích output và quyết định tiếp theo.

{
  "type": "prompt",
  "prompt": "Review this code change for security issues. If you find any, output BLOCK and explain why. If safe, output PASS."
}

Khi nào dùng: Code review tự động, security analysis, quality gate cho output phức tạp mà regex không xử lý được.

Agent Handler — Xác Minh Phức Tạp

Agent handler là loại mạnh nhất — chạy một agent riêng để thực hiện verification phức tạp. Nó có thể đọc nhiều file, chạy nhiều lệnh, và đưa ra quyết định tổng hợp.

{
  "type": "agent",
  "prompt": "Verify that the changes maintain backward compatibility. Check all public API signatures, run type checks, and validate test coverage is above 80%."
}

Khi nào dùng: Verification phức tạp cần nhiều bước, backward compatibility checks, comprehensive code review. Lưu ý: agent handler tốn nhiều tokens hơn các loại khác.

MCP là gì

Cách Cấu Hình Hooks Trong settings.json Như Thế Nào?

Claude Code Hooks được cấu hình trong file settings.json ở 3 cấp độ khác nhau, theo tài liệu Anthropic. Việc hiểu rõ thứ tự ưu tiên giữa các cấp là điều kiện tiên quyết để tránh xung đột. Theo GitHub claude-code-hooks-mastery (2025), hầu hết lỗi hooks đều xuất phát từ sai cấu hình.

3 Cấp Độ Cấu Hình

Mỗi cấp độ phục vụ một mục đích khác nhau. Bạn cần hiểu rõ để biết đặt hooks ở đâu cho đúng.

Cấp độ File path Phạm vi Commit?
User ~/.claude/settings.json Tất cả projects Không
Project .claude/settings.json Project hiện tại (shared) Có (chia sẻ với team)
Local .claude/settings.local.json Project hiện tại (cá nhân) Không (gitignored)

Thứ tự ưu tiên: Local > Project > User. Hooks từ cấp local sẽ override hooks cùng event từ cấp project và user.

Cấu Trúc File settings.json

Cấu trúc cơ bản của một hook trong settings.json gồm 3 phần: event name, matcher (regex), và danh sách handlers. Đây là một ví dụ đầy đủ:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/hooks/block-dangerous.py"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write $CLAUDE_FILE_PATH"
          }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "notify-send 'Claude Code' '$CLAUDE_NOTIFICATION'"
          }
        ]
      }
    ]
  }
}

Matcher — Regex Pattern Matching

Matcher quyết định hook chạy với tool nào. Nó sử dụng regex pattern. Một số ví dụ:

  • "Bash" — Chỉ chạy khi Claude dùng Bash tool
  • "Write|Edit" — Chạy khi Write hoặc Edit tool
  • ".*" — Chạy với tất cả tools
  • "" (empty) — Tương tự .*, match tất cả
  • "Read" — Chỉ khi Read tool

Một điều quan trọng: matcher chỉ có ý nghĩa với tool-related events như PreToolUse, PostToolUse, PermissionRequest. Với các event khác như SessionStart hay Notification, bạn có thể để matcher là empty string.

Environment Variables

Khi hook chạy, Claude Code tự động truyền các environment variables hữu ích:

  • CLAUDE_PROJECT_DIR — Thư mục gốc của project
  • CLAUDE_PLUGIN_ROOT — Thư mục gốc của plugin (nếu dùng plugin)
  • CLAUDE_PLUGIN_DATA — Thư mục data của plugin
  • CLAUDE_ENV_FILE — Đường dẫn đến file environment

Ngoài ra, stdin của hook nhận được JSON object chứa thông tin context cụ thể cho từng event. Ví dụ, PreToolUse nhận tool name và input parameters.

Cấu hình hooks trong 3 cấp settings.json User Project và Local với hierarchy

7 Hook Recipes Thực Tế (Copy-Paste)

Lý thuyết đã đủ. Giờ là lúc thực hành. Dưới đây là 7 recipes mình đang dùng hàng ngày trên ongboit.com và các dự án khác. Theo claude-code-hooks-mastery trên GitHub (2025, 500+ stars), đây là những pattern được cộng đồng sử dụng nhiều nhất.

Sau 3 tháng dùng hooks, mình giảm được khoảng 40% thời gian format code thủ công và gần như loại bỏ hoàn toàn các sự cố “lỡ delete file nhầm”. Còn bạn thì sao — đã bao giờ Claude Code xóa nhầm file chưa?

[IMAGE: Terminal screenshot showing Claude Code hooks running in real-time with colored output — claude code hooks terminal recipes examples]

1. Auto-format Code Sau Khi Claude Viết File

Đây là hook mình dùng nhiều nhất. Mỗi khi Claude Code tạo hoặc sửa file, Prettier tự động chạy để format. Không cần nhớ, không cần làm thủ công.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$(echo $CLAUDE_TOOL_INPUT | jq -r '.file_path // .path // empty')\" 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

Giải thích: Hook bắt event PostToolUse khi matcher match Write|Edit. Sau khi Claude viết file, Prettier tự động format. || true đảm bảo hook không fail nếu Prettier gặp lỗi (ví dụ file không phải JS/TS).

2. Chặn Lệnh Nguy Hiểm (rm -rf, DROP TABLE)

Đây là hook bảo vệ — chặn các lệnh có thể gây hại trước khi Claude Code thực thi. Sử dụng exit code 2 để block.

#!/bin/bash
# File: ~/.claude/hooks/block-dangerous.sh

# Đọc tool input từ stdin
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.command // empty')

# Danh sách lệnh bị cấm
DANGEROUS_PATTERNS=(
  "rm -rf /"
  "rm -rf ~"
  "DROP TABLE"
  "DROP DATABASE"
  "DELETE FROM.*WHERE 1"
  "mkfs\."
  "dd if=/dev/zero"
  "> /dev/sda"
)

for pattern in "${DANGEROUS_PATTERNS[@]}"; do
  if echo "$COMMAND" | grep -qiE "$pattern"; then
    echo "BLOCKED: Lệnh nguy hiểm '$pattern' bị chặn bởi hook" >&2
    exit 2
  fi
done

exit 0

Và cấu hình trong settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash ~/.claude/hooks/block-dangerous.sh"
          }
        ]
      }
    ]
  }
}

Quan trọng: Khi exit code là 2, stderr được gửi lại cho Claude Code như feedback. Claude sẽ thấy message “BLOCKED: …” và hiểu rằng nó cần tìm cách khác.

3. Auto-run Tests Sau Mỗi Edit

Mỗi khi Claude sửa file code, tests tự động chạy. Nếu test fail, Claude nhận được kết quả và có thể tự fix.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "cd $CLAUDE_PROJECT_DIR && npm test -- --bail 2>&1 | tail -20"
          }
        ]
      }
    ]
  }
}

Tip: Dùng --bail để dừng ngay khi gặp test fail đầu tiên — tiết kiệm thời gian. tail -20 chỉ lấy 20 dòng cuối cùng để tránh output quá dài.

4. Notification Khi Claude Xong Việc

Khi Claude Code hoàn thành task dài, bạn nhận notification trên desktop. Cực kỳ hữu ích khi bạn đang làm việc khác.

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "powershell -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code đã xong việc!', 'Notification')\""
          }
        ]
      }
    ]
  }
}

Linux/macOS: Thay command bằng notify-send 'Claude Code' 'Task completed!' (Linux) hoặc osascript -e 'display notification "Task completed!" with title "Claude Code"' (macOS).

5. Environment Setup Khi Bắt Đầu Session

Tự động thiết lập environment variables và kiểm tra dependencies khi bắt đầu làm việc.

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "cd $CLAUDE_PROJECT_DIR && [ -f .env ] && export $(cat .env | xargs) && echo 'Environment loaded' || echo 'No .env file found'"
          }
        ]
      }
    ]
  }
}

6. Log Tất Cả Bash Commands

Ghi lại mọi lệnh Bash mà Claude Code thực thi. Hữu ích để audit và debug sau này.

#!/bin/bash
# File: ~/.claude/hooks/log-commands.sh

INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.command // empty')
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
LOG_FILE="$CLAUDE_PROJECT_DIR/.claude/command-log.txt"

mkdir -p "$(dirname $LOG_FILE)"
echo "[$TIMESTAMP] $COMMAND" >> "$LOG_FILE"

exit 0
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash ~/.claude/hooks/log-commands.sh"
          }
        ]
      }
    ]
  }
}

7. Block Write Vào File Nhạy Cảm (.env, credentials)

Chặn Claude Code ghi vào các file nhạy cảm như .env, credentials.json, hoặc SSH keys. An toàn là trên hết. Kết hợp hook này với Permission Modes để có lớp bảo mật kép, vừa kiểm soát quyền ở cấp độ session, vừa chặn file cụ thể bằng hook.

#!/bin/bash
# File: ~/.claude/hooks/protect-sensitive.sh

INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.file_path // .path // empty')

# Danh sách file/pattern bị bảo vệ
PROTECTED_PATTERNS=(
  "\.env$"
  "\.env\.local$"
  "credentials"
  "secret"
  "\.pem$"
  "id_rsa"
  "\.ssh/"
)

for pattern in "${PROTECTED_PATTERNS[@]}"; do
  if echo "$FILE_PATH" | grep -qiE "$pattern"; then
    echo "BLOCKED: Không được ghi vào file nhạy cảm '$FILE_PATH'" >&2
    exit 2
  fi
done

exit 0
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "bash ~/.claude/hooks/protect-sensitive.sh"
          }
        ]
      }
    ]
  }
}
So sánh Claude Code vs Cursor vs Copilot

Exit Codes — Cách Hooks Giao Tiếp Với Claude Code?

Exit codes là “ngôn ngữ” mà hooks dùng để nói chuyện với Claude Code. Hệ thống này đơn giản nhưng cực kỳ quan trọng — hiểu sai là hooks sẽ không hoạt động đúng. Theo tài liệu Anthropic, chỉ có 3 loại exit code có ý nghĩa. Với DataCamp (2025), đây là khái niệm cơ bản nhất cần nắm trước khi viết hook.

Exit Code Ý nghĩa Hành vi Blocking?
0 Thành công Tiếp tục bình thường. stdout được truyền lại cho Claude. Không
2 Block Chặn hành động. stderr được gửi cho Claude như feedback. Có (chỉ với blocking events)
Khác (1, 3, ...) Lỗi (non-blocking) Ghi nhận lỗi nhưng KHÔNG chặn hành động. Hook được coi là failed. Không

Điểm then chốt: Exit code 2 chỉ có tác dụng với blocking events. Nếu bạn return exit 2 từ một non-blocking event như PostToolUse, nó sẽ bị bỏ qua — hành động đã xảy ra rồi, không thể “chữa” được nữa.

Và lưu ý: khi exit code là 0, nội dung stdout của hook được truyền lại cho Claude Code như context bổ sung. Điều này rất hữu ích — bạn có thể inject thông tin vào conversation từ hook.

[IMAGE: Diagram showing exit code flow 0 success 2 block other error with arrows — claude code hooks exit codes flow diagram]

Hooks Trong Skills — Frontmatter YAML

Ngoài cấu hình trong settings.json, hooks còn có thể được định nghĩa trong YAML frontmatter của Skills. Theo Anthropic Hooks Guide, đây là cách tạo portable hooks gắn liền với một skill cụ thể. Cách này đặc biệt hữu ích khi bạn muốn chia sẻ skill kèm hooks cho team.

Tại sao lại cần định nghĩa hooks trong skills? Vì đôi khi một hook chỉ có ý nghĩa trong context của một skill cụ thể. Ví dụ, skill “blog-write” cần hook auto-format HTML, nhưng skill “debug” thì không.

---
name: blog-write
description: Write a blog post following ongboit.com standards
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
  - Grep
hooks:
  PostToolUse:
    - matcher: "Write|Edit"
      type: command
      command: "npx prettier --write $CLAUDE_FILE_PATH 2>/dev/null || true"
  PreToolUse:
    - matcher: "Write"
      type: command
      command: "bash ~/.claude/hooks/protect-sensitive.sh"
---

## Blog Writing Instructions

Write Vietnamese blog posts following GEO rules...
(phần instructions còn lại)

Ưu điểm của hooks trong skills:

  • Portable: Hook đi cùng với skill — chia sẻ skill thì chia sẻ luôn hooks
  • Scoped: Hook chỉ chạy khi skill đang active, không ảnh hưởng global
  • Override: Hooks từ skill có thể override hooks từ settings.json

Mình thích dùng hooks trong skills hơn settings.json cho các task cụ thể. Ví dụ, skill “blog-write” có hook auto-format HTML, còn skill “code-review” thì không cần. Cách này giữ settings.json sạch sẽ và dễ quản lý hơn.

Claude Code Skills

Debugging Hooks — Khi Nào Hooks Không Chạy?

Hooks không chạy là một trong những vấn đề thường gặp nhất, theo kinh nghiệm của mình và cộng đồng trên GitHub. Với 24 events và nhiều cấp cấu hình, việc debug đôi khi khá khó. Theo DataCamp (2025), đa số lỗi hooks nằm ở 5 nguyên nhân phổ biến.

Lệnh /hooks — Kiểm Tra Nhanh

Cách nhanh nhất để kiểm tra hooks đã cấu hình đúng chưa: gõ /hooks trong Claude Code. Lệnh này hiển thị tất cả hooks đang active, bao gồm cả nguồn gốc (user, project, local, skill).

# Trong Claude Code terminal, gõ:
/hooks

# Output sẽ hiển thị:
# Active hooks:
#   PreToolUse (Bash): command - bash ~/.claude/hooks/block-dangerous.sh [user]
#   PostToolUse (Write|Edit): command - npx prettier --write ... [project]
#   Notification (): command - notify-send ... [local]

5 Nguyên Nhân Phổ Biến Và Cách Khắc Phục

Vấn đề Nguyên nhân Cách fix
Hook không chạy JSON syntax sai Validate JSON với jq . settings.json
Hook chạy nhưng không có effect Matcher regex sai Test regex riêng, nhớ case-sensitive
Hook bị vô hiệu hóa disableAllHooks: true Kiểm tra settings.json có flag này không
Hook timeout Script chạy quá lâu Giữ script dưới 10 giây, dùng async nếu cần
Permission denied Script không có quyền chạy chmod +x script.sh

Vô Hiệu Hóa Hooks Tạm Thời

Đôi khi bạn cần tắt hooks để debug. Thêm flag này vào settings.json:

{
  "disableAllHooks": true
}

Lưu ý: Nhớ tắt flag này sau khi debug xong. Dễ quên lắm — mình đã từng để nguyên cả tuần mà không biết.

[IMAGE: Debug checklist flowchart for hooks not working — claude code hooks debugging troubleshooting checklist]

Câu Hỏi Thường Gặp (FAQ)

Claude Code Hooks là gì?
Claude Code Hooks là shell commands, HTTP requests, prompt evaluations, hoặc agent handlers tự động chạy tại các điểm cụ thể trong lifecycle của Claude Code. Khác với CLAUDE.md chỉ là gợi ý, hooks được OS thực thi trực tiếp — đảm bảo 100% deterministic. Có 24 hook events và 4 handler types, cấu hình trong settings.json.
Hooks khác gì với CLAUDE.md?
CLAUDE.md là “gợi ý” — LLM đọc và có thể bỏ qua. Hooks là “bắt buộc” — OS chạy trực tiếp, không qua LLM. CLAUDE.md phù hợp cho coding conventions và style guides. Hooks phù hợp cho automation như auto-format, security gates, và logging. Cả hai bổ sung cho nhau, không thay thế nhau.
Hooks có làm chậm Claude Code không?
Blocking hooks (như PreToolUse) có thể làm chậm vì Claude Code phải đợi kết quả. Non-blocking hooks chạy song song nên không ảnh hưởng hiệu năng. Để giữ hooks nhanh, giữ script dưới 10 giây và tránh các operations nặng như network calls trong blocking hooks.
Exit code 2 hoạt động như thế nào?
Khi hook return exit code 2, hành động bị chặn và nội dung stderr được gửi lại cho Claude Code như feedback. Claude sẽ thấy message lỗi và có thể tìm cách khác. Exit code 2 chỉ có tác dụng với blocking events như PreToolUse, PermissionRequest, Stop. Với non-blocking events, exit code 2 bị bỏ qua.
Làm sao biết hooks đang chạy?
/hooks trong Claude Code để xem tất cả hooks đang active và nguồn gốc của chúng (user, project, local, skill). Ngoài ra, bạn có thể thêm hook logging — ghi log mỗi khi hook chạy để theo dõi. Nếu hooks không hiển thị trong /hooks, kiểm tra JSON syntax và đường dẫn file.
Có thể dùng Python thay cho Bash không?
Có. Command handler chạy bất kỳ lệnh shell nào, bao gồm python3 script.py. Python hữu ích cho logic phức tạp hơn — xử lý JSON, regex phức tạp, hoặc gọi API. Chỉ cần đảm bảo script return đúng exit code: 0 (ok), 2 (block), hoặc khác (error).
Hooks có hoạt động trên Windows không?
Có, nhưng cần lưu ý. Trên Windows, Claude Code chạy trong bash (Git Bash hoặc WSL). Các script .sh chạy bình thường qua bash. Với PowerShell commands, dùng powershell -Command "...". Một số Unix utilities như notify-send không có sẵn trên Windows — cần thay bằng PowerShell tương đương.
Nên bắt đầu với hook nào trước?
Bắt đầu với 2 hooks: (1) PreToolUse + Bash matcher để chặn lệnh nguy hiểm, và (2) PostToolUse + Write|Edit matcher để auto-format. Hai hooks này cover 80% use case và cho bạn làm quen với hệ thống. Sau đó mở rộng dần sang notification, logging, và các event khác.
Claude Code giá bao nhiêu

Kết Luận

Claude Code Hooks là tính năng giúp bạn chuyển từ “hy vọng Claude Code làm đúng” sang “đảm bảo Claude Code làm đúng”. Với 24 hook events và 4 handler types, bạn có thể tự động hóa gần như mọi khía cạnh của workflow — từ format code, chặn lệnh nguy hiểm, đến notification khi task hoàn thành.

Sau 3 tháng sử dụng, mình không thể quay lại làm việc không có hooks. Nó giống như làm việc không có Git vậy — về lý thuyết thì được, nhưng thực tế thì không ai muốn.

Bắt đầu đơn giản: thêm một PreToolUse hook để chặn lệnh nguy hiểm, và một PostToolUse hook để auto-format. Hai hooks này mất chưa đến 5 phút để setup nhưng tiết kiệm hàng giờ mỗi tuần. Từ đó, mở rộng dần theo nhu cầu của bạn.

Nếu bạn chưa quen với Claude Code là gì, đọc bài giới thiệu trước. Nếu đã sẵn sàng, Skills là bước tiếp theo để xây dựng workflow hoàn chỉnh, kết hợp với hooks để có hệ thống automation đầy đủ. Tham khảo roadmap đầy đủ để chọn learning path phù hợp.

Claude Code SEO

Similar Posts