claude-limitline 1.4.0 → 1.5.0

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.
Files changed (2) hide show
  1. package/dist/index.js +74 -7
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -44,6 +44,9 @@ var DEFAULT_CONFIG = {
44
44
  showWeekProgress: true,
45
45
  viewMode: "simple"
46
46
  },
47
+ context: {
48
+ enabled: true
49
+ },
47
50
  budget: {
48
51
  pollInterval: 15,
49
52
  warningThreshold: 80
@@ -535,6 +538,8 @@ var darkTheme = {
535
538
  // Purple for Opus
536
539
  sonnet: { bg: "#1a1a1a", fg: "#89ddff" },
537
540
  // Light blue for Sonnet
541
+ context: { bg: "#2a2a2a", fg: "#87ceeb" },
542
+ // Sky blue for context
538
543
  warning: { bg: "#d75f00", fg: "#ffffff" },
539
544
  critical: { bg: "#af0000", fg: "#ffffff" }
540
545
  };
@@ -548,6 +553,8 @@ var lightTheme = {
548
553
  // Purple for Opus
549
554
  sonnet: { bg: "#0ea5e9", fg: "#ffffff" },
550
555
  // Sky blue for Sonnet
556
+ context: { bg: "#6366f1", fg: "#ffffff" },
557
+ // Indigo for context
551
558
  warning: { bg: "#f59e0b", fg: "#000000" },
552
559
  critical: { bg: "#ef4444", fg: "#ffffff" }
553
560
  };
@@ -561,6 +568,8 @@ var nordTheme = {
561
568
  // Nord purple for Opus
562
569
  sonnet: { bg: "#2e3440", fg: "#88c0d0" },
563
570
  // Nord frost for Sonnet
571
+ context: { bg: "#3b4252", fg: "#81a1c1" },
572
+ // Nord frost for context
564
573
  warning: { bg: "#d08770", fg: "#2e3440" },
565
574
  critical: { bg: "#bf616a", fg: "#eceff4" }
566
575
  };
@@ -574,6 +583,8 @@ var gruvboxTheme = {
574
583
  // Gruvbox purple for Opus
575
584
  sonnet: { bg: "#282828", fg: "#8ec07c" },
576
585
  // Gruvbox aqua for Sonnet
586
+ context: { bg: "#3c3836", fg: "#83a598" },
587
+ // Gruvbox blue for context
577
588
  warning: { bg: "#d79921", fg: "#282828" },
578
589
  critical: { bg: "#cc241d", fg: "#ebdbb2" }
579
590
  };
@@ -587,6 +598,8 @@ var tokyoNightTheme = {
587
598
  // Tokyo purple for Opus
588
599
  sonnet: { bg: "#1a202c", fg: "#7dcfff" },
589
600
  // Tokyo cyan for Sonnet
601
+ context: { bg: "#2d3748", fg: "#7aa2f7" },
602
+ // Tokyo blue for context
590
603
  warning: { bg: "#e0af68", fg: "#1a1b26" },
591
604
  critical: { bg: "#f7768e", fg: "#1a1b26" }
592
605
  };
@@ -600,6 +613,8 @@ var rosePineTheme = {
600
613
  // Rose Pine iris for Opus
601
614
  sonnet: { bg: "#232136", fg: "#31748f" },
602
615
  // Rose Pine pine for Sonnet
616
+ context: { bg: "#2a273f", fg: "#9ccfd8" },
617
+ // Rose Pine foam for context
603
618
  warning: { bg: "#f6c177", fg: "#191724" },
604
619
  critical: { bg: "#eb6f92", fg: "#191724" }
605
620
  };
@@ -639,9 +654,12 @@ var Renderer = class {
639
654
  sonnet: symbolSet.sonnet_cost,
640
655
  bottleneck: symbolSet.bottleneck,
641
656
  rightArrow: symbolSet.right,
657
+ leftArrow: symbolSet.left,
642
658
  separator: symbolSet.separator,
643
659
  branch: symbolSet.branch,
644
660
  model: symbolSet.model,
661
+ context: "\u25D0",
662
+ // Half-filled circle for context
645
663
  progressFull: symbolSet.progress_full,
646
664
  progressEmpty: symbolSet.progress_empty,
647
665
  trendUp: "\u2191",
@@ -704,6 +722,18 @@ var Renderer = class {
704
722
  output += RESET_CODE;
705
723
  return output;
706
724
  }
725
+ renderRightPowerline(segments) {
726
+ if (segments.length === 0) return "";
727
+ let output = "";
728
+ for (let i = 0; i < segments.length; i++) {
729
+ const seg = segments[i];
730
+ output += RESET_CODE;
731
+ output += ansi.fg(seg.colors.bg) + this.symbols.leftArrow;
732
+ output += ansi.bg(seg.colors.bg) + ansi.fg(seg.colors.fg) + seg.text;
733
+ }
734
+ output += RESET_CODE;
735
+ return output;
736
+ }
707
737
  renderFallback(segments) {
708
738
  return segments.map((seg) => ansi.bg(seg.colors.bg) + ansi.fg(seg.colors.fg) + seg.text + RESET_CODE).join(` ${this.symbols.separator} `);
709
739
  }
@@ -857,6 +887,18 @@ var Renderer = class {
857
887
  return this.renderWeeklySimple(ctx);
858
888
  }
859
889
  }
890
+ renderContext(ctx) {
891
+ if (!this.config.context?.enabled) {
892
+ return null;
893
+ }
894
+ const percent = ctx.envInfo.contextPercent;
895
+ const icon = this.usePowerline ? this.symbols.context : "CTX";
896
+ const colors = this.getColorsForPercent(percent, this.theme.context);
897
+ return {
898
+ text: ` ${icon} ${percent}% `,
899
+ colors
900
+ };
901
+ }
860
902
  getSegment(name, ctx) {
861
903
  switch (name) {
862
904
  case "directory":
@@ -869,6 +911,8 @@ var Renderer = class {
869
911
  return this.renderBlock(ctx);
870
912
  case "weekly":
871
913
  return this.renderWeekly(ctx);
914
+ case "context":
915
+ return this.renderContext(ctx);
872
916
  default:
873
917
  return null;
874
918
  }
@@ -882,22 +926,35 @@ var Renderer = class {
882
926
  trendInfo,
883
927
  compact
884
928
  };
885
- const segments = [];
929
+ const leftSegments = [];
886
930
  const order = this.config.segmentOrder ?? ["directory", "git", "model", "block", "weekly"];
887
931
  for (const name of order) {
932
+ if (name === "context") continue;
888
933
  const segment = this.getSegment(name, ctx);
889
934
  if (segment) {
890
- segments.push(segment);
935
+ leftSegments.push(segment);
891
936
  }
892
937
  }
893
- if (segments.length === 0) {
894
- return "";
938
+ const rightSegments = [];
939
+ const contextSegment = this.renderContext(ctx);
940
+ if (contextSegment) {
941
+ rightSegments.push(contextSegment);
895
942
  }
943
+ let output = "";
896
944
  if (this.usePowerline) {
897
- return this.renderPowerline(segments);
945
+ if (leftSegments.length > 0) {
946
+ output += this.renderPowerline(leftSegments);
947
+ }
948
+ if (rightSegments.length > 0) {
949
+ output += this.renderRightPowerline(rightSegments);
950
+ }
898
951
  } else {
899
- return this.renderFallback(segments);
952
+ const allSegments = [...leftSegments, ...rightSegments];
953
+ if (allSegments.length > 0) {
954
+ output = this.renderFallback(allSegments);
955
+ }
900
956
  }
957
+ return output;
901
958
  }
902
959
  };
903
960
 
@@ -1023,12 +1080,22 @@ function getClaudeModel(hookData) {
1023
1080
  }
1024
1081
  return null;
1025
1082
  }
1083
+ function getContextPercent(hookData) {
1084
+ const ctx = hookData?.context_window;
1085
+ if (!ctx?.current_usage || !ctx.context_window_size) {
1086
+ return 0;
1087
+ }
1088
+ const usage = ctx.current_usage;
1089
+ const totalTokens = (usage.input_tokens || 0) + (usage.cache_creation_input_tokens || 0) + (usage.cache_read_input_tokens || 0);
1090
+ return Math.round(totalTokens / ctx.context_window_size * 100);
1091
+ }
1026
1092
  function getEnvironmentInfo(hookData) {
1027
1093
  return {
1028
1094
  directory: getDirectoryName(hookData),
1029
1095
  gitBranch: getGitBranch(),
1030
1096
  gitDirty: hasGitChanges(),
1031
- model: getClaudeModel(hookData)
1097
+ model: getClaudeModel(hookData),
1098
+ contextPercent: getContextPercent(hookData)
1032
1099
  };
1033
1100
  }
1034
1101
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-limitline",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "A statusline for Claude Code showing real-time usage limits and weekly tracking",
5
5
  "main": "dist/index.js",
6
6
  "bin": {