Skip to content

Release v0.14.0

OpenAI Responses API + Hook 跳过 + Diff 重命名检测

新增 OpenAI Responses API 支持(含流式)、全 Provider 的 strip_thinking 选项、 GCOP_SKIP_HOOK 环境变量跳过 prepare-commit-msg hook、重命名感知的 diff 解析, 以及依赖升级。

新增

OpenAI Responses API

  • 新增 api_style = "openai-response",使用 /v1/responses 端点替代 /v1/chat/completions;system prompt → instructions,user prompt → inputmax_tokensmax_output_tokens
  • 流式支持:process_openai_responses_stream() 处理类型化 SSE 事件 (response.output_text.deltaresponse.completedresponse.failedresponse.incomplete
  • 完整错误处理:API 错误、不完整响应、解析错误计数及截断流检测
  • CI 模式:支持 GCOP_CI_PROVIDER = "openai-response"

strip_thinking 选项

  • 在任意 provider 配置中设置 strip_thinking = true 可移除 <thinking>...</thinking><think>...</think>
  • LLMProvider trait 新增 strip_thinking() 方法;四个 Provider(Claude、 OpenAI、Ollama、Gemini)从 extra 配置读取
  • FallbackProvider 在流式和非流式路径中均遵循各 Provider 的 strip_thinking 设置
  • process_commit_response_with_options()process_review_response_with_options() 替代旧的始终清除默认行为;默认行为现在保留 thinking 标签

GCOP_SKIP_HOOK

  • GCOP_SKIP_HOOK=1 环境变量在三个层级跳过 gcop-rs hook run:shell hook 脚本、 Rust hook 运行器、CLI 入口
  • commit_changes()commit_amend_changes() 设置 GCOP_SKIP_HOOK=1, 避免 gcop-rs 自身调用 git commit 时的双重处理

Hook 安装 --force 刷新

  • gcop-rs hook install --force 现在可刷新已存在的 gcop-rs hook (之前只能覆盖非 gcop hook)

变更

Diff 解析

  • extract_filename_from_diff_header() 对重命名返回新路径(b/)而非旧路径(a/), 与需要暂存的文件一致
  • 带引号的路径处理重写,解析右侧 "b/..." 参数以正确处理含空格的文件名
  • parse_diff_stats()split_diff_by_file() 使用 hunk 级别的 @@ 追踪, 确保 hunk 内的 ---/+++ 行被正确计数
  • get_staged_diff() 启用 git 相似度检测(DiffFindOptions)以检测暂存 diff 中的 重命名和复制

Git 仓库

  • stage_files() 在文件路径前传递 git add -A -- 以处理删除和重命名; -- 分隔路径与选项以防止注入
  • unstage_all() 在空仓库中先检查暂存文件,避免在空 index 上执行 git rm --cached 报错
  • get_staged_diff() 在 diff 前强制重新加载 index,确保外部 stage_files() 调用 的变更可见
  • 提取 resolve_commit_trees() 以消除 get_commit_diff()get_commit_line_stats() 等方法中的重复代码

统计

  • 作者排序增加决胜条件:主排序按 commit 数降序,然后按名称升序、按邮箱升序
  • compute_contrib_stats() 从作者过滤后的范围计数 merge commit,而非完整 commit 列表
  • 作者过滤提取为可复用的 filter_commits_by_author()author_matches_filter()commit_matches_author_filter() 函数

依赖

  • git2 0.20 → 0.21
  • rust-i18n 3.1 → 4.0
  • tokio 1.50 → 1.52
  • toml 1.0 → 1.1
  • human-panic 2.0.6 → 2.0.8
  • 移除未使用的依赖:cesu8iri-stringpin-utils

文档

  • init 步骤 2 改为"使用 gcop-rs config 添加你的 API key",不再指向 Anthropic 控制台
  • Provider 文档更新 api_style = "openai-response" 示例和 strip_thinking 配置
  • 配置示例(examples/config.toml.example.zh)更新新 Provider 和选项

测试

  • tests/git_commit_test.rs:hook 跳过、amend commit 计数、无已有 commit 时 amend
  • tests/stats_contrib_test.rs:merge 计数遵循作者过滤;DirGuard RAII 模式替代手动 set_current_dir 恢复
  • tests/stats_test.rs:作者排序按名称和邮箱决胜
  • src/commands/hook.rs:hook 脚本包含跳过守卫、force 刷新测试
  • src/git/repository.rs:重命名检测、以 - 开头的路径、删除暂存、空仓库 unstage
  • src/git/diff.rs:重命名新路径、带引号重命名、hunk 级别文件头计数
  • src/llm/provider/fallback.rs:按 Provider 的 strip_thinking 生成/commit
  • src/llm/provider/base/response.rs:默认保留 thinking、启用时清除
  • src/main.rs:配置加载前跳过 hook
  • src/config/tests.rs:CI 模式使用 openai-response provider

升级

bash
# Homebrew
brew upgrade gcop-rs

# Cargo
cargo install gcop-rs

# pip
pip install --upgrade gcop-rs