{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/root\/.claude\/plans\/splendid-swimming-scroll.md",
"content": "# Plan: SemanticExplorerRepository SRP-Refactoring\n\n## Root Cause Analyse\n\n### Problem\n`SemanticExplorerRepository` (917 LOC, 60 Methoden) ist ein **God Object** mit 7 verschiedenen Domänen:\n\n| Domäne | Methoden | LOC | Tabellen |\n|--------|----------|-----|----------|\n| Documents | 4 | 49 | documents |\n| Chunks | 8 | 126 | chunks |\n| Entities | 13 | 143 | entities, entity_synonyms, chunk_entities |\n| Relations | 8 | 76 | entity_relations |\n| Taxonomy | 7 | 99 | taxonomy_terms, chunk_taxonomy |\n| Ontology | 7 | 73 | ontology_classes, entity_classifications |\n| Semantics | 6 | 84 | chunk_semantics |\n| Graph | 1 | 59 | (aggregiert) |\n\n### Verstöße\n- **SRP**: 7+ Verantwortlichkeiten in einer Klasse\n- **code-quality-standards**: 917 LOC > 500 Max\n- **DIP**: Kein Interface, direkte Concrete-Class-Abhängigkeit\n- **architecture-gate-contract**: Keine Interface-Separation\n\n### Dependents (5 Controller)\n```\nEntityController → Entities, Relations, Classifications (12 Methoden)\nRelationController → Relations, Entities (9 Methoden)\nTaxonomyController → Taxonomy (7 Methoden)\nOntologyController → Ontology (7 Methoden)\nSemanticExplorerController → Multi-Domain Dashboard (20+ Methoden)\n```\n\n---\n\n## Ziel-Architektur\n\n### Neue Repository-Struktur\n```\nDomain\/Repository\/\n├── DocumentRepositoryInterface.php\n├── ChunkRepositoryInterface.php\n├── EntityRepositoryInterface.php\n├── RelationRepositoryInterface.php\n├── TaxonomyRepositoryInterface.php\n├── OntologyRepositoryInterface.php\n└── SemanticSearchRepositoryInterface.php\n\nInfrastructure\/Persistence\/\n├── DocumentRepository.php (~60 LOC)\n├── ChunkRepository.php (~140 LOC)\n├── EntityRepository.php (~160 LOC)\n├── RelationRepository.php (~90 LOC)\n├── TaxonomyRepository.php (~110 LOC)\n├── OntologyRepository.php (~85 LOC)\n└── SemanticSearchRepository.php (~150 LOC)\n```\n\n### Prinzipien-Einhaltung\n- **SRP**: Jedes Repository = 1 Domäne\n- **DRY**: Gemeinsame Patterns in Traits\n- **KISS**: Einfache CRUD-Methoden, keine Over-Engineering\n- **SOLID\/DIP**: Interfaces im Domain-Layer\n- **YAGNI**: Nur existierende Methoden migrieren\n- **OOP\/MVC**: Repository-Pattern beibehalten\n\n---\n\n## Implementierungsplan (7 Tasks)\n\n### Task 1: Interfaces definieren (Domain-Layer)\n**Ziel**: 7 Repository-Interfaces erstellen\n\n**Dateien**:\n- `src\/Domain\/Repository\/DocumentRepositoryInterface.php`\n- `src\/Domain\/Repository\/ChunkRepositoryInterface.php`\n- `src\/Domain\/Repository\/EntityRepositoryInterface.php`\n- `src\/Domain\/Repository\/RelationRepositoryInterface.php`\n- `src\/Domain\/Repository\/TaxonomyRepositoryInterface.php`\n- `src\/Domain\/Repository\/OntologyRepositoryInterface.php`\n- `src\/Domain\/Repository\/SemanticSearchRepositoryInterface.php`\n\n**Pattern** (aus bestehenden Interfaces):\n```php\n<?php\ndeclare(strict_types=1);\nnamespace Domain\\Repository;\n\ninterface EntityRepositoryInterface\n{\n public function find(int $id): ?array;\n public function findFiltered(string $type = '', string $search = '', int $limit = 100): array;\n public function getStats(): array;\n public function create(string $name, string $type, ?string $description = null): int;\n public function update(int $id, string $name, string $type, ?string $description = null): bool;\n public function delete(int $id): bool;\n public function getTypes(): array;\n \/\/ + Entity-spezifische Methoden\n}\n```\n\n**Risiko**: LOW (nur neue Dateien)\n\n---\n\n### Task 2: DocumentRepository + ChunkRepository\n**Ziel**: Erste 2 Repositories extrahieren\n\n**Migration**:\n```\nSemanticExplorerRepository → DocumentRepository:\n - getDocumentStats()\n - getDocuments()\n - getDocumentsFiltered()\n - getDocument()\n\nSemanticExplorerRepository → ChunkRepository:\n - getChunkStats()\n - getSemanticStats()\n - getRecentChunks()\n - getChunksForDocument()\n - getChunksFiltered()\n - getChunksCount()\n - getChunk()\n - getChunkById()\n - getChunkByDocumentAndIndex()\n```\n\n**Controller-Updates**:\n- `SemanticExplorerController`: Inject DocumentRepository + ChunkRepository\n\n**Risiko**: MEDIUM (1 Controller betroffen)\n\n---\n\n### Task 3: EntityRepository\n**Ziel**: Entity-Methoden extrahieren\n\n**Migration**:\n```\nSemanticExplorerRepository → EntityRepository:\n - getEntitiesFiltered()\n - getEntityStats()\n - getEntity()\n - getEntitySynonyms()\n - getOutgoingRelations()\n - getIncomingRelations()\n - getChunksForEntity()\n - getEntityClassifications()\n - getEntityTypes()\n - getAllEntitiesSimple()\n - createEntity()\n - updateEntity()\n - deleteEntity()\n```\n\n**Controller-Updates**:\n- `EntityController`: Inject EntityRepository\n- `RelationController`: Inject EntityRepository (für getAllEntitiesSimple)\n- `SemanticExplorerController`: Inject EntityRepository (für Stats\/Graph)\n\n**Risiko**: MEDIUM-HIGH (3 Controller betroffen)\n\n---\n\n### Task 4: RelationRepository\n**Ziel**: Relation-Methoden extrahieren\n\n**Migration**:\n```\nSemanticExplorerRepository → RelationRepository:\n - getRelationsFiltered()\n - getRelationTypes()\n - getRelationStats()\n - getRelation()\n - createRelation()\n - updateRelation()\n - deleteRelation()\n - getRelationTypesList()\n```\n\n**Controller-Updates**:\n- `RelationController`: Inject RelationRepository\n- `SemanticExplorerController`: Inject RelationRepository (für Graph)\n\n**Risiko**: MEDIUM (2 Controller betroffen)\n\n---\n\n### Task 5: TaxonomyRepository\n**Ziel**: Taxonomy-Methoden extrahieren (hierarchisch)\n\n**Migration**:\n```\nSemanticExplorerRepository → TaxonomyRepository:\n - getTaxonomyTerms()\n - getTaxonomyStats()\n - getTaxonomyTerm()\n - createTaxonomyTerm()\n - updateTaxonomyTerm()\n - deleteTaxonomyTerm()\n - getTaxonomyTermsForSelect()\n```\n\n**Controller-Updates**:\n- `TaxonomyController`: Inject TaxonomyRepository\n\n**Risiko**: LOW (1 Controller betroffen, isolierte Domäne)\n\n---\n\n### Task 6: OntologyRepository\n**Ziel**: Ontology-Methoden extrahieren (hierarchisch + JSON properties)\n\n**Migration**:\n```\nSemanticExplorerRepository → OntologyRepository:\n - getOntologyClasses()\n - getOntologyStats()\n - getOntologyClass()\n - createOntologyClass()\n - updateOntologyClass()\n - deleteOntologyClass()\n - getOntologyClassesForSelect()\n```\n\n**Controller-Updates**:\n- `OntologyController`: Inject OntologyRepository\n\n**Risiko**: LOW (1 Controller betroffen, isolierte Domäne)\n\n---\n\n### Task 7: SemanticSearchRepository + Cleanup\n**Ziel**: Semantics + Graph + Aufräumen\n\n**Migration**:\n```\nSemanticExplorerRepository → SemanticSearchRepository:\n - getSemanticsFiltered()\n - getSemanticsCount()\n - getEntitySemanticsFiltered()\n - getEntitySemanticsCount()\n - getGraphData()\n```\n\n**Cleanup**:\n- SemanticExplorerRepository.php löschen (oder deprecated lassen)\n- services.php: Alle neuen Repositories registrieren\n- Contract-Validierung ausführen\n\n**Controller-Updates**:\n- `SemanticExplorerController`: Inject SemanticSearchRepository\n\n**Risiko**: LOW-MEDIUM\n\n---\n\n## Reihenfolge (Risiko-optimiert)\n\n```\n1. [LOW] Task 5: TaxonomyRepository (isoliert)\n2. [LOW] Task 6: OntologyRepository (isoliert)\n3. [LOW] Task 1: Interfaces definieren\n4. [MEDIUM] Task 2: DocumentRepository + ChunkRepository\n5. [MEDIUM] Task 4: RelationRepository\n6. [MED-HI] Task 3: EntityRepository (3 Controller)\n7. [LOW-MED] Task 7: SemanticSearchRepository + Cleanup\n```\n\n---\n\n## Qualitätssicherung pro Task\n\n1. **PHPStan Level 5**: Keine Errors\n2. **PHP-CS-Fixer**: Code Style PSR-12\n3. **Contract-Validierung**: `contracts_validate(name=\"layered-architecture\")`\n4. **Funktionstest**: Betroffene Controller-Endpunkte testen\n5. **LOC-Check**: Jedes Repository < 200 LOC\n\n---\n\n## Kritische Dateien\n\n### Zu erstellen\n- `src\/Domain\/Repository\/*Interface.php` (7 Dateien)\n- `src\/Infrastructure\/Persistence\/*Repository.php` (7 Dateien)\n\n### Zu modifizieren\n- `src\/services.php` (DI-Registrierung)\n- `src\/Controller\/EntityController.php`\n- `src\/Controller\/RelationController.php`\n- `src\/Controller\/TaxonomyController.php`\n- `src\/Controller\/OntologyController.php`\n- `src\/Controller\/SemanticExplorerController.php`\n\n### Zu löschen (am Ende)\n- `src\/Infrastructure\/SemanticExplorerRepository.php`\n\n---\n\n## Geschätzter Aufwand\n\n| Task | Aufwand | Risiko |\n|------|---------|--------|\n| Task 1: Interfaces | 30 min | LOW |\n| Task 2: Doc+Chunk | 45 min | MEDIUM |\n| Task 3: Entity | 60 min | MED-HIGH |\n| Task 4: Relation | 30 min | MEDIUM |\n| Task 5: Taxonomy | 30 min | LOW |\n| Task 6: Ontology | 30 min | LOW |\n| Task 7: Semantic+Cleanup | 45 min | LOW-MED |\n| **TOTAL** | ~4.5h | |\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/root\/.claude\/plans\/splendid-swimming-scroll.md",
"content": "# Plan: SemanticExplorerRepository SRP-Refactoring\n\n## Root Cause Analyse\n\n### Problem\n`SemanticExplorerRepository` (917 LOC, 60 Methoden) ist ein **God Object** mit 7 verschiedenen Domänen:\n\n| Domäne | Methoden | LOC | Tabellen |\n|--------|----------|-----|----------|\n| Documents | 4 | 49 | documents |\n| Chunks | 8 | 126 | chunks |\n| Entities | 13 | 143 | entities, entity_synonyms, chunk_entities |\n| Relations | 8 | 76 | entity_relations |\n| Taxonomy | 7 | 99 | taxonomy_terms, chunk_taxonomy |\n| Ontology | 7 | 73 | ontology_classes, entity_classifications |\n| Semantics | 6 | 84 | chunk_semantics |\n| Graph | 1 | 59 | (aggregiert) |\n\n### Verstöße\n- **SRP**: 7+ Verantwortlichkeiten in einer Klasse\n- **code-quality-standards**: 917 LOC > 500 Max\n- **DIP**: Kein Interface, direkte Concrete-Class-Abhängigkeit\n- **architecture-gate-contract**: Keine Interface-Separation\n\n### Dependents (5 Controller)\n```\nEntityController → Entities, Relations, Classifications (12 Methoden)\nRelationController → Relations, Entities (9 Methoden)\nTaxonomyController → Taxonomy (7 Methoden)\nOntologyController → Ontology (7 Methoden)\nSemanticExplorerController → Multi-Domain Dashboard (20+ Methoden)\n```\n\n---\n\n## Ziel-Architektur\n\n### Neue Repository-Struktur\n```\nDomain\/Repository\/\n├── DocumentRepositoryInterface.php\n├── ChunkRepositoryInterface.php\n├── EntityRepositoryInterface.php\n├── RelationRepositoryInterface.php\n├── TaxonomyRepositoryInterface.php\n├── OntologyRepositoryInterface.php\n└── SemanticSearchRepositoryInterface.php\n\nInfrastructure\/Persistence\/\n├── DocumentRepository.php (~60 LOC)\n├── ChunkRepository.php (~140 LOC)\n├── EntityRepository.php (~160 LOC)\n├── RelationRepository.php (~90 LOC)\n├── TaxonomyRepository.php (~110 LOC)\n├── OntologyRepository.php (~85 LOC)\n└── SemanticSearchRepository.php (~150 LOC)\n```\n\n### Prinzipien-Einhaltung\n- **SRP**: Jedes Repository = 1 Domäne\n- **DRY**: Gemeinsame Patterns in Traits\n- **KISS**: Einfache CRUD-Methoden, keine Over-Engineering\n- **SOLID\/DIP**: Interfaces im Domain-Layer\n- **YAGNI**: Nur existierende Methoden migrieren\n- **OOP\/MVC**: Repository-Pattern beibehalten\n\n---\n\n## Implementierungsplan (7 Tasks)\n\n### Task 1: Interfaces definieren (Domain-Layer)\n**Ziel**: 7 Repository-Interfaces erstellen\n\n**Dateien**:\n- `src\/Domain\/Repository\/DocumentRepositoryInterface.php`\n- `src\/Domain\/Repository\/ChunkRepositoryInterface.php`\n- `src\/Domain\/Repository\/EntityRepositoryInterface.php`\n- `src\/Domain\/Repository\/RelationRepositoryInterface.php`\n- `src\/Domain\/Repository\/TaxonomyRepositoryInterface.php`\n- `src\/Domain\/Repository\/OntologyRepositoryInterface.php`\n- `src\/Domain\/Repository\/SemanticSearchRepositoryInterface.php`\n\n**Pattern** (aus bestehenden Interfaces):\n```php\n<?php\ndeclare(strict_types=1);\nnamespace Domain\\Repository;\n\ninterface EntityRepositoryInterface\n{\n public function find(int $id): ?array;\n public function findFiltered(string $type = '', string $search = '', int $limit = 100): array;\n public function getStats(): array;\n public function create(string $name, string $type, ?string $description = null): int;\n public function update(int $id, string $name, string $type, ?string $description = null): bool;\n public function delete(int $id): bool;\n public function getTypes(): array;\n \/\/ + Entity-spezifische Methoden\n}\n```\n\n**Risiko**: LOW (nur neue Dateien)\n\n---\n\n### Task 2: DocumentRepository + ChunkRepository\n**Ziel**: Erste 2 Repositories extrahieren\n\n**Migration**:\n```\nSemanticExplorerRepository → DocumentRepository:\n - getDocumentStats()\n - getDocuments()\n - getDocumentsFiltered()\n - getDocument()\n\nSemanticExplorerRepository → ChunkRepository:\n - getChunkStats()\n - getSemanticStats()\n - getRecentChunks()\n - getChunksForDocument()\n - getChunksFiltered()\n - getChunksCount()\n - getChunk()\n - getChunkById()\n - getChunkByDocumentAndIndex()\n```\n\n**Controller-Updates**:\n- `SemanticExplorerController`: Inject DocumentRepository + ChunkRepository\n\n**Risiko**: MEDIUM (1 Controller betroffen)\n\n---\n\n### Task 3: EntityRepository\n**Ziel**: Entity-Methoden extrahieren\n\n**Migration**:\n```\nSemanticExplorerRepository → EntityRepository:\n - getEntitiesFiltered()\n - getEntityStats()\n - getEntity()\n - getEntitySynonyms()\n - getOutgoingRelations()\n - getIncomingRelations()\n - getChunksForEntity()\n - getEntityClassifications()\n - getEntityTypes()\n - getAllEntitiesSimple()\n - createEntity()\n - updateEntity()\n - deleteEntity()\n```\n\n**Controller-Updates**:\n- `EntityController`: Inject EntityRepository\n- `RelationController`: Inject EntityRepository (für getAllEntitiesSimple)\n- `SemanticExplorerController`: Inject EntityRepository (für Stats\/Graph)\n\n**Risiko**: MEDIUM-HIGH (3 Controller betroffen)\n\n---\n\n### Task 4: RelationRepository\n**Ziel**: Relation-Methoden extrahieren\n\n**Migration**:\n```\nSemanticExplorerRepository → RelationRepository:\n - getRelationsFiltered()\n - getRelationTypes()\n - getRelationStats()\n - getRelation()\n - createRelation()\n - updateRelation()\n - deleteRelation()\n - getRelationTypesList()\n```\n\n**Controller-Updates**:\n- `RelationController`: Inject RelationRepository\n- `SemanticExplorerController`: Inject RelationRepository (für Graph)\n\n**Risiko**: MEDIUM (2 Controller betroffen)\n\n---\n\n### Task 5: TaxonomyRepository\n**Ziel**: Taxonomy-Methoden extrahieren (hierarchisch)\n\n**Migration**:\n```\nSemanticExplorerRepository → TaxonomyRepository:\n - getTaxonomyTerms()\n - getTaxonomyStats()\n - getTaxonomyTerm()\n - createTaxonomyTerm()\n - updateTaxonomyTerm()\n - deleteTaxonomyTerm()\n - getTaxonomyTermsForSelect()\n```\n\n**Controller-Updates**:\n- `TaxonomyController`: Inject TaxonomyRepository\n\n**Risiko**: LOW (1 Controller betroffen, isolierte Domäne)\n\n---\n\n### Task 6: OntologyRepository\n**Ziel**: Ontology-Methoden extrahieren (hierarchisch + JSON properties)\n\n**Migration**:\n```\nSemanticExplorerRepository → OntologyRepository:\n - getOntologyClasses()\n - getOntologyStats()\n - getOntologyClass()\n - createOntologyClass()\n - updateOntologyClass()\n - deleteOntologyClass()\n - getOntologyClassesForSelect()\n```\n\n**Controller-Updates**:\n- `OntologyController`: Inject OntologyRepository\n\n**Risiko**: LOW (1 Controller betroffen, isolierte Domäne)\n\n---\n\n### Task 7: SemanticSearchRepository + Cleanup\n**Ziel**: Semantics + Graph + Aufräumen\n\n**Migration**:\n```\nSemanticExplorerRepository → SemanticSearchRepository:\n - getSemanticsFiltered()\n - getSemanticsCount()\n - getEntitySemanticsFiltered()\n - getEntitySemanticsCount()\n - getGraphData()\n```\n\n**Cleanup**:\n- SemanticExplorerRepository.php löschen (oder deprecated lassen)\n- services.php: Alle neuen Repositories registrieren\n- Contract-Validierung ausführen\n\n**Controller-Updates**:\n- `SemanticExplorerController`: Inject SemanticSearchRepository\n\n**Risiko**: LOW-MEDIUM\n\n---\n\n## Reihenfolge (Risiko-optimiert)\n\n```\n1. [LOW] Task 5: TaxonomyRepository (isoliert)\n2. [LOW] Task 6: OntologyRepository (isoliert)\n3. [LOW] Task 1: Interfaces definieren\n4. [MEDIUM] Task 2: DocumentRepository + ChunkRepository\n5. [MEDIUM] Task 4: RelationRepository\n6. [MED-HI] Task 3: EntityRepository (3 Controller)\n7. [LOW-MED] Task 7: SemanticSearchRepository + Cleanup\n```\n\n---\n\n## Qualitätssicherung pro Task\n\n1. **PHPStan Level 5**: Keine Errors\n2. **PHP-CS-Fixer**: Code Style PSR-12\n3. **Contract-Validierung**: `contracts_validate(name=\"layered-architecture\")`\n4. **Funktionstest**: Betroffene Controller-Endpunkte testen\n5. **LOC-Check**: Jedes Repository < 200 LOC\n\n---\n\n## Kritische Dateien\n\n### Zu erstellen\n- `src\/Domain\/Repository\/*Interface.php` (7 Dateien)\n- `src\/Infrastructure\/Persistence\/*Repository.php` (7 Dateien)\n\n### Zu modifizieren\n- `src\/services.php` (DI-Registrierung)\n- `src\/Controller\/EntityController.php`\n- `src\/Controller\/RelationController.php`\n- `src\/Controller\/TaxonomyController.php`\n- `src\/Controller\/OntologyController.php`\n- `src\/Controller\/SemanticExplorerController.php`\n\n### Zu löschen (am Ende)\n- `src\/Infrastructure\/SemanticExplorerRepository.php`\n\n---\n\n## Geschätzter Aufwand\n\n| Task | Aufwand | Risiko |\n|------|---------|--------|\n| Task 1: Interfaces | 30 min | LOW |\n| Task 2: Doc+Chunk | 45 min | MEDIUM |\n| Task 3: Entity | 60 min | MED-HIGH |\n| Task 4: Relation | 30 min | MEDIUM |\n| Task 5: Taxonomy | 30 min | LOW |\n| Task 6: Ontology | 30 min | LOW |\n| Task 7: Semantic+Cleanup | 45 min | LOW-MED |\n| **TOTAL** | ~4.5h | |\n",
"structuredPatch": [],
"originalFile": null
}
}