$ErrorActionPreference = "Stop" Set-Location -LiteralPath $PSScriptRoot Write-Host "[1/4] Installing build dependencies..." python -m pip install -r requirements-build.txt if ($LASTEXITCODE -ne 0) { throw "Dependency installation failed." } Write-Host "[2/4] Generating application icon..." python tools\generate_icon.py if ($LASTEXITCODE -ne 0) { throw "Icon generation failed." } Write-Host "[3/4] Running tests..." python -m unittest discover -s tests -v if ($LASTEXITCODE -ne 0) { throw "Tests failed." } Write-Host "[4/4] Building single-file executable..." python -m PyInstaller --noconfirm --clean ProcessDock.spec if ($LASTEXITCODE -ne 0) { throw "PyInstaller build failed." } $exe = Join-Path $PSScriptRoot "dist\ProcessDock.exe" if (-not (Test-Path -LiteralPath $exe)) { throw "Build completed without an executable." } $file = Get-Item -LiteralPath $exe $hash = Get-FileHash -LiteralPath $exe -Algorithm SHA256 Write-Host "" Write-Host "Build succeeded: $($file.FullName)" Write-Host "Size: $([math]::Round($file.Length / 1MB, 1)) MB" Write-Host "SHA256: $($hash.Hash)"