feat(dotfiles): улучшена установка и управление конфигурацией

- Зачем:
  - нужен воспроизводимый способ установки на новую машину и защита от перезаписи tracked-файлов ИИ-инструментами.
- Что:
  - добавлен install.sh: stow всех пакетов, создание settings.local.json, chmod 444 на settings.json, автопатч .bashrc.
  - claude/settings.json разделён на базовый (permissions, statusLine) и локальный (model, effortLevel в settings.local.json).
  - добавлен .concept-software.ru в NO_PROXY в server-env-setup и bash_functions.
  - README переработан: install.sh как рекомендуемый способ, документация двухуровневых настроек Claude, Developer Mode hint, расширенное описание VS Code прокси.
- Проверка:
  - git clone + ./install.sh на чистой машине.
This commit is contained in:
ddadmin committed 2026-03-14 11:31:10 +03:00
1 parent 0009270c6e
commit 984db1b6d7
5 files changed
+118 -61

No files matched your search

+47 -56
View File
@@ -38,7 +38,8 @@
- **Файл:** `vscode/.vscode-server/server-env-setup`
- Поддержка `~/.vscode-server/server-env-setup` для VS Code Server в WSL
- Подгрузка `~/.env.secrets` для расширений, задач/debug и терминалов VS Code
- Режим `fail-open`: при проблеме с файлом выводится warning, запуск VS Code не блокируется
- Автоматическая настройка прокси: если `hproxy.local` резолвится, выставляются `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` (socks5), `NO_PROXY` и их lowercase-варианты
- Режим `fail-open`: если `~/.env.secrets` отсутствует или не загружается — warning в stderr, VS Code продолжает запуск
### Opencode
- **Директория:** `opencode/.config/opencode/`
@@ -62,68 +63,54 @@
### Claude
- **Директория:** `claude/.claude/`
- Тонкий симлинк `~/.claude/skills` на общие skills из `~/.agents/skills/`
- **Двухуровневые настройки:**
- `settings.json` (в dotfiles, read-only) — стабильная база: permissions, statusLine
- `settings.local.json` (локальный, не в git) — машинно-специфичное: model, effortLevel
- Claude Code мержит оба файла, `settings.local.json` имеет приоритет
- `settings.json` защищён `chmod 444`, чтобы Claude Code не перезаписывал tracked файл
### Gemini
- **Директория:** `gemini/.gemini/`
- Политики для Gemini CLI: pre-approved readonly команды
## 🚀 Установка
### Stow (рекомендуется)
### Автоматическая (рекомендуется)
```bash
# Установка stow
sudo apt install stow
# Применение конфигов
cd /path/to/dotfiles
stow bash tmux vim zed vscode agents opencode codex claude
git clone https://github.com/ddmitry/dotfiles ~/dotfiles
cd ~/dotfiles
./install.sh
```
Важно: `bash` пакет кладет файлы `~/.bash_custom`, `~/.bash_functions`, `~/.bash_prompt`. Убедитесь, что ваш `~/.bashrc` содержит строку:
Скрипт `install.sh`:
- Применяет все stow пакеты
- Создаёт `~/.claude/settings.local.json` с дефолтными model/effortLevel
- Защищает `settings.json` от перезаписи (`chmod 444`)
- Автоматически добавляет подключение bash_custom в `~/.bashrc`
### Stow вручную
```bash
sudo apt install stow
cd /path/to/dotfiles
stow bash tmux vim zed vscode agents opencode codex claude gemini
```
После stow добавьте в `~/.bashrc` (если не используете `install.sh`):
```bash
[ -f ~/.bash_custom ] && source ~/.bash_custom
```
### Ручная установка
Создайте локальные настройки Claude:
```bash
# Bash
cp bash/.bash_custom ~/.bash_custom
cp bash/.bash_functions ~/.bash_functions
cp bash/.bash_prompt ~/.bash_prompt
# Подключите кастомные настройки в ~/.bashrc (один раз)
# [ -f ~/.bash_custom ] && source ~/.bash_custom
source ~/.bashrc
# Tmux
cp tmux/.tmux.conf ~/
tmux source-file ~/.tmux.conf
# Vim
cp vim/.vimrc ~/
# Zed
mkdir -p ~/.config/zed
cp zed/.config/zed/* ~/.config/zed/ 2>/dev/null || true
# VS Code (WSL)
mkdir -p ~/.vscode-server
cp vscode/.vscode-server/server-env-setup ~/.vscode-server/server-env-setup
chmod +x ~/.vscode-server/server-env-setup
# Opencode
mkdir -p ~/.config/opencode
cp opencode/.config/opencode/* ~/.config/opencode/
# Agents (shared skills)
mkdir -p ~/.agents/skills
cp -r agents/.agents/skills/* ~/.agents/skills/
# Codex (bridge to shared skills)
mkdir -p ~/.codex/skills
ln -snf ~/.agents/skills/conventional-commits ~/.codex/skills/conventional-commits
# Claude (bridge to shared skills)
mkdir -p ~/.claude
ln -snf ~/.agents/skills ~/.claude/skills
cat > ~/.claude/settings.local.json <<'EOF'
{
"model": "opus",
"effortLevel": "high"
}
EOF
```
### Windows (chezmoi)
@@ -134,6 +121,7 @@ ln -snf ~/.agents/skills ~/.claude/skills
**⚠️ Требования:**
- Developer Mode должен быть включён (для создания симлинков)
> Settings → System → For developers → Developer Mode → On
- PowerShell 5.0+ или PowerShell Core
**Установка (два шага):**
@@ -215,8 +203,15 @@ export ZAI_API_KEY="your_zai_api_key_here"
### VS Code Server в WSL
Для VS Code в WSL используется файл `~/.vscode-server/server-env-setup`.
В этом репозитории он находится в `vscode/.vscode-server/server-env-setup` и подгружает `~/.env.secrets` в окружение VS Code Server.
Файл `vscode/.vscode-server/server-env-setup` выполняется при каждом старте VS Code Server в WSL и делает две вещи:
1. **Загружает `~/.env.secrets`** — API ключи становятся доступны расширениям, задачам и терминалам VS Code. Если файл отсутствует или содержит ошибку, выводится warning в stderr, запуск не блокируется.
2. **Настраивает прокси** — если `hproxy.local` резолвится (через `/etc/hosts` или DNS в режиме mirror), автоматически выставляются:
- `HTTP_PROXY` / `http_proxy` → `http://hproxy.local:12334`
- `HTTPS_PROXY` / `https_proxy` → `http://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`
После установки/обновления файла сделайте одно из действий:
- `Developer: Reload Window` в VS Code
@@ -228,7 +223,3 @@ export ZAI_API_KEY="your_zai_api_key_here"
mv ~/.vscode-server/server-env-setup ~/.vscode-server/server-env-setup.bak.$(date +%Y%m%d%H%M%S)
stow -vt ~ vscode
```
Скрипт работает в режиме `fail-open`: если `~/.env.secrets` отсутствует или содержит ошибку, VS Code продолжит запуск, а warning появится в логах.
См. `.env.example` для дополнительной информации.
+1 -1
View File
@@ -50,7 +50,7 @@ proxy_on() {
export HTTP_PROXY="http://hproxy.local:12334"
export HTTPS_PROXY="http://hproxy.local:12334"
export ALL_PROXY="socks5://hproxy.local:12334"
export NO_PROXY="hproxy.local,localhost,127.0.0.1"
export NO_PROXY="hproxy.local,localhost,127.0.0.1,.concept-software.ru"
echo "✅ Proxy enabled. Checking route..."
# Подставляем результат выполнения curl прямо в строку
echo "🌍 Current IP: $(curl -s --max-time 3 https://ifconfig.me)"
+1 -3
View File
@@ -95,10 +95,8 @@
"Bash(stow *)"
]
},
"model": "opus",
"statusLine": {
"type": "command",
"command": "bash ~/.claude/statusline-command.sh"
},
"effortLevel": "high"
}
}
Executable
+68
View File
@@ -0,0 +1,68 @@
#!/usr/bin/env bash
set -euo pipefail
DOTFILES_DIR="$(cd "$(dirname "$0")" && pwd)"
# --- Цвета ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[+]${NC} $*"; }
warn() { echo -e "${YELLOW}[!]${NC} $*"; }
error() { echo -e "${RED}[✗]${NC} $*"; }
# --- Проверка stow ---
if ! command -v stow &>/dev/null; then
error "stow не найден. Установите: sudo apt install stow"
exit 1
fi
# --- Stow пакеты ---
PACKAGES=(bash tmux vim zed vscode agents opencode codex claude gemini)
info "Применяю stow пакеты..."
cd "$DOTFILES_DIR"
for pkg in "${PACKAGES[@]}"; do
if [ -d "$pkg" ]; then
stow -v --restow "$pkg" 2>&1 | sed "s/^/ /"
else
warn "Пакет $pkg не найден, пропускаю"
fi
done
# --- Claude: settings.local.json ---
CLAUDE_LOCAL="$HOME/.claude/settings.local.json"
if [ ! -f "$CLAUDE_LOCAL" ]; then
info "Создаю $CLAUDE_LOCAL (локальные настройки Claude)..."
cat > "$CLAUDE_LOCAL" <<'EOF'
{
"model": "opus",
"effortLevel": "high"
}
EOF
else
warn "$CLAUDE_LOCAL уже существует, пропускаю"
fi
# --- Claude: защита settings.json от перезаписи ---
CLAUDE_SETTINGS="$DOTFILES_DIR/claude/.claude/settings.json"
if [ -f "$CLAUDE_SETTINGS" ]; then
chmod 444 "$CLAUDE_SETTINGS"
info "settings.json защищён от записи (chmod 444)"
fi
# --- Bash: подключение в .bashrc ---
BASHRC="$HOME/.bashrc"
BASHRC_LINE='[ -f ~/.bash_custom ] && source ~/.bash_custom'
if grep -q 'bash_custom' "$BASHRC" 2>/dev/null; then
warn "~/.bashrc уже содержит bash_custom, пропускаю"
else
echo "" >> "$BASHRC"
echo "# dotfiles" >> "$BASHRC"
echo "$BASHRC_LINE" >> "$BASHRC"
info "Добавлено в ~/.bashrc: $BASHRC_LINE"
fi
info "Готово!"
+1 -1
View File
@@ -25,7 +25,7 @@ if getent hosts hproxy.local >/dev/null 2>&1; then
export HTTP_PROXY="$proxy_url"
export HTTPS_PROXY="$proxy_url"
export ALL_PROXY="socks5://hproxy.local:12334"
export NO_PROXY="hproxy.local,localhost,127.0.0.1"
export NO_PROXY="hproxy.local,localhost,127.0.0.1,.concept-software.ru"
# Дублируем в нижнем регистре для лучшей совместимости с инструментами
export http_proxy="$HTTP_PROXY"