-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdate.sh
More file actions
executable file
·126 lines (110 loc) · 3.15 KB
/
update.sh
File metadata and controls
executable file
·126 lines (110 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/bin/bash
# Swift Agents - Update Script
# Built by Taylor Arndt - https://github.com/taylorarndt
#
# Checks for updates from GitHub and installs them.
# Can be run manually or automatically via LaunchAgent/cron.
#
# Usage:
# bash update.sh Update global install
# bash update.sh --project Update project install in current directory
# bash update.sh --silent Suppress output (for scheduled runs)
set -e
REPO_URL="https://github.com/Techopolis/swift-agents.git"
CACHE_DIR="$HOME/.claude/.swift-agents-repo"
VERSION_FILE="$HOME/.claude/.swift-agents-version"
LOG_FILE="$HOME/.claude/.swift-agents-update.log"
# Parse flags
SILENT=false
TARGET="global"
for arg in "$@"; do
case "$arg" in
--silent) SILENT=true ;;
--project) TARGET="project" ;;
esac
done
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1"
echo "$msg" >> "$LOG_FILE"
if [ "$SILENT" = false ]; then
echo " $1"
fi
}
if [ "$TARGET" = "project" ]; then
INSTALL_DIR="$(pwd)/.claude"
else
INSTALL_DIR="$HOME/.claude"
fi
# Check for git
if ! command -v git &>/dev/null; then
log "Error: git is not installed. Cannot check for updates."
exit 1
fi
# Clone or pull the repo
if [ -d "$CACHE_DIR/.git" ]; then
cd "$CACHE_DIR"
git fetch origin main --quiet 2>/dev/null
LOCAL_HASH=$(git rev-parse HEAD 2>/dev/null)
REMOTE_HASH=$(git rev-parse origin/main 2>/dev/null)
if [ "$LOCAL_HASH" = "$REMOTE_HASH" ]; then
log "Already up to date."
exit 0
fi
git reset --hard origin/main --quiet 2>/dev/null
log "Pulled latest changes."
else
log "Downloading swift-agents..."
mkdir -p "$(dirname "$CACHE_DIR")"
git clone --quiet "$REPO_URL" "$CACHE_DIR" 2>/dev/null
log "Repository cloned."
fi
cd "$CACHE_DIR"
NEW_HASH=$(git rev-parse --short HEAD 2>/dev/null)
# Check if install directory exists
if [ ! -d "$INSTALL_DIR/agents" ]; then
log "Install directory not found at $INSTALL_DIR/agents. Run install.sh first."
exit 1
fi
# Auto-detect and copy updated agents
UPDATED=0
for SRC in "$CACHE_DIR"/.claude/agents/*.md; do
[ -f "$SRC" ] || continue
agent="$(basename "$SRC")"
DST="$INSTALL_DIR/agents/$agent"
if ! cmp -s "$SRC" "$DST" 2>/dev/null; then
cp "$SRC" "$DST"
name="${agent%.md}"
log "Updated: $name"
UPDATED=$((UPDATED + 1))
fi
done
# Remove agents that no longer exist in the repo
for DST in "$INSTALL_DIR"/agents/*.md; do
[ -f "$DST" ] || continue
agent="$(basename "$DST")"
SRC="$CACHE_DIR/.claude/agents/$agent"
if [ ! -f "$SRC" ]; then
rm "$DST"
name="${agent%.md}"
log "Removed (no longer in repo): $name"
UPDATED=$((UPDATED + 1))
fi
done
# Copy updated hook
HOOK_SRC="$CACHE_DIR/.claude/hooks/swift-team-eval.sh"
HOOK_DST="$INSTALL_DIR/hooks/swift-team-eval.sh"
if [ -f "$HOOK_SRC" ] && [ -f "$HOOK_DST" ]; then
if ! cmp -s "$HOOK_SRC" "$HOOK_DST" 2>/dev/null; then
cp "$HOOK_SRC" "$HOOK_DST"
chmod +x "$HOOK_DST"
log "Updated: hook script"
UPDATED=$((UPDATED + 1))
fi
fi
# Save version
echo "$NEW_HASH" > "$VERSION_FILE"
if [ "$UPDATED" -gt 0 ]; then
log "Update complete ($UPDATED files updated, version $NEW_HASH)."
else
log "Files already match latest version ($NEW_HASH)."
fi