# scripts/ — Scripts de bump de versão
Este diretório contém os scripts de bump atômico de versão do `sdd-layer`. Eles existem porque `VERSION`, `Cargo.toml` e `Cargo.lock` precisam ser mantidos em sincronia; qualquer divergência entre os três arquivos causa falha no CI (`version_alignment_issues` com `strict_contract=true`).
---
## Uso
### Linux / macOS / CI (bash)
```bash
# Versão explícita
./scripts/bump-version.sh 0.16.0
# Incremento de patch (ex.: 0.15.2 → 0.15.3)
./scripts/bump-version.sh patch
# Incremento de minor (ex.: 0.15.2 → 0.16.0)
./scripts/bump-version.sh minor
# Incremento de major (ex.: 0.15.2 → 1.0.0)
./scripts/bump-version.sh major
```
### Windows (PowerShell)
```powershell
# Versão explícita
.\scripts\bump-version.ps1 0.16.0
# Incremento de patch
.\scripts\bump-version.ps1 patch
# Incremento de minor
.\scripts\bump-version.ps1 minor
# Incremento de major
.\scripts\bump-version.ps1 major
```
---
## Saída esperada
Ao final de uma execução bem-sucedida o script imprime:
```
bump-version: 0.15.2 -> 0.16.0
VERSION 0.16.0
Cargo.toml 0.16.0
Cargo.lock 0.16.0 (sdd-layer)
OK
```
---
## Exit codes
| `0` | Sucesso — `VERSION`, `Cargo.toml` e `Cargo.lock` sincronizados |
| `1` | Falha em `cargo update` ou erro de I/O — rollback executado, arquivos preservados no estado anterior |
| `2` | Argumento inválido — nenhum arquivo foi modificado |
---
## ⚠️ Aviso — RN-03
> **Bumps manuais de `VERSION`, `Cargo.toml` ou `Cargo.lock` não são suportados.**
Qualquer divergência entre os três arquivos causará falha no CI (`sdd doctor` / `sdd ci`), pois a verificação `version_alignment_issues` opera em modo estrito quando o repositório é identificado como source repo do `sdd-layer`.
Use sempre os scripts de bump para garantir consistência:
```bash
# Correto
./scripts/bump-version.sh 0.16.0
# Incorreto — não faça isso manualmente
vim VERSION
# ou
sed -i 's/0.15.2/0.16.0/' Cargo.toml
```
---
## Como funciona
O script executa quatro passos em sequência:
1. **Valida o argumento** — aceita `patch`, `minor`, `major` ou `X.Y.Z` estritamente numérico; qualquer outro valor encerra com exit code `2` sem tocar nenhum arquivo.
2. **Cria backup** — copia `Cargo.toml` → `Cargo.toml.bak` e `Cargo.lock` → `Cargo.lock.bak` antes de qualquer escrita.
3. **Atualiza `Cargo.toml` e `Cargo.lock`** — edita cirurgicamente apenas a primeira `version` dentro da seção `[package]` (via máquina de estado por seção, sem regex global) e executa `cargo update -p sdd-layer --precise <alvo>` para regenerar apenas a entrada raiz no lock; se este passo falhar, os backups são restaurados e o script encerra com exit code `1`.
4. **Escreve `VERSION`** — somente após `cargo update` ter sucedido; em seguida remove os arquivos `.bak` e imprime o resumo final.