Hooks, Subagents และ Plugins — กติกาที่บังคับได้จริง และทีม AI ย่อย

⏱ 30 นาทีลองในClaude ↗

⚠️ บทนี้มีข้อมูลที่เปลี่ยนบ่อย (ฟีเจอร์ ราคา ชื่อเมนู) ตรวจกับเว็บทางการก่อนนำไปใช้

เป้าหมาย

ใช้ hooks บังคับกติกาแบบ "ทำทุกครั้งแน่นอน" ใช้ subagents แยกงานเป็นผู้เชี่ยวชาญ แล้วแพ็กทุกอย่างเป็น plugin ให้ทีม

CLAUDE.md vs Hooks vs Permission

CLAUDE.md Hooks Permission deny
ลักษณะ คำแนะนำ (Claude อาจลืม) สคริปต์ที่ รันทุกครั้ง กฎห้ามตายตัว
ตัวอย่าง "ใช้ prettier" format ทุกครั้งหลังแก้ไฟล์ "deny": ["Read(./.env)"]

Hook รับ JSON ทาง stdin (tool_name, tool_input.file_path, tool_input.command ...)

  • PreToolUse + exit 2 = บล็อก tool call และ stderr ส่งกลับให้ Claude เป็นเหตุผล
  • PostToolUse = ทำต่อหลัง tool สำเร็จ (exit 2 ย้อนไม่ได้ แค่ส่ง feedback)
  • Stop = ตอน Claude ตอบเสร็จ เหมาะแจ้งเตือน

ลองเลย 🧪 — Hooks

ทดลอง A — สคริปต์บล็อกการแก้ไฟล์ .env (ต้องมี jq)

mkdir -p .claude/hooks
cat > .claude/hooks/protect-env.sh <<'EOF'
#!/bin/bash
file_path=$(jq -r '.tool_input.file_path')
if [[ "$file_path" == *.env* ]]; then
  echo "ห้ามแก้ไฟล์ .env โดยตรง ให้แจ้งผู้ใช้แก้เอง" >&2
  exit 2
fi
exit 0
EOF
chmod +x .claude/hooks/protect-env.sh

ทดลอง B — ลง .claude/settings.json (3 hooks: บล็อก .env / format หลังแก้ / แจ้งเตือนเมื่อเสร็จบน macOS)

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-env.sh" }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          { "type": "command", "command": "osascript -e 'display notification \"Claude ทำงานเสร็จแล้ว\" with title \"Claude Code\"'" }
        ]
      }
    ]
  }
}

→ Linux เปลี่ยนคำสั่ง Stop เป็น notify-send "Claude Code" "ทำงานเสร็จแล้ว" → ทดสอบ: สั่ง เพิ่มบรรทัด DEBUG=true ใน .env → ต้องถูกบล็อก, แก้ไฟล์ .js → ถูก format อัตโนมัติ → ตรวจ hooks ที่โหลดอยู่ด้วย /hooks

⚠️ hook รันด้วยสิทธิ์ของคุณ อ่านสคริปต์ hook ใน repo คนอื่นก่อนเปิด Claude Code ทุกครั้ง

Subagents — ผู้ช่วยเฉพาะทาง context แยก

ไฟล์ .claude/agents/<name>.md (หรือสร้างผ่าน /agents) แต่ละตัวมี context ของตัวเอง + tool เท่าที่จำเป็น + เลือกโมเดลได้ → งานอ่านเยอะ (รันเทสต์ ค้นโค้ด) ไม่ทำให้ context หลักรก และรันหลายตัวขนานกันได้

ทดลอง C — คู่ reviewer + test-runner

mkdir -p .claude/agents
cat > .claude/agents/code-reviewer.md <<'EOF'
---
name: code-reviewer
description: ตรวจโค้ดที่เพิ่งแก้หาบั๊ก ช่องโหว่ และ secret ที่หลุด ใช้หลังแก้โค้ดเสร็จทุกครั้ง
tools: Read, Grep, Glob
model: sonnet
---
คุณคือผู้ตรวจโค้ดอาวุโส อ่านอย่างเดียว ห้ามแก้ไฟล์
รายงานเป็นตาราง: ไฟล์:บรรทัด / ความรุนแรง (สูง/กลาง/ต่ำ) / ปัญหา / วิธีแก้ที่เสนอ
ถ้าไม่พบปัญหาให้บอกตรงๆ ไม่ต้องหาเรื่อง
EOF
cat > .claude/agents/test-runner.md <<'EOF'
---
name: test-runner
description: รันชุดทดสอบและสรุปเฉพาะเทสต์ที่ล้มพร้อมสาเหตุ ใช้เมื่อต้องการรู้ว่าเทสต์ผ่านไหม
tools: Read, Grep, Glob, Bash
model: haiku
---
รันคำสั่งทดสอบของโปรเจกต์ (ดูจาก CLAUDE.md หรือ package.json/pyproject)
ห้ามแก้โค้ด รายงานแค่: จำนวนผ่าน/ล้ม, ชื่อเทสต์ที่ล้ม, บรรทัด error สำคัญไม่เกิน 5 บรรทัดต่อเทสต์
EOF
ใช้ code-reviewer ตรวจไฟล์ที่แก้ใน git diff และใช้ test-runner รันเทสต์ไปพร้อมกัน แล้วสรุปรวมว่าพร้อม commit หรือยัง

→ สังเกตว่าทั้งสองทำงานขนานกัน และ context หลักได้แค่บทสรุป ไม่ใช่ log ยาวๆ

Plugins — แพ็กให้ทั้งทีมติดตั้งคำสั่งเดียว

plugin = โฟลเดอร์ที่มี .claude-plugin/plugin.json (name, description, version) และโฟลเดอร์ย่อย skills/, agents/, hooks/hooks.json, .mcp.json → แพ็ก skill บท 6d-01 + subagent + hooks + MCP server เป็นชุดเดียว เปิด /plugin เพื่อดู/ติดตั้งจาก marketplace หรือ claude plugin install <name>@<marketplace> (marketplace ทางการ: claude-plugins-official)

⚠️ ต้องตรวจสอบ: โครงสร้างโฟลเดอร์และวิธีทำ marketplace ภายในองค์กรที่ code.claude.com/docs (หัวข้อ Plugins)

สรุปจำง่าย

ต้องเกิดทุกครั้ง → hook, ต้องห้ามเด็ดขาด → deny, งานเฉพาะทาง → subagent, แชร์ทั้งชุด → plugin