cc-context-stats 1.7.0 → 1.8.1
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/package.json +9 -1
- package/scripts/context-stats.sh +1 -1
- package/scripts/statusline.js +128 -18
- package/.editorconfig +0 -60
- package/.eslintrc.json +0 -35
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -31
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -33
- package/.github/dependabot.yml +0 -44
- package/.github/workflows/ci.yml +0 -294
- package/.github/workflows/release.yml +0 -151
- package/.pre-commit-config.yaml +0 -74
- package/.prettierrc +0 -33
- package/.shellcheckrc +0 -10
- package/CHANGELOG.md +0 -163
- package/CLAUDE.md +0 -66
- package/CODE_OF_CONDUCT.md +0 -59
- package/CONTRIBUTING.md +0 -240
- package/RELEASE_NOTES.md +0 -19
- package/SECURITY.md +0 -44
- package/TODOS.md +0 -72
- package/assets/logo/favicon.svg +0 -19
- package/assets/logo/logo-black.svg +0 -24
- package/assets/logo/logo-full.svg +0 -40
- package/assets/logo/logo-icon.svg +0 -27
- package/assets/logo/logo-mark.svg +0 -28
- package/assets/logo/logo-white.svg +0 -24
- package/assets/logo/logo-wordmark.svg +0 -6
- package/config/settings-example.json +0 -7
- package/config/settings-node.json +0 -7
- package/config/settings-python.json +0 -7
- package/docs/ARCHITECTURE.md +0 -128
- package/docs/CSV_FORMAT.md +0 -42
- package/docs/DEPLOYMENT.md +0 -71
- package/docs/DEVELOPMENT.md +0 -161
- package/docs/configuration.md +0 -118
- package/docs/context-stats.md +0 -143
- package/docs/installation.md +0 -255
- package/docs/scripts.md +0 -140
- package/docs/troubleshooting.md +0 -278
- package/images/claude-statusline-token-graph.gif +0 -0
- package/images/claude-statusline.png +0 -0
- package/images/context-status-dumbzone.png +0 -0
- package/images/context-status.png +0 -0
- package/images/statusline-detail.png +0 -0
- package/images/token-graph.jpeg +0 -0
- package/images/token-graph.png +0 -0
- package/images/v1.6.1.png +0 -0
- package/install +0 -351
- package/install.sh +0 -298
- package/jest.config.js +0 -11
- package/pyproject.toml +0 -115
- package/requirements-dev.txt +0 -12
- package/scripts/statusline-full.sh +0 -304
- package/scripts/statusline-git.sh +0 -88
- package/scripts/statusline-minimal.sh +0 -67
- package/scripts/statusline.py +0 -485
- package/src/claude_statusline/__init__.py +0 -11
- package/src/claude_statusline/__main__.py +0 -6
- package/src/claude_statusline/cli/__init__.py +0 -1
- package/src/claude_statusline/cli/context_stats.py +0 -512
- package/src/claude_statusline/cli/explain.py +0 -228
- package/src/claude_statusline/cli/statusline.py +0 -169
- package/src/claude_statusline/core/__init__.py +0 -1
- package/src/claude_statusline/core/colors.py +0 -124
- package/src/claude_statusline/core/config.py +0 -148
- package/src/claude_statusline/core/git.py +0 -78
- package/src/claude_statusline/core/state.py +0 -323
- package/src/claude_statusline/formatters/__init__.py +0 -1
- package/src/claude_statusline/formatters/layout.py +0 -67
- package/src/claude_statusline/formatters/time.py +0 -50
- package/src/claude_statusline/formatters/tokens.py +0 -70
- package/src/claude_statusline/graphs/__init__.py +0 -1
- package/src/claude_statusline/graphs/renderer.py +0 -366
- package/src/claude_statusline/graphs/statistics.py +0 -92
- package/src/claude_statusline/ui/__init__.py +0 -1
- package/src/claude_statusline/ui/icons.py +0 -93
- package/src/claude_statusline/ui/waiting.py +0 -62
- package/tests/bash/test_delta_parity.bats +0 -199
- package/tests/bash/test_install.bats +0 -29
- package/tests/bash/test_parity.bats +0 -315
- package/tests/bash/test_statusline_full.bats +0 -139
- package/tests/bash/test_statusline_git.bats +0 -42
- package/tests/bash/test_statusline_minimal.bats +0 -37
- package/tests/fixtures/json/comma_in_path.json +0 -31
- package/tests/fixtures/json/high_usage.json +0 -17
- package/tests/fixtures/json/low_usage.json +0 -17
- package/tests/fixtures/json/medium_usage.json +0 -17
- package/tests/fixtures/json/valid_full.json +0 -30
- package/tests/fixtures/json/valid_minimal.json +0 -9
- package/tests/node/rotation.test.js +0 -89
- package/tests/node/statusline.test.js +0 -240
- package/tests/python/conftest.py +0 -84
- package/tests/python/test_colors.py +0 -105
- package/tests/python/test_config_colors.py +0 -78
- package/tests/python/test_data_pipeline.py +0 -446
- package/tests/python/test_explain.py +0 -177
- package/tests/python/test_icons.py +0 -152
- package/tests/python/test_layout.py +0 -127
- package/tests/python/test_state_rotation_validation.py +0 -232
- package/tests/python/test_statusline.py +0 -215
- package/tests/python/test_waiting.py +0 -127
package/package.json
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cc-context-stats",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "Monitor your Claude Code session context in real-time - track token usage and never run out of context",
|
|
5
5
|
"main": "scripts/statusline.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"context-stats": "scripts/context-stats.sh",
|
|
8
|
+
"claude-statusline": "scripts/statusline.js"
|
|
9
|
+
},
|
|
6
10
|
"scripts": {
|
|
7
11
|
"test": "jest",
|
|
8
12
|
"test:watch": "jest --watch",
|
|
@@ -34,6 +38,10 @@
|
|
|
34
38
|
"jest": "^29.7.0",
|
|
35
39
|
"prettier": "^3.8.1"
|
|
36
40
|
},
|
|
41
|
+
"files": [
|
|
42
|
+
"scripts/statusline.js",
|
|
43
|
+
"scripts/context-stats.sh"
|
|
44
|
+
],
|
|
37
45
|
"engines": {
|
|
38
46
|
"node": ">=18"
|
|
39
47
|
}
|
package/scripts/context-stats.sh
CHANGED
package/scripts/statusline.js
CHANGED
|
@@ -36,6 +36,61 @@ const os = require('os');
|
|
|
36
36
|
const ROTATION_THRESHOLD = 10000;
|
|
37
37
|
const ROTATION_KEEP = 5000;
|
|
38
38
|
|
|
39
|
+
// Model Intelligence constants (hardcoded, not configurable)
|
|
40
|
+
const MI_WEIGHT_CPS = 0.60;
|
|
41
|
+
const MI_WEIGHT_ES = 0.25;
|
|
42
|
+
const MI_WEIGHT_PS = 0.15;
|
|
43
|
+
const MI_GREEN_THRESHOLD = 0.65;
|
|
44
|
+
const MI_YELLOW_THRESHOLD = 0.35;
|
|
45
|
+
const MI_PRODUCTIVITY_TARGET = 0.2;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Compute Model Intelligence score.
|
|
49
|
+
* Returns { mi, cps, es, ps }.
|
|
50
|
+
*/
|
|
51
|
+
function computeMI(usedTokens, contextWindowSize, cacheRead, totalContext,
|
|
52
|
+
deltaLines, deltaOutput, beta = 1.5) {
|
|
53
|
+
// Guard clause
|
|
54
|
+
if (contextWindowSize === 0) {
|
|
55
|
+
return { mi: 1.0, cps: 1.0, es: 1.0, ps: 0.5 };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// CPS
|
|
59
|
+
const u = usedTokens / contextWindowSize;
|
|
60
|
+
const cps = u > 0 ? Math.max(0, 1 - Math.pow(u, beta)) : 1.0;
|
|
61
|
+
|
|
62
|
+
// ES
|
|
63
|
+
let es;
|
|
64
|
+
if (totalContext === 0) {
|
|
65
|
+
es = 1.0;
|
|
66
|
+
} else {
|
|
67
|
+
const cacheHitRatio = cacheRead / totalContext;
|
|
68
|
+
es = 0.3 + 0.7 * cacheHitRatio;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// PS
|
|
72
|
+
let ps;
|
|
73
|
+
if (deltaOutput === null || deltaOutput === undefined || deltaOutput <= 0) {
|
|
74
|
+
ps = 0.5;
|
|
75
|
+
} else {
|
|
76
|
+
const ratio = deltaLines / deltaOutput;
|
|
77
|
+
const normalized = Math.min(1.0, ratio / MI_PRODUCTIVITY_TARGET);
|
|
78
|
+
ps = 0.2 + 0.8 * normalized;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const mi = MI_WEIGHT_CPS * cps + MI_WEIGHT_ES * es + MI_WEIGHT_PS * ps;
|
|
82
|
+
return { mi, cps, es, ps };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Return ANSI color code for MI score.
|
|
87
|
+
*/
|
|
88
|
+
function getMIColor(mi, greenColor, yellowColor, redColor) {
|
|
89
|
+
if (mi > MI_GREEN_THRESHOLD) return greenColor || GREEN;
|
|
90
|
+
if (mi > MI_YELLOW_THRESHOLD) return yellowColor || YELLOW;
|
|
91
|
+
return redColor || RED;
|
|
92
|
+
}
|
|
93
|
+
|
|
39
94
|
/**
|
|
40
95
|
* Rotate a state file if it exceeds ROTATION_THRESHOLD lines.
|
|
41
96
|
* Keeps the most recent ROTATION_KEEP lines via atomic temp-file + rename.
|
|
@@ -141,8 +196,24 @@ function visibleWidth(s) {
|
|
|
141
196
|
/**
|
|
142
197
|
* Return the terminal width in columns, defaulting to 80.
|
|
143
198
|
*/
|
|
199
|
+
/**
|
|
200
|
+
* Return the terminal width in columns.
|
|
201
|
+
*
|
|
202
|
+
* When running inside Claude Code's statusline subprocess, neither $COLUMNS
|
|
203
|
+
* nor process.stdout.columns can detect the real terminal width (they return
|
|
204
|
+
* undefined or 80). If COLUMNS is not explicitly set and we'd fall back to 80,
|
|
205
|
+
* use a generous default of 200 so that no parts are unnecessarily dropped;
|
|
206
|
+
* Claude Code's own UI handles any overflow/truncation.
|
|
207
|
+
*/
|
|
144
208
|
function getTerminalWidth() {
|
|
145
|
-
|
|
209
|
+
if (process.env.COLUMNS) {
|
|
210
|
+
return parseInt(process.env.COLUMNS, 10) || 200;
|
|
211
|
+
}
|
|
212
|
+
const cols = process.stdout.columns;
|
|
213
|
+
if (cols && cols !== 80) {
|
|
214
|
+
return cols;
|
|
215
|
+
}
|
|
216
|
+
return 200;
|
|
146
217
|
}
|
|
147
218
|
|
|
148
219
|
/**
|
|
@@ -220,6 +291,8 @@ function readConfig() {
|
|
|
220
291
|
showSession: true,
|
|
221
292
|
showIoTokens: true,
|
|
222
293
|
reducedMotion: false,
|
|
294
|
+
showMI: true,
|
|
295
|
+
miCurveBeta: 1.5,
|
|
223
296
|
colors: {},
|
|
224
297
|
};
|
|
225
298
|
const configPath = path.join(os.homedir(), '.claude', 'statusline.conf');
|
|
@@ -280,6 +353,13 @@ show_session=true
|
|
|
280
353
|
config.showIoTokens = valueTrimmed !== 'false';
|
|
281
354
|
} else if (keyTrimmed === 'reduced_motion') {
|
|
282
355
|
config.reducedMotion = valueTrimmed !== 'false';
|
|
356
|
+
} else if (keyTrimmed === 'show_mi') {
|
|
357
|
+
config.showMI = valueTrimmed !== 'false';
|
|
358
|
+
} else if (keyTrimmed === 'mi_curve_beta') {
|
|
359
|
+
const parsed = parseFloat(rawValue);
|
|
360
|
+
if (!isNaN(parsed)) {
|
|
361
|
+
config.miCurveBeta = parsed;
|
|
362
|
+
}
|
|
283
363
|
} else if (COLOR_CONFIG_KEYS[keyTrimmed]) {
|
|
284
364
|
const ansi = parseColor(rawValue);
|
|
285
365
|
if (ansi) {
|
|
@@ -340,7 +420,10 @@ process.stdin.on('end', () => {
|
|
|
340
420
|
let contextInfo = '';
|
|
341
421
|
let acInfo = '';
|
|
342
422
|
let deltaInfo = '';
|
|
423
|
+
let miInfo = '';
|
|
343
424
|
let sessionInfo = '';
|
|
425
|
+
const showMI = config.showMI;
|
|
426
|
+
const miCurveBeta = config.miCurveBeta;
|
|
344
427
|
const totalSize = data.context_window?.context_window_size || 0;
|
|
345
428
|
const currentUsage = data.context_window?.current_usage;
|
|
346
429
|
const totalInputTokens = data.context_window?.total_input_tokens || 0;
|
|
@@ -399,10 +482,10 @@ process.stdin.on('end', () => {
|
|
|
399
482
|
ctxColor = cRed;
|
|
400
483
|
}
|
|
401
484
|
|
|
402
|
-
contextInfo = ` | ${ctxColor}${freeDisplay}
|
|
485
|
+
contextInfo = ` | ${ctxColor}${freeDisplay} (${freePct.toFixed(1)}%)${RESET}`;
|
|
403
486
|
|
|
404
|
-
//
|
|
405
|
-
if (showDelta) {
|
|
487
|
+
// Read previous entry if needed for delta OR MI
|
|
488
|
+
if (showDelta || showMI) {
|
|
406
489
|
const stateDir = path.join(os.homedir(), '.claude', 'statusline');
|
|
407
490
|
if (!fs.existsSync(stateDir)) {
|
|
408
491
|
fs.mkdirSync(stateDir, { recursive: true });
|
|
@@ -432,10 +515,13 @@ process.stdin.on('end', () => {
|
|
|
432
515
|
const stateFile = path.join(stateDir, stateFileName);
|
|
433
516
|
let hasPrev = false;
|
|
434
517
|
let prevTokens = 0;
|
|
518
|
+
let prevOutputTokens = 0;
|
|
519
|
+
let prevLinesAdded = 0;
|
|
520
|
+
let prevLinesRemoved = 0;
|
|
435
521
|
try {
|
|
436
522
|
if (fs.existsSync(stateFile)) {
|
|
437
523
|
hasPrev = true;
|
|
438
|
-
// Read last line to get previous
|
|
524
|
+
// Read last line to get previous state
|
|
439
525
|
const content = fs.readFileSync(stateFile, 'utf8').trim();
|
|
440
526
|
const lines = content.split('\n');
|
|
441
527
|
const lastLine = lines[lines.length - 1];
|
|
@@ -448,6 +534,10 @@ process.stdin.on('end', () => {
|
|
|
448
534
|
const prevCacheCreation = parseInt(parts[5], 10) || 0;
|
|
449
535
|
const prevCacheRead = parseInt(parts[6], 10) || 0;
|
|
450
536
|
prevTokens = prevCurInput + prevCacheCreation + prevCacheRead;
|
|
537
|
+
// For MI productivity score
|
|
538
|
+
prevOutputTokens = parseInt(parts[2], 10) || 0;
|
|
539
|
+
prevLinesAdded = parseInt(parts[8], 10) || 0;
|
|
540
|
+
prevLinesRemoved = parseInt(parts[9], 10) || 0;
|
|
451
541
|
} else {
|
|
452
542
|
// Old format - single value
|
|
453
543
|
prevTokens = parseInt(lastLine, 10) || 0;
|
|
@@ -459,20 +549,40 @@ process.stdin.on('end', () => {
|
|
|
459
549
|
);
|
|
460
550
|
prevTokens = 0;
|
|
461
551
|
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
552
|
+
|
|
553
|
+
// Calculate and display token delta if enabled
|
|
554
|
+
if (showDelta) {
|
|
555
|
+
const delta = usedTokens - prevTokens;
|
|
556
|
+
if (hasPrev && delta > 0) {
|
|
557
|
+
const deltaDisplay = tokenDetail
|
|
558
|
+
? delta.toLocaleString('en-US')
|
|
559
|
+
: `${(delta / 1000).toFixed(1)}k`;
|
|
560
|
+
deltaInfo = ` ${DIM}[+${deltaDisplay}]${RESET}`;
|
|
561
|
+
}
|
|
470
562
|
}
|
|
563
|
+
|
|
564
|
+
// Calculate and display MI score if enabled
|
|
565
|
+
if (showMI) {
|
|
566
|
+
let deltaLines, deltaOutput;
|
|
567
|
+
if (hasPrev) {
|
|
568
|
+
const deltaLA = linesAdded - prevLinesAdded;
|
|
569
|
+
const deltaLR = linesRemoved - prevLinesRemoved;
|
|
570
|
+
deltaLines = deltaLA + deltaLR;
|
|
571
|
+
deltaOutput = totalOutputTokens - prevOutputTokens;
|
|
572
|
+
} else {
|
|
573
|
+
deltaLines = 0;
|
|
574
|
+
deltaOutput = null;
|
|
575
|
+
}
|
|
576
|
+
const miResult = computeMI(
|
|
577
|
+
usedTokens, totalSize, cacheRead, usedTokens,
|
|
578
|
+
deltaLines, deltaOutput, miCurveBeta
|
|
579
|
+
);
|
|
580
|
+
const miColor = getMIColor(miResult.mi, cGreen, cYellow, cRed);
|
|
581
|
+
miInfo = ` ${miColor}MI:${miResult.mi.toFixed(2)}${RESET}`;
|
|
582
|
+
}
|
|
583
|
+
|
|
471
584
|
// Only append if context usage changed (avoid duplicates from multiple refreshes)
|
|
472
585
|
if (!hasPrev || usedTokens !== prevTokens) {
|
|
473
|
-
// Append current usage with comprehensive format
|
|
474
|
-
// Format: ts,total_in,total_out,cur_in,cur_out,cache_create,cache_read,
|
|
475
|
-
// cost_usd,lines_added,lines_removed,session_id,model_id,project_dir
|
|
476
586
|
try {
|
|
477
587
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
478
588
|
const curInputTokens = currentUsage.input_tokens || 0;
|
|
@@ -512,11 +622,11 @@ process.stdin.on('end', () => {
|
|
|
512
622
|
// Output: [Model] dir | branch [n] | free (%) [+delta] [AC] session
|
|
513
623
|
const base = `${DIM}[${model}]${RESET} ${cBlue}${dirName}${RESET}`;
|
|
514
624
|
const maxWidth = getTerminalWidth();
|
|
515
|
-
const parts = [base, gitInfo, contextInfo, deltaInfo, acInfo, sessionInfo];
|
|
625
|
+
const parts = [base, gitInfo, contextInfo, deltaInfo, miInfo, acInfo, sessionInfo];
|
|
516
626
|
console.log(fitToWidth(parts, maxWidth));
|
|
517
627
|
});
|
|
518
628
|
|
|
519
629
|
// Export for testing
|
|
520
630
|
if (typeof module !== 'undefined' && module.exports) {
|
|
521
|
-
module.exports = { maybeRotateStateFile, ROTATION_THRESHOLD, ROTATION_KEEP };
|
|
631
|
+
module.exports = { maybeRotateStateFile, ROTATION_THRESHOLD, ROTATION_KEEP, computeMI };
|
|
522
632
|
}
|
package/.editorconfig
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# EditorConfig for claude-statusline project
|
|
2
|
-
# https://editorconfig.org
|
|
3
|
-
|
|
4
|
-
root = true
|
|
5
|
-
|
|
6
|
-
# Default settings for all files
|
|
7
|
-
[*]
|
|
8
|
-
charset = utf-8
|
|
9
|
-
end_of_line = lf
|
|
10
|
-
insert_final_newline = true
|
|
11
|
-
trim_trailing_whitespace = true
|
|
12
|
-
indent_style = space
|
|
13
|
-
indent_size = 4
|
|
14
|
-
|
|
15
|
-
# Shell scripts
|
|
16
|
-
[*.{sh,bash}]
|
|
17
|
-
indent_style = space
|
|
18
|
-
indent_size = 4
|
|
19
|
-
|
|
20
|
-
# Python
|
|
21
|
-
[*.py]
|
|
22
|
-
indent_style = space
|
|
23
|
-
indent_size = 4
|
|
24
|
-
max_line_length = 100
|
|
25
|
-
|
|
26
|
-
# JavaScript
|
|
27
|
-
[*.js]
|
|
28
|
-
indent_style = space
|
|
29
|
-
indent_size = 4
|
|
30
|
-
max_line_length = 100
|
|
31
|
-
|
|
32
|
-
# JSON files
|
|
33
|
-
[*.json]
|
|
34
|
-
indent_style = space
|
|
35
|
-
indent_size = 2
|
|
36
|
-
|
|
37
|
-
# YAML files
|
|
38
|
-
[*.{yml,yaml}]
|
|
39
|
-
indent_style = space
|
|
40
|
-
indent_size = 2
|
|
41
|
-
|
|
42
|
-
# TOML files
|
|
43
|
-
[*.toml]
|
|
44
|
-
indent_style = space
|
|
45
|
-
indent_size = 4
|
|
46
|
-
|
|
47
|
-
# Markdown
|
|
48
|
-
[*.md]
|
|
49
|
-
indent_style = space
|
|
50
|
-
indent_size = 2
|
|
51
|
-
trim_trailing_whitespace = false
|
|
52
|
-
|
|
53
|
-
# Makefile
|
|
54
|
-
[Makefile]
|
|
55
|
-
indent_style = tab
|
|
56
|
-
|
|
57
|
-
# Bats test files
|
|
58
|
-
[*.bats]
|
|
59
|
-
indent_style = space
|
|
60
|
-
indent_size = 4
|
package/.eslintrc.json
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"env": {
|
|
3
|
-
"node": true,
|
|
4
|
-
"es2022": true,
|
|
5
|
-
"jest": true
|
|
6
|
-
},
|
|
7
|
-
"parserOptions": {
|
|
8
|
-
"ecmaVersion": 2022,
|
|
9
|
-
"sourceType": "commonjs"
|
|
10
|
-
},
|
|
11
|
-
"extends": ["eslint:recommended"],
|
|
12
|
-
"rules": {
|
|
13
|
-
"indent": ["error", 4],
|
|
14
|
-
"linebreak-style": ["error", "unix"],
|
|
15
|
-
"quotes": ["error", "single", { "avoidEscape": true }],
|
|
16
|
-
"semi": ["error", "always"],
|
|
17
|
-
"no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
|
18
|
-
"no-console": "off",
|
|
19
|
-
"eqeqeq": ["error", "always"],
|
|
20
|
-
"curly": ["error", "all"],
|
|
21
|
-
"brace-style": ["error", "1tbs"],
|
|
22
|
-
"comma-dangle": ["error", "only-multiline"],
|
|
23
|
-
"comma-spacing": ["error", { "before": false, "after": true }],
|
|
24
|
-
"keyword-spacing": ["error", { "before": true, "after": true }],
|
|
25
|
-
"space-before-blocks": ["error", "always"],
|
|
26
|
-
"object-curly-spacing": ["error", "always"],
|
|
27
|
-
"array-bracket-spacing": ["error", "never"],
|
|
28
|
-
"no-trailing-spaces": "error",
|
|
29
|
-
"eol-last": ["error", "always"],
|
|
30
|
-
"max-len": ["warn", { "code": 100, "ignoreStrings": true, "ignoreTemplateLiterals": true }],
|
|
31
|
-
"prefer-const": "error",
|
|
32
|
-
"no-var": "error"
|
|
33
|
-
},
|
|
34
|
-
"ignorePatterns": ["node_modules/", "coverage/", "*.min.js"]
|
|
35
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Bug Report
|
|
3
|
-
about: Report a bug to help us improve
|
|
4
|
-
title: '[BUG] '
|
|
5
|
-
labels: bug
|
|
6
|
-
assignees: ''
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Bug Description
|
|
10
|
-
|
|
11
|
-
A clear and concise description of what the bug is.
|
|
12
|
-
|
|
13
|
-
## Steps to Reproduce
|
|
14
|
-
|
|
15
|
-
1. Install cc-context-stats via '...'
|
|
16
|
-
2. Run '...'
|
|
17
|
-
3. See error
|
|
18
|
-
|
|
19
|
-
## Expected Behavior
|
|
20
|
-
|
|
21
|
-
A clear and concise description of what you expected to happen.
|
|
22
|
-
|
|
23
|
-
## Actual Behavior
|
|
24
|
-
|
|
25
|
-
What actually happened instead.
|
|
26
|
-
|
|
27
|
-
## Screenshots
|
|
28
|
-
|
|
29
|
-
If applicable, add screenshots to help explain your problem.
|
|
30
|
-
|
|
31
|
-
## Environment
|
|
32
|
-
|
|
33
|
-
- OS: [e.g., macOS 14.0, Ubuntu 22.04, Windows 11]
|
|
34
|
-
- Shell: [e.g., zsh, bash, PowerShell]
|
|
35
|
-
- cc-context-stats version: [e.g., 1.6.0]
|
|
36
|
-
- Installation method: [npm, pip, shell script]
|
|
37
|
-
- Node.js version: [if applicable]
|
|
38
|
-
- Python version: [if applicable]
|
|
39
|
-
- Claude Code version: [if applicable]
|
|
40
|
-
|
|
41
|
-
## Additional Context
|
|
42
|
-
|
|
43
|
-
Add any other context about the problem here.
|
|
44
|
-
|
|
45
|
-
## State File Content (if relevant)
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
# Paste output of: cat ~/.claude/statusline/statusline.*.state
|
|
49
|
-
```
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Feature Request
|
|
3
|
-
about: Suggest an idea for this project
|
|
4
|
-
title: '[FEATURE] '
|
|
5
|
-
labels: enhancement
|
|
6
|
-
assignees: ''
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Problem Statement
|
|
10
|
-
|
|
11
|
-
A clear and concise description of what the problem is.
|
|
12
|
-
Ex. I'm always frustrated when [...]
|
|
13
|
-
|
|
14
|
-
## Proposed Solution
|
|
15
|
-
|
|
16
|
-
A clear and concise description of what you want to happen.
|
|
17
|
-
|
|
18
|
-
## Alternatives Considered
|
|
19
|
-
|
|
20
|
-
A clear and concise description of any alternative solutions or features you've considered.
|
|
21
|
-
|
|
22
|
-
## Use Cases
|
|
23
|
-
|
|
24
|
-
Describe specific use cases where this feature would be beneficial:
|
|
25
|
-
|
|
26
|
-
1. Use case 1
|
|
27
|
-
2. Use case 2
|
|
28
|
-
|
|
29
|
-
## Additional Context
|
|
30
|
-
|
|
31
|
-
Add any other context, mockups, or screenshots about the feature request here.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
## Description
|
|
2
|
-
|
|
3
|
-
Brief description of the changes in this PR.
|
|
4
|
-
|
|
5
|
-
## Related Issue
|
|
6
|
-
|
|
7
|
-
Fixes #(issue number)
|
|
8
|
-
|
|
9
|
-
## Type of Change
|
|
10
|
-
|
|
11
|
-
- [ ] Bug fix (non-breaking change which fixes an issue)
|
|
12
|
-
- [ ] New feature (non-breaking change which adds functionality)
|
|
13
|
-
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
|
|
14
|
-
- [ ] Documentation update
|
|
15
|
-
- [ ] Refactoring (no functional changes)
|
|
16
|
-
|
|
17
|
-
## Checklist
|
|
18
|
-
|
|
19
|
-
- [ ] My code follows the project's style guidelines
|
|
20
|
-
- [ ] I have performed a self-review of my code
|
|
21
|
-
- [ ] I have made corresponding changes to the documentation
|
|
22
|
-
- [ ] My changes generate no new warnings
|
|
23
|
-
- [ ] I have added tests that prove my fix is effective or that my feature works
|
|
24
|
-
- [ ] New and existing unit tests pass locally with my changes
|
|
25
|
-
- [ ] All three implementations (bash, Python, Node.js) produce consistent output (if applicable)
|
|
26
|
-
|
|
27
|
-
## Screenshots (if applicable)
|
|
28
|
-
|
|
29
|
-
Add screenshots to help explain your changes.
|
|
30
|
-
|
|
31
|
-
## Additional Notes
|
|
32
|
-
|
|
33
|
-
Any additional information that reviewers should know.
|
package/.github/dependabot.yml
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
version: 2
|
|
2
|
-
updates:
|
|
3
|
-
# GitHub Actions
|
|
4
|
-
- package-ecosystem: "github-actions"
|
|
5
|
-
directory: "/"
|
|
6
|
-
schedule:
|
|
7
|
-
interval: "weekly"
|
|
8
|
-
day: "monday"
|
|
9
|
-
commit-message:
|
|
10
|
-
prefix: "ci"
|
|
11
|
-
labels:
|
|
12
|
-
- "dependencies"
|
|
13
|
-
- "github-actions"
|
|
14
|
-
|
|
15
|
-
# npm dependencies
|
|
16
|
-
- package-ecosystem: "npm"
|
|
17
|
-
directory: "/"
|
|
18
|
-
schedule:
|
|
19
|
-
interval: "weekly"
|
|
20
|
-
day: "monday"
|
|
21
|
-
commit-message:
|
|
22
|
-
prefix: "deps"
|
|
23
|
-
labels:
|
|
24
|
-
- "dependencies"
|
|
25
|
-
- "javascript"
|
|
26
|
-
groups:
|
|
27
|
-
dev-dependencies:
|
|
28
|
-
patterns:
|
|
29
|
-
- "*"
|
|
30
|
-
update-types:
|
|
31
|
-
- "minor"
|
|
32
|
-
- "patch"
|
|
33
|
-
|
|
34
|
-
# pip dependencies
|
|
35
|
-
- package-ecosystem: "pip"
|
|
36
|
-
directory: "/"
|
|
37
|
-
schedule:
|
|
38
|
-
interval: "weekly"
|
|
39
|
-
day: "monday"
|
|
40
|
-
commit-message:
|
|
41
|
-
prefix: "deps"
|
|
42
|
-
labels:
|
|
43
|
-
- "dependencies"
|
|
44
|
-
- "python"
|