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 提供者的专用提示模板
  • 根据编程语言自动优化提示词
  • 系统提示词和用户提示词分离
  • 提示词模板化处理
  • 语言上下文增强

提示词模板设计

提示词系统设计了三种主要模板:

  1. 默认模板:标准代码审查模板
  2. OpenAI 模板:针对 OpenAI 模型优化的模板
  3. 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)
}

提示词设计分析与优化建议

目前的提示词系统有以下优点:

  1. 多提供者支持:为不同的 LLM 提供者提供专用模板
  2. 结构化输出:清晰定义的 JSON 输出格式,便于后续处理
  3. 语言感知:能根据文件类型提供特定语言的上下文
  4. 模板化设计:使用模板简化提示词生成和管理

可以考虑的优化方向:

  1. 改进上下文处理

    • 对大型文件的处理可以更智能,提取最相关的代码片段
    • 可以添加项目级上下文,如项目风格指南、架构信息等
  2. 提示词版本控制

    • 添加提示词版本号,便于跟踪和比较不同版本的效果
    • 实现提示词A/B测试框架
  3. 细化语言支持

    • 扩展对更多语言的专业提示词支持
    • 针对特定框架如React、Django等的专用提示
  4. 审查重点定制

    • 允许用户指定审查的重点领域(如性能、安全、可读性等)
    • 根据代码变更的类型自动调整审查重点
  5. 增加提示词评估机制

    • 添加反馈循环,根据审查结果的接受度评估提示词效果
    • 实现提示词自动优化
  6. 多轮交互支持

    • 增强提示词以支持多轮代码审查对话
    • 保留上下文以便于跟进问题和解释

集成使用示例

以下是一个整合多个模块功能的示例,实现代码审查和变更分析:

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)
    }
    
    // 使用提供者进行代码审查
    // 所有交互都将被记录到指定的日志文件中
}

贡献指南

  1. Fork 本仓库
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m '添加一些惊人的功能')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 创建拉取请求

许可证

根据 MIT 许可证分发。详情请参阅 LICENSE 文件。

Description
No description provided
Readme 1.3 MiB
Languages
Go 98.3%
HTML 1.7%