#!/bin/bash
# Aria Skill Curator
# Eingefuehrt 2026-05-04 nach Hermes v0.12.0 Adoption.
# Scannt ~/.claude/skills/ und /root/.agents/skills/, schreibt wochenlichen Report.
# NIE loeschen, NIE veraendern. Nur lesen und vorschlagen.

set -e

REPORT_DIR="$HOME/aria/brain/02-Wissen/skill-curator-reports"
DATE=$(date +%Y-%m-%d)
REPORT="${REPORT_DIR}/skill-curator-${DATE}.md"
mkdir -p "$REPORT_DIR"

CLAUDE_SKILLS="/root/.claude/skills"
AGENTS_SKILLS="/root/.agents/skills"

cat > "$REPORT" << EOF
---
title: Skill Curator Report ${DATE}
type: audit
tags: [skill-curator, audit, autonomous]
date: ${DATE}
status: aktiv
related: [[CLAUDE]], [[HEARTBEAT]]
---

# Skill Curator Report ${DATE}

> Autonomer Wochen-Scan der Skill-Bibliotheken. Erzeugt von $HOME/aria/scripts/aria-skill-curator.sh.
> Defense-in-Depth: Dieses Skript loescht oder veraendert NICHTS.

## Verzeichnisse

EOF

scan_dir() {
    local DIR="$1"
    local LABEL="$2"

    if [ ! -d "$DIR" ]; then
        echo "" >> "$REPORT"
        echo "### ${LABEL}: ${DIR}" >> "$REPORT"
        echo "" >> "$REPORT"
        echo "Verzeichnis nicht vorhanden, uebersprungen." >> "$REPORT"
        return
    fi

    local COUNT=$(find "$DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)

    echo "" >> "$REPORT"
    echo "### ${LABEL}: \`${DIR}\` (${COUNT} Skills)" >> "$REPORT"
    echo "" >> "$REPORT"
    echo "| Skill | Letzte Aenderung | Groesse | SKILL.md | CD-Score | Anmerkung |" >> "$REPORT"
    echo "|-------|------------------|---------|----------|----------|-----------|" >> "$REPORT"

    while IFS= read -r SKILL; do
        local NAME=$(basename "$SKILL")
        local MTIME=$(date -r "$SKILL" +%Y-%m-%d 2>/dev/null || echo "?")
        local SIZE_KB=$(du -sk "$SKILL" 2>/dev/null | cut -f1)
        local HAS_SKILL_MD="-"
        if [ -f "${SKILL}/SKILL.md" ]; then
            HAS_SKILL_MD="ja"
        fi

        # Notes / suggestions
        local NOTE=""
        # Stale: nicht geaendert seit > 90 Tagen
        local DAYS_OLD=$(( ($(date +%s) - $(stat -c %Y "$SKILL" 2>/dev/null || echo 0)) / 86400 ))
        if [ "$DAYS_OLD" -gt 90 ]; then
            NOTE="${NOTE}stale (>90d). "
        fi
        # Sehr klein
        if [ "$SIZE_KB" -lt 4 ]; then
            NOTE="${NOTE}klein (<4 KB), evtl. Stub. "
        fi
        # Fehlt SKILL.md
        if [ "$HAS_SKILL_MD" != "ja" ]; then
            NOTE="${NOTE}kein SKILL.md (Format-Verletzung). "
        fi

        # Cognitive-Debt-Score (siehe KAR-349, aria-kadi-anti-cognitive-debt-stack)
        # Max 4 Punkte: SKILL.md vorhanden + Brain-Note in 02-Wissen/00-Inbox/05-Referenzen + Tests + DoR/DoD-Hinweis in SKILL.md.
        # Stale halbiert den Score.
        local CD_SCORE=0
        local CD_REASONS=""
        if [ "$HAS_SKILL_MD" = "ja" ]; then
            CD_SCORE=$((CD_SCORE + 1))
        else
            CD_REASONS="${CD_REASONS}no-SKILL.md "
        fi
        if grep -ril -q -e "$NAME" "$HOME/aria/brain/02-Wissen/" "$HOME/aria/brain/00-Inbox/" "$HOME/aria/brain/05-Referenzen/" 2>/dev/null | head -1 | grep -q .; then
            CD_SCORE=$((CD_SCORE + 1))
        else
            CD_REASONS="${CD_REASONS}no-brain-note "
        fi
        if find "$SKILL" \( -name "*.test.*" -o -name "test_*" -o -type d -name "tests" -o -type d -name "test" \) 2>/dev/null | grep -q .; then
            CD_SCORE=$((CD_SCORE + 1))
        else
            CD_REASONS="${CD_REASONS}no-tests "
        fi
        if [ "$HAS_SKILL_MD" = "ja" ] && grep -qiE "(definition of|DoR|DoD|when to use|wann triggern|wann nutzen|wann verwenden|acceptance criteria)" "${SKILL}/SKILL.md" 2>/dev/null; then
            CD_SCORE=$((CD_SCORE + 1))
        else
            CD_REASONS="${CD_REASONS}no-DoR/DoD "
        fi
        if [ "$DAYS_OLD" -gt 90 ]; then
            CD_SCORE=$(( CD_SCORE / 2 ))
            CD_REASONS="${CD_REASONS}stale-penalty "
        fi
        local CD_LABEL="${CD_SCORE}/4"
        if [ "$CD_SCORE" -le 1 ]; then
            CD_LABEL="${CD_LABEL} WARN"
            NOTE="${NOTE}cognitive-debt: ${CD_REASONS}"
        fi

        if [ -z "$NOTE" ]; then
            NOTE="OK"
        fi

        echo "| ${NAME} | ${MTIME} | ${SIZE_KB} KB | ${HAS_SKILL_MD} | ${CD_LABEL} | ${NOTE} |" >> "$REPORT"
    done < <(find "$DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
}

scan_dir "$CLAUDE_SKILLS" "Claude Code Skills"
scan_dir "$AGENTS_SKILLS" "Agents Skills"

# Duplikate-Check: Skills die in beiden Verzeichnissen vorhanden sind
echo "" >> "$REPORT"
echo "## Mehrfach-Vorkommen" >> "$REPORT"
echo "" >> "$REPORT"
if [ -d "$CLAUDE_SKILLS" ] && [ -d "$AGENTS_SKILLS" ]; then
    DUPES=$(comm -12 \
        <(find "$CLAUDE_SKILLS" -mindepth 1 -maxdepth 1 -type d -printf "%f\n" 2>/dev/null | sort) \
        <(find "$AGENTS_SKILLS" -mindepth 1 -maxdepth 1 -type d -printf "%f\n" 2>/dev/null | sort))
    if [ -z "$DUPES" ]; then
        echo "Keine Skills in beiden Verzeichnissen gleichzeitig." >> "$REPORT"
    else
        echo "Skills in BEIDEN Verzeichnissen (potentielle Konsolidierungs-Kandidaten):" >> "$REPORT"
        echo "" >> "$REPORT"
        echo "$DUPES" | while read DUPE; do
            echo "- ${DUPE}" >> "$REPORT"
        done
    fi
fi

# Empfehlungen-Block
echo "" >> "$REPORT"
echo "## Vorschlaege (manuell pruefen)" >> "$REPORT"
echo "" >> "$REPORT"
echo "1. Skills mit Anmerkung \"klein (<4 KB), evtl. Stub\" pruefen ob Inhalt komplett ist oder Skill leer ist." >> "$REPORT"
echo "2. Skills mit \"stale (>90d)\" pruefen ob noch relevant. Bei Aria/Kadi-v2-fokussierten Skills evtl. behalten, bei generischen Forschungs-Skills Konsolidierung sinnvoll." >> "$REPORT"
echo "3. Skills ohne SKILL.md-Datei sind Format-Verletzungen, werden moeglicherweise nicht korrekt geladen." >> "$REPORT"
echo "4. Mehrfach-Vorkommen pruefen: einer der beiden Pfade als kanonisch waehlen (Claude Code 2.1.x bevorzugt ~/.claude/skills/)." >> "$REPORT"
echo "5. **Cognitive-Debt-Score (CD-Score 0-4):** Skills mit Score <=1 ('WARN') haben Anti-Cognitive-Debt-Defizite (keine Brain-Note, keine Tests, keine DoR/DoD, oder >90d stale). Quelle: KAR-349 + [[aria-kadi-anti-cognitive-debt-stack]]." >> "$REPORT"
echo "" >> "$REPORT"
echo "## Kein Auto-Delete" >> "$REPORT"
echo "" >> "$REPORT"
echo "Dieses Skript loescht oder veraendert NICHTS. Kais entscheidet ueber Konsolidierung. Schutzzonen-Regel aus Memory \`feedback_brain_protected_zones\` gilt sinngemaess auch fuer Skill-Bibliothek." >> "$REPORT"

echo "[$(date -u +%FT%TZ)] Skill-Curator Report geschrieben nach ${REPORT}" >> /root/.claude/hooks/hook.log
echo "OK Report: ${REPORT}"
