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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Done-0
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# fuck-u-code [](README.md) [](README_ZH.md) [](README_RU.md)
|
|
2
|
+
|
|
3
|
+
> [!Important]
|
|
4
|
+
> 📢 Remember this command: `fuck-u-code` - let bad code have nowhere to hide!
|
|
5
|
+
|
|
6
|
+
A tool designed to **expose shitty code quality** with sharp but humorous feedback, showing you exactly **how terrible your code is**.
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
* **Multi-language support**: Go, JavaScript, TypeScript, Python, Java, C, C++, Rust, C#, Lua
|
|
11
|
+
* **Overall Score**: 0~100, higher = better code quality
|
|
12
|
+
* **Shit-Gas Index**: Per-file score, higher = worse code
|
|
13
|
+
* **Seven quality checks**: Complexity / Size / Comments / Error handling / Naming / Duplication / Structure
|
|
14
|
+
* **AST parsing**: Accurate syntax analysis powered by tree-sitter
|
|
15
|
+
* **AI code review**: Integrates OpenAI-compatible / Anthropic / DeepSeek / Gemini / Ollama
|
|
16
|
+
* **Multiple output formats**: Colored terminal / Markdown / JSON / HTML
|
|
17
|
+
* **i18n**: English / Chinese / Russian
|
|
18
|
+
* **Flexible config**: `.fuckucoderc.json` and more, project-level and global support
|
|
19
|
+
|
|
20
|
+
> [!Note]
|
|
21
|
+
> Code analysis runs fully offline — your code never leaves your machine.
|
|
22
|
+
> AI review requires an external API or local Ollama.
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install -g fuck-u-code
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Or build from source:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
git clone https://github.com/Done-0/fuck-u-code.git
|
|
34
|
+
cd fuck-u-code && npm install && npm run build
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
### Code Analysis
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
fuck-u-code analyze # Analyze current directory
|
|
43
|
+
fuck-u-code analyze ./src # Analyze specific directory
|
|
44
|
+
fuck-u-code analyze . -v # Verbose (project overview, language stats, function metrics)
|
|
45
|
+
fuck-u-code analyze . -t 20 # Show top 20 worst files
|
|
46
|
+
fuck-u-code analyze . -l zh # Chinese output
|
|
47
|
+
fuck-u-code analyze . -f markdown # Markdown terminal rendering
|
|
48
|
+
fuck-u-code analyze . -f markdown -o report.md # Export Markdown
|
|
49
|
+
fuck-u-code analyze . -f html -o report.html # Export HTML
|
|
50
|
+
fuck-u-code analyze . -f json -o report.json # Export JSON
|
|
51
|
+
fuck-u-code analyze . -e "**/*.test.ts" # Exclude test files
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Option | Short | Description |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| `--verbose` | `-v` | Verbose output |
|
|
57
|
+
| `--top <n>` | `-t` | Top N worst files (default 10) |
|
|
58
|
+
| `--format <fmt>` | `-f` | Format: console/markdown/json/html |
|
|
59
|
+
| `--output <file>` | `-o` | Write to file |
|
|
60
|
+
| `--exclude <glob>` | `-e` | Additional exclude patterns |
|
|
61
|
+
| `--concurrency <n>` | `-c` | Concurrent workers (default 8) |
|
|
62
|
+
| `--locale <lang>` | `-l` | Language: en/zh/ru |
|
|
63
|
+
|
|
64
|
+
### AI Code Review
|
|
65
|
+
|
|
66
|
+
Requires AI provider setup (see [AI Configuration](#ai-configuration)).
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
fuck-u-code ai-review . -m gpt-4o # OpenAI-compatible
|
|
70
|
+
fuck-u-code ai-review . -p anthropic -m claude-sonnet-4-5-20250929 # Anthropic
|
|
71
|
+
fuck-u-code ai-review . -p ollama -m codellama # Local Ollama
|
|
72
|
+
fuck-u-code ai-review . -m gpt-4o -t 3 # Review top 3 worst
|
|
73
|
+
fuck-u-code ai-review . -m gpt-4o -f markdown -o review.md # Export Markdown
|
|
74
|
+
fuck-u-code ai-review . -b https://your-api.com/v1 -k sk-xxx -m model # Custom endpoint
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
| Option | Short | Description |
|
|
78
|
+
| --- | --- | --- |
|
|
79
|
+
| `--model <model>` | `-m` | Model name (required) |
|
|
80
|
+
| `--provider <name>` | `-p` | Provider: openai/anthropic/deepseek/gemini/ollama |
|
|
81
|
+
| `--base-url <url>` | `-b` | Custom API endpoint |
|
|
82
|
+
| `--api-key <key>` | `-k` | API key |
|
|
83
|
+
| `--top <n>` | `-t` | Review top N worst files (default 5) |
|
|
84
|
+
| `--format <fmt>` | `-f` | Format: console/markdown/html |
|
|
85
|
+
| `--output <file>` | `-o` | Write to file |
|
|
86
|
+
| `--verbose` | `-v` | Verbose output |
|
|
87
|
+
| `--locale <lang>` | `-l` | Language: en/zh/ru |
|
|
88
|
+
|
|
89
|
+
### Config Management
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
fuck-u-code config init # Generate .fuckucoderc.json
|
|
93
|
+
fuck-u-code config show # Show current config
|
|
94
|
+
fuck-u-code config set i18n.locale zh # Set default language
|
|
95
|
+
fuck-u-code config set ai.provider openai # Set AI provider
|
|
96
|
+
fuck-u-code config set ai.model gpt-4o # Set AI model
|
|
97
|
+
fuck-u-code config set ai.apiKey sk-xxx # Set API key
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Configuration File
|
|
101
|
+
|
|
102
|
+
Auto-discovered from project directory upward, then falls back to global `~/.fuckucoderc.json`.
|
|
103
|
+
|
|
104
|
+
Supported formats: `.fuckucoderc.json` / `.yaml` / `.js` / `fuckucode.config.js` / `"fuckucode"` field in `package.json`.
|
|
105
|
+
|
|
106
|
+
Global config path: macOS/Linux `~/.fuckucoderc.json`, Windows `C:\Users\<username>\.fuckucoderc.json`.
|
|
107
|
+
|
|
108
|
+
Full example (`.fuckucoderc.json`):
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"exclude": ["**/*.test.ts", "docs/**"],
|
|
113
|
+
"include": ["**/*"],
|
|
114
|
+
"concurrency": 8,
|
|
115
|
+
"verbose": false,
|
|
116
|
+
"output": {
|
|
117
|
+
"format": "console",
|
|
118
|
+
"top": 10,
|
|
119
|
+
"maxIssues": 5,
|
|
120
|
+
"showDetails": true
|
|
121
|
+
},
|
|
122
|
+
"metrics": {
|
|
123
|
+
"weights": {
|
|
124
|
+
"complexity": 0.32,
|
|
125
|
+
"duplication": 0.20,
|
|
126
|
+
"size": 0.18,
|
|
127
|
+
"structure": 0.12,
|
|
128
|
+
"error": 0.08,
|
|
129
|
+
"documentation": 0.05,
|
|
130
|
+
"naming": 0.05
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"ai": {
|
|
134
|
+
"enabled": true,
|
|
135
|
+
"provider": "openai",
|
|
136
|
+
"model": "gpt-4o",
|
|
137
|
+
"baseUrl": "https://api.openai.com/v1",
|
|
138
|
+
"apiKey": "sk-your-api-key"
|
|
139
|
+
},
|
|
140
|
+
"i18n": {
|
|
141
|
+
"locale": "en"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## AI Configuration
|
|
147
|
+
|
|
148
|
+
Supports 5 providers. Priority: CLI flags > environment variables > config file.
|
|
149
|
+
|
|
150
|
+
| Provider | Environment Variables | Example |
|
|
151
|
+
| --- | --- | --- |
|
|
152
|
+
| OpenAI-compatible | `OPENAI_API_KEY` `OPENAI_MODEL` `OPENAI_BASE_URL` | `ai-review . -m gpt-4o` |
|
|
153
|
+
| Anthropic | `ANTHROPIC_API_KEY` | `ai-review . -p anthropic -m claude-sonnet-4-5-20250929` |
|
|
154
|
+
| DeepSeek | `DEEPSEEK_API_KEY` | `ai-review . -p deepseek -m deepseek-chat` |
|
|
155
|
+
| Gemini | `GEMINI_API_KEY` | `ai-review . -p gemini -m gemini-pro` |
|
|
156
|
+
| Ollama | `OLLAMA_HOST` (optional) | `ai-review . -p ollama -m codellama` |
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# OpenAI-compatible
|
|
160
|
+
export OPENAI_API_KEY="sk-your-key"
|
|
161
|
+
export OPENAI_BASE_URL="https://api.openai.com/v1" # Optional
|
|
162
|
+
|
|
163
|
+
# Or via config file
|
|
164
|
+
fuck-u-code config set ai.provider openai
|
|
165
|
+
fuck-u-code config set ai.model gpt-4o
|
|
166
|
+
fuck-u-code config set ai.apiKey sk-your-key
|
|
167
|
+
fuck-u-code config set ai.baseUrl https://api.openai.com/v1
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## MCP Server
|
|
171
|
+
|
|
172
|
+
fuck-u-code provides an MCP (Model Context Protocol) Server, allowing AI tools like Claude Code, Cursor, Windsurf, etc. to directly invoke code quality analysis and AI code review.
|
|
173
|
+
|
|
174
|
+
### Setup
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Global install
|
|
178
|
+
npm install -g fuck-u-code
|
|
179
|
+
|
|
180
|
+
# Auto-configure (interactive)
|
|
181
|
+
fuck-u-code mcp-install
|
|
182
|
+
|
|
183
|
+
# Or specify target directly
|
|
184
|
+
fuck-u-code mcp-install claude
|
|
185
|
+
fuck-u-code mcp-install cursor
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Claude Code** (`~/.claude.json` or project `.mcp.json`):
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"mcpServers": {
|
|
193
|
+
"fuck-u-code": {
|
|
194
|
+
"command": "fuck-u-code-mcp"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Cursor** (`.cursor/mcp.json`):
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
{
|
|
204
|
+
"mcpServers": {
|
|
205
|
+
"fuck-u-code": {
|
|
206
|
+
"command": "fuck-u-code-mcp"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Without global install (npx)**:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"mcpServers": {
|
|
217
|
+
"fuck-u-code": {
|
|
218
|
+
"command": "npx",
|
|
219
|
+
"args": ["-y", "fuck-u-code-mcp"]
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Available Tools
|
|
226
|
+
|
|
227
|
+
- **analyze** — Analyze code quality and generate a score report
|
|
228
|
+
- **ai-review** — Run AI-powered code review on the worst-scoring files
|
|
229
|
+
|
|
230
|
+
## File Exclusion
|
|
231
|
+
|
|
232
|
+
The tool reads `.gitignore` files (including nested ones) and follows standard gitignore rules. For additional exclusions, use `--exclude` or the `exclude` config field.
|
|
233
|
+
|
|
234
|
+
## Feedback
|
|
235
|
+
|
|
236
|
+
> 💬 Share your thoughts
|
|
237
|
+
> Discord: <https://discord.gg/9ThNkAFGnT>
|
|
238
|
+
|
|
239
|
+
## Contributing
|
|
240
|
+
|
|
241
|
+
PRs welcome — let's improve **fuck-u-code** together 🚀
|
|
242
|
+
|
|
243
|
+
## License
|
|
244
|
+
|
|
245
|
+
MIT
|
|
246
|
+
|
|
247
|
+
## Contact
|
|
248
|
+
|
|
249
|
+
- fenderisfine@gmail.com
|
|
250
|
+
- WeChat: l927171598
|
|
251
|
+
|
|
252
|
+
## More Projects
|
|
253
|
+
|
|
254
|
+
- [FateSpiral](https://fatespiral.com/) — AI-driven multiplayer RPG, infinite worlds, evolving stories
|
|
255
|
+
- [DestinyTeller](https://destinyteller.com/) — AI-powered destiny reading website
|
|
256
|
+
- [Jank](https://github.com/Done-0/Jank) — Open-source blog system in Go
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Postinstall script: generates global config file (~/.fuckucoderc.json) if it doesn't exist.
|
|
5
|
+
* Cross-platform: Mac, Windows, Linux via os.homedir().
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
|
|
12
|
+
const CONFIG_FILE = '.fuckucoderc.json';
|
|
13
|
+
const configPath = join(homedir(), CONFIG_FILE);
|
|
14
|
+
|
|
15
|
+
if (!existsSync(configPath)) {
|
|
16
|
+
const defaultConfig = {
|
|
17
|
+
exclude: [],
|
|
18
|
+
include: ['**/*'],
|
|
19
|
+
concurrency: 8,
|
|
20
|
+
verbose: false,
|
|
21
|
+
output: {
|
|
22
|
+
format: 'console',
|
|
23
|
+
top: 10,
|
|
24
|
+
maxIssues: 5,
|
|
25
|
+
showDetails: true,
|
|
26
|
+
},
|
|
27
|
+
metrics: {
|
|
28
|
+
weights: {
|
|
29
|
+
complexity: 0.32,
|
|
30
|
+
duplication: 0.2,
|
|
31
|
+
size: 0.18,
|
|
32
|
+
structure: 0.12,
|
|
33
|
+
error: 0.08,
|
|
34
|
+
documentation: 0.05,
|
|
35
|
+
naming: 0.05,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
ai: {
|
|
39
|
+
enabled: false,
|
|
40
|
+
},
|
|
41
|
+
i18n: {
|
|
42
|
+
locale: 'en',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2) + '\n', 'utf-8');
|
|
48
|
+
console.log(`[fuck-u-code] Global config created: ${configPath}`);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.warn(`[fuck-u-code] Failed to create global config at ${configPath}: ${error.message}`);
|
|
51
|
+
console.warn('[fuck-u-code] You can create it manually or run: fuck-u-code config init');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI module entry point
|
|
3
|
+
*/
|
|
4
|
+
import type { AIConfig, ChatRequest, ChatResponse } from './types.js';
|
|
5
|
+
import type { FileAnalysisResult } from '../metrics/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* AI Manager for code review
|
|
8
|
+
*/
|
|
9
|
+
export declare class AIManager {
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: AIConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Review code and provide suggestions
|
|
14
|
+
* Includes local analysis results for more accurate AI feedback
|
|
15
|
+
*/
|
|
16
|
+
reviewCode(fileResult: FileAnalysisResult): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Chat with AI
|
|
19
|
+
*/
|
|
20
|
+
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
21
|
+
private createProvider;
|
|
22
|
+
/**
|
|
23
|
+
* Build comprehensive review prompt with local analysis results
|
|
24
|
+
* This provides AI with concrete metrics data for more accurate suggestions
|
|
25
|
+
*/
|
|
26
|
+
private buildReviewPrompt;
|
|
27
|
+
private groupMetricsByCategory;
|
|
28
|
+
private buildMetricsSection;
|
|
29
|
+
private severityPriority;
|
|
30
|
+
private getScoreLabel;
|
|
31
|
+
}
|
|
32
|
+
export declare function createAIManager(config: AIConfig): AIManager;
|
|
33
|
+
export type { AIConfig, Provider, ChatRequest, ChatResponse } from './types.js';
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,QAAQ,EAA6B,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,qBAAqB,CAAC;AAE5E;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAW;gBAEb,MAAM,EAAE,QAAQ;IAI5B;;;OAGG;IACG,UAAU,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IA4CjE;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAkCvD,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkFzB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,aAAa;CAOtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAE3D;AAED,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI module entry point
|
|
3
|
+
*/
|
|
4
|
+
import { OpenAIProvider } from './providers/openai.js';
|
|
5
|
+
import { AnthropicProvider } from './providers/anthropic.js';
|
|
6
|
+
import { OllamaProvider } from './providers/ollama.js';
|
|
7
|
+
import { GeminiProvider } from './providers/gemini.js';
|
|
8
|
+
import { getCodeReviewPrompt } from './prompts/code-review.js';
|
|
9
|
+
import { t } from '../i18n/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* AI Manager for code review
|
|
12
|
+
*/
|
|
13
|
+
export class AIManager {
|
|
14
|
+
config;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Review code and provide suggestions
|
|
20
|
+
* Includes local analysis results for more accurate AI feedback
|
|
21
|
+
*/
|
|
22
|
+
async reviewCode(fileResult) {
|
|
23
|
+
const providerName = this.config.defaultProvider;
|
|
24
|
+
if (!providerName) {
|
|
25
|
+
throw new Error(t('ai_no_provider'));
|
|
26
|
+
}
|
|
27
|
+
const providerConfig = this.config.providers[providerName];
|
|
28
|
+
if (!providerConfig?.enabled || !providerConfig.instances.length) {
|
|
29
|
+
throw new Error(t('ai_no_provider'));
|
|
30
|
+
}
|
|
31
|
+
const instance = providerConfig.instances[0];
|
|
32
|
+
if (!instance?.enabled) {
|
|
33
|
+
throw new Error(t('ai_no_provider'));
|
|
34
|
+
}
|
|
35
|
+
const ctx = {
|
|
36
|
+
providerName,
|
|
37
|
+
instanceName: instance.name,
|
|
38
|
+
baseUrl: instance.baseUrl,
|
|
39
|
+
apiKey: instance.apiKey,
|
|
40
|
+
model: instance.models[0] || '',
|
|
41
|
+
maxTokens: instance.maxTokens,
|
|
42
|
+
temperature: instance.temperature,
|
|
43
|
+
topP: instance.topP,
|
|
44
|
+
topK: instance.topK,
|
|
45
|
+
timeout: instance.timeout,
|
|
46
|
+
maxRetries: instance.maxRetries,
|
|
47
|
+
};
|
|
48
|
+
const provider = this.createProvider(ctx);
|
|
49
|
+
const prompt = this.buildReviewPrompt(fileResult);
|
|
50
|
+
const systemPrompt = getCodeReviewPrompt();
|
|
51
|
+
const response = await provider.chat({
|
|
52
|
+
messages: [
|
|
53
|
+
{ role: 'system', content: systemPrompt },
|
|
54
|
+
{ role: 'user', content: prompt },
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
return response.choices[0]?.message.content ?? '';
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Chat with AI
|
|
61
|
+
*/
|
|
62
|
+
async chat(request) {
|
|
63
|
+
const providerName = this.config.defaultProvider;
|
|
64
|
+
if (!providerName) {
|
|
65
|
+
throw new Error(t('ai_no_provider'));
|
|
66
|
+
}
|
|
67
|
+
const providerConfig = this.config.providers[providerName];
|
|
68
|
+
if (!providerConfig?.enabled || !providerConfig.instances.length) {
|
|
69
|
+
throw new Error(t('ai_no_provider'));
|
|
70
|
+
}
|
|
71
|
+
const instance = providerConfig.instances[0];
|
|
72
|
+
if (!instance?.enabled) {
|
|
73
|
+
throw new Error(t('ai_no_provider'));
|
|
74
|
+
}
|
|
75
|
+
const ctx = {
|
|
76
|
+
providerName,
|
|
77
|
+
instanceName: instance.name,
|
|
78
|
+
baseUrl: instance.baseUrl,
|
|
79
|
+
apiKey: instance.apiKey,
|
|
80
|
+
model: request.model || instance.models[0] || '',
|
|
81
|
+
maxTokens: instance.maxTokens,
|
|
82
|
+
temperature: instance.temperature,
|
|
83
|
+
topP: instance.topP,
|
|
84
|
+
topK: instance.topK,
|
|
85
|
+
timeout: instance.timeout,
|
|
86
|
+
maxRetries: instance.maxRetries,
|
|
87
|
+
};
|
|
88
|
+
const provider = this.createProvider(ctx);
|
|
89
|
+
return provider.chat(request);
|
|
90
|
+
}
|
|
91
|
+
createProvider(ctx) {
|
|
92
|
+
switch (ctx.providerName) {
|
|
93
|
+
case 'openai':
|
|
94
|
+
case 'deepseek':
|
|
95
|
+
return new OpenAIProvider(ctx);
|
|
96
|
+
case 'anthropic':
|
|
97
|
+
return new AnthropicProvider(ctx);
|
|
98
|
+
case 'gemini':
|
|
99
|
+
return new GeminiProvider(ctx);
|
|
100
|
+
case 'ollama':
|
|
101
|
+
return new OllamaProvider(ctx);
|
|
102
|
+
default:
|
|
103
|
+
return new OpenAIProvider(ctx);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Build comprehensive review prompt with local analysis results
|
|
108
|
+
* This provides AI with concrete metrics data for more accurate suggestions
|
|
109
|
+
*/
|
|
110
|
+
buildReviewPrompt(fileResult) {
|
|
111
|
+
const { filePath, score, metrics, parseResult } = fileResult;
|
|
112
|
+
const metricsByCategory = this.groupMetricsByCategory(metrics);
|
|
113
|
+
const metricsSection = this.buildMetricsSection(metricsByCategory);
|
|
114
|
+
const issues = metrics
|
|
115
|
+
.filter((m) => m.severity !== 'info')
|
|
116
|
+
.sort((a, b) => this.severityPriority(b.severity) - this.severityPriority(a.severity));
|
|
117
|
+
const issuesSection = issues.length > 0
|
|
118
|
+
? issues
|
|
119
|
+
.map((m) => `- [${m.severity.toUpperCase()}] ${m.name}: ${m.details || t('score') + ': ' + m.normalizedScore.toFixed(1)}`)
|
|
120
|
+
.join('\n')
|
|
121
|
+
: t('ai_no_issues_detected');
|
|
122
|
+
const functionsSection = parseResult.functions.length > 0
|
|
123
|
+
? parseResult.functions
|
|
124
|
+
.sort((a, b) => b.complexity - a.complexity)
|
|
125
|
+
.slice(0, 10)
|
|
126
|
+
.map((f) => {
|
|
127
|
+
const warnings = [];
|
|
128
|
+
if (f.complexity > 10)
|
|
129
|
+
warnings.push(t('ai_high_complexity'));
|
|
130
|
+
if (f.lineCount > 300)
|
|
131
|
+
warnings.push(t('ai_long_function'));
|
|
132
|
+
if (f.nestingDepth > 4)
|
|
133
|
+
warnings.push(t('ai_deep_nesting'));
|
|
134
|
+
if (f.parameterCount > 5)
|
|
135
|
+
warnings.push(t('ai_many_parameters'));
|
|
136
|
+
const warningStr = warnings.length > 0 ? ` [${warnings.join(', ')}]` : '';
|
|
137
|
+
return `- ${f.name}: ${f.lineCount} lines, complexity ${f.complexity}, nesting ${f.nestingDepth}, params ${f.parameterCount}${warningStr}`;
|
|
138
|
+
})
|
|
139
|
+
.join('\n')
|
|
140
|
+
: t('ai_no_functions_detected');
|
|
141
|
+
const commentRatio = parseResult.codeLines > 0
|
|
142
|
+
? ((parseResult.commentLines / parseResult.codeLines) * 100).toFixed(1)
|
|
143
|
+
: '0';
|
|
144
|
+
const statsSection = `
|
|
145
|
+
- ${t('ai_total_lines')}: ${parseResult.totalLines}
|
|
146
|
+
- ${t('ai_code_lines')}: ${parseResult.codeLines}
|
|
147
|
+
- ${t('ai_comment_lines')}: ${parseResult.commentLines}
|
|
148
|
+
- ${t('ai_blank_lines')}: ${parseResult.blankLines}
|
|
149
|
+
- ${t('ai_comment_ratio')}: ${commentRatio}%
|
|
150
|
+
- ${t('ai_functions')}: ${parseResult.functions.length}
|
|
151
|
+
- ${t('ai_classes')}: ${parseResult.classes.length}`;
|
|
152
|
+
return `
|
|
153
|
+
## ${t('ai_file_analysis_report')}
|
|
154
|
+
|
|
155
|
+
**${t('file')}:** ${filePath}
|
|
156
|
+
**Language:** ${parseResult.language}
|
|
157
|
+
**${t('overallScore')}:** ${score.toFixed(1)}/100 (${this.getScoreLabel(score)})
|
|
158
|
+
|
|
159
|
+
### ${t('ai_code_statistics')}
|
|
160
|
+
${statsSection}
|
|
161
|
+
|
|
162
|
+
### ${t('ai_metrics_analysis')}
|
|
163
|
+
${metricsSection}
|
|
164
|
+
|
|
165
|
+
### ${t('ai_detected_issues')}
|
|
166
|
+
${issuesSection}
|
|
167
|
+
|
|
168
|
+
### ${t('ai_function_analysis')}
|
|
169
|
+
${functionsSection}
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
${t('ai_review_request')}
|
|
174
|
+
1. ${t('ai_review_request_1')}
|
|
175
|
+
2. ${t('ai_review_request_2')}
|
|
176
|
+
3. ${t('ai_review_request_3')}
|
|
177
|
+
4. ${t('ai_review_request_4')}
|
|
178
|
+
|
|
179
|
+
${t('ai_review_focus')}
|
|
180
|
+
`;
|
|
181
|
+
}
|
|
182
|
+
groupMetricsByCategory(metrics) {
|
|
183
|
+
const grouped = new Map();
|
|
184
|
+
for (const metric of metrics) {
|
|
185
|
+
const existing = grouped.get(metric.category) || [];
|
|
186
|
+
existing.push(metric);
|
|
187
|
+
grouped.set(metric.category, existing);
|
|
188
|
+
}
|
|
189
|
+
return grouped;
|
|
190
|
+
}
|
|
191
|
+
buildMetricsSection(metricsByCategory) {
|
|
192
|
+
const sections = [];
|
|
193
|
+
for (const [category, metrics] of metricsByCategory) {
|
|
194
|
+
const avgScore = metrics.reduce((sum, m) => sum + m.normalizedScore, 0) / metrics.length;
|
|
195
|
+
const categoryName = t(category) || category.charAt(0).toUpperCase() + category.slice(1);
|
|
196
|
+
const details = metrics
|
|
197
|
+
.map((m) => ` - ${m.name}: ${m.normalizedScore.toFixed(1)}/100`)
|
|
198
|
+
.join('\n');
|
|
199
|
+
sections.push(`**${categoryName}** (avg: ${avgScore.toFixed(1)}/100)\n${details}`);
|
|
200
|
+
}
|
|
201
|
+
return sections.join('\n\n');
|
|
202
|
+
}
|
|
203
|
+
severityPriority(severity) {
|
|
204
|
+
const priorities = {
|
|
205
|
+
critical: 4,
|
|
206
|
+
error: 3,
|
|
207
|
+
warning: 2,
|
|
208
|
+
info: 1,
|
|
209
|
+
};
|
|
210
|
+
return priorities[severity] || 0;
|
|
211
|
+
}
|
|
212
|
+
getScoreLabel(score) {
|
|
213
|
+
if (score >= 90)
|
|
214
|
+
return t('ai_score_excellent');
|
|
215
|
+
if (score >= 75)
|
|
216
|
+
return t('ai_score_good');
|
|
217
|
+
if (score >= 60)
|
|
218
|
+
return t('ai_score_acceptable');
|
|
219
|
+
if (score >= 40)
|
|
220
|
+
return t('ai_score_poor');
|
|
221
|
+
return t('ai_score_critical');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
export function createAIManager(config) {
|
|
225
|
+
return new AIManager(config);
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code review prompt templates
|
|
3
|
+
*
|
|
4
|
+
* Generates system prompts for AI code review. Uses XML-tagged structure
|
|
5
|
+
* for clear section boundaries. Output is pure Markdown.
|
|
6
|
+
*/
|
|
7
|
+
/** Get localized code review system prompt */
|
|
8
|
+
export declare function getCodeReviewPrompt(): string;
|
|
9
|
+
//# sourceMappingURL=code-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/code-review.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,8CAA8C;AAC9C,wBAAgB,mBAAmB,IAAI,MAAM,CAmD5C"}
|