📖 Nội dung bài học
Có nhiều hook khác ngoài các hook PreToolUse và PostToolUse đã thảo luận trong khóa học này. Ngoài ra còn có:
Notification- Chạy khi Claude Code gửi thông báo. Điều này xảy ra khi Claude cần quyền sử dụng một tool, hoặc sau 60 giây Claude Code không hoạt động.Stop- Chạy khi Claude Code hoàn thành phản hồi.SubagentStop- Chạy khi một subagent (được hiển thị dưới dạng "Task" trong UI) đã hoàn thành.PreCompact- Chạy trước khi một thao tác compact diễn ra, có thể là thủ công hoặc tự động.UserPromptSubmit- Chạy khi người dùng gửi prompt, trước khi Claude xử lý nó.SessionStart- Chạy khi bắt đầu hoặc tiếp tục một session.SessionEnd- Chạy khi một session kết thúc.
Đây là phần gây nhầm lẫn:
- Đầu vào stdin cho các lệnh của bạn sẽ thay đổi tùy thuộc vào loại hook đang được thực thi (
PreToolUse,PostToolUse,Notification, v.v.). - Trường
tool_inputtrong đó sẽ khác nhau tùy thuộc vào tool đã được gọi (trong trường hợp của các hookPreToolUsevàPostToolUse).
Ví dụ, đây là một mẫu đầu vào stdin cho một hook. Hook này là PostToolUse theo dõi việc sử dụng tool TodoWrite. Để tham khảo, đó là tool mà Claude sử dụng để theo dõi các mục cần làm.
{
"session_id": "9ecf22fa-edf8-4332-ae85-b6d5456eda64",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "PostToolUse",
"tool_name": "TodoWrite",
"tool_input": {
"todos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
},
"tool_response": {
"oldTodos": [],
"newTodos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
}
}
Và để so sánh, đây là ví dụ về đầu vào cho hook Stop:
{
"session_id": "af9f50b6-f042-4773-b3e2-c3a4814765ce",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "Stop",
"stop_hook_active": false
}
Như bạn có thể thấy, đầu vào stdin cho lệnh của bạn sẽ khác biệt đáng kể tùy thuộc vào hook (PreToolUse, PostToolUse, Stop, v.v.) và bộ lọc được sử dụng (trong trường hợp của PreToolUse và PostToolUse). Điều này có thể làm cho việc viết hook trở nên thử thách - bạn có thể không biết cấu trúc chính xác của đầu vào cho lệnh của mình!
Để giải quyết thách thức này, hãy thử tạo một hook trợ giúp như sau:
"PostToolUse": [ // Hoặc "PreToolUse" hoặc "Stop", v.v.
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "jq . > post-log.json"
}
]
},
]
Lưu ý lệnh được cung cấp. Lệnh này sẽ ghi đầu vào cho hook này vào tệp post-log.json. Điều này cho phép bạn kiểm tra chính xác những gì sẽ được đưa vào lệnh của bạn! Điều này giúp bạn dễ dàng hơn nhiều để hiểu dữ liệu nào mà lệnh của bạn nên kiểm tra.
🔁 Bài học liên quan
- Bài tiếp: The Claude Code SDK
- Bài trước: Useful hooks!
- 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-in-action/312427
- © 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