מדריך קלוד קוד בעברית

תיעוד 116

התאמה אישית של שורת המצב

הגדרת סרגל מצב מותאם אישית כדי לנטר שימוש בחלון ההקשר, עלויות ומצב git ב-Claude Code

שורת המצב היא סרגל הניתן להתאמה אישית בתחתית של Claude Code, אשר מריץ כל סקריפט מעטפת (shell) שתגדיר. היא מקבלת נתוני הפעלה בפורמט JSON דרך stdin ומציגה את כל מה שהסקריפט שלך מדפיס, ומספקת לך מבט קבוע ומהיר על ניצול ההקשר, עלויות, מצב git, או כל דבר אחר שתרצה לעקוב אחריו.

שורות מצב שימושיות כאשר אתה:

  • רוצה לנטר את השימוש בחלון ההקשר תוך כדי עבודה
  • צריך לעקוב אחר עלויות ההפעלה
  • עובד על פני מספר הפעלות וצריך להבדיל ביניהן
  • רוצה שענף ומצב ה-git יהיו גלויים תמיד

שורת המצב מוצגת בשורה משלה מעל התגים (badges) המובנים של הכותרת התחתונה ואינה מחליפה אותם. כאשר מוגדרת שורת מצב מותאמת אישית, Claude Code מפסיק להציג את רוב רמזי המקלדת של הכותרת התחתונה, כולל esc to interrupt, ברירת המחדל של ? for shortcuts, והרמז hold space to speak להכתבה קולית (voice dictation). כדי להוסיף תגי קישורים הניתנים ללחיצה לכותרת התחתונה כאשר מזהה מופיע בשיחה, מבלי לכתוב סקריפט, הגדר במקום זאת את footerLinksRegexes.

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

שורת מצב מרובת שורות המציגה את שם המודל, הספרייה וענף ה-git בשורה הראשונה, וסרגל התקדמות של שימוש בהקשר עם עלות ומשך זמן בשורה השנייה

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

#הגדרת שורת מצב

השתמש בפקודה /statusline כדי לגרום ל-Claude Code ליצור סקריפט עבורך, או צור סקריפט ידנית והוסף אותו להגדרות שלך.

#שימוש בפקודה /statusline

הפקודה /statusline מקבלת הנחיות בשפה טבעית המתארות את מה שתרצה להציג. Claude Code יוצר קובץ סקריפט ב-~/.claude/ ומעדכן את ההגדרות שלך באופן אוטומטי:

/statusline show model name and context percentage with a progress bar

אשר את בקשות עריכת הקבצים אם Claude Code מבקש הרשאה במהלך ההגדרה.

#הגדרה ידנית של שורת מצב

הוסף שדה statusLine להגדרות המשתמש שלך (~/.claude/settings.json, כאשר ~ היא תיקיית הבית שלך) או אל הגדרות הפרויקט. הגדר את type ל-"command" וכוון את command לנתיב סקריפט או לפקודת מעטפת מוטבעת (inline). למדריך מלא ליצירת סקריפט, ראה בניית שורת מצב צעד אחר צעד.

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 2
  }
}

השדה command רץ במעטפת, כך שתוכל גם להשתמש בפקודות מוטבעות במקום בקובץ סקריפט. דוגמה זו משתמשת ב-jq כדי לנתח את קלט ה-JSON ולהציג את שם המודל ואחוז ההקשר:

{
  "statusLine": {
    "type": "command",
    "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"
  }
}

השדה האופציונלי padding מוסיף ריווח אופקי נוסף (בתווים) לתוכן שורת המצב. ברירת המחדל היא 0. ריווח זה מתווסף לריווח המובנה של הממשק, ולכן הוא שולט בהזחה יחסית ולא במרחק מוחלט מקצה המסוף.

השדה האופציונלי refreshInterval מריץ מחדש את הפקודה שלך כל N שניות בנוסף אל עדכונים מונחי אירועים. ערך המינימום הוא 1. הגדר זאת כאשר שורת המצב שלך מציגה נתונים מבוססי זמן כגון שעון, או כאשר תת-סוכנים ברקע משנים את מצב ה-git בזמן שההפעלה הראשית אינה פעילה. השאר אותו לא מוגדר כדי להריץ רק בעת אירועים.

השדה האופציונלי hideVimModeIndicator מבטל את הצגת הטקסט המובנה -- INSERT -- מתחת לשורת הפקודה (prompt). הגדר זאת ל-true כאשר הסקריפט שלך מציג את vim.mode בעצמו, כדי שהמצב לא יוצג פעמיים.

#השבתת שורת המצב

הפעל את /statusline ובקש ממנו להסיר או לנקות את שורת המצב שלך (למשל, /statusline delete, /statusline clear, /statusline remove it). תוכל גם למחוק ידנית את השדה statusLine מתוך settings.json שלך.

#בניית שורת מצב צעד אחר צעד

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

הערה: הפעלת /statusline עם תיאור של מה שאתה רוצה מגדירה את כל זה עבורך באופן אוטומטי.

דוגמאות אלה משתמשות בסקריפטים של Bash, הפועלים ב-macOS וב-Linux. ב-Windows, ראה הגדרת Windows עבור דוגמאות ב-PowerShell וב-Git Bash.

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

  1. צור סקריפט שקורא JSON ומדפיס פלט: Claude Code שולח נתוני JSON לסקריפט שלך דרך stdin. סקריפט זה משתמש ב-jq, מנתח JSON של שורת הפקודה שייתכן שתצטרך להתקין, כדי לחלץ את שם המודל, הספרייה ואחוז ההקשר, ולאחר מכן מדפיס שורה מעוצבת.

    שמור זאת ב-~/.claude/statusline.sh (כאשר ~ היא תיקיית הבית שלך, כגון /Users/username ב-macOS או /home/username ב-Linux):

    #!/bin/bash

#Read JSON data that Claude Code sends to stdin

input=$(cat)

#Extract fields using jq

MODEL=$(echo "$input" | jq -r '.model.display_name') DIR=$(echo "$input" | jq -r '.workspace.current_dir')

#The "// 0" provides a fallback if the field is null

PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

#Output the status line - ${DIR##*/} extracts just the folder name

echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context"


2. **הפוך אותו לבר-ביצוע**:
סמן את הסקריפט כבר-ביצוע כדי שהמעטפת שלך תוכל להריץ אותו:

```bash
chmod +x ~/.claude/statusline.sh
  1. הוסף להגדרות: הורה ל-Claude Code להריץ את הסקריפט שלך כשורת המצב. הוסף הגדרה זו אל ~/.claude/settings.json, אשר מגדירה את type ל-"command" (כלומר "הרץ פקודת מעטפת זו") ומכוונת את command אל הסקריפט שלך:

    {
      "statusLine": {
        "type": "command",
        "command": "~/.claude/statusline.sh"
      }
    }

    שורת המצב שלך מופיעה בתחתית הממשק. Claude Code טוען מחדש את ההגדרות באופן אוטומטי ומריץ את הסקריפט שלך ברגע שאתה שומר את הקובץ.

#כיצד פועלות שורות מצב

Claude Code מריץ את הסקריפט שלך עם נתוני הפעלה ב-JSON דרך stdin ומציג את כל מה שהסקריפט מדפיס אל stdout.

מתי היא מתעדכנת

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

  • הודעת עוזר (assistant) חדשה מגיעה
  • הפקודה /compact מסתיימת
  • מצב ההרשאות משתנה
  • מצב Vim מופעל או מושבת
  • אתה משנה את ה-command בהגדרות ה-statusLine שלך
  • טיימר refreshInterval חולף, אם הגדרת כזה
  • חלון מגבלת קצב בנתונים שהסקריפט שלך קיבל לאחרונה מגיע לזמן ה-resets_at שלו
  • מטמון פרומפט חם (prompt cache) בנתונים שהסקריפט שלך קיבל לאחרונה מגיע לזמן ה-expires_at שלו

Claude Code מבצע השהיית עדכונים (debounce) של 300ms, כך ששינויים מהירים מקובצים יחד והסקריפט שלך רץ פעם אחת לאחר שהשינויים נפסקים. שינוי ב-command עצמו מדלג על ההשהיה: Claude Code מריץ את הפקודה החדשה מיד. אם עדכון חדש מופעל בזמן שהסקריפט שלך עדיין רץ, Claude Code מבטל את הסקריפט שבתהליך ריצה. אם תערוך את הסקריפט שלך, השינויים יופיעו בפעם הבאה שטריגר עדכון יריץ אותו שוב.

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

מה הסקריפט שלך יכול לפלוט

התאמת גודל הפלט למסוף

Claude Code לוכד את הפלט של הסקריפט שלך במקום לחבר אותו ישירות למסוף, כך ש-tput cols וזיהוי רוחב ברמת שפת התכנות אינם יכולים לקרוא את גודל המסוף מתוך הסקריפט. קרא במקום זאת את משתני הסביבה COLUMNS ו-LINES. Claude Code מגדיר משתנים אלה לממדי המסוף הנוכחיים לפני הרצת הסקריפט שלך.

הערה: שורת המצב רצה באופן מקומי ואינה צורכת אסימוני API. היא מוסתרת זמנית במהלך אינטראקציות מסוימות בממשק המשתמש, כולל הצעות השלמה אוטומטית, תפריט העזרה ובקשות הרשאה.

#נתונים זמינים

Claude Code שולח את שדות ה-JSON הבאים לסקריפט שלך דרך stdin:

שדהתיאור
model.id, model.display_nameמזהה המודל הנוכחי ושם התצוגה שלו.
cwd, workspace.current_dirספריית העבודה הנוכחית. שני השדות מכילים את אותו הערך; workspace.current_dir מועדף לצורך עקביות עם workspace.project_dir.
workspace.project_dirהספרייה שבה Claude Code הופעל, אשר עשויה להיות שונה מ-cwd אם ספריית העבודה משתנה במהלך הפעלה.
workspace.added_dirsספריות נוספות שנוספו באמצעות /add-dir או --add-dir. מערך ריק אם לא נוספו ספריות.
workspace.git_worktreeשם ה-git worktree כאשר הספרייה הנוכחית נמצאת בתוך worktree מקושר שנוצר באמצעות git worktree add. אינו קיים בעץ העבודה הראשי. מאוכלס עבור כל git worktree, בשונה מ-worktree.*, אשר קיים רק כאשר ההפעלה נמצאת ב-הפעלת worktree.
workspace.repo.host, workspace.repo.owner, workspace.repo.nameזהות המאגר שפוענחה מתוך ה-remote בשם origin, למשל "github.com", "anthropics", "claude-code". אינו קיים מחוץ למאגר git או כאשר לא מוגדר remote בשם origin.
cost.total_cost_usdעלות משוערת של ההפעלה בדולר ארה"ב (USD), מחושבת בצד הלקוח לפי מחיר מחירון אלא אם טבלת modelPricing בתוקף. עשויה להיות שונה מהחשבון בפועל. מתאפסת ל-$0 כאשר /clear מתחיל הפעלה חדשה. לפני גרסה v2.1.211, הסך הכולל המשיך גם אחרי /clear.
cost.total_duration_msזמן שעון כולל מאז שההפעלה התחילה, במילישניות.
cost.total_api_duration_msזמן כולל שהושקע בהמתנה לתגובות API, במילישניות.
cost.total_lines_added, cost.total_lines_removedשורות קוד שהשתנו.
context_window.total_input_tokens, context_window.total_output_tokensספירת אסימונים שנמצאים כעת בחלון ההקשר, מתוך תגובת ה-API האחרונה. הקלט כולל קריאות וכתיבות במטמון.
context_window.context_window_sizeגודל חלון ההקשר המרבי באסימונים. 200000 כברירת מחדל, או 1000000 עבור מודלים עם הקשר מורחב.
context_window.used_percentageאחוז מחושב מראש של חלון ההקשר שנוצל.
context_window.remaining_percentageאחוז מחושב מראש של חלון ההקשר שנותר.
context_window.current_usageספירת אסימונים מקריאת ה-API האחרונה, מתוארת תחת שדות חלון ההקשר.
exceeds_200k_tokensהאם ספירת האסימונים הכוללת (קלט, מטמון ופלט משולבים) מתגובת ה-API האחרונה חורגת מ-200k. זהו סף קבוע ללא תלות בגודל חלון ההקשר בפועל.
fast_modeהאם מצב מהיר מופעל עבור ההפעלה.
effort.levelמאמץ החשיבה הנוכחי (low, medium, high, xhigh או max). משקף את הערך החי בהפעלה, כולל שינויי /effort באמצע ההפעלה. Ultracode אינו רמה נפרדת ומדווח כ-xhigh. אינו קיים כאשר המודל הנוכחי אינו תומך בפרמטר המאמץ.
thinking.enabledהאם חשיבה מורחבת מופעלת עבור ההפעלה.
rate_limits.five_hour.used_percentage, rate_limits.seven_day.used_percentageאחוז מגבלת הקצב שנצרך עבור חלון 5 שעות או 7 ימים, מ-0 עד 100.
rate_limits.five_hour.resets_at, rate_limits.seven_day.resets_atשניות Unix epoch שבהן חלון מגבלת הקצב של 5 שעות או 7 ימים מתאפס.
rate_limits.spend_limit.used_percentage, rate_limits.spend_limit.resets_atמאחורי שער יישומי קלוד, אחוז השימוש מתוך מגבלת ההוצאה החלה עליך, ושניות Unix epoch שבהן התקופה מתאפסת. האחוז נע בין 0 ל-100, או מעל 100 לאחר שחרגת מהמגבלה. דורש את Claude Code בגרסה v2.1.251 ואילך.
prompt_cacheסטטיסטיקות מטמון הפרומפט של ההפעלה עבור השיחה הראשית: יחס פגיעות, החטאות והאם המטמון חם. ראה שדות מטמון פרומפט עבור כל שדה. אינו קיים עד לתגובת ה-API הראשונה בשיחה הראשית. דורש את Claude Code בגרסה v2.1.251 ואילך.
session_idמזהה ייחודי של ההפעלה.
session_nameשם ההפעלה. משתמש בשם המותאם אישית שהוגדר עם הדגל --name או עם /rename כאשר קיים כזה, אחרת בכותרת ההפעלה שנוצרה על ידי הבינה המלאכותית. שם התצוגה כברירת מחדל, כגון my-app-3f, אינו מאכלס שדה זה. אינו קיים כאשר להפעלה אין שם מותאם אישית ואין כותרת שנוצרה על ידי בינה מלאכותית.
prompt_idמזהה UUID המזהה את פרומפט המשתמש המעובד כעת. תואם למאפיין prompt.id באירועי OpenTelemetry. אינו קיים עד לקלט המשתמש הראשון. דורש את Claude Code בגרסה v2.1.196 ואילך.
transcript_pathנתיב לקובץ תמליל השיחה.
versionגרסת Claude Code.
output_style.nameשם סגנון הפלט הנוכחי.
vim.modeמצב vim הנוכחי (NORMAL, INSERT, VISUAL או VISUAL LINE) כאשר מצב vim מופעל.
agent.nameשם הסוכן בעת הפעלה עם הדגל --agent או כאשר הגדרות סוכן מוגדרות.
pr.number, pr.urlבקשת משיכה (pull request) פתוחה עבור הענף הנוכחי. משקף את תג ה-PR בכותרת התחתונה. במאגר עם remote של GitLab, Claude Code ממלא שדות אלה מתוך ה-merge request הפתוח של הענף במקום זאת, כך ש-pr.number הוא מספר ה-merge request. נתוני merge request דורשים את Claude Code בגרסה v2.1.234 ואילך. אינו קיים כאשר לא נמצאים במאגר git, עד שנמצאת בקשת משיכה או merge request, או לאחר שהיא מתמזגת או נסגרת.
pr.review_stateמצב הסקירה של ה-PR הפתוח: approved, pending, changes_requested או draft. עשוי להיעדר באופן עצמאי גם כאשר pr קיים.
pr.kindהערך mr כאשר pr מתאר GitLab merge request. אינו קיים עבור בקשות משיכה של GitHub, כך שסקריפטים שנכתבו לפני שדה זה ממשיכים לפעול. עבור merge request, Claude Code מגדיר את review_state ל-approved כאשר GitLab מדווח עליו כניתן למיזוג, pending עבור כל מצב פתוח אחר, ו-draft עבור טיוטה. דורש את Claude Code בגרסה v2.1.234 ואילך.
worktree.nameשם ה-worktree הפעיל. קיים רק בזמן שההפעלה נמצאת ב-הפעלת worktree.
worktree.pathנתיב מוחלט לספריית ה-worktree.
worktree.branchשם ענף ה-git עבור ה-worktree (למשל, "worktree-my-feature"). אינו קיים עבור worktrees מבוססי hooks.
worktree.original_cwdהספרייה שבה קלוד היה לפני הכניסה ל-worktree.
worktree.original_branchענף ה-git שהיה פעיל לפני הכניסה ל-worktree. אינו קיים עבור worktrees מבוססי hooks.

#סכמת JSON מלאה

פקודת שורת המצב שלך מקבלת את מבנה ה-JSON הבא דרך stdin:

{
  "cwd": "/current/working/directory",
  "session_id": "abc123...",
  "session_name": "my-session",
  "prompt_id": "550e8400-e29b-41d4-a716-446655440000",
  "transcript_path": "/path/to/transcript.jsonl",
  "model": {
    "id": "claude-opus-5",
    "display_name": "Opus"
  },
  "workspace": {
    "current_dir": "/current/working/directory",
    "project_dir": "/original/project/directory",
    "added_dirs": [],
    "git_worktree": "feature-xyz",
    "repo": {
      "host": "github.com",
      "owner": "anthropics",
      "name": "claude-code"
    }
  },
  "version": "2.1.90",
  "output_style": {
    "name": "default"
  },
  "cost": {
    "total_cost_usd": 0.01234,
    "total_duration_ms": 45000,
    "total_api_duration_ms": 2300,
    "total_lines_added": 156,
    "total_lines_removed": 23
  },
  "context_window": {
    "total_input_tokens": 15500,
    "total_output_tokens": 1200,
    "context_window_size": 200000,
    "used_percentage": 8,
    "remaining_percentage": 92,
    "current_usage": {
      "input_tokens": 8500,
      "output_tokens": 1200,
      "cache_creation_input_tokens": 5000,
      "cache_read_input_tokens": 2000
    }
  },
  "exceeds_200k_tokens": false,
  "prompt_cache": {
    "warm": true,
    "caching_observed": true,
    "ttl": "1h",
    "expires_at": 1738429200,
    "requests": 14,
    "misses": 2,
    "expected_rebuilds": 1,
    "hit_ratio": 0.91,
    "cache_write_tokens": 352000,
    "miss_recache_tokens": 310200,
    "last_miss_at": 1738425230,
    "last_miss_cause": {
      "causes": ["tools_changed"],
      "tools_added": 2,
      "tools_removed": 0
    },
    "miss_causes": {
      "tools_changed": 2
    },
    "recache_tokens_if_cold": 45000
  },
  "fast_mode": false,
  "effort": {
    "level": "high"
  },
  "thinking": {
    "enabled": true
  },
  "rate_limits": {
    "five_hour": {
      "used_percentage": 23.5,
      "resets_at": 1738425600
    },
    "seven_day": {
      "used_percentage": 41.2,
      "resets_at": 1738857600
    },
    "spend_limit": {
      "used_percentage": 62.8,
      "resets_at": 1740787200
    }
  },
  "vim": {
    "mode": "NORMAL"
  },
  "agent": {
    "name": "security-reviewer"
  },
  "pr": {
    "number": 1234,
    "url": "https://github.com/anthropics/claude-code/pull/1234",
    "review_state": "pending"
  },
  "worktree": {
    "name": "my-feature",
    "path": "/path/to/.claude/worktrees/my-feature",
    "branch": "worktree-my-feature",
    "original_cwd": "/path/to/project",
    "original_branch": "main"
  }
}

שדות שעשויים להיעדר (אינם קיימים ב-JSON):

  • session_name: מופיע כאשר הוגדר שם מותאם אישית באמצעות --name או /rename, או ברגע שקיימת כותרת הפעלה שנוצרה על ידי בינה מלאכותית. שם התצוגה כברירת מחדל, כגון my-app-3f, אינו מאכלס אותו.
  • prompt_id: מופיע רק לאחר קלט המשתמש הראשון.
  • workspace.git_worktree: מופיע רק כאשר הספרייה הנוכחית נמצאת בתוך git worktree מקושר.
  • workspace.repo: מופיע רק בתוך מאגר git שבו מוגדר remote בשם origin.
  • effort: מופיע רק כאשר המודל הנוכחי תומך בפרמטר מאמץ החשיבה.
  • vim: מופיע רק כאשר מצב vim מופעל.
  • agent: מופיע רק בעת הפעלה עם הדגל --agent או כאשר הגדרות סוכן מוגדרות.
  • pr: מופיע רק כאשר נמצא PR פתוח או GitLab merge request עבור הענף הנוכחי, ומוסר ברגע שהוא מתמזג או נסגר. pr.review_state ו-pr.kind עשויים להיעדר באופן עצמאי.
  • worktree: מופיע רק בזמן שההפעלה נמצאת ב-הפעלת worktree. כאשר קיים, branch ו-original_branch עשויים להיעדר גם כן עבור worktrees מבוססי hooks.
  • rate_limits: מופיע רק עבור מנויי Claude.ai Pro ו-Max, או מאחורי שער יישומי קלוד שמגדיר מגבלת הוצאה עבורך, ורק לאחר תגובת ה-API הראשונה בהפעלה. כל חלון (five_hour, seven_day, spend_limit) עשוי להיעדר באופן עצמאי, ו-Claude Code משמיט חלון ברגע שזמן ה-resets_at שלו חולף. השתמש ב-jq -r '.rate_limits.five_hour.used_percentage // empty' כדי לטפל בהיעדרות בצורה תקינה.
  • prompt_cache: מופיע לאחר תגובת ה-API הראשונה בשיחה הראשית. ראה שדות מטמון פרומפט.

שדות שעשויים להיות null:

  • context_window.current_usage: ערך null לפני קריאת ה-API הראשונה בהפעלה, ושוב לאחר /compact עד שקריאת ה-API הבאה תאכלס אותו מחדש.
  • context_window.used_percentage, context_window.remaining_percentage: עשויים להיות null בשלב מוקדם של ההפעלה.

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

#שדות חלון ההקשר

האובייקט context_window מתאר את חלון ההקשר החי מתגובת ה-API האחרונה.

  • סכומים כוללים משולבים (total_input_tokens, total_output_tokens): אסימונים שנמצאים כעת בחלון ההקשר. total_input_tokens הוא הסכום של input_tokens, cache_creation_input_tokens ו-cache_read_input_tokens; total_output_tokens הוא אסימוני הפלט מתגובת ה-API האחרונה. שניהם בעלי ערך 0 לפני תגובת ה-API הראשונה.
  • שימוש לפי רכיבים (current_usage): אותן ספירות אסימונים מפורקות לפי קטגוריה. השתמש בזה כאשר אתה זקוק לפגיעות במטמון בנפרד מקלט חדש.

האובייקט current_usage מכיל:

  • input_tokens: אסימוני קלט בהקשר הנוכחי
  • output_tokens: אסימוני פלט שנוצרו
  • cache_creation_input_tokens: אסימונים שנכתבו למטמון
  • cache_read_input_tokens: אסימונים שנקראו מהמטמון

למשמעות שדות המטמון ואופן החיוב שלהם, ראה בדיקת ביצועי מטמון.

השדה used_percentage מחושב מאסימוני קלט בלבד: input_tokens + cache_creation_input_tokens + cache_read_input_tokens. הוא אינו כולל output_tokens.

אם אתה מחשב את אחוז ההקשר ידנית מתוך current_usage, השתמש באותה נוסחה של קלט בלבד כדי להתאים ל-used_percentage.

האובייקט current_usage הוא null לפני קריאת ה-API הראשונה בהפעלה, ושוב מיד לאחר /compact עד שקריאת ה-API הבאה תאכלס אותו מחדש.

#שדות מטמון פרומפט

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

האובייקט מופיע לאחר תגובת ה-API הראשונה בשיחה הראשית. Claude Code אינו סופר בקשות של תת-סוכנים בסטטיסטיקות אלה. דורש את Claude Code בגרסה v2.1.251 ואילך.

הטבלה מפרטת כל שדה ואת משמעותו. חותמות זמן הן שניות Unix epoch, אותה יחידה כמו rate_limits.*.resets_at. שורת מצב קצרה מציגה בדרך כלל אחד או שניים מאלה; warm ו-hit_ratio מסכמים את מצב המטמון בצורה הישירה ביותר.

שדהתיאור
warmהאם הקידומת שבמטמון עדיין בתוך ה-TTL שלה. false כאשר התגובה האחרונה לא דיווחה על אסימוני מטמון, גם כאשר caching_observed הוא true.
caching_observedהאם תגובה כלשהי בהפעלה זו דיווחה על אסימוני מטמון. false אומר שמטמון פרומפט כבוי, או שהספק או השער שלך אינם מדווחים על כך.
ttlמשך חיי המטמון של הקידומת השמורה הנוכחית: "5m" או "1h".
expires_atמתי הקידומת שבמטמון יוצאת מה-TTL שלה והופכת לקרה, בשניות epoch. ערך null כאשר התגובה האחרונה לא דיווחה על אסימוני מטמון.
requestsבקשות API שתועדו עבור השיחה הראשית בהפעלה זו.
missesבקשות שעיבדו מחדש תוכן שהמטמון כבר החזיק: יותר מ-5% ולפחות 2,000 אסימונים ממה שהבקשה יכלה לקרוא מהמטמון, ללא צמצום או ניקוי תוצאות כלים שיסבירו את הגירעון בקריאות מהמטמון.
expected_rebuildsבניות מחדש של המטמון שבאו בעקבות צמצום או ניקוי תוצאות כלים ישנות.
hit_ratioאסימוני קריאה מהמטמון כחלק מכל אסימוני הקלט בהפעלה זו, מ-0 עד 1. המכנה סופר קריאות מטמון, כתיבות מטמון וקלט שלא במטמון. ערך null כל עוד ספירות אלה כולן אפס.
cache_write_tokensכל האסימונים שנכתבו למטמון בהפעלה זו, כולל הכתיבה הראשונית של הבקשה הראשונה.
miss_recache_tokensאסימונים שנכתבו למטמון על ידי הבקשות שנספרו כהחטאות.
last_miss_atמתי התרחשה ההחטאה האחרונה, בשניות epoch. ערך null כל עוד אין בהפעלה החטאות.
last_miss_causeמה ש-Claude Code זיהה כסיבה הסבירה להחטאה האחרונה, מתואר תחת הסיבה להחטאה האחרונה. דורש את Claude Code בגרסה v2.1.260 ואילך.
miss_causesכמה מההחטאות שאובחנו בהפעלה זו נבעו מכל סיבה, במפתח לפי אותם שמות סיבות כמו last_miss_cause. דורש את Claude Code בגרסה v2.1.260 ואילך.
recache_tokens_if_coldאסימונים שהבקשה הבאה שומרת מחדש במטמון אם המטמון הפך לקר עד אז. ערך null מיד לאחר צמצום או ניקוי תוצאות כלים ישנות, עד שהבקשה הבאה תתעד את גודל השיחה המשוכתבת.

Claude Code מציג את אותן סטטיסטיקות במסוף, בשורה Prompt cache (main) של הפקודה /usage.

#הסיבה להחטאה האחרונה

האובייקט last_miss_cause מדווח על מה ש-Claude Code זיהה כסיבה הסבירה להחטאה האחרונה. מערך ה-causes שלו מכיל שם סיבה אחד או יותר, כגון tools_changed, system_prompt_changed, ttl_expired_5m או likely_server_side. האובייקט הוא null עד להחטאה הראשונה בהפעלה, ושוב בכל פעם ש-Claude Code לא הצליח לזהות סיבה להחטאה האחרונה. דורש את Claude Code בגרסה v2.1.260 ואילך.

שתי סיבות מוסיפות ספירות לאובייקט:

  • tools_added ו-tools_removed: יחד עם tools_changed, כמה כלים נוספו לבקשה או הוסרו ממנה
  • system_char_delta: יחד עם system_prompt_changed, השינוי באורך פרומפט המערכת, בתווים

#דוגמאות

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

  1. שמור את הסקריפט לקובץ כמו ~/.claude/statusline.sh (או .py / .js)
  2. הפוך אותו לבר-ביצוע: chmod +x ~/.claude/statusline.sh
  3. הוסף את הנתיב אל ההגדרות שלך

דוגמאות ה-Bash משתמשות ב-jq כדי לנתח JSON. ל-Python ול-Node.js יש ניתוח JSON מובנה.

#שימוש בחלון ההקשר

הצג את המודל הנוכחי ואת השימוש בחלון ההקשר באמצעות סרגל התקדמות חזותי. כל סקריפט קורא JSON מ-stdin, מחלץ את השדה used_percentage, ובונה סרגל של 10 תווים שבו בלוקים מלאים (▓) מייצגים שימוש:

שורת מצב המציגה את שם המודל וסרגל התקדמות עם אחוזים

#Bash

#!/bin/bash
# Read all of stdin into a variable
input=$(cat)

# Extract fields with jq, "// 0" provides fallback for null
MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# Build progress bar: printf -v creates a run of spaces, then
# ${var// /▓} replaces each space with a block character
BAR_WIDTH=10
FILLED=$((PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))
BAR=""
[ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /▓}"
[ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /░}"

echo "[$MODEL] $BAR $PCT%"

#Python

#!/usr/bin/env python3
import json, sys

# json.load reads and parses stdin in one step
data = json.load(sys.stdin)
model = data['model']['display_name']
# "or 0" handles null values
pct = int(data.get('context_window', {}).get('used_percentage', 0) or 0)

# String multiplication builds the bar
filled = pct * 10 // 100
bar = '▓' * filled + '░' * (10 - filled)

print(f"[{model}] {bar} {pct}%")

#Node.js

#!/usr/bin/env node
// Node.js reads stdin asynchronously with events
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    const model = data.model.display_name;
    // Optional chaining (?.) safely handles null fields
    const pct = Math.floor(data.context_window?.used_percentage || 0);

    // String.repeat() builds the bar
    const filled = Math.floor(pct * 10 / 100);
    const bar = '▓'.repeat(filled) + '░'.repeat(10 - filled);

    console.log(`[${model}] ${bar} ${pct}%`);
});

#מצב git עם צבעים

הצג את ענף ה-git עם מחוונים בעלי קידוד צבעים עבור קבצים בשלב ההכנה (staged) וקבצים ששונו (modified). סקריפט זה משתמש ב-קודי מילוט של ANSI עבור צבעי מסוף: \033[32m הוא ירוק, \033[33m הוא צהוב, ו-\033[0m מאפס לברירת מחדל.

שורת מצב המציגה מודל, ספרייה, ענף git ומחוונים צבעוניים לקבצים ב-staged וקבצים ששונו

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

#Bash

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')

GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'

if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
    MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

    GIT_STATUS=""
    [ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"
    [ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"

    echo -e "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH $GIT_STATUS"
else
    echo "[$MODEL] 📁 ${DIR##*/}"
fi

#Python

#!/usr/bin/env python3
import json, sys, subprocess, os

data = json.load(sys.stdin)
model = data['model']['display_name']
directory = os.path.basename(data['workspace']['current_dir'])

GREEN, YELLOW, RESET = '\033[32m', '\033[33m', '\033[0m'

try:
    subprocess.check_output(['git', 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL)
    branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True).strip()
    staged_output = subprocess.check_output(['git', 'diff', '--cached', '--numstat'], text=True).strip()
    modified_output = subprocess.check_output(['git', 'diff', '--numstat'], text=True).strip()
    staged = len(staged_output.split('\n')) if staged_output else 0
    modified = len(modified_output.split('\n')) if modified_output else 0

    git_status = f"{GREEN}+{staged}{RESET}" if staged else ""
    git_status += f"{YELLOW}~{modified}{RESET}" if modified else ""

    print(f"[{model}] 📁 {directory} | 🌿 {branch} {git_status}")
except:
    print(f"[{model}] 📁 {directory}")

#Node.js

#!/usr/bin/env node
const { execSync } = require('child_process');
const path = require('path');

let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    const model = data.model.display_name;
    const dir = path.basename(data.workspace.current_dir);

    const GREEN = '\x1b[32m', YELLOW = '\x1b[33m', RESET = '\x1b[0m';

    try {
        execSync('git rev-parse --git-dir', { stdio: 'ignore' });
        const branch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();
        const staged = execSync('git diff --cached --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;
        const modified = execSync('git diff --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

        let gitStatus = staged ? `${GREEN}+${staged}${RESET}` : '';
        gitStatus += modified ? `${YELLOW}~${modified}${RESET}` : '';

        console.log(`[${model}] 📁 ${dir} | 🌿 ${branch} ${gitStatus}`);
    } catch {
        console.log(`[${model}] 📁 ${dir}`);
    }
});

#מעקב עלויות ומשך זמן

עקוב אחר עלויות ה-API של ההפעלה שלך והזמן שחלף. השדה cost.total_cost_usd צובר את העלות המשוערת של כל קריאות ה-API בהפעלה הנוכחית. השדה cost.total_duration_ms מודד את סך כל הזמן שחלף מאז שההפעלה התחילה, בעוד ש-cost.total_api_duration_ms עוקב רק אחר הזמן שהושקע בהמתנה לתגובות API.

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

שורת מצב המציגה את שם המודל, עלות ההפעלה ומשך הזמן

#Bash

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

COST_FMT=$(printf '$%.2f' "$COST")
DURATION_SEC=$((DURATION_MS / 1000))
MINS=$((DURATION_SEC / 60))
SECS=$((DURATION_SEC % 60))

echo "[$MODEL] 💰 $COST_FMT | ⏱️ ${MINS}m ${SECS}s"

#Python

#!/usr/bin/env python3
import json, sys

data = json.load(sys.stdin)
model = data['model']['display_name']
cost = data.get('cost', {}).get('total_cost_usd', 0) or 0
duration_ms = data.get('cost', {}).get('total_duration_ms', 0) or 0

duration_sec = duration_ms // 1000
mins, secs = duration_sec // 60, duration_sec % 60

print(f"[{model}] 💰 ${cost:.2f} | ⏱️ {mins}m {secs}s")

#Node.js

#!/usr/bin/env node
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    const model = data.model.display_name;
    const cost = data.cost?.total_cost_usd || 0;
    const durationMs = data.cost?.total_duration_ms || 0;

    const durationSec = Math.floor(durationMs / 1000);
    const mins = Math.floor(durationSec / 60);
    const secs = durationSec % 60;

    console.log(`[${model}] 💰 $${cost.toFixed(2)} | ⏱️ ${mins}m ${secs}s`);
});

#הצגת מספר שורות

הסקריפט שלך יכול לפלוט מספר שורות כדי ליצור תצוגה עשירה יותר.

שורת מצב מרובת שורות המציגה את שם המודל, הספרייה וענף ה-git בשורה הראשונה, וסרגל התקדמות של שימוש בהקשר עם עלות ומשך זמן בשורה השנייה

דוגמה זו משלבת מספר טכניקות: צבעים מבוססי סף (ירוק מתחת ל-70%, צהוב 70-89%, אדום 90%+), סרגל התקדמות ומידע על ענף ה-git. כל הוראת print או echo יוצרת שורה נפרדת:

#Bash

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

# Pick bar color based on context usage
if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))
printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"
BAR="${FILL// /█}${PAD// /░}"

MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"

echo -e "${CYAN}[$MODEL]${RESET} 📁 ${DIR##*/}$BRANCH"
COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"

#Python

#!/usr/bin/env python3
import json, sys, subprocess, os

data = json.load(sys.stdin)
model = data['model']['display_name']
directory = os.path.basename(data['workspace']['current_dir'])
cost = data.get('cost', {}).get('total_cost_usd', 0) or 0
pct = int(data.get('context_window', {}).get('used_percentage', 0) or 0)
duration_ms = data.get('cost', {}).get('total_duration_ms', 0) or 0

CYAN, GREEN, YELLOW, RED, RESET = '\033[36m', '\033[32m', '\033[33m', '\033[31m', '\033[0m'

bar_color = RED if pct >= 90 else YELLOW if pct >= 70 else GREEN
filled = pct // 10
bar = '█' * filled + '░' * (10 - filled)

mins, secs = duration_ms // 60000, (duration_ms % 60000) // 1000

try:
    branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True, stderr=subprocess.DEVNULL).strip()
    branch = f" | 🌿 {branch}" if branch else ""
except:
    branch = ""

print(f"{CYAN}[{model}]{RESET} 📁 {directory}{branch}")
print(f"{bar_color}{bar}{RESET} {pct}% | {YELLOW}${cost:.2f}{RESET} | ⏱️ {mins}m {secs}s")

#Node.js

#!/usr/bin/env node
const { execSync } = require('child_process');
const path = require('path');

let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    const model = data.model.display_name;
    const dir = path.basename(data.workspace.current_dir);
    const cost = data.cost?.total_cost_usd || 0;
    const pct = Math.floor(data.context_window?.used_percentage || 0);
    const durationMs = data.cost?.total_duration_ms || 0;

    const CYAN = '\x1b[36m', GREEN = '\x1b[32m', YELLOW = '\x1b[33m', RED = '\x1b[31m', RESET = '\x1b[0m';

    const barColor = pct >= 90 ? RED : pct >= 70 ? YELLOW : GREEN;
    const filled = Math.floor(pct / 10);
    const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);

    const mins = Math.floor(durationMs / 60000);
    const secs = Math.floor((durationMs % 60000) / 1000);

    let branch = '';
    try {
        branch = execSync('git branch --show-current', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();
        branch = branch ? ` | 🌿 ${branch}` : '';
    } catch {}

    console.log(`${CYAN}[${model}]${RESET} 📁 ${dir}${branch}`);
    console.log(`${barColor}${bar}${RESET} ${pct}% | ${YELLOW}$${cost.toFixed(2)}${RESET} | ⏱️ ${mins}m ${secs}s`);
});

#קישורים לחיצים

דוגמה זו יוצרת קישור לחיץ למאגר ה-GitHub שלך. החזק את Cmd (ב-macOS) או Ctrl (ב-Windows/Linux) ולחץ כדי לפתוח את הקישור בדפדפן שלך.

שורת מצב המציגה קישור לחיץ למאגר GitHub

כל סקריפט משיג את כתובת ה-URL של ה-git remote, ממיר פורמט SSH ל-HTTPS, ועוטף את שם המאגר בקודי מילוט של OSC 8. גרסת ה-Bash משתמשת ב-printf '%b' אשר מפענח רצפי מילוט בצורה אמינה יותר מאשר echo -e על פני מעטפות שונות:

#Bash

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')

# Convert git SSH URL to HTTPS
REMOTE=$(git remote get-url origin 2>/dev/null | sed 's/[email protected]:/https:\/\/github.com\//' | sed 's/\.git$//')

if [ -n "$REMOTE" ]; then
    REPO_NAME=$(basename "$REMOTE")
    
# OSC 8 format: \e]8;;URL\a then TEXT then \e]8;;\a
    
# printf %b interprets escape sequences reliably across shells
    printf '%b' "[$MODEL] 🔗 \e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a\n"
else
    echo "[$MODEL]"
fi

#Python

#!/usr/bin/env python3
import json, sys, subprocess, re, os

data = json.load(sys.stdin)
model = data['model']['display_name']

# Get git remote URL
try:
    remote = subprocess.check_output(
        ['git', 'remote', 'get-url', 'origin'],
        stderr=subprocess.DEVNULL, text=True
    ).strip()
    
# Convert SSH to HTTPS format
    remote = re.sub(r'^git@github\.com:', 'https://github.com/', remote)
    remote = re.sub(r'\.git$', '', remote)
    repo_name = os.path.basename(remote)
    
# OSC 8 escape sequences
    link = f"\033]8;;{remote}\a{repo_name}\033]8;;\a"
    print(f"[{model}] 🔗 {link}")
except:
    print(f"[{model}]")

#Node.js

#!/usr/bin/env node
const { execSync } = require('child_process');
const path = require('path');

let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    const model = data.model.display_name;

    try {
        let remote = execSync('git remote get-url origin', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();
        // Convert SSH to HTTPS format
        remote = remote.replace(/^git@github\.com:/, 'https://github.com/').replace(/\.git$/, '');
        const repoName = path.basename(remote);
        // OSC 8 escape sequences
        const link = `\x1b]8;;${remote}\x07${repoName}\x1b]8;;\x07`;
        console.log(`[${model}] 🔗 ${link}`);
    } catch {
        console.log(`[${model}]`);
    }
});

#שימוש במגבלת קצב

הצג את השימוש במגבלת הקצב של מנוי Claude.ai בשורת המצב. האובייקט rate_limits מכיל חלון מתגלגל של 5 שעות (five_hour) וחלון שבועי של 7 ימים (seven_day). כל חלון מספק את used_percentage, מ-0 עד 100, ואת resets_at, שניות Unix epoch שבהן החלון מתאפס.

מאחורי שער יישומי קלוד עם מגבלות הוצאה, rate_limits נושא את spend_limit עם אותם שני שדות עבור מגבלת ההוצאה החלה עליך, למעט העובדה שערך ה-used_percentage שלו יכול לעלות מעל 100 ברגע שאתה חורג מהמגבלה. דורש את Claude Code בגרסה v2.1.251 ואילך.

האובייקט rate_limits קיים רק עבור מנויי Claude.ai Pro ו-Max, או מאחורי שער יישומי קלוד עם מגבלות הוצאה, ורק לאחר תגובת ה-API הראשונה. כל סקריפט מטפל בהיעדר השדה בצורה חלקה:

#Bash

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
# "// empty" produces no output when rate_limits is absent
FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
WEEK=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')

LIMITS=""
[ -n "$FIVE_H" ] && LIMITS="5h: $(printf '%.0f' "$FIVE_H")%"
[ -n "$WEEK" ] && LIMITS="${LIMITS:+$LIMITS }7d: $(printf '%.0f' "$WEEK")%"

[ -n "$LIMITS" ] && echo "[$MODEL] | $LIMITS" || echo "[$MODEL]"

#Python

#!/usr/bin/env python3
import json, sys

data = json.load(sys.stdin)
model = data['model']['display_name']

parts = []
rate = data.get('rate_limits', {})
five_h = rate.get('five_hour', {}).get('used_percentage')
week = rate.get('seven_day', {}).get('used_percentage')

if five_h is not None:
    parts.append(f"5h: {five_h:.0f}%")
if week is not None:
    parts.append(f"7d: {week:.0f}%")

if parts:
    print(f"[{model}] | {' '.join(parts)}")
else:
    print(f"[{model}]")

#Node.js

#!/usr/bin/env node
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    const model = data.model.display_name;

    const parts = [];
    const fiveH = data.rate_limits?.five_hour?.used_percentage;
    const week = data.rate_limits?.seven_day?.used_percentage;

    if (fiveH != null) parts.push(`5h: ${Math.round(fiveH)}%`);
    if (week != null) parts.push(`7d: ${Math.round(week)}%`);

    console.log(parts.length ? `[${model}] | ${parts.join(' ')}` : `[${model}]`);
});

#שמירה במטמון של פעולות כבדות

סקריפט שורת המצב שלך רץ בתדירות גבוהה במהלך הפעלות פעילות. פקודות כמו git status או git diff עלולות להיות איטיות, במיוחד במאגרים גדולים. דוגמה זו שומרת במטמון מידע git לקובץ זמני ומרעננת אותו רק כל 5 שניות.

שם קובץ המטמון צריך להיות יציב על פני קריאות שורת המצב בתוך אותה הפעלה, אך ייחודי בין הפעלות שונות, כך שהפעלות מקבילות במאגרים שונים לא יקראו זו את מצב ה-git השמור במטמון של זו. מזהים מבוססי תהליך כגון $$, os.getpid() או process.pid משתנים בכל קריאה ומכשילים את המטמון. השתמש במקום זאת ב-session_id מתוך קלט ה-JSON: הוא יציב לאורך כל משך ההפעלה וייחודי לכל הפעלה.

כל סקריפט בודק אם קובץ המטמון חסר או ישן מ-5 שניות לפני הרצת פקודות git:

#Bash

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
SESSION_ID=$(echo "$input" | jq -r '.session_id')

CACHE_FILE="/tmp/statusline-git-cache-$SESSION_ID"
CACHE_MAX_AGE=5  
# seconds

cache_is_stale() {
    [ ! -f "$CACHE_FILE" ] || \
    
# stat -c %Y (Linux) or stat -f %m (macOS) prints the file's last-modified
    
# time. The Linux form must run first: on Linux, the macOS form prints a
    
# filesystem report to stdout before failing, and that output would be
    
# captured by the command substitution and break the arithmetic.
    [ $(($(date +%s) - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || stat -f %m "$CACHE_FILE" 2>/dev/null || echo 0))) -gt $CACHE_MAX_AGE ]
}

if cache_is_stale; then
    if git rev-parse --git-dir > /dev/null 2>&1; then
        BRANCH=$(git branch --show-current 2>/dev/null)
        STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
        MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')
        echo "$BRANCH|$STAGED|$MODIFIED" > "$CACHE_FILE"
    else
        echo "||" > "$CACHE_FILE"
    fi
fi

IFS='|' read -r BRANCH STAGED MODIFIED < "$CACHE_FILE"

if [ -n "$BRANCH" ]; then
    echo "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH +$STAGED ~$MODIFIED"
else
    echo "[$MODEL] 📁 ${DIR##*/}"
fi

#Python

#!/usr/bin/env python3
import json, sys, subprocess, os, time

data = json.load(sys.stdin)
model = data['model']['display_name']
directory = os.path.basename(data['workspace']['current_dir'])
session_id = data['session_id']

CACHE_FILE = f"/tmp/statusline-git-cache-{session_id}"
CACHE_MAX_AGE = 5  
# seconds

def cache_is_stale():
    if not os.path.exists(CACHE_FILE):
        return True
    return time.time() - os.path.getmtime(CACHE_FILE) > CACHE_MAX_AGE

if cache_is_stale():
    try:
        subprocess.check_output(['git', 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL)
        branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True).strip()
        staged = subprocess.check_output(['git', 'diff', '--cached', '--numstat'], text=True).strip()
        modified = subprocess.check_output(['git', 'diff', '--numstat'], text=True).strip()
        staged_count = len(staged.split('\n')) if staged else 0
        modified_count = len(modified.split('\n')) if modified else 0
        with open(CACHE_FILE, 'w') as f:
            f.write(f"{branch}|{staged_count}|{modified_count}")
    except:
        with open(CACHE_FILE, 'w') as f:
            f.write("||")

with open(CACHE_FILE) as f:
    branch, staged, modified = f.read().strip().split('|')

if branch:
    print(f"[{model}] 📁 {directory} | 🌿 {branch} +{staged} ~{modified}")
else:
    print(f"[{model}] 📁 {directory}")

#Node.js

#!/usr/bin/env node
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');

let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    const model = data.model.display_name;
    const dir = path.basename(data.workspace.current_dir);
    const sessionId = data.session_id;

    const CACHE_FILE = `/tmp/statusline-git-cache-${sessionId}`;
    const CACHE_MAX_AGE = 5; // seconds

    const cacheIsStale = () => {
        if (!fs.existsSync(CACHE_FILE)) return true;
        return (Date.now() / 1000) - fs.statSync(CACHE_FILE).mtimeMs / 1000 > CACHE_MAX_AGE;
    };

    if (cacheIsStale()) {
        try {
            execSync('git rev-parse --git-dir', { stdio: 'ignore' });
            const branch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();
            const staged = execSync('git diff --cached --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;
            const modified = execSync('git diff --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;
            fs.writeFileSync(CACHE_FILE, `${branch}|${staged}|${modified}`);
        } catch {
            fs.writeFileSync(CACHE_FILE, '||');
        }
    }

    const [branch, staged, modified] = fs.readFileSync(CACHE_FILE, 'utf8').trim().split('|');

    if (branch) {
        console.log(`[${model}] 📁 ${dir} | 🌿 ${branch} +${staged} ~${modified}`);
    } else {
        console.log(`[${model}] 📁 ${dir}`);
    }
});

#הגדרת Windows

ב-Windows, Claude Code מריץ פקודות של שורת המצב דרך Git Bash כאשר Git Bash מותקן, או דרך PowerShell כאשר Git Bash אינו קיים.

Git Bash מתייחס ללוכסנים שמאליים שאינם במירכאות כתווי מילוט, ולכן נתיב בסגנון Windows כגון C:\Users\username\script.mjs מגיע למריץ הסקריפטים כשהמפרידים שלו הוסרו, והפקודה נכשלת ללא שגיאה גלויה. כתוב נתיבי קבצים במחרוזת ה-command עם לוכסנים ימניים, כפי שמוצג בדוגמאות להלן. קיצור הדרך ~ פועל גם כן ומתרחב לתיקיית הבית שלך ב-Windows.

כדי להריץ סקריפט PowerShell כשורת המצב שלך, הפעל אותו באמצעות powershell. זה עובד בין אם Claude Code מנתב את הפקודה דרך Git Bash ובין אם דרך PowerShell:

{
  "statusLine": {
    "type": "command",
    "command": "powershell -NoProfile -File C:/Users/username/.claude/statusline.ps1"
  }
}
$input_json = $input | Out-String | ConvertFrom-Json
$cwd = $input_json.cwd
$model = $input_json.model.display_name
$used = $input_json.context_window.used_percentage
$dirname = Split-Path $cwd -Leaf

if ($used) {
    Write-Host "$dirname [$model] ctx: $used%"
} else {
    Write-Host "$dirname [$model]"
}

או, כאשר Git Bash מותקן, הרץ סקריפט Bash ישירות:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}
#!/usr/bin/env bash
input=$(cat)
cwd=$(echo "$input" | grep -o '"cwd":"[^"]*"' | cut -d'"' -f4)
model=$(echo "$input" | grep -o '"display_name":"[^"]*"' | cut -d'"' -f4)
dirname="${cwd##*[/\\]}"
echo "$dirname [$model]"

#שורות מצב של תת-סוכנים

ההגדרה subagentStatusLine מעבדת גוף שורה מותאם אישית עבור כל תת-סוכן המוצג בלוח הסוכנים שמתחת לשורת הפקודה. השתמש בה כדי להחליף את שורת ברירת המחדל name · description · token count בעיצוב משלך.

{
  "subagentStatusLine": {
    "type": "command",
    "command": "~/.claude/subagent-statusline.sh"
  }
}

הפקודה רצה פעם אחת בכל פעימת רענון ומקבלת את כל שורות תת-הסוכנים הגלויות כאובייקט JSON יחיד דרך stdin. הקלט כולל את שדות ה-hook הבסיסיים, שדה columns עם רוחב השורה הניתן לשימוש, ומערך tasks. לכל משימה יש id, name, type, status, description, label, startTime, model, effort, contextWindowSize, tokenCount, tokenSamples ו-cwd.

השדה model לכל משימה הוא מזהה המודל שנפתר שעליו המשימה רצה. contextWindowSize הוא חלון ההקשר של אותו מודל באסימונים, המחושב באותו אופן כמו context_window.context_window_size של שורת המצב הראשית, כך שתוכל לעבד אחוז לכל שורה מתוך tokenCount. שני השדות דורשים את Claude Code בגרסה v2.1.205 ואילך ומושמטים עבור משימה שהמודל שלה עדיין לא נפתר.

השדה effort לכל משימה הוא מאמץ החשיבה שהוגדר עבור אותו תת-סוכן, ב-frontmatter של ההגדרה שלו או בהפעלה האישית. הערך הוא אחת ממחרוזות רמת המאמץ low, medium, high, xhigh או max, או תקציב אסימונים מספרי. השדה מדווח על הערך המוגדר כפי שנכתב: אם המודל אינו תומך ברמה זו, המאמץ ש-Claude Code מיישם בפועל עשוי להיות שונה. השדה דורש את Claude Code בגרסה v2.1.214 ואילך ואינו קיים כאשר תת-הסוכן יורש את רמת המאמץ של ההפעלה.

כתוב שורת JSON אחת ל-stdout עבור כל שורה שברצונך לדרוס, במבנה {"id": "<task id>", "content": "<row body>"}. המחרוזת content מעובדת כפי שהיא, כולל צבעי ANSI והיפר-קישורים של OSC 8. השמט את ה-id של משימה כדי לשמור על עיבוד ברירת המחדל עבור אותה שורה; פלוט מחרוזת content ריקה כדי להסתיר אותה.

אותם שערי אמון, disableAllHooks ו-allowManagedHooksOnly החלים על statusLine חלים גם כאן. תוספים יכולים לספק subagentStatusLine כברירת מחדל ב-settings.json שלהם, אך בשונה מ-hooks, ערכי תוספים אינם רצים תחת allowManagedHooksOnly גם כאשר התוסף מופעל בכפייה בהגדרות מנוהלות תחת enabledPlugins.

#טיפים

  • בדוק עם קלט דמה: echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/home/user/project"},"context_window":{"used_percentage":25},"session_id":"test-session-abc"}' | ./statusline.sh
  • שמור על פלט קצר: לסרגל המצב יש רוחב מוגבל, ולכן פלט ארוך עלול להיחתך או לגלוש שורה בצורה לא נוחה.
  • שמור במטמון פעולות איטיות: הסקריפט שלך רץ לעיתים קרובות במהלך הפעלות פעילות, ולכן פקודות כמו git status עלולות לגרום להשהיה. ראה את דוגמת המטמון למידע על אופן הטיפול בכך.

פרויקטים קהילתיים כמו ccstatusline ו-starship-claude מספקים תצורות מוכנות מראש עם ערכות נושא ותכונות נוספות.

#פתרון בעיות

שורת המצב אינה מופיעה

  • ודא שהסקריפט שלך הוא בר-ביצוע: chmod +x ~/.claude/statusline.sh
  • בדוק שהסקריפט שלך פולט ל-stdout, ולא ל-stderr
  • הרץ את הסקריפט שלך ידנית כדי לוודא שהוא מייצר פלט
  • ב-Windows שבו מותקן Git Bash, לוכסנים שמאליים בנתיב ה-command כנראה נצרכים כתווי מילוט לפני שהסקריפט רץ. השתמש בלוכסנים ימניים בנתיב. ראה הגדרת Windows.
  • אם disableAllHooks מוגדר כ-true מחוץ להגדרות מנוהלות לאחר החלת קדימות ההגדרות, Claude Code מריץ אך ורק statusLine מהגדרות מנוהלות, וללא statusLine מנוהל שורת המצב מושבתת. הסר את ההגדרה, או הגדר אותה ל-false בקובץ שמגדיר אותה, כדי להפעיל מחדש. ראה disableAllHooks.
  • אם הארגון שלך מגדיר allowManagedHooksOnly בהגדרות מנוהלות, שורת המצב המותאמת אישית שלך תיעלם ללא אזהרה: תוכל לקבל שורת מצב רק מערך statusLine באותן הגדרות מנוהלות. ראה מה רץ תחת allowManagedHooksOnly להתנהגות המלאה, ושאל את מנהל המערכת שלך אם הגדרה זו חלה עליך.
  • הרץ claude --debug כדי לתעד ביומן את קוד היציאה ואת stderr מקריאת שורת המצב הראשונה בהפעלה.
  • בקש מ-Claude לקרוא את קובץ ההגדרות שלך ולהריץ את פקודת ה-statusLine ישירות כדי להציף שגיאות.

שורת המצב מציגה -- או ערכים ריקים

  • שדות עשויים להיות null לפני שהתגובה הראשונה מה-API מסתיימת.
  • טפל בערכי null בסקריפט שלך באמצעות חלופות ברירת מחדל כגון // 0 ב-jq.
  • הפעל מחדש את Claude Code אם ערכים נשארים ריקים לאחר מספר הודעות.

אחוז ההקשר מציג ערכים בלתי צפויים

  • השתמש ב-used_percentage עבור מצב ההקשר המדויק והפשוט ביותר.
  • אחוז ההקשר עשוי להיות שונה מפלט הפקודה /context עקב הזמן שבו כל אחד מהם מחושב.

קישורי OSC 8 אינם לחיצים

  • ודא שהמסוף שלך תומך בהיפר-קישורי OSC 8 (כגון iTerm2, Kitty, WezTerm).

  • Terminal.app אינו תומך בקישורים לחיצים.

  • אם טקסט הקישור מופיע אך אינו לחיץ, ייתכן ש-Claude Code לא זיהה תמיכה בהיפר-קישורים במסוף שלך. הגדר את משתנה הסביבה FORCE_HYPERLINK כדי לדרוס את הזיהוי לפני הפעלת Claude Code:

    FORCE_HYPERLINK=1 claude

    ב-PowerShell, הגדר תחילה את המשתנה בהפעלה הנוכחית:

    $env:FORCE_HYPERLINK = "1"; claude
  • הפעלות SSH ו-tmux עשויות להסיר רצפי OSC בהתאם להגדרה.

  • אם רצפי מילוט מופיעים כטקסט מילולי כמו \e]8;;, השתמש ב-printf '%b' במקום ב-echo -e לטיפול אמין יותר ברצפי מילוט.

תקלות תצוגה עם רצפי מילוט

  • רצפי מילוט מורכבים (צבעי ANSI, קישורי OSC 8) עלולים לעיתים לגרום לפלט משובש אם הם חופפים לעדכוני ממשק משתמש אחרים.
  • אם אתה רואה טקסט משובש, נסה לפשט את הסקריפט שלך לפלט טקסט פשוט.
  • שורות מצב מרובות שורות עם קודי מילוט מועדות יותר לבעיות עיבוד מאשר טקסט פשוט בשורה בודדת.

נדרש אמון בסביבת העבודה

  • מכיוון ש-statusLine מריץ פקודת מעטפת, Claude Code מריץ אותו תחת אותו כלל אמון בסביבת עבודה כמו hooks בקובצי הגדרות. אישור תיבת הדו-שיח עבור התיקייה, או עבור ספריית אב שאמונה חל עליה, מספיק.
  • עד אז, שורת המצב תישאר ריקה, והפקודה claude --debug תתעד ביומן Status line command skipped: workspace trust not accepted. הפעל מחדש את Claude Code ואשר את תיבת הדו-שיח של האמון כדי להפעיל אותה.

שגיאות או תקיעות של הסקריפט

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

התראות חולקות את שורת המצב

מחוץ אל עיבוד מסך מלא, Claude Code מציג התראות באותה שורה של שורת המצב שלך. בעיבוד מסך מלא, Claude Code מעניק להתראות שורה משלהן.

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