# 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

| Código | Significado |
|--------|-------------|
| `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.
