{
"event": "PreToolUse",
"tool_name": "Grep",
"tool_input": {
"pattern": "function scan",
"path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/CodeAnalysis\/CodeScanner.php",
"output_mode": "content",
"-B": 2,
"-A": 50
}
}
{
"tool_response": {
"mode": "content",
"numFiles": 0,
"filenames": [],
"content": "29- * @return array{scan_id: string, files_scanned: int, files_with_errors: int, total_classes: int, total_functions: int, duration_ms: int}\n30- *\/\n31: public function scan(?array $directories = null, string $triggeredBy = 'web'): array\n32- {\n33- $start = hrtime(true);\n34- $scanId = $this->generateUuid();\n35-\n36- $dirs = $directories ?? $this->getEnabledDirectories();\n37- $items = [];\n38- $totalClasses = 0;\n39- $totalFunctions = 0;\n40- $filesWithErrors = 0;\n41-\n42- foreach ($dirs as $directory) {\n43- $config = $this->getConfigForDirectory($directory);\n44- $extensions = $this->parseExtensions($config['extensions'] ?? 'php');\n45- $excludePatterns = $this->parseExcludePatterns($config['exclude_patterns'] ?? '');\n46-\n47- $files = $this->scanDirectory($directory, $extensions, $excludePatterns);\n48-\n49- foreach ($files as $filePath) {\n50- $item = $this->analyzeFile($filePath, $triggeredBy);\n51- $items[] = $item;\n52-\n53- if ($item['parse_error'] !== null) {\n54- $filesWithErrors++;\n55- }\n56- $totalClasses += count($item['classes']);\n57- $totalFunctions += count($item['functions']);\n58- }\n59- }\n60-\n61- $this->fileRepository->saveBatch($items, $scanId);\n62- $this->fileRepository->deleteByNotScanId($scanId);\n63-\n64- \/\/ Quality-Analyse ausführen\n65- $qualityStats = $this->runQualityAnalysis($scanId);\n66-\n67- $durationMs = (int) ((hrtime(true) - $start) \/ 1_000_000);\n68-\n69- return [\n70- 'scan_id' => $scanId,\n71- 'files_scanned' => count($items),\n72- 'files_with_errors' => $filesWithErrors,\n73- 'total_classes' => $totalClasses,\n74- 'total_functions' => $totalFunctions,\n75- 'duration_ms' => $durationMs,\n76- 'quality_issues' => $qualityStats['total_issues'],\n77- 'avg_hygiene_score' => $qualityStats['avg_hygiene_score'],\n78- ];\n79- }\n80-\n81- \/**\n--\n129- * @return array<string>\n130- *\/\n131: private function scanDirectory(string $directory, array $extensions, array $excludePatterns): array\n132- {\n133- $files = [];\n134-\n135- if (!is_dir($directory)) {\n136- return $files;\n137- }\n138-\n139- $iterator = new \\RecursiveIteratorIterator(\n140- new \\RecursiveDirectoryIterator($directory, \\RecursiveDirectoryIterator::SKIP_DOTS)\n141- );\n142-\n143- foreach ($iterator as $file) {\n144- if (!$file->isFile()) {\n145- continue;\n146- }\n147-\n148- $filePath = $file->getPathname();\n149- $ext = $file->getExtension();\n150-\n151- if (!in_array($ext, $extensions, true)) {\n152- continue;\n153- }\n154-\n155- if ($this->isExcluded($filePath, $directory, $excludePatterns)) {\n156- continue;\n157- }\n158-\n159- $files[] = $filePath;\n160- }\n161-\n162- return $files;\n163- }\n164-\n165- \/**\n166- * @param array<string> $patterns\n167- *\/\n168- private function isExcluded(string $filePath, string $rootDir, array $patterns): bool\n169- {\n170- $relativePath = str_replace($rootDir . '\/', '', $filePath);\n171-\n172- foreach ($patterns as $pattern) {\n173- if (fnmatch($pattern, $relativePath)) {\n174- return true;\n175- }\n176- }\n177-\n178- return false;\n179- }\n180-\n181- \/**",
"numLines": 107
}
}