{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/opt\/scripts\/di-check.sh",
"offset": 60,
"limit": 50
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/opt\/scripts\/di-check.sh",
"content": "}\n\nfunction canResolve(string $dependency, array $registered): array {\n if (isset($registered[$dependency])) {\n return [\"resolvable\" => true, \"method\" => \"registered\"];\n }\n if (str_ends_with($dependency, \"Interface\")) {\n return [\"resolvable\" => false, \"method\" => \"interface_not_registered\"];\n }\n if (class_exists($dependency)) {\n return [\"resolvable\" => true, \"method\" => \"autowire\"];\n }\n return [\"resolvable\" => false, \"method\" => \"not_found\"];\n}\n\nfunction analyzeUseCase(string $file, array $registered): array {\n $issues = [];\n $content = file_get_contents($file);\n preg_match(\"\/namespace\\\\s+([^;]+);\/\", $content, $nsMatch);\n $namespace = $nsMatch[1] ?? \"\";\n preg_match(\"\/class\\\\s+(\\\\w+)\/\", $content, $classMatch);\n $className = $classMatch[1] ?? \"\";\n if (!$className) return [];\n $fullClassName = $namespace . \"\\\\\\\\\" . $className;\n if (!class_exists($fullClassName)) return [];\n try {\n $reflection = new ReflectionClass($fullClassName);\n $constructor = $reflection->getConstructor();\n if ($constructor === null) return [];\n foreach ($constructor->getParameters() as $param) {\n $type = $param->getType();\n if ($param->isDefaultValueAvailable()) continue;\n if ($type === null || !$type instanceof ReflectionNamedType) continue;\n if ($type->isBuiltin()) continue;\n $typeName = $type->getName();\n $result = canResolve($typeName, $registered);\n if (!$result[\"resolvable\"]) {\n $issues[] = [\n \"class\" => $fullClassName,\n \"parameter\" => $param->getName(),\n \"type\" => $typeName,\n \"reason\" => $result[\"method\"],\n ];\n }\n }\n } catch (ReflectionException $e) {}\n return $issues;\n}\n\n$registered = getRegisteredServices($servicesFile);",
"numLines": 50,
"startLine": 60,
"totalLines": 140
}
}
}