- Зачем:
- README писался моделью, и в нем остались знаки, которых нет на
клавиатуре: их некому было подставить, потому что markdown правят
в редакторе кода, а не в Word с автозаменой.
- декоративные эмодзи в заголовках в русском тексте вне переписки
не ставят вовсе, это самый однозначный след генерации.
- Что:
- сняты эмодзи с шести заголовков и из комментария в блоке кода.
- 21 длинное тире заменено на дефис, 3 пары елочек на прямые кавычки,
7 стрелок на ->, буква "е" приведена к авторскому стилю в 14 словах.
- в разделе "Дизайн-решения" отглагольные существительные развернуты
в глаголы: "форсирование и изменение может сломать" стало
"если форсировать и менять, можно сломать".
- Проверка:
- якорных ссылок на заголовки ни внутри README, ни снаружи нет,
переименование ничего не ломает.
- блоки кода не тронуты: ни одно тире не попало внутрь фенсов,
10 фенсов и 62 строки таблиц на месте.
Co-Authored-By: Claude <noreply@anthropic.com>
226 lines
15 KiB
Markdown
226 lines
15 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, общие функции, подгрузка секретов |
|
||
| `proxy-client` | Переносимый CLI и Bash-команды для явного запуска через прокси |
|
||
| `tmux` | Два префикса (`Ctrl+b`, `Ctrl+Space`), vi-режим, split по `\|` / `-` |
|
||
| `vim` | Минимальный .vimrc без плагинов, 2 пробела, leader = `Space` |
|
||
| `wezterm` | Общий для Linux и Windows конфиг: одинаковые оформление и горячие клавиши |
|
||
| `kitty` | `kitty.conf` и тема; `~/.config/kitty` остается настоящим каталогом, чтобы файлы kitty не попадали в репозиторий |
|
||
| `vscode` | `server-env-setup` для VS Code Server в WSL: секреты + авто-прокси |
|
||
| `chatgpt` | Отдельный ярлык `ChatGPT Proxy` с запретом прямого запуска при ошибке |
|
||
|
||
`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` как живая ссылка на общий конфиг для Windows и Linux
|
||
- **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-инструменты (кросс-платформа)
|
||
|
||
Общие скиллы живут в `agents/.agents/skills/` и расшариваются через симлинки.
|
||
|
||
| Инструмент | Что настраивается |
|
||
|------------|-------------------|
|
||
| **Agents** | Каноничное хранилище скиллов: `~/.agents/skills/<name>/SKILL.md` |
|
||
| **Claude** | `~/.claude/skills` -> симлинк на agents; `settings.local.json` -> симлинк на репозиторий (базовые permissions + statusLine); `statusline-command.sh` -> копия из репозитория; `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-client` поддерживает внешний прокси и управляемый
|
||
пользовательский Xray. Без машинного конфига используется прежний Hiddify на
|
||
`hproxy.local:12334`; автоматического запуска Xray и переключения между режимами
|
||
нет.
|
||
|
||
[Установка, выбор режима, WSL и ежедневное использование](proxy-client/README.md)
|
||
описаны рядом с пакетом. Windows PowerShell и ярлык `Codex Proxy` сохраняют
|
||
прежнюю интеграцию с `hproxy.local:12334`. Ярлык запускает упакованное
|
||
приложение через системный идентификатор и передает параметры Chromium
|
||
`--proxy-server` и `--proxy-bypass-list`. Сам Codex и его дочерние процессы
|
||
читают общие proxy-переменные из `~/.codex/.env`; пользовательское окружение
|
||
Windows не меняется. Если Codex уже запущен, его нужно полностью закрыть перед
|
||
запуском через `Codex Proxy`.
|
||
|
||
`Claude Proxy` поддерживает как обычную установку в
|
||
`%LOCALAPPDATA%\AnthropicClaude`, так и пакет из Microsoft Store. В обоих
|
||
случаях он передает параметры Electron `--proxy-server` и
|
||
`--proxy-bypass-list`, чтобы прокси применялся ко всему трафику Claude Desktop.
|
||
Ярлык использует скрытый промежуточный запускатель, поэтому Claude не открывает
|
||
и не удерживает окно Windows Terminal.
|
||
Если Claude уже запущен обычным способом, его нужно полностью закрыть перед
|
||
запуском через `Claude Proxy`.
|
||
|
||
Список хостов, которые идут мимо прокси, продублирован в профилях Codex,
|
||
PowerShell и VS Code: одного общего файла у Windows и WSL нет. Эталон -
|
||
`DEFAULT_NO_PROXY_EXTRA` в `proxy-client/.local/bin/proxy-client`; меняя его,
|
||
поправь и копии. Расхождение ловит `tests/test_proxy_env_sync.py` - раньше
|
||
копии разъезжались, и один и тот же хост то шел мимо прокси, то нет.
|
||
|
||
На Linux Stow-пакет `chatgpt` добавляет отдельный пользовательский ярлык
|
||
`ChatGPT Proxy`. Штатный `ChatGPT` остается прямым. Прокси-ярлык получает
|
||
активные настройки от `proxy-client`, передает Chromium явные параметры прокси
|
||
и сохраняет proxy-переменные для дочерних процессов. Повторный запуск поднимает
|
||
окно уже работающего проксированного экземпляра. Если ChatGPT открыт напрямую
|
||
или прокси недоступен, новый режим не подмешивается: GNOME показывает
|
||
уведомление с инструкцией. Файлы Debian-пакета не меняются, поэтому настройка
|
||
переживает его обновление.
|
||
|
||
### 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 |
|
||
| `~/.codex/.env` | Общие proxy-переменные для Codex CLI, Codex Desktop и их дочерних процессов |
|
||
| `~/.bash_aliases` | Персональные алиасы bash |
|
||
| `~/.gitconfig.local` | Персональные Git-настройки (`user.name`, `core.editor` и т.д.) |
|
||
| `~/.local/bin/start-claude-proxy.ps1` | Скрипт запуска Claude Desktop для Windows с переменными прокси и параметрами Electron |
|
||
| `~/.local/bin/start-claude-proxy.vbs` | Скрытый запуск PowerShell-скрипта без привязки Claude к видимому окну терминала |
|
||
| `~/.local/bin/start-codex-proxy.ps1` | Запуск Codex для Windows через системный идентификатор; прокси Electron задается параметрами, а `codex.exe` читает `~/.codex/.env` |
|
||
| `~/.local/bin/start-chatgpt-proxy` | Запуск Linux-приложения ChatGPT через активную настройку `proxy-client` |
|
||
| `~/.local/share/applications/chatgpt-proxy.desktop` | Отдельный Linux-ярлык `ChatGPT Proxy`, не подменяющий штатный `ChatGPT` |
|
||
| `~/.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.
|