{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/codequality\/03-architecture-review.md",
"content": "# Architektur-Review\n\n**Projekt:** dev.campus.systemische-tools.de\n**Analysedatum:** 2025-12-22\n\n---\n\n## Aktuelle Architektur\n\n```\n\/src\/\n├── Framework\/ # Basis-Infrastruktur (4 Dateien, 252 LOC)\n│ ├── App.php # Bootstrapping\n│ ├── Router.php # Routing\n│ ├── Controller.php # Base Controller\n│ └── CsrfService.php # CSRF Protection\n│\n├── Controller\/ # HTTP Layer (14 Dateien, 4,913 LOC)\n│ ├── Api\/ # REST-API Controller\n│ └── *.php # Web Controller\n│\n├── Domain\/ # Business Logic (8 Dateien, 1,293 LOC)\n│ ├── Entity\/ # Entities\n│ └── Repository\/ # Repository Interfaces (LEER!)\n│\n├── UseCases\/ # Application Layer (7 Dateien, 615 LOC)\n│ └── Task\/ # Task-bezogene UseCases\n│\n├── Infrastructure\/ # External Services (31 Dateien, 7,110 LOC)\n│ ├── AI\/ # KI-Services (Claude, Ollama, Qdrant)\n│ ├── Config\/ # Konfiguration\n│ ├── Docs\/ # Dokumentations-Pipeline\n│ ├── Persistence\/ # Repository-Implementierungen\n│ └── Validation\/ # Validatoren\n│\n└── View\/ # Templates (56 Dateien, 5,472 LOC)\n └── *.php # PHP Templates\n```\n\n---\n\n## MVC\/MVP Analyse\n\n### Controller Layer\n\n**Bewertung:** GELB - Inkonsistent\n\n| Aspekt | Status | Details |\n|--------|--------|---------|\n| Routing | OK | Zentral in Router.php |\n| Request Handling | OK | In Controller-Methoden |\n| Response | PROBLEM | HTML-Rendering in manchen Controllern |\n| Validation | PROBLEM | Teils in Controller, teils in Validator |\n| Business Logic | PROBLEM | Teils in Controller statt UseCases |\n\n**Probleme:**\n1. `ContentController::renderVersionPartial()` - HTML im Controller\n2. `ContentController::renderCritiquePartial()` - HTML im Controller\n3. `ChatController` - Business Logic statt in UseCase\n4. `SystemExplorerController` - Direkte SQL-Queries\n\n---\n\n### Model Layer\n\n**Bewertung:** GELB - Partiell implementiert\n\n**Positiv:**\n- Repository-Pattern vorhanden\n- UseCases fuer Task-Domain implementiert\n- Entities definiert\n\n**Negativ:**\n- Keine Repository-Interfaces (nur Implementierungen)\n- UseCases nur fuer Task-Domain, nicht fuer andere Domaenen\n- Domain\/Repository Verzeichnis existiert aber ist leer\n\n---\n\n### View Layer\n\n**Bewertung:** GRUEN - Gut strukturiert\n\n**Positiv:**\n- Saubere Template-Struktur\n- Layout-System vorhanden\n- Partials werden genutzt\n- CSRF-Token automatisch verfuegbar\n\n**Negativ:**\n- Manche Partials werden von Controller direkt gerendert (HTMX)\n\n---\n\n## Layer-Verletzungen\n\n### 1. Controller -> Infrastructure (Direct Access)\n\nController greifen direkt auf Infrastructure zu statt ueber UseCases:\n\n```php\n\/\/ SystemExplorerController.php\n$this->db = DatabaseFactory::dev();\n$this->db->query('SELECT ...'); \/\/ Direkte SQL!\n\n\/\/ SemanticExplorerController.php\n$this->repository = new SemanticExplorerRepository(); \/\/ DIP Violation\n```\n\n**Korrekte Schichtung:**\n```\nController -> UseCase -> Repository -> Database\n```\n\n### 2. Fehlende UseCase-Schicht\n\nNur Task-Domain hat UseCases:\n- `CreateTaskUseCase`\n- `AssignTaskUseCase`\n- `DeleteTaskUseCase`\n- `ExecuteAITaskUseCase`\n- `GetTasksUseCase`\n- `SaveTaskResultUseCase`\n- `UpdateTaskStatusUseCase`\n\n**Fehlende UseCases:**\n- Chat-Domain (keine UseCases)\n- Content-Domain (keine UseCases)\n- SemanticExplorer-Domain (keine UseCases)\n- SystemExplorer-Domain (keine UseCases)\n\n---\n\n## Dependency Flow\n\n### Aktueller Zustand (Problematisch)\n\n```\n┌─────────────┐\n│ Controller │\n└─────┬───────┘\n │ new Repository() ← DIP Violation\n │ DatabaseFactory:: ← Static Call\n ▼\n┌─────────────┐\n│Infrastructure│\n└─────────────┘\n```\n\n### Gewuenschter Zustand\n\n```\n┌─────────────┐\n│ Controller │\n└─────┬───────┘\n │ inject\n ▼\n┌─────────────┐\n│ UseCase │\n└─────┬───────┘\n │ inject (Interface)\n ▼\n┌─────────────┐\n│ Repository │ implements IRepository\n└─────┬───────┘\n │\n ▼\n┌─────────────┐\n│ Database │\n└─────────────┘\n```\n\n---\n\n## PSR Compliance\n\n### PSR-1 (Basic Coding Standard)\n**Status:** GRUEN\n- Dateien enthalten nur PHP\n- Klassen in StudlyCaps\n- Methoden in camelCase\n\n### PSR-4 (Autoloading)\n**Status:** GRUEN\n- Namespace entspricht Verzeichnisstruktur\n- composer.json konfiguriert PSR-4\n\n### PSR-12 (Extended Coding Style)\n**Status:** GRUEN (mit CS-Fixer)\n- PHP-CS-Fixer konfiguriert\n- Keine kritischen Style-Violations\n\n---\n\n## Datenbank-Architektur\n\n### Aktuelle Struktur\n```\nki_dev # Infrastruktur (Tasks, Docs, Pipeline)\nki_content # Content (Chat, Wissen, Entities)\n```\n\n### Zugriffsmuster\n\n| Komponente | ki_dev | ki_content |\n|------------|--------|------------|\n| ChatController | X | X |\n| ContentController | | X |\n| SemanticExplorer | | X |\n| SystemExplorer | X | |\n| Tasks | X | |\n| Docs | X | |\n\n**Problem:** Manche Controller benoetigen beide Datenbanken.\n\n---\n\n## Empfehlungen\n\n### Kurzfristig (Quick Wins)\n\n1. **Base Controller erweitern**\n - `notFound()` Methode\n - `validated()` Methode fuer Input\n - `paginate()` Helper\n\n2. **Repository Interfaces**\n ```php\n namespace Domain\\Repository;\n\n interface TaskRepositoryInterface {\n public function find(int $id): ?Task;\n public function save(Task $task): void;\n }\n ```\n\n3. **DI-Container Vorbereitung**\n - Constructor Injection in Repositories\n - Optional: PHP-DI oder Symfony DI\n\n### Mittelfristig\n\n1. **UseCases fuer alle Domaenen**\n - ChatUseCases (SendMessage, LoadHistory, etc.)\n - ContentUseCases (Generate, Critique, Revise)\n - ExplorerUseCases (Search, Browse)\n\n2. **God Classes aufteilen**\n - ChatController -> 5 Controller\n - SemanticExplorerController -> 5 Controller\n\n3. **HTML aus Controllern entfernen**\n - Partials fuer HTMX Responses\n - View-Komponenten\n\n### Langfristig\n\n1. **Event System**\n - Domain Events\n - Event Handlers\n\n2. **CQRS Pattern**\n - Query vs Command Separation\n - Read Models fuer komplexe Abfragen\n\n3. **API Versioning**\n - v1, v2 Namespaces\n - Breaking Changes Management\n\n---\n\n## Architektur-Metriken\n\n| Metrik | Wert | Ziel |\n|--------|------|------|\n| Controller LOC | 4,913 | < 2,000 |\n| Avg Controller Size | 351 | < 200 |\n| Largest Controller | 978 | < 300 |\n| UseCase Coverage | 1\/5 Domains | 5\/5 |\n| Interface Coverage | 0% | > 80% |\n| DI Usage | 0% | 100% |\n\n---\n\n## Fazit\n\nDie Architektur hat eine solide Basis mit dem Framework, aber es fehlt konsequente Anwendung von:\n- Dependency Injection\n- UseCase Layer\n- Repository Interfaces\n\n**Hauptproblem:** Controller sind zu gross und uebernehmen zu viele Verantwortlichkeiten.\n\n**Naechster Schritt:** DI-Container einfuehren und ChatController refactoren als Pilot-Projekt.\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/codequality\/03-architecture-review.md",
"content": "# Architektur-Review\n\n**Projekt:** dev.campus.systemische-tools.de\n**Analysedatum:** 2025-12-22\n\n---\n\n## Aktuelle Architektur\n\n```\n\/src\/\n├── Framework\/ # Basis-Infrastruktur (4 Dateien, 252 LOC)\n│ ├── App.php # Bootstrapping\n│ ├── Router.php # Routing\n│ ├── Controller.php # Base Controller\n│ └── CsrfService.php # CSRF Protection\n│\n├── Controller\/ # HTTP Layer (14 Dateien, 4,913 LOC)\n│ ├── Api\/ # REST-API Controller\n│ └── *.php # Web Controller\n│\n├── Domain\/ # Business Logic (8 Dateien, 1,293 LOC)\n│ ├── Entity\/ # Entities\n│ └── Repository\/ # Repository Interfaces (LEER!)\n│\n├── UseCases\/ # Application Layer (7 Dateien, 615 LOC)\n│ └── Task\/ # Task-bezogene UseCases\n│\n├── Infrastructure\/ # External Services (31 Dateien, 7,110 LOC)\n│ ├── AI\/ # KI-Services (Claude, Ollama, Qdrant)\n│ ├── Config\/ # Konfiguration\n│ ├── Docs\/ # Dokumentations-Pipeline\n│ ├── Persistence\/ # Repository-Implementierungen\n│ └── Validation\/ # Validatoren\n│\n└── View\/ # Templates (56 Dateien, 5,472 LOC)\n └── *.php # PHP Templates\n```\n\n---\n\n## MVC\/MVP Analyse\n\n### Controller Layer\n\n**Bewertung:** GELB - Inkonsistent\n\n| Aspekt | Status | Details |\n|--------|--------|---------|\n| Routing | OK | Zentral in Router.php |\n| Request Handling | OK | In Controller-Methoden |\n| Response | PROBLEM | HTML-Rendering in manchen Controllern |\n| Validation | PROBLEM | Teils in Controller, teils in Validator |\n| Business Logic | PROBLEM | Teils in Controller statt UseCases |\n\n**Probleme:**\n1. `ContentController::renderVersionPartial()` - HTML im Controller\n2. `ContentController::renderCritiquePartial()` - HTML im Controller\n3. `ChatController` - Business Logic statt in UseCase\n4. `SystemExplorerController` - Direkte SQL-Queries\n\n---\n\n### Model Layer\n\n**Bewertung:** GELB - Partiell implementiert\n\n**Positiv:**\n- Repository-Pattern vorhanden\n- UseCases fuer Task-Domain implementiert\n- Entities definiert\n\n**Negativ:**\n- Keine Repository-Interfaces (nur Implementierungen)\n- UseCases nur fuer Task-Domain, nicht fuer andere Domaenen\n- Domain\/Repository Verzeichnis existiert aber ist leer\n\n---\n\n### View Layer\n\n**Bewertung:** GRUEN - Gut strukturiert\n\n**Positiv:**\n- Saubere Template-Struktur\n- Layout-System vorhanden\n- Partials werden genutzt\n- CSRF-Token automatisch verfuegbar\n\n**Negativ:**\n- Manche Partials werden von Controller direkt gerendert (HTMX)\n\n---\n\n## Layer-Verletzungen\n\n### 1. Controller -> Infrastructure (Direct Access)\n\nController greifen direkt auf Infrastructure zu statt ueber UseCases:\n\n```php\n\/\/ SystemExplorerController.php\n$this->db = DatabaseFactory::dev();\n$this->db->query('SELECT ...'); \/\/ Direkte SQL!\n\n\/\/ SemanticExplorerController.php\n$this->repository = new SemanticExplorerRepository(); \/\/ DIP Violation\n```\n\n**Korrekte Schichtung:**\n```\nController -> UseCase -> Repository -> Database\n```\n\n### 2. Fehlende UseCase-Schicht\n\nNur Task-Domain hat UseCases:\n- `CreateTaskUseCase`\n- `AssignTaskUseCase`\n- `DeleteTaskUseCase`\n- `ExecuteAITaskUseCase`\n- `GetTasksUseCase`\n- `SaveTaskResultUseCase`\n- `UpdateTaskStatusUseCase`\n\n**Fehlende UseCases:**\n- Chat-Domain (keine UseCases)\n- Content-Domain (keine UseCases)\n- SemanticExplorer-Domain (keine UseCases)\n- SystemExplorer-Domain (keine UseCases)\n\n---\n\n## Dependency Flow\n\n### Aktueller Zustand (Problematisch)\n\n```\n┌─────────────┐\n│ Controller │\n└─────┬───────┘\n │ new Repository() ← DIP Violation\n │ DatabaseFactory:: ← Static Call\n ▼\n┌─────────────┐\n│Infrastructure│\n└─────────────┘\n```\n\n### Gewuenschter Zustand\n\n```\n┌─────────────┐\n│ Controller │\n└─────┬───────┘\n │ inject\n ▼\n┌─────────────┐\n│ UseCase │\n└─────┬───────┘\n │ inject (Interface)\n ▼\n┌─────────────┐\n│ Repository │ implements IRepository\n└─────┬───────┘\n │\n ▼\n┌─────────────┐\n│ Database │\n└─────────────┘\n```\n\n---\n\n## PSR Compliance\n\n### PSR-1 (Basic Coding Standard)\n**Status:** GRUEN\n- Dateien enthalten nur PHP\n- Klassen in StudlyCaps\n- Methoden in camelCase\n\n### PSR-4 (Autoloading)\n**Status:** GRUEN\n- Namespace entspricht Verzeichnisstruktur\n- composer.json konfiguriert PSR-4\n\n### PSR-12 (Extended Coding Style)\n**Status:** GRUEN (mit CS-Fixer)\n- PHP-CS-Fixer konfiguriert\n- Keine kritischen Style-Violations\n\n---\n\n## Datenbank-Architektur\n\n### Aktuelle Struktur\n```\nki_dev # Infrastruktur (Tasks, Docs, Pipeline)\nki_content # Content (Chat, Wissen, Entities)\n```\n\n### Zugriffsmuster\n\n| Komponente | ki_dev | ki_content |\n|------------|--------|------------|\n| ChatController | X | X |\n| ContentController | | X |\n| SemanticExplorer | | X |\n| SystemExplorer | X | |\n| Tasks | X | |\n| Docs | X | |\n\n**Problem:** Manche Controller benoetigen beide Datenbanken.\n\n---\n\n## Empfehlungen\n\n### Kurzfristig (Quick Wins)\n\n1. **Base Controller erweitern**\n - `notFound()` Methode\n - `validated()` Methode fuer Input\n - `paginate()` Helper\n\n2. **Repository Interfaces**\n ```php\n namespace Domain\\Repository;\n\n interface TaskRepositoryInterface {\n public function find(int $id): ?Task;\n public function save(Task $task): void;\n }\n ```\n\n3. **DI-Container Vorbereitung**\n - Constructor Injection in Repositories\n - Optional: PHP-DI oder Symfony DI\n\n### Mittelfristig\n\n1. **UseCases fuer alle Domaenen**\n - ChatUseCases (SendMessage, LoadHistory, etc.)\n - ContentUseCases (Generate, Critique, Revise)\n - ExplorerUseCases (Search, Browse)\n\n2. **God Classes aufteilen**\n - ChatController -> 5 Controller\n - SemanticExplorerController -> 5 Controller\n\n3. **HTML aus Controllern entfernen**\n - Partials fuer HTMX Responses\n - View-Komponenten\n\n### Langfristig\n\n1. **Event System**\n - Domain Events\n - Event Handlers\n\n2. **CQRS Pattern**\n - Query vs Command Separation\n - Read Models fuer komplexe Abfragen\n\n3. **API Versioning**\n - v1, v2 Namespaces\n - Breaking Changes Management\n\n---\n\n## Architektur-Metriken\n\n| Metrik | Wert | Ziel |\n|--------|------|------|\n| Controller LOC | 4,913 | < 2,000 |\n| Avg Controller Size | 351 | < 200 |\n| Largest Controller | 978 | < 300 |\n| UseCase Coverage | 1\/5 Domains | 5\/5 |\n| Interface Coverage | 0% | > 80% |\n| DI Usage | 0% | 100% |\n\n---\n\n## Fazit\n\nDie Architektur hat eine solide Basis mit dem Framework, aber es fehlt konsequente Anwendung von:\n- Dependency Injection\n- UseCase Layer\n- Repository Interfaces\n\n**Hauptproblem:** Controller sind zu gross und uebernehmen zu viele Verantwortlichkeiten.\n\n**Naechster Schritt:** DI-Container einfuehren und ChatController refactoren als Pilot-Projekt.\n",
"structuredPatch": [],
"originalFile": null
}
}