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

תיעוד 153

התאמה אישית של שורת הסטטוס

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

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

שורות סטטוס שימושיות כאשר:

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

שורת הסטטוס מוצגת בשורה משלה מעל תגי הכותרת התחתונה המובנים ואינה מחליפה אותם. כאשר מוגדרת שורת סטטוס מותאמת אישית, Claude Code מפסיק להציג את רוב רמזי המקלדת בכותרת התחתונה, כולל esc to interrupt, הגיבוי ? for shortcuts, ורמז hold space to speak של הכתבה קולית. כדי להוסיף תגי קישור לחיצים לכותרת התחתונה כאשר מזהה מופיע בשיחה, בלי לכתוב סקריפט, הגדירו במקום זאת את 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 לנתיב סקריפט או לפקודת מעטפת מוטמעת. למדריך מלא ליצירת סקריפט, ראו בניית שורת סטטוס צעד אחר צעד.

{
  "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 -- מתחת לפרומפט. הגדירו אותו ל-true כאשר הסקריפט מציג בעצמו את vim.mode, כדי שהמצב לא יוצג פעמיים.

#כיבוי שורת הסטטוס

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

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

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

הערה: הרצת /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"
  1. הפיכה לקובץ בר הרצה

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

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.

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

#מתי שורת הסטטוס מתעדכנת

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

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

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

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

#מה הסקריפט יכול להדפיס

הסקריפט יכול להדפיס יותר משורת טקסט רגיל אחת:

#התאמת הפלט לגודל הטרמינל

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

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

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. בפרויקט gitlab.com שמקונן בתת קבוצות, owner הוא נתיב ה-namespace המלא עם לוכסנים, כמו "group/subgroup". לפני v2.1.260, workspace.repo היה נעדר בפרויקטים אלה
cost.total_cost_usdעלות משוערת של הסשן בדולר ארה"ב, מחושבת בצד הלקוח לפי מחיר מחירון אלא אם טבלת modelPricing בתוקף. עשויה להיות שונה מהחשבון בפועל. מתאפסת ל-$0 כאשר /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), ולא רמה שקבע skill, subagent, או ultrathink. אם הגדרת רמה שהמודל אינו תומך בה, השדה מציג את הרמה ש-Claude Code הריץ במקומה. רמה שאתה משנה מופיעה כאן גם לפני שהיא מתחילה. כאשר יש רמה ב-CLAUDE_CODE_EFFORT_LEVEL, השדה מציג את הרמה הזו. נעדר כאשר המודל הנוכחי אינו תומך בפרמטר effort
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מאחורי שער אפליקציות Claude, כמה ממגבלת ההוצאה ניצלת ומתי התקופה שלה מתאפסת. ראה שדות מגבלת הוצאה. דורש Claude Code v2.1.251 או חדש יותר
rate_limits.spend_limit.used_usd, rate_limits.spend_limit.limit_usd, rate_limits.spend_limit.periodההוצאה המשוערת שלך והמגבלה שלך בדולר ארה"ב, ותקופת המגבלה. שדות אלה יכולים להיות נעדרים. ראה שדות מגבלת הוצאה. דורש v2.1.284 או חדש יותר גם ב-Claude Code וגם בשער
prompt_cacheסטטיסטיקות מטמון הפרומפט של הסשן לשיחה הראשית: יחס פגיעות, החטאות, והאם המטמון חם. ראה שדות מטמון הפרומפט לכל שדה. נעדר עד התשובה הראשונה של ה-API בשיחה הראשית. דורש Claude Code v2.1.251 או חדש יותר
session_idמזהה סשן ייחודי
session_nameשם הסשן. משתמש בשם המותאם שהוגדר עם הדגל --name או /rename כאשר קיים כזה, אחרת בכותרת הסשן שנוצרה על ידי AI. שם התצוגה כברירת מחדל, כמו my-app-3f, אינו ממלא את השדה הזה. נעדר כאשר לסשן אין שם מותאם ואין כותרת שנוצרה על ידי AI
prompt_idUUID שמזהה את פרומפט המשתמש שמעובד כרגע. תואם למאפיין prompt.id באירועי OpenTelemetry. נעדר עד הקלט הראשון של המשתמש
transcript_pathנתיב לקובץ תמליל השיחה
versionגרסת Claude Code
output_style.nameשם סגנון הפלט הנוכחי
vim.modeמצב vim הנוכחי (NORMAL, INSERT, VISUAL, או VISUAL LINE) כאשר מצב vim מופעל
agent.nameשם הסוכן בעת הרצה עם הדגל --agent או כאשר מוגדרות הגדרות סוכן
pr.number, pr.urlבקשת משיכה פתוחה לענף הנוכחי. משקפת את תג ה-PR בכותרת התחתונה. במאגר עם remote של GitLab, Claude Code ממלא את השדות האלה מבקשת המיזוג הפתוחה של הענף במקום זאת, כך ש-pr.number הוא מספר בקשת המיזוג. נתוני בקשת מיזוג דורשים Claude Code v2.1.234 או חדש יותר. נעדר כאשר לא נמצאים במאגר git, עד שנמצאת בקשת משיכה או בקשת מיזוג, או לאחר שהיא מתמזגת או נסגרת
pr.review_stateסטטוס הסקירה של ה-PR הפתוח: approved, pending, changes_requested, או draft. עשוי להיות נעדר בנפרד גם כאשר pr קיים
pr.kindmr כאשר pr מתאר בקשת מיזוג של GitLab. נעדר עבור בקשות משיכה של GitHub, כך שסקריפטים שנכתבו לפני השדה הזה ממשיכים לעבוד. עבור בקשת מיזוג, 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 מבוססי hook
worktree.original_cwdהספרייה שבה Claude היה לפני הכניסה ל-worktree
worktree.original_branchענף Git שהיה במצב checkout לפני הכניסה ל-worktree. נעדר עבור worktrees מבוססי hook

#סכמת 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-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,
      "used_usd": 314.12,
      "limit_usd": 500,
      "period": "monthly"
    }
  },
  "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, או לאחר שקיימת כותרת סשן שנוצרה על ידי AI. שם התצוגה כברירת מחדל, כמו my-app-3f, אינו ממלא אותו
  • prompt_id: מופיע רק אחרי הקלט הראשון של המשתמש
  • workspace.git_worktree: מופיע רק כאשר הספרייה הנוכחית נמצאת בתוך git worktree מקושר
  • workspace.repo: מופיע רק בתוך מאגר git שבו מוגדר remote בשם origin
  • effort: מופיע רק כאשר המודל הנוכחי תומך בפרמטר מאמץ החשיבה
  • vim: מופיע רק כאשר מצב vim מופעל
  • agent: מופיע רק בעת הרצה עם הדגל --agent או כאשר מוגדרות הגדרות סוכן
  • pr: מופיע רק כל עוד נמצאת בקשת PR פתוחה או בקשת מיזוג של GitLab לענף הנוכחי, ומוסר לאחר שהיא מתמזגת או נסגרת. pr.review_state ו-pr.kind עשויים להיות נעדרים בנפרד
  • worktree: מופיע רק כל עוד הסשן נמצא בסשן worktree. כאשר הוא קיים, branch ו-original_branch עשויים גם הם להיות נעדרים עבור worktrees מבוססי hook
  • rate_limits: מופיע רק למנויי claude.ai Pro, Max ו-Ultra, או מאחורי שער אפליקציות Claude שמגדיר עבורך מגבלת הוצאה. גם אז, הוא מופיע רק אחרי התשובה הראשונה של ה-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 הוא טוקני הפלט מהתשובה האחרונה. שניהם 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 ממלאת אותו מחדש.

#שדות מגבלת הוצאה

מאחורי שער אפליקציות Claude עם מגבלות הוצאה, אובייקט rate_limits.spend_limit מתאר את מגבלת ההוצאה שחלה עליך. הוא מופיע אחרי התשובה הראשונה של ה-API בסשן ודורש Claude Code v2.1.251 או חדש יותר. הסקריפט שלך מקבל את השדות שלו בלוחות זמנים נפרדים:

  • used_percentage ו-resets_at: מגיעים עם כל תשובה, ולכן הם נוכחים בכל פעם ש-spend_limit נוכח. used_percentage נע מ-0 עד 100, או מעל 100 לאחר שחורגים מהמגבלה, ו-resets_at הוא שניות Unix epoch שבהן תקופת המגבלה מתאפסת.
  • used_usd, limit_usd ו-period: ההוצאה המשוערת שלך עד כה והמגבלה שלך בדולר ארה"ב, והתקופה שהמגבלה מכסה, אחת מבין daily, weekly, או monthly. השער מחשב את used_usd מספירות טוקנים, ולכן זו הערכה ולא סכום שחויב. Claude Code קורא אותם מהשער בבקשה נפרדת, בערך כל חמש דקות בזמן שאתה שולח בקשות. סכומי הדולרים יכולים להיות ישנים בכחמש דקות מ-used_percentage, ולכן השניים עשויים שלא להתאים לזמן קצר. דורש v2.1.284 או חדש יותר גם ב-Claude Code וגם בשער.

התייחס ל-used_usd, limit_usd ו-period כאופציונליים גם כאשר spend_limit נוכח, כי הסקריפט שלך מקבל את האחוז לפניהם. קרא כל אחד עם ערך חלופי בסקריפט, כמו jq -r '.rate_limits.spend_limit.used_usd // empty'. לפני Claude Code v2.1.295, הם נשארו נעדרים אם הגדרת CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, שכיבה את הבקשה הזו.

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

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

האובייקט מופיע אחרי תשובת ה-API הראשונה של השיחה הראשית. Claude Code לא סופר בקשות של subagent בסטטיסטיקה הזו. נדרש 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 אסימונים ממה שהבקשה יכלה לקרוא מהמטמון, בלי compaction או ניקוי תוצאות כלים שמסבירים את החוסר בקריאות מהמטמון
expected_rebuildsבניות מחדש של המטמון שבאו אחרי compaction או אחרי ניקוי של תוצאות כלים ישנות
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 מיד אחרי compaction או ניקוי של תוצאות כלים ישנות, עד שהבקשה הבאה רושמת את גודל השיחה שנכתבה מחדש

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 תווים שבו בלוקים מלאים (▓) מייצגים שימוש:

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

#!/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%"
#!/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}%")
#!/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 עם מחוונים בצבע לקבצים ב-staging ולקבצים ששונו. הסקריפט הזה משתמש בקודי מילוט של ANSI לצבעי טרמינל: \033[32m הוא ירוק, \033[33m הוא צהוב, ו-\033[0m מאפס לברירת המחדל.

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

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

#!/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
#!/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}")
#!/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.

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

שורת סטטוס שמציגה שם מודל, עלות הסשן, ומשך

#!/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"
#!/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")
#!/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 יוצרת שורה נפרדת:

#!/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"
#!/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")
#!/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

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

#!/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
#!/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}]")
#!/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, או את ההוצאה שלך מול מגבלת הוצאה של שער Claude apps. למנויים, האובייקט rate_limits יכול להכיל חלון מתגלגל five_hour וחלון שבועי seven_day. כל חלון מספק used_percentage, מ-0 עד 100, ו-resets_at, שניות Unix epoch שבהן החלון מתאפס. מאחורי שער, קרא את האובייקט spend_limit, המתואר תחת שדות מגבלת הוצאה.

האובייקט rate_limits קיים רק למנויי claude.ai Pro, Max ו-Ultra, או מאחורי שער Claude apps עם מגבלות הוצאה, ורק אחרי תגובת ה-API הראשונה. כל סקריפט מטפל בשדות החסרים בצורה חלקה, ומאחורי שער מדפיס spend: $314.12 / $500, או spend: 63% כששדות הדולר חסרים:

#!/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")%"

# Behind a Claude apps gateway: dollars when the gateway reports them, else the percentage
SPEND_PCT=$(echo "$input" | jq -r '.rate_limits.spend_limit.used_percentage // empty')
SPEND_USD=$(echo "$input" | jq -r '.rate_limits.spend_limit | select(.used_usd != null) | "$\(.used_usd) / $\(.limit_usd)"')
[ -n "$SPEND_PCT" ] && LIMITS="${LIMITS:+$LIMITS }spend: ${SPEND_USD:-$(printf '%.0f' "$SPEND_PCT")%}"

[ -n "$LIMITS" ] && echo "[$MODEL] | $LIMITS" || echo "[$MODEL]"
#!/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}%")

# Behind a Claude apps gateway: dollars when the gateway reports them, else the percentage
spend = rate.get('spend_limit', {})
if spend.get('used_percentage') is not None:
    if spend.get('used_usd') is not None:
        parts.append(f"spend: ${spend['used_usd']} / ${spend['limit_usd']}")
    else:
        parts.append(f"spend: {spend['used_percentage']:.0f}%")

if parts:
    print(f"[{model}] | {' '.join(parts)}")
else:
    print(f"[{model}]")
#!/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)}%`);

    // Behind a Claude apps gateway: dollars when the gateway reports them, else the percentage
    const spend = data.rate_limits?.spend_limit;
    if (spend?.used_percentage != null) {
        parts.push(spend.used_usd != null
            ? `spend: $${spend.used_usd} / $${spend.limit_usd}`
            : `spend: ${Math.round(spend.used_percentage)}%`);
    }

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

#שמירת פעולות יקרות במטמון

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

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

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

#!/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
#!/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}")
#!/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 עם רשומה אחת לכל שורה, כמתואר בשדות משימה.

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

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

#שדות משימה

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

שדהסוגתיאור
idמחרוזתמזהה המשימה. החזר אותו כ-id בשורה שאתה כותב בחזרה עבור השורה הזו
nameמחרוזת, אופציונליהשם שבו פונים לסוכן המשנה, כשיש לו שם
typeמחרוזתסוג המשימה: local_agent
agentTypeמחרוזתסוג סוכן המשנה שהמשימה רצה בתורו, כמו Explore המובנה או code-reviewer מותאם. מחזיק את אותו ערך ש-hooks מקבלים כ-agent_type. דורש Claude Code v2.1.293 או מאוחר יותר
statusמחרוזתמצב המשימה, כמו running, completed, failed, או killed
descriptionמחרוזתתיאור קצר של המשימה, כמו זה ש-Claude נתן כשהוא יצר את סוכן המשנה
labelמחרוזתסיכום התקדמות קצר של המשימה כשל-Claude Code יש אחד, אחרת אותו טקסט כמו description
startTimeמספרמתי המשימה התחילה, במילישניות מאז Unix epoch
modelמחרוזת, אופציונלימזהה המודל שנפתר שהמשימה רצה עליו. מושמט עד שהמודל נפתר
effortמחרוזת או מספר, אופציונלימאמץ הסקה שהוגדר לסוכן המשנה ב-frontmatter של ההגדרה שלו או בהפעלה הבודדת: low, medium, high, xhigh, max, או תקציב טוקנים מספרי. זה הערך שהוגדר, ומאמץ ש-Claude Code מחיל יכול להיות שונה כשהמודל לא תומך ברמה הזו. מושמט כשלא הוגדר מאמץ
contextWindowSizeמספר, אופציונליחלון הקשר של model בטוקנים, מחושב באותה דרך כמו context_window.context_window_size של שורת המצב הראשית, כדי שתוכל לרנדר אחוז לכל שורה מ-tokenCount. מושמט כש-model הוא
tokenCountמספרספירת הטוקנים השוטפת של סוכן המשנה, המספר ששורת ברירת המחדל מציגה
tokenSamplesמערך מספריםעד 16 הקריאות האחרונות של tokenCount, אחת לכל מחזור רענון, הישנה ראשונה ומסתיימת בנוכחית
cwdמחרוזתתיקיית העבודה של סוכן המשנה: התיקייה שלו כשהוא רץ באחת, כמו worktree מבודד, אחרת תיקיית העבודה של הסשן

#טיפים

  • בדיקה עם קלט מדומה: 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 אם הערכים נשארים ריקים אחרי כמה הודעות.

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

שורת המצב מדווחת על הספירות מתגובת ה-API האחרונה, בעוד ש-/context מוסיף אומדן להודעות שנוספו מאז התגובה הזו, ולכן /context יכול להציג ערך גבוה יותר עד התגובה הבאה. השתמשו ב-used_percentage למצב ההקשר המדויק הפשוט ביותר. לנוסחה שמאחורי used_percentage, ראו שדות חלון ההקשר.

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

אם קישור ניתן ללחיצה תלוי בטרמינל שלכם, בכך אם Claude Code מזהה בו תמיכה בקישורים, בכך אם SSH או tmux מסירים את רצף המילוט, ובאופן שבו הסקריפט מדפיס אותו:

  • ודאו שהטרמינל תומך בקישורי 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 מציג את פלט הסקריפט רק אחרי שהסקריפט יוצא עם קוד 0:

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

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

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

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