Chuyển đến nội dung chính

Claude Code Hooks: Hướng dẫn thực hành tự động hóa quy trình làm việc

Tìm hiểu cách tự động hóa dựa trên hook hoạt động và bắt đầu dùng Claude Code hooks để tự động hóa các tác vụ mã hóa như kiểm thử, định dạng và nhận thông báo.
Đã cập nhật 5 thg 6, 2026  · 15 phút đọc

Khi làm việc với Claude Code, bạn sẽ nhận ra một vấn đề quen thuộc: Công cụ viết mã tốt nhưng quên những bước quan trọng như định dạng, chạy kiểm thử hoặc tuân thủ các quy trình bảo mật. Bạn lại phải nhắc đi nhắc lại cùng một điều.

Claude Code Hooks cho phép bạn tự động hóa các lời nhắc này bằng cách chạy lệnh shell tự động tại các thời điểm cụ thể trong quy trình làm việc.

Hướng dẫn này chỉ cho bạn cách thiết lập hooks cho định dạng mã, chạy kiểm thử, gửi thông báo và bảo vệ tệp. Bạn sẽ xây dựng một hệ thống tự động hóa thực thi tiêu chuẩn phát triển của mình một cách nhất quán mà không cần can thiệp thủ công.

Để tìm hiểu thêm về mô hình ngôn ngữ lớn (LLM) cung cấp sức mạnh cho Claude Code, hãy xem bài viết về Claude Sonnet 4.5. Tôi cũng gợi ý bạn xem hướng dẫn Moltbot (Clawdbot) và hướng dẫn Claude Cowork.

Claude Code Hooks là gì?

Claude Code Hooks là các lệnh shell chạy tự động khi những sự kiện cụ thể xảy ra trong phiên viết mã bằng AI của bạn. Hãy coi chúng như các kích hoạt tự động thực thi script tuỳ chỉnh của bạn tại những thời điểm chính xáctrước khi Claude ghi tệp, sau khi nó chạy lệnh, hoặc khi nó gửi thông báo cho bạn.

Hệ thống hoạt động bằng cách giám sát các hành động của Claude Code và đối chiếu chúng với các quy tắc bạn định nghĩa trong một tệp cấu hình. Khi có sự khớp, lệnh bạn chỉ định sẽ chạy với quyền truy cập vào ngữ cảnh về những gì vừa xảy ra. Điều này cho bạn quyền kiểm soát hành vi của Claude và cho phép bạn tự động hóa các tác vụ lặp lại vốn dĩ cần thao tác thủ công.

Dưới đây là một hook cơ bản chạy công cụ định dạng mã mỗi khi Claude ghi một tệp Python:

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

Hook này có ba phần: 

  • Sự kiện: PostToolUse (sau khi Claude hoàn tất một hành động)

  • Trình khớp (matcher): Write (chỉ khi ghi tệp)

  • Lệnh: python -m black . (định dạng các tệp Python trong thư mục hiện tại)

Hook nhận thông tin chi tiết về hành động vừa diễn ra của Claude thông qua dữ liệu JSON gửi vào đầu vào của script, vì vậy bạn có thể xây dựng các tự động hóa tinh vi hơn phản hồi theo những thay đổi tệp cụ thể.

Nếu bạn quan tâm đến tự động hóa ngoài quy trình viết mã, Claude Cowork cung cấp khả năng tự động hóa tương tự có trợ giúp AI cho các tác vụ tệp và tài liệu.

Tiếp theo, chúng ta sẽ tìm hiểu cách tạo các hook như vậy từ đầu và đăng ký chúng trong Claude Code để bổ sung vào quy trình làm việc của bạn.

Điều kiện tiên quyết

Trước khi đi sâu vào Claude Code Hooks, bạn cần chuẩn bị vài thứ:

  • Cài đặt và chạy Claude Code: Bạn nên quen dùng Claude Code cho các tác vụ mã hóa cơ bản

  • Quen dòng lệnh: Hooks chạy lệnh shell, vì vậy bạn cần biết cách viết các lệnh terminal cơ bản cho hệ điều hành của mình

  • Truy cập trình soạn thảo văn bản: Bạn sẽ chỉnh sửa các tệp cấu hình JSON để thiết lập hooks

  • Thư mục dự án: Một dự án mã hóa nơi bạn có thể thử nghiệm hooks an toàn mà không ảnh hưởng đến công việc quan trọng

Bạn không cần là chuyên gia shell scripting, nhưng hiểu cách chạy các lệnh như ls, cd và các thao tác tệp cơ bản sẽ giúp bạn theo dõi ví dụ. Nếu bạn mới làm quen bash hoặc terminal, tôi khuyến nghị học khóa Introduction to Shell của chúng tôi.

Bắt đầu với Claude Code Hooks

Giờ bạn đã hiểu hook là gì, hãy thiết lập tự động hóa đầu tiên. Quy trình gồm chọn sự kiện phù hợp với nhu cầu, cấu hình một quy tắc đơn giản và thử nghiệm với một lệnh cơ bản.

Tìm hiểu các sự kiện hook

Claude Code cung cấp mười sự kiện khác nhau nơi bạn có thể chạy lệnh. Mỗi sự kiện kích hoạt tại một thời điểm cụ thể, cho bạn quyền kiểm soát các phần khác nhau trong quy trình làm việc:

PreToolUsePostToolUse là hai sự kiện phổ biến nhất. PreToolUse chạy trước khi Claude thực hiện một hành động như ghi tệp hoặc chạy lệnh, rất phù hợp để xác thực hoặc chặn thao tác nguy hiểm. PostToolUse chạy sau khi Claude hoàn tất hành động, hiệu quả cho tác vụ dọn dẹp như định dạng mã hoặc chạy kiểm thử.

UserPromptSubmit kích hoạt khi bạn gửi prompt cho Claude, trước khi xử lý yêu cầu. Bạn có thể dùng để thêm ngữ cảnh vào cuộc hội thoại hoặc kiểm tra prompt đáp ứng các yêu cầu nhất định.

Notification chạy khi Claude gửi cảnh báo, như xin quyền chạy lệnh hoặc cần bạn nhập liệu. PermissionRequest kích hoạt khi Claude Code hiển thị hộp thoại quyền, cho phép bạn tự động chấp thuận hoặc từ chối thay mặt người dùng.

StopSubagentStop kích hoạt khi Claude kết thúc phản hồi, hữu ích cho các kiểm tra cuối cùng hoặc tạo báo cáo. Khác biệt là Stop bắn khi Claude hoàn thành phản hồi tổng thể, còn SubagentStop xảy ra khi một trợ lý do công cụ tạo ra (“subagent”) hoàn thành công việc.

Các sự kiện còn lại, PreCompactSessionStart, xử lý các tình huống đặc biệt như dọn lịch sử hội thoại và khởi tạo phiên.

Các sự kiện còn lại, PreCompact, SessionStart, và SessionEnd, xử lý các tình huống theo vòng đời. PreCompact chạy ngay trước khi Claude rút gọn lịch sử hội thoại. ‘SessionStart’ bắn khi bắt đầu phiên mới để thiết lập mặc định, và SessionEnd kích hoạt khi phiên đóng, cho phép dọn dẹp hoặc báo cáo cuối.

Tên sự kiện

Thời điểm kích hoạt

Trường hợp sử dụng chính

PreToolUse

Trước khi Claude thực hiện một hành động (ví dụ: ghi tệp, chạy lệnh).

Xác thực hành động hoặc chặn thao tác nguy hiểm.

PostToolUse

Sau khi Claude hoàn tất một hành động.

Tác vụ dọn dẹp, định dạng mã hoặc chạy kiểm thử.

UserPromptSubmit

Khi bạn gửi một prompt, trước khi bắt đầu xử lý.

Thêm ngữ cảnh vào hội thoại hoặc kiểm tra yêu cầu của prompt.

Notification

Khi Claude gửi cảnh báo (ví dụ: xin nhập liệu hoặc xin quyền).

Xử lý cảnh báo hệ thống và yêu cầu thu hút sự chú ý của người dùng.

PermissionRequest

Khi hộp thoại quyền được hiển thị.

Tự động chấp thuận hoặc từ chối thay mặt người dùng.

Stop

Khi Claude kết thúc phản hồi tổng thể.

Kiểm tra cuối cùng hoặc tạo báo cáo cho phản hồi chính.

SubagentStop

Khi một trợ lý do công cụ tạo ra ("subagent") hoàn thành công việc.

Kiểm tra cuối cùng dành riêng cho hoạt động của subagent.

PreCompact

Ngay trước khi lịch sử hội thoại được rút gọn.

Quản lý dọn dẹp hội thoại và bảo toàn ngữ cảnh.

SessionStart

Ở đầu một phiên mới.

Khởi tạo và thiết lập mặc định.

SessionEnd

Khi phiên đóng.

Dọn dẹp cuối cùng hoặc báo cáo cuối phiên.

Tìm hiểu về matchers

Matchers là các bộ lọc quyết định hành động nào của Claude Code sẽ kích hoạt hook. Về mặt kỹ thuật, chúng là chuỗi được diễn giải như biểu thức chính quy, vì vậy bạn có thể dùng khớp chính xác hoặc mẫu linh hoạt hơn. 

Các matcher phù hợp nhất thường đơn giản như Write (kích hoạt khi Claude ghi tệp) hoặc Edit (khi chỉnh sửa nội dung), và các kết hợp như Edit|Write để bao phủ nhiều hành động. 

Bạn cũng có thể dùng mẫu tiền tố như Notebook.* để khớp tất cả công cụ bắt đầu bằng “Notebook.” Nếu muốn hook kích hoạt cho mọi hành động, hãy dùng regex phổ quát .*, chuỗi rỗng ("") hoặc để trống matcher.

Vì matchers phân biệt chữ hoa/thường và chỉ tác động đến tên hành động, tốt nhất bạn nên giữ chúng càng cụ thể càng tốt. Khi cần kiểm soát chi tiết hơn (ví dụ, giới hạn hook cho một số loại tệp), bạn có thể đọc payload JSON mà Claude truyền vào hook và áp dụng regex hoặc điều kiện của riêng bạn ở đó.

Tạo hook đầu tiên trong Claude Code

Claude Code cung cấp hai cách thiết lập hooks: qua lệnh tương tác /hooks hoặc chỉnh sửa trực tiếp tệp cấu hình. Hãy bắt đầu với cách tương tác vì thân thiện với người mới hơn.

Sử dụng lệnh /hooks:

  1. Mở Claude Code và gõ /hooks trong giao diện trò chuyện

  2. Chọn sự kiện kích hoạt (chọn PostToolUse cho ví dụ này)

  3. Chọn "Add new hook" từ menu

  4. Đặt mẫu matcher (nhập Write để nhắm tới hành động ghi tệp)

  5. Nhập lệnh của bạn:

    • Mac: say "Task complete"

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

    • Linux: spd-say "Task complete"

  6. Lưu cấu hình và quay lại Claude Code bằng cách nhấn Esc ba lần

Lệnh /hooks sẽ tự động cập nhật tệp thiết lập của bạn và tải lại cấu hình. Bạn cũng có thể dùng /hooks bất cứ lúc nào để xem các hook hiện có hoặc chỉnh sửa.

Nếu bạn thích chỉnh sửa tệp cấu hình trực tiếp, hooks nằm trong ~/.claude/settings.json cho thiết lập toàn cục hoặc .claude/settings.json trong thư mục dự án của bạn. Với ví dụ ở trên, tệp sẽ trông như sau:

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

Sau khi chỉnh sửa tệp thủ công, hãy khởi động lại Claude Code hoặc dùng lệnh /hooks để tải lại cấu hình. Giờ mỗi khi Claude ghi tệp, bạn sẽ nghe thông báo âm thanh.

Kiểm thử hook của bạn

Trước khi tiếp tục, hãy xác minh hook thực sự hoạt động:

  1. Yêu cầu Claude viết bất kỳ tệp Python nào (ví dụ: "Tạo tệp hello.py in ra hello world")

  2. Bạn sẽ nghe thông báo âm thanh khi Claude hoàn tất thao tác ghi

  3. Nếu không nghe thấy gì, hãy kiểm tra bản ghi (transcript) của Claude Code bằng cách nhấn Ctrl-O để xem thông báo lỗi

  4. Các vấn đề thường gặp gồm lệnh hook không tìm thấy, quyền tệp sai hoặc lỗi cú pháp trong tệp cấu hình

Khi kiểm thử cơ bản này chạy ổn, bạn sẽ tiết kiệm thời gian gỡ lỗi về sau khi xây dựng các hook phức tạp hơn. Nếu bạn vừa sửa tệp thiết lập thủ công, thay đổi matcher hoặc sự kiện, hoặc cài công cụ mới để dùng trong lệnh hook, việc mở lại /hooks hoặc khởi động lại Claude để tải lại cấu hình có thể hữu ích.

Mẫu cơ bản này—sự kiện, matcher, lệnh—là nền tảng cho mọi tự động hóa bằng hook. Bạn có thể mở rộng bằng cách thêm nhiều lệnh chạy đồng thời khi cùng một sự kiện kích hoạt. Ví dụ, bạn có thể vừa phát âm thanh vừa tạo bản sao lưu khi Claude ghi tệp. 

Bạn cũng có thể tạo các matcher riêng cho các công cụ khác nhau trong cùng một sự kiện, để việc ghi tệp kích hoạt hành động khác với chỉnh sửa mã. Tất cả hooks khớp cùng một mẫu công cụ sẽ chạy song song. Nếu bạn cấu hình nhiều matcher cho cùng một sự kiện, mỗi hook sẽ chạy khi matcher tương ứng được kích hoạt.

Làm việc với đầu vào của Hook

Khi Claude Code kích hoạt một hook, nó gửi thông tin về những gì vừa xảy ra qua đầu vào tiêu chuẩn (stdin), một luồng dữ liệu chảy trực tiếp đến lệnh của bạn khi nó chạy. Dữ liệu này giúp hooks trở nên mạnh mẽ thay vì chỉ là các script ngẫu nhiên chạy vào những thời điểm bất kỳ. 

Claude Code đóng gói thông tin này thành JSON và truyền cho bất kỳ lệnh nào bạn đã cấu hình, dù đó là một lệnh terminal đơn giản hay một script tuỳ chỉnh.

Cấu trúc đầu vào hook

Mỗi hook nhận một đối tượng JSON với các trường cơ bản về phiên hiện tại:

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

Hãy diễn giải từng thành phần:

  • session_id: nhận diện cuộc trò chuyện hiện tại của bạn

  • transcript_path: trỏ đến lịch sử hội thoại

  • cwd: cho biết thư mục làm việc

  • hook_event_name: cho biết sự kiện nào đã bắn

Có được ngữ cảnh này cho phép hooks đưa ra quyết định thông minh: bạn có thể theo dõi cuộc trò chuyện nào kích hoạt hành động, truy cập toàn bộ lịch sử chat nếu cần, hoặc chạy lệnh trong đúng thư mục.

Biến thể đầu vào theo sự kiện

Các sự kiện công cụ như PreToolUsePostToolUse bao gồm chi tiết bổ sung về hành động, đây là nơi hooks thực sự hữu ích cho tự động hóa. Trong PreToolUse, có tool_input, và thêm tool_response trong 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
  }
}

Trong đầu vào hook, file_path hiển thị đường dẫn của tệp đang được ghi hoặc chỉnh sửa, trong khi content chứa chính xác nội dung công cụ sắp ghi. Sau khi thực thi, phản hồi của công cụ lặp lại filePath (lưu ý camelCase) để xác nhận tệp nào thực sự bị tác động, cùng cờ success cho biết thao tác có hoàn tất chính xác hay không. 

Thông tin chi tiết này giúp hooks phản hồi khác nhau tùy theo những gì thực sự xảy ra. Bạn có thể chỉ định dạng các tệp Python, chỉ sao lưu các thư mục quan trọng, hoặc chỉ gửi thông báo khi một số loại tệp nhất định được sửa đổi.

Các sự kiện như UserPromptSubmit đơn giản hơn vì chúng không liên quan đến công cụ:

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

Lưu ý rằng hook UserPromptSubmit không dùng matcher trong cấu hình. Chúng kích hoạt trên mọi prompt, không phải thao tác công cụ. Điều này rất phù hợp để ghi log hội thoại, tự động thêm ngữ cảnh dự án, hoặc kiểm tra prompt trước khi Claude xử lý.

Đọc đầu vào hook trong thực tế

Hãy tạo một hook ghi log mọi prompt của người dùng. Điều này giải quyết vấn đề quên những gì bạn đã yêu cầu Claude làm, nhất là trong các phiên mã hóa dài. Trước tiên, cấu hình hook:

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

Tiếp theo, tạo script Python tại ~/.claude/log_prompts.py với nội dung sau:

#!/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)

Script đọc dữ liệu JSON mà Claude Code gửi và ghi log prompt kèm ngữ cảnh phiên. Điều này tạo ra lịch sử có thể tìm kiếm cho các tương tác của bạn, rất hữu ích khi bạn cần nhớ cách đã giải một vấn đề sau hàng tuần.

Làm việc với đầu ra của Hook

Sau khi lệnh hook của bạn chạy, nó cần cho Claude Code biết điều gì đã xảy ra và có nên tiếp tục bình thường hay không. Cơ chế kiểm soát này biến hooks từ công cụ ghi log đơn giản thành tự động hóa quy trình làm việc mạnh mẽ có thể định hướng hành vi của Claude. Việc này diễn ra qua ba kênh: đầu ra tiêu chuẩn (stdout), lỗi tiêu chuẩn (stderr) và mã thoát.

Kênh đầu ra và mã thoát

Đầu ra tiêu chuẩn (stdout) là đầu ra bình thường. Chẳng hạn, nếu bạn in ra, nội dung sẽ đi vào stdout. Với hầu hết hooks, đây là những gì xuất hiện trong bản ghi của Claude Code khi bạn nhấn Ctrl-O, cho bạn một ghi chép về việc tự động hóa đã làm gì mà không làm lộn xộn cuộc hội thoại chính.

Lỗi tiêu chuẩn (stderr) là các thông báo lỗi. Bạn có thể ghi vào stderr bằng 

  • Python: print("message", file=sys.stderr) hoặc

  • Dòng lệnh: echo "message" >&2

Khác biệt chính là stderr có thể được gửi trực tiếp cho Claude để xử lý tự động, cho phép nó phản hồi các vấn đề mà hooks phát hiện.

Mã thoát cho Claude Code biết cần làm gì tiếp theo:

  • Mã thoát 0: Thành công (hiển thị stdout cho người dùng)

  • Mã thoát 2: Lỗi chặn (gửi stderr cho Claude)

  • Mã thoát 3: Trì hoãn thực thi (chỉ ra rằng lệnh đã hoàn tất không lỗi, nhưng hiệu ứng sẽ hoãn đến khi đáp ứng điều kiện bổ sung) 

  • Mã khác: Lỗi không chặn (hiển thị stderr cho người dùng, nhưng vẫn tiếp tục)

Hệ thống này cho bạn quyền kiểm soát chi tiết khi nào Claude nên dừng, tiếp tục, hoặc nhận phản hồi về những gì tự động hóa của bạn phát hiện. Hãy xem ví dụ cho hai mã thoát quan trọng nhất.

Mã thoát 0: Hoạt động bình thường

Hầu hết hooks dùng mã thoát 0 để biểu thị mọi thứ ổn. Dưới đây là một hook hoàn chỉnh ghi log thao tác tệp và thông báo cho người dùng:

{
  "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')\""
          }
        ]
      }
    ]
  }
}

Hook này chạy hai thao tác: ghi log vào tệp, rồi in một thông báo vào bản ghi. Có nhiều cách để làm việc này, nhưng cách tiếp cận này đa nền tảng và tránh phụ thuộc vào chi tiết dòng lệnh.

Vì không có mã thoát tường minh, mặc định là 0. Thông báo được in sẽ xuất hiện trong bản ghi của Claude Code, cho bạn phản hồi rằng việc ghi log đã thành công. Mẫu này rất phù hợp để xây dựng dấu vết kiểm toán hoặc theo dõi những thay đổi Claude tạo ra trong dự án theo thời gian.

Mã thoát 2: Chặn kèm phản hồi

Mã thoát 2 gửi thông điệp lỗi của bạn trực tiếp cho Claude, cho phép nó phản hồi tự động. Đây là lúc hooks trở thành cơ chế an toàn thay vì chỉ tự động hóa. Dưới đây là một hook chặn thao tác tệp nguy hiểm:

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

Bạn sẽ cần tạo script kiểm tra bảo mật tại ~/.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

Khi hook này phát hiện đường dẫn nguy hiểm, nó thoát với mã 2. Claude Code gửi thông điệp stderr cho Claude, sau đó Claude có thể giải thích cho bạn vì sao thao tác bị chặn và gợi ý phương án thay thế. Điều này ngăn ngừa hư hại ngoài ý muốn tới tệp hệ thống đồng thời giúp Claude nắm được chính sách bảo mật của bạn.

Xây dựng Hook thông báo thông minh cho Claude Code

Hãy xây dựng hook thông báo được cải tiến kết hợp xử lý đầu vào với xử lý đầu ra thông minh. Điều này giải quyết vấn đề “ồn ào” từ hook ban đầu vốn cảnh báo mọi thay đổi tệp:

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

Tạo script thông báo tại ~/.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)

Hook này đọc đầu vào để biết tệp nào được sửa, đưa ra quyết định về mức độ quan trọng của thông báo dựa trên loại tệp, dùng stdout để ghi lại các thay đổi quan trọng vào bản ghi, kích hoạt các cảnh báo âm thanh khác nhau theo loại tệp, và luôn thoát với mã 0 vì đây là hành động cung cấp thông tin, không phải chặn.

Sự kết hợp giữa phân tích đầu vào và kiểm soát đầu ra tạo ra một hook hành xử thông minh theo ngữ cảnh, đồng thời cung cấp mức phản hồi phù hợp cho cả bạn và Claude Code. Thay vì nhận thông báo khó chịu cho mọi tệp tạm, bạn chỉ nghe về những thay đổi thực sự quan trọng với dự án.

Lưu ý ví dụ này dùng lệnh say, có sẵn trên macOS. Trên Linux, bạn có thể dùng notify-send, và trên Windows, một lệnh PowerShell, để đạt thông báo tương tự.

Mẫu nâng cao cho Claude Code Hooks

Vượt ra ngoài thông báo và ghi log cơ bản, hooks có thể giải quyết các vấn đề quy trình phát triển mà đội ngũ gặp hằng ngày. Dưới đây là vài ý tưởng bạn có thể điều chỉnh cho dự án của mình.

Điều tuyệt vời là bạn không nhất thiết phải tự viết các hook này. Bạn chỉ cần đưa cho Claude Code một trong các ý tưởng prompt bên dưới, kèm theo tài liệu tham chiếu Hooks, và nó sẽ tạo mã và JSON cấu hình tương ứng.

Mỗi mẫu dưới đây có thể tùy biến theo công cụ và quy trình của bạn. Hãy bắt đầu với những mẫu giải quyết các phiền toái thường ngày lớn nhất, rồi mở rộng tự động hóa khi bạn quen với phát triển hook.

Hooks nâng cao cho bảo mật và tuân thủ

Trình quét khóa API

  • Vấn đề: Vô tình đưa bí mật lên hệ thống quản lý phiên bản

  • Kích hoạt: Trước khi ghi bất kỳ tệp nào

  • Giải pháp: Quét nội dung tệp tìm khóa API, token và mật khẩu bằng regex

“Tạo một script Python đọc JSON đầu vào của hook, trích xuất nội dung tệp và dùng regex để phát hiện các định dạng bí mật phổ biến như api_key=, token:, hoặc password=.  Với mọi kết quả nghi ngờ, hãy xác minh cục bộ và không bao giờ gửi thô bí mật ra bên ngoài. 

Chỉ gửi trích đoạn đã che (ví dụ, giữ 4 ký tự đầu/cuối) hoặc hash tới Anthropic API để phân tích chuỗi nghi ngờ và xác định chúng là bí mật thực hay chỉ là tên biến. Thoát với mã 2 và cung cấp phản hồi cho Claude về bí mật phát hiện được và phương án an toàn hơn.”

Bắt buộc tiêu đề giấy phép

  • Vấn đề: Dự án nguồn mở thiếu tiêu đề giấy phép bắt buộc trong tệp mới

  • Kích hoạt: Trước khi ghi các tệp mã nguồn

  • Giải pháp: Xác thực rằng các tệp .py, .js, .java mới có kèm văn bản giấy phép thích hợp

“Phân tích đầu vào hook để lấy nội dung tệp và kiểm tra xem 10 dòng đầu có chứa văn bản giấy phép bằng so khớp chuỗi hay không. Với xác thực tinh vi hơn, gửi phần header tệp tới Claude qua Anthropic API để xác minh có chứa thông báo bản quyền và thông tin giấy phép phù hợp. Chặn tạo tệp với mã thoát 2 nếu thiếu header, và cung cấp cho Claude mẫu giấy phép đúng để thêm vào.”

Bảo vệ tệp sản xuất

  • Vấn đề: Vô tình sửa đổi tệp cấu hình hệ thống quan trọng

  • Kích hoạt: Trước khi chỉnh sửa tệp trong thư mục nhạy cảm

  • Giải pháp: Chặn thay đổi với /etc/, nginx.conf, database.yml và cấu hình quan trọng khác

“Trích xuất đường dẫn tệp từ JSON đầu vào của hook và kiểm tra xem có khớp các mẫu như /etc/, production.yml, hoặc tên tệp quan trọng khác không. Dùng API của Claude để phân tích đường dẫn tệp và xác định liệu đó có phải tệp cấu hình có thể ảnh hưởng hệ thống sản xuất hay không. Thoát với mã 2 và cung cấp hướng dẫn cụ thể về thực hành phát triển an toàn khi phát hiện đường dẫn nguy hiểm.”

Trình tối ưu hóa hình ảnh

  • Vấn đề: Tệp ảnh lớn làm chậm ứng dụng và kho mã

  • Kích hoạt: Sau khi thêm tệp ảnh mới

  • Giải pháp: Nén tệp PNG/JPEG đồng thời duy trì chất lượng hiển thị

“Phân tích đầu vào hook để lấy đường dẫn tệp và kiểm tra có phải tệp ảnh bằng cách khớp phần mở rộng hay không. Chạy công cụ nén như imageoptim hoặc gọi TinyPNG API để nén ảnh trong khi vẫn giữ chất lượng. Ghi kết quả nén vào stdout để bạn thấy mức tiết kiệm kích thước tệp trong bản ghi của Claude.”

Hooks nâng cao cho tự động hóa quản lý phiên bản

Trình kiểm tra nhánh Git

  • Vấn đề: Thành viên đội ngũ vô tình đẩy thay đổi lên nhánh được bảo vệ

  • Kích hoạt: Trước mọi thao tác ghi hoặc chỉnh sửa tệp

  • Giải pháp: Kiểm tra nhánh Git hiện tại và chặn thao tác trên main/master/production

“Dùng lệnh bash đơn giản git branch --show-current để lấy tên nhánh hiện tại và so sánh với danh sách nhánh được bảo vệ. Nếu đang ở nhánh được bảo vệ, thoát với mã 2 và gửi thông báo lỗi cho Claude giải thích chính sách bảo vệ nhánh. Với quy tắc đặt tên nhánh phức tạp, dùng API của Claude để phân tích tên nhánh và xác định liệu có khớp mẫu bảo vệ hay không.”

Tự động commit thông minh

  • Vấn đề: Quên commit thay đổi hoặc viết thông điệp commit kém

  • Kích hoạt: Sau bất kỳ sửa đổi tệp nào

  • Giải pháp: Tự động stage và commit thay đổi với thông điệp mô tả do AI tạo

“Đọc đường dẫn tệp đã sửa từ đầu vào hook, chạy git diff để lấy thay đổi, và gửi diff tới API của Claude với prompt yêu cầu một thông điệp commit ngắn gọn. Dùng thông điệp được tạo với lệnh git addgit commit để tự động commit thay đổi. Bao gồm tên tệp và loại thay đổi trong prompt gửi API để đảm bảo thông điệp commit tuân chuẩn “conventional commits”.”

Trình tạo tài liệu

  • Vấn đề: Tài liệu API không đồng bộ với thay đổi mã

  • Kích hoạt: Sau khi sửa các tệp giao diện (controllers, models, APIs)

  • Giải pháp: Tự động chạy công cụ tạo tài liệu như JSDoc, Sphinx, hoặc OpenAPI

“Kiểm tra đường dẫn tệp đã sửa để xác định đó có phải endpoint API, model hoặc tệp giao diện bằng so khớp mẫu. Gửi nội dung tệp tới API của Claude, yêu cầu trích xuất thay đổi API và tạo cập nhật tài liệu. Chạy công cụ tạo tài liệu phù hợp (jsdoc, sphinx-build, v.v.) và tự động commit tài liệu đã cập nhật.

Hooks nâng cao cho cộng tác và tích hợp quy trình

Tích hợp Slack

  • Vấn đề: Đội ngũ không hay biết những thay đổi quan trọng trong mã nguồn chung

  • Kích hoạt: Khi gửi thông báo cho các thao tác quan trọng

  • Giải pháp: Đăng thông điệp định dạng sẵn lên kênh đội ngũ với tên tệp và tóm tắt thay đổi

“Trích xuất thông tin tệp từ đầu vào hook và lọc theo các loại tệp quan trọng như mã nguồn hoặc tệp cấu hình. Dùng API của Claude để tạo tóm tắt dễ đọc về những gì đã thay đổi dựa trên tên và loại tệp. Gửi thông điệp đã định dạng đến Slack bằng webhook với gắn thẻ thành viên cho các thay đổi quan trọng.”

Bộ điều phối webhook

  • Vấn đề: Kích hoạt pipeline CI/CD thủ công gây trì hoãn triển khai

  • Kích hoạt: Khi xảy ra sự kiện cụ thể (thay đổi cấu hình, sửa tệp triển khai)

  • Giải pháp: Gọi API bên ngoài để kích hoạt build, deploy hoặc quy trình tự động khác

“Đối chiếu đường dẫn tệp đã sửa với các mẫu như Dockerfile, package.json, hoặc cấu hình triển khai để xác định có nên kích hoạt CI/CD hay không. Dùng thư viện requests trong Python để gọi webhook kèm header xác thực và payload về thay đổi. Bao gồm đường dẫn và metadata thay đổi trong payload để hệ thống bên ngoài có thể đưa ra quyết định thông minh về những gì cần build hoặc deploy.”

Cập nhật trang trạng thái

  • Vấn đề: Khách hàng không biết về hoạt động bảo trì hoặc triển khai

  • Kích hoạt: Khi các tệp triển khai hoặc hạ tầng được sửa

  • Giải pháp: Cập nhật trang trạng thái dịch vụ với thông báo bảo trì

“Phân tích đầu vào hook để tìm thay đổi tệp hạ tầng như manifest Kubernetes hoặc cấu hình Terraform bằng mẫu đường dẫn tệp. Tạo thông báo bảo trì bằng API của Claude dựa trên loại thay đổi hạ tầng phát hiện được. Đăng cập nhật trạng thái lên các dịch vụ như StatusPage.io hoặc PagerDuty bằng REST API của họ với loại sự cố và thời lượng ước tính phù hợp.”

Trình thông báo trạng thái đội ngũ

  • Vấn đề: Xung đột khi nhiều lập trình viên làm cùng một tính năng mà không biết nhau

  • Kích hoạt: Khi bắt đầu một phiên Claude Code mới

  • Giải pháp: Cảnh báo các kênh đội ngũ rằng bạn bắt đầu làm việc trên dự án hoặc thành phần cụ thể

“Đọc thư mục dự án từ đầu vào hook và dùng API của Claude để phân tích các tệp gần đây hoặc lịch sử git nhằm hiểu loại công việc đang thực hiện. Gửi thông điệp định dạng sẵn tới kênh liên lạc của đội với tên bạn, tên dự án và khu vực trọng tâm. Bao gồm thời lượng ước tính và mời các thành viên phối hợp nếu họ làm các tính năng liên quan.”

Kết luận

Claude Code Hooks biến trợ lý mã hóa AI khó đoán thành các quy trình tự động chạy đúng lúc bạn cần. Trong hướng dẫn này, bạn đã học cách thiết lập hooks bằng cả lệnh tương tác /hooks và cấu hình thủ công, hiểu dữ liệu đầu vào JSON giúp tự động hóa thông minh, và kiểm soát hành vi của Claude qua mã thoát và đầu ra có cấu trúc. 

Các mẫu thực tế chúng ta đề cập gồm các bộ xác thực bảo mật chặn thao tác nguy hiểm và thông báo thông minh giảm nhiễu. Những ví dụ này cho thấy hooks giải quyết vấn đề phát triển thực tế đồng thời cho bạn toàn quyền kiểm soát trợ lý AI. Giờ bạn đã nắm vững nền tảng, hãy xây dựng tự động hóa phù hợp với nhu cầu quy trình của đội ngũ bạn. 

Để tìm hiểu thêm về cách làm việc với công cụ AI, hãy xem khóa Understanding Prompt Engineering của DataCamp, khóa này bao quát các chiến lược prompt làm việc trực tiếp với phát triển hook. Để có kỹ năng mã hóa AI rộng hơn, hãy thử khóa Intermediate ChatGPT để phát triển các kỹ năng giúp trợ lý AI trở thành đối tác đáng tin cậy hơn trong quy trình phát triển của bạn.

Claude Code Hooks FAQs

Claude Code Hooks là gì?

Claude Code Hooks là các trình kích hoạt tự động thực thi lệnh shell khi những sự kiện cụ thể xảy ra trong phiên Claude Code của bạn. Chúng giải quyết vấn đề Claude viết mã tốt nhưng quên các bước quan trọng như định dạng, chạy kiểm thử hoặc kiểm tra bảo mật. Thay vì phải nhắc thủ công mỗi lần, hooks tự động hóa những lời nhắc này bằng cách chạy lệnh tự động: Ví dụ, định dạng mã Python sau khi Claude ghi, chạy kiểm thử sau khi sửa đổi, hoặc chặn thay đổi nguy hiểm vào tệp nhạy cảm. Hooks theo dõi phiên của bạn, phát hiện sự kiện khớp và thực thi các lệnh đã cấu hình với quyền truy cập vào ngữ cảnh chi tiết về những gì Claude vừa làm.

Làm thế nào để dùng hooks trong Claude Code?

Bạn có thể thiết lập hooks theo hai cách. Cách dễ nhất là dùng lệnh tương tác /hooks trong Claude Code, hướng dẫn bạn chọn sự kiện (như PostToolUse), mẫu matcher (như Write cho hành động ghi tệp), và lệnh (như python -m black .). Ngoài ra, bạn có thể chỉnh sửa thủ công cấu hình tại ~/.claude/settings.json (toàn cục) hoặc .claude/settings.json (riêng dự án) để định nghĩa hooks ở dạng JSON. Khi đã cấu hình, hooks sẽ được tải và hoạt động tự động. Bạn có thể xem, sửa hoặc tải lại hooks bất cứ lúc nào bằng cách chạy /hooks hoặc khởi động lại Claude Code.

Sự khác nhau giữa hooks PreToolUse và PostToolUse là gì?

PreToolUse chạy trước khi Claude thực thi một hành động (như ghi hoặc chỉnh sửa tệp), rất lý tưởng để xác thực và chặn thao tác nguy hiểm. Bạn có thể kiểm tra những gì Claude sắp làm và dừng lại nếu cần bằng cách thoát với mã 2. PostToolUse chạy sau khi Claude hoàn tất một hành động, rất phù hợp cho tác vụ dọn dẹp như định dạng mã, chạy kiểm thử hoặc ghi lại những gì đã xảy ra. Dùng PreToolUse khi bạn cần kiểm soát phòng ngừa và PostToolUse khi bạn cần tự động hóa phản ứng.

Làm thế nào để truyền thông tin về việc Claude vừa làm cho script hook của tôi?

Claude Code gửi thông tin chi tiết qua đầu vào tiêu chuẩn (stdin) dưới dạng JSON, chứa ngữ cảnh như đường dẫn tệp, nội dung đang được ghi, ID phiên, và nhiều hơn nữa. Script hook của bạn đọc JSON này bằng json.load(sys.stdin) trong Python hoặc phương thức tương tự ở ngôn ngữ khác. Payload JSON này cho phép hook đưa ra quyết định thông minh, ví dụ, chỉ định dạng tệp Python bằng cách kiểm tra phần mở rộng, hoặc chặn sửa đổi các thư mục cụ thể bằng cách kiểm tra đường dẫn tệp.

Mã thoát 2 có tác dụng gì và khi nào nên dùng?

Mã thoát 2 cho Claude Code biết rằng một thao tác cần bị chặn, và nó gửi thông điệp lỗi của bạn (ghi vào stderr) trực tiếp cho Claude. Sau đó Claude có thể giải thích vấn đề cho bạn và gợi ý phương án thay thế. Hãy dùng mã 2 cho các kiểm tra bảo mật (chặn sửa đổi tệp nguy hiểm), xác thực tuân thủ (thiếu header bắt buộc) hoặc cổng an toàn (ngăn commit lên nhánh được bảo vệ). Với hooks chỉ mang tính thông tin và không bao giờ nên chặn thao tác, hãy dùng mã 0 hoặc mã khác.


Bex Tuychiev's photo
Author
Bex Tuychiev
LinkedIn

Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt nhàm chán. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, và đang ấp ủ thêm một khóa nữa. Nội dung của tôi đã tiếp cận hơn 5 triệu lượt xem, trong đó có 20 nghìn người trở thành người theo dõi trên cả Medium và LinkedIn. 

Chủ đề

Khóa học về AI Tạo sinh

Courses

Tìm hiểu kỹ thuật viết lệnh (Prompt Engineering)

1 giờ
201.3K
Học cách viết prompt hiệu quả với ChatGPT để áp dụng ngay vào quy trình làm việc của bạn.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow