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 →input,max_tokens→max_output_tokens - 流式支持:
process_openai_responses_stream()处理类型化 SSE 事件 (response.output_text.delta、response.completed、response.failed、response.incomplete) - 完整错误处理:API 错误、不完整响应、解析错误计数及截断流检测
- CI 模式:支持
GCOP_CI_PROVIDER = "openai-response"
strip_thinking 选项
- 在任意 provider 配置中设置
strip_thinking = true可移除<thinking>...</thinking>和<think>...</think>块 LLMProvidertrait 新增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()函数
依赖
git20.20 → 0.21rust-i18n3.1 → 4.0tokio1.50 → 1.52toml1.0 → 1.1human-panic2.0.6 → 2.0.8- 移除未使用的依赖:
cesu8、iri-string、pin-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 时 amendtests/stats_contrib_test.rs:merge 计数遵循作者过滤;DirGuardRAII 模式替代手动set_current_dir恢复tests/stats_test.rs:作者排序按名称和邮箱决胜src/commands/hook.rs:hook 脚本包含跳过守卫、force 刷新测试src/git/repository.rs:重命名检测、以-开头的路径、删除暂存、空仓库 unstagesrc/git/diff.rs:重命名新路径、带引号重命名、hunk 级别文件头计数src/llm/provider/fallback.rs:按 Provider 的 strip_thinking 生成/commitsrc/llm/provider/base/response.rs:默认保留 thinking、启用时清除src/main.rs:配置加载前跳过 hooksrc/config/tests.rs:CI 模式使用 openai-response provider
升级
bash
# Homebrew
brew upgrade gcop-rs
# Cargo
cargo install gcop-rs
# pip
pip install --upgrade gcop-rs