#!/usr/bin/env bash set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CLAUDE_HOME="${CLAUDE_HOME:-$HOME/.claude}" UNINSTALL=false if [[ "${1:-}" == "--uninstall" ]]; then UNINSTALL=true fi # link_directory SOURCE_BASE TARGET_BASE KIND # Symlinks each subdirectory (or file for output-styles) from source into target. link_directory() { local source_base="$1" local target_base="$2" local kind="$3" if [[ ! -d "$source_base" ]]; then return fi mkdir -p "$target_base" for entry in "$source_base"/*/; do # Skip if glob didn't match [[ -d "$entry" ]] || continue local name name="$(basename "$entry")" local target="$target_base/$name" local source source="$(cd "$entry" && pwd)" if $UNINSTALL; then if [[ -L "$target" ]]; then local link_target link_target="$(readlink -f "$target")" if [[ "$link_target" == "$REPO_DIR"* ]]; then rm "$target" echo "Removed $kind symlink: $name" else echo "Skipped $name — symlink points outside this repo" fi fi continue fi if [[ -L "$target" ]]; then rm "$target" ln -s "$source" "$target" echo "Updated $kind symlink: $name" elif [[ -e "$target" ]]; then echo "Warning: $target already exists and is not a symlink — skipping" else ln -s "$source" "$target" echo "Linked $kind: $name" fi done # Handle plain files (for output-styles/*.md) for entry in "$source_base"/*; do [[ -f "$entry" ]] || continue local name name="$(basename "$entry")" [[ "$name" == ".gitkeep" ]] && continue local target="$target_base/$name" local source source="$(cd "$(dirname "$entry")" && pwd)/$name" if $UNINSTALL; then if [[ -L "$target" ]]; then local link_target link_target="$(readlink -f "$target")" if [[ "$link_target" == "$REPO_DIR"* ]]; then rm "$target" echo "Removed $kind file symlink: $name" else echo "Skipped $name — symlink points outside this repo" fi fi continue fi if [[ -L "$target" ]]; then rm "$target" ln -s "$source" "$target" echo "Updated $kind file symlink: $name" elif [[ -e "$target" ]]; then echo "Warning: $target already exists and is not a symlink — skipping" else ln -s "$source" "$target" echo "Linked $kind file: $name" fi done } if $UNINSTALL; then echo "Uninstalling agents, skills, and output-styles from $CLAUDE_HOME ..." else echo "Installing agents, skills, and output-styles into $CLAUDE_HOME ..." fi link_directory "$REPO_DIR/agents" "$CLAUDE_HOME/agents" "agent" link_directory "$REPO_DIR/skills" "$CLAUDE_HOME/skills" "skill" link_directory "$REPO_DIR/output-styles" "$CLAUDE_HOME/output-styles" "output-style" if $UNINSTALL; then echo "Done. Symlinks pointing to this repo have been removed." else echo "Done. Restart Claude Code to pick up changes." fi