{
"event": "PreToolUse",
"tool_name": "mcp__mcp-tasks__tasks_create",
"tool_input": {
"title": "Phase 3: ContractValidator Refactoring (SRP)",
"description": "## Voraussetzungen (ZUERST LESEN)\n\n1. **Lies \/var\/www\/CLAUDE.md** vollständig\n2. **Verpflichtung:** Alle Contracts, Quality-Checks und MCP-Tools gemäß CLAUDE.md einhalten\n3. **Abhängigkeit:** Phase 2e (alle Server migriert) muss abgeschlossen sein\n\n## Kontext\n\n- **Dokument:** \/mcp\/mcp-server-refactoring-plan (ID 156, v1.2)\n- **Problem:** ContractValidator hat 409 LOC und 3+ Verantwortlichkeiten\n\n## Ist-Zustand\n\n```bash\ncode_class(\"ContractValidator\")\ncode_impact(\"ContractValidator\")\n```\n\nAktuelle Verantwortlichkeiten:\n1. Pfad-Auflösung + Glob\n2. Regel-Parsing\n3. Regel-Auswertung\n4. Ergebnis-Aggregation\n\n## Ziel-Struktur\n\n```\nmcp_contracts\/validators\/\n├── contract_validator.py # Orchestrierung (< 150 LOC)\n├── scope_resolver.py # Pfad-Auflösung + Glob (< 100 LOC)\n└── rule_evaluator.py # Domain Service für Regelauswertung (< 200 LOC)\n```\n\n## Migrations-Schritte\n\n### 3.1 scope_resolver.py extrahieren (< 100 LOC)\n```python\nclass ScopeResolver:\n \\\"\\\"\\\"Löst Pfade und Glob-Patterns auf.\\\"\\\"\\\"\n \n def resolve_paths(self, patterns: list[str]) -> list[Path]: ...\n def match_glob(self, pattern: str, root: Path) -> list[Path]: ...\n```\n\n- [ ] 100% Test-Coverage (reine Logik)\n\n### 3.2 rule_evaluator.py extrahieren (< 200 LOC)\n```python\n\\\"\\\"\\\"\nDomain Service für Regel-Auswertung.\n\nWICHTIG: Dies ist KEIN Repository!\nKeine CRUD-Operationen, nur Business-Logik.\n\\\"\\\"\\\"\n\nclass RuleEvaluator:\n \\\"\\\"\\\"Evaluiert Contract-Regeln gegen Code.\\\"\\\"\\\"\n \n def evaluate_rule(self, rule: Rule, content: str) -> RuleResult: ...\n def aggregate_results(self, results: list[RuleResult]) -> ValidationResult: ...\n```\n\n- [ ] 100% Test-Coverage (reine Logik)\n\n### 3.3 contract_validator.py refactoren (< 150 LOC)\n```python\nclass ContractValidator:\n \\\"\\\"\\\"Orchestriert Contract-Validierung.\\\"\\\"\\\"\n \n def __init__(\n self,\n scope_resolver: ScopeResolver,\n rule_evaluator: RuleEvaluator\n ): ...\n \n def validate(self, contract_id: int) -> ValidationResult: ...\n```\n\n## Quality Gates\n\n- [ ] `scope_resolver.py`: < 100 LOC, 100% Coverage\n- [ ] `rule_evaluator.py`: < 200 LOC, 100% Coverage (Domain Service)\n- [ ] `contract_validator.py`: < 150 LOC\n- [ ] Keine SRP-Verletzung (max 3 Verantwortlichkeiten pro Klasse)\n- [ ] `contracts_validate` funktioniert identisch wie vorher\n- [ ] `ruff check mcp_contracts\/validators\/` = 0 Fehler\n- [ ] `mypy mcp_contracts\/validators\/` = 0 Fehler\n\n## NICHT tun\n\n- [ ] rule_evaluator als Repository bezeichnen\n- [ ] CRUD-Semantik auf Domain Service anwenden\n- [ ] Mehr als 3 Parameter in Konstruktoren\n\n## Dauer\n\n1 Tag",
"type": "ai_task"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"task\": {\n \"id\": 515,\n \"uuid\": \"132a46bb-8291-4131-ad92-558b97d0200c\",\n \"title\": \"Phase 3: ContractValidator Refactoring (SRP)\",\n \"description\": \"## Voraussetzungen (ZUERST LESEN)\\n\\n1. **Lies \/var\/www\/CLAUDE.md** vollständig\\n2. **Verpflichtung:** Alle Contracts, Quality-Checks und MCP-Tools gemäß CLAUDE.md einhalten\\n3. **Abhängigkeit:** Phase 2e (alle Server migriert) muss abgeschlossen sein\\n\\n## Kontext\\n\\n- **Dokument:** \/mcp\/mcp-server-refactoring-plan (ID 156, v1.2)\\n- **Problem:** ContractValidator hat 409 LOC und 3+ Verantwortlichkeiten\\n\\n## Ist-Zustand\\n\\n```bash\\ncode_class(\\\"ContractValidator\\\")\\ncode_impact(\\\"ContractValidator\\\")\\n```\\n\\nAktuelle Verantwortlichkeiten:\\n1. Pfad-Auflösung + Glob\\n2. Regel-Parsing\\n3. Regel-Auswertung\\n4. Ergebnis-Aggregation\\n\\n## Ziel-Struktur\\n\\n```\\nmcp_contracts\/validators\/\\n├── contract_validator.py # Orchestrierung (< 150 LOC)\\n├── scope_resolver.py # Pfad-Auflösung + Glob (< 100 LOC)\\n└── rule_evaluator.py # Domain Service für Regelauswertung (< 200 LOC)\\n```\\n\\n## Migrations-Schritte\\n\\n### 3.1 scope_resolver.py extrahieren (< 100 LOC)\\n```python\\nclass ScopeResolver:\\n \\\\\\\"\\\\\\\"\\\\\\\"Löst Pfade und Glob-Patterns auf.\\\\\\\"\\\\\\\"\\\\\\\"\\n \\n def resolve_paths(self, patterns: list[str]) -> list[Path]: ...\\n def match_glob(self, pattern: str, root: Path) -> list[Path]: ...\\n```\\n\\n- [ ] 100% Test-Coverage (reine Logik)\\n\\n### 3.2 rule_evaluator.py extrahieren (< 200 LOC)\\n```python\\n\\\\\\\"\\\\\\\"\\\\\\\"\\nDomain Service für Regel-Auswertung.\\n\\nWICHTIG: Dies ist KEIN Repository!\\nKeine CRUD-Operationen, nur Business-Logik.\\n\\\\\\\"\\\\\\\"\\\\\\\"\\n\\nclass RuleEvaluator:\\n \\\\\\\"\\\\\\\"\\\\\\\"Evaluiert Contract-Regeln gegen Code.\\\\\\\"\\\\\\\"\\\\\\\"\\n \\n def evaluate_rule(self, rule: Rule, content: str) -> RuleResult: ...\\n def aggregate_results(self, results: list[RuleResult]) -> ValidationResult: ...\\n```\\n\\n- [ ] 100% Test-Coverage (reine Logik)\\n\\n### 3.3 contract_validator.py refactoren (< 150 LOC)\\n```python\\nclass ContractValidator:\\n \\\\\\\"\\\\\\\"\\\\\\\"Orchestriert Contract-Validierung.\\\\\\\"\\\\\\\"\\\\\\\"\\n \\n def __init__(\\n self,\\n scope_resolver: ScopeResolver,\\n rule_evaluator: RuleEvaluator\\n ): ...\\n \\n def validate(self, contract_id: int) -> ValidationResult: ...\\n```\\n\\n## Quality Gates\\n\\n- [ ] `scope_resolver.py`: < 100 LOC, 100% Coverage\\n- [ ] `rule_evaluator.py`: < 200 LOC, 100% Coverage (Domain Service)\\n- [ ] `contract_validator.py`: < 150 LOC\\n- [ ] Keine SRP-Verletzung (max 3 Verantwortlichkeiten pro Klasse)\\n- [ ] `contracts_validate` funktioniert identisch wie vorher\\n- [ ] `ruff check mcp_contracts\/validators\/` = 0 Fehler\\n- [ ] `mypy mcp_contracts\/validators\/` = 0 Fehler\\n\\n## NICHT tun\\n\\n- [ ] rule_evaluator als Repository bezeichnen\\n- [ ] CRUD-Semantik auf Domain Service anwenden\\n- [ ] Mehr als 3 Parameter in Konstruktoren\\n\\n## Dauer\\n\\n1 Tag\",\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-28T10:38:01.153628\",\n \"updated_at\": \"2025-12-28T10:38:01.153630\",\n \"completed_at\": null,\n \"metadata\": {}\n },\n \"message\": \"Task #515 created\"\n}"
}
]
}