Public/OSDCloud/OSDPad.ps1

function Get-OSDPad {
    <#
    .SYNOPSIS
    Gets information returned by Get-OSDPad.
 
    .DESCRIPTION
    Provides the implementation for Get-OSDPad.
 
    .PARAMETER RepoOwner
    Specifies the value for RepoOwner.
 
    .PARAMETER RepoName
    Specifies the value for RepoName.
 
    .PARAMETER RepoFolder
    Specifies the value for RepoFolder.
 
    .PARAMETER OAuth
    Specifies the value for OAuth.
 
    .PARAMETER Brand
    Specifies the value for Brand.
 
    .PARAMETER Color
    Specifies the value for Color.
 
    .PARAMETER Hide
    Specifies the value for Hide.
 
    .EXAMPLE
    Get-OSDPad -RepoOwner <RepoOwner> -RepoName <RepoName>
    Runs Get-OSDPad with common parameters.
 
    .NOTES
    Author: David Segura - Recast Software
    2026-07-09 - Updated comment-based help
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/docs
    #>

    [CmdletBinding(DefaultParameterSetName = 'Standalone')]
    param (
        [Parameter(ParameterSetName = 'GitHub', Mandatory = $true, Position = 0)]
        [Alias('Owner','GitOwner')]
        [string]$RepoOwner,
        
        [Parameter(ParameterSetName = 'GitHub', Mandatory = $true, Position = 1)]
        [Alias('Repository','GitRepo')]
        [string]$RepoName,
        
        [Parameter(ParameterSetName = 'GitHub', Position = 2)]
        [Alias('GitPath','Folder')]
        [string]$RepoFolder,
        
        [Parameter(ParameterSetName = 'GitHub')]
        [Alias('OAuthToken')]
        [string]$OAuth,

        [Alias('BrandingTitle')]
        [string]$Brand = 'OSDPad',
        [Alias('BrandingColor')]
        [string]$Color = '#01786A',
        
        [ValidateSet('Branding','Script')]
        [string[]]$Hide
    )
    #================================================
    # Branding
    #================================================
    $Global:OSDPadBranding = $null
    $Global:OSDPadBranding = @{
        Title   = $Brand
        Color   = $Color
    }
    #================================================
    # Certificate Workaround
    #================================================
    #region: Workaround for SelfSigned Cert and force TLS 1.2
Add-Type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
    public bool CheckValidationResult(
        ServicePoint srvPoint, X509Certificate certificate,
        WebRequest request, int certificateProblem) {
        return true;
    }
}
"@

    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
    [System.Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    #endregion
    #================================================
    # GitHub
    #================================================
    if ($PSCmdlet.ParameterSetName -eq 'GitHub') {
        $Uri = "https://api.github.com/repos/$RepoOwner/$RepoName/contents/$RepoFolder"
        Write-Host -ForegroundColor DarkCyan $Uri

        if ($OAuth) {
            $Params = @{
                Headers = @{Authorization = "Bearer $OAuth"}
                Method = 'GET'
                Uri = $Uri
                UseBasicParsing = $true
            }
        }
        else {
            $GitHubApiRateLimit = Invoke-RestMethod -UseBasicParsing -Uri 'https://api.github.com/rate_limit' -Method Get
            Write-Host -ForegroundColor DarkGray "You have used $($GitHubApiRateLimit.rate.used) of your $($GitHubApiRateLimit.rate.limit) GitHub API Requests"
            Write-Host -ForegroundColor DarkGray "You can create an OAuth Token at https://github.com/settings/tokens"
            Write-Host -ForegroundColor DarkGray 'Use the OAuth parameter to enable OSDPad Child-Item support'
            $Params = @{
                Method = 'GET'
                Uri = $Uri
                UseBasicParsing = $true
            }
        }

        $GitHubApiContent = @()
        try {
            $GitHubApiContent = Invoke-RestMethod @Params -ErrorAction Stop
        }
        catch {
            Write-Warning $_
            Break
        }      
        
        if ($OAuth) {
            foreach ($Item in $GitHubApiContent) {
                if ($Item.type -eq 'dir') {
                    Write-Host -ForegroundColor DarkCyan $Item.url
                    $GitHubApiContent += Invoke-RestMethod -UseBasicParsing -Uri $Item.url -Method Get -Headers @{Authorization = "Bearer $OAuth" }
                }
            }
        }

        #$GitHubApiContent = $GitHubApiContent | Where-Object {$_.type -eq 'file'} | Where-Object {($_.name -match 'README.md') -or ($_.name -like "*.ps1")}
        $GitHubApiContent = $GitHubApiContent | Where-Object {($_.type -eq 'dir') -or ($_.name -like "*.md") -or ($_.name -like "*.ps1")}

        Write-Host -ForegroundColor DarkGray "========================================================================="
        $Results = foreach ($Item in $GitHubApiContent) {
            #$FileContent = Invoke-RestMethod -UseBasicParsing -Uri $Item.git_url
            if ($Item.type -eq 'dir') {
                Write-Host -ForegroundColor DarkCyan "GitHub Directory: OSDPad $RepoOwner $RepoName $($Item.name)"
                
                $ObjectProperties = @{
                    RepoOwner       = $RepoOwner
                    RepoName        = $RepoName
                    RepoFolder      = $RepoFolder
                    Name            = $Item.name
                    Type            = $Item.type
                    Guid            = New-Guid
                    Path            = $Item.path
                    Size            = $Item.size
                    SHA             = $Item.sha
                    Git             = $Item.git_url
                    Download        = $Item.download_url
                    ContentRAW      = $null
                    #NodeId = $FileContent.node_id
                    #Content = $FileContent.content
                    #Encoding = $FileContent.encoding
                }
                #New-Object -TypeName PSObject -Property $ObjectProperties
            }
            else {
                Write-Host -ForegroundColor DarkGray $Item.download_url
                try {
                    $ScriptWebRequest = Invoke-WebRequest -Uri $Item.download_url -UseBasicParsing -ErrorAction Ignore
                }
                catch {
                    Write-Warning $_
                    $ScriptWebRequest = $null
                    Continue
                }
        
                $ObjectProperties = @{
                    RepoOwner       = $RepoOwner
                    RepoName        = $RepoName
                    RepoFolder      = $RepoFolder
                    Name            = $Item.name
                    Type            = $Item.type
                    Guid            = New-Guid
                    Path            = $Item.path
                    Size            = $Item.size
                    SHA             = $Item.sha
                    Git             = $Item.git_url
                    Download        = $Item.download_url
                    ContentRAW      = $ScriptWebRequest.Content
                    #NodeId = $FileContent.node_id
                    #Content = $FileContent.content
                    #Encoding = $FileContent.encoding
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }
        }
        $Global:OSDPad = $Results
        
    }
    else {
        $Global:OSDPad = $null
    }
    #================================================
    # OSDPad.ps1
    #================================================
    & "$($MyInvocation.MyCommand.Module.ModuleBase)\Projects\OSDPad.ps1"
    #================================================
}
function Start-OSDCloudToolbox {
    <#
    .SYNOPSIS
    Starts the workflow for Start-OSDCloudToolbox.
 
    .DESCRIPTION
    Provides the implementation for Start-OSDCloudToolbox.
 
    .PARAMETER RepoFolder
    Specifies the value for RepoFolder.
 
    .PARAMETER OAuth
    Specifies the value for OAuth.
 
    .EXAMPLE
    Start-OSDCloudToolbox -RepoFolder <RepoFolder> -OAuth <OAuth>
    Runs Start-OSDCloudToolbox with common parameters.
 
    .NOTES
    Author: David Segura - Recast Software
    2026-07-09 - Updated comment-based help
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/docs
    #>

    [CmdletBinding()]
    param (
        [Parameter(Position = 0)]
        [string]$RepoFolder,

        [Alias('OAuthToken')]
        [string]$OAuth
    )
    #region Initialize

    #Start the Transcript
    $Transcript = "$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Toolbox.log"
    $null = Start-Transcript -Path (Join-Path "$env:SystemRoot\Temp" $Transcript) -ErrorAction Ignore

    #Determine the proper Windows environment
    if ($env:SystemDrive -eq 'X:') { $WindowsPhase = 'WinPE' }
    else {
        $ImageState = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\State' -ErrorAction Ignore).ImageState
        if ($env:UserName -eq 'defaultuser0') { $WindowsPhase = 'OOBE' }
        elseif ($ImageState -eq 'IMAGE_STATE_SPECIALIZE_RESEAL_TO_OOBE') { $WindowsPhase = 'Specialize' }
        elseif ($ImageState -eq 'IMAGE_STATE_SPECIALIZE_RESEAL_TO_AUDIT') { $WindowsPhase = 'AuditMode' }
        else { $WindowsPhase = 'Windows' }
    }

    #Finish initialization
    Write-Host -ForegroundColor DarkGray "WindowsPhase: $WindowsPhase"
    if (-not ($RepoFolder)) {
        $RepoFolder = $WindowsPhase
    }

    #Load OSDCloud Functions
    #Invoke-Expression -Command (Invoke-RestMethod -Uri functions.osdcloud.com)

    #endregion
    
    #region Run Command
    if ($OAuth) {
        $OSDPadParams = @{
            Brand      = "OSDCloud Toolbox - $RepoFolder"
            RepoOwner  = 'OSDeploy'
            RepoName   = 'OSDCloudToolbox'
            RepoFolder = $RepoFolder
            OAuth      = $OAuth
        }
    }
    else {
        $OSDPadParams = @{
            Brand      = "OSDCloud Toolbox - $RepoFolder"
            RepoOwner  = 'OSDeploy'
            RepoName   = 'OSDCloudToolbox'
            RepoFolder = $RepoFolder
        }
    }
    Start-OSDPad @OSDPadParams
    #endregion
}
function Start-OSDCloudCommunity {
    <#
    .SYNOPSIS
    Starts the workflow for Start-OSDCloudCommunity.
 
    .DESCRIPTION
    Provides the implementation for Start-OSDCloudCommunity.
 
    .PARAMETER RepoFolder
    Specifies the value for RepoFolder.
 
    .PARAMETER OAuth
    Specifies the value for OAuth.
 
    .EXAMPLE
    Start-OSDCloudCommunity -RepoFolder <RepoFolder> -OAuth <OAuth>
    Runs Start-OSDCloudCommunity with common parameters.
 
    .NOTES
    Author: David Segura - Recast Software
    2026-07-09 - Updated comment-based help
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/docs
    #>

    [CmdletBinding()]
    param (
        [Parameter(Position = 0)]
        [string]$RepoFolder,

        [Alias('OAuthToken')]
        [string]$OAuth
    )
    #region Initialize

    #Start the Transcript
    $Transcript = "$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Toolbox.log"
    $null = Start-Transcript -Path (Join-Path "$env:SystemRoot\Temp" $Transcript) -ErrorAction Ignore

    #Determine the proper Windows environment
    if ($env:SystemDrive -eq 'X:') { $WindowsPhase = 'WinPE' }
    else {
        $ImageState = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\State' -ErrorAction Ignore).ImageState
        if ($env:UserName -eq 'defaultuser0') { $WindowsPhase = 'OOBE' }
        elseif ($ImageState -eq 'IMAGE_STATE_SPECIALIZE_RESEAL_TO_OOBE') { $WindowsPhase = 'Specialize' }
        elseif ($ImageState -eq 'IMAGE_STATE_SPECIALIZE_RESEAL_TO_AUDIT') { $WindowsPhase = 'AuditMode' }
        else { $WindowsPhase = 'Windows' }
    }

    #Finish initialization
    Write-Host -ForegroundColor DarkGray "WindowsPhase: $WindowsPhase"
    if (-not ($RepoFolder)) {
        $RepoFolder = $WindowsPhase
    }

    #Load OSDCloud Functions
    #Invoke-Expression -Command (Invoke-RestMethod -Uri functions.osdcloud.com)

    #endregion
    
    #region Run Command
    if ($OAuth) {
        $OSDPadParams = @{
            Brand      = "OSDCloud Toolbox - $RepoFolder"
            RepoOwner  = 'OSDeploy'
            RepoName   = 'OSDCloudToolbox'
            RepoFolder = $RepoFolder
            OAuth      = $OAuth
        }
    }
    else {
        $OSDPadParams = @{
            Brand      = "OSDCloud Toolbox - $RepoFolder"
            RepoOwner  = 'OSDeploy'
            RepoName   = 'OSDCloudToolbox'
            RepoFolder = $RepoFolder
        }
    }
    Start-OSDPadC @OSDPadParams
    #endregion
}
function Start-OSDeployPad {
    <#
    .SYNOPSIS
    Starts the workflow for Start-OSDeployPad.
 
    .DESCRIPTION
    Provides the implementation for Start-OSDeployPad.
 
    .PARAMETER RepoFolder
    Specifies the value for RepoFolder.
 
    .PARAMETER OAuth
    Specifies the value for OAuth.
 
    .EXAMPLE
    Start-OSDeployPad -RepoFolder <RepoFolder> -OAuth <OAuth>
    Runs Start-OSDeployPad with common parameters.
 
    .NOTES
    Author: David Segura - Recast Software
    2026-07-09 - Updated comment-based help
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/docs
    #>

    [CmdletBinding()]
    param (
        [Parameter(Position = 0)]
        [string]$RepoFolder,

        [Alias('OAuthToken')]
        [string]$OAuth
    )

    if ($OAuth) {
        $OSDPadParams = @{
            Brand      = "OSDeploy OSDPad $RepoFolder"
            RepoOwner  = 'OSDeploy'
            RepoName   = 'OSDPad'
            RepoFolder = $RepoFolder
            OAuth      = $OAuth
        }
    }
    else {
        $OSDPadParams = @{
            Brand      = "OSDeploy OSDPad $RepoFolder"
            RepoOwner  = 'OSDeploy'
            RepoName   = 'OSDPad'
            RepoFolder = $RepoFolder
        }
    }
    Start-OSDPad @OSDPadParams
}
function Start-OSDPad {
    <#
    .SYNOPSIS
    Starts the workflow for Start-OSDPad.
 
    .DESCRIPTION
    Provides the implementation for Start-OSDPad.
 
    .PARAMETER RepoOwner
    Specifies the value for RepoOwner.
 
    .PARAMETER RepoName
    Specifies the value for RepoName.
 
    .PARAMETER RepoFolder
    Specifies the value for RepoFolder.
 
    .PARAMETER RepoDomain
    Specifies the value for RepoDomain.
 
    .PARAMETER OAuth
    Specifies the value for OAuth.
 
    .PARAMETER Brand
    Specifies the value for Brand.
 
    .PARAMETER Color
    Specifies the value for Color.
 
    .PARAMETER Hide
    Specifies the value for Hide.
 
    .EXAMPLE
    Start-OSDPad -RepoOwner <RepoOwner> -RepoName <RepoName> -RepoDomain <RepoDomain>
    Runs Start-OSDPad with common parameters.
 
    .NOTES
    Author: David Segura - Recast Software
    2026-07-09 - Updated comment-based help
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/docs
    #>

    [CmdletBinding(DefaultParameterSetName = 'Standalone')]
    param (
        [Parameter(ParameterSetName = 'GitHub', Mandatory = $true, Position = 0)]
        [Alias('Owner', 'GitOwner')]
        [string]$RepoOwner,
        
        [Parameter(ParameterSetName = 'GitHub', Mandatory = $true, Position = 1)]
        [Parameter(ParameterSetName = 'GitLab', Mandatory = $true, Position = 0)]        
        [Alias('Repository', 'GitRepo')]
        [string]$RepoName,
        
        [Parameter(ParameterSetName = 'GitHub', Position = 2)]
        [Parameter(ParameterSetName = 'GitLab', Position = 1)]
        [Alias('GitPath', 'Folder')]
        [string]$RepoFolder,
        
        [Parameter(ParameterSetName = 'GitLab', Mandatory = $true)]
        [Alias('GitLabUri')]
        [string]$RepoDomain,

        [Parameter(ParameterSetName = 'GitHub')]
        [Parameter(ParameterSetName = 'GitLab')]
        [Alias('OAuthToken')]
        [string]$OAuth,

        [Alias('BrandingTitle')]
        [string]$Brand = 'OSDPad',

        [Alias('BrandingColor')]
        [string]$Color = '#01786A',
        
        [ValidateSet('Branding', 'Script')]
        [string[]]$Hide
    )
    #================================================
    # Branding
    #================================================
    $Global:OSDPadBranding = $null
    $Global:OSDPadBranding = @{
        Title = $Brand
        Color = $Color
    }
    #================================================
    # GitHub
    #================================================
    if ($PSCmdlet.ParameterSetName -eq 'GitHub') {
        $RepoType = 'GitHub'

        # Set api URL
        if ($RepoFolder) {
            $Uri = "https://api.github.com/repos/$RepoOwner/$RepoName/contents/$RepoFolder"
        }
        else {
            $Uri = "https://api.github.com/repos/$RepoOwner/$RepoName/contents"
        }
        Write-Host -ForegroundColor DarkCyan $Uri

        if ($OAuth) {
            $Params = @{
                Headers         = @{Authorization = "Bearer $OAuth" }
                Method          = 'GET'
                Uri             = $Uri
                UseBasicParsing = $true
            }
        }
        else {
            $GitHubApiRateLimit = Invoke-RestMethod -UseBasicParsing -Uri 'https://api.github.com/rate_limit' -Method Get
            Write-Host -ForegroundColor DarkGray "You have used $($GitHubApiRateLimit.rate.used) of your $($GitHubApiRateLimit.rate.limit) GitHub API Requests"
            Write-Host -ForegroundColor DarkGray 'You can create an OAuth Token at https://github.com/settings/tokens'
            Write-Host -ForegroundColor DarkGray 'Use the OAuth parameter to enable OSDPad Child-Item support'
            $Params = @{
                Method          = 'GET'
                Uri             = $Uri
                UseBasicParsing = $true
            }
        }

        $GitHubApiContent = @()
        try {
            $GitHubApiContent = Invoke-RestMethod @Params -ErrorAction Stop
        }
        catch {
            Write-Warning $_
            Break
        }      
        
        if ($OAuth) {
            foreach ($Item in $GitHubApiContent) {
                if ($Item.type -eq 'dir') {
                    Write-Host -ForegroundColor DarkCyan $Item.url
                    $GitHubApiContent += Invoke-RestMethod -UseBasicParsing -Uri $Item.url -Method Get -Headers @{Authorization = "Bearer $OAuth" }
                }
            }
        }

        $GitHubApiContent = $GitHubApiContent | Where-Object { ($_.type -eq 'dir') -or ($_.name -like '*.md') -or ($_.name -like '*.ps1') }

        Write-Host -ForegroundColor DarkGray '========================================================================='
        $Results = foreach ($Item in $GitHubApiContent) {
            #$FileContent = Invoke-RestMethod -UseBasicParsing -Uri $Item.git_url
            if ($Item.type -eq 'dir') {
                Write-Host -ForegroundColor DarkCyan "Directory: Start-OSDPad $RepoOwner $RepoName $($Item.name)"
                
                $ObjectProperties = @{
                    RepoOwner  = $RepoOwner
                    RepoName   = $RepoName
                    RepoFolder = $RepoFolder
                    Name       = $Item.name
                    Type       = $Item.type
                    Guid       = New-Guid
                    Path       = $Item.path
                    Size       = $Item.size
                    SHA        = $Item.sha
                    Git        = $Item.git_url
                    Download   = $Item.download_url
                    ContentRAW = $null
                    #NodeId = $FileContent.node_id
                    #Content = $FileContent.content
                    #Encoding = $FileContent.encoding
                }
                #New-Object -TypeName PSObject -Property $ObjectProperties
            }
            else {
                Write-Host -ForegroundColor DarkGray $Item.download_url
                try {
                    $ScriptWebRequest = Invoke-WebRequest -Uri $Item.download_url -UseBasicParsing -ErrorAction Ignore
                }
                catch {
                    Write-Warning $_
                    $ScriptWebRequest = $null
                    Continue
                }
        
                $ObjectProperties = @{
                    RepoType   = $RepoType
                    RepoOwner  = $RepoOwner
                    RepoName   = $RepoName
                    RepoFolder = $RepoFolder
                    Name       = $Item.name
                    Type       = $Item.type
                    Guid       = New-Guid
                    Path       = $Item.path
                    Size       = $Item.size
                    SHA        = $Item.sha
                    Git        = $Item.git_url
                    Download   = $Item.download_url
                    ContentRAW = $ScriptWebRequest.Content
                    #NodeId = $FileContent.node_id
                    #Content = $FileContent.content
                    #Encoding = $FileContent.encoding
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }
        }
        $Global:OSDPad = $Results
        
    }
    #================================================
    # GitLab
    #================================================
    elseif ($PSCmdlet.ParameterSetName -eq 'GitLab') {        
        $RepoType = 'GitLab'
        $RestAPI = "api/v4/projects/$RepoName/repository/tree?path=$RepoFolder&recursive=true"
        $Uri = "https://$RepoDomain/$RestAPI"       
        Write-Host -ForegroundColor DarkCyan $Uri
        
        $Params = @{
            Method          = 'GET'
            Uri             = $Uri
            UseBasicParsing = $true
        }
        If ($OAuth) { 
            $Params.add('Headers', @{'PRIVATE-TOKEN' = "$OAuth" }) 
        }  
        
        $GitLabApiContent = @()
        try {
            $GitLabApiContent = Invoke-RestMethod @Params -ErrorAction Stop
        }
        catch {
            Write-Warning $_
            Break
        }      

        $GitLabApiContent = $GitLabApiContent | Where-Object { ($_.name -like '*.md') -or ($_.name -like '*.ps1') }
        
        Write-Host -ForegroundColor DarkGray '========================================================================='
        $Results = foreach ($Item in $GitLabApiContent) {
            #$FileContent = Invoke-RestMethod -UseBasicParsing -Uri $Item.git_url
            if ($Item.type -eq 'tree') {
                Write-Host -ForegroundColor DarkCyan "Directory: Start-OSDPad $RepoDomain $RepoName $($Item.name)"
                
                $ObjectProperties = @{
                    RepoOwner  = $RepoOwner
                    RepoName   = $RepoName
                    RepoFolder = $RepoFolder
                    Name       = $Item.name
                    Type       = $Item.type
                    Guid       = New-Guid
                    Path       = $Item.path
                    Size       = $Item.size
                    SHA        = $Item.sha
                    Git        = $Item.git_url
                    Download   = $Item.download_url
                    ContentRAW = $null
                    #NodeId = $FileContent.node_id
                    #Content = $FileContent.content
                    #Encoding = $FileContent.encoding
                }
                #New-Object -TypeName PSObject -Property $ObjectProperties
            }
            else {
                $filePath = [System.Web.HttpUtility]::UrlEncode($Item.path)
                $RestAPI = "api/v4/projects/$RepoName/repository/files/$filePath/raw?ref=main"
                $Uri = "https://$RepoDomain/$RestAPI"
                Write-Host -ForegroundColor DarkGray $Uri
                
                $Params = @{
                    Method          = 'GET'
                    Uri             = $Uri
                    UseBasicParsing = $true
                }
                IF ($OAuth) { 
                    $Params.add('Headers', @{'PRIVATE-TOKEN' = "$OAuth" }) 
                }                

                try {
                    $ScriptWebRequest = Invoke-RestMethod @Params -ErrorAction Ignore
                }
                catch {
                    Write-Warning $_
                    $ScriptWebRequest = $null
                    Continue
                }
        
                $ObjectProperties = @{
                    RepoType   = $RepoType
                    RepoDomain = $RepoDomain
                    #RepoOwner = $RepoOwner
                    RepoName   = $RepoName
                    RepoFolder = $RepoFolder
                    Name       = $Item.name
                    Type       = $Item.type
                    Guid       = $Item.id
                    Path       = $Item.path
                    #Size = $Item.size
                    #SHA = $Item.sha
                    #Git = $Item.git_url
                    #Download = $Item.download_url
                    ContentRAW = $ScriptWebRequest
                    #NodeId = $FileContent.node_id
                    #Content = $FileContent.content
                    #Encoding = $FileContent.encoding
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }
        }
        $Global:OSDPad = $Results
    }
    else {
        $Global:OSDPad = $null
    }
    #================================================
    # OSDPad.ps1
    #================================================
    & "$($MyInvocation.MyCommand.Module.ModuleBase)\Projects\OSDPad.ps1"
    #================================================
}
function Start-OSDPadCategories {
    <#
    .SYNOPSIS
    Starts the workflow for Start-OSDPadCategories.
 
    .DESCRIPTION
    Provides the implementation for Start-OSDPadCategories.
 
    .PARAMETER RepoOwner
    Specifies the value for RepoOwner.
 
    .PARAMETER RepoName
    Specifies the value for RepoName.
 
    .PARAMETER OAuth
    Specifies the value for OAuth.
 
    .EXAMPLE
    Start-OSDPadCategories -RepoOwner <RepoOwner> -RepoName <RepoName>
    Runs Start-OSDPadCategories with common parameters.
 
    .NOTES
    Author: David Segura - Recast Software
    2026-07-09 - Updated comment-based help
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/docs
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias('Owner', 'GitOwner')]
        [string]$RepoOwner,
        
        [Parameter(Mandatory = $true, Position = 1)]     
        [Alias('Repository', 'GitRepo')]
        [string]$RepoName,

        [Parameter(ParameterSetName = 'GitHub')]
        [Alias('OAuthToken')]
        [string]$OAuth
    )
    #================================================
    # Set Global Variables
    #================================================
    $Global:OSDPadRepository = @{
        Owner = $RepoOwner
        Name  = $RepoName
    }
    $Global:OSDPadBranding = @{
        Title = $RepoName
        Color = '#01786A'
    }
    #================================================
    # GitHub
    #================================================
    # Set Params
    $Params = @{
        Method          = 'GET'
        Uri             = "https://api.github.com/repos/$RepoOwner/$RepoName/contents"
        UseBasicParsing = $true
    }

    if ($OAuth) {
        $Params.add('Headers', @{'PRIVATE-TOKEN' = "$OAuth" })
    }
    else {
        $GitHubApiRateLimit = Invoke-RestMethod -UseBasicParsing -Uri 'https://api.github.com/rate_limit' -Method Get
        Write-Host -ForegroundColor DarkGray "You have used $($GitHubApiRateLimit.rate.used) of your $($GitHubApiRateLimit.rate.limit) GitHub API Requests"
        Write-Host -ForegroundColor DarkGray 'You can create an OAuth Token at https://github.com/settings/tokens'
    }


    $Global:OSDPadCategories = @()
    try {
        $Global:OSDPadCategories = Invoke-RestMethod @Params -ErrorAction Stop
    }
    catch {
        Write-Warning $_
        Break
    }
    $Global:OSDPadCategories = $Global:OSDPadCategories | Where-Object { ($_.type -eq 'dir') } | Sort-Object Name
    $Global:OSDPad = $null
    #================================================
    # OSDPadCategories.ps1
    #================================================
    & "$($MyInvocation.MyCommand.Module.ModuleBase)\Projects\OSDPadCategories.ps1"
    #================================================
}