sdd-layer 0.18.2

Spec-Driven Development CLI and agent harness
$ErrorActionPreference = 'Stop'
# Usage: .\scripts\bump-version.ps1 <semver|patch|minor|major>

# ---------------------------------------------------------------------------
# T-02: Validação de argumento
# ---------------------------------------------------------------------------
if ($args.Count -ne 1) {
    [Console]::Error.WriteLine("Uso: .\scripts\bump-version.ps1 <patch|minor|major|X.Y.Z>")
    exit 2
}

$Arg = $args[0]

# Aceitar: patch, minor, major, ou semver X.Y.Z (apenas dígitos e pontos)
if ($Arg -eq 'patch' -or $Arg -eq 'minor' -or $Arg -eq 'major') {
    # válido
} elseif ($Arg -match '^\d+\.\d+\.\d+$') {
    # semver explícito — válido
} else {
    [Console]::Error.WriteLine("Erro: argumento inválido '$Arg'. Use patch, minor, major ou X.Y.Z.")
    exit 2
}

# ---------------------------------------------------------------------------
# T-03: Resolução de versão alvo
# ---------------------------------------------------------------------------
$Current = (Get-Content VERSION -Raw).Trim()

if ($Current -notmatch '^\d+\.\d+\.\d+$') {
    [Console]::Error.WriteLine("Erro: VERSION contém valor inválido ('$Current'). Esperado X.Y.Z.")
    exit 1
}

$parts = $Current.Split('.')
[int]$Major = $parts[0]
[int]$Minor = $parts[1]
[int]$Patch = $parts[2]

switch ($Arg) {
    'patch' {
        $Patch = $Patch + 1
        $Target = "$Major.$Minor.$Patch"
    }
    'minor' {
        $Minor = $Minor + 1
        $Patch = 0
        $Target = "$Major.$Minor.$Patch"
    }
    'major' {
        $Major = $Major + 1
        $Minor = 0
        $Patch = 0
        $Target = "$Major.$Minor.$Patch"
    }
    default {
        $Target = $Arg
    }
}

# ---------------------------------------------------------------------------
# T-04: Backup + edição cirúrgica de Cargo.toml (máquina de estado por seção)
# ---------------------------------------------------------------------------
Copy-Item Cargo.toml Cargo.toml.bak
Copy-Item Cargo.lock Cargo.lock.bak

$lines = Get-Content Cargo.toml
$inPkg = $false
$done = $false
$result = foreach ($line in $lines) {
    if ($line -match '^\[') { $inPkg = ($line -eq '[package]') }
    if ($inPkg -and ($line.TrimStart() -match '^version\s*=') -and -not $done) {
        "version = `"$Target`""
        $done = $true
    } else {
        $line
    }
}
$result | Set-Content Cargo.toml

# ---------------------------------------------------------------------------
# T-05: cargo update + escrita de VERSION + rollback em falha
# ---------------------------------------------------------------------------
cargo update -p sdd-layer --precise $Target
if ($LASTEXITCODE -ne 0) {
    Copy-Item Cargo.toml.bak Cargo.toml -Force
    Copy-Item Cargo.lock.bak Cargo.lock -Force
    Remove-Item Cargo.toml.bak, Cargo.lock.bak -Force -ErrorAction SilentlyContinue
    [Console]::Error.WriteLine("Erro: cargo update -p sdd-layer --precise $Target falhou. Rollback executado.")
    exit 1
}

Set-Content VERSION $Target -NoNewline
Add-Content VERSION ""

Remove-Item Cargo.toml.bak, Cargo.lock.bak -Force

# ---------------------------------------------------------------------------
# T-06: Saída resumo + exit 0
# ---------------------------------------------------------------------------
Write-Host "bump-version: $Current -> $Target"
Write-Host "  VERSION      $Target"
Write-Host "  Cargo.toml   $Target"
Write-Host "  Cargo.lock   $Target  (sdd-layer)"
Write-Host "OK"
exit 0