📖 Nội dung bài học
Video
Hooks
Hooks cho phép bạn chạy các lệnh tại các thời điểm cụ thể trong vòng đời của Claude Code. Điểm khác biệt chính giữa hooks và những thứ khác được đề cập trong khóa học này là hooks mang tính xác định (deterministic) — chúng luôn luôn chạy.
Tại sao nên dùng Hooks
Bạn có thể bảo Claude trong file CLAUDE.md chạy Prettier sau mỗi lần chỉnh sửa file. Đa số trường hợp nó sẽ làm theo. Nhưng thỉnh thoảng thì không. Một hook sẽ khiến việc đó xảy ra mọi lúc, không có ngoại lệ.
Các trường hợp sử dụng phổ biến bao gồm:
- Tự động định dạng (auto-formatting) sau khi sửa file
- Ghi nhật ký (logging) tất cả các lệnh đã thực thi để tuân thủ quy trình
- Chặn các thao tác nguy hiểm như sửa đổi các file production
- Gửi thông báo cho chính bạn khi Claude hoàn thành một tác vụ
Cách thức hoạt động
Hooks được cấu hình trong file settings.json của bạn. Bạn chọn một sự kiện (event), tùy chọn thiết lập một bộ lọc (matcher) để xác định tool nào sẽ áp dụng, và cung cấp một lệnh (command) để chạy. Các sự kiện hiện có bao gồm:
- PreToolUse — chạy trước khi một tool call được thực hiện
- PostToolUse — chạy sau khi một tool call hoàn tất
- UserPromptSubmit — chạy khi bạn gửi một prompt, trước khi Claude xử lý nó
- Stop — chạy khi Claude kết thúc phản hồi
- Notification — chạy khi Claude gửi một thông báo
Bạn có thể cấu hình chúng thông qua lệnh /hooks bên trong Claude Code, hoặc bằng cách chỉnh sửa trực tiếp file settings.json.

Một ví dụ thực tế
Hook phổ biến nhất: tự động định dạng sau khi chỉnh sửa. Thiết lập một hook PostToolUse với matcher là "Edit|MultiEdit|Write" để nó kích hoạt bất cứ khi nào Claude sửa đổi một file. Lệnh này sẽ kiểm tra phần mở rộng của file và chạy trình định dạng (formatter) phù hợp — Prettier cho TypeScript, gofmt cho Go, hoặc bất cứ thứ gì dự án của bạn sử dụng.
Chặn thao tác với PreToolUse
Các hook PreToolUse có thể chặn các lệnh gọi tool (tool calls) trước khi chúng thực thi. Hook của bạn nhận tên tool và đầu vào (input) dưới dạng JSON qua stdin. Mã thoát (exit code) sẽ quyết định hành vi:
- Exit code 0 — tiếp tục bình thường.
- Exit code 2 — chặn hành động. Thông báo lỗi (stderr) sẽ được gửi ngược lại cho Claude dưới dạng phản hồi (feedback) để nó biết tại sao bị chặn và có thể điều chỉnh.
- Bất kỳ mã thoát nào khác — một lỗi không gây chặn (non-blocking error) sẽ hiển thị cho bạn nhưng không dừng bất cứ thứ gì.
Đây là cách bạn thực thi các quy tắc cứng. Chặn việc ghi vào thư mục cấu hình production. Chặn các lệnh bash có chứa rm -rf. Chặn commit vào nhánh main. Bất cứ điều gì team của bạn cần được đảm bảo, chứ không chỉ là gợi ý.

Chia sẻ Hooks với Team
Hooks được cấu hình trong .claude/settings.json nằm ở cấp độ dự án và có thể được commit vào repo của bạn. Điều này có nghĩa là toàn bộ team của bạn sẽ tự động nhận được các hook giống nhau. Hãy sử dụng biến môi trường CLAUDE_PROJECT_DIR trong các lệnh của bạn để tham chiếu đến các script được lưu trữ trong dự án, giúp chúng hoạt động ổn định bất kể thư mục làm việc hiện tại của Claude là gì.
Tổng kết
Hooks mang lại cho bạn quyền kiểm soát xác định đối với hành vi của Claude Code. Dùng PostToolUse để tự động định dạng và ghi nhật ký. Dùng PreToolUse để chặn các thao tác nguy hiểm. Cấu hình chúng bằng lệnh /hooks hoặc trong settings.json. Và hãy commit chúng vào repo để team của bạn cũng có thể sử dụng.
Nếu việc gì đó cần phải xảy ra mọi lúc mà không được sai sót, đừng đưa nó vào prompt. Hãy đưa nó vào một hook.
🎬 Bản ghi video
Source video:
IkaPHiMDazM
📜 Mở rộng bản ghi (đã chỉnh sửa + dịch AI)
Giới thiệu về Hooks trong Claude Code
Hooks cho phép bạn thực thi các lệnh tại các thời điểm khác nhau trong vòng đời của Claude Code. Điểm khác biệt cốt lõi giữa hooks và những tính năng khác mà chúng ta đã tìm hiểu là tính xác định (deterministic); chúng luôn luôn chạy.
Nói một cách đơn giản: bạn có thể yêu cầu Claude trong file claude.md chạy Prettier sau mỗi lần chỉnh sửa file, và hầu hết mọi lúc nó sẽ thực hiện, nhưng đôi khi thì không. Nó không hoàn hảo. Tuy nhiên, một hook sẽ đảm bảo điều đó xảy ra mọi lúc mà không có ngoại lệ.
Các trường hợp sử dụng phổ biến bao gồm:
- Tự động format sau khi chỉnh sửa file.
- Ghi log tất cả các lệnh đã thực thi để đảm bảo tính tuân thủ (compliance).
- Chặn các thao tác nguy hiểm như sửa đổi các file cấu hình production.
- Gửi thông báo cho chính bạn khi Claude hoàn thành một tác vụ.
Cấu hình Hooks
Hooks được cấu hình trong file settings.json của bạn. Bạn chọn một sự kiện (event), tùy chọn thiết lập một bộ lọc (matcher) để xác định tool use nào sẽ áp dụng, và cung cấp lệnh để thực thi.
Các sự kiện Hook khả dụng
- user_prompt_submit: Chạy khi bạn gửi một prompt, trước khi Claude xử lý nó.
- pre_tool_use: Chạy trước khi một tool call được thực hiện.
- post_tool_use: Chạy sau khi một tool call hoàn tất.
- notification: Chạy khi Claude gửi một thông báo.
- stop: Chạy khi Claude kết thúc phản hồi.
Trường hợp sử dụng phổ biến: Tự động format
Hook phổ biến nhất là tự động format sau khi chỉnh sửa. Bạn thiết lập một hook post_tool_use với matcher là edit hoặc multi_edit. Hook này sẽ kích hoạt bất cứ khi nào Claude sửa đổi một file.
Lệnh này sẽ kiểm tra phần mở rộng của file và chạy trình format tương ứng. Đó có thể là Prettier cho TypeScript, gofmt cho Go, hoặc ruff cho Python—bất kể dự án của bạn đang sử dụng công cụ nào.
An toàn và Chặn các thao tác nguy hiểm
Các hook pre_tool_use có thể chặn các tool call trước khi chúng thực thi. Hook của bạn sẽ nhận tên tool và input JSON thông qua stdin.
- Exit code 0: Nghĩa là cho phép tiếp tục.
- Exit code 2: Nghĩa là hành động bị chặn.
Nếu hook thoát với mã 2, thông báo từ stderr sẽ được gửi ngược lại cho Claude dưới dạng phản hồi (feedback) để Claude biết lý do tại sao thao tác bị chặn và có thể điều chỉnh. Đây là cách bạn thực thi các quy tắc cứng:
- Chặn ghi vào thư mục cấu hình production.
- Chặn các lệnh bash có chứa
rm -rf. - Chặn các commit trực tiếp vào nhánh
main.
Hooks cho phép bạn đảm bảo mọi ràng buộc mà đội ngũ của bạn yêu cầu.
Hooks cấp độ dự án và Cộng tác nhóm
Hooks được cấu hình trong .claude/settings.json là các thiết lập cấp độ dự án và có thể được commit vào repo. Điều này có nghĩa là toàn bộ đội ngũ của bạn sẽ tự động áp dụng các hook giống nhau.
Hãy sử dụng biến môi trường CLAUDE_PROJECT_DIR trong các lệnh của bạn để tham chiếu đến các script được lưu trữ trong dự án, giúp chúng hoạt động ổn định bất kể thư mục làm việc hiện tại của Claude là gì.
Kết luận
Hooks mang lại cho bạn khả năng kiểm soát xác định đối với hành vi của Claude Code. Sử dụng post_tool_use cho việc tự động format và ghi log, và sử dụng pre_tool_use để ngăn chặn các thao tác nguy hiểm. Hãy cấu hình chúng trong phần hooks của settings.json và lưu chúng vào repository để đội ngũ của bạn luôn đồng bộ. Nếu một quy trình cần phải xảy ra mọi lúc mà không được phép sai sót, đừng đưa nó vào prompt; hãy đưa nó vào một hook.
🔁 Bài học liên quan
- Bài tiếp: Course quiz
- Bài trước: MCP
- Cùng section: The CLAUDE.md file · Subagents · Skills
- Thuộc lộ trình: Path C
- Docs tham khảo: Glossary · Skills atlas · By use-case
📚 Nguồn & ghi nhận
- Bài học gốc Anthropic Academy: https://anthropic.skilljar.com/claude-code-101/469798
- © 2025 Anthropic. Chỉ dùng cho mục đích giáo dục, fair-use.
- Crawl: 2026-04-23 · Chuẩn hoá: 2026-05-01