Public/Invoke-Gitt.ps1

<#
.SYNOPSIS
    Git helpers entry point mirroring git's subcommand style.
.DESCRIPTION
    Dispatches to GittHelpers module functions using git-style subcommand syntax.
 
    Supported subcommands:
        gitt clone <url> [args] -> Invoke-GitCloneBare
        gitt worktree add [args] -> New-GitWorktree
        gitt worktree remove <path> [args] -> Remove-GitWorktree
        gitt save -Message <msg> [args] -> Save-GitWorktree
        gitt sync [args] -> Sync-GitBranches
        gitt prune [args] -> Remove-StaleGitBranches
 
.EXAMPLE
    gitt clone https://github.com/org/repo.git
.EXAMPLE
    gitt worktree add -Feature login -Description "Add OAuth"
.EXAMPLE
    gitt worktree remove .\feature\login
.EXAMPLE
    gitt save -Message "Fix null ref"
.EXAMPLE
    gitt sync
.EXAMPLE
    gitt prune -DryRun
#>

function Invoke-Gitt {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, Position = 0)]
        [string] $Subcommand,

        [Parameter(Position = 1, ValueFromRemainingArguments)]
        [object[]] $Arguments
    )

    switch ($Subcommand.ToLowerInvariant()) {
        'clone' {
            Invoke-GitCloneBare @Arguments
        }
        'worktree' {
            if (-not $Arguments -or $Arguments.Count -eq 0) {
                Write-Error "Usage: gitt worktree <add|remove> [args]"
                return
            }
            $action    = $Arguments[0].ToString().ToLowerInvariant()
            $remaining = if ($Arguments.Count -gt 1) { $Arguments[1..($Arguments.Count - 1)] } else { @() }
            $parsed    = ConvertTo-ParamHashtable -ArgumentList $remaining
            $named     = $parsed.Named
            $pos       = $parsed.Positional

            switch ($action) {
                'add'    { New-GitWorktree    @named @pos }
                'remove' { Remove-GitWorktree @named @pos }
                default  { Write-Error "Unknown worktree action '$action'. Use: add, remove" }
            }
        }
        'save' {
            $parsed  = ConvertTo-ParamHashtable -ArgumentList $Arguments
            $named   = $parsed.Named
            $pos     = $parsed.Positional
            Save-GitWorktree @named @pos
        }
        'sync' {
            Sync-GitBranches @Arguments
        }
        'prune' {
            Remove-StaleGitBranches @Arguments
        }
        default {
            Write-Error "Unknown subcommand '$Subcommand'. Valid subcommands: clone, worktree, save, sync, prune"
        }
    }
}

Set-Alias -Name gitt -Value Invoke-Gitt