[CmdletBinding()] param( [switch]$NoPush ) $ErrorActionPreference = 'Stop' $repositoryRoot = Split-Path -Parent $PSScriptRoot $skillFile = Join-Path $repositoryRoot 'SKILL.md' Set-Location -LiteralPath $repositoryRoot $pendingChanges = git status --porcelain if (-not $pendingChanges) { throw 'No skill changes are pending. Update the skill before creating a release.' } $content = Get-Content -LiteralPath $skillFile -Raw -Encoding UTF8 $match = [regex]::Match($content, '(?m)^Version:\s*(?\d+\.\d+\.\d+)\s*$') if (-not $match.Success) { throw "Could not find a 'Version: x.y.z' line in $skillFile." } $currentVersion = [version]$match.Groups['version'].Value $nextVersion = '{0}.{1}.0' -f $currentVersion.Major, ($currentVersion.Minor + 1) $updatedContent = [regex]::Replace( $content, '(?m)^Version:\s*\d+\.\d+\.\d+\s*$', "Version: $nextVersion", 1 ) Set-Content -LiteralPath $skillFile -Value $updatedContent -Encoding UTF8 git add --all if ($LASTEXITCODE -ne 0) { throw 'git add failed.' } git diff --cached --quiet if ($LASTEXITCODE -eq 0) { throw 'No staged changes found after version update.' } if ($LASTEXITCODE -ne 1) { throw 'Could not inspect the staged Git diff.' } git commit -m "release: xinje-plc-programming v$nextVersion" if ($LASTEXITCODE -ne 0) { throw 'git commit failed.' } if (-not $NoPush) { git push origin HEAD if ($LASTEXITCODE -ne 0) { throw 'Release commit was created, but git push failed. Resolve the remote issue and push the existing commit.' } } Write-Output "Released xinje-plc-programming v$nextVersion"