Initial commit: Fresh start with current state
This commit is contained in:
331
.claude/STATUS_LINE_SETUP.md
Normal file
331
.claude/STATUS_LINE_SETUP.md
Normal file
@@ -0,0 +1,331 @@
|
||||
# Status Line Customization
|
||||
|
||||
> **Status**: ✅ Configured
|
||||
> **Date**: 2025-10-17
|
||||
|
||||
## Overview
|
||||
|
||||
The status line displays real-time information at the bottom of your Claude Code terminal. It's configured to show:
|
||||
- 📁 Current directory (last 2 path segments)
|
||||
- 🌿 Git branch (if in a git repository)
|
||||
- ● Uncommitted changes indicator
|
||||
- 🕐 Current time
|
||||
|
||||
## Current Configuration
|
||||
|
||||
**Location**: `.claude/statusline.sh`
|
||||
**Format**: `📁 project/subdir 🌿 main ● | 🕐 14:30`
|
||||
|
||||
### What's Displayed
|
||||
|
||||
| Element | Description | Example |
|
||||
|---------|-------------|---------|
|
||||
| 📁 Directory | Last 2 path segments | `Claude Code Setup/subdir` |
|
||||
| 🌿 Branch | Current git branch | `main` |
|
||||
| ● Changes | Uncommitted changes indicator | Shows when dirty |
|
||||
| 🕐 Time | Current time (HH:MM) | `14:30` |
|
||||
|
||||
## Customization Options
|
||||
|
||||
### Adding More Information
|
||||
|
||||
Edit [`.claude/statusline.sh`](.claude/statusline.sh) to add:
|
||||
|
||||
#### 1. **Token Count / Context Usage**
|
||||
```bash
|
||||
# This requires Claude Code to expose this info
|
||||
# Currently not available in status line script
|
||||
```
|
||||
|
||||
#### 2. **Model Name**
|
||||
```bash
|
||||
# Get from environment if set
|
||||
MODEL="${CLAUDE_MODEL:-sonnet}"
|
||||
echo "... | 🤖 $MODEL | ..."
|
||||
```
|
||||
|
||||
#### 3. **Project Name**
|
||||
```bash
|
||||
# From package.json or project config
|
||||
PROJECT=$(cat package.json 2>/dev/null | grep '"name"' | head -1 | cut -d'"' -f4)
|
||||
if [ -n "$PROJECT" ]; then
|
||||
echo "📦 $PROJECT | ..."
|
||||
fi
|
||||
```
|
||||
|
||||
#### 4. **Git Commit Count**
|
||||
```bash
|
||||
COMMIT_COUNT=$(git rev-list --count HEAD 2>/dev/null)
|
||||
if [ -n "$COMMIT_COUNT" ]; then
|
||||
echo "... | 📝 $COMMIT_COUNT commits | ..."
|
||||
fi
|
||||
```
|
||||
|
||||
#### 5. **Pending Changes Count**
|
||||
```bash
|
||||
CHANGED_FILES=$(git diff --name-only 2>/dev/null | wc -l)
|
||||
if [ "$CHANGED_FILES" -gt 0 ]; then
|
||||
echo "... | ✏️ $CHANGED_FILES files | ..."
|
||||
fi
|
||||
```
|
||||
|
||||
#### 6. **Last Commit Time**
|
||||
```bash
|
||||
LAST_COMMIT=$(git log -1 --format="%ar" 2>/dev/null)
|
||||
if [ -n "$LAST_COMMIT" ]; then
|
||||
echo "... | ⏰ $LAST_COMMIT | ..."
|
||||
fi
|
||||
```
|
||||
|
||||
### Color and Styling
|
||||
|
||||
The status line supports ANSI escape codes:
|
||||
|
||||
```bash
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Example: Color git branch based on state
|
||||
if [ -z "$(git status --porcelain 2>/dev/null)" ]; then
|
||||
# Clean
|
||||
echo "🌿 ${GREEN}$GIT_BRANCH${NC}"
|
||||
else
|
||||
# Dirty
|
||||
echo "🌿 ${RED}$GIT_BRANCH${NC} ●"
|
||||
fi
|
||||
```
|
||||
|
||||
### Layout Options
|
||||
|
||||
#### Left-Heavy Layout
|
||||
```bash
|
||||
# More info on left, minimal on right
|
||||
echo "📁 $DIR 🌿 $BRANCH ● ✏️ $CHANGED_FILES | $TIME"
|
||||
```
|
||||
|
||||
#### Center Information
|
||||
```bash
|
||||
# Balance information
|
||||
echo "$DIR | 🌿 $BRANCH $STATUS | 🕐 $TIME"
|
||||
```
|
||||
|
||||
#### Minimal Layout
|
||||
```bash
|
||||
# Just essentials
|
||||
echo "$DIR | $BRANCH"
|
||||
```
|
||||
|
||||
### Dynamic Padding
|
||||
|
||||
Adjust spacing based on terminal width:
|
||||
|
||||
```bash
|
||||
# Get terminal width
|
||||
TERM_WIDTH=$(tput cols)
|
||||
|
||||
# Calculate available space
|
||||
# Adjust content based on width
|
||||
if [ "$TERM_WIDTH" -lt 80 ]; then
|
||||
# Narrow terminal - minimal info
|
||||
echo "$DIR | $TIME"
|
||||
else
|
||||
# Wide terminal - full info
|
||||
echo "📁 $DIR 🌿 $BRANCH ● ✏️ $CHANGED 📝 $COMMITS | 🕐 $TIME"
|
||||
fi
|
||||
```
|
||||
|
||||
## Example Configurations
|
||||
|
||||
### Configuration 1: Developer Focus
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
BRANCH=$(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')
|
||||
CHANGED=$(git diff --name-only 2>/dev/null | wc -l)
|
||||
STAGED=$(git diff --cached --name-only 2>/dev/null | wc -l)
|
||||
echo "🌿 $BRANCH | ✏️ $CHANGED modified | ✅ $STAGED staged"
|
||||
```
|
||||
|
||||
### Configuration 2: Project Overview
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
PROJECT=$(basename $(pwd))
|
||||
BRANCH=$(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')
|
||||
COMMITS=$(git rev-list --count HEAD 2>/dev/null)
|
||||
echo "📦 $PROJECT | 🌿 $BRANCH | 📝 $COMMITS commits"
|
||||
```
|
||||
|
||||
### Configuration 3: Time Tracking
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
SESSION_START=${SESSION_START:-$(date +%s)}
|
||||
CURRENT=$(date +%s)
|
||||
DURATION=$((CURRENT - SESSION_START))
|
||||
MINUTES=$((DURATION / 60))
|
||||
echo "⏱️ Session: ${MINUTES}m | 🕐 $(date +%H:%M)"
|
||||
```
|
||||
|
||||
### Configuration 4: Full Featured
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Directory
|
||||
DIR=$(pwd | awk -F/ '{print $(NF-1)"/"$NF}')
|
||||
|
||||
# Git info
|
||||
BRANCH=$(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')
|
||||
if [ -n "$BRANCH" ]; then
|
||||
AHEAD=$(git rev-list @{u}..HEAD 2>/dev/null | wc -l)
|
||||
BEHIND=$(git rev-list HEAD..@{u} 2>/dev/null | wc -l)
|
||||
|
||||
GIT_INFO="🌿 $BRANCH"
|
||||
|
||||
if [ "$AHEAD" -gt 0 ]; then
|
||||
GIT_INFO="$GIT_INFO ↑$AHEAD"
|
||||
fi
|
||||
|
||||
if [ "$BEHIND" -gt 0 ]; then
|
||||
GIT_INFO="$GIT_INFO ↓$BEHIND"
|
||||
fi
|
||||
|
||||
if [ -n "$(git status --porcelain 2>/dev/null)" ]; then
|
||||
GIT_INFO="$GIT_INFO ●"
|
||||
fi
|
||||
else
|
||||
GIT_INFO=""
|
||||
fi
|
||||
|
||||
# Time
|
||||
TIME="🕐 $(date +%H:%M:%S)"
|
||||
|
||||
# Output
|
||||
echo "📁 $DIR | $GIT_INFO | $TIME"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Status Line Not Showing
|
||||
1. Check script is executable: `chmod +x .claude/statusline.sh`
|
||||
2. Verify settings.json syntax is correct
|
||||
3. Test script manually: `bash .claude/statusline.sh`
|
||||
4. Check Claude Code logs: `.claude/logs/`
|
||||
|
||||
### Slow Performance
|
||||
If status line updates feel slow:
|
||||
```bash
|
||||
# Cache expensive operations
|
||||
# Example: Cache git status for 5 seconds
|
||||
CACHE_FILE="/tmp/claude_statusline_cache"
|
||||
CACHE_AGE=5
|
||||
|
||||
if [ -f "$CACHE_FILE" ] && [ $(($(date +%s) - $(stat -c %Y "$CACHE_FILE"))) -lt $CACHE_AGE ]; then
|
||||
cat "$CACHE_FILE"
|
||||
else
|
||||
# Generate status line
|
||||
OUTPUT="📁 $(pwd) | ..."
|
||||
echo "$OUTPUT" | tee "$CACHE_FILE"
|
||||
fi
|
||||
```
|
||||
|
||||
### Script Errors
|
||||
Enable debugging:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -x # Print commands as they execute
|
||||
# Your status line code
|
||||
```
|
||||
|
||||
View errors in Claude Code logs or run manually:
|
||||
```bash
|
||||
bash .claude/statusline.sh 2>&1
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Performance
|
||||
- Keep scripts fast (< 100ms execution time)
|
||||
- Cache expensive operations
|
||||
- Avoid network calls
|
||||
- Use built-in commands over external tools
|
||||
|
||||
### Information Density
|
||||
- Don't overcrowd the status line
|
||||
- Prioritize most useful information
|
||||
- Consider terminal width
|
||||
- Use abbreviations for long text
|
||||
|
||||
### Visual Design
|
||||
- Use emoji icons sparingly
|
||||
- Consider colorblind users (don't rely only on color)
|
||||
- Test in different terminal emulators
|
||||
- Ensure readability in light and dark themes
|
||||
|
||||
### Maintainability
|
||||
- Comment complex logic
|
||||
- Use functions for reusability
|
||||
- Test edge cases (no git repo, etc.)
|
||||
- Document custom icons/abbreviations
|
||||
|
||||
## Advanced: Conditional Status Lines
|
||||
|
||||
Show different info based on context:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Detect context
|
||||
if [ -f "package.json" ]; then
|
||||
# Node.js project
|
||||
PKG_NAME=$(cat package.json | grep '"name"' | head -1 | cut -d'"' -f4)
|
||||
PKG_VERSION=$(cat package.json | grep '"version"' | head -1 | cut -d'"' -f4)
|
||||
echo "📦 $PKG_NAME v$PKG_VERSION | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')"
|
||||
|
||||
elif [ -f "Cargo.toml" ]; then
|
||||
# Rust project
|
||||
PKG_NAME=$(grep '^name' Cargo.toml | head -1 | cut -d'"' -f2)
|
||||
echo "🦀 $PKG_NAME | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')"
|
||||
|
||||
elif [ -f "requirements.txt" ] || [ -f "pyproject.toml" ]; then
|
||||
# Python project
|
||||
echo "🐍 Python | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')"
|
||||
|
||||
else
|
||||
# Generic
|
||||
echo "📁 $(basename $(pwd)) | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')"
|
||||
fi
|
||||
```
|
||||
|
||||
## Disabling Status Line
|
||||
|
||||
Temporarily disable:
|
||||
```bash
|
||||
# In current session
|
||||
/settings statusLine.type none
|
||||
```
|
||||
|
||||
Permanently disable:
|
||||
```json
|
||||
// Remove or comment out in .claude/settings.json
|
||||
// "statusLine": { ... }
|
||||
```
|
||||
|
||||
## Related Features
|
||||
|
||||
- **Hooks**: Run commands on events
|
||||
- **Output Styles**: Change Claude's response format
|
||||
- **Behaviors**: Modify Claude's behavior patterns
|
||||
|
||||
## Resources
|
||||
|
||||
- [Official Status Line Docs](https://docs.claude.com/en/docs/claude-code/status-line-configuration)
|
||||
- [ANSI Color Codes](https://en.wikipedia.org/wiki/ANSI_escape_code)
|
||||
- [Bash Scripting Guide](https://www.gnu.org/software/bash/manual/)
|
||||
|
||||
---
|
||||
|
||||
**Configuration Version**: 1.0.0
|
||||
**Last Updated**: 2025-10-17
|
||||
**Maintainer**: [Your Name]
|
||||
Reference in New Issue
Block a user