@owloops/claude-powerline 1.1.13 → 1.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -100,6 +100,13 @@ npx -y @owloops/claude-powerline --install-fonts
100
100
  > [!NOTE]
101
101
  > Using `npx` automatically downloads and runs the latest version, ensuring you always have the newest features and fixes without manual updates.
102
102
 
103
+ **Start a Claude session:** It appears at the bottom during conversations.
104
+
105
+ ![Claude Code with powerline](images/claude-interface-with-powerline.png)
106
+
107
+ > [!TIP]
108
+ > The statusline shows your **current directory name** (not "claude powerline") and updates with live usage data during Claude conversations.
109
+
103
110
  ## Usage
104
111
 
105
112
  ```bash
package/dist/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  // src/index.ts
4
4
  import process2 from "process";
5
- import path2 from "path";
6
- import fs2 from "fs";
5
+ import path3 from "path";
6
+ import fs3 from "fs";
7
7
  import { execSync as execSync3 } from "child_process";
8
8
  import os2 from "os";
9
9
  import { json } from "stream/consumers";
@@ -231,8 +231,26 @@ var UsageProvider = class {
231
231
 
232
232
  // src/lib/git-service.ts
233
233
  import { execSync } from "child_process";
234
+ import fs from "fs";
235
+ import path from "path";
234
236
  var GitService = class {
237
+ isGitRepo(workingDir) {
238
+ try {
239
+ return fs.existsSync(path.join(workingDir, ".git"));
240
+ } catch {
241
+ return false;
242
+ }
243
+ }
235
244
  getGitInfo(workingDir, showSha = false) {
245
+ if (!this.isGitRepo(workingDir)) {
246
+ return {
247
+ branch: "detached",
248
+ status: "clean",
249
+ ahead: 0,
250
+ behind: 0,
251
+ sha: void 0
252
+ };
253
+ }
236
254
  try {
237
255
  const branch = this.getBranch(workingDir);
238
256
  const status = this.getStatus(workingDir);
@@ -749,8 +767,8 @@ var PowerlineRenderer = class {
749
767
  };
750
768
 
751
769
  // src/config/loader.ts
752
- import fs from "fs";
753
- import path from "path";
770
+ import fs2 from "fs";
771
+ import path2 from "path";
754
772
  import os from "os";
755
773
 
756
774
  // src/config/defaults.ts
@@ -814,19 +832,19 @@ function deepMerge(target, source) {
814
832
  }
815
833
  function findConfigFile(customPath, projectDir) {
816
834
  if (customPath) {
817
- return fs.existsSync(customPath) ? customPath : null;
835
+ return fs2.existsSync(customPath) ? customPath : null;
818
836
  }
819
837
  const locations = [
820
- ...projectDir ? [path.join(projectDir, ".claude-powerline.json")] : [],
821
- path.join(process.cwd(), ".claude-powerline.json"),
822
- path.join(os.homedir(), ".claude", "claude-powerline.json"),
823
- path.join(os.homedir(), ".config", "claude-powerline", "config.json")
838
+ ...projectDir ? [path2.join(projectDir, ".claude-powerline.json")] : [],
839
+ path2.join(process.cwd(), ".claude-powerline.json"),
840
+ path2.join(os.homedir(), ".claude", "claude-powerline.json"),
841
+ path2.join(os.homedir(), ".config", "claude-powerline", "config.json")
824
842
  ];
825
- return locations.find(fs.existsSync) || null;
843
+ return locations.find(fs2.existsSync) || null;
826
844
  }
827
845
  function loadConfigFile(filePath) {
828
846
  try {
829
- const content = fs.readFileSync(filePath, "utf-8");
847
+ const content = fs2.readFileSync(filePath, "utf-8");
830
848
  return JSON.parse(content);
831
849
  } catch (error) {
832
850
  throw new Error(
@@ -855,23 +873,9 @@ function loadEnvConfig() {
855
873
  }
856
874
  if (process.env.CLAUDE_POWERLINE_USAGE_TYPE) {
857
875
  const usageType = process.env.CLAUDE_POWERLINE_USAGE_TYPE;
858
- if (!config.display) {
859
- config.display = { lines: [] };
876
+ if (["cost", "tokens", "both", "breakdown"].includes(usageType)) {
877
+ config.usageType = usageType;
860
878
  }
861
- if (config.display.lines.length === 0) {
862
- config.display.lines = [{ segments: {} }];
863
- }
864
- config.display.lines.forEach((line) => {
865
- if (line.segments.session) {
866
- line.segments.session.type = usageType;
867
- }
868
- if (line.segments.today) {
869
- line.segments.today.type = usageType;
870
- }
871
- if (line.segments.block) {
872
- line.segments.block.type = usageType === "breakdown" || usageType === "both" ? "cost" : usageType;
873
- }
874
- });
875
879
  }
876
880
  return config;
877
881
  }
@@ -940,23 +944,7 @@ function parseCLIOverrides(args) {
940
944
  if (usageIndex !== -1) {
941
945
  const usageType = args[usageIndex]?.split("=")[1];
942
946
  if (usageType && ["cost", "tokens", "both", "breakdown"].includes(usageType)) {
943
- if (!config.display) {
944
- config.display = { lines: [] };
945
- }
946
- if (config.display.lines.length === 0) {
947
- config.display.lines = [{ segments: {} }];
948
- }
949
- config.display.lines.forEach((line) => {
950
- if (line.segments.session) {
951
- line.segments.session.type = usageType;
952
- }
953
- if (line.segments.today) {
954
- line.segments.today.type = usageType;
955
- }
956
- if (line.segments.block) {
957
- line.segments.block.type = usageType === "breakdown" || usageType === "both" ? "cost" : usageType;
958
- }
959
- });
947
+ config.usageType = usageType;
960
948
  }
961
949
  }
962
950
  return config;
@@ -991,6 +979,20 @@ function loadConfig(options = {}) {
991
979
  config = deepMerge(config, envConfig);
992
980
  }
993
981
  config = deepMerge(config, cliOverrides);
982
+ if (config.usageType) {
983
+ config.display.lines.forEach((line) => {
984
+ if (line.segments.session) {
985
+ line.segments.session.type = config.usageType;
986
+ }
987
+ if (line.segments.today) {
988
+ line.segments.today.type = config.usageType;
989
+ }
990
+ if (line.segments.block) {
991
+ line.segments.block.type = config.usageType === "breakdown" || config.usageType === "both" ? "cost" : config.usageType;
992
+ }
993
+ });
994
+ delete config.usageType;
995
+ }
994
996
  return config;
995
997
  }
996
998
  function loadConfigFromCLI(args = process.argv, projectDir) {
@@ -1006,11 +1008,11 @@ async function installFonts() {
1006
1008
  const platform = os2.platform();
1007
1009
  let fontDir;
1008
1010
  if (platform === "darwin") {
1009
- fontDir = path2.join(os2.homedir(), "Library", "Fonts");
1011
+ fontDir = path3.join(os2.homedir(), "Library", "Fonts");
1010
1012
  } else if (platform === "linux") {
1011
- fontDir = path2.join(os2.homedir(), ".local", "share", "fonts");
1013
+ fontDir = path3.join(os2.homedir(), ".local", "share", "fonts");
1012
1014
  } else if (platform === "win32") {
1013
- fontDir = path2.join(
1015
+ fontDir = path3.join(
1014
1016
  os2.homedir(),
1015
1017
  "AppData",
1016
1018
  "Local",
@@ -1022,15 +1024,15 @@ async function installFonts() {
1022
1024
  console.log("Unsupported platform for font installation");
1023
1025
  return;
1024
1026
  }
1025
- if (!fs2.existsSync(fontDir)) {
1026
- fs2.mkdirSync(fontDir, { recursive: true });
1027
+ if (!fs3.existsSync(fontDir)) {
1028
+ fs3.mkdirSync(fontDir, { recursive: true });
1027
1029
  }
1028
1030
  console.log("\u{1F4E6} Installing Powerline Fonts...");
1029
1031
  console.log("Downloading from https://github.com/powerline/fonts");
1030
- const tempDir = path2.join(os2.tmpdir(), "powerline-fonts");
1032
+ const tempDir = path3.join(os2.tmpdir(), "powerline-fonts");
1031
1033
  try {
1032
- if (fs2.existsSync(tempDir)) {
1033
- fs2.rmSync(tempDir, { recursive: true, force: true });
1034
+ if (fs3.existsSync(tempDir)) {
1035
+ fs3.rmSync(tempDir, { recursive: true, force: true });
1034
1036
  }
1035
1037
  console.log("Cloning powerline fonts repository...");
1036
1038
  execSync3(
@@ -1041,9 +1043,9 @@ async function installFonts() {
1041
1043
  }
1042
1044
  );
1043
1045
  console.log("Installing fonts...");
1044
- const installScript = path2.join(tempDir, "install.sh");
1045
- if (fs2.existsSync(installScript)) {
1046
- fs2.chmodSync(installScript, 493);
1046
+ const installScript = path3.join(tempDir, "install.sh");
1047
+ if (fs3.existsSync(installScript)) {
1048
+ fs3.chmodSync(installScript, 493);
1047
1049
  execSync3("./install.sh", { stdio: "inherit", cwd: tempDir });
1048
1050
  } else {
1049
1051
  throw new Error(
@@ -1058,8 +1060,8 @@ async function installFonts() {
1058
1060
  "Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline"
1059
1061
  );
1060
1062
  } finally {
1061
- if (fs2.existsSync(tempDir)) {
1062
- fs2.rmSync(tempDir, { recursive: true, force: true });
1063
+ if (fs3.existsSync(tempDir)) {
1064
+ fs3.rmSync(tempDir, { recursive: true, force: true });
1063
1065
  }
1064
1066
  }
1065
1067
  } catch (error) {
@@ -1086,15 +1088,17 @@ claude-powerline - Beautiful powerline statusline for Claude Code
1086
1088
 
1087
1089
  Usage: claude-powerline [options]
1088
1090
 
1089
- Options:
1091
+ Standalone Commands:
1092
+ --install-fonts Install powerline fonts to system
1093
+ -h, --help Show this help
1094
+
1095
+ Claude Code Options (for settings.json):
1090
1096
  --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom
1091
1097
  --style=STYLE Set separator style: minimal, powerline
1092
1098
  --usage=TYPE Usage display: cost, tokens, both, breakdown
1093
1099
  --session-budget=AMOUNT Set session budget for percentage tracking
1094
1100
  --daily-budget=AMOUNT Set daily budget for percentage tracking
1095
1101
  --config=PATH Use custom config file path
1096
- --install-fonts Install powerline fonts to system
1097
- -h, --help Show this help
1098
1102
 
1099
1103
  Configuration:
1100
1104
  Config files are loaded in this order (highest priority first):
@@ -1118,6 +1122,26 @@ Usage in Claude Code settings.json:
1118
1122
  `);
1119
1123
  process2.exit(0);
1120
1124
  }
1125
+ if (process2.stdin.isTTY === true) {
1126
+ console.error(`Error: This tool requires input from Claude Code
1127
+
1128
+ claude-powerline is designed to be used as a Claude Code statusLine command.
1129
+ It reads hook data from stdin and outputs formatted statusline.
1130
+
1131
+ Add to ~/.claude/settings.json:
1132
+ {
1133
+ "statusLine": {
1134
+ "type": "command",
1135
+ "command": "claude-powerline --style=powerline"
1136
+ }
1137
+ }
1138
+
1139
+ Run with --help for more options.
1140
+
1141
+ To test output manually:
1142
+ echo '{"workspace":{"project_dir":"/path/to/project"},"session":{"id":"test","model":"claude"}}' | claude-powerline --style=powerline`);
1143
+ process2.exit(1);
1144
+ }
1121
1145
  const hookData = await json(process2.stdin);
1122
1146
  if (!hookData) {
1123
1147
  console.error("Error: No input provided");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/colors.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/nord.ts","../src/themes/tokyo-night.ts","../src/themes/rose-pine.ts","../src/themes/index.ts","../src/lib/usage-provider.ts","../src/lib/git-service.ts","../src/lib/tmux-service.ts","../src/lib/formatters.ts","../src/lib/budget.ts","../src/lib/segment-renderer.ts","../src/powerline.ts","../src/config/loader.ts","../src/config/defaults.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport os from \"node:os\";\nimport { json } from \"node:stream/consumers\";\nimport { PowerlineRenderer } from \"./powerline\";\nimport { loadConfigFromCLI } from \"./config/loader\";\nimport type { ClaudeHookData } from \"./types\";\n\nasync function installFonts(): Promise<void> {\n try {\n const platform = os.platform();\n let fontDir: string;\n\n if (platform === \"darwin\") {\n fontDir = path.join(os.homedir(), \"Library\", \"Fonts\");\n } else if (platform === \"linux\") {\n fontDir = path.join(os.homedir(), \".local\", \"share\", \"fonts\");\n } else if (platform === \"win32\") {\n fontDir = path.join(\n os.homedir(),\n \"AppData\",\n \"Local\",\n \"Microsoft\",\n \"Windows\",\n \"Fonts\"\n );\n } else {\n console.log(\"Unsupported platform for font installation\");\n return;\n }\n\n if (!fs.existsSync(fontDir)) {\n fs.mkdirSync(fontDir, { recursive: true });\n }\n\n console.log(\"📦 Installing Powerline Fonts...\");\n console.log(\"Downloading from https://github.com/powerline/fonts\");\n\n const tempDir = path.join(os.tmpdir(), \"powerline-fonts\");\n\n try {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n\n console.log(\"Cloning powerline fonts repository...\");\n execSync(\n \"git clone --depth=1 https://github.com/powerline/fonts.git powerline-fonts\",\n {\n stdio: \"inherit\",\n cwd: os.tmpdir(),\n }\n );\n\n console.log(\"Installing fonts...\");\n const installScript = path.join(tempDir, \"install.sh\");\n\n if (fs.existsSync(installScript)) {\n fs.chmodSync(installScript, 0o755);\n execSync(\"./install.sh\", { stdio: \"inherit\", cwd: tempDir });\n } else {\n throw new Error(\n \"Install script not found in powerline fonts repository\"\n );\n }\n\n console.log(\"✅ Powerline fonts installation complete!\");\n console.log(\n \"Please restart your terminal and set your terminal font to a powerline font.\"\n );\n console.log(\n \"Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline\"\n );\n } finally {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n }\n } catch (error) {\n console.error(\n \"Error installing fonts:\",\n error instanceof Error ? error.message : String(error)\n );\n console.log(\n \"💡 You can manually install fonts from: https://github.com/powerline/fonts\"\n );\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const showHelp =\n process.argv.includes(\"--help\") || process.argv.includes(\"-h\");\n const installFontsFlag = process.argv.includes(\"--install-fonts\");\n\n if (installFontsFlag) {\n await installFonts();\n process.exit(0);\n }\n\n if (showHelp) {\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nOptions:\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nConfiguration:\n Config files are loaded in this order (highest priority first):\n 1. CLI arguments (--theme, --style, --usage, --config)\n 2. Environment variables (CLAUDE_POWERLINE_THEME, CLAUDE_POWERLINE_STYLE, CLAUDE_POWERLINE_USAGE_TYPE, CLAUDE_POWERLINE_CONFIG)\n 3. ./.claude-powerline.json (project)\n 4. ~/.claude/claude-powerline.json (user)\n 5. ~/.config/claude-powerline/config.json (XDG)\n\nCreating a config file:\n Copy example from: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n\nUsage in Claude Code settings.json:\n{\n \"statusLine\": {\n \"type\": \"command\",\n \"command\": \"claude-powerline\",\n \"padding\": 0\n }\n}\n`);\n process.exit(0);\n }\n\n const hookData = (await json(process.stdin)) as ClaudeHookData;\n if (!hookData) {\n console.error(\"Error: No input provided\");\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nOptions:\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nSee example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n`);\n process.exit(1);\n }\n\n const projectDir = hookData.workspace?.project_dir;\n const config = loadConfigFromCLI(process.argv, projectDir);\n const renderer = new PowerlineRenderer(config);\n const statusline = await renderer.generateStatusline(hookData);\n\n console.log(statusline);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"Error generating statusline:\", errorMessage);\n process.exit(1);\n }\n}\n\nmain();\n","export function hexToAnsi(hex: string, isBackground: boolean): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `\\x1b[${isBackground ? \"48\" : \"38\"};2;${r};${g};${b}m`;\n}\n\nexport function extractBgToFg(ansiCode: string): string {\n const match = ansiCode.match(/48;2;(\\d+);(\\d+);(\\d+)/);\n if (match) {\n return `\\x1b[38;2;${match[1]};${match[2]};${match[3]}m`;\n }\n return ansiCode.replace(\"48\", \"38\");\n}\n","import type { ColorTheme } from \"../types/config\";\n\nexport const darkTheme: ColorTheme = {\n directory: { bg: \"#8b4513\", fg: \"#ffffff\" },\n git: { bg: \"#404040\", fg: \"#ffffff\" },\n model: { bg: \"#2d2d2d\", fg: \"#ffffff\" },\n session: { bg: \"#202020\", fg: \"#00ffff\" },\n today: { bg: \"#a0520d\", fg: \"#ffffff\" },\n block: { bg: \"#8b4500\", fg: \"#ffffff\" },\n tmux: { bg: \"#2f4f2f\", fg: \"#90ee90\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const lightTheme: ColorTheme = {\n directory: { bg: \"#ff6b47\", fg: \"#ffffff\" },\n git: { bg: \"#4fb3d9\", fg: \"#ffffff\" },\n model: { bg: \"#87ceeb\", fg: \"#000000\" },\n session: { bg: \"#da70d6\", fg: \"#ffffff\" },\n today: { bg: \"#90ee90\", fg: \"#ffffff\" },\n block: { bg: \"#ff8c00\", fg: \"#ffffff\" },\n tmux: { bg: \"#32cd32\", fg: \"#ffffff\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const nordTheme: ColorTheme = {\n directory: { bg: \"#434c5e\", fg: \"#d8dee9\" },\n git: { bg: \"#3b4252\", fg: \"#a3be8c\" },\n model: { bg: \"#4c566a\", fg: \"#81a1c1\" },\n session: { bg: \"#2e3440\", fg: \"#88c0d0\" },\n today: { bg: \"#434c5e\", fg: \"#ebcb8b\" },\n block: { bg: \"#3b4252\", fg: \"#bf616a\" },\n tmux: { bg: \"#2e3440\", fg: \"#8fbcbb\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const tokyoNightTheme: ColorTheme = {\n directory: { bg: \"#2f334d\", fg: \"#82aaff\" },\n git: { bg: \"#1e2030\", fg: \"#c3e88d\" },\n model: { bg: \"#191b29\", fg: \"#fca7ea\" },\n session: { bg: \"#222436\", fg: \"#86e1fc\" },\n today: { bg: \"#2f334d\", fg: \"#ffc777\" },\n block: { bg: \"#1e2030\", fg: \"#ff966c\" },\n tmux: { bg: \"#191b29\", fg: \"#4fd6be\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const rosePineTheme: ColorTheme = {\n directory: { bg: \"#26233a\", fg: \"#c4a7e7\" },\n git: { bg: \"#1f1d2e\", fg: \"#9ccfd8\" },\n model: { bg: \"#191724\", fg: \"#ebbcba\" },\n session: { bg: \"#26233a\", fg: \"#f6c177\" },\n today: { bg: \"#1f1d2e\", fg: \"#eb6f92\" },\n block: { bg: \"#191724\", fg: \"#31748f\" },\n tmux: { bg: \"#26233a\", fg: \"#908caa\" },\n};\n","import type { ColorTheme } from \"../types/config\";\nimport { darkTheme } from \"./dark\";\nimport { lightTheme } from \"./light\";\nimport { nordTheme } from \"./nord\";\nimport { tokyoNightTheme } from \"./tokyo-night\";\nimport { rosePineTheme } from \"./rose-pine\";\n\nexport const BUILT_IN_THEMES: Record<string, ColorTheme> = {\n dark: darkTheme,\n light: lightTheme,\n nord: nordTheme,\n \"tokyo-night\": tokyoNightTheme,\n \"rose-pine\": rosePineTheme,\n};\n\nexport function getTheme(themeName: string): ColorTheme | null {\n return BUILT_IN_THEMES[themeName] || null;\n}\n\nexport { darkTheme, lightTheme, nordTheme, tokyoNightTheme, rosePineTheme };\n","import {\n loadSessionUsageById,\n loadDailyUsageData,\n loadSessionBlockData,\n getClaudePaths,\n} from \"ccusage/data-loader\";\nimport { calculateTotals, getTotalTokens } from \"ccusage/calculate-cost\";\nimport { logger } from \"ccusage/logger\";\n\nexport interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport interface SessionBlockInfo {\n cost: number;\n tokens: number;\n timeRemaining: number;\n burnRate: number | null;\n tokenBurnRate: number | null;\n isActive: boolean;\n}\n\nexport interface UsageInfo {\n session: {\n cost: number | null;\n tokens: number | null;\n tokenBreakdown: TokenBreakdown | null;\n };\n daily: {\n cost: number;\n tokens: number;\n tokenBreakdown: TokenBreakdown | null;\n };\n}\n\nexport class UsageProvider {\n async getSessionBlockInfo(): Promise<SessionBlockInfo | null> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const blocks = await loadSessionBlockData({\n mode: \"auto\",\n sessionDurationHours: 5,\n });\n\n const activeBlock = blocks.find((block) => block.isActive);\n\n if (!activeBlock) {\n return null;\n }\n\n const now = new Date();\n const timeRemaining = Math.round(\n (activeBlock.endTime.getTime() - now.getTime()) / (1000 * 60)\n );\n\n const elapsed = Math.round(\n (now.getTime() - activeBlock.startTime.getTime()) / (1000 * 60)\n );\n\n const totalTokens =\n (activeBlock.tokenCounts?.inputTokens || 0) +\n (activeBlock.tokenCounts?.outputTokens || 0) +\n (activeBlock.tokenCounts?.cacheCreationInputTokens || 0) +\n (activeBlock.tokenCounts?.cacheReadInputTokens || 0);\n\n const burnRate =\n elapsed > 0 ? (activeBlock.costUSD / elapsed) * 60 : null;\n const tokenBurnRate = elapsed > 0 ? (totalTokens / elapsed) * 60 : null;\n\n return {\n cost: activeBlock.costUSD,\n tokens: totalTokens,\n timeRemaining: Math.max(0, timeRemaining),\n burnRate,\n tokenBurnRate,\n isActive: true,\n };\n } catch {\n return null;\n } finally {\n logger.level = originalLevel;\n }\n }\n\n async getUsageInfo(sessionId: string): Promise<UsageInfo> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const claudePaths = getClaudePaths();\n if (claudePaths.length === 0) {\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n }\n\n const [sessionData, dailyData] = await Promise.all([\n this.getSessionData(sessionId),\n this.getDailyData(),\n ]);\n\n return {\n session: sessionData,\n daily: dailyData,\n };\n } catch {\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n } finally {\n logger.level = originalLevel;\n }\n }\n\n private async getSessionData(sessionId: string) {\n try {\n const sessionData = await loadSessionUsageById(sessionId, {\n mode: \"auto\",\n });\n\n if (!sessionData) {\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n\n const breakdown = sessionData.entries.reduce(\n (acc, entry) => {\n const usage = entry.message.usage;\n return {\n input: acc.input + usage.input_tokens,\n output: acc.output + usage.output_tokens,\n cacheCreation:\n acc.cacheCreation + (usage.cache_creation_input_tokens || 0),\n cacheRead: acc.cacheRead + (usage.cache_read_input_tokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n const totalTokens =\n breakdown.input +\n breakdown.output +\n breakdown.cacheCreation +\n breakdown.cacheRead;\n\n return {\n cost: sessionData.totalCost,\n tokens: totalTokens,\n tokenBreakdown: breakdown,\n };\n } catch {\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n }\n\n private async getDailyData() {\n try {\n const today = new Date();\n const todayStr =\n today.toISOString().split(\"T\")[0]?.replace(/-/g, \"\") ?? \"\";\n\n const dailyData = await loadDailyUsageData({\n since: todayStr,\n until: todayStr,\n mode: \"auto\",\n });\n\n if (dailyData.length === 0) {\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n\n const totals = calculateTotals(dailyData);\n const breakdown = dailyData.reduce(\n (acc, entry) => {\n return {\n input: acc.input + (entry.inputTokens || 0),\n output: acc.output + (entry.outputTokens || 0),\n cacheCreation: acc.cacheCreation + (entry.cacheCreationTokens || 0),\n cacheRead: acc.cacheRead + (entry.cacheReadTokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n return {\n cost: totals.totalCost,\n tokens: getTotalTokens(totals),\n tokenBreakdown: breakdown,\n };\n } catch {\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport interface GitInfo {\n branch: string;\n status: \"clean\" | \"dirty\" | \"conflicts\";\n ahead: number;\n behind: number;\n sha?: string;\n}\n\nexport class GitService {\n getGitInfo(workingDir: string, showSha = false): GitInfo | null {\n try {\n const branch = this.getBranch(workingDir);\n const status = this.getStatus(workingDir);\n const { ahead, behind } = this.getAheadBehind(workingDir);\n const sha = showSha ? this.getSha(workingDir) || undefined : undefined;\n\n return {\n branch: branch || \"detached\",\n status,\n ahead,\n behind,\n sha,\n };\n } catch {\n return null;\n }\n }\n\n private getBranch(workingDir: string): string | null {\n try {\n return (\n execSync(\"git branch --show-current\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim() || null\n );\n } catch {\n return null;\n }\n }\n\n private getStatus(workingDir: string): \"clean\" | \"dirty\" | \"conflicts\" {\n try {\n const gitStatus = execSync(\"git status --porcelain\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n if (!gitStatus) return \"clean\";\n\n if (\n gitStatus.includes(\"UU\") ||\n gitStatus.includes(\"AA\") ||\n gitStatus.includes(\"DD\")\n ) {\n return \"conflicts\";\n }\n\n return \"dirty\";\n } catch {\n return \"clean\";\n }\n }\n\n private getAheadBehind(workingDir: string): {\n ahead: number;\n behind: number;\n } {\n try {\n const aheadResult = execSync(\"git rev-list --count @{u}..HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n const behindResult = execSync(\"git rev-list --count HEAD..@{u}\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return {\n ahead: parseInt(aheadResult) || 0,\n behind: parseInt(behindResult) || 0,\n };\n } catch {\n return { ahead: 0, behind: 0 };\n }\n }\n\n private getSha(workingDir: string): string | null {\n try {\n const sha = execSync(\"git rev-parse --short=7 HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return sha || null;\n } catch {\n return null;\n }\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport class TmuxService {\n getSessionId(): string | null {\n try {\n if (!process.env.TMUX_PANE) {\n return null;\n }\n\n const sessionId = execSync(\"tmux display-message -p '#S'\", {\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return sessionId || null;\n } catch {\n return null;\n }\n }\n\n isInTmux(): boolean {\n return !!process.env.TMUX_PANE;\n }\n}\n","interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport function formatCost(cost: number | null): string {\n if (cost === null) return \"N/A\";\n if (cost < 0.01) return \"<$0.01\";\n return `$${cost.toFixed(2)}`;\n}\n\nexport function formatTokens(tokens: number | null): string {\n if (tokens === null) return \"N/A\";\n if (tokens === 0) return \"0 tokens\";\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M tokens`;\n } else if (tokens >= 1_000) {\n return `${(tokens / 1_000).toFixed(1)}K tokens`;\n }\n return `${tokens} tokens`;\n}\n\nexport function formatTokenBreakdown(breakdown: TokenBreakdown | null): string {\n if (!breakdown) return \"N/A\";\n\n const parts: string[] = [];\n\n if (breakdown.input > 0) {\n parts.push(`${formatTokens(breakdown.input).replace(\" tokens\", \"\")}in`);\n }\n\n if (breakdown.output > 0) {\n parts.push(`${formatTokens(breakdown.output).replace(\" tokens\", \"\")}out`);\n }\n\n if (breakdown.cacheCreation > 0 || breakdown.cacheRead > 0) {\n const totalCached = breakdown.cacheCreation + breakdown.cacheRead;\n parts.push(`${formatTokens(totalCached).replace(\" tokens\", \"\")}cached`);\n }\n\n return parts.length > 0 ? parts.join(\" + \") : \"0 tokens\";\n}\n\nexport function formatTimeRemaining(minutes: number): string {\n if (minutes <= 0) return \"0m\";\n\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n\n if (hours > 0) {\n return `${hours}h${mins > 0 ? ` ${mins}m` : \"\"}`;\n }\n\n return `${mins}m`;\n}\n","export interface BudgetStatus {\n percentage: number | null;\n isWarning: boolean;\n displayText: string;\n}\n\nexport function calculateBudgetPercentage(\n cost: number,\n budget: number | undefined\n): number | null {\n if (!budget || budget <= 0 || cost < 0) return null;\n return Math.min(100, (cost / budget) * 100);\n}\n\nexport function getBudgetStatus(\n cost: number,\n budget: number | undefined,\n warningThreshold = 80\n): BudgetStatus {\n const percentage = calculateBudgetPercentage(cost, budget);\n\n if (percentage === null) {\n return {\n percentage: null,\n isWarning: false,\n displayText: \"\",\n };\n }\n\n const percentStr = `${percentage.toFixed(0)}%`;\n const isWarning = percentage >= warningThreshold;\n\n let displayText = \"\";\n if (isWarning) {\n displayText = ` !${percentStr}`;\n } else if (percentage >= 50) {\n displayText = ` +${percentStr}`;\n } else {\n displayText = ` ${percentStr}`;\n }\n\n return {\n percentage,\n isWarning,\n displayText,\n };\n}\n","import type { PowerlineConfig } from \"../types/config\";\nimport type { ClaudeHookData, PowerlineColors } from \"../types\";\nimport {\n formatCost,\n formatTokens,\n formatTokenBreakdown,\n formatTimeRemaining,\n} from \"./formatters\";\nimport { getBudgetStatus } from \"./budget\";\nimport type {\n UsageInfo,\n SessionBlockInfo,\n TokenBreakdown,\n} from \"./usage-provider\";\nimport type { GitInfo } from \"./git-service\";\n\nexport interface PowerlineSymbols {\n right: string;\n branch: string;\n model: string;\n git_clean: string;\n git_dirty: string;\n git_conflicts: string;\n git_ahead: string;\n git_behind: string;\n session_cost: string;\n daily_cost: string;\n block_cost: string;\n}\n\nexport interface SegmentData {\n text: string;\n bgColor: string;\n fgColor: string;\n}\n\nexport class SegmentRenderer {\n constructor(\n private readonly config: PowerlineConfig,\n private readonly symbols: PowerlineSymbols\n ) {}\n\n renderDirectory(\n hookData: ClaudeHookData,\n colors: PowerlineColors\n ): SegmentData {\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n const projectDir = hookData.workspace?.project_dir;\n const dirName = this.getDisplayDirectoryName(currentDir, projectDir);\n\n return {\n text: dirName,\n bgColor: colors.modeBg,\n fgColor: colors.modeFg,\n };\n }\n\n renderGit(\n gitInfo: GitInfo,\n colors: PowerlineColors,\n showSha = false\n ): SegmentData | null {\n if (!gitInfo) return null;\n\n let gitStatusIcon = this.symbols.git_clean;\n if (gitInfo.status === \"conflicts\") {\n gitStatusIcon = this.symbols.git_conflicts;\n } else if (gitInfo.status === \"dirty\") {\n gitStatusIcon = this.symbols.git_dirty;\n }\n\n let text = `${this.symbols.branch} ${gitInfo.branch} ${gitStatusIcon}`;\n\n if (gitInfo.sha && showSha) {\n text += ` ${gitInfo.sha}`;\n }\n\n if (gitInfo.ahead > 0 && gitInfo.behind > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}${this.symbols.git_behind}${gitInfo.behind}`;\n } else if (gitInfo.ahead > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}`;\n } else if (gitInfo.behind > 0) {\n text += ` ${this.symbols.git_behind}${gitInfo.behind}`;\n }\n\n return {\n text,\n bgColor: colors.gitBg,\n fgColor: colors.gitFg,\n };\n }\n\n renderModel(hookData: ClaudeHookData, colors: PowerlineColors): SegmentData {\n const modelName = hookData.model?.display_name || \"Claude\";\n\n return {\n text: `${this.symbols.model} ${modelName}`,\n bgColor: colors.modelBg,\n fgColor: colors.modelFg,\n };\n }\n\n renderSession(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const sessionBudget = this.config.budget?.session;\n const text = `${this.symbols.session_cost} ${this.formatUsageWithBudget(\n usageInfo.session.cost,\n usageInfo.session.tokens,\n usageInfo.session.tokenBreakdown,\n type,\n sessionBudget?.amount,\n sessionBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.sessionBg,\n fgColor: colors.sessionFg,\n };\n }\n\n renderToday(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const todayBudget = this.config.budget?.today;\n const text = `Today ${this.formatUsageWithBudget(\n usageInfo.daily.cost,\n usageInfo.daily.tokens,\n usageInfo.daily.tokenBreakdown,\n type,\n todayBudget?.amount,\n todayBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.burnLowBg,\n fgColor: colors.burnFg,\n };\n }\n\n renderBlock(\n blockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData | null {\n if (!blockInfo) return null;\n\n const text = `${this.symbols.block_cost} ${this.formatSessionBlockInfo(blockInfo, type)}`;\n\n return {\n text,\n bgColor: colors.blockBg,\n fgColor: colors.blockFg,\n };\n }\n\n renderTmux(\n sessionId: string | null,\n colors: PowerlineColors\n ): SegmentData | null {\n if (!sessionId) return null;\n\n return {\n text: `tmux:${sessionId}`,\n bgColor: colors.tmuxBg,\n fgColor: colors.tmuxFg,\n };\n }\n\n private getDisplayDirectoryName(\n currentDir: string,\n projectDir?: string\n ): string {\n if (projectDir && projectDir !== currentDir) {\n const projectName = projectDir.split(\"/\").pop() || \"project\";\n const currentDirName = currentDir.split(\"/\").pop() || \"root\";\n\n if (currentDir.includes(projectDir)) {\n return `${projectName}/${currentDirName}`;\n }\n\n return currentDirName;\n }\n\n return currentDir.split(\"/\").pop() || \"root\";\n }\n\n private formatUsageDisplay(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string\n ): string {\n switch (type) {\n case \"cost\":\n return formatCost(cost);\n case \"tokens\":\n return formatTokens(tokens);\n case \"both\":\n return `${formatCost(cost)} (${formatTokens(tokens)})`;\n case \"breakdown\":\n return formatTokenBreakdown(tokenBreakdown);\n default:\n return formatCost(cost);\n }\n }\n\n private formatUsageWithBudget(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string,\n budget: number | undefined,\n warningThreshold = 80\n ): string {\n const baseDisplay = this.formatUsageDisplay(\n cost,\n tokens,\n tokenBreakdown,\n type\n );\n\n if (budget && budget > 0 && cost !== null) {\n const budgetStatus = getBudgetStatus(cost, budget, warningThreshold);\n return baseDisplay + budgetStatus.displayText;\n }\n\n return baseDisplay;\n }\n\n private formatSessionBlockInfo(\n blockInfo: SessionBlockInfo,\n type = \"cost\"\n ): string {\n if (!blockInfo.isActive) {\n return \"No active block\";\n }\n\n const timeStr = formatTimeRemaining(blockInfo.timeRemaining);\n\n if (type === \"tokens\") {\n const tokensStr = formatTokens(blockInfo.tokens);\n let result = `${tokensStr} (${timeStr} left)`;\n\n if (blockInfo.tokenBurnRate !== null && blockInfo.tokenBurnRate > 0) {\n const burnRateStr = `${formatTokens(blockInfo.tokenBurnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n } else {\n const costStr = formatCost(blockInfo.cost);\n let result = `${costStr} (${timeStr} left)`;\n\n if (blockInfo.burnRate !== null && blockInfo.burnRate > 0) {\n const burnRateStr = `${formatCost(blockInfo.burnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n }\n }\n}\n","import type { ClaudeHookData, PowerlineColors } from \"./types\";\nimport type {\n PowerlineConfig,\n LineConfig,\n AnySegmentConfig,\n GitSegmentConfig,\n UsageSegmentConfig,\n BlockSegmentConfig,\n} from \"./types/config\";\nimport { hexToAnsi, extractBgToFg } from \"./lib/colors\";\nimport { getTheme } from \"./themes\";\nimport {\n UsageProvider,\n UsageInfo,\n SessionBlockInfo,\n} from \"./lib/usage-provider\";\nimport { GitService } from \"./lib/git-service\";\nimport { TmuxService } from \"./lib/tmux-service\";\nimport { SegmentRenderer, PowerlineSymbols } from \"./lib/segment-renderer\";\n\nexport class PowerlineRenderer {\n private readonly symbols: PowerlineSymbols;\n private readonly usageProvider: UsageProvider;\n private readonly gitService: GitService;\n private readonly tmuxService: TmuxService;\n private readonly segmentRenderer: SegmentRenderer;\n\n constructor(private readonly config: PowerlineConfig) {\n this.symbols = this.initializeSymbols();\n this.usageProvider = new UsageProvider();\n this.gitService = new GitService();\n this.tmuxService = new TmuxService();\n this.segmentRenderer = new SegmentRenderer(config, this.symbols);\n }\n\n async generateStatusline(hookData: ClaudeHookData): Promise<string> {\n const usageInfo = await this.usageProvider.getUsageInfo(\n hookData.session_id\n );\n\n let sessionBlockInfo = null;\n if (this.needsSessionBlock()) {\n sessionBlockInfo = await this.usageProvider.getSessionBlockInfo();\n }\n\n const lines = this.config.display.lines\n .map((lineConfig) =>\n this.renderLine(lineConfig, hookData, usageInfo, sessionBlockInfo)\n )\n .filter((line) => line.length > 0);\n\n return lines.join(\"\\n\");\n }\n\n private needsSessionBlock(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.block?.enabled\n );\n }\n\n private renderLine(\n lineConfig: LineConfig,\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null\n ): string {\n const colors = this.getThemeColors();\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n\n const segments = Object.entries(lineConfig.segments)\n .filter(\n ([_, config]: [string, AnySegmentConfig | undefined]) => config?.enabled\n )\n .map(([type, config]: [string, AnySegmentConfig]) => ({ type, config }));\n\n let line = colors.reset;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (!segment) continue;\n\n const isLast = i === segments.length - 1;\n const nextSegment = !isLast ? segments[i + 1] : null;\n const nextBgColor = nextSegment\n ? this.getSegmentBgColor(nextSegment.type, colors)\n : \"\";\n\n const segmentData = this.renderSegment(\n segment,\n hookData,\n usageInfo,\n sessionBlockInfo,\n colors,\n currentDir\n );\n\n if (segmentData) {\n line += this.formatSegment(\n segmentData.bgColor,\n segmentData.fgColor,\n segmentData.text,\n isLast ? undefined : nextBgColor\n );\n }\n }\n\n return line;\n }\n\n private renderSegment(\n segment: { type: string; config: AnySegmentConfig },\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n currentDir: string\n ) {\n switch (segment.type) {\n case \"directory\":\n return this.segmentRenderer.renderDirectory(hookData, colors);\n\n case \"git\":\n const showSha = (segment.config as GitSegmentConfig)?.showSha || false;\n const gitInfo = this.gitService.getGitInfo(currentDir, showSha);\n return gitInfo\n ? this.segmentRenderer.renderGit(gitInfo, colors, showSha)\n : null;\n\n case \"model\":\n return this.segmentRenderer.renderModel(hookData, colors);\n\n case \"session\":\n const usageType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderSession(usageInfo, colors, usageType);\n\n case \"today\":\n const todayType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderToday(usageInfo, colors, todayType);\n\n case \"block\":\n const blockType =\n (segment.config as BlockSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderBlock(\n sessionBlockInfo,\n colors,\n blockType\n );\n\n case \"tmux\":\n const tmuxSessionId = this.tmuxService.getSessionId();\n return this.segmentRenderer.renderTmux(tmuxSessionId, colors);\n\n default:\n return null;\n }\n }\n\n private initializeSymbols(): PowerlineSymbols {\n const isMinimalStyle = this.config.display.style === \"minimal\";\n\n return {\n right: isMinimalStyle ? \"\" : \"\\uE0B0\",\n branch: \"⑂\",\n model: \"⚡\",\n git_clean: \"✓\",\n git_dirty: \"●\",\n git_conflicts: \"⚠\",\n git_ahead: \"↑\",\n git_behind: \"↓\",\n session_cost: \"Session\",\n daily_cost: \"Today\",\n block_cost: \"Block\",\n };\n }\n\n private getThemeColors(): PowerlineColors {\n const theme = this.config.theme;\n let colorTheme;\n\n if (theme === \"custom\") {\n colorTheme = this.config.colors?.custom;\n if (!colorTheme) {\n throw new Error(\n \"Custom theme selected but no colors provided in configuration\"\n );\n }\n } else {\n colorTheme = getTheme(theme);\n if (!colorTheme) {\n console.warn(\n `Built-in theme '${theme}' not found, falling back to 'dark' theme`\n );\n colorTheme = getTheme(\"dark\")!;\n }\n }\n\n return {\n reset: \"\\x1b[0m\",\n modeBg: hexToAnsi(colorTheme.directory.bg, true),\n modeFg: hexToAnsi(colorTheme.directory.fg, false),\n gitBg: hexToAnsi(colorTheme.git.bg, true),\n gitFg: hexToAnsi(colorTheme.git.fg, false),\n modelBg: hexToAnsi(colorTheme.model.bg, true),\n modelFg: hexToAnsi(colorTheme.model.fg, false),\n sessionBg: hexToAnsi(colorTheme.session.bg, true),\n sessionFg: hexToAnsi(colorTheme.session.fg, false),\n todayBg: hexToAnsi(colorTheme.today.bg, true),\n todayFg: hexToAnsi(colorTheme.today.fg, false),\n blockBg: hexToAnsi(colorTheme.block.bg, true),\n blockFg: hexToAnsi(colorTheme.block.fg, false),\n burnLowBg: hexToAnsi(colorTheme.today.bg, true),\n burnFg: hexToAnsi(colorTheme.today.fg, false),\n tmuxBg: hexToAnsi(colorTheme.tmux.bg, true),\n tmuxFg: hexToAnsi(colorTheme.tmux.fg, false),\n };\n }\n\n private getSegmentBgColor(\n segmentType: string,\n colors: PowerlineColors\n ): string {\n switch (segmentType) {\n case \"directory\":\n return colors.modeBg;\n case \"git\":\n return colors.gitBg;\n case \"model\":\n return colors.modelBg;\n case \"session\":\n return colors.sessionBg;\n case \"today\":\n return colors.burnLowBg;\n case \"block\":\n return colors.blockBg;\n case \"tmux\":\n return colors.tmuxBg;\n default:\n return colors.modeBg;\n }\n }\n\n private formatSegment(\n bgColor: string,\n fgColor: string,\n text: string,\n nextBgColor?: string\n ): string {\n let output = `${bgColor}${fgColor} ${text} `;\n\n const reset = \"\\x1b[0m\";\n\n if (nextBgColor) {\n const arrowFgColor = extractBgToFg(bgColor);\n output += `${reset}${nextBgColor}${arrowFgColor}${this.symbols.right}`;\n } else {\n output += `${reset}${extractBgToFg(bgColor)}${this.symbols.right}${reset}`;\n }\n\n return output;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { PowerlineConfig, ConfigLoadOptions } from \"../types/config\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\n\nfunction deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n const sourceValue = source[key];\n if (sourceValue !== undefined) {\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue)\n ) {\n const targetValue = result[key] || {};\n result[key] = deepMerge(\n targetValue as Record<string, any>,\n sourceValue as Record<string, any>\n ) as T[Extract<keyof T, string>];\n } else if (Array.isArray(sourceValue) && sourceValue.length === 0) {\n const targetValue = result[key];\n if (!Array.isArray(targetValue) || targetValue.length > 0) {\n continue;\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nfunction findConfigFile(\n customPath?: string,\n projectDir?: string\n): string | null {\n if (customPath) {\n return fs.existsSync(customPath) ? customPath : null;\n }\n\n const locations = [\n ...(projectDir ? [path.join(projectDir, \".claude-powerline.json\")] : []),\n path.join(process.cwd(), \".claude-powerline.json\"),\n path.join(os.homedir(), \".claude\", \"claude-powerline.json\"),\n path.join(os.homedir(), \".config\", \"claude-powerline\", \"config.json\"),\n ];\n\n return locations.find(fs.existsSync) || null;\n}\n\nfunction loadConfigFile(filePath: string): Partial<PowerlineConfig> {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Failed to load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction loadEnvConfig(): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n if (process.env.CLAUDE_POWERLINE_THEME) {\n config.theme = process.env.CLAUDE_POWERLINE_THEME as\n | \"light\"\n | \"dark\"\n | \"custom\";\n }\n\n if (process.env.CLAUDE_POWERLINE_STYLE) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n const style = process.env.CLAUDE_POWERLINE_STYLE;\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from environment variable, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n\n if (process.env.CLAUDE_POWERLINE_USAGE_TYPE) {\n const usageType = process.env.CLAUDE_POWERLINE_USAGE_TYPE as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if (!config.display) {\n config.display = { lines: [] };\n }\n\n if (config.display.lines.length === 0) {\n config.display.lines = [{ segments: {} }];\n }\n\n config.display.lines.forEach((line) => {\n if (line.segments.session) {\n line.segments.session.type = usageType;\n }\n if (line.segments.today) {\n line.segments.today.type = usageType;\n }\n if (line.segments.block) {\n line.segments.block.type =\n usageType === \"breakdown\" || usageType === \"both\"\n ? \"cost\"\n : usageType;\n }\n });\n }\n\n return config;\n}\n\nfunction getConfigPathFromEnv(): string | undefined {\n return process.env.CLAUDE_POWERLINE_CONFIG;\n}\n\nfunction parseCLIOverrides(args: string[]): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n const themeIndex = args.findIndex((arg) => arg.startsWith(\"--theme=\"));\n if (themeIndex !== -1) {\n const theme = args[themeIndex]?.split(\"=\")[1];\n if (theme) {\n config.theme = theme as \"light\" | \"dark\" | \"custom\";\n }\n }\n\n const styleIndex = args.findIndex((arg) => arg.startsWith(\"--style=\"));\n if (styleIndex !== -1) {\n const style = args[styleIndex]?.split(\"=\")[1];\n if (style) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from CLI argument, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n }\n\n const dailyBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--daily-budget=\")\n );\n if (dailyBudgetIndex !== -1) {\n const dailyBudget = parseFloat(args[dailyBudgetIndex]?.split(\"=\")[1] || \"\");\n if (!isNaN(dailyBudget) && dailyBudget > 0) {\n config.budget = {\n ...config.budget,\n today: {\n ...DEFAULT_CONFIG.budget?.today,\n amount: dailyBudget,\n },\n };\n }\n }\n\n const sessionBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--session-budget=\")\n );\n if (sessionBudgetIndex !== -1) {\n const sessionBudget = parseFloat(\n args[sessionBudgetIndex]?.split(\"=\")[1] || \"\"\n );\n if (!isNaN(sessionBudget) && sessionBudget > 0) {\n config.budget = {\n ...config.budget,\n session: {\n ...DEFAULT_CONFIG.budget?.session,\n amount: sessionBudget,\n },\n };\n }\n }\n\n const usageIndex = args.findIndex((arg) => arg.startsWith(\"--usage=\"));\n if (usageIndex !== -1) {\n const usageType = args[usageIndex]?.split(\"=\")[1] as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if (\n usageType &&\n [\"cost\", \"tokens\", \"both\", \"breakdown\"].includes(usageType)\n ) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n\n if (config.display.lines.length === 0) {\n config.display.lines = [{ segments: {} }];\n }\n\n config.display.lines.forEach((line) => {\n if (line.segments.session) {\n line.segments.session.type = usageType;\n }\n if (line.segments.today) {\n line.segments.today.type = usageType;\n }\n if (line.segments.block) {\n line.segments.block.type =\n usageType === \"breakdown\" || usageType === \"both\"\n ? \"cost\"\n : usageType;\n }\n });\n }\n }\n\n return config;\n}\n\nexport function loadConfig(options: ConfigLoadOptions = {}): PowerlineConfig {\n const {\n configPath,\n ignoreEnvVars = false,\n cliOverrides = {},\n projectDir,\n } = options;\n\n let config: PowerlineConfig = JSON.parse(JSON.stringify(DEFAULT_CONFIG));\n\n const configFile = findConfigFile(configPath, projectDir);\n if (configFile) {\n try {\n const fileConfig = loadConfigFile(configFile);\n config = deepMerge(config, fileConfig);\n } catch (err) {\n console.warn(\n `Warning: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n if (\n config.display?.style &&\n config.display.style !== \"minimal\" &&\n config.display.style !== \"powerline\"\n ) {\n console.warn(\n `Invalid display style '${config.display.style}' in config file, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n\n if (!ignoreEnvVars) {\n const envConfig = loadEnvConfig();\n config = deepMerge(config, envConfig);\n }\n\n config = deepMerge(config, cliOverrides);\n\n return config;\n}\n\nexport function loadConfigFromCLI(\n args: string[] = process.argv,\n projectDir?: string\n): PowerlineConfig {\n const configPathIndex = args.findIndex((arg) => arg.startsWith(\"--config=\"));\n const configPath =\n configPathIndex !== -1\n ? args[configPathIndex]?.split(\"=\")[1]\n : getConfigPathFromEnv();\n\n const cliOverrides = parseCLIOverrides(args);\n\n return loadConfig({ configPath, cliOverrides, projectDir });\n}\n\nexport function getConfigPath(\n customPath?: string,\n projectDir?: string\n): string | null {\n return findConfigFile(customPath, projectDir);\n}\n","import type { PowerlineConfig } from \"../types/config\";\n\nexport const DEFAULT_CONFIG: PowerlineConfig = {\n theme: \"dark\",\n display: {\n style: \"minimal\",\n lines: [\n {\n segments: {\n directory: { enabled: true },\n git: {\n enabled: true,\n showSha: false,\n },\n model: { enabled: true },\n session: { enabled: true, type: \"tokens\" },\n today: { enabled: true, type: \"both\" },\n block: { enabled: false, type: \"cost\" },\n tmux: { enabled: false },\n },\n },\n ],\n },\n budget: {\n session: {\n warningThreshold: 80,\n },\n today: {\n amount: 50,\n warningThreshold: 80,\n },\n },\n};\n"],"mappings":"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","names":["process","path","fs","execSync","os","execSync","os","path","fs","execSync","process"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/colors.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/nord.ts","../src/themes/tokyo-night.ts","../src/themes/rose-pine.ts","../src/themes/index.ts","../src/lib/usage-provider.ts","../src/lib/git-service.ts","../src/lib/tmux-service.ts","../src/lib/formatters.ts","../src/lib/budget.ts","../src/lib/segment-renderer.ts","../src/powerline.ts","../src/config/loader.ts","../src/config/defaults.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport os from \"node:os\";\nimport { json } from \"node:stream/consumers\";\nimport { PowerlineRenderer } from \"./powerline\";\nimport { loadConfigFromCLI } from \"./config/loader\";\nimport type { ClaudeHookData } from \"./types\";\n\nasync function installFonts(): Promise<void> {\n try {\n const platform = os.platform();\n let fontDir: string;\n\n if (platform === \"darwin\") {\n fontDir = path.join(os.homedir(), \"Library\", \"Fonts\");\n } else if (platform === \"linux\") {\n fontDir = path.join(os.homedir(), \".local\", \"share\", \"fonts\");\n } else if (platform === \"win32\") {\n fontDir = path.join(\n os.homedir(),\n \"AppData\",\n \"Local\",\n \"Microsoft\",\n \"Windows\",\n \"Fonts\"\n );\n } else {\n console.log(\"Unsupported platform for font installation\");\n return;\n }\n\n if (!fs.existsSync(fontDir)) {\n fs.mkdirSync(fontDir, { recursive: true });\n }\n\n console.log(\"📦 Installing Powerline Fonts...\");\n console.log(\"Downloading from https://github.com/powerline/fonts\");\n\n const tempDir = path.join(os.tmpdir(), \"powerline-fonts\");\n\n try {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n\n console.log(\"Cloning powerline fonts repository...\");\n execSync(\n \"git clone --depth=1 https://github.com/powerline/fonts.git powerline-fonts\",\n {\n stdio: \"inherit\",\n cwd: os.tmpdir(),\n }\n );\n\n console.log(\"Installing fonts...\");\n const installScript = path.join(tempDir, \"install.sh\");\n\n if (fs.existsSync(installScript)) {\n fs.chmodSync(installScript, 0o755);\n execSync(\"./install.sh\", { stdio: \"inherit\", cwd: tempDir });\n } else {\n throw new Error(\n \"Install script not found in powerline fonts repository\"\n );\n }\n\n console.log(\"✅ Powerline fonts installation complete!\");\n console.log(\n \"Please restart your terminal and set your terminal font to a powerline font.\"\n );\n console.log(\n \"Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline\"\n );\n } finally {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n }\n } catch (error) {\n console.error(\n \"Error installing fonts:\",\n error instanceof Error ? error.message : String(error)\n );\n console.log(\n \"💡 You can manually install fonts from: https://github.com/powerline/fonts\"\n );\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const showHelp =\n process.argv.includes(\"--help\") || process.argv.includes(\"-h\");\n const installFontsFlag = process.argv.includes(\"--install-fonts\");\n\n if (installFontsFlag) {\n await installFonts();\n process.exit(0);\n }\n\n if (showHelp) {\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nStandalone Commands:\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nClaude Code Options (for settings.json):\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n\nConfiguration:\n Config files are loaded in this order (highest priority first):\n 1. CLI arguments (--theme, --style, --usage, --config)\n 2. Environment variables (CLAUDE_POWERLINE_THEME, CLAUDE_POWERLINE_STYLE, CLAUDE_POWERLINE_USAGE_TYPE, CLAUDE_POWERLINE_CONFIG)\n 3. ./.claude-powerline.json (project)\n 4. ~/.claude/claude-powerline.json (user)\n 5. ~/.config/claude-powerline/config.json (XDG)\n\nCreating a config file:\n Copy example from: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n\nUsage in Claude Code settings.json:\n{\n \"statusLine\": {\n \"type\": \"command\",\n \"command\": \"claude-powerline\",\n \"padding\": 0\n }\n}\n`);\n process.exit(0);\n }\n\n if (process.stdin.isTTY === true) {\n console.error(`Error: This tool requires input from Claude Code\n\nclaude-powerline is designed to be used as a Claude Code statusLine command.\nIt reads hook data from stdin and outputs formatted statusline.\n\nAdd to ~/.claude/settings.json:\n{\n \"statusLine\": {\n \"type\": \"command\",\n \"command\": \"claude-powerline --style=powerline\"\n }\n}\n\nRun with --help for more options.\n\nTo test output manually:\necho '{\"workspace\":{\"project_dir\":\"/path/to/project\"},\"session\":{\"id\":\"test\",\"model\":\"claude\"}}' | claude-powerline --style=powerline`);\n process.exit(1);\n }\n\n const hookData = (await json(process.stdin)) as ClaudeHookData;\n if (!hookData) {\n console.error(\"Error: No input provided\");\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nOptions:\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nSee example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n`);\n process.exit(1);\n }\n\n const projectDir = hookData.workspace?.project_dir;\n const config = loadConfigFromCLI(process.argv, projectDir);\n const renderer = new PowerlineRenderer(config);\n const statusline = await renderer.generateStatusline(hookData);\n\n console.log(statusline);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"Error generating statusline:\", errorMessage);\n process.exit(1);\n }\n}\n\nmain();\n","export function hexToAnsi(hex: string, isBackground: boolean): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `\\x1b[${isBackground ? \"48\" : \"38\"};2;${r};${g};${b}m`;\n}\n\nexport function extractBgToFg(ansiCode: string): string {\n const match = ansiCode.match(/48;2;(\\d+);(\\d+);(\\d+)/);\n if (match) {\n return `\\x1b[38;2;${match[1]};${match[2]};${match[3]}m`;\n }\n return ansiCode.replace(\"48\", \"38\");\n}\n","import type { ColorTheme } from \"../types/config\";\n\nexport const darkTheme: ColorTheme = {\n directory: { bg: \"#8b4513\", fg: \"#ffffff\" },\n git: { bg: \"#404040\", fg: \"#ffffff\" },\n model: { bg: \"#2d2d2d\", fg: \"#ffffff\" },\n session: { bg: \"#202020\", fg: \"#00ffff\" },\n today: { bg: \"#a0520d\", fg: \"#ffffff\" },\n block: { bg: \"#8b4500\", fg: \"#ffffff\" },\n tmux: { bg: \"#2f4f2f\", fg: \"#90ee90\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const lightTheme: ColorTheme = {\n directory: { bg: \"#ff6b47\", fg: \"#ffffff\" },\n git: { bg: \"#4fb3d9\", fg: \"#ffffff\" },\n model: { bg: \"#87ceeb\", fg: \"#000000\" },\n session: { bg: \"#da70d6\", fg: \"#ffffff\" },\n today: { bg: \"#90ee90\", fg: \"#ffffff\" },\n block: { bg: \"#ff8c00\", fg: \"#ffffff\" },\n tmux: { bg: \"#32cd32\", fg: \"#ffffff\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const nordTheme: ColorTheme = {\n directory: { bg: \"#434c5e\", fg: \"#d8dee9\" },\n git: { bg: \"#3b4252\", fg: \"#a3be8c\" },\n model: { bg: \"#4c566a\", fg: \"#81a1c1\" },\n session: { bg: \"#2e3440\", fg: \"#88c0d0\" },\n today: { bg: \"#434c5e\", fg: \"#ebcb8b\" },\n block: { bg: \"#3b4252\", fg: \"#bf616a\" },\n tmux: { bg: \"#2e3440\", fg: \"#8fbcbb\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const tokyoNightTheme: ColorTheme = {\n directory: { bg: \"#2f334d\", fg: \"#82aaff\" },\n git: { bg: \"#1e2030\", fg: \"#c3e88d\" },\n model: { bg: \"#191b29\", fg: \"#fca7ea\" },\n session: { bg: \"#222436\", fg: \"#86e1fc\" },\n today: { bg: \"#2f334d\", fg: \"#ffc777\" },\n block: { bg: \"#1e2030\", fg: \"#ff966c\" },\n tmux: { bg: \"#191b29\", fg: \"#4fd6be\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const rosePineTheme: ColorTheme = {\n directory: { bg: \"#26233a\", fg: \"#c4a7e7\" },\n git: { bg: \"#1f1d2e\", fg: \"#9ccfd8\" },\n model: { bg: \"#191724\", fg: \"#ebbcba\" },\n session: { bg: \"#26233a\", fg: \"#f6c177\" },\n today: { bg: \"#1f1d2e\", fg: \"#eb6f92\" },\n block: { bg: \"#191724\", fg: \"#31748f\" },\n tmux: { bg: \"#26233a\", fg: \"#908caa\" },\n};\n","import type { ColorTheme } from \"../types/config\";\nimport { darkTheme } from \"./dark\";\nimport { lightTheme } from \"./light\";\nimport { nordTheme } from \"./nord\";\nimport { tokyoNightTheme } from \"./tokyo-night\";\nimport { rosePineTheme } from \"./rose-pine\";\n\nexport const BUILT_IN_THEMES: Record<string, ColorTheme> = {\n dark: darkTheme,\n light: lightTheme,\n nord: nordTheme,\n \"tokyo-night\": tokyoNightTheme,\n \"rose-pine\": rosePineTheme,\n};\n\nexport function getTheme(themeName: string): ColorTheme | null {\n return BUILT_IN_THEMES[themeName] || null;\n}\n\nexport { darkTheme, lightTheme, nordTheme, tokyoNightTheme, rosePineTheme };\n","import {\n loadSessionUsageById,\n loadDailyUsageData,\n loadSessionBlockData,\n getClaudePaths,\n} from \"ccusage/data-loader\";\nimport { calculateTotals, getTotalTokens } from \"ccusage/calculate-cost\";\nimport { logger } from \"ccusage/logger\";\n\nexport interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport interface SessionBlockInfo {\n cost: number;\n tokens: number;\n timeRemaining: number;\n burnRate: number | null;\n tokenBurnRate: number | null;\n isActive: boolean;\n}\n\nexport interface UsageInfo {\n session: {\n cost: number | null;\n tokens: number | null;\n tokenBreakdown: TokenBreakdown | null;\n };\n daily: {\n cost: number;\n tokens: number;\n tokenBreakdown: TokenBreakdown | null;\n };\n}\n\nexport class UsageProvider {\n async getSessionBlockInfo(): Promise<SessionBlockInfo | null> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const blocks = await loadSessionBlockData({\n mode: \"auto\",\n sessionDurationHours: 5,\n });\n\n const activeBlock = blocks.find((block) => block.isActive);\n\n if (!activeBlock) {\n return null;\n }\n\n const now = new Date();\n const timeRemaining = Math.round(\n (activeBlock.endTime.getTime() - now.getTime()) / (1000 * 60)\n );\n\n const elapsed = Math.round(\n (now.getTime() - activeBlock.startTime.getTime()) / (1000 * 60)\n );\n\n const totalTokens =\n (activeBlock.tokenCounts?.inputTokens || 0) +\n (activeBlock.tokenCounts?.outputTokens || 0) +\n (activeBlock.tokenCounts?.cacheCreationInputTokens || 0) +\n (activeBlock.tokenCounts?.cacheReadInputTokens || 0);\n\n const burnRate =\n elapsed > 0 ? (activeBlock.costUSD / elapsed) * 60 : null;\n const tokenBurnRate = elapsed > 0 ? (totalTokens / elapsed) * 60 : null;\n\n return {\n cost: activeBlock.costUSD,\n tokens: totalTokens,\n timeRemaining: Math.max(0, timeRemaining),\n burnRate,\n tokenBurnRate,\n isActive: true,\n };\n } catch {\n return null;\n } finally {\n logger.level = originalLevel;\n }\n }\n\n async getUsageInfo(sessionId: string): Promise<UsageInfo> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const claudePaths = getClaudePaths();\n if (claudePaths.length === 0) {\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n }\n\n const [sessionData, dailyData] = await Promise.all([\n this.getSessionData(sessionId),\n this.getDailyData(),\n ]);\n\n return {\n session: sessionData,\n daily: dailyData,\n };\n } catch {\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n } finally {\n logger.level = originalLevel;\n }\n }\n\n private async getSessionData(sessionId: string) {\n try {\n const sessionData = await loadSessionUsageById(sessionId, {\n mode: \"auto\",\n });\n\n if (!sessionData) {\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n\n const breakdown = sessionData.entries.reduce(\n (acc, entry) => {\n const usage = entry.message.usage;\n return {\n input: acc.input + usage.input_tokens,\n output: acc.output + usage.output_tokens,\n cacheCreation:\n acc.cacheCreation + (usage.cache_creation_input_tokens || 0),\n cacheRead: acc.cacheRead + (usage.cache_read_input_tokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n const totalTokens =\n breakdown.input +\n breakdown.output +\n breakdown.cacheCreation +\n breakdown.cacheRead;\n\n return {\n cost: sessionData.totalCost,\n tokens: totalTokens,\n tokenBreakdown: breakdown,\n };\n } catch {\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n }\n\n private async getDailyData() {\n try {\n const today = new Date();\n const todayStr =\n today.toISOString().split(\"T\")[0]?.replace(/-/g, \"\") ?? \"\";\n\n const dailyData = await loadDailyUsageData({\n since: todayStr,\n until: todayStr,\n mode: \"auto\",\n });\n\n if (dailyData.length === 0) {\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n\n const totals = calculateTotals(dailyData);\n const breakdown = dailyData.reduce(\n (acc, entry) => {\n return {\n input: acc.input + (entry.inputTokens || 0),\n output: acc.output + (entry.outputTokens || 0),\n cacheCreation: acc.cacheCreation + (entry.cacheCreationTokens || 0),\n cacheRead: acc.cacheRead + (entry.cacheReadTokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n return {\n cost: totals.totalCost,\n tokens: getTotalTokens(totals),\n tokenBreakdown: breakdown,\n };\n } catch {\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n }\n}\n","import { execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface GitInfo {\n branch: string;\n status: \"clean\" | \"dirty\" | \"conflicts\";\n ahead: number;\n behind: number;\n sha?: string;\n}\n\nexport class GitService {\n private isGitRepo(workingDir: string): boolean {\n try {\n return fs.existsSync(path.join(workingDir, \".git\"));\n } catch {\n return false;\n }\n }\n\n getGitInfo(workingDir: string, showSha = false): GitInfo | null {\n if (!this.isGitRepo(workingDir)) {\n return {\n branch: \"detached\",\n status: \"clean\",\n ahead: 0,\n behind: 0,\n sha: undefined,\n };\n }\n\n try {\n const branch = this.getBranch(workingDir);\n const status = this.getStatus(workingDir);\n const { ahead, behind } = this.getAheadBehind(workingDir);\n const sha = showSha ? this.getSha(workingDir) || undefined : undefined;\n\n return {\n branch: branch || \"detached\",\n status,\n ahead,\n behind,\n sha,\n };\n } catch {\n return null;\n }\n }\n\n private getBranch(workingDir: string): string | null {\n try {\n return (\n execSync(\"git branch --show-current\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim() || null\n );\n } catch {\n return null;\n }\n }\n\n private getStatus(workingDir: string): \"clean\" | \"dirty\" | \"conflicts\" {\n try {\n const gitStatus = execSync(\"git status --porcelain\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n if (!gitStatus) return \"clean\";\n\n if (\n gitStatus.includes(\"UU\") ||\n gitStatus.includes(\"AA\") ||\n gitStatus.includes(\"DD\")\n ) {\n return \"conflicts\";\n }\n\n return \"dirty\";\n } catch {\n return \"clean\";\n }\n }\n\n private getAheadBehind(workingDir: string): {\n ahead: number;\n behind: number;\n } {\n try {\n const aheadResult = execSync(\"git rev-list --count @{u}..HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n const behindResult = execSync(\"git rev-list --count HEAD..@{u}\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return {\n ahead: parseInt(aheadResult) || 0,\n behind: parseInt(behindResult) || 0,\n };\n } catch {\n return { ahead: 0, behind: 0 };\n }\n }\n\n private getSha(workingDir: string): string | null {\n try {\n const sha = execSync(\"git rev-parse --short=7 HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return sha || null;\n } catch {\n return null;\n }\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport class TmuxService {\n getSessionId(): string | null {\n try {\n if (!process.env.TMUX_PANE) {\n return null;\n }\n\n const sessionId = execSync(\"tmux display-message -p '#S'\", {\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return sessionId || null;\n } catch {\n return null;\n }\n }\n\n isInTmux(): boolean {\n return !!process.env.TMUX_PANE;\n }\n}\n","interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport function formatCost(cost: number | null): string {\n if (cost === null) return \"N/A\";\n if (cost < 0.01) return \"<$0.01\";\n return `$${cost.toFixed(2)}`;\n}\n\nexport function formatTokens(tokens: number | null): string {\n if (tokens === null) return \"N/A\";\n if (tokens === 0) return \"0 tokens\";\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M tokens`;\n } else if (tokens >= 1_000) {\n return `${(tokens / 1_000).toFixed(1)}K tokens`;\n }\n return `${tokens} tokens`;\n}\n\nexport function formatTokenBreakdown(breakdown: TokenBreakdown | null): string {\n if (!breakdown) return \"N/A\";\n\n const parts: string[] = [];\n\n if (breakdown.input > 0) {\n parts.push(`${formatTokens(breakdown.input).replace(\" tokens\", \"\")}in`);\n }\n\n if (breakdown.output > 0) {\n parts.push(`${formatTokens(breakdown.output).replace(\" tokens\", \"\")}out`);\n }\n\n if (breakdown.cacheCreation > 0 || breakdown.cacheRead > 0) {\n const totalCached = breakdown.cacheCreation + breakdown.cacheRead;\n parts.push(`${formatTokens(totalCached).replace(\" tokens\", \"\")}cached`);\n }\n\n return parts.length > 0 ? parts.join(\" + \") : \"0 tokens\";\n}\n\nexport function formatTimeRemaining(minutes: number): string {\n if (minutes <= 0) return \"0m\";\n\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n\n if (hours > 0) {\n return `${hours}h${mins > 0 ? ` ${mins}m` : \"\"}`;\n }\n\n return `${mins}m`;\n}\n","export interface BudgetStatus {\n percentage: number | null;\n isWarning: boolean;\n displayText: string;\n}\n\nexport function calculateBudgetPercentage(\n cost: number,\n budget: number | undefined\n): number | null {\n if (!budget || budget <= 0 || cost < 0) return null;\n return Math.min(100, (cost / budget) * 100);\n}\n\nexport function getBudgetStatus(\n cost: number,\n budget: number | undefined,\n warningThreshold = 80\n): BudgetStatus {\n const percentage = calculateBudgetPercentage(cost, budget);\n\n if (percentage === null) {\n return {\n percentage: null,\n isWarning: false,\n displayText: \"\",\n };\n }\n\n const percentStr = `${percentage.toFixed(0)}%`;\n const isWarning = percentage >= warningThreshold;\n\n let displayText = \"\";\n if (isWarning) {\n displayText = ` !${percentStr}`;\n } else if (percentage >= 50) {\n displayText = ` +${percentStr}`;\n } else {\n displayText = ` ${percentStr}`;\n }\n\n return {\n percentage,\n isWarning,\n displayText,\n };\n}\n","import type { PowerlineConfig } from \"../types/config\";\nimport type { ClaudeHookData, PowerlineColors } from \"../types\";\nimport {\n formatCost,\n formatTokens,\n formatTokenBreakdown,\n formatTimeRemaining,\n} from \"./formatters\";\nimport { getBudgetStatus } from \"./budget\";\nimport type {\n UsageInfo,\n SessionBlockInfo,\n TokenBreakdown,\n} from \"./usage-provider\";\nimport type { GitInfo } from \"./git-service\";\n\nexport interface PowerlineSymbols {\n right: string;\n branch: string;\n model: string;\n git_clean: string;\n git_dirty: string;\n git_conflicts: string;\n git_ahead: string;\n git_behind: string;\n session_cost: string;\n daily_cost: string;\n block_cost: string;\n}\n\nexport interface SegmentData {\n text: string;\n bgColor: string;\n fgColor: string;\n}\n\nexport class SegmentRenderer {\n constructor(\n private readonly config: PowerlineConfig,\n private readonly symbols: PowerlineSymbols\n ) {}\n\n renderDirectory(\n hookData: ClaudeHookData,\n colors: PowerlineColors\n ): SegmentData {\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n const projectDir = hookData.workspace?.project_dir;\n const dirName = this.getDisplayDirectoryName(currentDir, projectDir);\n\n return {\n text: dirName,\n bgColor: colors.modeBg,\n fgColor: colors.modeFg,\n };\n }\n\n renderGit(\n gitInfo: GitInfo,\n colors: PowerlineColors,\n showSha = false\n ): SegmentData | null {\n if (!gitInfo) return null;\n\n let gitStatusIcon = this.symbols.git_clean;\n if (gitInfo.status === \"conflicts\") {\n gitStatusIcon = this.symbols.git_conflicts;\n } else if (gitInfo.status === \"dirty\") {\n gitStatusIcon = this.symbols.git_dirty;\n }\n\n let text = `${this.symbols.branch} ${gitInfo.branch} ${gitStatusIcon}`;\n\n if (gitInfo.sha && showSha) {\n text += ` ${gitInfo.sha}`;\n }\n\n if (gitInfo.ahead > 0 && gitInfo.behind > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}${this.symbols.git_behind}${gitInfo.behind}`;\n } else if (gitInfo.ahead > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}`;\n } else if (gitInfo.behind > 0) {\n text += ` ${this.symbols.git_behind}${gitInfo.behind}`;\n }\n\n return {\n text,\n bgColor: colors.gitBg,\n fgColor: colors.gitFg,\n };\n }\n\n renderModel(hookData: ClaudeHookData, colors: PowerlineColors): SegmentData {\n const modelName = hookData.model?.display_name || \"Claude\";\n\n return {\n text: `${this.symbols.model} ${modelName}`,\n bgColor: colors.modelBg,\n fgColor: colors.modelFg,\n };\n }\n\n renderSession(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const sessionBudget = this.config.budget?.session;\n const text = `${this.symbols.session_cost} ${this.formatUsageWithBudget(\n usageInfo.session.cost,\n usageInfo.session.tokens,\n usageInfo.session.tokenBreakdown,\n type,\n sessionBudget?.amount,\n sessionBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.sessionBg,\n fgColor: colors.sessionFg,\n };\n }\n\n renderToday(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const todayBudget = this.config.budget?.today;\n const text = `Today ${this.formatUsageWithBudget(\n usageInfo.daily.cost,\n usageInfo.daily.tokens,\n usageInfo.daily.tokenBreakdown,\n type,\n todayBudget?.amount,\n todayBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.burnLowBg,\n fgColor: colors.burnFg,\n };\n }\n\n renderBlock(\n blockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData | null {\n if (!blockInfo) return null;\n\n const text = `${this.symbols.block_cost} ${this.formatSessionBlockInfo(blockInfo, type)}`;\n\n return {\n text,\n bgColor: colors.blockBg,\n fgColor: colors.blockFg,\n };\n }\n\n renderTmux(\n sessionId: string | null,\n colors: PowerlineColors\n ): SegmentData | null {\n if (!sessionId) return null;\n\n return {\n text: `tmux:${sessionId}`,\n bgColor: colors.tmuxBg,\n fgColor: colors.tmuxFg,\n };\n }\n\n private getDisplayDirectoryName(\n currentDir: string,\n projectDir?: string\n ): string {\n if (projectDir && projectDir !== currentDir) {\n const projectName = projectDir.split(\"/\").pop() || \"project\";\n const currentDirName = currentDir.split(\"/\").pop() || \"root\";\n\n if (currentDir.includes(projectDir)) {\n return `${projectName}/${currentDirName}`;\n }\n\n return currentDirName;\n }\n\n return currentDir.split(\"/\").pop() || \"root\";\n }\n\n private formatUsageDisplay(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string\n ): string {\n switch (type) {\n case \"cost\":\n return formatCost(cost);\n case \"tokens\":\n return formatTokens(tokens);\n case \"both\":\n return `${formatCost(cost)} (${formatTokens(tokens)})`;\n case \"breakdown\":\n return formatTokenBreakdown(tokenBreakdown);\n default:\n return formatCost(cost);\n }\n }\n\n private formatUsageWithBudget(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string,\n budget: number | undefined,\n warningThreshold = 80\n ): string {\n const baseDisplay = this.formatUsageDisplay(\n cost,\n tokens,\n tokenBreakdown,\n type\n );\n\n if (budget && budget > 0 && cost !== null) {\n const budgetStatus = getBudgetStatus(cost, budget, warningThreshold);\n return baseDisplay + budgetStatus.displayText;\n }\n\n return baseDisplay;\n }\n\n private formatSessionBlockInfo(\n blockInfo: SessionBlockInfo,\n type = \"cost\"\n ): string {\n if (!blockInfo.isActive) {\n return \"No active block\";\n }\n\n const timeStr = formatTimeRemaining(blockInfo.timeRemaining);\n\n if (type === \"tokens\") {\n const tokensStr = formatTokens(blockInfo.tokens);\n let result = `${tokensStr} (${timeStr} left)`;\n\n if (blockInfo.tokenBurnRate !== null && blockInfo.tokenBurnRate > 0) {\n const burnRateStr = `${formatTokens(blockInfo.tokenBurnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n } else {\n const costStr = formatCost(blockInfo.cost);\n let result = `${costStr} (${timeStr} left)`;\n\n if (blockInfo.burnRate !== null && blockInfo.burnRate > 0) {\n const burnRateStr = `${formatCost(blockInfo.burnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n }\n }\n}\n","import type { ClaudeHookData, PowerlineColors } from \"./types\";\nimport type {\n PowerlineConfig,\n LineConfig,\n AnySegmentConfig,\n GitSegmentConfig,\n UsageSegmentConfig,\n BlockSegmentConfig,\n} from \"./types/config\";\nimport { hexToAnsi, extractBgToFg } from \"./lib/colors\";\nimport { getTheme } from \"./themes\";\nimport {\n UsageProvider,\n UsageInfo,\n SessionBlockInfo,\n} from \"./lib/usage-provider\";\nimport { GitService } from \"./lib/git-service\";\nimport { TmuxService } from \"./lib/tmux-service\";\nimport { SegmentRenderer, PowerlineSymbols } from \"./lib/segment-renderer\";\n\nexport class PowerlineRenderer {\n private readonly symbols: PowerlineSymbols;\n private readonly usageProvider: UsageProvider;\n private readonly gitService: GitService;\n private readonly tmuxService: TmuxService;\n private readonly segmentRenderer: SegmentRenderer;\n\n constructor(private readonly config: PowerlineConfig) {\n this.symbols = this.initializeSymbols();\n this.usageProvider = new UsageProvider();\n this.gitService = new GitService();\n this.tmuxService = new TmuxService();\n this.segmentRenderer = new SegmentRenderer(config, this.symbols);\n }\n\n async generateStatusline(hookData: ClaudeHookData): Promise<string> {\n const usageInfo = await this.usageProvider.getUsageInfo(\n hookData.session_id\n );\n\n let sessionBlockInfo = null;\n if (this.needsSessionBlock()) {\n sessionBlockInfo = await this.usageProvider.getSessionBlockInfo();\n }\n\n const lines = this.config.display.lines\n .map((lineConfig) =>\n this.renderLine(lineConfig, hookData, usageInfo, sessionBlockInfo)\n )\n .filter((line) => line.length > 0);\n\n return lines.join(\"\\n\");\n }\n\n private needsSessionBlock(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.block?.enabled\n );\n }\n\n private renderLine(\n lineConfig: LineConfig,\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null\n ): string {\n const colors = this.getThemeColors();\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n\n const segments = Object.entries(lineConfig.segments)\n .filter(\n ([_, config]: [string, AnySegmentConfig | undefined]) => config?.enabled\n )\n .map(([type, config]: [string, AnySegmentConfig]) => ({ type, config }));\n\n let line = colors.reset;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (!segment) continue;\n\n const isLast = i === segments.length - 1;\n const nextSegment = !isLast ? segments[i + 1] : null;\n const nextBgColor = nextSegment\n ? this.getSegmentBgColor(nextSegment.type, colors)\n : \"\";\n\n const segmentData = this.renderSegment(\n segment,\n hookData,\n usageInfo,\n sessionBlockInfo,\n colors,\n currentDir\n );\n\n if (segmentData) {\n line += this.formatSegment(\n segmentData.bgColor,\n segmentData.fgColor,\n segmentData.text,\n isLast ? undefined : nextBgColor\n );\n }\n }\n\n return line;\n }\n\n private renderSegment(\n segment: { type: string; config: AnySegmentConfig },\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n currentDir: string\n ) {\n switch (segment.type) {\n case \"directory\":\n return this.segmentRenderer.renderDirectory(hookData, colors);\n\n case \"git\":\n const showSha = (segment.config as GitSegmentConfig)?.showSha || false;\n const gitInfo = this.gitService.getGitInfo(currentDir, showSha);\n return gitInfo\n ? this.segmentRenderer.renderGit(gitInfo, colors, showSha)\n : null;\n\n case \"model\":\n return this.segmentRenderer.renderModel(hookData, colors);\n\n case \"session\":\n const usageType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderSession(usageInfo, colors, usageType);\n\n case \"today\":\n const todayType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderToday(usageInfo, colors, todayType);\n\n case \"block\":\n const blockType =\n (segment.config as BlockSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderBlock(\n sessionBlockInfo,\n colors,\n blockType\n );\n\n case \"tmux\":\n const tmuxSessionId = this.tmuxService.getSessionId();\n return this.segmentRenderer.renderTmux(tmuxSessionId, colors);\n\n default:\n return null;\n }\n }\n\n private initializeSymbols(): PowerlineSymbols {\n const isMinimalStyle = this.config.display.style === \"minimal\";\n\n return {\n right: isMinimalStyle ? \"\" : \"\\uE0B0\",\n branch: \"⑂\",\n model: \"⚡\",\n git_clean: \"✓\",\n git_dirty: \"●\",\n git_conflicts: \"⚠\",\n git_ahead: \"↑\",\n git_behind: \"↓\",\n session_cost: \"Session\",\n daily_cost: \"Today\",\n block_cost: \"Block\",\n };\n }\n\n private getThemeColors(): PowerlineColors {\n const theme = this.config.theme;\n let colorTheme;\n\n if (theme === \"custom\") {\n colorTheme = this.config.colors?.custom;\n if (!colorTheme) {\n throw new Error(\n \"Custom theme selected but no colors provided in configuration\"\n );\n }\n } else {\n colorTheme = getTheme(theme);\n if (!colorTheme) {\n console.warn(\n `Built-in theme '${theme}' not found, falling back to 'dark' theme`\n );\n colorTheme = getTheme(\"dark\")!;\n }\n }\n\n return {\n reset: \"\\x1b[0m\",\n modeBg: hexToAnsi(colorTheme.directory.bg, true),\n modeFg: hexToAnsi(colorTheme.directory.fg, false),\n gitBg: hexToAnsi(colorTheme.git.bg, true),\n gitFg: hexToAnsi(colorTheme.git.fg, false),\n modelBg: hexToAnsi(colorTheme.model.bg, true),\n modelFg: hexToAnsi(colorTheme.model.fg, false),\n sessionBg: hexToAnsi(colorTheme.session.bg, true),\n sessionFg: hexToAnsi(colorTheme.session.fg, false),\n todayBg: hexToAnsi(colorTheme.today.bg, true),\n todayFg: hexToAnsi(colorTheme.today.fg, false),\n blockBg: hexToAnsi(colorTheme.block.bg, true),\n blockFg: hexToAnsi(colorTheme.block.fg, false),\n burnLowBg: hexToAnsi(colorTheme.today.bg, true),\n burnFg: hexToAnsi(colorTheme.today.fg, false),\n tmuxBg: hexToAnsi(colorTheme.tmux.bg, true),\n tmuxFg: hexToAnsi(colorTheme.tmux.fg, false),\n };\n }\n\n private getSegmentBgColor(\n segmentType: string,\n colors: PowerlineColors\n ): string {\n switch (segmentType) {\n case \"directory\":\n return colors.modeBg;\n case \"git\":\n return colors.gitBg;\n case \"model\":\n return colors.modelBg;\n case \"session\":\n return colors.sessionBg;\n case \"today\":\n return colors.burnLowBg;\n case \"block\":\n return colors.blockBg;\n case \"tmux\":\n return colors.tmuxBg;\n default:\n return colors.modeBg;\n }\n }\n\n private formatSegment(\n bgColor: string,\n fgColor: string,\n text: string,\n nextBgColor?: string\n ): string {\n let output = `${bgColor}${fgColor} ${text} `;\n\n const reset = \"\\x1b[0m\";\n\n if (nextBgColor) {\n const arrowFgColor = extractBgToFg(bgColor);\n output += `${reset}${nextBgColor}${arrowFgColor}${this.symbols.right}`;\n } else {\n output += `${reset}${extractBgToFg(bgColor)}${this.symbols.right}${reset}`;\n }\n\n return output;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { PowerlineConfig, ConfigLoadOptions } from \"../types/config\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\n\nfunction deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n const sourceValue = source[key];\n if (sourceValue !== undefined) {\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue)\n ) {\n const targetValue = result[key] || {};\n result[key] = deepMerge(\n targetValue as Record<string, any>,\n sourceValue as Record<string, any>\n ) as T[Extract<keyof T, string>];\n } else if (Array.isArray(sourceValue) && sourceValue.length === 0) {\n const targetValue = result[key];\n if (!Array.isArray(targetValue) || targetValue.length > 0) {\n continue;\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nfunction findConfigFile(\n customPath?: string,\n projectDir?: string\n): string | null {\n if (customPath) {\n return fs.existsSync(customPath) ? customPath : null;\n }\n\n const locations = [\n ...(projectDir ? [path.join(projectDir, \".claude-powerline.json\")] : []),\n path.join(process.cwd(), \".claude-powerline.json\"),\n path.join(os.homedir(), \".claude\", \"claude-powerline.json\"),\n path.join(os.homedir(), \".config\", \"claude-powerline\", \"config.json\"),\n ];\n\n return locations.find(fs.existsSync) || null;\n}\n\nfunction loadConfigFile(filePath: string): Partial<PowerlineConfig> {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Failed to load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction loadEnvConfig(): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n if (process.env.CLAUDE_POWERLINE_THEME) {\n config.theme = process.env.CLAUDE_POWERLINE_THEME as\n | \"light\"\n | \"dark\"\n | \"custom\";\n }\n\n if (process.env.CLAUDE_POWERLINE_STYLE) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n const style = process.env.CLAUDE_POWERLINE_STYLE;\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from environment variable, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n\n if (process.env.CLAUDE_POWERLINE_USAGE_TYPE) {\n const usageType = process.env.CLAUDE_POWERLINE_USAGE_TYPE as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if ([\"cost\", \"tokens\", \"both\", \"breakdown\"].includes(usageType)) {\n config.usageType = usageType;\n }\n }\n\n return config;\n}\n\nfunction getConfigPathFromEnv(): string | undefined {\n return process.env.CLAUDE_POWERLINE_CONFIG;\n}\n\nfunction parseCLIOverrides(args: string[]): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n const themeIndex = args.findIndex((arg) => arg.startsWith(\"--theme=\"));\n if (themeIndex !== -1) {\n const theme = args[themeIndex]?.split(\"=\")[1];\n if (theme) {\n config.theme = theme as \"light\" | \"dark\" | \"custom\";\n }\n }\n\n const styleIndex = args.findIndex((arg) => arg.startsWith(\"--style=\"));\n if (styleIndex !== -1) {\n const style = args[styleIndex]?.split(\"=\")[1];\n if (style) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from CLI argument, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n }\n\n const dailyBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--daily-budget=\")\n );\n if (dailyBudgetIndex !== -1) {\n const dailyBudget = parseFloat(args[dailyBudgetIndex]?.split(\"=\")[1] || \"\");\n if (!isNaN(dailyBudget) && dailyBudget > 0) {\n config.budget = {\n ...config.budget,\n today: {\n ...DEFAULT_CONFIG.budget?.today,\n amount: dailyBudget,\n },\n };\n }\n }\n\n const sessionBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--session-budget=\")\n );\n if (sessionBudgetIndex !== -1) {\n const sessionBudget = parseFloat(\n args[sessionBudgetIndex]?.split(\"=\")[1] || \"\"\n );\n if (!isNaN(sessionBudget) && sessionBudget > 0) {\n config.budget = {\n ...config.budget,\n session: {\n ...DEFAULT_CONFIG.budget?.session,\n amount: sessionBudget,\n },\n };\n }\n }\n\n const usageIndex = args.findIndex((arg) => arg.startsWith(\"--usage=\"));\n if (usageIndex !== -1) {\n const usageType = args[usageIndex]?.split(\"=\")[1] as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if (\n usageType &&\n [\"cost\", \"tokens\", \"both\", \"breakdown\"].includes(usageType)\n ) {\n config.usageType = usageType;\n }\n }\n\n return config;\n}\n\nexport function loadConfig(options: ConfigLoadOptions = {}): PowerlineConfig {\n const {\n configPath,\n ignoreEnvVars = false,\n cliOverrides = {},\n projectDir,\n } = options;\n\n let config: PowerlineConfig = JSON.parse(JSON.stringify(DEFAULT_CONFIG));\n\n const configFile = findConfigFile(configPath, projectDir);\n if (configFile) {\n try {\n const fileConfig = loadConfigFile(configFile);\n config = deepMerge(config, fileConfig);\n } catch (err) {\n console.warn(\n `Warning: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n if (\n config.display?.style &&\n config.display.style !== \"minimal\" &&\n config.display.style !== \"powerline\"\n ) {\n console.warn(\n `Invalid display style '${config.display.style}' in config file, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n\n if (!ignoreEnvVars) {\n const envConfig = loadEnvConfig();\n config = deepMerge(config, envConfig);\n }\n\n config = deepMerge(config, cliOverrides);\n\n if (config.usageType) {\n config.display.lines.forEach((line) => {\n if (line.segments.session) {\n line.segments.session.type = config.usageType!;\n }\n if (line.segments.today) {\n line.segments.today.type = config.usageType!;\n }\n if (line.segments.block) {\n line.segments.block.type =\n config.usageType === \"breakdown\" || config.usageType === \"both\"\n ? \"cost\"\n : config.usageType!;\n }\n });\n delete config.usageType;\n }\n\n return config;\n}\n\nexport function loadConfigFromCLI(\n args: string[] = process.argv,\n projectDir?: string\n): PowerlineConfig {\n const configPathIndex = args.findIndex((arg) => arg.startsWith(\"--config=\"));\n const configPath =\n configPathIndex !== -1\n ? args[configPathIndex]?.split(\"=\")[1]\n : getConfigPathFromEnv();\n\n const cliOverrides = parseCLIOverrides(args);\n\n return loadConfig({ configPath, cliOverrides, projectDir });\n}\n\nexport function getConfigPath(\n customPath?: string,\n projectDir?: string\n): string | null {\n return findConfigFile(customPath, projectDir);\n}\n","import type { PowerlineConfig } from \"../types/config\";\n\nexport const DEFAULT_CONFIG: PowerlineConfig = {\n theme: \"dark\",\n display: {\n style: \"minimal\",\n lines: [\n {\n segments: {\n directory: { enabled: true },\n git: {\n enabled: true,\n showSha: false,\n },\n model: { enabled: true },\n session: { enabled: true, type: \"tokens\" },\n today: { enabled: true, type: \"both\" },\n block: { enabled: false, type: \"cost\" },\n tmux: { enabled: false },\n },\n },\n ],\n },\n budget: {\n session: {\n warningThreshold: 80,\n },\n today: {\n amount: 50,\n warningThreshold: 80,\n },\n },\n};\n"],"mappings":"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","names":["process","path","fs","execSync","os","execSync","fs","path","fs","path","os","path","fs","execSync","process"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owloops/claude-powerline",
3
- "version": "1.1.13",
3
+ "version": "1.1.15",
4
4
  "description": "Beautiful vim-style powerline statusline for Claude Code with real-time cost tracking, git integration, and custom themes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",