← กลับสู่คู่มือ

บทที่ 13 — Hooks

Hooks คือคำสั่งเชลล์ที่ทำงานเมื่อเกิดเหตุการณ์ในวงจรชีวิตของ agent ซึ่งเป็น ช่องทางให้คุณเชื่อม thClaws เข้ากับเครื่องมือที่มีอยู่ เช่น บันทึกทุกการเรียก tool ส่งการแจ้งเตือนเมื่อ session จบ หรือบล็อกการ commit จนกว่า test จะผ่าน

เหตุการณ์ (Events)

Event เกิดขึ้นเมื่อ Env vars ที่เปิดให้ใช้
pre_tool_use ก่อนที่ tool จะทำงาน THCLAWS_TOOL_NAME, THCLAWS_TOOL_INPUT
post_tool_use หลังจาก tool คืนค่าสำเร็จ THCLAWS_TOOL_NAME, THCLAWS_TOOL_OUTPUT
post_tool_use_failure หลังจาก tool เกิดข้อผิดพลาด THCLAWS_TOOL_NAME, THCLAWS_TOOL_ERROR
permission_denied ผู้ใช้พิมพ์ n ที่ prompt ขออนุญาตใช้ tool THCLAWS_TOOL_NAME
session_start เมื่อ session เริ่มต้น THCLAWS_SESSION_ID, THCLAWS_MODEL
session_end เมื่อ /quit หรือปิดหน้าต่าง THCLAWS_SESSION_ID, THCLAWS_MODEL
pre_compact ก่อนการบีบอัดประวัติ
post_compact หลังการบีบอัดเสร็จสิ้น

การตั้งค่า hooks

ใน .thclaws/settings.json (ระดับโปรเจกต์) หรือ ~/.config/thclaws/settings.json (ระดับผู้ใช้):

{
  "hooks": {
    "pre_tool_use":  "echo \"tool: $THCLAWS_TOOL_NAME\" >> /tmp/thclaws.log",
    "post_tool_use": "echo \"done: $THCLAWS_TOOL_NAME\" >> /tmp/thclaws.log",
    "session_start": "osascript -e 'display notification \"thClaws started\"'",
    "session_end":   "osascript -e 'display notification \"thClaws ended\"'"
  }
}

แต่ละค่าคือ shell snippet ที่รันผ่าน /bin/sh -c โดยตัวแปรสภาพแวดล้อม จะพร้อมให้ใช้งานตามที่ระบุไว้ในตารางด้านบน

สูตรการใช้งานจริง

บันทึกทุกคำสั่ง bash ลงไฟล์

{
  "hooks": {
    "pre_tool_use": "[ \"$THCLAWS_TOOL_NAME\" = Bash ] && echo \"[$(date)] $THCLAWS_TOOL_INPUT\" >> ~/.thclaws-bash.log"
  }
}

แจ้งเตือนบนเดสก์ท็อปเมื่อ turn เสร็จ

{
  "hooks": {
    "session_end": "notify-send 'thClaws' 'Session done'"
  }
}

สำหรับ macOS: ให้เปลี่ยนเป็น osascript -e 'display notification "Session done" with title "thClaws"'

Auto-commit ทุกครั้งที่ edit สำเร็จ

{
  "hooks": {
    "post_tool_use": "[ \"$THCLAWS_TOOL_NAME\" = Edit -o \"$THCLAWS_TOOL_NAME\" = Write ] && git add -A && git commit -m 'thclaws: edit' --no-verify"
  }
}

(ใช้ --no-verify อย่างระมัดระวัง เพราะจะข้าม pre-commit hooks ไปด้วย)

Ping webhook เมื่อถูกปฏิเสธสิทธิ์

{
  "hooks": {
    "permission_denied": "curl -s -X POST -H 'Content-Type: application/json' -d \"{\\\"tool\\\": \\\"$THCLAWS_TOOL_NAME\\\"}\" https://hooks.example.com/denied"
  }
}

การจัดการความล้มเหลว

Hooks ที่จบด้วย exit status ไม่เป็น 0 จะพิมพ์ warning ไปที่ stderr แต่จะไม่หยุดการทำงานของ agent โดย hook จะรันใน cwd เดียวกับ thClaws ดังนั้น path ของไฟล์ในสคริปต์จะอิงจากรากของ sandbox ส่วน hooks ที่รันนาน จะบล็อก turn จึงควรทำให้เร็วหรือสั่งรันเป็น background (command &)

การดีบัก

thclaws --cli --verbose

โหมด verbose จะพิมพ์รายละเอียดของทุก hook ออกมาก่อนจะสั่งรันจริง

สิ่งที่ hooks ไม่ใช่

Hooks ไม่สามารถเปลี่ยนแปลง การเรียก tool ได้ เพราะทำหน้าที่เป็นเพียง observer เท่านั้น หากต้องการบล็อก tool ให้ใช้รายการ permissions.deny (บทที่ 5) ส่วนการแก้ไข input ของ tool ต้องให้ตัวโมเดลเป็นผู้ทำเอง