diff --git a/install.sh b/install.sh index 1e5551f..5dc56d5 100755 --- a/install.sh +++ b/install.sh @@ -127,3 +127,98 @@ detect_agents() { warn "Aucun agent IA détecté. L'installation continuera mais aucun skill ne sera filtré." fi } + +# ── Clone du dépôt ──────────────────────────────────────────────── +clone_repo() { + header "Récupération du dépôt" + if [[ -n "$SKILLS_REPO" ]]; then + REPO_DIR="$SKILLS_REPO" + info "Utilisation du dépôt local : $REPO_DIR" + return + fi + info "Clonage depuis $REPO_URL..." + git clone --depth=1 "$REPO_URL" "$REPO_DIR" &>/dev/null + ok "Dépôt cloné dans $REPO_DIR" +} + +# ── Gestion des versions ────────────────────────────────────────── +get_frontmatter_field() { + local file="$1" field="$2" + grep "^${field}:" "$file" 2>/dev/null | head -1 | awk '{print $2}' | tr -d "\"'" +} + +# Retourne 0 (succès) si ver2 est plus récente que ver1 +version_is_newer() { + local ver1="$1" ver2="$2" + [[ "$ver1" == "$ver2" ]] && return 1 + local newest + newest=$(printf '%s\n%s' "$ver1" "$ver2" | sort -V | tail -1) + [[ "$newest" == "$ver2" ]] +} + +# ── Chemins de destination ──────────────────────────────────────── +get_dest_path() { + local cat="$1" skill="$2" agent="$3" scope="$4" + local base + case "$agent" in + claude-code) [[ "$scope" == "global" ]] && base="$HOME/.claude" || base=".claude" ;; + gemini-cli) [[ "$scope" == "global" ]] && base="$HOME/.gemini" || base=".gemini" ;; + codex) [[ "$scope" == "global" ]] && base="$HOME/.codex" || base=".codex" ;; + hermes) [[ "$scope" == "global" ]] && base="$HOME/.hermes" || base=".hermes" ;; + esac + echo "${base}/skills/${cat}/${skill}/SKILL.md" +} + +get_local_version() { + local cat="$1" skill="$2" agent="$3" + local dest + dest=$(get_dest_path "$cat" "$skill" "$agent" "local") + [[ -f "$dest" ]] && get_frontmatter_field "$dest" "version" || echo "" +} + +# ── Scan des skills disponibles ─────────────────────────────────── +# Format : "cat|skill|agent|etat|repo_version|local_version" +SKILLS_LIST=() + +scan_skills() { + header "Scan des skills disponibles" + SKILLS_LIST=() + + while IFS= read -r skill_file; do + local rel="${skill_file#${REPO_DIR}/skills/}" + local agent_file="${rel##*/}" + local agent="${agent_file%.md}" + local skill_path="${rel%/*}" + local cat="${skill_path%%/*}" + local skill="${skill_path#*/}" + + # Filtre agent + local agent_detected=0 + for a in "${DETECTED_AGENTS[@]:-}"; do + [[ "$a" == "$agent" ]] && agent_detected=1 + done + [[ "$agent_detected" -eq 0 && ${#DETECTED_AGENTS[@]} -gt 0 ]] && continue + + # Filtre tag + if [[ -n "$SKILLS_TAG" ]]; then + grep -q "$SKILLS_TAG" "$skill_file" || continue + fi + + local repo_ver; repo_ver=$(get_frontmatter_field "$skill_file" "version") + local local_ver; local_ver=$(get_local_version "$cat" "$skill" "$agent") + local etat + + if [[ -z "$local_ver" ]]; then + etat="new" + elif version_is_newer "$local_ver" "$repo_ver"; then + etat="upd" + else + etat="ok" + fi + + SKILLS_LIST+=("${cat}|${skill}|${agent}|${etat}|${repo_ver}|${local_ver}") + debug "Skill trouvé : $cat/$skill [$agent] état=$etat" + done < <(find "${REPO_DIR}/skills" -name "*.md" | sort) + + ok "${#SKILLS_LIST[@]} skill(s) trouvé(s)" +}