1 שלב הבסיס

Hooks — אוטומציה של תהליך העבודה

הפקודות שאתה כותב פעם אחת ו-Claude מריץ תמיד. Hooks הם השכבה הדטרמיניסטית שמבטיחה שהסטנדרטים שלך נשמרים בכל פעם — בלי לסמוך על זיכרון, בלי לקוות לטוב. אוטומציה אמיתית של תהליך העבודה מתחילה כאן.

מה יהיה לך בסוף הפרק הזה
מה תוכל/י לעשות אחרי הפרק הזה
דרישות קדם
הפרויקט שלך

בקורס CC Basics למדת לעבוד עם Claude Code — לערוך קבצים, להריץ פקודות, להשתמש ב-CLAUDE.md ובמצב Plan. בפרק הזה אתה עובר מ-"לבקש" ל-"לאכוף" — בונה מערכת Hooks שמפרמטת, מגנה ומתעדת אוטומטית, בכל פעם, בלי יוצא מן הכלל. בפרק הבא (Custom Agents) תשתמש ב-Hooks שבנית כאן כבסיס לסוכנים מותאמים שעובדים בשבילך באופן עצמאי.

מילון מונחים — Hooks
מונח הסבר דוגמה
Hook (הוק / וו) פקודת Shell או בקשת HTTP שמופעלת אוטומטית כשאירוע מסוים קורה בסשן של Claude Code PostToolUse hook שמריץ prettier אחרי כל עריכה
Lifecycle Event אירוע שמתרחש במהלך סשן עבודה — למשל התחלת סשן, קריאה לכלי, סיום תשובה PreToolUse, SessionStart, Stop
Matcher מסנן שקובע על אילו כלים ההוק יפעל. בלי matcher — ההוק רץ על כל כלי "matcher": "Edit" — רק על עריכות קבצים
Exit Code קוד היציאה של סקריפט ההוק. 0 = הצלחה, 1 = כישלון (חוסם ב-PreToolUse) exit 1 → "Hook blocked this action"
Deterministic (דטרמיניסטי) תוצאה קבועה וצפויה — בניגוד ל-probabilistic (הסתברותי) שהוא אופי ה-LLM Hook תמיד רץ; Claude לפעמים שוכח
Webhook בקשת HTTP שנשלחת אוטומטית לשרת חיצוני כשאירוע מתרחש HTTP Hook ששולח POST ל-n8n כשסשן נגמר
Frontmatter Hooks Hooks שמוגדרים בתוך ה-YAML header של קובץ Agent או Skill — פעילים רק כשהכלי הזה רץ Skill שמריץ הוק Brand Voice רק כשהוא פעיל
Elicitation דיאלוג אינטראקטיבי שבו MCP Server מבקש מהמשתמש קלט מובנה (בחירה, טקסט, אישור) MCP Server של DB שמבקש לבחור טבלה לפני שאילתה
--bare Flag דגל CLI שמדלג על Hooks, LSP, plugins ו-skills — לשימוש ב-CI/CD ואוטומציה claude -p "run tests" --bare — מהיר, בלי hooks
מתחיל 10 דקות תיאוריה

מה זה Hooks ולמה הם משנים הכל

תדמיין את זה: אתה עובד עם Claude Code על פרויקט React. Claude עורך קובץ, ה-formatting מושלם. יום אחרי, Claude עורך קובץ אחר — ופתאום הקוד לא עומד ב-Prettier. למה? כי Claude הוא probabilistic — הסתברותי. הוא לא מכונה דטרמיניסטית, הוא מודל שפה. לפעמים הוא מפרמט מושלם, לפעמים לא. לפעמים הוא זוכר לבדוק אבטחה, לפעמים לא.

Hooks פותרים את הבעיה הזו. Hook הוא פקודת Shell (או בקשת HTTP) שמופעלת אוטומטית כשאירוע מסוים קורה במהלך סשן של Claude Code. ההוק לא תלוי בשיקול הדעת של Claude — הוא רץ תמיד. בלי יוצא מן הכלל.

חשוב על זה כמו GitHub Actions או CI/CD pipeline, אבל בתוך תהליך העבודה המקומי שלך עם Claude Code. יש trigger (אירוע), יש condition (מתי), ויש action (מה לעשות).

Deterministic + Probabilistic

Claude מטפל בחשיבה היצירתית. Hooks מטפלים באכיפת הכללים. השילוב הזה הוא מה שהופך את Claude Code מכלי חכם למערכת עבודה אמינה.

ההבדל בין חיים עם Hooks לחיים בלעדיהם

מצב בלי Hooks עם Hooks
פירמוט קוד לפעמים Claude מפרמט, לפעמים לא. אתה מתקן ידנית prettier רץ אוטומטית על כל עריכה. תמיד מפורמט
פקודות מסוכנות Claude לפעמים מנסה git push --force. אתה צריך לתפוס את זה PreToolUse hook חוסם פקודות מסוכנות לפני שהן רצות
תיעוד אתה לא יודע מה Claude עשה אתמול. אין לוג כל פעולה מתועדת ב-session log. תמיד יש audit trail
בדיקות אתה צריך לזכור לבקש מ-Claude להריץ טסטים אחרי שינויים PostToolUse hook מריץ טסטים אוטומטית אחרי כל עריכה

דוגמאות מייצגות — Hooks בעולם האמיתי

בוא נראה כמה תרחישים מציאותיים שמדגימים למה Hooks הם כל כך חשובים:

תרחיש 1: הפרויקט של אריק — סטארטאפ SaaS
אריק מפתח פלטפורמת ניהול משימות. הוא עובד עם Claude Code 3-4 שעות ביום. לפני Hooks, Claude היה לפעמים מריץ npm run build על סביבת Production בטעות, ופעם אחת עשה git push --force ל-main ומחק commit של שותף. אחרי שהתקין 3 Hooks בסיסיים — Auto-Format, Block Dangerous Commands, ו-Session Logging — הבעיות נעלמו. ההוק הביטחוני חסם 7 פקודות מסוכנות בחודש הראשון. אריק אומר: "זה כמו חגורת בטיחות — אתה לא מרגיש אותה עד שהיא מצילה אותך."

תרחיש 2: צוות הפיתוח של רביד — 5 מפתחים
הצוות של רביד השתמש ב-HTTP Hooks כדי לשלוח כל SessionEnd לדשבורד Grafana מרכזי. ככה הם יודעים כמה שעות Claude עבד, כמה קבצים נערכו, ואילו פקודות רצו. בנוסף, הם הגדירו PreToolUse hook שחוסם כל פקודה שמכילה את המילה "production" — ככה אף Claude של אף מפתח לא יכול לגעת בסביבת Production בטעות.

תרחיש 3: שרה — כותבת תוכן טכני בעברית
שרה משתמשת ב-Claude ליצירת תיעוד ומאמרים בעברית. היא הגדירה PostToolUse hook שבודק כל קובץ .md שנערך: האם מונחים טכניים נשארו באנגלית? האם אין ביטויים "מתורגמים" שנשמעים מלאכותיים? ההוק חוסך לה 15-20 דקות של עריכה ידנית על כל מאמר.

תרחיש 4: חברת SaaS ישראלית — 12 מפתחים
חברת תוכנה בהרצליה עם 12 מפתחים שמשתמשים ב-Claude Code. המנהל הטכני (CTO) הגדיר HTTP Hook מרכזי ששולח כל SessionEnd ו-PostToolUse לדשבורד מבוסס Grafana. בנוסף, PreToolUse hook חוסם כל פקודה שמכילה את המילים "production", "prod-db", או את ה-connection string של מסד הנתונים של Production. תוך חודש, הצוות זיהה שני מפתחים שניסו בטעות להריץ migrations על Production דרך Claude — ההוקים חסמו את שני המקרים. ה-CTO: "בלי Hooks, היה לנו downtime של שעתיים. עם Hooks — אפס."

רגע היסטורי קצר

Hooks הוכנסו ל-Claude Code ב-גרסה 2.0, שיצאה בספטמבר 2025 — יחד עם מערכת ה-Checkpoints, Parallel Agents ו-VS Code Extension. זה היה צעד מהפכני: לראשונה, משתמשים יכלו להוסיף לוגיקה דטרמיניסטית לתהליך העבודה ההסתברותי של AI.

מאז, כל כמה שבועות מתווספים אירועים חדשים: StopFailure הגיע ב-v2.1.78 (מרץ 2026), PostCompact ב-v2.1.76 (מרץ 2026), ו-HTTP Hooks ב-v2.1.63 (פברואר 2026). גם הדרך שבה Hooks מוצגים למשתמש השתפרה — מ-v2.1.75 אפשר לראות מאיזה קובץ settings.json ההוק הגיע, מה שמקל על debugging. המערכת ממשיכה לגדול — ומה שתלמד בפרק הזה יהיה רלוונטי לעוד הרבה זמן.

10 אירועים

נכון למרץ 2026, יש 10 Hook Events שונים — 8 ליבה ועוד 2 ספציפיים ל-MCP (Elicitation ו-ElicitationResult). בספטמבר 2025, כשגרסה 2.0 יצאה, היו 6. Anthropic מוסיפה אירועים חדשים באופן קבוע — שמור על עדכניות עם ה-changelog.

Framework: "Deterministic Guardrails"

Claude הוא יצירתי וגמיש — הוא חושב, מחליט, ומפתיע. Hooks הם נוקשים ואמינים — הם רצים תמיד, בדיוק כמו שהגדרת. הגישה הנכונה: תן ל-Claude לטפל בחשיבה, ולהוקים לאכוף את הכללים. אל תנסה לאכוף כללים דרך prompts — תאכוף אותם דרך Hooks.

עשה עכשיו 2 דקות

פתח את הקובץ settings.json של הפרויקט שלך. אם עוד אין — צור אותו: .claude/settings.json בתיקיית השורש של הפרויקט. כרגע הוא יהיה ריק (או כמעט ריק). עד סוף הפרק, הוא יכיל לפחות 3 Hooks עובדים. פתח אותו עכשיו בעורך שלך כדי שיהיה מוכן.

בינוני 12 דקות תיאוריה

Hook Lifecycle Events — המפה המלאה

כדי לבנות Hooks טובים, אתה צריך להבין את כל האירועים שזמינים לך. כל אירוע הוא "רגע" בתהליך העבודה של Claude שבו אתה יכול להכניס לוגיקה משלך. נכון למרץ 2026, יש 10 אירועים — 8 אירועי ליבה ו-2 אירועים ייעודיים ל-MCP Elicitation:

אירוע מתי הוא מופעל למה משתמשים בו גרסה
PreToolUse לפני ש-Claude קורא לכלי כלשהו חסימה, שינוי Input, לוגינג. ההוק הכי חזק לאכיפה v2.0
PostToolUse אחרי שכלי סיים לרוץ אימות תוצאות, פירמוט, triggering פעולות המשך, לוגינג v2.0
SessionStart פעם אחת כשסשן חדש מתחיל בדיקת סביבה, טעינת credentials, הודעת פתיחה v2.0
SessionEnd כשהסשן נסגר ניקיון, שמירת סיכום סשן, שליחת התראה v2.0
Notification כש-Claude שולח notification ניתוב התראות ל-Slack, desktop alerts, מערכת לוגינג v2.0
Stop כש-Claude מסיים לייצר תשובה שלמה Post-processing, מעקב עלויות, triggering השלב הבא v2.0
StopFailure כש-Claude נתקל בשגיאת API או נכשל להשלים תשובה טיפול בשגיאות, retry logic, התראות על תקלות v2.1.78
PostCompact אחרי פעולת /compact הזרקת context קריטי ששורד compaction, לוגינג מה נשמר v2.1.76
Elicitation כש-MCP Server מבקש קלט מהמשתמש (דיאלוג אינטראקטיבי) לוגינג, אימות, הזרקת ברירות מחדל v2.1.76
ElicitationResult אחרי שהמשתמש השיב ל-Elicitation dialog וולידציה של תשובות, לוגינג, triggering פעולות המשך v2.1.76
הבהרה: 8 + 2

8 האירועים הראשונים (PreToolUse עד PostCompact) הם אירועי הליבה שרלוונטיים לכל משתמש. Elicitation ו-ElicitationResult הם אירועים ייעודיים ל-MCP (Model Context Protocol) — הם רלוונטיים רק אם אתה עובד עם MCP Servers שמבקשים קלט מהמשתמש. ברוב המקרים תעבוד עם 8 אירועי הליבה. נלמד על MCP בפרק 3.

כל אירוע בפירוט — מתי ולמה

PreToolUse — ההוק הכי חזק שיש. הוא מופעל לפני ש-Claude קורא לכלי. זה אומר שאתה יכול לבדוק מה Claude עומד לעשות, ואם זה לא בסדר — לחסום. דוגמה קלאסית: Claude רוצה להריץ git push --force main. PreToolUse hook בודק את הפקודה, מזהה "force" + "main", ומחזיר exit 1. הפקודה לא רצה. Claude מקבל הודעה "Hook blocked this action" ומנסה גישה אחרת.

PostToolUse — ההוק הכי נפוץ. הוא מופעל אחרי שכלי סיים לרוץ. אתה לא יכול לחסום — הפעולה כבר קרתה. אבל אתה יכול לעשות דברים על התוצאה: לפרמט קובץ שנערך, לבדוק שהתוצאה עומדת בסטנדרט, להריץ linter, לתעד בלוג. רוב ההוקים שתכתוב יהיו PostToolUse — הם בטוחים, שימושיים, ולא מפריעים לתהליך העבודה.

SessionStart — רץ פעם אחת כשסשן חדש נפתח. מצוין ל-setup: בדוק שכל ה-dependencies מותקנים, שה-environment variables מוגדרים, שה-database זמין. אם משהו חסר — הציג הודעה ברורה במקום לגלות את זה באמצע העבודה.

SessionEnd — רץ כשהסשן נסגר. מושלם לסיכום: כתוב סיכום סשן, שלח התראה שהעבודה הסתיימה, נקה קבצים זמניים, אפס state. זה גם המקום המושלם לשליחת דוח לדשבורד או ל-Slack.

Notification — רץ כש-Claude שולח notification. אם אתה מריץ Claude ב-background (עם & או דרך Remote Control), זה שימושי לניתוב ההתראות למקום שתראה אותן — Slack, Telegram, desktop notification. דוגמה מעשית: נניח שהרצת Claude לעבוד על refactoring ארוך עם Remote Control מהטלפון. במקום לבדוק כל כמה דקות אם הוא סיים, תגדיר Notification hook שישלח לך הודעה ב-Telegram כשהוא צריך תשומת לב.

Notification Hook — ניתוב ל-Telegram
{
  "hooks": {
    "Notification": [
      {
        "command": "curl -s -X POST 'https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage' -d \"chat_id=$TELEGRAM_CHAT_ID&text=Claude Code: $CLAUDE_NOTIFICATION_MESSAGE\" &"
      }
    ]
  }
}

Stop — רץ כש-Claude מסיים לייצר תשובה שלמה. שונה מ-PostToolUse — Stop מופעל על התשובה כולה, לא על כלי ספציפי. שימושי למעקב עלויות (כמה tokens השתמשנו?) או ל-triggering של השלב הבא ב-pipeline. דוגמה מעשית: חברת פיתוח שרוצה לעקוב אחרי עלויות שימוש ב-Claude Code — Stop hook שסופר כמה "תשובות" Claude נתן בכל סשן ומדווח לדשבורד.

StopFailure — חדש יחסית (v2.1.78). רץ כש-Claude נתקל בשגיאת API או נכשל להשלים תשובה. זה קריטי ל-resilience: במקום שהסשן נתקע, ההוק יכול לשלוח התראה, לנסות retry, או לשמור את הסטטוס ל-recovery מאוחר יותר.

PostCompact — חדש (v2.1.76). רץ אחרי פעולת /compact. למה זה חשוב? כש-Claude עושה compaction, הוא מוחק חלק מה-context כדי לפנות מקום. ההוק הזה מאפשר לך להזריק מחדש מידע קריטי ששורד את ה-compaction — כמו הוראות עבודה, סטטוס פרויקט, או context חשוב.

Elicitation — חדש (v2.1.76). רץ כשמשרת MCP מבקש מהמשתמש קלט באמצעות דיאלוג אינטראקטיבי. לדוגמה: MCP Server של מסד נתונים שמבקש ממך לבחור טבלה לפני ביצוע שאילתה. ההוק מאפשר לך לבדוק מה נשאל, להזריק ברירות מחדל, או לתעד את הדיאלוג.

ElicitationResult — חדש (v2.1.76). רץ אחרי שהמשתמש השיב ל-Elicitation dialog. שימושי לוולידציה (האם התשובה תקינה?), לוגינג (מה הוזן?), ול-triggering של פעולות המשך. שני אירועי ה-Elicitation רלוונטיים בעיקר למי שעובד עם MCP Servers — נלמד עליהם לעומק בפרק 3 (MCP).

PreToolUse לעומת PostToolUse — מתי להשתמש במה

זו ההחלטה הכי חשובה ב-Hooks. PreToolUse הוא הכי חזק — הוא יכול לחסום פעולה לפני שהיא קורית. אבל הוא גם הכי מסוכן: אם ההוק מוגדר לא נכון, הוא יחסום פעולות לגיטימיות ויהפוך את Claude ללא שמיש. PostToolUse הוא בטוח יותר — הוא מגיב לפעולה שכבר קרתה. הוא לא יכול למנוע נזק, אבל הוא יכול לתקן, לתעד ולהתריע.

טיפ מקצועי

אם אתה מתחיל עם Hooks — תתחיל עם PostToolUse. הוא הכי בטוח כי הוא מגיב לפעולות שכבר קרו ולא מפריע לתהליך העבודה. אחרי שאתה מרגיש בנוח, תעלה ל-PreToolUse לאכיפה אקטיבית.

חשוב: Hooks רצים בסביבת ה-Shell שלך

נקודה קריטית שצריך להבין: Hooks רצים מחוץ ל-Sandbox של Claude Code. הם רצים ב-Shell שלך (bash/zsh), עם ההרשאות המלאות שלך. זה אומר שהוק יכול לגשת לכל קובץ במערכת, להריץ כל פקודה, ולשנות כל דבר. זה עוצמתי — וזה מחייב אחריות.

טעות נפוצה: התקנת Hooks ממקור לא מהימן

הטעות: להעתיק Hook מ-GitHub או מפורום בלי לקרוא את הקוד — כי "זה נראה בסדר".

למה זה מפתה: ברשת יש שיתופי Hooks מוכנים שנראים שימושיים, ואתה רוצה לחסוך זמן.

מה לעשות במקום: Hooks רצים עם ההרשאות המלאות שלך — הם יכולים לגשת לכל קובץ ולהריץ כל פקודה. תמיד קרא את קוד ההוק שורה-שורה לפני שאתה מפעיל אותו. זה בדיוק כמו להריץ סקריפט Shell שמישהו אחר כתב — אתה חייב להבין מה הוא עושה.

עשה עכשיו 3 דקות

רשום לעצמך 3 בעיות שחוזרות על עצמן בעבודה שלך עם Claude Code. לדוגמה: "Claude לפעמים שוכח לפרמט", "אני לא יודע אילו קבצים שונו בסשן הקודם", "Claude ניסה להריץ פקודה מסוכנת פעם אחת". ליד כל בעיה, כתוב איזה Hook Event יכול לפתור אותה. השווה עם הטבלה למעלה. זו הרשימה שנפתור עד סוף הפרק.

בינוני 15 דקות פרקטי

Command Hooks — אוטומציה מבוססת Shell

Command Hooks הם הסוג הבסיסי והנפוץ ביותר. כשאירוע מופעל, Claude Code מריץ פקודת Shell שהגדרת. הפקודה רצה ב-Shell המקומי שלך עם גישה מלאה למערכת הקבצים.

איפה מגדירים Hooks

ההגדרה נמצאת ב-settings.json. יש שתי רמות:

רמה קובץ טווח השפעה
פרויקט .claude/settings.json (בתיקיית הפרויקט) רק הפרויקט הזה
גלובלי ~/.claude/settings.json כל הפרויקטים, כל סשן

המבנה הבסיסי הוא פשוט. הנה הוק PostToolUse שמריץ prettier אחרי כל עריכת קובץ:

מבנה בסיסי של Command Hook
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "command": "prettier --write $CLAUDE_FILE_PATH"
      }
    ]
  }
}

הרכיבים של Hook

כל הוק מורכב מ-3 חלקים:

  1. Event — באיזה אירוע הוא מופעל (PreToolUse, PostToolUse, SessionStart וכו')
  2. Matcher (אופציונלי) — מסנן שקובע על אילו כלים ההוק מופעל. "Edit" = רק עריכות. "Bash" = רק פקודות Shell. אם אתה לא מגדיר matcher — ההוק רץ על כל קריאה לכלי
  3. Command — פקודת ה-Shell שרצה. יכולה להיות פקודה פשוטה או סקריפט שלם

Environment Variables — המשתנים שזמינים לך

כשההוק רץ, Claude Code מזריק משתני סביבה שמספקים הקשר על מה שקורה:

משתנה מה הוא מכיל דוגמה
$CLAUDE_FILE_PATH הנתיב לקובץ שעליו מתבצעת הפעולה /home/user/project/src/App.tsx
$CLAUDE_TOOL_NAME שם הכלי שהופעל Edit, Write, Bash, Read
$CLAUDE_SESSION_ID מזהה ייחודי של הסשן הנוכחי sess_abc123def456
$CLAUDE_BASH_COMMAND הפקודה שנשלחה לכלי Bash (רק ב-Bash matcher) npm install express
$CLAUDE_PROJECT_DIR הנתיב לתיקיית השורש של הפרויקט /home/user/my-project
$CLAUDE_NOTIFICATION_MESSAGE תוכן ההתראה (זמין רק באירוע Notification) "Task completed successfully"

שים לב: לא כל המשתנים זמינים בכל אירוע. $CLAUDE_FILE_PATH זמין רק כשיש קובץ מעורב (Edit, Write, Read). $CLAUDE_BASH_COMMAND זמין רק כשהכלי הוא Bash. $CLAUDE_SESSION_ID זמין תמיד. כלל אצבע: אם המשתנה ריק — ההוק רץ על אירוע שלא כולל את המידע הזה. תמיד בדוק שהמשתנה לא ריק לפני שאתה משתמש בו.

Exit Code — קוד היציאה משנה הכל

ההוק מחזיר exit code, וזה קובע מה קורה אחר כך:

ההבדל הזה הוא קריטי. PreToolUse עם exit 1 הוא שומר סף — הוא מונע את הפעולה לגמרי. PostToolUse עם exit 1 הוא סירנת אזהרה — הוא מתריע, אבל מה שנעשה נעשה.

בפועל, רוב ההוקים שלך יחזירו exit 0. גם הוקים שמזהים בעיות (כמו Brand Voice) עדיפים עם exit 0 + הודעת warning, כי חסימה יכולה להיות מתסכלת. השתמש ב-exit 1 רק כשחסימה היא הכרחית — בעיקר ב-PreToolUse hooks שמגנים על אבטחה.

טעות נפוצה: שימוש ב-PreToolUse לכל דבר

הטעות: מתחילים כותבים PreToolUse hooks לכל מטרה — גם לפירמוט, גם ללוגינג, גם לבדיקות.

למה זה מפתה: PreToolUse נראה "חזק יותר" כי הוא יכול לחסום. אתה חושב "אם אני כבר שם, אפרמט גם".

מה לעשות במקום: PreToolUse חוסם — ואם ההוק שלך מוגדר לא נכון, Claude נתקע ולא יכול לעבוד. השתמש ב-PreToolUse רק לחסימת פעולות מסוכנות. לכל השאר — PostToolUse. כלל אצבע: 80% מההוקים שלך צריכים להיות PostToolUse.

Hooks על כלי Write — לא רק Edit

חשוב לזכור: Claude משתמש בשני כלים שונים לעבודה עם קבצים. Edit עורך קובץ קיים (מחליף טקסט), ו-Write יוצר קובץ חדש או כותב מחדש קובץ שלם. אם ההוק שלך מגדיר "matcher": "Edit", הוא לא ירוץ כש-Claude יוצר קובץ חדש עם Write. כדי לכסות את שני המקרים, הגדר שני הוקים — אחד ל-Edit ואחד ל-Write:

{
  "hooks": {
    "PostToolUse": [
      {"matcher": "Edit", "command": "bash .claude/hooks/format-on-edit.sh"},
      {"matcher": "Write", "command": "bash .claude/hooks/format-on-edit.sh"}
    ]
  }
}

או, אם אתה רוצה שההוק ירוץ על כל כלי (כולל Read, Bash, Glob ועוד) — פשוט אל תגדיר matcher בכלל. אבל זה בדרך כלל לא מה שאתה רוצה — אין טעם לפרמט קובץ אחרי שקראו אותו.

עשה עכשיו 5 דקות

בנה את ההוק הראשון שלך — לוג פשוט. הוסף את זה ל-.claude/settings.json שלך:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "command": "echo \"$(date '+%H:%M:%S') EDIT: $CLAUDE_FILE_PATH\" >> /tmp/claude-hooks.log"
      }
    ]
  }
}

עכשיו בקש מ-Claude לעשות עריכה קטנה בקובץ כלשהו. אחרי שהוא סיים, פתח את /tmp/claude-hooks.log — אתה צריך לראות שורה עם חותמת זמן ונתיב הקובץ. אם אתה רואה את זה — מזל טוב, ההוק הראשון שלך עובד.

בינוני 10 דקות פרקטי

HTTP Hooks — אינטגרציה מבוססת Webhooks

מאז 28 בפברואר 2026 (גרסה 2.1.63), Hooks יכולים לשלוח בקשות HTTP במקום להריץ פקודות Shell. זה פותח עולם שלם של אינטגרציות: שליחת נתונים ל-Slack, n8n, Make, Zapier, דשבורד מותאם, או כל שירות שמקבל webhooks.

ההבדל בין Command Hook ל-HTTP Hook

קריטריון Command Hook HTTP Hook
איך מוגדר "command": "..." "url": "https://..."
איפה רץ ב-Shell המקומי שלך שולח POST לשרת חיצוני
מה נשלח Environment variables JSON: event type, tool name, input, session ID, timestamp, project path
מה חוזר Exit code (0/1) JSON: allow (boolean), message, modifiedInput
Latency מיידי (מילישניות) תלוי ברשת (עשרות-מאות מילישניות)
מתאים ל- עבודה סולו, אוטומציה מקומית צוותים, אינטגרציות, אישורים חיצוניים
מבנה HTTP Hook
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "url": "https://your-server.com/claude-hook"
      }
    ]
  }
}

מה נשלח בבקשת ה-HTTP

כשההוק מופעל, Claude Code שולח בקשת POST עם JSON body שמכיל את כל המידע הרלוונטי: סוג האירוע, שם הכלי, ה-input של הכלי, מזהה הסשן, חותמת זמן, ונתיב הפרויקט. השרת שלך יכול לעבד את המידע ולהחזיר תשובה שמכילה:

מתי להשתמש ב-HTTP Hooks

HTTP Hooks מצטיינים ב-4 תרחישים עיקריים:

  1. לוגינג מרכזי לצוות — כל חברי הצוות שולחים Hook data לדשבורד אחד. אפשר לראות מה כל מפתח עושה עם Claude
  2. תהליכי אישור — PreToolUse HTTP Hook שדורש אישור ממנהל לפני deploy. השרת בודק אם יש אישור, ומחזיר allow: true/false
  3. אינטגרציה עם n8n / Zapier / Make — כל אירוע Claude Code מפעיל workflow חיצוני. למשל: SessionEnd שולח סיכום ל-Slack
  4. אכיפת מדיניות מרכזית — במקום שכל מפתח יגדיר Hooks מקומיים, יש שרת מרכזי שמגדיר מה מותר ומה אסור

דוגמה מעשית: חיבור ל-n8n

אם יש לך instance של n8n (כלי אוטומציה self-hosted), אתה יכול לחבר Claude Code ישירות ל-workflows שלך. הנה דוגמה שמדווחת לצוות ב-Slack כשסשן מסתיים:

  1. ב-n8n: צור workflow חדש עם Webhook trigger. העתק את ה-webhook URL
  2. ב-settings.json: הגדר HTTP Hook:
    {
      "hooks": {
        "SessionEnd": [
          {
            "url": "https://n8n.your-domain.com/webhook/claude-session-end"
          }
        ]
      }
    }
  3. ב-n8n: הוסף node של Slack/Telegram שמקבל את ה-data מהוובהוק ושולח הודעה: "Claude Code session ended. Duration: X minutes. Files modified: Y"

התוצאה: כל פעם שמפתח בצוות מסיים סשן Claude, ההודעה מגיעה ל-Slack. אין צורך לדווח ידנית.

חשוב לדעת — ביצועים ואבטחה

HTTP Hooks מוסיפים latency של הרשת. אם ה-endpoint שלך לוקח 2 שניות לענות, Claude "ייתקע" 2 שניות על כל פעולה שההוק רץ עליה. זה אומר שהוק HTTP על PostToolUse (שרץ על כל פעולה) עם endpoint איטי יהפוך את Claude לזחלן. שמור את ה-endpoint מהיר — מתחת ל-500 מילישניות. עבור hooks שצריכים לשלוח מידע אבל לא צריכים response — שלח את הבקשה מ-Command Hook עם curl ב-background (curl -s -X POST ... &) והימנע מה-latency לגמרי.

מבחינת אבטחה: השתמש רק ב-HTTPS. אמת את מקור הבקשה עם token סודי — או ב-URL (?token=SECRET) או ב-header מותאם. לעולם אל תשלח credentials, API keys, או מידע רגיש דרך HTTP Hooks — הם עוברים ברשת ויכולים להיחשף.

HTTP Hooks לעומת curl ב-Command Hook — מה עדיף?

יש דרך נוספת לשלוח webhooks: במקום HTTP Hook "רשמי", אתה יכול להשתמש ב-Command Hook שמריץ curl:

{
  "hooks": {
    "SessionEnd": [
      {
        "command": "curl -s -X POST 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK' -d '{\"text\":\"Claude session ended\"}' &"
      }
    ]
  }
}

שני ההבדלים החשובים:

קריטריון HTTP Hook (url) curl ב-Command Hook
Data שנשלח JSON אוטומטי עם כל פרטי האירוע אתה בונה את ה-JSON בעצמך — שליטה מלאה
Response Claude Code מעבד את התשובה (allow/message/modifiedInput) curl רץ ב-background, אתה לא צריך את התשובה
Latency Claude מחכה לתשובה — blocking עם & בסוף — non-blocking, אפס latency
מתאים ל- כשצריך תשובה (approval, modified input) כשצריך רק לשלוח (logging, notifications)

כלל אצבע: אם אתה צריך שהשרת יגיד ל-Claude מה לעשות (allow/block, modify input) — השתמש ב-HTTP Hook. אם אתה רק שולח מידע החוצה (logging, notifications) — Command Hook עם curl ב-background פשוט יותר ומהיר יותר.

עשה עכשיו 3 דקות

חשוב על 2 תרחישים שבהם HTTP Hook יהיה שימושי בעבודה שלך. לדוגמה: (1) שליחת סיכום סשן ל-Slack בסוף כל סשן, (2) PreToolUse hook שדורש אישור מהמנהל לפני deploy ל-production. כתוב את שני התרחישים — נחזור אליהם בתרגילים בסוף הפרק. עבור כל תרחיש, החלט אם HTTP Hook או curl ב-Command Hook עדיף.

בינוני 10 דקות פרקטי

הוק מעשי: Auto-Format בכל עריכה

זה ההוק הכי משפיע שתבנה. Auto-Format מבטיח שכל שורת קוד ש-Claude כותב עומדת בסטנדרטים שלך — אוטומטית, בלי שתצטרך לבקש.

הוק לשפה אחת

אם אתה עובד בשפה אחת, ההגדרה פשוטה:

JavaScript / TypeScript — Prettier
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "command": "prettier --write $CLAUDE_FILE_PATH"
      }
    ]
  }
}
Python — Ruff (או Black)
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "command": "ruff format $CLAUDE_FILE_PATH"
      }
    ]
  }
}
Go — gofmt
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "command": "gofmt -w $CLAUDE_FILE_PATH"
      }
    ]
  }
}

הוק מרובה שפות — הסקריפט הנכון

רוב הפרויקטים כוללים יותר משפה אחת. הגישה הנכונה: סקריפט שמזהה את סיומת הקובץ ומפנה לפורמטר המתאים.

format-on-edit.sh — סקריפט מרובה שפות
#!/bin/bash
# .claude/hooks/format-on-edit.sh
# Auto-format based on file extension

FILE="$CLAUDE_FILE_PATH"
EXT="${FILE##*.}"

case "$EXT" in
  js|jsx|ts|tsx|json|css|html|md)
    prettier --write "$FILE" 2>/dev/null
    ;;
  py)
    ruff format "$FILE" 2>/dev/null
    ;;
  go)
    gofmt -w "$FILE" 2>/dev/null
    ;;
  rs)
    rustfmt "$FILE" 2>/dev/null
    ;;
  *)
    # Unknown extension — do nothing
    exit 0
    ;;
esac

exit 0

ואז ב-settings.json:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "command": "bash .claude/hooks/format-on-edit.sh"
      }
    ]
  }
}

שים לב לכמה פרטים חשובים בסקריפט:

בעיות נפוצות עם Auto-Format

הוק Auto-Format הוא פשוט ליצירה, אבל יש כמה מלכודות שכדאי להכיר:

בעיה: ההוק רץ על קבצי Lock. אם Claude עורך package-lock.json ואתה מריץ prettier עליו, התוצאה עלולה לשבור את ה-lock file. הפתרון: הוסף exclusion ב-prettier config (בקובץ .prettierignore) או בסקריפט עצמו.

בעיה: פירמוט מתנגש עם ה-edit. לעתים נדירות, prettier יכול לשנות את הקובץ באופן שגורם ל-Claude "לאבד" את ההקשר של מה שהוא עורך. זה קורה בעיקר עם קבצים גדולים. אם אתה רואה התנהגות מוזרה — נסה להוסיף השהייה קצרה: sleep 0.1 && prettier --write "$FILE".

בעיה: הפורמטר לא מותקן. אם prettier לא מותקן בפרויקט, ההוק ייכשל בשקט (בזכות 2>/dev/null). זה מתוכנן — אבל כדאי להוסיף בדיקה ב-SessionStart hook שמתריעה אם הפורמטר חסר.

למה PostToolUse ולא PreToolUse?

פירמוט צריך לקרות אחרי שהקובץ נערך — אחרת אין מה לפרמט. לכן אנחנו משתמשים ב-PostToolUse. ה-matcher "Edit" מבטיח שההוק רץ רק כשהכלי Edit הופעל — לא על Read, Bash, או כלים אחרים.

עשה עכשיו 8 דקות

בנה הוק Auto-Format לשפה שאתה עובד בה.

  1. צור תיקייה: mkdir -p .claude/hooks
  2. צור את הסקריפט .claude/hooks/format-on-edit.sh (העתק מהדוגמה למעלה, שנה לפי הצורך)
  3. תן הרשאות הרצה: chmod +x .claude/hooks/format-on-edit.sh
  4. הוסף את ההוק ל-.claude/settings.json
  5. בקש מ-Claude לערוך קובץ ובדוק שהפירמוט רץ

איך לבדוק: כתוב בכוונה קוד לא מפורמט (רווחים חסרים, שורות ארוכות מדי) ובקש מ-Claude להוסיף אותו לקובץ. אם אחרי ההוספה הקוד מפורמט — ההוק עובד.

מתקדם 12 דקות פרקטי

הוק מעשי: חסימת פקודות מסוכנות

זה ההוק שיכול להציל לך את הפרויקט. PreToolUse hook על כלי Bash שבודק את הפקודה ש-Claude עומד להריץ — ואם היא מסוכנת, חוסם אותה לפני שהנזק קורה.

מה חוסמים — ומה לא

יש פיתוי לחסום הכל שנראה מסוכן, אבל זו טעות. Claude צריך גישה ל-rm לניקוי קבצים זמניים, ול-git push לפרויקטים. המפתח הוא לחסום דפוסים ספציפיים מסוכנים, לא פקודות שלמות.

Framework: שלושת רמות האבטחה
רמה פעולה דוגמאות
Tier 1: חסום תמיד exit 1 — הפעולה נעצרת rm -rf /, DROP TABLE, git push --force main, chmod 777, פקודות עם production credentials
Tier 2: התרה + המשך echo warning, exit 0 rm -rf (לא root), git force push (לא ל-main), sudo commands
Tier 3: לוג בלבד כתוב ללוג, exit 0 כל פקודות git, npm install, docker commands

הסקריפט — block-dangerous.sh

סקריפט חסימת פקודות מסוכנות
#!/bin/bash
# .claude/hooks/block-dangerous.sh
# PreToolUse hook for Bash — blocks dangerous commands

CMD="$CLAUDE_BASH_COMMAND"

# ===== TIER 1: ALWAYS BLOCK =====
BLOCKED_PATTERNS=(
  "rm -rf /"
  "rm -rf ~"
  "DROP TABLE"
  "DROP DATABASE"
  "git push --force main"
  "git push --force master"
  "git push -f origin main"
  "git push -f origin master"
  "chmod 777"
  "mkfs\."
  "> /dev/sda"
)

for pattern in "${BLOCKED_PATTERNS[@]}"; do
  if echo "$CMD" | grep -qi "$pattern"; then
    echo "BLOCKED: Command matches dangerous pattern '$pattern'" >&2
    echo "If intentional, run this command manually outside Claude Code." >&2
    exit 1
  fi
done

# ===== TIER 2: WARN BUT ALLOW =====
WARN_PATTERNS=(
  "sudo "
  "rm -rf"
  "--force"
  "--hard"
)

for pattern in "${WARN_PATTERNS[@]}"; do
  if echo "$CMD" | grep -qi "$pattern"; then
    echo "WARNING: Potentially risky command detected: $pattern" >&2
    # Log it, but allow
    echo "$(date '+%Y-%m-%d %H:%M:%S') WARN: $CMD" >> .claude/logs/security.log
  fi
done

# ===== TIER 3: LOG ALL BASH COMMANDS =====
echo "$(date '+%Y-%m-%d %H:%M:%S') CMD: $CMD" >> .claude/logs/commands.log

exit 0

ואז ב-settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "command": "bash .claude/hooks/block-dangerous.sh"
      }
    ]
  }
}

גישה מתקדמת: קובץ Blocklist חיצוני

במקום לערוך את הסקריפט כל פעם שאתה רוצה להוסיף דפוס, שמור את רשימת הדפוסים בקובץ נפרד:

# .claude/blocked-commands.txt
# One pattern per line. Lines starting with # are comments.
rm -rf /
DROP TABLE
DROP DATABASE
git push --force main
chmod 777

הסקריפט קורא את הקובץ:

while IFS= read -r pattern || [[ -n "$pattern" ]]; do
  [[ "$pattern" =~ ^#.*$ ]] && continue  # Skip comments
  [[ -z "$pattern" ]] && continue         # Skip empty lines
  if echo "$CMD" | grep -qi "$pattern"; then
    echo "BLOCKED: $pattern" >&2
    exit 1
  fi
done < .claude/blocked-commands.txt

היתרון: כל חבר צוות יכול להוסיף דפוסים ל-blocklist בלי לגעת בסקריפט. זה גם אומר שאפשר לשמור את ה-blocklist ב-git ולעשות Code Review על שינויים בו — בדיוק כמו כל קוד אחר.

חשיבה על False Positives

ההוק חוסם פקודה שמכילה "DROP TABLE" — אבל מה אם Claude כותב תיעוד שמזכיר את המונח? או מה אם יש פקודה לגיטימית שכוללת "force" (כמו --force-publish ב-Lerna)?

הפתרון: היה ספציפי בדפוסים. במקום לחסום כל מופע של "force", חסום את השילוב "git push --force main". במקום לחסום "DROP", חסום את השילוב "DROP TABLE" או "DROP DATABASE". ככל שהדפוס יותר ספציפי — פחות false positives.

דרך נוספת: אם ההוק חוסם פקודה שאתה צריך להריץ, הודעת החסימה אומרת לך "If intentional, run this command manually outside Claude Code." זה כיוון חשוב — Claude לא צריך להריץ פקודות מסוכנות. אם הפקודה לגיטימית, אתה תריץ אותה בעצמך בטרמינל.

הוספת הגנה על Credentials

סוג נוסף של חסימה שכדאי להוסיף: פקודות שמכילות credentials או secrets. למשל, אם Claude מנסה להריץ פקודה שמכילה API key בטקסט — זה בעייתי, כי הפקודה תופיע ב-bash history, בלוגים, ואולי אפילו ב-git.

# Block commands that contain what looks like API keys
if echo "$CMD" | grep -qE "(sk-[a-zA-Z0-9]{20,}|AKIA[A-Z0-9]{16}|ghp_[a-zA-Z0-9]{36})"; then
  echo "BLOCKED: Command appears to contain an API key or secret." >&2
  echo "Use environment variables instead of hardcoded credentials." >&2
  exit 1
fi
עשה עכשיו 8 דקות

בנה הוק חסימת פקודות מסוכנות.

  1. צור mkdir -p .claude/logs
  2. צור את הסקריפט .claude/hooks/block-dangerous.sh
  3. תן הרשאות: chmod +x .claude/hooks/block-dangerous.sh
  4. הוסף את ההוק ל-settings.json כ-PreToolUse עם matcher "Bash"
  5. בדוק: בקש מ-Claude להריץ echo "DROP TABLE users". ההוק צריך לחסום. אחר כך בקש echo "Hello World" — צריך לעבור

אם הפקודה הראשונה נחסמה והשנייה עברה — ההוק עובד מושלם.

מתקדם 8 דקות פרקטי

הוק מעשי: אכיפת Brand Voice

אם אתה עובד עם Claude על תוכן — מאמרים, תיעוד, קופי שיווקי, או כל טקסט שנועד לקהל חיצוני — אתה צריך לוודא שהתוצאה עומדת בסטנדרט. הוק Brand Voice עושה בדיוק את זה.

הגישה הפשוטה: בדיקת Grep

הדרך הכי מהירה — סקריפט שמחפש מילים ודפוסים אסורים:

brand-check.sh — בדיקת Brand Voice בסיסית
#!/bin/bash
# .claude/hooks/brand-check.sh
# PostToolUse hook on Edit/Write — checks brand guidelines

FILE="$CLAUDE_FILE_PATH"

# Only check content files (not code)
case "$FILE" in
  *.md|*.txt|*.html) ;;
  *) exit 0 ;;
esac

# Forbidden terms
FORBIDDEN=(
  "click here"
  "synergy"
  "leverage"
  "disrupt"
  "game-changer"
)

for term in "${FORBIDDEN[@]}"; do
  if grep -qi "$term" "$FILE"; then
    echo "BRAND WARNING: Found forbidden term '$term' in $FILE" >&2
    echo "Please replace with approved terminology." >&2
  fi
done

exit 0  # Warn but don't block

הגישה לתוכן עברי

כשאתה מייצר תוכן בעברית עם Claude, יש בדיקות ספציפיות שכדאי לעשות:

בדיקת תוכן עברי
# Patterns that indicate "machine translation" Hebrew
BAD_HEBREW=(
  "יש לציין כי"
  "ניתן לראות כי"
  "באופן משמעותי"
  "מומלץ בחום"
  "הינו"
  "הנו"
)

for term in "${BAD_HEBREW[@]}"; do
  if grep -q "$term" "$FILE"; then
    echo "STYLE: '$term' sounds like machine translation. Rewrite naturally." >&2
  fi
done

הגישה המתקדמת: בדיקה מבוססת מודל

grep מצוין לזיהוי מילים ספציפיות, אבל הוא לא מבין הקשר. הביטוי "synergy" יכול להיות בדוגמה של "מה לא לכתוב" — ו-grep יחסום אותו בכל זאת. אם אתה רוצה בדיקה אמיתית של טון ואיכות, אתה יכול לשלוח את התוכן למודל AI מהיר וזול (כמו Haiku) לקבלת חוות דעת:

#!/bin/bash
# brand-check-ai.sh — Advanced brand check using Claude Haiku
# CAUTION: This costs tokens! Use only for final checks, not on every edit.

FILE="$CLAUDE_FILE_PATH"
CONTENT=$(cat "$FILE" | head -500)  # First 500 lines

VERDICT=$(echo "$CONTENT" | curl -s https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "content-type: application/json" \
  -d "{
    \"model\": \"claude-haiku-4-5\",
    \"max_tokens\": 100,
    \"messages\": [{\"role\": \"user\", \"content\": \"Check if this Hebrew content follows brand guidelines: natural tone (not academic), technical terms in English, no machine-translation patterns. Reply only PASS or FAIL with one line explanation.\n\n$CONTENT\"}]
  }" | jq -r '.content[0].text')

if echo "$VERDICT" | grep -q "FAIL"; then
  echo "BRAND CHECK FAILED: $VERDICT" >&2
fi

exit 0  # Always pass — brand check is advisory

הגישה הזו עולה כ-$0.001-0.005 לכל בדיקה (תלוי באורך התוכן). זול, אבל מצטבר. לכן: grep לבדיקות תכופות (כל עריכה), model-based לבדיקות סופיות (לפני פרסום). לעולם אל תריץ בדיקת מודל על כל Edit — זה ישחוק את התקציב שלך.

עלות לעומת תועלת

בדיקת grep היא חינמית ומהירה — מילישניות. בדיקת מודל עולה tokens ולוקחת 1-3 שניות. כלל אצבע: grep לבדיקות תכופות (כל עריכה), model-based לבדיקות סופיות (לפני פרסום). השילוב: grep שובר על דברים ברורים מייד, model-check רץ רק כשאתה מבקש /review.

עשה עכשיו 5 דקות

כתוב רשימה של 5-10 מילים או ביטויים אסורים שאסור שיופיעו בתוכן שלך. אם אתה כותב בעברית — הוסף גם 3-5 דפוסים של "עברית מתורגמת" שאתה לא רוצה לראות. שמור את הרשימה בקובץ .claude/brand-rules.txt — תשתמש בה בתרגילים.

בינוני 10 דקות פרקטי

הוק מעשי: Session Logging ו-Audit Trail

זו אחת מהתועלות הגדולות של Hooks — לדעת בדיוק מה Claude עשה. אם אתה עובד לבד, זה שימושי לדיבוג ומעקב. אם אתה עובד בצוות, זה הכרחי ל-compliance ולהבנה מה קורה.

ארכיטקטורת הלוגינג — 3 הוקים

הלוגינג המלא דורש שלושה Hooks שעובדים ביחד:

session-logging — הגדרה מלאה
{
  "hooks": {
    "SessionStart": [
      {
        "command": "mkdir -p .claude/logs && echo '=== SESSION START ===' >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log && echo \"Time: $(date)\" >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log && echo \"Project: $(pwd)\" >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log && echo \"Session: $CLAUDE_SESSION_ID\" >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log && echo '---' >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log"
      }
    ],
    "PostToolUse": [
      {
        "command": "echo \"$(date '+%H:%M:%S') [$CLAUDE_TOOL_NAME] $CLAUDE_FILE_PATH\" >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log"
      }
    ],
    "SessionEnd": [
      {
        "command": "echo '=== SESSION END ===' >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log && echo \"End: $(date)\" >> .claude/logs/session-$(date +%Y-%m-%d-%H%M).log"
      }
    ]
  }
}

בפועל, עדיף להשתמש בסקריפט ייעודי שמנהל את הלוגינג. הנה גרסה נקייה יותר:

session-logger.sh — סקריפט לוגינג ייעודי
#!/bin/bash
# .claude/hooks/session-logger.sh
# Usage: session-logger.sh [start|tool|end]

LOG_DIR=".claude/logs"
LOG_FILE="$LOG_DIR/session-$(date +%Y-%m-%d).log"
mkdir -p "$LOG_DIR"

case "$1" in
  start)
    echo "" >> "$LOG_FILE"
    echo "========================================" >> "$LOG_FILE"
    echo "SESSION START: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
    echo "Project: $(pwd)" >> "$LOG_FILE"
    echo "Session ID: $CLAUDE_SESSION_ID" >> "$LOG_FILE"
    echo "========================================" >> "$LOG_FILE"
    ;;
  tool)
    echo "  $(date '+%H:%M:%S') [$CLAUDE_TOOL_NAME] $CLAUDE_FILE_PATH" >> "$LOG_FILE"
    ;;
  end)
    echo "========================================" >> "$LOG_FILE"
    echo "SESSION END: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
    echo "========================================" >> "$LOG_FILE"
    ;;
esac

exit 0

ואז ב-settings.json:

{
  "hooks": {
    "SessionStart": [{"command": "bash .claude/hooks/session-logger.sh start"}],
    "PostToolUse": [{"command": "bash .claude/hooks/session-logger.sh tool"}],
    "SessionEnd": [{"command": "bash .claude/hooks/session-logger.sh end"}]
  }
}

מה הלוג מספק לך

אחרי יום עבודה, הקובץ ייראה משהו כזה:

========================================
SESSION START: 2026-03-23 09:15:22
Project: /home/user/my-project
Session ID: sess_abc123
========================================
  09:15:30 [Read] /home/user/my-project/src/App.tsx
  09:16:45 [Edit] /home/user/my-project/src/App.tsx
  09:16:46 [Bash]
  09:18:12 [Edit] /home/user/my-project/src/utils/api.ts
  09:19:30 [Write] /home/user/my-project/src/types/user.ts
  09:22:01 [Bash]
========================================
SESSION END: 2026-03-23 09:25:44
========================================

מהלוג הזה אתה יודע: מתי התחלת ומתי סיימת, אילו קבצים נערכו, וכמה פעולות Claude ביצע. זה לא יסולא בפז לדיבוג ולתיעוד.

שימושים מתקדמים של Session Logging

מעקב עלויות: אם אתה מוסיף ללוג את מספר ה-tool calls, אתה יכול לחשב עלויות משוערות. כל tool call = קריאה ל-API = tokens. עם logging טוב, אתה יודע אילו סשנים היו "יקרים" ולמה.

Compliance בצוותים: בסביבות מוסדרות (fintech, healthcare, govtech), תיעוד של מה AI עשה בקוד הוא דרישה. Session logs מספקים audit trail מלא — מי הריץ, מתי, מה שונה, ומה הפלט.

דיבוג: "למה הקוד נראה ככה?" שבוע אחרי סשן ארוך, אתה מסתכל על קובץ ולא מבין למה הוא נראה ככה. פותח את הלוג ורואה: "14:23:05 [Edit] src/api.ts" — Claude ערך את הקובץ. עכשיו אתה יודע לחפש ב-git log מה שונה.

שליחה לדשבורד: לצוותים, שילוב של HTTP Hook על SessionEnd ששולח סיכום ל-Grafana, Datadog, או אפילו Google Sheet פשוט (דרך Apps Script webhook) — נותן visibility מלא על השימוש ב-Claude Code בצוות.

עשה עכשיו 5 דקות

הגדר את מערכת הלוגינג. צור את הסקריפט .claude/hooks/session-logger.sh, תן הרשאות הרצה, והוסף את 3 ההוקים ל-settings.json. עכשיו עבוד עם Claude כמה דקות — ואז פתח את קובץ הלוג. אתה צריך לראות את כל הפעולות מתועדות. שמור את זה — תודה לעצמך כשתצטרך לדבג משהו שהשתבש.

בינוני 8 דקות פרקטי

הוק מעשי: PostCompact — שמירה על context קריטי

כש-Claude עובד על משימה ארוכה, חלון ה-context (context window) מתמלא. כשהוא מגיע ל-80% קיבולת, מופעלת אוטומטית פעולת compaction — Claude דוחס את השיחה כדי לפנות מקום. הבעיה: ב-compaction, מידע חשוב יכול "ללכת לאיבוד". פרטי משימה, הוראות ספציפיות, מידע על סביבת הפרויקט — הכל יכול להימחק.

PostCompact hook פותר את הבעיה הזו. הוא רץ אחרי כל compaction ומזריק מחדש מידע קריטי שאתה רוצה שישרוד. חשוב על זה כמו "פתק דביק" שנשאר גם אחרי שמנקים את השולחן.

איך לבנות PostCompact Hook

הגישה הפשוטה: קובץ טקסט עם המידע שחייב לשרוד, וסקריפט שמדפיס אותו.

PostCompact hook — הזרקת context קריטי
# .claude/critical-context.txt
# ================================
# מידע שחייב לשרוד compaction:
# ================================
Current task: Building payment integration API
Test command: npm run test:payments
Deploy restriction: NEVER push directly to main
Key file: src/services/payments.ts
API endpoint: https://api.staging.example.com
Database: Use test DB only (never prod)
#!/bin/bash
# .claude/hooks/inject-context.sh
# PostCompact hook — re-inject critical context after compaction

if [ -f .claude/critical-context.txt ]; then
  echo "=== CRITICAL CONTEXT (restored after compaction) ==="
  cat .claude/critical-context.txt
  echo "==================================================="
fi
exit 0

ב-settings.json:

{
  "hooks": {
    "PostCompact": [
      {"command": "bash .claude/hooks/inject-context.sh"}
    ]
  }
}

עכשיו, בכל פעם ש-Claude עושה compaction — או שאתה מריץ /compact ידנית — המידע הקריטי מוזרק מחדש. Claude "זוכר" את מה שחשוב, גם אחרי ניקוי ה-context.

טיפ: עדכן את הקובץ

ה-critical-context.txt צריך להתעדכן כשהפרויקט משתנה. אם היום אתה עובד על payments ומחר על auth — עדכן את הקובץ. זה לא "תגדיר ותשכח" — זה "תעדכן לפי מה שרלוונטי עכשיו".

עשה עכשיו 5 דקות

צור את קובץ ה-context הקריטי שלך. פתח קובץ .claude/critical-context.txt וכתוב 3-5 שורות של מידע שחייב לשרוד compaction בפרויקט שלך. לדוגמה: על מה אתה עובד עכשיו, איך מריצים טסטים, ואילו פקודות אסורות. אחרי שכתבת, הגדר את ה-PostCompact hook ב-settings.json. בפעם הבאה ש-Claude עושה compaction — המידע ישרוד.

מתקדם 8 דקות תיאוריה

Hooks ב-Agent ו-Skill Frontmatter

מאז גרסה 2.1.0 (ינואר 2026), Hooks יכולים להיות מוגדרים גם בתוך ה-YAML frontmatter של קובצי Agent ו-Skill. זה אומר שכל Skill יכול להביא איתו את ההוקים שלו — הם פעילים רק כשה-Skill רץ, ומתבטלים כשהוא נגמר.

למה זה חשוב

בלי Frontmatter Hooks, אתה צריך הוקים גלובליים שרצים על הכל. זה בעייתי כי:

עם Frontmatter Hooks, כל Skill מביא את ההוקים שלו. ה-content-writer skill מביא הוק Brand Voice. ה-deploy skill מביא הוק בדיקת tests. כל אחד פעיל רק כשהוא צריך.

איך זה עובד

Skill עם Hooks ב-Frontmatter
---
name: content-writer
description: Writes marketing content in Hebrew
hooks:
  PostToolUse:
    - matcher: Edit
      command: bash .claude/hooks/brand-check.sh
    - matcher: Write
      command: bash .claude/hooks/brand-check.sh
---

# Content Writer Skill
Write marketing content following our brand guidelines...

Framework: "Layered Hooks" — שכבות של הוקים

חשוב להבין את סדר העדיפויות. Hooks מתנהגים בשכבות:

שכבה מיקום מה היא אוכפת תמיד פעילה?
גלובלית ~/.claude/settings.json כללי אבטחה, לוגינג בסיסי כן — בכל פרויקט, בכל סשן
פרויקט .claude/settings.json סטנדרטים של הפרויקט: פירמוט, testing כן — בכל סשן של הפרויקט הזה
Skill/Agent YAML frontmatter בדיקות ספציפיות ל-workflow לא — רק כשה-Skill פעיל

חשוב: Frontmatter hooks רצים בנוסף להוקים הגלובליים והפרויקטיים. הם לא מחליפים אותם. הוק אבטחה גלובלי תמיד ירוץ, גם אם ל-Skill אין הוקים משלו.

דוגמה מעשית: Skill ל-Deploy עם הוקים

תדמיין שיש לך Skill ששמו /deploy. הוא מריץ את תהליך ה-deployment של הפרויקט. אתה רוצה שלפני כל deploy יהיה בדיקת tests מלאה, ואחרי ה-deploy תשלח הודעה ל-Slack:

deploy skill עם hooks
---
name: deploy
description: Deploy the project to production
hooks:
  PreToolUse:
    - matcher: Bash
      command: npm test
  PostToolUse:
    - matcher: Bash
      command: |
        if echo "$CLAUDE_BASH_COMMAND" | grep -q "deploy"; then
          curl -s -X POST "$SLACK_WEBHOOK" \
            -d '{"text":"Deploy completed for $(basename $(pwd))"}'
        fi
---

# Deploy Skill
Deploy the current project to production.
1. Run all tests first
2. Build the project
3. Deploy to production server
4. Verify deployment is healthy

ההוקים האלה פעילים רק כשאתה מריץ /deploy. כשאתה עובד רגיל — הם לא קיימים. זו הנקודה: hooks ברמת Skill הם "קוד שנוסע עם ה-workflow" — לא עומס שרץ כל הזמן.

בפרק הבא (פרק 2 — Custom Agents) נלמד לבנות agents ו-skills מאפס. מה שחשוב להבין כאן: Hooks הם לא רק עניין של settings.json. הם חלק אינטגרלי ממערכת ה-Skills וה-Agents של Claude Code.

עשה עכשיו 3 דקות

מפה את ההוקים שלך לשלוש שכבות. קח את ה-3 הוקים שבנית (format, security, logging) ותחליט: איזה צריך להיות גלובלי (רץ תמיד), איזה ברמת פרויקט, ואיזה ברמת Skill. רמז: אבטחה ולוגינג — גלובלי. פירמוט — פרויקט. Brand voice — Skill.

בינוני 10 דקות פרקטי

Debugging Hooks — כשמשהו לא עובד

הוקים יפלו. זה לא שאלה של "אם" אלא "מתי". ההוק לא מופעל, או שהוא נכשל בשקט, או שהוא חוסם דברים שהוא לא צריך לחסום. הדיבוג של Hooks הוא מיומנות קריטית.

בעיות נפוצות ופתרונות

סימפטום סיבה אפשרית פתרון
ההוק לא רץ בכלל נתיב שגוי לסקריפט, או הסקריפט לא executable בדוק chmod +x, בדוק נתיב מלא
ההוק רץ אבל לא עושה כלום ה-matcher לא מתאים לכלי בדוק ש-matcher = "Edit" (לא "edit" — case sensitive)
"Hook blocked this action" על כל פקודה הסקריפט יוצא עם exit 1 גם על פקודות לגיטימיות הוסף logging לסקריפט, בדוק את הלוגיקה
ההוק רץ אבל הפירמוט לא עובד הפורמטר לא מותקן ב-PATH הרץ which prettier בטרמינל, ודא התקנה
שגיאת permission denied הסקריפט לא executable, או הנתיב לא נגיש chmod +x על הסקריפט, בדוק הרשאות תיקייה
טעות נפוצה: שכחת chmod +x על סקריפט ההוק

הטעות: כתבת הוק מושלם, הגדרת אותו ב-settings.json — ושום דבר לא קורה. אפס תגובה. אתה בודק JSON, מחפש שגיאות בלוגיקה, ומשתגע.

למה זה מפתה: אתה מתרכז בלוגיקה של ההוק ושוכח את הבסיס — הרשאות קובץ.

מה לעשות במקום: תמיד הריצו chmod +x .claude/hooks/*.sh אחרי יצירת סקריפט חדש. הוסיפו את זה כשלב ראשון בכל workflow של יצירת הוק. טיפ: שימו את ה-chmod בהוראות README של תיקיית ההוקים.

שיטת הדיבוג: "Echo First"

הדרך הכי אמינה לדבג הוק: תוסיף echo כשורה ראשונה. אם ה-echo מופיע בלוג — ההוק רץ. אם לא — הבעיה בהפעלה, לא בלוגיקה.

#!/bin/bash
# Add this as the FIRST LINE of any hook during debugging:
echo "HOOK FIRED: tool=$CLAUDE_TOOL_NAME file=$CLAUDE_FILE_PATH" >> /tmp/claude-hooks-debug.log

# ... rest of your hook logic

טסט ידני — הרץ את ההוק בעצמך

אתה לא חייב לחכות ל-Claude כדי לבדוק הוק. הרץ אותו ידנית מהטרמינל:

# Set the environment variables Claude would set:
export CLAUDE_FILE_PATH="/path/to/test-file.ts"
export CLAUDE_TOOL_NAME="Edit"
export CLAUDE_BASH_COMMAND="npm test"
export CLAUDE_SESSION_ID="test-session"

# Run the hook:
bash .claude/hooks/format-on-edit.sh
echo "Exit code: $?"

אם ההוק עובד בטרמינל אבל לא בתוך Claude Code — הבעיה היא בהגדרת ה-settings.json או בסביבת ההרצה.

הפקודה /doctor

Claude Code כולל פקודה מובנית — /doctor — שבודקת בעיות נפוצות בהגדרות, כולל Hooks. אם אתה חושד שמשהו לא תקין, הרץ /doctor ובדוק את הפלט.

Hook Source Display

מאז גרסה 2.1.75, כש-Claude מבקש הרשאה לפעולה, הוא גם מציג מאיזה קובץ settings.json ההוק הגיע. זה עוזר מאוד כשיש לך הוקים ברמה גלובלית וגם ברמת פרויקט — ופתאום משהו נחסם ואתה לא יודע למה. ה-source display אומר לך: "ההוק הזה הגיע מ-~/.claude/settings.json" או "מ-.claude/settings.json" — ואתה יודע לאיפה לגשת כדי לתקן.

Troubleshooting Flow — שלב אחרי שלב

כשהוק לא עובד כצפוי, עבור על הרשימה הזו בסדר:

  1. בדוק שהקובץ settings.json תקין: הרץ python3 -m json.tool .claude/settings.json — אם יש שגיאת syntax, הקובץ כולו לא ייקרא
  2. בדוק שהסקריפט executable: ls -la .claude/hooks/format-on-edit.sh — צריך לראות -rwxr-xr-x
  3. בדוק שהסקריפט רץ בעצמו: הרץ אותו ידנית מהטרמינל עם export של משתני הסביבה
  4. הוסף echo ראשון: שורה ראשונה בסקריפט: echo "HOOK ALIVE" >> /tmp/hook-test.log
  5. בדוק ב-Claude Code: בקש מ-Claude לעשות פעולה שצריכה להפעיל את ההוק
  6. בדוק את הלוג: cat /tmp/hook-test.log — אם יש "HOOK ALIVE", ההוק רץ
  7. אם ההוק לא רץ: בדוק matcher (case sensitive!), בדוק event type, בדוק נתיב הסקריפט
  8. אם ההוק רץ אבל לא עובד: הבעיה בלוגיקה — דבג את הסקריפט עצמו
עשה עכשיו 5 דקות

בדוק את כל ההוקים שבנית. הוסף שורת debug logging לכל הוק (echo ל-/tmp/claude-hooks-debug.log). אחר כך בקש מ-Claude לעשות שלוש פעולות: עריכת קובץ, הרצת פקודה, ולפתוח סשן חדש (צא ותכנס מחדש). פתח את הלוג ובדוק שכל ה-3 הוקים רצו. אחרי שוידאת, תוכל להסיר את שורות ה-debug.

בינוני 5 דקות תיאוריה

הדגל --bare — כשאתה רוצה לדלג על Hooks

מאז גרסה 2.1.81 (מרץ 2026), אפשר להריץ Claude Code עם הדגל --bare. מה הוא עושה? הוא מדלג על כל ההוקים, וגם על LSP, plugins, וסריקת תיקיית Skills. התוצאה: הפעלה מהירה בהרבה, בלי "תקורת" אוטומציה.

למה זה חשוב להבין?

אם אתה בונה מערכת Hooks מורכבת, אתה צריך לדעת שיש מצב שבו היא לא תרוץ. --bare משמש בעיקר ב-CI/CD pipelines ובסקריפטים אוטומטיים שבהם מהירות חשובה יותר מאכיפה:

# CI/CD pipeline — hooks לא רצים כאן
claude -p "run all tests and report results" --bare

# עבודה רגילה — hooks רצים כרגיל
claude

הנקודה: אם אתה מסתמך על Hooks לאבטחה (חסימת פקודות מסוכנות), דע ש---bare עוקף את ההגנה הזו. ב-CI/CD זה בסדר — שם יש לך הגנות אחרות (permissions, read-only repos). אבל אם מישהו בצוות מריץ --bare על מכונה מקומית כדי לעקוף הוקים — זו בעיה. ודא שה---bare משמש רק לאוטומציה, לא כ-"דרך עוקפת".

חשוב לדעת

--bare עובד רק עם מצב -p (CLI mode / headless). אי אפשר להשתמש בו בסשן אינטראקטיבי רגיל. בנוסף, הוא דורש ANTHROPIC_API_KEY או apiKeyHelper — OAuth ו-keychain לא זמינים. זה מכוון: --bare נועד לסקריפטים, לא לבני אדם.

עשה עכשיו 2 דקות

בדוק מה קורה עם --bare. הרץ שתי פקודות ושים לב להבדל:

# עם hooks (רגיל):
claude -p "echo hello"

# בלי hooks (bare):
claude -p "echo hello" --bare

שים לב למהירות ההפעלה — --bare צריך להיות מהיר יותר. זה לא חלק מהעבודה היומיומית שלך, אבל חשוב שתבין שהאפשרות קיימת.

מתקדם 12 דקות פרקטי

דפוסים מתקדמים

עכשיו שאתה מבין את הבסיס, בוא נראה דפוסים מתקדמים שפותחים אפשרויות חדשות.

1. Chained Hooks — שרשור הוקים

אפשר להגדיר מספר הוקים על אותו אירוע. הם רצים בסדר שהם מוגדרים:

{
  "hooks": {
    "PostToolUse": [
      {"matcher": "Edit", "command": "bash .claude/hooks/format-on-edit.sh"},
      {"matcher": "Edit", "command": "bash .claude/hooks/lint-check.sh"},
      {"matcher": "Edit", "command": "bash .claude/hooks/brand-check.sh"}
    ]
  }
}

הסדר: format → lint → brand check. אם הוק אחד נכשל (exit 1), ההוקים הבאים עדיין ירוצו (חוץ מ-PreToolUse, שם exit 1 חוסם את הפעולה עצמה).

2. Conditional Hooks — הוקים מותנים לפי סוג קובץ

במקום הוק אחד גדול, צור סקריפט שמחליט מה לעשות לפי הסיומת:

#!/bin/bash
# .claude/hooks/smart-check.sh
# Runs different checks based on file type

EXT="${CLAUDE_FILE_PATH##*.}"

case "$EXT" in
  ts|tsx)
    npx tsc --noEmit "$CLAUDE_FILE_PATH" 2>/dev/null
    ;;
  py)
    mypy "$CLAUDE_FILE_PATH" 2>/dev/null
    ;;
  go)
    go vet "$CLAUDE_FILE_PATH" 2>/dev/null
    ;;
esac

exit 0

3. Stateful Hooks — הוקים עם זיכרון

הוקים יכולים לשמור מידע בקובץ זמני ולקרוא אותו בהפעלות הבאות. דוגמה: ספירת עריכות — אחרי כל 10 עריכות, הרץ את כל הטסטים.

#!/bin/bash
# .claude/hooks/edit-counter.sh
# Run tests every 10 edits

COUNTER_FILE="/tmp/claude-edit-count"
COUNT=$(cat "$COUNTER_FILE" 2>/dev/null || echo 0)
COUNT=$((COUNT + 1))
echo "$COUNT" > "$COUNTER_FILE"

if [ $((COUNT % 10)) -eq 0 ]; then
  echo "Running tests after $COUNT edits..."
  npm test 2>/dev/null
fi

exit 0

4. Cross-Session Hooks — המשכיות בין סשנים

SessionEnd hook ששומר סיכום, ו-SessionStart hook שקורא אותו — יוצרים "זיכרון" בין סשנים:

# SessionEnd: save what we worked on
echo "$(date): Worked on $CLAUDE_FILE_PATH" >> .claude/last-session.txt

# SessionStart: remind what we did last time
if [ -f .claude/last-session.txt ]; then
  echo "=== Last session summary ==="
  tail -5 .claude/last-session.txt
  echo "==========================="
fi

5. Rate-Limiting Hooks — הגבלת קצב

מנע מ-Claude לבצע יותר מדי פעולות בזמן קצר. שימושי במיוחד לפקודות Bash שגישת ל-APIs חיצוניים:

#!/bin/bash
# .claude/hooks/rate-limit.sh
# Block if more than 5 Bash commands in last 60 seconds

LIMIT_FILE="/tmp/claude-rate-limit"
NOW=$(date +%s)
WINDOW=60
MAX=5

# Clean old entries
touch "$LIMIT_FILE"
awk -v cutoff=$((NOW - WINDOW)) '$1 > cutoff' "$LIMIT_FILE" > "${LIMIT_FILE}.tmp"
mv "${LIMIT_FILE}.tmp" "$LIMIT_FILE"

# Count recent commands
COUNT=$(wc -l < "$LIMIT_FILE")
if [ "$COUNT" -ge "$MAX" ]; then
  echo "RATE LIMIT: Too many commands ($COUNT in last ${WINDOW}s). Slow down." >&2
  exit 1
fi

echo "$NOW" >> "$LIMIT_FILE"
exit 0

6. Hooks שמשנים את ה-Input של Claude

PreToolUse hook לא חייב רק לחסום — הוא יכול גם לשנות את מה ש-Claude עומד לעשות. על ידי כתיבת output מסוים ל-stdout בפורמט שמוגדר, ההוק יכול לשנות את ה-input של הכלי. לדוגמה: אם Claude עומד להריץ npm install package, ההוק יכול להוסיף --save-exact באופן אוטומטי.

זהו pattern מתקדם שדורש הבנה של הפורמט שבו Claude Code מצפה לקבל את ה-modified input. הוא שימושי במיוחד לאכיפת conventions — למשל, לוודא שכל git commit כולל signing, או שכל docker run כולל --rm.

מתי כדאי ומתי לא כדאי להשתמש בדפוסים מתקדמים

דפוס כדאי כש- לא כדאי כש-
Chained יש לך pipeline ברור: lint → test → notify ההוקים לא תלויים זה בזה
Conditional פרויקט Multi-language שפה אחת — עדיף matcher ישיר
Stateful רוצה לעקוב אחרי מגמות (כמה edits, כמה tests) מידע שצריך להיות אמין — temp files נמחקים ב-reboot
Cross-Session רוצה המשכיות בין סשנים (ממשיך ממה שנעצרנו) CLAUDE.md כבר מטפל בזה — חפיפה מיותרת
Rate-Limiting Claude שולח יותר מדי API calls או עושה שינויים מהירים מדי עבודה רגילה — rate limiting מאט את Claude ללא סיבה
טיפ מקצועי

דפוסים מתקדמים הם עוצמתיים, אבל אל תוסיף מורכבות שאתה לא צריך. תתחיל עם 3 הוקים בסיסיים (format, security, logging), תעבוד איתם שבוע-שבועיים, ורק אז תוסיף דפוסים מתקדמים כשאתה מרגיש שחסר משהו. Over-engineering של Hooks הוא real — ראיתי מפתחים שכתבו 15 הוקים ובסוף ביטלו את רובם כי הם האטו את העבודה.

מתחיל-בינוני 8 דקות פרקטי

Frameworks להחלטות — איזה הוק, איפה, ומתי

מסגרת החלטה: Command Hook או HTTP Hook?
תרחיש בחר Command Hook בחר HTTP Hook
עבודה סולו תמיד. מהיר, פשוט, בלי תלות ברשת
צוות קטן (2-5) אכיפה מקומית, פירמוט, טסטים לוגינג מרכזי, התראות Slack
צוות גדול / Enterprise בסיס — אבטחה ופירמוט אכיפת מדיניות מרכזית, approval workflows, audit
פעולה שדורשת <100ms תמיד. Shell הוא מהיר
פעולה שדורשת שירות חיצוני כן. Webhook לשירות
מסגרת החלטה: PreToolUse או PostToolUse?
מה אתה רוצה לעשות Event למה
חסום פעולה מסוכנת PreToolUse צריך לעצור לפני שהנזק קורה
פרמט קוד PostToolUse צריך לפרמט אחרי שהקובץ נערך
לוג כל פעולה PostToolUse מתעד מה קרה — לא צריך לחסום
שנה פקודה (הוסף flags) PreToolUse צריך לשנות את ה-input לפני ההרצה
הרץ טסטים אחרי שינוי PostToolUse צריך קוד שנערך כדי לבדוק אותו
בדוק Brand Voice PostToolUse צריך תוכן שנכתב כדי לבדוק אותו
מסגרת החלטה: גלובלי, פרויקטי, או Skill?

כלל פשוט:

מתחיל 5 דקות פרקטי

שגרת עבודה — Hooks שוטף

שגרת עבודה — Hooks

Hooks הם לא "תגדיר ותשכח". הפרויקט שלך מתפתח, הצוות גדל, הצרכים משתנים. הנה השגרה שתשמור את ה-Hooks שלך חיים ושימושיים:

תדירות מה לעשות זמן
כל יום סקירה מהירה של הלוגים — האם יש BLOCKED או WARNING? האם ההוקים רצו כצפוי? 2 דקות
כל שבוע בדוק שכל ההוקים עדיין פעילים (שנה קובץ, הרץ פקודה, ובדוק שהלוגים מתעדכנים). בדוק גם security.log — האם Claude ניסה משהו מסוכן? 5 דקות
כל שבוע בדוק שאין false positives — האם הוק חסם פעולה לגיטימית השבוע? עדכן את ה-blocklist אם צריך 3 דקות
כל חודש סקירה מלאה: האם יש הוק שצריך לעדכן? האם הוספת שפה חדשה לפרויקט שדורשת פורמטר? האם ה-blocklist מעודכן? עדכן את ה-blocked-commands.txt אם צריך 15 דקות
בכל שינוי גדול בפרויקט אם הוספת שפת תכנות, שירות חדש, או הגדרת deployment חדש — בדוק שההוקים מכסים את זה. הוסף הוקים חדשים אם צריך 15-30 דקות

Best Practices לתחזוקת Hooks

אחרי שבועות של עבודה עם Hooks, הנה כמה best practices שנלמדו מניסיון:

  1. כל הוק בקובץ נפרד. במקום inline commands ב-settings.json, שמור כל הוק כסקריפט ב-.claude/hooks/. זה מאפשר version control, debugging קל יותר, ושימוש חוזר
  2. הוסף comments בסקריפטים. שורה ראשונה: מה ההוק עושה. שורה שנייה: על איזה event הוא רץ. עתיד-אתה יודה לך
  3. בדוק הוקים ב-CI/CD. אם ההוקים שלך ב-git, הוסף בדיקה שמוודאת שהם syntactically valid: bash -n .claude/hooks/*.sh
  4. נקה לוגים ישנים. קבצי לוג גדלים. הוסף הוק SessionStart שמנקה לוגים ישנים מלפני 30 יום
  5. תעד את ההוקים. צור .claude/hooks/README.md עם תיאור קצר של כל הוק — מה הוא עושה, למה הוא קיים, ואיך לבטל אותו אם צריך
הוק ניקוי לוגים — SessionStart
#!/bin/bash
# .claude/hooks/cleanup-logs.sh
# Runs on SessionStart — cleans logs older than 30 days

find .claude/logs -name "*.log" -mtime +30 -delete 2>/dev/null
exit 0
טיפ: ניקוי לוגים

קבצי לוג גדלים מהר כשאתה עובד עם Claude כל יום. הוסף את הוק הניקוי ל-SessionStart — ותמיד יהיו לך לוגים של החודש האחרון בלבד. נקי ושימושי.

הכל ביחד — settings.json שלם ומוכן

הנה דוגמה מלאה של .claude/settings.json שמשלב את כל ההוקים שלמדנו בפרק הזה. זה ה-baseline שלך — הנקודה שממנה אתה ממשיך לבנות:

settings.json — דוגמה מלאה
{
  "hooks": {
    "SessionStart": [
      {
        "command": "bash .claude/hooks/session-logger.sh start"
      },
      {
        "command": "bash .claude/hooks/cleanup-logs.sh"
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "command": "bash .claude/hooks/block-dangerous.sh"
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit",
        "command": "bash .claude/hooks/format-on-edit.sh"
      },
      {
        "matcher": "Write",
        "command": "bash .claude/hooks/format-on-edit.sh"
      },
      {
        "command": "bash .claude/hooks/session-logger.sh tool"
      }
    ],
    "PostCompact": [
      {
        "command": "bash .claude/hooks/inject-context.sh"
      }
    ],
    "SessionEnd": [
      {
        "command": "bash .claude/hooks/session-logger.sh end"
      }
    ]
  }
}

שים לב לסדר ולמבנה: SessionStart כולל לוגינג + ניקוי לוגים ישנים. PreToolUse כולל חסימת פקודות מסוכנות. PostToolUse כולל שלושה הוקים — שניים עם matcher (format on Edit/Write) ואחד בלי matcher (logging כל tool use). PostCompact מזריק context קריטי אחרי compaction. SessionEnd סוגר את הלוג. הלוגינג רץ על כל כלי — כולל Read, Bash, Grep — בלי קשר ל-matcher. זה מכוון: אנחנו רוצים לתעד הכל.

סיכום קבצים בתיקיית .claude/hooks/

עד עכשיו יצרנו 5 סקריפטים. הנה התיקייה המלאה שלך:

קובץ תפקיד Event
format-on-edit.sh פירמוט קוד אוטומטי לפי סיומת הקובץ PostToolUse (Edit/Write)
block-dangerous.sh חסימת פקודות מסוכנות (rm -rf, DROP TABLE, force push) PreToolUse (Bash)
session-logger.sh תיעוד כל פעולה — start, tool use, end SessionStart + PostToolUse + SessionEnd
inject-context.sh הזרקת context קריטי אחרי compaction PostCompact
cleanup-logs.sh ניקוי לוגים ישנים (מעל 30 יום) SessionStart
בינוני-מתקדם 45-60 דקות פרקטי

תרגילים מעשיים

תרגיל 1: בנה "Hook Suite" מלא

בנה מערכת של 3 הוקים שעובדים ביחד. זה התרגיל המסכם של הפרק.

  1. צור את מבנה התיקיות:
    mkdir -p .claude/hooks .claude/logs
  2. כתוב 3 סקריפטים:
    • format-on-edit.sh — PostToolUse, matcher: Edit
    • block-dangerous.sh — PreToolUse, matcher: Bash
    • session-logger.sh — SessionStart + PostToolUse + SessionEnd
  3. תן הרשאות: chmod +x .claude/hooks/*.sh
  4. הגדר ב-settings.json — שלב את כל ההוקים בקובץ אחד
  5. בדוק: עבוד עם Claude 5 דקות. אחר כך:
    • האם הקבצים שנערכו מפורמטים? (format)
    • בקש מ-Claude להריץ rm -rf / — האם נחסם? (security)
    • פתח את .claude/logs/ — האם כל הפעולות מתועדות? (logging)

זמן משוער: 20-30 דקות. התוצאה: מערכת Hooks עובדת שמגנה, מפרמטת ומתעדת — אוטומטית.

תרגיל 2: הוק HTTP — שלח התראות ל-Webhook

בנה HTTP Hook שמדווח על SessionEnd לשירות חיצוני.

  1. צור webhook endpoint: לך ל-webhook.site וקבל URL ייחודי (חינמי)
  2. הגדר HTTP Hook:
    {
      "hooks": {
        "SessionEnd": [
          {
            "url": "https://webhook.site/YOUR-UNIQUE-ID"
          }
        ]
      }
    }
  3. סיים סשן של Claude Code (הקלד /exit)
  4. בדוק ב-webhook.site — האם הגיעה בקשת POST? מה יש ב-body?
  5. בונוס: אם יש לך n8n או Zapier — חבר את ה-webhook ל-workflow שישלח לך הודעה ב-Slack או ב-Telegram

זמן משוער: 10-15 דקות. התוצאה: הבנה מעשית של HTTP Hooks ואיך הם מתחברים לעולם החיצוני.

תרגיל 3: הוק מתקדם — ספירת עריכות ו-Auto Test

בנה הוק "חכם" שסופר עריכות ומריץ טסטים אוטומטית.

  1. צור סקריפט edit-counter.sh שסופר כמה עריכות Claude עשה (שמור counter ב-/tmp)
  2. כל 5 עריכות — הרץ את ה-test suite של הפרויקט (npm test / pytest / go test)
  3. כתוב את תוצאת הטסט ללוג (pass/fail + timestamp)
  4. בדוק: בקש מ-Claude לעשות 6 עריכות קטנות. אחרי העריכה החמישית, הטסטים צריכים לרוץ אוטומטית

זמן משוער: 15-20 דקות. התוצאה: הוק stateful שמוסיף שכבת בטיחות אוטומטית.

תרגיל 4: PostCompact Hook — שמור על context קריטי

בנה הוק שמזריק מידע חשוב מחדש אחרי compaction.

  1. צור קובץ .claude/critical-context.txt עם 3-5 שורות מידע קריטי שחייב לשרוד compaction. לדוגמה: "Current task: building payment API", "Test command: npm run test:api", "Deploy: never push to main directly"
  2. כתוב סקריפט inject-context.sh שקורא את הקובץ ומדפיס אותו ל-stdout:
    #!/bin/bash
    if [ -f .claude/critical-context.txt ]; then
      echo "=== CRITICAL CONTEXT (post-compact) ==="
      cat .claude/critical-context.txt
      echo "======================================="
    fi
    exit 0
  3. הגדר PostCompact hook:
    "PostCompact": [{"command": "bash .claude/hooks/inject-context.sh"}]
  4. בדוק: עבוד עם Claude על פרויקט ארוך עד ש-Claude עושה compaction (או הרץ /compact ידנית). ההוק צריך להזריק את המידע הקריטי מחדש

זמן משוער: 10 דקות. התוצאה: מידע חשוב ששורד compaction — Claude לא "שוכח" דברים קריטיים.

אם אתה עושה רק דבר אחד מהפרק הזה 5 דקות

הוסף הוק Auto-Format אחד ל-.claude/settings.json. אם אתה עובד ב-JavaScript/TypeScript, הוסף prettier. אם Python, הוסף ruff. אם Go, הוסף gofmt. חמש שורות JSON. חמש דקות עבודה. מהרגע הזה, כל קוד ש-Claude כותב בפרויקט שלך יהיה מפורמט לפי הסטנדרטים שלך. אוטומטית. תמיד. בלי שתצטרך לבקש.

בדוק את עצמך — האם עברת את פרק 1?

בדוק את עצמך — 5 שאלות

ענה על 5 השאלות האלה. אם אתה יכול לענות על 4 מתוך 5 — אתה מוכן לפרק הבא.

  1. למה PreToolUse hook מתאים לחסימת פקודות מסוכנות ולא PostToolUse? (רמז: PreToolUse מופעל לפני שהפעולה רצה — יכול למנוע נזק. PostToolUse רץ אחרי — מאוחר מדי)
  2. איך Command Hook שונה מ-HTTP Hook, ומתי כדאי להשתמש בכל אחד? (רמז: Command = Shell מקומי, מהיר, לעבודה סולו. HTTP = POST לשרת, לצוותים ואינטגרציות)
  3. מה קורה כש-Claude Code עובר compaction, ואיך PostCompact hook עוזר? (רמז: Compaction מוחק context ישן. PostCompact מזריק מידע קריטי מחדש)
  4. למה הגדרת matcher היא קריטית, ומה קורה בלי matcher? (רמז: בלי matcher ההוק רץ על כל כלי — כולל Read ו-Grep. עם matcher = "Edit" הוא רץ רק על עריכות)
  5. מתי לשים Hook ברמה גלובלית, מתי בפרויקט, ומתי ב-Skill frontmatter? (רמז: גלובלי = כלל-פרויקטי כמו אבטחה. פרויקט = ספציפי כמו formatter. Skill = זמני לworkflow)

אם נתקעת — גלול חזרה לסעיף הרלוונטי. אין בושה בלקרוא שוב. הנקודה היא להבין, לא לזכור.

צ'קליסט — סיכום פרק 1

סיכום הפרק

סיכום פרק 1 — Hooks

התובנה המרכזית של הפרק הזה: Claude Code הוא הסתברותי, אבל תהליך העבודה שלך לא חייב להיות. Hooks הם השכבה הדטרמיניסטית שמגשרת על הפער — הם רצים תמיד, בדיוק כמו שהגדרת, בלי לסמוך על זיכרון או שיקול דעת. מה שהשתנה בהבנה שלך: במקום לראות ב-Claude כלי שאתה "מבקש" ממנו דברים, עכשיו יש לך מערכת שבה Claude עובד בתוך מסגרת של כללים אוטומטיים. הקונספט שמחבר הכל הוא "Deterministic Guardrails" — תן ל-Claude לטפל בחשיבה היצירתית, ולהוקים לאכוף את הסטנדרטים. בפרק הבא נעבור ל-Custom Agents — סוכנים עצמאיים שעובדים בשבילך, ונשתמש ב-Hooks שבנינו כאן כבסיס לאכיפה אוטומטית גם בתוך הסוכנים.