ฮุกและระบบอัตโนมัติ
เชื่อมโยงฮุก SessionStart เพื่อโหลดบริบทโดยอัตโนมัติ ใช้ PreToolUse เพื่อบล็อกคำสั่งอันตราย รัน Claude บน cron พร้อมเกตการอนุมัติ
ฮุก (Hooks) คือคำสั่งที่ Claude Code รันในเหตุการณ์วงจรชีวิตที่เฉพาะเจาะจง กำหนดค่าเพียงครั้งเดียวใน ~/.claude/settings.json; มันจะทำงานโดยอัตโนมัติ ฮุกบังคับใช้วินัยที่คุณอาจลืมไป: การโหลด STATE.md ทุกเซสชัน, การตรวจสอบไฟล์ .env ที่ถูกจัดเตรียมไว้ก่อนที่จะคอมมิต ค่าใช้จ่ายในการตั้งค่าคือ 10 นาที ผลตอบแทนคือถาวร
SessionStart ทำงานทันทีที่เซสชันเปิดขึ้น; สิ่งใดก็ตามที่มันพิมพ์จะกลายเป็นบริบทก่อนข้อความแรกของคุณ:
{
"hooks": {
"SessionStart": [
{
"command": "cat ~/notes/STATE.md ~/notes/MEMORY.md 2>/dev/null || true"
}
]
}
}|| true มีความสำคัญ: อย่าทำให้การเริ่มต้นเซสชันล้มเหลวหากไฟล์หายไป รักษาฮุกให้ทำงานภายใน 50 มิลลิวินาทีและอย่าทำการเรียกเครือข่ายเมื่อเปิดเซสชัน ต้องการข้อมูล API ใหม่? รัน cron ที่เขียนไฟล์ในเครื่อง; โหลดไฟล์ในฮุก
อีกสี่เหตุการณ์ฮุก:
Stop: ทำงานเมื่อเซสชันสิ้นสุด ใช้สำหรับการเตือนความจำ: "ก่อนที่คุณจะปิด: อัปเดต STATE.md"
PreToolUse: ทำงานก่อนที่ Claude จะเรียกใช้เครื่องมือ เลเยอร์การบังคับใช้ความปลอดภัยของคุณ: บล็อกคำสั่งอันตราย, บันทึกการเรียกสำหรับการตรวจสอบ ออก 0 อนุญาตการเรียก; ออก 2 บล็อกการเรียก
PostToolUse: ทำงานหลังจากเครื่องมือส่งคืนค่า รัน linter หลังจากเขียนไฟล์, ตรวจสอบนโยบาย RLS หลังจากย้ายข้อมูล SQL
UserPromptSubmit: ทำงานเมื่อคุณกด Enter แทรกบริบทหรือใช้การป้องกันการแทรกพรอมต์สำหรับเนื้อหาภายนอก
ฮุก PreToolUse ที่บล็อกการเรียก Bash ใดๆ ที่มี 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"
}
]
}
}ฟิลด์ matcher กำหนดเป้าหมายเครื่องมือเฉพาะ หากไม่มี ฮุกจะทำงานกับการเรียกเครื่องมือทุกครั้ง ใช้ matchers เพื่อให้ฮุกทำงานเร็วและตรงเป้าหมาย
เมื่อฮุกไม่ทำงาน ให้ตรวจสอบตามลำดับ:
ไวยากรณ์: เป็น JSON ที่ถูกต้องหรือไม่? รัน cat ~/.claude/settings.json | python3 -m json.tool
พาธไฟล์: ทดสอบคำสั่งฮุกด้วยตนเองในเทอร์มินัลของคุณ
รหัสออก: ขาด || true หรือไม่?
ความเร็ว: เกิน 3 วินาทีหรือไม่? ย้ายส่วนที่ช้าไปยัง cron
สองข้อผิดพลาดในการผลิต ตั้งค่าฟิลด์ timeout ที่ชัดเจนในทุกฮุกเพื่อให้พฤติกรรมยังคงคาดเดาได้ และฮุกทำงานในสภาพแวดล้อมที่ถูกตัดทอน ไม่ใช่เชลล์เต็มรูปแบบของคุณ: หากฮุกต้องการตัวแปรสภาพแวดล้อม (เช่น โทเค็น Slack) ให้ระบุ .env ของคุณอย่างชัดเจนในคำสั่งฮุก นี่คือสาเหตุที่พบบ่อยที่สุดของฮุกที่ทำงานในเทอร์มินัลของคุณแต่ล้มเหลวโดยไม่รู้ตัวใน Claude Code
Claude Code ที่ขับเคลื่อนด้วย Cron เอเจนต์เดียวกันสามารถทำงานตามกำหนดเวลาผ่าน claude --headless: สรุปตอนเช้าเวลา 7 โมงเช้าโพสต์ไปยัง Slack, การตรวจสอบโซเชียลมีเดียทุก 4 ชั่วโมง, การตรวจสอบสถานะการปรับใช้ทุก 30 นาที
รูปแบบที่สำคัญ: เกตการอนุมัติ Cron ร่าง คุณตรวจสอบ ระบบส่ง เอเจนต์อิสระที่ส่งข้อความขาออกโดยไม่มีการตรวจสอบจะส่งข้อความผิดพลาดในที่สุด: เทมเพลตผิด, ผู้รับผิด, เวลาผิด สถาปัตยกรรม: เอเจนต์ค้นพบและร่าง, มนุษย์ตรวจสอบและเผยแพร่ การนำไปใช้: เอเจนต์เขียนร่างไปยังช่อง Slack; ไม่มีอะไรออกไปจนกว่ามนุษย์จะอนุมัติ สิ่งนี้สามารถปรับขนาดได้กับเอเจนต์หลายสิบตัวโดยไม่มีใครหลุดโลก
สร้างระบบฮุกเป็นระยะ:
ระยะที่ 1 (สัปดาห์ที่ 1-2), โหลดฮุก: SessionStart โหลด STATE.md และ MEMORY.md; Stop เตือนให้คุณอัปเดต
ระยะที่ 2 (สัปดาห์ที่ 3-4), ฮุกป้องกัน: PreToolUse บล็อกคำสั่งที่ไม่สามารถย้อนกลับได้ (force-push to main, DROP TABLE, rm -rf)
ระยะที่ 3 (เดือนที่ 2+), ฮุกตรวจสอบ: PostToolUse ตรวจสอบสิ่งที่เขียนจริง: การย้ายข้อมูล SQL ที่ขาดนโยบาย RLS, เส้นทาง API ใหม่ที่ขาดการจำกัดอัตรา, ความลับในไฟล์ที่เขียนใดๆ
PostToolUse แข็งแกร่งกว่า PreToolUse สำหรับการตรวจสอบเพราะมันอ่านเนื้อหาไฟล์ที่เขียน ซึ่งเป็นความจริง ไม่ใช่แค่สิ่งที่ Claude ตั้งใจ สร้างฮุกรอบๆ โหมดความล้มเหลวที่แท้จริงของคุณ: ฮุกสองตัวที่แก้ปัญหาจริงดีกว่าสิบตัวที่เป็นทฤษฎี
SessionStart โหลดบริบท, Stop เตือน, PreToolUse บล็อกคำสั่งอันตราย (exit 2), PostToolUse ตรวจสอบสิ่งที่เขียน, และ cron บวกเกตการอนุมัติเปลี่ยน Claude ให้เป็นระบบตามกำหนดเวลาโดยมีมนุษย์เป็นผู้กดปุ่มส่ง เริ่มต้นด้วยฮุกเดียว: cat ~/notes/STATE.md 2>/dev/null || true ใน SessionStart เพิ่มระยะถัดไปทุกเดือน