# 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_on/off`, `myip`), подгрузка секретов | | `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 скрыт - **UTF-8** — `chcp 65001` + `Console.InputEncoding/OutputEncoding` только для pwsh 7, не для PS 5.1 - **Extension points** — `~/.config/powershell/profile.extra.ps1` и `profile.d/*.ps1` для локальных добавок ### AI-инструменты (кросс-платформа) Общие скиллы живут в `agents/.agents/skills/` и расшариваются через симлинки. | Инструмент | Что настраивается | |------------|-------------------| | **Agents** | Каноничное хранилище скиллов: `~/.agents/skills//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. ### Прокси (`hproxy.local`) Имя `hproxy.local` — алиас хоста с прокси. Все инструменты (bash, pwsh, VS Code Server) используют его для `proxy_on/off`, не завязываясь на конкретный IP. **Порты:** 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-версиям. ### 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-функции (`~/.bash_functions`) | Функция | Описание | |---------|----------| | `proxy_on` | Включает HTTP/HTTPS/SOCKS5 прокси через `hproxy.local:12334` | | `proxy_off` | Очищает proxy-переменные | | `myip` | Показывает текущий внешний IP | | `update_hproxy` | Обновляет `hproxy.local` в `/etc/hosts` через `setup-hproxy.sh` (WSL NAT) | ### PowerShell-функции (`~/.config/powershell/profile.ps1`) | Функция | Описание | |---------|----------| | `proxy_on` | Включает HTTP/HTTPS/SOCKS5 прокси через `hproxy.local:12334` | | `proxy_off` | Очищает proxy-переменные | | `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` и т.д.) | | `~/.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.