Files
dotfiles/README.md
T
ddadmin 6e431d875e refactor(proxy-client): переименован интерфейс прокси
- Зачем:
  - прежнее имя выпячивало Xray, хотя клиент поддерживает также внешний прокси, а два каталога конфигурации были неочевидны.
- Что:
  - пакет, CLI, конфигурация, состояние, тесты и документация переименованы в proxy-client.
  - машинный конфиг, профиль и два явных примера собраны в одном пользовательском каталоге.
  - свежая установка защищена от сворачивания каталога конфигурации внутрь репозитория.
- Проверка:
  - bash tests/test_proxy_client_full.sh.
  - bash tests/test_install.sh.
  - ручные start, status и xray run -test; незавершённая сетевая приёмка записана в handoff.
2026-07-21 09:31:21 -04:00

242 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Dotfiles
Персональные конфигурации для Linux/WSL (stow) и Windows (chezmoi).
## 🚀 Quick start
### Linux / WSL
```bash
git clone https://github.com/ddmitry/dotfiles ~/dotfiles
cd ~/dotfiles
./install.sh
```
`install.sh` применяет stow-пакеты, настраивает Claude/Opencode, подключает `~/.bash_custom` в `~/.bashrc` и в WSL предлагает настроить `hproxy.local`.
### Windows
```powershell
winget install --id Microsoft.PowerShell
winget install twpayne.chezmoi
# ⚠️ Перезапустить терминал, чтобы pwsh и chezmoi попали в PATH
chezmoi -S "$HOME\dotfiles\chezmoi" apply
```
Chezmoi использует отдельный source dir `chezmoi/` внутри этого репозитория, не трогая stow/install.sh workflow.
## 🔧 Требования
### Linux / WSL
- Ubuntu / Debian
- GNU stow
- Bash 4.0+, Tmux 2.0+, Vim 8.0+
### Windows
- Windows 10/11 + Developer Mode (Settings → System → For developers)
- PowerShell 7.x
- [chezmoi](https://www.chezmoi.io/)
> `Windows PowerShell 5.1` остаётся legacy-режимом совместимости — не форсируется в UTF-8 и не тюнится.
## 📦 Что включено
### Linux / WSL (stow)
| Пакет | Что делает |
|-------|------------|
| `bash` | Кастомный prompt, общие функции, подгрузка секретов |
| `proxy-client` | Переносимый CLI и Bash-команды для явного запуска через прокси |
| `tmux` | Два префикса (`Ctrl+b`, `Ctrl+Space`), vi-режим, split по `\|` / `-` |
| `vim` | Минимальный .vimrc без плагинов, 2 пробела, leader = `Space` |
| `zed` | Конфигурация Zed редактора |
| `vscode` | `server-env-setup` для VS Code Server в WSL: секреты + авто-прокси |
`install.sh` дополнительно настраивает opencode (симлинки, MCP-конфиг), claude (симлинкает `settings.local.json` из репозитория) и подключает bash_custom.
### Windows (chezmoi)
- **PowerShell 7 profile** — live-stub в `~/Documents/PowerShell/` загружает managed profile из `~/.config/powershell/profile.ps1`
- **Git baseline** — `~/.gitconfig` с managed настройками, `~/.gitconfig.local` для персональных overrides
- **Windows Terminal** — идемпотентный скрипт: PS7 по умолчанию, PS 5.1 как legacy, Azure Cloud Shell скрыт
- **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-переменными
- **Extension points** — `~/.config/powershell/profile.extra.ps1` и `profile.d/*.ps1` для локальных добавок
### AI-инструменты (кросс-платформа)
Общие скиллы живут в `agents/.agents/skills/` и расшариваются через симлинки.
| Инструмент | Что настраивается |
|------------|-------------------|
| **Agents** | Каноничное хранилище скиллов: `~/.agents/skills/<name>/SKILL.md` |
| **Claude** | `~/.claude/skills` → симлинк на agents; `settings.local.json` → симлинк на репозиторий (базовые permissions + statusLine); `settings.json` — управляется Claude Code |
| **[Opencode](https://github.com/anomalyco/opencode)** | MCP-серверы (context7, web-reader, playwright и др.), `~/.config/opencode/skills` → симлинк на agents |
| **Codex** | `~/.codex/skills/` → симлинки на agents |
| **Gemini** | Политики для CLI: pre-approved readonly команды |
## ⚙️ Настройка
### Секреты (`.env.secrets`)
```bash
cp bash/.env.secrets.example ~/.env.secrets
```
Содержимое — API-ключи для AI-инструментов:
```bash
export CONTEXT7_API_KEY="..." # https://context7.com
export ZAI_API_KEY="..." # https://z.ai
```
Файл подгружается при старте bash и VS Code Server. Не трекается в git.
### Прокси (`proxy-client`)
Linux/Bash-команды `proxy_on/off`, `pclaude`, `pcodex` и `myip` находятся в
самостоятельном пакете [`proxy-client`](proxy-client/README.md). Он поддерживает
явно выбранный внешний Hiddify или управляемый пользовательский Xray 26.3.27 с
профилями VLESS TCP/RAW + REALITY и XHTTP + TLS. Для отдельного подключения
сначала выполните `mkdir -p ~/.config/proxy-client`, затем
`stow proxy-client`. Команды `proxy-client install/start/stop/status`
работают без systemd, автозапуска и автоматического перехода между прокси. Без
конфига сохраняется внешний Hiddify `hproxy.local:12334`.
Имя `hproxy.local` — прежний алиас хоста с внешним прокси. Windows и VS Code
Server продолжают использовать его напрямую.
**Порты:** HTTP/HTTPS — `hproxy.local:12334`, SOCKS5 — `socks5://hproxy.local:12334`.
**WSL NAT mode** (IP шлюза меняется при каждом запуске):
```bash
# Через install.sh (интерактивно, ответить "y" на вопрос про wsl.conf)
./install.sh
# Или вручную:
sudo tee -a /etc/wsl.conf <<'EOF'
[boot]
command = "/path/to/dotfiles/scripts/setup-hproxy.sh"
EOF
```
После изменения `wsl.conf` — `wsl --shutdown`. Обновить без перезапуска: `sudo scripts/setup-hproxy.sh` или `update_hproxy`.
**WSL mirrored mode** (`networkingMode=mirrored`) — имя резолвится из WSL через DNS/hosts хоста. Достаточно записи на стороне Windows:
```
# C:\Windows\System32\drivers\etc\hosts
192.168.1.100 hproxy.local
```
Проверка: `getent hosts hproxy.local` (запись в Linux `/etc/hosts` не обязательна).
**Native Linux** — прокси на localhost, нужна запись в `/etc/hosts`:
```bash
echo '127.0.0.1 hproxy.local' | sudo tee -a /etc/hosts
```
**VS Code Server** — `vscode/.vscode-server/server-env-setup` автоматически подхватывает `hproxy.local` и выставляет все proxy-переменные (HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, NO_PROXY и lowercase-варианты). Если `hproxy.local` не резолвится — прокси не включается, запуск не блокируется.
**Windows pwsh** — `proxy_on` / `proxy_off` / `myip` работают аналогично bash-версиям.
**`pclaude` / `pcodex`** — явный запуск Claude/Codex CLI через прокси (bash и pwsh). Bash-версия делегирует проверку и запуск `proxy-client run`; Windows-версия сохраняет прежний адрес `hproxy.local:12334`. Таймаут — `PROXY_PREFLIGHT_TIMEOUT`, по умолчанию 2 c. Если прокси недоступен, клиент не запускается. Proxy-переменные видны только дочернему процессу и не остаются в сессии. Голые `claude`/`codex` не перекрываются и идут напрямую — для прокси нужен явный `p`-префикс.
**Codex GUI на Windows** — chezmoi создает Start Menu ярлык `Codex Proxy`, который запускает Codex Windows App с proxy-переменными:
```powershell
HTTP_PROXY=http://hproxy.local:12334
HTTPS_PROXY=http://hproxy.local:12334
ALL_PROXY=socks5://hproxy.local:12334
NO_PROXY=hproxy.local,localhost,127.0.0.1,::1,[::1],.concept-software.ru
```
Ярлык вызывает `~/.local/bin/start-codex-proxy.ps1`. Скрипт также добавляет эти переменные в `WSLENV` с флагом `/u`: это штатный мост Windows → WSL, чтобы дочерние WSL-сессии, запущенные из Codex GUI, получили тот же proxy environment.
### Git baseline
На всех платформах фиксируются настройки для предсказуемого поведения:
| Ключ | Значение | Зачем |
|------|----------|-------|
| `core.autocrlf` | `false` | Не переписывать line endings |
| `core.eol` | `lf` | Дефолт ближе к Linux/macOS |
| `core.quotepath` | `false` | Кириллица в путях читаема |
| `core.longpaths` | `true` | Длинные пути на Windows |
| `fetch.prune` | `true` | Убирать удалённые ветки |
| `pull.ff` | `only` | Защита от случайных merge commit |
| `init.defaultBranch` | `main` | — |
Персональные настройки (`user.name`, `user.email`, `core.editor`, `core.sshCommand`) живут в `~/.gitconfig.local`.
На Windows chezmoi при первом apply мигрирует существующий `~/.gitconfig` в `~/.gitconfig.local` и подставляет managed baseline. На Linux baseline задаётся вручную или через скрипты.
Проверка: `git config --global --includes --list --show-origin`.
Для кроссплатформенных репозиториев рекомендуется `.gitattributes`:
```gitattributes
* text=auto eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
```
## 📖 Справочник
### Bash-функции (`~/.config/proxy-client/shell.bash`)
| Функция | Описание |
|---------|----------|
| `proxy_on` | Проверяет настроенный прокси и атомарно включает восемь переменных |
| `proxy_off` | Очищает proxy-переменные |
| `pclaude` / `pcodex` | Запуск Claude/Codex CLI через прокси с fail-fast pre-flight |
| `myip` | Показывает текущий внешний IP |
| `update_hproxy` | Остаётся в `~/.bash_functions` и обновляет WSL NAT-алиас |
### PowerShell-функции (`~/.config/powershell/profile.ps1`)
| Функция | Описание |
|---------|----------|
| `proxy_on` | Включает HTTP/HTTPS/SOCKS5 прокси через `hproxy.local:12334` |
| `proxy_off` | Очищает proxy-переменные |
| `pclaude` / `pcodex` | Запуск Claude/Codex CLI через прокси с fail-fast pre-flight |
| `myip` | Показывает текущий внешний IP |
| `Reload-Profile` | Перечитывает профиль без перезапуска сессии |
| `which` | `Get-Command -All` по имени |
| `touch` | Создаёт файл или обновляет `LastWriteTime` |
| `mkcd` | Создаёт директорию и переходит в неё |
| `open` | `Invoke-Item` — открывает путь |
| `croot` | Переходит в корень текущего Git-репозитория |
| `wt-here` | Новое окно Windows Terminal в текущей директории |
| `wt-tab-here` | Новая вкладка в текущей директории |
| `wt-split-here` | Split-pane в текущей директории |
### Точки расширения
| Файл | Назначение |
|------|------------|
| `~/.env.secrets` | API-ключи, подгружается bash и VS Code Server |
| `~/.bash_aliases` | Персональные алиасы bash |
| `~/.gitconfig.local` | Персональные Git-настройки (`user.name`, `core.editor` и т.д.) |
| `~/.local/bin/start-codex-proxy.ps1` | Windows launcher для Codex GUI с proxy-переменными |
| `~/.config/powershell/profile.extra.ps1` | Локальные дополнения к pwsh-профилю |
| `~/.config/powershell/profile.d/*.ps1` | Фрагменты, загружаемые по алфавиту |
| `~/.claude/settings.json` | Управляется Claude Code: `model`, `effortLevel`, «always allow» permissions |
## 💡 Дизайн-решения
**Почему stow на Linux + chezmoi на Windows?**
stow проще и покрывает весь Linux/WSL workflow. chezmoi нужен на Windows, где stow недоступен и нужны run-скрипты (миграция `.gitconfig`, настройка Windows Terminal). Два инструмента живут рядом и не мешают друг другу: chezmoi использует отдельный source dir `chezmoi/`, а `.chezmoiignore` исключает Linux-файлы на Windows.
**Почему Windows PowerShell 5.1 не трогается?**
Форсирование UTF-8 и изменение профиля PS 5.1 может сломать старые скрипты, `.bat`/`.cmd` и консольные утилиты. PS 7 — основной shell, PS 5.1 — режим совместимости.
**Почему Claude `settings.local.json` — симлинк, а `settings.json` — нет?**
Claude Code перезаписывает `settings.json` при каждом «always allow» — этот файл принадлежит Claude Code. Базовые permissions и statusLine живут в `settings.local.json`, который Claude Code только читает и мержит с `settings.json`. Симлинк из `~/.claude/settings.local.json` на файл в репозитории безопасен. Машинно-специфичные настройки (`model`, `effortLevel`) — в `settings.json`, управляются через Claude Code.