# CC Hook - Conventional Commits Hook
Uma CLI cross-platform em Rust para configurar automaticamente um git hook que valida mensagens de commit seguindo o padrão [Conventional Commits](https://www.conventionalcommits.org/).
> 🔀 Fork do projeto [Conventional-Commits-Hook](https://github.com/thera-org/Conventional-Commits-Hook) por [@murillous](https://github.com/murillous), reescrito em Rust para compatibilidade cross-platform e capacidade de extensão.
## 🎯 O que faz
Este programa instala um hook `commit-msg` no seu repositório Git que:
- ✅ Valida automaticamente todas as mensagens de commit
- 🚫 Bloqueia commits que não seguem o padrão Conventional Commits
- 📝 Fornece feedback claro sobre erros e exemplos de uso correto
- 🔒 Mantém backup de hooks existentes
- 🎨 Interface colorida e amigável
## 📋 Pré-requisitos
- [Rust/Cargo](https://rustup.rs/) instalado
- Git instalado no sistema
- Estar dentro de um repositório Git inicializado
## 🚀 Instalação
```bash
cargo install cc-hook
```
O Cargo se encarrega de compilar e colocar o binário no PATH automaticamente (`~/.cargo/bin`).
> 💡 **Dica**: Se `~/.cargo/bin` não estiver no PATH, o próprio `cargo install` avisa e mostra como configurar.
### Uso
Após a instalação, basta navegar até o repositório desejado e executar:
```bash
cd meu-projeto
cc-hook install
```
O hook será instalado em `.git/hooks/commit-msg`. A partir daí, todos os commits serão validados automaticamente. Se a mensagem não estiver no formato correto, o commit será rejeitado.
### ✅ Exemplos de commits válidos
```bash
git commit -m "feat: adicionar autenticação de usuário"
git commit -m "fix(api): corrigir bug de timeout"
git commit -m "docs: atualizar README"
git commit -m "feat!: remover suporte ao Node.js 14"
git commit -m "chore(deps): atualizar dependências"
```
### ❌ Exemplos de commits inválidos
```bash
git commit -m "adicionar nova feature" # Sem tipo
git commit -m "fix bug" # Sem dois pontos
git commit -m "invalid: " # Tipo inválido
git commit -m "feat:" # Sem descrição
```
## 🏷️ Tipos de commit suportados
| `feat` | Nova funcionalidade |
| `fix` | Correção de bug |
| `docs` | Alterações na documentação |
| `style` | Formatação, espaços (sem mudança de código) |
| `refactor` | Refatoração (sem nova funcionalidade ou correção) |
| `test` | Adicionar ou modificar testes |
| `chore` | Manutenção geral (dependências, ferramentas) |
| `build` | Sistema de build ou dependências externas |
| `ci` | Configuração de CI/CD |
| `perf` | Melhoria de performance |
| `revert` | Reverter commit anterior |
## 🎯 Formato das mensagens
```md
<tipo>(<escopo opcional>): <descrição>
Exemplos:
feat(auth): implementar login com JWT
fix: corrigir vazamento de memória
docs(api): adicionar documentação dos endpoints
```
### Breaking Changes
Para indicar mudanças que quebram compatibilidade, use `!`:
```bash
feat!: remover API v1
fix(api)!: alterar formato de resposta
```
## 🛠️ Funcionalidades
### ✨ Recursos
- **Validação automática**: Verifica se está em um repositório Git
- **Backup inteligente**: Preserva hooks existentes com timestamp
- **Interface amigável**: Mensagens coloridas e informativas
- **Flexível**: Permite sobrescrever hooks existentes
- **Completo**: Feedback detalhado sobre erros
- **Cross-platform**: Funciona em qualquer terminal (PowerShell, CMD, Bash, Zsh, Fish)
### 🔧 Exceções automáticas
O hook ignora automaticamente:
- Merge commits (`Merge branch...`)
- Revert commits (`Revert...`)
- Commits iniciais (`Initial commit`)
- Commits vazios
## 🔧 Gerenciamento
### Ver status do hook
```bash
ls -la .git/hooks/commit-msg
```
### Remover o hook
```bash
rm .git/hooks/commit-msg
```
### Restaurar backup
```bash
cp .git/hooks/commit-msg.backup.TIMESTAMP .git/hooks/commit-msg
```
## 🌍 Compatibilidade
- ✅ Linux
- ✅ macOS
- ✅ Windows (PowerShell, CMD, Windows Terminal)
- ✅ Todas as versões do Git
## 🤝 Contribuindo
Contribuições são bem-vindas! Para contribuir:
1. Faça fork do projeto
2. Crie uma branch para sua feature (`git checkout -b feature/nova-funcionalidade`)
3. Commit suas mudanças (`git commit -m "feat: adicionar nova funcionalidade"`)
4. Push para a branch (`git push origin feature/nova-funcionalidade`)
5. Abra um Pull Request
## 📝 Licença
Este projeto está sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.
## 📚 Links úteis
- [Conventional Commits Specification](https://www.conventionalcommits.org/)
- [Semantic Versioning](https://semver.org/)
- [Git Hooks Documentation](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
- [Projeto original (shell)](https://github.com/thera-org/Conventional-Commits-Hook)
## ❓ FAQ
### P: O hook funciona em repositórios já existentes?
R: Sim, funciona em qualquer repositório Git, novo ou existente.
### P: Posso personalizar os tipos de commit?
R: Sim, você pode editar o arquivo `.git/hooks/commit-msg` para adicionar tipos customizados.
### P: O que acontece se eu clonar o repositório?
R: Hooks não são versionados pelo Git, então cada colaborador precisa executar `cc-hook install`.
### P: Posso usar em repositórios corporativos?
R: Sim, o programa é totalmente local e não envia dados para nenhum servidor.
### P: Como verifico se o comando está disponível globalmente?
R: Execute `cc-hook` sem argumentos para verificar se está no PATH.
### P: O que fazer se o comando não for encontrado?
R: Verifique se `~/.cargo/bin` está no PATH. O `cargo install` geralmente configura isso automaticamente.
---
Talvez você queira dar uma olhada no repositório original deste projeto, com uma versão completa em Schell Script :)
<https://github.com/thera-org/Conventional-Commits-Hook>