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.
Files changed (245) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/bin/fuck-u-code-mcp.js +2 -0
  4. package/bin/fuck-u-code.js +2 -0
  5. package/bin/postinstall.js +53 -0
  6. package/dist/ai/index.d.ts +34 -0
  7. package/dist/ai/index.d.ts.map +1 -0
  8. package/dist/ai/index.js +227 -0
  9. package/dist/ai/index.js.map +1 -0
  10. package/dist/ai/prompts/code-review.d.ts +9 -0
  11. package/dist/ai/prompts/code-review.d.ts.map +1 -0
  12. package/dist/ai/prompts/code-review.js +61 -0
  13. package/dist/ai/prompts/code-review.js.map +1 -0
  14. package/dist/ai/providers/anthropic.d.ts +11 -0
  15. package/dist/ai/providers/anthropic.d.ts.map +1 -0
  16. package/dist/ai/providers/anthropic.js +60 -0
  17. package/dist/ai/providers/anthropic.js.map +1 -0
  18. package/dist/ai/providers/fetch.d.ts +10 -0
  19. package/dist/ai/providers/fetch.d.ts.map +1 -0
  20. package/dist/ai/providers/fetch.js +50 -0
  21. package/dist/ai/providers/fetch.js.map +1 -0
  22. package/dist/ai/providers/gemini.d.ts +12 -0
  23. package/dist/ai/providers/gemini.d.ts.map +1 -0
  24. package/dist/ai/providers/gemini.js +66 -0
  25. package/dist/ai/providers/gemini.js.map +1 -0
  26. package/dist/ai/providers/ollama.d.ts +11 -0
  27. package/dist/ai/providers/ollama.d.ts.map +1 -0
  28. package/dist/ai/providers/ollama.js +54 -0
  29. package/dist/ai/providers/ollama.js.map +1 -0
  30. package/dist/ai/providers/openai.d.ts +11 -0
  31. package/dist/ai/providers/openai.d.ts.map +1 -0
  32. package/dist/ai/providers/openai.js +52 -0
  33. package/dist/ai/providers/openai.js.map +1 -0
  34. package/dist/ai/selector.d.ts +19 -0
  35. package/dist/ai/selector.d.ts.map +1 -0
  36. package/dist/ai/selector.js +145 -0
  37. package/dist/ai/selector.js.map +1 -0
  38. package/dist/ai/types.d.ts +120 -0
  39. package/dist/ai/types.d.ts.map +1 -0
  40. package/dist/ai/types.js +6 -0
  41. package/dist/ai/types.js.map +1 -0
  42. package/dist/analyzer/concurrent-analyzer.d.ts +11 -0
  43. package/dist/analyzer/concurrent-analyzer.d.ts.map +1 -0
  44. package/dist/analyzer/concurrent-analyzer.js +67 -0
  45. package/dist/analyzer/concurrent-analyzer.js.map +1 -0
  46. package/dist/analyzer/file-discovery.d.ts +23 -0
  47. package/dist/analyzer/file-discovery.d.ts.map +1 -0
  48. package/dist/analyzer/file-discovery.js +64 -0
  49. package/dist/analyzer/file-discovery.js.map +1 -0
  50. package/dist/analyzer/index.d.ts +27 -0
  51. package/dist/analyzer/index.d.ts.map +1 -0
  52. package/dist/analyzer/index.js +64 -0
  53. package/dist/analyzer/index.js.map +1 -0
  54. package/dist/cli/commands/ai-review.d.ts +6 -0
  55. package/dist/cli/commands/ai-review.d.ts.map +1 -0
  56. package/dist/cli/commands/ai-review.js +213 -0
  57. package/dist/cli/commands/ai-review.js.map +1 -0
  58. package/dist/cli/commands/analyze.d.ts +6 -0
  59. package/dist/cli/commands/analyze.d.ts.map +1 -0
  60. package/dist/cli/commands/analyze.js +145 -0
  61. package/dist/cli/commands/analyze.js.map +1 -0
  62. package/dist/cli/commands/config.d.ts +6 -0
  63. package/dist/cli/commands/config.d.ts.map +1 -0
  64. package/dist/cli/commands/config.js +147 -0
  65. package/dist/cli/commands/config.js.map +1 -0
  66. package/dist/cli/commands/mcp-install.d.ts +9 -0
  67. package/dist/cli/commands/mcp-install.d.ts.map +1 -0
  68. package/dist/cli/commands/mcp-install.js +102 -0
  69. package/dist/cli/commands/mcp-install.js.map +1 -0
  70. package/dist/cli/index.d.ts +7 -0
  71. package/dist/cli/index.d.ts.map +1 -0
  72. package/dist/cli/index.js +69 -0
  73. package/dist/cli/index.js.map +1 -0
  74. package/dist/cli/output/ai-review-output.d.ts +20 -0
  75. package/dist/cli/output/ai-review-output.d.ts.map +1 -0
  76. package/dist/cli/output/ai-review-output.js +324 -0
  77. package/dist/cli/output/ai-review-output.js.map +1 -0
  78. package/dist/cli/output/console.d.ts +31 -0
  79. package/dist/cli/output/console.d.ts.map +1 -0
  80. package/dist/cli/output/console.js +571 -0
  81. package/dist/cli/output/console.js.map +1 -0
  82. package/dist/cli/output/html.d.ts +20 -0
  83. package/dist/cli/output/html.d.ts.map +1 -0
  84. package/dist/cli/output/html.js +339 -0
  85. package/dist/cli/output/html.js.map +1 -0
  86. package/dist/cli/output/json.d.ts +8 -0
  87. package/dist/cli/output/json.d.ts.map +1 -0
  88. package/dist/cli/output/json.js +46 -0
  89. package/dist/cli/output/json.js.map +1 -0
  90. package/dist/cli/output/markdown.d.ts +17 -0
  91. package/dist/cli/output/markdown.d.ts.map +1 -0
  92. package/dist/cli/output/markdown.js +323 -0
  93. package/dist/cli/output/markdown.js.map +1 -0
  94. package/dist/cli/output/stats.d.ts +35 -0
  95. package/dist/cli/output/stats.d.ts.map +1 -0
  96. package/dist/cli/output/stats.js +63 -0
  97. package/dist/cli/output/stats.js.map +1 -0
  98. package/dist/cli/output/terminal-markdown.d.ts +23 -0
  99. package/dist/cli/output/terminal-markdown.d.ts.map +1 -0
  100. package/dist/cli/output/terminal-markdown.js +159 -0
  101. package/dist/cli/output/terminal-markdown.js.map +1 -0
  102. package/dist/config/index.d.ts +27 -0
  103. package/dist/config/index.d.ts.map +1 -0
  104. package/dist/config/index.js +266 -0
  105. package/dist/config/index.js.map +1 -0
  106. package/dist/config/schema.d.ts +179 -0
  107. package/dist/config/schema.d.ts.map +1 -0
  108. package/dist/config/schema.js +85 -0
  109. package/dist/config/schema.js.map +1 -0
  110. package/dist/gitignore/index.d.ts +5 -0
  111. package/dist/gitignore/index.d.ts.map +1 -0
  112. package/dist/gitignore/index.js +5 -0
  113. package/dist/gitignore/index.js.map +1 -0
  114. package/dist/gitignore/parser.d.ts +32 -0
  115. package/dist/gitignore/parser.d.ts.map +1 -0
  116. package/dist/gitignore/parser.js +110 -0
  117. package/dist/gitignore/parser.js.map +1 -0
  118. package/dist/gitignore/parser.test.d.ts +2 -0
  119. package/dist/gitignore/parser.test.d.ts.map +1 -0
  120. package/dist/gitignore/parser.test.js +217 -0
  121. package/dist/gitignore/parser.test.js.map +1 -0
  122. package/dist/i18n/index.d.ts +19 -0
  123. package/dist/i18n/index.d.ts.map +1 -0
  124. package/dist/i18n/index.js +43 -0
  125. package/dist/i18n/index.js.map +1 -0
  126. package/dist/i18n/locales/en.json +320 -0
  127. package/dist/i18n/locales/ru.json +320 -0
  128. package/dist/i18n/locales/zh.json +320 -0
  129. package/dist/index.d.ts +5 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +10 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/mcp/server.d.ts +9 -0
  134. package/dist/mcp/server.d.ts.map +1 -0
  135. package/dist/mcp/server.js +156 -0
  136. package/dist/mcp/server.js.map +1 -0
  137. package/dist/metrics/complexity/cognitive.d.ts +25 -0
  138. package/dist/metrics/complexity/cognitive.d.ts.map +1 -0
  139. package/dist/metrics/complexity/cognitive.js +109 -0
  140. package/dist/metrics/complexity/cognitive.js.map +1 -0
  141. package/dist/metrics/complexity/cyclomatic.d.ts +21 -0
  142. package/dist/metrics/complexity/cyclomatic.d.ts.map +1 -0
  143. package/dist/metrics/complexity/cyclomatic.js +111 -0
  144. package/dist/metrics/complexity/cyclomatic.js.map +1 -0
  145. package/dist/metrics/complexity/nesting-depth.d.ts +19 -0
  146. package/dist/metrics/complexity/nesting-depth.d.ts.map +1 -0
  147. package/dist/metrics/complexity/nesting-depth.js +97 -0
  148. package/dist/metrics/complexity/nesting-depth.js.map +1 -0
  149. package/dist/metrics/documentation/comment-ratio.d.ts +21 -0
  150. package/dist/metrics/documentation/comment-ratio.d.ts.map +1 -0
  151. package/dist/metrics/documentation/comment-ratio.js +91 -0
  152. package/dist/metrics/documentation/comment-ratio.js.map +1 -0
  153. package/dist/metrics/duplication/code-duplication.d.ts +24 -0
  154. package/dist/metrics/duplication/code-duplication.d.ts.map +1 -0
  155. package/dist/metrics/duplication/code-duplication.js +167 -0
  156. package/dist/metrics/duplication/code-duplication.js.map +1 -0
  157. package/dist/metrics/duplication/code-duplication.test.d.ts +2 -0
  158. package/dist/metrics/duplication/code-duplication.test.d.ts.map +1 -0
  159. package/dist/metrics/duplication/code-duplication.test.js +612 -0
  160. package/dist/metrics/duplication/code-duplication.test.js.map +1 -0
  161. package/dist/metrics/error/error-handling.d.ts +23 -0
  162. package/dist/metrics/error/error-handling.d.ts.map +1 -0
  163. package/dist/metrics/error/error-handling.js +164 -0
  164. package/dist/metrics/error/error-handling.js.map +1 -0
  165. package/dist/metrics/error/error-handling.test.d.ts +2 -0
  166. package/dist/metrics/error/error-handling.test.d.ts.map +1 -0
  167. package/dist/metrics/error/error-handling.test.js +349 -0
  168. package/dist/metrics/error/error-handling.test.js.map +1 -0
  169. package/dist/metrics/index.d.ts +21 -0
  170. package/dist/metrics/index.d.ts.map +1 -0
  171. package/dist/metrics/index.js +50 -0
  172. package/dist/metrics/index.js.map +1 -0
  173. package/dist/metrics/naming/convention.d.ts +22 -0
  174. package/dist/metrics/naming/convention.d.ts.map +1 -0
  175. package/dist/metrics/naming/convention.js +117 -0
  176. package/dist/metrics/naming/convention.js.map +1 -0
  177. package/dist/metrics/size/file-length.d.ts +19 -0
  178. package/dist/metrics/size/file-length.d.ts.map +1 -0
  179. package/dist/metrics/size/file-length.js +68 -0
  180. package/dist/metrics/size/file-length.js.map +1 -0
  181. package/dist/metrics/size/function-length.d.ts +20 -0
  182. package/dist/metrics/size/function-length.d.ts.map +1 -0
  183. package/dist/metrics/size/function-length.js +101 -0
  184. package/dist/metrics/size/function-length.js.map +1 -0
  185. package/dist/metrics/size/parameter-count.d.ts +19 -0
  186. package/dist/metrics/size/parameter-count.d.ts.map +1 -0
  187. package/dist/metrics/size/parameter-count.js +97 -0
  188. package/dist/metrics/size/parameter-count.js.map +1 -0
  189. package/dist/metrics/structure/structure-analysis.d.ts +24 -0
  190. package/dist/metrics/structure/structure-analysis.d.ts.map +1 -0
  191. package/dist/metrics/structure/structure-analysis.js +223 -0
  192. package/dist/metrics/structure/structure-analysis.js.map +1 -0
  193. package/dist/metrics/structure/structure-analysis.test.d.ts +2 -0
  194. package/dist/metrics/structure/structure-analysis.test.d.ts.map +1 -0
  195. package/dist/metrics/structure/structure-analysis.test.js +342 -0
  196. package/dist/metrics/structure/structure-analysis.test.js.map +1 -0
  197. package/dist/metrics/types.d.ts +71 -0
  198. package/dist/metrics/types.d.ts.map +1 -0
  199. package/dist/metrics/types.js +5 -0
  200. package/dist/metrics/types.js.map +1 -0
  201. package/dist/parser/generic-parser.d.ts +28 -0
  202. package/dist/parser/generic-parser.d.ts.map +1 -0
  203. package/dist/parser/generic-parser.js +218 -0
  204. package/dist/parser/generic-parser.js.map +1 -0
  205. package/dist/parser/index.d.ts +19 -0
  206. package/dist/parser/index.d.ts.map +1 -0
  207. package/dist/parser/index.js +52 -0
  208. package/dist/parser/index.js.map +1 -0
  209. package/dist/parser/regex-parser.d.ts +46 -0
  210. package/dist/parser/regex-parser.d.ts.map +1 -0
  211. package/dist/parser/regex-parser.js +560 -0
  212. package/dist/parser/regex-parser.js.map +1 -0
  213. package/dist/parser/tree-sitter-parser.d.ts +50 -0
  214. package/dist/parser/tree-sitter-parser.d.ts.map +1 -0
  215. package/dist/parser/tree-sitter-parser.js +707 -0
  216. package/dist/parser/tree-sitter-parser.js.map +1 -0
  217. package/dist/parser/types.d.ts +52 -0
  218. package/dist/parser/types.d.ts.map +1 -0
  219. package/dist/parser/types.js +49 -0
  220. package/dist/parser/types.js.map +1 -0
  221. package/dist/scoring/index.d.ts +14 -0
  222. package/dist/scoring/index.d.ts.map +1 -0
  223. package/dist/scoring/index.js +80 -0
  224. package/dist/scoring/index.js.map +1 -0
  225. package/dist/utils/fs.d.ts +24 -0
  226. package/dist/utils/fs.d.ts.map +1 -0
  227. package/dist/utils/fs.js +61 -0
  228. package/dist/utils/fs.js.map +1 -0
  229. package/dist/utils/logger.d.ts +13 -0
  230. package/dist/utils/logger.d.ts.map +1 -0
  231. package/dist/utils/logger.js +43 -0
  232. package/dist/utils/logger.js.map +1 -0
  233. package/dist/utils/markdown.d.ts +16 -0
  234. package/dist/utils/markdown.d.ts.map +1 -0
  235. package/dist/utils/markdown.js +303 -0
  236. package/dist/utils/markdown.js.map +1 -0
  237. package/dist/utils/progress.d.ts +24 -0
  238. package/dist/utils/progress.d.ts.map +1 -0
  239. package/dist/utils/progress.js +79 -0
  240. package/dist/utils/progress.js.map +1 -0
  241. package/dist/utils/terminal.d.ts +62 -0
  242. package/dist/utils/terminal.d.ts.map +1 -0
  243. package/dist/utils/terminal.js +207 -0
  244. package/dist/utils/terminal.js.map +1 -0
  245. 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
+ }