diff --git a/home-manager/services/code-syncer/default.nix b/home-manager/services/code-syncer/default.nix index be81b0804..ae4602ef5 100644 --- a/home-manager/services/code-syncer/default.nix +++ b/home-manager/services/code-syncer/default.nix @@ -1,6 +1,9 @@ { pkgs, ... }: +let + inherit (pkgs) lib; +in { - launchd.agents.code-syncer = pkgs.lib.mkIf pkgs.stdenv.isDarwin { + launchd.agents.code-syncer = lib.mkIf pkgs.stdenv.isDarwin { enable = true; config = { ProgramArguments = [ @@ -8,7 +11,7 @@ "${./sync.sh}" ]; Environment = { - PATH = "${pkgs.lib.makeBinPath [ + PATH = "${lib.makeBinPath [ pkgs.fswatch ]}"; }; @@ -18,4 +21,26 @@ StandardErrorPath = "/tmp/code-syncer.error.log"; }; }; + + systemd.user.services.code-syncer = lib.mkIf pkgs.stdenv.isLinux { + Unit = { + Description = "VS Code settings syncer"; + }; + Service = { + Type = "simple"; + Environment = "PATH=${ + lib.makeBinPath [ + pkgs.bash + pkgs.coreutils + pkgs.inotify-tools + ] + }"; + ExecStart = "${pkgs.bash}/bin/bash ${./sync.sh}"; + Restart = "always"; + RestartSec = 10; + }; + Install = { + WantedBy = [ "default.target" ]; + }; + }; } diff --git a/home-manager/services/code-syncer/sync.sh b/home-manager/services/code-syncer/sync.sh index b65ec4d40..b29c62d88 100755 --- a/home-manager/services/code-syncer/sync.sh +++ b/home-manager/services/code-syncer/sync.sh @@ -3,12 +3,24 @@ # --- CONFIGURATION --- -# Base directories -VSCODE_USER_DIR="$HOME/Library/Application Support/Code/User" -VSCODE_INSIDERS_USER_DIR="$HOME/Library/Application Support/Code - Insiders/User" -ANTIGRAVITY_USER_DIR="$HOME/Library/Application Support/Antigravity/User" -CURSOR_USER_DIR="$HOME/Library/Application Support/Cursor/User" -WINDSURF_USER_DIR="$HOME/Library/Application Support/Windsurf/User" +# Detect OS +OS_TYPE="$(uname -s)" + +# Base directories (OS-specific) +if [ "$OS_TYPE" = "Darwin" ]; then + VSCODE_USER_DIR="$HOME/Library/Application Support/Code/User" + VSCODE_INSIDERS_USER_DIR="$HOME/Library/Application Support/Code - Insiders/User" + ANTIGRAVITY_USER_DIR="$HOME/Library/Application Support/Antigravity/User" + CURSOR_USER_DIR="$HOME/Library/Application Support/Cursor/User" + WINDSURF_USER_DIR="$HOME/Library/Application Support/Windsurf/User" +else + # Linux/Other + VSCODE_USER_DIR="$HOME/.config/Code/User" + VSCODE_INSIDERS_USER_DIR="$HOME/.config/Code - Insiders/User" + ANTIGRAVITY_USER_DIR="$HOME/.config/Antigravity/User" + CURSOR_USER_DIR="$HOME/.config/Cursor/User" + WINDSURF_USER_DIR="$HOME/.config/Windsurf/User" +fi # Files SETTINGS_FILE="settings.json" @@ -94,14 +106,21 @@ clean_extension_list() { cp "$input_source" "$clean_file" fi + # Use appropriate sed syntax for OS + if [ "$OS_TYPE" = "Darwin" ]; then + SED_INPLACE="sed -i ''" + else + SED_INPLACE="sed -i" + fi + for bad_ext in "${PROPRIETARY_EXTENSIONS[@]}"; do # Remove the line containing the bad extension - sed -i '' "/$bad_ext/d" "$clean_file" + $SED_INPLACE "/$bad_ext/d" "$clean_file" done for ai_ext in "${AI_EXTENSIONS[@]}"; do # Remove the line containing the AI extension - sed -i '' "/$ai_ext/d" "$clean_file" + $SED_INPLACE "/$ai_ext/d" "$clean_file" done } @@ -394,14 +413,29 @@ install_extensions "windsurf" echo "Initial Sync Complete." -# 4. Watcher (Mac only) -if command -v fswatch >/dev/null; then - echo "Watching for changes in VS Code settings..." - fswatch -o "$VSCODE_USER_DIR/$SETTINGS_FILE" "$VSCODE_USER_DIR/$KEYBINDINGS_FILE" | while read num; do - sync_config_file "$SETTINGS_FILE" - sync_config_file "$KEYBINDINGS_FILE" - echo "Updated at $(date)" - done +# 4. Watcher (OS-specific) +if [ "$OS_TYPE" = "Darwin" ]; then + # macOS: use fswatch + if command -v fswatch >/dev/null; then + echo "Watching for changes in VS Code settings (macOS)..." + fswatch -o "$VSCODE_USER_DIR/$SETTINGS_FILE" "$VSCODE_USER_DIR/$KEYBINDINGS_FILE" | while read num; do + sync_config_file "$SETTINGS_FILE" + sync_config_file "$KEYBINDINGS_FILE" + echo "Updated at $(date)" + done + else + echo "fswatch not found. Auto-sync disabled." + fi else - echo "fswatch not found. Auto-sync disabled." + # Linux: use inotifywait + if command -v inotifywait >/dev/null; then + echo "Watching for changes in VS Code settings (Linux)..." + inotifywait -m -e modify,create "$VSCODE_USER_DIR/$SETTINGS_FILE" "$VSCODE_USER_DIR/$KEYBINDINGS_FILE" 2>/dev/null | while read -r directory events filename; do + sync_config_file "$SETTINGS_FILE" + sync_config_file "$KEYBINDINGS_FILE" + echo "Updated at $(date)" + done + else + echo "inotifywait not found. Auto-sync disabled." + fi fi diff --git a/home-manager/services/dotfiles-updater/default.nix b/home-manager/services/dotfiles-updater/default.nix index dee1a48f1..07684c6b4 100644 --- a/home-manager/services/dotfiles-updater/default.nix +++ b/home-manager/services/dotfiles-updater/default.nix @@ -38,12 +38,16 @@ in Type = "oneshot"; Environment = "PATH=${ lib.makeBinPath [ - pkgs.git pkgs.bash pkgs.coreutils - pkgs.gnumake pkgs.curl + pkgs.gawk + pkgs.git + pkgs.gnumake + pkgs.gnused pkgs.nix + pkgs.sudo + pkgs.which ] }"; ExecStart = "${./update.sh}"; diff --git a/named-hosts/kyber/default.nix b/named-hosts/kyber/default.nix index 3a74cb7e0..a5f154e47 100644 --- a/named-hosts/kyber/default.nix +++ b/named-hosts/kyber/default.nix @@ -134,8 +134,8 @@ home-manager.lib.homeManagerConfiguration { enable = true; enableSshSupport = false; pinentry.package = pkgs.pinentry-tty; - defaultCacheTtl = 1800; - maxCacheTtl = 7200; + defaultCacheTtl = 94608000; # 3 years + maxCacheTtl = 94608000; # 3 years }; # GPG_TTY is set in fish shell init instead of sessionVariables diff --git a/spec/code_syncer_spec.sh b/spec/code_syncer_spec.sh index a99d42d24..53763ad2f 100644 --- a/spec/code_syncer_spec.sh +++ b/spec/code_syncer_spec.sh @@ -7,11 +7,20 @@ SCRIPT="$PWD/home-manager/services/code-syncer/sync.sh" Describe 'VS Code CLI detection' setup() { TEMP_HOME=$(mktemp -d) - mkdir -p "$TEMP_HOME/Library/Application Support/Code/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Cursor/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Windsurf/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Antigravity/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Code - Insiders/User" + OS_TYPE="$(uname -s)" + if [ "$OS_TYPE" = "Darwin" ]; then + mkdir -p "$TEMP_HOME/Library/Application Support/Code/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Cursor/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Windsurf/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Antigravity/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Code - Insiders/User" + else + mkdir -p "$TEMP_HOME/.config/Code/User" + mkdir -p "$TEMP_HOME/.config/Cursor/User" + mkdir -p "$TEMP_HOME/.config/Windsurf/User" + mkdir -p "$TEMP_HOME/.config/Antigravity/User" + mkdir -p "$TEMP_HOME/.config/Code - Insiders/User" + fi } cleanup() { @@ -30,15 +39,24 @@ End Describe 'extension filtering' setup() { - mock_bin_setup code fswatch + mock_bin_setup code fswatch inotifywait TEMP_HOME=$(mktemp -d) # Create required directories - mkdir -p "$TEMP_HOME/Library/Application Support/Code/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Cursor/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Windsurf/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Antigravity/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Code - Insiders/User" + OS_TYPE="$(uname -s)" + if [ "$OS_TYPE" = "Darwin" ]; then + mkdir -p "$TEMP_HOME/Library/Application Support/Code/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Cursor/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Windsurf/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Antigravity/User" + mkdir -p "$TEMP_HOME/Library/Application Support/Code - Insiders/User" + else + mkdir -p "$TEMP_HOME/.config/Code/User" + mkdir -p "$TEMP_HOME/.config/Cursor/User" + mkdir -p "$TEMP_HOME/.config/Windsurf/User" + mkdir -p "$TEMP_HOME/.config/Antigravity/User" + mkdir -p "$TEMP_HOME/.config/Code - Insiders/User" + fi # Create mock VS Code CLI that lists extensions cat >"$MOCK_BIN/code" <<'EOF' @@ -88,20 +106,35 @@ End Describe 'config file syncing' setup() { - mock_bin_setup code fswatch cp + mock_bin_setup code fswatch cp inotifywait TEMP_HOME=$(mktemp -d) + # Detect OS and create appropriate directories + OS_TYPE="$(uname -s)" + if [ "$OS_TYPE" = "Darwin" ]; then + VSCODE_DIR="$TEMP_HOME/Library/Application Support/Code/User" + VSCODE_INSIDERS_DIR="$TEMP_HOME/Library/Application Support/Code - Insiders/User" + CURSOR_DIR="$TEMP_HOME/Library/Application Support/Cursor/User" + WINDSURF_DIR="$TEMP_HOME/Library/Application Support/Windsurf/User" + ANTIGRAVITY_DIR="$TEMP_HOME/Library/Application Support/Antigravity/User" + else + VSCODE_DIR="$TEMP_HOME/.config/Code/User" + VSCODE_INSIDERS_DIR="$TEMP_HOME/.config/Code - Insiders/User" + CURSOR_DIR="$TEMP_HOME/.config/Cursor/User" + WINDSURF_DIR="$TEMP_HOME/.config/Windsurf/User" + ANTIGRAVITY_DIR="$TEMP_HOME/.config/Antigravity/User" + fi + # Create VS Code user directory with config files - VSCODE_DIR="$TEMP_HOME/Library/Application Support/Code/User" mkdir -p "$VSCODE_DIR" echo '{"editor.fontSize": 14}' >"$VSCODE_DIR/settings.json" echo '[]' >"$VSCODE_DIR/keybindings.json" # Create target directories - mkdir -p "$TEMP_HOME/Library/Application Support/Cursor/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Windsurf/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Antigravity/User" - mkdir -p "$TEMP_HOME/Library/Application Support/Code - Insiders/User" + mkdir -p "$CURSOR_DIR" + mkdir -p "$WINDSURF_DIR" + mkdir -p "$ANTIGRAVITY_DIR" + mkdir -p "$VSCODE_INSIDERS_DIR" # Create code mock cat >"$MOCK_BIN/code" <<'EOF'