- Зачем:
- на машине без pwsh в стандартном PATH профиль с `commandline = 'pwsh.exe'` ломался, потому что WT игнорировал динамический `source` в пользу явного `commandline`.
- Что:
- PS7 профиль теперь управляется через `source = Windows.Terminal.PowershellCore`, `commandline` удаляется.
- добавлена проверка `Test-PowerShell7Available`: если pwsh не найден, профиль не создаётся.
- добавлена `Remove-JsonPropertyValue` для идемпотентного удаления свойств.
- magic string вынесен в константу `$PowerShellSource`.
- Проверка:
- `chezmoi -S "$HOME\dotfiles\chezmoi" apply --dry-run --verbose`.
- `pwsh -NoProfile -Command "(Get-Content (Join-Path $env:LOCALAPPDATA 'Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json') -Raw | ConvertFrom-Json).profiles.list | Where-Object {$_.source -eq 'Windows.Terminal.PowershellCore'} | ConvertTo-Json"`.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dotfiles
Персональные конфигурации для Linux/WSL (stow) и Windows (chezmoi).
🚀 Quick start
Linux / WSL
git clone https://github.com/ddmitry/dotfiles ~/dotfiles
cd ~/dotfiles
./install.sh
install.sh применяет stow-пакеты, настраивает Claude/Opencode, подключает ~/.bash_custom в ~/.bashrc и в WSL предлагает настроить hproxy.local.
Windows
winget install --id Microsoft.PowerShell
winget install twpayne.chezmoi
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
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.json с chmod 444, создаёт 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/<name>/SKILL.md |
| Claude | ~/.claude/skills → симлинк на agents; settings.json (read-only) + settings.local.json (локальный) |
| Opencode | MCP-серверы (context7, web-reader, playwright и др.), ~/.config/opencode/skills → симлинк на agents |
| Codex | ~/.codex/skills/ → симлинки на agents |
| Gemini | Политики для CLI: pre-approved readonly команды |
⚙️ Настройка
Секреты (.env.secrets)
cp bash/.env.secrets.example ~/.env.secrets
Содержимое — API-ключи для AI-инструментов:
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 шлюза меняется при каждом запуске):
# Через 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 Mirror mode (networkingMode=mirrored) — IP не меняется, достаточно одной записи:
# C:\Windows\System32\drivers\etc\hosts
192.168.1.100 hproxy.local
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:
* 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 (WSL NAT mode) |
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.local.json |
Машинно-специфичные настройки Claude Code (model, effortLevel) |
💡 Дизайн-решения
Почему 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.json копируется, а не симлинкается?
Claude Code перезаписывает settings.json при любом изменении настроек. Если файл — симлинк на tracked файл в git, это создаёт нежелательные diff-ы. Копия с chmod 444 защищает от перезаписи; машинно-специфичные настройки уходят в settings.local.json.