link.sh 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/env bash
  2. # Symlink this repo into ~/.claude/
  3. set -euo pipefail
  4. REPO="$(cd "$(dirname "$0")" && pwd)"
  5. CLAUDE="$HOME/.claude"
  6. CHANGED=0
  7. mkdir -p "$CLAUDE"
  8. link_file() {
  9. local src="$1" dst="$2"
  10. if [ -L "$dst" ] && [ "$(readlink "$dst")" = "$src" ]; then
  11. return # already correct
  12. fi
  13. ln -sf "$src" "$dst"
  14. CHANGED=$((CHANGED + 1))
  15. }
  16. link_file "$REPO/CLAUDE.md" "$CLAUDE/CLAUDE.md"
  17. link_file "$REPO/settings.json" "$CLAUDE/settings.json"
  18. for item in agents skills lib templates; do
  19. target="$CLAUDE/$item"
  20. if [ -L "$target" ]; then
  21. if [ "$(readlink "$target")" = "$REPO/$item" ]; then
  22. continue # already correct
  23. fi
  24. rm -f "$target"
  25. elif [ -d "$target" ]; then
  26. echo "⚠️ ~/.claude/$item is a real directory. Rename or remove it, then re-run link.sh."
  27. continue
  28. fi
  29. ln -sf "$REPO/$item" "$target"
  30. CHANGED=$((CHANGED + 1))
  31. done
  32. mkdir -p "$CLAUDE/hooks"
  33. link_file "$REPO/hooks/session-start.sh" "$CLAUDE/hooks/session-start.sh"
  34. if [ -d "$REPO/skills-external/gstack" ]; then
  35. if [ -L "$CLAUDE/skills/gstack" ] && [ "$(readlink "$CLAUDE/skills/gstack")" = "$REPO/skills-external/gstack" ]; then
  36. : # already correct
  37. else
  38. ln -sf "$REPO/skills-external/gstack" "$CLAUDE/skills/gstack"
  39. CHANGED=$((CHANGED + 1))
  40. fi
  41. else
  42. echo "⚠️ GStack submodule not found — run: git submodule update --init"
  43. fi
  44. if [ "$CHANGED" -eq 0 ]; then
  45. echo "✅ All symlinks already up to date."
  46. else
  47. echo "✅ $CHANGED symlink(s) updated in ~/.claude/"
  48. fi
  49. echo " Next: bash install-plugins.sh"