Hướng dẫn: Dùng hooks trong Claude Code để tự format code và chặn sửa file nhạy cảm
Skill và CLAUDE.md là "lời dặn" cho AI: AI thường làm theo, nhưng không có gì bảo đảm 100%. Với những việc bắt buộc phải xảy ra mọi lần (format code sau khi sửa, không bao giờ đụng vào file .env), Claude Code có một cơ chế chắc chắn hơn: hooks. Hook là lệnh shell do bạn định nghĩa, Claude Code tự chạy ở những thời điểm nhất định, AI không tự quyết định có chạy hay không. CÁC THỜI ĐIỂM HAY DÙNG - PreToolUse: trước khi AI dùng một công cụ (sửa file, chạy lệnh). Dùng để chặn. - PostToolUse: sau khi AI dùng công cụ xong. Dùng để format, chạy lint. - Notification: khi AI đang chờ bạn trả lời hoặc cấp quyền. Dùng để bật thông báo. - SessionStart: khi bắt đầu phiên làm việc. Hook khai báo trong file .claude/settings.json ở thư mục gốc dự án (dùng chung cho team qua git), hoặc ~/.claude/settings.json (áp dụng cho mọi dự án của bạn). VÍ DỤ 1: TỰ FORMAT BẰNG PRETTIER SAU MỖI LẦN AI SỬA FILE File .claude/settings.json: { "hooks": { "PostToolUse": { "matcher": "Edit|Write", "hooks": { "type": "command", "command": "jq -r '.toolinput.filepath' | xargs npx prettier --write" } } } } Giải thích: - matcher "Edit|Write": chỉ chạy sau các công cụ sửa/ghi file. - Claude Code gửi thông tin lần dùng công cụ cho hook dưới dạng JSON qua stdin. Lệnh jq lấy ra đường dẫn file vừa sửa (toolinput.filepath) rồi chuyển cho Prettier. - Cần cài jq trên máy trước. VÍ DỤ 2: CHẶN AI SỬA .env VÀ package-lock.json Bước 1: tạo file .claude/hooks/protect-files.sh !/bin/bash INPUT=$(cat) FILEPATH=$(echo "$INPUT" | jq -r '.toolinput.filepath // empty') FILEPATH="${FILEPATH//\\//}" PROTECTEDPATTERNS=(".env" "package-lock.json" ".git/") for pattern in "${PROTECTEDPATTERNS@}"; do if "$FILEPATH" == "$pattern" ; then echo "Blocked: $FILEPATH matches protected pattern '$pattern'" &2 exit 2 fi done exit 0 Bước 2: trên macOS/Linux, cho phép chạy: chmod +x .claude/hooks/protect-files.sh Bước 3: đăng ký trong .claude/settings.json (gộp chung khối "hooks" với ví dụ 1 nếu dùng cả hai): { "hooks": { "PreToolUse": { "matcher": "Edit|Write", "hooks": { "type": "command", "command": "\"$CLAUDEPROJECTDIR\"/.claude/hooks/protect-files.sh" } } } } Điểm mấu chốt: script thoát với mã 2 thì Claude Code chặn thao tác, và nội dung in ra stderr ("Blocked: ...") được gửi lại cho AI để nó biết vì sao bị chặn và đổi cách làm. THỬ NGHIỆM Nhờ AI "thêm một dòng ghi chú vào file .env". Thao tác sẽ bị chặn trước khi file bị sửa, AI nhận được thông báo Blocked. LƯU Ý - Trên Windows, Claude Code chạy lệnh hook bằng Git Bash, nên cần cài Git for Windows và jq. - Hook chạy với quyền của chính bạn trên máy. Đọc kỹ hook trong các dự án tải về trước khi dùng, giống như đọc một script lạ. - Hook chạy mọi lần nên phải nhanh. Việc nặng như chạy toàn bộ test thì để ở bước khác (ví dụ CI). - Phân biệt rõ: việc cần "khuyên" thì để trong CLAUDE.md hoặc skill, việc cần "bắt buộc" thì dùng hook. Cú pháp có thể thay đổi theo phiên bản, mọi người đối chiếu thêm trang Hooks trong tài liệu chính thức của Claude Code nhé. Ai đang…