vcode-analysis 0.4.0__tar.gz → 0.5.0__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.4.0/vcode_analysis.egg-info → vcode_analysis-0.5.0}/PKG-INFO +159 -20
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/README.md +154 -15
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/analyzers/context_builder.py +35 -2
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/cli.py +227 -87
- vcode_analysis-0.5.0/core/__init__.py +33 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/core/analyzer.py +10 -4
- vcode_analysis-0.5.0/core/batch_analyzer.py +452 -0
- vcode_analysis-0.5.0/core/batch_planner.py +168 -0
- vcode_analysis-0.5.0/core/cache_manager.py +347 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/core/config.py +29 -3
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/core/ignore.py +4 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/core/llm_client.py +19 -3
- vcode_analysis-0.5.0/core/token_estimator.py +94 -0
- vcode_analysis-0.5.0/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 +363 -0
- vcode_analysis-0.5.0/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 +354 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/docs/USER_MANUAL.md +1 -1
- vcode_analysis-0.5.0/docs/design/batch-cache-optimization.md +195 -0
- vcode_analysis-0.4.0/docs/design/code-analysis-tool.md → vcode_analysis-0.5.0/docs/design/vcode-analysis-tool.md +7 -7
- vcode_analysis-0.5.0/docs/security-sharing-article.md +176 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/pyproject.toml +5 -5
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0/vcode_analysis.egg-info}/PKG-INFO +159 -20
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/vcode_analysis.egg-info/SOURCES.txt +9 -1
- vcode_analysis-0.4.0/core/__init__.py +0 -17
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/LICENSE +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/MANIFEST.in +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/analyzers/__init__.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/analyzers/architecture.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/analyzers/code_review.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/analyzers/directory.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/analyzers/documentation.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/analyzers/security.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/core/git_handler.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/docs/design/c-parser-design.md +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/docs/design/kotlin-parser-design.md +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/__init__.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/c/__init__.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/c/ast_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/c/models.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/c/patterns.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/c/regex_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/c_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/java_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/javascript_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/kotlin/__init__.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/kotlin/ast_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/kotlin/models.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/kotlin/patterns.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/kotlin/regex_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/kotlin_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/python_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/parsers/typescript_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/requirements.txt +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/setup.cfg +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/tests/test_batch_operations.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/tests/test_c_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/tests/test_kotlin_parser.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/tests/test_security_rules.py +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/vcode_analysis.egg-info/dependency_links.txt +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/vcode_analysis.egg-info/entry_points.txt +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/vcode_analysis.egg-info/requires.txt +0 -0
- {vcode_analysis-0.4.0 → vcode_analysis-0.5.0}/vcode_analysis.egg-info/top_level.txt +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vcode-analysis
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: 基于大模型的智能代码分析工具,支持代码审查、文档生成、架构分析和安全扫描
|
|
5
5
|
Author-email: Wellchang <2483808264@qq.com>
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://
|
|
8
|
-
Project-URL: Repository, https://
|
|
9
|
-
Project-URL: Documentation, https://
|
|
10
|
-
Project-URL: Bug Tracker, https://
|
|
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
11
|
Keywords: vcode-analysis,llm,code-review,documentation
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
13
|
Classifier: Environment :: Console
|
|
@@ -54,11 +54,13 @@ Dynamic: license-file
|
|
|
54
54
|
| 📝 **文档生成** | 自动生成模块文档、API 文档 |
|
|
55
55
|
| 🏗️ **架构分析** | 分析项目结构、依赖关系、代码度量 |
|
|
56
56
|
| 🔒 **安全扫描** | 检测常见安全漏洞和风险代码 |
|
|
57
|
+
| 🔗 **上下文增强** | 解析项目依赖关系,提供关联文件上下文给 LLM |
|
|
57
58
|
| ⚡ **并发分析** | 支持多线程并发分析,默认 5 个线程 |
|
|
58
59
|
| 📦 **批量操作** | 批量克隆、批量 Git 操作、多仓库管理 |
|
|
59
60
|
| 📂 **目录分析** | 扫描项目结构、识别技术栈 |
|
|
60
|
-
| 🌐 **多语言支持** | Python, Java, Kotlin, C
|
|
61
|
+
| 🌐 **多语言支持** | Python, Java, Kotlin, C/C++, JavaScript, TypeScript, Vue 等 |
|
|
61
62
|
| 🤖 **私有化部署** | 兼容 OpenAI API 格式,支持任何私有化 LLM |
|
|
63
|
+
| 🌍 **环境变量** | 支持环境变量配置,方便 CI/CD 集成 |
|
|
62
64
|
|
|
63
65
|
## 🚀 快速开始
|
|
64
66
|
|
|
@@ -80,11 +82,21 @@ pip install vcode-analysis[parsers,rich]
|
|
|
80
82
|
**方式二:从源码安装**
|
|
81
83
|
|
|
82
84
|
```bash
|
|
83
|
-
git clone
|
|
85
|
+
git clone
|
|
84
86
|
cd code-analysis
|
|
85
87
|
pip install -e .
|
|
86
88
|
```
|
|
87
89
|
|
|
90
|
+
**方式三:离线安装**
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Windows
|
|
94
|
+
install_offline.bat
|
|
95
|
+
|
|
96
|
+
# Linux/macOS
|
|
97
|
+
bash install_offline.sh
|
|
98
|
+
```
|
|
99
|
+
|
|
88
100
|
### 配置
|
|
89
101
|
|
|
90
102
|
```bash
|
|
@@ -98,7 +110,7 @@ vcode-analysis config --init
|
|
|
98
110
|
### 使用
|
|
99
111
|
|
|
100
112
|
```bash
|
|
101
|
-
#
|
|
113
|
+
# 代码审查(默认启用批量分析和缓存,大幅减少 API 调用)
|
|
102
114
|
vcode-analysis review ./src
|
|
103
115
|
|
|
104
116
|
# 架构分析
|
|
@@ -110,10 +122,43 @@ vcode-analysis security ./src --deep
|
|
|
110
122
|
# 使用 10 个并发线程加速分析
|
|
111
123
|
vcode-analysis review ./src --workers 10
|
|
112
124
|
|
|
125
|
+
# 禁用缓存(强制重新分析)
|
|
126
|
+
vcode-analysis review ./src --no-cache
|
|
127
|
+
|
|
128
|
+
# 禁用批量分析(逐文件分析)
|
|
129
|
+
vcode-analysis review ./src --no-batch
|
|
130
|
+
|
|
131
|
+
# 启用上下文增强(提供项目结构和依赖关系)
|
|
132
|
+
vcode-analysis review ./src --context
|
|
133
|
+
|
|
134
|
+
# 输出 JSON 格式
|
|
135
|
+
vcode-analysis review ./src --format json
|
|
136
|
+
|
|
113
137
|
# 目录扫描
|
|
114
138
|
vcode-analysis scan-dir ./project
|
|
139
|
+
|
|
140
|
+
# 目录扫描(指定深度)
|
|
141
|
+
vcode-analysis scan-dir ./project --depth 3
|
|
115
142
|
```
|
|
116
143
|
|
|
144
|
+
## ⚡ 性能优化
|
|
145
|
+
|
|
146
|
+
### 批量分析 + 缓存(v0.4.0 新增)
|
|
147
|
+
|
|
148
|
+
**默认启用**,可大幅提升分析效率:
|
|
149
|
+
|
|
150
|
+
| 场景 | 原方式 | 优化后 | 提升 |
|
|
151
|
+
|------|--------|--------|------|
|
|
152
|
+
| 首次分析 100 个文件 | 100 次 API 调用 | ~15 次 | 减少 85% |
|
|
153
|
+
| 二次分析(仅 10 个文件变更) | 100 次 API 调用 | ~2 次 | 减少 98% |
|
|
154
|
+
|
|
155
|
+
**优化原理**:
|
|
156
|
+
- **智能合并**:按语言类型分组,动态估算 Token 数,多文件合并为一次 API 调用
|
|
157
|
+
- **双层缓存**:内存缓存(快速)+ 磁盘缓存(持久化),基于内容哈希
|
|
158
|
+
- **增量分析**:自动跳过未变更的文件
|
|
159
|
+
|
|
160
|
+
**缓存位置**:`~/.code-analysis/cache/`
|
|
161
|
+
|
|
117
162
|
## 📖 命令概览
|
|
118
163
|
|
|
119
164
|
```bash
|
|
@@ -129,6 +174,27 @@ Commands:
|
|
|
129
174
|
git-status 查看多仓库状态
|
|
130
175
|
scan-dir 扫描目录结构
|
|
131
176
|
config 配置管理
|
|
177
|
+
|
|
178
|
+
Options:
|
|
179
|
+
-c, --config <file> 配置文件路径
|
|
180
|
+
--base-url <url> LLM API 地址
|
|
181
|
+
--api-key <key> API 密钥
|
|
182
|
+
-m, --model <name> 模型名称
|
|
183
|
+
--max-tokens <n> 最大输出 Token 数 (默认: 4096)
|
|
184
|
+
--timeout <n> 请求超时时间/秒 (默认: 180)
|
|
185
|
+
-o, --output <file> 输出文件路径
|
|
186
|
+
-f, --format <format> 输出格式 (markdown/json)
|
|
187
|
+
-w, --workers <n> 并发线程数 (默认: 5)
|
|
188
|
+
--context 启用上下文增强分析
|
|
189
|
+
--no-cache 禁用缓存(默认启用缓存)
|
|
190
|
+
--no-batch 禁用批量分析(默认启用批量合并)
|
|
191
|
+
--deep 深度扫描 (安全扫描)
|
|
192
|
+
--branch <name> 克隆的分支名
|
|
193
|
+
--analyze 克隆后自动分析
|
|
194
|
+
--parallel 并行克隆
|
|
195
|
+
--repos <names> 指定仓库名列表(逗号分隔)
|
|
196
|
+
--depth <n> 扫描深度
|
|
197
|
+
--type <type> 文档类型 (module/api)
|
|
132
198
|
```
|
|
133
199
|
|
|
134
200
|
## 🌍 支持的语言
|
|
@@ -139,12 +205,17 @@ Commands:
|
|
|
139
205
|
| Java | `.java` | AST |
|
|
140
206
|
| Kotlin | `.kt`, `.kts` | 双模式 |
|
|
141
207
|
| C | `.c`, `.h` | 双模式 |
|
|
208
|
+
| C++ | `.cpp`, `.hpp`, `.cc`, `.cxx` | 正则 |
|
|
142
209
|
| JavaScript | `.js`, `.jsx` | 正则 |
|
|
143
210
|
| TypeScript | `.ts`, `.tsx` | 正则 |
|
|
211
|
+
| Vue | `.vue` | 正则 |
|
|
212
|
+
|
|
213
|
+
> 此外还支持配置文件(`.json`、`.yaml`、`.yml`)和文档(`.md`)的分析
|
|
144
214
|
|
|
145
215
|
## 📚 文档
|
|
146
216
|
|
|
147
217
|
- [完整使用手册](docs/USER_MANUAL.md)
|
|
218
|
+
- [批量分析与缓存优化设计](docs/design/batch-cache-optimization.md)
|
|
148
219
|
- [Kotlin 解析器设计](docs/design/kotlin-parser-design.md)
|
|
149
220
|
- [C 解析器设计](docs/design/c-parser-design.md)
|
|
150
221
|
|
|
@@ -158,18 +229,25 @@ code-analysis/
|
|
|
158
229
|
│ ├── llm_client.py # LLM 客户端
|
|
159
230
|
│ ├── git_handler.py # Git 操作 + 批量操作
|
|
160
231
|
│ ├── config.py # 配置管理
|
|
161
|
-
│
|
|
232
|
+
│ ├── ignore.py # 统一过滤规则
|
|
233
|
+
│ ├── token_estimator.py # Token 估算模块
|
|
234
|
+
│ ├── batch_planner.py # 批量分析规划器
|
|
235
|
+
│ ├── batch_analyzer.py # 批量分析器
|
|
236
|
+
│ └── cache_manager.py # 缓存管理器
|
|
162
237
|
├── analyzers/
|
|
163
238
|
│ ├── code_review.py # 代码审查
|
|
164
239
|
│ ├── documentation.py # 文档生成
|
|
165
240
|
│ ├── architecture.py # 架构分析
|
|
166
241
|
│ ├── security.py # 安全扫描
|
|
167
|
-
│
|
|
242
|
+
│ ├── directory.py # 目录分析
|
|
243
|
+
│ └── context_builder.py # 上下文构建器
|
|
168
244
|
└── parsers/
|
|
169
245
|
├── python_parser.py # Python AST 解析器
|
|
170
246
|
├── java_parser.py # Java AST 解析器
|
|
171
247
|
├── kotlin_parser.py # Kotlin 解析器(双模式)
|
|
172
248
|
├── c_parser.py # C 语言解析器(双模式)
|
|
249
|
+
├── javascript_parser.py # JavaScript 解析器
|
|
250
|
+
├── typescript_parser.py # TypeScript 解析器
|
|
173
251
|
└── ...
|
|
174
252
|
```
|
|
175
253
|
|
|
@@ -187,8 +265,30 @@ vcode-analysis review ./src --workers 10
|
|
|
187
265
|
# 自定义输出路径
|
|
188
266
|
vcode-analysis review ./src --output custom_report.md
|
|
189
267
|
|
|
268
|
+
# 输出 JSON 格式
|
|
269
|
+
vcode-analysis review ./src --format json
|
|
270
|
+
|
|
271
|
+
# 启用上下文增强(提供项目依赖关系和关联文件信息)
|
|
272
|
+
vcode-analysis review ./src --context
|
|
273
|
+
|
|
190
274
|
# 审查最新提交
|
|
191
275
|
vcode-analysis review-commit HEAD
|
|
276
|
+
|
|
277
|
+
# 审查指定提交
|
|
278
|
+
vcode-analysis review-commit abc1234 --path ./src
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### 文档生成
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# 生成模块文档(默认)
|
|
285
|
+
vcode-analysis doc ./src
|
|
286
|
+
|
|
287
|
+
# 生成 API 文档
|
|
288
|
+
vcode-analysis doc ./src --type api
|
|
289
|
+
|
|
290
|
+
# 自定义输出路径
|
|
291
|
+
vcode-analysis doc ./src --output docs.md
|
|
192
292
|
```
|
|
193
293
|
|
|
194
294
|
### 安全扫描
|
|
@@ -207,6 +307,18 @@ vcode-analysis security ./src
|
|
|
207
307
|
# 批量克隆(从文件读取 URL 列表)
|
|
208
308
|
vcode-analysis batch-clone repos.txt ./projects --parallel
|
|
209
309
|
|
|
310
|
+
# 克隆后自动分析
|
|
311
|
+
vcode-analysis batch-clone repos.txt ./projects --parallel --analyze
|
|
312
|
+
|
|
313
|
+
# 克隆指定分支
|
|
314
|
+
vcode-analysis clone https://example.com/repo.git --branch develop
|
|
315
|
+
|
|
316
|
+
# 批量拉取更新
|
|
317
|
+
vcode-analysis batch-pull ~/projects
|
|
318
|
+
|
|
319
|
+
# 拉取指定仓库
|
|
320
|
+
vcode-analysis batch-pull ~/projects --repos repo1,repo2
|
|
321
|
+
|
|
210
322
|
# 查看多仓库状态
|
|
211
323
|
vcode-analysis git-status ~/projects
|
|
212
324
|
```
|
|
@@ -221,10 +333,30 @@ llm:
|
|
|
221
333
|
model: qwen3.5-35b-a3b
|
|
222
334
|
temperature: 0.7
|
|
223
335
|
max_tokens: 4096
|
|
336
|
+
timeout: 180 # 请求超时时间(秒)
|
|
224
337
|
|
|
225
338
|
analysis:
|
|
226
339
|
max_file_size: 102400
|
|
227
|
-
max_workers: 5
|
|
340
|
+
max_workers: 5 # 并发分析线程数
|
|
341
|
+
|
|
342
|
+
# 支持的文件扩展名(不在此列表中的文件将被忽略)
|
|
343
|
+
supported_extensions:
|
|
344
|
+
- ".py"
|
|
345
|
+
- ".java"
|
|
346
|
+
- ".kt"
|
|
347
|
+
- ".kts"
|
|
348
|
+
- ".js"
|
|
349
|
+
- ".jsx"
|
|
350
|
+
- ".ts"
|
|
351
|
+
- ".tsx"
|
|
352
|
+
- ".vue"
|
|
353
|
+
- ".c"
|
|
354
|
+
- ".h"
|
|
355
|
+
- ".cpp"
|
|
356
|
+
- ".hpp"
|
|
357
|
+
- ".cc"
|
|
358
|
+
- ".cxx"
|
|
359
|
+
|
|
228
360
|
ignore_patterns:
|
|
229
361
|
# 默认已包含多语言依赖目录和缓存文件
|
|
230
362
|
# Python: .venv, venv, __pycache__, .pytest_cache, .mypy_cache
|
|
@@ -234,8 +366,24 @@ analysis:
|
|
|
234
366
|
# .NET: bin, obj
|
|
235
367
|
# 以及: .git, .idea, .vscode, *.pyc, *.min.js 等
|
|
236
368
|
# 用户可在此添加额外的自定义忽略规则
|
|
369
|
+
|
|
370
|
+
cache:
|
|
371
|
+
ttl: 604800 # 缓存有效期(秒),默认 7 天
|
|
372
|
+
memory_cache_size: 1000 # 内存缓存最大条目数
|
|
237
373
|
```
|
|
238
374
|
|
|
375
|
+
### 环境变量
|
|
376
|
+
|
|
377
|
+
除了配置文件,还可以通过环境变量设置(优先级高于配置文件):
|
|
378
|
+
|
|
379
|
+
| 环境变量 | 对应配置项 |
|
|
380
|
+
|----------|-----------|
|
|
381
|
+
| `OPENAI_API_BASE` 或 `OPENAI_BASE_URL` | `llm.base_url` |
|
|
382
|
+
| `OPENAI_API_KEY` | `llm.api_key` |
|
|
383
|
+
| `CODE_ANALYSIS_MODEL` | `llm.model` |
|
|
384
|
+
| `CODE_ANALYSIS_TEMPERATURE` | `llm.temperature` |
|
|
385
|
+
| `CODE_ANALYSIS_MAX_TOKENS` | `llm.max_tokens` |
|
|
386
|
+
|
|
239
387
|
## 🤝 扩展开发
|
|
240
388
|
|
|
241
389
|
### 添加新的分析器
|
|
@@ -290,12 +438,3 @@ twine upload dist/*
|
|
|
290
438
|
twine upload --repository testpypi dist/*
|
|
291
439
|
```
|
|
292
440
|
|
|
293
|
-
## 📄 许可证
|
|
294
|
-
|
|
295
|
-
[MIT License](LICENSE)
|
|
296
|
-
|
|
297
|
-
## 🔗 链接
|
|
298
|
-
|
|
299
|
-
- [PyPI 包地址](https://pypi.org/project/vcode-analysis/)
|
|
300
|
-
- [项目主页](https://gitcode.com/wellchang/code-analysis)
|
|
301
|
-
- [问题反馈](https://gitcode.com/wellchang/code-analysis/issues)
|
|
@@ -14,11 +14,13 @@
|
|
|
14
14
|
| 📝 **文档生成** | 自动生成模块文档、API 文档 |
|
|
15
15
|
| 🏗️ **架构分析** | 分析项目结构、依赖关系、代码度量 |
|
|
16
16
|
| 🔒 **安全扫描** | 检测常见安全漏洞和风险代码 |
|
|
17
|
+
| 🔗 **上下文增强** | 解析项目依赖关系,提供关联文件上下文给 LLM |
|
|
17
18
|
| ⚡ **并发分析** | 支持多线程并发分析,默认 5 个线程 |
|
|
18
19
|
| 📦 **批量操作** | 批量克隆、批量 Git 操作、多仓库管理 |
|
|
19
20
|
| 📂 **目录分析** | 扫描项目结构、识别技术栈 |
|
|
20
|
-
| 🌐 **多语言支持** | Python, Java, Kotlin, C
|
|
21
|
+
| 🌐 **多语言支持** | Python, Java, Kotlin, C/C++, JavaScript, TypeScript, Vue 等 |
|
|
21
22
|
| 🤖 **私有化部署** | 兼容 OpenAI API 格式,支持任何私有化 LLM |
|
|
23
|
+
| 🌍 **环境变量** | 支持环境变量配置,方便 CI/CD 集成 |
|
|
22
24
|
|
|
23
25
|
## 🚀 快速开始
|
|
24
26
|
|
|
@@ -40,11 +42,21 @@ pip install vcode-analysis[parsers,rich]
|
|
|
40
42
|
**方式二:从源码安装**
|
|
41
43
|
|
|
42
44
|
```bash
|
|
43
|
-
git clone
|
|
45
|
+
git clone
|
|
44
46
|
cd code-analysis
|
|
45
47
|
pip install -e .
|
|
46
48
|
```
|
|
47
49
|
|
|
50
|
+
**方式三:离线安装**
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Windows
|
|
54
|
+
install_offline.bat
|
|
55
|
+
|
|
56
|
+
# Linux/macOS
|
|
57
|
+
bash install_offline.sh
|
|
58
|
+
```
|
|
59
|
+
|
|
48
60
|
### 配置
|
|
49
61
|
|
|
50
62
|
```bash
|
|
@@ -58,7 +70,7 @@ vcode-analysis config --init
|
|
|
58
70
|
### 使用
|
|
59
71
|
|
|
60
72
|
```bash
|
|
61
|
-
#
|
|
73
|
+
# 代码审查(默认启用批量分析和缓存,大幅减少 API 调用)
|
|
62
74
|
vcode-analysis review ./src
|
|
63
75
|
|
|
64
76
|
# 架构分析
|
|
@@ -70,10 +82,43 @@ vcode-analysis security ./src --deep
|
|
|
70
82
|
# 使用 10 个并发线程加速分析
|
|
71
83
|
vcode-analysis review ./src --workers 10
|
|
72
84
|
|
|
85
|
+
# 禁用缓存(强制重新分析)
|
|
86
|
+
vcode-analysis review ./src --no-cache
|
|
87
|
+
|
|
88
|
+
# 禁用批量分析(逐文件分析)
|
|
89
|
+
vcode-analysis review ./src --no-batch
|
|
90
|
+
|
|
91
|
+
# 启用上下文增强(提供项目结构和依赖关系)
|
|
92
|
+
vcode-analysis review ./src --context
|
|
93
|
+
|
|
94
|
+
# 输出 JSON 格式
|
|
95
|
+
vcode-analysis review ./src --format json
|
|
96
|
+
|
|
73
97
|
# 目录扫描
|
|
74
98
|
vcode-analysis scan-dir ./project
|
|
99
|
+
|
|
100
|
+
# 目录扫描(指定深度)
|
|
101
|
+
vcode-analysis scan-dir ./project --depth 3
|
|
75
102
|
```
|
|
76
103
|
|
|
104
|
+
## ⚡ 性能优化
|
|
105
|
+
|
|
106
|
+
### 批量分析 + 缓存(v0.4.0 新增)
|
|
107
|
+
|
|
108
|
+
**默认启用**,可大幅提升分析效率:
|
|
109
|
+
|
|
110
|
+
| 场景 | 原方式 | 优化后 | 提升 |
|
|
111
|
+
|------|--------|--------|------|
|
|
112
|
+
| 首次分析 100 个文件 | 100 次 API 调用 | ~15 次 | 减少 85% |
|
|
113
|
+
| 二次分析(仅 10 个文件变更) | 100 次 API 调用 | ~2 次 | 减少 98% |
|
|
114
|
+
|
|
115
|
+
**优化原理**:
|
|
116
|
+
- **智能合并**:按语言类型分组,动态估算 Token 数,多文件合并为一次 API 调用
|
|
117
|
+
- **双层缓存**:内存缓存(快速)+ 磁盘缓存(持久化),基于内容哈希
|
|
118
|
+
- **增量分析**:自动跳过未变更的文件
|
|
119
|
+
|
|
120
|
+
**缓存位置**:`~/.code-analysis/cache/`
|
|
121
|
+
|
|
77
122
|
## 📖 命令概览
|
|
78
123
|
|
|
79
124
|
```bash
|
|
@@ -89,6 +134,27 @@ Commands:
|
|
|
89
134
|
git-status 查看多仓库状态
|
|
90
135
|
scan-dir 扫描目录结构
|
|
91
136
|
config 配置管理
|
|
137
|
+
|
|
138
|
+
Options:
|
|
139
|
+
-c, --config <file> 配置文件路径
|
|
140
|
+
--base-url <url> LLM API 地址
|
|
141
|
+
--api-key <key> API 密钥
|
|
142
|
+
-m, --model <name> 模型名称
|
|
143
|
+
--max-tokens <n> 最大输出 Token 数 (默认: 4096)
|
|
144
|
+
--timeout <n> 请求超时时间/秒 (默认: 180)
|
|
145
|
+
-o, --output <file> 输出文件路径
|
|
146
|
+
-f, --format <format> 输出格式 (markdown/json)
|
|
147
|
+
-w, --workers <n> 并发线程数 (默认: 5)
|
|
148
|
+
--context 启用上下文增强分析
|
|
149
|
+
--no-cache 禁用缓存(默认启用缓存)
|
|
150
|
+
--no-batch 禁用批量分析(默认启用批量合并)
|
|
151
|
+
--deep 深度扫描 (安全扫描)
|
|
152
|
+
--branch <name> 克隆的分支名
|
|
153
|
+
--analyze 克隆后自动分析
|
|
154
|
+
--parallel 并行克隆
|
|
155
|
+
--repos <names> 指定仓库名列表(逗号分隔)
|
|
156
|
+
--depth <n> 扫描深度
|
|
157
|
+
--type <type> 文档类型 (module/api)
|
|
92
158
|
```
|
|
93
159
|
|
|
94
160
|
## 🌍 支持的语言
|
|
@@ -99,12 +165,17 @@ Commands:
|
|
|
99
165
|
| Java | `.java` | AST |
|
|
100
166
|
| Kotlin | `.kt`, `.kts` | 双模式 |
|
|
101
167
|
| C | `.c`, `.h` | 双模式 |
|
|
168
|
+
| C++ | `.cpp`, `.hpp`, `.cc`, `.cxx` | 正则 |
|
|
102
169
|
| JavaScript | `.js`, `.jsx` | 正则 |
|
|
103
170
|
| TypeScript | `.ts`, `.tsx` | 正则 |
|
|
171
|
+
| Vue | `.vue` | 正则 |
|
|
172
|
+
|
|
173
|
+
> 此外还支持配置文件(`.json`、`.yaml`、`.yml`)和文档(`.md`)的分析
|
|
104
174
|
|
|
105
175
|
## 📚 文档
|
|
106
176
|
|
|
107
177
|
- [完整使用手册](docs/USER_MANUAL.md)
|
|
178
|
+
- [批量分析与缓存优化设计](docs/design/batch-cache-optimization.md)
|
|
108
179
|
- [Kotlin 解析器设计](docs/design/kotlin-parser-design.md)
|
|
109
180
|
- [C 解析器设计](docs/design/c-parser-design.md)
|
|
110
181
|
|
|
@@ -118,18 +189,25 @@ code-analysis/
|
|
|
118
189
|
│ ├── llm_client.py # LLM 客户端
|
|
119
190
|
│ ├── git_handler.py # Git 操作 + 批量操作
|
|
120
191
|
│ ├── config.py # 配置管理
|
|
121
|
-
│
|
|
192
|
+
│ ├── ignore.py # 统一过滤规则
|
|
193
|
+
│ ├── token_estimator.py # Token 估算模块
|
|
194
|
+
│ ├── batch_planner.py # 批量分析规划器
|
|
195
|
+
│ ├── batch_analyzer.py # 批量分析器
|
|
196
|
+
│ └── cache_manager.py # 缓存管理器
|
|
122
197
|
├── analyzers/
|
|
123
198
|
│ ├── code_review.py # 代码审查
|
|
124
199
|
│ ├── documentation.py # 文档生成
|
|
125
200
|
│ ├── architecture.py # 架构分析
|
|
126
201
|
│ ├── security.py # 安全扫描
|
|
127
|
-
│
|
|
202
|
+
│ ├── directory.py # 目录分析
|
|
203
|
+
│ └── context_builder.py # 上下文构建器
|
|
128
204
|
└── parsers/
|
|
129
205
|
├── python_parser.py # Python AST 解析器
|
|
130
206
|
├── java_parser.py # Java AST 解析器
|
|
131
207
|
├── kotlin_parser.py # Kotlin 解析器(双模式)
|
|
132
208
|
├── c_parser.py # C 语言解析器(双模式)
|
|
209
|
+
├── javascript_parser.py # JavaScript 解析器
|
|
210
|
+
├── typescript_parser.py # TypeScript 解析器
|
|
133
211
|
└── ...
|
|
134
212
|
```
|
|
135
213
|
|
|
@@ -147,8 +225,30 @@ vcode-analysis review ./src --workers 10
|
|
|
147
225
|
# 自定义输出路径
|
|
148
226
|
vcode-analysis review ./src --output custom_report.md
|
|
149
227
|
|
|
228
|
+
# 输出 JSON 格式
|
|
229
|
+
vcode-analysis review ./src --format json
|
|
230
|
+
|
|
231
|
+
# 启用上下文增强(提供项目依赖关系和关联文件信息)
|
|
232
|
+
vcode-analysis review ./src --context
|
|
233
|
+
|
|
150
234
|
# 审查最新提交
|
|
151
235
|
vcode-analysis review-commit HEAD
|
|
236
|
+
|
|
237
|
+
# 审查指定提交
|
|
238
|
+
vcode-analysis review-commit abc1234 --path ./src
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 文档生成
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# 生成模块文档(默认)
|
|
245
|
+
vcode-analysis doc ./src
|
|
246
|
+
|
|
247
|
+
# 生成 API 文档
|
|
248
|
+
vcode-analysis doc ./src --type api
|
|
249
|
+
|
|
250
|
+
# 自定义输出路径
|
|
251
|
+
vcode-analysis doc ./src --output docs.md
|
|
152
252
|
```
|
|
153
253
|
|
|
154
254
|
### 安全扫描
|
|
@@ -167,6 +267,18 @@ vcode-analysis security ./src
|
|
|
167
267
|
# 批量克隆(从文件读取 URL 列表)
|
|
168
268
|
vcode-analysis batch-clone repos.txt ./projects --parallel
|
|
169
269
|
|
|
270
|
+
# 克隆后自动分析
|
|
271
|
+
vcode-analysis batch-clone repos.txt ./projects --parallel --analyze
|
|
272
|
+
|
|
273
|
+
# 克隆指定分支
|
|
274
|
+
vcode-analysis clone https://example.com/repo.git --branch develop
|
|
275
|
+
|
|
276
|
+
# 批量拉取更新
|
|
277
|
+
vcode-analysis batch-pull ~/projects
|
|
278
|
+
|
|
279
|
+
# 拉取指定仓库
|
|
280
|
+
vcode-analysis batch-pull ~/projects --repos repo1,repo2
|
|
281
|
+
|
|
170
282
|
# 查看多仓库状态
|
|
171
283
|
vcode-analysis git-status ~/projects
|
|
172
284
|
```
|
|
@@ -181,10 +293,30 @@ llm:
|
|
|
181
293
|
model: qwen3.5-35b-a3b
|
|
182
294
|
temperature: 0.7
|
|
183
295
|
max_tokens: 4096
|
|
296
|
+
timeout: 180 # 请求超时时间(秒)
|
|
184
297
|
|
|
185
298
|
analysis:
|
|
186
299
|
max_file_size: 102400
|
|
187
|
-
max_workers: 5
|
|
300
|
+
max_workers: 5 # 并发分析线程数
|
|
301
|
+
|
|
302
|
+
# 支持的文件扩展名(不在此列表中的文件将被忽略)
|
|
303
|
+
supported_extensions:
|
|
304
|
+
- ".py"
|
|
305
|
+
- ".java"
|
|
306
|
+
- ".kt"
|
|
307
|
+
- ".kts"
|
|
308
|
+
- ".js"
|
|
309
|
+
- ".jsx"
|
|
310
|
+
- ".ts"
|
|
311
|
+
- ".tsx"
|
|
312
|
+
- ".vue"
|
|
313
|
+
- ".c"
|
|
314
|
+
- ".h"
|
|
315
|
+
- ".cpp"
|
|
316
|
+
- ".hpp"
|
|
317
|
+
- ".cc"
|
|
318
|
+
- ".cxx"
|
|
319
|
+
|
|
188
320
|
ignore_patterns:
|
|
189
321
|
# 默认已包含多语言依赖目录和缓存文件
|
|
190
322
|
# Python: .venv, venv, __pycache__, .pytest_cache, .mypy_cache
|
|
@@ -194,8 +326,24 @@ analysis:
|
|
|
194
326
|
# .NET: bin, obj
|
|
195
327
|
# 以及: .git, .idea, .vscode, *.pyc, *.min.js 等
|
|
196
328
|
# 用户可在此添加额外的自定义忽略规则
|
|
329
|
+
|
|
330
|
+
cache:
|
|
331
|
+
ttl: 604800 # 缓存有效期(秒),默认 7 天
|
|
332
|
+
memory_cache_size: 1000 # 内存缓存最大条目数
|
|
197
333
|
```
|
|
198
334
|
|
|
335
|
+
### 环境变量
|
|
336
|
+
|
|
337
|
+
除了配置文件,还可以通过环境变量设置(优先级高于配置文件):
|
|
338
|
+
|
|
339
|
+
| 环境变量 | 对应配置项 |
|
|
340
|
+
|----------|-----------|
|
|
341
|
+
| `OPENAI_API_BASE` 或 `OPENAI_BASE_URL` | `llm.base_url` |
|
|
342
|
+
| `OPENAI_API_KEY` | `llm.api_key` |
|
|
343
|
+
| `CODE_ANALYSIS_MODEL` | `llm.model` |
|
|
344
|
+
| `CODE_ANALYSIS_TEMPERATURE` | `llm.temperature` |
|
|
345
|
+
| `CODE_ANALYSIS_MAX_TOKENS` | `llm.max_tokens` |
|
|
346
|
+
|
|
199
347
|
## 🤝 扩展开发
|
|
200
348
|
|
|
201
349
|
### 添加新的分析器
|
|
@@ -250,12 +398,3 @@ twine upload dist/*
|
|
|
250
398
|
twine upload --repository testpypi dist/*
|
|
251
399
|
```
|
|
252
400
|
|
|
253
|
-
## 📄 许可证
|
|
254
|
-
|
|
255
|
-
[MIT License](LICENSE)
|
|
256
|
-
|
|
257
|
-
## 🔗 链接
|
|
258
|
-
|
|
259
|
-
- [PyPI 包地址](https://pypi.org/project/vcode-analysis/)
|
|
260
|
-
- [项目主页](https://gitcode.com/wellchang/code-analysis)
|
|
261
|
-
- [问题反馈](https://gitcode.com/wellchang/code-analysis/issues)
|
|
@@ -31,11 +31,27 @@ IMPORT_PATTERNS = {
|
|
|
31
31
|
],
|
|
32
32
|
"JavaScript": [
|
|
33
33
|
r'^import\s+.*from\s+[\'"]([^\'"]+)[\'"]',
|
|
34
|
-
r'^
|
|
34
|
+
r'^import\s+[\'"]([^\'"]+)[\'"]',
|
|
35
|
+
r'^const\s+\w+\s*=\s*require\s*\([\'"]([^\'"]+)[\'"]\)',
|
|
36
|
+
r'^let\s+\w+\s*=\s*require\s*\([\'"]([^\'"]+)[\'"]\)',
|
|
37
|
+
r'^var\s+\w+\s*=\s*require\s*\([\'"]([^\'"]+)[\'"]\)',
|
|
35
38
|
],
|
|
36
39
|
"TypeScript": [
|
|
37
40
|
r'^import\s+.*from\s+[\'"]([^\'"]+)[\'"]',
|
|
38
41
|
r'^import\s+[\'"]([^\'"]+)[\'"]',
|
|
42
|
+
r'^const\s+\w+\s*=\s*require\s*\([\'"]([^\'"]+)[\'"]\)',
|
|
43
|
+
r'^let\s+\w+\s*=\s*require\s*\([\'"]([^\'"]+)[\'"]\)',
|
|
44
|
+
r'import\s*\([\'"]([^\'"]+)[\'"]\)', # 动态导入
|
|
45
|
+
],
|
|
46
|
+
"JSX": [
|
|
47
|
+
r'^import\s+.*from\s+[\'"]([^\'"]+)[\'"]',
|
|
48
|
+
r'^import\s+[\'"]([^\'"]+)[\'"]',
|
|
49
|
+
r'^const\s+\w+\s*=\s*require\s*\([\'"]([^\'"]+)[\'"]\)',
|
|
50
|
+
],
|
|
51
|
+
"TSX": [
|
|
52
|
+
r'^import\s+.*from\s+[\'"]([^\'"]+)[\'"]',
|
|
53
|
+
r'^import\s+[\'"]([^\'"]+)[\'"]',
|
|
54
|
+
r'^const\s+\w+\s*=\s*require\s*\([\'"]([^\'"]+)[\'"]\)',
|
|
39
55
|
],
|
|
40
56
|
"Java": [
|
|
41
57
|
r'^import\s+([\w\.]+);',
|
|
@@ -224,13 +240,30 @@ class ContextBuilder:
|
|
|
224
240
|
if not patterns:
|
|
225
241
|
return imports
|
|
226
242
|
|
|
243
|
+
# 先处理单行
|
|
227
244
|
for line in content.split('\n'):
|
|
228
245
|
line = line.strip()
|
|
229
246
|
for pattern in patterns:
|
|
230
247
|
match = re.match(pattern, line)
|
|
231
248
|
if match:
|
|
232
249
|
imports.append(match.group(1))
|
|
233
|
-
break
|
|
250
|
+
break
|
|
251
|
+
|
|
252
|
+
# 对于 JS/TS,额外处理多行 import 和动态导入
|
|
253
|
+
if language in ("JavaScript", "TypeScript", "JSX", "TSX"):
|
|
254
|
+
# 多行 import: import { ... } from 'module'
|
|
255
|
+
multiline_pattern = r'from\s+[\'"]([^\'"]+)[\'"]\s*;?'
|
|
256
|
+
for match in re.finditer(multiline_pattern, content):
|
|
257
|
+
imp = match.group(1)
|
|
258
|
+
if imp not in imports:
|
|
259
|
+
imports.append(imp)
|
|
260
|
+
|
|
261
|
+
# 动态导入: import('module')
|
|
262
|
+
dynamic_pattern = r'import\s*\(\s*[\'"]([^\'"]+)[\'"]\s*\)'
|
|
263
|
+
for match in re.finditer(dynamic_pattern, content):
|
|
264
|
+
imp = match.group(1)
|
|
265
|
+
if imp not in imports:
|
|
266
|
+
imports.append(imp)
|
|
234
267
|
|
|
235
268
|
return imports
|
|
236
269
|
|