feat: Fix discovery system critical issues
Resolved multiple critical discovery system issues: ## Discovery System Fixes - Fixed console commands not being discovered on first run - Implemented fallback discovery for empty caches - Added context-aware caching with separate cache keys - Fixed object serialization preventing __PHP_Incomplete_Class ## Cache System Improvements - Smart caching that only caches meaningful results - Separate caches for different execution contexts (console, web, test) - Proper array serialization/deserialization for cache compatibility - Cache hit logging for debugging and monitoring ## Object Serialization Fixes - Fixed DiscoveredAttribute serialization with proper string conversion - Sanitized additional data to prevent object reference issues - Added fallback for corrupted cache entries ## Performance & Reliability - All 69 console commands properly discovered and cached - 534 total discovery items successfully cached and restored - No more __PHP_Incomplete_Class cache corruption - Improved error handling and graceful fallbacks ## Testing & Quality - Fixed code style issues across discovery components - Enhanced logging for better debugging capabilities - Improved cache validation and error recovery Ready for production deployment with stable discovery system. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
97
tests/debug/test-discovery-single-file.php
Normal file
97
tests/debug/test-discovery-single-file.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
echo "Testing Discovery on single MCP command file...\n\n";
|
||||
|
||||
// Setup basic dependencies
|
||||
$clock = new \App\Framework\DateTime\SystemClock();
|
||||
$highResClock = new \App\Framework\DateTime\SystemHighResolutionClock();
|
||||
$memoryMonitor = new \App\Framework\Performance\MemoryMonitor();
|
||||
$collector = new \App\Framework\Performance\EnhancedPerformanceCollector(
|
||||
$clock,
|
||||
$highResClock,
|
||||
$memoryMonitor,
|
||||
enabled: false
|
||||
);
|
||||
$container = new \App\Framework\DI\DefaultContainer();
|
||||
$cache = (new \App\Framework\Cache\CacheInitializer($collector, $container))();
|
||||
|
||||
// Setup required services
|
||||
$pathProvider = new \App\Framework\Core\PathProvider('/var/www/html');
|
||||
$reflectionProvider = new \App\Framework\Reflection\CachedReflectionProvider();
|
||||
|
||||
// Create discovery configuration
|
||||
$config = \App\Framework\Discovery\ValueObjects\DiscoveryConfiguration::development();
|
||||
|
||||
// Add just the console command mapper
|
||||
$consoleMapper = new \App\Framework\Console\ConsoleCommandMapper();
|
||||
|
||||
echo "Testing ConsoleCommandMapper directly on the MCP command file...\n";
|
||||
|
||||
// Test the mapper directly
|
||||
$className = \App\Framework\Core\ValueObjects\ClassName::create('App\Framework\Mcp\Console\McpServerCommand');
|
||||
$class = new \App\Framework\Reflection\WrappedReflectionClass($className);
|
||||
|
||||
$methods = $class->getMethods();
|
||||
foreach ($methods as $method) {
|
||||
$attributes = $method->getAttributes(\App\Framework\Console\ConsoleCommand::class);
|
||||
|
||||
echo "Method: " . $method->getName() . "\n";
|
||||
echo "Attributes found: " . count($attributes) . "\n";
|
||||
|
||||
foreach ($attributes as $attribute) {
|
||||
echo " Attribute: " . $attribute->getName() . "\n";
|
||||
|
||||
$instance = $attribute->newInstance();
|
||||
echo " Instance: " . get_class($instance) . "\n";
|
||||
|
||||
// Test the mapper
|
||||
$mappedResult = $consoleMapper->map($method, $instance);
|
||||
if ($mappedResult) {
|
||||
echo " ✅ Mapper result: " . json_encode($mappedResult, JSON_PRETTY_PRINT) . "\n";
|
||||
} else {
|
||||
echo " ❌ Mapper returned null\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
echo "Now testing full discovery on just this one file...\n";
|
||||
|
||||
// Create a minimal discovery service to test just this file
|
||||
$discoveryService = new \App\Framework\Discovery\UnifiedDiscoveryService(
|
||||
pathProvider: $pathProvider,
|
||||
cache: $cache,
|
||||
clock: $clock,
|
||||
reflectionProvider: $reflectionProvider,
|
||||
configuration: $config,
|
||||
attributeMappers: [$consoleMapper],
|
||||
targetInterfaces: []
|
||||
);
|
||||
|
||||
// Test discovery on specific file
|
||||
$filePath = \App\Framework\Filesystem\FilePath::fromString('/var/www/html/src/Framework/Mcp/Console/McpServerCommand.php');
|
||||
|
||||
try {
|
||||
echo "Attempting to discover attributes in: " . $filePath->getPath() . "\n";
|
||||
|
||||
// Try to get the discovery to process this specific file
|
||||
$result = $discoveryService->discover();
|
||||
|
||||
if ($result instanceof \App\Framework\Discovery\Results\DiscoveryRegistry) {
|
||||
$consoleCommands = $result->attributes->get(\App\Framework\Console\ConsoleCommand::class);
|
||||
echo "Console commands found: " . count($consoleCommands) . "\n";
|
||||
|
||||
foreach ($consoleCommands as $command) {
|
||||
echo " - Command: " . json_encode($command->getArguments(), JSON_PRETTY_PRINT) . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo "Discovery failed: " . $e->getMessage() . "\n";
|
||||
echo "File: " . $e->getFile() . ":" . $e->getLine() . "\n";
|
||||
}
|
||||
Reference in New Issue
Block a user