nightshift/setup.ps1

109 lines
3.9 KiB
PowerShell

param(
[switch]$Yes
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
function Test-Command {
param([string]$Name)
$null -ne (Get-Command $Name -ErrorAction SilentlyContinue)
}
function Ask-YesNo {
param(
[string]$Question,
[bool]$Default = $true
)
if ($Yes) {
return $true
}
$suffix = if ($Default) { "[Y/n]" } else { "[y/N]" }
$answer = Read-Host "$Question $suffix"
if ([string]::IsNullOrWhiteSpace($answer)) {
return $Default
}
return $answer.Trim().ToLowerInvariant().StartsWith("y")
}
function Add-UserPath {
param([string]$Directory)
$current = [Environment]::GetEnvironmentVariable("Path", "User")
$parts = @()
if (-not [string]::IsNullOrWhiteSpace($current)) {
$parts = @($current -split ";" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
}
$normalizedParts = @($parts | ForEach-Object { $_.TrimEnd("\") })
$normalizedDirectory = $Directory.TrimEnd("\")
if ($normalizedParts -contains $normalizedDirectory) {
return
}
$newPath = if ($parts.Count -gt 0) { ($parts + $Directory) -join ";" } else { $Directory }
[Environment]::SetEnvironmentVariable("Path", $newPath, "User")
$env:Path = [Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [Environment]::GetEnvironmentVariable("Path", "User")
}
$repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $repoRoot
Write-Host "NightShift setup"
Write-Host "Repo: $repoRoot"
if (-not (Test-Command "python")) {
throw "Python was not found on PATH. Install Python 3.11+ and rerun setup.ps1."
}
$pythonVersion = python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')"
Write-Host "Python: $pythonVersion"
Write-Host "Installing NightShift in editable mode..."
python -m pip install -e .
$scriptsDir = python -c "import sysconfig; print(sysconfig.get_path('scripts', scheme='nt_user') or sysconfig.get_path('scripts'))"
$pathParts = $env:Path -split ";" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
if ($pathParts -notcontains $scriptsDir) {
if (Ask-YesNo "Add Python scripts directory to your user PATH so 'nightshift' works in new terminals? $scriptsDir") {
Add-UserPath $scriptsDir
$persistedUserPath = [Environment]::GetEnvironmentVariable("Path", "User")
if (($persistedUserPath -split ";" | ForEach-Object { $_.TrimEnd("\") }) -contains $scriptsDir.TrimEnd("\")) {
Write-Host "Added to user PATH: $scriptsDir"
} else {
Write-Host "Tried to add PATH entry, but it was not visible in the persisted user PATH."
Write-Host "Manual command:"
Write-Host "[Environment]::SetEnvironmentVariable('Path', [Environment]::GetEnvironmentVariable('Path','User') + ';$scriptsDir', 'User')"
}
} else {
Write-Host "Skipped PATH update. You can still run: python -m nightshift.cli"
}
} else {
Write-Host "PATH already includes Python scripts directory."
}
if (Test-Command "nightshift") {
Write-Host "NightShift CLI is available:"
nightshift --help | Select-Object -First 5
} else {
Write-Host "NightShift CLI is not visible in this shell yet. Open a new terminal or run: python -m nightshift.cli --help"
}
if (Test-Command "ollama") {
Write-Host "Ollama is installed:"
ollama --version
} else {
Write-Host "Ollama was not found."
if (Test-Command "winget") {
if (Ask-YesNo "Install Ollama with winget now?") {
winget install --id Ollama.Ollama -e
} else {
Write-Host "Skipped Ollama install. Install later from https://ollama.com/download"
}
} else {
Write-Host "winget was not found. Install Ollama from https://ollama.com/download"
}
}
Write-Host ""
Write-Host "Setup complete."
Write-Host "Validate this repo with: nightshift validate"
Write-Host "Start the dashboard with: nightshift web"