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:
1 parent
346b3bfc61
commit
c3efe60a00
14 files changed
+122
-407
No files matched your search
+49
-52
@@ -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 ────────────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in new issue
Block a user