Skip to content

Commit 2fc62bd

Browse files
ericchansenCopilot
andcommitted
fix: make prompt alias resolution cross-platform
- add cmdlet-based fallback map for aliased entries so suggestions still resolve when bash alias names (rm/ls/cp/mv) are not present on the host OS - keep reverse alias lookup for environments where those aliases exist - clear cmdlet fallback cache on unregister - make reverse lookup tests platform-agnostic by validating alias-or-cmdlet fallback behavior Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d9a2e40 commit 2fc62bd

File tree

3 files changed

+72
-21
lines changed

3 files changed

+72
-21
lines changed

PSCommandHelper/Public/Register-PSCommandHelperPrompt.ps1

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,24 @@ function Register-PSCommandHelperPrompt {
2323
# Build the aliased-command lookup from the map
2424
$map = Get-BashToPowerShellMap
2525
$aliasedMap = @{}
26+
$aliasedCmdletMap = @{}
2627
foreach ($entry in ($map | Where-Object { $_.Type -eq 'Aliased' })) {
2728
$baseCmd = ($entry.Bash -split '\s+')[0]
2829
if (-not $aliasedMap.ContainsKey($baseCmd)) {
2930
$aliasedMap[$baseCmd] = @()
3031
}
3132
$aliasedMap[$baseCmd] += $entry
33+
34+
$psCmdlet = ($entry.PowerShell -split '\s+')[0]
35+
if ($psCmdlet) {
36+
if (-not $aliasedCmdletMap.ContainsKey($psCmdlet)) {
37+
$aliasedCmdletMap[$psCmdlet] = @()
38+
}
39+
$aliasedCmdletMap[$psCmdlet] += $entry
40+
}
3241
}
3342
$script:AliasedCommandMap = $aliasedMap
43+
$script:AliasedCmdletMap = $aliasedCmdletMap
3444
$script:FormatFunc = Get-Command Format-Suggestion
3545

3646
$function:global:prompt = {
@@ -69,7 +79,16 @@ function Register-PSCommandHelperPrompt {
6979
}
7080
}
7181

82+
$entries = $null
7283
if ($lookupName -and $script:AliasedCommandMap.ContainsKey($lookupName)) {
84+
$entries = $script:AliasedCommandMap[$lookupName]
85+
}
86+
elseif ($script:AliasedCmdletMap -and $script:AliasedCmdletMap.ContainsKey($cmdName)) {
87+
$entries = $script:AliasedCmdletMap[$cmdName]
88+
$lookupName = $cmdName
89+
}
90+
91+
if ($entries) {
7392
$errString = $lastErr.ToString()
7493
# Only show for parameter-binding or argument errors (bash-style flags)
7594
$isParamError = $lastErr.Exception -is [System.Management.Automation.ParameterBindingException] -or
@@ -80,7 +99,6 @@ function Register-PSCommandHelperPrompt {
8099
if ($isParamError) {
81100
# Find the best matching entry using flag-aware comparison
82101
$line = if ($lastErr.InvocationInfo) { $lastErr.InvocationInfo.Line.Trim() } else { $lookupName }
83-
$entries = $script:AliasedCommandMap[$lookupName]
84102

85103
# Extract and normalize flags from the typed line
86104
$lineFlags = [System.Collections.Generic.HashSet[char]]::new()

PSCommandHelper/Public/Unregister-PSCommandHelperPrompt.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ function Unregister-PSCommandHelperPrompt {
1010
$function:global:prompt = $script:OriginalPrompt
1111
$script:OriginalPrompt = $null
1212
$script:AliasedCommandMap = $null
13+
$script:AliasedCmdletMap = $null
1314
}
1415
}

tests/PSCommandHelper.Tests.ps1

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,21 @@ Describe 'Prompt handler: reverse alias lookup' {
155155
InModuleScope PSCommandHelper {
156156
$map = Get-BashToPowerShellMap
157157
$script:TestAliasedMap = @{}
158+
$script:TestAliasedCmdletMap = @{}
158159
foreach ($entry in ($map | Where-Object { $_.Type -eq 'Aliased' })) {
159160
$baseCmd = ($entry.Bash -split '\s+')[0]
160161
if (-not $script:TestAliasedMap.ContainsKey($baseCmd)) {
161162
$script:TestAliasedMap[$baseCmd] = @()
162163
}
163164
$script:TestAliasedMap[$baseCmd] += $entry
165+
166+
$psCmdlet = ($entry.PowerShell -split '\s+')[0]
167+
if ($psCmdlet) {
168+
if (-not $script:TestAliasedCmdletMap.ContainsKey($psCmdlet)) {
169+
$script:TestAliasedCmdletMap[$psCmdlet] = @()
170+
}
171+
$script:TestAliasedCmdletMap[$psCmdlet] += $entry
172+
}
164173
}
165174
}
166175
}
@@ -171,43 +180,66 @@ Describe 'Prompt handler: reverse alias lookup' {
171180
}
172181
}
173182

174-
It 'Remove-Item reverse-resolves to rm which is in the aliased map' {
175-
$aliases = Get-Alias -Definition 'Remove-Item' -ErrorAction SilentlyContinue
176-
$aliasNames = $aliases | ForEach-Object { $_.Name }
177-
$aliasNames | Should -Contain 'rm'
178-
}
179-
180-
It 'Get-ChildItem reverse-resolves to ls which is in the aliased map' {
181-
$aliases = Get-Alias -Definition 'Get-ChildItem' -ErrorAction SilentlyContinue
182-
$aliasNames = $aliases | ForEach-Object { $_.Name }
183-
$aliasNames | Should -Contain 'ls'
183+
It 'has cmdlet fallback entries for Remove-Item and Get-ChildItem' {
184+
InModuleScope PSCommandHelper {
185+
$script:TestAliasedCmdletMap.ContainsKey('Remove-Item') | Should -BeTrue
186+
$script:TestAliasedCmdletMap.ContainsKey('Get-ChildItem') | Should -BeTrue
187+
}
184188
}
185189

186-
It 'Copy-Item reverse-resolves to cp which is in the aliased map' {
190+
It 'resolves Remove-Item to aliased suggestions by alias or cmdlet fallback' {
187191
InModuleScope PSCommandHelper {
188-
$aliases = Get-Alias -Definition 'Copy-Item' -ErrorAction SilentlyContinue
189-
$found = $false
192+
$resolvedEntries = $null
193+
$aliases = Get-Alias -Definition 'Remove-Item' -ErrorAction SilentlyContinue
190194
foreach ($a in $aliases) {
191195
if ($script:TestAliasedMap.ContainsKey($a.Name)) {
192-
$found = $true
196+
$resolvedEntries = $script:TestAliasedMap[$a.Name]
193197
break
194198
}
195199
}
196-
$found | Should -BeTrue
200+
if (-not $resolvedEntries) {
201+
$resolvedEntries = $script:TestAliasedCmdletMap['Remove-Item']
202+
}
203+
204+
$resolvedEntries | Should -Not -BeNullOrEmpty
197205
}
198206
}
199207

200-
It 'Move-Item reverse-resolves to mv which is in the aliased map' {
208+
It 'resolves Get-ChildItem to aliased suggestions by alias or cmdlet fallback' {
201209
InModuleScope PSCommandHelper {
202-
$aliases = Get-Alias -Definition 'Move-Item' -ErrorAction SilentlyContinue
203-
$found = $false
210+
$resolvedEntries = $null
211+
$aliases = Get-Alias -Definition 'Get-ChildItem' -ErrorAction SilentlyContinue
204212
foreach ($a in $aliases) {
205213
if ($script:TestAliasedMap.ContainsKey($a.Name)) {
206-
$found = $true
214+
$resolvedEntries = $script:TestAliasedMap[$a.Name]
207215
break
208216
}
209217
}
210-
$found | Should -BeTrue
218+
if (-not $resolvedEntries) {
219+
$resolvedEntries = $script:TestAliasedCmdletMap['Get-ChildItem']
220+
}
221+
222+
$resolvedEntries | Should -Not -BeNullOrEmpty
223+
}
224+
}
225+
226+
It 'resolves Copy-Item and Move-Item by alias or cmdlet fallback' {
227+
InModuleScope PSCommandHelper {
228+
foreach ($cmdlet in @('Copy-Item', 'Move-Item')) {
229+
$resolvedEntries = $null
230+
$aliases = Get-Alias -Definition $cmdlet -ErrorAction SilentlyContinue
231+
foreach ($a in $aliases) {
232+
if ($script:TestAliasedMap.ContainsKey($a.Name)) {
233+
$resolvedEntries = $script:TestAliasedMap[$a.Name]
234+
break
235+
}
236+
}
237+
if (-not $resolvedEntries) {
238+
$resolvedEntries = $script:TestAliasedCmdletMap[$cmdlet]
239+
}
240+
241+
$resolvedEntries | Should -Not -BeNullOrEmpty
242+
}
211243
}
212244
}
213245
}

0 commit comments

Comments
 (0)