Files
System-Sync-Restore/config/ssr.conf.example
T
Oliver Surke 3e54f0ca20 fix: pre-clean transient dirs + repeat cleanup before every mackup attempt
Root cause: Claude Code recreates ~/.claude/debug/latest (a dangling
symlink to the current debug session) almost immediately after it is
deleted. The old cleanup ran once before the retry loop, so any retry
after a 2s sleep would hit a freshly recreated symlink.

Fix: move _ssr_mackup_preclean() inside the retry loop so it runs
immediately before each mackup attempt, leaving no window for apps to
recreate problematic files.

Also remove known transient subdirectories by path before the generic
socket/dangling-link sweep:
  .claude/debug  .cursor/logs  .vscode/logs  .npm/_logs

Configurable via SSR_MACKUP_PRECLEAN_PATHS (space-separated, $HOME-relative).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 12:17:44 +02:00

130 lines
5.8 KiB
Plaintext

# ssr.conf — System Sync & Restore configuration.
# Format: simple KEY=VALUE pairs. Comments (# …) and blank lines allowed.
# This file is sourced by bash; only the keys below are recognized.
# Anything else will cause ssr to abort.
# ---------------------------------------------------------------------------
# Cloud storage
# ---------------------------------------------------------------------------
# Provider: icloud | dropbox | googledrive | onedrive | custom
SSR_CLOUD_PROVIDER=icloud
# Only used when SSR_CLOUD_PROVIDER=custom. Absolute path.
# SSR_CLOUD_PATH=/Volumes/MyNAS/macos-sync
# Subfolders created inside the cloud root.
SSR_BACKUP_SUBDIR=BACKUP
SSR_MACKUP_SUBDIR=Mackup
# Auto-discover uncovered dot-dirs in $HOME and add them to a generated
# ~/.mackup/ssr-custom.cfg before each backup. Set to "false" to opt out.
SSR_MACKUP_AUTODISCOVER=true
# Subdirs (relative to $HOME) to delete before each mackup backup attempt.
# Handles transient dirs with dangling symlinks or sockets (debug sessions,
# log dirs) that shutil.copytree cannot copy.
# Built-in defaults: .claude/debug .cursor/logs .vscode/logs .npm/_logs
# SSR_MACKUP_PRECLEAN_PATHS=".my-app/tmp .other-app/run"
# Extra paths (relative to $HOME) to always include, space-separated.
# Example: ".easymcp .my-tool .config/my-cli"
# SSR_MACKUP_EXTRA_PATHS=""
# ---------------------------------------------------------------------------
# Homebrew behavior during `ssr sync`
# ---------------------------------------------------------------------------
SSR_BREW_UPGRADE=true
SSR_BREW_CLEANUP=true
# ---------------------------------------------------------------------------
# Unmanaged-app scan during sync
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# iCloud prefetch & keep-local
# ---------------------------------------------------------------------------
# Trigger async iCloud download at sync/restore start so files are available
# before Mackup runs. Wait up to this many seconds before proceeding.
# SSR_ICLOUD_WAIT_TIMEOUT=180
# After sync, mark Mackup folder files as keep-local to prevent iCloud from
# re-evicting them before the next run (LRU touch + xattr, best-effort).
SSR_ICLOUD_KEEP_LOCAL=true
# ---------------------------------------------------------------------------
# Lists .app bundles installed manually (not via brew cask, not via MAS).
# Writes <backup_dir>/unmanaged-apps.txt for restore-time reference.
SSR_SCAN_UNMANAGED_APPS=true
# Colon-separated directories to scan (top level only).
# SSR_APP_DIRS=/Applications:$HOME/Applications
# ---------------------------------------------------------------------------
# macOS preferences snapshot (sync + restore)
# ---------------------------------------------------------------------------
# Snapshot configured pref domains to <backup_dir>/macos-prefs/ during sync
# and replay them at the end of restore (after macos-defaults.sh).
SSR_SNAPSHOT_MACOS_PREFS=true
# Full override of the domain list (space-separated). Uncomment to replace
# the built-in default set.
# SSR_MACOS_PREF_DOMAINS="com.apple.dock com.apple.finder com.apple.symbolichotkeys com.apple.HIToolbox com.apple.spaces com.apple.menuextra.clock NSGlobalDomain"
# Append extra domains to the default set without replacing it.
# SSR_MACOS_PREF_DOMAINS_EXTRA="com.apple.universalaccess com.apple.Spotlight"
# How to resolve conflicts when restore is non-interactive (no TTY, launchd).
# "accept" = snapshot wins; "reject" = declarative macos-defaults.sh wins.
SSR_PREFS_CONFLICT_DEFAULT=accept
# Set to "true" to skip all conflict prompts and auto-accept everywhere.
# SSR_ASSUME_YES=false
# ---------------------------------------------------------------------------
# Extra installers — DMG / PKG / ZIP not available via Homebrew or MAS
# ---------------------------------------------------------------------------
# Create ~/.config/ssr/extra-installers.txt with one URL per line.
# See config/extra-installers.txt.example for the format.
# The file is automatically backed up to the cloud on every `ssr sync`.
# ---------------------------------------------------------------------------
# Shell framework auto-install (runs after mackup restore)
# ---------------------------------------------------------------------------
# Detect shell frameworks referenced in dotfiles that are not yet installed
# (e.g. oh-my-zsh, nvm, pyenv, rustup, starship, …) and install them.
# Set to "false" to skip this step.
# SSR_SHELL_DEPS_ENABLED=true
# Additional custom deps, space-separated, pipe-delimited format:
# "name|check_expression|install_command"
# Example:
# SSR_SHELL_DEPS_EXTRA=(
# "my-tool|command -v my-tool|brew install my-tool"
# "my-fw|[[ -d ~/.my-fw ]]|curl -sSL https://example.com/install.sh | bash"
# )
# ---------------------------------------------------------------------------
# macOS restore behavior
# ---------------------------------------------------------------------------
# Disabling Gatekeeper allows apps from anywhere. Off by default.
SSR_DISABLE_GATEKEEPER=false
# Open every installed cask once after restore (for first-run config).
SSR_OPEN_CASKS=false
# Path to the macOS defaults script applied at the end of `ssr restore`.
# Leave commented to use the repo default (config/macos-defaults.sh).
# SSR_MACOS_DEFAULTS=/path/to/your/macos-defaults.sh
# ---------------------------------------------------------------------------
# Scheduling
# ---------------------------------------------------------------------------
SSR_LAUNCHD_LABEL=de.surke.ssr.sync
SSR_SCHEDULE_HOUR=9
SSR_SCHEDULE_MINUTE=0
# ---------------------------------------------------------------------------
# Paths
# ---------------------------------------------------------------------------
# SSR_STATE_DIR=$HOME/.local/state/ssr
# SSR_LOG_DIR=$HOME/.local/state/ssr/logs