#!/bin/bash set -e REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" SKILLS_DIR="${REPO_ROOT}/skills" INFO='\033[0;34m' SUCCESS='\033[0;32m' WARNING='\033[1;33m' ERROR='\033[0;31m' NC='\033[0m' detect_os() { case "$(uname -s)" in Linux*) echo "linux" ;; Darwin*) echo "mac" ;; CYGWIN*|MINGW*|MSYS*) echo "windows" ;; *) echo "unknown" ;; esac } find_openclaw_folders() { local os="$1" local folders=() case "$os" in linux|mac) [ -d "$HOME/.openclaw/skills" ] && folders+=("$HOME/.openclaw/skills") [ -d "$HOME/.local/share/openclaw/skills" ] && folders+=("$HOME/.local/share/openclaw/skills") for ssh_folder in "$HOME"/*; do [ -d "$ssh_folder" ] || continue if [ -d "$ssh_folder/.openclaw/skills" ]; then folders+=("$ssh_folder/.openclaw/skills") fi done ;; windows) for user_dir in /c/Users/* /d/Users/* /e/Users/*; do [ -d "$user_dir/.openclaw/skills" ] && folders+=("$user_dir/.openclaw/skills") done for profile_dir in /c/Users/* /d/Users/*; do [ -d "$profile_dir" ] || continue for ssh_folder in "$profile_dir"/*; do [ -d "$ssh_folder" ] || continue if [ -d "$ssh_folder/.openclaw/skills" ]; then folders+=("$ssh_folder/.openclaw/skills") fi done done ;; esac printf '%s\n' "${folders[@]}" } find_opencode_folders() { local os="$1" local folders=() case "$os" in linux|mac) [ -d "$HOME/.config/opencode/skills" ] && folders+=("$HOME/.config/opencode/skills") ;; windows) [ -d "C:/Users/${USERNAME}/.config/opencode/skills" ] && folders+=("C:/Users/${USERNAME}/.config/opencode/skills") ;; esac printf '%s\n' "${folders[@]}" } install_all_to_folder() { local target_dir="$1" mkdir -p "$target_dir" if command -v rsync &> /dev/null; then rsync -a --delete "$SKILLS_DIR/" "$target_dir/" else for skill_dir in "$SKILLS_DIR"/*/; do [ -d "$skill_dir" ] || continue skill_name=$(basename "$skill_dir") if [ -f "$skill_dir/SKILL.md" ]; then [ -d "${target_dir}/${skill_name}" ] && rm -rf "${target_dir}/${skill_name}" cp -r "$skill_dir" "${target_dir}/${skill_name}" fi done fi local count=$(ls -d "$target_dir"/*/ 2>/dev/null | wc -l | tr -d ' ') echo -e "${SUCCESS}[OK]${NC} Installed $count skills to ${target_dir}" } get_skill_count() { local count=0 for dir in "$SKILLS_DIR"/*/; do [ -d "$dir" ] && [ -f "$dir/SKILL.md" ] && count=$((count + 1)) done echo "$count" } main() { echo "==========================================" echo "OpenClaw Skills Installer" echo "==========================================" local os=$(detect_os) echo -e "${INFO}[INFO]${NC} Detected OS: $os" echo -e "${INFO}[INFO]${NC} Repository: $REPO_ROOT" echo -e "${INFO}[INFO]${NC} Skills folder: $SKILLS_DIR" local skill_count=$(get_skill_count) echo -e "${INFO}[INFO]${NC} Found $skill_count skills to install" echo "" local openclaw_folders=() while IFS= read -r folder; do [ -n "$folder" ] && openclaw_folders+=("$folder") done < <(find_openclaw_folders "$os") local opencode_folders=() while IFS= read -r folder; do [ -n "$folder" ] && opencode_folders+=("$folder") done < <(find_opencode_folders "$os") if [ ${#openclaw_folders[@]} -eq 0 ] && [ ${#opencode_folders[@]} -eq 0 ]; then echo -e "${WARNING}[WARN]${NC} No OpenClaw or OpenCode folders found." echo -e "${INFO}[INFO]${NC} Creating: $HOME/.openclaw/skills" mkdir -p "$HOME/.openclaw/skills" openclaw_folders+=("$HOME/.openclaw/skills") fi echo "" if [ ${#openclaw_folders[@]} -gt 0 ]; then echo -e "${INFO}[INFO]${NC} OpenClaw folders:" for folder in "${openclaw_folders[@]}"; do echo " - $folder"; done fi if [ ${#opencode_folders[@]} -gt 0 ]; then echo -e "${INFO}[INFO]${NC} OpenCode folders:" for folder in "${opencode_folders[@]}"; do echo " - $folder"; done fi echo "" echo "==========================================" echo "Installation" echo "==========================================" local total=0 for folder in "${openclaw_folders[@]}"; do echo -e "${INFO}[INFO]${NC} OpenClaw: $folder" install_all_to_folder "$folder" total=$((total + 1)) done for folder in "${opencode_folders[@]}"; do echo -e "${INFO}[INFO]${NC} OpenCode: $folder" install_all_to_folder "$folder" total=$((total + 1)) done echo "" echo "==========================================" echo -e "${SUCCESS}[OK]${NC} Done! Installed to $total locations." echo "==========================================" } main "$@"