# QuiCommit

[English](README.md) | 简体中文

一款强大的AI驱动的Git助手，用于生成规范化的提交信息、标签和变更日志，并支持管理多个Git配置。

【目前还处在早期开发阶段，依然有一些功能未完善，欢迎反馈和贡献。】

> ⚠️ **重要提示**：QuiCommit 现在使用系统密钥环（keyring）来安全存储 API 密钥。此更改可能会对现有配置造成破坏性变更。如果在更新后遇到问题，请运行 `quicommit config reset --force` 重置配置，然后重新配置您的设置。

![Rust](https://img.shields.io/badge/rust-%23000000.svg?style=for-the-badge&logo=rust&logoColor=white)
![License](https://img.shields.io/badge/license-MIT-blue.svg)
![Crates.io Version](https://img.shields.io/crates/v/quicommit)

## 主要功能

- **AI智能生成**：使用LLM API（Ollama本地、OpenAI、Anthropic Claude、Kimi、DeepSeek、OpenRouter）生成提交信息、标签和变更日志
- **规范化提交**：支持Conventional Commits和commitlint格式规范
- **多配置管理**：为不同场景管理多个Git身份，支持SSH密钥和GPG签名配置
- **智能标签管理**：基于语义版本自动检测升级，AI生成标签信息
- **变更日志生成**：自动生成Keep a Changelog格式的变更日志
- **安全保护**：使用系统密钥环进行安全存储
- **交互式界面**：美观的CLI界面，支持预览和确认
- **多语言支持**：支持7种语言输出（中文、英语、日语、韩语、西班牙语、法语、德语）
- **配置导出导入**：备份和恢复配置，支持加密保护

## 安装

### cargo安装

cargo安装版本可能暂时不如源码进展快速。

```bash
cargo install quicommit
```

### 从源代码安装

```bash
git clone https://git.lyz.one/SidneyZhang/QuiCommit.git
cd QuiCommit
cargo build --release
cargo install --path .
```

要求：Rust 1.70+、Git 2.0+

## 快速开始

### 初始化配置

```bash
quicommit init
```

### 生成提交信息

```bash
# AI生成提交信息（默认）
quicommit commit

# 手动提交
quicommit commit --manual -t feat -m "添加新功能"

# 暂存所有文件并提交
quicommit commit -a

# 跳过确认直接提交
quicommit commit --yes

# 使用日期格式的提交信息
quicommit commit --date

# 提交后推送到远程
quicommit commit --push
```

### 创建标签

```bash
# 自动检测版本升级
quicommit tag

# 指定版本升级类型
quicommit tag --bump minor

# 自定义标签名
quicommit tag -n v1.0.0

# AI生成标签信息
quicommit tag --generate

# 创建标签并推送到远程
quicommit tag --push
```

### 生成变更日志

```bash
# 生成未发布变更的变更日志
quicommit changelog

# 为特定版本生成
quicommit changelog -v 1.0.0

# AI生成变更日志
quicommit changelog --generate

# 初始化新的变更日志文件
quicommit changelog --init

# 指定输出文件
quicommit changelog -o RELEASE_NOTES.md
```

### 配置管理

```bash
# 添加新配置
quicommit profile add

# 查看配置列表
quicommit profile list

# 显示配置详情
quicommit profile show

# 切换配置
quicommit profile switch

# 设置默认配置
quicommit profile set-default personal

# 设置当前仓库的配置
quicommit profile set-repo personal

# 应用配置到当前仓库
quicommit profile apply

# 全局应用配置
quicommit profile apply --global

# 复制配置
quicommit profile copy personal work

# 编辑配置
quicommit profile edit personal

# 删除配置
quicommit profile remove old-profile

# 检查配置
quicommit profile check

# 查看使用统计
quicommit profile stats

# 管理配置的令牌
quicommit profile token
```

### LLM配置

```bash
# 配置Ollama（本地）
quicommit config set-llm ollama
quicommit config set-llm ollama --url http://localhost:11434 --model llama2

# 配置OpenAI
quicommit config set-llm openai
quicommit config set-api-key YOUR_API_KEY

# 配置Anthropic Claude
quicommit config set-llm anthropic
quicommit config set-api-key YOUR_API_KEY

# 配置Kimi
quicommit config set-llm kimi
quicommit config set-api-key YOUR_API_KEY
quicommit config set-llm kimi --base-url https://api.moonshot.cn/v1 --model moonshot-v1-8k

# 配置DeepSeek
quicommit config set-llm deepseek
quicommit config set-api-key YOUR_API_KEY
quicommit config set-llm deepseek --base-url https://api.deepseek.com/v1 --model deepseek-chat

# 配置OpenRouter
quicommit config set-llm openrouter
quicommit config set-api-key YOUR_API_KEY
quicommit config set-llm openrouter --base-url https://openrouter.ai/api/v1 --model openai/gpt-4

# 设置提交格式
quicommit config set-commit-format conventional

# 设置版本前缀
quicommit config set-version-prefix v

# 设置变更日志路径
quicommit config set-changelog-path CHANGELOG.md

# 设置输出语言（zh, en, ja, ko, es, fr, de）
quicommit config set-language zh

# 设置保持提交类型为英文
quicommit config set-keep-types-english true

# 设置保持变更日志类型为英文
quicommit config set-keep-changelog-types-english true

# 测试LLM连接
quicommit config test-llm

# 检查密钥环可用性
quicommit config check-keyring

# 显示配置文件路径
quicommit config path

# 导出配置（支持加密）
quicommit config export -o config-backup.toml
quicommit config export -o config-backup.enc --password

# 导入配置
quicommit config import -i config-backup.toml
quicommit config import -i config-backup.enc --password

# 重置配置为默认值
quicommit config reset --force
```

## 命令参考

| 命令 | 别名 | 说明 |
|------|------|------|
| `quicommit init` | `i` | 初始化配置 |
| `quicommit commit` | `c` | 生成并执行提交 |
| `quicommit tag` | `t` | 生成并创建标签 |
| `quicommit changelog` | `cl` | 生成变更日志 |
| `quicommit profile` | `p` | 管理Git配置 |
| `quicommit config` | `cfg` | 管理应用配置 |

### commit命令选项

| 选项 | 说明 |
|------|------|
| `--commit-type` | 提交类型（feat、fix等） |
| `-s, --scope` | 提交范围 |
| `-m, --message` | 提交描述 |
| `--body` | 提交正文 |
| `-b, --breaking` | 标记为破坏性变更 |
| `-d, --date` | 使用日期格式的提交信息 |
| `--manual` | 手动输入，跳过AI生成 |
| `-a, --all` | 暂存所有更改 |
| `-S, --sign` | GPG签名提交 |
| `--amend` | 修改上一次提交 |
| `--dry-run` | 试运行，不实际提交 |
| `--conventional` | 使用Conventional Commits格式 |
| `--commitlint` | 使用commitlint格式 |
| `--no-verify` | 不验证提交信息 |
| `-y, --yes` | 跳过确认提示 |
| `--push` | 提交后推送到远程 |
| `--remote` | 指定远程仓库（默认：origin） |

### tag命令选项

| 选项 | 说明 |
|------|------|
| `-n, --name` | 标签名称 |
| `-b, --bump` | 版本升级类型（major/minor/patch） |
| `-m, --message` | 标签信息 |
| `-g, --generate` | AI生成标签信息 |
| `-S, --sign` | GPG签名标签 |
| `-l, --lightweight` | 创建轻量标签 |
| `-f, --force` | 强制覆盖已存在的标签 |
| `-p, --push` | 推送到远程 |
| `-r, --remote` | 指定远程仓库（默认：origin） |
| `--dry-run` | 试运行 |
| `-y, --yes` | 跳过确认提示 |

### changelog命令选项

| 选项 | 说明 |
|------|------|
| `-o, --output` | 输出文件路径 |
| `-v, --version` | 为特定版本生成 |
| `-f, --from` | 从指定标签生成 |
| `-t, --to` | 生成到指定引用（默认：HEAD） |
| `-i, --init` | 初始化新的变更日志文件 |
| `-g, --generate` | AI生成变更日志 |
| `--prepend` | 添加到现有变更日志开头 |
| `--include-hashes` | 包含提交哈希 |
| `--include-authors` | 包含作者信息 |
| `--format` | 格式（keep-a-changelog、github-releases） |
| `--dry-run` | 试运行（输出到stdout） |
| `-y, --yes` | 跳过确认提示 |

## 配置文件

配置文件位置：
- Linux: `~/.config/quicommit/config.toml`
- macOS: `~/Library/Application Support/quicommit/config.toml`
- Windows: `%APPDATA%\quicommit/config.toml`

```toml
version = "1"
default_profile = "personal"

[profiles.personal]
name = "personal"
user_name = "Your Name"
user_email = "your.email@example.com"
description = "个人项目"
is_work = false

[profiles.work]
name = "work"
user_name = "Your Name"
user_email = "your.name@company.com"
description = "工作项目"
is_work = true
organization = "Your Company"

[profiles.work.ssh]
private_key_path = "/home/user/.ssh/id_rsa_work"
agent_forwarding = true

[profiles.work.gpg]
key_id = "YOUR_GPG_KEY_ID"
program = "gpg"
use_agent = true

[llm]
provider = "ollama"
model = "llama2"
# base_url = "http://localhost:11434"
max_tokens = 500
temperature = 0.7
timeout = 30
api_key_storage = "keyring"
thinking_enabled = false

[commit]
format = "conventional"
auto_generate = true

[tag]
version_prefix = "v"
auto_generate = true

[changelog]
path = "CHANGELOG.md"
auto_generate = true

[repo_profiles]
"/path/to/work/project" = "work"
"/path/to/personal/project" = "personal"
```

## 环境变量

| 变量名 | 说明 |
|--------|------|
| `QUICOMMIT_CONFIG` | 配置文件路径 |
| `EDITOR` | 默认编辑器 |
| `NO_COLOR` | 禁用彩色输出 |

## 故障排除

```bash
# 查看当前配置
quicommit config show

# 编辑配置文件
quicommit config edit

# 设置配置值
quicommit config set llm.provider ollama

# 获取配置值
quicommit config get llm.provider

# 设置API密钥（存储在系统密钥环中）
quicommit config set-api-key YOUR_API_KEY

# 从密钥环删除API密钥
quicommit config delete-api-key

# 测试LLM连接
quicommit config test-llm

# 列出可用模型
quicommit config list-models

# 检查密钥环可用性
quicommit config check-keyring

# 显示配置文件路径
quicommit config path

# 导出配置（支持加密）
quicommit config export -o config-backup.toml
quicommit config export -o config-backup.enc --password

# 导入配置
quicommit config import -i config-backup.toml
quicommit config import -i config-backup.enc --password

# 重置配置
quicommit config reset --force
```

## 贡献

欢迎贡献代码！请遵循以下步骤：

### 提交Pull Request

1. Fork本仓库
2. 创建功能分支：`git checkout -b feature/your-feature`
3. 提交变更：`git commit -m 'feat: 添加新功能'`
4. 推送分支：`git push origin feature/your-feature`
5. 提交Pull Request

### 开发环境

```bash
# 克隆仓库
git clone https://git.lyz.one/SidneyZhang/QuiCommit.git
cd QuiCommit

# 安装依赖
cargo fetch

# 开发模式运行
cargo run -- commit --help

# 运行测试
cargo test

# 代码检查
cargo clippy
cargo fmt --check
```

### 代码规范

- 遵循Rust官方代码风格（运行 `cargo fmt`）
- 提交信息使用Conventional Commits格式
- 新增功能应添加测试
- 运行 `cargo clippy` 确保无警告

### 项目结构

```
src/
├── commands/    # CLI命令实现
│   ├── commit.rs
│   ├── tag.rs
│   ├── changelog.rs
│   ├── profile.rs
│   ├── config.rs
│   └── init.rs
├── config/      # 配置管理
│   ├── manager.rs
│   └── profile.rs
├── generator/   # AI内容生成
├── git/         # Git操作封装
│   ├── commit.rs
│   ├── tag.rs
│   └── changelog.rs
├── llm/         # LLM提供商实现
│   ├── ollama.rs
│   ├── openai.rs
│   ├── anthropic.rs
│   ├── kimi.rs
│   ├── deepseek.rs
│   └── openrouter.rs
├── i18n/        # 国际化支持
│   ├── messages.rs
│   └── translator.rs
├── utils/       # 工具函数
│   ├── validators.rs
│   ├── formatter.rs
│   ├── crypto.rs
│   └── editor.rs
└── main.rs      # 程序入口
```

## 许可证

MIT License
