eff-u-code 2.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/LICENSE +21 -0
- package/README.md +256 -0
- package/bin/fuck-u-code-mcp.js +2 -0
- package/bin/fuck-u-code.js +2 -0
- package/bin/postinstall.js +53 -0
- package/dist/ai/index.d.ts +34 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +227 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts/code-review.d.ts +9 -0
- package/dist/ai/prompts/code-review.d.ts.map +1 -0
- package/dist/ai/prompts/code-review.js +61 -0
- package/dist/ai/prompts/code-review.js.map +1 -0
- package/dist/ai/providers/anthropic.d.ts +11 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -0
- package/dist/ai/providers/anthropic.js +60 -0
- package/dist/ai/providers/anthropic.js.map +1 -0
- package/dist/ai/providers/fetch.d.ts +10 -0
- package/dist/ai/providers/fetch.d.ts.map +1 -0
- package/dist/ai/providers/fetch.js +50 -0
- package/dist/ai/providers/fetch.js.map +1 -0
- package/dist/ai/providers/gemini.d.ts +12 -0
- package/dist/ai/providers/gemini.d.ts.map +1 -0
- package/dist/ai/providers/gemini.js +66 -0
- package/dist/ai/providers/gemini.js.map +1 -0
- package/dist/ai/providers/ollama.d.ts +11 -0
- package/dist/ai/providers/ollama.d.ts.map +1 -0
- package/dist/ai/providers/ollama.js +54 -0
- package/dist/ai/providers/ollama.js.map +1 -0
- package/dist/ai/providers/openai.d.ts +11 -0
- package/dist/ai/providers/openai.d.ts.map +1 -0
- package/dist/ai/providers/openai.js +52 -0
- package/dist/ai/providers/openai.js.map +1 -0
- package/dist/ai/selector.d.ts +19 -0
- package/dist/ai/selector.d.ts.map +1 -0
- package/dist/ai/selector.js +145 -0
- package/dist/ai/selector.js.map +1 -0
- package/dist/ai/types.d.ts +120 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +6 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/analyzer/concurrent-analyzer.d.ts +11 -0
- package/dist/analyzer/concurrent-analyzer.d.ts.map +1 -0
- package/dist/analyzer/concurrent-analyzer.js +67 -0
- package/dist/analyzer/concurrent-analyzer.js.map +1 -0
- package/dist/analyzer/file-discovery.d.ts +23 -0
- package/dist/analyzer/file-discovery.d.ts.map +1 -0
- package/dist/analyzer/file-discovery.js +64 -0
- package/dist/analyzer/file-discovery.js.map +1 -0
- package/dist/analyzer/index.d.ts +27 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +64 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/cli/commands/ai-review.d.ts +6 -0
- package/dist/cli/commands/ai-review.d.ts.map +1 -0
- package/dist/cli/commands/ai-review.js +213 -0
- package/dist/cli/commands/ai-review.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +6 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +145 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/config.d.ts +6 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +147 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/mcp-install.d.ts +9 -0
- package/dist/cli/commands/mcp-install.d.ts.map +1 -0
- package/dist/cli/commands/mcp-install.js +102 -0
- package/dist/cli/commands/mcp-install.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +69 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output/ai-review-output.d.ts +20 -0
- package/dist/cli/output/ai-review-output.d.ts.map +1 -0
- package/dist/cli/output/ai-review-output.js +324 -0
- package/dist/cli/output/ai-review-output.js.map +1 -0
- package/dist/cli/output/console.d.ts +31 -0
- package/dist/cli/output/console.d.ts.map +1 -0
- package/dist/cli/output/console.js +571 -0
- package/dist/cli/output/console.js.map +1 -0
- package/dist/cli/output/html.d.ts +20 -0
- package/dist/cli/output/html.d.ts.map +1 -0
- package/dist/cli/output/html.js +339 -0
- package/dist/cli/output/html.js.map +1 -0
- package/dist/cli/output/json.d.ts +8 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +46 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/output/markdown.d.ts +17 -0
- package/dist/cli/output/markdown.d.ts.map +1 -0
- package/dist/cli/output/markdown.js +323 -0
- package/dist/cli/output/markdown.js.map +1 -0
- package/dist/cli/output/stats.d.ts +35 -0
- package/dist/cli/output/stats.d.ts.map +1 -0
- package/dist/cli/output/stats.js +63 -0
- package/dist/cli/output/stats.js.map +1 -0
- package/dist/cli/output/terminal-markdown.d.ts +23 -0
- package/dist/cli/output/terminal-markdown.d.ts.map +1 -0
- package/dist/cli/output/terminal-markdown.js +159 -0
- package/dist/cli/output/terminal-markdown.js.map +1 -0
- package/dist/config/index.d.ts +27 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +266 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +179 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +85 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/gitignore/index.d.ts +5 -0
- package/dist/gitignore/index.d.ts.map +1 -0
- package/dist/gitignore/index.js +5 -0
- package/dist/gitignore/index.js.map +1 -0
- package/dist/gitignore/parser.d.ts +32 -0
- package/dist/gitignore/parser.d.ts.map +1 -0
- package/dist/gitignore/parser.js +110 -0
- package/dist/gitignore/parser.js.map +1 -0
- package/dist/gitignore/parser.test.d.ts +2 -0
- package/dist/gitignore/parser.test.d.ts.map +1 -0
- package/dist/gitignore/parser.test.js +217 -0
- package/dist/gitignore/parser.test.js.map +1 -0
- package/dist/i18n/index.d.ts +19 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +43 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.json +320 -0
- package/dist/i18n/locales/ru.json +320 -0
- package/dist/i18n/locales/zh.json +320 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +156 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/metrics/complexity/cognitive.d.ts +25 -0
- package/dist/metrics/complexity/cognitive.d.ts.map +1 -0
- package/dist/metrics/complexity/cognitive.js +109 -0
- package/dist/metrics/complexity/cognitive.js.map +1 -0
- package/dist/metrics/complexity/cyclomatic.d.ts +21 -0
- package/dist/metrics/complexity/cyclomatic.d.ts.map +1 -0
- package/dist/metrics/complexity/cyclomatic.js +111 -0
- package/dist/metrics/complexity/cyclomatic.js.map +1 -0
- package/dist/metrics/complexity/nesting-depth.d.ts +19 -0
- package/dist/metrics/complexity/nesting-depth.d.ts.map +1 -0
- package/dist/metrics/complexity/nesting-depth.js +97 -0
- package/dist/metrics/complexity/nesting-depth.js.map +1 -0
- package/dist/metrics/documentation/comment-ratio.d.ts +21 -0
- package/dist/metrics/documentation/comment-ratio.d.ts.map +1 -0
- package/dist/metrics/documentation/comment-ratio.js +91 -0
- package/dist/metrics/documentation/comment-ratio.js.map +1 -0
- package/dist/metrics/duplication/code-duplication.d.ts +24 -0
- package/dist/metrics/duplication/code-duplication.d.ts.map +1 -0
- package/dist/metrics/duplication/code-duplication.js +167 -0
- package/dist/metrics/duplication/code-duplication.js.map +1 -0
- package/dist/metrics/duplication/code-duplication.test.d.ts +2 -0
- package/dist/metrics/duplication/code-duplication.test.d.ts.map +1 -0
- package/dist/metrics/duplication/code-duplication.test.js +612 -0
- package/dist/metrics/duplication/code-duplication.test.js.map +1 -0
- package/dist/metrics/error/error-handling.d.ts +23 -0
- package/dist/metrics/error/error-handling.d.ts.map +1 -0
- package/dist/metrics/error/error-handling.js +164 -0
- package/dist/metrics/error/error-handling.js.map +1 -0
- package/dist/metrics/error/error-handling.test.d.ts +2 -0
- package/dist/metrics/error/error-handling.test.d.ts.map +1 -0
- package/dist/metrics/error/error-handling.test.js +349 -0
- package/dist/metrics/error/error-handling.test.js.map +1 -0
- package/dist/metrics/index.d.ts +21 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +50 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/naming/convention.d.ts +22 -0
- package/dist/metrics/naming/convention.d.ts.map +1 -0
- package/dist/metrics/naming/convention.js +117 -0
- package/dist/metrics/naming/convention.js.map +1 -0
- package/dist/metrics/size/file-length.d.ts +19 -0
- package/dist/metrics/size/file-length.d.ts.map +1 -0
- package/dist/metrics/size/file-length.js +68 -0
- package/dist/metrics/size/file-length.js.map +1 -0
- package/dist/metrics/size/function-length.d.ts +20 -0
- package/dist/metrics/size/function-length.d.ts.map +1 -0
- package/dist/metrics/size/function-length.js +101 -0
- package/dist/metrics/size/function-length.js.map +1 -0
- package/dist/metrics/size/parameter-count.d.ts +19 -0
- package/dist/metrics/size/parameter-count.d.ts.map +1 -0
- package/dist/metrics/size/parameter-count.js +97 -0
- package/dist/metrics/size/parameter-count.js.map +1 -0
- package/dist/metrics/structure/structure-analysis.d.ts +24 -0
- package/dist/metrics/structure/structure-analysis.d.ts.map +1 -0
- package/dist/metrics/structure/structure-analysis.js +223 -0
- package/dist/metrics/structure/structure-analysis.js.map +1 -0
- package/dist/metrics/structure/structure-analysis.test.d.ts +2 -0
- package/dist/metrics/structure/structure-analysis.test.d.ts.map +1 -0
- package/dist/metrics/structure/structure-analysis.test.js +342 -0
- package/dist/metrics/structure/structure-analysis.test.js.map +1 -0
- package/dist/metrics/types.d.ts +71 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +5 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/parser/generic-parser.d.ts +28 -0
- package/dist/parser/generic-parser.d.ts.map +1 -0
- package/dist/parser/generic-parser.js +218 -0
- package/dist/parser/generic-parser.js.map +1 -0
- package/dist/parser/index.d.ts +19 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +52 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/regex-parser.d.ts +46 -0
- package/dist/parser/regex-parser.d.ts.map +1 -0
- package/dist/parser/regex-parser.js +560 -0
- package/dist/parser/regex-parser.js.map +1 -0
- package/dist/parser/tree-sitter-parser.d.ts +50 -0
- package/dist/parser/tree-sitter-parser.d.ts.map +1 -0
- package/dist/parser/tree-sitter-parser.js +707 -0
- package/dist/parser/tree-sitter-parser.js.map +1 -0
- package/dist/parser/types.d.ts +52 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +49 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/scoring/index.d.ts +14 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +80 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/utils/fs.d.ts +24 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +61 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.d.ts +16 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +303 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/progress.d.ts +24 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +79 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/terminal.d.ts +62 -0
- package/dist/utils/terminal.d.ts.map +1 -0
- package/dist/utils/terminal.js +207 -0
- package/dist/utils/terminal.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal display utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides terminal width detection, Unicode-aware string width calculation,
|
|
5
|
+
* and display-width-based string padding/truncation for proper CJK alignment.
|
|
6
|
+
*/
|
|
7
|
+
// ANSI escape sequence pattern (SGR, cursor movement, etc.)
|
|
8
|
+
// ANSI escape sequence pattern (SGR, cursor movement, etc.)
|
|
9
|
+
const ANSI_REGEX = new RegExp(String.raw `\x1b\[[0-9;]*[a-zA-Z]`, 'g');
|
|
10
|
+
/**
|
|
11
|
+
* Unicode block ranges that occupy 2 terminal columns.
|
|
12
|
+
*
|
|
13
|
+
* Based on Unicode Standard Annex #11 (East Asian Width) and common terminal
|
|
14
|
+
* emulator behavior. Covers CJK Unified Ideographs, CJK Compatibility,
|
|
15
|
+
* Hangul Syllables, Fullwidth Forms, and supplementary CJK planes.
|
|
16
|
+
*
|
|
17
|
+
* Reference: https://www.unicode.org/reports/tr11/
|
|
18
|
+
*/
|
|
19
|
+
const WIDE_CHAR_RANGES = [
|
|
20
|
+
[0x1100, 0x115f], // Hangul Jamo
|
|
21
|
+
[0x2e80, 0x303e], // CJK Radicals Supplement, Kangxi Radicals, CJK Symbols
|
|
22
|
+
[0x3040, 0x33bf], // Hiragana, Katakana, Bopomofo, CJK Compatibility
|
|
23
|
+
[0x3400, 0x4dbf], // CJK Unified Ideographs Extension A
|
|
24
|
+
[0x4e00, 0x9fff], // CJK Unified Ideographs
|
|
25
|
+
[0xa000, 0xa4cf], // Yi Syllables, Yi Radicals
|
|
26
|
+
[0xac00, 0xd7af], // Hangul Syllables
|
|
27
|
+
[0xf900, 0xfaff], // CJK Compatibility Ideographs
|
|
28
|
+
[0xfe10, 0xfe1f], // Vertical Forms
|
|
29
|
+
[0xfe30, 0xfe6f], // CJK Compatibility Forms, Small Form Variants
|
|
30
|
+
[0xff01, 0xff60], // Fullwidth ASCII variants
|
|
31
|
+
[0xffe0, 0xffe6], // Fullwidth currency symbols
|
|
32
|
+
[0x1f300, 0x1f9ff], // Miscellaneous Symbols and Pictographs, Emoticons
|
|
33
|
+
[0x20000, 0x2a6df], // CJK Unified Ideographs Extension B
|
|
34
|
+
[0x2a700, 0x2ceaf], // CJK Unified Ideographs Extensions C/D/E
|
|
35
|
+
[0x2ceb0, 0x2ebef], // CJK Unified Ideographs Extension F
|
|
36
|
+
[0x30000, 0x3134f], // CJK Unified Ideographs Extension G
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Check whether a Unicode code point occupies 2 terminal columns.
|
|
40
|
+
* Uses binary search over pre-sorted wide character ranges.
|
|
41
|
+
*/
|
|
42
|
+
function isWideChar(codePoint) {
|
|
43
|
+
let low = 0;
|
|
44
|
+
let high = WIDE_CHAR_RANGES.length - 1;
|
|
45
|
+
while (low <= high) {
|
|
46
|
+
const mid = (low + high) >>> 1;
|
|
47
|
+
const range = WIDE_CHAR_RANGES[mid];
|
|
48
|
+
if (!range)
|
|
49
|
+
break;
|
|
50
|
+
if (codePoint < range[0]) {
|
|
51
|
+
high = mid - 1;
|
|
52
|
+
}
|
|
53
|
+
else if (codePoint > range[1]) {
|
|
54
|
+
low = mid + 1;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get current terminal width.
|
|
64
|
+
*
|
|
65
|
+
* Falls back to 80 columns when stdout is not a TTY (e.g. piped output, CI).
|
|
66
|
+
* Clamped to [60, 200] to prevent degenerate layouts on extremely narrow
|
|
67
|
+
* or wide terminals.
|
|
68
|
+
*/
|
|
69
|
+
export function getTerminalWidth() {
|
|
70
|
+
const columns = process.stdout.columns || 80;
|
|
71
|
+
return Math.max(60, Math.min(columns, 200));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Calculate the display width of a string in terminal columns.
|
|
75
|
+
*
|
|
76
|
+
* Strips ANSI escape codes before measuring. CJK and other East Asian
|
|
77
|
+
* wide characters count as 2 columns; all other printable characters
|
|
78
|
+
* count as 1 column. Control characters (except ANSI sequences) are
|
|
79
|
+
* counted as 0 columns.
|
|
80
|
+
*
|
|
81
|
+
* @param str - Input string, may contain ANSI escape codes
|
|
82
|
+
* @returns Number of terminal columns the string occupies
|
|
83
|
+
*/
|
|
84
|
+
export function displayWidth(str) {
|
|
85
|
+
const clean = str.replace(ANSI_REGEX, '');
|
|
86
|
+
let width = 0;
|
|
87
|
+
for (const char of clean) {
|
|
88
|
+
const codePoint = char.codePointAt(0);
|
|
89
|
+
if (codePoint === undefined)
|
|
90
|
+
continue;
|
|
91
|
+
// Skip common control characters (tab, newline, etc.)
|
|
92
|
+
if (codePoint < 0x20 && codePoint !== 0x09)
|
|
93
|
+
continue;
|
|
94
|
+
// Tab counts as 1 for simplicity (actual rendering depends on terminal)
|
|
95
|
+
if (codePoint === 0x09) {
|
|
96
|
+
width += 1;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
width += isWideChar(codePoint) ? 2 : 1;
|
|
100
|
+
}
|
|
101
|
+
return width;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Pad a string with trailing spaces to reach the target display width.
|
|
105
|
+
*
|
|
106
|
+
* Unlike `String.prototype.padEnd`, this accounts for CJK characters
|
|
107
|
+
* that occupy 2 terminal columns. If the string already meets or exceeds
|
|
108
|
+
* the target width, it is returned unchanged.
|
|
109
|
+
*
|
|
110
|
+
* @param str - Input string to pad
|
|
111
|
+
* @param targetWidth - Desired display width in terminal columns
|
|
112
|
+
* @returns Padded string
|
|
113
|
+
*/
|
|
114
|
+
export function padEndByWidth(str, targetWidth) {
|
|
115
|
+
const currentWidth = displayWidth(str);
|
|
116
|
+
if (currentWidth >= targetWidth)
|
|
117
|
+
return str;
|
|
118
|
+
return str + ' '.repeat(targetWidth - currentWidth);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Truncate a string to fit within a maximum display width.
|
|
122
|
+
*
|
|
123
|
+
* If the string exceeds `maxWidth`, it is truncated and an ellipsis suffix
|
|
124
|
+
* is appended. CJK characters are handled correctly — truncation never
|
|
125
|
+
* splits a wide character. ANSI escape codes are preserved for characters
|
|
126
|
+
* that remain in the output.
|
|
127
|
+
*
|
|
128
|
+
* @param str - Input string (plain text, no ANSI codes expected)
|
|
129
|
+
* @param maxWidth - Maximum display width in terminal columns
|
|
130
|
+
* @param suffix - Suffix to append when truncated (default: "..")
|
|
131
|
+
* @returns Truncated string fitting within maxWidth columns
|
|
132
|
+
*/
|
|
133
|
+
/**
|
|
134
|
+
* Wrap a string containing ANSI escape codes to fit within maxWidth display columns.
|
|
135
|
+
*
|
|
136
|
+
* Splits the line into segments that each fit within maxWidth. ANSI style state
|
|
137
|
+
* is tracked and replayed on continuation lines so colors/bold carry over correctly.
|
|
138
|
+
*
|
|
139
|
+
* @returns Array of line segments (at least one element)
|
|
140
|
+
*/
|
|
141
|
+
export function wrapAnsiLine(line, maxWidth, hangingIndent = 0) {
|
|
142
|
+
if (maxWidth <= 4)
|
|
143
|
+
return [line];
|
|
144
|
+
const result = [];
|
|
145
|
+
let current = '';
|
|
146
|
+
let width = 0;
|
|
147
|
+
let ansiState = '';
|
|
148
|
+
let i = 0;
|
|
149
|
+
while (i < line.length) {
|
|
150
|
+
if (line.charCodeAt(i) === 0x1b && i + 1 < line.length && line.charCodeAt(i + 1) === 0x5b) {
|
|
151
|
+
let j = i + 2;
|
|
152
|
+
while (j < line.length && line.charCodeAt(j) !== 0x6d)
|
|
153
|
+
j++;
|
|
154
|
+
const seq = line.slice(i, j + 1);
|
|
155
|
+
current += seq;
|
|
156
|
+
ansiState += seq;
|
|
157
|
+
i = j + 1;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const code = line.codePointAt(i);
|
|
161
|
+
if (code === undefined) {
|
|
162
|
+
i++;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const char = String.fromCodePoint(code);
|
|
166
|
+
const step = char.length;
|
|
167
|
+
const cw = isWideChar(code) ? 2 : 1;
|
|
168
|
+
// Continuation lines have reduced available width due to hanging indent
|
|
169
|
+
const effectiveMax = result.length === 0 ? maxWidth : maxWidth - hangingIndent;
|
|
170
|
+
if (width > 0 && width + cw > effectiveMax) {
|
|
171
|
+
result.push(current + '\x1b[0m');
|
|
172
|
+
const prefix = hangingIndent > 0 ? ' '.repeat(hangingIndent) : '';
|
|
173
|
+
current = prefix + ansiState + char;
|
|
174
|
+
width = hangingIndent + cw;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
current += char;
|
|
178
|
+
width += cw;
|
|
179
|
+
}
|
|
180
|
+
i += step;
|
|
181
|
+
}
|
|
182
|
+
if (current)
|
|
183
|
+
result.push(current);
|
|
184
|
+
return result.length > 0 ? result : [''];
|
|
185
|
+
}
|
|
186
|
+
export function truncateByWidth(str, maxWidth, suffix = '..') {
|
|
187
|
+
if (displayWidth(str) <= maxWidth)
|
|
188
|
+
return str;
|
|
189
|
+
const suffixWidth = displayWidth(suffix);
|
|
190
|
+
const availableWidth = maxWidth - suffixWidth;
|
|
191
|
+
if (availableWidth <= 0)
|
|
192
|
+
return suffix.slice(0, maxWidth);
|
|
193
|
+
let width = 0;
|
|
194
|
+
let result = '';
|
|
195
|
+
for (const char of str) {
|
|
196
|
+
const codePoint = char.codePointAt(0);
|
|
197
|
+
if (codePoint === undefined)
|
|
198
|
+
continue;
|
|
199
|
+
const charWidth = isWideChar(codePoint) ? 2 : 1;
|
|
200
|
+
if (width + charWidth > availableWidth)
|
|
201
|
+
break;
|
|
202
|
+
result += char;
|
|
203
|
+
width += charWidth;
|
|
204
|
+
}
|
|
205
|
+
return result + suffix;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "eff-u-code",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Production-grade code quality analyzer with AST parsing and AI integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"fuck-u-code": "bin/fuck-u-code.js",
|
|
9
|
+
"fuck-u-code-mcp": "bin/fuck-u-code-mcp.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"start": "node dist/index.js",
|
|
15
|
+
"test": "vitest",
|
|
16
|
+
"test:coverage": "vitest --coverage",
|
|
17
|
+
"lint": "eslint src --ext .ts",
|
|
18
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
19
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
20
|
+
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
21
|
+
"prepare": "npm run build",
|
|
22
|
+
"postinstall": "node bin/postinstall.js"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"code-quality",
|
|
26
|
+
"static-analysis",
|
|
27
|
+
"ast",
|
|
28
|
+
"tree-sitter",
|
|
29
|
+
"ai",
|
|
30
|
+
"code-review",
|
|
31
|
+
"complexity",
|
|
32
|
+
"metrics"
|
|
33
|
+
],
|
|
34
|
+
"author": "Done-0",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/Done-0/fuck-u-code.git"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18.0.0"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@anthropic-ai/sdk": "^0.74.0",
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
46
|
+
"chalk": "^5.4.1",
|
|
47
|
+
"cli-table3": "^0.6.5",
|
|
48
|
+
"commander": "^14.0.3",
|
|
49
|
+
"cosmiconfig": "^9.0.0",
|
|
50
|
+
"glob": "^11.0.0",
|
|
51
|
+
"ignore": "^7.0.5",
|
|
52
|
+
"inquirer": "^13.2.2",
|
|
53
|
+
"openai": "^4.77.0",
|
|
54
|
+
"ora": "^9.3.0",
|
|
55
|
+
"p-limit": "^6.0.0",
|
|
56
|
+
"tree-sitter-wasms": "^0.1.13",
|
|
57
|
+
"web-tree-sitter": "^0.24.7",
|
|
58
|
+
"zod": "^3.24.1"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/node": "^22.0.0",
|
|
62
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
63
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
64
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
65
|
+
"eslint": "^9.0.0",
|
|
66
|
+
"eslint-config-prettier": "^10.0.0",
|
|
67
|
+
"prettier": "^3.5.0",
|
|
68
|
+
"typescript": "^5.7.0",
|
|
69
|
+
"typescript-eslint": "^8.55.0",
|
|
70
|
+
"vitest": "^3.0.0"
|
|
71
|
+
},
|
|
72
|
+
"files": [
|
|
73
|
+
"dist",
|
|
74
|
+
"bin",
|
|
75
|
+
"README.md"
|
|
76
|
+
]
|
|
77
|
+
}
|