private/Resolve-TaskFiles.ps1

function Resolve-TaskFiles {
    <#
    .SYNOPSIS
    Resolves a task's Inputs or Outputs to a list of file paths.

    .DESCRIPTION
    Accepts either a string array of glob patterns or a scriptblock that returns
    file paths. Scriptblocks are evaluated at call time, enabling dynamic file
    resolution based on configuration, environment, or other runtime state.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [AllowNull()]
        $FileSpec
    )

    if ($null -eq $FileSpec) {
        Write-Debug "FileSpec is null, returning empty array"
        return @()
    }

    # Scriptblock: evaluate and collect results
    if ($FileSpec -is [scriptblock]) {
        Write-Debug "Resolving files via scriptblock"
        $results = @(& $FileSpec)
        # Flatten — the scriptblock may return FileInfo objects, strings, or mixed
        return @($results | ForEach-Object {
            if ($_ -is [System.IO.FileInfo] -or $_ -is [System.IO.DirectoryInfo]) {
                $_.FullName
            } elseif ($_ -is [System.Management.Automation.PathInfo]) {
                $_.Path
            } else {
                [string]$_
            }
        })
    }

    # String or string array: resolve as glob patterns
    Write-Debug "Resolving files via glob patterns: $($FileSpec -join ', ')"
    $patterns = @($FileSpec)
    $files = @()
    foreach ($pattern in $patterns) {
        $resolved = @(Resolve-Path $pattern -ErrorAction SilentlyContinue)
        $files += $resolved | ForEach-Object { $_.Path }
    }
    return $files
}