- เพิ่มฟีเจอร์ hooks แบบกำหนดเองโดยผู้ใช้ ใน Claude Code ทำให้สามารถ ควบคุมพฤติกรรมของแอปได้อย่างแม่นยำและทำซ้ำได้สม่ำเสมอ โดยไม่ต้องพึ่งการตัดสินใจของ LLM
- รองรับงานอัตโนมัติหลากหลาย เช่น การปรับแต่งการแจ้งเตือน การฟอร์แมตโค้ดอัตโนมัติ และ การติดตามบันทึกคำสั่ง
- ทำงานได้ในจังหวะต่าง ๆ เช่น ก่อน/หลังการรันคำสั่ง, เมื่อมีการแจ้งเตือน, และเมื่อการตอบกลับเสร็จสิ้น โดยสามารถ จัดการผ่านไฟล์ตั้งค่าในระดับโปรเจกต์, ผู้ใช้, และองค์กร
- ด้วยโครงสร้างไฟล์ตั้งค่าและวิธีจับคู่ (matcher) ทำให้สามารถรันเฉพาะ hooks ที่ต้องการได้ใน ช่วงเวลาที่มีการเรียกใช้เครื่องมือเฉพาะ
- อินพุตถูกส่งในรูปแบบ JSON และ เอาต์พุตใช้ exit code หรือ JSON เพื่อควบคุมผลลัพธ์และฟีดแบ็ก
- hooks จะรัน คำสั่งเชลล์ด้วยสิทธิ์เต็มของผู้ใช้โดยอัตโนมัติ จึงต้องระมัดระวังเรื่องความปลอดภัยและความปลอดภัยในการใช้งาน
บทนำ
- hook ของ Claude Code คือ คำสั่งเชลล์แบบกำหนดเองที่รันอัตโนมัติในแต่ละช่วงของวงจรการทำงานของการรันโค้ด
- ทำให้สามารถสร้าง ระบบอัตโนมัติที่สม่ำเสมอทุกครั้ง แทนการปล่อยให้ LLM เลือกว่าจะรันหรือไม่
-
ตัวอย่างการใช้งานหลัก
- การแจ้งเตือน: ส่งการแจ้งเตือนแบบกำหนดเองให้ผู้ใช้เมื่อรออินพุต
- การฟอร์แมตอัตโนมัติ: รัน
prettier หรือ gofmt อัตโนมัติหลังแก้ไขไฟล์
- การบันทึกล็อก: บันทึกและรวบรวมคำสั่งที่ถูกรันเพื่อนำไปใช้ในการติดตามหรือดีบัก
- ฟีดแบ็ก: ให้ฟีดแบ็กอัตโนมัติเมื่อมีการสร้างโค้ดที่ไม่สอดคล้องกับกฎของโค้ดเบส
- สิทธิ์แบบกำหนดเอง: บล็อกการเปลี่ยนแปลงในไดเรกทอรีที่ละเอียดอ่อนหรือไฟล์ production
- เพราะทำงานเป็นโค้ดระดับระบบ ไม่ใช่พรอมป์ต์ จึง รันอย่างแน่นอนทุกครั้ง → เพิ่มความน่าเชื่อถือของระบบอัตโนมัติ
- hooks จะ รันคำสั่งเชลล์โดยตรงด้วยสิทธิ์เต็มของผู้ใช้ จึงต้องตรวจสอบความปลอดภัยให้ดี
ตัวอย่างการตั้งค่า
- ตัวอย่าง: ลงทะเบียน hook ให้ Claude เขียนล็อกทุกครั้งก่อนรันคำสั่ง Bash
1. เข้าเมนูตั้งค่า hook ด้วยคำสั่ง /hooks แล้วเลือกเหตุการณ์ PreToolUse
2. เพิ่ม matcher Bash (ใช้เฉพาะกับคำสั่ง Bash)
3. ลงทะเบียนและบันทึกคำสั่ง hook (หากเลือกตำแหน่ง User settings จะมีผลกับทุกโปรเจกต์)
4. ตรวจสอบการตั้งค่าด้วย /hooks หรือเปิดดูไฟล์โดยตรงที่ ~/.claude/settings.json
โครงสร้างการตั้งค่า
- hooks จะถูก จัดกลุ่มตาม matcher และแต่ละ matcher สามารถมี hook ได้หลายตัวในรูปแบบอาร์เรย์
- ตัวอย่าง: สตริงเดี่ยว (ตรงกันแบบเป๊ะ), regex หรือปล่อยว่างเพื่อให้ใช้กับทุกเหตุการณ์
- ประเภทของไฟล์ตั้งค่า
~/.claude/settings.json: การตั้งค่าระดับผู้ใช้ทั้งหมด
.claude/settings.json: การตั้งค่าระดับโปรเจกต์
.claude/settings.local.json: การตั้งค่าแบบโลคัล (ไม่แชร์)
- การตั้งค่านโยบายระดับองค์กร
เหตุการณ์ hook หลัก
- PreToolUse: รันก่อนเรียกใช้เครื่องมือ และสามารถบล็อกการทำงานได้หากจำเป็น (matcher หลัก: Bash, Write, Edit, Grep ฯลฯ)
- PostToolUse: รันทันทีหลังเครื่องมือทำงานเสร็จ รองรับ matcher แบบเดียวกัน
- Notification: รันเมื่อมีการส่งการแจ้งเตือน
- Stop: รันหลังการตอบกลับเสร็จสมบูรณ์
ตัวอย่าง matcher
Task: งานของเอเจนต์
Bash: คำสั่งเชลล์
Glob: การจับคู่แพตเทิร์นไฟล์
Grep: ค้นหาเนื้อหา
Read: อ่านไฟล์
Edit, MultiEdit: แก้ไขไฟล์
Write: เขียนไฟล์
WebFetch, WebSearch: งานบนเว็บ
รูปแบบอินพุตและเอาต์พุต
- อินพุต: ส่ง JSON ผ่าน stdin (รวมข้อมูลเซสชันและข้อมูลเฉพาะของแต่ละเหตุการณ์)
- ตัวอย่าง: PreToolUse มี
tool_input และ PostToolUse จะมี tool_response เพิ่มเข้ามา
- เอาต์พุต:
- exit code 0: รันสำเร็จ และ stdout จะแสดงให้ผู้ใช้เห็น
- exit code 2: บล็อกการทำงาน และ stderr จะถูกส่งเป็นฟีดแบ็กให้ Claude (ใน PreToolUse จะเป็นการบล็อกการรันเครื่องมือ)
- โค้ดอื่น ๆ: เป็นข้อผิดพลาด โดยจะแสดงเฉพาะ stderr ให้ผู้ใช้เห็น
- การควบคุมขั้นสูง: หากคืนค่า JSON ทาง stdout ก็สามารถควบคุมโฟลว์อย่างละเอียดได้ เช่น
"continue" เป็น false หรือ "decision": "block"
การผสานรวมกับเครื่องมือ MCP
- รองรับเครื่องมือที่ใช้ Model Context Protocol (MCP) ด้วย และสามารถเลือกกำหนดเป้าหมายได้ผ่านแพตเทิร์นการตั้งชื่อพิเศษ (
mcp____)
คำแนะนำด้านความปลอดภัย
- เนื่องจาก hooks มีความเสี่ยงจากการรันคำสั่งใด ๆ ของระบบ จึงต้องมีกฎด้านความปลอดภัย เช่น การตรวจสอบค่าอินพุต การตรวจเส้นทาง การยกเว้นไฟล์สำคัญ และการใช้พาธแบบสัมบูรณ์
- การเปลี่ยนแปลงการตั้งค่าจะไม่ถูกนำมาใช้ทันที โดยระบบจะใช้ snapshot ตอนเริ่มเซสชัน และจะแสดงคำเตือนหากมีการเปลี่ยนแปลงจากภายนอก
สภาพแวดล้อมการรันและการดีบัก
- แต่ละ hook มี เวลาจำกัดสูงสุด 60 วินาที, รันแบบขนาน, และทำงานในไดเรกทอรีทำงานปัจจุบันพร้อม environment เดิม
- สามารถดีบักได้จาก
/hooks โดยตรวจสอบการตั้งค่า ทดสอบคำสั่งโดยตรง และเช็ก exit code กับเอาต์พุต
- กระบวนการรันและผลลัพธ์สามารถดูได้ในโหมด transcript (Ctrl-R)
4 ความคิดเห็น
ช่วยทำเวอร์ชัน Windows ด้วยนะครับ ฮือฮือ
ใช้ WSL
สเปกพีซีของผมค่อนข้างต่ำหรือเปล่าก็ไม่แน่ใจ แต่บน Windows WSL งานบางอย่างที่ใช้ Claude Code (เช่น build โปรเจกต์, รัน local web server เป็นต้น) ช้ามากครับ
แม้จะมีวิธีรันเฉพาะงานเหล่านั้นแบบแมนนวลนอก WSL ได้ แต่ก็ทั้งยุ่งยากและมีข้อจำกัด พอ Gemini CLI ออกมา ผมเลยบน Windows หันมาใช้ Gemini CLI เป็นหลักแทน Claude Code อยู่ครับ
ความคิดเห็นจาก Hacker News
รู้สึกหงุดหงิดที่ Claude Code Opus 4 ชอบไม่ใส่ newline ท้ายไฟล์
เวลาทดสอบ hook ใหม่ต้องรีสตาร์ต
claudeทำให้การใช้สคริปต์ที่แก้ไขต่อเนื่องได้ภายในเซสชันมีประสิทธิภาพกว่ามากสคริปต์นี้จะรัน formatter กับไฟล์ C และ shell script และสำหรับไฟล์อื่น ๆ จะเติมเฉพาะ newline ที่หายไป
AI อย่าง Claude ไม่ค่อยเก่งเรื่องแยกปัญหาให้เหมาะสม และบางครั้งก็พยายามทำงานด้วยวิธีแปลก ๆ เลยต้องแก้หลายรอบ เช่นในตัวอย่าง hook ด้านบน ที่ให้บันทึกไฟล์ JSON ลงดิสก์ก่อน แล้วดึงแค่ path ออกมาเก็บไว้อีกที จากนั้นค่อยส่ง path นั้นให้
save-hook.shสุดท้ายทำสิ่งที่ต้องการได้ใน 10 นาที แต่เสียเวลากับการสั่งให้ทำ step ใหญ่ ๆ ในครั้งเดียวมากกว่า
มีคนพูดกันว่า AI จะมาแทนนักพัฒนา แต่คนที่ต้องตั้งค่า hook พวกนี้และเสนอฟีเจอร์ใหม่ก็ยังคงเป็นมนุษย์อยู่ดี
งานที่เกี่ยวกับ tooling แบบนี้จะยังมีต่อไป จนกว่า AI จะพัฒนาไปถึงระดับที่มันคิดไอเดียนี้ขึ้นมาเองแล้วเอาไปใช้กับ AI ตัวอื่นได้
ถ้าเปรียบกับงานไม้ ตอนนี้น่าจะเป็นช่วงเปลี่ยนผ่านจากเครื่องมือช่างแบบใช้มือไปสู่เครื่องมือไฟฟ้า
คนที่เข้าใจพื้นฐานจะใช้เครื่องมือได้ดี แต่ตอนนี้เราอยู่ในช่วงที่จากเดิมต้องทำงานละเอียดด้วยมือ เปลี่ยนมาเป็นทำเร็วด้วย table saw ซึ่งมีประสิทธิภาพขึ้นแต่ก็อาจอันตรายกว่า
คล้ายกับข้ออ้างที่ว่าเครื่องจักรการเกษตรอย่าง combine harvester จะมาแทนงานในภาคเกษตร
มันจะสมเหตุสมผลจริงหรือที่แรงงานทุกคนจะกลายเป็นแค่คนควบคุมเครื่องจักร?
มุมมองนี้คือไม่ว่าจะเป็นเครื่องมืออัตโนมัติ งานเกษตร หรือ AI คุณค่ามันไม่ได้มีแค่การเปลี่ยนผ่านแบบตรงไปตรงมา
เหมือนเรื่องเล่าดัง "โลกตั้งอยู่บนหลังกระดองเต่า" หลังการมาของ AI เราก็สามารถวนอยู่กับคำถามว่า "แล้วใครจะดูแล AI นั้นอีกล่ะ?" ไปได้ไม่รู้จบ
ตอนนี้ก็มีกรณีที่ให้ Claude Code อัปเดต
CLAUDE.mdของตัวเองอยู่แล้ว ดังนั้นการให้มันแก้ hook ของตัวเองก็ไม่ถึงกับเป็นไปไม่ได้แต่น่าสนใจตรงที่เรามักลืมตั้งคำถามแบบ Jurassic Park ว่า "เราควรทำสิ่งนี้หรือไม่"
ทั้งความเห็นที่ว่า AI จะลดจำนวนงานสายพัฒนา และคำถามที่ว่าถ้าอย่างนั้นใครจะเป็นคนตั้งค่า hook ก็ล้วนถูกทั้งคู่
ประเด็นสำคัญคือความก้าวหน้าทางเทคโนโลยีไม่ได้สรุปง่าย ๆ แค่ว่างานจะเพิ่มหรือลด แต่สามารถทั้งทำให้งานบางอย่างหายไปและสร้างงานใหม่ขึ้นมาพร้อมกัน
จริง ๆ แล้วสำหรับคนส่วนใหญ่ งานแบบนี้ไม่ใช่งานพัฒนา แต่เป็นงานบำรุงรักษา งาน DevOps อะไรทำนองนั้นมากกว่า
แม้แต่ในผลิตภัณฑ์ SaaS ก็ยังมีงานที่เกี่ยวกับการปฏิบัติการมากกว่าการเขียนโค้ด และต่างจากสิ่งที่ผู้ใช้ HN มองว่าเป็นการพัฒนาแบบจริงจังพอสมควร
ตื่นเต้นกับฟีเจอร์นี้มาก
hook น่าจะมีบทบาทสำคัญทั้งในด้าน context engineering ของเอเจนต์และการตรวจสอบประสิทธิภาพขณะรันจริง
มันน่าจะขยายไปใช้ได้ในหลายกรณี เช่น enterprise compliance หรือการเฝ้าติดตามพฤติกรรม
น่าประทับใจที่ Anthropic รองรับสิ่งนี้ทันทีจากข้อเสนอใน GitHub issue
ลิงก์ issue ที่เกี่ยวข้อง
cline.botแทน Claude Code อยู่จริง ๆคิดว่าฟีเจอร์แบบนี้จะกลายเป็นท่าไม้ตายที่เอเจนต์ช่วยเขียนโค้ดทุกตัวต้องมีในอนาคต
เหตุผลที่รู้สึกว่าฟีเจอร์นี้ดีมากคือ สามารถเขียนกฎควบคุมการรันคำสั่งที่ซับซ้อนได้โดยตรง ไม่ต้องอ้อมผ่าน
CLAUDE.mdตัวอย่างเช่น
docker compose exec django python manage.py testอนุญาตได้ แต่คำสั่งอย่าง
docker compose exec django python manage.py makemigrationsสามารถบล็อกได้
.Claude/settings.jsonคิดว่าคงดีกว่านี้ถ้าฟีเจอร์นี้ทำงานเป็นตัว MCP server เอง
ลองนึกภาพว่าเราสร้าง hook เป็น mcp tool ที่ใช้ชื่อที่ตกลงกันไว้ล่วงหน้า แล้วเอเจนต์ค้นพบ hook พวกนั้นได้อัตโนมัติ โดยไม่ต้องรู้ implementation ภายใน ทำให้ reuse MCP server ได้หรือเอาไปใช้ซ้ำกับเอเจนต์ตัวอื่นก็ได้
Claude Code มักลืมทั้งคำสั่งในไฟล์
CLAUDE.mdและประเด็นสำคัญของ codebase บ่อยมาก จนต้องคอยเตือนเรื่อย ๆเลยกำลังหวังว่าอัปเดตนี้จะแก้ปัญหานี้ได้
CLAUDE.mdก็บอกอยู่ว่าห้ามใช้แพตเทิร์นแบบนั้น!"Claude ก็จะอ่าน
CLAUDE.mdแล้วตอบว่า "22 วินาที, 2.6k tokens…"แล้วตามด้วย "คุณพูดถูก!"
ขอแชร์ตัวอย่าง hook บางอัน
บทความตัวอย่างการเขียน hook และทำ workflow อัตโนมัติ
ดีใจที่ตอนนี้ Claude Code มีความสามารถตรวจ lint / type check หลังแก้โค้ดได้ในระดับเดียวกับ Cursor
อยากให้ Cursor มีฟีเจอร์แบบนี้ด้วย
ตอนนี้ยังใช้วิธีเฉพาะหน้าด้วยการผสมหลายกฎเข้าด้วยกันเพื่อแก้ไปก่อน
มองว่าฟีเจอร์นี้ช่วยปิดช่องว่างด้านความสามารถใหญ่ ๆ ที่มีอยู่ก่อนหน้านี้
เพราะวิธีที่ Claude Code สร้าง commit ทำให้ Git hooks ปกติส่วนใหญ่ไม่ทำงาน เลยต้องใช้วิธีอ้อมโดยสั่งผ่าน
CLAUDE.mdให้จัดรูปแบบโค้ดอัตโนมัติด้วย Qlty CLI แต่ Claude ก็ทำสิ่งนี้ได้ไม่สม่ำเสมอเท่าไรนักจนน่าเสียดายการเปลี่ยนแปลงครั้งนี้น่าจะทำให้ได้ผลลัพธ์ที่เด็ดขาดกว่าเดิม
ตอนนี้ event ที่ hook ได้ยังมีจำกัด แต่ก็หวังว่าในอนาคตจะ hook event อย่าง Git commit และ push ได้ง่ายขึ้น
ลิงก์ GitHub ของ Qlty CLI
เผื่อเป็นข้อมูล Claude จัดการ Java ได้ดีมากจริง ๆ
มันจับทั้ง style guide และความชอบเรื่อง indentation ของฉันได้แม่นมาก จนแทบไม่ต้อง reformat โค้ด Java เลย
แม้แต่ JavaDoc ก็จัดได้เนี้ยบจนน่าทึ่ง
น่าจะเป็นเพราะมันได้เรียนรู้จากโค้ด Java ระดับ enterprise ปริมาณมหาศาล
สงสัยว่าทำไม Git hooks ปกติถึงทำงานกับ Claude Code ได้ไม่ดีนัก
Husky กับ lint-staged ทำงานได้ตามปกติ แต่ Pre Commit Hooks ไม่ทำงาน
จากความเข้าใจแบบคร่าว ๆ ของฉัน ฟีเจอร์นี้เป็นโครงสร้างการทำงานอัตโนมัติที่ผู้ใช้กำหนดเองสำหรับการใช้แต่ละ tool โดยไม่กิน context และไม่ใช่แบบ MCP ที่ Claude เป็นคนตัดสินใจว่าจะรันเมื่อไร