toooooltime 3
This commit is contained in:
@@ -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
|
||||
|
||||
181
missions/tools/README.md
Normal file
181
missions/tools/README.md
Normal file
@@ -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
|
||||
168
missions/tools/terminal_dojo.sh
Normal file
168
missions/tools/terminal_dojo.sh
Normal file
@@ -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
|
||||
292
missions/tools/terminal_dojo/01_vorcheck.sh
Executable file
292
missions/tools/terminal_dojo/01_vorcheck.sh
Executable file
@@ -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 ""
|
||||
268
missions/tools/terminal_dojo/02_opencode_setup.sh
Executable file
268
missions/tools/terminal_dojo/02_opencode_setup.sh
Executable file
@@ -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 ""
|
||||
382
missions/tools/terminal_dojo/03_ollama_setup.sh
Executable file
382
missions/tools/terminal_dojo/03_ollama_setup.sh
Executable file
@@ -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 <model>' 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 <model>${NC} # Neues Modell laden"
|
||||
echo -e " ${CYAN}ollama run <model>${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 ""
|
||||
439
missions/tools/terminal_dojo/04_agents_setup.sh
Executable file
439
missions/tools/terminal_dojo/04_agents_setup.sh
Executable file
@@ -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 <name> [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 ""
|
||||
376
missions/tools/terminal_dojo/05_qdrant_setup.sh
Executable file
376
missions/tools/terminal_dojo/05_qdrant_setup.sh
Executable file
@@ -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 ""
|
||||
325
missions/tools/terminal_dojo/06_test_crew.sh
Executable file
325
missions/tools/terminal_dojo/06_test_crew.sh
Executable file
@@ -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 <name>${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 ""
|
||||
181
missions/tools/terminal_dojo/README.md
Normal file
181
missions/tools/terminal_dojo/README.md
Normal file
@@ -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
|
||||
96
missions/tools/terminal_dojo/terminal_dojo.meta.json
Normal file
96
missions/tools/terminal_dojo/terminal_dojo.meta.json
Normal file
@@ -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."
|
||||
}
|
||||
168
missions/tools/terminal_dojo/terminal_dojo.sh
Executable file
168
missions/tools/terminal_dojo/terminal_dojo.sh
Executable file
@@ -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
|
||||
Reference in New Issue
Block a user