feat: install.sh — sélection agents, footer global, fix focus SPACE

- Menu fzf de sélection d'agents au démarrage (TAB multi-select)
- Footer en bas du tableau : skills déjà installés globalement avec preview
- Fix bug SPACE : +pos({n}) restaure le focus sur l'item modifié

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 05:49:13 +02:00
parent 5088ec0189
commit 25d0cfb0cb
+87 -1
View File
@@ -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}")" \
</dev/tty) || true
DETECTED_AGENTS=()
while IFS=$'\t' read -r agent_name _; do
[[ -n "$agent_name" ]] && DETECTED_AGENTS+=("$agent_name")
done <<< "$raw_selected"
if [[ ${#DETECTED_AGENTS[@]} -eq 0 ]]; then
warn "Aucun agent sélectionné — tous les skills seront affichés."
else
ok "Agents sélectionnés : ${DETECTED_AGENTS[*]}"
fi
}
# ── Clone du dépôt ────────────────────────────────────────────────
clone_repo() {
header "Récupération du dépôt"
@@ -393,6 +430,7 @@ run_menu() {
echo "REPO_DIR='$REPO_DIR'"
echo "COLLAPSED_FILE='$COLLAPSED_FILE'"
echo "SKILLS_LIST=($(printf '"%s" ' "${SKILLS_LIST[@]}"))"
echo "DETECTED_AGENTS=($(printf '"%s" ' "${DETECTED_AGENTS[@]}"))"
} > "$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