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:
1 parent
bdccd889fe
commit
9341853479
6 files changed
+117
-69
No files matched your search
+62
-10
@@ -101,23 +101,72 @@ test_fresh_install_uses_home_target() {
|
||||
assert_not_exists "$fixture/.bash_custom"
|
||||
}
|
||||
|
||||
test_dirty_repo_settings_copy_uses_committed_version() {
|
||||
test_settings_local_is_symlinked_to_repo() {
|
||||
local fixture repo_root home_dir
|
||||
fixture="$(setup_fixture)"
|
||||
repo_root="$fixture/repo"
|
||||
home_dir="$fixture/home"
|
||||
mkdir -p "$home_dir"
|
||||
|
||||
chmod u+w "$repo_root/claude/.claude/settings.json"
|
||||
cat > "$repo_root/claude/.claude/settings.json" <<'EOF'
|
||||
{"source":"working-tree"}
|
||||
EOF
|
||||
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >/tmp/test-install.out
|
||||
|
||||
FAKE_GIT_SHOW_CONTENT='{"source":"head"}' \
|
||||
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >/tmp/test-install.out
|
||||
[ -L "$home_dir/.claude/settings.local.json" ] || fail "Expected settings.local.json to be a symlink"
|
||||
local target
|
||||
target="$(readlink -f "$home_dir/.claude/settings.local.json")"
|
||||
local expected
|
||||
expected="$(readlink -f "$repo_root/claude/.claude/settings.local.json")"
|
||||
[ "$target" = "$expected" ] || fail "settings.local.json points to $target, expected $expected"
|
||||
}
|
||||
|
||||
assert_file_contains "$home_dir/.claude/settings.json" '"source":"head"'
|
||||
assert_file_contains "$repo_root/claude/.claude/settings.json" '"source":"working-tree"'
|
||||
test_settings_local_backup_on_existing_file() {
|
||||
local fixture repo_root home_dir
|
||||
fixture="$(setup_fixture)"
|
||||
repo_root="$fixture/repo"
|
||||
home_dir="$fixture/home"
|
||||
mkdir -p "$home_dir/.claude"
|
||||
echo '{"model":"sonnet"}' > "$home_dir/.claude/settings.local.json"
|
||||
|
||||
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >/tmp/test-install.out
|
||||
|
||||
[ -L "$home_dir/.claude/settings.local.json" ] || fail "Expected settings.local.json to become a symlink"
|
||||
local backup
|
||||
backup="$(find "$home_dir/.claude" -maxdepth 1 -name 'settings.local.json.bak.*' -print -quit)"
|
||||
[ -n "$backup" ] || fail "Expected backup for existing settings.local.json"
|
||||
assert_file_contains "$backup" '"model":"sonnet"'
|
||||
}
|
||||
|
||||
test_settings_local_dir_is_skipped() {
|
||||
local fixture repo_root home_dir
|
||||
fixture="$(setup_fixture)"
|
||||
repo_root="$fixture/repo"
|
||||
home_dir="$fixture/home"
|
||||
mkdir -p "$home_dir/.claude/settings.local.json"
|
||||
|
||||
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >/tmp/test-install.out
|
||||
|
||||
[ -d "$home_dir/.claude/settings.local.json" ] || fail "Expected directory to be preserved (not replaced)"
|
||||
}
|
||||
|
||||
test_stow_migration_preserves_legacy_settings_local() {
|
||||
local fixture repo_root home_dir stow_target
|
||||
fixture="$(setup_fixture)"
|
||||
repo_root="$fixture/repo"
|
||||
home_dir="$fixture/home"
|
||||
mkdir -p "$home_dir"
|
||||
|
||||
# Simulate old stow layout: ~/.claude → repo dir
|
||||
stow_target="$repo_root/claude/.claude"
|
||||
ln -s "$stow_target" "$home_dir/.claude"
|
||||
# Put a legacy settings.local.json in the stow target (would have been gitignored before)
|
||||
echo '{"model":"opus"}' > "$stow_target/legacy-local.json"
|
||||
|
||||
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >/tmp/test-install.out
|
||||
|
||||
[ -d "$home_dir/.claude" ] || fail "Expected ~/.claude to become a directory"
|
||||
[ ! -L "$home_dir/.claude" ] || fail "Expected ~/.claude to stop being a symlink"
|
||||
[ -L "$home_dir/.claude/settings.local.json" ] || fail "Expected settings.local.json symlink after migration"
|
||||
# legacy-local.json should have been moved from stow dir to real ~/.claude
|
||||
[ -f "$home_dir/.claude/legacy-local.json" ] || fail "Expected legacy file to be migrated"
|
||||
}
|
||||
|
||||
test_rerun_does_not_duplicate_bashrc_line() {
|
||||
@@ -332,7 +381,10 @@ main() {
|
||||
command -v stow >/dev/null 2>&1 || fail "stow is required for tests"
|
||||
|
||||
test_fresh_install_uses_home_target
|
||||
test_dirty_repo_settings_copy_uses_committed_version
|
||||
test_settings_local_is_symlinked_to_repo
|
||||
test_settings_local_backup_on_existing_file
|
||||
test_settings_local_dir_is_skipped
|
||||
test_stow_migration_preserves_legacy_settings_local
|
||||
test_rerun_does_not_duplicate_bashrc_line
|
||||
test_repairs_nested_skills_directory_bug
|
||||
test_preserves_nonempty_skills_directory
|
||||
|
||||
Reference in new issue
Block a user