- Зачем: - требовалось подтвердить нижнюю версию Python и исключить переполнение /tmp тестовыми данными. - Что: - добавлен полный прогон под системным Python и CPython 3.8 через uv. - исправлены переносимость тестового Xray, уборка временных файлов и документация задачи 05. - добавлен список локальных навыков, исключаемых из Git. - Проверка: - bash tests/test_xray_proxy_full.sh.
241 lines
14 KiB
Markdown
241 lines
14 KiB
Markdown
# 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, общие функции, подгрузка секретов |
|
||
| `xray-proxy` | Переносимый 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.
|
||
|
||
### Прокси (`xray-proxy`)
|
||
|
||
Linux/Bash-команды `proxy_on/off`, `pclaude`, `pcodex` и `myip` находятся в
|
||
самостоятельном пакете [`xray-proxy`](xray-proxy/README.md). Он поддерживает
|
||
явно выбранный внешний Hiddify или управляемый пользовательский Xray 26.3.27 с
|
||
профилями VLESS TCP/RAW + REALITY и XHTTP + TLS. Для отдельного подключения
|
||
выполните `stow xray-proxy`. Команды `xray-proxy 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-версия делегирует проверку и запуск `xray-proxy 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/xray-proxy/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.
|