{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/CodeAnalysis\/CodeScanner.php",
"limit": 100
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/CodeAnalysis\/CodeScanner.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\CodeAnalysis;\n\n\/\/ @responsibility: Rekursives Verzeichnis-Scanning für Code-Analyse\n\nuse Domain\\Repository\\CodeQualityRepositoryInterface;\nuse Domain\\Repository\\FileAnalysisRepositoryInterface;\nuse Domain\\Service\\CodeScannerInterface;\n\nfinal class CodeScanner implements CodeScannerInterface\n{\n public function __construct(\n private FileAnalysisRepositoryInterface $fileRepository,\n private CodeQualityRepositoryInterface $qualityRepository,\n private PhpFileParser $phpParser,\n private PythonFileParser $pythonParser,\n private JsFileParser $jsParser,\n private CodeQualityChecker $qualityChecker\n ) {\n }\n\n \/**\n * Scannt konfigurierte oder übergebene Verzeichnisse.\n *\n * @param array<string>|null $directories Null = konfigurierte Verzeichnisse\n * @return array{scan_id: string, files_scanned: int, files_with_errors: int, total_classes: int, total_functions: int, duration_ms: int}\n *\/\n public function scan(?array $directories = null, string $triggeredBy = 'web'): array\n {\n $start = hrtime(true);\n $scanId = $this->generateUuid();\n\n $dirs = $directories ?? $this->getEnabledDirectories();\n $items = [];\n $totalClasses = 0;\n $totalFunctions = 0;\n $filesWithErrors = 0;\n\n foreach ($dirs as $directory) {\n $config = $this->getConfigForDirectory($directory);\n $extensions = $this->parseExtensions($config['extensions'] ?? 'php');\n $excludePatterns = $this->parseExcludePatterns($config['exclude_patterns'] ?? '');\n\n $files = $this->scanDirectory($directory, $extensions, $excludePatterns);\n\n foreach ($files as $filePath) {\n $item = $this->analyzeFile($filePath, $triggeredBy);\n $items[] = $item;\n\n if ($item['parse_error'] !== null) {\n $filesWithErrors++;\n }\n $totalClasses += count($item['classes']);\n $totalFunctions += count($item['functions']);\n }\n }\n\n $this->fileRepository->saveBatch($items, $scanId);\n $this->fileRepository->deleteByNotScanId($scanId);\n\n \/\/ Quality-Analyse ausführen\n $qualityStats = $this->runQualityAnalysis($scanId);\n\n $durationMs = (int) ((hrtime(true) - $start) \/ 1_000_000);\n\n return [\n 'scan_id' => $scanId,\n 'files_scanned' => count($items),\n 'files_with_errors' => $filesWithErrors,\n 'total_classes' => $totalClasses,\n 'total_functions' => $totalFunctions,\n 'duration_ms' => $durationMs,\n 'quality_issues' => $qualityStats['total_issues'],\n 'avg_hygiene_score' => $qualityStats['avg_hygiene_score'],\n ];\n }\n\n \/**\n * @return array<string>\n *\/\n private function getEnabledDirectories(): array\n {\n $configs = $this->fileRepository->getConfiguredDirectories();\n\n return array_column($configs, 'directory');\n }\n\n \/**\n * @return array<string, mixed>\n *\/\n private function getConfigForDirectory(string $directory): array\n {\n $configs = $this->fileRepository->getConfiguredDirectories();\n foreach ($configs as $config) {\n if ($config['directory'] === $directory) {\n return $config;\n }",
"numLines": 100,
"startLine": 1,
"totalLines": 270
}
}
}