customize · diff

git:20260615.ad47f11 to git:20260916.2ca1ddb

76 added, 39 removed. Audit B to B.

---
description: Customize Howl statusline with fine-grained metric toggles and priority ordering
disable-model-invocation: false
---
# Howl Customize
Advanced configuration for Howl statusline: choose a base preset, toggle individual metrics, and set display priority for Line 2.
## Configuration Structure
```json
{
"preset": "developer",
"features": {
"quota": true
},
"priority": ["quota", "git"],
"thresholds": {
"context_danger": 90
}
}
```
- **preset**: Base configuration (`full`, `minimal`, `developer`, `cost-focused`)
- **features**: Override specific metrics from the preset base (optional)
- **priority**: Reorder Line 2 metrics by importance (optional, max 5)
- **thresholds**: Override color/behavior breakpoints (optional, see `/howl:threshold`)
## Process
### Step 1: Choose Base Preset
**Use AskUserQuestion to present preset choices:**
- **Question**: "Which base preset would you like to start with?"
- **Header**: "Choose Base Preset"
- **Options** (4):
- Label: **"full (default)"**
- Description: "All 13 metrics - Complete visibility (2-4 lines)"
+ Description: "All 12 preset toggles - Complete visibility (2-4 lines)"
- Label: **"minimal"**
Description: "Model + Context + Cost + Duration only (1 line)"
- Label: **"developer"**
- Description: "Coding focus: Account, Git, Changes, Cache, Vim (2 lines)"
+ Description: "Coding focus: full minus API wait, cost velocity and agent name (2 lines)"
- Label: **"cost-focused"**
- Description: "Budget tracking: Quota, API Wait, Cost Velocity (2 lines)"
+ Description: "Budget tracking: Account, Output tokens, Quota, API wait, Cost velocity (2 lines)"
**Store the user's selection as `chosenPreset`.**
### Step 2: Toggle Individual Metrics
- **Use AskUserQuestion with multiSelect to show metric toggles:**
+ There are 23 display toggles. `AskUserQuestion` allows at most four questions
+ per call and four options per question, so ask in themed groups rather than one
+ long list — a single 23-item checkbox is not something the tool can render.
- - **Question**: "Select which metrics to display (pre-checked = enabled in your preset)"
- - **Header**: "Customize Metrics"
- - **Options** (17 checkboxes):
- 1. **account** - Account email
- 2. **git** - Git branch + status
- 3. **line_changes** - Code additions/deletions
- 4. **quota** - Usage quota visualization
- 5. **tools** - Tool call counts
- 6. **agents** - Active agent indicators
- 7. **cache_efficiency** - Cache hit percentage
- 8. **api_wait_ratio** - API wait time ratio
- 9. **cost_velocity** - Cost per minute
- 10. **vim_mode** - Vim mode indicator
- 11. **agent_name** - Current agent name
- 12. **output_tokens** - Current-response output token count (`Out:1K`) _(default off)_
- 13. **effort** - Effort level indicator (`E:high`) _(default off)_
- 14. **thinking** - Extended thinking indicator (`Think`) _(default off)_
- 15. **session_name** - Truncated session name _(default off)_
- 16. **pull_request** - Linked PR status (`PR#1234 pending`) _(default off)_
- 17. **worktree** - Active git worktree (`wt:name`) _(default off)_
+ Use `multiSelect: true` on every group, and pre-check what the chosen preset
+ already enables.
+ **First call — the four groups people change most:**
+
+ | Group | Options |
+ | ---------------- | ---------------------------------------------------------- |
+ | Workspace | `git`, `repo`, `worktree`, `added_dirs` |
+ | Session | `account`, `session_name`, `vim_mode`, `output_style` |
+ | Cost and quota | `quota`, `cost_velocity`, `api_wait_ratio`, `line_changes` |
+ | Tools and agents | `tools`, `agents`, `agent_name`, `pull_request` |
+
+ **Second call — model and context:**
+
+ | Group | Options |
+ | ----------- | ---------------------------------- |
+ | Cache | `cache_efficiency`, `prompt_cache` |
+ | Model state | `effort`, `thinking`, `fast_mode` |
+ | Context | `output_tokens`, `exceeds_200k` |
+
+ What each one shows:
+
+ | Toggle | Shows | Default |
+ | ------------------ | -------------------------------------------------------------------------------------------------------------- | ---------- |
+ | `account` | Account email | on in full |
+ | `git` | Git branch and dirty marker | on in full |
+ | `line_changes` | Lines added and removed | on in full |
+ | `quota` | 5h and 7d quota bars | on in full |
+ | `tools` | Top tool call counts | on in full |
+ | `agents` | Running agent names | on in full |
+ | `cache_efficiency` | Cache hit rate of the **last API call** (`Cache:99%`) | on in full |
+ | `api_wait_ratio` | Share of session time spent waiting on the API | on in full |
+ | `cost_velocity` | Cost per minute | on in full |
+ | `vim_mode` | Vim mode (`Insert`, `V-Line`, …) | on in full |
+ | `agent_name` | Active agent (`@executor`) | on in full |
+ | `output_tokens` | Output tokens of the current response (`Out:1K`) | on in full |
+ | `effort` | Reasoning effort (`E:xhigh`) | off |
+ | `thinking` | Extended thinking indicator (`Think`) | off |
+ | `session_name` | Session name, truncated | off |
+ | `pull_request` | Linked PR or MR (`MR#23 approved`), clickable where supported | off |
+ | `worktree` | Active worktree (`wt:name`) | off |
+ | `prompt_cache` | **Session-wide** cache: hit ratio, time until the cache goes cold, rebuilds and their cause | off |
+ | `fast_mode` | Fast mode indicator | off |
+ | `exceeds_200k` | Warns past 200k tokens — a fixed threshold, so it can fire while the context bar still reads low on a 1M model | off |
+ | `output_style` | Active output style, unless it is the default | off |
+ | `repo` | Repository from the origin remote (`owner/name`) | off |
+ | `added_dirs` | Count of directories added with `/add-dir` | off |
+
+ `cache_efficiency` and `prompt_cache` answer different questions — the last call
+ versus the whole session — so neither replaces the other. Offer both.
+
**Pre-check based on `chosenPreset`:**
- - **full**: All core metrics checked (new optional toggles effort/thinking/session_name/pull_request/worktree unchecked)
- - **minimal**: None checked
- - **developer**: account, git, line_changes, cache_efficiency, vim_mode
- - **cost-focused**: quota, api_wait_ratio, cost_velocity
+ These are the exact sets in `internal/config.go`; read them there rather than
+ trusting a summary.
- **Important: Features are Additive-Only**
+ - **full** (12): account, git, line_changes, output_tokens, quota, tools, agents, cache_efficiency, api_wait_ratio, cost_velocity, vim_mode, agent_name
+ - **minimal** (0): none
+ - **developer** (9): account, git, line_changes, output_tokens, quota, tools, agents, cache_efficiency, vim_mode
+ - **cost-focused** (5): account, output_tokens, quota, api_wait_ratio, cost_velocity
- - ✅ **Checking** a metric enables it (adds to preset)
- - ❌ **Unchecking** does NOT disable it (preset base is preserved)
- - To disable features from `full`, start with `minimal` and check only what you want
+ **Features are additive-only.** Checking enables; unchecking does **not** disable,
+ because `mergeFeatures` can only turn a flag on. To drop something the preset
+ includes, start from `minimal` in Step 1 and check only what is wanted.
- **Example:**
+ - Want `full` without git? Start from `minimal` and check everything except git.
+ - Want `developer` plus quota? Start from `developer` and check quota.
- - Want `full` without git? → Use Step 1: `minimal`, Step 2: check all except git
- - Want `developer` + quota? → Use Step 1: `developer`, Step 2: check quota
+ **The update badge is the exception.** `hide_update_notice` is an opt-**out**: it
+ is on by default, and setting it to `true` turns the badge off. It exists in this
+ inverted shape precisely because an additive merge could never switch off a
+ default-on flag. Do not put it in the metric groups — offer it only if the user
+ asks to stop seeing update notices, and explain that it also stops the daily
+ version check.
- **Important Notes:**
+ **Always displayed, not toggleable:** model badge, context bar, session cost, duration.
- - Model badge, context bar, cost, and duration are **always displayed** (cannot be toggled)
- - If user selects the same set as the preset base, omit `features` from config.json (cleaner)
- - If user changes any toggles, record differences in `features` object
+ If the resulting selection matches the preset exactly, omit `features` from
+ config.json entirely — a preset name alone is easier to read later.
**Store selections as `selectedFeatures` array.**
### Step 3: Set Display Priority (Line 2 Only)
**Use AskUserQuestion with multiSelect for priority:**
- **Question**: "Choose which metrics should appear first on Line 2 (max 5, ordered by selection)"
- **Header**: "Display Priority (Optional)"
- **Subtitle**: "Only Line 2 metrics can be prioritized. Selected order = display order."
- **Options** (4 checkboxes, only Line 2 metrics):
1. **account** - Account email
2. **git** - Git branch + status
3. **line_changes** - Code additions/deletions
4. **quota** - Usage quota visualization
**Constraints:**
- Max 5 selections
- Selection order determines display order
- Only show metrics that are **enabled** in the feature toggles from Step 2
- If user selects 0 metrics, omit `priority` from config.json
**Store selections as `priorityOrder` array (preserving order).**
### Step 4: Generate and Apply Configuration
**Build the config object:**
```json
{
"preset": "<chosenPreset>",
"features": {
// Only include if different from preset base
// Format: "metric_name": true/false
},
"priority": [
// Only include if user selected 1+ metrics
// Format: ["metric1", "metric2", ...]
]
}
```
**Apply configuration:**
```bash
mkdir -p ~/.claude/hud
cat > ~/.claude/hud/config.json << 'EOF'
{JSON_CONTENT_HERE}
EOF
```
**Show a configuration summary:**
```
✅ Configuration Applied
Preset: developer
Overrides: quota (enabled)
Priority: quota → git
Preview (example):
[Sonnet 4.5] | ████░░░░░░░░░░░░░░░░ 21% (210K/1M) | $32.7 | 2h46m
(2h)5h: 55%/42% :7d(3d6h) | user@example.com | main* | +2.7K/-120 | Cache:96% | I
Changes will apply on next refresh (~300ms).
```
## Examples
### Example 1: Preset + Feature Override
User wants `developer` preset but also wants quota visualization:
```json
{
"preset": "developer",
"features": {
"quota": true
}
}
```
### Example 2: Full Customization with Priority
User wants `full` preset but prioritizes git and quota on Line 2:
```json
{
"preset": "full",
"priority": ["git", "quota"]
}
```
### Example 3: Minimal + Selective Additions
User wants `minimal` but adds git and cache:
```json
{
"preset": "minimal",
"features": {
"git": true,
"cache_efficiency": true
}
}
```
### Example 4: Cost-focused with Custom Priority
User wants `cost-focused` and reorders Line 2:
```json
{
"preset": "cost-focused",
"priority": ["quota"]
}
```
## Reset to Default
To reset to `full` preset with no overrides:
```bash
rm ~/.claude/hud/config.json
```
Or set explicitly:
```bash
echo '{"preset":"full"}' > ~/.claude/hud/config.json
```
## Current Configuration
To view current config:
```bash
cat ~/.claude/hud/config.json
```
## Important Notes
### Danger Mode Override
**When context usage reaches the danger threshold (default 85%), Howl automatically switches to full information mode regardless of your configuration.** This ensures complete visibility during critical situations.
This override cannot be disabled - it's a safety feature. The trigger point can be adjusted via `/howl:threshold` or the `context_danger` field in config.json.
### Configuration Validation
- Invalid preset names fall back to `full`
- Feature toggles only accept known metrics (others ignored silently)
- Priority only accepts **Line 2 metrics** (others ignored)
- Priority is capped at **5 metrics maximum**
- Duplicate entries in priority are removed
- Config file size limited to 4KB (DoS protection)
### Line Placement Rules
- **Line 1**: Model badge, context bar, cost, duration (always shown)
- **Line 2**: account, git, line_changes, quota (prioritizable)
- **Line 3**: tools, agents (only in `full` preset or danger mode)
- **Line 4**: cache_efficiency, api_wait_ratio, cost_velocity, vim_mode, agent_name (only in `full` or danger mode)
- **Optional** (default off): effort, thinking, session_name, pull_request, worktree
### Refresh Rate
Configuration changes apply on the next statusline refresh (~300ms). No restart needed.
### Quick Switch Between Presets
If user just wants to switch presets without customization, recommend using `/howl:configure` instead - it's faster for simple preset changes.
### Color Thresholds
To customize when colors change (e.g., danger mode trigger, cost warning levels), use `/howl:threshold` instead. This skill focuses on **which** metrics are displayed; `/howl:threshold` controls **when** they change color.
## Example Dialogue
```
User: I want more control over what's shown
Agent: I can help customize that! Let's walk through it.
[Step 1] Which base preset?
> developer
[Step 2] Customize metrics (pre-checked based on developer):
☑ account, git, line_changes, cache_efficiency, vim_mode
☐ quota, tools, agents, api_wait_ratio, cost_velocity, agent_name, effort, thinking, session_name, pull_request, worktree
> User also checks: quota
[Step 3] Priority for Line 2 (max 5):
> User selects: quota, git (in that order)
Applying configuration...
✅ Config applied: developer + quota, priority: quota → git
Preview: (2h)5h: 55%/42% :7d(3d6h) | user@example.com | ...
Changes will apply in ~300ms.
```