feat: install.sh — clone dépôt, scan skills et comparaison versions
This commit is contained in:
+95
@@ -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)"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user