# Release v0.6.0

## 代码质量与测试改进

本次发布专注于显著提升代码质量、测试覆盖率和开发者体验。我们完成了 TODO 列表中的所有 P0（高优先级）和 P1（中优先级）改进。

### 测试覆盖率提升 11.7%

**总测试数：248 → 277**（新增 29 个测试）

所有核心模块现在都具有全面的测试覆盖：
- ✅ Provider 验证：9 个测试
- ✅ Git 仓库操作：14 个测试
- ✅ Review 命令：6 个测试

### Provider 真实 API 健康检查

`gcop config validate` 命令已**显著增强**，现在会执行真实的 API 连接检查，而不仅仅是检查 API key 是否非空。

**v0.6.0 之前：**
```bash
$ gcop config validate
✓ Configuration loaded
✓ Provider 'claude' configured
# 只检查 API key 是否存在，不测试实际连接
```

**v0.6.0 之后：**
```bash
$ gcop config validate
[1/2] Validating configuration...
[2/2] Testing provider connection...
✓ Provider 'claude' validated successfully
# 实际发送测试请求验证 API 是否可用！
```

**新功能：**

1. **Claude/OpenAI Provider**：发送最小化测试请求（`max_tokens=1`）验证 API 连接
   - 检测无效 API key（401 错误）
   - 检测速率限制（429 错误）
   - 成本极低：每次验证仅消耗 1 token

2. **Ollama Provider**：检查 `/api/tags` 健康端点
   - 验证 Ollama 服务器是否运行
   - 检查配置的模型是否已下载
   - 提供有用建议：如果模型未找到，提示 `ollama pull <model>`

3. **FallbackProvider**：验证所有配置的 provider
   - 显示 fallback 链中每个 provider 的状态
   - 汇总结果，如果所有 provider 都失败则警告

4. **更好的错误消息**：增强的错误输出，提供可操作的建议
   ```bash
   ✗ Validation failed: Claude API validation failed: Invalid API key

   💡 Suggestion: Check your ANTHROPIC_API_KEY environment variable or
      api_key in config file (~/.config/gcop/config.toml)
   ```

**影响：**
- 在运行 `gcop commit` **之前**捕获配置问题
- 节省调试 API 连接问题的时间
- 为新用户提供更好的入门体验

### Git Repository 测试覆盖

为 Git 仓库操作添加了全面的测试套件（`tests/git_repository_test.rs`，14 个测试）：

**覆盖的边界情况：**
- ✅ 空仓库（尚未有 commit）
- ✅ 大文件大小限制（默认 10MB，自定义限制）
- ✅ 包含空格和 Unicode 字符的路径
- ✅ 仓库中的第一个 commit（无父节点）
- ✅ 无效的 commit hash 和 range 格式
- ✅ Detached HEAD 状态
- ✅ 并发测试安全（使用 `serial_test` crate）

**测试示例：**
```rust
#[test]
fn test_get_file_content_exceeds_max_size() {
    // 创建 11MB 文件（超过默认 10MB 限制）
    // 预期：返回 InvalidInput 错误，消息为 "File too large"
}
```

这些测试确保在处理异常仓库状态时的健壮性，并防止回归。

### Review 命令测试

为 `gcop review` 命令添加了集成测试（`tests/review_command_test.rs`，6 个测试）：

**覆盖范围：**
- ✅ 所有 4 种 target 类型：`--changes`、`--commit <hash>`、`--range <range>`、`--file <path>`
- ✅ 错误处理：空 diff、LLM 失败
- ✅ 正确路由到 Git 操作

**架构改进：**

重构 `review.rs` 以支持依赖注入：
```rust
// 公共 API（未改变）
pub async fn run(cli: &Cli, config: &AppConfig, ...) -> Result<()>

// 内部实现（可使用 mock 测试）
pub async fn run_internal(
    config: &AppConfig,
    git: &dyn GitOperations,  // ← 可注入用于测试
    llm: &dyn LLMProvider,     // ← 可注入用于测试
) -> Result<()>
```

此模式在保持**向后兼容**的同时，支持使用 mock 对象进行彻底测试。

### 固定 MSRV（最小支持 Rust 版本）

**Rust 1.92.0 或更高版本**现在是正式要求（Rust 2024 edition）。

**新增内容：**
1. **`rust-toolchain.toml`**：确保所有环境使用一致的 Rust 版本
   ```toml
   [toolchain]
   channel = "stable"
   components = ["rustfmt", "clippy"]
   ```

2. **`Cargo.toml`**：为 crates.io 和 cargo 声明 MSRV
   ```toml
   rust-version = "1.92.0"
   ```

3. **CI/CD**：在 GitHub Actions 中添加 MSRV 检查任务
   - 确保代码可使用最低 Rust 版本编译
   - 防止意外使用更新的 Rust 特性

4. **文档**：更新所有安装指南（中英文）
   - README.md
   - README_ZH.md
   - docs/guide/installation.md
   - docs/zh/guide/installation.md

**为什么重要：**
- 为贡献者设定清晰的期望
- 防止"在我机器上可以运行"的问题
- 保持与 Rust 2024 edition 要求的兼容性

## 技术细节

### Provider 验证实现

每个 provider 实现 `LLMProvider` trait 的 `validate()` 方法：

```rust
async fn validate(&self) -> Result<()> {
    // Claude/OpenAI: 发送测试请求
    let test_request = Request {
        model: self.model.clone(),
        max_tokens: 1,  // 成本最小
        ...
    };

    let response = self.client.post(&self.endpoint)
        .json(&test_request)
        .send()
        .await?;

    if !response.status().is_success() {
        return Err(GcopError::LlmApi { ... });
    }

    Ok(())
}
```

对于 Ollama，我们使用 `/api/tags` 端点：
```rust
async fn validate(&self) -> Result<()> {
    let tags_response = self.client
        .get(&health_endpoint)
        .send()
        .await?;

    // 检查配置的模型是否存在
    if !models.iter().any(|m| m.name.starts_with(&self.model)) {
        return Err(GcopError::Config(
            "Model not found. Run 'ollama pull <model>' first."
        ));
    }

    Ok(())
}
```

### 测试基础设施

新增测试使用：
- **`mockito`**：用于 provider 测试的 HTTP mock
- **`mockall`**：用于 Git/LLM 操作的 trait mock
- **`tempfile`**：用于 Git 仓库测试的临时目录
- **`serial_test`**：为修改全局状态的测试提供串行执行
- **`tokio::test`**：异步测试支持

## 升级说明

从 v0.5.1 升级**无需任何操作**。此版本**完全向后兼容**。

**保持不变的部分：**
- 所有公共 API 保持不变
- 配置文件格式不变
- 命令行界面不变

**改进的部分：**
- `gcop config validate` 现在执行真实 API 检查
- 更好的错误消息和建议
- 通过全面的测试覆盖提高健壮性

## 破坏性变更

**无。**这是一个次要版本更新（0.5.1 → 0.6.0），包含新功能和改进，但没有破坏性变更。

## 安装

```bash
# Homebrew (macOS/Linux)
brew tap AptS-1547/gcop-rs
brew upgrade gcop-rs

# pipx (Python 用户，推荐)
pipx upgrade gcop-rs

# cargo-binstall (无需编译)
cargo binstall gcop-rs

# cargo install (从源码编译)
cargo install gcop-rs --force
```

或从 [Releases](https://github.com/AptS-1547/gcop-rs/releases) 下载预编译二进制。

## 下一步

剩余的低优先级改进（P2）：
- UI 模块可测试性改进
- 使用 `syntect` 的 diff 语法高亮

详见 [TODO.md](../../TODO.md)。

## 统计数据

- **修改文件数**：22
- **新增行数**：+1,726
- **删除行数**：-64
- **新增测试文件**：3
- **新增测试**：29
- **测试覆盖率增长**：248 → 277（+11.7%）

## 贡献者

- AptS-1547（卞雨涵 / Yuhan Bian）
- AptS-1548（48）

## 反馈

如有问题或建议，欢迎提交 [Issue](https://github.com/AptS-1547/gcop-rs/issues)。

---

**完整变更日志**：[v0.5.1...v0.6.0](https://github.com/AptS-1547/gcop-rs/compare/v0.5.1...v0.6.0)
