private/Update-TaskCache.ps1

function Update-TaskCache {
    <#
    .SYNOPSIS
    Writes a cache entry after successful task execution.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [PsakeTask]$Task,

        [Parameter(Mandatory = $true)]
        [PsakeBuildPlan]$Plan
    )

    Write-Debug "Updating cache for task '$($Task.Name)'"
    if ($null -eq $Task.Inputs) {
        return
    }

    # Ensure cache directory exists
    if (-not (Test-Path $Plan.CacheDir)) {
        $null = New-Item -Path $Plan.CacheDir -ItemType Directory -Force
    }

    $inputHash = if ($Task.InputHash) { $Task.InputHash } else { Get-InputHash -Task $Task -Plan $Plan }
    $Plan.InputHashes[$Task.Name.ToLower()] = $inputHash

    $inputFiles = Resolve-TaskFiles -FileSpec $Task.Inputs
    $outputFiles = Resolve-TaskFiles -FileSpec $Task.Outputs

    $cacheEntry = @{
        TaskName    = $Task.Name
        InputHash   = $inputHash
        Timestamp   = [datetime]::UtcNow.ToString('o')
        InputFiles  = $inputFiles
        OutputFiles = $outputFiles
    }

    $cacheFile = Join-Path $Plan.CacheDir "$($Task.Name.ToLower()).json"
    $cacheEntry | ConvertTo-Json -Depth 3 | Set-Content -Path $cacheFile -Encoding UTF8
    Write-Debug "Cache written to '$cacheFile' with hash '$inputHash'"
}