diff --git a/install.sh b/install.sh index cf376f1..37a3cec 100755 --- a/install.sh +++ b/install.sh @@ -166,6 +166,43 @@ detect_agents() { fi } +# ── Sélection des agents (confirmation après auto-détection) ────── +select_agents() { + header "Pour quel(s) agent(s) installer ?" + + local agent_input="" + for agent in "claude-code" "gemini-cli" "codex" "hermes"; do + local detected=0 + for a in "${DETECTED_AGENTS[@]}"; do [[ "$a" == "$agent" ]] && detected=1; done + if [[ $detected -eq 1 ]]; then + agent_input+="${agent}\t${GRV_GREEN}✓ détecté ${RESET}${GRV_FG}${agent}${RESET}\n" + else + agent_input+="${agent}\t${GRV_GRAY}○ non installé ${agent}${RESET}\n" + fi + done + + local raw_selected + raw_selected=$(printf "$agent_input" | fzf \ + --multi \ + --ansi \ + --delimiter='\t' \ + --with-nth=2.. \ + --prompt="Agents > " \ + --header="$(echo -e "${GRV_GRAY}TAB=sélectionner/désélectionner ENTER=valider${RESET}")" \ + "$fns_file" # Script SPACE : cycle action sur une ligne skill (s:IDX) @@ -462,6 +500,32 @@ for cat in "${cat_order[@]}"; do format_skill_line "${SKILLS_LIST[$idx]}" "$idx" done done + +# Footer : skills déjà installés globalement +declare -A agent_dir_map +agent_dir_map[claude-code]="$HOME/.claude" +agent_dir_map[gemini-cli]="$HOME/.gemini" +agent_dir_map[codex]="$HOME/.codex" +agent_dir_map[hermes]="$HOME/.hermes" + +footer_lines=() +for agent in "${DETECTED_AGENTS[@]}"; do + base="${agent_dir_map[$agent]:-}" + [[ -z "$base" ]] && continue + while IFS= read -r skill_md; do + rel="${skill_md#${base}/skills/}" + cat_name="${rel%%/*}"; rest="${rel#*/}"; skill_name="${rest%%/*}" + ver=$(grep "^version:" "$skill_md" 2>/dev/null | head -1 | awk '{print $2}') + footer_lines+=("d:${agent}|${cat_name}|${skill_name}\t ${GRV_GRAY}${cat_name}/${skill_name} [${agent}] v${ver}${RESET}") + done < <(find "${base}/skills" -name "SKILL.md" 2>/dev/null | sort) +done + +if [[ ${#footer_lines[@]} -gt 0 ]]; then + printf "d:-\t%s\n" "$(echo -e "${GRV_PURPLE}──── Skills installés globalement ────${RESET}")" + for line in "${footer_lines[@]}"; do + printf '%s\n' "$line" + done +fi LIST_EOF sed -i "s|FNSFILE|$fns_file|" "$list_script" chmod +x "$list_script" @@ -491,6 +555,27 @@ elif [[ "$type" == "h" ]]; then IFS='|' read -r _ skill agent _ _ _ desc tags <<< "$entry" echo " • ${skill} [${agent}] ${desc} ${tags}" done +elif [[ "$type" == "d" && "$value" != "-" ]]; then + IFS='|' read -r agent cat_name skill_name <<< "$value" + case "$agent" in + claude-code) base="$HOME/.claude" ;; + gemini-cli) base="$HOME/.gemini" ;; + codex) base="$HOME/.codex" ;; + hermes) base="$HOME/.hermes" ;; + *) exit 0 ;; + esac + skill_file="${base}/skills/${cat_name}/${skill_name}/SKILL.md" + if [[ -f "$skill_file" ]]; then + if command -v bat &>/dev/null; then + bat --style=numbers,header --color=always --language=markdown "$skill_file" + elif command -v batcat &>/dev/null; then + batcat --style=numbers,header --color=always --language=markdown "$skill_file" + else + cat "$skill_file" + fi + else + echo "Fichier introuvable : $skill_file" + fi fi PREVIEW_EOF sed -i "s|FNSFILE|$fns_file|" "$preview_script" @@ -508,7 +593,7 @@ PREVIEW_EOF --header="$legend" \ --preview="bash $preview_script {1}" \ --preview-window="right:50%:wrap:hidden" \ - --bind="space:execute-silent(bash $space_script {1})+reload(bash $list_script)" \ + --bind="space:execute-silent(bash $space_script {1})+reload(bash $list_script)+pos({n})" \ --bind="tab:execute-silent(bash $tab_script {1})+reload(bash $list_script)" \ --bind="v:toggle-preview" \ < <(bash "$list_script") > /dev/null || true @@ -609,6 +694,7 @@ main() { check_deps detect_agents + select_agents clone_repo scan_skills