claude-code-notifier
cách hoạt động hướng dẫn câu hỏi thường gặp
◐Tiếng Việt
English العربية Deutsch Español Français עברית Italiano 日本語 한국어 Nederlands Polski Português (Brasil) Русский Türkçe Tiếng Việt 简体中文 繁體中文
Bắt đầu
Tất cả hướng dẫn

Giải thích hook trong Claude Code: mọi sự kiện và công dụng của chúng

Cập nhật ngày 31 tháng 10 năm 2026 · 7 phút đọc
trong trang này 01Cấu trúc của một hook 02Hook nằm ở đâu 03Các loại handler 04Matcher 05Input: hook của bạn nhận được gì 06Output: exit code và JSON 07Tất cả hook event 08Những event quan trọng cho thông báo 09Claude Code Notifier nằm ở đâu trong bức tranh này 10Câu hỏi thường gặp

Hook của Claude Code là các lệnh (hoặc HTTP call, prompt và một vài loại handler khác) mà Claude Code tự động chạy tại những thời điểm cố định trong một phiên, chẳng hạn trước khi một tool chạy, khi cần cấp quyền hoặc khi Claude trả lời xong. Bạn khai báo chúng dưới key hooks trong một file settings như ~/.claude/settings.json. Mỗi hook nhận JSON mô tả sự kiện qua stdin và có thể phản hồi bằng exit code hoặc một object JSON trên stdout, nhờ đó nó có thể ghi log, gửi thông báo, chặn một hành động hoặc trả lời thay bạn.

01Cấu trúc của một hook

Cấu hình hook gồm ba cấp:

  1. Hook event, ví dụ PreToolUse hoặc Stop.
  2. Matcher group, dùng để lọc khi nào hook được kích hoạt, ví dụ "chỉ với tool Bash".
  3. Một hoặc nhiều hook handler, tức thứ thực sự được chạy.
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "/path/to/lint-check.sh"
          }
        ]
      }
    ]
  }
}

Ví dụ này chạy một script lint sau khi Claude ghi hoặc sửa file. Để thêm event thứ hai, hãy thêm một key ngang hàng trong cùng object hooks.

02Hook nằm ở đâu

FilePhạm vi áp dụngChia sẻ được không?
~/.claude/settings.jsonTất cả project của bạnKhông, chỉ trên máy bạn
.claude/settings.jsonMột projectCó, có thể commit
.claude/settings.local.jsonMột projectKhông
Managed policy settingsTổ chức của bạnDo admin thiết lập
hooks/hooks.json của pluginKhi plugin đang được bậtCó

Hook từ các file khác nhau được cộng dồn chứ không ghi đè nhau. Gõ /hooks trong Claude Code để xem mọi hook đang hoạt động và nguồn gốc của chúng.

Trong phiên tương tác, Claude Code sẽ tạm giữ các hook, kể cả hook của chính bạn, cho đến khi bạn chấp nhận hộp thoại workspace trust cho thư mục đó.

03Các loại handler

Phần lớn hook là "type": "command", tức chạy một lệnh shell. Ngoài ra còn bốn loại khác:

  • http: POST JSON của event tới một URL và đọc response body.
  • mcp_tool: gọi một tool trên MCP server mà bạn đã cấu hình.
  • prompt: hỏi model Claude một câu hỏi single-turn và đọc quyết định dạng JSON.
  • agent: khởi chạy một subagent có thể đọc file trước khi quyết định (thử nghiệm).

Command hook chạy với toàn bộ quyền của user, thông qua sh -c trên macOS và Linux, và Git Bash (hoặc PowerShell) trên Windows. Thêm "async": true để chạy hook ở chế độ nền; khi đó nó không thể đưa ra quyết định nữa.

04Matcher

matcher quyết định những lần xảy ra nào của event sẽ chạy hook. Giá trị được so khớp tùy theo event: tên tool với các tool event, loại thông báo với Notification, cách phiên bắt đầu với SessionStart, v.v.

  • "*", "" hoặc không có matcher đều khớp với mọi thứ.
  • Chữ cái, chữ số, _, -, dấu cách, | và , được hiểu là tên chính xác. Edit|Write khớp với một trong hai tool.
  • Mọi giá trị khác được coi là regular expression của JavaScript, nên mcp__memory__.* khớp với mọi tool của một MCP server.

Matcher phân biệt hoa thường. Một số event, bao gồm Stop và UserPromptSubmit, bỏ qua matcher. Với các tool event, trường if chứa một permission rule như "Bash(git *)" giúp thu hẹp phạm vi của từng handler hơn nữa.

05Input: hook của bạn nhận được gì

Mọi hook đều nhận JSON qua stdin với một số trường chung, gồm session_id, transcript_path, cwd và hook_event_name, cùng các trường riêng của từng event. Ví dụ, hook PreToolUse cho một lệnh Bash sẽ nhận thêm tool_name và tool_input.command. Đọc dữ liệu bằng jq hoặc bất kỳ JSON parser nào:

#!/bin/bash
input=$(cat)
cmd=$(jq -r '.tool_input.command // empty' <<<"$input")
echo "Claude wants to run: $cmd" >> ~/claude-commands.log
exit 0

06Output: exit code và JSON

Hook phản hồi lại theo một trong hai cách.

Exit code. 0 là thành công. 2 là lỗi chặn: với các event có thể chặn, hành động sẽ dừng lại và nội dung stderr của bạn trở thành lý do. Mọi code khác, kể cả 1 quen thuộc, đều là lỗi không chặn, nên hành động vẫn tiếp tục và bạn chỉ thấy thông báo lỗi hook. Nếu hook dùng để áp đặt một quy tắc, hãy exit 2, đừng dùng 1.

JSON trên stdout. Exit 0 và in ra một object JSON duy nhất để kiểm soát chi tiết hơn. Một số field dùng được ở mọi nơi, ví dụ continue: false để dừng hẳn Claude. Số khác thì tùy event: Stop dùng decision: "block" kèm reason, còn PreToolUse và PermissionRequest đặt quyết định bên trong hookSpecificOutput. Đừng in gì khác ra stdout: chỉ một dòng thừa từ shell profile cũng khiến Claude Code không đọc được JSON.

07Tất cả hook event

EventKhi nào chạyChặn được không?
SessionStartMột session bắt đầu hoặc được tiếp tụcKhông (thêm context)
SetupKhởi chạy với --init-only, hoặc --init / --maintenance cùng -pKhông
InstructionsLoadedMột file CLAUDE.md hoặc .claude/rules/*.md được loadKhông
UserPromptSubmitBạn gửi prompt, trước khi Claude nhận đượcCó
UserPromptExpansionMột lệnh được gõ được mở rộng thành promptCó
PreToolUseTrước mọi tool callCó
PermissionRequestMột tool call cần quyết định cấp quyềnCho phép hoặc từ chối qua JSON
PermissionDeniedAuto mode từ chối một tool callKhông
PostToolUseSau khi tool call thành côngKhông (tool đã chạy rồi)
PostToolUseFailureSau khi tool call thất bạiKhông
PostToolBatchSau một loạt tool call song song, trước lần gọi model tiếp theoCó
NotificationClaude Code gửi thông báoKhông
MessageDisplayTrong lúc hiển thị văn bản trả lời của ClaudeKhông (có thể thay đổi nội dung hiển thị)
SubagentStart / SubagentStopMột subagent bắt đầu hoặc kết thúcChỉ SubagentStop
TaskCreated / TaskCompletedMột task được tạo hoặc đánh dấu hoàn thànhCó
StopClaude trả lời xongCó (giữ Claude tiếp tục chạy)
StopFailureLượt kết thúc với lỗi APIKhông
TeammateIdleMột thành viên trong agent team sắp chuyển sang idleCó
ConfigChangeMột file settings thay đổi trong sessionCó
CwdChangedThư mục làm việc thay đổiKhông
DirectoryAddedMột thư mục được thêm bằng /add-dirKhông
FileChangedMột file đang được theo dõi thay đổi trên ổ đĩaKhông
WorktreeCreate / WorktreeRemoveMột worktree được tạo hoặc xóaCó
PreCompact / PostCompactTrước và sau khi nén contextChỉ PreCompact
PreModelSwitch / PostModelSwitchTrước và sau khi đổi modelChỉ PreModelSwitch
Elicitation / ElicitationResultKhi một MCP server yêu cầu nhập liệu và sau khi bạn trả lờiCó
SessionEndKhi một phiên kết thúcKhông

Anthropic thỉnh thoảng bổ sung event mới, nên hãy xem tài liệu tham khảo về hook để biết danh sách hiện tại và các trường input của từng event.

08Những event quan trọng cho thông báo

Bốn event sau gần như bao quát mọi thứ bạn muốn được báo:

  • Stop cho "Claude đã xong". Xem hướng dẫn về Stop hook.
  • Notification cho "Claude đang chờ bạn", với các loại như permission_prompt và idle_prompt. Xem hướng dẫn về Notification hook.
  • PermissionRequest để được báo, hoặc trả lời, ngay khi cần cấp quyền. Xem hướng dẫn về PermissionRequest.
  • PreToolUse trên tool AskUserQuestion, để xem hoặc trả lời các câu hỏi trắc nghiệm của Claude. Xem trả lời câu hỏi từ điện thoại.

Nếu muốn có sẵn cấu hình desktop để dán vào, hãy bắt đầu với cách nhận thông báo khi Claude Code chạy xong.

09Claude Code Notifier nằm ở đâu trong bức tranh này

Claude Code Notifier được xây dựng hoàn toàn dựa trên các hook này. Công cụ dòng lệnh miễn phí của nó, ccn, chạy trên Mac, Windows và Linux. Khi cài đặt, nó thêm bảy hook vào ~/.claude/settings.json, mỗi hook chạy ccn hook, và tạo một bản sao lưu file một lần. ccn chỉ chạy vài mili giây cho mỗi event rồi thoát, nên không có gì chạy nền cả.

Khi dùng riêng, nó hiển thị thông báo trên desktop. Khi ghép nối với app iPhone hoặc Android, chính các hook đó sẽ gửi câu trả lời của bạn ngược lại: cho phép hoặc từ chối quyền, trả lời câu hỏi, hoặc gửi chỉ dẫn tiếp theo sau khi Claude dừng. Đây là công cụ độc lập, không phải do Anthropic phát triển. Nếu bạn chỉ cần ghi log hoặc chạy lint, tự viết vài dòng sẽ đơn giản hơn. Chi tiết có trên trang ccn.

10Câu hỏi thường gặp

Làm sao test hook mà không phải chờ Claude?

Pipe JSON mẫu vào script và kiểm tra exit code: echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh; echo $?. Sau đó chạy /hooks trong Claude Code để xác nhận hook đã được đăng ký đúng event.

Tại sao hook của tôi không chạy?

Nguyên nhân thường gặp là JSON không hợp lệ trong settings.json (dấu phẩy thừa ở cuối, comment), matcher không khớp chính xác (có phân biệt hoa thường), script chưa có quyền thực thi, hoặc thư mục bạn chưa trust. Khởi động Claude Code bằng claude --debug và đọc debug log để xem cái gì đã chạy. Danh sách đầy đủ có trong checklist khắc phục sự cố.

Làm sao tạm tắt toàn bộ hook?

Đặt "disableAllHooks": true trong một file settings. Để bỏ qua hook chỉ cho một lần chạy, khởi động Claude Code với --settings '{"disableAllHooks": true}'. Không có công tắc tắt riêng từng hook; bạn phải xóa entry của nó. Cả hai cách đều không tắt được các hook do tổ chức của bạn đặt trong managed settings.

Timeout mặc định của hook là bao lâu?

Mười phút (600 giây) cho hook dạng command, HTTP và MCP tool, 30 giây cho prompt hook và 60 giây cho agent hook. Một số event dùng mặc định ngắn hơn, và bạn có thể đặt timeout (tính bằng giây) cho bất kỳ handler nào.

Claude Code Notifier Nhận push trên điện thoại khi Claude Code chạy xong hoặc cần bạn, rồi duyệt, từ chối hoặc trả lời ngay tại đó. Công cụ dòng lệnh ccn miễn phí trên Mac, Windows và Linux.
Tải cho iOS Tải cho Android Cài đặt ccn

Hướng dẫn liên quan

  • Cách nhận thông báo khi Claude Code chạy xongDùng Stop hook cho trạng thái "đã xong" và Notification hook cho "cần bạn nhập". Cấu hình copy-paste cho Mac, Windows và Linux, kèm cảnh báo trên điện thoại.
  • Notification hook của Claude Code: khi nào kích hoạt và cách dùngKhi nào Notification hook của Claude Code kích hoạt, permission_prompt và idle_prompt nghĩa là gì, input nó nhận được, và vì sao nó chờ một lúc mới kích hoạt.
  • Stop hook của Claude Code: chạy lệnh khi Claude làm xongCách Stop hook của Claude Code hoạt động, nó nhận input gì, cách chạy lệnh khi Claude làm xong và cách để Claude tiếp tục làm việc một cách an toàn.
  • Trả lời yêu cầu cấp quyền từ hook (PermissionRequest)Cách PermissionRequest hook của Claude Code hoạt động, cách cho phép hoặc từ chối bằng script, và vì sao permission rule thường là lựa chọn tốt hơn.
claude-code-notifier

Claude Code Notifier là ứng dụng độc lập của bên thứ ba. Ứng dụng không liên kết với, không được chứng thực hay tài trợ bởi Anthropic, PBC. "Claude" và "Claude Code" là nhãn hiệu của Anthropic, PBC.

ứng dụng Ứng dụng iOS Ứng dụng Android ccn cho macOS, Windows & Linux Tất cả hướng dẫn
pháp lý Chính sách quyền riêng tư Điều khoản dịch vụ Ngôn ngữ khác © 2026 touchtap. Bảo lưu mọi quyền. TouchTap Ltd được đăng ký tại Anh và xứ Wales, số công ty 13942589.