Ad Space (horizontal)
Advanced

Menguasai Claude Code Hooks: Auto-Format, Auto-Test, dan Lainnya

Pelajari cara menyiapkan auto-formatting dan auto-testing dengan Claude Code hooks. Dilengkapi contoh konfigurasi praktis dan use case dunia nyata.

Apa Itu Hooks?

Claude Code hooks memungkinkanmu menjalankan command kustom secara otomatis sebelum atau sesudah aksi tertentu. Kamu bisa mengatur auto-formatting setelah file disimpan, auto-run test setelah kode berubah, dan masih banyak lagi.

Hooks didefinisikan di .claude/settings.json dan mengeksekusi shell command saat Claude Code melakukan operasi tertentu.

Jenis-Jenis Hook

Claude Code mendukung hooks pada event point berikut:

Hook EventKapan Terpicu
PreToolUseSebelum tool dieksekusi
PostToolUseSetelah tool dieksekusi
NotificationSaat notifikasi dikirim
StopSaat Claude Code selesai merespons

Konfigurasi Dasar

Hooks didefinisikan di field hooks pada .claude/settings.json:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "command": "npx prettier --write \"$CLAUDE_FILE_PATH\""
      }
    ]
  }
}

Struktur Konfigurasi

  • matcher: Pattern regex yang mencocokkan nama tool yang memicu hook
  • command: Shell command yang akan dieksekusi

Use Case 1: Auto-Formatting

Jalankan Prettier secara otomatis setelah setiap pengeditan file:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "command": "npx prettier --write \"$CLAUDE_FILE_PATH\""
      }
    ]
  }
}

Dengan setup ini, setiap kali Claude Code membuat atau mengedit file, Prettier otomatis memformatnya. Coding style tim tetap konsisten tanpa effort manual.

Use Case 2: Auto-Linting

Berikut cara mengintegrasikan ESLint auto-fix:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "command": "npx eslint --fix \"$CLAUDE_FILE_PATH\" 2>/dev/null || true"
      }
    ]
  }
}

Suffix || true mencegah error lint menyebabkan hook gagal, sehingga Claude Code bisa melanjutkan pemrosesan.

Use Case 3: Auto-Testing saat Ada Perubahan

Jalankan test terkait secara otomatis setelah pengeditan file dan kirimkan hasilnya kembali:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "command": "npx vitest related \"$CLAUDE_FILE_PATH\" --run 2>&1 | tail -20"
      }
    ]
  }
}

Opsi related pada Vitest hanya menjalankan test yang relevan dengan file yang diubah, memberikan feedback yang jauh lebih cepat daripada full test suite.

Use Case 4: Auto Type-Checking

Jalankan TypeScript type checking setelah perubahan file:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "command": "npx tsc --noEmit 2>&1 | head -30"
      }
    ]
  }
}

Use Case 5: Memblokir Command Berbahaya

Hook PreToolUse yang mencegah eksekusi command berisiko:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf|drop table|git push.*force'; then echo 'BLOCKED: Dangerous command detected' >&2; exit 1; fi"
      }
    ]
  }
}

Ketika hook keluar dengan kode 1, Claude Code melewatkan eksekusi tool sepenuhnya.

Use Case 6: Notifikasi Selesai

Kirim notifikasi saat Claude Code menyelesaikan task:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "command": "notify-send 'Claude Code' 'Task completed' 2>/dev/null; echo 'Done'"
      }
    ]
  }
}

Di macOS, kamu bisa menggunakan:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "command": "osascript -e 'display notification \"Task completed\" with title \"Claude Code\"'"
      }
    ]
  }
}

Menggabungkan Beberapa Hooks

Di project nyata, menggabungkan beberapa hooks adalah pendekatan yang paling efektif:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf /'; then exit 1; fi"
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "command": "npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true"
      },
      {
        "matcher": "Write|Edit",
        "command": "npx eslint --fix \"$CLAUDE_FILE_PATH\" 2>/dev/null || true"
      }
    ],
    "Stop": [
      {
        "matcher": "",
        "command": "echo '✓ Task completed'"
      }
    ]
  }
}

Tips Menulis Hooks

1. Jaga Waktu Eksekusi Tetap Singkat

Hooks berjalan secara sinkron, jadi operasi berat akan memperlambat respons Claude Code. Gunakan opsi seperti related untuk mempersempit scope test, dan head atau tail untuk memotong output.

2. Tangani Error dengan Baik

Hook yang keluar dengan error bisa mengganggu workflow Claude Code. Gunakan || true dan 2>/dev/null agar tetap aman.

3. Manfaatkan Environment Variable

Manfaatkan environment variable yang tersedia di hooks. $CLAUDE_FILE_PATH memberikan path file yang sedang dioperasikan.

Kesimpulan

Hooks memungkinkanmu mengkustomisasi workflow Claude Code secara mendalam. Kombinasi auto-formatting dan auto-testing sangat powerful untuk menjaga kualitas kode. Mulai dengan auto-formatting Prettier dan kembangkan dari sana.

Ad Space (rectangle)
#Claude Code #hooks #automation #formatting #testing