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:
+87
-1
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user