Files
claude-hud/tests/index.test.js

169 lines
5.7 KiB
JavaScript
Raw Normal View History

2026-01-03 18:52:12 +11:00
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { formatSessionDuration, main } from '../dist/index.js';
test('formatSessionDuration returns empty string without session start', () => {
assert.equal(formatSessionDuration(undefined, () => 0), '');
});
test('formatSessionDuration formats sub-minute and minute durations', () => {
const start = new Date(0);
assert.equal(formatSessionDuration(start, () => 30 * 1000), '<1m');
assert.equal(formatSessionDuration(start, () => 5 * 60 * 1000), '5m');
});
test('formatSessionDuration formats hour durations', () => {
const start = new Date(0);
assert.equal(formatSessionDuration(start, () => 2 * 60 * 60 * 1000 + 5 * 60 * 1000), '2h 5m');
});
test('formatSessionDuration uses Date.now by default', () => {
const originalNow = Date.now;
Date.now = () => 60000;
try {
const result = formatSessionDuration(new Date(0));
assert.equal(result, '1m');
} finally {
Date.now = originalNow;
}
});
test('main logs an error when dependencies throw', async () => {
const logs = [];
await main({
readStdin: async () => {
throw new Error('boom');
},
parseTranscript: async () => ({ tools: [], agents: [], todos: [] }),
countConfigs: async () => ({ claudeMdCount: 0, rulesCount: 0, mcpCount: 0, hooksCount: 0 }),
getGitBranch: async () => null,
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
getUsage: async () => null,
2026-01-03 18:52:12 +11:00
render: () => {},
now: () => Date.now(),
log: (...args) => logs.push(args.join(' ')),
});
assert.ok(logs.some((line) => line.includes('[claude-hud] Error:')));
});
test('main logs unknown error for non-Error throws', async () => {
const logs = [];
await main({
readStdin: async () => {
throw 'boom';
},
parseTranscript: async () => ({ tools: [], agents: [], todos: [] }),
countConfigs: async () => ({ claudeMdCount: 0, rulesCount: 0, mcpCount: 0, hooksCount: 0 }),
getGitBranch: async () => null,
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
getUsage: async () => null,
2026-01-03 18:52:12 +11:00
render: () => {},
now: () => Date.now(),
log: (...args) => logs.push(args.join(' ')),
});
assert.ok(logs.some((line) => line.includes('Unknown error')));
});
test('index entrypoint runs when executed directly', async () => {
const originalArgv = [...process.argv];
const originalIsTTY = process.stdin.isTTY;
const originalLog = console.log;
const logs = [];
try {
const moduleUrl = new URL('../dist/index.js', import.meta.url);
process.argv[1] = new URL(moduleUrl).pathname;
Object.defineProperty(process.stdin, 'isTTY', { value: true, configurable: true });
console.log = (...args) => logs.push(args.join(' '));
await import(`${moduleUrl}?entry=${Date.now()}`);
} finally {
console.log = originalLog;
process.argv = originalArgv;
Object.defineProperty(process.stdin, 'isTTY', { value: originalIsTTY, configurable: true });
}
assert.ok(logs.some((line) => line.includes('[claude-hud] Initializing...')));
});
test('main executes the happy path with default dependencies', async () => {
const originalNow = Date.now;
Date.now = () => 60000;
let renderedContext;
try {
await main({
readStdin: async () => ({
model: { display_name: 'Opus' },
context_window: { context_window_size: 100, current_usage: { input_tokens: 90 } },
}),
parseTranscript: async () => ({ tools: [], agents: [], todos: [], sessionStart: new Date(0) }),
countConfigs: async () => ({ claudeMdCount: 0, rulesCount: 0, mcpCount: 0, hooksCount: 0 }),
getGitBranch: async () => null,
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
getUsage: async () => null,
2026-01-03 18:52:12 +11:00
render: (ctx) => {
renderedContext = ctx;
},
});
} finally {
Date.now = originalNow;
}
assert.equal(renderedContext?.sessionDuration, '1m');
});
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
test('main includes git status in render context', async () => {
let renderedContext;
await main({
readStdin: async () => ({
model: { display_name: 'Opus' },
context_window: { context_window_size: 100, current_usage: { input_tokens: 10 } },
cwd: '/some/path',
}),
parseTranscript: async () => ({ tools: [], agents: [], todos: [] }),
countConfigs: async () => ({ claudeMdCount: 0, rulesCount: 0, mcpCount: 0, hooksCount: 0 }),
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
getGitStatus: async () => ({ branch: 'feature/test', isDirty: false, ahead: 0, behind: 0 }),
getUsage: async () => null,
loadConfig: async () => ({
feat(layout): add expanded multi-line layout mode (#76) * feat(layout): add expanded multi-line layout mode Split the overloaded session line into semantic lines for better readability: - Identity line: model, plan, context bar, duration - Project line: path, git status - Environment line: config counts (CLAUDE.md, rules, MCPs, hooks) - Usage line: rate limits with reset times New config options: - `lineLayout`: 'compact' | 'expanded' (default: expanded for new users) - `showSeparators`: boolean (orthogonal to layout) - `usageThreshold`: show usage line only when >= N% - `environmentThreshold`: show env line only when counts >= N Backward compatible: old `layout` config is automatically migrated. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address code review feedback - Fix usage threshold to use max(5h, 7d) so high 7d usage isn't hidden when 5h is null - Update stale comment in session-line.ts (now compact layout only) - Remove non-null assertions in identity.ts by hoisting planName Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: apply thresholds to compact layout for consistency - Add environmentThreshold gating to config counts in compact mode - Add usageThreshold with max(5h, 7d) logic to usage in compact mode - Remove non-null assertion for planName (same fix as identity.ts) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: update tests for new lineLayout config schema - Update config.test.js to validate lineLayout instead of layout - Update render.test.js to use lineLayout and showSeparators - Update index.test.js mock config with new schema - Update integration test expected output for expanded default Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-14 12:17:36 +11:00
lineLayout: 'compact',
showSeparators: false,
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
pathLevels: 1,
feat(layout): add expanded multi-line layout mode (#76) * feat(layout): add expanded multi-line layout mode Split the overloaded session line into semantic lines for better readability: - Identity line: model, plan, context bar, duration - Project line: path, git status - Environment line: config counts (CLAUDE.md, rules, MCPs, hooks) - Usage line: rate limits with reset times New config options: - `lineLayout`: 'compact' | 'expanded' (default: expanded for new users) - `showSeparators`: boolean (orthogonal to layout) - `usageThreshold`: show usage line only when >= N% - `environmentThreshold`: show env line only when counts >= N Backward compatible: old `layout` config is automatically migrated. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address code review feedback - Fix usage threshold to use max(5h, 7d) so high 7d usage isn't hidden when 5h is null - Update stale comment in session-line.ts (now compact layout only) - Remove non-null assertions in identity.ts by hoisting planName Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: apply thresholds to compact layout for consistency - Add environmentThreshold gating to config counts in compact mode - Add usageThreshold with max(5h, 7d) logic to usage in compact mode - Remove non-null assertion for planName (same fix as identity.ts) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: update tests for new lineLayout config schema - Update config.test.js to validate lineLayout instead of layout - Update render.test.js to use lineLayout and showSeparators - Update index.test.js mock config with new schema - Update integration test expected output for expanded default Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-14 12:17:36 +11:00
gitStatus: { enabled: true, showDirty: true, showAheadBehind: false, showFileStats: false },
display: { showModel: true, showContextBar: true, contextValue: 'percent', showConfigCounts: true, showDuration: true, showSpeed: false, showTokenBreakdown: true, showUsage: true, showTools: true, showAgents: true, showTodos: true, autocompactBuffer: 'enabled', usageThreshold: 0, sevenDayThreshold: 80, environmentThreshold: 0 },
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
}),
render: (ctx) => {
renderedContext = ctx;
},
});
assert.equal(renderedContext?.gitStatus?.branch, 'feature/test');
});
test('main includes usageData in render context', async () => {
let renderedContext;
const mockUsageData = {
planName: 'Max',
fiveHour: 50,
sevenDay: 25,
fiveHourResetAt: null,
sevenDayResetAt: null,
limitReached: false,
};
await main({
readStdin: async () => ({
model: { display_name: 'Opus' },
context_window: { context_window_size: 100, current_usage: { input_tokens: 10 } },
}),
parseTranscript: async () => ({ tools: [], agents: [], todos: [] }),
countConfigs: async () => ({ claudeMdCount: 0, rulesCount: 0, mcpCount: 0, hooksCount: 0 }),
getGitBranch: async () => null,
getUsage: async () => mockUsageData,
render: (ctx) => {
renderedContext = ctx;
},
});
feat: config system + usage API + bug fixes (supersedes #32) (#35) * feat: display last 3 path segments first in session line Shows the last 3 segments of the working directory path at the beginning of the session line for quick project identification. Before: [Opus 4.5] ████░░░░░░ 19% | my-project git:(main) | ... After: dev/apps/my-project git:(main) | [Opus 4.5] ████░░░░░░ 19% | ... This helps distinguish between projects with similar names in different locations and puts the most relevant info first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: configurable path levels (1-3) and git status toggle - Add config system at ~/.claude/plugins/claude-hud/config.json - Default path display to 1 level (was hardcoded at 3) - Add pathLevels option: 1, 2, or 3 directory segments - Add gitStatus.enabled toggle to show/hide git branch - Add interactive CLI: npx claude-hud-configure - Add comprehensive tests for config and path levels - Update README with configuration documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: handle cross-platform path separators - Split paths by both / and \ for Windows compatibility - Always output forward slashes for consistent display - Add tests for Windows paths, UNC paths, and mixed separators 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show existing config when reconfiguring - Display current values when config file exists - Prompt user that Enter keeps current values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: interactive CLI with arrow-key selection - Add @inquirer/prompts for better UX - Arrow keys to select path levels - Visual feedback with checkmarks - Cleaner, more compact output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add dirty indicator and ahead/behind git status - Add gitStatus.showDirty option (default: true) - Add gitStatus.showAheadBehind option (default: false) - Update getGitStatus to return isDirty, ahead, behind - Update CLI to configure new options with preview - Add tests for dirty and ahead/behind display - Update README with new options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable display options for all HUD elements - Add display configuration object with 8 boolean options: - showModel: Toggle model name display [Opus] - showContextBar: Toggle visual context bar ████░░░░░░ - showConfigCounts: Toggle CLAUDE.md, rules, MCPs, hooks counts - showDuration: Toggle session duration display - showTokenBreakdown: Toggle token details at high context (85%+) - showTools: Toggle tools activity line - showAgents: Toggle agents activity line - showTodos: Toggle todos progress line - All options default to true for backward compatibility - Enhanced CLI preview with colors matching actual HUD output - Added 5 new tests for display configuration (87 total) - Updated README with complete configuration reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add configurable layout options (default, condensed, separators) - Add layout config option with three styles: - default: All info on first line (original behavior) - condensed: Model/context top, project bottom - separators: Condensed with visual separator lines - Create project-line.ts for rendering project path in split layouts - Add renderSessionLineMinimal for condensed/separators layouts - Interactive CLI preview shows selected layout style - All 87 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add interactive HUD preview and folder icon - Add live preview that updates as config options are selected - Show initial preview on startup based on existing/default config - Add folder icon (📁) in front of project path - Extract preview generation to separate module for reuse 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README with folder icon and live preview - Add folder icon (📁) to all path examples - Document live preview feature in interactive CLI section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add menu-based navigation to configure CLI - Replace linear flow with main menu loop - Show current values in menu (layout, path levels, git status, etc.) - Users can edit any section and return to menu - Preview updates after each section change - Save & Exit or Exit without saving options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update tests for folder icon and config structure - Update integration test expected output with folder icon - Make config test environment-independent (validates structure, not specific values) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive config loading tests Add 23 new tests for config system validation: - DEFAULT_CONFIG structure (layout, gitStatus, 8 display options) - Layout validation (default, condensed, separators) - PathLevels validation (1, 2, or 3) - Git status configuration defaults - Display configuration (booleans, defaults to true, count) - loadConfig behavior (complete fields, valid values) - getConfigPath structure tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add usage API, config enhancements, and bug fixes This PR combines and enhances the config system from PR #32 with new features and bug fixes addressing the owner's review feedback. ## New Features - Usage API integration showing 5h/7d limits for Pro/Max/Team users - Interactive `/claude-hud:configure` skill for in-Claude-Code configuration - Hybrid showUsage toggle (env var + config for privacy control) ## Bug Fixes (addressing #32 review feedback) - Fix git status spacing: `main*↑2↓1` → `main* ↑2 ↓1` - Fix root path rendering: show `/` instead of empty folder icon - Fix Windows path normalization in truncatePath - Fix duplicate dependencies key in package.json - Fix multiSelect for mutually exclusive options in configure skill ## Credits - Config system, layouts, path levels, git toggle, CLI by @Tsopic (PR #32) - Usage API, configure skill, bug fixes by @melon-hub 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Co-Authored-By: Tsopic <Tsopic@users.noreply.github.com> * fix: move configure command to correct location - Move configure.md from .claude-plugin/skills/ to commands/ - Remove skills array from plugin.json (commands are auto-discovered) Commands must be in the commands/ directory at plugin root, not inside .claude-plugin/. This matches the existing setup.md pattern. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: layout order, remove condensed, redesign configure flow Render fixes (per PR feedback): - Fix element order: model first, project second - Remove condensed layout (only default/separators remain) - Separators: single line below header only when activity exists - Delete project-line.ts (no longer needed) - Remove renderSessionLineMinimal() function Configure skill redesign: - Context-aware tab order (returning users start on Turn Off) - Explicit Turn Off/Turn On questions (no toggle ambiguity) - Git Style question for dirty/ahead-behind options - Combined Layout/Reset tab for returning users - Duration now toggleable - Guards against empty submissions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: rename 'Returning User' to 'Update Config' in configure flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: fix tests for new element order and removed function - Update render-basic.txt expected output (model first, project second) - Remove renderSessionLineMinimal import and test (function was deleted) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update documentation for usage API, config flow, and troubleshooting - Remove stale CLAUDE_HUD_SHOW_USAGE env var references (now config-based) - Add usage API data sources to CLAUDE.md - Add new source files to file structure (config.ts, git.ts, usage-api.ts) - Update README with usage limits section and requirements - Add troubleshooting sections for config, git, and usage issues - Standardize output examples across all documentation files - Remove condensed layout references (only default/separators now) - Update configure skill reference (npx CLI → /claude-hud:configure) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove dist/ from PR and update outdated comment - Reset dist/ to main branch (dist will be built by CI after merge) - Update comment: "requires env var opt-in AND config" → "shown when enabled in config" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove internal design doc from release 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove CLI and runtime dependency - Remove src/bin/configure.ts and src/bin/preview.ts - Remove @inquirer/prompts dependency (plugins don't run npm install) - Remove bin field from package.json - Users configure via /claude-hud:configure skill instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 0.0.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use file-based cache for usage API HUD runs as a new process every ~300ms, so in-memory cache was useless. Now caches to ~/.claude/plugins/claude-hud/.usage-cache.json. This reduces API calls from ~10,800/hour to max 60/hour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use consistent homeDir/now in getUsage Avoids potential divergence if deps functions are non-deterministic. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add real tests for usage API file cache - Test credential parsing with mock HOME directory - Test cache TTL behavior (success and failure) - Test apiUnavailable flag handling - Replace placeholder assert.ok(true) with actual assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Martin Kask <martin@industrial.ninja> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: melon-hub <melon-hub@users.noreply.github.com> Co-authored-by: Tsopic <Tsopic@users.noreply.github.com> Co-authored-by: Jarrod Watts <jarrod@cubelabs.xyz>
2026-01-07 16:00:32 +11:00
assert.deepEqual(renderedContext?.usageData, mockUsageData);
});