{
"event": "PreToolUse",
"tool_name": "mcp__mcp-tasks__tasks_update",
"tool_input": {
"id": 338,
"title": "Fix: ModelRegistry - Static Facade durch DI ersetzen",
"description": "## Symptom\n```\nFatal error: Uncaught RuntimeException: ModelRegistry not initialized. \nUse DI container or call setInstance() first.\n```\nURL: \/chat\/{uuid}\n\n---\n\n## Root Cause\n`ModelConfig` ist eine **Static Facade** die `ModelRegistry::getInstance()` aufruft.\nDer Singleton wird erst bei Container-Zugriff initialisiert → Race Condition.\n\n---\n\n## Lösung: Option B (DI statt Static Facade)\n\n### Prinzip\n**Keine Static Facades.** Alle Dependencies per Constructor Injection.\n\n### Umsetzung\n\n#### Schritt 1: Betroffene Controller identifizieren\n```bash\ngrep -r \"ModelConfig::\" src\/Controller\/\n```\n\n#### Schritt 2: ModelRegistry per DI injizieren\n```php\n\/\/ Vorher (ChatController.php)\nuse Infrastructure\\AI\\ModelConfig;\n...\n'models' => ModelConfig::getAll(),\n\n\/\/ Nachher\nuse Infrastructure\\AI\\ModelRegistry;\n...\npublic function __construct(\n ...,\n private ModelRegistry $modelRegistry\n) {}\n...\n'models' => $this->modelRegistry->getChatModels(),\n```\n\n#### Schritt 3: Alle Controller mit ModelConfig-Nutzung aktualisieren\n- ChatController\n- ContentController (prüfen)\n- Weitere (prüfen)\n\n#### Schritt 4: ModelConfig als @deprecated markieren\n```php\n\/**\n * @deprecated Use ModelRegistry via DI instead\n *\/\nfinal class ModelConfig\n```\n\n#### Schritt 5: Contract aktualisieren\nRegel hinzufügen: \"Keine Static Facades (ModelConfig, etc.)\"\n\n---\n\n## Qualitätssicherung\n\n1. PHPStan: 0 Errors\n2. Alle \/chat\/* Endpunkte testen\n3. Contract-Validierung\n\n---\n\n## Folge-Arbeiten\n- Contract \"DI-Principles\" erstellen\/aktualisieren\n- Weitere Static Facades identifizieren und refactoren"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"task\": {\n \"id\": 338,\n \"uuid\": \"818a192d-c83e-4b22-a504-57585ff73381\",\n \"title\": \"Fix: ModelRegistry - Static Facade durch DI ersetzen\",\n \"description\": \"## Symptom\\n```\\nFatal error: Uncaught RuntimeException: ModelRegistry not initialized. \\nUse DI container or call setInstance() first.\\n```\\nURL: \/chat\/{uuid}\\n\\n---\\n\\n## Root Cause\\n`ModelConfig` ist eine **Static Facade** die `ModelRegistry::getInstance()` aufruft.\\nDer Singleton wird erst bei Container-Zugriff initialisiert → Race Condition.\\n\\n---\\n\\n## Lösung: Option B (DI statt Static Facade)\\n\\n### Prinzip\\n**Keine Static Facades.** Alle Dependencies per Constructor Injection.\\n\\n### Umsetzung\\n\\n#### Schritt 1: Betroffene Controller identifizieren\\n```bash\\ngrep -r \\\"ModelConfig::\\\" src\/Controller\/\\n```\\n\\n#### Schritt 2: ModelRegistry per DI injizieren\\n```php\\n\/\/ Vorher (ChatController.php)\\nuse Infrastructure\\\\AI\\\\ModelConfig;\\n...\\n'models' => ModelConfig::getAll(),\\n\\n\/\/ Nachher\\nuse Infrastructure\\\\AI\\\\ModelRegistry;\\n...\\npublic function __construct(\\n ...,\\n private ModelRegistry $modelRegistry\\n) {}\\n...\\n'models' => $this->modelRegistry->getChatModels(),\\n```\\n\\n#### Schritt 3: Alle Controller mit ModelConfig-Nutzung aktualisieren\\n- ChatController\\n- ContentController (prüfen)\\n- Weitere (prüfen)\\n\\n#### Schritt 4: ModelConfig als @deprecated markieren\\n```php\\n\/**\\n * @deprecated Use ModelRegistry via DI instead\\n *\/\\nfinal class ModelConfig\\n```\\n\\n#### Schritt 5: Contract aktualisieren\\nRegel hinzufügen: \\\"Keine Static Facades (ModelConfig, etc.)\\\"\\n\\n---\\n\\n## Qualitätssicherung\\n\\n1. PHPStan: 0 Errors\\n2. Alle \/chat\/* Endpunkte testen\\n3. Contract-Validierung\\n\\n---\\n\\n## Folge-Arbeiten\\n- Contract \\\"DI-Principles\\\" erstellen\/aktualisieren\\n- Weitere Static Facades identifizieren und refactoren\",\n \"type\": \"ai_task\",\n \"status\": \"pending\",\n \"created_by\": \"mcp-tasks\",\n \"created_by_type\": \"ai\",\n \"parent_task_id\": null,\n \"due_date\": null,\n \"created_at\": \"2025-12-25T13:18:06.915873\",\n \"updated_at\": \"2025-12-25T13:26:13.180972\",\n \"completed_at\": null,\n \"metadata\": {}\n },\n \"message\": \"Task #338 updated\"\n}"
}
]
}