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,320 @@
|
|
|
1
|
+
{
|
|
2
|
+
"analyzing": "正在嗅探代码质量...",
|
|
3
|
+
"analysisComplete": "嗅探完成",
|
|
4
|
+
"analysisFailed": "嗅探失败",
|
|
5
|
+
"aiReviewing": "AI 正在审查代码...",
|
|
6
|
+
"aiReviewComplete": "AI 审查完成",
|
|
7
|
+
"aiReviewFailed": "AI 审查失败",
|
|
8
|
+
"reviewingFile": "正在审查 {file}...",
|
|
9
|
+
"noAIProvider": "未配置 AI 提供商",
|
|
10
|
+
"aiProviderHint": "请设置 OPENAI_API_KEY、ANTHROPIC_API_KEY、DEEPSEEK_API_KEY、GEMINI_API_KEY 或 OLLAMA_HOST 环境变量",
|
|
11
|
+
"outputWritten": "输出已写入 {file}",
|
|
12
|
+
"filesAnalyzed": "已分析 {count} 个文件",
|
|
13
|
+
"skippedFiles": "跳过了 {count} 个文件",
|
|
14
|
+
"analysisTime": "分析耗时 {time}ms",
|
|
15
|
+
"noFilesFound": "未找到可分析的文件",
|
|
16
|
+
"report_title": "屎山代码分析报告",
|
|
17
|
+
"report_overall_score": "总体评分: {score} / 100",
|
|
18
|
+
"report_level": "屎山等级: {level}",
|
|
19
|
+
"report_metrics_details": "评分指标详情",
|
|
20
|
+
"report_worst_files": "最屎代码排行榜",
|
|
21
|
+
"report_conclusion": "诊断结论",
|
|
22
|
+
"report_file_score": "屎气指数: {score}",
|
|
23
|
+
"report_more_issues": "...还有 {count} 个问题实在太屎,列不完了",
|
|
24
|
+
"report_score_calc": "评分计算",
|
|
25
|
+
"report_no_issues": "恭喜!没有特别多问题的文件!",
|
|
26
|
+
"overallScore": "屎气指数",
|
|
27
|
+
"worstFiles": "最屎代码排行榜",
|
|
28
|
+
"metricsSummary": "指标摘要",
|
|
29
|
+
"file": "文件",
|
|
30
|
+
"score": "评分",
|
|
31
|
+
"issues": "问题",
|
|
32
|
+
"complexity": "复杂度",
|
|
33
|
+
"size": "代码量",
|
|
34
|
+
"duplication": "重复度",
|
|
35
|
+
"documentation": "文档",
|
|
36
|
+
"naming": "命名",
|
|
37
|
+
"structure": "结构",
|
|
38
|
+
"error": "错误处理",
|
|
39
|
+
"level_clean": "清新可人",
|
|
40
|
+
"level_clean_desc": "代码洁净,令人赏心悦目",
|
|
41
|
+
"level_mild": "偶有异味",
|
|
42
|
+
"level_mild_desc": "基本没事,但是有伤风化",
|
|
43
|
+
"level_moderate": "微臭青年",
|
|
44
|
+
"level_moderate_desc": "略有异味,建议适量通风",
|
|
45
|
+
"level_bad": "屎气扑鼻",
|
|
46
|
+
"level_bad_desc": "代码开始散发气味,谨慎维护",
|
|
47
|
+
"level_terrible": "中度屎山",
|
|
48
|
+
"level_terrible_desc": "臭味明显,开窗也救不了",
|
|
49
|
+
"level_disaster": "隐性毒瘤",
|
|
50
|
+
"level_disaster_desc": "写时一时爽,改时火葬场",
|
|
51
|
+
"level_severe": "重度屎山",
|
|
52
|
+
"level_severe_desc": "毒气弥漫,建议戴防毒面具",
|
|
53
|
+
"level_very_bad": "代码化尸场",
|
|
54
|
+
"level_very_bad_desc": "进去的程序员没有一个活着出来",
|
|
55
|
+
"level_extreme": "核平级灾难",
|
|
56
|
+
"level_extreme_desc": "反人类罪行,建议火化",
|
|
57
|
+
"level_worst": "祖传老屎",
|
|
58
|
+
"level_worst_desc": "历代工程师共创的遗产,无法维护",
|
|
59
|
+
"level_ultimate": "终极屎王",
|
|
60
|
+
"level_ultimate_desc": "写的时候热血澎湃,改的时候亲妈都不认",
|
|
61
|
+
"score_comment_0": "如沐春风,仿佛被天使亲吻过",
|
|
62
|
+
"score_comment_10": "清新宜人,初闻像早晨的露珠",
|
|
63
|
+
"score_comment_20": "略带清香,偶尔飘过一丝酸爽",
|
|
64
|
+
"score_comment_30": "有点臭味,但还不至于熏死人",
|
|
65
|
+
"score_comment_40": "臭气扑鼻,建议佩戴口罩阅读",
|
|
66
|
+
"score_comment_50": "毒气缭绕,代码审查犹如酷刑",
|
|
67
|
+
"score_comment_60": "熏天臭气,维护者已开始咳血",
|
|
68
|
+
"score_comment_70": "生化危机,接手前请立好遗嘱",
|
|
69
|
+
"score_comment_80": "核废料现场,需穿防护服维护",
|
|
70
|
+
"score_comment_90": "厄难级毒瘤,看一眼减寿十年",
|
|
71
|
+
"metric_cyclomatic_complexity": "循环复杂度",
|
|
72
|
+
"metric_cognitive_complexity": "认知复杂度",
|
|
73
|
+
"metric_nesting_depth": "嵌套深度",
|
|
74
|
+
"metric_function_length": "函数长度",
|
|
75
|
+
"metric_file_length": "文件长度",
|
|
76
|
+
"metric_parameter_count": "参数数量",
|
|
77
|
+
"metric_comment_ratio": "注释比例",
|
|
78
|
+
"metric_naming_convention": "命名规范",
|
|
79
|
+
"metric_error_handling": "错误处理",
|
|
80
|
+
"metric_code_duplication": "代码重复",
|
|
81
|
+
"metric_structure_analysis": "结构分析",
|
|
82
|
+
"metric_complexity_good": "结构清晰,不绕弯子,赞",
|
|
83
|
+
"metric_complexity_medium": "绕来绕去,跟你脑子一样乱",
|
|
84
|
+
"metric_complexity_bad": "函数像迷宫,维护像打副本",
|
|
85
|
+
"metric_length_good": "短小精悍,一目了然",
|
|
86
|
+
"metric_length_medium": "有点长了,考虑拆分一下",
|
|
87
|
+
"metric_length_bad": "又臭又长,看完眼睛都瞎了",
|
|
88
|
+
"metric_comment_good": "注释不错,能靠它活下来",
|
|
89
|
+
"metric_comment_medium": "注释稀薄,读者全靠脑补",
|
|
90
|
+
"metric_comment_bad": "没有注释,靠缘分理解吧",
|
|
91
|
+
"metric_naming_good": "命名清晰,程序员的文明之光",
|
|
92
|
+
"metric_naming_medium": "命名还行,有些得猜",
|
|
93
|
+
"metric_naming_bad": "变量名像键盘砸出来的:x, y, z, tmp, xxx",
|
|
94
|
+
"metric_structure_good": "结构优美,不容易看岔",
|
|
95
|
+
"metric_structure_medium": "结构还行,但有点混乱",
|
|
96
|
+
"metric_structure_bad": "层层嵌套,套娃结构,看完眼花",
|
|
97
|
+
"issue_category_complexity": "复杂度问题",
|
|
98
|
+
"issue_category_comment": "注释问题",
|
|
99
|
+
"issue_category_naming": "命名问题",
|
|
100
|
+
"issue_category_structure": "结构问题",
|
|
101
|
+
"issue_category_duplication": "重复问题",
|
|
102
|
+
"issue_category_error": "错误处理问题",
|
|
103
|
+
"issue_category_other": "其他问题",
|
|
104
|
+
"advice_good": "继续保持,你是编码界的一股清流,代码洁癖者的骄傲",
|
|
105
|
+
"advice_moderate": "这代码像个叛逆期的青少年,需要适当管教才能成才",
|
|
106
|
+
"advice_bad": "删库跑路是唯一出路,或者封印它,等下辈子再维护",
|
|
107
|
+
"severity_info": "信息",
|
|
108
|
+
"severity_warning": "警告",
|
|
109
|
+
"severity_error": "错误",
|
|
110
|
+
"severity_critical": "严重",
|
|
111
|
+
"detail_no_functions": "未发现函数",
|
|
112
|
+
"detail_structure_issues": "{count} 个结构问题",
|
|
113
|
+
"detail_duplication": "{percent}% 重复 ({duplicates}/{total})",
|
|
114
|
+
"detail_errors_ignored": "{ignored}/{total} 个错误被忽略 ({percent}%)",
|
|
115
|
+
"detail_no_error_prone_calls": "未检测到易出错调用",
|
|
116
|
+
"detail_file_length": "{code} 代码量 ({total} 总计)",
|
|
117
|
+
"issue_high_nesting": "嵌套过深: {depth}",
|
|
118
|
+
"issue_medium_nesting": "中等嵌套: {depth}",
|
|
119
|
+
"issue_file_too_large": "文件过大: {lines} 行",
|
|
120
|
+
"issue_too_many_functions": "函数过多: {count}",
|
|
121
|
+
"issue_too_many_imports": "导入过多: {count}",
|
|
122
|
+
"issue_circular_deps": "循环依赖: {count}",
|
|
123
|
+
"issue_duplicate_pattern": "重复模式: {names}",
|
|
124
|
+
"issue_ignored_error": "忽略了错误返回值",
|
|
125
|
+
"issue_unhandled_error": "未处理的易出错调用",
|
|
126
|
+
"detail_no_code_lines": "无代码行",
|
|
127
|
+
"detail_avg_max": "平均: {avg}, 最大: {max}",
|
|
128
|
+
"detail_avg_lines_max_lines": "平均: {avg} 行, 最大: {max} 行",
|
|
129
|
+
"detail_ratio": "{ratio}% ({comments}/{code})",
|
|
130
|
+
"detail_violations": "发现 {count} 个违规",
|
|
131
|
+
"detail_no_violations": "无命名违规",
|
|
132
|
+
"threshold_excellent": "优秀 (≤{value})",
|
|
133
|
+
"threshold_good": "良好 ({min}-{max})",
|
|
134
|
+
"threshold_acceptable": "可接受 ({min}-{max})",
|
|
135
|
+
"threshold_poor": "较差 (>{value})",
|
|
136
|
+
"verbose_basic_statistics": "基本统计",
|
|
137
|
+
"verbose_total_files": "总文件数",
|
|
138
|
+
"verbose_total_lines": "总代码行",
|
|
139
|
+
"verbose_total_issues": "总问题数",
|
|
140
|
+
"verbose_file_good_quality": "代码质量良好,没有明显问题",
|
|
141
|
+
"verbose_file_stats": "行数: {total} 总计, {code} 代码, {comment} 注释 | 函数: {functions} | 类: {classes}",
|
|
142
|
+
"verbose_function_details": "函数详情",
|
|
143
|
+
"verbose_all_issues": "全部问题 ({count})",
|
|
144
|
+
"verbose_metric_details": "详情",
|
|
145
|
+
"verbose_col_function": "函数",
|
|
146
|
+
"verbose_col_range": "行范围",
|
|
147
|
+
"verbose_col_line_count": "行数",
|
|
148
|
+
"verbose_col_complexity": "复杂度",
|
|
149
|
+
"verbose_col_nesting": "嵌套",
|
|
150
|
+
"verbose_col_params": "参数",
|
|
151
|
+
"verbose_col_docstring": "注释",
|
|
152
|
+
"ai_review_title": "AI 代码审查",
|
|
153
|
+
"ai_api_key_required": "需要 API 密钥。使用 --api-key 或设置环境变量。",
|
|
154
|
+
"ai_model_required": "需要指定模型。使用 --model 指定模型。",
|
|
155
|
+
"ai_example_usage": "使用示例:",
|
|
156
|
+
"ai_or_set_env": "或设置环境变量:",
|
|
157
|
+
"ai_no_provider": "没有可用的 AI 提供商",
|
|
158
|
+
"ai_score_excellent": "优秀",
|
|
159
|
+
"ai_score_good": "良好",
|
|
160
|
+
"ai_score_acceptable": "可接受",
|
|
161
|
+
"ai_score_poor": "较差",
|
|
162
|
+
"ai_score_critical": "严重",
|
|
163
|
+
"ai_file_analysis_report": "文件分析报告",
|
|
164
|
+
"ai_code_statistics": "代码统计",
|
|
165
|
+
"ai_metrics_analysis": "指标分析",
|
|
166
|
+
"ai_detected_issues": "检测到的问题",
|
|
167
|
+
"ai_function_analysis": "函数分析(按复杂度排序)",
|
|
168
|
+
"ai_no_issues_detected": "未检测到重大问题",
|
|
169
|
+
"ai_no_functions_detected": "未检测到函数",
|
|
170
|
+
"ai_total_lines": "总行数",
|
|
171
|
+
"ai_code_lines": "代码行",
|
|
172
|
+
"ai_comment_lines": "注释行",
|
|
173
|
+
"ai_blank_lines": "空白行",
|
|
174
|
+
"ai_comment_ratio": "注释比例",
|
|
175
|
+
"ai_functions": "函数数",
|
|
176
|
+
"ai_classes": "类数",
|
|
177
|
+
"ai_high_complexity": "高复杂度",
|
|
178
|
+
"ai_long_function": "函数过长",
|
|
179
|
+
"ai_deep_nesting": "嵌套过深",
|
|
180
|
+
"ai_many_parameters": "参数过多",
|
|
181
|
+
"ai_review_request": "根据以上本地分析结果,请提供:",
|
|
182
|
+
"ai_review_request_1": "最关键的代码质量问题总结",
|
|
183
|
+
"ai_review_request_2": "具体可操作的重构建议及优先级",
|
|
184
|
+
"ai_review_request_3": "如有安全隐患请指出",
|
|
185
|
+
"ai_review_request_4": "提高可维护性的建议",
|
|
186
|
+
"ai_review_focus": "重点关注严重程度最高的问题和复杂度最高的函数。",
|
|
187
|
+
"ai_prompt_role": "你是一名资深代码审查工程师。分析提供的静态分析指标和源代码,输出精准、可执行的代码审查报告。",
|
|
188
|
+
"ai_prompt_output_rules": "使用结构清晰的 Markdown 格式输出审查报告。合理使用标题、列表、代码围栏和行内代码。每条建议必须具体可执行,禁止模糊的客套话。",
|
|
189
|
+
"ai_prompt_metrics_title": "指标定义",
|
|
190
|
+
"ai_prompt_metrics_complexity": "complexity(循环复杂度):衡量代码分支路径数量。CC = 1 + 决策点数量(if/loop/case/catch/&&/||/ternary)。",
|
|
191
|
+
"ai_prompt_metrics_nesting": "nesting(嵌套深度):代码块嵌套层数,影响可读性和认知负担。",
|
|
192
|
+
"ai_prompt_metrics_params": "params(参数数量):函数参数个数,过多降低可测试性。",
|
|
193
|
+
"ai_prompt_metrics_lines": "lines(函数长度):函数代码行数,过长可能承担过多职责。",
|
|
194
|
+
"ai_prompt_metrics_duplication": "duplication(代码重复度):重复代码模式的比例,>3% 需要重构。",
|
|
195
|
+
"ai_prompt_metrics_structure": "structure(结构分析):文件组织、嵌套深度、模块复杂度。",
|
|
196
|
+
"ai_prompt_metrics_error": "error(错误处理):错误处理模式,未捕获的异常和被忽略的错误。",
|
|
197
|
+
"ai_prompt_metrics_note": "以上指标基于 SonarQube、ESLint、Clean Code 等行业标准。具体阈值因项目复杂度而异。",
|
|
198
|
+
"ai_prompt_constraints_title": "约束条件",
|
|
199
|
+
"ai_prompt_constraint_no_repeat": "禁止重复指标原始数据,直接分析根因。",
|
|
200
|
+
"ai_prompt_constraint_location": "每个问题必须定位:函数名 + 起止行号。",
|
|
201
|
+
"ai_prompt_constraint_executable": "重构建议必须可立即执行。示例:\"将第45-67行提取为 calculateMetrics(data) 函数,返回 MetricResult[]\"。",
|
|
202
|
+
"ai_prompt_constraint_priority": "优先级:性能瓶颈 > 安全漏洞 > 可维护性风险 > 代码风格。",
|
|
203
|
+
"ai_prompt_constraint_lang_aware": "根据目标编程语言的惯例和最佳实践进行审查。",
|
|
204
|
+
"ai_prompt_output_title": "输出格式",
|
|
205
|
+
"ai_prompt_output_instruction": "严格使用以下 Markdown 标题结构。每个章节必须包含。总回复控制在 500 字以内。",
|
|
206
|
+
"ai_prompt_output_assessment": "一句话定位最严重问题的根本原因。说明为什么有问题,不要重复指标数字。",
|
|
207
|
+
"ai_prompt_output_critical_item": "每个问题使用以下格式:\n- **`函数名` (L起始行-结束行)**:根因描述 + 具体修复建议",
|
|
208
|
+
"ai_prompt_output_refactor_item": "编号列表,每步 ≤30 字,可直接执行。",
|
|
209
|
+
"ai_prompt_output_security_item": "列出安全隐患及受影响代码位置 + 修复方案,或声明\"未发现安全问题\"。",
|
|
210
|
+
"ai_prompt_quality_title": "质量规则",
|
|
211
|
+
"ai_prompt_quality_specific": "禁止模糊建议。错误:\"优化代码结构\"。正确:\"将 Parser 类拆分为 Lexer 和 Evaluator 两个类\"。",
|
|
212
|
+
"ai_prompt_quality_evidence": "所有结论必须基于提供的指标数据。",
|
|
213
|
+
"ai_prompt_quality_concise": "禁止客套话、重复内容、无信息量的描述。",
|
|
214
|
+
"ai_prompt_quality_syntax": "代码示例必须使用目标语言的实际语法。",
|
|
215
|
+
"ai_prompt_system": "你是一个风趣幽默的代码审查专家。请分析提供的代码质量指标,并以轻松有趣的方式提供可操作的反馈。",
|
|
216
|
+
"ai_prompt_instruction_1": "简洁具体,但要有趣味性",
|
|
217
|
+
"ai_prompt_instruction_2": "关注最重要的问题(最\"臭\"的部分)",
|
|
218
|
+
"ai_prompt_instruction_3": "提供具体的重构建议",
|
|
219
|
+
"ai_prompt_instruction_4": "识别潜在的安全问题",
|
|
220
|
+
"ai_prompt_instruction_5": "建议如何提高可维护性",
|
|
221
|
+
"ai_prompt_summary": "总结",
|
|
222
|
+
"ai_prompt_key_issues": "主要问题(最臭的部分)",
|
|
223
|
+
"ai_prompt_refactoring": "重构建议",
|
|
224
|
+
"ai_prompt_security": "安全问题",
|
|
225
|
+
"ai_prompt_security_clear": "一切安全!这个代码库没有安全隐患。",
|
|
226
|
+
"ai_prompt_word_limit": "回复控制在500字以内。要有帮助性,但也要有趣!",
|
|
227
|
+
"warn_analyze_failed": "分析文件失败 {file}: {error}",
|
|
228
|
+
"warn_config_validation_failed": "配置验证失败: {error}",
|
|
229
|
+
"warn_config_load_failed": "加载配置失败: {error}",
|
|
230
|
+
"warn_no_model_specified": "{provider}_API_KEY 已设置但未指定模型。使用 --model 或设置 {provider}_MODEL",
|
|
231
|
+
"error_fatal": "致命错误: {error}",
|
|
232
|
+
"progress_discovering": "正在扫描文件...",
|
|
233
|
+
"progress_discovered": "发现 {count} 个待分析文件",
|
|
234
|
+
"progress_analyzing": "正在分析",
|
|
235
|
+
"warn_file_too_large": "跳过大文件 ({size}KB): {file}",
|
|
236
|
+
"warn_file_read_error": "读取文件失败: {file}",
|
|
237
|
+
"warn_parse_error": "解析文件失败: {file}",
|
|
238
|
+
"warn_unsupported_language": "不支持的语言: {file}",
|
|
239
|
+
"warn_no_files_match": "没有文件匹配包含模式",
|
|
240
|
+
"warn_all_files_excluded": "所有文件都被 .gitignore 或排除模式过滤",
|
|
241
|
+
"info_skipped_binary": "跳过二进制文件: {file}",
|
|
242
|
+
"info_analysis_summary": "已分析 {analyzed} 个文件,跳过 {skipped} 个文件",
|
|
243
|
+
"error_path_not_found": "路径不存在: {path}",
|
|
244
|
+
"error_not_a_directory": "不是目录: {path}",
|
|
245
|
+
"config_current": "当前配置:",
|
|
246
|
+
"config_created": "配置文件已创建: {path}",
|
|
247
|
+
"config_already_exists": "配置文件已存在: {path}",
|
|
248
|
+
"config_unknown_action": "未知操作: {action}。请使用 'show' 或 'init'。",
|
|
249
|
+
"config_init_success": "配置初始化成功",
|
|
250
|
+
"html_skipped": "已跳过",
|
|
251
|
+
"html_time": "耗时",
|
|
252
|
+
"html_status": "状态",
|
|
253
|
+
"html_lang": "zh",
|
|
254
|
+
"output_table_of_contents": "目录",
|
|
255
|
+
"output_statistics": "统计信息",
|
|
256
|
+
"output_metric": "指标",
|
|
257
|
+
"output_value": "数值",
|
|
258
|
+
"output_skipped": "已跳过",
|
|
259
|
+
"output_time": "耗时",
|
|
260
|
+
"output_status": "状态",
|
|
261
|
+
"output_issues": "问题",
|
|
262
|
+
"output_generated_by": "由 {tool} 生成",
|
|
263
|
+
"cli_description": "基于 AST 解析和 AI 集成的生产级代码质量分析工具",
|
|
264
|
+
"cli_examples": "示例:",
|
|
265
|
+
"cli_example_analyze_cwd": "分析当前目录",
|
|
266
|
+
"cli_example_analyze_top": "显示最差的 10 个文件",
|
|
267
|
+
"cli_example_analyze_markdown": "以 Markdown 格式输出",
|
|
268
|
+
"cli_example_analyze_locale": "使用中文",
|
|
269
|
+
"cli_example_ai_review": "AI 代码审查",
|
|
270
|
+
"cli_example_mcp_install": "为 AI 工具配置 MCP Server",
|
|
271
|
+
"cli_supported_languages": "支持的语言:",
|
|
272
|
+
"cmd_analyze_description": "分析项目代码质量",
|
|
273
|
+
"cmd_analyze_example_cwd": "分析当前目录",
|
|
274
|
+
"cmd_analyze_example_dir": "分析指定目录",
|
|
275
|
+
"cmd_analyze_example_top": "显示最差的 5 个文件",
|
|
276
|
+
"cmd_analyze_example_markdown": "保存 Markdown 报告",
|
|
277
|
+
"cmd_analyze_example_html": "保存 HTML 报告",
|
|
278
|
+
"cmd_analyze_example_exclude": "排除测试文件",
|
|
279
|
+
"cmd_analyze_example_locale": "使用中文输出",
|
|
280
|
+
"cmd_ai_review_description": "AI 代码审查",
|
|
281
|
+
"cmd_ai_review_env_header": "环境变量:",
|
|
282
|
+
"cmd_config_description": "查看或初始化配置",
|
|
283
|
+
"cmd_config_example_show": "查看当前配置",
|
|
284
|
+
"cmd_config_example_init": "创建 .fuckucoderc.json",
|
|
285
|
+
"cmd_config_example_show_project": "查看指定项目的配置",
|
|
286
|
+
"cmd_config_example_set_locale": "设置默认语言为中文",
|
|
287
|
+
"cmd_config_example_set_api_key": "设置 OpenAI 兼容 API 密钥",
|
|
288
|
+
"cmd_config_example_set_base_url": "设置自定义 API 端点",
|
|
289
|
+
"cmd_config_example_set_model": "设置默认模型",
|
|
290
|
+
"cmd_config_example_set_provider": "设置 AI 提供商",
|
|
291
|
+
"config_set_success": "配置已更新: {key} = {value}",
|
|
292
|
+
"config_set_invalid_key": "无效的配置键: {key}",
|
|
293
|
+
"config_set_value_required": "'config set' 需要提供值",
|
|
294
|
+
"config_set_key_required": "'config set' 需要提供键",
|
|
295
|
+
"ai_review_output_title": "AI 代码审查报告",
|
|
296
|
+
"cmd_ai_review_format_help": "输出格式:console、markdown、html(默认:console)",
|
|
297
|
+
"output_html_requires_file": "HTML 格式需要 -o <file> 指定输出文件,已回退到终端格式输出。",
|
|
298
|
+
"verbose_project_overview": "项目概览",
|
|
299
|
+
"verbose_total_code_lines": "总代码行数",
|
|
300
|
+
"verbose_total_comment_lines": "总注释行数",
|
|
301
|
+
"verbose_overall_comment_ratio": "整体注释比例",
|
|
302
|
+
"verbose_language_distribution": "语言分布",
|
|
303
|
+
"verbose_language": "语言",
|
|
304
|
+
"verbose_file_count": "文件数",
|
|
305
|
+
"verbose_avg_file_size": "平均文件大小",
|
|
306
|
+
"verbose_largest_file": "最大文件",
|
|
307
|
+
"verbose_lines": "{count} 行",
|
|
308
|
+
"verbose_per_file_metrics": "各文件指标评分",
|
|
309
|
+
"verbose_top_worst_functions": "最差函数 Top 10",
|
|
310
|
+
"verbose_col_file": "文件",
|
|
311
|
+
"cmd_mcp_install_description": "为 AI 工具安装 MCP Server 配置",
|
|
312
|
+
"mcp_install_target_prompt": "选择目标 AI 工具:",
|
|
313
|
+
"mcp_installed": "已为 {target} 配置 MCP Server",
|
|
314
|
+
"mcp_config_written": "配置已写入 {path}",
|
|
315
|
+
"mcp_config_exists": "MCP Server 已在 {path} 中配置",
|
|
316
|
+
"mcp_config_updated": "MCP Server 配置已更新至 {path}",
|
|
317
|
+
"mcp_unknown_target": "未知目标:{target}。支持:claude, cursor",
|
|
318
|
+
"mcp_install_example_claude": "配置到 Claude Code",
|
|
319
|
+
"mcp_install_example_cursor": "配置到 Cursor"
|
|
320
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main entry point
|
|
3
|
+
*/
|
|
4
|
+
import { runCLI } from './cli/index.js';
|
|
5
|
+
import { t } from './i18n/index.js';
|
|
6
|
+
runCLI().catch((error) => {
|
|
7
|
+
console.error(t('error_fatal', { error: error instanceof Error ? error.message : String(error) }));
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAEpC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAChC,OAAO,CAAC,KAAK,CACX,CAAC,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CACpF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) Server for fuck-u-code
|
|
3
|
+
*
|
|
4
|
+
* Exposes analyze and ai-review tools via stdio transport,
|
|
5
|
+
* allowing AI tools (Claude Code, Cursor, etc.) to invoke
|
|
6
|
+
* code quality analysis and AI-powered code review directly.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) Server for fuck-u-code
|
|
3
|
+
*
|
|
4
|
+
* Exposes analyze and ai-review tools via stdio transport,
|
|
5
|
+
* allowing AI tools (Claude Code, Cursor, etc.) to invoke
|
|
6
|
+
* code quality analysis and AI-powered code review directly.
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { resolve } from 'node:path';
|
|
12
|
+
import { createAnalyzer } from '../analyzer/index.js';
|
|
13
|
+
import { loadConfig, createRuntimeConfig, loadAIConfig } from '../config/index.js';
|
|
14
|
+
import { createAIManager } from '../ai/index.js';
|
|
15
|
+
import { MarkdownOutput } from '../cli/output/markdown.js';
|
|
16
|
+
import { JsonOutput } from '../cli/output/json.js';
|
|
17
|
+
import { setLocale } from '../i18n/index.js';
|
|
18
|
+
const server = new McpServer({
|
|
19
|
+
name: 'fuck-u-code',
|
|
20
|
+
version: '2.0.0',
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Build a RuntimeConfig from MCP tool parameters.
|
|
24
|
+
* Reuses the same config loading pipeline as the CLI.
|
|
25
|
+
*/
|
|
26
|
+
async function buildRuntimeConfig(projectPath, options) {
|
|
27
|
+
if (options.locale) {
|
|
28
|
+
setLocale(options.locale);
|
|
29
|
+
}
|
|
30
|
+
const config = await loadConfig(projectPath);
|
|
31
|
+
// mergeConfig spreads nested objects, so partial output fields are safe at runtime
|
|
32
|
+
const overrides = { verbose: options.verbose };
|
|
33
|
+
if (options.top !== undefined) {
|
|
34
|
+
overrides.output = { top: options.top };
|
|
35
|
+
}
|
|
36
|
+
return createRuntimeConfig(projectPath, config, overrides);
|
|
37
|
+
}
|
|
38
|
+
const DEFAULT_BASE_URLS = {
|
|
39
|
+
openai: 'https://api.openai.com/v1',
|
|
40
|
+
anthropic: 'https://api.anthropic.com',
|
|
41
|
+
deepseek: 'https://api.deepseek.com/v1',
|
|
42
|
+
gemini: 'https://generativelanguage.googleapis.com',
|
|
43
|
+
ollama: 'http://localhost:11434',
|
|
44
|
+
};
|
|
45
|
+
server.registerTool('analyze', {
|
|
46
|
+
title: 'Code Quality Analysis',
|
|
47
|
+
description: 'Analyze code quality of a project and generate a "shit mountain index" score (0-100)',
|
|
48
|
+
inputSchema: {
|
|
49
|
+
path: z.string().describe('Absolute or relative path to the project directory'),
|
|
50
|
+
verbose: z
|
|
51
|
+
.boolean()
|
|
52
|
+
.optional()
|
|
53
|
+
.default(false)
|
|
54
|
+
.describe('Include detailed metrics and function-level analysis'),
|
|
55
|
+
format: z
|
|
56
|
+
.enum(['console', 'markdown', 'json'])
|
|
57
|
+
.optional()
|
|
58
|
+
.default('markdown')
|
|
59
|
+
.describe('Output format (MCP clients receive markdown by default)'),
|
|
60
|
+
top: z.number().optional().default(10).describe('Number of worst files to show'),
|
|
61
|
+
locale: z.enum(['en', 'zh', 'ru']).optional().default('en').describe('Output language'),
|
|
62
|
+
},
|
|
63
|
+
}, async ({ path: projectPath, verbose, format, top, locale }) => {
|
|
64
|
+
const resolvedPath = resolve(projectPath);
|
|
65
|
+
const runtimeConfig = await buildRuntimeConfig(resolvedPath, { verbose, locale, top });
|
|
66
|
+
const analyzer = createAnalyzer(runtimeConfig);
|
|
67
|
+
const result = await analyzer.analyze();
|
|
68
|
+
let text;
|
|
69
|
+
switch (format) {
|
|
70
|
+
case 'json':
|
|
71
|
+
text = new JsonOutput().render(result);
|
|
72
|
+
break;
|
|
73
|
+
case 'markdown':
|
|
74
|
+
case 'console':
|
|
75
|
+
default:
|
|
76
|
+
text = new MarkdownOutput(runtimeConfig).render(result);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
return { content: [{ type: 'text', text }] };
|
|
80
|
+
});
|
|
81
|
+
server.registerTool('ai-review', {
|
|
82
|
+
title: 'AI Code Review',
|
|
83
|
+
description: 'Run AI-powered code review on the worst-scoring files in a project',
|
|
84
|
+
inputSchema: {
|
|
85
|
+
path: z.string().describe('Absolute or relative path to the project directory'),
|
|
86
|
+
model: z
|
|
87
|
+
.string()
|
|
88
|
+
.describe('AI model name (e.g. gpt-4o, claude-3-opus, deepseek-chat, llama3)'),
|
|
89
|
+
provider: z
|
|
90
|
+
.enum(['openai', 'anthropic', 'deepseek', 'gemini', 'ollama'])
|
|
91
|
+
.optional()
|
|
92
|
+
.default('openai')
|
|
93
|
+
.describe('AI provider'),
|
|
94
|
+
baseUrl: z.string().optional().describe('Custom API base URL'),
|
|
95
|
+
apiKey: z.string().optional().describe('API key (can also use environment variables)'),
|
|
96
|
+
top: z.number().optional().default(5).describe('Number of worst files to review'),
|
|
97
|
+
locale: z.enum(['en', 'zh', 'ru']).optional().default('en').describe('Output language'),
|
|
98
|
+
verbose: z
|
|
99
|
+
.boolean()
|
|
100
|
+
.optional()
|
|
101
|
+
.default(false)
|
|
102
|
+
.describe('Include detailed metrics in analysis'),
|
|
103
|
+
},
|
|
104
|
+
}, async ({ path: projectPath, model, provider, baseUrl, apiKey, top, locale, verbose }) => {
|
|
105
|
+
const resolvedPath = resolve(projectPath);
|
|
106
|
+
setLocale(locale);
|
|
107
|
+
const config = await loadConfig(resolvedPath);
|
|
108
|
+
const runtimeConfig = createRuntimeConfig(resolvedPath, config, {
|
|
109
|
+
verbose,
|
|
110
|
+
ai: { enabled: true, provider, model },
|
|
111
|
+
});
|
|
112
|
+
const analyzer = createAnalyzer(runtimeConfig);
|
|
113
|
+
const analysisResult = await analyzer.analyze();
|
|
114
|
+
const worstFiles = analysisResult.fileResults.sort((a, b) => a.score - b.score).slice(0, top);
|
|
115
|
+
if (worstFiles.length === 0) {
|
|
116
|
+
return {
|
|
117
|
+
content: [{ type: 'text', text: 'No files to review — all scores are clean.' }],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const resolvedApiKey = apiKey || process.env[`${provider.toUpperCase()}_API_KEY`] || '';
|
|
121
|
+
const aiConfig = loadAIConfig({
|
|
122
|
+
enabled: true,
|
|
123
|
+
provider,
|
|
124
|
+
model,
|
|
125
|
+
baseUrl: baseUrl || DEFAULT_BASE_URLS[provider],
|
|
126
|
+
apiKey: resolvedApiKey,
|
|
127
|
+
}, model);
|
|
128
|
+
if (Object.keys(aiConfig.providers).length === 0) {
|
|
129
|
+
return {
|
|
130
|
+
content: [
|
|
131
|
+
{
|
|
132
|
+
type: 'text',
|
|
133
|
+
text: 'Error: No AI provider configured. Provide an API key or set environment variables.',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const aiManager = createAIManager(aiConfig);
|
|
139
|
+
const reviewParts = [];
|
|
140
|
+
for (const [i, file] of worstFiles.entries()) {
|
|
141
|
+
const score = 100 - file.score;
|
|
142
|
+
const review = await aiManager.reviewCode(file);
|
|
143
|
+
reviewParts.push(`## ${i + 1}. ${file.filePath}\n\n**Score: ${score.toFixed(1)}/100**\n\n${review}`);
|
|
144
|
+
}
|
|
145
|
+
const text = `# AI Code Review\n\n${reviewParts.join('\n\n---\n\n')}`;
|
|
146
|
+
return { content: [{ type: 'text', text }] };
|
|
147
|
+
});
|
|
148
|
+
async function main() {
|
|
149
|
+
const transport = new StdioServerTransport();
|
|
150
|
+
await server.connect(transport);
|
|
151
|
+
}
|
|
152
|
+
main().catch((error) => {
|
|
153
|
+
console.error('MCP server failed to start:', error);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAe,MAAM,kBAAkB,CAAC;AAG1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH;;;GAGG;AACH,KAAK,UAAU,kBAAkB,CAC/B,WAAmB,EACnB,OAA6D;IAE7D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,SAAS,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,mFAAmF;IACnF,MAAM,SAAS,GAAkD,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9F,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,SAAS,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAoD,CAAC;IAC5F,CAAC;IACD,OAAO,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,iBAAiB,GAA2B;IAChD,MAAM,EAAE,2BAA2B;IACnC,SAAS,EAAE,2BAA2B;IACtC,QAAQ,EAAE,6BAA6B;IACvC,MAAM,EAAE,2CAA2C;IACnD,MAAM,EAAE,wBAAwB;CACjC,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;IACE,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EACT,sFAAsF;IACxF,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QAC/E,OAAO,EAAE,CAAC;aACP,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,sDAAsD,CAAC;QACnE,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;aACrC,QAAQ,EAAE;aACV,OAAO,CAAC,UAAU,CAAC;aACnB,QAAQ,CAAC,yDAAyD,CAAC;QACtE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAChF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KACxF;CACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAEvF,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAExC,IAAI,IAAY,CAAC;IACjB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC;QACf;YACE,IAAI,GAAG,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM;IACV,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;IACE,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,oEAAoE;IACjF,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QAC/E,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,CAAC,mEAAmE,CAAC;QAChF,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC7D,QAAQ,EAAE;aACV,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,aAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC9D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACtF,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACjF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACvF,OAAO,EAAE,CAAC;aACP,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,sCAAsC,CAAC;KACpD;CACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IACtF,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,SAAS,CAAC,MAAgB,CAAC,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE;QAC9D,OAAO;QACP,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;KACvC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAEhD,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE9F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4CAA4C,EAAE,CAAC;SACzF,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;IACxF,MAAM,QAAQ,GAAG,YAAY,CAC3B;QACE,OAAO,EAAE,IAAI;QACb,QAAQ;QACR,KAAK;QACL,OAAO,EAAE,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC;QAC/C,MAAM,EAAE,cAAc;KACvB,EACD,KAAK,CACN,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,oFAAoF;iBAC3F;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,WAAW,CAAC,IAAI,CACd,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,gBAAgB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,uBAAuB,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC,CACF,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cognitive complexity metric
|
|
3
|
+
*
|
|
4
|
+
* Measures how difficult code is to understand (SonarSource standard).
|
|
5
|
+
* Unlike cyclomatic complexity, cognitive complexity penalizes:
|
|
6
|
+
* - Nested control flow structures (exponential penalty)
|
|
7
|
+
* - Breaks in linear flow (continue, break, goto)
|
|
8
|
+
* - Recursion
|
|
9
|
+
*
|
|
10
|
+
* Industry thresholds (SonarQube):
|
|
11
|
+
* - 0-8: Low cognitive load
|
|
12
|
+
* - 9-15: Moderate cognitive load
|
|
13
|
+
* - 16-25: High cognitive load
|
|
14
|
+
* - 25+: Very high cognitive load
|
|
15
|
+
*/
|
|
16
|
+
import type { Metric, MetricResult, MetricCategory } from '../types.js';
|
|
17
|
+
import type { ParseResult } from '../../parser/types.js';
|
|
18
|
+
export declare class CognitiveComplexityMetric implements Metric {
|
|
19
|
+
readonly name = "cognitive_complexity";
|
|
20
|
+
readonly category: MetricCategory;
|
|
21
|
+
readonly weight: number;
|
|
22
|
+
constructor(weight: number);
|
|
23
|
+
calculate(parseResult: ParseResult): MetricResult;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=cognitive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognitive.d.ts","sourceRoot":"","sources":["../../../src/metrics/complexity/cognitive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAUzD,qBAAa,yBAA0B,YAAW,MAAM;IACtD,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAgB;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;IAI1B,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY;CA8ElD"}
|