fix(windows): исправлены LF и совместимость chezmoi с PS 5.1

- Зачем:
  - нужно убрать line-ending noise в репозитории и сделать Windows-слой безопаснее для запуска без установленного pwsh.
- Что:
  - добавлена `.gitattributes` с LF-базой для текста и CRLF-исключениями для `.bat` и `.cmd`.
  - `README.md` нормализован в LF и quick start дополнен явной установкой PowerShell 7.
  - `chezmoi`-скрипты переведены на guard, совместимый с PowerShell 5.1, а запись `settings.json` переведена на `utf8BOM`.
- Проверка:
  - `git diff --check`.
  - `powershell.exe -NoProfile -ExecutionPolicy Bypass -File chezmoi\\.chezmoiscripts\\run_before_10-migrate-gitconfig.ps1`.
  - `powershell.exe -NoProfile -ExecutionPolicy Bypass -File chezmoi\\.chezmoiscripts\\run_20-configure-windows-terminal.ps1`.
  - `chezmoi -S C:\\Users\\dmitry\\dotfiles\\chezmoi apply --dry-run --verbose`.
This commit is contained in:
Dmitry Dementiev committed 2026-03-22 17:12:59 +03:00
1 parent 9b66fc70fc
commit f9083af8b2
4 files changed
+218 -214

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
* text=auto eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
+212 -211
View File
@@ -1,119 +1,119 @@
# Dotfiles # Dotfiles
Персональные конфигурационные файлы для настройки рабочего окружения. Персональные конфигурационные файлы для настройки рабочего окружения.
## 📦 Содержимое ## 📦 Содержимое
### Bash ### Bash
- **Файлы:** `bash/.bash_custom`, `bash/.bash_functions`, `bash/.bash_prompt` - **Файлы:** `bash/.bash_custom`, `bash/.bash_functions`, `bash/.bash_prompt`
- Подключение кастомных bash-файлов (функции, prompt, секреты) поверх стандартного `~/.bashrc` - Подключение кастомных bash-файлов (функции, prompt, секреты) поверх стандартного `~/.bashrc`
- Кастомный двухстрочный prompt (подключается из `~/.bash_prompt`) - Кастомный двухстрочный prompt (подключается из `~/.bash_prompt`)
- Поддержка цветного вывода и автодополнения - Поддержка цветного вывода и автодополнения
### Tmux ### Tmux
- **Файл:** `tmux/.tmux.conf` - **Файл:** `tmux/.tmux.conf`
- Два префикса: `Ctrl+b` (стандартный) и `Ctrl+Space` (удобный) - Два префикса: `Ctrl+b` (стандартный) и `Ctrl+Space` (удобный)
- Визуальный стиль с синей цветовой схемой - Визуальный стиль с синей цветовой схемой
- Vi-режим для копирования - Vi-режим для копирования
- Горячие клавиши: - Горячие клавиши:
- `|` / `-` — разделение панелей - `|` / `-` — разделение панелей
- `Alt+стрелки` — изменение размера панелей и переключение окон - `Alt+стрелки` — изменение размера панелей и переключение окон
- `r` — перезагрузка конфига - `r` — перезагрузка конфига
### Vim ### Vim
- **Файл:** `vim/.vimrc` - **Файл:** `vim/.vimrc`
- Минималистичная конфигурация без плагинов - Минималистичная конфигурация без плагинов
- 2 пробела вместо табов (оптимально для YAML/XML) - 2 пробела вместо табов (оптимально для YAML/XML)
- Поддержка мыши и подсветка поиска - Поддержка мыши и подсветка поиска
- Leader key: `Space` - Leader key: `Space`
- `<Space>w` — сохранить - `<Space>w` — сохранить
- `<Space>h` — убрать подсветку поиска - `<Space>h` — убрать подсветку поиска
- `<Space>p` — вставка без форматирования - `<Space>p` — вставка без форматирования
### Zed ### Zed
- **Директория:** `zed/.config/zed/` - **Директория:** `zed/.config/zed/`
- Структура для конфигурации Zed редактора - Структура для конфигурации Zed редактора
### VS Code (WSL) ### VS Code (WSL)
- **Файл:** `vscode/.vscode-server/server-env-setup` - **Файл:** `vscode/.vscode-server/server-env-setup`
- Поддержка `~/.vscode-server/server-env-setup` для VS Code Server в WSL - Поддержка `~/.vscode-server/server-env-setup` для VS Code Server в WSL
- Подгрузка `~/.env.secrets` для расширений, задач/debug и терминалов VS Code - Подгрузка `~/.env.secrets` для расширений, задач/debug и терминалов VS Code
- Автоматическая настройка прокси: если `hproxy.local` резолвится, выставляются `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` (socks5), `NO_PROXY` и их lowercase-варианты - Автоматическая настройка прокси: если `hproxy.local` резолвится, выставляются `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` (socks5), `NO_PROXY` и их lowercase-варианты
- Режим `fail-open`: если `~/.env.secrets` отсутствует или не загружается — warning в stderr, VS Code продолжает запуск - Режим `fail-open`: если `~/.env.secrets` отсутствует или не загружается — warning в stderr, VS Code продолжает запуск
### Opencode ### Opencode
- **Директория:** `opencode/.config/opencode/` - **Директория:** `opencode/.config/opencode/`
- Конфигурация AI-ассистента opencode с MCP-серверами: - Конфигурация AI-ассистента opencode с MCP-серверами:
- **context7** — документация библиотек - **context7** — документация библиотек
- **web-reader** — чтение веб-страниц - **web-reader** — чтение веб-страниц
- **web-search-prime** — поиск в интернете - **web-search-prime** — поиск в интернете
- **zread** — чтение GitHub репозиториев - **zread** — чтение GitHub репозиториев
- **playwright** — браузерная автоматизация - **playwright** — браузерная автоматизация
- Требует переменных окружения (см. `.env.example`) - Требует переменных окружения (см. `.env.example`)
- Скиллы берутся из общего пакета `agents/.agents/skills/` через симлинк `~/.config/opencode/skills` - Скиллы берутся из общего пакета `agents/.agents/skills/` через симлинк `~/.config/opencode/skills`
### Agents (shared skills) ### Agents (shared skills)
- **Директория:** `agents/.agents/skills/` - **Директория:** `agents/.agents/skills/`
- Каноничное место для общих скиллов в формате `~/.agents/skills/<name>/SKILL.md` - Каноничное место для общих скиллов в формате `~/.agents/skills/<name>/SKILL.md`
### Codex ### Codex
- **Директория:** `codex/.codex/skills/` - **Директория:** `codex/.codex/skills/`
- Тонкие симлинки в `~/.codex/skills/` на общие skills из `~/.agents/skills/` - Тонкие симлинки в `~/.codex/skills/` на общие skills из `~/.agents/skills/`
### Claude ### Claude
- **Директория:** `claude/.claude/` - **Директория:** `claude/.claude/`
- Тонкий симлинк `~/.claude/skills` на общие skills из `~/.agents/skills/` - Тонкий симлинк `~/.claude/skills` на общие skills из `~/.agents/skills/`
- **Двухуровневые настройки:** - **Двухуровневые настройки:**
- `settings.json` (в dotfiles, read-only) — стабильная база: permissions, statusLine - `settings.json` (в dotfiles, read-only) — стабильная база: permissions, statusLine
- `settings.local.json` (локальный, не в git) — машинно-специфичное: model, effortLevel - `settings.local.json` (локальный, не в git) — машинно-специфичное: model, effortLevel
- Claude Code мержит оба файла, `settings.local.json` имеет приоритет - Claude Code мержит оба файла, `settings.local.json` имеет приоритет
- `settings.json` защищён `chmod 444`, чтобы Claude Code не перезаписывал tracked файл - `settings.json` защищён `chmod 444`, чтобы Claude Code не перезаписывал tracked файл
### Gemini ### Gemini
- **Директория:** `gemini/.gemini/` - **Директория:** `gemini/.gemini/`
- Политики для Gemini CLI: pre-approved readonly команды - Политики для Gemini CLI: pre-approved readonly команды
## 🚀 Установка ## 🚀 Установка
### Автоматическая (рекомендуется) ### Автоматическая (рекомендуется)
```bash ```bash
sudo apt install stow sudo apt install stow
git clone https://github.com/ddmitry/dotfiles ~/dotfiles git clone https://github.com/ddmitry/dotfiles ~/dotfiles
cd ~/dotfiles cd ~/dotfiles
./install.sh ./install.sh
``` ```
Скрипт `install.sh`: Скрипт `install.sh`:
- Применяет все stow пакеты - Применяет все stow пакеты
- Создаёт `~/.claude/settings.local.json` с дефолтными model/effortLevel - Создаёт `~/.claude/settings.local.json` с дефолтными model/effortLevel
- Защищает `settings.json` от перезаписи (`chmod 444`) - Защищает `settings.json` от перезаписи (`chmod 444`)
- Автоматически добавляет подключение bash_custom в `~/.bashrc` - Автоматически добавляет подключение bash_custom в `~/.bashrc`
- В WSL предлагает настроить автоматический резолв `hproxy.local` (см. ниже) - В WSL предлагает настроить автоматический резолв `hproxy.local` (см. ниже)
### Stow вручную ### Stow вручную
```bash ```bash
sudo apt install stow sudo apt install stow
cd /path/to/dotfiles cd /path/to/dotfiles
stow bash tmux vim zed vscode agents opencode codex claude gemini stow bash tmux vim zed vscode agents opencode codex claude gemini
``` ```
После stow добавьте в `~/.bashrc` (если не используете `install.sh`): После stow добавьте в `~/.bashrc` (если не используете `install.sh`):
```bash ```bash
[ -f ~/.bash_custom ] && source ~/.bash_custom [ -f ~/.bash_custom ] && source ~/.bash_custom
``` ```
Создайте локальные настройки Claude: Создайте локальные настройки Claude:
```bash ```bash
cat > ~/.claude/settings.local.json <<'EOF' cat > ~/.claude/settings.local.json <<'EOF'
{ {
"model": "opus", "model": "opus",
"effortLevel": "high" "effortLevel": "high"
} }
EOF EOF
``` ```
### Windows (chezmoi) ### Windows (chezmoi)
Для Windows предпочтителен отдельный source dir `chezmoi/` внутри этого репозитория. Это позволяет держать Windows-слой рядом с остальными dotfiles, не ломая существующий `stow`/`install.sh` workflow для Linux/WSL. Для Windows предпочтителен отдельный source dir `chezmoi/` внутри этого репозитория. Это позволяет держать Windows-слой рядом с остальными dotfiles, не ломая существующий `stow`/`install.sh` workflow для Linux/WSL.
@@ -129,6 +129,7 @@ EOF
**Быстрое применение из уже существующего `~/dotfiles`:** **Быстрое применение из уже существующего `~/dotfiles`:**
```powershell ```powershell
winget install --id Microsoft.PowerShell
winget install twpayne.chezmoi winget install twpayne.chezmoi
# Применить только Windows-layer из репозитория # Применить только Windows-layer из репозитория
@@ -176,102 +177,102 @@ Windows-слой в этом репозитории настраивает со
- Проверять итоговые значения удобнее через `git config --global --includes --list --show-origin` - Проверять итоговые значения удобнее через `git config --global --includes --list --show-origin`
## 🔧 Требования ## 🔧 Требования
### Linux/WSL ### Linux/WSL
- Linux (протестировано на Ubuntu) - Linux (протестировано на Ubuntu)
- Bash 4.0+ - Bash 4.0+
- Tmux 2.0+ - Tmux 2.0+
- Vim 8.0+ - Vim 8.0+
### Windows ### Windows
- Windows 10/11 с Developer Mode - Windows 10/11 с Developer Mode
- PowerShell 7.x - PowerShell 7.x
- [chezmoi](https://www.chezmoi.io/) - [chezmoi](https://www.chezmoi.io/)
## 📝 Дополнительные файлы ## 📝 Дополнительные файлы
Для полной настройки создайте: Для полной настройки создайте:
- `~/.bash_aliases` — персональные алиасы - `~/.bash_aliases` — персональные алиасы
- `~/.env.secrets` — приватные переменные окружения (API ключи) - `~/.env.secrets` — приватные переменные окружения (API ключи)
## 🔑 Переменные окружения ## 🔑 Переменные окружения
### Кастомные функции bash ### Кастомные функции bash
Файл `bash/.bash_functions` содержит пользовательские функции (proxy_on/off, myip и др.). Файл `bash/.bash_functions` содержит пользовательские функции (proxy_on/off, myip и др.).
При использовании `stow bash` он будет доступен как `~/.bash_functions`. При использовании `stow bash` он будет доступен как `~/.bash_functions`.
### Приватные переменные (секреты) ### Приватные переменные (секреты)
1. Скопируйте шаблон: 1. Скопируйте шаблон:
```bash ```bash
cp bash/.env.secrets.example ~/.env.secrets cp bash/.env.secrets.example ~/.env.secrets
``` ```
2. Отредактируйте и добавьте API ключи: 2. Отредактируйте и добавьте API ключи:
```bash ```bash
# Context7 API (https://context7.com) # Context7 API (https://context7.com)
export CONTEXT7_API_KEY="your_context7_api_key_here" export CONTEXT7_API_KEY="your_context7_api_key_here"
# Z.AI API для LLM, поиска и чтения (https://z.ai) # Z.AI API для LLM, поиска и чтения (https://z.ai)
export ZAI_API_KEY="your_zai_api_key_here" export ZAI_API_KEY="your_zai_api_key_here"
``` ```
Файл `~/.env.secrets` автоматически подгружается при старте shell. Файл `~/.env.secrets` автоматически подгружается при старте shell.
### WSL: настройка hproxy.local ### WSL: настройка hproxy.local
Имя `hproxy.local` используется как алиас для хоста, на котором работает прокси-сервер. Это позволяет функциям `proxy_on`/`proxy_off` и VS Code Server не зависеть от конкретного IP-адреса. Имя `hproxy.local` используется как алиас для хоста, на котором работает прокси-сервер. Это позволяет функциям `proxy_on`/`proxy_off` и VS Code Server не зависеть от конкретного IP-адреса.
**NAT mode** (по умолчанию в WSL2) — IP шлюза меняется при каждом запуске, поэтому нужен автоматический boot-скрипт: **NAT mode** (по умолчанию в WSL2) — IP шлюза меняется при каждом запуске, поэтому нужен автоматический boot-скрипт:
```bash ```bash
# Вариант 1: через install.sh (интерактивно) # Вариант 1: через install.sh (интерактивно)
./install.sh # ответьте "y" на вопрос про wsl.conf ./install.sh # ответьте "y" на вопрос про wsl.conf
# Вариант 2: вручную # Вариант 2: вручную
sudo tee -a /etc/wsl.conf <<'EOF' sudo tee -a /etc/wsl.conf <<'EOF'
[boot] [boot]
command = "/path/to/dotfiles/scripts/setup-hproxy.sh" command = "/path/to/dotfiles/scripts/setup-hproxy.sh"
EOF EOF
``` ```
После изменения `wsl.conf` перезапустите WSL: `wsl --shutdown`. После изменения `wsl.conf` перезапустите WSL: `wsl --shutdown`.
Обновить `hproxy.local` без перезапуска WSL: Обновить `hproxy.local` без перезапуска WSL:
```bash ```bash
sudo scripts/setup-hproxy.sh sudo scripts/setup-hproxy.sh
# или # или
update_hproxy # интерактивная функция из .bash_functions update_hproxy # интерактивная функция из .bash_functions
``` ```
**Mirror mode** (`networkingMode=mirrored` в `.wslconfig`) — WSL разделяет сетевой стек с хостом, IP не меняется. Достаточно один раз прописать запись в Windows hosts: **Mirror mode** (`networkingMode=mirrored` в `.wslconfig`) — WSL разделяет сетевой стек с хостом, IP не меняется. Достаточно один раз прописать запись в Windows hosts:
``` ```
# C:\Windows\System32\drivers\etc\hosts # C:\Windows\System32\drivers\etc\hosts
192.168.1.100 hproxy.local 192.168.1.100 hproxy.local
``` ```
### VS Code Server в WSL ### VS Code Server в WSL
Файл `vscode/.vscode-server/server-env-setup` выполняется при каждом старте VS Code Server в WSL и делает две вещи: Файл `vscode/.vscode-server/server-env-setup` выполняется при каждом старте VS Code Server в WSL и делает две вещи:
1. **Загружает `~/.env.secrets`** — API ключи становятся доступны расширениям, задачам и терминалам VS Code. Если файл отсутствует или содержит ошибку, выводится warning в stderr, запуск не блокируется. 1. **Загружает `~/.env.secrets`** — API ключи становятся доступны расширениям, задачам и терминалам VS Code. Если файл отсутствует или содержит ошибку, выводится warning в stderr, запуск не блокируется.
2. **Настраивает прокси** — если `hproxy.local` резолвится (через `/etc/hosts` или DNS в режиме mirror), автоматически выставляются: 2. **Настраивает прокси** — если `hproxy.local` резолвится (через `/etc/hosts` или DNS в режиме mirror), автоматически выставляются:
- `HTTP_PROXY` / `http_proxy` → `http://hproxy.local:12334` - `HTTP_PROXY` / `http_proxy` → `http://hproxy.local:12334`
- `HTTPS_PROXY` / `https_proxy` → `http://hproxy.local:12334` - `HTTPS_PROXY` / `https_proxy` → `http://hproxy.local:12334`
- `ALL_PROXY` / `all_proxy` → `socks5://hproxy.local:12334` - `ALL_PROXY` / `all_proxy` → `socks5://hproxy.local:12334`
- `NO_PROXY` / `no_proxy` → `hproxy.local,localhost,127.0.0.1,.concept-software.ru` - `NO_PROXY` / `no_proxy` → `hproxy.local,localhost,127.0.0.1,.concept-software.ru`
После установки/обновления файла сделайте одно из действий: После установки/обновления файла сделайте одно из действий:
- `Developer: Reload Window` в VS Code - `Developer: Reload Window` в VS Code
- или `Remote-WSL: Reconnect to WSL` - или `Remote-WSL: Reconnect to WSL`
Если у вас уже есть локальный `~/.vscode-server/server-env-setup`, stow может сообщить конфликт. Если у вас уже есть локальный `~/.vscode-server/server-env-setup`, stow может сообщить конфликт.
Тогда сохраните старую версию и примените stow повторно: Тогда сохраните старую версию и примените stow повторно:
```bash ```bash
mv ~/.vscode-server/server-env-setup ~/.vscode-server/server-env-setup.bak.$(date +%Y%m%d%H%M%S) mv ~/.vscode-server/server-env-setup ~/.vscode-server/server-env-setup.bak.$(date +%Y%m%d%H%M%S)
stow -vt ~ vscode stow -vt ~ vscode
``` ```
@@ -1,4 +1,4 @@
if (-not $IsWindows) { if (-not ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop')) {
return return
} }
@@ -262,6 +262,6 @@ if (-not $changed) {
$backupPath = '{0}.bak-{1}' -f $settingsPath, (Get-Date -Format 'yyyyMMdd-HHmmss') $backupPath = '{0}.bak-{1}' -f $settingsPath, (Get-Date -Format 'yyyyMMdd-HHmmss')
Copy-Item -LiteralPath $settingsPath -Destination $backupPath -Force Copy-Item -LiteralPath $settingsPath -Destination $backupPath -Force
$settings | ConvertTo-Json -Depth 100 | Set-Content -LiteralPath $settingsPath -Encoding utf8 $settings | ConvertTo-Json -Depth 100 | Set-Content -LiteralPath $settingsPath -Encoding utf8BOM
Write-Host "Updated Windows Terminal settings: $settingsPath" Write-Host "Updated Windows Terminal settings: $settingsPath"
Write-Host "Backup saved to: $backupPath" Write-Host "Backup saved to: $backupPath"
@@ -1,4 +1,4 @@
if (-not $IsWindows) { if (-not ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop')) {
return return
} }