diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4353b7b..a92528d 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "claude-hud", "description": "Real-time statusline HUD for Claude Code - context health, tool activity, agent tracking, and todo progress", - "version": "0.0.6", + "version": "0.0.7", "author": { "name": "Jarrod Watts", "url": "https://github.com/jarrodwatts" diff --git a/CHANGELOG.md b/CHANGELOG.md index 02535bd..cf0fccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,31 @@ All notable changes to Claude HUD will be documented in this file. -## [Unreleased] +## [0.0.7] - 2026-02-06 + +### Changed +- **Redesigned default layout** — clean 2-line display replaces the previous multi-line default + - Line 1: `[Opus | Max] │ my-project git:(main*)` + - Line 2: `Context █████░░░░░ 45% │ Usage ██░░░░░░░░ 25% (1h 30m / 5h)` +- Model bracket moved to project line (line 1) +- Context and usage bars combined onto a single line with `│` separator +- Shortened labels: "Context Window" → "Context", "Usage Limits" → "Usage" +- Consistent `dim()` styling on both labels +- All optional features hidden by default: tools, agents, todos, duration, config counts +- Bedrock provider detection (#111) +- Output speed display (#110) +- Token context display option (#108) +- Seven-day usage threshold config (#107) + +### Added +- Setup onboarding now offers optional features (tools, agents & todos, session info) before finishing +- `display.showSpeed` config option for output token speed + +### Fixed +- Show API failure reason in usage display (#109) +- Support task todo updates in transcript parsing (#106) +- Keep HUD to one line in compact mode (#105) +- Use Platform context instead of uname for setup detection (#95) --- diff --git a/CLAUDE.md b/CLAUDE.md index 346fdfb..31980bc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -73,27 +73,31 @@ src/ ├── types.ts # TypeScript interfaces └── render/ ├── index.ts # Main render coordinator - ├── session-line.ts # Line 1: model, context, project, git, usage - ├── tools-line.ts # Line 2: tool activity - ├── agents-line.ts # Line 3: agent status - ├── todos-line.ts # Line 4: todo progress - └── colors.ts # ANSI color helpers + ├── session-line.ts # Compact mode: single line with all info + ├── tools-line.ts # Tool activity (opt-in) + ├── agents-line.ts # Agent status (opt-in) + ├── todos-line.ts # Todo progress (opt-in) + ├── colors.ts # ANSI color helpers + └── lines/ + ├── index.ts # Barrel export + ├── project.ts # Line 1: model bracket + project + git + ├── identity.ts # Line 2a: context bar + ├── usage.ts # Line 2b: usage bar (combined with identity) + └── environment.ts # Config counts (opt-in) ``` -### Output Format +### Output Format (default expanded layout) ``` -[Opus | Pro] █████░░░░░ 45% | my-project git:(main) | 2 CLAUDE.md | 5h: 25% | ⏱️ 5m -◐ Edit: auth.ts | ✓ Read ×3 | ✓ Grep ×2 -◐ explore [haiku]: Finding auth code (2m 15s) -▸ Fix authentication bug (2/5) +[Opus | Max] │ my-project git:(main*) +Context █████░░░░░ 45% │ Usage ██░░░░░░░░ 25% (1h 30m / 5h) ``` -Lines are conditionally shown: -- Line 1 (session): Always shown -- Line 2 (tools): Shown if any tools used -- Line 3 (agents): Shown only if agents active -- Line 4 (todos): Shown only if todos exist +Lines 1-2 always shown. Additional lines are opt-in via config: +- Tools line (`showTools`): ◐ Edit: auth.ts | ✓ Read ×3 +- Agents line (`showAgents`): ◐ explore [haiku]: Finding auth code +- Todos line (`showTodos`): ▸ Fix authentication bug (2/5) +- Environment line (`showConfigCounts`): 2 CLAUDE.md | 4 rules ### Context Thresholds diff --git a/README.md b/README.md index 1086177..33dc84a 100644 --- a/README.md +++ b/README.md @@ -60,44 +60,22 @@ Claude HUD gives you better insights into what's happening in your Claude Code s | **Agent tracking** | See which subagents are running and what they're doing | | **Todo progress** | Track task completion in real-time | -## What Each Line Shows +## What You See -The HUD is rendered as a single statusline; the sections below are shown inline, separated by `|`. +### Default (2 lines) +``` +[Opus | Max] │ my-project git:(main*) +Context █████░░░░░ 45% │ Usage ██░░░░░░░░ 25% (1h 30m / 5h) +``` +- **Line 1** — Model, plan name (or `Bedrock`), project path, git branch +- **Line 2** — Context bar (green → yellow → red) and usage rate limits -### Session Info +### Optional lines (enable via `/claude-hud:configure`) ``` -[Opus | Pro] █████░░░░░ 45% | my-project git:(main) | 2 CLAUDE.md | 5h: 25% | ⏱️ 5m +◐ Edit: auth.ts | ✓ Read ×3 | ✓ Grep ×2 ← Tools activity +◐ explore [haiku]: Finding auth code (2m 15s) ← Agent status +▸ Fix authentication bug (2/5) ← Todo progress ``` -- **Model** — Current model in use (shown first) -- **Plan name** — Your subscription tier (Pro, Max, Team) when usage enabled, or `Bedrock` when using AWS Bedrock models -- **Context bar** — Visual meter with color coding (green → yellow → red as it fills), with percent or tokens based on config -- **Project path** — Configurable 1-3 directory levels (default: 1) -- **Git branch** — Current branch name (configurable on/off) -- **Config counts** — CLAUDE.md files, rules, MCPs, and hooks loaded -- **Usage limits** — 5-hour rate limit percentage (opt-in, Pro/Max/Team only; hidden for Bedrock) -- **Duration** — How long the session has been running - -### Tool Activity -``` -✓ TaskOutput ×2 | ✓ mcp_context7 ×1 | ✓ Glob ×1 | ✓ Skill ×1 -``` -- **Running tools** show a spinner with the target file -- **Completed tools** aggregate by type with counts - -### Agent Status -``` -✓ Explore: Explore home directory structure (5s) -✓ open-source-librarian: Research React hooks patterns (2s) -``` -- **Agent type** and what it's working on -- **Elapsed time** for each agent - -### Todo Progress -``` -✓ All todos complete (5/5) -``` -- **Current task** or completion status -- **Progress counter** (completed/total) --- @@ -149,7 +127,7 @@ You can also edit the config file directly at `~/.claude/plugins/claude-hud/conf | Option | Type | Default | Description | |--------|------|---------|-------------| -| `layout` | string | `default` | Layout style: `default` or `separators` | +| `lineLayout` | string | `expanded` | Layout: `expanded` (multi-line) or `compact` (single line) | | `pathLevels` | 1-3 | 1 | Directory levels to show in project path | | `gitStatus.enabled` | boolean | true | Show git branch in HUD | | `gitStatus.showDirty` | boolean | true | Show `*` for uncommitted changes | @@ -157,29 +135,29 @@ You can also edit the config file directly at `~/.claude/plugins/claude-hud/conf | `gitStatus.showFileStats` | boolean | false | Show file change counts `!M +A ✘D ?U` | | `display.showModel` | boolean | true | Show model name `[Opus]` | | `display.showContextBar` | boolean | true | Show visual context bar `████░░░░░░` | -| `display.contextValue` | `percent` \| `tokens` | `percent` | Context usage display format (`45%` or `45k/200k`) | -| `display.showConfigCounts` | boolean | true | Show CLAUDE.md, rules, MCPs, hooks counts | -| `display.showDuration` | boolean | true | Show session duration `⏱️ 5m` | +| `display.contextValue` | `percent` \| `tokens` | `percent` | Context display format (`45%` or `45k/200k`) | +| `display.showConfigCounts` | boolean | false | Show CLAUDE.md, rules, MCPs, hooks counts | +| `display.showDuration` | boolean | false | Show session duration `⏱️ 5m` | | `display.showSpeed` | boolean | false | Show output token speed `out: 42.1 tok/s` | | `display.showUsage` | boolean | true | Show usage limits (Pro/Max/Team only) | -| `display.usageBarEnabled` | boolean | true | Display usage as visual bar (`██░░ 25%`) instead of text (`5h: 25%`) | +| `display.usageBarEnabled` | boolean | true | Display usage as visual bar instead of text | | `display.sevenDayThreshold` | 0-100 | 80 | Show 7-day usage when >= threshold (0 = always) | | `display.showTokenBreakdown` | boolean | true | Show token details at high context (85%+) | -| `display.showTools` | boolean | true | Show tools activity line | -| `display.showAgents` | boolean | true | Show agents activity line | -| `display.showTodos` | boolean | true | Show todos progress line | +| `display.showTools` | boolean | false | Show tools activity line | +| `display.showAgents` | boolean | false | Show agents activity line | +| `display.showTodos` | boolean | false | Show todos progress line | ### Usage Limits (Pro/Max/Team) -Usage display is **enabled by default** for Claude Pro, Max, and Team subscribers. It shows your rate limit consumption directly in the HUD. +Usage display is **enabled by default** for Claude Pro, Max, and Team subscribers. It shows your rate limit consumption on line 2 alongside the context bar. -When enabled, you'll see your 5-hour usage percentage. The 7-day percentage appears when above the `display.sevenDayThreshold` (default 80%): +The 7-day percentage appears when above the `display.sevenDayThreshold` (default 80%): ``` -[Opus | Pro] █████░░░░░ 45% | my-project | 5h: 25% | 7d: 85% +Context █████░░░░░ 45% │ Usage ██░░░░░░░░ 25% (1h 30m / 5h) | ██████████ 85% (2d / 7d) ``` -To disable usage display, set `display.showUsage` to `false` in your config. +To disable, set `display.showUsage` to `false`. **Requirements:** - Claude Pro, Max, or Team subscription (not available for API users) @@ -191,23 +169,11 @@ To disable usage display, set `display.showUsage` to `false` in your config. - API users see no usage display (they have pay-per-token, not rate limits) - AWS Bedrock models display `Bedrock` and hide usage limits (usage is managed in AWS) -### Layout Options - -**Default layout** — Single-line HUD: -``` -[Opus] ████░░░░░░ 42% | my-project git:(main) | 2 rules | ⏱️ 5m | ✓ Read ×3 | ✓ Edit ×1 -``` - -**Separators layout** — Inline separator before activity: -``` -[Opus] ████░░░░░░ 42% | my-project git:(main) | 2 rules | ⏱️ 5m | --- | ✓ Read ×3 | ✓ Edit ×1 -``` - ### Example Configuration ```json { - "layout": "default", + "lineLayout": "expanded", "pathLevels": 2, "gitStatus": { "enabled": true, @@ -216,43 +182,36 @@ To disable usage display, set `display.showUsage` to `false` in your config. "showFileStats": true }, "display": { - "showModel": true, - "showContextBar": true, - "showConfigCounts": true, - "showDuration": true, - "showUsage": true, - "usageBarEnabled": true, - "showTokenBreakdown": true, "showTools": true, "showAgents": true, - "showTodos": true + "showTodos": true, + "showConfigCounts": true, + "showDuration": true } } ``` ### Display Examples -**1 level (default):** `[Opus] 45% | my-project git:(main) | ...` +**1 level (default):** `[Opus] │ my-project git:(main)` -**2 levels:** `[Opus] 45% | apps/my-project git:(main) | ...` +**2 levels:** `[Opus] │ apps/my-project git:(main)` -**3 levels:** `[Opus] 45% | dev/apps/my-project git:(main) | ...` +**3 levels:** `[Opus] │ dev/apps/my-project git:(main)` -**With dirty indicator:** `[Opus] 45% | my-project git:(main*) | ...` +**With dirty indicator:** `[Opus] │ my-project git:(main*)` -**With ahead/behind:** `[Opus] 45% | my-project git:(main ↑2 ↓1) | ...` +**With ahead/behind:** `[Opus] │ my-project git:(main ↑2 ↓1)` -**With file stats:** `[Opus] 45% | my-project git:(main* !3 +1 ?2) | ...` +**With file stats:** `[Opus] │ my-project git:(main* !3 +1 ?2)` - `!` = modified files, `+` = added/staged, `✘` = deleted, `?` = untracked - Counts of 0 are omitted for cleaner display -**Minimal display (only context %):** Configure `showModel`, `showContextBar`, `showConfigCounts`, `showDuration` to `false` - ### Troubleshooting **Config not applying?** - Check for JSON syntax errors: invalid JSON silently falls back to defaults -- Ensure valid values: `pathLevels` must be 1, 2, or 3; `layout` must be `default` or `separators` +- Ensure valid values: `pathLevels` must be 1, 2, or 3; `lineLayout` must be `expanded` or `compact` - Delete config and run `/claude-hud:configure` to regenerate **Git status missing?** @@ -260,8 +219,8 @@ To disable usage display, set `display.showUsage` to `false` in your config. - Check `gitStatus.enabled` is not `false` in config **Tool/agent/todo lines missing?** -- These only appear when there's activity to show -- Check `display.showTools`, `display.showAgents`, `display.showTodos` in config +- These are hidden by default — enable with `showTools`, `showAgents`, `showTodos` in config +- They also only appear when there's activity to show --- diff --git a/commands/configure.md b/commands/configure.md index 6bcd7d6..602c791 100644 --- a/commands/configure.md +++ b/commands/configure.md @@ -139,10 +139,10 @@ Info items (Counts, Tokens, Usage, Speed, Duration) can be turned off via "Reset - Info: Counts OFF, Tokens OFF, Usage OFF, Duration ON - Git: ON (with dirty indicator) -**Minimal** (core only): +**Minimal** (core only — this is the default): - Activity: Tools OFF, Agents OFF, Todos OFF - Info: Counts OFF, Tokens OFF, Usage OFF, Duration OFF -- Git: OFF +- Git: ON (with dirty indicator) --- @@ -236,17 +236,15 @@ Changes: 2. **Preview of HUD (Expanded layout):** ``` -[Opus | Pro] ████░░░░░ 45% | ⏱️ 5m -my-project git:(main*) -2 CLAUDE.md | 4 rules | 3 MCPs -5h: 25% (1h 30m) +[Opus | Pro] │ my-project git:(main*) +Context ████░░░░░ 45% │ Usage ██░░░░░░░░ 25% (1h 30m / 5h) ◐ Edit: file.ts | ✓ Read ×3 ▸ Fix auth bug (2/5) ``` **Preview of HUD (Compact layout):** ``` -[Opus | Pro] ████░░░░░ 45% | my-project git:(main*) | 2 CLAUDE.md | 5h: 25% | ⏱️ 5m +[Opus | Pro] ████░░░░░ 45% | my-project git:(main*) | 5h: 25% | ⏱️ 5m ◐ Edit: file.ts | ✓ Read ×3 ▸ Fix auth bug (2/5) ``` diff --git a/commands/setup.md b/commands/setup.md index 8c52f22..e1d505a 100644 --- a/commands/setup.md +++ b/commands/setup.md @@ -185,11 +185,38 @@ If a write fails with `File has been unexpectedly modified`, re-read the file an **Note**: The generated command dynamically finds and runs the latest installed plugin version. Updates are automatic - no need to re-run setup after plugin updates. If the HUD suddenly stops working, re-run `/claude-hud:setup` to verify the plugin is still installed. -## Step 4: Verify With User +## Step 4: Optional Features + +After the statusLine is applied, ask the user if they'd like to enable additional HUD features beyond the default 2-line display. Use AskUserQuestion: -- Question: "The HUD should now appear below your input field. Is it working?" -- Options: "Yes, I see it" / "No, something's wrong" +- header: "Extras" +- question: "Enable any optional HUD features? (all hidden by default)" +- multiSelect: true +- options: + - "Tools activity" — Shows running/completed tools (◐ Edit: file.ts | ✓ Read ×3) + - "Agents & Todos" — Shows subagent status and todo progress + - "Session info" — Shows session duration and config counts (CLAUDE.md, rules, MCPs) + +**If user selects any options**, write `~/.claude/plugins/claude-hud/config.json` (create directories if needed): + +| Selection | Config keys | +|-----------|------------| +| Tools activity | `display.showTools: true` | +| Agents & Todos | `display.showAgents: true, display.showTodos: true` | +| Session info | `display.showDuration: true, display.showConfigCounts: true` | + +Merge with existing config if the file already exists. Only write keys the user selected — don't write `false` for unselected items (defaults handle that). + +**If user selects nothing** (or picks "Other" and says skip/none), do not create a config file. The defaults are fine. + +--- + +## Step 5: Verify & Finish + +Use AskUserQuestion: +- Question: "Setup complete! The HUD should appear below your input field. Is it working?" +- Options: "Yes, it's working" / "No, something's wrong" **If yes**: Ask the user if they'd like to ⭐ star the claude-hud repository on GitHub to support the project. If they agree and `gh` CLI is available, run: `gh api -X PUT /user/starred/jarrodwatts/claude-hud`. Only run the star command if they explicitly say yes. diff --git a/dist/config.js b/dist/config.js index ff8c630..107d554 100644 --- a/dist/config.js +++ b/dist/config.js @@ -15,15 +15,15 @@ export const DEFAULT_CONFIG = { showModel: true, showContextBar: true, contextValue: 'percent', - showConfigCounts: true, - showDuration: true, + showConfigCounts: false, + showDuration: false, showSpeed: false, showTokenBreakdown: true, showUsage: true, usageBarEnabled: true, - showTools: true, - showAgents: true, - showTodos: true, + showTools: false, + showAgents: false, + showTodos: false, autocompactBuffer: 'enabled', usageThreshold: 0, sevenDayThreshold: 80, diff --git a/dist/config.js.map b/dist/config.js.map index 0287271..8c79616 100644 --- a/dist/config.js.map +++ b/dist/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/render/index.d.ts.map b/dist/render/index.d.ts.map index 1626085..bf9ba77 100644 --- a/dist/render/index.d.ts.map +++ b/dist/render/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA+IjD,wBAAgB,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAuC/C"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAyFjD,wBAAgB,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAuB/C"} \ No newline at end of file diff --git a/dist/render/index.js b/dist/render/index.js index b57a659..1a3e989 100644 --- a/dist/render/index.js +++ b/dist/render/index.js @@ -11,51 +11,8 @@ function stripAnsi(str) { function visualLength(str) { return stripAnsi(str).length; } -function getTerminalWidth() { - const columns = process.stdout.columns; - if (typeof columns === 'number' && Number.isFinite(columns) && columns > 0) { - return columns; - } - const envColumns = Number.parseInt(process.env.COLUMNS ?? '', 10); - if (Number.isFinite(envColumns) && envColumns > 0) { - return envColumns; - } - return null; -} -function truncateLine(line, maxWidth) { - if (maxWidth <= 0) - return ''; - if (maxWidth <= 3) - return '.'.repeat(maxWidth); - if (visualLength(line) <= maxWidth) - return line; - const limit = Math.max(0, maxWidth - 3); - let visible = 0; - let result = ''; - const ansiPattern = /\x1b\[[0-9;]*m/g; - let lastIndex = 0; - let match; - while ((match = ansiPattern.exec(line)) !== null) { - const chunk = line.slice(lastIndex, match.index); - for (const char of chunk) { - if (visible >= limit) { - return result + '...'; - } - result += char; - visible += 1; - } - result += match[0]; - lastIndex = ansiPattern.lastIndex; - } - const remaining = line.slice(lastIndex); - for (const char of remaining) { - if (visible >= limit) { - return result + '...'; - } - result += char; - visible += 1; - } - return result + '...'; +function makeSeparator(length) { + return dim('─'.repeat(Math.max(length, 20))); } function collectActivityLines(ctx) { const activityLines = []; @@ -90,63 +47,40 @@ function renderCompact(ctx) { } function renderExpanded(ctx) { const lines = []; - const identityLine = renderIdentityLine(ctx); - if (identityLine) { - lines.push(identityLine); - } const projectLine = renderProjectLine(ctx); if (projectLine) { lines.push(projectLine); } + const identityLine = renderIdentityLine(ctx); + const usageLine = renderUsageLine(ctx); + if (identityLine && usageLine) { + lines.push(`${identityLine} \u2502 ${usageLine}`); + } + else if (identityLine) { + lines.push(identityLine); + } const environmentLine = renderEnvironmentLine(ctx); if (environmentLine) { lines.push(environmentLine); } - // Only show separate usage line when usageBarEnabled is false - // When true, usage is rendered inline with identity line - const usageBarEnabled = ctx.config?.display?.usageBarEnabled ?? true; - if (!usageBarEnabled) { - const usageLine = renderUsageLine(ctx); - if (usageLine) { - lines.push(usageLine); - } - } return lines; } export function render(ctx) { const lineLayout = ctx.config?.lineLayout ?? 'expanded'; const showSeparators = ctx.config?.showSeparators ?? false; - const headerLines = lineLayout === 'expanded' ? renderExpanded(ctx) : renderCompact(ctx); + const headerLines = lineLayout === 'expanded' + ? renderExpanded(ctx) + : renderCompact(ctx); const activityLines = collectActivityLines(ctx); - const headerSegments = []; - for (const line of headerLines) { - if (!line) - continue; - const split = line.split('\n').filter((part) => part.length > 0); - headerSegments.push(...split); + const lines = [...headerLines]; + if (showSeparators && activityLines.length > 0) { + const maxWidth = Math.max(...headerLines.map(visualLength), 20); + lines.push(makeSeparator(maxWidth)); } - const activitySegments = []; - for (const line of activityLines) { - if (!line) - continue; - const split = line.split('\n').filter((part) => part.length > 0); - activitySegments.push(...split); + lines.push(...activityLines); + for (const line of lines) { + const outputLine = `${RESET}${line.replace(/ /g, '\u00A0')}`; + console.log(outputLine); } - const segments = [...headerSegments]; - if (showSeparators && headerSegments.length > 0 && activitySegments.length > 0) { - segments.push(dim('---')); - } - segments.push(...activitySegments); - if (segments.length === 0) { - return; - } - // Keep HUD to a single terminal line to avoid focusable rows in the UI. - let line = segments.join(' | '); - const maxWidth = getTerminalWidth(); - if (maxWidth) { - line = truncateLine(line, maxWidth); - } - const outputLine = `${RESET}${line}${RESET}`.replace(/ /g, '\u00A0'); - console.log(outputLine); } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/render/index.js.map b/dist/render/index.js.map index 19cb535..0b6e297 100644 --- a/dist/render/index.js.map +++ b/dist/render/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,SAAS,CAAC,GAAW;IAC5B,4CAA4C;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAkB;IAC9C,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAEpC,IAAI,OAAO,EAAE,SAAS,KAAK,KAAK,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,SAAS,EAAE,CAAC;YACd,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,SAAS,KAAK,KAAK,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,SAAS,EAAE,CAAC;YACd,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,aAAa,CAAC,GAAkB;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAAkB;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,WAAW,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAkB;IACvC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,UAAU,CAAC;IACxD,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,IAAI,KAAK,CAAC;IAE3D,MAAM,WAAW,GAAG,UAAU,KAAK,UAAU;QAC3C,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAEvB,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAa,CAAC,GAAG,WAAW,CAAC,CAAC;IAEzC,IAAI,cAAc,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"} \ No newline at end of file diff --git a/dist/render/lines/identity.d.ts.map b/dist/render/lines/identity.d.ts.map index 32c394f..3f177f3 100644 --- a/dist/render/lines/identity.d.ts.map +++ b/dist/render/lines/identity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/render/lines/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQpD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAkE7D"} \ No newline at end of file +{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/render/lines/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CA6B7D"} \ No newline at end of file diff --git a/dist/render/lines/identity.js b/dist/render/lines/identity.js index dcf7249..c7d8380 100644 --- a/dist/render/lines/identity.js +++ b/dist/render/lines/identity.js @@ -1,10 +1,7 @@ -import { isLimitReached } from '../../types.js'; -import { getContextPercent, getBufferedPercent, getModelName, getProviderLabel, getTotalTokens } from '../../stdin.js'; -import { getOutputSpeed } from '../../speed-tracker.js'; -import { coloredBar, cyan, dim, red, yellow, getContextColor, quotaBar, RESET } from '../colors.js'; +import { getContextPercent, getBufferedPercent, getTotalTokens } from '../../stdin.js'; +import { coloredBar, dim, getContextColor, RESET } from '../colors.js'; const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*'; export function renderIdentityLine(ctx) { - const model = getModelName(ctx.stdin); const rawPercent = getContextPercent(ctx.stdin); const bufferedPercent = getBufferedPercent(ctx.stdin); const autocompactMode = ctx.config?.display?.autocompactBuffer ?? 'enabled'; @@ -12,46 +9,13 @@ export function renderIdentityLine(ctx) { if (DEBUG && autocompactMode === 'disabled') { console.error(`[claude-hud:context] autocompactBuffer=disabled, showing raw ${rawPercent}% (buffered would be ${bufferedPercent}%)`); } - const bar = coloredBar(percent); const display = ctx.config?.display; - const parts = []; const contextValueMode = display?.contextValue ?? 'percent'; const contextValue = formatContextValue(ctx, percent, contextValueMode); const contextValueDisplay = `${getContextColor(percent)}${contextValue}${RESET}`; - const providerLabel = getProviderLabel(ctx.stdin); - const planName = display?.showUsage !== false ? ctx.usageData?.planName : undefined; - const planDisplay = providerLabel ?? planName; - const modelDisplay = planDisplay ? `${model} | ${planDisplay}` : model; - if (display?.showModel !== false && display?.showContextBar !== false) { - parts.push(`${cyan(`[${modelDisplay}]`)} ${bar} ${contextValueDisplay}`); - } - else if (display?.showModel !== false) { - parts.push(`${cyan(`[${modelDisplay}]`)} ${contextValueDisplay}`); - } - else if (display?.showContextBar !== false) { - parts.push(`${bar} ${contextValueDisplay}`); - } - else { - parts.push(contextValueDisplay); - } - // Inline usage bar (only when usageBarEnabled is true in expanded mode) - const usageBarEnabled = display?.usageBarEnabled ?? true; - if (usageBarEnabled && display?.showUsage !== false && ctx.usageData?.planName && !providerLabel) { - const usagePart = renderInlineUsage(ctx); - if (usagePart) { - parts.push(usagePart); - } - } - if (display?.showSpeed) { - const speed = getOutputSpeed(ctx.stdin); - if (speed !== null) { - parts.push(dim(`out: ${speed.toFixed(1)} tok/s`)); - } - } - if (display?.showDuration !== false && ctx.sessionDuration) { - parts.push(dim(`⏱️ ${ctx.sessionDuration}`)); - } - let line = parts.join(' | '); + let line = display?.showContextBar !== false + ? `${dim('Context')} ${coloredBar(percent)} ${contextValueDisplay}` + : `${dim('Context')} ${contextValueDisplay}`; if (display?.showTokenBreakdown !== false && percent >= 85) { const usage = ctx.stdin.context_window?.current_usage; if (usage) { @@ -82,71 +46,4 @@ function formatContextValue(ctx, percent, mode) { } return `${percent}%`; } -function renderInlineUsage(ctx) { - if (!ctx.usageData?.planName) { - return null; - } - if (ctx.usageData.apiUnavailable) { - const errorHint = formatUsageError(ctx.usageData.apiError); - return yellow(`⚠${errorHint}`); - } - if (isLimitReached(ctx.usageData)) { - const resetTime = ctx.usageData.fiveHour === 100 - ? formatResetTime(ctx.usageData.fiveHourResetAt) - : formatResetTime(ctx.usageData.sevenDayResetAt); - return red(`⚠ Limit${resetTime ? ` (${resetTime})` : ''}`); - } - const display = ctx.config?.display; - const threshold = display?.usageThreshold ?? 0; - const fiveHour = ctx.usageData.fiveHour; - const sevenDay = ctx.usageData.sevenDay; - const effectiveUsage = Math.max(fiveHour ?? 0, sevenDay ?? 0); - if (effectiveUsage < threshold) { - return null; - } - const fiveHourDisplay = formatUsagePercent(fiveHour); - const fiveHourReset = formatResetTime(ctx.usageData.fiveHourResetAt); - const fiveHourPart = fiveHourReset - ? `${quotaBar(fiveHour ?? 0)} ${fiveHourDisplay} (${fiveHourReset} / 5h)` - : `${quotaBar(fiveHour ?? 0)} ${fiveHourDisplay}`; - const sevenDayThreshold = display?.sevenDayThreshold ?? 80; - if (sevenDay !== null && sevenDay >= sevenDayThreshold) { - const sevenDayDisplay = formatUsagePercent(sevenDay); - const sevenDayReset = formatResetTime(ctx.usageData.sevenDayResetAt); - const sevenDayPart = sevenDayReset - ? `${quotaBar(sevenDay)} ${sevenDayDisplay} (${sevenDayReset} / 7d)` - : `${quotaBar(sevenDay)} ${sevenDayDisplay}`; - return `${fiveHourPart} | ${sevenDayPart}`; - } - return fiveHourPart; -} -function formatUsagePercent(percent) { - if (percent === null) { - return dim('--'); - } - const color = getContextColor(percent); - return `${color}${percent}%${RESET}`; -} -function formatUsageError(error) { - if (!error) - return ''; - if (error.startsWith('http-')) { - return ` (${error.slice(5)})`; - } - return ` (${error})`; -} -function formatResetTime(resetAt) { - if (!resetAt) - return ''; - const now = new Date(); - const diffMs = resetAt.getTime() - now.getTime(); - if (diffMs <= 0) - return ''; - const diffMins = Math.ceil(diffMs / 60000); - if (diffMins < 60) - return `${diffMins}m`; - const hours = Math.floor(diffMins / 60); - const mins = diffMins % 60; - return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`; -} //# sourceMappingURL=identity.js.map \ No newline at end of file diff --git a/dist/render/lines/identity.js.map b/dist/render/lines/identity.js.map index 82dc90a..3b58078 100644 --- a/dist/render/lines/identity.js.map +++ b/dist/render/lines/identity.js.map @@ -1 +1 @@ -{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/render/lines/identity.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/render/lines/identity.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/render/lines/project.d.ts.map b/dist/render/lines/project.d.ts.map index ea378e3..f00b722 100644 --- a/dist/render/lines/project.d.ts.map +++ b/dist/render/lines/project.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/render/lines/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA6CnE"} \ No newline at end of file +{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/render/lines/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA6DnE"} \ No newline at end of file diff --git a/dist/render/lines/project.js b/dist/render/lines/project.js index a4af82b..38916e5 100644 --- a/dist/render/lines/project.js +++ b/dist/render/lines/project.js @@ -1,44 +1,58 @@ +import { getModelName, getProviderLabel } from '../../stdin.js'; import { cyan, magenta, yellow } from '../colors.js'; export function renderProjectLine(ctx) { - if (!ctx.stdin.cwd) { + const display = ctx.config?.display; + const parts = []; + if (display?.showModel !== false) { + const model = getModelName(ctx.stdin); + const providerLabel = getProviderLabel(ctx.stdin); + const planName = display?.showUsage !== false ? ctx.usageData?.planName : undefined; + const planDisplay = providerLabel ?? planName; + const modelDisplay = planDisplay ? `${model} | ${planDisplay}` : model; + parts.push(cyan(`[${modelDisplay}]`)); + } + if (ctx.stdin.cwd) { + const segments = ctx.stdin.cwd.split(/[/\\]/).filter(Boolean); + const pathLevels = ctx.config?.pathLevels ?? 1; + const projectPath = segments.length > 0 ? segments.slice(-pathLevels).join('/') : '/'; + let gitPart = ''; + const gitConfig = ctx.config?.gitStatus; + const showGit = gitConfig?.enabled ?? true; + if (showGit && ctx.gitStatus) { + const gitParts = [ctx.gitStatus.branch]; + if ((gitConfig?.showDirty ?? true) && ctx.gitStatus.isDirty) { + gitParts.push('*'); + } + if (gitConfig?.showAheadBehind) { + if (ctx.gitStatus.ahead > 0) { + gitParts.push(` ↑${ctx.gitStatus.ahead}`); + } + if (ctx.gitStatus.behind > 0) { + gitParts.push(` ↓${ctx.gitStatus.behind}`); + } + } + if (gitConfig?.showFileStats && ctx.gitStatus.fileStats) { + const { modified, added, deleted, untracked } = ctx.gitStatus.fileStats; + const statParts = []; + if (modified > 0) + statParts.push(`!${modified}`); + if (added > 0) + statParts.push(`+${added}`); + if (deleted > 0) + statParts.push(`✘${deleted}`); + if (untracked > 0) + statParts.push(`?${untracked}`); + if (statParts.length > 0) { + gitParts.push(` ${statParts.join(' ')}`); + } + } + gitPart = ` ${magenta('git:(')}${cyan(gitParts.join(''))}${magenta(')')}`; + } + parts.push(`${yellow(projectPath)}${gitPart}`); + } + if (parts.length === 0) { return null; } - const segments = ctx.stdin.cwd.split(/[/\\]/).filter(Boolean); - const pathLevels = ctx.config?.pathLevels ?? 1; - const projectPath = segments.length > 0 ? segments.slice(-pathLevels).join('/') : '/'; - let gitPart = ''; - const gitConfig = ctx.config?.gitStatus; - const showGit = gitConfig?.enabled ?? true; - if (showGit && ctx.gitStatus) { - const gitParts = [ctx.gitStatus.branch]; - if ((gitConfig?.showDirty ?? true) && ctx.gitStatus.isDirty) { - gitParts.push('*'); - } - if (gitConfig?.showAheadBehind) { - if (ctx.gitStatus.ahead > 0) { - gitParts.push(` ↑${ctx.gitStatus.ahead}`); - } - if (ctx.gitStatus.behind > 0) { - gitParts.push(` ↓${ctx.gitStatus.behind}`); - } - } - if (gitConfig?.showFileStats && ctx.gitStatus.fileStats) { - const { modified, added, deleted, untracked } = ctx.gitStatus.fileStats; - const statParts = []; - if (modified > 0) - statParts.push(`!${modified}`); - if (added > 0) - statParts.push(`+${added}`); - if (deleted > 0) - statParts.push(`✘${deleted}`); - if (untracked > 0) - statParts.push(`?${untracked}`); - if (statParts.length > 0) { - gitParts.push(` ${statParts.join(' ')}`); - } - } - gitPart = ` ${magenta('git:(')}${cyan(gitParts.join(''))}${magenta(')')}`; - } - return `${yellow(projectPath)}${gitPart}`; + return parts.join(' \u2502 '); } //# sourceMappingURL=project.js.map \ No newline at end of file diff --git a/dist/render/lines/project.js.map b/dist/render/lines/project.js.map index bf2ad43..8b538db 100644 --- a/dist/render/lines/project.js.map +++ b/dist/render/lines/project.js.map @@ -1 +1 @@ -{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/render/lines/project.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/render/lines/project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,GAAkB;IAClD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,OAAO,EAAE,SAAS,KAAK,KAAK,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,MAAM,WAAW,GAAG,aAAa,IAAI,QAAQ,CAAC;QAC9C,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAEtF,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;QACxC,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC;QAE3C,IAAI,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAa,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAElD,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,SAAS,EAAE,eAAe,EAAE,CAAC;gBAC/B,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,IAAI,SAAS,EAAE,aAAa,IAAI,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;gBACxE,MAAM,SAAS,GAAa,EAAE,CAAC;gBAC/B,IAAI,QAAQ,GAAG,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;gBACjD,IAAI,KAAK,GAAG,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC3C,IAAI,OAAO,GAAG,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;gBAC/C,IAAI,SAAS,GAAG,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;gBACnD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5E,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC"} \ No newline at end of file diff --git a/dist/render/lines/usage.d.ts.map b/dist/render/lines/usage.d.ts.map index 9a0515e..8fadde9 100644 --- a/dist/render/lines/usage.d.ts.map +++ b/dist/render/lines/usage.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA6DjE"} \ No newline at end of file +{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA+DjE"} \ No newline at end of file diff --git a/dist/render/lines/usage.js b/dist/render/lines/usage.js index 740362a..2499a4c 100644 --- a/dist/render/lines/usage.js +++ b/dist/render/lines/usage.js @@ -12,15 +12,16 @@ export function renderUsageLine(ctx) { if (getProviderLabel(ctx.stdin)) { return null; } + const label = dim('Usage'); if (ctx.usageData.apiUnavailable) { const errorHint = formatUsageError(ctx.usageData.apiError); - return yellow(`usage: ⚠${errorHint}`); + return `${label} ${yellow(`⚠${errorHint}`)}`; } if (isLimitReached(ctx.usageData)) { const resetTime = ctx.usageData.fiveHour === 100 ? formatResetTime(ctx.usageData.fiveHourResetAt) : formatResetTime(ctx.usageData.sevenDayResetAt); - return red(`⚠ Limit reached${resetTime ? ` (resets ${resetTime})` : ''}`); + return `${label} ${red(`⚠ Limit reached${resetTime ? ` (resets ${resetTime})` : ''}`)}`; } const threshold = display?.usageThreshold ?? 0; const fiveHour = ctx.usageData.fiveHour; @@ -48,9 +49,9 @@ export function renderUsageLine(ctx) { ? `${quotaBar(sevenDay)} ${sevenDayDisplay} (${sevenDayReset} / 7d)` : `${quotaBar(sevenDay)} ${sevenDayDisplay}`) : `7d: ${sevenDayDisplay}`; - return `${fiveHourPart} | ${sevenDayPart}`; + return `${label} ${fiveHourPart} | ${sevenDayPart}`; } - return fiveHourPart; + return `${label} ${fiveHourPart}`; } function formatUsagePercent(percent) { if (percent === null) { diff --git a/dist/render/lines/usage.js.map b/dist/render/lines/usage.js.map index 7e6f169..d4a68c6 100644 --- a/dist/render/lines/usage.js.map +++ b/dist/render/lines/usage.js.map @@ -1 +1 @@ -{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 4323654..b4b9dfc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claude-hud", - "version": "0.0.6", + "version": "0.0.7", "description": "Real-time statusline HUD for Claude Code", "type": "module", "main": "dist/index.js", diff --git a/src/config.ts b/src/config.ts index 3017f0f..46f15cc 100644 --- a/src/config.ts +++ b/src/config.ts @@ -51,15 +51,15 @@ export const DEFAULT_CONFIG: HudConfig = { showModel: true, showContextBar: true, contextValue: 'percent', - showConfigCounts: true, - showDuration: true, + showConfigCounts: false, + showDuration: false, showSpeed: false, showTokenBreakdown: true, showUsage: true, usageBarEnabled: true, - showTools: true, - showAgents: true, - showTodos: true, + showTools: false, + showAgents: false, + showTodos: false, autocompactBuffer: 'enabled', usageThreshold: 0, sevenDayThreshold: 80, diff --git a/src/render/index.ts b/src/render/index.ts index d768343..6d473cd 100644 --- a/src/render/index.ts +++ b/src/render/index.ts @@ -20,55 +20,8 @@ function visualLength(str: string): number { return stripAnsi(str).length; } -function getTerminalWidth(): number | null { - const columns = process.stdout.columns; - if (typeof columns === 'number' && Number.isFinite(columns) && columns > 0) { - return columns; - } - - const envColumns = Number.parseInt(process.env.COLUMNS ?? '', 10); - if (Number.isFinite(envColumns) && envColumns > 0) { - return envColumns; - } - - return null; -} - -function truncateLine(line: string, maxWidth: number): string { - if (maxWidth <= 0) return ''; - if (maxWidth <= 3) return '.'.repeat(maxWidth); - if (visualLength(line) <= maxWidth) return line; - - const limit = Math.max(0, maxWidth - 3); - let visible = 0; - let result = ''; - const ansiPattern = /\x1b\[[0-9;]*m/g; - let lastIndex = 0; - let match: RegExpExecArray | null; - - while ((match = ansiPattern.exec(line)) !== null) { - const chunk = line.slice(lastIndex, match.index); - for (const char of chunk) { - if (visible >= limit) { - return result + '...'; - } - result += char; - visible += 1; - } - result += match[0]; - lastIndex = ansiPattern.lastIndex; - } - - const remaining = line.slice(lastIndex); - for (const char of remaining) { - if (visible >= limit) { - return result + '...'; - } - result += char; - visible += 1; - } - - return result + '...'; +function makeSeparator(length: number): string { + return dim('─'.repeat(Math.max(length, 20))); } function collectActivityLines(ctx: RenderContext): string[] { @@ -113,71 +66,48 @@ function renderCompact(ctx: RenderContext): string[] { function renderExpanded(ctx: RenderContext): string[] { const lines: string[] = []; - const identityLine = renderIdentityLine(ctx); - if (identityLine) { - lines.push(identityLine); - } - const projectLine = renderProjectLine(ctx); if (projectLine) { lines.push(projectLine); } + const identityLine = renderIdentityLine(ctx); + const usageLine = renderUsageLine(ctx); + if (identityLine && usageLine) { + lines.push(`${identityLine} \u2502 ${usageLine}`); + } else if (identityLine) { + lines.push(identityLine); + } + const environmentLine = renderEnvironmentLine(ctx); if (environmentLine) { lines.push(environmentLine); } - // Only show separate usage line when usageBarEnabled is false - // When true, usage is rendered inline with identity line - const usageBarEnabled = ctx.config?.display?.usageBarEnabled ?? true; - if (!usageBarEnabled) { - const usageLine = renderUsageLine(ctx); - if (usageLine) { - lines.push(usageLine); - } - } - return lines; } export function render(ctx: RenderContext): void { const lineLayout = ctx.config?.lineLayout ?? 'expanded'; const showSeparators = ctx.config?.showSeparators ?? false; - const headerLines = lineLayout === 'expanded' ? renderExpanded(ctx) : renderCompact(ctx); + + const headerLines = lineLayout === 'expanded' + ? renderExpanded(ctx) + : renderCompact(ctx); + const activityLines = collectActivityLines(ctx); - const headerSegments: string[] = []; - for (const line of headerLines) { - if (!line) continue; - const split = line.split('\n').filter((part) => part.length > 0); - headerSegments.push(...split); + const lines: string[] = [...headerLines]; + + if (showSeparators && activityLines.length > 0) { + const maxWidth = Math.max(...headerLines.map(visualLength), 20); + lines.push(makeSeparator(maxWidth)); } - const activitySegments: string[] = []; - for (const line of activityLines) { - if (!line) continue; - const split = line.split('\n').filter((part) => part.length > 0); - activitySegments.push(...split); - } + lines.push(...activityLines); - const segments: string[] = [...headerSegments]; - if (showSeparators && headerSegments.length > 0 && activitySegments.length > 0) { - segments.push(dim('---')); + for (const line of lines) { + const outputLine = `${RESET}${line.replace(/ /g, '\u00A0')}`; + console.log(outputLine); } - segments.push(...activitySegments); - - if (segments.length === 0) { - return; - } - - // Keep HUD to a single terminal line to avoid focusable rows in the UI. - let line = segments.join(' | '); - const maxWidth = getTerminalWidth(); - if (maxWidth) { - line = truncateLine(line, maxWidth); - } - - const outputLine = `${RESET}${line}${RESET}`.replace(/ /g, '\u00A0'); - console.log(outputLine); } diff --git a/src/render/lines/identity.ts b/src/render/lines/identity.ts index 795118a..e5cd177 100644 --- a/src/render/lines/identity.ts +++ b/src/render/lines/identity.ts @@ -1,14 +1,10 @@ import type { RenderContext } from '../../types.js'; -import { isLimitReached } from '../../types.js'; -import { getContextPercent, getBufferedPercent, getModelName, getProviderLabel, getTotalTokens } from '../../stdin.js'; -import { getOutputSpeed } from '../../speed-tracker.js'; -import { coloredBar, cyan, dim, red, yellow, getContextColor, quotaBar, RESET } from '../colors.js'; +import { getContextPercent, getBufferedPercent, getTotalTokens } from '../../stdin.js'; +import { coloredBar, dim, getContextColor, RESET } from '../colors.js'; const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*'; export function renderIdentityLine(ctx: RenderContext): string { - const model = getModelName(ctx.stdin); - const rawPercent = getContextPercent(ctx.stdin); const bufferedPercent = getBufferedPercent(ctx.stdin); const autocompactMode = ctx.config?.display?.autocompactBuffer ?? 'enabled'; @@ -18,49 +14,14 @@ export function renderIdentityLine(ctx: RenderContext): string { console.error(`[claude-hud:context] autocompactBuffer=disabled, showing raw ${rawPercent}% (buffered would be ${bufferedPercent}%)`); } - const bar = coloredBar(percent); const display = ctx.config?.display; - const parts: string[] = []; const contextValueMode = display?.contextValue ?? 'percent'; const contextValue = formatContextValue(ctx, percent, contextValueMode); const contextValueDisplay = `${getContextColor(percent)}${contextValue}${RESET}`; - const providerLabel = getProviderLabel(ctx.stdin); - const planName = display?.showUsage !== false ? ctx.usageData?.planName : undefined; - const planDisplay = providerLabel ?? planName; - const modelDisplay = planDisplay ? `${model} | ${planDisplay}` : model; - - if (display?.showModel !== false && display?.showContextBar !== false) { - parts.push(`${cyan(`[${modelDisplay}]`)} ${bar} ${contextValueDisplay}`); - } else if (display?.showModel !== false) { - parts.push(`${cyan(`[${modelDisplay}]`)} ${contextValueDisplay}`); - } else if (display?.showContextBar !== false) { - parts.push(`${bar} ${contextValueDisplay}`); - } else { - parts.push(contextValueDisplay); - } - - // Inline usage bar (only when usageBarEnabled is true in expanded mode) - const usageBarEnabled = display?.usageBarEnabled ?? true; - if (usageBarEnabled && display?.showUsage !== false && ctx.usageData?.planName && !providerLabel) { - const usagePart = renderInlineUsage(ctx); - if (usagePart) { - parts.push(usagePart); - } - } - - if (display?.showSpeed) { - const speed = getOutputSpeed(ctx.stdin); - if (speed !== null) { - parts.push(dim(`out: ${speed.toFixed(1)} tok/s`)); - } - } - - if (display?.showDuration !== false && ctx.sessionDuration) { - parts.push(dim(`⏱️ ${ctx.sessionDuration}`)); - } - - let line = parts.join(' | '); + let line = display?.showContextBar !== false + ? `${dim('Context')} ${coloredBar(percent)} ${contextValueDisplay}` + : `${dim('Context')} ${contextValueDisplay}`; if (display?.showTokenBreakdown !== false && percent >= 85) { const usage = ctx.stdin.context_window?.current_usage; @@ -96,79 +57,3 @@ function formatContextValue(ctx: RenderContext, percent: number, mode: 'percent' return `${percent}%`; } - -function renderInlineUsage(ctx: RenderContext): string | null { - if (!ctx.usageData?.planName) { - return null; - } - - if (ctx.usageData.apiUnavailable) { - const errorHint = formatUsageError(ctx.usageData.apiError); - return yellow(`⚠${errorHint}`); - } - - if (isLimitReached(ctx.usageData)) { - const resetTime = ctx.usageData.fiveHour === 100 - ? formatResetTime(ctx.usageData.fiveHourResetAt) - : formatResetTime(ctx.usageData.sevenDayResetAt); - return red(`⚠ Limit${resetTime ? ` (${resetTime})` : ''}`); - } - - const display = ctx.config?.display; - const threshold = display?.usageThreshold ?? 0; - const fiveHour = ctx.usageData.fiveHour; - const sevenDay = ctx.usageData.sevenDay; - - const effectiveUsage = Math.max(fiveHour ?? 0, sevenDay ?? 0); - if (effectiveUsage < threshold) { - return null; - } - - const fiveHourDisplay = formatUsagePercent(fiveHour); - const fiveHourReset = formatResetTime(ctx.usageData.fiveHourResetAt); - const fiveHourPart = fiveHourReset - ? `${quotaBar(fiveHour ?? 0)} ${fiveHourDisplay} (${fiveHourReset} / 5h)` - : `${quotaBar(fiveHour ?? 0)} ${fiveHourDisplay}`; - - const sevenDayThreshold = display?.sevenDayThreshold ?? 80; - if (sevenDay !== null && sevenDay >= sevenDayThreshold) { - const sevenDayDisplay = formatUsagePercent(sevenDay); - const sevenDayReset = formatResetTime(ctx.usageData.sevenDayResetAt); - const sevenDayPart = sevenDayReset - ? `${quotaBar(sevenDay)} ${sevenDayDisplay} (${sevenDayReset} / 7d)` - : `${quotaBar(sevenDay)} ${sevenDayDisplay}`; - return `${fiveHourPart} | ${sevenDayPart}`; - } - - return fiveHourPart; -} - -function formatUsagePercent(percent: number | null): string { - if (percent === null) { - return dim('--'); - } - const color = getContextColor(percent); - return `${color}${percent}%${RESET}`; -} - -function formatUsageError(error?: string): string { - if (!error) return ''; - if (error.startsWith('http-')) { - return ` (${error.slice(5)})`; - } - return ` (${error})`; -} - -function formatResetTime(resetAt: Date | null): string { - if (!resetAt) return ''; - const now = new Date(); - const diffMs = resetAt.getTime() - now.getTime(); - if (diffMs <= 0) return ''; - - const diffMins = Math.ceil(diffMs / 60000); - if (diffMins < 60) return `${diffMins}m`; - - const hours = Math.floor(diffMins / 60); - const mins = diffMins % 60; - return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`; -} diff --git a/src/render/lines/project.ts b/src/render/lines/project.ts index 2d52704..0b16aa8 100644 --- a/src/render/lines/project.ts +++ b/src/render/lines/project.ts @@ -1,49 +1,66 @@ import type { RenderContext } from '../../types.js'; +import { getModelName, getProviderLabel } from '../../stdin.js'; import { cyan, magenta, yellow } from '../colors.js'; export function renderProjectLine(ctx: RenderContext): string | null { - if (!ctx.stdin.cwd) { + const display = ctx.config?.display; + const parts: string[] = []; + + if (display?.showModel !== false) { + const model = getModelName(ctx.stdin); + const providerLabel = getProviderLabel(ctx.stdin); + const planName = display?.showUsage !== false ? ctx.usageData?.planName : undefined; + const planDisplay = providerLabel ?? planName; + const modelDisplay = planDisplay ? `${model} | ${planDisplay}` : model; + parts.push(cyan(`[${modelDisplay}]`)); + } + + if (ctx.stdin.cwd) { + const segments = ctx.stdin.cwd.split(/[/\\]/).filter(Boolean); + const pathLevels = ctx.config?.pathLevels ?? 1; + const projectPath = segments.length > 0 ? segments.slice(-pathLevels).join('/') : '/'; + + let gitPart = ''; + const gitConfig = ctx.config?.gitStatus; + const showGit = gitConfig?.enabled ?? true; + + if (showGit && ctx.gitStatus) { + const gitParts: string[] = [ctx.gitStatus.branch]; + + if ((gitConfig?.showDirty ?? true) && ctx.gitStatus.isDirty) { + gitParts.push('*'); + } + + if (gitConfig?.showAheadBehind) { + if (ctx.gitStatus.ahead > 0) { + gitParts.push(` ↑${ctx.gitStatus.ahead}`); + } + if (ctx.gitStatus.behind > 0) { + gitParts.push(` ↓${ctx.gitStatus.behind}`); + } + } + + if (gitConfig?.showFileStats && ctx.gitStatus.fileStats) { + const { modified, added, deleted, untracked } = ctx.gitStatus.fileStats; + const statParts: string[] = []; + if (modified > 0) statParts.push(`!${modified}`); + if (added > 0) statParts.push(`+${added}`); + if (deleted > 0) statParts.push(`✘${deleted}`); + if (untracked > 0) statParts.push(`?${untracked}`); + if (statParts.length > 0) { + gitParts.push(` ${statParts.join(' ')}`); + } + } + + gitPart = ` ${magenta('git:(')}${cyan(gitParts.join(''))}${magenta(')')}`; + } + + parts.push(`${yellow(projectPath)}${gitPart}`); + } + + if (parts.length === 0) { return null; } - const segments = ctx.stdin.cwd.split(/[/\\]/).filter(Boolean); - const pathLevels = ctx.config?.pathLevels ?? 1; - const projectPath = segments.length > 0 ? segments.slice(-pathLevels).join('/') : '/'; - - let gitPart = ''; - const gitConfig = ctx.config?.gitStatus; - const showGit = gitConfig?.enabled ?? true; - - if (showGit && ctx.gitStatus) { - const gitParts: string[] = [ctx.gitStatus.branch]; - - if ((gitConfig?.showDirty ?? true) && ctx.gitStatus.isDirty) { - gitParts.push('*'); - } - - if (gitConfig?.showAheadBehind) { - if (ctx.gitStatus.ahead > 0) { - gitParts.push(` ↑${ctx.gitStatus.ahead}`); - } - if (ctx.gitStatus.behind > 0) { - gitParts.push(` ↓${ctx.gitStatus.behind}`); - } - } - - if (gitConfig?.showFileStats && ctx.gitStatus.fileStats) { - const { modified, added, deleted, untracked } = ctx.gitStatus.fileStats; - const statParts: string[] = []; - if (modified > 0) statParts.push(`!${modified}`); - if (added > 0) statParts.push(`+${added}`); - if (deleted > 0) statParts.push(`✘${deleted}`); - if (untracked > 0) statParts.push(`?${untracked}`); - if (statParts.length > 0) { - gitParts.push(` ${statParts.join(' ')}`); - } - } - - gitPart = ` ${magenta('git:(')}${cyan(gitParts.join(''))}${magenta(')')}`; - } - - return `${yellow(projectPath)}${gitPart}`; + return parts.join(' \u2502 '); } diff --git a/src/render/lines/usage.ts b/src/render/lines/usage.ts index 08ea7e5..3311e48 100644 --- a/src/render/lines/usage.ts +++ b/src/render/lines/usage.ts @@ -18,16 +18,18 @@ export function renderUsageLine(ctx: RenderContext): string | null { return null; } + const label = dim('Usage'); + if (ctx.usageData.apiUnavailable) { const errorHint = formatUsageError(ctx.usageData.apiError); - return yellow(`usage: ⚠${errorHint}`); + return `${label} ${yellow(`⚠${errorHint}`)}`; } if (isLimitReached(ctx.usageData)) { const resetTime = ctx.usageData.fiveHour === 100 ? formatResetTime(ctx.usageData.fiveHourResetAt) : formatResetTime(ctx.usageData.sevenDayResetAt); - return red(`⚠ Limit reached${resetTime ? ` (resets ${resetTime})` : ''}`); + return `${label} ${red(`⚠ Limit reached${resetTime ? ` (resets ${resetTime})` : ''}`)}`; } const threshold = display?.usageThreshold ?? 0; @@ -60,10 +62,10 @@ export function renderUsageLine(ctx: RenderContext): string | null { ? `${quotaBar(sevenDay)} ${sevenDayDisplay} (${sevenDayReset} / 7d)` : `${quotaBar(sevenDay)} ${sevenDayDisplay}`) : `7d: ${sevenDayDisplay}`; - return `${fiveHourPart} | ${sevenDayPart}`; + return `${label} ${fiveHourPart} | ${sevenDayPart}`; } - return fiveHourPart; + return `${label} ${fiveHourPart}`; } function formatUsagePercent(percent: number | null): string { diff --git a/tests/fixtures/expected/render-basic.txt b/tests/fixtures/expected/render-basic.txt index bc088af..20f3c73 100644 --- a/tests/fixtures/expected/render-basic.txt +++ b/tests/fixtures/expected/render-basic.txt @@ -1 +1,2 @@ -[Opus] █████░░░░░ 45% | my-project | ◐ Edit: .../authentication.ts | ✓ Read ×1 | ✓ explore [haiku]: Finding auth code (<1s) | ▸ Add tests (1/2) +[Opus] │ my-project +Context █████░░░░░ 45% diff --git a/tests/render.test.js b/tests/render.test.js index 0f9d010..becba43 100644 --- a/tests/render.test.js +++ b/tests/render.test.js @@ -580,8 +580,8 @@ test('render adds separator line when showSeparators is true and activity exists console.log = originalLog; } - assert.equal(logs.length, 1, 'should render a single line'); - assert.ok(logs.some(l => l.includes('---')), 'should include separator marker'); + assert.ok(logs.length > 1, 'should render multiple lines'); + assert.ok(logs.some(l => l.includes('─')), 'should include separator line'); }); test('render omits separator when showSeparators is true but no activity', () => { @@ -597,8 +597,7 @@ test('render omits separator when showSeparators is true but no activity', () => console.log = originalLog; } - assert.equal(logs.length, 1, 'should render a single line'); - assert.ok(!logs.some(l => l.includes('---')), 'should not include separator'); + assert.ok(!logs.some(l => l.includes('─')), 'should not include separator'); }); // fileStats tests