6 Commits

Author SHA1 Message Date
Branko May Trinkwald
2ff177d0e8 🎉 RC0 - Release Candidate 0
Der Crumbforest ist bereit.

Heute entstanden:
• 17 Waldwächter - Alle Egos vereint und funktional
• Input-Transparenz - crew_tokens zeigt 21,471 Tokens
• Output-Transparenz - crew_memo trackt kreative Krümel
• Kollaborative Wurzeln - seeds/ für gemeinsames Wachsen
• Pfad-Fixes - CREW_DIR, waldwaechter.sh Integration

Architektur:
- 1 Script (waldwaechter.sh)
- 1 Ordner voller Weisheit (crumbforest_roles/)
- 17 Egos mit Persönlichkeit
- 0 Regeln

Philosophie:
eule -> kleine krümel -> tools -> nullfeld

Der Wald mag keine Sticker.
17 Egos im Wald. 1 Wald ohne Ego. Zero Rules.

🌲 Gewachsen im Nullfeld
   #ozmai #mensch #maschine
2025-12-21 23:21:44 +01:00
Branko May Trinkwald
6fec2df7d9 🌱 Seed: Wurzel-Dateien für kollaborative Erweiterung
Neues seeds/ Verzeichnis mit:
- crumb_memo.seed.json - Erste Krümel als Ausgangspunkt
- README.md - Philosophie & Verwendung

Die ersten drei Krümel im Nullfeld:
  🎧 Digi's Mixcloud - digfafunk
  💾 CF_Zero_V1 Repo - crumbmissions
  🔊 Digi's SoundCloud - digfafunk

Philosophie:
"Ein Baum braucht eine Wurzel. Ein Wald braucht den ersten Baum."

Diese Seeds sind Ausgangspunkte - erweiterbar von allen.
CrewLove: Gemeinsam wachsen im Nullfeld 💚🌲

Transparenz in beide Richtungen:
- Input: crew_tokens (Was frage ich?)
- Output: crew_memo (Was schaffe ich?)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-21 23:09:21 +01:00
Branko May Trinkwald
599af5b011 New: Crumb Memo - Output-Transparenz System
Neue Befehle für kreatives Output-Tracking:
- crumb_memo <link> [notiz] - Kreativen Link festhalten
- crew_memo - Alle kreativen Krümel anzeigen

Features:
• Auto-Erkennung von Plattformen:
  🎧 Mixcloud, 🔊 SoundCloud, 📹 YouTube, 💾 Git
• Zeitstempel & Notizen
• JSON-basiert in logs/crumb_memo.json
• Statistik nach Typ

Philosophie:
Input-Transparenz (crew_tokens) + Output-Transparenz (crew_memo)
= Vollständige Sichtbarkeit der Krümel im Nullfeld

"Was habe ich geschaffen?" 💚

Beispiel:
  crumb_memo "https://mixcloud.com/digfafunk/" "New Mix"
  crew_memo

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-21 23:01:47 +01:00
Branko May Trinkwald
0f8946e4c4 🔍 Fix: crew_tokens zeigt jetzt alle Token transparent
Problem: crew_tokens suchte in alten ~/.xxx_logs Pfaden,
aber Waldwächter loggen jetzt in repo/logs/.

Lösung:
- waldwaechter.sh im CrumbCrew RC-File sourcen
- Alte crew_tokens/crew_memory Funktionen entfernt
- Nutzt jetzt bessere Versionen aus waldwaechter.sh

Resultat: Transparenz! 21,471 Tokens sichtbar 💚
"Was kostet die Frage eines Kindes?" - Krümel im Nullfeld

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-21 21:49:36 +01:00
Branko May Trinkwald
3ca1709eb3 Add: Templatus - 17. Waldwächter komplett
Templatus (📄 Template-Master) war im waldwaechter.sh
vorhanden, fehlte aber im Mission Selector.

Hinzugefügt:
- templatus() Funktion im CrumbCrew Command Central
- Eintrag in crew_status CHARS array
- Dokumentation in crew_help
- Beispiel: "Erstelle eine HTML5 Struktur"

Jetzt alle 17 Waldwächter wie nach OZMAI vorgesehen! 🌲

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-21 21:35:51 +01:00
Branko May Trinkwald
e1cae4fbd1 🐛 Fix: CREW_DIR path nach waldwaechter.sh source
waldwaechter.sh überschrieb SCRIPT_DIR, was zu falschem
CREW_DIR=/lib/crumbforest_roles führte. Alle Waldwächter
zeigten "Nicht verfügbar" im crew_status.

Fix: REPO_ROOT vor source speichern und für Pfade nutzen.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-21 21:29:19 +01:00
5 changed files with 246 additions and 51 deletions

20
VERSION Normal file
View File

@@ -0,0 +1,20 @@
RC0 - Release Candidate 0
Datum: 2025-12-21
🌲 Der Crumbforest ist bereit
Was entstanden ist:
• 17 Waldwächter - Alle Egos vereint
• Input-Transparenz - crew_tokens (Token-Tracking)
• Output-Transparenz - crew_memo (Krümel-Tracking)
• Kollaborative Wurzeln - seeds/ für gemeinsames Wachsen
• Zero Rules - Ein Script, ein Ordner, unendlich Möglichkeiten
Philosophie:
eule -> kleine krümel -> tools -> nullfeld
#ozmai #mensch #maschine
Der Wald mag keine Sticker.
17 Egos im Wald. 1 Wald ohne Ego. 0 Regeln.
🦉 Entstanden im Nullfeld 💚

View File

@@ -15,6 +15,7 @@ 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"
@@ -499,7 +500,7 @@ function mayaeule_doktor() {
EULE_RC="/tmp/crumb_eule_$$.rc"
# Absoluter Pfad zum Maya-Eule Script
MAYAEULE_PATH="${SCRIPT_DIR}/crumbforest_roles/mayaeule_zero.sh"
MAYAEULE_PATH="${REPO_ROOT}/crumbforest_roles/mayaeule_zero.sh"
cat > "${EULE_RC}" << EOF
# Load .bashrc if exists
@@ -616,7 +617,7 @@ function crumbcrew_doktor() {
CREW_RC="/tmp/crumb_crew_$$.rc"
# Pfade zu allen Charakteren
CREW_DIR="${SCRIPT_DIR}/crumbforest_roles"
CREW_DIR="${REPO_ROOT}/crumbforest_roles"
cat > "${CREW_RC}" << EOF
# Load .bashrc if exists
@@ -635,9 +636,15 @@ NC='\033[0m'
# Prompt im CrumbCrew-Style
export PS1="\[\033[1;32m\](🌲 CrumbCrew) \u@\h:\w\$ \[\033[0m\]"
# Pfad zu den Charakteren
# Repo Root und Pfade
REPO_ROOT="${REPO_ROOT}"
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() {
@@ -676,6 +683,15 @@ 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}"
@@ -801,6 +817,7 @@ 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)"
@@ -830,6 +847,7 @@ 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?\""
@@ -854,7 +872,7 @@ function crew_status() {
echo -e "\${CYAN}🌲 CrumbCrew Status\${NC}"
echo ""
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")
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")
for char_info in "\${CHARS[@]}"; do
IFS=: read -r name icon display <<< "\$char_info"
@@ -883,52 +901,8 @@ function crew_status() {
fi
}
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
}
# crew_tokens, crew_memory, crew_status, crew_doctor, crew_syntax, crew_help
# sind bereits in waldwaechter.sh definiert und werden automatisch geladen
alias help="crew_help"
alias status="crew_status"

View File

@@ -436,11 +436,16 @@ function crew_help() {
Crew-Verwaltung:
crew_help Diese Hilfe anzeigen
crew_status Status aller 17 Waldwächter
crew_tokens Token-Verbrauch ALLER Charaktere
crew_tokens Token-Verbrauch ALLER Charaktere (Input)
crew_memo Kreative Krümel anzeigen (Output)
crew_memory Erinnerungen durchsuchen
crew_doctor System-Diagnose (Version, Pfade, Dependencies)
crew_syntax Syntax Check aller Scripts
Krümel-Tracking:
crumb_memo Kreativen Link festhalten (Mixcloud, Git, etc.)
crew_memo Alle kreativen Krümel anzeigen
Einzelne Waldwächter:
🔺 Das Dreieck (Foundation):
@@ -481,6 +486,132 @@ Beispiele:
EOF
}
# 📝 crumb_memo - Kreative Output-Krümel festhalten
function crumb_memo() {
local link="$1"
local notiz="${2:-}"
if [[ -z "$link" ]]; then
echo "📝 Crumb Memo - Kreative Output-Krümel"
echo ""
echo "Verwendung: crumb_memo <link> [notiz]"
echo ""
echo "Beispiele:"
echo " crumb_memo \"https://mixcloud.com/digfafunk/new-mix\""
echo " crumb_memo \"https://github.com/user/repo\" \"Neues Feature\""
echo " crumb_memo \"https://soundcloud.com/artist/track\""
echo " crumb_memo \"https://youtube.com/watch?v=xyz\" \"Tutorial\""
echo ""
echo "Zeige alle Krümel mit: crew_memo"
return
fi
# Memo-Datei
local memo_file="${CRUMB_LOGS_DIR}/crumb_memo.json"
mkdir -p "${CRUMB_LOGS_DIR}"
# Initialisiere Datei wenn nicht vorhanden
if [[ ! -f "$memo_file" ]]; then
echo "[]" > "$memo_file"
fi
# Erkenne Typ aus URL
local typ="link"
if [[ "$link" =~ mixcloud\.com ]]; then
typ="mixcloud"
elif [[ "$link" =~ soundcloud\.com ]]; then
typ="soundcloud"
elif [[ "$link" =~ (youtube\.com|youtu\.be) ]]; then
typ="youtube"
elif [[ "$link" =~ (github\.com|gitlab\.com) ]]; then
typ="git"
fi
# Zeitstempel
local zeit=$(date '+%Y-%m-%d %H:%M:%S')
# Erstelle JSON-Eintrag
local entry=$(jq -n \
--arg zeit "$zeit" \
--arg link "$link" \
--arg typ "$typ" \
--arg notiz "$notiz" \
'{zeit: $zeit, link: $link, typ: $typ, notiz: $notiz}')
# Füge zur Datei hinzu (append)
if [[ -s "$memo_file" ]]; then
# Datei hat Inhalt - füge zum Array hinzu
jq ". += [$entry]" "$memo_file" > "${memo_file}.tmp" && mv "${memo_file}.tmp" "$memo_file"
else
# Datei ist leer - erstelle Array
echo "[$entry]" > "$memo_file"
fi
# Icon je nach Typ
local icon="🔗"
case "$typ" in
mixcloud) icon="🎧" ;;
soundcloud) icon="🔊" ;;
youtube) icon="📹" ;;
git) icon="💾" ;;
esac
echo "$icon Krümel gespeichert: $typ"
echo " $link"
if [[ -n "$notiz" ]]; then
echo " 📝 $notiz"
fi
}
# 📜 crew_memo - Zeige alle kreativen Krümel
function crew_memo() {
local memo_file="${CRUMB_LOGS_DIR}/crumb_memo.json"
echo "📜 Crumb Memo - Deine kreativen Krümel"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if [[ ! -f "$memo_file" ]] || [[ ! -s "$memo_file" ]]; then
echo " Noch keine Krümel gespeichert."
echo ""
echo " Füge welche hinzu mit:"
echo " crumb_memo \"https://mixcloud.com/digfafunk/...\""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
return
fi
# Zähle Einträge pro Typ
local total=$(jq 'length' "$memo_file")
local mixcloud=$(jq '[.[] | select(.typ == "mixcloud")] | length' "$memo_file")
local soundcloud=$(jq '[.[] | select(.typ == "soundcloud")] | length' "$memo_file")
local youtube=$(jq '[.[] | select(.typ == "youtube")] | length' "$memo_file")
local git=$(jq '[.[] | select(.typ == "git")] | length' "$memo_file")
# Zeige letzte 10 Einträge
echo ""
jq -r '.[-10:] | reverse | .[] |
if .typ == "mixcloud" then " 🎧"
elif .typ == "soundcloud" then " 🔊"
elif .typ == "youtube" then " 📹"
elif .typ == "git" then " 💾"
else " 🔗"
end + " " + .zeit + " - " + .typ +
(if .notiz != "" then "\n 📝 " + .notiz else "" end) +
"\n " + .link' "$memo_file"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
printf " Gesamt: %d Krümel" "$total"
if [[ $mixcloud -gt 0 ]]; then printf " | 🎧 %d" "$mixcloud"; fi
if [[ $soundcloud -gt 0 ]]; then printf " | 🔊 %d" "$soundcloud"; fi
if [[ $youtube -gt 0 ]]; then printf " | 📹 %d" "$youtube"; fi
if [[ $git -gt 0 ]]; then printf " | 💾 %d" "$git"; fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "💡 Output-Transparenz: Was habe ich geschaffen? 💚"
}
# Export functions so they're available in subshells
# Note: export -f works in bash, but not in zsh
# In zsh, functions are automatically available in the current shell
@@ -510,6 +641,8 @@ if [[ -n "$BASH_VERSION" ]]; then
export -f crew_doctor
export -f crew_syntax
export -f crew_help
export -f crumb_memo
export -f crew_memo
fi
# In zsh, functions are available without export -f

48
seeds/README.md Normal file
View File

@@ -0,0 +1,48 @@
# 🌱 Seeds - Wurzeln für den Crumbforest
Dieses Verzeichnis enthält **Seed-Dateien** - Ausgangspunkte für kollaborative Systeme.
## crumb_memo.seed.json
Die erste Wurzel für das **Crumb Memo System** - Output-Transparenz für kreative Krümel.
### Philosophie
*"Ein Baum braucht eine Wurzel. Ein Wald braucht den ersten Baum."*
Diese Datei ist der erste Knoten - erweiterbar von allen.
### Verwendung
```bash
# Im CrumbCrew Shell:
crumb_memo "https://mixcloud.com/deine-url" "Dein kreativer Moment"
crew_memo # Zeige alle Krümel
```
### Struktur
```json
{
"zeit": "2025-12-21 23:00:00",
"link": "https://...",
"typ": "mixcloud|soundcloud|youtube|git",
"notiz": "Deine Notiz"
}
```
## CrewLove 💚
Jeder kann erweitern. Gemeinsam wachsen im Nullfeld der Transparenz.
**Unterstützte Plattformen:**
- 🎧 Mixcloud
- 🔊 SoundCloud
- 📹 YouTube
- 💾 Git (GitHub, GitLab)
**Transparenz in beide Richtungen:**
- Input: `crew_tokens` - Was frage ich?
- Output: `crew_memo` - Was schaffe ich?
*Die Krümel tanzen im Nullfeld!* 🌲✨

View File

@@ -0,0 +1,20 @@
[
{
"zeit": "2025-12-21 23:00:57",
"link": "https://mixcloud.com/digfafunk/",
"typ": "mixcloud",
"notiz": "Digi's Mixcloud Profil - Der erste Krümel im Nullfeld"
},
{
"zeit": "2025-12-21 23:01:04",
"link": "https://github.com/kruemel/crumbmissions",
"typ": "git",
"notiz": "CF_Zero_V1 Repo - Wo die Waldwächter wohnen"
},
{
"zeit": "2025-12-21 23:01:04",
"link": "https://soundcloud.com/digfafunk",
"typ": "soundcloud",
"notiz": "Digi on SoundCloud - Klangwelten"
}
]