feat(Production): Complete production deployment infrastructure

- Add comprehensive health check system with multiple endpoints
- Add Prometheus metrics endpoint
- Add production logging configurations (5 strategies)
- Add complete deployment documentation suite:
  * QUICKSTART.md - 30-minute deployment guide
  * DEPLOYMENT_CHECKLIST.md - Printable verification checklist
  * DEPLOYMENT_WORKFLOW.md - Complete deployment lifecycle
  * PRODUCTION_DEPLOYMENT.md - Comprehensive technical reference
  * production-logging.md - Logging configuration guide
  * ANSIBLE_DEPLOYMENT.md - Infrastructure as Code automation
  * README.md - Navigation hub
  * DEPLOYMENT_SUMMARY.md - Executive summary
- Add deployment scripts and automation
- Add DEPLOYMENT_PLAN.md - Concrete plan for immediate deployment
- Update README with production-ready features

All production infrastructure is now complete and ready for deployment.
This commit is contained in:
2025-10-25 19:18:37 +02:00
parent caa85db796
commit fc3d7e6357
83016 changed files with 378904 additions and 20919 deletions

View File

@@ -5,13 +5,13 @@ declare(strict_types=1);
namespace App\Framework\Mcp;
use App\Framework\Core\AttributeMapper;
use App\Framework\Mcp\Core\ValueObjects\OutputFormat;
use App\Framework\Reflection\WrappedReflectionClass;
use App\Framework\Reflection\WrappedReflectionMethod;
use App\Framework\Mcp\Core\ValueObjects\OutputFormat;
use ReflectionEnum;
use ReflectionIntersectionType;
use ReflectionNamedType;
use ReflectionUnionType;
use ReflectionIntersectionType;
use ReflectionEnum;
final readonly class McpToolMapper implements AttributeMapper
{
@@ -48,11 +48,11 @@ final readonly class McpToolMapper implements AttributeMapper
'description' => $tool->description,
];
if (!empty($tool->category)) {
if (! empty($tool->category)) {
$schema['category'] = $tool->category;
}
if (!empty($tool->tags)) {
if (! empty($tool->tags)) {
$schema['tags'] = $tool->tags;
}
@@ -62,7 +62,7 @@ final readonly class McpToolMapper implements AttributeMapper
$schema['properties'][$paramName] = $paramSchema;
if (!$param->isOptional()) {
if (! $param->isOptional()) {
$schema['required'][] = $paramName;
}
}
@@ -142,7 +142,7 @@ final readonly class McpToolMapper implements AttributeMapper
'type' => 'string',
'enum' => ['array', 'json', 'table', 'tree', 'text', 'mermaid', 'plantuml'],
'default' => 'array',
'description' => 'Output format for the response'
'description' => 'Output format for the response',
];
}
@@ -150,14 +150,14 @@ final readonly class McpToolMapper implements AttributeMapper
if (class_exists($typeName)) {
return [
'type' => 'object',
'description' => "Instance of {$typeName}"
'description' => "Instance of {$typeName}",
];
}
// Fallback for unknown types
return [
'type' => 'string',
'description' => "Parameter of type {$typeName}"
'description' => "Parameter of type {$typeName}",
];
}
@@ -174,12 +174,12 @@ final readonly class McpToolMapper implements AttributeMapper
return [
'type' => 'string',
'enum' => $cases,
'description' => "Enum values from {$enumClass}"
'description' => "Enum values from {$enumClass}",
];
} catch (\ReflectionException) {
return [
'type' => 'string',
'description' => "Enum type {$enumClass}"
'description' => "Enum type {$enumClass}",
];
}
}
@@ -192,6 +192,7 @@ final readonly class McpToolMapper implements AttributeMapper
foreach ($type->getTypes() as $unionType) {
if ($unionType instanceof ReflectionNamedType && $unionType->getName() === 'null') {
$hasNull = true;
continue;
}
@@ -204,13 +205,14 @@ final readonly class McpToolMapper implements AttributeMapper
if ($hasNull) {
$schema['nullable'] = true;
}
return $schema;
}
return [
'anyOf' => $types,
'nullable' => $hasNull,
'description' => 'Union type parameter'
'description' => 'Union type parameter',
];
}