lib/help.ps1

# help.ps1 -- `tstyles help`, and the data behind it.
#
# Dot-sourced by tstyles.ps1, so everything here shares its $script: scope.
#
# Get-TerminalStyleHelpData is deliberately separate from the rendering: it is
# the one place that knows every subcommand, so a test can assert the dispatcher
# and the help agree rather than letting them drift.

function Get-TerminalStyleHelpData {
    # Single source of truth for `tstyles help`. Ordered command descriptors.
    # Name is the dispatch token AND the `help <Name>` topic key. The picker
    # and `tstyles <style>` are arg-less modes described in the overview
    # preamble (Show-TerminalStyleHelp), not topics here. A drift-guard test
    # asserts every dispatched subcommand has an entry.
    @(
        [pscustomobject]@{
            Name = 'list'; Usage = 'list'; Summary = "List all styles; '*' marks the active one"
            Detail = @("Prints every available style (bundled + your own), one per line,",
                       "with the active style marked by an asterisk.")
            Keys = @(); Examples = @('tstyles list')
        }
        [pscustomobject]@{
            Name = 'current'; Usage = 'current'; Summary = 'Print the active style name'
            Detail = @("Prints just the name of the currently applied style (or nothing",
                       "if none is detected).")
            Keys = @(); Examples = @('tstyles current')
        }
        [pscustomobject]@{
            Name = 'random'; Usage = 'random'; Summary = 'Apply a random style'
            Detail = @("Picks a random style and applies it immediately.")
            Keys = @(); Examples = @('tstyles random')
        }
        [pscustomobject]@{
            Name = 'reset'; Usage = 'reset [-Target <name>]'; Summary = 'Revert a profile to its unstyled default'
            Detail = @("Strips the colors, cursor, font, opacity, and background a style added",
                       "to the target profile, and restores your own prompt. The inverse of",
                       "applying a style. Writes a settings.json.bak first.")
            Keys = @(); Examples = @('tstyles reset', "tstyles reset -Target 'Ubuntu'")
        }
        [pscustomobject]@{
            Name = 'tune'; Usage = 'tune [name]'; Summary = 'Live-tune a style; save as your own'
            Detail = @("Opens an arrow-key editor for the active style (or [name]). Adjusts",
                       "brightness, saturation, opacity, font face, and font size.",
                       "Saved styles land in your user dir and show up in 'tstyles list'.",
                       "",
                       "Outside Windows Terminal, brightness and saturation preview live;",
                       "opacity and font are recorded in the saved style but no terminal",
                       "there can show them, because no escape sequence carries them and",
                       "the Terminal.app profile carries only colors and a background.")
            Keys = @('Up/Down select a knob',
                     'Left/Right adjust it',
                     'R reset color',
                     'Enter save (Overwrite / Save as)',
                     'Esc revert')
            Examples = @('tstyles tune', 'tstyles tune eva')
        }
        [pscustomobject]@{
            Name = 'font'; Usage = 'font [name]'; Summary = 'Install a coding font and apply it to the active profile'
            Detail = @("With no argument, lists available coding fonts with installed/installable",
                       "markers. With a font name, installs it (if not already present) and",
                       "applies it to the active Windows Terminal profile.")
            Keys = @(); Examples = @('tstyles font', 'tstyles font ''JetBrains Mono''')
        }
        [pscustomobject]@{
            Name = 'register'; Usage = 'register'; Summary = 'Add the loader to your $PROFILE'
            Detail = @("Adds the Import-Module loader to both PowerShell 7 and Windows",
                       "PowerShell 5.1 `$PROFILE files (with a confirm prompt) so tstyles",
                       "loads on every new tab.")
            Keys = @(); Examples = @('tstyles register')
        }
        [pscustomobject]@{
            Name = 'shell-init'; Usage = 'shell-init'; Summary = 'Style zsh/bash too, not just PowerShell'
            Detail = @("Adds a loader to your ~/.zshrc, ~/.bashrc and ~/.bash_profile so a zsh",
                       "or bash tab comes up in the applied style -- colors, prompt, and banner.",
                       "Also defines a 'tstyles' command for those shells.",
                       "",
                       "Colors belong to the terminal rather than to any one shell, so without",
                       "this a zsh user still sees the palette but keeps their own prompt.",
                       "Re-run it any time; it refreshes the block instead of adding a second.")
            Keys = @(); Examples = @('tstyles shell-init')
        }
        [pscustomobject]@{
            Name = 'shell-remove'; Usage = 'shell-remove'; Summary = 'Remove the zsh/bash loader'
            Detail = @("Strips the loader block from your shell rc files and clears the staged",
                       "prompt. Your own prompt returns in the next tab. The inverse of",
                       "shell-init; leaves the PowerShell side untouched.")
            Keys = @(); Examples = @('tstyles shell-remove')
        }
        [pscustomobject]@{
            Name = 'update'; Usage = 'update'; Summary = 'Update to the latest version'
            Detail = @("Updates TerminalStyles. PSGallery installs run Update-PSResource;",
                       "bootstrap installs re-run the installer.")
            Keys = @(); Examples = @('tstyles update')
        }
        [pscustomobject]@{
            Name = 'uninstall'; Usage = 'uninstall'; Summary = 'Remove the module (keeps your styles)'
            Detail = @("Removes the module and strips the `$PROFILE loader. Your saved",
                       "styles and state are preserved unless you pass -DeleteData.")
            Keys = @(); Examples = @('tstyles uninstall', 'tstyles uninstall -DeleteData')
        }
        [pscustomobject]@{
            Name = 'help'; Usage = 'help [command]'; Summary = 'Show all commands, or details for one'
            Detail = @("With no argument, lists every command. With a command name, shows",
                       "detailed help for that command.")
            Keys = @(); Examples = @('tstyles help', 'tstyles help tune')
        }
    )
}

function Show-TerminalStyleHelp {
    # Renders `tstyles help`. No -Command: the overview (USAGE + COMMANDS +
    # EXAMPLES + docs link). With -Command: that command's detail, or a
    # not-found message. Data comes from Get-TerminalStyleHelpData. All ASCII,
    # lightly colorized to match the picker/tuner.
    param([string]$Command)

    $data = Get-TerminalStyleHelpData

    if ($Command) {
        $entry = $data | Where-Object { $_.Name -eq $Command.ToLower() } | Select-Object -First 1
        if (-not $entry) {
            Write-Host "No help topic '$Command'." -ForegroundColor Yellow
            Write-Host ("Topics: " + (($data.Name) -join ', ')) -ForegroundColor DarkGray
            return
        }
        Write-Host ""
        Write-Host ("tstyles " + $entry.Usage) -ForegroundColor Cyan -NoNewline
        Write-Host (" - " + $entry.Summary)
        if ($entry.Detail) {
            Write-Host ""
            foreach ($line in $entry.Detail) { Write-Host (" " + $line) }
        }
        if ($entry.Keys) {
            Write-Host ""
            Write-Host "KEYS" -ForegroundColor DarkGray
            foreach ($k in $entry.Keys) { Write-Host (" " + $k) }
        }
        if ($entry.Examples) {
            Write-Host ""
            Write-Host "EXAMPLES" -ForegroundColor DarkGray
            foreach ($e in $entry.Examples) { Write-Host (" " + $e) }
        }
        Write-Host ""
        return
    }

    # Overview. Module version is best-effort (no disk I/O); omitted if absent.
    $ver = $ExecutionContext.SessionState.Module.Version
    $title = if ($ver) { "tstyles - themed styles for Windows Terminal (v$ver)" }
             else       { "tstyles - themed styles for Windows Terminal" }

    Write-Host ""
    Write-Host $title -ForegroundColor Cyan
    Write-Host ""
    Write-Host "USAGE" -ForegroundColor DarkGray
    Write-Host " tstyles [command] [args]"
    Write-Host ""
    Write-Host "COMMANDS" -ForegroundColor DarkGray
    Write-Host " (no command) Open the interactive picker"
    Write-Host " <style> Apply a style by name (umbrella, eva, ...)"
    foreach ($e in $data) {
        Write-Host (" " + ('{0,-16}' -f $e.Usage) + " " + $e.Summary)
    }
    Write-Host ""
    Write-Host "EXAMPLES" -ForegroundColor DarkGray
    Write-Host " tstyles # pick interactively"
    Write-Host " tstyles eva # apply 'eva'"
    Write-Host " tstyles tune eva # tune + save your own"
    Write-Host ""
    Write-Host "More: https://github.com/fcreme/TerminalStyles" -ForegroundColor DarkGray
    Write-Host ""
}