feat: install.sh — support double format bundle/legacy (amelioration.md)

Double détection dans scan_skills() :
- Bundle : dossier avec SKILL.md, agents: lu dans le frontmatter,
  copie récursive du dossier complet (scripts/, templates/, references/)
- Legacy : <agent>.md existant, agent déduit du nom de fichier
- Priorité bundle sur legacy pour un même cat/skill/agent
- Nouveau champ get_frontmatter_agents() pour parser agents: [...]
- SKILLS_LIST étendu : ...|kind|source_path (10 champs)
- install_selected() branche sur kind=bundle vs legacy
- preview_script utilise source_path pour trouver le fichier à afficher

ha-log-investigator (bundle avec scripts/ et references/) est maintenant
détecté et installé correctement.

Tests : section 5 ajoutée — 9 nouveaux cas (bundle, legacy, références
ignorées, doublon, priorité, source_path, accessibilité fichiers).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 08:46:12 +02:00
parent 2fe62335c4
commit bdf635e547
2 changed files with 200 additions and 40 deletions
+105
View File
@@ -161,6 +161,111 @@ assert_eq "cycle update→local" "local" "$(state_get "dev_debugging_claude_code
rm -f "$STATE_FILE"
unset STATE_FILE || true
# ── 5. Détection bundle / legacy ─────────────────────────────────
echo ""
echo "5. get_frontmatter_agents() / scan_skills() double format"
TMP_DIR=$(mktemp -d)
# Skill bundle : SKILL.md + agents: [claude-code, codex]
mkdir -p "$TMP_DIR/skills/infra/mon-bundle"
cat > "$TMP_DIR/skills/infra/mon-bundle/SKILL.md" << 'EOF'
---
name: mon-bundle
version: 1.2.0
agents: [claude-code, codex]
description: Skill bundle test
tags: [test]
---
# Mon bundle
EOF
mkdir -p "$TMP_DIR/skills/infra/mon-bundle/scripts"
touch "$TMP_DIR/skills/infra/mon-bundle/scripts/helper.sh"
# Skill legacy : claude-code.md
mkdir -p "$TMP_DIR/skills/dev/ancien"
cat > "$TMP_DIR/skills/dev/ancien/claude-code.md" << 'EOF'
---
name: ancien
version: 0.5.0
description: Skill legacy
tags: [legacy]
---
# Ancien skill
EOF
# Fichier Markdown de support (ne doit PAS être détecté comme skill)
mkdir -p "$TMP_DIR/skills/infra/mon-bundle/references"
echo "# Ref doc" > "$TMP_DIR/skills/infra/mon-bundle/references/notes.md"
assert_eq "agents: [claude-code, codex] → 2 agents" \
"claude-code
codex" \
"$(get_frontmatter_agents "$TMP_DIR/skills/infra/mon-bundle/SKILL.md")"
assert_eq "agents: absent → vide" \
"" \
"$(get_frontmatter_agents "$TMP_DIR/skills/dev/ancien/claude-code.md")"
# scan_skills avec les deux formats
REPO_DIR="$TMP_DIR"
DETECTED_AGENTS=()
SKILLS_TAG=""
STATE_FILE=$(mktemp)
scan_skills 2>/dev/null
# Compter les entrées trouvées
bundle_count=0; legacy_count=0; ref_count=0
for e in "${SKILLS_LIST[@]}"; do
IFS='|' read -r _ _ _ _ _ _ _ _ kind source_path <<< "$e"
[[ "$kind" == "bundle" ]] && (( bundle_count++ )) || true
[[ "$kind" == "legacy" ]] && (( legacy_count++ )) || true
# Vérifier qu'aucune entrée ne vient de references/notes.md
[[ "$source_path" == *"notes.md"* ]] && (( ref_count++ )) || true
done
assert_eq "bundle détecté 2 fois (2 agents)" "2" "$bundle_count"
assert_eq "legacy détecté 1 fois" "1" "$legacy_count"
assert_eq "fichier references/ ignoré" "0" "$ref_count"
# Vérifier que kind=bundle et source_path pointent sur le dossier
first_bundle=""
for e in "${SKILLS_LIST[@]}"; do
IFS='|' read -r _ _ _ _ _ _ _ _ kind source_path <<< "$e"
[[ "$kind" == "bundle" ]] && { first_bundle="$source_path"; break; }
done
assert_eq "source_path bundle = dossier du skill" \
"$TMP_DIR/skills/infra/mon-bundle" \
"$first_bundle"
# Vérifier que SKILL.md du bundle est lisible pour le preview
assert_true "SKILL.md bundle accessible" "[[ -f '${first_bundle}/SKILL.md' ]]"
assert_true "scripts/ du bundle accessible" "[[ -f '${first_bundle}/scripts/helper.sh' ]]"
# Priorité bundle sur legacy : si SKILL.md existe, le <agent>.md ne duplique pas
mkdir -p "$TMP_DIR/skills/dev/ancien"
cat > "$TMP_DIR/skills/dev/ancien/SKILL.md" << 'EOF'
---
name: ancien
version: 1.0.0
agents: [claude-code]
description: Skill migré en bundle
tags: [test]
---
# Ancien migré
EOF
SKILLS_LIST=()
scan_skills 2>/dev/null
count_ancien=0
for e in "${SKILLS_LIST[@]}"; do
[[ "$e" == *"|ancien|claude-code|"* ]] && (( count_ancien++ )) || true
done
assert_eq "pas de doublon bundle+legacy pour même agent" "1" "$count_ancien"
rm -f "$STATE_FILE"
rm -rf "$TMP_DIR"
unset REPO_DIR STATE_FILE SKILLS_TAG DETECTED_AGENTS
# ── Bilan ─────────────────────────────────────────────────────────
echo ""
echo "══════════════════════════════════"