תיעוד 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 בשורה הראשונה וסרגל הקשר עם קידוד צבעים בשורה השנייה.

דף זה מנחה אותך דרך הגדרת שורת מצב בסיסית, מסביר כיצד הנתונים זורמים מ-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.

צור סקריפט שקורא 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הוסף להגדרות: הורה ל-
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 כדי להריץ מחדש את הפקודה גם לפי טיימר קבוע.
מה הסקריפט שלך יכול לפלוט
- מספר שורות: כל הוראת
echoאוprintמוצגת כשורה נפרדת. ראה את דוגמת ריבוי השורות. - צבעים: השתמש ב-קודי מילוט של ANSI כמו
\033[32mלירוק (המסוף חייב לתמוך בהם). ראה את דוגמת מצב git. - קישורים: השתמש ב-רצפי מילוט OSC 8 כדי להפוך טקסט ללחיץ (Cmd+click ב-macOS, או Ctrl+click ב-Windows/Linux). דורש מסוף התומך בהיפר-קישורים כגון iTerm2, Kitty או WezTerm. ראה את דוגמת קישורים לחיצים.
התאמת גודל הפלט למסוף
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, השינוי באורך פרומפט המערכת, בתווים
#דוגמאות
דוגמאות אלה מציגות דפוסים נפוצים של שורת מצב. כדי להשתמש בכל דוגמה:
- שמור את הסקריפט לקובץ כמו
~/.claude/statusline.sh(או.py/.js) - הפוך אותו לבר-ביצוע:
chmod +x ~/.claude/statusline.sh - הוסף את הנתיב אל ההגדרות שלך
דוגמאות ה-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 וקבצים ששונו, ומציג מחוונים בעלי קידוד צבעים:
#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`);
});#הצגת מספר שורות
הסקריפט שלך יכול לפלוט מספר שורות כדי ליצור תצוגה עשירה יותר.

דוגמה זו משלבת מספר טכניקות: צבעים מבוססי סף (ירוק מתחת ל-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) ולחץ כדי לפתוח את הקישור בדפדפן שלך.

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