From 468a2e0ad3c611868fd13782195172f1d9326308 Mon Sep 17 00:00:00 2001 From: Jason Pickens Date: Fri, 24 Apr 2026 21:44:54 +1200 Subject: [PATCH] fix(install): handle non-writable shell config files gracefully The install scripts previously failed when trying to modify shell config files (e.g., ~/.zshrc, ~/.bashrc) that are not writable. This affects users with nix-darwin, home-manager, or other declaratively-managed configurations. Changes: - setup-hermes.sh: Wrap shell config writes with error handling - scripts/install.sh: Same pattern for bash/zsh and fish configs Behavior now: - Attempts to write PATH export to shell config - If write fails, shows warning and manual instructions - Installation continues without failing Co-Authored-By: Claude Opus 4.6 --- scripts/install.sh | 33 +++++++++++++++++++++++++-------- setup-hermes.sh | 22 +++++++++++++++------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/scripts/install.sh b/scripts/install.sh index 166d984fa..080158f47 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -1016,20 +1016,37 @@ setup_path() { for SHELL_CONFIG in "${SHELL_CONFIGS[@]}"; do if ! grep -v '^[[:space:]]*#' "$SHELL_CONFIG" 2>/dev/null | grep -qE 'PATH=.*\.local/bin'; then - echo "" >> "$SHELL_CONFIG" - echo "# Hermes Agent — ensure ~/.local/bin is on PATH" >> "$SHELL_CONFIG" - echo "$PATH_LINE" >> "$SHELL_CONFIG" - log_success "Added ~/.local/bin to PATH in $SHELL_CONFIG" + # Try to write, handling permission errors gracefully + if { + echo "" >> "$SHELL_CONFIG" 2>/dev/null && \ + echo "# Hermes Agent — ensure ~/.local/bin is on PATH" >> "$SHELL_CONFIG" 2>/dev/null && \ + echo "$PATH_LINE" >> "$SHELL_CONFIG" 2>/dev/null + }; then + log_success "Added ~/.local/bin to PATH in $SHELL_CONFIG" + else + log_warn "Could not write to $SHELL_CONFIG (not writable?)" + echo "" + log_info "Add ~/.local/bin to your PATH manually:" + log_info " $PATH_LINE" + echo "" + fi fi done # fish uses fish_add_path instead of export PATH=... if [ "$IS_FISH" = "true" ]; then if ! grep -q 'fish_add_path.*\.local/bin' "$FISH_CONFIG" 2>/dev/null; then - echo "" >> "$FISH_CONFIG" - echo "# Hermes Agent — ensure ~/.local/bin is on PATH" >> "$FISH_CONFIG" - echo 'fish_add_path "$HOME/.local/bin"' >> "$FISH_CONFIG" - log_success "Added ~/.local/bin to PATH in $FISH_CONFIG" + # Try to write, handling permission errors gracefully + if { + echo "" >> "$FISH_CONFIG" 2>/dev/null && \ + echo "# Hermes Agent — ensure ~/.local/bin is on PATH" >> "$FISH_CONFIG" 2>/dev/null && \ + echo 'fish_add_path "$HOME/.local/bin"' >> "$FISH_CONFIG" 2>/dev/null + }; then + log_success "Added ~/.local/bin to PATH in $FISH_CONFIG" + else + log_warn "Could not write to $FISH_CONFIG" + log_info "Add manually: fish_add_path \"\$HOME/.local/bin\"" + fi fi fi diff --git a/setup-hermes.sh b/setup-hermes.sh index 5d0f2928a..f1acade1e 100755 --- a/setup-hermes.sh +++ b/setup-hermes.sh @@ -314,15 +314,23 @@ else fi if [ -n "$SHELL_CONFIG" ]; then - # Touch the file just in case it doesn't exist yet but was selected - touch "$SHELL_CONFIG" 2>/dev/null || true - if ! echo "$PATH" | tr ':' '\n' | grep -q "^$HOME/.local/bin$"; then if ! grep -q '\.local/bin' "$SHELL_CONFIG" 2>/dev/null; then - echo "" >> "$SHELL_CONFIG" - echo "# Hermes Agent — ensure ~/.local/bin is on PATH" >> "$SHELL_CONFIG" - echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$SHELL_CONFIG" - echo -e "${GREEN}✓${NC} Added ~/.local/bin to PATH in $SHELL_CONFIG" + # Try to write, handling permission errors gracefully + if { + echo "" >> "$SHELL_CONFIG" 2>/dev/null && \ + echo "# Hermes Agent — ensure ~/.local/bin is on PATH" >> "$SHELL_CONFIG" 2>/dev/null && \ + echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$SHELL_CONFIG" 2>/dev/null + }; then + echo -e "${GREEN}✓${NC} Added ~/.local/bin to PATH in $SHELL_CONFIG" + else + echo -e "${YELLOW}⚠${NC} Could not write to $SHELL_CONFIG (not writable?)" + echo "" + echo -e "${CYAN}→${NC} Add ~/.local/bin to your PATH manually:" + echo "" + echo -e " ${CYAN}export PATH=\"\$HOME/.local/bin:\$PATH\"${NC}" + echo "" + fi else echo -e "${GREEN}✓${NC} ~/.local/bin already in $SHELL_CONFIG" fi