code-review-analyzer
v1.10.4
Published
Automated code review tool that analyzes Git branch differences, detects code quality issues, and suggests test cases
Maintainers
Readme
Code Review Analyzer
一个自动化的代码审查工具,用于分析 Git 分支差异、检测代码质量问题、识别安全漏洞、分析代码复杂度,并提供测试建议。
English | 简体中文
特性
Git 差异分析
- 分析两个分支之间的代码差异
- 识别添加、修改和删除的文件和代码
变更影响分析
- 分析变更如何影响现有功能
- 检测接口变更、依赖关系修改和潜在的破坏性变更
代码质量检查
- 使用 ESLint 识别代码质量问题
- 检测代码重复和复杂性问题
代码复杂度分析
- 计算循环复杂度和认知复杂度
- 识别过于复杂的函数和方法
安全漏洞检测
- 发现代码变更中的潜在安全问题
- 检测硬编码的密钥、SQL 注入漏洞、XSS 问题等
依赖漏洞检查
- 检查项目依赖中的已知漏洞
- 提供修复建议和漏洞详情
重要变更标记
- 标记超过可配置阈值的变更
- 突出显示核心逻辑文件的变更
- 识别需要特别注意的关键模式
测试建议生成
- 基于代码变更生成测试用例建议
- 提供 Jest 或 Mocha 的测试代码模板
交互式 HTML 报告
- 生成可过滤、可排序的 HTML 报告
- 提供问题的详细信息和代码片段
- 显示问题的状态(新增或修改)
AI 辅助分析
- 支持多种 AI 提供商(OpenAI、阿里云通义千问、百度文心一言、DeepSeek)
- 智能检测安全漏洞和代码质量问题
- 提供代码优化建议
要求
- Node.js >= 14.0.0
- Git
安装
# 从 npm 安装
npm install -g code-review-analyzer
# 或者从 GitHub 克隆并安装
git clone https://github.com/yourusername/code-review-analyzer.git
cd code-review-analyzer
npm install
npm link使用方法
基本用法
# 使用默认配置比较当前分支与 master 分支
code-review
# 比较特定分支
code-review --source feature/login --target develop
# 生成 HTML 报告
code-review --output html
# 使用自定义配置文件
code-review --config ./my-config.js高级用法
# 使用合并基础比较模式
code-review --diff-mode merge-base
# 源分支到目标分支的比较方向
code-review --direction source-to-target
# 禁用依赖分析
code-review --disable-analyzers dependency
# 不忽略空白字符差异
code-review --ignore-whitespace false
# 设置重要变更的阈值
code-review --threshold 30
# 指定报告输出目录
code-review --output html --output-dir ./reports
# 不自动打开 HTML 报告
code-review --output html --no-open-browser
# 启用详细日志
code-review --verbose命令行选项
| 选项 | 简写 | 描述 | 默认值 | 示例 |
|------|------|------|--------|------|
| --source | -s | 源分支名称 | 当前分支 | --source feature-branch |
| --target | -t | 目标分支名称 | master | --target main |
| --config | -c | 配置文件路径 (.js 或 .json) | 自动查找 | --config ./code-review.config.js |
| --output | -o | 输出格式 (console, html, json) | console | --output html |
| --verbose | -v | 启用详细输出 | false | --verbose |
| --threshold | - | 显著变更的阈值 | 50 | --threshold 30 |
| --output-dir | - | 保存 HTML/JSON 输出的目录 | ./reports | --output-dir ./review-reports |
| --no-open-browser | - | 不自动打开 HTML 报告 | false | --no-open-browser |
| --direction | - | 比较方向 | target-to-source | --direction source-to-target |
| --diff-mode | - | 差异比较模式 | merge-base | --diff-mode direct |
| --ignore-whitespace | - | 忽略空白字符差异 | true | --ignore-whitespace false |
| --ignore-blank-lines | - | 忽略空行差异 | true | --ignore-blank-lines false |
| --disable-analyzers | - | 禁用特定分析器 | - | --disable-analyzers dependency,security |
| --ai-provider | - | AI 提供商 (auto, openai, aliyun, baidu, deepseek) | auto | --ai-provider aliyun |
| --ai-model | - | AI 模型名称 | - | --ai-model qwen-max |
| --disable-ai | - | 禁用 AI 分析 | false | --disable-ai |
配置文件
配置文件格式
代码审查工具支持两种格式的配置文件:
- JavaScript 格式(推荐):
code-review.config.js - JSON 格式(兼容):
code-review.json
工具会按照以下顺序查找配置文件:
- 命令行指定的配置文件
- 项目根目录下的
code-review.config.js - 项目根目录下的
.code-review.config.js - 项目
config目录下的code-review.config.js - 项目根目录下的
code-review.json - 项目根目录下的
.code-review.json - 项目
config目录下的code-review.json
配置项说明
分析器配置 (analyzers)
| 配置项 | 类型 | 描述 | 默认值 | 示例 |
|--------|------|------|--------|------|
| analyzers.impact.enabled | 布尔值 | 启用/禁用影响分析 | true | enabled: true |
| analyzers.impact.severity | 对象 | 影响严重程度阈值 | { high: 70, medium: 40, low: 10 } | severity: { high: 80, medium: 50, low: 20 } |
| analyzers.quality.enabled | 布尔值 | 启用/禁用代码质量分析 | true | enabled: true |
| analyzers.quality.minDuplicateLines | 数字 | 最小重复行数 | 4 | minDuplicateLines: 5 |
| analyzers.quality.complexityThreshold | 数字 | 复杂度阈值 | 30 | complexityThreshold: 25 |
| analyzers.security.enabled | 布尔值 | 启用/禁用安全分析 | true | enabled: true |
| analyzers.dependency.enabled | 布尔值 | 启用/禁用依赖分析 | true | enabled: false |
| analyzers.complexity.enabled | 布尔值 | 启用/禁用复杂度分析 | true | enabled: true |
| analyzers.ai.enabled | 布尔值 | 启用/禁用 AI 分析 | true | enabled: true |
| analyzers.ai.provider | 字符串 | AI 提供商 | auto | provider: 'openai' |
| analyzers.ai.openai.apiKeyEnvVar | 字符串 | OpenAI API 密钥环境变量 | OPENAI_API_KEY | apiKeyEnvVar: 'MY_OPENAI_KEY' |
| analyzers.ai.aliyun.accessKeyIdEnvVar | 字符串 | 阿里云 AccessKey ID 环境变量 | ALIYUN_ACCESS_KEY_ID | accessKeyIdEnvVar: 'MY_ALIYUN_ID' |
| analyzers.ai.baidu.apiKeyEnvVar | 字符串 | 百度 API Key 环境变量 | BAIDU_API_KEY | apiKeyEnvVar: 'MY_BAIDU_KEY' |
| analyzers.ai.deepseek.apiKeyEnvVar | 字符串 | DeepSeek API 密钥环境变量 | DEEPSEEK_API_KEY | apiKeyEnvVar: 'MY_DEEPSEEK_KEY' |
报告配置 (reporting)
| 配置项 | 类型 | 描述 | 默认值 | 示例 |
|--------|------|------|--------|------|
| reporting.defaultFormat | 字符串 | 默认输出格式 | console | defaultFormat: 'html' |
| reporting.openBrowser | 布尔值 | 自动打开 HTML 报告 | true | openBrowser: false |
| reporting.language | 字符串 | 报告语言 | zh-CN | language: 'en-US' |
| reporting.colorScheme | 字符串 | 报告颜色方案 | default | colorScheme: 'dark' |
| reporting.showLineNumbers | 布尔值 | 显示行号 | true | showLineNumbers: true |
| reporting.showCodeSnippets | 布尔值 | 显示代码片段 | true | showCodeSnippets: true |
Git 配置 (git)
| 配置项 | 类型 | 描述 | 默认值 | 示例 |
|--------|------|------|--------|------|
| git.defaultTargetBranch | 字符串 | 默认目标分支 | master | defaultTargetBranch: 'main' |
| git.diffMode | 字符串 | 差异比较模式 | merge-base | diffMode: 'direct' |
| git.ignoreWhitespace | 布尔值 | 忽略空白字符差异 | true | ignoreWhitespace: false |
| git.ignoreBlankLines | 布尔值 | 忽略空行差异 | true | ignoreBlankLines: false |
| git.ignorePatterns | 字符串数组 | 忽略的文件模式 | ['package-lock.json', 'yarn.lock', 'dist/', 'build/'] | ignorePatterns: ['package.json', 'node_modules/**'] |
忽略规则 (ignoreRules)
| 配置项 | 类型 | 描述 | 默认值 | 示例 |
|--------|------|------|--------|------|
| ignoreRules.duplicateCode | 对象数组 | 重复代码忽略规则 | [] | duplicateCode: [{ pattern: 'defaults\\.[\\w\\.\\[\\]\\'\\"]+\\s*=\\s*[^;]+;\\s*' }] |
阈值配置 (thresholds)
| 配置项 | 类型 | 描述 | 默认值 | 示例 |
|--------|------|------|--------|------|
| thresholds.significantChanges | 数字 | 显著变更的阈值 | 50 | significantChanges: 30 |
| thresholds.complexFunction | 数字 | 复杂函数的阈值 | 30 | complexFunction: 25 |
| thresholds.deepNesting | 数字 | 深嵌套的阈值 | 5 | deepNesting: 4 |
JavaScript 格式配置文件示例
// code-review.config.js
module.exports = {
analyzers: {
impact: {
enabled: true,
severity: { high: 70, medium: 40, low: 10 }
},
quality: {
enabled: true,
minDuplicateLines: 4,
complexityThreshold: 30
},
security: { enabled: true },
dependency: { enabled: false },
ai: {
enabled: true,
provider: 'auto', // 'auto', 'openai', 'aliyun', 'baidu', 'deepseek'
openai: {
apiKeyEnvVar: "OPENAI_API_KEY",
model: "gpt-4o"
},
aliyun: {
accessKeyIdEnvVar: "ALIYUN_ACCESS_KEY_ID",
accessKeySecretEnvVar: "ALIYUN_ACCESS_KEY_SECRET",
model: "qwen-max"
},
baidu: {
apiKeyEnvVar: "BAIDU_API_KEY",
secretKeyEnvVar: "BAIDU_SECRET_KEY",
model: "ernie-bot-4"
},
deepseek: {
apiKeyEnvVar: "DEEPSEEK_API_KEY",
model: "deepseek-chat"
}
}
},
reporting: {
defaultFormat: 'html',
openBrowser: true,
language: 'zh-CN'
},
git: {
defaultTargetBranch: 'master',
diffMode: 'merge-base',
ignoreWhitespace: true,
ignoreBlankLines: true,
ignorePatterns: [
'package.json',
'package-lock.json',
'node_modules/**',
'dist/**'
]
},
ignoreRules: {
duplicateCode: [
{ pattern: 'defaults\\.[\\w\\.\\[\\]\\'\\"]+\\s*=\\s*[^;]+;\\s*' },
{ pattern: 'meta:\\s*{[\\s\\S]*?title:[\\s\\S]*?}' }
]
},
thresholds: {
significantChanges: 50,
complexFunction: 30,
deepNesting: 5
}
};输出格式
工具支持多种输出格式:
- HTML:交互式 HTML 报告(默认)
- 显示概要统计和图表
- 提供详细的问题信息和代码片段
- 包含测试建议和代码示例
- 支持按严重程度、状态等过滤和排序
- JSON:机器可读的 JSON 格式
- 适用于集成到其他工具或系统
报告示例
HTML 报告包含以下部分:
- 分支对比:显示分支差异的摘要信息
- 问题统计:按严重程度统计问题数量
- 问题列表:可过滤、可排序的问题列表
- 重要变更:重要代码变更的列表
- 测试建议:测试建议的列表
常见问题
1. 为什么我的 package.json 文件总是被检测?
默认情况下,工具会分析所有变更的文件,包括 package.json。如果您不希望分析 package.json 文件,可以通过以下方式解决:
// 在配置文件中添加忽略规则
git: {
ignorePatterns: ['package.json', 'package-lock.json']
}或者使用命令行:
code-review --disable-analyzers dependency2. 为什么工具报告了重复代码,但实际上不是重复的?
工具的重复代码检测可能会对某些模式过于敏感。您可以通过添加忽略规则来解决这个问题:
ignoreRules: {
duplicateCode: [
{ pattern: 'defaults\\.[\\w\\.\\[\\]\\'\\"]+\\s*=\\s*[^;]+;\\s*' }
]
}3. Git 比较和 GitHub 合并显示不同的结果?
这是因为 Git 比较和 GitHub 合并使用不同的比较方法。您可以使用 --diff-mode merge-base 选项使工具的比较行为更接近 GitHub 合并:
code-review --diff-mode merge-base4. 如何在 CI/CD 流程中使用?
您可以在 CI/CD 流程中使用以下命令:
# 在 CI/CD 中使用
code-review --source $CI_COMMIT_BRANCH --target main --output json --no-open-browser然后解析 JSON 输出,根据结果决定是否继续流程。
5. npm audit 命令报错:"requires an existing lockfile"
如果您遇到以下错误:
npm ERR! code ENOLOCK
npm ERR! audit This command requires an existing lockfile.这是因为 npm audit 命令需要一个锁定文件(package-lock.json 或 npm-shrinkwrap.json)才能运行。您可以通过以下方式解决:
# 创建 package-lock.json 文件
npm i --package-lock-only或者禁用依赖分析:
code-review --disable-analyzers dependency6. 如何使用不同的 AI 提供商?
工具支持多种 AI 提供商,您可以通过以下方式使用:
- 通过命令行指定:
# 使用 OpenAI
code-review --ai-provider openai
# 使用阿里云通义千问
code-review --ai-provider aliyun
# 使用百度文心一言
code-review --ai-provider baidu
# 使用 DeepSeek
code-review --ai-provider deepseek
# 指定模型
code-review --ai-provider openai --ai-model gpt-4- 通过环境变量设置密钥:
# OpenAI
export OPENAI_API_KEY=your_openai_api_key
# 阿里云
export ALIYUN_ACCESS_KEY_ID=your_aliyun_access_key_id
export ALIYUN_ACCESS_KEY_SECRET=your_aliyun_access_key_secret
# 百度
export BAIDU_API_KEY=your_baidu_api_key
export BAIDU_SECRET_KEY=your_baidu_secret_key
# DeepSeek
export DEEPSEEK_API_KEY=your_deepseek_api_key- 在配置文件中设置:
module.exports = {
analyzers: {
ai: {
enabled: true,
provider: 'aliyun',
aliyun: {
accessKeyId: 'your_aliyun_access_key_id',
accessKeySecret: 'your_aliyun_access_key_secret'
}
}
}
};贡献
欢迎贡献!请随时提交 Pull Request。
许可证
本项目采用 MIT 许可证。
