refactor(agents): убраны настройки Claude из git и пакет codex

Claude: из репозитория удалены settings.local.json (разрешения не нужны
при autoapprove), statusline-command.sh и устаревший CLAUDE.md; линкуются
только skills. install.sh убирает артефакты прежних прогонов.

Codex: пакет удалён целиком, ~/.codex - обычный каталог. Персональные
мостики скиллов убраны; миграция раскрывает свёрнутый симлинк и переносит
рантайм-данные. Чищены chezmoi-скрипты.

install.sh: migrate_claude_stow_symlink обобщена в migrate_folded_symlink.
Тесты: 3 устаревших удалены, 3 добавлены; assert_not_exists ловит битые
симлинки.
This commit is contained in:
Dmitry Dementiev committed 2026-10-10 17:15:34 +02:00
1 parent 346b3bfc61
commit c3efe60a00
14 files changed
+122 -407

No files matched your search

+49 -52
View File
@@ -144,28 +144,36 @@ wsl_conf_has_boot_command() {
' "$1" 2>/dev/null
}
# Миграция: если ~/.claude — stow-симлинк, раскрыть в директорию.
migrate_claude_stow_symlink() {
[ -L "$HOME/.claude" ] || return 0
# Миграция: если $1 — stow-симлинк (пакет был свёрнут в репозиторий),
# раскрыть в настоящий каталог и перенести содержимое. Остальные аргументы —
# имена git-tracked файлов, которые остаются в репозитории.
migrate_folded_symlink() {
local link="$1"
shift
[ -L "$link" ] || return 0
info "Миграция: ~/.claude — симлинк, преобразую в директорию..."
info "Миграция: $link — симлинк, преобразую в директорию..."
local stow_dir
stow_dir="$(readlink -f "$HOME/.claude" 2>/dev/null || true)"
rm "$HOME/.claude"
mkdir -p "$HOME/.claude"
stow_dir="$(readlink -f "$link" 2>/dev/null || true)"
rm "$link"
mkdir -p "$link"
if [ -n "$stow_dir" ] && [ -d "$stow_dir" ]; then
for item in "$stow_dir"/* "$stow_dir"/.[!.]*; do
[ -e "$item" ] || continue
local base
[ -e "$item" ] || [ -L "$item" ] || continue
local base skip s
base=$(basename "$item")
# git-tracked файлы остаются в репозитории
case "$base" in .gitignore|settings.local.json|skills) continue ;; esac
mv "$item" "$HOME/.claude/" 2>/dev/null || true
skip=""
for s in "$@"; do
[ "$base" = "$s" ] && skip=1
done
[ -n "$skip" ] && continue
mv "$item" "$link/" 2>/dev/null || true
done
info "Рантайм-данные перенесены в ~/.claude/"
info "Рантайм-данные перенесены в $link/"
else
warn "Не удалось прочитать источник старого симлинка ~/.claude, продолжаю без миграции данных"
warn "Не удалось прочитать источник старого симлинка $link, продолжаю без миграции данных"
fi
}
@@ -178,7 +186,7 @@ migrate_claude_stow_symlink() {
#
# Обход повторяет логику stow, а не перебирает файлы подряд: если каталога в
# HOME нет, конфликта быть не может и всё поддерево пропускается. Это заодно
# отсекает свёрнутые пакеты (~/.codex, ~/.vscode-server) с их гигабайтами
# отсекает свёрнутые пакеты (~/.vscode-server) с их гигабайтами
# рантайм-данных.
backup_conflicting_stow_targets() {
local pkg=""
@@ -370,7 +378,7 @@ if ! command -v "$STOW_BIN" &>/dev/null; then
exit 1
fi
PACKAGES=(bash tmux vim wezterm kitty vscode agents codex gemini proxy-client chatgpt)
PACKAGES=(bash tmux vim wezterm kitty vscode agents gemini proxy-client chatgpt)
AVAILABLE_PACKAGES=()
info "Применяю stow пакеты..."
@@ -445,52 +453,41 @@ if [ -f "$OPENCODE_JSON_SRC" ]; then
fi
# ── Claude Code ──────────────────────────────────────────────────────
# settings.local.json ЛИНКУЕТСЯ из репозитория (базовые permissions + statusLine).
# Claude Code не модифицирует settings.local.json — только читает и мержит
# с settings.json, который Claude Code создаёт и обновляет самостоятельно.
# Машинно-специфичные настройки (model, effortLevel) — в settings.json.
# Из репозитория линкуются только skills. Настройки (settings.json,
# settings.local.json) принадлежат Claude Code и живут только на машине.
migrate_claude_stow_symlink
migrate_folded_symlink "$HOME/.claude" .gitignore skills
mkdir -p "$HOME/.claude"
# Уборка артефактов прежних версий установщика: битые симлинки на удалённые
# из репозитория файлы и забытая копия statusline (наша — по строке-маркеру).
for stale in CLAUDE.md settings.local.json; do
stale_path="$HOME/.claude/$stale"
if [ -L "$stale_path" ]; then
case "$(readlink "$stale_path" 2>/dev/null || true)" in
"$DOTFILES_DIR"/*)
rm "$stale_path"
info "Удалён устаревший симлинк ~/.claude/$stale"
;;
esac
fi
done
if [ -f "$HOME/.claude/statusline-command.sh" ] && [ ! -L "$HOME/.claude/statusline-command.sh" ] \
&& grep -q "Статусная строка Claude Code" "$HOME/.claude/statusline-command.sh" 2>/dev/null; then
rm "$HOME/.claude/statusline-command.sh"
info "Удалена устаревшая копия ~/.claude/statusline-command.sh"
fi
# Skills (симлинк)
if [ -d "$SKILLS_SRC" ]; then
ensure_symlink "$SKILLS_SRC" "$HOME/.claude/skills"
fi
# Глобальный CLAUDE.md — словарь рабочего процесса (симлинк)
CLAUDE_MD_SRC="$DOTFILES_DIR/claude/.claude/CLAUDE.md"
if [ -f "$CLAUDE_MD_SRC" ]; then
ensure_symlink "$CLAUDE_MD_SRC" "$HOME/.claude/CLAUDE.md"
fi
# ── Codex ────────────────────────────────────────────────────────────
# Пакета в репозитории нет: ~/.codex — обычный каталог, его заполняет Codex.
# Миграция раскрывает старый свёрнутый симлинк и переносит рантайм-данные.
# settings.local.json — базовые настройки из репозитория (симлинк)
CLAUDE_LOCAL_SRC="$DOTFILES_DIR/claude/.claude/settings.local.json"
CLAUDE_LOCAL_DST="$HOME/.claude/settings.local.json"
if [ -f "$CLAUDE_LOCAL_SRC" ]; then
if [ -L "$CLAUDE_LOCAL_DST" ]; then
ln -sfnT "$CLAUDE_LOCAL_SRC" "$CLAUDE_LOCAL_DST"
info "settings.local.json → репозиторий"
elif [ -f "$CLAUDE_LOCAL_DST" ]; then
backup_existing_path "$CLAUDE_LOCAL_DST" "settings.local.json"
ln -s "$CLAUDE_LOCAL_SRC" "$CLAUDE_LOCAL_DST"
info "settings.local.json → репозиторий"
info "Машинно-специфичные настройки (model, effortLevel) теперь задаются через Claude Code"
elif [ -d "$CLAUDE_LOCAL_DST" ] || [ -e "$CLAUDE_LOCAL_DST" ]; then
warn "$CLAUDE_LOCAL_DST уже существует (не файл и не симлинк), удалите вручную"
else
ln -s "$CLAUDE_LOCAL_SRC" "$CLAUDE_LOCAL_DST"
info "settings.local.json → репозиторий"
fi
fi
# statusline-command.sh — копия из репозитория (на Windows симлинки ненадёжны)
CLAUDE_STATUSLINE_SRC="$DOTFILES_DIR/claude/.claude/statusline-command.sh"
CLAUDE_STATUSLINE_DST="$HOME/.claude/statusline-command.sh"
if [ -f "$CLAUDE_STATUSLINE_SRC" ]; then
install -m 755 "$CLAUDE_STATUSLINE_SRC" "$CLAUDE_STATUSLINE_DST"
info "statusline-command.sh скопирован в ~/.claude/"
fi
migrate_folded_symlink "$HOME/.codex" .gitkeep
# ── Bash: .bashrc ────────────────────────────────────────────────────