Compare commits

..

4 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
8329fb8275 docs: replace AppVeyor references with GitHub Actions build artifact links 2026-06-10 08:14:01 +00:00
David Refoua
27e27cae14 conf: restore the clink's "gray text" auto-suggestions display
The [`autosuggest.inline` feature](https://chrisant996.github.io/clink/clink.html#inline-suggestions) was disabled by default from the config in **a breaking change** from https://github.com/chrisant996/clink/releases/tag/v1.9.20 and later
2026-06-03 11:07:08 +03:30
David Refoua
4763821a77 Merge pull request #3079 from cmderdev/dependabot/github_actions/softprops/action-gh-release-3
Bump softprops/action-gh-release from 2 to 3
2026-04-15 03:23:59 +03:30
dependabot[bot]
ddaa2f1c4e Bump softprops/action-gh-release from 2 to 3
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 17:07:56 +00:00
6 changed files with 43 additions and 335 deletions

View File

@@ -56,7 +56,7 @@ jobs:
$actualBranchName = $refName
$branchLink = ""
$prLink = ""
# Check if this is a PR merge ref (e.g., "3061/merge")
if ($refName -match '^(\d+)/(merge|head)$') {
$prNumber = $Matches[1]
@@ -196,7 +196,7 @@ jobs:
run: |
# Source utility functions
. scripts/utils.ps1
$summary = @"
### 🗃️ Artifacts
@@ -208,7 +208,7 @@ jobs:
# Get all files from the build directory (excluding directories and hidden files)
if (Test-Path "build") {
$buildFiles = Get-ChildItem -Path "build" -File | Where-Object { -not $_.Name.StartsWith('.') } | Sort-Object Name
foreach ($file in $buildFiles) {
$artifact = $file.Name
$path = $file.FullName
@@ -242,7 +242,7 @@ jobs:
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Create Release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
files: |
build/cmder.zip

View File

@@ -6,10 +6,6 @@ on:
# At 13:37 UTC every day.
- cron: '37 13 * * *'
concurrency:
group: vendor-update
cancel-in-progress: false
defaults:
run:
shell: pwsh
@@ -49,223 +45,64 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose
# Export count of updated packages (update.ps1 is expected to set $count)
if (-not ($count)) { $count = 0 }
Set-GHVariable -Name COUNT_UPDATED -Value $count
$newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
# Source utility functions
. scripts/utils.ps1
$listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | :---: | :---: |`n"
$majorUpdates = @()
$singleDepName = ""
$singleDepOldVersion = ""
$singleDepNewVersion = ""
foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
# Store single dependency info for messages (only if this is the only update)
if ($count -eq 1) {
$singleDepName = $s.name
$singleDepOldVersion = $oldVersion
$singleDepNewVersion = $s.version
}
# Determine change type and emoji using shared function
$result = Get-VersionChangeType -OldVersion $oldVersion -NewVersion $s.version
$changeType = $result.ChangeType
$emoji = $result.Emoji
$isMajor = $result.IsMajor
# Track major updates for changelog section
if ($isMajor) {
$compareUrl = "$repoUrl/compare/v$oldVersion...v$($s.version)"
$majorUpdates += @{
name = $s.name
oldVersion = $oldVersion
newVersion = $s.version
compareUrl = $compareUrl
repoUrl = $repoUrl
}
}
$listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| $emoji **[$($s.name)]($repoUrl)** | \`$oldVersion\` | **\`$($s.version)\`** |`n"
}
$currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose
Set-GHVariable -Name COUNT_UPDATED -Value $count
$newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
$listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
$listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
}
}
if ($count -eq 0) { return }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
if ($count -eq 0) { return }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
# Set single dependency variables (they will only be used if COUNT_UPDATED is 1)
# Use safe fallback values in case variables weren't set (shouldn't happen but prevents errors)
if ([string]::IsNullOrEmpty($singleDepName) -and $count -eq 1) {
# This shouldn't happen, but if it does, log a warning
Write-Warning "Single dependency name not set despite count being 1"
$singleDepName = "unknown-package"
$singleDepOldVersion = "unknown"
$singleDepNewVersion = "unknown"
} elseif ([string]::IsNullOrEmpty($singleDepName)) {
# For multiple dependencies, set placeholder values (won't be used)
$singleDepName = ""
$singleDepOldVersion = ""
$singleDepNewVersion = ""
}
Set-GHVariable -Name SINGLE_DEP_NAME -Value $singleDepName
Set-GHVariable -Name SINGLE_DEP_OLD_VERSION -Value $singleDepOldVersion
Set-GHVariable -Name SINGLE_DEP_NEW_VERSION -Value $singleDepNewVersion
# Write multiline UPDATE_MESSAGE to GITHUB_ENV
## echo "UPDATE_MESSAGE<<EOF`n$updateMessage`nEOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Add-Content -Path $env:GITHUB_ENV -Value "UPDATE_MESSAGE<<EOF"
Add-Content -Path $env:GITHUB_ENV -Value $updateMessage
Add-Content -Path $env:GITHUB_ENV -Value "EOF"
# Generate major updates changelog section and export
if ($majorUpdates.Count -gt 0) {
$changelogSection = "`n<details>`n<summary>🔥 Major version updates - View changelog</summary>`n`n"
foreach ($update in $majorUpdates) {
$changelogSection += "### [$($update.name)]($($update.repoUrl))`n"
$changelogSection += "**$($update.oldVersion)** → **$($update.newVersion)**`n`n"
$changelogSection += "- [View full changelog]($($update.compareUrl))`n"
$changelogSection += "- [Release notes]($($update.repoUrl)/tag/v$($update.newVersion))`n`n"
}
$changelogSection += "</details>`n"
Add-Content -Path $env:GITHUB_ENV -Value "CHANGELOG_SECTION<<EOF"
Add-Content -Path $env:GITHUB_ENV -Value $changelogSection
Add-Content -Path $env:GITHUB_ENV -Value "EOF"
Add-Content -Path $env:GITHUB_ENV -Value "HAS_BREAKING_CHANGES=True"
} else {
Add-Content -Path $env:GITHUB_ENV -Value "CHANGELOG_SECTION="
Add-Content -Path $env:GITHUB_ENV -Value "HAS_BREAKING_CHANGES=False"
}
echo "UPDATE_MESSAGE<<EOF`n$updateMessage`nEOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- name: Summary - Update check results
shell: pwsh
run: |
$count = [int]$env:COUNT_UPDATED
if ($count -eq 0) {
$summary = @"
### ✅ No Updates Available
All vendor dependencies are up to date! 🎉
All vendor dependencies are up to date.
"@
} else {
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
$summary = @"
### 🔄 Updates Found
**$count** vendor $word updated:
$env:UPDATE_MESSAGE
"@
$summary += '📦 **' + $env:SINGLE_DEP_NAME + '** updated from `' + $env:SINGLE_DEP_OLD_VERSION + '` to `' + $env:SINGLE_DEP_NEW_VERSION + '`' + "`n" + "`n"
$summary += '📦 **' + $count + '** vendor ' + $word + ' updated:' + "`n" + "`n"
}
$summary += $env:UPDATE_MESSAGE + "`n"
# Check if we can auto-merge (only minor/patch changes)
$hasBreaking = $env:HAS_BREAKING_CHANGES -eq 'True'
if ($hasBreaking) {
$summary += '> ⚠️ **Note:** This update contains major version changes that may include breaking changes.'
} else {
$summary += '> **Note:** This update only contains minor or patch changes.'
}
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Auto-merge minor updates
if: env.COUNT_UPDATED > 0 && env.HAS_BREAKING_CHANGES != 'True'
shell: pwsh
run: |
try {
echo "### 🚀 Auto-merging Updates" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Attempting to automatically merge non-breaking changes to master..." >> $env:GITHUB_STEP_SUMMARY
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
# Commit the changes
git add vendor/sources.json
$commitResult = git commit -m "⬆️ Update dependencies ($env:LIST_UPDATED)"
$commitSuccess = $LASTEXITCODE -eq 0
if ($commitSuccess) {
# Push directly to master
git push origin HEAD:master
$pushSuccess = $LASTEXITCODE -eq 0
if ($pushSuccess) {
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "✅ **Success!** Updates have been automatically merged to master." >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "**Updated dependencies:** $env:LIST_UPDATED" >> $env:GITHUB_STEP_SUMMARY
# Set a flag to skip PR creation
echo "AUTO_MERGED=true" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
} else {
throw "Failed to push to master (exit code: $LASTEXITCODE)"
}
} else {
throw "Failed to commit changes (exit code: $LASTEXITCODE)"
}
} catch {
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "⚠️ **Warning:** Unable to automatically merge updates." >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "**Error:** $($_.Exception.Message)" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Falling back to creating a pull request..." >> $env:GITHUB_STEP_SUMMARY
Write-Warning "Failed to auto-merge: $($_.Exception.Message)"
# Only reset if commit was successful but push failed
if ($commitSuccess -and -not $pushSuccess) {
try {
git reset --hard HEAD~1
if ($LASTEXITCODE -ne 0) {
Write-Warning "Failed to reset commit (exit code: $LASTEXITCODE), continuing with PR creation"
}
} catch {
Write-Warning "Failed to reset commit: $($_.Exception.Message), continuing with PR creation"
}
}
# Set flag to create PR instead
echo "AUTO_MERGED=false" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
}
- uses: peter-evans/create-pull-request@v8
if: fromJSON(env.COUNT_UPDATED) > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false')
if: env.COUNT_UPDATED > 0
with:
title: ${{ env.COUNT_UPDATED == 1 && format('⬆️ Update {0}', env.LIST_UPDATED) || format('⬆️ Update {0} vendored dependencies', env.COUNT_UPDATED) }}
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
body: |
### ${{ env.COUNT_UPDATED == 1 && format('📦 Updated {0} from `{1}` to `{2}`', env.SINGLE_DEP_NAME, env.SINGLE_DEP_OLD_VERSION, env.SINGLE_DEP_NEW_VERSION) || format('📦 Automatically updated `{0}` dependencies', env.COUNT_UPDATED) }}
### Automatically updated `${{ env.COUNT_UPDATED }}` dependencies:
${{ env.UPDATE_MESSAGE }}
${{ env.CHANGELOG_SECTION }}
---
${{ env.HAS_BREAKING_CHANGES == 'True' && '⚠️ **This update contains major version changes that may include breaking changes.**' || ' This update only contains minor or patch changes.' }}
Please verify and then **Merge** the pull request to apply the updates.
Please verify and then **Merge** the pull request to update.
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
branch: update-vendor
base: master
- name: Summary - Pull request created
if: env.COUNT_UPDATED > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false')
if: env.COUNT_UPDATED > 0
shell: pwsh
run: |
$summary = @"
@@ -275,19 +112,9 @@ jobs:
**Branch:** ``update-vendor``
$(if (-not [string]::IsNullOrEmpty($env:LIST_UPDATED)) { "**Updated dependencies:** $env:LIST_UPDATED" } else { "**Updated dependencies:** " })
**Updated dependencies:** $env:LIST_UPDATED
"@
if ($env:HAS_BREAKING_CHANGES -eq 'True') {
$summary += "> ⚠️ **Manual review required:** This update contains major version changes."
} else {
$summary += "> **Note:** Auto-merge failed, manual review required."
}
$summary += @"
> Please review and merge the pull request to apply the updates.
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -1,6 +1,6 @@
# Cmder
[![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/cmderdev/cmder) [![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
[![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/cmderdev/cmder/actions/workflows/build.yml?query=event%3Apush+branch%3Amaster)
Cmder is a **software package** created out of pure frustration over absence of usable console emulator on Windows. It is based on [ConEmu](https://conemu.github.io/) with *major* config overhaul, comes with a Monokai color scheme, amazing [clink](https://chrisant996.github.io/clink/) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout.
@@ -388,13 +388,10 @@ If you do not have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running
## Current development builds
You can download builds of the current development branch by going to AppVeyor via the following link:
Download the latest successful GitHub Actions build, then open the run and download the artifacts from the **Artifacts** section:
[![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/cmderdev/cmder/branch/master/artifacts)
The latest download builds by GitHub Actions can be downloaded from the link below:
[![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
* **Master branch builds**: https://github.com/cmderdev/cmder/actions/workflows/build.yml?query=event%3Apush+branch%3Amaster+is%3Asuccess
* **Development branch builds**: https://github.com/cmderdev/cmder/actions/workflows/build.yml?query=event%3Apull_request+branch%3Adevelopment+is%3Asuccess
## License

View File

@@ -259,8 +259,6 @@ function Fetch-DownloadUrl {
}
$count = 0
$hasBreakingChanges = $false
$updateDetails = @()
# Read the current sources content
$sources = Get-Content $sourcesPath | Out-String | ConvertFrom-Json
@@ -303,26 +301,6 @@ foreach ($s in $sources) {
# }
$count++
# Analyze version change type using shared function
$result = Get-VersionChangeType -OldVersion $s.version -NewVersion $version
$changeType = $result.ChangeType
# Determine if this is a breaking change
if ($changeType -eq "downgrade" -or $changeType -eq "major") {
$hasBreakingChanges = $true
} elseif ($changeType -eq "unknown") {
# If version parsing failed, treat as potentially breaking
$hasBreakingChanges = $true
Write-Verbose "Could not parse version as semantic version for dependency '$($s.name)' (old: '$($s.version)', new: '$version'), treating as potentially breaking"
}
$updateDetails += @{
name = $s.name
oldVersion = $s.version
newVersion = $version
changeType = $changeType
}
}
$s.url = $downloadUrl
@@ -336,16 +314,12 @@ if ($count -eq 0) {
return
}
# Export update details for GitHub Actions
if ($Env:GITHUB_ACTIONS -eq 'true') {
$updateDetailsJson = $updateDetails | ConvertTo-Json -Compress
Write-Output "UPDATE_DETAILS=$updateDetailsJson" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Write-Output "HAS_BREAKING_CHANGES=$hasBreakingChanges" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
}
if ($Env:APPVEYOR -eq 'True') {
Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information
}
if ($Env:GITHUB_ACTIONS -eq 'true') {
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
}
Write-Host -ForegroundColor green "Successfully updated $count dependencies."

View File

@@ -285,100 +285,6 @@ function Format-FileSize {
}
}
function Get-VersionChangeType {
<#
.SYNOPSIS
Analyzes version changes using semantic versioning to determine the type of update and appropriate emoji.
.DESCRIPTION
Parses old and new version strings, compares them using semantic versioning rules,
and returns information about the change type, emoji indicator, and whether it's a major update.
.PARAMETER OldVersion
The previous version string (e.g., "1.2.3" or "2.52.0.windows.1").
.PARAMETER NewVersion
The new version string (e.g., "1.3.0" or "3.0.0.windows.1").
.OUTPUTS
Returns a hashtable with the following keys:
- ChangeType: "major", "minor", "patch", "downgrade", or "unknown"
- Emoji: The corresponding emoji indicator (🔥, 🚀, ⬆️, or 🔄)
- IsMajor: Boolean indicating if this is a major version update
.EXAMPLE
$result = Get-VersionChangeType -OldVersion "1.2.3" -NewVersion "2.0.0"
# Returns: @{ ChangeType = "major"; Emoji = "🔥"; IsMajor = $true }
.EXAMPLE
$result = Get-VersionChangeType -OldVersion "1.2.3" -NewVersion "1.3.0"
# Returns: @{ ChangeType = "minor"; Emoji = "🚀"; IsMajor = $false }
#>
param(
[Parameter(Mandatory = $true)]
[string]$OldVersion,
[Parameter(Mandatory = $true)]
[string]$NewVersion
)
$changeType = "unknown"
$emoji = "🔄"
$isMajor = $false
try {
# Handle versions with more than 4 parts and strip pre-release identifiers
$oldVerStr = $OldVersion.Split('-')[0]
$newVerStr = $NewVersion.Split('-')[0]
# Split by dots and take only numeric parts, first 4 max
$oldParts = $oldVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4
$newParts = $newVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4
# Ensure we have at least 2 parts (major.minor) for semantic versioning
if ($oldParts.Count -ge 2 -and $newParts.Count -ge 2) {
$oldVerParseable = $oldParts -join '.'
$newVerParseable = $newParts -join '.'
$oldVer = [System.Version]::Parse($oldVerParseable)
$newVer = [System.Version]::Parse($newVerParseable)
if ($newVer -lt $oldVer) {
$changeType = "downgrade"
# Don't set emoji for downgrades in this function - caller handles it
} elseif ($newVer.Major -gt $oldVer.Major) {
$changeType = "major"
$emoji = "🔥"
$isMajor = $true
} elseif ($newVer.Minor -gt $oldVer.Minor) {
$changeType = "minor"
$emoji = "🚀"
} elseif ($newVer -gt $oldVer) {
$changeType = "patch"
$emoji = "⬆️"
} else {
# No version increase detected (versions are equal)
$changeType = "unknown"
$emoji = "🔄"
}
} else {
# Not enough numeric parts for semantic versioning
throw "Not enough numeric version parts"
}
} catch {
# If semantic versioning fails, return unknown
$changeType = "unknown"
$emoji = "🔄"
$isMajor = $false
}
return @{
ChangeType = $changeType
Emoji = $emoji
IsMajor = $isMajor
}
}
function Get-ArtifactDownloadUrl {
<#
.SYNOPSIS

View File

@@ -30,3 +30,7 @@ cmd.auto_answer = answer_yes
# name: Doskey completions
# type: color
color.doskey = yellow
# name: Show a suggestion in a muted color
# type: boolean
autosuggest.inline