@vimukthid/ccsl 1.0.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.
package/dist/index.js ADDED
@@ -0,0 +1,658 @@
1
+ // src/themes/index.ts
2
+ var neonTheme = {
3
+ name: "neon",
4
+ colors: {
5
+ model: { fg: "#00ffff", bold: true },
6
+ context: { fg: "#ff00ff" },
7
+ contextHigh: { fg: "#ffff00" },
8
+ contextCritical: { fg: "#ff0000", bold: true },
9
+ tokens: { fg: "#00ff00" },
10
+ cost: { fg: "#ffff00" },
11
+ duration: { fg: "#00aaff" },
12
+ lines: { fg: "#ff6600" },
13
+ linesAdded: { fg: "#00ff00" },
14
+ linesRemoved: { fg: "#ff0066" },
15
+ directory: { fg: "#00ffff" },
16
+ version: { fg: "#aaaaff" },
17
+ separator: { fg: "#666666" }
18
+ }
19
+ };
20
+ var rainbowTheme = {
21
+ name: "rainbow",
22
+ colors: {
23
+ model: { fg: "#ff0000", bold: true },
24
+ context: { fg: "#ff7f00" },
25
+ contextHigh: { fg: "#ffff00" },
26
+ contextCritical: { fg: "#ff0000", bold: true },
27
+ tokens: { fg: "#00ff00" },
28
+ cost: { fg: "#0000ff" },
29
+ duration: { fg: "#4b0082" },
30
+ lines: { fg: "#9400d3" },
31
+ linesAdded: { fg: "#00ff00" },
32
+ linesRemoved: { fg: "#ff0000" },
33
+ directory: { fg: "#ff7f00" },
34
+ version: { fg: "#9400d3" },
35
+ separator: { fg: "#888888" }
36
+ }
37
+ };
38
+ var oceanTheme = {
39
+ name: "ocean",
40
+ colors: {
41
+ model: { fg: "#00bcd4", bold: true },
42
+ context: { fg: "#2d8b8b" },
43
+ contextHigh: { fg: "#4dd0e1" },
44
+ contextCritical: { fg: "#ff5252", bold: true },
45
+ tokens: { fg: "#80deea" },
46
+ cost: { fg: "#4dd0e1" },
47
+ duration: { fg: "#0288d1" },
48
+ lines: { fg: "#26c6da" },
49
+ linesAdded: { fg: "#69f0ae" },
50
+ linesRemoved: { fg: "#ff5252" },
51
+ directory: { fg: "#00bcd4" },
52
+ version: { fg: "#80deea" },
53
+ separator: { fg: "#37474f" }
54
+ }
55
+ };
56
+ var minimalTheme = {
57
+ name: "minimal",
58
+ colors: {
59
+ model: { fg: "#888888" },
60
+ context: { fg: "#ffffff" },
61
+ contextHigh: { fg: "#e5c07b" },
62
+ contextCritical: { fg: "#e06c75", bold: true },
63
+ tokens: { fg: "#666666", dim: true },
64
+ cost: { fg: "#61afef" },
65
+ duration: { fg: "#666666", dim: true },
66
+ lines: { fg: "#abb2bf" },
67
+ linesAdded: { fg: "#98c379" },
68
+ linesRemoved: { fg: "#e06c75" },
69
+ directory: { fg: "#888888" },
70
+ version: { fg: "#5c6370" },
71
+ separator: { fg: "#444444" }
72
+ },
73
+ icons: {
74
+ model: "",
75
+ context: "",
76
+ tokens: "",
77
+ duration: "",
78
+ lines: "",
79
+ directory: ""
80
+ }
81
+ };
82
+ var monochromeTheme = {
83
+ name: "monochrome",
84
+ colors: {
85
+ model: { fg: "#ffffff", bold: true },
86
+ context: { fg: "#cccccc" },
87
+ contextHigh: { fg: "#ffffff", bold: true },
88
+ contextCritical: { fg: "#ffffff", bold: true, underline: true },
89
+ tokens: { fg: "#aaaaaa" },
90
+ cost: { fg: "#999999" },
91
+ duration: { fg: "#888888" },
92
+ lines: { fg: "#777777" },
93
+ linesAdded: { fg: "#cccccc" },
94
+ linesRemoved: { fg: "#888888" },
95
+ directory: { fg: "#aaaaaa" },
96
+ version: { fg: "#666666" },
97
+ separator: { fg: "#444444" }
98
+ },
99
+ icons: {
100
+ model: "",
101
+ context: "",
102
+ tokens: "",
103
+ duration: "",
104
+ lines: "",
105
+ directory: ""
106
+ }
107
+ };
108
+ var corporateTheme = {
109
+ name: "corporate",
110
+ colors: {
111
+ model: { fg: "#3b82f6", bold: true },
112
+ context: { fg: "#64748b" },
113
+ contextHigh: { fg: "#f59e0b" },
114
+ contextCritical: { fg: "#ef4444", bold: true },
115
+ tokens: { fg: "#4682b4" },
116
+ cost: { fg: "#6b7280" },
117
+ duration: { fg: "#64748b" },
118
+ lines: { fg: "#94a3b8" },
119
+ linesAdded: { fg: "#22c55e" },
120
+ linesRemoved: { fg: "#ef4444" },
121
+ directory: { fg: "#3b82f6" },
122
+ version: { fg: "#94a3b8" },
123
+ separator: { fg: "#334155" }
124
+ }
125
+ };
126
+ var themes = {
127
+ neon: neonTheme,
128
+ rainbow: rainbowTheme,
129
+ ocean: oceanTheme,
130
+ minimal: minimalTheme,
131
+ monochrome: monochromeTheme,
132
+ corporate: corporateTheme
133
+ };
134
+ var themeNames = Object.keys(themes);
135
+
136
+ // src/utils/icons.ts
137
+ var nerdIcons = {
138
+ model: "\u25C8",
139
+ context: "\u25D0",
140
+ tokens: "\u{F0284}",
141
+ cost: "$",
142
+ duration: "\u23F1",
143
+ lines: "\xB1",
144
+ directory: "",
145
+ version: ""
146
+ };
147
+ var unicodeIcons = {
148
+ model: "\u25C8",
149
+ context: "\u25D0",
150
+ tokens: "\u21C5",
151
+ cost: "$",
152
+ duration: "\u23F1",
153
+ lines: "\xB1",
154
+ directory: "\u{1F4C1}",
155
+ version: "v"
156
+ };
157
+ var asciiIcons = {
158
+ model: "*",
159
+ context: "%",
160
+ tokens: "",
161
+ cost: "$",
162
+ duration: "",
163
+ lines: "",
164
+ directory: "",
165
+ version: "v"
166
+ };
167
+ var detectedIconMode = null;
168
+ function detectIconSupport() {
169
+ if (detectedIconMode !== null) {
170
+ return detectedIconMode;
171
+ }
172
+ const term = process.env.TERM || "";
173
+ const termProgram = process.env.TERM_PROGRAM || "";
174
+ const nerdFontEnv = process.env.NERD_FONT || "";
175
+ if (nerdFontEnv === "1" || nerdFontEnv.toLowerCase() === "true") {
176
+ detectedIconMode = "nerd";
177
+ return "nerd";
178
+ }
179
+ const nerdFontTerminals = ["iTerm.app", "WezTerm", "Alacritty", "kitty", "Hyper", "Tabby"];
180
+ if (nerdFontTerminals.some((t) => termProgram.includes(t))) {
181
+ detectedIconMode = "nerd";
182
+ return "nerd";
183
+ }
184
+ if (term.includes("256color") || term.includes("truecolor")) {
185
+ detectedIconMode = "unicode";
186
+ return "unicode";
187
+ }
188
+ detectedIconMode = "ascii";
189
+ return "ascii";
190
+ }
191
+ function getIcon(key, theme, mode) {
192
+ if (theme.icons && theme.icons[key]) {
193
+ return theme.icons[key] || "";
194
+ }
195
+ const effectiveMode = mode === "auto" ? detectIconSupport() : mode;
196
+ switch (effectiveMode) {
197
+ case "nerd":
198
+ return nerdIcons[key] || "";
199
+ case "unicode":
200
+ return unicodeIcons[key] || "";
201
+ case "ascii":
202
+ return asciiIcons[key] || "";
203
+ default:
204
+ return unicodeIcons[key] || "";
205
+ }
206
+ }
207
+
208
+ // src/utils/colors.ts
209
+ import chalk from "chalk";
210
+ function applyStyle(text, style) {
211
+ if (!style) return text;
212
+ let result = chalk;
213
+ if (style.fg) {
214
+ result = result.hex(style.fg);
215
+ }
216
+ if (style.bg) {
217
+ result = result.bgHex(style.bg);
218
+ }
219
+ if (style.bold) {
220
+ result = result.bold;
221
+ }
222
+ if (style.dim) {
223
+ result = result.dim;
224
+ }
225
+ if (style.italic) {
226
+ result = result.italic;
227
+ }
228
+ if (style.underline) {
229
+ result = result.underline;
230
+ }
231
+ return result(text);
232
+ }
233
+
234
+ // src/utils/format.ts
235
+ function formatNumber(num) {
236
+ if (num >= 1e6) {
237
+ return `${(num / 1e6).toFixed(1)}m`;
238
+ }
239
+ if (num >= 1e3) {
240
+ return `${(num / 1e3).toFixed(1)}k`;
241
+ }
242
+ return num.toString();
243
+ }
244
+ function formatDuration(ms) {
245
+ const seconds = Math.floor(ms / 1e3);
246
+ if (seconds < 60) {
247
+ return `${seconds}s`;
248
+ }
249
+ const minutes = Math.floor(seconds / 60);
250
+ if (minutes < 60) {
251
+ const remainingSeconds = seconds % 60;
252
+ return remainingSeconds > 0 ? `${minutes}m${remainingSeconds}s` : `${minutes}m`;
253
+ }
254
+ const hours = Math.floor(minutes / 60);
255
+ const remainingMinutes = minutes % 60;
256
+ return remainingMinutes > 0 ? `${hours}h${remainingMinutes}m` : `${hours}h`;
257
+ }
258
+ function formatCost(usd) {
259
+ if (usd < 0.01) {
260
+ return usd.toFixed(4);
261
+ }
262
+ if (usd < 1) {
263
+ return usd.toFixed(2);
264
+ }
265
+ return usd.toFixed(2);
266
+ }
267
+
268
+ // src/widgets/index.ts
269
+ import path from "path";
270
+ var availableWidgets = [
271
+ "model",
272
+ "context",
273
+ "tokens",
274
+ "cost",
275
+ "duration",
276
+ "lines",
277
+ "directory",
278
+ "version"
279
+ ];
280
+ function renderWidget(widget, input, theme, config) {
281
+ switch (widget) {
282
+ case "model":
283
+ return renderModel(input, theme, config);
284
+ case "context":
285
+ return renderContext(input, theme, config);
286
+ case "tokens":
287
+ return renderTokens(input, theme, config);
288
+ case "cost":
289
+ return renderCostWidget(input, theme, config);
290
+ case "duration":
291
+ return renderDurationWidget(input, theme, config);
292
+ case "lines":
293
+ return renderLines(input, theme, config);
294
+ case "directory":
295
+ return renderDirectory(input, theme, config);
296
+ case "version":
297
+ return renderVersion(input, theme, config);
298
+ default:
299
+ return { content: "", visible: false };
300
+ }
301
+ }
302
+ function renderModel(input, theme, config) {
303
+ const displayName = input.model?.display_name;
304
+ if (!displayName) {
305
+ return { content: "", visible: false };
306
+ }
307
+ const icon = getIcon("model", theme, config.icons);
308
+ const text = icon ? `${icon} ${displayName}` : displayName;
309
+ const content = applyStyle(text, theme.colors.model);
310
+ return { content, visible: true };
311
+ }
312
+ function renderContext(input, theme, config) {
313
+ const percentage = input.context_window?.used_percentage;
314
+ if (percentage === void 0) {
315
+ return { content: "", visible: false };
316
+ }
317
+ const icon = getIcon("context", theme, config.icons);
318
+ const roundedPercent = Math.round(percentage);
319
+ const progressBar = renderProgressBar(percentage, theme);
320
+ const value = `${roundedPercent}%`;
321
+ const text = icon ? `${icon} ${progressBar} ${value}` : `${progressBar} ${value}`;
322
+ let colorKey = "context";
323
+ if (percentage >= 80) {
324
+ colorKey = "contextCritical";
325
+ } else if (percentage >= 60) {
326
+ colorKey = "contextHigh";
327
+ }
328
+ const style = theme.colors[colorKey] || theme.colors.context;
329
+ const content = applyStyle(text, style);
330
+ return { content, visible: true };
331
+ }
332
+ function renderProgressBar(percentage, theme) {
333
+ const totalBars = 10;
334
+ const filledBars = Math.round(percentage / 100 * totalBars);
335
+ const emptyBars = totalBars - filledBars;
336
+ const filledChar = "\u2588";
337
+ const emptyChar = "\u2591";
338
+ let filledStyle = theme.colors.context;
339
+ if (percentage >= 80) {
340
+ filledStyle = theme.colors.contextCritical || theme.colors.context;
341
+ } else if (percentage >= 60) {
342
+ filledStyle = theme.colors.contextHigh || theme.colors.context;
343
+ }
344
+ const filled = applyStyle(filledChar.repeat(filledBars), filledStyle);
345
+ const empty = applyStyle(emptyChar.repeat(emptyBars), { fg: "#444444", dim: true });
346
+ return `${filled}${empty}`;
347
+ }
348
+ function renderTokens(input, theme, config) {
349
+ const inputTokens = input.context_window?.total_input_tokens;
350
+ const outputTokens = input.context_window?.total_output_tokens;
351
+ if (inputTokens === void 0 && outputTokens === void 0) {
352
+ return { content: "", visible: false };
353
+ }
354
+ const icon = getIcon("tokens", theme, config.icons);
355
+ const inStr = formatNumber(inputTokens ?? 0);
356
+ const outStr = formatNumber(outputTokens ?? 0);
357
+ const text = icon ? `${icon} \u2191${inStr} \u2193${outStr}` : `\u2191${inStr} \u2193${outStr}`;
358
+ const content = applyStyle(text, theme.colors.tokens);
359
+ return { content, visible: true };
360
+ }
361
+ function renderCostWidget(input, theme, config) {
362
+ const costUsd = input.cost?.total_cost_usd;
363
+ if (costUsd === void 0) {
364
+ return { content: "", visible: false };
365
+ }
366
+ const icon = getIcon("cost", theme, config.icons);
367
+ const value = formatCost(costUsd);
368
+ const text = icon ? `${icon}${value}` : `$${value}`;
369
+ const content = applyStyle(text, theme.colors.cost);
370
+ return { content, visible: true };
371
+ }
372
+ function renderDurationWidget(input, theme, config) {
373
+ const durationMs = input.cost?.total_duration_ms;
374
+ if (durationMs === void 0) {
375
+ return { content: "", visible: false };
376
+ }
377
+ const icon = getIcon("duration", theme, config.icons);
378
+ const value = formatDuration(durationMs);
379
+ const text = icon ? `${icon} ${value}` : value;
380
+ const content = applyStyle(text, theme.colors.duration);
381
+ return { content, visible: true };
382
+ }
383
+ function renderLines(input, theme, config) {
384
+ const added = input.cost?.total_lines_added;
385
+ const removed = input.cost?.total_lines_removed;
386
+ if (added === void 0 && removed === void 0) {
387
+ return { content: "", visible: false };
388
+ }
389
+ const icon = getIcon("lines", theme, config.icons);
390
+ const addedStr = applyStyle(`+${added ?? 0}`, theme.colors.linesAdded || theme.colors.lines);
391
+ const removedStr = applyStyle(`-${removed ?? 0}`, theme.colors.linesRemoved || theme.colors.lines);
392
+ const text = icon ? `${icon} ${addedStr} ${removedStr}` : `${addedStr} ${removedStr}`;
393
+ return { content: text, visible: true };
394
+ }
395
+ function renderDirectory(input, theme, config) {
396
+ const dir = input.workspace?.current_dir || input.cwd;
397
+ if (!dir) {
398
+ return { content: "", visible: false };
399
+ }
400
+ const icon = getIcon("directory", theme, config.icons);
401
+ const dirName = path.basename(dir);
402
+ const text = icon ? `${icon} ${dirName}` : dirName;
403
+ const content = applyStyle(text, theme.colors.directory);
404
+ return { content, visible: true };
405
+ }
406
+ function renderVersion(input, theme, config) {
407
+ const version = input.version;
408
+ if (!version) {
409
+ return { content: "", visible: false };
410
+ }
411
+ const icon = getIcon("version", theme, config.icons);
412
+ const text = icon ? `${icon}${version}` : `v${version}`;
413
+ const content = applyStyle(text, theme.colors.version);
414
+ return { content, visible: true };
415
+ }
416
+
417
+ // src/formatter.ts
418
+ function formatStatusLine(input, config) {
419
+ const theme = config.customTheme || themes[config.theme] || themes.minimal;
420
+ const renderedWidgets = [];
421
+ for (const widget of config.widgets) {
422
+ const result = renderWidget(widget, input, theme, config);
423
+ if (result.visible && result.content) {
424
+ renderedWidgets.push(result.content);
425
+ }
426
+ }
427
+ if (renderedWidgets.length === 0) {
428
+ return "";
429
+ }
430
+ const separator = applyStyle(config.separator, theme.colors.separator);
431
+ const statusLine = renderedWidgets.join(separator);
432
+ const padding = " ".repeat(config.padding);
433
+ return `\x1B[0m${padding}${statusLine}${padding}`;
434
+ }
435
+ var sampleStatusInput = {
436
+ hook_event_name: "Status",
437
+ session_id: "sample-session-123",
438
+ model: {
439
+ id: "claude-opus-4-1",
440
+ display_name: "Opus"
441
+ },
442
+ workspace: {
443
+ current_dir: "/home/user/my-project",
444
+ project_dir: "/home/user/my-project"
445
+ },
446
+ version: "1.0.80",
447
+ cost: {
448
+ total_cost_usd: 0.0234,
449
+ total_duration_ms: 45e3,
450
+ total_api_duration_ms: 2300,
451
+ total_lines_added: 156,
452
+ total_lines_removed: 23
453
+ },
454
+ context_window: {
455
+ total_input_tokens: 15234,
456
+ total_output_tokens: 4521,
457
+ context_window_size: 2e5,
458
+ used_percentage: 42.5,
459
+ remaining_percentage: 57.5,
460
+ current_usage: {
461
+ input_tokens: 8500,
462
+ output_tokens: 1200,
463
+ cache_creation_input_tokens: 5e3,
464
+ cache_read_input_tokens: 2e3
465
+ }
466
+ }
467
+ };
468
+
469
+ // src/parser.ts
470
+ import { z } from "zod";
471
+ var StatusInputSchema = z.object({
472
+ hook_event_name: z.string().optional(),
473
+ session_id: z.string().optional(),
474
+ transcript_path: z.string().optional(),
475
+ cwd: z.string().optional(),
476
+ model: z.object({
477
+ id: z.string().optional(),
478
+ display_name: z.string().optional()
479
+ }).optional(),
480
+ workspace: z.object({
481
+ current_dir: z.string().optional(),
482
+ project_dir: z.string().optional()
483
+ }).optional(),
484
+ version: z.string().optional(),
485
+ output_style: z.object({
486
+ name: z.string().optional()
487
+ }).optional(),
488
+ cost: z.object({
489
+ total_cost_usd: z.number().optional(),
490
+ total_duration_ms: z.number().optional(),
491
+ total_api_duration_ms: z.number().optional(),
492
+ total_lines_added: z.number().optional(),
493
+ total_lines_removed: z.number().optional()
494
+ }).optional(),
495
+ context_window: z.object({
496
+ total_input_tokens: z.number().optional(),
497
+ total_output_tokens: z.number().optional(),
498
+ context_window_size: z.number().optional(),
499
+ used_percentage: z.number().optional(),
500
+ remaining_percentage: z.number().optional(),
501
+ current_usage: z.object({
502
+ input_tokens: z.number().optional(),
503
+ output_tokens: z.number().optional(),
504
+ cache_creation_input_tokens: z.number().optional(),
505
+ cache_read_input_tokens: z.number().optional()
506
+ }).nullable().optional()
507
+ }).optional()
508
+ }).passthrough();
509
+ function parseStatusInput(input) {
510
+ try {
511
+ const trimmed = input.trim();
512
+ if (!trimmed) {
513
+ return null;
514
+ }
515
+ const parsed = JSON.parse(trimmed);
516
+ const result = StatusInputSchema.safeParse(parsed);
517
+ if (result.success) {
518
+ return result.data;
519
+ }
520
+ return parsed;
521
+ } catch {
522
+ return null;
523
+ }
524
+ }
525
+
526
+ // src/config/loader.ts
527
+ import { cosmiconfig } from "cosmiconfig";
528
+
529
+ // src/config/defaults.ts
530
+ var defaultWidgets = ["model", "context", "tokens", "cost"];
531
+ var defaultConfig = {
532
+ theme: "minimal",
533
+ widgets: defaultWidgets,
534
+ separator: " \u2502 ",
535
+ icons: "auto",
536
+ padding: 1
537
+ };
538
+
539
+ // src/config/loader.ts
540
+ var explorer = cosmiconfig("ccsl", {
541
+ searchPlaces: [
542
+ ".ccslrc",
543
+ ".ccslrc.json",
544
+ ".ccslrc.yaml",
545
+ ".ccslrc.yml",
546
+ ".ccslrc.js",
547
+ ".ccslrc.cjs",
548
+ ".config/ccsl/config.json",
549
+ "ccsl.config.js",
550
+ "ccsl.config.cjs"
551
+ ]
552
+ });
553
+ async function loadConfig(searchFrom) {
554
+ try {
555
+ const result = await explorer.search(searchFrom);
556
+ if (result && result.config) {
557
+ return mergeConfig(defaultConfig, result.config);
558
+ }
559
+ } catch {
560
+ }
561
+ return { ...defaultConfig };
562
+ }
563
+ function mergeConfig(defaults, userConfig) {
564
+ return {
565
+ theme: userConfig.theme ?? defaults.theme,
566
+ widgets: userConfig.widgets ?? defaults.widgets,
567
+ separator: userConfig.separator ?? defaults.separator,
568
+ icons: userConfig.icons ?? defaults.icons,
569
+ padding: userConfig.padding ?? defaults.padding,
570
+ customTheme: userConfig.customTheme
571
+ };
572
+ }
573
+
574
+ // src/config/claude.ts
575
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from "fs";
576
+ import { dirname, join } from "path";
577
+ import { homedir } from "os";
578
+ function getClaudeSettingsPath() {
579
+ const claudeDir = process.env.CLAUDE_CONFIG_DIR || join(homedir(), ".claude");
580
+ return join(claudeDir, "settings.json");
581
+ }
582
+ function getClaudeSettings() {
583
+ const settingsPath = getClaudeSettingsPath();
584
+ if (!existsSync(settingsPath)) {
585
+ return null;
586
+ }
587
+ try {
588
+ const content = readFileSync(settingsPath, "utf8");
589
+ return JSON.parse(content);
590
+ } catch {
591
+ return null;
592
+ }
593
+ }
594
+ function installToClaudeSettings(command = "npx @vimukthid/ccsl") {
595
+ const settingsPath = getClaudeSettingsPath();
596
+ const dir = dirname(settingsPath);
597
+ if (!existsSync(dir)) {
598
+ mkdirSync(dir, { recursive: true });
599
+ }
600
+ let settings = {};
601
+ if (existsSync(settingsPath)) {
602
+ try {
603
+ const content = readFileSync(settingsPath, "utf8");
604
+ settings = JSON.parse(content);
605
+ } catch {
606
+ settings = {};
607
+ }
608
+ }
609
+ settings.statusLine = {
610
+ type: "command",
611
+ command
612
+ };
613
+ try {
614
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
615
+ return true;
616
+ } catch {
617
+ return false;
618
+ }
619
+ }
620
+ function uninstallFromClaudeSettings() {
621
+ const settingsPath = getClaudeSettingsPath();
622
+ if (!existsSync(settingsPath)) {
623
+ return true;
624
+ }
625
+ try {
626
+ const content = readFileSync(settingsPath, "utf8");
627
+ const settings = JSON.parse(content);
628
+ delete settings.statusLine;
629
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
630
+ return true;
631
+ } catch {
632
+ return false;
633
+ }
634
+ }
635
+ function isInstalledInClaude() {
636
+ const settings = getClaudeSettings();
637
+ if (!settings?.statusLine) {
638
+ return false;
639
+ }
640
+ const command = settings.statusLine.command || "";
641
+ return command.includes("ccsl") || command.includes("@vimukthid/ccsl");
642
+ }
643
+ export {
644
+ StatusInputSchema,
645
+ availableWidgets,
646
+ defaultConfig,
647
+ formatStatusLine,
648
+ getClaudeSettingsPath,
649
+ installToClaudeSettings,
650
+ isInstalledInClaude,
651
+ loadConfig,
652
+ parseStatusInput,
653
+ sampleStatusInput,
654
+ themeNames,
655
+ themes,
656
+ uninstallFromClaudeSettings
657
+ };
658
+ //# sourceMappingURL=index.js.map