refactor(claude): settings.json отдан Claude Code, базовые настройки в settings.local.json

- Зачем:
  - Claude Code перезаписывает settings.json при каждом «always allow», что создавало
    конфликт с managed-копией из dotfiles при повторном запуске install.sh.
- Что:
  - settings.json удалён из репозитория, Claude Code владеет им полностью.
  - создан settings.local.json (базовые permissions + statusLine), деплоится через симлинк.
  - install.sh: копирование + шаблон заменены на ln -sf с бэкапом и guard для edge cases.
  - check.sh: проверка обновлена под симлинк вместо «файл + chmod 444».
  - тесты: старый тест копирования заменён на 4 новых (симлинк, бэкап, директория, stow-миграция).
- Проверка:
  - bash tests/test_install.sh (15 тестов).
  - bash agents/.agents/skills/dotfiles-check/check.sh.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Opus 4.6 committed 2026-03-31 10:28:41 +03:00
1 parent bdccd889fe
commit 9341853479
6 files changed
+117 -69

No files matched your search

+13 -22
View File
@@ -28,7 +28,7 @@ echo "════════════════════════
for pkg_dir in "$DOTFILES_DIR"/*/; do
pkg=$(basename "$pkg_dir")
[[ "$pkg" == .* ]] && continue
# claude управляется вручную (копирование settings.json), не через stow
# claude управляется вручную (симлинк settings.local.json), не через stow
[[ "$pkg" == "claude" ]] && continue
# Точки входа — элементы первого уровня внутри пакета
@@ -110,30 +110,21 @@ if [ -f "$install_script" ]; then
err "~/.claude — не найден"
fi
# Claude Code: settings.json должен быть копией, не симлинком
if [ -L "$HOME/.claude/settings.json" ]; then
err "~/.claude/settings.json — симлинк (должна быть копия)"
elif [ -f "$HOME/.claude/settings.json" ]; then
pass "~/.claude/settings.json — файл (копия)"
else
err "~/.claude/settings.json — не найден"
fi
# chmod 444 на settings.json в репозитории
if [ -f "$DOTFILES_DIR/claude/.claude/settings.json" ]; then
perms=$(stat -c %a "$DOTFILES_DIR/claude/.claude/settings.json" 2>/dev/null || true)
if [ "$perms" = "444" ]; then
pass "claude/settings.json — chmod 444"
# Claude Code: settings.local.json должен быть симлинком на репозиторий
if [ -L "$HOME/.claude/settings.local.json" ]; then
local_target=$(readlink -f "$HOME/.claude/settings.local.json" 2>/dev/null || true)
local_expected=$(readlink -f "$DOTFILES_DIR/claude/.claude/settings.local.json" 2>/dev/null || true)
if [ "$local_target" = "$local_expected" ]; then
pass "~/.claude/settings.local.json → репозиторий"
else
skip "claude/settings.json — chmod $perms (ожидался 444)"
err "~/.claude/settings.local.json → $local_target (ожидался $local_expected)"
fi
fi
# settings.local.json
if [ -f "$HOME/.claude/settings.local.json" ]; then
pass "~/.claude/settings.local.json существует"
elif [ -f "$HOME/.claude/settings.local.json" ]; then
err "~/.claude/settings.local.json — обычный файл (должен быть симлинк). Запустите install.sh"
elif [ -e "$HOME/.claude/settings.local.json" ]; then
err "~/.claude/settings.local.json — не файл и не симлинк. Удалите вручную и запустите install.sh"
else
skip "~/.claude/settings.local.json — не найден (создайте через install.sh)"
err "~/.claude/settings.local.json — не найден (запустите install.sh)"
fi
# skills симлинк