From ce49122b35e78e01313cf37139ee0742b633ca76 Mon Sep 17 00:00:00 2001 From: martin Date: Wed, 4 Feb 2026 22:10:28 +0100 Subject: [PATCH] update --- ...026-02-04_project-structure-refactoring.md | 40 ++++ .../2026-02-04_vault-restructuring.md | 54 ++++++ .../ligalytics-staffeleinteilung/MEMORY.md | 31 +++ scripts/README.md | 64 +++++++ scripts/sync-project-memory.sh | 180 ++++++++++++++++++ system/global-instructions.md | 14 +- vault-index.md | 53 +++++- 7 files changed, 427 insertions(+), 9 deletions(-) create mode 100644 memory/log/2026-02-04_project-structure-refactoring.md create mode 100644 memory/snapshots/2026-02-04_vault-restructuring.md create mode 100644 projects/ligalytics-staffeleinteilung/MEMORY.md create mode 100644 scripts/README.md create mode 100755 scripts/sync-project-memory.sh diff --git a/memory/log/2026-02-04_project-structure-refactoring.md b/memory/log/2026-02-04_project-structure-refactoring.md new file mode 100644 index 0000000..34bc6d8 --- /dev/null +++ b/memory/log/2026-02-04_project-structure-refactoring.md @@ -0,0 +1,40 @@ +# LOG: Project Structure Refactoring - 2026-02-04 + +## Context +Umstrukturierung des Vaults zur besseren Organisation projektspezifischer Dateien. + +## Problem +- Memory-Dateien lagen unter `/memory/projects/.md` (flache Struktur) +- Keine Möglichkeit, zusätzliche projektspezifische Dateien (CLAUDE.md, INSTRUCTIONS.md) zu organisieren +- Semantische Vermischung: "Memory" als Container für Projekte war unintuitiv + +## Solution +1. Neuer `/projects/` Top-Level-Ordner erstellt +2. Unterordner pro Projekt: `projects//` +3. Standardisierte Dateinamen: `MEMORY.md`, `CLAUDE.md`, `INSTRUCTIONS.md` + +## Changes +```diff +- memory/projects/ligalytics-staffeleinteilung.md ++ projects/ligalytics-staffeleinteilung/MEMORY.md +``` + +## Lessons Learned + +### Was funktionierte gut +- **Atomic Migration**: Pfad-Änderung + Script-Update + Daten-Migration in einer Session +- **mkdir -p Pattern**: Auto-Create im Sync-Script verhindert manuelle Ordner-Erstellung +- **Template-Based Snapshots**: Wiederverwendbares Format für konsistente Dokumentation + +### Potenzielle Verbesserungen +- Script könnte erweitert werden für CLAUDE.md / INSTRUCTIONS.md Sync +- `.gitignore` für sensible Projekt-Daten in Betracht ziehen +- Überlegen: Projekt-Metadaten in eigener `project.yaml` speichern? + +## Impact +- ✅ Bessere Skalierbarkeit für viele Projekte +- ✅ Klare Trennung zwischen globalem Memory und Projekt-Kontext +- ✅ Erweiterbar für zukünftige projektspezifische Dateien + +## Tags +`#vault-structure` `#refactoring` `#projects` `#memory` `#scripts` diff --git a/memory/snapshots/2026-02-04_vault-restructuring.md b/memory/snapshots/2026-02-04_vault-restructuring.md new file mode 100644 index 0000000..5062aa0 --- /dev/null +++ b/memory/snapshots/2026-02-04_vault-restructuring.md @@ -0,0 +1,54 @@ +# SNAPSHOT: Vault Restructuring - 2026-02-04 + +## 1. STATUS QUO + +### Erreichte Ziele +- ✅ Neuen `/projects/` Ordner erstellt für projektspezifische Dateien +- ✅ Global-Instructions erweitert mit Projekt-Spiegelungs-Regeln +- ✅ Sync-Script (`sync-project-memory.sh`) auf neue Pfadstruktur migriert +- ✅ Existierende Memory-Datei (`ligalytics-staffeleinteilung.md`) erfolgreich migriert + +### Veränderte Dateien +- **system/global-instructions.md**: Neuer Abschnitt "PROJEKT-SPIEGELUNG" +- **scripts/sync-project-memory.sh**: Pfad-Updates, Auto-Create für Projekt-Verzeichnisse +- **memory/projects/** → **projects/**: Strukturänderung + +### Neue Struktur +``` +projects/ +├── ligalytics-staffeleinteilung/ +│ ├── MEMORY.md (migriert, 1.8 KB) +│ ├── CLAUDE.md (optional, zukünftig) +│ └── INSTRUCTIONS.md (optional, zukünftig) +└── [weitere-projekte]/ +``` + +## 2. TECHNISCHE ENTSCHEIDUNGEN + +### Warum `/projects/` statt `/memory/projects/`? +- **Semantische Klarheit**: Projekte sind keine "Memory", sondern eigenständige Kontexte +- **Erweiterbarkeit**: Projektordner können nun MEMORY.md, CLAUDE.md und INSTRUCTIONS.md enthalten +- **Konsistenz**: Flache Struktur (`/skills/`, `/agents/`, `/projects/`) statt verschachtelt + +### Warum Unterordner pro Projekt? +- Erlaubt mehrere Dateitypen pro Projekt (MEMORY.md, CLAUDE.md, etc.) +- Bessere Skalierbarkeit bei vielen Projekten +- Klare Namenskonvention: `projects//MEMORY.md` + +## 3. NEXT STEPS (Dringend) + +- [ ] Ersten Memory-Log für diese Session erstellen +- [ ] `vault-index.md` aktualisieren (Pfad-Änderung dokumentieren) +- [ ] Sync-Script testen: `./scripts/sync-project-memory.sh --dry-run` +- [ ] Optional: CLAUDE.md für ligalytics-staffeleinteilung aus `~/.claude/projects/` spiegeln + +## 4. BLOCKER / OFFENE FRAGEN + +### Zu klären +- Soll das Sync-Script auch CLAUDE.md und INSTRUCTIONS.md synchronisieren? +- Sollen alte `/memory/log/` Einträge in die neue Struktur migriert werden? +- Git-Commit für diese Änderungen erstellen? + +### Testing Required +- Sync-Script mit existierenden Claude-Projekten testen +- Prüfen ob `.gitignore` für Projects-Ordner sinnvoll ist (je nach Sensitivität) diff --git a/projects/ligalytics-staffeleinteilung/MEMORY.md b/projects/ligalytics-staffeleinteilung/MEMORY.md new file mode 100644 index 0000000..f2a072d --- /dev/null +++ b/projects/ligalytics-staffeleinteilung/MEMORY.md @@ -0,0 +1,31 @@ +# Ligalytics Staffeleinteilung - Memory + +## Projekt-Setup +- **Docker-basiertes Backend**: PostgreSQL 16 + Django 6.0+ (docker-compose.yml mit health checks) +- **Frontend**: Next.js 16 mit React 19, TanStack Query für Server State +- **API-Pattern**: DRF mit @api_view Decorators (NICHT ViewSets!) - Function-based Views +- **Code Style**: Ruff (Python, 120 chars, single quotes), Prettier (TS/JS, 2 spaces) + +## Wichtige Patterns +- **Makefile-Befehle**: Alle Django-Operationen über `make migrate`, `make test`, etc. +- **App-Struktur**: core (Club/Team/Stadium), scenarios (Competition/Scenario/Solution/Group), users +- **Dokumentation**: CLAUDE.md ist Source of Truth für Entwicklungs-Workflows +- **Docker Services**: db (PostgreSQL) + web (Django) mit Volume-Mount für Hot-Reload + +## Häufige Operationen +- Backend-Tests einzelner Apps: `docker compose exec web python manage.py test apps.core` +- Spezifische Test-Datei: `docker compose exec web python manage.py test apps.scenarios.tests.test_views` +- API-Dokumentation: http://localhost:8000/api/docs/ (Swagger UI via drf-spectacular) +- Django Shell: `make shell` (im /server Verzeichnis) + +## Zu vermeiden +- SQLite in Produktion (nur Development) +- ViewSets/Routers statt @api_view (Projekt-Standard ist Function-based Views) +- Generische Annahmen - immer CLAUDE.md und spezifische Dokumentation prüfen +- Breaking Changes ohne Dokumentations-Update + +## Architektur-Kontext +- **DFB SPB2 Integration**: System ist Teil der "Spielbetrieb 2.0" Initiative +- **Datenfluss**: DFBnet (Hinweg) → Ligalytics Optimierung → DFBnet (Rückweg) +- **Optimierungs-Engine**: Mathematische Solver-Integration für Staffeleinteilung geplant +- **Business Domain**: Fußball-Ligaverwaltung mit Hard Constraints (Staffelgrößen, Vereinstrennung) diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..7f5fd0d --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,64 @@ +# Vault Scripts + +Automatisierungsscripts für Vault-Wartung und Synchronisation. + +## 🔄 sync-project-memory.sh + +Synchronisiert projekt-spezifische MEMORY.md Dateien zwischen: +- **Claude-Projekt**: `~/.claude/projects//memory/MEMORY.md` +- **Vault-Backup**: `~/Work/claude-vault/memory/projects/.md` + +### Quick Start + +```bash +# Alle Projekte synchronisieren (Auto-Detect neuer Version) +~/Work/claude-vault/scripts/sync-project-memory.sh + +# Nur ein spezifisches Projekt +~/Work/claude-vault/scripts/sync-project-memory.sh ligalytics-staffeleinteilung + +# Dry-Run (zeigt nur an, was gemacht würde) +~/Work/claude-vault/scripts/sync-project-memory.sh --dry-run +``` + +### Optionen + +| Option | Beschreibung | +|--------|--------------| +| `--to-vault` | Erzwinge Kopie: Claude-Projekt → Vault | +| `--from-vault` | Erzwinge Kopie: Vault → Claude-Projekt | +| `--dry-run` | Zeige nur Sync-Plan ohne Ausführung | +| `-h, --help` | Zeige Hilfe | + +### Wie es funktioniert + +1. **Auto-Detect**: Vergleicht Timestamps beider Dateien +2. **Neuer gewinnt**: Kopiert die neuere Version über die ältere +3. **Sicher**: Zeigt immer an, was passiert + +### Alias einrichten (optional) + +Füge in deine `~/.zshrc` oder `~/.bashrc` ein: + +```bash +alias sync-memory='~/Work/claude-vault/scripts/sync-project-memory.sh' +``` + +Dann kannst du einfach `sync-memory` aufrufen. + +### Git Workflow + +Nach dem Sync kannst du Änderungen committen: + +```bash +cd ~/Work/claude-vault +git add memory/projects/ +git commit -m "Update project memories" +git push +``` + +## Weitere Scripts (in Planung) + +- `audit-skills.sh` - Prüft alle SKILL.md Dateien auf Vollständigkeit +- `extract-patterns.sh` - Extrahiert Patterns aus Session-Logs +- `vault-backup.sh` - Erstellt timestamped Backup des gesamten Vaults diff --git a/scripts/sync-project-memory.sh b/scripts/sync-project-memory.sh new file mode 100755 index 0000000..7c34cae --- /dev/null +++ b/scripts/sync-project-memory.sh @@ -0,0 +1,180 @@ +#!/bin/bash + +# 🔄 MEMORY.md SYNC SCRIPT +# Synchronisiert Projekt-spezifische MEMORY.md zwischen ~/.claude/projects/ und dem Vault + +set -e + +VAULT_DIR="$HOME/Work/claude-vault" +PROJECTS_DIR="$HOME/.claude/projects" + +# Farben für Output +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +usage() { + cat << EOF +Usage: $0 [PROJECT_NAME] [OPTIONS] + +Synchronisiert MEMORY.md zwischen Claude-Projekt und Vault. + +ARGUMENTS: + PROJECT_NAME Name der Projekt-MEMORY.md im Vault (z.B. ligalytics-staffeleinteilung) + Ohne Angabe: Alle Projekte synchronisieren + +OPTIONS: + --to-vault Erzwinge Kopie: Claude-Projekt → Vault (überschreibt Vault) + --from-vault Erzwinge Kopie: Vault → Claude-Projekt (überschreibt Projekt) + --dry-run Zeige nur an, was gemacht würde + -h, --help Zeige diese Hilfe + +EXAMPLES: + $0 # Sync alle Projekte (Auto-Detect neuer) + $0 ligalytics-staffeleinteilung # Sync nur dieses Projekt + $0 ligalytics-staffeleinteilung --to-vault # Force: Projekt → Vault + $0 --dry-run # Zeige Sync-Plan ohne Ausführung + +VAULT STRUCTURE: + Vault: $VAULT_DIR/projects//MEMORY.md + Claude: $PROJECTS_DIR//memory/MEMORY.md + +EOF + exit 0 +} + +# Parse Arguments +PROJECT_NAME="" +FORCE_DIRECTION="" +DRY_RUN=false + +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage + ;; + --to-vault) + FORCE_DIRECTION="to-vault" + shift + ;; + --from-vault) + FORCE_DIRECTION="from-vault" + shift + ;; + --dry-run) + DRY_RUN=true + shift + ;; + *) + PROJECT_NAME="$1" + shift + ;; + esac +done + +sync_project() { + local project_name="$1" + local vault_file="$VAULT_DIR/projects/${project_name}/MEMORY.md" + + # Finde entsprechendes Claude-Projekt + local claude_file="" + for dir in "$PROJECTS_DIR"/*; do + if [ -f "$dir/memory/MEMORY.md" ]; then + # Prüfe ob Projekt-Name im Pfad vorkommt + if [[ "$(basename "$dir")" == *"${project_name//-/}"* ]] || [ -z "$PROJECT_NAME" ]; then + claude_file="$dir/memory/MEMORY.md" + break + fi + fi + done + + # Wenn PROJECT_NAME gegeben, aber kein Claude-File gefunden: Suche exakt + if [ -n "$PROJECT_NAME" ] && [ -z "$claude_file" ]; then + # Versuche direkte Zuordnung (für ligalytics-staffeleinteilung → *ligalytics*staffeleinteilung*) + for dir in "$PROJECTS_DIR"/*; do + if [ -f "$dir/memory/MEMORY.md" ]; then + local normalized=$(basename "$dir") + if [[ "$normalized" == *"ligalytics"* ]] && [[ "$normalized" == *"staffeleinteilung"* ]]; then + claude_file="$dir/memory/MEMORY.md" + break + fi + fi + done + fi + + if [ ! -f "$vault_file" ] && [ ! -f "$claude_file" ]; then + echo -e "${YELLOW}⚠ Skipped: ${project_name} (keine Dateien gefunden)${NC}" + return + fi + + # Bestimme Sync-Richtung + local direction="" + + if [ -n "$FORCE_DIRECTION" ]; then + direction="$FORCE_DIRECTION" + elif [ ! -f "$vault_file" ]; then + direction="to-vault" + echo -e "${YELLOW}→ ${project_name}: Vault-Datei fehlt, kopiere von Claude${NC}" + elif [ ! -f "$claude_file" ]; then + direction="from-vault" + echo -e "${YELLOW}→ ${project_name}: Claude-Datei fehlt, kopiere von Vault${NC}" + else + # Vergleiche Timestamps + local vault_time=$(stat -f %m "$vault_file" 2>/dev/null || stat -c %Y "$vault_file") + local claude_time=$(stat -f %m "$claude_file" 2>/dev/null || stat -c %Y "$claude_file") + + if [ "$vault_time" -gt "$claude_time" ]; then + direction="from-vault" + echo -e "${GREEN}→ ${project_name}: Vault neuer ($(date -r "$vault_time" '+%Y-%m-%d %H:%M'))${NC}" + elif [ "$claude_time" -gt "$vault_time" ]; then + direction="to-vault" + echo -e "${GREEN}→ ${project_name}: Claude neuer ($(date -r "$claude_time" '+%Y-%m-%d %H:%M'))${NC}" + else + echo -e "${GREEN}✓ ${project_name}: Bereits synchron${NC}" + return + fi + fi + + # Führe Sync aus + if [ "$DRY_RUN" = true ]; then + if [ "$direction" = "to-vault" ]; then + echo -e " ${YELLOW}[DRY-RUN]${NC} cp $claude_file → $vault_file" + else + echo -e " ${YELLOW}[DRY-RUN]${NC} cp $vault_file → $claude_file" + fi + else + if [ "$direction" = "to-vault" ]; then + # Erstelle Projekt-Verzeichnis falls nötig + mkdir -p "$(dirname "$vault_file")" + cp "$claude_file" "$vault_file" + echo -e " ${GREEN}✓ Kopiert:${NC} Claude → Vault" + else + cp "$vault_file" "$claude_file" + echo -e " ${GREEN}✓ Kopiert:${NC} Vault → Claude" + fi + fi +} + +# Main Logic +echo -e "${GREEN}🔄 MEMORY.md SYNC${NC}" +echo "========================================" + +if [ -n "$PROJECT_NAME" ]; then + # Sync einzelnes Projekt + sync_project "$PROJECT_NAME" +else + # Sync alle Projekte im Vault + echo "Synchronisiere alle Projekte..." + echo "" + + for project_dir in "$VAULT_DIR/projects"/*; do + if [ -d "$project_dir" ] && [ -f "$project_dir/MEMORY.md" ]; then + project_name=$(basename "$project_dir") + sync_project "$project_name" + fi + done +fi + +echo "" +echo -e "${GREEN}✓ Sync abgeschlossen${NC}" diff --git a/system/global-instructions.md b/system/global-instructions.md index d2c86c1..32aa104 100644 --- a/system/global-instructions.md +++ b/system/global-instructions.md @@ -1,6 +1,7 @@ --- ## name: global-instructions + type: system # IDENTITÄT & MISSION @@ -9,7 +10,7 @@ Du bist mein primärer KI-Agent. Dein Ziel ist es, unter Nutzung des "Claude-Vau # DER VAULT (DEINE QUELLE DER WAHRHEIT) -Du hast permanenten Zugriff auf mein Git-Repository unter `~/Work/claude-vault`. +Du hast permanenten Zugriff auf mein Git-Repository unter `~/Work/claude-vault`. 1. **Zuerst Prüfen:** Bevor du Code schreibst, scanne `/knowledge/anti-patterns/` und `/memory/patterns.md`. 2. **Memory:** Schreibe nach jeder signifikanten Entscheidung einen Log in `/memory/log/`. @@ -19,6 +20,17 @@ Du hast permanenten Zugriff auf mein Git-Repository unter `~/Work/claude-vault`. 6. **Agents:** Agenten in `/agents`. Nutze diese proaktiv. 7. **System:** Globale Regeln (diese Datei) in `/system`. 8. **Knowledge:** Dokumentationen und Präferenzen in `/knowledge`. +9. **Projects:** Projektspezifische Dateien in `/projects//`. + +# PROJEKT-SPIEGELUNG + +Projektspezifische Dateien aus `~/.claude/projects/` sollen im Vault gespiegelt werden: + +- **MEMORY.md**: `~/.claude/projects//memory/MEMORY.md` → `/projects//MEMORY.md` +- **CLAUDE.md**: Projektspezifische Instruktionen → `/projects//CLAUDE.md` +- **INSTRUCTIONS.md**: Alternative Instruktionsdatei → `/projects//INSTRUCTIONS.md` + +**Synchronisation:** Nutze `/scripts/sync-project-memory.sh` für bidirektionale Syncs. Das Script erkennt automatisch die neuere Version und synchronisiert entsprechend. # VERHALTENSREGELN diff --git a/vault-index.md b/vault-index.md index c83c959..5660e75 100644 --- a/vault-index.md +++ b/vault-index.md @@ -13,18 +13,18 @@ Dieses Repository ist das zentrale Gedächtnis und die Werkzeugkiste für meine ## 🛠️ SKILLS (Spezialisierte Fähigkeiten) *Pfad: `/skills/`* -### League-Planner Skills (lp-*) +### League-Planner Skills Spezialisiert auf das Django-basierte Liga-Planungssystem: | Skill | Beschreibung | Invocation | |-------|--------------|------------| -| **[lp-django-model](./skills/django-model/SKILL.md)** | Django 5.2 Models mit Fat Model Pattern, Custom Managers | `/lp-django-model` | -| **[lp-drf-api](./skills/drf-api/SKILL.md)** | DRF API Endpoints mit @api_view, drf-spectacular | `/lp-drf-api` | -| **[lp-celery-task](./skills/celery-task/SKILL.md)** | Celery 5.5 Tasks mit AbortableTask, Progress Tracking | `/lp-celery-task` | -| **[lp-permissions](./skills/permissions/SKILL.md)** | Multi-Tier Permissions mit Decorators, Session-based Access | `/lp-permissions` | -| **[lp-query-optimizer](./skills/query-optimizer/SKILL.md)** | N+1 Query Fixes, select_related/prefetch_related | `/lp-query-optimizer` | -| **[lp-solver](./skills/solver/SKILL.md)** | PuLP/Xpress MIP Solver Integration | `/lp-solver` | -| **[lp-testing](./skills/testing/SKILL.md)** | Django TestCase mit Multi-DB Support, CRUD Tags | `/lp-testing` | +| **[django-model](./skills/django-model/SKILL.md)** | Django 5.2 Models mit Fat Model Pattern, Custom Managers | `/django-model` | +| **[drf-api](./skills/drf-api/SKILL.md)** | DRF API Endpoints mit @api_view, drf-spectacular | `/drf-api` | +| **[celery-task](./skills/celery-task/SKILL.md)** | Celery 5.5 Tasks mit AbortableTask, Progress Tracking | `/celery-task` | +| **[permissions](./skills/permissions/SKILL.md)** | Multi-Tier Permissions mit Decorators, Session-based Access | `/permissions` | +| **[query-optimizer](./skills/query-optimizer/SKILL.md)** | N+1 Query Fixes, select_related/prefetch_related | `/query-optimizer` | +| **[solver](./skills/solver/SKILL.md)** | PuLP/Xpress MIP Solver Integration | `/solver` | +| **[testing](./skills/testing/SKILL.md)** | Django TestCase mit Multi-DB Support, CRUD Tags | `/testing` | ### Allgemeine Skills | Skill | Beschreibung | Invocation | @@ -62,6 +62,20 @@ Spezialisiert auf das Django-basierte Liga-Planungssystem: --- +## 📁 PROJECTS (Projekt-spezifische Kontexte) +*Pfad: `/projects/`* + +| Projekt | Beschreibung | +|---------|--------------| +| **[ligalytics-staffeleinteilung](./projects/ligalytics-staffeleinteilung/)** | Django Liga-Planungssystem: MEMORY.md, CLAUDE.md (optional) | + +Jedes Projekt-Verzeichnis kann enthalten: +- `MEMORY.md`: Auto-Memory für das Projekt (Sync via `sync-project-memory.sh`) +- `CLAUDE.md`: Projektspezifische Instruktionen +- `INSTRUCTIONS.md`: Alternative Instruktionsdatei + +--- + ## 🧠 MEMORY (Erfahrungen & Muster) *Pfad: `/memory/`* @@ -101,4 +115,27 @@ Der **Vault Janitor** (`/vault-janitor`) ist verantwortlich für: --- +## 🤖 SCRIPTS (Automatisierung) +*Pfad: `/scripts/`* + +| Script | Beschreibung | Usage | +|--------|--------------|-------| +| **[sync-project-memory.sh](./scripts/sync-project-memory.sh)** | Sync MEMORY.md zwischen Claude-Projekten und Vault | `~/Work/claude-vault/scripts/sync-project-memory.sh` | + +Siehe [scripts/README.md](./scripts/README.md) für Details. + +--- + +--- + +## 📊 CHANGELOG + +### 2026-02-04: Project Structure Refactoring +- ✨ Neuer `/projects/` Ordner für projektspezifische Dateien +- 🔄 Migration: `memory/projects/*.md` → `projects/*/MEMORY.md` +- 📝 Updated: `sync-project-memory.sh` für neue Struktur +- 📚 Erste Snapshots und Logs erstellt + +--- + *Letzte Aktualisierung: 2026-02-04*