XCom 2 bridge mod - https://steamcommunity.com/sharedfiles/filedetails/?id=2829105873
function CleanModAssetCookerOutput (
    [string] $sdkPath, # the path to your SDK installation ending in "XCOM 2 War of the Chosen SDK"
    [string] $modNameCanonical,
    [string[]] $sourceAssetsPaths # Intended for ContentForCook and CollectionMaps, but any folder that has .upk or .umap files will work
) {
    # TODO: duplicates the logic in build_common.ps1
    $actualTfcSuffix = "_$($modNameCanonical)_DLCTFC_XPACK_"
    $cookerOutputPath = [io.path]::combine($sdkPath, 'XComGame', 'Published', 'CookedPCConsole')

    if (!(Test-Path $cookerOutputPath)) {
        Write-Host "No Published\CookedPCConsole directory - nothing to clean"
        return
    }

    $modMaps = @()
    $modPackages = @()

    foreach ($assetPath in $sourceAssetsPaths) {
        Write-Host "Asset path: $assetPath"

        if (!(Test-Path $assetPath)) { continue }

        $pathMaps = @(Get-ChildItem -Path $assetPath -Filter '*.umap' -Recurse -Force | Select-Object -ExpandProperty BaseName)
        $pathPackages = @(Get-ChildItem -Path $assetPath -Filter '*.upk' -Recurse -Force | Select-Object -ExpandProperty BaseName)

        Write-Host "Path maps: $pathMaps"
        Write-Host "Path packages: $pathPackages"

        $modMaps += $pathMaps
        $modPackages += $pathPackages
    }

    Write-Host "Removing SeekFree maps: $modMaps"
    $modMaps | ForEach-Object { Remove-Item -Force -LiteralPath "$cookerOutputPath\$_.upk" -WarningAction SilentlyContinue -ErrorAction SilentlyContinue }

    Write-Host "Removing SeekFree standalone packages: $modPackages"
    $modPackages | ForEach-Object { Remove-Item -Force -LiteralPath "$cookerOutputPath\$($_)_SF.upk" -WarningAction SilentlyContinue -ErrorAction SilentlyContinue }

    Write-Host "Removing TFCs: $actualTfcSuffix"
    Remove-Item -Force "$cookerOutputPath\*$actualTfcSuffix.tfc" -WarningAction SilentlyContinue -ErrorAction SilentlyContinue

    Write-Host "Removing GuidCache"
    Remove-Item -Force "$cookerOutputPath\GuidCache_$modNameCanonical.upk" -WarningAction SilentlyContinue -ErrorAction SilentlyContinue
}

function TryCleanHlCookerOutput (
    [string] $sdkPath, # the path to your SDK installation ending in "XCOM 2 War of the Chosen SDK"
    [string] $modSrcPath # the path to [mod root]/[mod project]/Src
) {
    $nativeScriptPackagesNames = @("XComGame", "Core", "Engine", "GFxUI", "AkAudio", "GameFramework", "UnrealEd", "GFxUIEditor", "IpDrv", "OnlineSubsystemPC", "OnlineSubsystemLive", "OnlineSubsystemSteamworks", "OnlineSubsystemPSN")
    $cookerOutputPath = [io.path]::combine($sdkPath, 'XComGame', 'Published', 'CookedPCConsole')

    if (!(Test-Path $cookerOutputPath)) {
        Write-Host "No Published\CookedPCConsole directory - nothing to clean"
        return
    }

    #################################
    ### Check if this is a HL mod ###
    #################################

    if (!(Test-Path $modSrcPath)) {
        Write-Host "No Src directory in mod - this is not a HL mod"
        return
    }

    $modPackages = Get-ChildItem $modSrcPath -Directory | Select-Object -ExpandProperty "Name"
    $anyNative = $false

    foreach ($name in $modPackages)
    {
        if ($nativeScriptPackagesNames.Contains($name)) {
            $anyNative = $true
            break
        }
    }

    if (!$anyNative) {
        Write-Host $modPackages
        Write-Host "Not a highlander mod - skipping cleaning HL cooker output"
        return
    }

    #########################################
    ### Prepare a list of files to delete ###
    #########################################

    $filesToRemove = @()

    # Native script packages
    foreach ($package in $nativeScriptPackagesNames) {
        $filesToRemove += "$package.upk"
        $filesToRemove += "$package.upk.uncompressed_size"
    }

    # Startup (unlocalized)
    $filesToRemove += "Startup.upk"
    $filesToRemove += "Startup.upk.uncompressed_size"

    # Startup (localized)
    $gameLangs = @("INT", "FRA", "ITA", "DEU", "RUS", "POL", "KOR", "ESN")
    foreach ($lang in $gameLangs) {
        $filesToRemove += "Startup_LOC_$lang.upk"
        $filesToRemove += "Startup_LOC_$lang.upk.uncompressed_size"
    }

    # TFC files
    $tfcGroups = @("CharTextures", "Lighting", "Textures", "World")
    foreach ($tfcGroup in $tfcGroups) {
        # Unsuffixed
        $filesToRemove += "$tfcGroup.tfc"
        $filesToRemove += "$tfcGroup-a.tfc"

        # Suffixed
        $filesToRemove += "${tfcGroup}_XPACK_.tfc"
        $filesToRemove += "$tfcGroup-a_XPACK_.tfc"

        # TLE
        $filesToRemove += "${tfcGroup}_TLE_DLCTFC_XPACK_.tfc"
        $filesToRemove += "$tfcGroup-a_TLE_DLCTFC_XPACK_.tfc"
    }

    # Singletons
    $filesToRemove += "GuidCache.upk"
    $filesToRemove += "GlobalPersistentCookerData.upk"
    $filesToRemove += "PersistentCookerShaderData.bin"

    ######################
    ### Actual removal ###
    ######################

    Write-Host "Removing HL cooker output files from $cookerOutputPath"

    foreach ($file in $filesToRemove) {
        Write-Host "  .\$file"
        Remove-Item -Force "$cookerOutputPath\$file" -WarningAction SilentlyContinue -ErrorAction SilentlyContinue
    }
}