Files
openclaw-backups/scripts/skill-tracker.sh

131 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
# Skill Tracker - Tracks installed ClawHub skills for auto-recovery after updates
# Location: ~/.openclaw/workspace/scripts/skill-tracker.sh
STATE_SKILLS_DIR="$HOME/.openclaw/skills"
WORKSPACE_SKILLS_DIR="$HOME/.openclaw/workspace/skills"
TRACKER_FILE="$HOME/.openclaw/workspace/.installed-skills.json"
LOG_FILE="$HOME/.openclaw/workspace/logs/skill-tracker.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# Ensure log directory exists
mkdir -p "$(dirname "$LOG_FILE")"
# Get list of installed skills from state directory
get_state_skills() {
if [ -d "$STATE_SKILLS_DIR" ]; then
# List directories and symlinks (skip .json metadata files)
find "$STATE_SKILLS_DIR" -maxdepth 1 -mindepth 1 \( -type d -o -type l \) -exec basename {} \; 2>/dev/null | sort
fi
}
# Get list of workspace skills
get_workspace_skills() {
if [ -d "$WORKSPACE_SKILLS_DIR" ]; then
find "$WORKSPACE_SKILLS_DIR" -maxdepth 1 -mindepth 1 -type d -exec basename {} \; 2>/dev/null | sort
fi
}
# Save current state to tracker file
save_state() {
local state_skills=$(get_state_skills | jq -R . | jq -s .)
local workspace_skills=$(get_workspace_skills | jq -R . | jq -s .)
cat > "$TRACKER_FILE" <<EOF
{
"last_updated": "$(date -Iseconds)",
"state_skills": $state_skills,
"workspace_skills": $workspace_skills,
"total_count": $(echo "$state_skills $workspace_skills" | jq -s 'add | length')
}
EOF
log "Saved skill state: $(echo "$state_skills" | jq length) state + $(echo "$workspace_skills" | jq length) workspace skills"
}
# Check for missing skills and reinstall
check_and_restore() {
if [ ! -f "$TRACKER_FILE" ]; then
log "No tracker file found. Saving current state..."
save_state
return 0
fi
local missing_skills=()
local state_skills=$(get_state_skills)
# Read expected state skills from tracker
local expected_state=$(jq -r '.state_skills[]' "$TRACKER_FILE" 2>/dev/null)
for skill in $expected_state; do
if ! echo "$state_skills" | grep -qx "$skill"; then
missing_skills+=("$skill")
fi
done
if [ ${#missing_skills[@]} -eq 0 ]; then
log "All skills accounted for ✓"
return 0
fi
log "Found ${#missing_skills[@]} missing skill(s): ${missing_skills[*]}"
# Try to reinstall each missing skill
local failed=()
for skill in "${missing_skills[@]}"; do
log "Attempting to reinstall: $skill"
if clawhub install "$skill" 2>&1 | tee -a "$LOG_FILE"; then
log "✓ Reinstalled: $skill"
else
log "✗ Failed to reinstall: $skill"
failed+=("$skill")
fi
done
# Update tracker with new state
save_state
if [ ${#failed[@]} -gt 0 ]; then
log "WARNING: Failed to reinstall: ${failed[*]}"
return 1
fi
return 0
}
# Main command handler
case "${1:-save}" in
save)
save_state
;;
check)
check_and_restore
;;
restore)
check_and_restore
;;
status)
if [ -f "$TRACKER_FILE" ]; then
echo "=== Skill Tracker Status ==="
cat "$TRACKER_FILE" | jq .
echo ""
echo "=== Current State Skills ==="
get_state_skills | jq -R . | jq -s .
else
echo "No tracker file found. Run: skill-tracker.sh save"
fi
;;
*)
echo "Usage: $0 {save|check|restore|status}"
echo ""
echo "Commands:"
echo " save - Save current skill state to tracker file"
echo " check - Check for missing skills and restore them"
echo " restore - Same as check (alias)"
echo " status - Show current tracker status"
exit 1
;;
esac