architect-linter-pro 6.0.0

Multi-language software architecture linter written in Rust
Documentation
# Script unificado de instalación/actualización para Windows
# Detecta automáticamente si es instalación inicial o actualización

Write-Host "===========================================  ARCHITECT-LINTER PRO v6.0.0 SETUP" -ForegroundColor Cyan
Write-Host ""

# Obtener versiones para comparación
$cargoPath = "$PSScriptRoot\Cargo.toml"
$projectVersion = "unknown"
if (Test-Path $cargoPath) {
    $content = Get-Content $cargoPath | Select-String '^version = '
    if ($content) {
        $projectVersion = [regex]::Match($content[0], '"([^"]+)"').Groups[1].Value
    }
}

# Detectar si ya está instalado
$binPath = "$env:USERPROFILE\bin\architect-linter-pro.exe"
$isUpdate = Test-Path $binPath
$installedVersion = "unknown"
$mode = "instalacion"

if ($isUpdate) {
    $mode = "actualizacion"
    $versionOutput = & $binPath --version 2>$null
    $installedVersion = [regex]::Match($versionOutput, '\d+\.\d+\.\d+').Value

    Write-Host "Versión actual instalada: v$installedVersion" -ForegroundColor Cyan
    Write-Host "Versión del proyecto: v$projectVersion" -ForegroundColor Cyan
    Write-Host ""

    # Si es la misma versión, preguntar si continuar
    if ($installedVersion -eq $projectVersion) {
        Write-Host "Versión ya está actualizada." -ForegroundColor Green
        Write-Host ""
        $response = Read-Host "¿Deseas reinstalar de todas formas? (S/N)"
        if ($response -notmatch "^[SsYy]$") {
            Write-Host "Operación cancelada." -ForegroundColor Yellow
            exit 0
        }
    }
} else {
    Write-Host "Primera instalación detectada" -ForegroundColor Green
    Write-Host "Versión del proyecto: v$projectVersion" -ForegroundColor Cyan
    Write-Host ""
}

# Verificar si hay instancias de architect-linter-pro en ejecución
Write-Host "Verificando procesos en ejecucion..." -ForegroundColor Cyan
$runningProcesses = Get-Process -Name "architect-linter-pro" -ErrorAction SilentlyContinue

if ($runningProcesses) {
    Write-Host ""
    Write-Host "Encontradas instancias de architect-linter-pro en ejecucion." -ForegroundColor Yellow
    Write-Host "Cerrando automáticamente..." -ForegroundColor Yellow
    Write-Host ""

    $runningProcesses | ForEach-Object {
        Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue
        Write-Host "  Proceso $($_.Id) cerrado." -ForegroundColor Green
    }
    Write-Host ""
    Start-Sleep -Seconds 1
}

Write-Host "Compilando en modo release..." -ForegroundColor Cyan
cargo build --release

if ($LASTEXITCODE -eq 0) {
    Write-Host "Compilacion exitosa." -ForegroundColor Green
    Write-Host ""

    # Recolectar todas las ubicaciones donde instalar
    $destinos = @()

    # 1. ~/bin (instalación propia del script)
    $destPath = "$env:USERPROFILE\bin"
    if (!(Test-Path $destPath)) {
        Write-Host "Creando carpeta $destPath..." -ForegroundColor Yellow
        New-Item -ItemType Directory -Path $destPath | Out-Null
    }
    $destinos += "$destPath\architect-linter-pro.exe"

    # 2. ~/.cargo/bin (si existe una versión instalada con cargo install)
    $cargoBin = "$env:USERPROFILE\.cargo\bin\architect-linter-pro.exe"
    if (Test-Path $cargoBin) {
        $destinos += $cargoBin
    }

    # Copiar a cada destino
    $copiasFallidas = @()
    foreach ($destino in $destinos) {
        $timestampAntes = $null
        if (Test-Path $destino) {
            $timestampAntes = (Get-Item $destino).LastWriteTime
        }

        Write-Host "Instalando en: $destino..." -ForegroundColor Cyan
        try {
            Copy-Item "target\release\architect-linter-pro.exe" -Destination $destino -Force -ErrorAction Stop

            # Verificar que la copia realmente cambió el archivo
            $timestampDespues = (Get-Item $destino).LastWriteTime
            if ($timestampAntes -and $timestampAntes -eq $timestampDespues) {
                Write-Host "  ADVERTENCIA: El archivo no cambio (mismo timestamp). Puede estar bloqueado." -ForegroundColor Yellow
                $copiasFallidas += $destino
            } else {
                Write-Host "  OK" -ForegroundColor Green
            }
        } catch {
            Write-Host "  ERROR: $_" -ForegroundColor Red
            Write-Host "  El archivo puede estar en uso. Cierra todas las terminales y reintenta." -ForegroundColor Yellow
            $copiasFallidas += $destino
        }
    }

    if ($copiasFallidas.Count -gt 0) {
        Write-Host ""
        Write-Host "No se pudieron actualizar los siguientes binarios:" -ForegroundColor Red
        $copiasFallidas | ForEach-Object { Write-Host "  $_" -ForegroundColor White }
        Write-Host "Cierra todas las terminales abiertas y vuelve a ejecutar el script." -ForegroundColor Yellow
        Write-Host ""
        exit 1
    }

    Write-Host ""
    if ($isUpdate) {
        Write-Host "Actualizacion exitosa!" -ForegroundColor Green
    } else {
        Write-Host "Instalacion exitosa!" -ForegroundColor Green
    }
    Write-Host ""

    Write-Host "Nueva version:" -ForegroundColor Cyan
    & "$destPath\architect-linter-pro.exe" --version
    Write-Host ""

    if ($isUpdate) {
        Write-Host "Abre una nueva terminal para usar la version actualizada." -ForegroundColor Yellow
    } else {
        # Verificar si está en el PATH solo en instalación
        $currentPath = [Environment]::GetEnvironmentVariable("Path", "User")
        if ($currentPath -notlike "*$destPath*") {
            Write-Host "IMPORTANTE: Debes agregar $destPath a tu PATH" -ForegroundColor Yellow
            Write-Host ""
            Write-Host "Opcion 1 - Agregar automaticamente (ejecuta PowerShell como Administrador):" -ForegroundColor Cyan
            Write-Host ""
            $pathCommand = @"
`$oldPath = [Environment]::GetEnvironmentVariable('Path', 'User')
`$newPath = "`$oldPath;$destPath"
[Environment]::SetEnvironmentVariable('Path', `$newPath, 'User')
"@
            Write-Host $pathCommand -ForegroundColor White
            Write-Host ""
            Write-Host "Opcion 2 - Agregar manualmente:" -ForegroundColor Cyan
            Write-Host "  1. Presiona Win + X y selecciona 'Sistema'" -ForegroundColor White
            Write-Host "  2. Click en 'Configuracion avanzada del sistema'" -ForegroundColor White
            Write-Host "  3. Click en 'Variables de entorno'" -ForegroundColor White
            Write-Host "  4. En 'Variables de usuario', selecciona 'Path' y click 'Editar'" -ForegroundColor White
            Write-Host "  5. Click 'Nuevo' y agrega: $destPath" -ForegroundColor White
            Write-Host "  6. Click 'Aceptar' en todas las ventanas" -ForegroundColor White
            Write-Host ""
        } else {
            Write-Host "Ahora puedes usar 'architect-linter-pro' en cualquier carpeta." -ForegroundColor Green
            Write-Host ""
            Write-Host "Ejemplos de uso (v6.0.0):" -ForegroundColor Cyan
            Write-Host "  architect-linter-pro                    # Analisis basico" -ForegroundColor White
            Write-Host "  architect-linter-pro --watch            # Modo observacion" -ForegroundColor White
            Write-Host "  architect-linter-pro --report json -o report.json" -ForegroundColor White
            Write-Host "  architect-linter-pro --help             # Ver todas las opciones" -ForegroundColor White
            Write-Host ""
            Write-Host "Para verificar la instalacion:" -ForegroundColor Cyan
            Write-Host "  architect-linter-pro --version" -ForegroundColor White
            Write-Host ""
        }
    }
    Write-Host ""
} else {
    Write-Host "Error en la compilacion." -ForegroundColor Red
    Write-Host ""
    Write-Host "Posibles causas:" -ForegroundColor Yellow
    Write-Host "  1. El archivo esta en uso (cierra todas las instancias de architect-linter-pro)" -ForegroundColor White
    Write-Host "  2. No tienes Rust instalado (https://rustup.rs/)" -ForegroundColor White
    Write-Host "  3. No estas en el directorio del proyecto architect-linter-pro" -ForegroundColor White
    Write-Host ""
    Write-Host "Si el problema persiste, ejecuta:" -ForegroundColor Cyan
    Write-Host "  cargo clean" -ForegroundColor White
    Write-Host "Y vuelve a intentar." -ForegroundColor White
    Write-Host ""
}