From 5286859533637674d86be01dc8c7f0bdacbc689c Mon Sep 17 00:00:00 2001 From: Dmitriy Dementiev Date: Thu, 23 Jul 2026 16:59:45 +0300 Subject: [PATCH] =?UTF-8?q?feat(claude):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20Des?= =?UTF-8?q?ktop=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D1=81=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - нужен отдельный запуск Claude Desktop через hproxy.local без системного прокси. - Что: - добавлен PowerShell-скрипт с переменными прокси и параметрами Electron. - добавлено идемпотентное создание ярлыка Claude Proxy через chezmoi. - описано правило полного закрытия уже запущенного Claude. - Проверка: - проверены PowerShell-синтаксис, аргументы запуска и WSLENV через подмену Start-Process. - двумя прогонами с подменой COM проверена идемпотентность создания ярлыка. - выполнены chezmoi managed и git diff --cached --check. --- README.md | 7 ++ .../run_31-create-claude-proxy-shortcut.ps1 | 66 +++++++++++++++++ chezmoi/dot_local/bin/start-claude-proxy.ps1 | 70 +++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 chezmoi/.chezmoiscripts/run_31-create-claude-proxy-shortcut.ps1 create mode 100644 chezmoi/dot_local/bin/start-claude-proxy.ps1 diff --git a/README.md b/README.md index e136d18..1d29ea6 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Chezmoi использует отдельный source dir `chezmoi/` внутр - **WezTerm** — `~/.wezterm.lua` как живая ссылка на `wezterm/.wezterm.lua` в репозитории - **UTF-8** — `chcp 65001` + `Console.InputEncoding/OutputEncoding` только для pwsh 7, не для PS 5.1 - **Codex Proxy shortcut** — Start Menu ярлык для запуска Codex GUI с proxy-переменными +- **Claude Proxy** — ярлык меню «Пуск» для запуска Claude Desktop с переменными прокси - **Extension points** — `~/.config/powershell/profile.extra.ps1` и `profile.d/*.ps1` для локальных добавок ### AI-инструменты (кросс-платформа) @@ -106,6 +107,11 @@ Linux/Bash-интерфейс `proxy-client` поддерживает внешн описаны рядом с пакетом. Windows PowerShell и ярлык `Codex Proxy` сохраняют прежнюю интеграцию с `hproxy.local:12334`. +`Claude Proxy` передаёт переменные прокси и параметры Electron +`--proxy-server` и `--proxy-bypass-list`, чтобы прокси применялся ко всему +трафику Claude Desktop. Если Claude уже запущен обычным способом, его нужно +полностью закрыть перед запуском через `Claude Proxy`. + ### Git baseline На всех платформах фиксируются настройки для предсказуемого поведения: @@ -171,6 +177,7 @@ Linux/Bash-интерфейс `proxy-client` поддерживает внешн | `~/.env.secrets` | API-ключи, подгружается bash и VS Code Server | | `~/.bash_aliases` | Персональные алиасы bash | | `~/.gitconfig.local` | Персональные Git-настройки (`user.name`, `core.editor` и т.д.) | +| `~/.local/bin/start-claude-proxy.ps1` | Скрипт запуска Claude Desktop для Windows с переменными прокси и параметрами Electron | | `~/.local/bin/start-codex-proxy.ps1` | Windows launcher для Codex GUI с proxy-переменными | | `~/.config/powershell/profile.extra.ps1` | Локальные дополнения к pwsh-профилю | | `~/.config/powershell/profile.d/*.ps1` | Фрагменты, загружаемые по алфавиту | diff --git a/chezmoi/.chezmoiscripts/run_31-create-claude-proxy-shortcut.ps1 b/chezmoi/.chezmoiscripts/run_31-create-claude-proxy-shortcut.ps1 new file mode 100644 index 0000000..d2b83e7 --- /dev/null +++ b/chezmoi/.chezmoiscripts/run_31-create-claude-proxy-shortcut.ps1 @@ -0,0 +1,66 @@ +$ErrorActionPreference = 'Stop' + +if (-not ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop')) { + return +} + +$LauncherPath = Join-Path $HOME '.local\bin\start-claude-proxy.ps1' +$ProgramsPath = [Environment]::GetFolderPath('Programs') +if ([string]::IsNullOrWhiteSpace($ProgramsPath)) { + Write-Warning 'Start Menu Programs folder was not found.' + return +} + +$ShortcutPath = Join-Path $ProgramsPath 'Claude Proxy.lnk' +$PwshAliasPath = Join-Path $env:LOCALAPPDATA 'Microsoft\WindowsApps\pwsh.exe' +$PwshCommand = Get-Command pwsh -ErrorAction SilentlyContinue +if (Test-Path -LiteralPath $PwshAliasPath) { + $TargetPath = $PwshAliasPath +} elseif ($null -ne $PwshCommand) { + $TargetPath = $PwshCommand.Source +} else { + $TargetPath = 'pwsh.exe' +} + +$Arguments = "-NoLogo -NoProfile -ExecutionPolicy Bypass -File `"$LauncherPath`"" +$WorkingDirectory = $env:USERPROFILE +$ClaudeExecutable = Join-Path $env:LOCALAPPDATA 'AnthropicClaude\claude.exe' +if (Test-Path -LiteralPath $ClaudeExecutable) { + $IconLocation = "$ClaudeExecutable,0" +} else { + $IconLocation = "$TargetPath,0" +} + +New-Item -ItemType Directory -Path (Split-Path -Parent $ShortcutPath) -Force | Out-Null + +$Shell = New-Object -ComObject WScript.Shell +$Shortcut = $Shell.CreateShortcut($ShortcutPath) + +$Changed = $false +if ($Shortcut.TargetPath -ne $TargetPath) { + $Shortcut.TargetPath = $TargetPath + $Changed = $true +} +if ($Shortcut.Arguments -ne $Arguments) { + $Shortcut.Arguments = $Arguments + $Changed = $true +} +if ($Shortcut.WorkingDirectory -ne $WorkingDirectory) { + $Shortcut.WorkingDirectory = $WorkingDirectory + $Changed = $true +} +if ($Shortcut.IconLocation -ne $IconLocation) { + $Shortcut.IconLocation = $IconLocation + $Changed = $true +} +if ($Shortcut.Description -ne 'Launch Claude with hproxy.local proxy environment') { + $Shortcut.Description = 'Launch Claude with hproxy.local proxy environment' + $Changed = $true +} + +if ($Changed -or -not (Test-Path -LiteralPath $ShortcutPath)) { + $Shortcut.Save() + Write-Host "Claude Proxy shortcut: updated $ShortcutPath" +} else { + Write-Host 'Claude Proxy shortcut: already up to date.' +} diff --git a/chezmoi/dot_local/bin/start-claude-proxy.ps1 b/chezmoi/dot_local/bin/start-claude-proxy.ps1 new file mode 100644 index 0000000..0afec83 --- /dev/null +++ b/chezmoi/dot_local/bin/start-claude-proxy.ps1 @@ -0,0 +1,70 @@ +$ErrorActionPreference = 'Stop' + +$ProxyHostName = 'hproxy.local' +$ProxyPort = 12334 +$HttpProxy = "http://${ProxyHostName}:${ProxyPort}" +$SocksProxy = "socks5://${ProxyHostName}:${ProxyPort}" +$NoProxy = "${ProxyHostName},localhost,127.0.0.1,::1,[::1],.concept-software.ru" +$ProxyBypassList = "${ProxyHostName};localhost;127.0.0.1;[::1];*.concept-software.ru" + +function Set-ProxyEnvironment { + $env:HTTP_PROXY = $HttpProxy + $env:HTTPS_PROXY = $HttpProxy + $env:ALL_PROXY = $SocksProxy + $env:NO_PROXY = $NoProxy + + $env:http_proxy = $HttpProxy + $env:https_proxy = $HttpProxy + $env:all_proxy = $SocksProxy + $env:no_proxy = $NoProxy +} + +function Add-WslEnvEntries { + $RequiredEntries = @( + 'HTTP_PROXY/u', + 'HTTPS_PROXY/u', + 'ALL_PROXY/u', + 'NO_PROXY/u', + 'http_proxy/u', + 'https_proxy/u', + 'all_proxy/u', + 'no_proxy/u' + ) + + $Entries = New-Object System.Collections.Generic.List[string] + if (-not [string]::IsNullOrWhiteSpace($env:WSLENV)) { + foreach ($Entry in ($env:WSLENV -split ':')) { + if (-not [string]::IsNullOrWhiteSpace($Entry) -and -not $Entries.Contains($Entry)) { + [void]$Entries.Add($Entry) + } + } + } + + foreach ($Entry in $RequiredEntries) { + if (-not $Entries.Contains($Entry)) { + [void]$Entries.Add($Entry) + } + } + + $env:WSLENV = [string]::Join(':', $Entries) +} + +function Get-ClaudeExecutable { + $Executable = Join-Path $env:LOCALAPPDATA 'AnthropicClaude\claude.exe' + if (-not (Test-Path -LiteralPath $Executable)) { + throw "Claude Desktop executable was not found: $Executable" + } + + return $Executable +} + +Set-ProxyEnvironment +Add-WslEnvEntries + +$ClaudeExecutable = Get-ClaudeExecutable +$ClaudeArguments = @( + "--proxy-server=${HttpProxy}", + "--proxy-bypass-list=${ProxyBypassList}" +) + +Start-Process -FilePath $ClaudeExecutable -ArgumentList $ClaudeArguments