Private/Write-ProjectVersion.ps1

<#
.SYNOPSIS
    Writes a version to a project's native file.
.DESCRIPTION
    Updates the version in the appropriate ecosystem file.
.PARAMETER Version
    The new version string (without 'v' prefix).
.PARAMETER ProjectType
    Project type object from Get-ProjectType.
#>

function Write-ProjectVersion {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Version,

        [Parameter(Mandatory)]
        [PSCustomObject]$ProjectType
    )

    # Strip v prefix if present
    $cleanVersion = $Version -replace '^v', ''

    switch ($ProjectType.Type) {
        'PowerShell' {
            $content = Get-Content -Path $ProjectType.File -Raw
            $content = $content -replace "ModuleVersion\s*=\s*'[^']+'", "ModuleVersion = '$cleanVersion'"
            Set-Content -Path $ProjectType.File -Value $content -NoNewline
        }
        'DotNet' {
            [xml]$csproj = Get-Content -Path $ProjectType.File -Raw
            $propertyGroup = $csproj.Project.PropertyGroup | Where-Object { $_.Version -or $_.PackageVersion } | Select-Object -First 1
            if (-not $propertyGroup) {
                $propertyGroup = $csproj.Project.PropertyGroup | Select-Object -First 1
            }
            if ($propertyGroup.Version) {
                $propertyGroup.Version = $cleanVersion
            }
            else {
                $versionElement = $csproj.CreateElement('Version')
                $versionElement.InnerText = $cleanVersion
                $propertyGroup.AppendChild($versionElement) | Out-Null
            }
            $csproj.Save($ProjectType.File)
        }
        'Node' {
            $pkg = Get-Content -Path $ProjectType.File -Raw | ConvertFrom-Json
            $pkg.version = $cleanVersion
            $pkg | ConvertTo-Json -Depth 100 | Set-Content -Path $ProjectType.File -NoNewline
        }
        'Python' {
            $content = Get-Content -Path $ProjectType.File -Raw
            $content = $content -replace 'version\s*=\s*"[^"]+"', "version = `"$cleanVersion`""
            Set-Content -Path $ProjectType.File -Value $content -NoNewline
        }
        default {
            throw "Cannot write version: unsupported project type '$($ProjectType.Type)'"
        }
    }
}