Private/Functions/ProviderHelpers.ps1

function Resolve-ForgeCommand {
    <#
    .SYNOPSIS
    Resolves the provider and returns the target command name.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]
        $CommandName,

        [Parameter()]
        # [ValidateSet([SupportedProvider])] <-- omitted on purpose, this is a key internal function
        [string]
        $Provider
    )

    $Resolved = Resolve-ForgeProvider -Provider $Provider -CommandName $CommandName

    $TargetCommand = $Resolved.Commands[$CommandName]
    if (-not $TargetCommand) {
        $Available = ($Resolved.Commands.Keys | Sort-Object) -join ', '
        throw "Provider '$($Resolved.Name)' does not support '$CommandName'. Available: $Available"
    }

    [PSCustomObject]@{
        Provider = $Resolved.Name
        Command  = $TargetCommand
    }
}

function Resolve-ForgeProvider {
    [CmdletBinding()]
    param(
        [Parameter()]
        [string]
        $Provider,

        [Parameter()]
        [string]
        $CommandName
    )

    $Resolved = $null

    # '.' means explicitly infer from git remote
    if ($Provider -eq '.') { $Provider = '' }

    # Explicit provider override
    if ($Provider) {
        $Key = $Provider.ToLower()
        if ($global:ForgeProviders.ContainsKey($Key)) {
            $Resolved = $global:ForgeProviders[$Key]
        } else {
            throw "Unknown provider: '$Provider'"
        }
    } else {
        # Auto-detect from git remote
        $Context = Get-ForgeRemoteHost
        if (-not $Context.Host) {
            throw @"
Could not detect a forge provider from the current directory.
Either cd into a git repository, or specify a provider:
  $CommandName -Provider github
  $CommandName -Provider gitlab
"@

        }

        # Match against registered providers
        foreach ($Key in $global:ForgeProviders.Keys) {
            $Registered = $global:ForgeProviders[$Key]
            foreach ($Pattern in $Registered.HostPatterns) {
                if ($Context.Host -match $Pattern) {
                    $Resolved = $Registered
                    break
                }
            }
            if ($Resolved) { break }
        }

        if (-not $Resolved) {
            $SupportedList = ($global:ForgeProviders.Keys) -join ', '
            throw @"
Unrecognized forge host: '$($Context.Host)'
Currently supported: $SupportedList
"@

        }
    }

    $Resolved.Name = $Key
    return $Resolved
}