| name | install-claudesidian-command |
| description | Install claudesidian shell command to launch Claude Code from anywhere. Use when the user wants to install a shell alias/launcher for their vault, or asks to set up the claudesidian command. |
Install Claudesidian Command
Creates a shell alias/function that allows you to run claudesidian from
anywhere to open your vault in Claude Code.
Task
Install a shell command that:
- Changes to your claudesidian vault directory
- Launches Claude Code
- Works from any directory in your terminal
Similar to having a quick launcher for your vault.
Process
1. Detect Current Setup
- Check which shell the user is using (bash/zsh/fish)
- Find the current working directory (vault path)
- Determine the appropriate config file
2. Create the Command
The command will be an alias that:
- Changes to the vault directory:
cd /path/to/your/vault
- Tries to resume existing session:
claude --resume 2>/dev/null
- Falls back to new session if no existing one:
|| claude
- All in one command with properly escaped path:
(cd "/path/to/vault" && (claude --resume 2>/dev/null || claude))
Important: The path must be properly escaped to handle spaces and special
characters.
This automatically enters resume mode if there's an existing session, or starts
a new one if not.
3. Install to Shell Config
Add the alias to the appropriate config file:
- Bash:
~/.bashrc or ~/.bash_profile
- Zsh:
~/.zshrc
- Fish:
~/.config/fish/config.fish
4. Verify Installation
- Show the added line
- Remind user to reload their shell or source the config
- Provide test command
Shell Detection
Detects the user's default shell, with support for command-line override:
if [ -n "$1" ]; then
SHELL_TYPE="$1"
else
SHELL_TYPE=$(basename "$SHELL")
fi
case "$SHELL_TYPE" in
zsh)
CONFIG_FILE="$HOME/.zshrc"
;;
bash)
if [ -f "$HOME/.bashrc" ]; then
CONFIG_FILE="$HOME/.bashrc"
else
CONFIG_FILE="$HOME/.bash_profile"
fi
;;
fish)
CONFIG_FILE="$HOME/.config/fish/config.fish"
;;
*)
echo "❌ Unsupported shell: $SHELL_TYPE"
echo " Supported shells: bash, zsh, fish"
echo " Usage: /install-claudesidian-command [bash|zsh|fish]"
exit 1
;;
esac
echo "🐚 Installing for: $SHELL_TYPE"
echo "📝 Config file: $CONFIG_FILE"
Key improvements:
- Uses
$SHELL to detect default shell (not $ZSH_VERSION/$BASH_VERSION
which detect current session)
- Supports command-line argument to override auto-detection
- Shows detected shell and config file for transparency
- Validates shell type and provides clear error message for unsupported shells
Installation Steps
-
Detect shell: Use argument if provided, otherwise auto-detect from
$SHELL
-
Get vault path: Use pwd to get current directory
-
Escape the path: Properly escape quotes and special characters for shell
safety
ESCAPED_PATH="${VAULT_PATH//\\/\\\\}"
ESCAPED_PATH="${ESCAPED_PATH//\"/\\\"}"
-
Check if already installed: Search config file for existing
claudesidian alias/function
if grep -q "alias claudesidian\|function claudesidian" "$CONFIG_FILE"; then
echo "⚠️ Found existing claudesidian command:"
grep -A 3 "claudesidian" "$CONFIG_FILE"
echo ""
read -p "Replace it? (yes/no): " replace_answer
if [[ ! "$replace_answer" =~ ^[Yy] ]]; then
echo "Installation cancelled. Existing command preserved."
exit 0
fi
REPLACING=true
fi
-
Get user confirmation: Show what will be added and get final confirmation
-
Create backup: Only if proceeding with modification
BACKUP_FILE="$CONFIG_FILE.backup-$(date +%Y%m%d-%H%M%S)"
cp "$CONFIG_FILE" "$BACKUP_FILE"
echo "💾 Backup created: $BACKUP_FILE"
-
Build the safe alias/function command: Use the escaped path from step 3
if [ "$SHELL_TYPE" = "fish" ]; then
COMMAND_TEXT="function claudesidian
cd \"$ESCAPED_PATH\" && (claude --resume 2>/dev/null; or claude)
cd -
end"
else
COMMAND_TEXT="alias claudesidian='(cd \"$ESCAPED_PATH\" && (claude --resume 2>/dev/null || claude))'"
fi
-
Remove old command if replacing:
if [ "$REPLACING" = true ]; then
sed -i.tmp '/^alias claudesidian/d' "$CONFIG_FILE"
sed -i.tmp '/^function claudesidian/,/^end$/d' "$CONFIG_FILE"
rm -f "$CONFIG_FILE.tmp"
fi
Why two separate sed calls: A combined range like
/alias claudesidian\|function claudesidian/,/^end$/d would, for the alias
case, keep eating lines until it found the next ^end$ somewhere else in
the file (or EOF). That could nuke unrelated config below. Single-line
delete for the alias, range delete for the function — never combine them.
-
Add command to config file: Append using the escaped command text
echo "$COMMAND_TEXT" >> "$CONFIG_FILE"
-
Show success message: With instructions to reload shell
Example Output
Bash/Zsh Example (with spaces in path to demonstrate escaping):
🔧 Installing claudesidian command...
📁 Vault path: /home/user/My Obsidian Vault
🐚 Shell detected: zsh
📝 Config file: /home/user/.zshrc
💾 Backup created: /home/user/.zshrc.backup-20250107-143025
✅ Installed! Added to /home/user/.zshrc:
alias claudesidian='(cd "/home/user/My Obsidian Vault" && (claude --resume 2>/dev/null || claude))'
🔄 To activate, run:
source ~/.zshrc
Or start a new terminal session.
✨ Test it: Type 'claudesidian' from any directory!
Fish Shell Example:
🔧 Installing claudesidian command...
📁 Vault path: /home/user/My Obsidian Vault
🐚 Shell detected: fish
📝 Config file: /home/user/.config/fish/config.fish
💾 Backup created: /home/user/.config/fish/config.fish.backup-20250107-143025
✅ Installed! Added to /home/user/.config/fish/config.fish:
function claudesidian
cd "/home/user/My Obsidian Vault" && (claude --resume 2>/dev/null; or claude)
cd -
end
🔄 To activate, run:
source ~/.config/fish/config.fish
Or start a new terminal session.
✨ Test it: Type 'claudesidian' from any directory!
Handling Special Characters
The implementation properly handles paths with:
- Spaces:
/Users/noah/My Vault
- Quotes:
/Users/noah/vault's backup
- Special characters that need escaping
Paths are double-quoted and any embedded quotes/backslashes are escaped.
Fish Shell Support
Fish shell uses different syntax than Bash/Zsh:
Bash/Zsh (alias):
alias claudesidian='(cd "/path" && command)'
Fish (function):
function claudesidian
cd "/path" && (command; or fallback)
cd -
end
Key differences:
- Fish uses
function keyword instead of alias for complex commands
- Fish uses
; or instead of || for fallback logic
- Fish uses
cd - to return to previous directory (instead of subshell)
- Multi-line function definition instead of single-line alias
The installation automatically detects Fish and uses the correct syntax.
Security Considerations
This command modifies your shell configuration file (a sensitive operation).
Safety measures:
- You'll see exactly what will be added before any changes
- Timestamped backup is automatically created before modification
- Vault path is properly escaped to prevent injection attacks
- Only the claudesidian command is modified - nothing else in your config
- Asks permission before replacing existing commands
If anything goes wrong, restore from: $CONFIG_FILE.backup-YYYYMMDD-HHMMSS
Important Notes
- The command uses a subshell
() (or cd - in Fish) so it returns to your
original directory after
- Automatically tries to resume existing sessions, falls back to new session
- If alias/function already exists, asks user if they want to replace it
- Always shows what will be added before modifying config files
- Always creates timestamped backup of config file before modifying (format:
YYYYMMDD-HHMMSS)
- Backups are kept indefinitely - users can manually clean up old backups if
needed
- Shows backup location so users know where to restore from if needed
Usage Examples
Install for your default shell (auto-detected):
/install-claudesidian-command
Install for specific shell (override auto-detection):
/install-claudesidian-command zsh
/install-claudesidian-command bash
/install-claudesidian-command fish
When to specify shell:
- You use multiple shells and want to install for a specific one
- Auto-detection picked the wrong shell
- You're setting up for someone else
How It Works
Bash/Zsh (alias with subshell):
alias claudesidian='(cd "/path/to/vault" && (claude --resume 2>/dev/null || claude))'
(cd "/path/to/vault" && ...) - Subshell that changes directory temporarily
(path is double-quoted for safety)
claude --resume 2>/dev/null - Tries to resume existing session, suppresses
error
|| claude - If resume fails (no session), starts new session
- After Claude exits, subshell closes and returns to original directory
automatically
Fish (function with cd -):
function claudesidian
cd "/path/to/vault" && (claude --resume 2>/dev/null; or claude)
cd -
end
cd "/path/to/vault" - Changes to vault directory (path is double-quoted for
safety)
claude --resume 2>/dev/null - Tries to resume existing session, suppresses
error
; or claude - If resume fails (no session), starts new session (Fish
syntax)
cd - - Returns to previous directory after Claude exits