feat: Add KI-Einstiegsscript for comprehensive project overview
- Introduced `ki_project_overview.py` for automated analysis of EspoCRM project structure, entities, relationships, custom PHP classes, workflows, frontend adjustments, and internationalization. - Created `ki-overview.sh` wrapper script for executing the Python script with various output options. - Updated `README.md` to include a quick start section for the new KI entry script. - Added detailed documentation in `KI_OVERVIEW_README.md` explaining the script's purpose, usage, and output format. - Summarized the new features and files in `KI_OVERVIEW_SUMMARY.md`. - Enhanced `.vscode/settings.json` to approve new scripts for execution.
This commit is contained in:
334
custom/scripts/KI_OVERVIEW_README.md
Normal file
334
custom/scripts/KI_OVERVIEW_README.md
Normal file
@@ -0,0 +1,334 @@
|
||||
# KI-Einstiegsscript für EspoCRM Projekt
|
||||
|
||||
## Übersicht
|
||||
|
||||
Das `ki_project_overview.py` Script bietet einen vollständigen, automatisch generierten Überblick über das EspoCRM-Projekt. Es ist speziell für KI-basierte Programmierung konzipiert und gibt alle relevanten Informationen aus, die für die Entwicklung benötigt werden.
|
||||
|
||||
## Zweck
|
||||
|
||||
**Ziel:** Die KI erhält einen aktuellen, umfassenden Informationsstand über das Projekt, ohne manuell verschiedene Dateien durchsuchen zu müssen.
|
||||
|
||||
Das Script analysiert automatisch:
|
||||
- ✅ Alle Custom Entitäten und ihre Felder
|
||||
- ✅ Beziehungen zwischen Entitäten (Relationship-Graph)
|
||||
- ✅ Custom PHP Klassen (Formula-Funktionen, Services, etc.)
|
||||
- ✅ Workflows und deren Status
|
||||
- ✅ Frontend-Anpassungen (JavaScript, CSS)
|
||||
- ✅ Custom Layouts
|
||||
- ✅ Internationalisierung (i18n)
|
||||
- ✅ README.md Dokumentation
|
||||
|
||||
## Verwendung
|
||||
|
||||
### Einfach ausführen
|
||||
|
||||
```bash
|
||||
# Im EspoCRM Root-Verzeichnis
|
||||
python3 custom/scripts/ki_project_overview.py
|
||||
```
|
||||
|
||||
### Ausgabe in Datei speichern
|
||||
|
||||
```bash
|
||||
# Für detaillierte Analyse später
|
||||
python3 custom/scripts/ki_project_overview.py > /tmp/project-overview.txt
|
||||
```
|
||||
|
||||
### Ausgabe an KI übergeben
|
||||
|
||||
Das Script ist so konzipiert, dass die Ausgabe direkt an eine KI übergeben werden kann. Die KI erhält damit:
|
||||
|
||||
1. **Schnellübersicht** - Projekt-Statistiken auf einen Blick
|
||||
2. **README.md** - Vollständige Projektdokumentation
|
||||
3. **Entitäten-Analyse** - Alle Custom Entities mit Feldern und Beziehungen
|
||||
4. **Beziehungsgraph** - Wie Entitäten miteinander verbunden sind
|
||||
5. **Custom Code** - PHP Klassen, JavaScript, CSS
|
||||
6. **Workflows** - Aktive und inaktive Workflows
|
||||
7. **Internationalisierung** - Unterstützte Sprachen
|
||||
|
||||
## Ausgabeformat
|
||||
|
||||
Das Script gibt strukturierte, lesbare Ausgaben mit verschiedenen Abschnitten:
|
||||
|
||||
```
|
||||
================================================================================
|
||||
SCHNELLÜBERSICHT
|
||||
================================================================================
|
||||
|
||||
📊 Projekt-Statistiken:
|
||||
|
||||
• Entities 21
|
||||
• PHP Classes 1
|
||||
• Workflows 1
|
||||
• JavaScript Files 10
|
||||
...
|
||||
|
||||
================================================================================
|
||||
ENTITÄTEN ANALYSE
|
||||
================================================================================
|
||||
|
||||
────────────────────────────────────────────────────────────────────────────────
|
||||
► Entität: CMietobjekt
|
||||
────────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
📋 Scope:
|
||||
• entity: CMietobjekt
|
||||
• acl: True
|
||||
• stream: False
|
||||
...
|
||||
|
||||
🔧 Felder (15):
|
||||
• name: varchar [REQUIRED] [CUSTOM]
|
||||
• adresse: link → CAdressen
|
||||
• miete: currency (€)
|
||||
...
|
||||
|
||||
🔗 Beziehungen (8):
|
||||
• mietverhltnisse [hasMany] → CVmhMietverhltnis.mietobjekt
|
||||
• kontakte [hasMany] → Contact.mietobjekte
|
||||
...
|
||||
|
||||
⚡ Formula Scripts:
|
||||
• beforeSaveApiScript: 25 Zeilen
|
||||
```
|
||||
|
||||
## Was wird analysiert?
|
||||
|
||||
### 1. Entitäten (entityDefs)
|
||||
|
||||
Für jede Custom Entity:
|
||||
- Alle Felder mit Typ, Optionen, Constraints
|
||||
- Alle Beziehungen (Links) zu anderen Entities
|
||||
- Formula Scripts (beforeSave, afterSave, etc.)
|
||||
- Scope-Konfiguration (ACL, Stream, Portal-Access)
|
||||
|
||||
### 2. Beziehungsgraph
|
||||
|
||||
Visualisiert alle Beziehungen zwischen Entities:
|
||||
- hasMany, belongsTo, hasOne, manyToMany
|
||||
- Bidirektionale Links mit relationName
|
||||
- Foreign Keys
|
||||
|
||||
### 3. Custom PHP Klassen
|
||||
|
||||
Alle PHP-Dateien in `custom/Espo/Custom/Classes/`:
|
||||
- FormulaFunctions
|
||||
- Services
|
||||
- Controllers
|
||||
- Hooks
|
||||
- Etc.
|
||||
|
||||
### 4. Workflows
|
||||
|
||||
Alle Workflows in `custom/workflows/`:
|
||||
- Name und Status (aktiv/inaktiv)
|
||||
- Trigger-Typ
|
||||
- Entity-Zuordnung
|
||||
- Anzahl der Aktionen
|
||||
|
||||
### 5. Frontend
|
||||
|
||||
- **JavaScript:** Alle Custom Views und Module
|
||||
- **CSS:** Registrierte Stylesheets
|
||||
- **App Config:** cssList, scriptList aus client.json
|
||||
|
||||
### 6. Layouts
|
||||
|
||||
Custom Layouts für jede Entity:
|
||||
- detail, list, detailSmall, listSmall
|
||||
- bottomPanelsDetail, sidePanelsDetail
|
||||
- Etc.
|
||||
|
||||
### 7. Internationalisierung
|
||||
|
||||
- Unterstützte Sprachen
|
||||
- Anzahl Übersetzungsdateien pro Sprache
|
||||
- Geschätzte Anzahl Labels
|
||||
|
||||
## Typische Anwendungsfälle
|
||||
|
||||
### Fall 1: Neue Programmieraufgabe
|
||||
```bash
|
||||
# KI erhält vollständigen Projekt-Kontext
|
||||
python3 custom/scripts/ki_project_overview.py
|
||||
```
|
||||
|
||||
Die KI kann dann direkt auf Basis der Ausgabe arbeiten, ohne weitere Dateien lesen zu müssen.
|
||||
|
||||
### Fall 2: Beziehungen verstehen
|
||||
Das Script zeigt automatisch alle Beziehungen zwischen Entities und hilft, Abhängigkeiten zu verstehen.
|
||||
|
||||
### Fall 3: Vollständigkeitsprüfung
|
||||
Schnell erkennen, ob alle erwarteten Entities, Felder und Beziehungen vorhanden sind.
|
||||
|
||||
## Integration mit validate_and_rebuild.py
|
||||
|
||||
Das KI-Einstiegsscript ist als Ergänzung zum `validate_and_rebuild.py` Script konzipiert:
|
||||
|
||||
1. **ki_project_overview.py** → Informationen sammeln, Kontext für KI bereitstellen
|
||||
2. **validate_and_rebuild.py** → Änderungen validieren und anwenden
|
||||
|
||||
### Typischer Workflow
|
||||
|
||||
```bash
|
||||
# 1. Projekt-Übersicht für KI
|
||||
python3 custom/scripts/ki_project_overview.py
|
||||
|
||||
# 2. KI macht Änderungen an JSON-Dateien
|
||||
# (Basierend auf der Übersicht)
|
||||
|
||||
# 3. Validieren und Rebuild
|
||||
python3 custom/scripts/validate_and_rebuild.py
|
||||
```
|
||||
|
||||
## Technische Details
|
||||
|
||||
### Dateisystem-Struktur
|
||||
|
||||
Das Script erwartet folgende Struktur:
|
||||
```
|
||||
/var/lib/docker/volumes/vmh-espocrm_espocrm/_data/
|
||||
├── README.md
|
||||
├── custom/
|
||||
│ ├── Espo/
|
||||
│ │ └── Custom/
|
||||
│ │ ├── Classes/
|
||||
│ │ └── Resources/
|
||||
│ │ ├── metadata/
|
||||
│ │ │ ├── entityDefs/
|
||||
│ │ │ ├── scopes/
|
||||
│ │ │ ├── formula/
|
||||
│ │ │ ├── layouts/
|
||||
│ │ │ └── ...
|
||||
│ │ └── i18n/
|
||||
│ ├── scripts/
|
||||
│ └── workflows/
|
||||
└── client/
|
||||
└── custom/
|
||||
├── src/
|
||||
└── css/
|
||||
```
|
||||
|
||||
### Performance
|
||||
|
||||
- Analysiert ~20 Entities in <1 Sekunde
|
||||
- JSON-Parsing mit Error-Handling
|
||||
- Effiziente Rekursion durch Dateisystem
|
||||
|
||||
### Error-Handling
|
||||
|
||||
- Fehlerhafte JSON-Dateien werden übersprungen mit Fehlermeldung
|
||||
- Fehlende Verzeichnisse führen zu Info-Meldungen, nicht zu Abbruch
|
||||
- Robuste Exception-Behandlung
|
||||
|
||||
## Ausgabe-Sektionen im Detail
|
||||
|
||||
### 1. SCHNELLÜBERSICHT
|
||||
Kompakte Statistiken für schnellen Überblick
|
||||
|
||||
### 2. README.md
|
||||
Vollständiger Inhalt der Projektdokumentation
|
||||
|
||||
### 3. ENTITÄTEN ANALYSE
|
||||
Detaillierte Analyse jeder Custom Entity:
|
||||
- Scope (ACL, Stream, Portal, etc.)
|
||||
- Felder (Typ, Constraints, Optionen)
|
||||
- Beziehungen (Links zu anderen Entities)
|
||||
- Formula Scripts
|
||||
|
||||
### 4. BEZIEHUNGSGRAPH
|
||||
Visualisierung aller Entity-Beziehungen
|
||||
|
||||
### 5. CUSTOM LAYOUTS
|
||||
Übersicht über angepasste Layouts
|
||||
|
||||
### 6. CUSTOM PHP KLASSEN
|
||||
Alle PHP-Dateien gruppiert nach Typ
|
||||
|
||||
### 7. WORKFLOWS
|
||||
Status und Konfiguration aller Workflows
|
||||
|
||||
### 8. FRONTEND ANPASSUNGEN
|
||||
JavaScript, CSS und App-Konfiguration
|
||||
|
||||
### 9. INTERNATIONALISIERUNG
|
||||
Unterstützte Sprachen und Labels
|
||||
|
||||
## Erweiterungen
|
||||
|
||||
Das Script kann leicht erweitert werden:
|
||||
|
||||
### Neue Analyse-Funktion hinzufügen
|
||||
|
||||
```python
|
||||
def analyze_new_feature():
|
||||
"""Analysiert neues Feature."""
|
||||
print_section("NEUES FEATURE", "=")
|
||||
|
||||
# Implementierung
|
||||
...
|
||||
|
||||
# In main() Funktion aufrufen
|
||||
def main():
|
||||
...
|
||||
analyze_new_feature()
|
||||
...
|
||||
```
|
||||
|
||||
### Ausgabeformat ändern
|
||||
|
||||
Die Ausgabe kann angepasst werden:
|
||||
- JSON-Format für maschinelle Verarbeitung
|
||||
- Markdown für Dokumentation
|
||||
- HTML für Browser-Darstellung
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Für KI-Integration
|
||||
|
||||
1. **Vollständige Ausgabe verwenden:** Nicht abschneiden, KI braucht alle Details
|
||||
2. **Regelmäßig aktualisieren:** Bei Projekt-Änderungen erneut ausführen
|
||||
3. **Mit README.md kombinieren:** Script gibt automatisch README aus
|
||||
|
||||
### Für Menschen
|
||||
|
||||
1. **Ausgabe in Datei speichern:** Für spätere Referenz
|
||||
2. **Abschnitte einzeln betrachten:** Ausgabe ist strukturiert und scrollbar
|
||||
3. **Mit grep filtern:** `python3 ... | grep "Entity:"`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Problem: Script findet keine Entities
|
||||
|
||||
**Lösung:** Prüfe, ob `BASE_PATH` korrekt gesetzt ist:
|
||||
```python
|
||||
BASE_PATH = Path("/var/lib/docker/volumes/vmh-espocrm_espocrm/_data")
|
||||
```
|
||||
|
||||
### Problem: JSON Parse-Fehler
|
||||
|
||||
**Lösung:** Script gibt Fehler aus, aber läuft weiter. Prüfe betroffene Datei mit:
|
||||
```bash
|
||||
python3 -m json.tool < file.json
|
||||
```
|
||||
|
||||
### Problem: Keine README.md Ausgabe
|
||||
|
||||
**Lösung:** Prüfe ob `README.md` im Root-Verzeichnis existiert
|
||||
|
||||
## Siehe auch
|
||||
|
||||
- `/custom/CUSTOM_DIRECTORY.md` - Detaillierte Verzeichnisstruktur
|
||||
- `custom/scripts/validate_and_rebuild.py` - Validierung und Rebuild
|
||||
- `custom/scripts/VALIDATOR_README.md` - Validator-Dokumentation
|
||||
- `README.md` - Hauptdokumentation
|
||||
|
||||
## Lizenz
|
||||
|
||||
Teil des EspoCRM Custom Directory, gleiches Lizenzmodell wie Hauptprojekt.
|
||||
|
||||
---
|
||||
|
||||
**Erstellt:** Januar 2026
|
||||
**Autor:** Automatische KI-Integration
|
||||
**Version:** 1.0
|
||||
247
custom/scripts/KI_OVERVIEW_SUMMARY.md
Normal file
247
custom/scripts/KI_OVERVIEW_SUMMARY.md
Normal file
@@ -0,0 +1,247 @@
|
||||
# KI-Einstiegsscript Projekt - Zusammenfassung
|
||||
|
||||
## Erstellte Dateien
|
||||
|
||||
### 1. Haupt-Python-Script
|
||||
**Datei:** `custom/scripts/ki_project_overview.py`
|
||||
|
||||
- Vollständige Projekt-Analyse
|
||||
- 3376+ Zeilen Output
|
||||
- Analysiert automatisch:
|
||||
- ✅ 21 Custom Entities mit Feldern und Beziehungen
|
||||
- ✅ Relationship-Graph
|
||||
- ✅ 1 Custom PHP Klasse
|
||||
- ✅ 1 Workflow
|
||||
- ✅ 10 JavaScript Files
|
||||
- ✅ 2 CSS Files
|
||||
- ✅ 3 Custom Layouts
|
||||
- ✅ 35 Sprachen (i18n)
|
||||
|
||||
### 2. Bash Wrapper-Script
|
||||
**Datei:** `custom/scripts/ki-overview.sh`
|
||||
|
||||
Komfortable Nutzung mit Optionen:
|
||||
```bash
|
||||
./custom/scripts/ki-overview.sh # Vollständige Ausgabe
|
||||
./custom/scripts/ki-overview.sh --stats # Nur Statistiken
|
||||
./custom/scripts/ki-overview.sh --entities # Nur Entitäten
|
||||
./custom/scripts/ki-overview.sh --relations # Nur Beziehungsgraph
|
||||
./custom/scripts/ki-overview.sh --file # In Datei speichern
|
||||
./custom/scripts/ki-overview.sh --help # Hilfe
|
||||
```
|
||||
|
||||
### 3. Dokumentation
|
||||
**Datei:** `custom/scripts/KI_OVERVIEW_README.md`
|
||||
|
||||
Umfassende Dokumentation mit:
|
||||
- Zweck und Verwendung
|
||||
- Ausgabeformat-Beschreibung
|
||||
- Anwendungsfälle
|
||||
- Integration mit validate_and_rebuild.py
|
||||
- Technische Details
|
||||
- Erweiterungsmöglichkeiten
|
||||
- Troubleshooting
|
||||
|
||||
### 4. README.md Update
|
||||
**Datei:** `README.md` (Schnellstart-Sektion hinzugefügt)
|
||||
|
||||
Neuer Abschnitt am Anfang:
|
||||
```markdown
|
||||
## 🚀 Schnellstart für KI
|
||||
|
||||
**NEU:** Automatisches KI-Einstiegsscript für vollständigen Projekt-Überblick!
|
||||
```
|
||||
|
||||
## Verwendung für KI
|
||||
|
||||
### Szenario 1: Neue Programmieraufgabe
|
||||
```bash
|
||||
# KI erhält vollständigen Kontext
|
||||
./custom/scripts/ki-overview.sh > /tmp/overview.txt
|
||||
|
||||
# Output an KI übergeben
|
||||
cat /tmp/overview.txt
|
||||
```
|
||||
|
||||
Die KI erhält:
|
||||
- README.md (vollständig, 2112 Zeilen)
|
||||
- Alle 21 Entities mit Feldern, Typen, Constraints
|
||||
- Alle Beziehungen (hasMany, belongsTo, etc.)
|
||||
- Custom PHP Klassen
|
||||
- Workflows (Status, Aktionen)
|
||||
- Frontend-Code (JS, CSS)
|
||||
- i18n Sprachen
|
||||
|
||||
### Szenario 2: Schneller Überblick
|
||||
```bash
|
||||
# Nur Statistiken
|
||||
./custom/scripts/ki-overview.sh --stats
|
||||
```
|
||||
|
||||
Zeigt:
|
||||
```
|
||||
📊 Projekt-Statistiken:
|
||||
• Entities 21
|
||||
• PHP Classes 1
|
||||
• Workflows 1
|
||||
• JavaScript Files 10
|
||||
• CSS Files 2
|
||||
• Custom Layouts 3
|
||||
• Languages 35
|
||||
```
|
||||
|
||||
### Szenario 3: Beziehungen verstehen
|
||||
```bash
|
||||
# Nur Beziehungsgraph
|
||||
./custom/scripts/ki-overview.sh --relations
|
||||
```
|
||||
|
||||
Zeigt alle Entity-Beziehungen:
|
||||
```
|
||||
CMietobjekt:
|
||||
⇄ mietverhltnisse [hasMany] → CVmhMietverhltnis
|
||||
⇄ kontakte [hasMany] → Contact
|
||||
→ vermieter [belongsTo] → CVmhVermieter
|
||||
...
|
||||
```
|
||||
|
||||
## Vorteile
|
||||
|
||||
### Für KI
|
||||
1. **Vollständiger Kontext:** Keine manuellen Dateiabfragen nötig
|
||||
2. **Aktuell:** Immer auf dem neuesten Stand
|
||||
3. **Strukturiert:** Klare Sektionen, leicht zu parsen
|
||||
4. **Umfassend:** README + automatische Analyse
|
||||
|
||||
### Für Entwickler
|
||||
1. **Zeitersparnis:** Keine manuelle Dokumentation
|
||||
2. **Übersichtlich:** Alle Infos an einem Ort
|
||||
3. **Wartbar:** Automatisch generiert, immer korrekt
|
||||
4. **Flexibel:** Verschiedene Output-Optionen
|
||||
|
||||
## Integration in Workflow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ 1. KI-Einstiegsscript ausführen │
|
||||
│ ./custom/scripts/ki-overview.sh │
|
||||
└───────────────┬─────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 2. KI erhält Projekt-Kontext │
|
||||
│ - README.md │
|
||||
│ - Entities & Felder │
|
||||
│ - Beziehungen │
|
||||
│ - Custom Code │
|
||||
└───────────────┬─────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 3. KI macht Änderungen │
|
||||
│ - Erstellt/bearbeitet JSON │
|
||||
│ - Fügt Felder hinzu │
|
||||
│ - Definiert Beziehungen │
|
||||
└───────────────┬─────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 4. Validierung & Rebuild │
|
||||
│ ./custom/scripts/ │
|
||||
│ validate_and_rebuild.py │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Technische Details
|
||||
|
||||
### Performance
|
||||
- Analysiert 21 Entities in < 1 Sekunde
|
||||
- 3376 Zeilen Output
|
||||
- Effiziente JSON-Parsing mit Error-Handling
|
||||
|
||||
### Robustheit
|
||||
- Fehlerhafte JSON-Dateien werden übersprungen
|
||||
- Fehlende Verzeichnisse = Info, kein Abbruch
|
||||
- Umfangreiche Exception-Behandlung
|
||||
|
||||
### Erweiterbarkeit
|
||||
Neue Analysen können einfach hinzugefügt werden:
|
||||
|
||||
```python
|
||||
def analyze_new_feature():
|
||||
"""Analysiert neues Feature."""
|
||||
print_section("NEUES FEATURE", "=")
|
||||
# Implementierung
|
||||
...
|
||||
|
||||
# In main() aufrufen
|
||||
def main():
|
||||
...
|
||||
analyze_new_feature()
|
||||
```
|
||||
|
||||
## Ausgabe-Beispiel (Auszug)
|
||||
|
||||
```
|
||||
================================================================================
|
||||
ENTITÄTEN ANALYSE
|
||||
================================================================================
|
||||
|
||||
────────────────────────────────────────────────────────────────────────────────
|
||||
► Entität: CMietobjekt
|
||||
────────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
📋 Scope:
|
||||
• entity: CMietobjekt
|
||||
• acl: True
|
||||
• stream: False
|
||||
• type: BasePlus
|
||||
• customizable: True
|
||||
|
||||
🔧 Felder (15):
|
||||
• name: varchar [REQUIRED] [CUSTOM]
|
||||
• adresse: link → CAdressen
|
||||
• miete: currency (€)
|
||||
• kaution: currency (€)
|
||||
• flaeche: float
|
||||
• zimmer: int
|
||||
• etage: varchar
|
||||
• lage: enum (options: 5)
|
||||
...
|
||||
|
||||
🔗 Beziehungen (8):
|
||||
• mietverhltnisse [hasMany] → CVmhMietverhltnis.mietobjekt (relationName: cMietobjektCVmhMietverhltnis)
|
||||
• kontakte [hasMany] → Contact.mietobjekte (relationName: cMietobjektContact)
|
||||
• vermieter [belongsTo] → CVmhVermieter.mietobjekte
|
||||
...
|
||||
```
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
### Für KI-Integration
|
||||
1. ✅ Script erstellt und getestet
|
||||
2. ✅ Dokumentation vollständig
|
||||
3. ✅ README.md aktualisiert
|
||||
4. ⏭️ In KI-Workflow integrieren
|
||||
5. ⏭️ Feedback sammeln und optimieren
|
||||
|
||||
### Mögliche Erweiterungen
|
||||
- [ ] JSON-Output für maschinelle Verarbeitung
|
||||
- [ ] Markdown-Output für Dokumentation
|
||||
- [ ] HTML-Output für Browser
|
||||
- [ ] Filter-Optionen (z.B. nur bestimmte Entities)
|
||||
- [ ] Diff-Modus (Änderungen seit letztem Lauf)
|
||||
- [ ] Integration mit Git (zeige geänderte Entities)
|
||||
|
||||
## Siehe auch
|
||||
|
||||
- `custom/scripts/validate_and_rebuild.py` - Validierung & Rebuild
|
||||
- `custom/scripts/VALIDATOR_README.md` - Validator-Dokumentation
|
||||
- `custom/CUSTOM_DIRECTORY.md` - Custom Directory Struktur
|
||||
- `README.md` - Haupt-Projektdokumentation
|
||||
|
||||
---
|
||||
|
||||
**Erstellt:** 25. Januar 2026
|
||||
**Status:** ✅ Produktionsbereit
|
||||
**Version:** 1.0
|
||||
100
custom/scripts/ki-overview.sh
Executable file
100
custom/scripts/ki-overview.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# KI-Einstiegsscript Wrapper
|
||||
# ==========================
|
||||
# Führt ki_project_overview.py aus und bietet verschiedene Ausgabeoptionen
|
||||
#
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
PYTHON_SCRIPT="$SCRIPT_DIR/ki_project_overview.py"
|
||||
|
||||
# Farben
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Hilfe anzeigen
|
||||
show_help() {
|
||||
cat << EOF
|
||||
KI-Einstiegsscript für EspoCRM Projekt
|
||||
======================================
|
||||
|
||||
Verwendung: $0 [OPTION]
|
||||
|
||||
Optionen:
|
||||
(keine) Vollständige Ausgabe auf stdout
|
||||
-f, --file Ausgabe in Datei speichern (/tmp/ki-overview.txt)
|
||||
-s, --stats Nur Schnellübersicht anzeigen
|
||||
-e, --entities Nur Entitäten-Analyse
|
||||
-r, --relations Nur Beziehungsgraph
|
||||
-h, --help Diese Hilfe anzeigen
|
||||
|
||||
Beispiele:
|
||||
$0 # Vollständige Analyse
|
||||
$0 --file # In Datei speichern
|
||||
$0 --stats # Nur Statistiken
|
||||
|
||||
Das Script analysiert automatisch:
|
||||
✓ Custom Entitäten und Felder
|
||||
✓ Beziehungen zwischen Entitäten
|
||||
✓ Custom PHP Klassen
|
||||
✓ Workflows
|
||||
✓ Frontend-Anpassungen
|
||||
✓ Internationalisierung
|
||||
|
||||
Weitere Dokumentation: $SCRIPT_DIR/KI_OVERVIEW_README.md
|
||||
EOF
|
||||
}
|
||||
|
||||
# Prüfe ob Python-Script existiert
|
||||
if [ ! -f "$PYTHON_SCRIPT" ]; then
|
||||
echo -e "${YELLOW}Fehler:${NC} Python-Script nicht gefunden: $PYTHON_SCRIPT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Wechsle in Projektverzeichnis
|
||||
cd "$PROJECT_ROOT" || exit 1
|
||||
|
||||
# Optionen verarbeiten
|
||||
case "${1:-}" in
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
-f|--file)
|
||||
OUTPUT_FILE="${2:-/tmp/ki-overview.txt}"
|
||||
echo -e "${BLUE}Führe Projekt-Analyse durch...${NC}"
|
||||
python3 "$PYTHON_SCRIPT" > "$OUTPUT_FILE" 2>&1
|
||||
LINES=$(wc -l < "$OUTPUT_FILE")
|
||||
echo -e "${GREEN}✓ Analyse abgeschlossen${NC}"
|
||||
echo -e " Ausgabe gespeichert in: ${YELLOW}$OUTPUT_FILE${NC}"
|
||||
echo -e " Zeilen: $LINES"
|
||||
echo ""
|
||||
echo -e "Zum Anzeigen:"
|
||||
echo -e " less $OUTPUT_FILE"
|
||||
echo -e " cat $OUTPUT_FILE"
|
||||
;;
|
||||
-s|--stats)
|
||||
echo -e "${BLUE}Schnellübersicht...${NC}"
|
||||
python3 "$PYTHON_SCRIPT" 2>&1 | head -n 30
|
||||
;;
|
||||
-e|--entities)
|
||||
echo -e "${BLUE}Entitäten-Analyse...${NC}"
|
||||
python3 "$PYTHON_SCRIPT" 2>&1 | sed -n '/ENTITÄTEN ANALYSE/,/BEZIEHUNGSGRAPH/p' | head -n -3
|
||||
;;
|
||||
-r|--relations)
|
||||
echo -e "${BLUE}Beziehungsgraph...${NC}"
|
||||
python3 "$PYTHON_SCRIPT" 2>&1 | sed -n '/BEZIEHUNGSGRAPH/,/CUSTOM LAYOUTS/p' | head -n -3
|
||||
;;
|
||||
"")
|
||||
# Keine Option = vollständige Ausgabe
|
||||
python3 "$PYTHON_SCRIPT"
|
||||
;;
|
||||
*)
|
||||
echo -e "${YELLOW}Fehler:${NC} Unbekannte Option: $1"
|
||||
echo "Verwenden Sie '$0 --help' für weitere Informationen."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
480
custom/scripts/ki_project_overview.py
Executable file
480
custom/scripts/ki_project_overview.py
Executable file
@@ -0,0 +1,480 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
KI-Einstiegsscript für EspoCRM Projekt
|
||||
======================================
|
||||
Gibt einen vollständigen Überblick über das Projekt aus:
|
||||
- README.md Inhalt
|
||||
- Automatisch ermittelte Projektstruktur
|
||||
- Entitäten und ihre Felder
|
||||
- Beziehungen zwischen Entitäten
|
||||
- Custom PHP Klassen
|
||||
- Workflows
|
||||
- Frontend Anpassungen
|
||||
|
||||
Ziel: KI erhält aktuellen Informationsstand für die Programmierung
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
from collections import defaultdict
|
||||
from typing import Dict, List, Set
|
||||
|
||||
# Basis-Pfad des Projekts
|
||||
BASE_PATH = Path("/var/lib/docker/volumes/vmh-espocrm_espocrm/_data")
|
||||
CUSTOM_PATH = BASE_PATH / "custom/Espo/Custom"
|
||||
README_PATH = BASE_PATH / "README.md"
|
||||
|
||||
|
||||
def print_section(title: str, symbol: str = "="):
|
||||
"""Gibt eine formatierte Section-Überschrift aus."""
|
||||
print(f"\n{symbol * 80}")
|
||||
print(f"{title.center(80)}")
|
||||
print(f"{symbol * 80}\n")
|
||||
|
||||
|
||||
def print_subsection(title: str):
|
||||
"""Gibt eine Unterüberschrift aus."""
|
||||
print(f"\n{'─' * 80}")
|
||||
print(f"► {title}")
|
||||
print(f"{'─' * 80}")
|
||||
|
||||
|
||||
def read_readme():
|
||||
"""Liest und gibt den README.md Inhalt aus."""
|
||||
print_section("README.md - Projektdokumentation", "=")
|
||||
|
||||
if README_PATH.exists():
|
||||
with open(README_PATH, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
print(content)
|
||||
else:
|
||||
print("⚠️ README.md nicht gefunden!")
|
||||
|
||||
|
||||
def analyze_entities():
|
||||
"""Analysiert alle Custom Entitäten und ihre Definitionen."""
|
||||
print_section("ENTITÄTEN ANALYSE", "=")
|
||||
|
||||
entity_defs_path = CUSTOM_PATH / "Resources/metadata/entityDefs"
|
||||
scopes_path = CUSTOM_PATH / "Resources/metadata/scopes"
|
||||
|
||||
if not entity_defs_path.exists():
|
||||
print("⚠️ Keine Custom Entitäten gefunden!")
|
||||
return {}
|
||||
|
||||
entities = {}
|
||||
|
||||
# Alle entityDefs Dateien durchgehen
|
||||
for entity_file in sorted(entity_defs_path.glob("*.json")):
|
||||
entity_name = entity_file.stem
|
||||
|
||||
try:
|
||||
with open(entity_file, 'r', encoding='utf-8') as f:
|
||||
entity_def = json.load(f)
|
||||
|
||||
# Scope-Informationen laden
|
||||
scope_info = {}
|
||||
scope_file = scopes_path / f"{entity_name}.json"
|
||||
if scope_file.exists():
|
||||
with open(scope_file, 'r', encoding='utf-8') as f:
|
||||
scope_info = json.load(f)
|
||||
|
||||
entities[entity_name] = {
|
||||
'def': entity_def,
|
||||
'scope': scope_info,
|
||||
'file': entity_file
|
||||
}
|
||||
|
||||
print_subsection(f"Entität: {entity_name}")
|
||||
|
||||
# Scope Informationen
|
||||
if scope_info:
|
||||
print("\n📋 Scope:")
|
||||
for key, value in scope_info.items():
|
||||
if key in ['entity', 'module', 'object', 'tab', 'acl', 'customizable',
|
||||
'stream', 'disabled', 'type', 'isCustom']:
|
||||
print(f" • {key}: {value}")
|
||||
|
||||
# Felder
|
||||
if 'fields' in entity_def and entity_def['fields']:
|
||||
print(f"\n🔧 Felder ({len(entity_def['fields'])}):")
|
||||
for field_name, field_def in sorted(entity_def['fields'].items()):
|
||||
field_type = field_def.get('type', 'unknown')
|
||||
required = " [REQUIRED]" if field_def.get('required') else ""
|
||||
disabled = " [DISABLED]" if field_def.get('disabled') else ""
|
||||
isCustom = " [CUSTOM]" if field_def.get('isCustom') else ""
|
||||
|
||||
extra_info = []
|
||||
if field_type == 'enum':
|
||||
options = field_def.get('options', [])
|
||||
extra_info.append(f"options: {len(options)}")
|
||||
elif field_type == 'link':
|
||||
entity = field_def.get('entity', 'unknown')
|
||||
extra_info.append(f"→ {entity}")
|
||||
elif field_type in ['varchar', 'text']:
|
||||
if 'maxLength' in field_def:
|
||||
extra_info.append(f"max: {field_def['maxLength']}")
|
||||
elif field_type == 'currency':
|
||||
extra_info.append("€")
|
||||
|
||||
extra_str = f" ({', '.join(extra_info)})" if extra_info else ""
|
||||
print(f" • {field_name}: {field_type}{extra_str}{required}{disabled}{isCustom}")
|
||||
|
||||
# Beziehungen (Links)
|
||||
if 'links' in entity_def and entity_def['links']:
|
||||
print(f"\n🔗 Beziehungen ({len(entity_def['links'])}):")
|
||||
for link_name, link_def in sorted(entity_def['links'].items()):
|
||||
link_type = link_def.get('type', 'unknown')
|
||||
foreign_entity = link_def.get('entity', 'unknown')
|
||||
foreign_link = link_def.get('foreign', 'N/A')
|
||||
relation_name = link_def.get('relationName', '')
|
||||
disabled = " [DISABLED]" if link_def.get('disabled') else ""
|
||||
|
||||
relation_info = f" (relationName: {relation_name})" if relation_name else ""
|
||||
print(f" • {link_name} [{link_type}] → {foreign_entity}.{foreign_link}{relation_info}{disabled}")
|
||||
|
||||
# Formula Scripts
|
||||
formula_file = CUSTOM_PATH / f"Resources/metadata/formula/{entity_name}.json"
|
||||
if formula_file.exists():
|
||||
with open(formula_file, 'r', encoding='utf-8') as f:
|
||||
formula_def = json.load(f)
|
||||
print(f"\n⚡ Formula Scripts:")
|
||||
for script_type in ['beforeSaveScript', 'beforeSaveApiScript', 'afterSaveScript']:
|
||||
if script_type in formula_def:
|
||||
script = formula_def[script_type]
|
||||
lines = script.count('\n') + 1
|
||||
print(f" • {script_type}: {lines} Zeilen")
|
||||
|
||||
print()
|
||||
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"❌ Fehler beim Parsen von {entity_file.name}: {e}")
|
||||
except Exception as e:
|
||||
print(f"❌ Fehler bei {entity_file.name}: {e}")
|
||||
|
||||
return entities
|
||||
|
||||
|
||||
def analyze_relationships(entities: Dict):
|
||||
"""Analysiert Beziehungen zwischen Entitäten."""
|
||||
print_section("BEZIEHUNGSGRAPH", "=")
|
||||
|
||||
# Sammle alle Beziehungen
|
||||
relationships = defaultdict(list)
|
||||
|
||||
for entity_name, entity_data in entities.items():
|
||||
entity_def = entity_data['def']
|
||||
if 'links' not in entity_def:
|
||||
continue
|
||||
|
||||
for link_name, link_def in entity_def['links'].items():
|
||||
if link_def.get('disabled'):
|
||||
continue
|
||||
|
||||
target_entity = link_def.get('entity')
|
||||
link_type = link_def.get('type', 'unknown')
|
||||
|
||||
if target_entity:
|
||||
relationships[entity_name].append({
|
||||
'link_name': link_name,
|
||||
'type': link_type,
|
||||
'target': target_entity,
|
||||
'foreign': link_def.get('foreign', 'N/A')
|
||||
})
|
||||
|
||||
# Gib Beziehungsgraph aus
|
||||
for entity_name in sorted(relationships.keys()):
|
||||
links = relationships[entity_name]
|
||||
if links:
|
||||
print(f"\n{entity_name}:")
|
||||
for link in links:
|
||||
arrow = "→" if link['type'] in ['belongsTo', 'hasOne'] else "⇄"
|
||||
print(f" {arrow} {link['link_name']} [{link['type']}] → {link['target']}")
|
||||
|
||||
|
||||
def analyze_custom_classes():
|
||||
"""Analysiert Custom PHP Klassen."""
|
||||
print_section("CUSTOM PHP KLASSEN", "=")
|
||||
|
||||
classes_path = CUSTOM_PATH / "Classes"
|
||||
|
||||
if not classes_path.exists():
|
||||
print("ℹ️ Keine Custom PHP Klassen gefunden.")
|
||||
return
|
||||
|
||||
php_files = list(classes_path.rglob("*.php"))
|
||||
|
||||
if not php_files:
|
||||
print("ℹ️ Keine Custom PHP Klassen gefunden.")
|
||||
return
|
||||
|
||||
# Gruppiere nach Typ
|
||||
by_type = defaultdict(list)
|
||||
|
||||
for php_file in php_files:
|
||||
relative_path = php_file.relative_to(classes_path)
|
||||
parts = relative_path.parts
|
||||
|
||||
if len(parts) > 0:
|
||||
class_type = parts[0]
|
||||
by_type[class_type].append(relative_path)
|
||||
|
||||
for class_type in sorted(by_type.keys()):
|
||||
print(f"\n📦 {class_type}:")
|
||||
for file_path in sorted(by_type[class_type]):
|
||||
print(f" • {file_path}")
|
||||
|
||||
|
||||
def analyze_workflows():
|
||||
"""Analysiert Workflows."""
|
||||
print_section("WORKFLOWS", "=")
|
||||
|
||||
workflows_path = BASE_PATH / "custom/workflows"
|
||||
|
||||
if not workflows_path.exists():
|
||||
print("ℹ️ Keine Workflows gefunden.")
|
||||
return
|
||||
|
||||
workflow_files = list(workflows_path.glob("*.json"))
|
||||
|
||||
if not workflow_files:
|
||||
print("ℹ️ Keine Workflows gefunden.")
|
||||
return
|
||||
|
||||
for workflow_file in sorted(workflow_files):
|
||||
try:
|
||||
with open(workflow_file, 'r', encoding='utf-8') as f:
|
||||
workflow = json.load(f)
|
||||
|
||||
name = workflow.get('name', workflow_file.stem)
|
||||
entity = workflow.get('entityType', 'N/A')
|
||||
is_active = workflow.get('isActive', False)
|
||||
status = "✓ AKTIV" if is_active else "✗ INAKTIV"
|
||||
|
||||
print(f"\n📋 {name} ({workflow_file.name})")
|
||||
print(f" Entität: {entity}")
|
||||
print(f" Status: {status}")
|
||||
|
||||
# Trigger-Typ
|
||||
if 'type' in workflow:
|
||||
print(f" Trigger: {workflow['type']}")
|
||||
|
||||
# Aktionen
|
||||
if 'actions' in workflow:
|
||||
actions = workflow['actions']
|
||||
print(f" Aktionen ({len(actions)}):")
|
||||
for action in actions[:5]: # Erste 5 Aktionen
|
||||
action_type = action.get('type', 'unknown')
|
||||
print(f" • {action_type}")
|
||||
if len(actions) > 5:
|
||||
print(f" ... und {len(actions) - 5} weitere")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Fehler beim Lesen von {workflow_file.name}: {e}")
|
||||
|
||||
|
||||
def analyze_frontend():
|
||||
"""Analysiert Frontend Anpassungen."""
|
||||
print_section("FRONTEND ANPASSUNGEN", "=")
|
||||
|
||||
# JavaScript
|
||||
js_path = BASE_PATH / "client/custom/src"
|
||||
if js_path.exists():
|
||||
js_files = list(js_path.rglob("*.js"))
|
||||
if js_files:
|
||||
print_subsection("JavaScript Files")
|
||||
for js_file in sorted(js_files):
|
||||
relative = js_file.relative_to(js_path)
|
||||
print(f" • {relative}")
|
||||
|
||||
# CSS
|
||||
css_path = BASE_PATH / "client/custom/css"
|
||||
if css_path.exists():
|
||||
css_files = list(css_path.glob("*.css"))
|
||||
if css_files:
|
||||
print_subsection("CSS Files")
|
||||
for css_file in sorted(css_files):
|
||||
print(f" • {css_file.name}")
|
||||
|
||||
# App Client Config
|
||||
client_config = CUSTOM_PATH / "Resources/metadata/app/client.json"
|
||||
if client_config.exists():
|
||||
print_subsection("App Client Config")
|
||||
try:
|
||||
with open(client_config, 'r', encoding='utf-8') as f:
|
||||
config = json.load(f)
|
||||
|
||||
if 'cssList' in config:
|
||||
print(" CSS List:")
|
||||
for css in config['cssList']:
|
||||
if css != "__APPEND__":
|
||||
print(f" • {css}")
|
||||
|
||||
if 'scriptList' in config:
|
||||
print(" Script List:")
|
||||
for script in config['scriptList']:
|
||||
if script != "__APPEND__":
|
||||
print(f" • {script}")
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ Fehler: {e}")
|
||||
|
||||
|
||||
def analyze_layouts():
|
||||
"""Analysiert Custom Layouts."""
|
||||
print_section("CUSTOM LAYOUTS", "=")
|
||||
|
||||
layouts_path = CUSTOM_PATH / "Resources/metadata/layouts"
|
||||
|
||||
if not layouts_path.exists():
|
||||
print("ℹ️ Keine Custom Layouts gefunden.")
|
||||
return
|
||||
|
||||
# Gruppiere nach Entität
|
||||
entities = defaultdict(list)
|
||||
|
||||
for layout_file in layouts_path.rglob("*.json"):
|
||||
relative = layout_file.relative_to(layouts_path)
|
||||
entity = relative.parts[0] if len(relative.parts) > 1 else "unknown"
|
||||
layout_type = relative.stem
|
||||
entities[entity].append(layout_type)
|
||||
|
||||
for entity in sorted(entities.keys()):
|
||||
layouts = sorted(entities[entity])
|
||||
print(f"\n{entity}:")
|
||||
print(f" Layouts: {', '.join(layouts)}")
|
||||
|
||||
|
||||
def analyze_i18n():
|
||||
"""Analysiert Internationalisierung."""
|
||||
print_section("INTERNATIONALISIERUNG (i18n)", "=")
|
||||
|
||||
i18n_path = CUSTOM_PATH / "Resources/i18n"
|
||||
|
||||
if not i18n_path.exists():
|
||||
print("ℹ️ Keine i18n Dateien gefunden.")
|
||||
return
|
||||
|
||||
languages = [d.name for d in i18n_path.iterdir() if d.is_dir()]
|
||||
|
||||
print(f"Unterstützte Sprachen: {', '.join(sorted(languages))}")
|
||||
|
||||
for lang in sorted(languages):
|
||||
lang_path = i18n_path / lang
|
||||
json_files = list(lang_path.glob("*.json"))
|
||||
|
||||
if json_files:
|
||||
print(f"\n{lang}:")
|
||||
print(f" Übersetzungsdateien: {len(json_files)}")
|
||||
|
||||
# Zähle Labels
|
||||
total_labels = 0
|
||||
for json_file in json_files:
|
||||
try:
|
||||
with open(json_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
# Rekursiv Labels zählen
|
||||
def count_labels(obj):
|
||||
if isinstance(obj, dict):
|
||||
return sum(count_labels(v) for v in obj.values())
|
||||
elif isinstance(obj, str):
|
||||
return 1
|
||||
return 0
|
||||
total_labels += count_labels(data)
|
||||
except:
|
||||
pass
|
||||
|
||||
print(f" Geschätzte Labels: ~{total_labels}")
|
||||
|
||||
|
||||
def print_quick_stats():
|
||||
"""Gibt eine Schnellübersicht aus."""
|
||||
print_section("SCHNELLÜBERSICHT", "=")
|
||||
|
||||
stats = {}
|
||||
|
||||
# Entitäten
|
||||
entity_defs_path = CUSTOM_PATH / "Resources/metadata/entityDefs"
|
||||
if entity_defs_path.exists():
|
||||
stats['Entities'] = len(list(entity_defs_path.glob("*.json")))
|
||||
|
||||
# PHP Klassen
|
||||
classes_path = CUSTOM_PATH / "Classes"
|
||||
if classes_path.exists():
|
||||
stats['PHP Classes'] = len(list(classes_path.rglob("*.php")))
|
||||
|
||||
# Workflows
|
||||
workflows_path = BASE_PATH / "custom/workflows"
|
||||
if workflows_path.exists():
|
||||
stats['Workflows'] = len(list(workflows_path.glob("*.json")))
|
||||
|
||||
# JS Files
|
||||
js_path = BASE_PATH / "client/custom/src"
|
||||
if js_path.exists():
|
||||
stats['JavaScript Files'] = len(list(js_path.rglob("*.js")))
|
||||
|
||||
# CSS Files
|
||||
css_path = BASE_PATH / "client/custom/css"
|
||||
if css_path.exists():
|
||||
stats['CSS Files'] = len(list(css_path.glob("*.css")))
|
||||
|
||||
# Layouts
|
||||
layouts_path = CUSTOM_PATH / "Resources/metadata/layouts"
|
||||
if layouts_path.exists():
|
||||
stats['Custom Layouts'] = len(list(layouts_path.rglob("*.json")))
|
||||
|
||||
# i18n
|
||||
i18n_path = CUSTOM_PATH / "Resources/i18n"
|
||||
if i18n_path.exists():
|
||||
languages = [d.name for d in i18n_path.iterdir() if d.is_dir()]
|
||||
stats['Languages'] = len(languages)
|
||||
|
||||
print("📊 Projekt-Statistiken:\n")
|
||||
for key, value in stats.items():
|
||||
print(f" • {key:<20} {value:>5}")
|
||||
|
||||
|
||||
def main():
|
||||
"""Hauptfunktion - führt alle Analysen aus."""
|
||||
print("\n" + "=" * 80)
|
||||
print("KI-EINSTIEGSSCRIPT FÜR ESPOCRM PROJEKT".center(80))
|
||||
print("Automatische Projekt-Analyse für KI-basierte Programmierung".center(80))
|
||||
print("=" * 80)
|
||||
|
||||
# 1. Schnellübersicht
|
||||
print_quick_stats()
|
||||
|
||||
# 2. README.md
|
||||
read_readme()
|
||||
|
||||
# 3. Entitäten analysieren
|
||||
entities = analyze_entities()
|
||||
|
||||
# 4. Beziehungsgraph
|
||||
if entities:
|
||||
analyze_relationships(entities)
|
||||
|
||||
# 5. Custom Layouts
|
||||
analyze_layouts()
|
||||
|
||||
# 6. Custom PHP Klassen
|
||||
analyze_custom_classes()
|
||||
|
||||
# 7. Workflows
|
||||
analyze_workflows()
|
||||
|
||||
# 8. Frontend
|
||||
analyze_frontend()
|
||||
|
||||
# 9. i18n
|
||||
analyze_i18n()
|
||||
|
||||
# Abschluss
|
||||
print_section("ANALYSE ABGESCHLOSSEN", "=")
|
||||
print("\n✅ Die KI hat jetzt einen vollständigen Überblick über das Projekt!")
|
||||
print(" Alle Entitäten, Beziehungen, Custom Klassen und Frontend-Anpassungen wurden erfasst.\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user