# 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

| Tipo       | Descrição                                              |
|------------|--------------------------------------------------------|
| `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>
