Repository navigation
Expand file tree
/
Copy pathuninstall.ps1
More file actions
134 lines (120 loc) · 5.88 KB
/
Copy pathuninstall.ps1
File metadata and controls
134 lines (120 loc) · 5.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#Requires -Version 5.1
<#
.SYNOPSIS
Desinstala o Task Bar Hero: encerra o processo, remove o atalho de
inicializacao, remove so os hooks que apontam para ESTE clone do repo
(preservando qualquer outro hook do usuario, inclusive de outro clone) e
opcionalmente apaga o estado salvo.
.PARAMETER Yes
Nao pergunta nada (assume "sim" para apagar o estado salvo tambem).
#>
param(
[switch]$Yes
)
$ErrorActionPreference = 'Stop'
function Write-Step ($msg) { Write-Host "==> $msg" -ForegroundColor Cyan }
function Write-Ok ($msg) { Write-Host "OK $msg" -ForegroundColor Green }
function Write-Warn ($msg) { Write-Host "!! $msg" -ForegroundColor Yellow }
# Mesmo motivo do install.ps1: Set-Content -Encoding UTF8 grava BOM, que
# quebra parsers de JSON que nao esperam BOM (inclusive o proprio Claude Code).
function Set-Utf8NoBom ($Path, $Content) {
$enc = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllText($Path, $Content, $enc)
}
# Mesmo motivo do install.ps1: Read-Host lanca excecao terminante em sessao
# nao-interativa - nunca deixar isso abortar o script no meio.
function Read-HostSafe ($Prompt) {
try {
return Read-Host $Prompt
} catch {
Write-Warn "Console nao-interativo - nao foi possivel perguntar. Assumindo 'nao'."
return $null
}
}
$RepoRoot = $PSScriptRoot
$HookPathFile = Join-Path $RepoRoot 'hooks\taskbar-hero-update.js'
$HookPath = if (Test-Path $HookPathFile) { (Resolve-Path $HookPathFile).Path } else { $HookPathFile }
$ClaudeDir = Join-Path $HOME '.claude'
$SettingsPath = Join-Path $ClaudeDir 'settings.json'
$StateDir = Join-Path $ClaudeDir 'taskbar-hero'
Write-Host "Task Bar Hero - desinstalador" -ForegroundColor Magenta
Write-Step "Encerrando o processo do ticker..."
try {
Get-CimInstance Win32_Process -Filter "Name='pythonw.exe' or Name='python.exe'" -ErrorAction Stop |
Where-Object { $_.CommandLine -like '*ticker.pyw*' } |
ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }
Write-Ok "Processo encerrado (se estava rodando)."
} catch {
Write-Warn "Nao consegui consultar processos via WMI (pode estar bloqueado por politica) - encerre manualmente pelo Gerenciador de Tarefas se necessario."
}
Write-Step "Removendo atalhos..."
$StartupShortcut = Join-Path ([Environment]::GetFolderPath('Startup')) 'ClaudeTaskbarHero.lnk'
$StartMenuShortcut = Join-Path ([Environment]::GetFolderPath('Programs')) 'Task Bar Hero Code.lnk'
$DesktopShortcut = Join-Path ([Environment]::GetFolderPath('Desktop')) 'Task Bar Hero Code.lnk'
Remove-Item -Path $StartupShortcut -ErrorAction SilentlyContinue
Remove-Item -Path $StartMenuShortcut -ErrorAction SilentlyContinue
Remove-Item -Path $DesktopShortcut -ErrorAction SilentlyContinue
Write-Ok "Atalhos removidos (os que existiam)."
Write-Step "Removendo comando /taskbar-hero..."
$CommandDestPath = Join-Path $ClaudeDir 'commands\taskbar-hero.md'
Remove-Item -Path $CommandDestPath -ErrorAction SilentlyContinue
Write-Ok "Comando removido (se existia)."
if (Test-Path $SettingsPath) {
Write-Step "Removendo hooks do Task Bar Hero em settings.json..."
try {
$settings = Get-Content $SettingsPath -Raw -Encoding UTF8 | ConvertFrom-Json
} catch {
Write-Warn "settings.json contem JSON invalido - pulando remocao de hooks (nada foi alterado nele). Corrija manualmente."
$settings = $null
}
if ($settings) {
$changed = $false
# Casa pelo CAMINHO ABSOLUTO deste clone (normalizado), nao por um
# substring solto do nome do arquivo - assim nao apaga hooks de OUTRO
# clone do mesmo repo instalado em outra pasta. A normalizacao cobre
# tambem entradas gravadas com grafia diferente (barras, "$HOME").
function Get-HookCommandPath ($command) {
if ($command -match '"([^"]+)"') {
$p = $matches[1] -replace '\$HOME', $HOME
return ($p -replace '/', '\').TrimEnd('\')
}
return $null
}
$hookPathNormalized = $HookPath.TrimEnd('\')
if ($settings.PSObject.Properties['hooks']) {
foreach ($evt in $settings.hooks.PSObject.Properties.Name) {
$before = @($settings.hooks.$evt)
# @(...) forca array mesmo quando o resultado fica vazio -- sem
# isso o PowerShell colapsa pipeline vazio para $null, que vira
# "null" no JSON em vez de "[]".
$after = @($before | Where-Object {
$group = $_
-not (@($group.hooks) | Where-Object { $_.command -and (Get-HookCommandPath $_.command) -ieq $hookPathNormalized })
})
if ($after.Count -ne $before.Count) { $changed = $true }
$settings.hooks.$evt = $after
}
}
if ($changed) {
Copy-Item $SettingsPath "$SettingsPath.bak" -Force
Set-Utf8NoBom -Path $SettingsPath -Content ($settings | ConvertTo-Json -Depth 30)
Write-Ok "Hooks removidos - outros hooks seus (inclusive de outros clones deste repo) foram preservados."
} else {
Write-Ok "Nenhum hook deste clone encontrado (nada a remover)."
}
}
}
$removeState = $Yes
if (-not $Yes -and (Test-Path $StateDir)) {
$answer = Read-HostSafe "Apagar tambem o estado salvo em $StateDir (posicao da janela, status)? [s/N]"
$removeState = $answer -match '^[sS]'
}
if ($removeState -and (Test-Path $StateDir)) {
Remove-Item -Recurse -Force -Path $StateDir -ErrorAction SilentlyContinue
Write-Ok "Estado removido."
} elseif (Test-Path $StateDir) {
Write-Host "Estado mantido em $StateDir." -ForegroundColor Yellow
}
Write-Host ""
Write-Host "Desinstalacao concluida." -ForegroundColor Green
Write-Host "Nota: o patch do /statusline (se voce aceitou aplica-lo) nao e revertido automaticamente - restaure o .bak criado ao lado do arquivo, se quiser."