diff --git a/crumb-mission-selector.sh b/crumb-mission-selector.sh index 6799368..3e10ee9 100755 --- a/crumb-mission-selector.sh +++ b/crumb-mission-selector.sh @@ -1,7 +1,12 @@ #!/bin/bash -# 🌲 Crumbforest Mission Doktor v2.0 +# 🌲 Crumbforest Mission Doktor v2.1 # Metadata-driven, erweiterbar, Bash 3.2+ kompatibel # Inspiriert vom crumbpages-doktor.sh Konzept +# +# v2.1 Changes: +# - Added: πŸ₯‹ Dojo (BashPanda GΓΌrtel-System) +# - Added: πŸ”§ Tools (Terminal Dojo) +# - Fixed: Menu numbering set -euo pipefail @@ -11,11 +16,12 @@ BLUE='\033[0;34m' RED='\033[0;31m' YELLOW='\033[1;33m' CYAN='\033[0;36m' +MAGENTA='\033[1;35m' +DIM='\033[2m' NC='\033[0m' # No Color # === KONFIGURATION === SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="${SCRIPT_DIR}" # Save repo root before sourcing waldwaechter.sh MISSION_DIR="${SCRIPT_DIR}/missions" ENV_FILE="${SCRIPT_DIR}/.env" @@ -85,10 +91,10 @@ function load_missions_from_category() { MISSION_OPTIONS=() MISSION_SCRIPTS=() - # Alle .sh Dateien finden + # Alle .sh Dateien finden (exclude evaluate_* scripts) while IFS= read -r file; do [[ -n "$file" ]] && MISSION_SCRIPTS+=("$file") - done < <(find "$search_dir" -maxdepth 1 -type f -name "*.sh" | sort) + done < <(find "$search_dir" -maxdepth 1 -type f -name "*.sh" ! -name "evaluate_*" | sort) if [[ ${#MISSION_SCRIPTS[@]} -eq 0 ]]; then echo -e "${YELLOW}Keine Missionen in dieser Kategorie gefunden.${NC}" @@ -177,6 +183,29 @@ function run_mission_menu() { done } +# ============================================================ +# TERMINAL DOJO LAUNCHER (Special Handler) +# ============================================================ + +function terminal_dojo_launcher() { + local DOJO_DIR="${MISSION_DIR}/tools/terminal_dojo" + local DOJO_SCRIPT="${DOJO_DIR}/terminal_dojo.sh" + + if [[ -f "$DOJO_SCRIPT" ]]; then + chmod +x "${DOJO_DIR}"/*.sh 2>/dev/null || true + bash "$DOJO_SCRIPT" + else + echo "" + echo -e "${RED}❌ Terminal Dojo nicht gefunden!${NC}" + echo -e " Erwartet: ${DOJO_SCRIPT}" + echo "" + echo -e "${CYAN}Installation:${NC}" + echo " Das Terminal Dojo muss in missions/tools/terminal_dojo/ liegen." + echo "" + read -p "DrΓΌcke Enter..." -r + fi +} + # ============================================================ # DOKTOR SYSTEM-CHECK # ============================================================ @@ -408,15 +437,15 @@ function ai_doktor() { # Check welche APIs konfiguriert sind echo -e "${YELLOW}Konfigurierte APIs:${NC}" - [[ -n "$OPENROUTER_API_KEY" ]] && echo -e " ${GREEN}βœ… OpenRouter${NC} (Model: ${OPENROUTER_MODEL:-nicht gesetzt})" - [[ -n "$CLAUDE_API_KEY" ]] && echo -e " ${GREEN}βœ… Claude API${NC} (Model: ${CLAUDE_MODEL:-nicht gesetzt})" - [[ -n "$OPENAI_API_KEY" ]] && echo -e " ${GREEN}βœ… OpenAI${NC} (Model: ${OPENAI_MODEL:-nicht gesetzt})" + [[ -n "${OPENROUTER_API_KEY:-}" ]] && echo -e " ${GREEN}βœ… OpenRouter${NC} (Model: ${OPENROUTER_MODEL:-nicht gesetzt})" + [[ -n "${CLAUDE_API_KEY:-}" ]] && echo -e " ${GREEN}βœ… Claude API${NC} (Model: ${CLAUDE_MODEL:-nicht gesetzt})" + [[ -n "${OPENAI_API_KEY:-}" ]] && echo -e " ${GREEN}βœ… OpenAI${NC} (Model: ${OPENAI_MODEL:-nicht gesetzt})" - if [[ "$USE_OLLAMA" == "true" ]]; then + if [[ "${USE_OLLAMA:-}" == "true" ]]; then echo -e " ${GREEN}βœ… Ollama (Local)${NC} (Model: ${OLLAMA_MODEL:-nicht gesetzt})" fi - if [[ -z "$OPENROUTER_API_KEY" ]] && [[ -z "$CLAUDE_API_KEY" ]] && [[ -z "$OPENAI_API_KEY" ]] && [[ "$USE_OLLAMA" != "true" ]]; then + if [[ -z "${OPENROUTER_API_KEY:-}" ]] && [[ -z "${CLAUDE_API_KEY:-}" ]] && [[ -z "${OPENAI_API_KEY:-}" ]] && [[ "${USE_OLLAMA:-}" != "true" ]]; then echo -e " ${RED}❌ Keine API-Keys konfiguriert${NC}" fi @@ -424,7 +453,7 @@ function ai_doktor() { # Qdrant Status echo -e "${YELLOW}Vector Database (Qdrant):${NC}" - if [[ -n "$QDRANT_URL" ]]; then + if [[ -n "${QDRANT_URL:-}" ]]; then echo -e " ${GREEN}βœ… Konfiguriert${NC} (URL: ${QDRANT_URL})" else echo -e " ${YELLOW}⚠️ Nicht konfiguriert${NC}" @@ -444,7 +473,7 @@ function ai_doktor() { echo -e " Tages-Budget: ${GREEN}Unbegrenzt${NC}" fi - if [[ "${ENABLE_TOKEN_TRACKING}" == "true" ]]; then + if [[ "${ENABLE_TOKEN_TRACKING:-}" == "true" ]]; then echo -e " Token-Tracking: ${GREEN}Aktiviert${NC}" else echo -e " Token-Tracking: ${YELLOW}Deaktiviert${NC}" @@ -454,16 +483,16 @@ function ai_doktor() { # Aktivierte Charaktere echo -e "${YELLOW}WaldwΓ€chter (AI Charaktere):${NC}" - [[ "${ENABLE_MAYAEULE}" == "true" ]] && echo -e " ${GREEN}βœ… Maya-Eule${NC} (Weisheit)" - [[ "${ENABLE_DEEPBIT}" == "true" ]] && echo -e " ${GREEN}βœ… Deepbit${NC} (Bash-ErklΓ€rer)" - [[ "${ENABLE_BUGSY}" == "true" ]] && echo -e " ${GREEN}βœ… Bugsy${NC} (Debugging)" - [[ "${ENABLE_SCHNIPPSI}" == "true" ]] && echo -e " ${GREEN}βœ… Schnippsi${NC} (Shell-Helfer)" - [[ "${ENABLE_TOBI}" == "true" ]] && echo -e " ${GREEN}βœ… Tobi${NC} (JSON/Daten)" + [[ "${ENABLE_MAYAEULE:-}" == "true" ]] && echo -e " ${GREEN}βœ… Maya-Eule${NC} (Weisheit)" + [[ "${ENABLE_DEEPBIT:-}" == "true" ]] && echo -e " ${GREEN}βœ… Deepbit${NC} (Bash-ErklΓ€rer)" + [[ "${ENABLE_BUGSY:-}" == "true" ]] && echo -e " ${GREEN}βœ… Bugsy${NC} (Debugging)" + [[ "${ENABLE_SCHNIPPSI:-}" == "true" ]] && echo -e " ${GREEN}βœ… Schnippsi${NC} (Shell-Helfer)" + [[ "${ENABLE_TOBI:-}" == "true" ]] && echo -e " ${GREEN}βœ… Tobi${NC} (JSON/Daten)" echo "" # Token Logs anzeigen (wenn vorhanden) - if [[ "${ENABLE_TOKEN_TRACKING}" == "true" ]]; then + if [[ "${ENABLE_TOKEN_TRACKING:-}" == "true" ]]; then echo -e "${YELLOW}Token-Logs:${NC}" LOG_DIR="${LOG_DIR:-$HOME/.crumbforest_logs}" @@ -488,7 +517,7 @@ function ai_doktor() { function mayaeule_doktor() { echo -e "${BLUE}--- πŸ¦‰ Maya-Eule Weisheitsportal ---${NC}" - if [[ "$AI_AVAILABLE" == "false" ]] || [[ -z "$OPENROUTER_API_KEY" ]]; then + if [[ "$AI_AVAILABLE" == "false" ]] || [[ -z "${OPENROUTER_API_KEY:-}" ]]; then echo -e "${YELLOW}⚠️ Maya-Eule braucht einen API-Key${NC}" echo "" echo "Bitte konfiguriere .env mit OPENROUTER_API_KEY" @@ -500,7 +529,7 @@ function mayaeule_doktor() { EULE_RC="/tmp/crumb_eule_$$.rc" # Absoluter Pfad zum Maya-Eule Script - MAYAEULE_PATH="${REPO_ROOT}/crumbforest_roles/mayaeule_zero.sh" + MAYAEULE_PATH="${SCRIPT_DIR}/crumbforest_roles/mayaeule_zero.sh" cat > "${EULE_RC}" << EOF # Load .bashrc if exists @@ -565,63 +594,22 @@ function eule_memory() { } function eule_tokens() { - # Use the new crew_tokens function from waldwaechter.sh - # All logs are now in the repo logs/ directory - if command -v crew_tokens &> /dev/null; then - crew_tokens - else - # Fallback if waldwaechter.sh not loaded - LOGDIR="${REPO_ROOT}/logs" + LOGDIR="\$HOME/.eule_logs" + if [[ -f "\$LOGDIR/token_log.json" ]]; then echo -e "\${CYAN}πŸ“Š Token-Verbrauch:\${NC}" echo "" - - if [[ -d "\$LOGDIR" ]]; then - local total_tokens=0 - local found_any=false - - for token_file in "\$LOGDIR"/*/token_log.json; do - if [[ -f "\$token_file" ]]; then - local character=\$(basename "\$(dirname "\$token_file")") - local char_tokens=\$(grep -v '^\[\]\$' "\$token_file" | jq -s 'map(.usage.total_tokens // 0) | add // 0' 2>/dev/null || echo 0) - - if [[ \$char_tokens -gt 0 ]]; then - echo " \$character: \$char_tokens Tokens" - total_tokens=\$((total_tokens + char_tokens)) - found_any=true - fi - fi - done - - echo "" - if [[ \$found_any == true ]]; then - echo -e "\${GREEN}Gesamt: \$total_tokens Tokens\${NC}" - else - echo "Noch keine Token-Logs vorhanden" - fi - else - echo "Log-Verzeichnis nicht gefunden: \$LOGDIR" - fi - + TOTAL=0 + while IFS= read -r line; do + zeit=\$(echo "\$line" | jq -r '.zeit') + tokens=\$(echo "\$line" | jq -r '.usage.total_tokens') + TOTAL=\$((TOTAL + tokens)) + echo " \$zeit: \$tokens Tokens" + done < "\$LOGDIR/token_log.json" echo "" - echo -e "\${YELLOW}Token Budget & Philosophie:\${NC}" - echo " \"Was kostet die Frage eines Kindes?\"" - echo " Im Wald unbezahlbar - Token lehren achtsames Fragen." - echo "" - if [[ -n "\${DAILY_TOKEN_BUDGET}" ]] && [[ "\${DAILY_TOKEN_BUDGET}" != "0" ]]; then - echo " Tages-Budget: \${DAILY_TOKEN_BUDGET} Tokens" - else - echo " Tages-Budget: Unbegrenzt" - fi - if [[ "\${ENABLE_TOKEN_TRACKING}" == "true" ]]; then - echo " Token-Tracking: Aktiviert" - fi - echo "" - echo -e "\${CYAN}WaldwΓ€chter (AI Charaktere):\${NC}" - echo "" - echo -e "\${YELLOW}Token-Logs:\${NC}" - if [[ \$found_any == false ]]; then - echo " Noch keine Logs vorhanden" - fi + echo -e "\${GREEN}Gesamt: \$TOTAL Tokens\${NC}" + echo -e "\${YELLOW}Jede Frage ist wertvoll 🌲\${NC}" + else + echo "Noch keine Token-Logs." fi } @@ -646,7 +634,7 @@ function crumbcrew_doktor() { echo -e "${CYAN}Alle WaldwΓ€chter versammeln sich!${NC}" echo "" - if [[ "$AI_AVAILABLE" == "false" ]] || [[ -z "$OPENROUTER_API_KEY" ]]; then + if [[ "$AI_AVAILABLE" == "false" ]] || [[ -z "${OPENROUTER_API_KEY:-}" ]]; then echo -e "${YELLOW}⚠️ CrumbCrew braucht einen API-Key${NC}" echo "" echo "Bitte konfiguriere .env mit OPENROUTER_API_KEY" @@ -658,7 +646,7 @@ function crumbcrew_doktor() { CREW_RC="/tmp/crumb_crew_$$.rc" # Pfade zu allen Charakteren - CREW_DIR="${REPO_ROOT}/crumbforest_roles" + CREW_DIR="${SCRIPT_DIR}/crumbforest_roles" cat > "${CREW_RC}" << EOF # Load .bashrc if exists @@ -677,15 +665,9 @@ NC='\033[0m' # Prompt im CrumbCrew-Style export PS1="\[\033[1;32m\](🌲 CrumbCrew) \u@\h:\w\$ \[\033[0m\]" -# Repo Root und Pfade -REPO_ROOT="${REPO_ROOT}" +# Pfad zu den Charakteren CREW_DIR="${CREW_DIR}" -# Lade WaldwΓ€chter Library fΓΌr crew_tokens, crew_status, etc. -if [[ -f "\${REPO_ROOT}/lib/waldwaechter.sh" ]]; then - source "\${REPO_ROOT}/lib/waldwaechter.sh" -fi - # === WALDWΓ„CHTER FUNKTIONEN === function mayaeule() { @@ -724,15 +706,6 @@ function schnippsi() { "\$CREW_DIR/schnippsi_zero.sh" "\$@" } -function templatus() { - if [[ -z "\$1" ]]; then - echo -e "\${YELLOW}Verwendung: templatus \"Deine Frage\"\${NC}" - return - fi - echo -e "\${BLUE}πŸ“„ Templatus strukturiert...\${NC}" - "\$CREW_DIR/templatus_zero.sh" "\$@" -} - function tobi() { if [[ -z "\$1" ]]; then echo -e "\${YELLOW}Verwendung: tobi \"Deine Frage\"\${NC}" @@ -858,7 +831,6 @@ function crew_help() { echo -e " \${BLUE}πŸ™ deepbit\${NC} - Der poetische Oktopus (Bash-Konzepte)" echo -e " \${RED}🐞 bugsy\${NC} - Der Debugging-Clown (Fehlersuche)" echo -e " \${CYAN}βœ‚οΈ schnippsi\${NC} - Der Shell-Helfer (Kommandos)" - echo -e " \${BLUE}πŸ“„ templatus\${NC} - Der Template-Master (HTML, Struktur)" echo -e " \${GREEN}πŸ€– tobi\${NC} - Der Daten-Experte (JSON, Daten)" echo -e " \${CYAN}πŸ”§ schraubaer\${NC} - Der Handwerker (Werkzeug, Schweißen)" echo -e " \${GREEN}🐌 schnecki\${NC} - Der Elektronik-Bastler (LΓΆten, Sensoren)" @@ -888,7 +860,6 @@ function crew_help() { echo " deepbit \"ErklΓ€re Pipes und Redirects\"" echo " bugsy \"Warum funktioniert mein Script nicht?\"" echo " schnippsi \"Wie nutze ich grep?\"" - echo " templatus \"Erstelle eine HTML5 Struktur\"" echo " tobi \"Parse dieses JSON\"" echo " schraubaer \"Welches Werkzeug brauche ich zum LΓΆten?\"" echo " schnecki \"Wie lΓΆte ich eine LED an einen Widerstand?\"" @@ -913,7 +884,7 @@ function crew_status() { echo -e "\${CYAN}🌲 CrumbCrew Status\${NC}" echo "" - CHARS=("mayaeule:πŸ¦‰:Maya-Eule" "deepbit:πŸ™:Deepbit" "bugsy:🐞:Bugsy" "schnippsi:βœ‚οΈ:Schnippsi" "templatus:πŸ“„:Templatus" "tobi:πŸ€–:Tobi" "schraubaer:πŸ”§:SchraubbΓ€r" "schnecki:🐌:Schnecki" "dumbosql:🐘:DumboSQL" "funkfox:🦊:FunkFox" "taichitaube:πŸ•ŠοΈ:TaichiTaube" "snakepy:🐍:SnakePy" "pepperphp:πŸ§“:PepperPHP" "crabbyrust:πŸ¦€:CrabbyRust" "spider:πŸ•·οΈ:Spider" "vektor:🧭:Vektor" "asciimonster:πŸ‘Ύ:ASCII-Monster") + CHARS=("mayaeule:πŸ¦‰:Maya-Eule" "deepbit:πŸ™:Deepbit" "bugsy:🐞:Bugsy" "schnippsi:βœ‚οΈ:Schnippsi" "tobi:πŸ€–:Tobi" "schraubaer:πŸ”§:SchraubbΓ€r" "schnecki:🐌:Schnecki" "dumbosql:🐘:DumboSQL" "funkfox:🦊:FunkFox" "taichitaube:πŸ•ŠοΈ:TaichiTaube" "snakepy:🐍:SnakePy" "pepperphp:πŸ§“:PepperPHP" "crabbyrust:πŸ¦€:CrabbyRust" "spider:πŸ•·οΈ:Spider" "vektor:🧭:Vektor" "asciimonster:πŸ‘Ύ:ASCII-Monster") for char_info in "\${CHARS[@]}"; do IFS=: read -r name icon display <<< "\$char_info" @@ -942,8 +913,52 @@ function crew_status() { fi } -# crew_tokens, crew_memory, crew_status, crew_doctor, crew_syntax, crew_help -# sind bereits in waldwaechter.sh definiert und werden automatisch geladen +function crew_tokens() { + echo -e "\${CYAN}πŸ“Š CrumbCrew Token-Verbrauch\${NC}" + echo "" + + TOTAL=0 + + for logdir in ~/.{mayaeule,eule,deepbit,bugsy,schnippsi,tobi,schraubaer,schnecki,dumbosql,funkfox,taichitaube,snakepy,pepperphp,crabbyrust,spider,vektor,asciimonster}_logs; do + if [[ -d "\$logdir" ]] && [[ -f "\$logdir/token_log.json" ]]; then + char_name=\$(basename "\$logdir" | sed 's/_logs//') + char_tokens=0 + + while IFS= read -r line; do + tokens=\$(echo "\$line" | jq -r '.usage.total_tokens' 2>/dev/null) + if [[ "\$tokens" != "null" ]] && [[ -n "\$tokens" ]]; then + char_tokens=\$((char_tokens + tokens)) + fi + done < "\$logdir/token_log.json" + + if [[ \$char_tokens -gt 0 ]]; then + echo -e " \${GREEN}\$char_name:\${NC} \$char_tokens Tokens" + TOTAL=\$((TOTAL + char_tokens)) + fi + fi + done + + echo "" + echo -e "\${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" + echo -e " \${GREEN}Gesamt: \$TOTAL Tokens\${NC}" + echo -e " \${CYAN}Jede Frage ist wertvoll 🌲\${NC}" + echo -e "\${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" +} + +function crew_memory() { + echo -e "\${CYAN}πŸ“œ CrumbCrew Erinnerungen\${NC}" + echo "" + + for logdir in ~/.{mayaeule,eule,deepbit,bugsy,schnippsi,tobi,schraubaer,schnecki,dumbosql,funkfox,taichitaube,snakepy,pepperphp,crabbyrust,spider,vektor,asciimonster}_logs; do + if [[ -d "\$logdir" ]] && [[ -f "\$logdir/*_history.json" ]]; then + char_name=\$(basename "\$logdir" | sed 's/_logs//') + count=\$(jq '. | length' "\$logdir/*_history.json" 2>/dev/null) + if [[ "\$count" != "null" ]] && [[ \$count -gt 0 ]]; then + echo -e " \${GREEN}\$char_name:\${NC} \$count GesprΓ€che" + fi + fi + done +} alias help="crew_help" alias status="crew_status" @@ -977,35 +992,42 @@ EOF function main_menu() { while true; do show_header - echo "1) πŸ“š Basics - Einsteiger Missionen" - echo "2) πŸš€ Advanced - Fortgeschrittene Missionen" - echo "3) πŸ† Challenges - Herausforderungen" - echo "4) πŸ€– Robots - Roboter bauen mit der Crew" + echo -e "${CYAN}--- Missionen ---${NC}" + echo "1) πŸ“š Basics - Einsteiger Missionen" + echo "2) πŸš€ Advanced - Fortgeschrittene Missionen" + echo "3) πŸ† Challenges - Herausforderungen" + echo "4) πŸ€– Robots - Roboter bauen mit der Crew" + echo "5) πŸ₯‹ Dojo - BashPanda GΓΌrtel-System" echo "" - echo "--- Doktor Tools ---" - echo "5) πŸ–₯️ System Doktor" - echo "6) πŸ› οΈ Werkzeug-Check" - echo "7) 🌲 Git Doktor" - echo "8) πŸ€– AI & Token-Tracking" - echo "9) πŸ¦‰ Maya-Eule Weisheit" - echo "10) 🌲 CrumbCrew - Alle WaldwΓ€chter" + echo -e "${CYAN}--- Tools ---${NC}" + echo -e "6) πŸ”§ Terminal Dojo - OpenCode + WaldwΓ€chter ${DIM}(Advanced)${NC}" echo "" - echo "11) πŸ‘‹ Beenden" + echo -e "${CYAN}--- Doktor Tools ---${NC}" + echo "7) πŸ–₯️ System Doktor" + echo "8) πŸ› οΈ Werkzeug-Check" + echo "9) 🌲 Git Doktor" + echo "10) πŸ€– AI & Token-Tracking" + echo "11) πŸ¦‰ Maya-Eule Weisheit" + echo "12) 🌲 CrumbCrew - Alle WaldwΓ€chter" echo "" - read -p "Auswahl [1-11]: " CHOICE + echo "0) πŸ‘‹ Beenden" + echo "" + read -p "Auswahl [0-12]: " CHOICE case $CHOICE in 1) run_mission_menu "basics" "πŸ“š Basics - Einsteiger" ;; 2) run_mission_menu "advanced" "πŸš€ Advanced - Fortgeschrittene" ;; 3) run_mission_menu "challenges" "πŸ† Challenges" ;; 4) run_mission_menu "robots" "πŸ€– Robots - Roboter bauen" ;; - 5) system_doktor ;; - 6) tools_doktor ;; - 7) git_doktor ;; - 8) ai_doktor ;; - 9) mayaeule_doktor ;; - 10) crumbcrew_doktor ;; - 11) + 5) run_mission_menu "dojo" "πŸ₯‹ Dojo - BashPanda GΓΌrtel-System" ;; + 6) terminal_dojo_launcher ;; + 7) system_doktor ;; + 8) tools_doktor ;; + 9) git_doktor ;; + 10) ai_doktor ;; + 11) mayaeule_doktor ;; + 12) crumbcrew_doktor ;; + 0|q|Q) clear echo -e "${GREEN}" echo "πŸ‘‹ Auf bald im Crumbforest!" @@ -1013,7 +1035,7 @@ function main_menu() { exit 0 ;; *) - echo -e "${RED}Bitte 1-10 wΓ€hlen.${NC}" + echo -e "${RED}Bitte 0-12 wΓ€hlen.${NC}" sleep 1 ;; esac diff --git a/missions/tools/README.md b/missions/tools/README.md new file mode 100644 index 0000000..3dd7fbb --- /dev/null +++ b/missions/tools/README.md @@ -0,0 +1,181 @@ +# πŸ₯‹ Terminal Dojo + +> **OpenCode + WaldwΓ€chter + Ollama + Qdrant** +> Lokale AI im Crumbforest-Stil - Taschengeld-Format fΓΌr Kids + +--- + +## ⚠️ Das geht nicht schnell! + +**Bevor du startest:** +- Hast du das [Keks-Handbuch](https://github.com/kruemel/OZM-Keks-Handbuch-v1) gelesen? +- Mindestens Pfad 1-10 sollten bekannt sein +- Plan 2-4 Stunden Zeit ein (mit Pausen!) + +*"Machen statt Lernen - aber erst verstehen, dann machen."* + +--- + +## 🎯 Was ist das? + +Das Terminal Dojo bringt die **Crumbforest WaldwΓ€chter** direkt in dein Terminal: + +| WaldwΓ€chter | Rolle | SpezialitΓ€t | +|-------------|-------|-------------| +| πŸ› **Bugsy** | Debugging-Clown | Fehler mit Humor erklΓ€ren | +| πŸ”§ **Deepbit** | Bash-ErklΓ€rer | Tiefe System-ErklΓ€rungen | +| πŸ¦‰ **Maya-Eule** | Die Weise | Das große Bild sehen | +| 🦊 **FunkFox** | Bash-Rapper | Flow und Pipes | +| 🐘 **DumboSQL** | Datenbank-Elefant | SQL mit Geduld | + +**Lokal. Offline-fΓ€hig. Kostenlos.** + +--- + +## πŸš€ Schnellstart + +```bash +# Mission starten +./terminal_dojo.sh + +# Oder einzelne Phasen: +./01_vorcheck.sh # System checken +./02_opencode_setup.sh # OpenCode installieren +./03_ollama_setup.sh # Lokale Modelle (optional) +./04_agents_setup.sh # WaldwΓ€chter konfigurieren +./05_qdrant_setup.sh # Crew Memory (optional) +./06_test_crew.sh # Alles testen! +``` + +--- + +## πŸ“¦ Komponenten + +### Pflicht + +| Komponente | Beschreibung | +|------------|--------------| +| **OpenCode** | Terminal AI - die Basis fΓΌr alles | +| **WaldwΓ€chter Agents** | System Prompts fΓΌr die Crew | + +### Optional + +| Komponente | Beschreibung | Wann nΓΌtzlich? | +|------------|--------------|----------------| +| **Ollama** | Lokale AI-Modelle | Offline-Betrieb, Datenschutz | +| **Qdrant** | Vector DB fΓΌr Crew Memory | RAG, Keks-Handbuch durchsuchen | + +--- + +## πŸ’» Hardware-Anforderungen + +### Minimum (nur OpenCode + Cloud) +- Jedes GerΓ€t mit Terminal +- Internetverbindung +- OpenRouter API-Key + +### Empfohlen (mit Ollama) +- Raspberry Pi 5 (8GB) oder besser +- 32GB+ SD / 64GB+ SSD +- FΓΌr kleine Modelle: `qwen2.5:0.5b`, `tinyllama` + +### Optimal (alles lokal) +- RPi 5 + Hailo AI HAT oder x86 mit 16GB+ RAM +- 64GB+ SSD +- FΓΌr grâßere Modelle: `qwen2.5:7b`, `mistral`, `codellama` + +--- + +## 🌲 Nach der Installation + +```bash +# Crew-Übersicht +crew + +# Bugsy starten +crew bugsy + +# Direkte Frage an Eule +crew eule "Was ist der Sinn des Waldes?" + +# OpenCode TUI +opencode +``` + +--- + +## πŸ“ Verzeichnisstruktur + +Nach der Installation: + +``` +~/.terminal_dojo/ +β”œβ”€β”€ agents/ +β”‚ β”œβ”€β”€ bugsy.md +β”‚ β”œβ”€β”€ deepbit.md +β”‚ β”œβ”€β”€ eule.md +β”‚ β”œβ”€β”€ funkfox.md +β”‚ └── dumbosql.md +β”œβ”€β”€ crew.sh # Schnellzugriff-Script +β”œβ”€β”€ qdrant/ # (wenn installiert) +β”‚ β”œβ”€β”€ storage/ +β”‚ β”œβ”€β”€ start_qdrant.sh +β”‚ └── stop_qdrant.sh +└── ... + +~/.config/opencode/ +└── opencode.json # OpenCode Konfiguration mit Agents +``` + +--- + +## πŸ”— Integration mit Crumbforest + +Diese Mission ist Teil des grâßeren Γ–kosystems: + +``` +πŸ“š Keks-Handbuch (Wissen) + ↓ +πŸ₯‹ Terminal Dojo (Werkzeuge) ← DU BIST HIER + ↓ +πŸ¦‰ Crumb-Core (API/Web) + ↓ +πŸ“œ CrumbCodex (Archiv) +``` + +**Geplante Erweiterungen:** +- Keks-Handbuch als RAG-Content laden +- Sync mit Crumb-Core API +- WaldwΓ€chter-PersΓΆnlichkeiten erweitern + +--- + +## 🀝 Mitmachen + +- Neue WaldwΓ€chter-Prompts schreiben +- Bugs melden (Bugsy freut sich!) +- Übersetzungen + +**Lizenz:** MIT + CKL (Children's Knowledge License) + +--- + +## πŸ“š WeiterfΓΌhrende Links + +- [Keks-Handbuch](https://github.com/kruemel/OZM-Keks-Handbuch-v1) +- [Crumbmissions](https://github.com/kruemel/crumbmissions) +- [Crumb-Core](https://github.com/kruemel/Crumb-Core-v.1) +- [CrumbCodex](https://github.com/kruemel/CrumbCodex-v.0.0) +- [OpenCode Docs](https://opencode.ai/docs) +- [Ollama](https://ollama.ai) +- [Qdrant](https://qdrant.tech) + +--- + +*"Der Wald ist nie fertig - er wΓ€chst mit jeder Idee!"* 🌲 + +--- + +**Version:** 0.1.0-alpha +**Erstellt:** 2026-01-06 +**Crew:** Crumbforest diff --git a/missions/tools/terminal_dojo.sh b/missions/tools/terminal_dojo.sh new file mode 100644 index 0000000..e9be92f --- /dev/null +++ b/missions/tools/terminal_dojo.sh @@ -0,0 +1,168 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ TERMINAL DOJO - HauptmenΓΌ +# ═══════════════════════════════════════════════════════════════════════════ +# OpenCode + WaldwΓ€chter + Ollama + Qdrant +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +BOLD='\033[1m' +DIM='\033[2m' +NC='\033[0m' + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +show_banner() { + clear + echo "" + echo -e "${MAGENTA} ╔════════════════════════════════════════════════════════════╗${NC}" + echo -e "${MAGENTA} β•‘${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•‘${NC} ${BOLD}πŸ₯‹ TERMINAL DOJO${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•‘${NC} ${DIM}OpenCode + WaldwΓ€chter im Crumbforest${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•‘${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" + echo "" +} + +show_status() { + echo -e "${BOLD}Status:${NC}" + + # OpenCode + if command -v opencode &> /dev/null; then + echo -e " ${GREEN}●${NC} OpenCode" + else + echo -e " ${RED}β—‹${NC} OpenCode" + fi + + # Ollama + if command -v ollama &> /dev/null && curl -s http://localhost:11434/api/tags &>/dev/null; then + echo -e " ${GREEN}●${NC} Ollama" + elif command -v ollama &> /dev/null; then + echo -e " ${YELLOW}β—‹${NC} Ollama (nicht gestartet)" + else + echo -e " ${DIM}β—‹${NC} Ollama (optional)" + fi + + # Qdrant + if curl -s http://localhost:6333/collections &>/dev/null; then + echo -e " ${GREEN}●${NC} Qdrant" + else + echo -e " ${DIM}β—‹${NC} Qdrant (optional)" + fi + + # Agents + if [[ -d "$HOME/.terminal_dojo/agents" ]]; then + echo -e " ${GREEN}●${NC} WaldwΓ€chter" + else + echo -e " ${RED}β—‹${NC} WaldwΓ€chter" + fi + + echo "" +} + +show_menu() { + echo -e "${BOLD}Setup-Phasen:${NC}" + echo "" + echo -e " ${CYAN}1${NC}) Vorbereitung - System-Check & Handbuch-Reminder" + echo -e " ${CYAN}2${NC}) OpenCode - Terminal AI installieren" + echo -e " ${CYAN}3${NC}) Ollama - Lokale Modelle ${DIM}(optional)${NC}" + echo -e " ${CYAN}4${NC}) WaldwΓ€chter - Crew-Agents konfigurieren" + echo -e " ${CYAN}5${NC}) Qdrant - Crew Memory ${DIM}(optional)${NC}" + echo -e " ${CYAN}6${NC}) Testen - Alles ausprobieren!" + echo "" + echo -e "${BOLD}Schnellstart:${NC}" + echo "" + echo -e " ${CYAN}a${NC}) Alles installieren (gefΓΌhrt)" + echo -e " ${CYAN}c${NC}) Crew starten (wenn fertig)" + echo "" + echo -e " ${CYAN}q${NC}) Beenden" + echo "" +} + +run_phase() { + local phase=$1 + local script="$SCRIPT_DIR/0${phase}_*.sh" + + # Find the script + local found=$(ls $script 2>/dev/null | head -n1) + + if [[ -f "$found" ]]; then + chmod +x "$found" + "$found" + echo "" + read -p "DrΓΌcke Enter um fortzufahren..." -r + else + echo -e "${RED}Script nicht gefunden: $script${NC}" + sleep 2 + fi +} + +run_all() { + echo -e "${CYAN}Starte gefΓΌhrte Installation...${NC}" + echo "" + echo "Dies fΓΌhrt dich durch alle Phasen." + echo "Du kannst jede Phase ΓΌberspringen." + echo "" + read -p "Weiter? [J/n] " -n 1 -r + echo "" + + if [[ $REPLY =~ ^[Nn]$ ]]; then + return + fi + + for phase in 1 2 3 4 5 6; do + run_phase $phase + done +} + +start_crew() { + if [[ -f "$HOME/.terminal_dojo/crew.sh" ]]; then + source "$HOME/.terminal_dojo/crew.sh" + else + echo -e "${RED}Crew nicht konfiguriert!${NC}" + echo "Bitte erst Phase 4 ausfΓΌhren." + sleep 2 + fi +} + +# ───────────────────────────────────────────────────────────────────────────── +# Main Loop +# ───────────────────────────────────────────────────────────────────────────── + +while true; do + show_banner + show_status + show_menu + + read -p "WΓ€hle [1-6, a, c, q]: " -n 1 -r choice + echo "" + echo "" + + case $choice in + 1) run_phase 1 ;; + 2) run_phase 2 ;; + 3) run_phase 3 ;; + 4) run_phase 4 ;; + 5) run_phase 5 ;; + 6) run_phase 6 ;; + a|A) run_all ;; + c|C) start_crew; break ;; + q|Q) + echo -e "${BLUE}πŸ¦‰ Bis bald im Wald!${NC}" + echo "" + exit 0 + ;; + *) + echo -e "${YELLOW}UngΓΌltige Auswahl${NC}" + sleep 1 + ;; + esac +done diff --git a/missions/tools/terminal_dojo/01_vorcheck.sh b/missions/tools/terminal_dojo/01_vorcheck.sh new file mode 100755 index 0000000..f1202a2 --- /dev/null +++ b/missions/tools/terminal_dojo/01_vorcheck.sh @@ -0,0 +1,292 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ Terminal Dojo - Phase 1: Vorbereitung +# ═══════════════════════════════════════════════════════════════════════════ +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +set -e + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +# Banner +echo "" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD} πŸ₯‹ TERMINAL DOJO - Vorbereitungs-Check${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# WARNUNG: Das geht nicht schnell! +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${YELLOW}╔═══════════════════════════════════════════════════════════════╗${NC}" +echo -e "${YELLOW}β•‘ ${RED}⚠️ WARNUNG: Das geht nicht schnell!${YELLOW} β•‘${NC}" +echo -e "${YELLOW}╠═══════════════════════════════════════════════════════════════╣${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ Diese Mission braucht: β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ 2-4 Stunden Zeit (mit Pausen!) β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Geduld beim Download (Modelle sind groß) β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Grundwissen aus dem Keks-Handbuch β•‘${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ ${CYAN}Hast du das Handbuch gelesen?${YELLOW} β•‘${NC}" +echo -e "${YELLOW}β•‘ Mindestens Pfad 1-10 sollten bekannt sein. β•‘${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ πŸ“š https://github.com/kruemel/OZM-Keks-Handbuch-v1 β•‘${NC}" +echo -e "${YELLOW}β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" +echo "" + +read -p "Hast du das Keks-Handbuch (Pfad 1-10) gelesen? [j/N] " -n 1 -r +echo "" + +if [[ ! $REPLY =~ ^[Jj]$ ]]; then + echo "" + echo -e "${BLUE}πŸ¦‰ Maya-Eule sagt:${NC}" + echo -e " \"Kein Problem, mein kleiner KrΓΌmel." + echo -e " Der Wald rennt nicht weg." + echo -e " Lies erst das Handbuch - dann machen wir weiter.\"" + echo "" + echo -e " πŸ“š ${CYAN}https://github.com/kruemel/OZM-Keks-Handbuch-v1${NC}" + echo "" + echo -e "${YELLOW}Tipp: Starte mit crumbpage-01 bis crumbpage-10${NC}" + echo "" + exit 0 +fi + +echo "" +echo -e "${GREEN}βœ“ Gut! Dann lass uns dein System checken...${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# System Detection +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ“Š System-Erkennung${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" + +OS="unknown" +ARCH="unknown" +PACKAGE_MANAGER="unknown" +IS_RASPBERRY_PI=false +HAS_HAILO=false + +# OS Detection +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + OS="linux" + if [ -f /etc/os-release ]; then + . /etc/os-release + DISTRO=$ID + echo -e " OS: ${GREEN}Linux ($DISTRO)${NC}" + fi + + # Raspberry Pi Detection + if [ -f /proc/cpuinfo ] && grep -q "Raspberry Pi" /proc/cpuinfo 2>/dev/null; then + IS_RASPBERRY_PI=true + PI_MODEL=$(grep "Model" /proc/cpuinfo | cut -d: -f2 | xargs) + echo -e " Device: ${GREEN}$PI_MODEL${NC}" + fi + + # Hailo AI HAT Detection + if lsusb 2>/dev/null | grep -qi "hailo"; then + HAS_HAILO=true + echo -e " AI HAT: ${GREEN}Hailo detected!${NC}" + fi + + # Package Manager + if command -v apt &> /dev/null; then + PACKAGE_MANAGER="apt" + elif command -v dnf &> /dev/null; then + PACKAGE_MANAGER="dnf" + elif command -v pacman &> /dev/null; then + PACKAGE_MANAGER="pacman" + fi + +elif [[ "$OSTYPE" == "darwin"* ]]; then + OS="macos" + MACOS_VERSION=$(sw_vers -productVersion) + CHIP=$(uname -m) + echo -e " OS: ${GREEN}macOS $MACOS_VERSION${NC}" + echo -e " Chip: ${GREEN}$CHIP${NC}" + PACKAGE_MANAGER="brew" +fi + +# Architecture +ARCH=$(uname -m) +echo -e " Arch: ${GREEN}$ARCH${NC}" + +# RAM +if [[ "$OS" == "linux" ]]; then + RAM_GB=$(free -g | awk '/^Mem:/{print $2}') +elif [[ "$OS" == "macos" ]]; then + RAM_GB=$(($(sysctl -n hw.memsize) / 1024 / 1024 / 1024)) +fi +echo -e " RAM: ${GREEN}${RAM_GB}GB${NC}" + +# Storage +if [[ "$OS" == "linux" ]]; then + DISK_FREE=$(df -h / | awk 'NR==2 {print $4}') +elif [[ "$OS" == "macos" ]]; then + DISK_FREE=$(df -h / | awk 'NR==2 {print $4}') +fi +echo -e " Free: ${GREEN}$DISK_FREE${NC}" + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Hardware Bewertung +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}🎯 Hardware-Bewertung${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" + +RATING="unknown" +MODELS_RECOMMENDED="" + +if [[ $RAM_GB -lt 4 ]]; then + RATING="minimal" + echo -e " ${YELLOW}⚠️ Wenig RAM - nur sehr kleine Modelle mΓΆglich${NC}" + echo -e " ${YELLOW} Empfehlung: Nutze OpenRouter statt lokaler Modelle${NC}" + MODELS_RECOMMENDED="Keins (nutze OpenRouter)" +elif [[ $RAM_GB -lt 8 ]]; then + RATING="basic" + echo -e " ${GREEN}βœ“ Ausreichend fΓΌr kleine Modelle${NC}" + MODELS_RECOMMENDED="qwen2.5:0.5b, tinyllama" +elif [[ $RAM_GB -lt 16 ]]; then + RATING="good" + echo -e " ${GREEN}βœ“ Gut fΓΌr mittlere Modelle${NC}" + MODELS_RECOMMENDED="qwen2.5:1.5b, llama3.2:1b, gemma2:2b" +else + RATING="excellent" + echo -e " ${GREEN}βœ“ Exzellent - alle Modelle mΓΆglich${NC}" + MODELS_RECOMMENDED="qwen2.5:7b, llama3.2:3b, mistral, codellama" +fi + +if [[ "$IS_RASPBERRY_PI" == true ]]; then + echo -e " ${CYAN}πŸ“ Raspberry Pi erkannt${NC}" + if [[ "$HAS_HAILO" == true ]]; then + echo -e " ${GREEN}πŸš€ Mit Hailo AI - beschleunigte Inferenz mΓΆglich!${NC}" + else + echo -e " ${YELLOW} Tipp: Hailo AI HAT beschleunigt lokale Modelle${NC}" + fi +fi + +echo "" +echo -e " Empfohlene Modelle: ${CYAN}$MODELS_RECOMMENDED${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Tools Check +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ”§ Tools-Check${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" + +check_tool() { + local tool=$1 + local required=$2 + local install_hint=$3 + + if command -v "$tool" &> /dev/null; then + local version=$($tool --version 2>/dev/null | head -n1 || echo "installed") + echo -e " ${GREEN}βœ“${NC} $tool: $version" + return 0 + else + if [[ "$required" == "true" ]]; then + echo -e " ${RED}βœ—${NC} $tool: nicht gefunden ${YELLOW}(benΓΆtigt)${NC}" + echo -e " ${CYAN}β†’ $install_hint${NC}" + else + echo -e " ${YELLOW}β—‹${NC} $tool: nicht gefunden (optional)" + fi + return 1 + fi +} + +MISSING_REQUIRED=false + +# Required Tools +check_tool "bash" "true" "Sollte vorhanden sein!" || MISSING_REQUIRED=true +check_tool "curl" "true" "$PACKAGE_MANAGER install curl" || MISSING_REQUIRED=true +check_tool "git" "true" "$PACKAGE_MANAGER install git" || MISSING_REQUIRED=true +check_tool "jq" "true" "$PACKAGE_MANAGER install jq" || MISSING_REQUIRED=true + +echo "" + +# Optional Tools +echo -e "${BOLD}Optional:${NC}" +check_tool "opencode" "false" "curl -fsSL https://opencode.ai/install | bash" +check_tool "ollama" "false" "curl -fsSL https://ollama.ai/install.sh | sh" +check_tool "docker" "false" "$PACKAGE_MANAGER install docker.io" +check_tool "node" "false" "$PACKAGE_MANAGER install nodejs" + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Zusammenfassung +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD}πŸ“‹ Zusammenfassung${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +if [[ "$MISSING_REQUIRED" == true ]]; then + echo -e "${RED}❌ Einige benΓΆtigte Tools fehlen!${NC}" + echo -e " Bitte installiere die fehlenden Tools und starte erneut." + echo "" + exit 1 +fi + +echo -e "${GREEN}βœ“ Basis-System bereit${NC}" +echo "" + +# Next Steps +echo -e "${BOLD}NΓ€chste Schritte:${NC}" +echo "" + +if ! command -v opencode &> /dev/null; then + echo -e " 1. ${CYAN}./02_opencode_setup.sh${NC} - OpenCode installieren" +else + echo -e " 1. ${GREEN}βœ“${NC} OpenCode bereits installiert" +fi + +if ! command -v ollama &> /dev/null; then + echo -e " 2. ${CYAN}./03_ollama_setup.sh${NC} - Ollama installieren (optional)" +else + echo -e " 2. ${GREEN}βœ“${NC} Ollama bereits installiert" +fi + +echo -e " 3. ${CYAN}./04_agents_setup.sh${NC} - WaldwΓ€chter konfigurieren" +echo -e " 4. ${CYAN}./05_qdrant_setup.sh${NC} - Crew Memory (optional)" +echo -e " 5. ${CYAN}./06_test_crew.sh${NC} - Alles testen!" +echo "" + +echo -e "${BLUE}πŸ› Bugsy sagt:${NC}" +echo -e " \"Stolpern ist Teil des Lernens!" +echo -e " Wenn etwas nicht klappt - frag mich!\"" +echo "" + +# Save system info for later scripts +cat > /tmp/terminal_dojo_sysinfo.json << EOF +{ + "os": "$OS", + "arch": "$ARCH", + "ram_gb": $RAM_GB, + "rating": "$RATING", + "is_raspberry_pi": $IS_RASPBERRY_PI, + "has_hailo": $HAS_HAILO, + "package_manager": "$PACKAGE_MANAGER", + "models_recommended": "$MODELS_RECOMMENDED", + "checked_at": "$(date -Iseconds)" +} +EOF + +echo -e "${GREEN}System-Info gespeichert: /tmp/terminal_dojo_sysinfo.json${NC}" +echo "" diff --git a/missions/tools/terminal_dojo/02_opencode_setup.sh b/missions/tools/terminal_dojo/02_opencode_setup.sh new file mode 100755 index 0000000..cd84f18 --- /dev/null +++ b/missions/tools/terminal_dojo/02_opencode_setup.sh @@ -0,0 +1,268 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ Terminal Dojo - Phase 2: OpenCode Setup +# ═══════════════════════════════════════════════════════════════════════════ +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +set -e + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +BOLD='\033[1m' +NC='\033[0m' + +echo "" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD} πŸ₯‹ TERMINAL DOJO - Phase 2: OpenCode Setup${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Check if already installed +# ───────────────────────────────────────────────────────────────────────────── + +if command -v opencode &> /dev/null; then + CURRENT_VERSION=$(opencode --version 2>/dev/null | head -n1 || echo "unknown") + echo -e "${GREEN}βœ“ OpenCode ist bereits installiert: $CURRENT_VERSION${NC}" + echo "" + read -p "MΓΆchtest du auf die neueste Version aktualisieren? [j/N] " -n 1 -r + echo "" + if [[ ! $REPLY =~ ^[Jj]$ ]]; then + echo -e "${CYAN}β†’ Weiter mit Phase 3: ./03_ollama_setup.sh${NC}" + exit 0 + fi +fi + +# ───────────────────────────────────────────────────────────────────────────── +# Load System Info +# ───────────────────────────────────────────────────────────────────────────── + +if [ -f /tmp/terminal_dojo_sysinfo.json ]; then + OS=$(jq -r '.os' /tmp/terminal_dojo_sysinfo.json) + ARCH=$(jq -r '.arch' /tmp/terminal_dojo_sysinfo.json) + PACKAGE_MANAGER=$(jq -r '.package_manager' /tmp/terminal_dojo_sysinfo.json) +else + echo -e "${YELLOW}⚠️ System-Info nicht gefunden. Bitte erst ./01_vorcheck.sh ausfΓΌhren.${NC}" + exit 1 +fi + +echo -e "${BOLD}System: $OS / $ARCH${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Installation Methods +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ“¦ Installationsmethode wΓ€hlen:${NC}" +echo "" +echo " 1) Auto-Install (empfohlen)" +echo " curl -fsSL https://opencode.ai/install | bash" +echo "" +echo " 2) npm global" +echo " npm install -g opencode-ai" +echo "" +echo " 3) Homebrew (nur macOS)" +echo " brew install opencode" +echo "" +echo " 4) Manual Download" +echo " https://github.com/sst/opencode/releases" +echo "" +echo " 0) Überspringen" +echo "" + +read -p "WΓ€hle [1-4, 0 zum Überspringen]: " -n 1 -r INSTALL_METHOD +echo "" +echo "" + +case $INSTALL_METHOD in + 1) + echo -e "${CYAN}πŸ”§ Auto-Installation...${NC}" + echo "" + curl -fsSL https://opencode.ai/install | bash + ;; + 2) + echo -e "${CYAN}πŸ”§ npm Installation...${NC}" + echo "" + if ! command -v npm &> /dev/null; then + echo -e "${RED}❌ npm nicht gefunden!${NC}" + echo -e " Installiere Node.js: $PACKAGE_MANAGER install nodejs" + exit 1 + fi + npm install -g opencode-ai + ;; + 3) + if [[ "$OS" != "macos" ]]; then + echo -e "${RED}❌ Homebrew ist nur auf macOS verfΓΌgbar${NC}" + exit 1 + fi + echo -e "${CYAN}πŸ”§ Homebrew Installation...${NC}" + echo "" + brew install opencode + ;; + 4) + echo -e "${CYAN}Manual Download:${NC}" + echo " https://github.com/sst/opencode/releases" + echo "" + echo "Lade die passende Version fΓΌr $OS/$ARCH herunter" + echo "und fΓΌge sie zu deinem PATH hinzu." + exit 0 + ;; + 0) + echo -e "${YELLOW}Installation ΓΌbersprungen.${NC}" + exit 0 + ;; + *) + echo -e "${RED}UngΓΌltige Auswahl${NC}" + exit 1 + ;; +esac + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Verify Installation +# ───────────────────────────────────────────────────────────────────────────── + +# Reload PATH +export PATH="$HOME/.local/bin:$HOME/.npm-global/bin:$PATH" + +if command -v opencode &> /dev/null; then + VERSION=$(opencode --version 2>/dev/null | head -n1 || echo "installed") + echo -e "${GREEN}βœ“ OpenCode erfolgreich installiert: $VERSION${NC}" +else + echo -e "${RED}❌ OpenCode Installation fehlgeschlagen${NC}" + echo "" + echo "Versuche manuell:" + echo " curl -fsSL https://opencode.ai/install | bash" + echo "" + echo "Oder check die Dokumentation:" + echo " https://opencode.ai/docs" + exit 1 +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Initial Configuration +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}βš™οΈ Basis-Konfiguration${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +OPENCODE_CONFIG_DIR="$HOME/.config/opencode" +mkdir -p "$OPENCODE_CONFIG_DIR" + +echo -e "OpenCode kann verschiedene AI-Provider nutzen:" +echo "" +echo " 1) OpenRouter (empfohlen fΓΌr Crumbforest)" +echo " β†’ Viele Modelle, ein API-Key" +echo " β†’ UnterstΓΌtzt Claude, GPT-4, Gemini, Mistral..." +echo "" +echo " 2) Ollama (lokal, offline)" +echo " β†’ Wird in Phase 3 konfiguriert" +echo " β†’ Braucht keinen API-Key" +echo "" +echo " 3) Anthropic Claude direkt" +echo " β†’ Wenn du einen Claude API-Key hast" +echo "" +echo " 4) SpΓ€ter konfigurieren" +echo "" + +read -p "Welchen Provider mΓΆchtest du einrichten? [1-4]: " -n 1 -r PROVIDER_CHOICE +echo "" +echo "" + +case $PROVIDER_CHOICE in + 1) + echo -e "${CYAN}OpenRouter Setup:${NC}" + echo "" + echo "Hol dir einen API-Key von: https://openrouter.ai/keys" + echo "(Falls du schon einen fΓΌr Crumbforest hast, nutze den!)" + echo "" + read -p "OpenRouter API-Key: " -r OPENROUTER_KEY + + if [[ -n "$OPENROUTER_KEY" ]]; then + # Test the key + echo "" + echo -e "${CYAN}Teste API-Key...${NC}" + + RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: Bearer $OPENROUTER_KEY" \ + "https://openrouter.ai/api/v1/models" 2>/dev/null || echo "000") + + if [[ "$RESPONSE" == "200" ]]; then + echo -e "${GREEN}βœ“ API-Key funktioniert!${NC}" + + # Save to environment + echo "" + echo "Speichere Key in ~/.bashrc..." + + # Remove old entry if exists + sed -i.bak '/OPENROUTER_API_KEY/d' ~/.bashrc 2>/dev/null || true + + echo "export OPENROUTER_API_KEY=\"$OPENROUTER_KEY\"" >> ~/.bashrc + export OPENROUTER_API_KEY="$OPENROUTER_KEY" + + echo -e "${GREEN}βœ“ Gespeichert!${NC}" + else + echo -e "${YELLOW}⚠️ API-Key konnte nicht verifiziert werden (HTTP $RESPONSE)${NC}" + echo " Key wird trotzdem gespeichert - du kannst ihn spΓ€ter korrigieren." + fi + fi + ;; + 2) + echo -e "${CYAN}Ollama wird in Phase 3 eingerichtet.${NC}" + echo "Weiter mit: ./03_ollama_setup.sh" + ;; + 3) + echo -e "${CYAN}Anthropic Setup:${NC}" + echo "" + echo "Hol dir einen API-Key von: https://console.anthropic.com" + echo "" + read -p "Anthropic API-Key: " -r ANTHROPIC_KEY + + if [[ -n "$ANTHROPIC_KEY" ]]; then + sed -i.bak '/ANTHROPIC_API_KEY/d' ~/.bashrc 2>/dev/null || true + echo "export ANTHROPIC_API_KEY=\"$ANTHROPIC_KEY\"" >> ~/.bashrc + export ANTHROPIC_API_KEY="$ANTHROPIC_KEY" + echo -e "${GREEN}βœ“ Gespeichert!${NC}" + fi + ;; + 4) + echo -e "${YELLOW}Provider-Setup ΓΌbersprungen.${NC}" + echo "Du kannst spΓ€ter 'opencode auth login' ausfΓΌhren." + ;; +esac + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Summary +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD}βœ… Phase 2 abgeschlossen!${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" +echo -e "${GREEN}OpenCode ist bereit!${NC}" +echo "" +echo "Schnellstart:" +echo -e " ${CYAN}opencode${NC} # TUI starten" +echo -e " ${CYAN}opencode \"ErklΓ€re...\"${NC} # Direkte Frage" +echo "" +echo -e "${BOLD}NΓ€chste Schritte:${NC}" +echo -e " 3. ${CYAN}./03_ollama_setup.sh${NC} - Lokale Modelle (optional)" +echo -e " 4. ${CYAN}./04_agents_setup.sh${NC} - WaldwΓ€chter konfigurieren" +echo "" + +echo -e "${BLUE}πŸ”§ Deepbit sagt:${NC}" +echo -e " \"OpenCode ist wie ein Schweizer Taschenmesser" +echo -e " fΓΌr die Kommandozeile. MΓ€chtig, aber braucht Übung!\"" +echo "" diff --git a/missions/tools/terminal_dojo/03_ollama_setup.sh b/missions/tools/terminal_dojo/03_ollama_setup.sh new file mode 100755 index 0000000..e0ce7e9 --- /dev/null +++ b/missions/tools/terminal_dojo/03_ollama_setup.sh @@ -0,0 +1,382 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ Terminal Dojo - Phase 3: Ollama Setup (Optional) +# ═══════════════════════════════════════════════════════════════════════════ +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +set -e + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +BOLD='\033[1m' +NC='\033[0m' + +echo "" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD} πŸ₯‹ TERMINAL DOJO - Phase 3: Ollama Setup${NC}" +echo -e "${MAGENTA} ────────────────────────────────────────${NC}" +echo -e "${MAGENTA} OPTIONAL - FΓΌr lokale/offline AI-Modelle${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Optional Check +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${YELLOW}╔═══════════════════════════════════════════════════════════════╗${NC}" +echo -e "${YELLOW}β•‘ ℹ️ Diese Phase ist OPTIONAL β•‘${NC}" +echo -e "${YELLOW}╠═══════════════════════════════════════════════════════════════╣${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ Ollama ermΓΆglicht: β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Lokale AI-Modelle (kein Internet nΓΆtig) β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Kostenlose Nutzung (keine API-Kosten) β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Datenschutz (alles bleibt auf deinem GerΓ€t) β•‘${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ ABER: Braucht Rechenpower und Speicherplatz! β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Modelle sind 500MB - 8GB groß β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Braucht mindestens 4GB RAM β•‘${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ Wenn du OpenRouter nutzt, brauchst du Ollama nicht. β•‘${NC}" +echo -e "${YELLOW}β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" +echo "" + +read -p "MΓΆchtest du Ollama installieren? [j/N] " -n 1 -r +echo "" + +if [[ ! $REPLY =~ ^[Jj]$ ]]; then + echo "" + echo -e "${CYAN}β†’ Übersprungen. Weiter mit: ./04_agents_setup.sh${NC}" + exit 0 +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Load System Info +# ───────────────────────────────────────────────────────────────────────────── + +if [ -f /tmp/terminal_dojo_sysinfo.json ]; then + OS=$(jq -r '.os' /tmp/terminal_dojo_sysinfo.json) + ARCH=$(jq -r '.arch' /tmp/terminal_dojo_sysinfo.json) + RAM_GB=$(jq -r '.ram_gb' /tmp/terminal_dojo_sysinfo.json) + RATING=$(jq -r '.rating' /tmp/terminal_dojo_sysinfo.json) + IS_RASPBERRY_PI=$(jq -r '.is_raspberry_pi' /tmp/terminal_dojo_sysinfo.json) + MODELS_RECOMMENDED=$(jq -r '.models_recommended' /tmp/terminal_dojo_sysinfo.json) +else + echo -e "${YELLOW}⚠️ System-Info nicht gefunden. Bitte erst ./01_vorcheck.sh ausfΓΌhren.${NC}" + exit 1 +fi + +echo -e "${BOLD}System: $OS / $ARCH / ${RAM_GB}GB RAM${NC}" +echo -e "Empfohlene Modelle: ${CYAN}$MODELS_RECOMMENDED${NC}" +echo "" + +# RAM Warning +if [[ $RAM_GB -lt 4 ]]; then + echo -e "${RED}⚠️ Warnung: Weniger als 4GB RAM!${NC}" + echo -e " Ollama wird wahrscheinlich nicht gut funktionieren." + echo "" + read -p "Trotzdem fortfahren? [j/N] " -n 1 -r + echo "" + if [[ ! $REPLY =~ ^[Jj]$ ]]; then + echo -e "${CYAN}β†’ Empfehlung: Nutze OpenRouter statt lokaler Modelle.${NC}" + exit 0 + fi +fi + +# ───────────────────────────────────────────────────────────────────────────── +# Check if already installed +# ───────────────────────────────────────────────────────────────────────────── + +if command -v ollama &> /dev/null; then + CURRENT_VERSION=$(ollama --version 2>/dev/null | head -n1 || echo "unknown") + echo -e "${GREEN}βœ“ Ollama ist bereits installiert: $CURRENT_VERSION${NC}" + echo "" + + # Check if running + if pgrep -x "ollama" > /dev/null 2>&1; then + echo -e "${GREEN}βœ“ Ollama lΓ€uft bereits${NC}" + else + echo -e "${YELLOW}Starte Ollama...${NC}" + ollama serve &>/dev/null & + sleep 2 + fi + + SKIP_INSTALL=true +else + SKIP_INSTALL=false +fi + +# ───────────────────────────────────────────────────────────────────────────── +# Installation +# ───────────────────────────────────────────────────────────────────────────── + +if [[ "$SKIP_INSTALL" != true ]]; then + echo -e "${BOLD}πŸ“¦ Ollama Installation${NC}" + echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" + echo "" + + if [[ "$OS" == "linux" ]]; then + echo -e "${CYAN}Linux Installation...${NC}" + echo "" + + if [[ "$IS_RASPBERRY_PI" == "true" ]]; then + echo -e "${YELLOW}πŸ“ Raspberry Pi erkannt${NC}" + echo " Ollama fΓΌr ARM64 wird installiert..." + echo "" + fi + + # Official install script + curl -fsSL https://ollama.ai/install.sh | sh + + elif [[ "$OS" == "macos" ]]; then + echo -e "${CYAN}macOS Installation...${NC}" + echo "" + + if command -v brew &> /dev/null; then + echo "Installiere via Homebrew..." + brew install ollama + else + echo "Installiere via Download..." + curl -fsSL https://ollama.ai/install.sh | sh + fi + else + echo -e "${RED}❌ Unbekanntes Betriebssystem: $OS${NC}" + echo " Bitte installiere Ollama manuell: https://ollama.ai" + exit 1 + fi + + echo "" + + # Verify + if command -v ollama &> /dev/null; then + echo -e "${GREEN}βœ“ Ollama erfolgreich installiert!${NC}" + else + echo -e "${RED}❌ Installation fehlgeschlagen${NC}" + exit 1 + fi +fi + +# ───────────────────────────────────────────────────────────────────────────── +# Start Ollama Service +# ───────────────────────────────────────────────────────────────────────────── + +echo "" +echo -e "${BOLD}πŸš€ Ollama Service${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" + +# Check if running +if curl -s http://localhost:11434/api/tags &>/dev/null; then + echo -e "${GREEN}βœ“ Ollama API erreichbar (localhost:11434)${NC}" +else + echo -e "${YELLOW}Starte Ollama Service...${NC}" + + if [[ "$OS" == "linux" ]]; then + # Try systemd first + if command -v systemctl &> /dev/null; then + sudo systemctl start ollama 2>/dev/null || ollama serve &>/dev/null & + else + ollama serve &>/dev/null & + fi + else + ollama serve &>/dev/null & + fi + + sleep 3 + + if curl -s http://localhost:11434/api/tags &>/dev/null; then + echo -e "${GREEN}βœ“ Ollama gestartet!${NC}" + else + echo -e "${YELLOW}⚠️ Ollama startet mΓΆglicherweise noch...${NC}" + fi +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Model Selection +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ€– Modell-Auswahl${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +# Show current models +CURRENT_MODELS=$(ollama list 2>/dev/null | tail -n +2 | awk '{print $1}' || echo "") + +if [[ -n "$CURRENT_MODELS" ]]; then + echo -e "${GREEN}Bereits installierte Modelle:${NC}" + echo "$CURRENT_MODELS" | while read model; do + echo -e " β€’ $model" + done + echo "" +fi + +echo -e "${BOLD}Empfohlene Modelle fΓΌr dein System ($RATING):${NC}" +echo "" + +case $RATING in + minimal|basic) + echo " 1) qwen2.5:0.5b (~400MB) - Sehr klein, schnell" + echo " 2) tinyllama (~600MB) - Klein, gut fΓΌr Chat" + echo " 3) Keins - Ich nutze OpenRouter" + SUGGESTED="qwen2.5:0.5b" + ;; + good) + echo " 1) qwen2.5:1.5b (~1GB) - Gut balanciert" + echo " 2) llama3.2:1b (~1.3GB) - Meta's kleinstes" + echo " 3) gemma2:2b (~1.6GB) - Google's kleines" + echo " 4) codegemma:2b (~1.6GB) - FΓΌr Code" + echo " 5) Keins - Ich nutze OpenRouter" + SUGGESTED="qwen2.5:1.5b" + ;; + excellent) + echo " 1) qwen2.5:7b (~4.4GB) - Sehr gut" + echo " 2) llama3.2:3b (~2GB) - Meta's mittleres" + echo " 3) mistral (~4.1GB) - Mistral 7B" + echo " 4) codellama:7b (~3.8GB) - FΓΌr Code" + echo " 5) deepseek-coder (~776MB) - Code-spezialisiert" + echo " 6) Keins - Ich nutze OpenRouter" + SUGGESTED="qwen2.5:7b" + ;; +esac + +echo "" +echo -e "Empfohlen: ${GREEN}$SUGGESTED${NC}" +echo "" +read -p "Welches Modell installieren? (Name eingeben oder Enter fΓΌr $SUGGESTED): " MODEL_CHOICE + +if [[ -z "$MODEL_CHOICE" ]]; then + MODEL_CHOICE="$SUGGESTED" +fi + +if [[ "$MODEL_CHOICE" == "Keins" ]] || [[ "$MODEL_CHOICE" =~ ^[0-9]+$ && "$MODEL_CHOICE" -ge 5 ]]; then + echo -e "${CYAN}Kein Modell installiert. Du kannst spΓ€ter 'ollama pull ' nutzen.${NC}" +else + echo "" + echo -e "${CYAN}Lade $MODEL_CHOICE herunter...${NC}" + echo -e "${YELLOW}(Das kann einige Minuten dauern, je nach Internetverbindung)${NC}" + echo "" + + ollama pull "$MODEL_CHOICE" + + echo "" + echo -e "${GREEN}βœ“ Modell $MODEL_CHOICE installiert!${NC}" +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Configure OpenCode to use Ollama +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}βš™οΈ OpenCode + Ollama verbinden${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +# Save Ollama config for later +cat > /tmp/terminal_dojo_ollama.json << EOF +{ + "installed": true, + "endpoint": "http://localhost:11434", + "default_model": "$MODEL_CHOICE", + "installed_at": "$(date -Iseconds)" +} +EOF + +echo "Um OpenCode mit Ollama zu nutzen:" +echo "" +echo -e " ${CYAN}export LOCAL_ENDPOINT=\"http://localhost:11434\"${NC}" +echo "" +echo "Oder in der opencode.json:" +echo "" +cat << 'EOF' + { + "providers": { + "ollama": { + "endpoint": "http://localhost:11434" + } + }, + "agents": { + "coder": { + "model": "ollama.qwen2.5:7b" + } + } + } +EOF +echo "" + +# Add to bashrc +read -p "Soll LOCAL_ENDPOINT in ~/.bashrc gespeichert werden? [J/n] " -n 1 -r +echo "" +if [[ ! $REPLY =~ ^[Nn]$ ]]; then + sed -i.bak '/LOCAL_ENDPOINT/d' ~/.bashrc 2>/dev/null || true + echo 'export LOCAL_ENDPOINT="http://localhost:11434"' >> ~/.bashrc + export LOCAL_ENDPOINT="http://localhost:11434" + echo -e "${GREEN}βœ“ Gespeichert!${NC}" +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Quick Test +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ§ͺ Schnelltest${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +read -p "Soll ich einen kurzen Test mit dem Modell machen? [J/n] " -n 1 -r +echo "" + +if [[ ! $REPLY =~ ^[Nn]$ ]]; then + echo "" + echo -e "${CYAN}Frage: Was ist 2+2?${NC}" + echo "" + + RESPONSE=$(ollama run "$MODEL_CHOICE" "Antworte nur mit der Zahl: Was ist 2+2?" 2>/dev/null || echo "Fehler") + + echo -e "${GREEN}Antwort: $RESPONSE${NC}" + echo "" + + if [[ "$RESPONSE" == *"4"* ]]; then + echo -e "${GREEN}βœ“ Modell funktioniert!${NC}" + else + echo -e "${YELLOW}⚠️ Unerwartete Antwort, aber Modell lΓ€uft.${NC}" + fi +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Summary +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD}βœ… Phase 3 abgeschlossen!${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" +echo -e "${GREEN}Ollama ist bereit fΓΌr lokale AI!${NC}" +echo "" +echo "NΓΌtzliche Befehle:" +echo -e " ${CYAN}ollama list${NC} # Installierte Modelle" +echo -e " ${CYAN}ollama pull ${NC} # Neues Modell laden" +echo -e " ${CYAN}ollama run ${NC} # Modell testen" +echo -e " ${CYAN}ollama serve${NC} # API-Server starten" +echo "" +echo -e "${BOLD}NΓ€chste Schritte:${NC}" +echo -e " 4. ${CYAN}./04_agents_setup.sh${NC} - WaldwΓ€chter konfigurieren" +echo -e " 5. ${CYAN}./05_qdrant_setup.sh${NC} - Crew Memory (optional)" +echo "" + +echo -e "${BLUE}🦊 FunkFox sagt:${NC}" +echo -e " \"Yo, lokale AI im Flow!" +echo -e " Keine Cloud, kein Stress - alles auf deinem GerΓ€t, yo!\"" +echo "" diff --git a/missions/tools/terminal_dojo/04_agents_setup.sh b/missions/tools/terminal_dojo/04_agents_setup.sh new file mode 100755 index 0000000..5c5186e --- /dev/null +++ b/missions/tools/terminal_dojo/04_agents_setup.sh @@ -0,0 +1,439 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ Terminal Dojo - Phase 4: WaldwΓ€chter Agents +# ═══════════════════════════════════════════════════════════════════════════ +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +set -e + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +BOLD='\033[1m' +NC='\033[0m' + +echo "" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD} πŸ₯‹ TERMINAL DOJO - Phase 4: WaldwΓ€chter Agents${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +echo -e "${BLUE}πŸ¦‰ Maya-Eule sagt:${NC}" +echo -e " \"Jetzt bringen wir die Crew ins Terminal!" +echo -e " Bugsy debuggt, Deepbit erklΓ€rt, FunkFox flowd...\"" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Setup Directories +# ───────────────────────────────────────────────────────────────────────────── + +DOJO_DIR="$HOME/.terminal_dojo" +AGENTS_DIR="$DOJO_DIR/agents" +OPENCODE_CONFIG="$HOME/.config/opencode" + +mkdir -p "$AGENTS_DIR" +mkdir -p "$OPENCODE_CONFIG" + +echo -e "${CYAN}Verzeichnisse erstellt:${NC}" +echo " $AGENTS_DIR" +echo " $OPENCODE_CONFIG" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Create WaldwΓ€chter Agent Prompts +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}🌲 Erstelle WaldwΓ€chter-Prompts...${NC}" +echo "" + +# Bugsy - Der Debugging-Clown +cat > "$AGENTS_DIR/bugsy.md" << 'PROMPT' +# πŸ› Bugsy - Der Debugging-Clown + +Du bist Bugsy, der freundliche Debugging-Clown aus dem Crumbforest. + +## Deine PersΓΆnlichkeit +- Du stolperst manchmal, stehst aber immer wieder auf +- Du siehst Fehler als Lernchancen, nicht als Probleme +- Du erklΓ€rst mit Humor und Geduld +- Du feierst jeden kleinen Erfolg + +## Deine Aufgaben +- Hilf beim Debugging von Code +- ErklΓ€re Fehlermeldungen kindgerecht +- Zeige, dass Fehler normal sind +- Motiviere bei Frustration + +## Dein Stil +- Nutze Clown-Metaphern ("Ups, da bin ich gestolpert!") +- Feiere Erfolge ("πŸŽ‰ Tada! Der Bug ist weg!") +- Sei geduldig bei wiederholten Fehlern +- ErklΓ€re Schritt fΓΌr Schritt + +## Beispiel-Antworten +- "Oh, ein Syntax-Error! Das ist wie wenn ich ΓΌber meine großen Schuhe stolpere - passiert den Besten!" +- "Lass uns den Bug zusammen fangen! πŸ”" +- "Weißt du was? Dieser Fehler hat mir gerade etwas Wichtiges gezeigt..." + +Beginne deine Antworten nie mit "Als Bugsy..." - du BIST Bugsy. +PROMPT +echo -e " ${GREEN}βœ“${NC} bugsy.md" + +# Deepbit - Der System-ErklΓ€rer +cat > "$AGENTS_DIR/deepbit.md" << 'PROMPT' +# πŸ”§ Deepbit - Der Bash-ErklΓ€rer + +Du bist Deepbit, der tiefgrΓΌndige System-ErklΓ€rer aus dem Crumbforest. + +## Deine PersΓΆnlichkeit +- Du tauchst tief in Themen ein +- Du erklΓ€rst die "Warum"-Fragen +- Du liebst die Kommandozeile +- Du bist geduldig und grΓΌndlich + +## Deine Aufgaben +- ErklΓ€re Bash-Befehle im Detail +- Zeige, was "unter der Haube" passiert +- Hilf bei System-Administration +- Mache Komplexes verstΓ€ndlich + +## Dein Stil +- Nutze Schichten-Metaphern ("Lass uns tiefer graben...") +- ErklΓ€re ZusammenhΓ€nge ("Das hΓ€ngt zusammen mit...") +- Zeige immer den praktischen Nutzen +- Biete verschiedene Wege zum Ziel + +## Beispiel-Antworten +- "Lass mich dir zeigen, was dieser Befehl wirklich macht..." +- "Stell dir das System vor wie einen Baum mit vielen Wurzeln..." +- "Es gibt eigentlich drei Wege, das zu lΓΆsen. Der einfachste..." + +Beginne deine Antworten nie mit "Als Deepbit..." - du BIST Deepbit. +PROMPT +echo -e " ${GREEN}βœ“${NC} deepbit.md" + +# Maya-Eule - Die Weise +cat > "$AGENTS_DIR/eule.md" << 'PROMPT' +# πŸ¦‰ Maya-Eule - Die Weise + +Du bist Maya-Eule, die weise Eule aus dem Crumbforest. + +## Deine PersΓΆnlichkeit +- Du siehst das große Bild +- Du stellst Gegenfragen, die zum Nachdenken anregen +- Du verbindest Technik mit Philosophie +- Du hast unendliche Geduld + +## Deine Aufgaben +- Hilf bei Entscheidungen +- ErklΓ€re ZusammenhΓ€nge +- FΓΆrdere selbststΓ€ndiges Denken +- Erinnere an die Crumbforest-Prinzipien + +## Dein Stil +- Nutze Fragen ("Was glaubst du, warum...?") +- ErzΓ€hle kurze Geschichten oder Gleichnisse +- Beziehe dich auf Waldmetaphern +- Sei niemals herablassend + +## Crumbforest-Prinzipien +- "Machen statt Lernen" +- "Transparenz ΓΌber Magic" +- "Fragen stΓ€rken die Wurzel" +- "Der Wald ist nie fertig" + +## Beispiel-Antworten +- "Ah, mein kleiner KrΓΌmel... das ist wie bei einem Baum..." +- "Bevor ich antworte - was hast du schon versucht?" +- "Im Wald sagen wir: Der Weg ist das Ziel, wenn du wach gehst." + +Beginne deine Antworten nie mit "Als Maya-Eule..." - du BIST Maya-Eule. +PROMPT +echo -e " ${GREEN}βœ“${NC} eule.md" + +# FunkFox - Der Rapper +cat > "$AGENTS_DIR/funkfox.md" << 'PROMPT' +# 🦊 FunkFox - Der Bash-Rapper + +Du bist FunkFox, der Bash-Rapper aus dem Crumbforest. + +## Deine PersΓΆnlichkeit +- Du erklΓ€rst mit Flow und Rhythmus +- Du machst trockene Themen lebendig +- Du bist energetisch und motivierend +- Du liebst Wortspiele + +## Deine Aufgaben +- ErklΓ€re Pipes und Redirects +- Mache Shell-Scripting cool +- Motiviere zum Experimentieren +- Bringe Spaß ins Terminal + +## Dein Stil +- Nutze gelegentlich Reime +- Sage "yo" und "flow" +- ErklΓ€re mit Beat-Metaphern +- Feiere den Terminal-Lifestyle + +## Beispiel-Antworten +- "Yo, Pipes sind wie ein Beat - der Output fließt zum Input, yo!" +- "Check mal diesen One-Liner, der hat Flow!" +- "Im Terminal bist DU der DJ - mix die Commands!" + +Beginne deine Antworten nie mit "Als FunkFox..." - du BIST FunkFox. +PROMPT +echo -e " ${GREEN}βœ“${NC} funkfox.md" + +# DumboSQL - Der Datenbank-Elefant +cat > "$AGENTS_DIR/dumbosql.md" << 'PROMPT' +# 🐘 DumboSQL - Der Datenbank-Elefant + +Du bist DumboSQL, der geduldige Datenbank-Elefant aus dem Crumbforest. + +## Deine PersΓΆnlichkeit +- Du vergisst nie etwas (wie ein Elefant) +- Du bist unendlich geduldig +- Du liebst Struktur und Ordnung +- Du erklΓ€rst mit einfachen Analogien + +## Deine Aufgaben +- ErklΓ€re SQL und Datenbanken +- Hilf bei Datenmodellierung +- Mache Queries verstΓ€ndlich +- Zeige den Wert von strukturierten Daten + +## Dein Stil +- Nutze Kisten- und Ordner-Metaphern +- ErklΓ€re mit "Stell dir vor..." +- Sei sanft bei Fehlern +- Feiere gute Datenstrukturen + +## Beispiel-Antworten +- "Oh, mein kleiner Freund! Stell dir eine Tabelle vor wie eine Kiste..." +- "SELECT * ist wie wenn du alles aus der Kiste nimmst..." +- "Ein Elefant vergisst nie - und eine Datenbank auch nicht!" + +Beginne deine Antworten nie mit "Als DumboSQL..." - du BIST DumboSQL. +PROMPT +echo -e " ${GREEN}βœ“${NC} dumbosql.md" + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Create OpenCode Configuration +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}βš™οΈ Erstelle OpenCode-Konfiguration...${NC}" +echo "" + +# Detect available provider +PROVIDER="openrouter" +MODEL="openrouter/anthropic/claude-3.5-sonnet" + +if [ -f /tmp/terminal_dojo_ollama.json ]; then + OLLAMA_INSTALLED=$(jq -r '.installed' /tmp/terminal_dojo_ollama.json) + if [[ "$OLLAMA_INSTALLED" == "true" ]]; then + OLLAMA_MODEL=$(jq -r '.default_model' /tmp/terminal_dojo_ollama.json) + echo -e "${CYAN}Ollama verfΓΌgbar mit Modell: $OLLAMA_MODEL${NC}" + echo "" + echo "Welchen Provider sollen die WaldwΓ€chter nutzen?" + echo " 1) Ollama (lokal: $OLLAMA_MODEL)" + echo " 2) OpenRouter (Cloud)" + echo "" + read -p "WΓ€hle [1/2]: " -n 1 -r + echo "" + + if [[ $REPLY == "1" ]]; then + PROVIDER="ollama" + MODEL="ollama.$OLLAMA_MODEL" + fi + fi +fi + +# Create opencode.json with WaldwΓ€chter agents +cat > "$OPENCODE_CONFIG/opencode.json" << EOF +{ + "\$schema": "https://opencode.ai/schemas/opencode.json", + "theme": "crumbforest", + + "providers": { + "ollama": { + "endpoint": "http://localhost:11434" + } + }, + + "agents": { + "coder": { + "model": "$MODEL", + "systemPrompt": "Du bist ein hilfreicher Coding-Assistent im Crumbforest-Stil. ErklΓ€re klar und freundlich." + }, + + "bugsy": { + "model": "$MODEL", + "systemPromptFile": "$AGENTS_DIR/bugsy.md", + "description": "πŸ› Der Debugging-Clown - Hilft bei Fehlern mit Humor" + }, + + "deepbit": { + "model": "$MODEL", + "systemPromptFile": "$AGENTS_DIR/deepbit.md", + "description": "πŸ”§ Der Bash-ErklΓ€rer - Taucht tief in Systeme ein" + }, + + "eule": { + "model": "$MODEL", + "systemPromptFile": "$AGENTS_DIR/eule.md", + "description": "πŸ¦‰ Die Weise - Sieht das große Bild" + }, + + "funkfox": { + "model": "$MODEL", + "systemPromptFile": "$AGENTS_DIR/funkfox.md", + "description": "🦊 Der Bash-Rapper - Bringt Flow ins Terminal" + }, + + "dumbosql": { + "model": "$MODEL", + "systemPromptFile": "$AGENTS_DIR/dumbosql.md", + "description": "🐘 Der Datenbank-Elefant - Vergisst nie etwas" + } + }, + + "keybindings": { + "switchAgent": "ctrl+a" + } +} +EOF + +echo -e "${GREEN}βœ“ OpenCode-Konfiguration erstellt${NC}" +echo " $OPENCODE_CONFIG/opencode.json" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Create Helper Scripts +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ“œ Erstelle Helper-Scripts...${NC}" +echo "" + +# Quick-Access Script +cat > "$DOJO_DIR/crew.sh" << 'SCRIPT' +#!/bin/bash +# Schneller Zugriff auf die WaldwΓ€chter-Crew + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +show_crew() { + echo "" + echo -e "${CYAN}🌲 Crumbforest WaldwΓ€chter Crew${NC}" + echo "" + echo -e " ${GREEN}bugsy${NC} πŸ› Der Debugging-Clown" + echo -e " ${GREEN}deepbit${NC} πŸ”§ Der Bash-ErklΓ€rer" + echo -e " ${GREEN}eule${NC} πŸ¦‰ Die Weise" + echo -e " ${GREEN}funkfox${NC} 🦊 Der Bash-Rapper" + echo -e " ${GREEN}dumbosql${NC} 🐘 Der Datenbank-Elefant" + echo "" + echo "Nutzung: crew [frage]" + echo "Beispiel: crew bugsy 'Warum funktioniert mein Script nicht?'" + echo "" +} + +if [[ -z "$1" ]]; then + show_crew + exit 0 +fi + +AGENT=$1 +shift +QUESTION="$*" + +case $AGENT in + bugsy|deepbit|eule|funkfox|dumbosql) + if [[ -n "$QUESTION" ]]; then + opencode --agent "$AGENT" "$QUESTION" + else + opencode --agent "$AGENT" + fi + ;; + list|help|--help|-h) + show_crew + ;; + *) + echo -e "${RED}Unbekannter WaldwΓ€chter: $AGENT${NC}" + show_crew + exit 1 + ;; +esac +SCRIPT + +chmod +x "$DOJO_DIR/crew.sh" +echo -e " ${GREEN}βœ“${NC} crew.sh - Schnellzugriff auf die Crew" + +# Add to PATH hint +echo "" +echo -e "${YELLOW}Tipp: FΓΌge das Terminal Dojo zu deinem PATH hinzu:${NC}" +echo "" +echo " echo 'export PATH=\"\$HOME/.terminal_dojo:\$PATH\"' >> ~/.bashrc" +echo " source ~/.bashrc" +echo "" +echo "Dann kannst du einfach 'crew bugsy' tippen!" +echo "" + +read -p "Soll ich das automatisch hinzufΓΌgen? [J/n] " -n 1 -r +echo "" +if [[ ! $REPLY =~ ^[Nn]$ ]]; then + if ! grep -q "terminal_dojo" ~/.bashrc 2>/dev/null; then + echo '' >> ~/.bashrc + echo '# Terminal Dojo - Crumbforest WaldwΓ€chter' >> ~/.bashrc + echo 'export PATH="$HOME/.terminal_dojo:$PATH"' >> ~/.bashrc + echo -e "${GREEN}βœ“ Zu ~/.bashrc hinzugefΓΌgt${NC}" + echo -e "${YELLOW}FΓΌhre 'source ~/.bashrc' aus oder starte ein neues Terminal.${NC}" + else + echo -e "${GREEN}Bereits in ~/.bashrc vorhanden.${NC}" + fi +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Summary +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD}βœ… Phase 4 abgeschlossen!${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" +echo -e "${GREEN}Die WaldwΓ€chter sind bereit!${NC}" +echo "" +echo "Konfigurierte Agents:" +echo -e " πŸ› ${CYAN}bugsy${NC} - Debugging mit Humor" +echo -e " πŸ”§ ${CYAN}deepbit${NC} - Tiefe System-ErklΓ€rungen" +echo -e " πŸ¦‰ ${CYAN}eule${NC} - Weisheit und große Bilder" +echo -e " 🦊 ${CYAN}funkfox${NC} - Bash mit Flow" +echo -e " 🐘 ${CYAN}dumbosql${NC} - Datenbank-Geduld" +echo "" +echo "Quick Commands:" +echo -e " ${CYAN}crew bugsy${NC} # Bugsy im TUI starten" +echo -e " ${CYAN}crew eule 'Was ist...?'${NC} # Direkte Frage an Eule" +echo -e " ${CYAN}opencode --agent bugsy${NC} # Alternative Syntax" +echo "" +echo -e "${BOLD}NΓ€chste Schritte:${NC}" +echo -e " 5. ${CYAN}./05_qdrant_setup.sh${NC} - Crew Memory (optional)" +echo -e " 6. ${CYAN}./06_test_crew.sh${NC} - Alles testen!" +echo "" + +echo -e "${BLUE}πŸ› Bugsy sagt:${NC}" +echo -e " \"Die ganze Crew ist da!" +echo -e " Zeit zum Spielen - Γ€h, Lernen!\"" +echo "" diff --git a/missions/tools/terminal_dojo/05_qdrant_setup.sh b/missions/tools/terminal_dojo/05_qdrant_setup.sh new file mode 100755 index 0000000..2ec1010 --- /dev/null +++ b/missions/tools/terminal_dojo/05_qdrant_setup.sh @@ -0,0 +1,376 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ Terminal Dojo - Phase 5: Qdrant Setup (Optional) +# ═══════════════════════════════════════════════════════════════════════════ +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +set -e + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +BOLD='\033[1m' +NC='\033[0m' + +echo "" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD} πŸ₯‹ TERMINAL DOJO - Phase 5: Qdrant Crew Memory${NC}" +echo -e "${MAGENTA} ────────────────────────────────────────────${NC}" +echo -e "${MAGENTA} OPTIONAL - FΓΌr RAG und Wissenssuche${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Explanation +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${YELLOW}╔═══════════════════════════════════════════════════════════════╗${NC}" +echo -e "${YELLOW}β•‘ ℹ️ Was ist Qdrant? β•‘${NC}" +echo -e "${YELLOW}╠═══════════════════════════════════════════════════════════════╣${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ Qdrant ist eine Vector-Datenbank fΓΌr \"Crew Memory\": β•‘${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Speichert das Wissen aus dem Keks-Handbuch β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ ErmΓΆglicht semantische Suche (\"Was ist wie...?\") β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Die WaldwΓ€chter kΓΆnnen auf dieses Wissen zugreifen β•‘${NC}" +echo -e "${YELLOW}β•‘ β€’ Das ist das \"Nullfeld\" aus dem CrumbCodex β•‘${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•‘ Ohne Qdrant: WaldwΓ€chter antworten nur mit AI-Wissen β•‘${NC}" +echo -e "${YELLOW}β•‘ Mit Qdrant: WaldwΓ€chter kennen auch das Keks-Handbuch β•‘${NC}" +echo -e "${YELLOW}β•‘ β•‘${NC}" +echo -e "${YELLOW}β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" +echo "" + +read -p "MΓΆchtest du Qdrant installieren? [j/N] " -n 1 -r +echo "" + +if [[ ! $REPLY =~ ^[Jj]$ ]]; then + echo "" + echo -e "${CYAN}β†’ Übersprungen. Weiter mit: ./06_test_crew.sh${NC}" + exit 0 +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Load System Info +# ───────────────────────────────────────────────────────────────────────────── + +if [ -f /tmp/terminal_dojo_sysinfo.json ]; then + OS=$(jq -r '.os' /tmp/terminal_dojo_sysinfo.json) + RAM_GB=$(jq -r '.ram_gb' /tmp/terminal_dojo_sysinfo.json) + IS_RASPBERRY_PI=$(jq -r '.is_raspberry_pi' /tmp/terminal_dojo_sysinfo.json) +else + OS="unknown" + RAM_GB=4 +fi + +# ───────────────────────────────────────────────────────────────────────────── +# Installation Method Selection +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ“¦ Installationsmethode${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +HAS_DOCKER=false +if command -v docker &> /dev/null; then + HAS_DOCKER=true +fi + +echo "Qdrant kann auf zwei Arten installiert werden:" +echo "" + +if [[ "$HAS_DOCKER" == true ]]; then + echo -e " 1) ${GREEN}Docker (empfohlen)${NC}" + echo " Einfach, isoliert, leicht zu aktualisieren" +else + echo -e " 1) ${YELLOW}Docker (nicht installiert)${NC}" + echo " WΓΌrde Docker benΓΆtigen" +fi + +echo "" +echo " 2) Native Binary" +echo " Direkter Download, lΓ€uft ohne Docker" +echo " Gut fΓΌr Raspberry Pi oder minimale Setups" +echo "" +echo " 0) Überspringen" +echo "" + +read -p "WΓ€hle [1/2/0]: " -n 1 -r INSTALL_METHOD +echo "" +echo "" + +case $INSTALL_METHOD in + 1) + if [[ "$HAS_DOCKER" != true ]]; then + echo -e "${RED}Docker ist nicht installiert!${NC}" + echo "" + echo "Installiere Docker zuerst:" + if [[ "$OS" == "linux" ]]; then + echo " curl -fsSL https://get.docker.com | sh" + echo " sudo usermod -aG docker \$USER" + else + echo " https://docs.docker.com/get-docker/" + fi + exit 1 + fi + + echo -e "${CYAN}Docker-Installation...${NC}" + echo "" + + # Check if already running + if docker ps | grep -q qdrant 2>/dev/null; then + echo -e "${GREEN}βœ“ Qdrant Container lΓ€uft bereits!${NC}" + else + # Pull and run + echo "Lade Qdrant Docker Image..." + docker pull qdrant/qdrant:latest + + echo "" + echo "Starte Qdrant Container..." + + QDRANT_DATA="$HOME/.terminal_dojo/qdrant_data" + mkdir -p "$QDRANT_DATA" + + docker run -d \ + --name qdrant \ + --restart unless-stopped \ + -p 6333:6333 \ + -p 6334:6334 \ + -v "$QDRANT_DATA:/qdrant/storage" \ + qdrant/qdrant:latest + + echo "" + echo -e "${GREEN}βœ“ Qdrant Container gestartet!${NC}" + fi + + QDRANT_URL="http://localhost:6333" + ;; + + 2) + echo -e "${CYAN}Native Installation...${NC}" + echo "" + + QDRANT_DIR="$HOME/.terminal_dojo/qdrant" + mkdir -p "$QDRANT_DIR" + cd "$QDRANT_DIR" + + # Detect architecture + ARCH=$(uname -m) + case $ARCH in + x86_64) + QDRANT_ARCH="x86_64-unknown-linux-gnu" + ;; + aarch64|arm64) + QDRANT_ARCH="aarch64-unknown-linux-gnu" + ;; + *) + echo -e "${RED}Unbekannte Architektur: $ARCH${NC}" + echo "Bitte installiere manuell: https://qdrant.tech/documentation/guides/installation/" + exit 1 + ;; + esac + + echo "Lade Qdrant fΓΌr $ARCH..." + + # Get latest version + QDRANT_VERSION=$(curl -s https://api.github.com/repos/qdrant/qdrant/releases/latest | jq -r '.tag_name' | sed 's/v//') + DOWNLOAD_URL="https://github.com/qdrant/qdrant/releases/download/v${QDRANT_VERSION}/qdrant-${QDRANT_ARCH}.tar.gz" + + echo "Version: $QDRANT_VERSION" + echo "URL: $DOWNLOAD_URL" + echo "" + + curl -L "$DOWNLOAD_URL" | tar xzf - + + if [[ -f "$QDRANT_DIR/qdrant" ]]; then + chmod +x "$QDRANT_DIR/qdrant" + echo -e "${GREEN}βœ“ Qdrant heruntergeladen!${NC}" + else + echo -e "${RED}Download fehlgeschlagen${NC}" + exit 1 + fi + + # Create data directory + mkdir -p "$QDRANT_DIR/storage" + + # Create start script + cat > "$QDRANT_DIR/start_qdrant.sh" << 'SCRIPT' +#!/bin/bash +QDRANT_DIR="$HOME/.terminal_dojo/qdrant" +cd "$QDRANT_DIR" +./qdrant --storage-path ./storage & +echo $! > "$QDRANT_DIR/qdrant.pid" +echo "Qdrant gestartet (PID: $(cat $QDRANT_DIR/qdrant.pid))" +SCRIPT + chmod +x "$QDRANT_DIR/start_qdrant.sh" + + # Create stop script + cat > "$QDRANT_DIR/stop_qdrant.sh" << 'SCRIPT' +#!/bin/bash +QDRANT_DIR="$HOME/.terminal_dojo/qdrant" +if [[ -f "$QDRANT_DIR/qdrant.pid" ]]; then + kill $(cat "$QDRANT_DIR/qdrant.pid") 2>/dev/null + rm "$QDRANT_DIR/qdrant.pid" + echo "Qdrant gestoppt" +else + echo "Keine PID-Datei gefunden" +fi +SCRIPT + chmod +x "$QDRANT_DIR/stop_qdrant.sh" + + echo "" + echo "Starte Qdrant..." + "$QDRANT_DIR/start_qdrant.sh" + sleep 3 + + QDRANT_URL="http://localhost:6333" + ;; + + 0) + echo -e "${YELLOW}Installation ΓΌbersprungen.${NC}" + exit 0 + ;; + + *) + echo -e "${RED}UngΓΌltige Auswahl${NC}" + exit 1 + ;; +esac + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Verify Installation +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ§ͺ Verbindungstest${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +sleep 2 + +RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" "$QDRANT_URL/collections" 2>/dev/null || echo "000") + +if [[ "$RESPONSE" == "200" ]]; then + echo -e "${GREEN}βœ“ Qdrant API erreichbar: $QDRANT_URL${NC}" + + # Get version + VERSION=$(curl -s "$QDRANT_URL" | jq -r '.version' 2>/dev/null || echo "unknown") + echo -e " Version: $VERSION" +else + echo -e "${RED}❌ Qdrant nicht erreichbar (HTTP $RESPONSE)${NC}" + echo "" + echo "Versuche manuell:" + echo " curl $QDRANT_URL" + exit 1 +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Create Crew Memory Collection +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}🧠 Crew Memory Collection erstellen${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +# Create collection for crumbforest knowledge +COLLECTION_NAME="crumbforest_knowledge" + +# Check if exists +EXISTS=$(curl -s "$QDRANT_URL/collections/$COLLECTION_NAME" | jq -r '.status' 2>/dev/null || echo "error") + +if [[ "$EXISTS" == "ok" ]]; then + echo -e "${GREEN}βœ“ Collection '$COLLECTION_NAME' existiert bereits${NC}" +else + echo "Erstelle Collection '$COLLECTION_NAME'..." + + # Create with appropriate vector size (1536 for OpenAI embeddings, 384 for smaller models) + curl -s -X PUT "$QDRANT_URL/collections/$COLLECTION_NAME" \ + -H "Content-Type: application/json" \ + -d '{ + "vectors": { + "size": 384, + "distance": "Cosine" + } + }' > /dev/null + + echo -e "${GREEN}βœ“ Collection erstellt!${NC}" +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Save Configuration +# ───────────────────────────────────────────────────────────────────────────── + +cat > /tmp/terminal_dojo_qdrant.json << EOF +{ + "installed": true, + "method": "$INSTALL_METHOD", + "url": "$QDRANT_URL", + "collection": "$COLLECTION_NAME", + "installed_at": "$(date -Iseconds)" +} +EOF + +# Update OpenCode config if exists +OPENCODE_CONFIG="$HOME/.config/opencode/opencode.json" +if [[ -f "$OPENCODE_CONFIG" ]]; then + echo -e "${CYAN}Aktualisiere OpenCode-Konfiguration...${NC}" + + # Add qdrant settings using jq + TMP_CONFIG=$(mktemp) + jq --arg url "$QDRANT_URL" --arg collection "$COLLECTION_NAME" \ + '. + {qdrant: {url: $url, collection: $collection}}' \ + "$OPENCODE_CONFIG" > "$TMP_CONFIG" + mv "$TMP_CONFIG" "$OPENCODE_CONFIG" + + echo -e "${GREEN}βœ“ OpenCode-Konfiguration aktualisiert${NC}" +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Summary +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD}βœ… Phase 5 abgeschlossen!${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" +echo -e "${GREEN}Qdrant Crew Memory ist bereit!${NC}" +echo "" +echo "Konfiguration:" +echo -e " URL: ${CYAN}$QDRANT_URL${NC}" +echo -e " Dashboard: ${CYAN}$QDRANT_URL/dashboard${NC}" +echo -e " Collection: ${CYAN}$COLLECTION_NAME${NC}" +echo "" +echo "NΓΌtzliche Befehle:" +echo -e " ${CYAN}curl $QDRANT_URL/collections${NC} # Collections anzeigen" +echo "" + +if [[ "$INSTALL_METHOD" == "2" ]]; then + echo "Native Qdrant verwalten:" + echo -e " ${CYAN}~/.terminal_dojo/qdrant/start_qdrant.sh${NC}" + echo -e " ${CYAN}~/.terminal_dojo/qdrant/stop_qdrant.sh${NC}" + echo "" +fi + +echo -e "${BOLD}NΓ€chster Schritt:${NC}" +echo -e " 6. ${CYAN}./06_test_crew.sh${NC} - Alles testen!" +echo "" + +echo -e "${BLUE}🐘 DumboSQL sagt:${NC}" +echo -e " \"Ein Elefant vergisst nie..." +echo -e " und jetzt vergisst auch die Crew nichts mehr!\"" +echo "" diff --git a/missions/tools/terminal_dojo/06_test_crew.sh b/missions/tools/terminal_dojo/06_test_crew.sh new file mode 100755 index 0000000..793fda4 --- /dev/null +++ b/missions/tools/terminal_dojo/06_test_crew.sh @@ -0,0 +1,325 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ Terminal Dojo - Phase 6: Test & Spielen +# ═══════════════════════════════════════════════════════════════════════════ +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +set -e + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +BOLD='\033[1m' +NC='\033[0m' + +echo "" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD} πŸ₯‹ TERMINAL DOJO - Phase 6: Test & Spielen!${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +echo -e "${BLUE}πŸ› Bugsy sagt:${NC}" +echo -e " \"Zeit zu testen! Und wenn was nicht klappt..." +echo -e " dann ist das auch ein Lernerfolg! πŸŽͺ\"" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Component Status Check +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ“Š Komponenten-Status${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +# OpenCode +if command -v opencode &> /dev/null; then + VERSION=$(opencode --version 2>/dev/null | head -n1 || echo "installed") + echo -e " ${GREEN}βœ“${NC} OpenCode: $VERSION" + OPENCODE_OK=true +else + echo -e " ${RED}βœ—${NC} OpenCode: nicht gefunden" + OPENCODE_OK=false +fi + +# Ollama +if command -v ollama &> /dev/null; then + if curl -s http://localhost:11434/api/tags &>/dev/null; then + MODELS=$(ollama list 2>/dev/null | tail -n +2 | wc -l | tr -d ' ') + echo -e " ${GREEN}βœ“${NC} Ollama: lΓ€uft ($MODELS Modelle)" + OLLAMA_OK=true + else + echo -e " ${YELLOW}β—‹${NC} Ollama: installiert, aber nicht gestartet" + OLLAMA_OK=false + fi +else + echo -e " ${YELLOW}β—‹${NC} Ollama: nicht installiert (optional)" + OLLAMA_OK=false +fi + +# Qdrant +if curl -s http://localhost:6333/collections &>/dev/null; then + COLLECTIONS=$(curl -s http://localhost:6333/collections | jq -r '.result.collections | length' 2>/dev/null || echo "?") + echo -e " ${GREEN}βœ“${NC} Qdrant: lΓ€uft ($COLLECTIONS Collections)" + QDRANT_OK=true +else + echo -e " ${YELLOW}β—‹${NC} Qdrant: nicht erreichbar (optional)" + QDRANT_OK=false +fi + +# WaldwΓ€chter Agents +AGENTS_DIR="$HOME/.terminal_dojo/agents" +if [[ -d "$AGENTS_DIR" ]] && [[ -f "$AGENTS_DIR/bugsy.md" ]]; then + AGENT_COUNT=$(ls "$AGENTS_DIR"/*.md 2>/dev/null | wc -l | tr -d ' ') + echo -e " ${GREEN}βœ“${NC} WaldwΓ€chter: $AGENT_COUNT Agents konfiguriert" + AGENTS_OK=true +else + echo -e " ${RED}βœ—${NC} WaldwΓ€chter: nicht konfiguriert" + AGENTS_OK=false +fi + +# OpenCode Config +OPENCODE_CONFIG="$HOME/.config/opencode/opencode.json" +if [[ -f "$OPENCODE_CONFIG" ]]; then + echo -e " ${GREEN}βœ“${NC} OpenCode Config: vorhanden" + CONFIG_OK=true +else + echo -e " ${RED}βœ—${NC} OpenCode Config: nicht gefunden" + CONFIG_OK=false +fi + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Ready Check +# ───────────────────────────────────────────────────────────────────────────── + +# ───────────────────────────────────────────────────────────────────────────── +# Ready Check & Auto-Fix +# ───────────────────────────────────────────────────────────────────────────── + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Fix OpenCode if missing +if [[ "$OPENCODE_OK" != true ]]; then + echo -e "${YELLOW}⚠️ OpenCode ist nicht installiert.${NC}" + echo -e "Es wird benΓΆtigt, um die AI-Agents im Terminal nutzen zu kΓΆnnen." + echo "" + read -p "Soll ich die Installation jetzt starten (02_opencode_setup.sh)? [Y/n] " -n 1 -r + echo "" + echo "" + if [[ ! $REPLY =~ ^[Nn]$ ]]; then + if [[ -f "${SCRIPT_DIR}/02_opencode_setup.sh" ]]; then + bash "${SCRIPT_DIR}/02_opencode_setup.sh" + # Re-Check + if command -v opencode &> /dev/null; then OPENCODE_OK=true; fi + else + echo -e "${RED}Script nicht gefunden: ${SCRIPT_DIR}/02_opencode_setup.sh${NC}" + fi + fi +fi + +# Fix Agents if missing +if [[ "$AGENTS_OK" != true ]]; then + echo -e "${YELLOW}⚠️ WaldwΓ€chter Agents sind nicht konfiguriert.${NC}" + echo -e "Sie (Bugsy, Eule, etc.) werden fΓΌr die Tests benΓΆtigt." + echo "" + read -p "Soll ich die Konfiguration jetzt starten (04_agents_setup.sh)? [Y/n] " -n 1 -r + echo "" + echo "" + if [[ ! $REPLY =~ ^[Nn]$ ]]; then + if [[ -f "${SCRIPT_DIR}/04_agents_setup.sh" ]]; then + bash "${SCRIPT_DIR}/04_agents_setup.sh" + # Re-Check + if [[ -d "$AGENTS_DIR" ]] && [[ -f "$AGENTS_DIR/bugsy.md" ]]; then AGENTS_OK=true; fi + else + echo -e "${RED}Script nicht gefunden: ${SCRIPT_DIR}/04_agents_setup.sh${NC}" + fi + fi +fi + +# Final Check +if [[ "$OPENCODE_OK" != true ]] || [[ "$AGENTS_OK" != true ]]; then + echo -e "${RED}╔═══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${RED}β•‘ ❌ Nicht alle Komponenten sind bereit! β•‘${NC}" + echo -e "${RED}β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" + echo "" + echo "Die Mission kann nicht gestartet werden, solange Komponenten fehlen." + echo "Du kannst die Setup-Phasen auch manuell im HauptmenΓΌ wΓ€hlen." + echo "" + exit 1 +fi + +echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}" +echo -e "${GREEN}β•‘ βœ… Basis-Setup ist bereit! β•‘${NC}" +echo -e "${GREEN}β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Interactive Tests +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${BOLD}πŸ§ͺ Interaktive Tests${NC}" +echo -e "${CYAN}───────────────────────────────────────────────────────────────${NC}" +echo "" + +echo "WΓ€hle einen Test:" +echo "" +echo " 1) Schnelltest - Frage an Bugsy" +echo " 2) Crew-Übersicht - Alle WaldwΓ€chter zeigen" +echo " 3) OpenCode TUI starten" +echo " 4) Bugsy starten (Debugging-Modus)" +echo " 5) Eule starten (Weisheits-Modus)" +echo " 6) FunkFox starten (Flow-Modus)" +echo "" +echo " 0) Tests ΓΌberspringen" +echo "" + +read -p "WΓ€hle [0-6]: " -n 1 -r TEST_CHOICE +echo "" +echo "" + +case $TEST_CHOICE in + 1) + echo -e "${CYAN}Schnelltest: Frage an Bugsy...${NC}" + echo "" + + if [[ "$OLLAMA_OK" == true ]]; then + # Test with Ollama + OLLAMA_MODEL=$(ollama list 2>/dev/null | tail -n +2 | head -n1 | awk '{print $1}') + if [[ -n "$OLLAMA_MODEL" ]]; then + echo -e "${YELLOW}Nutze Ollama: $OLLAMA_MODEL${NC}" + echo "" + + # Simple test + BUGSY_PROMPT=$(cat "$AGENTS_DIR/bugsy.md") + RESPONSE=$(ollama run "$OLLAMA_MODEL" "Du bist Bugsy. Stelle dich kurz vor und sag Hallo!" 2>/dev/null || echo "Fehler") + + echo -e "${GREEN}πŸ› Bugsy:${NC}" + echo "$RESPONSE" + else + echo -e "${YELLOW}Kein Ollama-Modell gefunden. Teste mit OpenCode...${NC}" + opencode --agent bugsy "Stelle dich kurz vor!" + fi + else + echo -e "${YELLOW}Ollama nicht verfΓΌgbar. Teste mit OpenCode...${NC}" + echo "(BenΓΆtigt OpenRouter oder anderen Provider)" + echo "" + + if command -v opencode &> /dev/null; then + opencode --agent bugsy "Stelle dich kurz vor und sag Hallo!" + else + echo -e "${RED}OpenCode nicht gefunden!${NC}" + fi + fi + ;; + + 2) + echo -e "${CYAN}🌲 Crumbforest WaldwΓ€chter Crew${NC}" + echo "" + echo -e " πŸ› ${GREEN}bugsy${NC} - Der Debugging-Clown" + echo -e " \"Stolpern ist Teil des Lernens!\"" + echo "" + echo -e " πŸ”§ ${GREEN}deepbit${NC} - Der Bash-ErklΓ€rer" + echo -e " \"Lass mich dir zeigen, was darunter liegt...\"" + echo "" + echo -e " πŸ¦‰ ${GREEN}eule${NC} - Die Weise" + echo -e " \"Was glaubst du, mein kleiner KrΓΌmel?\"" + echo "" + echo -e " 🦊 ${GREEN}funkfox${NC} - Der Bash-Rapper" + echo -e " \"Yo, Pipes sind wie ein Beat!\"" + echo "" + echo -e " 🐘 ${GREEN}dumbosql${NC} - Der Datenbank-Elefant" + echo -e " \"Ein Elefant vergisst nie...\"" + echo "" + + if [[ -f "$HOME/.terminal_dojo/crew.sh" ]]; then + echo -e "Nutze: ${CYAN}crew ${NC} um einen WaldwΓ€chter zu starten" + echo -e " ${CYAN}crew bugsy 'Hilf mir!'${NC} fΓΌr direkte Fragen" + fi + ;; + + 3) + echo -e "${CYAN}Starte OpenCode TUI...${NC}" + echo "" + echo "Tipp: DrΓΌcke Ctrl+A um zwischen Agents zu wechseln" + echo "" + sleep 2 + opencode + ;; + + 4) + echo -e "${CYAN}Starte Bugsy (Debugging-Modus)...${NC}" + echo "" + opencode --agent bugsy + ;; + + 5) + echo -e "${CYAN}Starte Maya-Eule (Weisheits-Modus)...${NC}" + echo "" + opencode --agent eule + ;; + + 6) + echo -e "${CYAN}Starte FunkFox (Flow-Modus)...${NC}" + echo "" + opencode --agent funkfox + ;; + + 0) + echo -e "${YELLOW}Tests ΓΌbersprungen.${NC}" + ;; + + *) + echo -e "${YELLOW}UngΓΌltige Auswahl.${NC}" + ;; +esac + +echo "" + +# ───────────────────────────────────────────────────────────────────────────── +# Final Summary +# ───────────────────────────────────────────────────────────────────────────── + +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD}πŸŽ‰ Terminal Dojo Setup abgeschlossen!${NC}" +echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" +echo "" + +echo -e "${GREEN}Was du jetzt hast:${NC}" +echo "" +echo -e " βœ… OpenCode als AI-Terminal-Assistent" +[[ "$OLLAMA_OK" == true ]] && echo -e " βœ… Ollama fΓΌr lokale AI-Modelle" +[[ "$QDRANT_OK" == true ]] && echo -e " βœ… Qdrant fΓΌr Crew Memory" +echo -e " βœ… 5 WaldwΓ€chter-Agents mit PersΓΆnlichkeit" +echo "" + +echo -e "${BOLD}Quick Commands:${NC}" +echo "" +echo -e " ${CYAN}crew${NC} # Crew-Übersicht" +echo -e " ${CYAN}crew bugsy${NC} # Bugsy starten" +echo -e " ${CYAN}crew eule 'Frage...'${NC} # Direkt fragen" +echo -e " ${CYAN}opencode${NC} # TUI starten" +echo "" + +echo -e "${BOLD}NΓ€chste Schritte:${NC}" +echo "" +echo " πŸ“š Keks-Handbuch als RAG-Content laden (kommende Mission)" +echo " πŸ”— Integration mit Crumb-Core API" +echo " 🌐 Offline-Modus perfektionieren" +echo "" + +echo -e "${BLUE}πŸ¦‰ Maya-Eule sagt:${NC}" +echo -e " \"Der Wald ist nie fertig, mein kleiner KrΓΌmel." +echo -e " Aber du hast heute gute Wurzeln gepflanzt.\"" +echo "" + +echo -e "${MAGENTA}═══════════════════════════════════════════════════════════════${NC}" +echo -e "${BOLD} 🌲 Willkommen im Crumbforest Terminal Dojo! πŸ₯‹${NC}" +echo -e "${MAGENTA}═══════════════════════════════════════════════════════════════${NC}" +echo "" diff --git a/missions/tools/terminal_dojo/README.md b/missions/tools/terminal_dojo/README.md new file mode 100644 index 0000000..3dd7fbb --- /dev/null +++ b/missions/tools/terminal_dojo/README.md @@ -0,0 +1,181 @@ +# πŸ₯‹ Terminal Dojo + +> **OpenCode + WaldwΓ€chter + Ollama + Qdrant** +> Lokale AI im Crumbforest-Stil - Taschengeld-Format fΓΌr Kids + +--- + +## ⚠️ Das geht nicht schnell! + +**Bevor du startest:** +- Hast du das [Keks-Handbuch](https://github.com/kruemel/OZM-Keks-Handbuch-v1) gelesen? +- Mindestens Pfad 1-10 sollten bekannt sein +- Plan 2-4 Stunden Zeit ein (mit Pausen!) + +*"Machen statt Lernen - aber erst verstehen, dann machen."* + +--- + +## 🎯 Was ist das? + +Das Terminal Dojo bringt die **Crumbforest WaldwΓ€chter** direkt in dein Terminal: + +| WaldwΓ€chter | Rolle | SpezialitΓ€t | +|-------------|-------|-------------| +| πŸ› **Bugsy** | Debugging-Clown | Fehler mit Humor erklΓ€ren | +| πŸ”§ **Deepbit** | Bash-ErklΓ€rer | Tiefe System-ErklΓ€rungen | +| πŸ¦‰ **Maya-Eule** | Die Weise | Das große Bild sehen | +| 🦊 **FunkFox** | Bash-Rapper | Flow und Pipes | +| 🐘 **DumboSQL** | Datenbank-Elefant | SQL mit Geduld | + +**Lokal. Offline-fΓ€hig. Kostenlos.** + +--- + +## πŸš€ Schnellstart + +```bash +# Mission starten +./terminal_dojo.sh + +# Oder einzelne Phasen: +./01_vorcheck.sh # System checken +./02_opencode_setup.sh # OpenCode installieren +./03_ollama_setup.sh # Lokale Modelle (optional) +./04_agents_setup.sh # WaldwΓ€chter konfigurieren +./05_qdrant_setup.sh # Crew Memory (optional) +./06_test_crew.sh # Alles testen! +``` + +--- + +## πŸ“¦ Komponenten + +### Pflicht + +| Komponente | Beschreibung | +|------------|--------------| +| **OpenCode** | Terminal AI - die Basis fΓΌr alles | +| **WaldwΓ€chter Agents** | System Prompts fΓΌr die Crew | + +### Optional + +| Komponente | Beschreibung | Wann nΓΌtzlich? | +|------------|--------------|----------------| +| **Ollama** | Lokale AI-Modelle | Offline-Betrieb, Datenschutz | +| **Qdrant** | Vector DB fΓΌr Crew Memory | RAG, Keks-Handbuch durchsuchen | + +--- + +## πŸ’» Hardware-Anforderungen + +### Minimum (nur OpenCode + Cloud) +- Jedes GerΓ€t mit Terminal +- Internetverbindung +- OpenRouter API-Key + +### Empfohlen (mit Ollama) +- Raspberry Pi 5 (8GB) oder besser +- 32GB+ SD / 64GB+ SSD +- FΓΌr kleine Modelle: `qwen2.5:0.5b`, `tinyllama` + +### Optimal (alles lokal) +- RPi 5 + Hailo AI HAT oder x86 mit 16GB+ RAM +- 64GB+ SSD +- FΓΌr grâßere Modelle: `qwen2.5:7b`, `mistral`, `codellama` + +--- + +## 🌲 Nach der Installation + +```bash +# Crew-Übersicht +crew + +# Bugsy starten +crew bugsy + +# Direkte Frage an Eule +crew eule "Was ist der Sinn des Waldes?" + +# OpenCode TUI +opencode +``` + +--- + +## πŸ“ Verzeichnisstruktur + +Nach der Installation: + +``` +~/.terminal_dojo/ +β”œβ”€β”€ agents/ +β”‚ β”œβ”€β”€ bugsy.md +β”‚ β”œβ”€β”€ deepbit.md +β”‚ β”œβ”€β”€ eule.md +β”‚ β”œβ”€β”€ funkfox.md +β”‚ └── dumbosql.md +β”œβ”€β”€ crew.sh # Schnellzugriff-Script +β”œβ”€β”€ qdrant/ # (wenn installiert) +β”‚ β”œβ”€β”€ storage/ +β”‚ β”œβ”€β”€ start_qdrant.sh +β”‚ └── stop_qdrant.sh +└── ... + +~/.config/opencode/ +└── opencode.json # OpenCode Konfiguration mit Agents +``` + +--- + +## πŸ”— Integration mit Crumbforest + +Diese Mission ist Teil des grâßeren Γ–kosystems: + +``` +πŸ“š Keks-Handbuch (Wissen) + ↓ +πŸ₯‹ Terminal Dojo (Werkzeuge) ← DU BIST HIER + ↓ +πŸ¦‰ Crumb-Core (API/Web) + ↓ +πŸ“œ CrumbCodex (Archiv) +``` + +**Geplante Erweiterungen:** +- Keks-Handbuch als RAG-Content laden +- Sync mit Crumb-Core API +- WaldwΓ€chter-PersΓΆnlichkeiten erweitern + +--- + +## 🀝 Mitmachen + +- Neue WaldwΓ€chter-Prompts schreiben +- Bugs melden (Bugsy freut sich!) +- Übersetzungen + +**Lizenz:** MIT + CKL (Children's Knowledge License) + +--- + +## πŸ“š WeiterfΓΌhrende Links + +- [Keks-Handbuch](https://github.com/kruemel/OZM-Keks-Handbuch-v1) +- [Crumbmissions](https://github.com/kruemel/crumbmissions) +- [Crumb-Core](https://github.com/kruemel/Crumb-Core-v.1) +- [CrumbCodex](https://github.com/kruemel/CrumbCodex-v.0.0) +- [OpenCode Docs](https://opencode.ai/docs) +- [Ollama](https://ollama.ai) +- [Qdrant](https://qdrant.tech) + +--- + +*"Der Wald ist nie fertig - er wΓ€chst mit jeder Idee!"* 🌲 + +--- + +**Version:** 0.1.0-alpha +**Erstellt:** 2026-01-06 +**Crew:** Crumbforest diff --git a/missions/tools/terminal_dojo/terminal_dojo.meta.json b/missions/tools/terminal_dojo/terminal_dojo.meta.json new file mode 100644 index 0000000..fde349e --- /dev/null +++ b/missions/tools/terminal_dojo/terminal_dojo.meta.json @@ -0,0 +1,96 @@ +{ + "id": "terminal_dojo", + "name": "Terminal Dojo πŸ₯‹", + "version": "0.1.0-alpha", + "category": "tools", + "optional": true, + "difficulty": "advanced", + "estimated_time": "2-4 Stunden (mit Pausen!)", + "prerequisites": [ + "Keks-Handbuch Pfad 1-10 gelesen", + "Grundlegende Terminal-Kenntnisse", + "Git Basics (Pfad 12)", + "Geduld und Neugier" + ], + "description": "OpenCode + Ollama + WaldwΓ€chter im Terminal. Offline-fΓ€hig, Taschengeld-Format.", + "warning": "⚠️ Das geht nicht schnell! Hast du das Handbuch gelesen?", + "crew": ["bugsy", "deepbit", "eule", "funkfox"], + "hardware_requirements": { + "minimum": { + "device": "Raspberry Pi 5 (8GB)", + "storage": "32GB+ SD", + "note": "FΓΌr kleine Modelle (qwen2.5:0.5b, tinyllama)" + }, + "recommended": { + "device": "RPi 5 + Hailo AI HAT oder x86 Server", + "ram": "16GB+", + "storage": "64GB+ SSD", + "note": "FΓΌr grâßere Modelle und qdrant" + }, + "dev": { + "device": "M1/M2/M4 Mac oder Linux Desktop", + "note": "Zum Entwickeln und Testen" + } + }, + "components": { + "opencode": { + "required": true, + "version": ">=0.1.x", + "source": "https://opencode.ai" + }, + "ollama": { + "required": false, + "note": "Optional - kann auch OpenRouter nutzen", + "version": ">=0.5.x" + }, + "qdrant": { + "required": false, + "note": "Optional - fΓΌr Crew Memory / RAG", + "version": ">=1.7.x" + } + }, + "phases": [ + { + "id": 1, + "name": "Vorbereitung", + "description": "System-Check und Handbuch-Reminder", + "script": "01_vorcheck.sh" + }, + { + "id": 2, + "name": "OpenCode Setup", + "description": "OpenCode installieren und konfigurieren", + "script": "02_opencode_setup.sh" + }, + { + "id": 3, + "name": "Ollama (Optional)", + "description": "Lokale AI-Modelle fΓΌr Offline-Betrieb", + "script": "03_ollama_setup.sh", + "optional": true + }, + { + "id": 4, + "name": "WaldwΓ€chter Agents", + "description": "Bugsy, Deepbit & Co. als OpenCode Agents", + "script": "04_agents_setup.sh" + }, + { + "id": 5, + "name": "Qdrant (Optional)", + "description": "Crew Memory fΓΌr RAG", + "script": "05_qdrant_setup.sh", + "optional": true + }, + { + "id": 6, + "name": "Test & Spielen", + "description": "Die Crew im Terminal testen", + "script": "06_test_crew.sh" + } + ], + "license": "MIT + CKL", + "author": "Crumbforest Crew", + "created": "2026-01-06", + "philosophy": "Machen statt Lernen - aber erst verstehen, dann machen." +} diff --git a/missions/tools/terminal_dojo/terminal_dojo.sh b/missions/tools/terminal_dojo/terminal_dojo.sh new file mode 100755 index 0000000..e9be92f --- /dev/null +++ b/missions/tools/terminal_dojo/terminal_dojo.sh @@ -0,0 +1,168 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════ +# πŸ₯‹ TERMINAL DOJO - HauptmenΓΌ +# ═══════════════════════════════════════════════════════════════════════════ +# OpenCode + WaldwΓ€chter + Ollama + Qdrant +# Teil der Crumbmissions - https://github.com/kruemel/crumbmissions +# Lizenz: MIT + CKL (Children's Knowledge License) +# ═══════════════════════════════════════════════════════════════════════════ + +# Farben +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +BOLD='\033[1m' +DIM='\033[2m' +NC='\033[0m' + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +show_banner() { + clear + echo "" + echo -e "${MAGENTA} ╔════════════════════════════════════════════════════════════╗${NC}" + echo -e "${MAGENTA} β•‘${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•‘${NC} ${BOLD}πŸ₯‹ TERMINAL DOJO${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•‘${NC} ${DIM}OpenCode + WaldwΓ€chter im Crumbforest${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•‘${NC} ${MAGENTA}β•‘${NC}" + echo -e "${MAGENTA} β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" + echo "" +} + +show_status() { + echo -e "${BOLD}Status:${NC}" + + # OpenCode + if command -v opencode &> /dev/null; then + echo -e " ${GREEN}●${NC} OpenCode" + else + echo -e " ${RED}β—‹${NC} OpenCode" + fi + + # Ollama + if command -v ollama &> /dev/null && curl -s http://localhost:11434/api/tags &>/dev/null; then + echo -e " ${GREEN}●${NC} Ollama" + elif command -v ollama &> /dev/null; then + echo -e " ${YELLOW}β—‹${NC} Ollama (nicht gestartet)" + else + echo -e " ${DIM}β—‹${NC} Ollama (optional)" + fi + + # Qdrant + if curl -s http://localhost:6333/collections &>/dev/null; then + echo -e " ${GREEN}●${NC} Qdrant" + else + echo -e " ${DIM}β—‹${NC} Qdrant (optional)" + fi + + # Agents + if [[ -d "$HOME/.terminal_dojo/agents" ]]; then + echo -e " ${GREEN}●${NC} WaldwΓ€chter" + else + echo -e " ${RED}β—‹${NC} WaldwΓ€chter" + fi + + echo "" +} + +show_menu() { + echo -e "${BOLD}Setup-Phasen:${NC}" + echo "" + echo -e " ${CYAN}1${NC}) Vorbereitung - System-Check & Handbuch-Reminder" + echo -e " ${CYAN}2${NC}) OpenCode - Terminal AI installieren" + echo -e " ${CYAN}3${NC}) Ollama - Lokale Modelle ${DIM}(optional)${NC}" + echo -e " ${CYAN}4${NC}) WaldwΓ€chter - Crew-Agents konfigurieren" + echo -e " ${CYAN}5${NC}) Qdrant - Crew Memory ${DIM}(optional)${NC}" + echo -e " ${CYAN}6${NC}) Testen - Alles ausprobieren!" + echo "" + echo -e "${BOLD}Schnellstart:${NC}" + echo "" + echo -e " ${CYAN}a${NC}) Alles installieren (gefΓΌhrt)" + echo -e " ${CYAN}c${NC}) Crew starten (wenn fertig)" + echo "" + echo -e " ${CYAN}q${NC}) Beenden" + echo "" +} + +run_phase() { + local phase=$1 + local script="$SCRIPT_DIR/0${phase}_*.sh" + + # Find the script + local found=$(ls $script 2>/dev/null | head -n1) + + if [[ -f "$found" ]]; then + chmod +x "$found" + "$found" + echo "" + read -p "DrΓΌcke Enter um fortzufahren..." -r + else + echo -e "${RED}Script nicht gefunden: $script${NC}" + sleep 2 + fi +} + +run_all() { + echo -e "${CYAN}Starte gefΓΌhrte Installation...${NC}" + echo "" + echo "Dies fΓΌhrt dich durch alle Phasen." + echo "Du kannst jede Phase ΓΌberspringen." + echo "" + read -p "Weiter? [J/n] " -n 1 -r + echo "" + + if [[ $REPLY =~ ^[Nn]$ ]]; then + return + fi + + for phase in 1 2 3 4 5 6; do + run_phase $phase + done +} + +start_crew() { + if [[ -f "$HOME/.terminal_dojo/crew.sh" ]]; then + source "$HOME/.terminal_dojo/crew.sh" + else + echo -e "${RED}Crew nicht konfiguriert!${NC}" + echo "Bitte erst Phase 4 ausfΓΌhren." + sleep 2 + fi +} + +# ───────────────────────────────────────────────────────────────────────────── +# Main Loop +# ───────────────────────────────────────────────────────────────────────────── + +while true; do + show_banner + show_status + show_menu + + read -p "WΓ€hle [1-6, a, c, q]: " -n 1 -r choice + echo "" + echo "" + + case $choice in + 1) run_phase 1 ;; + 2) run_phase 2 ;; + 3) run_phase 3 ;; + 4) run_phase 4 ;; + 5) run_phase 5 ;; + 6) run_phase 6 ;; + a|A) run_all ;; + c|C) start_crew; break ;; + q|Q) + echo -e "${BLUE}πŸ¦‰ Bis bald im Wald!${NC}" + echo "" + exit 0 + ;; + *) + echo -e "${YELLOW}UngΓΌltige Auswahl${NC}" + sleep 1 + ;; + esac +done