This commit is contained in:
martin 2026-02-04 22:10:28 +01:00
parent 8f946beaac
commit ce49122b35
7 changed files with 427 additions and 9 deletions

View File

@ -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/<name>.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/<projekt-name>/`
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`

View File

@ -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/<projekt-name>/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)

View File

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

64
scripts/README.md Normal file
View File

@ -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/<normalized-path>/memory/MEMORY.md`
- **Vault-Backup**: `~/Work/claude-vault/memory/projects/<project-name>.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

180
scripts/sync-project-memory.sh Executable file
View File

@ -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/<project-name>/MEMORY.md
Claude: $PROJECTS_DIR/<normalized-path>/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}"

View File

@ -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-name>/`.
# PROJEKT-SPIEGELUNG
Projektspezifische Dateien aus `~/.claude/projects/` sollen im Vault gespiegelt werden:
- **MEMORY.md**: `~/.claude/projects/<normalized-path>/memory/MEMORY.md``/projects/<projekt-name>/MEMORY.md`
- **CLAUDE.md**: Projektspezifische Instruktionen → `/projects/<projekt-name>/CLAUDE.md`
- **INSTRUCTIONS.md**: Alternative Instruktionsdatei → `/projects/<projekt-name>/INSTRUCTIONS.md`
**Synchronisation:** Nutze `/scripts/sync-project-memory.sh` für bidirektionale Syncs. Das Script erkennt automatisch die neuere Version und synchronisiert entsprechend.
# VERHALTENSREGELN

View File

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