vcode-analysis 0.5.0__tar.gz → 0.5.2__tar.gz
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.
- vcode_analysis-0.5.2/PKG-INFO +302 -0
- vcode_analysis-0.5.2/README.md +262 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/analyzers/architecture.py +2 -1
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/analyzers/code_review.py +3 -2
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/analyzers/security.py +2 -1
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/cli.py +292 -93
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/__init__.py +3 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/batch_analyzer.py +80 -57
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/git_handler.py +7 -1
- vcode_analysis-0.5.2/core/json_utils.py +65 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/llm_client.py +6 -1
- vcode_analysis-0.5.2/core/report_generator.py +587 -0
- vcode_analysis-0.5.2/docs/design/vcode-analysis-tool.md +558 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/c/patterns.py +2 -2
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/c/regex_parser.py +18 -8
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/pyproject.toml +1 -1
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/tests/test_c_parser.py +1 -1
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/tests/test_kotlin_parser.py +1 -1
- vcode_analysis-0.5.2/tests/test_report_generator.py +543 -0
- vcode_analysis-0.5.2/vcode_analysis.egg-info/PKG-INFO +302 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/vcode_analysis.egg-info/SOURCES.txt +3 -0
- vcode_analysis-0.5.0/PKG-INFO +0 -440
- vcode_analysis-0.5.0/README.md +0 -400
- vcode_analysis-0.5.0/docs/design/vcode-analysis-tool.md +0 -143
- vcode_analysis-0.5.0/vcode_analysis.egg-info/PKG-INFO +0 -440
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/LICENSE +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/MANIFEST.in +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/analyzers/__init__.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/analyzers/context_builder.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/analyzers/directory.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/analyzers/documentation.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/analyzer.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/batch_planner.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/cache_manager.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/config.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/ignore.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/core/token_estimator.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/docs/PPT/345/244/247/347/272/262-VCode_Analysis_/346/231/272/350/203/275/344/273/243/347/240/201/345/210/206/346/236/220/345/267/245/345/205/267/345/210/206/344/272/253.md" +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/docs/PPT/347/224/237/346/210/220/346/217/220/347/244/272/350/257/215-VCode_Analysis/345/210/206/344/272/253.md" +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/docs/USER_MANUAL.md +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/docs/design/batch-cache-optimization.md +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/docs/design/c-parser-design.md +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/docs/design/kotlin-parser-design.md +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/docs/security-sharing-article.md +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/__init__.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/c/__init__.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/c/ast_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/c/models.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/c_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/java_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/javascript_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/kotlin/__init__.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/kotlin/ast_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/kotlin/models.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/kotlin/patterns.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/kotlin/regex_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/kotlin_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/python_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/parsers/typescript_parser.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/requirements.txt +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/setup.cfg +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/tests/test_batch_operations.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/tests/test_security_rules.py +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/vcode_analysis.egg-info/dependency_links.txt +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/vcode_analysis.egg-info/entry_points.txt +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/vcode_analysis.egg-info/requires.txt +0 -0
- {vcode_analysis-0.5.0 → vcode_analysis-0.5.2}/vcode_analysis.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vcode-analysis
|
|
3
|
+
Version: 0.5.2
|
|
4
|
+
Summary: 基于大模型的智能代码分析工具,支持代码审查、文档生成、架构分析和安全扫描
|
|
5
|
+
Author-email: Wellchang <2483808264@qq.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://xxxxxx
|
|
8
|
+
Project-URL: Repository, https://xxxxxx
|
|
9
|
+
Project-URL: Documentation, https://xxxxxx
|
|
10
|
+
Project-URL: Bug Tracker, https://xxxxxx
|
|
11
|
+
Keywords: vcode-analysis,llm,code-review,documentation
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
22
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
23
|
+
Classifier: Topic :: Security
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: httpx>=0.25.0
|
|
28
|
+
Requires-Dist: docopt>=0.6.2
|
|
29
|
+
Requires-Dist: pyyaml>=6.0
|
|
30
|
+
Provides-Extra: dev
|
|
31
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
32
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
33
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
34
|
+
Provides-Extra: rich
|
|
35
|
+
Requires-Dist: rich>=13.0.0; extra == "rich"
|
|
36
|
+
Provides-Extra: parsers
|
|
37
|
+
Requires-Dist: javalang>=0.13.0; extra == "parsers"
|
|
38
|
+
Requires-Dist: pycparser>=2.21; extra == "parsers"
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
|
|
41
|
+
# VCode Analysis
|
|
42
|
+
|
|
43
|
+
基于私有化部署大模型的智能代码分析工具。兼容 OpenAI API 格式,支持代码审查、文档生成、架构分析和安全扫描。
|
|
44
|
+
|
|
45
|
+
## 特性
|
|
46
|
+
|
|
47
|
+
- **代码审查** — 1-10 评分 + 问题定位 + 改进建议
|
|
48
|
+
- **批量分析** — 智能打包多文件为单次 API 调用,减少 85%+ 请求量
|
|
49
|
+
- **双层缓存** — 内存 LRU + 磁盘持久化,二次分析减少 98% 调用
|
|
50
|
+
- **安全扫描** — 正则规则引擎 + LLM 深度语义分析
|
|
51
|
+
- **架构分析** — 模块识别、依赖关系、耦合度评估
|
|
52
|
+
- **文档生成** — 模块文档 / API 文档 / README 自动生成
|
|
53
|
+
- **多语言解析** — Python/Java AST、Kotlin/C 双模式、JS/TS/Vue 正则
|
|
54
|
+
- **上下文增强** — 自动构建项目依赖关系,提升分析质量
|
|
55
|
+
- **Git 集成** — 单仓库 + 批量多仓库操作
|
|
56
|
+
- **交互式报告** — Markdown + HTML(排序、筛选、折叠)
|
|
57
|
+
|
|
58
|
+
## 安装
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# 使用 pip
|
|
62
|
+
pip install vcode-analysis
|
|
63
|
+
|
|
64
|
+
# 或使用 uvx 直接运行
|
|
65
|
+
uvx vcode-analysis review ./src
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 可选依赖
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Java AST 解析
|
|
72
|
+
pip install javalang
|
|
73
|
+
|
|
74
|
+
# C 语言精确解析
|
|
75
|
+
pip install pycparser
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 快速开始
|
|
79
|
+
|
|
80
|
+
### 1. 配置 LLM 服务
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# 方式一:环境变量
|
|
84
|
+
export OPENAI_API_BASE=http://localhost:8000/v1
|
|
85
|
+
export OPENAI_API_KEY=sk-your-key
|
|
86
|
+
|
|
87
|
+
# 方式二:配置文件
|
|
88
|
+
vcode-analysis config --init
|
|
89
|
+
# 编辑 ~/.code-analysis/config.yaml
|
|
90
|
+
|
|
91
|
+
# 方式三:命令行参数
|
|
92
|
+
vcode-analysis review ./src --base-url http://localhost:8000/v1 --model qwen35-35b-a3b
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 2. 代码审查
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# 审查目录(默认启用批量+缓存)
|
|
99
|
+
vcode-analysis review ./src
|
|
100
|
+
|
|
101
|
+
# 审查单个文件
|
|
102
|
+
vcode-analysis review ./src/main.py
|
|
103
|
+
|
|
104
|
+
# 指定输出格式
|
|
105
|
+
vcode-analysis review ./src -o report.md -f markdown
|
|
106
|
+
vcode-analysis review ./src -o report.html -f html
|
|
107
|
+
|
|
108
|
+
# 启用上下文增强(提升分析质量)
|
|
109
|
+
vcode-analysis review ./src --context
|
|
110
|
+
|
|
111
|
+
# 审查 Git 提交
|
|
112
|
+
vcode-analysis review-commit abc1234
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 3. 其他分析
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# 生成文档
|
|
119
|
+
vcode-analysis doc ./src --type module
|
|
120
|
+
vcode-analysis doc ./src --type api
|
|
121
|
+
vcode-analysis doc ./src --type readme
|
|
122
|
+
|
|
123
|
+
# 架构分析
|
|
124
|
+
vcode-analysis arch ./src
|
|
125
|
+
|
|
126
|
+
# 安全扫描
|
|
127
|
+
vcode-analysis security ./src
|
|
128
|
+
vcode-analysis security ./src --deep # LLM 深度扫描
|
|
129
|
+
|
|
130
|
+
# 目录扫描
|
|
131
|
+
vcode-analysis scan-dir ./src
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 4. Git 操作
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# 克隆并分析
|
|
138
|
+
vcode-analysis clone https://github.com/user/repo.git
|
|
139
|
+
|
|
140
|
+
# 批量克隆(从文件读取 URL 列表)
|
|
141
|
+
vcode-analysis batch-clone repos.txt ./workspace
|
|
142
|
+
|
|
143
|
+
# 批量拉取
|
|
144
|
+
vcode-analysis batch-pull ./workspace
|
|
145
|
+
|
|
146
|
+
# 多仓库状态
|
|
147
|
+
vcode-analysis git-status ./workspace
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 命令参考
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
vcode-analysis review <path> 代码审查
|
|
154
|
+
vcode-analysis review-commit <commit> 审查指定提交
|
|
155
|
+
vcode-analysis doc <path> 生成文档
|
|
156
|
+
vcode-analysis arch <path> 架构分析
|
|
157
|
+
vcode-analysis security <path> 安全扫描
|
|
158
|
+
vcode-analysis clone <url> 克隆仓库并分析
|
|
159
|
+
vcode-analysis batch-clone <file> <dir> 批量克隆
|
|
160
|
+
vcode-analysis batch-pull <dir> 批量拉取
|
|
161
|
+
vcode-analysis git-status <dir> 多仓库状态
|
|
162
|
+
vcode-analysis scan-dir <path> 目录扫描
|
|
163
|
+
vcode-analysis config [--init|--show] 配置管理
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 全局选项
|
|
167
|
+
|
|
168
|
+
| 选项 | 说明 | 默认值 |
|
|
169
|
+
|------|------|--------|
|
|
170
|
+
| `-c, --config` | 配置文件路径 | `~/.code-analysis/config.yaml` |
|
|
171
|
+
| `--base-url` | LLM API 地址 | `http://localhost:8000/v1` |
|
|
172
|
+
| `--api-key` | API 密钥 | `sk-dummy` |
|
|
173
|
+
| `-m, --model` | 模型名称 | `qwen35-35b-a3b` |
|
|
174
|
+
| `--max-tokens` | 最大输出 Token | 4096 |
|
|
175
|
+
| `--timeout` | 请求超时(秒) | 180 |
|
|
176
|
+
| `-o, --output` | 输出文件路径 | 自动生成 |
|
|
177
|
+
| `-f, --format` | 输出格式(markdown/html) | markdown |
|
|
178
|
+
| `-w, --workers` | 并发线程数 | 5 |
|
|
179
|
+
| `--context` | 启用上下文增强 | 关闭 |
|
|
180
|
+
| `--no-cache` | 禁用缓存 | 关闭 |
|
|
181
|
+
| `--no-batch` | 禁用批量分析 | 关闭 |
|
|
182
|
+
|
|
183
|
+
## 配置文件
|
|
184
|
+
|
|
185
|
+
`~/.code-analysis/config.yaml`:
|
|
186
|
+
|
|
187
|
+
```yaml
|
|
188
|
+
llm:
|
|
189
|
+
base_url: "http://localhost:8000/v1"
|
|
190
|
+
api_key: "sk-your-key"
|
|
191
|
+
model: "qwen35-35b-a3b"
|
|
192
|
+
temperature: 0.7
|
|
193
|
+
max_tokens: 8192
|
|
194
|
+
timeout: 180
|
|
195
|
+
|
|
196
|
+
analysis:
|
|
197
|
+
max_file_size: 102400
|
|
198
|
+
max_workers: 5
|
|
199
|
+
ignore_patterns:
|
|
200
|
+
- "custom_ignore/**"
|
|
201
|
+
supported_extensions:
|
|
202
|
+
- ".py"
|
|
203
|
+
- ".java"
|
|
204
|
+
- ".kt"
|
|
205
|
+
|
|
206
|
+
cache:
|
|
207
|
+
ttl: 604800
|
|
208
|
+
memory_cache_size: 1000
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 环境变量
|
|
212
|
+
|
|
213
|
+
| 变量 | 说明 |
|
|
214
|
+
|------|------|
|
|
215
|
+
| `OPENAI_API_BASE` / `OPENAI_BASE_URL` | LLM API 地址 |
|
|
216
|
+
| `OPENAI_API_KEY` | API 密钥 |
|
|
217
|
+
| `CODE_ANALYSIS_MODEL` | 模型名称 |
|
|
218
|
+
| `CODE_ANALYSIS_TEMPERATURE` | 温度参数 |
|
|
219
|
+
| `CODE_ANALYSIS_MAX_TOKENS` | 最大输出 Token |
|
|
220
|
+
|
|
221
|
+
## 支持的语言
|
|
222
|
+
|
|
223
|
+
| 语言 | 扩展名 | 解析方式 |
|
|
224
|
+
|------|--------|----------|
|
|
225
|
+
| Python | `.py` | AST |
|
|
226
|
+
| Java | `.java` | AST (javalang) |
|
|
227
|
+
| Kotlin | `.kt`, `.kts` | 双模式 (fast/precise) |
|
|
228
|
+
| C | `.c`, `.h` | 双模式 (fast/precise) |
|
|
229
|
+
| C++ | `.cpp`, `.hpp`, `.cc`, `.cxx` | 正则 |
|
|
230
|
+
| JavaScript | `.js`, `.jsx` | 正则 |
|
|
231
|
+
| TypeScript | `.ts`, `.tsx` | 正则 |
|
|
232
|
+
| Vue | `.vue` | 正则 |
|
|
233
|
+
| Go | `.go` | 正则 |
|
|
234
|
+
| Rust | `.rs` | 正则 |
|
|
235
|
+
| 配置文件 | `.json`, `.yaml`, `.yml` | 文本 |
|
|
236
|
+
| Markdown | `.md` | 文本 |
|
|
237
|
+
|
|
238
|
+
## 批量分析原理
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
100 个 Python 文件
|
|
242
|
+
│
|
|
243
|
+
▼ 按语言分组 + Token 估算
|
|
244
|
+
│
|
|
245
|
+
├── 批次 1: file_01.py + file_03.py + file_07.py (~7500 tokens)
|
|
246
|
+
├── 批次 2: file_02.py + file_05.py (~6000 tokens)
|
|
247
|
+
├── ...
|
|
248
|
+
└── 批次 15: file_98.py + file_99.py (~5000 tokens)
|
|
249
|
+
│
|
|
250
|
+
▼ 每批合并为一次 API 调用
|
|
251
|
+
│
|
|
252
|
+
100 次 → ~15 次 API 调用(减少 85%)
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**二次分析**(10 个文件变更):缓存命中 90 个文件,仅分析 10 个 → ~2 次调用(减少 98%)。
|
|
256
|
+
|
|
257
|
+
## 项目结构
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
code-analysis/
|
|
261
|
+
├── cli.py CLI 入口
|
|
262
|
+
├── core/ 核心模块
|
|
263
|
+
│ ├── analyzer.py 分析引擎
|
|
264
|
+
│ ├── llm_client.py LLM 客户端
|
|
265
|
+
│ ├── config.py 配置管理
|
|
266
|
+
│ ├── ignore.py 过滤规则
|
|
267
|
+
│ ├── git_handler.py Git 操作
|
|
268
|
+
│ ├── batch_planner.py 批量规划
|
|
269
|
+
│ ├── batch_analyzer.py 批量分析
|
|
270
|
+
│ ├── cache_manager.py 缓存管理
|
|
271
|
+
│ ├── token_estimator.py Token 估算
|
|
272
|
+
│ └── report_generator.py 报告生成
|
|
273
|
+
├── analyzers/ 分析器
|
|
274
|
+
│ ├── code_review.py 代码审查
|
|
275
|
+
│ ├── documentation.py 文档生成
|
|
276
|
+
│ ├── architecture.py 架构分析
|
|
277
|
+
│ ├── security.py 安全扫描
|
|
278
|
+
│ ├── directory.py 目录分析
|
|
279
|
+
│ └── context_builder.py 上下文构建
|
|
280
|
+
├── parsers/ 解析器
|
|
281
|
+
│ ├── python_parser.py Python AST
|
|
282
|
+
│ ├── java_parser.py Java AST
|
|
283
|
+
│ ├── kotlin_parser.py Kotlin 双模式
|
|
284
|
+
│ ├── c_parser.py C 双模式
|
|
285
|
+
│ ├── javascript_parser.py JavaScript
|
|
286
|
+
│ └── typescript_parser.py TypeScript
|
|
287
|
+
└── docs/ 文档
|
|
288
|
+
├── USER_MANUAL.md 用户手册
|
|
289
|
+
└── design/ 设计文档
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## 文档
|
|
293
|
+
|
|
294
|
+
- [用户手册](docs/USER_MANUAL.md)
|
|
295
|
+
- [设计文档](docs/design/vcode-analysis-tool.md)
|
|
296
|
+
- [批量分析优化设计](docs/design/batch-cache-optimization.md)
|
|
297
|
+
- [Kotlin 解析器设计](docs/design/kotlin-parser-design.md)
|
|
298
|
+
- [C 解析器设计](docs/design/c-parser-design.md)
|
|
299
|
+
|
|
300
|
+
## License
|
|
301
|
+
|
|
302
|
+
MIT
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# VCode Analysis
|
|
2
|
+
|
|
3
|
+
基于私有化部署大模型的智能代码分析工具。兼容 OpenAI API 格式,支持代码审查、文档生成、架构分析和安全扫描。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- **代码审查** — 1-10 评分 + 问题定位 + 改进建议
|
|
8
|
+
- **批量分析** — 智能打包多文件为单次 API 调用,减少 85%+ 请求量
|
|
9
|
+
- **双层缓存** — 内存 LRU + 磁盘持久化,二次分析减少 98% 调用
|
|
10
|
+
- **安全扫描** — 正则规则引擎 + LLM 深度语义分析
|
|
11
|
+
- **架构分析** — 模块识别、依赖关系、耦合度评估
|
|
12
|
+
- **文档生成** — 模块文档 / API 文档 / README 自动生成
|
|
13
|
+
- **多语言解析** — Python/Java AST、Kotlin/C 双模式、JS/TS/Vue 正则
|
|
14
|
+
- **上下文增强** — 自动构建项目依赖关系,提升分析质量
|
|
15
|
+
- **Git 集成** — 单仓库 + 批量多仓库操作
|
|
16
|
+
- **交互式报告** — Markdown + HTML(排序、筛选、折叠)
|
|
17
|
+
|
|
18
|
+
## 安装
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 使用 pip
|
|
22
|
+
pip install vcode-analysis
|
|
23
|
+
|
|
24
|
+
# 或使用 uvx 直接运行
|
|
25
|
+
uvx vcode-analysis review ./src
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 可选依赖
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Java AST 解析
|
|
32
|
+
pip install javalang
|
|
33
|
+
|
|
34
|
+
# C 语言精确解析
|
|
35
|
+
pip install pycparser
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 快速开始
|
|
39
|
+
|
|
40
|
+
### 1. 配置 LLM 服务
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 方式一:环境变量
|
|
44
|
+
export OPENAI_API_BASE=http://localhost:8000/v1
|
|
45
|
+
export OPENAI_API_KEY=sk-your-key
|
|
46
|
+
|
|
47
|
+
# 方式二:配置文件
|
|
48
|
+
vcode-analysis config --init
|
|
49
|
+
# 编辑 ~/.code-analysis/config.yaml
|
|
50
|
+
|
|
51
|
+
# 方式三:命令行参数
|
|
52
|
+
vcode-analysis review ./src --base-url http://localhost:8000/v1 --model qwen35-35b-a3b
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 2. 代码审查
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 审查目录(默认启用批量+缓存)
|
|
59
|
+
vcode-analysis review ./src
|
|
60
|
+
|
|
61
|
+
# 审查单个文件
|
|
62
|
+
vcode-analysis review ./src/main.py
|
|
63
|
+
|
|
64
|
+
# 指定输出格式
|
|
65
|
+
vcode-analysis review ./src -o report.md -f markdown
|
|
66
|
+
vcode-analysis review ./src -o report.html -f html
|
|
67
|
+
|
|
68
|
+
# 启用上下文增强(提升分析质量)
|
|
69
|
+
vcode-analysis review ./src --context
|
|
70
|
+
|
|
71
|
+
# 审查 Git 提交
|
|
72
|
+
vcode-analysis review-commit abc1234
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 3. 其他分析
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 生成文档
|
|
79
|
+
vcode-analysis doc ./src --type module
|
|
80
|
+
vcode-analysis doc ./src --type api
|
|
81
|
+
vcode-analysis doc ./src --type readme
|
|
82
|
+
|
|
83
|
+
# 架构分析
|
|
84
|
+
vcode-analysis arch ./src
|
|
85
|
+
|
|
86
|
+
# 安全扫描
|
|
87
|
+
vcode-analysis security ./src
|
|
88
|
+
vcode-analysis security ./src --deep # LLM 深度扫描
|
|
89
|
+
|
|
90
|
+
# 目录扫描
|
|
91
|
+
vcode-analysis scan-dir ./src
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 4. Git 操作
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# 克隆并分析
|
|
98
|
+
vcode-analysis clone https://github.com/user/repo.git
|
|
99
|
+
|
|
100
|
+
# 批量克隆(从文件读取 URL 列表)
|
|
101
|
+
vcode-analysis batch-clone repos.txt ./workspace
|
|
102
|
+
|
|
103
|
+
# 批量拉取
|
|
104
|
+
vcode-analysis batch-pull ./workspace
|
|
105
|
+
|
|
106
|
+
# 多仓库状态
|
|
107
|
+
vcode-analysis git-status ./workspace
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 命令参考
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
vcode-analysis review <path> 代码审查
|
|
114
|
+
vcode-analysis review-commit <commit> 审查指定提交
|
|
115
|
+
vcode-analysis doc <path> 生成文档
|
|
116
|
+
vcode-analysis arch <path> 架构分析
|
|
117
|
+
vcode-analysis security <path> 安全扫描
|
|
118
|
+
vcode-analysis clone <url> 克隆仓库并分析
|
|
119
|
+
vcode-analysis batch-clone <file> <dir> 批量克隆
|
|
120
|
+
vcode-analysis batch-pull <dir> 批量拉取
|
|
121
|
+
vcode-analysis git-status <dir> 多仓库状态
|
|
122
|
+
vcode-analysis scan-dir <path> 目录扫描
|
|
123
|
+
vcode-analysis config [--init|--show] 配置管理
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 全局选项
|
|
127
|
+
|
|
128
|
+
| 选项 | 说明 | 默认值 |
|
|
129
|
+
|------|------|--------|
|
|
130
|
+
| `-c, --config` | 配置文件路径 | `~/.code-analysis/config.yaml` |
|
|
131
|
+
| `--base-url` | LLM API 地址 | `http://localhost:8000/v1` |
|
|
132
|
+
| `--api-key` | API 密钥 | `sk-dummy` |
|
|
133
|
+
| `-m, --model` | 模型名称 | `qwen35-35b-a3b` |
|
|
134
|
+
| `--max-tokens` | 最大输出 Token | 4096 |
|
|
135
|
+
| `--timeout` | 请求超时(秒) | 180 |
|
|
136
|
+
| `-o, --output` | 输出文件路径 | 自动生成 |
|
|
137
|
+
| `-f, --format` | 输出格式(markdown/html) | markdown |
|
|
138
|
+
| `-w, --workers` | 并发线程数 | 5 |
|
|
139
|
+
| `--context` | 启用上下文增强 | 关闭 |
|
|
140
|
+
| `--no-cache` | 禁用缓存 | 关闭 |
|
|
141
|
+
| `--no-batch` | 禁用批量分析 | 关闭 |
|
|
142
|
+
|
|
143
|
+
## 配置文件
|
|
144
|
+
|
|
145
|
+
`~/.code-analysis/config.yaml`:
|
|
146
|
+
|
|
147
|
+
```yaml
|
|
148
|
+
llm:
|
|
149
|
+
base_url: "http://localhost:8000/v1"
|
|
150
|
+
api_key: "sk-your-key"
|
|
151
|
+
model: "qwen35-35b-a3b"
|
|
152
|
+
temperature: 0.7
|
|
153
|
+
max_tokens: 8192
|
|
154
|
+
timeout: 180
|
|
155
|
+
|
|
156
|
+
analysis:
|
|
157
|
+
max_file_size: 102400
|
|
158
|
+
max_workers: 5
|
|
159
|
+
ignore_patterns:
|
|
160
|
+
- "custom_ignore/**"
|
|
161
|
+
supported_extensions:
|
|
162
|
+
- ".py"
|
|
163
|
+
- ".java"
|
|
164
|
+
- ".kt"
|
|
165
|
+
|
|
166
|
+
cache:
|
|
167
|
+
ttl: 604800
|
|
168
|
+
memory_cache_size: 1000
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 环境变量
|
|
172
|
+
|
|
173
|
+
| 变量 | 说明 |
|
|
174
|
+
|------|------|
|
|
175
|
+
| `OPENAI_API_BASE` / `OPENAI_BASE_URL` | LLM API 地址 |
|
|
176
|
+
| `OPENAI_API_KEY` | API 密钥 |
|
|
177
|
+
| `CODE_ANALYSIS_MODEL` | 模型名称 |
|
|
178
|
+
| `CODE_ANALYSIS_TEMPERATURE` | 温度参数 |
|
|
179
|
+
| `CODE_ANALYSIS_MAX_TOKENS` | 最大输出 Token |
|
|
180
|
+
|
|
181
|
+
## 支持的语言
|
|
182
|
+
|
|
183
|
+
| 语言 | 扩展名 | 解析方式 |
|
|
184
|
+
|------|--------|----------|
|
|
185
|
+
| Python | `.py` | AST |
|
|
186
|
+
| Java | `.java` | AST (javalang) |
|
|
187
|
+
| Kotlin | `.kt`, `.kts` | 双模式 (fast/precise) |
|
|
188
|
+
| C | `.c`, `.h` | 双模式 (fast/precise) |
|
|
189
|
+
| C++ | `.cpp`, `.hpp`, `.cc`, `.cxx` | 正则 |
|
|
190
|
+
| JavaScript | `.js`, `.jsx` | 正则 |
|
|
191
|
+
| TypeScript | `.ts`, `.tsx` | 正则 |
|
|
192
|
+
| Vue | `.vue` | 正则 |
|
|
193
|
+
| Go | `.go` | 正则 |
|
|
194
|
+
| Rust | `.rs` | 正则 |
|
|
195
|
+
| 配置文件 | `.json`, `.yaml`, `.yml` | 文本 |
|
|
196
|
+
| Markdown | `.md` | 文本 |
|
|
197
|
+
|
|
198
|
+
## 批量分析原理
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
100 个 Python 文件
|
|
202
|
+
│
|
|
203
|
+
▼ 按语言分组 + Token 估算
|
|
204
|
+
│
|
|
205
|
+
├── 批次 1: file_01.py + file_03.py + file_07.py (~7500 tokens)
|
|
206
|
+
├── 批次 2: file_02.py + file_05.py (~6000 tokens)
|
|
207
|
+
├── ...
|
|
208
|
+
└── 批次 15: file_98.py + file_99.py (~5000 tokens)
|
|
209
|
+
│
|
|
210
|
+
▼ 每批合并为一次 API 调用
|
|
211
|
+
│
|
|
212
|
+
100 次 → ~15 次 API 调用(减少 85%)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**二次分析**(10 个文件变更):缓存命中 90 个文件,仅分析 10 个 → ~2 次调用(减少 98%)。
|
|
216
|
+
|
|
217
|
+
## 项目结构
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
code-analysis/
|
|
221
|
+
├── cli.py CLI 入口
|
|
222
|
+
├── core/ 核心模块
|
|
223
|
+
│ ├── analyzer.py 分析引擎
|
|
224
|
+
│ ├── llm_client.py LLM 客户端
|
|
225
|
+
│ ├── config.py 配置管理
|
|
226
|
+
│ ├── ignore.py 过滤规则
|
|
227
|
+
│ ├── git_handler.py Git 操作
|
|
228
|
+
│ ├── batch_planner.py 批量规划
|
|
229
|
+
│ ├── batch_analyzer.py 批量分析
|
|
230
|
+
│ ├── cache_manager.py 缓存管理
|
|
231
|
+
│ ├── token_estimator.py Token 估算
|
|
232
|
+
│ └── report_generator.py 报告生成
|
|
233
|
+
├── analyzers/ 分析器
|
|
234
|
+
│ ├── code_review.py 代码审查
|
|
235
|
+
│ ├── documentation.py 文档生成
|
|
236
|
+
│ ├── architecture.py 架构分析
|
|
237
|
+
│ ├── security.py 安全扫描
|
|
238
|
+
│ ├── directory.py 目录分析
|
|
239
|
+
│ └── context_builder.py 上下文构建
|
|
240
|
+
├── parsers/ 解析器
|
|
241
|
+
│ ├── python_parser.py Python AST
|
|
242
|
+
│ ├── java_parser.py Java AST
|
|
243
|
+
│ ├── kotlin_parser.py Kotlin 双模式
|
|
244
|
+
│ ├── c_parser.py C 双模式
|
|
245
|
+
│ ├── javascript_parser.py JavaScript
|
|
246
|
+
│ └── typescript_parser.py TypeScript
|
|
247
|
+
└── docs/ 文档
|
|
248
|
+
├── USER_MANUAL.md 用户手册
|
|
249
|
+
└── design/ 设计文档
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## 文档
|
|
253
|
+
|
|
254
|
+
- [用户手册](docs/USER_MANUAL.md)
|
|
255
|
+
- [设计文档](docs/design/vcode-analysis-tool.md)
|
|
256
|
+
- [批量分析优化设计](docs/design/batch-cache-optimization.md)
|
|
257
|
+
- [Kotlin 解析器设计](docs/design/kotlin-parser-design.md)
|
|
258
|
+
- [C 解析器设计](docs/design/c-parser-design.md)
|
|
259
|
+
|
|
260
|
+
## License
|
|
261
|
+
|
|
262
|
+
MIT
|
|
@@ -10,6 +10,7 @@ import re
|
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
12
|
from core.analyzer import Analyzer, FileInfo, AnalysisResult
|
|
13
|
+
from core.json_utils import remove_trailing_commas
|
|
13
14
|
|
|
14
15
|
# Python AST 解析器(可选依赖)
|
|
15
16
|
try:
|
|
@@ -499,7 +500,7 @@ class ArchitectureAnalyzer:
|
|
|
499
500
|
elif "```" in content:
|
|
500
501
|
content = content.split("```")[1].split("```")[0]
|
|
501
502
|
|
|
502
|
-
data = json.loads(content.strip())
|
|
503
|
+
data = json.loads(remove_trailing_commas(content.strip()))
|
|
503
504
|
summary = data.get("summary", "")
|
|
504
505
|
suggestions = data.get("suggestions", [])
|
|
505
506
|
except Exception:
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Optional, TYPE_CHECKING
|
|
5
5
|
from core.analyzer import Analyzer, FileInfo, AnalysisResult
|
|
6
|
+
from core.json_utils import remove_trailing_commas
|
|
6
7
|
|
|
7
8
|
if TYPE_CHECKING:
|
|
8
9
|
from .context_builder import AnalysisContext
|
|
@@ -133,7 +134,7 @@ class CodeReviewAnalyzer:
|
|
|
133
134
|
elif "```" in content:
|
|
134
135
|
content = content.split("```")[1].split("```")[0]
|
|
135
136
|
|
|
136
|
-
data = json.loads(content.strip())
|
|
137
|
+
data = json.loads(remove_trailing_commas(content.strip()))
|
|
137
138
|
return CodeReviewResult(
|
|
138
139
|
file_path=file_info.relative_path,
|
|
139
140
|
score=data.get("score", 0),
|
|
@@ -276,7 +277,7 @@ class CodeReviewAnalyzer:
|
|
|
276
277
|
elif "```" in content:
|
|
277
278
|
content = content.split("```")[1].split("```")[0]
|
|
278
279
|
|
|
279
|
-
data = json.loads(content.strip())
|
|
280
|
+
data = json.loads(remove_trailing_commas(content.strip()))
|
|
280
281
|
|
|
281
282
|
# 提取跨文件问题并添加到 issues
|
|
282
283
|
issues = data.get("issues", [])
|
|
@@ -14,6 +14,7 @@ from typing import Optional
|
|
|
14
14
|
import re
|
|
15
15
|
|
|
16
16
|
from core.analyzer import Analyzer, FileInfo, AnalysisResult
|
|
17
|
+
from core.json_utils import remove_trailing_commas
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
@dataclass
|
|
@@ -640,7 +641,7 @@ class SecurityAnalyzer:
|
|
|
640
641
|
if "```json" in result_content:
|
|
641
642
|
result_content = result_content.split("```json")[1].split("```")[0]
|
|
642
643
|
|
|
643
|
-
data = json.loads(result_content.strip())
|
|
644
|
+
data = json.loads(remove_trailing_commas(result_content.strip()))
|
|
644
645
|
|
|
645
646
|
issues = []
|
|
646
647
|
for issue in data.get("confirmed_issues", []):
|