claude-scope 0.1.2 → 0.1.4

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 (92) hide show
  1. package/dist/constants.d.ts +56 -0
  2. package/dist/constants.d.ts.map +1 -0
  3. package/dist/constants.js +57 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/core/renderer.d.ts +33 -3
  6. package/dist/core/renderer.d.ts.map +1 -1
  7. package/dist/core/renderer.js +49 -7
  8. package/dist/core/renderer.js.map +1 -1
  9. package/dist/core/stdin-data-widget.d.ts +85 -0
  10. package/dist/core/stdin-data-widget.d.ts.map +1 -0
  11. package/dist/core/stdin-data-widget.js +75 -0
  12. package/dist/core/stdin-data-widget.js.map +1 -0
  13. package/dist/core/widget-types.d.ts +30 -0
  14. package/dist/core/widget-types.d.ts.map +1 -0
  15. package/dist/core/widget-types.js +30 -0
  16. package/dist/core/widget-types.js.map +1 -0
  17. package/dist/data/stdin-provider.d.ts +44 -0
  18. package/dist/data/stdin-provider.d.ts.map +1 -0
  19. package/dist/data/stdin-provider.js +83 -0
  20. package/dist/data/stdin-provider.js.map +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +64 -21
  23. package/dist/index.js.map +1 -1
  24. package/dist/providers/git-provider.d.ts +55 -32
  25. package/dist/providers/git-provider.d.ts.map +1 -1
  26. package/dist/providers/git-provider.js +63 -40
  27. package/dist/providers/git-provider.js.map +1 -1
  28. package/dist/providers/stdin-provider.d.ts +16 -15
  29. package/dist/providers/stdin-provider.d.ts.map +1 -1
  30. package/dist/providers/stdin-provider.js +35 -66
  31. package/dist/providers/stdin-provider.js.map +1 -1
  32. package/dist/schemas/stdin-schema.d.ts +123 -0
  33. package/dist/schemas/stdin-schema.d.ts.map +1 -0
  34. package/dist/schemas/stdin-schema.js +81 -0
  35. package/dist/schemas/stdin-schema.js.map +1 -0
  36. package/dist/types.d.ts +13 -15
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/types.js +3 -0
  39. package/dist/types.js.map +1 -1
  40. package/dist/ui/utils/colors.d.ts +52 -0
  41. package/dist/ui/utils/colors.d.ts.map +1 -0
  42. package/dist/ui/utils/colors.js +54 -0
  43. package/dist/ui/utils/colors.js.map +1 -0
  44. package/dist/ui/utils/formatters.d.ts +56 -0
  45. package/dist/ui/utils/formatters.d.ts.map +1 -0
  46. package/dist/ui/utils/formatters.js +114 -0
  47. package/dist/ui/utils/formatters.js.map +1 -0
  48. package/dist/utils/colors.d.ts +16 -0
  49. package/dist/utils/colors.d.ts.map +1 -1
  50. package/dist/utils/colors.js +18 -0
  51. package/dist/utils/colors.js.map +1 -1
  52. package/dist/utils/formatters.d.ts +56 -0
  53. package/dist/utils/formatters.d.ts.map +1 -0
  54. package/dist/utils/formatters.js +114 -0
  55. package/dist/utils/formatters.js.map +1 -0
  56. package/dist/widgets/context-widget.d.ts +13 -0
  57. package/dist/widgets/context-widget.d.ts.map +1 -0
  58. package/dist/widgets/context-widget.js +31 -0
  59. package/dist/widgets/context-widget.js.map +1 -0
  60. package/dist/widgets/core/stdin-data-widget.d.ts +93 -0
  61. package/dist/widgets/core/stdin-data-widget.d.ts.map +1 -0
  62. package/dist/widgets/core/stdin-data-widget.js +84 -0
  63. package/dist/widgets/core/stdin-data-widget.js.map +1 -0
  64. package/dist/widgets/cost-widget.d.ts +13 -0
  65. package/dist/widgets/cost-widget.d.ts.map +1 -0
  66. package/dist/widgets/cost-widget.js +18 -0
  67. package/dist/widgets/cost-widget.js.map +1 -0
  68. package/dist/widgets/duration-widget.d.ts +13 -0
  69. package/dist/widgets/duration-widget.d.ts.map +1 -0
  70. package/dist/widgets/duration-widget.js +18 -0
  71. package/dist/widgets/duration-widget.js.map +1 -0
  72. package/dist/widgets/git/git-changes-widget.d.ts +38 -0
  73. package/dist/widgets/git/git-changes-widget.d.ts.map +1 -0
  74. package/dist/widgets/git/git-changes-widget.js +91 -0
  75. package/dist/widgets/git/git-changes-widget.js.map +1 -0
  76. package/dist/widgets/git/git-widget.d.ts +37 -0
  77. package/dist/widgets/git/git-widget.d.ts.map +1 -0
  78. package/dist/widgets/git/git-widget.js +67 -0
  79. package/dist/widgets/git/git-widget.js.map +1 -0
  80. package/dist/widgets/git-changes-widget.d.ts +16 -0
  81. package/dist/widgets/git-changes-widget.d.ts.map +1 -0
  82. package/dist/widgets/git-changes-widget.js +37 -0
  83. package/dist/widgets/git-changes-widget.js.map +1 -0
  84. package/dist/widgets/git-widget.d.ts +8 -2
  85. package/dist/widgets/git-widget.d.ts.map +1 -1
  86. package/dist/widgets/git-widget.js +9 -9
  87. package/dist/widgets/git-widget.js.map +1 -1
  88. package/dist/widgets/model-widget.d.ts +13 -0
  89. package/dist/widgets/model-widget.d.ts.map +1 -0
  90. package/dist/widgets/model-widget.js +15 -0
  91. package/dist/widgets/model-widget.js.map +1 -0
  92. package/package.json +14 -6
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Formatter utilities for displaying data in human-readable formats
3
+ */
4
+ /**
5
+ * Format milliseconds to human-readable duration
6
+ *
7
+ * Examples:
8
+ * - 45000 -> "45s"
9
+ * - 60000 -> "1m 0s"
10
+ * - 3600000 -> "1h 0m 0s"
11
+ * - 3665000 -> "1h 1m 5s"
12
+ *
13
+ * @param ms - Duration in milliseconds
14
+ * @returns Human-readable duration string
15
+ */
16
+ export declare function formatDuration(ms: number): string;
17
+ /**
18
+ * Format cost in USD with appropriate precision
19
+ *
20
+ * - Values < $0.01 (positive): 4 decimal places ($0.0012)
21
+ * - Values >= $0.01: 2 decimal places ($1.23)
22
+ * - Values >= $100: 0 decimal places ($123)
23
+ * - Negative values: 2 decimal places ($-1.23)
24
+ *
25
+ * @param usd - Cost in USD
26
+ * @returns Formatted cost string with $ prefix
27
+ */
28
+ export declare function formatCostUSD(usd: number): string;
29
+ /**
30
+ * Create a visual progress bar
31
+ *
32
+ * @param percent - Percentage (0-100)
33
+ * @param width - Bar width in characters (default: DEFAULTS.PROGRESS_BAR_WIDTH)
34
+ * @returns Progress bar string like "████████░░░░░░░░░░░░"
35
+ */
36
+ export declare function progressBar(percent: number, width?: number): string;
37
+ /**
38
+ * Get color code for context percentage
39
+ *
40
+ * - <50%: green (low usage)
41
+ * - 50-79%: yellow (medium usage)
42
+ * - >=80%: red (high usage)
43
+ *
44
+ * @param percent - Context usage percentage (0-100)
45
+ * @returns ANSI color code
46
+ */
47
+ export declare function getContextColor(percent: number): string;
48
+ /**
49
+ * Colorize text with ANSI color code
50
+ *
51
+ * @param text - Text to colorize
52
+ * @param color - ANSI color code
53
+ * @returns Colorized text with reset code
54
+ */
55
+ export declare function colorize(text: string, color: string): string;
56
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAsBjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBjD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAoC,GAAG,MAAM,CAKhG;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUvD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Formatter utilities for displaying data in human-readable formats
3
+ */
4
+ import { TIME, COST_THRESHOLDS, CONTEXT_THRESHOLDS, ANSI_COLORS, DEFAULTS } from '../constants.js';
5
+ /**
6
+ * Format milliseconds to human-readable duration
7
+ *
8
+ * Examples:
9
+ * - 45000 -> "45s"
10
+ * - 60000 -> "1m 0s"
11
+ * - 3600000 -> "1h 0m 0s"
12
+ * - 3665000 -> "1h 1m 5s"
13
+ *
14
+ * @param ms - Duration in milliseconds
15
+ * @returns Human-readable duration string
16
+ */
17
+ export function formatDuration(ms) {
18
+ if (ms <= 0)
19
+ return '0s';
20
+ const seconds = Math.floor(ms / TIME.MS_PER_SECOND);
21
+ const hours = Math.floor(seconds / TIME.SECONDS_PER_HOUR);
22
+ const minutes = Math.floor((seconds % TIME.SECONDS_PER_HOUR) / TIME.SECONDS_PER_MINUTE);
23
+ const secs = seconds % TIME.SECONDS_PER_MINUTE;
24
+ const parts = [];
25
+ if (hours > 0) {
26
+ parts.push(`${hours}h`);
27
+ parts.push(`${minutes}m`);
28
+ parts.push(`${secs}s`);
29
+ }
30
+ else if (minutes > 0) {
31
+ parts.push(`${minutes}m`);
32
+ parts.push(`${secs}s`);
33
+ }
34
+ else {
35
+ parts.push(`${secs}s`);
36
+ }
37
+ return parts.join(' ');
38
+ }
39
+ /**
40
+ * Format cost in USD with appropriate precision
41
+ *
42
+ * - Values < $0.01 (positive): 4 decimal places ($0.0012)
43
+ * - Values >= $0.01: 2 decimal places ($1.23)
44
+ * - Values >= $100: 0 decimal places ($123)
45
+ * - Negative values: 2 decimal places ($-1.23)
46
+ *
47
+ * @param usd - Cost in USD
48
+ * @returns Formatted cost string with $ prefix
49
+ */
50
+ export function formatCostUSD(usd) {
51
+ const absUsd = Math.abs(usd);
52
+ if (usd < 0) {
53
+ // Negative values: 2 decimal places
54
+ return `$${usd.toFixed(2)}`;
55
+ }
56
+ else if (absUsd < COST_THRESHOLDS.SMALL) {
57
+ // 4 decimal places for very small positive values
58
+ return `$${usd.toFixed(4)}`;
59
+ }
60
+ else if (absUsd < COST_THRESHOLDS.LARGE) {
61
+ // 2 decimal places for normal values
62
+ return `$${usd.toFixed(2)}`;
63
+ }
64
+ else {
65
+ // 0 decimal places for large values
66
+ return `$${Math.floor(usd).toFixed(0)}`;
67
+ }
68
+ }
69
+ /**
70
+ * Create a visual progress bar
71
+ *
72
+ * @param percent - Percentage (0-100)
73
+ * @param width - Bar width in characters (default: DEFAULTS.PROGRESS_BAR_WIDTH)
74
+ * @returns Progress bar string like "████████░░░░░░░░░░░░"
75
+ */
76
+ export function progressBar(percent, width = DEFAULTS.PROGRESS_BAR_WIDTH) {
77
+ const clampedPercent = Math.max(0, Math.min(100, percent));
78
+ const filled = Math.round((clampedPercent / 100) * width);
79
+ const empty = width - filled;
80
+ return '█'.repeat(filled) + '░'.repeat(empty);
81
+ }
82
+ /**
83
+ * Get color code for context percentage
84
+ *
85
+ * - <50%: green (low usage)
86
+ * - 50-79%: yellow (medium usage)
87
+ * - >=80%: red (high usage)
88
+ *
89
+ * @param percent - Context usage percentage (0-100)
90
+ * @returns ANSI color code
91
+ */
92
+ export function getContextColor(percent) {
93
+ const clampedPercent = Math.max(0, Math.min(100, percent));
94
+ if (clampedPercent < CONTEXT_THRESHOLDS.LOW_MEDIUM) {
95
+ return ANSI_COLORS.GREEN;
96
+ }
97
+ else if (clampedPercent < CONTEXT_THRESHOLDS.MEDIUM_HIGH) {
98
+ return ANSI_COLORS.YELLOW;
99
+ }
100
+ else {
101
+ return ANSI_COLORS.RED;
102
+ }
103
+ }
104
+ /**
105
+ * Colorize text with ANSI color code
106
+ *
107
+ * @param text - Text to colorize
108
+ * @param color - ANSI color code
109
+ * @returns Colorized text with reset code
110
+ */
111
+ export function colorize(text, color) {
112
+ return `${color}${text}${ANSI_COLORS.RESET}`;
113
+ }
114
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Context Widget
3
+ *
4
+ * Displays context window usage with progress bar
5
+ */
6
+ import { StdinDataWidget } from './core/stdin-data-widget.js';
7
+ import type { RenderContext, StdinData } from '../types.js';
8
+ export declare class ContextWidget extends StdinDataWidget {
9
+ readonly id = "context";
10
+ readonly metadata: import("../core/types.js").IWidgetMetadata;
11
+ protected renderWithData(data: StdinData, context: RenderContext): string | null;
12
+ }
13
+ //# sourceMappingURL=context-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/context-widget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,qBAAa,aAAc,SAAQ,eAAe;IAChD,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,QAAQ,6CAGf;IAEF,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI;CAqBjF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Context Widget
3
+ *
4
+ * Displays context window usage with progress bar
5
+ */
6
+ import { StdinDataWidget } from './core/stdin-data-widget.js';
7
+ import { createWidgetMetadata } from '../core/widget-types.js';
8
+ import { progressBar, getContextColor, colorize } from '../ui/utils/formatters.js';
9
+ import { DEFAULTS } from '../constants.js';
10
+ export class ContextWidget extends StdinDataWidget {
11
+ id = 'context';
12
+ metadata = createWidgetMetadata('Context', 'Displays context window usage with progress bar');
13
+ renderWithData(data, context) {
14
+ const { current_usage, context_window_size } = data.context_window;
15
+ if (!current_usage)
16
+ return null;
17
+ // Calculate actual context usage:
18
+ // - input_tokens: new tokens added to context
19
+ // - cache_creation_input_tokens: tokens spent creating cache (also in context)
20
+ // - cache_read_input_tokens: NOT counted (reading from cache doesn't use context space)
21
+ // - output_tokens: tokens in the response (also part of context)
22
+ const used = current_usage.input_tokens +
23
+ current_usage.cache_creation_input_tokens +
24
+ current_usage.output_tokens;
25
+ const percent = Math.round((used / context_window_size) * 100);
26
+ const bar = progressBar(percent, DEFAULTS.PROGRESS_BAR_WIDTH);
27
+ const color = getContextColor(percent);
28
+ return colorize(`[${bar}] ${percent}%`, color);
29
+ }
30
+ }
31
+ //# sourceMappingURL=context-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-widget.js","sourceRoot":"","sources":["../../src/widgets/context-widget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,MAAM,OAAO,aAAc,SAAQ,eAAe;IACvC,EAAE,GAAG,SAAS,CAAC;IACf,QAAQ,GAAG,oBAAoB,CACtC,SAAS,EACT,iDAAiD,CAClD,CAAC;IAEQ,cAAc,CAAC,IAAe,EAAE,OAAsB;QAC9D,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAEnE,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAEhC,kCAAkC;QAClC,8CAA8C;QAC9C,+EAA+E;QAC/E,wFAAwF;QACxF,iEAAiE;QACjE,MAAM,IAAI,GAAG,aAAa,CAAC,YAAY;YAC1B,aAAa,CAAC,2BAA2B;YACzC,aAAa,CAAC,aAAa,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,mBAAmB,CAAC,GAAG,GAAG,CAAC,CAAC;QAE/D,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAEvC,OAAO,QAAQ,CAAC,IAAI,GAAG,KAAK,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Base class for widgets that receive StdinData
3
+ *
4
+ * Uses Template Method Pattern for state management.
5
+ *
6
+ * Extending widgets only need to implement renderWithData() method.
7
+ * The base class handles data storage, update logic, and enables checking.
8
+ */
9
+ import type { IWidget, IWidgetMetadata, WidgetContext, RenderContext } from '../../core/types.js';
10
+ import type { StdinData } from '../../types.js';
11
+ /**
12
+ * Abstract base class for widgets working with StdinData
13
+ *
14
+ * Uses Template Method Pattern:
15
+ * - render() is final template method that handles null checks
16
+ * - Subclasses implement renderWithData() hook with data as parameter
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * export class ModelWidget extends StdinDataWidget {
21
+ * readonly id = 'model';
22
+ * readonly metadata = createWidgetMetadata('Model', 'Displays Claude model');
23
+ *
24
+ * protected renderWithData(data: StdinData, context: RenderContext): string | null {
25
+ * return data.model.display_name;
26
+ * }
27
+ * }
28
+ * ```
29
+ */
30
+ export declare abstract class StdinDataWidget implements IWidget {
31
+ /**
32
+ * Stored stdin data from last update
33
+ */
34
+ protected data: StdinData | null;
35
+ /**
36
+ * Widget enabled state
37
+ */
38
+ protected enabled: boolean;
39
+ /**
40
+ * Unique widget identifier
41
+ */
42
+ abstract readonly id: string;
43
+ /**
44
+ * Widget metadata
45
+ */
46
+ abstract readonly metadata: IWidgetMetadata;
47
+ /**
48
+ * Initialize widget with context
49
+ * @param context - Widget initialization context
50
+ */
51
+ initialize(context: WidgetContext): Promise<void>;
52
+ /**
53
+ * Update widget with new stdin data
54
+ * @param data - Stdin data from Claude Code
55
+ */
56
+ update(data: StdinData): Promise<void>;
57
+ /**
58
+ * Get stored stdin data
59
+ * @returns Stored stdin data
60
+ * @throws Error if data has not been initialized (update not called)
61
+ */
62
+ getData(): StdinData;
63
+ /**
64
+ * Check if widget is enabled
65
+ * @returns true if widget should render
66
+ */
67
+ isEnabled(): boolean;
68
+ /**
69
+ * Template method - final, subclasses implement renderWithData()
70
+ *
71
+ * Handles null data checks and calls renderWithData() hook.
72
+ *
73
+ * @param context - Render context
74
+ * @returns Rendered string, or null if widget should not display
75
+ */
76
+ render(context: RenderContext): Promise<string | null>;
77
+ /**
78
+ * Hook method for subclasses to implement rendering logic
79
+ *
80
+ * Called by render() template method with guaranteed non-null data.
81
+ *
82
+ * @param data - Stdin data (guaranteed to be non-null)
83
+ * @param context - Render context
84
+ * @returns Rendered string, or null if widget should not display
85
+ */
86
+ protected abstract renderWithData(data: StdinData, context: RenderContext): string | null;
87
+ /**
88
+ * Optional cleanup method
89
+ * Override if widget has resources to clean up
90
+ */
91
+ cleanup?(): Promise<void>;
92
+ }
93
+ //# sourceMappingURL=stdin-data-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin-data-widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/core/stdin-data-widget.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAAsB,eAAgB,YAAW,OAAO;IACtD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAQ;IAExC;;OAEG;IACH,SAAS,CAAC,OAAO,UAAQ;IAEzB;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAE5C;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C;;;;OAIG;IACH,OAAO,IAAI,SAAS;IAOpB;;;OAGG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;;;OAOG;IACG,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO5D;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,CAC/B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,IAAI;IAEhB;;;OAGG;IACG,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Base class for widgets that receive StdinData
3
+ *
4
+ * Uses Template Method Pattern for state management.
5
+ *
6
+ * Extending widgets only need to implement renderWithData() method.
7
+ * The base class handles data storage, update logic, and enables checking.
8
+ */
9
+ /**
10
+ * Abstract base class for widgets working with StdinData
11
+ *
12
+ * Uses Template Method Pattern:
13
+ * - render() is final template method that handles null checks
14
+ * - Subclasses implement renderWithData() hook with data as parameter
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * export class ModelWidget extends StdinDataWidget {
19
+ * readonly id = 'model';
20
+ * readonly metadata = createWidgetMetadata('Model', 'Displays Claude model');
21
+ *
22
+ * protected renderWithData(data: StdinData, context: RenderContext): string | null {
23
+ * return data.model.display_name;
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ export class StdinDataWidget {
29
+ /**
30
+ * Stored stdin data from last update
31
+ */
32
+ data = null;
33
+ /**
34
+ * Widget enabled state
35
+ */
36
+ enabled = true;
37
+ /**
38
+ * Initialize widget with context
39
+ * @param context - Widget initialization context
40
+ */
41
+ async initialize(context) {
42
+ this.enabled = context.config?.enabled !== false;
43
+ }
44
+ /**
45
+ * Update widget with new stdin data
46
+ * @param data - Stdin data from Claude Code
47
+ */
48
+ async update(data) {
49
+ this.data = data;
50
+ }
51
+ /**
52
+ * Get stored stdin data
53
+ * @returns Stored stdin data
54
+ * @throws Error if data has not been initialized (update not called)
55
+ */
56
+ getData() {
57
+ if (!this.data) {
58
+ throw new Error(`Widget ${this.id} data not initialized. Call update() first.`);
59
+ }
60
+ return this.data;
61
+ }
62
+ /**
63
+ * Check if widget is enabled
64
+ * @returns true if widget should render
65
+ */
66
+ isEnabled() {
67
+ return this.enabled;
68
+ }
69
+ /**
70
+ * Template method - final, subclasses implement renderWithData()
71
+ *
72
+ * Handles null data checks and calls renderWithData() hook.
73
+ *
74
+ * @param context - Render context
75
+ * @returns Rendered string, or null if widget should not display
76
+ */
77
+ async render(context) {
78
+ if (!this.data || !this.enabled) {
79
+ return null;
80
+ }
81
+ return this.renderWithData(this.data, context);
82
+ }
83
+ }
84
+ //# sourceMappingURL=stdin-data-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin-data-widget.js","sourceRoot":"","sources":["../../../src/widgets/core/stdin-data-widget.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAgB,eAAe;IACnC;;OAEG;IACO,IAAI,GAAqB,IAAI,CAAC;IAExC;;OAEG;IACO,OAAO,GAAG,IAAI,CAAC;IAYzB;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,IAAe;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE,6CAA6C,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;CAqBF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Cost Widget
3
+ *
4
+ * Displays total session cost
5
+ */
6
+ import { StdinDataWidget } from './core/stdin-data-widget.js';
7
+ import type { RenderContext, StdinData } from '../types.js';
8
+ export declare class CostWidget extends StdinDataWidget {
9
+ readonly id = "cost";
10
+ readonly metadata: import("../core/types.js").IWidgetMetadata;
11
+ protected renderWithData(data: StdinData, context: RenderContext): string | null;
12
+ }
13
+ //# sourceMappingURL=cost-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/cost-widget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,qBAAa,UAAW,SAAQ,eAAe;IAC7C,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,QAAQ,6CAGf;IAEF,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI;CAIjF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Cost Widget
3
+ *
4
+ * Displays total session cost
5
+ */
6
+ import { StdinDataWidget } from './core/stdin-data-widget.js';
7
+ import { createWidgetMetadata } from '../core/widget-types.js';
8
+ import { formatCostUSD } from '../ui/utils/formatters.js';
9
+ export class CostWidget extends StdinDataWidget {
10
+ id = 'cost';
11
+ metadata = createWidgetMetadata('Cost', 'Displays session cost in USD');
12
+ renderWithData(data, context) {
13
+ if (!data.cost || data.cost.total_cost_usd === undefined)
14
+ return null;
15
+ return formatCostUSD(data.cost.total_cost_usd);
16
+ }
17
+ }
18
+ //# sourceMappingURL=cost-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-widget.js","sourceRoot":"","sources":["../../src/widgets/cost-widget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,MAAM,OAAO,UAAW,SAAQ,eAAe;IACpC,EAAE,GAAG,MAAM,CAAC;IACZ,QAAQ,GAAG,oBAAoB,CACtC,MAAM,EACN,8BAA8B,CAC/B,CAAC;IAEQ,cAAc,CAAC,IAAe,EAAE,OAAsB;QAC9D,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACtE,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Duration Widget
3
+ *
4
+ * Displays elapsed session time
5
+ */
6
+ import { StdinDataWidget } from './core/stdin-data-widget.js';
7
+ import type { RenderContext, StdinData } from '../types.js';
8
+ export declare class DurationWidget extends StdinDataWidget {
9
+ readonly id = "duration";
10
+ readonly metadata: import("../core/types.js").IWidgetMetadata;
11
+ protected renderWithData(data: StdinData, context: RenderContext): string | null;
12
+ }
13
+ //# sourceMappingURL=duration-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/duration-widget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,qBAAa,cAAe,SAAQ,eAAe;IACjD,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,QAAQ,6CAGf;IAEF,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI;CAIjF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Duration Widget
3
+ *
4
+ * Displays elapsed session time
5
+ */
6
+ import { StdinDataWidget } from './core/stdin-data-widget.js';
7
+ import { createWidgetMetadata } from '../core/widget-types.js';
8
+ import { formatDuration } from '../ui/utils/formatters.js';
9
+ export class DurationWidget extends StdinDataWidget {
10
+ id = 'duration';
11
+ metadata = createWidgetMetadata('Duration', 'Displays elapsed session time');
12
+ renderWithData(data, context) {
13
+ if (!data.cost || data.cost.total_duration_ms === undefined)
14
+ return null;
15
+ return formatDuration(data.cost.total_duration_ms);
16
+ }
17
+ }
18
+ //# sourceMappingURL=duration-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration-widget.js","sourceRoot":"","sources":["../../src/widgets/duration-widget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,MAAM,OAAO,cAAe,SAAQ,eAAe;IACxC,EAAE,GAAG,UAAU,CAAC;IAChB,QAAQ,GAAG,oBAAoB,CACtC,UAAU,EACV,+BAA+B,CAChC,CAAC;IAEQ,cAAc,CAAC,IAAe,EAAE,OAAsB;QAC9D,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACzE,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Git Changes Widget
3
+ *
4
+ * Displays git diff statistics (insertions/deletions)
5
+ *
6
+ * NOTE: This widget implements IWidget directly (not extending StdinDataWidget)
7
+ * because it requires async git operations with custom lifecycle management.
8
+ */
9
+ import type { IWidget, WidgetContext, RenderContext, StdinData } from '../../core/types.js';
10
+ import type { IGit } from '../../providers/git-provider.js';
11
+ /**
12
+ * Widget displaying git diff statistics
13
+ *
14
+ * Uses Dependency Injection for IGit to enable:
15
+ * - Easy testing with MockGit
16
+ * - No tight coupling to git implementation
17
+ * - Clean separation of concerns
18
+ */
19
+ export declare class GitChangesWidget implements IWidget {
20
+ readonly id = "git-changes";
21
+ readonly metadata: import("../../core/types.js").IWidgetMetadata;
22
+ private gitFactory;
23
+ private git;
24
+ private enabled;
25
+ private cwd;
26
+ /**
27
+ * @param gitFactory - Optional factory function for creating IGit instances
28
+ * If not provided, uses default createGit (production)
29
+ * Tests can inject MockGit factory here
30
+ */
31
+ constructor(gitFactory?: (cwd: string) => IGit);
32
+ initialize(context: WidgetContext): Promise<void>;
33
+ update(data: StdinData): Promise<void>;
34
+ render(context: RenderContext): Promise<string | null>;
35
+ isEnabled(): boolean;
36
+ cleanup(): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=git-changes-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-changes-widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/git/git-changes-widget.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE5F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAG5D;;;;;;;GAOG;AACH,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,QAAQ,gDAGf;IAEF,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,GAAG,CAAuB;IAElC;;;;OAIG;gBACS,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAIxC,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA8C5D,SAAS,IAAI,OAAO;IAId,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Git Changes Widget
3
+ *
4
+ * Displays git diff statistics (insertions/deletions)
5
+ *
6
+ * NOTE: This widget implements IWidget directly (not extending StdinDataWidget)
7
+ * because it requires async git operations with custom lifecycle management.
8
+ */
9
+ import { createWidgetMetadata } from '../../core/widget-types.js';
10
+ import { createGit } from '../../providers/git-provider.js';
11
+ /**
12
+ * Widget displaying git diff statistics
13
+ *
14
+ * Uses Dependency Injection for IGit to enable:
15
+ * - Easy testing with MockGit
16
+ * - No tight coupling to git implementation
17
+ * - Clean separation of concerns
18
+ */
19
+ export class GitChangesWidget {
20
+ id = 'git-changes';
21
+ metadata = createWidgetMetadata('Git Changes', 'Displays git diff statistics');
22
+ gitFactory;
23
+ git = null;
24
+ enabled = true;
25
+ cwd = null;
26
+ /**
27
+ * @param gitFactory - Optional factory function for creating IGit instances
28
+ * If not provided, uses default createGit (production)
29
+ * Tests can inject MockGit factory here
30
+ */
31
+ constructor(gitFactory) {
32
+ this.gitFactory = gitFactory || createGit;
33
+ }
34
+ async initialize(context) {
35
+ this.enabled = context.config?.enabled !== false;
36
+ }
37
+ async update(data) {
38
+ // Re-initialize git if cwd changed
39
+ if (data.cwd !== this.cwd) {
40
+ this.cwd = data.cwd;
41
+ this.git = this.gitFactory(data.cwd);
42
+ }
43
+ }
44
+ async render(context) {
45
+ if (!this.enabled || !this.git || !this.cwd) {
46
+ return null;
47
+ }
48
+ let changes;
49
+ try {
50
+ const summary = await this.git.diffSummary(['--shortstat']);
51
+ let insertions = 0;
52
+ let deletions = 0;
53
+ if (summary.files && summary.files.length > 0) {
54
+ for (const file of summary.files) {
55
+ if (typeof file.insertions === 'number') {
56
+ insertions += file.insertions;
57
+ }
58
+ if (typeof file.deletions === 'number') {
59
+ deletions += file.deletions;
60
+ }
61
+ }
62
+ }
63
+ if (insertions === 0 && deletions === 0) {
64
+ return null;
65
+ }
66
+ changes = { insertions, deletions };
67
+ }
68
+ catch {
69
+ // Log specific error for debugging but return null (graceful degradation)
70
+ return null;
71
+ }
72
+ if (!changes)
73
+ return null;
74
+ if (changes.insertions === 0 && changes.deletions === 0) {
75
+ return null;
76
+ }
77
+ const parts = [];
78
+ if (changes.insertions > 0)
79
+ parts.push(`+${changes.insertions}`);
80
+ if (changes.deletions > 0)
81
+ parts.push(`-${changes.deletions}`);
82
+ return parts.join(',');
83
+ }
84
+ isEnabled() {
85
+ return this.enabled;
86
+ }
87
+ async cleanup() {
88
+ // No cleanup needed for native git implementation
89
+ }
90
+ }
91
+ //# sourceMappingURL=git-changes-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-changes-widget.js","sourceRoot":"","sources":["../../../src/widgets/git/git-changes-widget.ts"],"names":[],"mappings":"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"}