Git-Reviewer 使用说明
项目概述
Git-Reviewer 是一个功能强大的 Go 语言工具包,专为 Git 仓库管理、代码审查和变更分析而设计。它围绕 Git 操作提供了全面的功能,帮助开发团队提高代码质量和工作流效率。
该工具包结合了 Git 操作和大型语言模型 (LLM) 技术,可用于自动化代码审查、变更分析、工作流管理和仓库统计等场景。
主要功能
- 仓库操作:检查 Git 仓库、获取文件差异、管理分支和标签
- 差异分析:查看和分析代码变更,包括格式化差异输出和统计信息
- 工作流管理:管理代码审查流程、拉取请求、注释和建议
- 仓库分析:生成仓库统计信息、贡献者活动报告和代码质量分析
- LLM 集成:利用大型语言模型进行自动化代码审查和建议生成
- 提示词系统:为不同 LLM 提供者生成优化的提示词,提高代码审查质量
安装指南
前提条件
- Go 1.22 或更高版本
- Git 命令行工具已安装
- 访问 OpenAI 或 Anthropic API(用于 LLM 功能)
安装
go get github.com/darkit/git-reviewer
功能模块
1. 仓库操作 (repository.go)
该模块提供了基本的 Git 仓库交互功能,包括:
主要功能
- 检查目录是否为 Git 仓库
- 获取仓库根目录
- 获取已暂存和未暂存的文件列表
- 分支和标签管理
- 提交历史查询和分析
- 远程仓库操作
- 合并和冲突处理
- 仓库统计功能
使用示例
package main
import (
"fmt"
"log"
"github.com/darkit/git-reviewer/pkg/git"
"github.com/darkit/git-reviewer/config"
)
func main() {
// 创建仓库检测器
detector := git.NewRepositoryDetector()
// 检查当前目录是否是 Git 仓库
isRepo, err := detector.IsGitRepository(".")
if err != nil {
log.Fatalf("检查仓库失败: %v", err)
}
if !isRepo {
log.Fatalf("当前目录不是 Git 仓库")
}
// 获取当前分支
branch, err := detector.GetCurrentBranch(".")
if err != nil {
log.Fatalf("获取当前分支失败: %v", err)
}
fmt.Printf("当前分支: %s\n", branch)
// 获取提交历史
commits, err := detector.GetCommitHistory(".", branch, 10)
if err != nil {
log.Fatalf("获取提交历史失败: %v", err)
}
fmt.Println("最近的提交:")
for _, commit := range commits {
fmt.Printf("- %s: %s (作者: %s, 日期: %s)\n",
commit.CommitID[:7],
commit.Message,
commit.AuthorName,
commit.Date.Format("2006-01-02 15:04:05"))
}
// 获取所有变更文件
cfg := &config.Config{} // 使用默认配置
files, err := detector.GetAllChangedFiles(".", cfg)
if err != nil {
log.Fatalf("获取变更文件失败: %v", err)
}
fmt.Println("变更文件:")
for _, file := range files {
fmt.Printf("- %s (%s)\n", file.Path, git.GetFileStatus(file.Status))
}
}
2. 差异分析 (diff.go)
该模块专注于提供高级的差异分析功能,帮助开发者理解和处理代码变更。
主要功能
- 生成和格式化文件差异
- 提供自定义差异选项(上下文行数、忽略空格等)
- 解析差异为结构化数据
- 生成差异摘要和统计信息
- 导出差异为 JSON 格式
- 支持逐字差异和提交间差异比较
- 显示差异中每行的修改者信息
- 查找类似的代码变更
使用示例
package main
import (
"fmt"
"log"
"github.com/darkit/git-reviewer/pkg/git"
)
func main() {
detector := git.NewRepositoryDetector()
// 获取文件差异
diff, err := detector.GetFileDiff(".", "main.go", false)
if err != nil {
log.Fatalf("获取文件差异失败: %v", err)
}
fmt.Println("文件差异:")
fmt.Println(diff)
// 使用自定义选项获取差异
options := git.DefaultDiffOptions()
options.ContextLines = 5
options.IgnoreSpace = true
options.ShowStats = true
diffWithOptions, err := detector.GetDiffWithOptions(".", "main.go", false, options)
if err != nil {
log.Fatalf("获取文件差异失败: %v", err)
}
fmt.Println("\n使用自定义选项的差异:")
fmt.Println(diffWithOptions)
// 获取差异摘要
summary, err := detector.(*git.RepositoryDetectorImpl).GetDiffSummary(".", []string{"main.go"}, false)
if err != nil {
log.Fatalf("获取差异摘要失败: %v", err)
}
fmt.Printf("\n差异摘要:\n")
fmt.Printf("- 变更文件数: %d\n", summary.FilesChanged)
fmt.Printf("- 插入行数: %d\n", summary.Insertions)
fmt.Printf("- 删除行数: %d\n", summary.Deletions)
// 导出差异为 JSON
jsonDiff, err := detector.(*git.RepositoryDetectorImpl).ExportDiffAsJSON(".", "main.go", false)
if err != nil {
log.Fatalf("导出差异为 JSON 失败: %v", err)
}
fmt.Println("\nJSON 格式的差异:")
fmt.Println(jsonDiff)
}
3. 工作流管理 (workflow.go)
该模块提供了 Git 工作流管理、代码审查和变更分析功能,帮助团队协作和保证代码质量。
主要功能
- 拉取请求管理(创建、获取和查看详情)
- 代码审查功能(文件注释、获取注释、导出审查摘要)
- 变更分析(分析变更、获取建议、生成变更报告)
- 工作流自动化(预提交钩子、分支命名验证、自动格式化)
使用示例
package main
import (
"fmt"
"log"
"github.com/darkit/git-reviewer/pkg/git"
"github.com/darkit/git-reviewer/config"
)
func main() {
detector := git.NewRepositoryDetector()
workflowManager := git.NewWorkflowManager(detector)
// 生成代码审查摘要
summary, err := workflowManager.ExportReviewSummary(".")
if err != nil {
log.Fatalf("生成代码审查摘要失败: %v", err)
}
fmt.Println("代码审查摘要:")
fmt.Println(summary)
// 分析变更
cfg := &config.Config{} // 使用默认配置
analysis, err := workflowManager.AnalyzeChanges(".", cfg)
if err != nil {
log.Fatalf("分析变更失败: %v", err)
}
fmt.Printf("\n变更分析:\n")
fmt.Printf("- 风险评分: %d/100\n", analysis.RiskScore)
// 为特定文件获取变更建议
suggestions, err := workflowManager.GetChangeSuggestions(".", "main.go")
if err != nil {
log.Fatalf("获取变更建议失败: %v", err)
}
fmt.Println("\n变更建议:")
for _, suggestion := range suggestions {
fmt.Printf("- 第 %d 行: %s (%s)\n", suggestion.Line, suggestion.Message, suggestion.Type)
}
// 验证分支命名
isValid, message, err := workflowManager.ValidateBranchNaming(".", "feature/new-login", "")
if err != nil {
log.Fatalf("验证分支命名失败: %v", err)
}
fmt.Println("\n分支命名验证:")
fmt.Println(message)
// 生成变更报告
report, err := workflowManager.GenerateChangeReport(".", cfg)
if err != nil {
log.Fatalf("生成变更报告失败: %v", err)
}
fmt.Println("\n变更报告:")
fmt.Println(report)
}
4. 仓库分析与统计 (analytics.go)
该模块提供了深入的仓库分析和统计功能,帮助团队了解代码演变和贡献模式。
主要功能
- 提交历史分析(直方图、热图)
- 贡献者分析(最活跃贡献者、贡献时间线)
- 代码统计(语言统计、代码变更率)
- 性能分析(文件热点、复杂度趋势)
- 报告生成(活动报告、导出为 JSON)
使用示例
package main
import (
"fmt"
"log"
"github.com/darkit/git-reviewer/pkg/git"
)
func main() {
detector := git.NewRepositoryDetector()
analytics := git.NewRepositoryAnalytics(detector)
// 获取提交历史直方图
histogram, err := analytics.GetCommitHistogram(".", "week", "main")
if err != nil {
log.Fatalf("获取提交历史直方图失败: %v", err)
}
fmt.Println("提交历史直方图 (按周):")
for period, count := range histogram {
fmt.Printf("- %s: %d 次提交\n", period, count)
}
// 获取贡献最多的贡献者
contributors, err := analytics.GetTopContributors(".", 5)
if err != nil {
log.Fatalf("获取贡献者失败: %v", err)
}
fmt.Println("\n贡献最多的贡献者:")
for _, contributor := range contributors {
fmt.Printf("- %s (%s): %d 次提交, %d 行新增, %d 行删除\n",
contributor.Name,
contributor.Email,
contributor.Commits,
contributor.Insertions,
contributor.Deletions)
}
// 获取语言统计
languages, err := analytics.GetLanguageStats(".")
if err != nil {
log.Fatalf("获取语言统计失败: %v", err)
}
fmt.Println("\n语言统计:")
for lang, stat := range languages {
fmt.Printf("- %s: %d 个文件, %d 行代码 (%.2f%%)\n",
lang,
stat.Files,
stat.Lines,
stat.Percent)
}
// 获取文件热点
hotspots, err := analytics.GetFileHotspots(".", "month")
if err != nil {
log.Fatalf("获取文件热点失败: %v", err)
}
fmt.Println("\n文件热点:")
for _, hotspot := range hotspots {
fmt.Printf("- %s: 分数 %.2f (变更 %d 次, %d 个作者)\n",
hotspot.Path,
hotspot.Score,
hotspot.Changes,
hotspot.Authors)
}
// 生成活动报告
report, err := analytics.GenerateActivityReport(".", "month")
if err != nil {
log.Fatalf("生成活动报告失败: %v", err)
}
fmt.Println("\n活动报告:")
fmt.Println(report)
}
5. LLM集成 (pkg/llm)
这个模块提供了与大型语言模型的集成功能,用于自动化代码审查和建议生成。
主要功能
- 通用 LLM 服务提供者接口
- 多种 LLM 服务支持(OpenAI、Anthropic)
- 代码审查和变更分析
- 自定义提示和指令
- 提示日志和交互日志
接口设计
LLM 包定义了一个通用的 Provider 接口,允许集成不同的大型语言模型服务:
type Provider interface {
// 返回提供者的名称
Name() string
// 验证提供者配置
ValidateConfig() error
// 使用提供者执行代码审查
ReviewCode(ctx context.Context, request *ReviewRequest) (*ReviewResponse, error)
// 将提示发送给 LLM 并返回补全结果
GetCompletion(prompt string) (string, error)
}
支持的 LLM 服务
目前支持以下 LLM 服务:
- OpenAI:集成 GPT-3.5 和 GPT-4 模型
- Anthropic:集成 Claude 系列模型
使用示例
package main
import (
"context"
"fmt"
"log"
"github.com/darkit/git-reviewer/config"
"github.com/darkit/git-reviewer/pkg/git"
"github.com/darkit/git-reviewer/pkg/llm"
)
func main() {
// 创建配置
cfg := &config.Config{
LLM: config.LLMConfig{
Provider: "openai", // 或 "anthropic"
APIKey: "你的API密钥",
Model: "gpt-4", // 或 "claude-3-opus-20240229"
Timeout: 120, // 秒
},
}
// 创建 LLM 提供者
provider, err := llm.CreateProviderFromConfig(cfg)
if err != nil {
log.Fatalf("创建 LLM 提供者失败: %v", err)
}
// 创建 Git 仓库检测器
detector := git.NewRepositoryDetector()
// 获取文件差异
diff, err := detector.GetFileDiff(".", "main.go", false)
if err != nil {
log.Fatalf("获取文件差异失败: %v", err)
}
// 获取文件内容
content, err := detector.GetFileContent(".", "main.go")
if err != nil {
log.Fatalf("获取文件内容失败: %v", err)
}
// 创建代码审查请求
request := &llm.ReviewRequest{
FilePath: "main.go",
FileContent: content,
FileDiff: diff,
Options: llm.ReviewOptions{
MaxTokens: 2000,
Temperature: 0.3,
IncludeExplanations: true,
AdditionalInstructions: "请特别关注性能问题和潜在的安全漏洞。",
},
}
// 执行代码审查
response, err := provider.ReviewCode(context.Background(), request)
if err != nil {
log.Fatalf("代码审查失败: %v", err)
}
fmt.Println("LLM 代码审查结果:")
fmt.Println(response.Review)
}
6. 提示词系统 (pkg/prompt)
这个模块专门负责生成与优化用于代码审查的提示词,为不同的 LLM 提供者提供定制化的提示模板。
主要功能
- 支持多种 LLM 提供者的专用提示模板
- 根据编程语言自动优化提示词
- 系统提示词和用户提示词分离
- 提示词模板化处理
- 语言上下文增强
提示词模板设计
提示词系统设计了三种主要模板:
- 默认模板:标准代码审查模板
- OpenAI 模板:针对 OpenAI 模型优化的模板
- Anthropic 模板:针对 Anthropic Claude 模型优化的模板
每个模板都包含以下关键部分:
- 角色定义(代码审查助手)
- 输出格式规范(JSON 结构)
- 代码文件和差异的上下文
- 要关注的问题类型
- 语言特定的指导
系统提示词
系统提示词定义了 LLM 的角色和回复格式:
// 代码审查系统提示示例
const SystemPromptReview = `
你是一个代码审查助手。
请审查代码并提供有关错误、代码风格和性能问题的有用反馈。
特别关注安全问题,并帮助我们修复它们。
重要:你必须将整个回复格式化为具有以下结构的有效JSON对象:
{
"issues": [
{
"title": "问题标题",
"explanation": "详细解释",
"file": "文件路径"
}
],
"diffs": [
{
"file": "文件路径",
"diff": "@@ 行号 @@
代码修改"
}
]
}
输出原始JSON,不要使用markdown代码块或其他包装。
请使用中文回复,但代码和技术术语可以保持原样。
`
使用示例
package main
import (
"context"
"fmt"
"log"
"github.com/darkit/git-reviewer/config"
"github.com/darkit/git-reviewer/pkg/git"
"github.com/darkit/git-reviewer/pkg/llm"
"github.com/darkit/git-reviewer/pkg/prompt"
)
func main() {
// 获取文件差异
detector := git.NewRepositoryDetector()
diff, _ := detector.GetFileDiff(".", "main.go", false)
content, _ := detector.GetFileContent(".", "main.go")
// 创建 LLM 提供者
cfg := &config.Config{
LLM: config.LLMConfig{
Provider: "openai",
APIKey: "你的API密钥",
Model: "gpt-4",
},
}
provider, _ := llm.CreateProviderFromConfig(cfg)
// 创建审查请求
request := &llm.ReviewRequest{
FilePath: "main.go",
FileContent: content,
FileDiff: diff,
Options: llm.ReviewOptions{
MaxTokens: 2000,
Temperature: 0.3,
},
}
// 生成提示词
providerType := prompt.ProviderOpenAI
promptText := prompt.CreatePrompt(request, providerType)
// 增强提示词,添加语言上下文
language := prompt.GetLanguageFromFilePath("main.go")
enhancedPrompt := prompt.EnhancePromptWithLanguageContext(promptText, language)
// 获取系统提示词
systemPrompt := prompt.GetSystemPrompt(providerType, prompt.SystemPromptReview)
// 在真实场景中,这些提示会由 provider.ReviewCode 自动处理
fmt.Println("系统提示词:", systemPrompt)
fmt.Println("用户提示词:", enhancedPrompt)
}
提示词设计分析与优化建议
目前的提示词系统有以下优点:
- 多提供者支持:为不同的 LLM 提供者提供专用模板
- 结构化输出:清晰定义的 JSON 输出格式,便于后续处理
- 语言感知:能根据文件类型提供特定语言的上下文
- 模板化设计:使用模板简化提示词生成和管理
可以考虑的优化方向:
-
改进上下文处理:
- 对大型文件的处理可以更智能,提取最相关的代码片段
- 可以添加项目级上下文,如项目风格指南、架构信息等
-
提示词版本控制:
- 添加提示词版本号,便于跟踪和比较不同版本的效果
- 实现提示词A/B测试框架
-
细化语言支持:
- 扩展对更多语言的专业提示词支持
- 针对特定框架(如React、Django等)的专用提示
-
审查重点定制:
- 允许用户指定审查的重点领域(如性能、安全、可读性等)
- 根据代码变更的类型自动调整审查重点
-
增加提示词评估机制:
- 添加反馈循环,根据审查结果的接受度评估提示词效果
- 实现提示词自动优化
-
多轮交互支持:
- 增强提示词以支持多轮代码审查对话
- 保留上下文以便于跟进问题和解释
集成使用示例
以下是一个整合多个模块功能的示例,实现代码审查和变更分析:
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/darkit/git-reviewer/pkg/git"
"github.com/darkit/git-reviewer/config"
"github.com/darkit/git-reviewer/pkg/llm"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("使用: go run main.go <命令>")
fmt.Println("支持的命令: review, analyze, stats")
os.Exit(1)
}
command := os.Args[1]
// 创建配置
cfg := &config.Config{
LLM: config.LLMConfig{
Provider: "openai",
APIKey: os.Getenv("LLM_API_KEY"),
Model: "gpt-4",
Timeout: 120,
},
}
// 创建 LLM 提供者
provider, err := llm.CreateProviderFromConfig(cfg)
if err != nil {
log.Fatalf("创建 LLM 提供者失败: %v", err)
}
detector := git.NewRepositoryDetector()
workflowManager := git.NewWorkflowManager(detector)
analytics := git.NewRepositoryAnalytics(detector)
switch command {
case "review":
// 执行代码审查
changedFiles, err := detector.GetAllChangedFiles(".", cfg)
if err != nil {
log.Fatalf("获取变更文件失败: %v", err)
}
fmt.Println("执行代码审查...")
fmt.Printf("发现 %d 个变更文件\n", len(changedFiles))
for _, file := range changedFiles {
fmt.Printf("\n审查文件: %s (%s)\n", file.Path, git.GetFileStatus(file.Status))
// 获取文件差异
diff, err := detector.GetFileDiff(".", file.Path, file.Staged)
if err != nil {
fmt.Printf("获取差异失败: %v\n", err)
continue
}
// 获取文件内容
content, err := detector.GetFileContent(".", file.Path)
if err != nil {
fmt.Printf("获取文件内容失败: %v\n", err)
continue
}
// 创建代码审查请求
request := &llm.ReviewRequest{
FilePath: file.Path,
FileContent: content,
FileDiff: diff,
Options: llm.ReviewOptions{
MaxTokens: 2000,
Temperature: 0.3,
IncludeExplanations: true,
},
}
// 执行代码审查
response, err := provider.ReviewCode(context.Background(), request)
if err != nil {
fmt.Printf("代码审查失败: %v\n", err)
continue
}
fmt.Println("\nLLM 代码审查结果:")
fmt.Println(response.Review)
}
case "analyze":
// 执行变更分析
fmt.Println("执行变更分析...")
report, err := workflowManager.GenerateChangeReport(".", cfg)
if err != nil {
log.Fatalf("生成变更报告失败: %v", err)
}
fmt.Println(report)
case "stats":
// 显示仓库统计信息
fmt.Println("生成仓库统计信息...")
// 获取仓库统计
repoStats, err := detector.GetRepositoryStats(".")
if err == nil {
fmt.Println("仓库统计:")
fmt.Printf("- 总提交数: %d\n", repoStats.TotalCommits)
fmt.Printf("- 总文件数: %d\n", repoStats.TotalFiles)
fmt.Printf("- 总行数: %d\n", repoStats.TotalLines)
fmt.Printf("- 首次提交: %s\n", repoStats.FirstCommitDate.Format("2006-01-02"))
fmt.Printf("- 最新提交: %s\n", repoStats.LatestCommitDate.Format("2006-01-02"))
fmt.Printf("- 活跃分支数: %d\n", repoStats.ActiveBranches)
fmt.Printf("- 总分支数: %d\n", repoStats.TotalBranches)
fmt.Printf("- 总标签数: %d\n", repoStats.TotalTags)
fmt.Printf("- 总贡献者数: %d\n", repoStats.TotalContributors)
}
// 获取语言统计
languages, err := analytics.GetLanguageStats(".")
if err == nil {
fmt.Println("\n语言统计:")
for lang, stat := range languages {
fmt.Printf("- %s: %d 个文件, %d 行代码 (%.2f%%)\n",
lang,
stat.Files,
stat.Lines,
stat.Percent)
}
}
default:
fmt.Printf("未知命令: %s\n", command)
fmt.Println("支持的命令: review, analyze, stats")
}
}
配置选项
Git-Reviewer 通过 pkg/config 包提供配置选项:
// 创建自定义配置
cfg := &config.Config{
// 指定要处理的文件扩展名(如果为空,将处理所有类型的文件)
Extensions: []string{".go", ".js", ".html"},
// LLM 配置
LLM: config.LLMConfig{
Provider: "openai", // 支持 "openai" 或 "anthropic"
APIKey: "你的API密钥", // 可从环境变量获取
Model: "gpt-4", // 或其他支持的模型
APIURL: "", // 可选,用于自定义 API 端点
Timeout: 120, // 超时时间(秒)
},
}
// 使用配置获取变更文件
files, err := detector.GetAllChangedFiles(".", cfg)
高级用法
1. 自定义差异选项
// 创建自定义差异选项
options := git.DiffOptions{
ContextLines: 5, // 显示5行上下文
ColorOutput: true, // 显示彩色输出
IgnoreSpace: true, // 忽略空格变更
ShowStats: true, // 显示统计信息
Algorithm: "patience", // 使用patience算法
IgnoreSubmodules: true, // 忽略子模块
ShowMoved: true, // 显示移动的代码块
}
// 使用自定义选项获取差异
diff, err := detector.GetDiffWithOptions(".", "main.go", false, options)
2. 自定义 LLM 代码审查
// 创建自定义代码审查选项
reviewOptions := llm.ReviewOptions{
MaxTokens: 4000, // 生成的最大令牌数
Temperature: 0.1, // 较低的温度,更确定性的输出
Timeout: 2 * time.Minute, // 等待响应的最长时间
AdditionalInstructions: `
请关注以下几点:
1. 代码是否遵循 Go 最佳实践
2. 是否存在安全漏洞
3. 是否有潜在的并发问题
4. 是否有性能优化空间
5. 代码注释是否充分
`,
IncludeExplanations: true, // 在审查中包含解释
}
// 创建代码审查请求
request := &llm.ReviewRequest{
FilePath: "main.go",
FileContent: content,
FileDiff: diff,
Options: reviewOptions,
}
// 执行代码审查
response, err := provider.ReviewCode(context.Background(), request)
3. 自定义提示词模板
您可以自定义提示词模板以满足特定的代码审查需求:
// 创建自定义提示词模板
customTemplate := `你是一个安全专家代码审查助手。请审查以下代码文件及其变更,专注于识别安全漏洞和安全最佳实践的偏差。
文件: {{.FilePath}}
完整文件内容:
` + "```{{.Language}}\n{{.FileContent}}\n```" + `
差异(变更内容):
` + "```diff\n{{.FileDiff}}\n```" + `
请特别关注:
1. SQL注入漏洞
2. 跨站脚本(XSS)漏洞
3. 身份验证和授权问题
4. 敏感数据处理
5. 加密算法的正确使用
{{.AdditionalInstructions}}
`
// 将自定义模板注册到提示词系统
// 注意:这是一个概念性示例,实际实现方式可能不同
prompt.RegisterCustomTemplate("security-review", customTemplate)
// 使用自定义模板
promptText := prompt.CreatePromptWithTemplate(request, "security-review", prompt.ProviderOpenAI)
4. 日志记录与分析
Git-Reviewer 提供了 LLM 交互日志记录功能,用于审计和改进:
package main
import (
"context"
"log"
"github.com/darkit/git-reviewer/config"
"github.com/darkit/git-reviewer/pkg/llm"
"github.com/darkit/git-reviewer/pkg/llm/promptlog"
"github.com/darkit/git-reviewer/pkg/llm/exchangelog"
)
func main() {
// 创建提示日志记录器
promptLogger, err := promptlog.NewFileLogger("logs/prompts")
if err != nil {
log.Fatalf("创建提示日志记录器失败: %v", err)
}
// 创建交换日志记录器
exchangeLogger, err := exchangelog.NewFileLogger("logs/exchanges")
if err != nil {
log.Fatalf("创建交换日志记录器失败: %v", err)
}
// 注册日志记录器
promptlog.SetGlobalLogger(promptLogger)
exchangelog.SetGlobalLogger(exchangeLogger)
// 创建 LLM 提供者
cfg := &config.Config{
LLM: config.LLMConfig{
Provider: "openai",
APIKey: "你的API密钥",
Model: "gpt-4",
},
}
provider, err := llm.CreateProviderFromConfig(cfg)
if err != nil {
log.Fatalf("创建 LLM 提供者失败: %v", err)
}
// 使用提供者进行代码审查
// 所有交互都将被记录到指定的日志文件中
}
贡献指南
- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m '添加一些惊人的功能') - 推送到分支 (
git push origin feature/amazing-feature) - 创建拉取请求
许可证
根据 MIT 许可证分发。详情请参阅 LICENSE 文件。
Description
Languages
Go
98.3%
HTML
1.7%