toooooltime 3

This commit is contained in:
Branko May Trinkwald
2026-01-06 21:25:02 +01:00
parent d4d75af428
commit 984202f2ba
12 changed files with 3015 additions and 117 deletions

View File

@@ -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
View 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

View 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

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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 ""

View 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

View 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."
}

View 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