Hooks và tự động hóa
Kết nối các hook SessionStart để tự động tải ngữ cảnh. Sử dụng PreToolUse để chặn các lệnh nguy hiểm. Chạy Claude theo cron với các cổng phê duyệt.
Hooks là các lệnh mà Claude Code chạy tại các sự kiện vòng đời cụ thể. Cấu hình một lần trong ~/.claude/settings.json; chúng tự động kích hoạt. Hooks thực thi kỷ luật mà bạn có thể quên: tải STATE.md mỗi phiên, kiểm tra các tệp .env đã được dàn dựng trước khi commit. Chi phí thiết lập là 10 phút. Lợi ích là vĩnh viễn.
SessionStart kích hoạt ngay khi một phiên mở; bất cứ thứ gì nó in ra sẽ trở thành ngữ cảnh trước tin nhắn đầu tiên của bạn:
{
"hooks": {
"SessionStart": [
{
"command": "cat ~/notes/STATE.md ~/notes/MEMORY.md 2>/dev/null || true"
}
]
}
}|| true rất quan trọng: không làm gián đoạn việc bắt đầu phiên nếu thiếu tệp. Giữ các hook dưới 50ms và không thực hiện cuộc gọi mạng khi mở phiên. Cần dữ liệu API mới? Chạy một cron ghi một tệp cục bộ; tải tệp đó trong hook.
Bốn sự kiện hook khác:
Stop: kích hoạt khi một phiên kết thúc. Sử dụng cho lời nhắc: "Trước khi bạn đóng: cập nhật STATE.md."
PreToolUse: kích hoạt trước khi Claude gọi một công cụ. Lớp thực thi bảo mật của bạn: chặn các lệnh nguy hiểm, ghi nhật ký các cuộc gọi để kiểm tra. Exit 0 cho phép cuộc gọi; exit 2 chặn nó.
PostToolUse: kích hoạt sau khi một công cụ trả về. Chạy một linter sau khi ghi tệp, kiểm tra các chính sách RLS sau khi di chuyển SQL.
UserPromptSubmit: kích hoạt khi bạn nhấn enter. Chèn ngữ cảnh hoặc áp dụng các biện pháp phòng thủ chống chèn lời nhắc cho nội dung bên ngoài.
Một hook PreToolUse chặn bất kỳ lệnh Bash nào chứa rm -rf:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'rm -rf'; then echo 'BLOCKED: rm -rf not allowed' >&2; exit 2; fi"
}
]
}
}Trường matcher nhắm mục tiêu một công cụ cụ thể. Nếu không có nó, hook sẽ kích hoạt trên mọi cuộc gọi công cụ. Sử dụng matchers để giữ các hook nhanh và có mục tiêu.
Khi một hook không kích hoạt, hãy kiểm tra theo thứ tự:
Cú pháp: JSON hợp lệ? Chạy cat ~/.claude/settings.json | python3 -m json.tool.
Đường dẫn tệp: kiểm tra lệnh hook thủ công trong terminal của bạn.
Mã thoát: có thiếu || true không?
Tốc độ: hơn 3 giây? Chuyển phần chậm sang một cron.
Hai vấn đề trong sản xuất. Đặt một trường timeout rõ ràng trên mỗi hook để hành vi vẫn có thể dự đoán được. Và các hook chạy trong một môi trường bị tước bỏ, không phải shell đầy đủ của bạn: nếu một hook cần một biến môi trường (như mã thông báo Slack), hãy nguồn .env của bạn một cách rõ ràng trong lệnh hook. Đây là nguyên nhân phổ biến nhất khiến các hook hoạt động trong terminal của bạn nhưng âm thầm thất bại trong Claude Code.
Claude Code được điều khiển bằng Cron. Cùng một tác nhân có thể chạy theo lịch trình thông qua claude --headless: một bản tóm tắt buổi sáng lúc 7 giờ sáng được đăng lên Slack, giám sát mạng xã hội cứ sau 4 giờ, kiểm tra tình trạng triển khai cứ sau 30 phút.
Mẫu quan trọng: cổng phê duyệt. Cron soạn thảo, bạn xem xét, hệ thống gửi. Một tác nhân tự động gửi tin nhắn đi mà không xem xét cuối cùng sẽ gửi sai: sai mẫu, sai đối tượng, sai thời điểm. Kiến trúc: tác nhân khám phá và soạn thảo, con người xem xét và phát hành. Triển khai: tác nhân viết bản nháp vào một kênh Slack; không có gì được gửi đi cho đến khi con người phê duyệt. Điều này mở rộng ra hàng chục tác nhân mà không có bất kỳ tác nhân nào trở nên mất kiểm soát.
Xây dựng hệ thống hook theo từng giai đoạn:
Giai đoạn 1 (tuần 1-2), tải hook: SessionStart tải STATE.md và MEMORY.md; Stop nhắc bạn cập nhật.
Giai đoạn 2 (tuần 3-4), hook bảo vệ: PreToolUse chặn cứng các lệnh không thể đảo ngược (force-push to main, DROP TABLE, rm -rf).
Giai đoạn 3 (tháng 2+), hook kiểm tra: PostToolUse kiểm tra những gì thực sự đã được viết: các migration SQL thiếu chính sách RLS, các tuyến API mới thiếu giới hạn tốc độ, bí mật trong bất kỳ tệp nào đã viết.
PostToolUse mạnh hơn PreToolUse cho các cuộc kiểm tra vì nó đọc nội dung tệp đã viết, sự thật cơ bản, không chỉ những gì Claude dự định. Xây dựng các hook xung quanh các chế độ lỗi thực tế của bạn: hai hook giải quyết các vấn đề thực tế tốt hơn mười hook lý thuyết.
SessionStart tải ngữ cảnh, Stop nhắc nhở, PreToolUse chặn các lệnh nguy hiểm (exit 2), PostToolUse kiểm tra những gì đã được viết, và cron cộng với các cổng phê duyệt biến Claude thành một hệ thống theo lịch trình với một con người trên nút gửi. Bắt đầu với một hook: cat ~/notes/STATE.md 2>/dev/null || true trong SessionStart. Thêm giai đoạn tiếp theo mỗi tháng.