claude-mpm 3.7.8__py3-none-any.whl → 3.9.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +0 -106
- claude_mpm/agents/INSTRUCTIONS.md +0 -96
- claude_mpm/agents/MEMORY.md +94 -0
- claude_mpm/agents/WORKFLOW.md +86 -0
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +1 -1
- claude_mpm/agents/templates/engineer.json +1 -1
- claude_mpm/agents/templates/ops.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/research.json +1 -1
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +3 -8
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +2 -2
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +2 -2
- claude_mpm/cli/commands/__init__.py +2 -1
- claude_mpm/cli/commands/agents.py +8 -3
- claude_mpm/cli/commands/tickets.py +596 -19
- claude_mpm/cli/parser.py +217 -5
- claude_mpm/config/__init__.py +30 -39
- claude_mpm/config/socketio_config.py +8 -5
- claude_mpm/constants.py +13 -0
- claude_mpm/core/__init__.py +8 -18
- claude_mpm/core/cache.py +596 -0
- claude_mpm/core/claude_runner.py +166 -622
- claude_mpm/core/config.py +7 -3
- claude_mpm/core/constants.py +339 -0
- claude_mpm/core/container.py +548 -38
- claude_mpm/core/exceptions.py +392 -0
- claude_mpm/core/framework_loader.py +249 -93
- claude_mpm/core/interactive_session.py +479 -0
- claude_mpm/core/interfaces.py +424 -0
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/logging_config.py +444 -0
- claude_mpm/core/oneshot_session.py +465 -0
- claude_mpm/core/optimized_agent_loader.py +485 -0
- claude_mpm/core/optimized_startup.py +490 -0
- claude_mpm/core/service_registry.py +52 -26
- claude_mpm/core/socketio_pool.py +162 -5
- claude_mpm/core/types.py +292 -0
- claude_mpm/core/typing_utils.py +477 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +213 -99
- claude_mpm/init.py +2 -1
- claude_mpm/services/__init__.py +78 -14
- claude_mpm/services/agent/__init__.py +24 -0
- claude_mpm/services/agent/deployment.py +2548 -0
- claude_mpm/services/agent/management.py +598 -0
- claude_mpm/services/agent/registry.py +813 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +728 -308
- claude_mpm/services/agents/memory/agent_memory_manager.py +160 -4
- claude_mpm/services/async_session_logger.py +8 -3
- claude_mpm/services/communication/__init__.py +21 -0
- claude_mpm/services/communication/socketio.py +1933 -0
- claude_mpm/services/communication/websocket.py +479 -0
- claude_mpm/services/core/__init__.py +123 -0
- claude_mpm/services/core/base.py +247 -0
- claude_mpm/services/core/interfaces.py +951 -0
- claude_mpm/services/framework_claude_md_generator/__init__.py +10 -3
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +14 -11
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +23 -23
- claude_mpm/services/framework_claude_md_generator.py +3 -2
- claude_mpm/services/health_monitor.py +4 -3
- claude_mpm/services/hook_service.py +64 -4
- claude_mpm/services/infrastructure/__init__.py +21 -0
- claude_mpm/services/infrastructure/logging.py +202 -0
- claude_mpm/services/infrastructure/monitoring.py +893 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/project/__init__.py +21 -0
- claude_mpm/services/project/analyzer.py +864 -0
- claude_mpm/services/project/registry.py +608 -0
- claude_mpm/services/project_analyzer.py +95 -2
- claude_mpm/services/recovery_manager.py +15 -9
- claude_mpm/services/response_tracker.py +3 -5
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/handlers/__init__.py +25 -0
- claude_mpm/services/socketio/handlers/base.py +121 -0
- claude_mpm/services/socketio/handlers/connection.py +198 -0
- claude_mpm/services/socketio/handlers/file.py +213 -0
- claude_mpm/services/socketio/handlers/git.py +723 -0
- claude_mpm/services/socketio/handlers/memory.py +27 -0
- claude_mpm/services/socketio/handlers/project.py +25 -0
- claude_mpm/services/socketio/handlers/registry.py +145 -0
- claude_mpm/services/socketio_client_manager.py +12 -7
- claude_mpm/services/socketio_server.py +156 -30
- claude_mpm/services/ticket_manager.py +172 -9
- claude_mpm/services/ticket_manager_di.py +1 -1
- claude_mpm/services/version_control/semantic_versioning.py +80 -7
- claude_mpm/services/version_control/version_parser.py +528 -0
- claude_mpm/utils/error_handler.py +1 -1
- claude_mpm/validation/agent_validator.py +27 -14
- claude_mpm/validation/frontmatter_validator.py +231 -0
- {claude_mpm-3.7.8.dist-info → claude_mpm-3.9.0.dist-info}/METADATA +38 -128
- {claude_mpm-3.7.8.dist-info → claude_mpm-3.9.0.dist-info}/RECORD +100 -59
- {claude_mpm-3.7.8.dist-info → claude_mpm-3.9.0.dist-info}/WHEEL +0 -0
- {claude_mpm-3.7.8.dist-info → claude_mpm-3.9.0.dist-info}/entry_points.txt +0 -0
- {claude_mpm-3.7.8.dist-info → claude_mpm-3.9.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-3.7.8.dist-info → claude_mpm-3.9.0.dist-info}/top_level.txt +0 -0
    
        claude_mpm/cli/parser.py
    CHANGED
    
    | @@ -14,7 +14,7 @@ import argparse | |
| 14 14 | 
             
            from pathlib import Path
         | 
| 15 15 | 
             
            from typing import Optional, List
         | 
| 16 16 |  | 
| 17 | 
            -
            from ..constants import CLICommands, CLIPrefix, AgentCommands, MemoryCommands, MonitorCommands, LogLevel, ConfigCommands, AggregateCommands
         | 
| 17 | 
            +
            from ..constants import CLICommands, CLIPrefix, AgentCommands, MemoryCommands, MonitorCommands, LogLevel, ConfigCommands, AggregateCommands, TicketCommands
         | 
| 18 18 |  | 
| 19 19 |  | 
| 20 20 | 
             
            def add_common_arguments(parser: argparse.ArgumentParser, version: str = None) -> None:
         | 
| @@ -306,17 +306,229 @@ def create_parser(prog_name: str = "claude-mpm", version: str = "0.0.0") -> argp | |
| 306 306 | 
             
                add_common_arguments(run_parser)
         | 
| 307 307 | 
             
                add_run_arguments(run_parser)
         | 
| 308 308 |  | 
| 309 | 
            -
                # Tickets command
         | 
| 309 | 
            +
                # Tickets command with subcommands
         | 
| 310 310 | 
             
                tickets_parser = subparsers.add_parser(
         | 
| 311 311 | 
             
                    CLICommands.TICKETS.value,
         | 
| 312 | 
            -
                    help=" | 
| 312 | 
            +
                    help="Manage tickets and tracking"
         | 
| 313 313 | 
             
                )
         | 
| 314 314 | 
             
                add_common_arguments(tickets_parser)
         | 
| 315 | 
            -
                 | 
| 315 | 
            +
                
         | 
| 316 | 
            +
                tickets_subparsers = tickets_parser.add_subparsers(
         | 
| 317 | 
            +
                    dest="tickets_command",
         | 
| 318 | 
            +
                    help="Ticket commands",
         | 
| 319 | 
            +
                    metavar="SUBCOMMAND"
         | 
| 320 | 
            +
                )
         | 
| 321 | 
            +
                
         | 
| 322 | 
            +
                # Create ticket
         | 
| 323 | 
            +
                create_ticket_parser = tickets_subparsers.add_parser(
         | 
| 324 | 
            +
                    TicketCommands.CREATE.value,
         | 
| 325 | 
            +
                    help="Create a new ticket"
         | 
| 326 | 
            +
                )
         | 
| 327 | 
            +
                create_ticket_parser.add_argument(
         | 
| 328 | 
            +
                    "title",
         | 
| 329 | 
            +
                    help="Ticket title"
         | 
| 330 | 
            +
                )
         | 
| 331 | 
            +
                create_ticket_parser.add_argument(
         | 
| 332 | 
            +
                    "-t", "--type",
         | 
| 333 | 
            +
                    default="task",
         | 
| 334 | 
            +
                    choices=["task", "bug", "feature", "issue", "epic"],
         | 
| 335 | 
            +
                    help="Ticket type (default: task)"
         | 
| 336 | 
            +
                )
         | 
| 337 | 
            +
                create_ticket_parser.add_argument(
         | 
| 338 | 
            +
                    "-p", "--priority",
         | 
| 339 | 
            +
                    default="medium",
         | 
| 340 | 
            +
                    choices=["low", "medium", "high", "critical"],
         | 
| 341 | 
            +
                    help="Priority level (default: medium)"
         | 
| 342 | 
            +
                )
         | 
| 343 | 
            +
                create_ticket_parser.add_argument(
         | 
| 344 | 
            +
                    "-d", "--description",
         | 
| 345 | 
            +
                    nargs="*",
         | 
| 346 | 
            +
                    help="Ticket description"
         | 
| 347 | 
            +
                )
         | 
| 348 | 
            +
                create_ticket_parser.add_argument(
         | 
| 349 | 
            +
                    "--tags",
         | 
| 350 | 
            +
                    help="Comma-separated tags"
         | 
| 351 | 
            +
                )
         | 
| 352 | 
            +
                create_ticket_parser.add_argument(
         | 
| 353 | 
            +
                    "--parent-epic",
         | 
| 354 | 
            +
                    help="Parent epic ID"
         | 
| 355 | 
            +
                )
         | 
| 356 | 
            +
                create_ticket_parser.add_argument(
         | 
| 357 | 
            +
                    "--parent-issue",
         | 
| 358 | 
            +
                    help="Parent issue ID"
         | 
| 359 | 
            +
                )
         | 
| 360 | 
            +
                create_ticket_parser.add_argument(
         | 
| 361 | 
            +
                    "-v", "--verbose",
         | 
| 362 | 
            +
                    action="store_true",
         | 
| 363 | 
            +
                    help="Verbose output"
         | 
| 364 | 
            +
                )
         | 
| 365 | 
            +
                
         | 
| 366 | 
            +
                # List tickets
         | 
| 367 | 
            +
                list_tickets_parser = tickets_subparsers.add_parser(
         | 
| 368 | 
            +
                    TicketCommands.LIST.value,
         | 
| 369 | 
            +
                    help="List recent tickets"
         | 
| 370 | 
            +
                )
         | 
| 371 | 
            +
                list_tickets_parser.add_argument(
         | 
| 316 372 | 
             
                    "-n", "--limit",
         | 
| 317 373 | 
             
                    type=int,
         | 
| 318 374 | 
             
                    default=10,
         | 
| 319 | 
            -
                    help="Number of tickets to show"
         | 
| 375 | 
            +
                    help="Number of tickets to show (default: 10)"
         | 
| 376 | 
            +
                )
         | 
| 377 | 
            +
                list_tickets_parser.add_argument(
         | 
| 378 | 
            +
                    "--type",
         | 
| 379 | 
            +
                    choices=["task", "bug", "feature", "issue", "epic", "all"],
         | 
| 380 | 
            +
                    default="all",
         | 
| 381 | 
            +
                    help="Filter by ticket type"
         | 
| 382 | 
            +
                )
         | 
| 383 | 
            +
                list_tickets_parser.add_argument(
         | 
| 384 | 
            +
                    "--status",
         | 
| 385 | 
            +
                    choices=["open", "in_progress", "done", "closed", "blocked", "all"],
         | 
| 386 | 
            +
                    default="all",
         | 
| 387 | 
            +
                    help="Filter by status"
         | 
| 388 | 
            +
                )
         | 
| 389 | 
            +
                list_tickets_parser.add_argument(
         | 
| 390 | 
            +
                    "-v", "--verbose",
         | 
| 391 | 
            +
                    action="store_true",
         | 
| 392 | 
            +
                    help="Show detailed ticket information"
         | 
| 393 | 
            +
                )
         | 
| 394 | 
            +
                
         | 
| 395 | 
            +
                # View ticket
         | 
| 396 | 
            +
                view_ticket_parser = tickets_subparsers.add_parser(
         | 
| 397 | 
            +
                    TicketCommands.VIEW.value,
         | 
| 398 | 
            +
                    help="View a specific ticket"
         | 
| 399 | 
            +
                )
         | 
| 400 | 
            +
                view_ticket_parser.add_argument(
         | 
| 401 | 
            +
                    "id",
         | 
| 402 | 
            +
                    help="Ticket ID (e.g., TSK-0001)"
         | 
| 403 | 
            +
                )
         | 
| 404 | 
            +
                view_ticket_parser.add_argument(
         | 
| 405 | 
            +
                    "-v", "--verbose",
         | 
| 406 | 
            +
                    action="store_true",
         | 
| 407 | 
            +
                    help="Show metadata and full details"
         | 
| 408 | 
            +
                )
         | 
| 409 | 
            +
                
         | 
| 410 | 
            +
                # Update ticket
         | 
| 411 | 
            +
                update_ticket_parser = tickets_subparsers.add_parser(
         | 
| 412 | 
            +
                    TicketCommands.UPDATE.value,
         | 
| 413 | 
            +
                    help="Update a ticket"
         | 
| 414 | 
            +
                )
         | 
| 415 | 
            +
                update_ticket_parser.add_argument(
         | 
| 416 | 
            +
                    "id",
         | 
| 417 | 
            +
                    help="Ticket ID"
         | 
| 418 | 
            +
                )
         | 
| 419 | 
            +
                update_ticket_parser.add_argument(
         | 
| 420 | 
            +
                    "-s", "--status",
         | 
| 421 | 
            +
                    choices=["open", "in_progress", "done", "closed", "blocked"],
         | 
| 422 | 
            +
                    help="Update status"
         | 
| 423 | 
            +
                )
         | 
| 424 | 
            +
                update_ticket_parser.add_argument(
         | 
| 425 | 
            +
                    "-p", "--priority",
         | 
| 426 | 
            +
                    choices=["low", "medium", "high", "critical"],
         | 
| 427 | 
            +
                    help="Update priority"
         | 
| 428 | 
            +
                )
         | 
| 429 | 
            +
                update_ticket_parser.add_argument(
         | 
| 430 | 
            +
                    "-a", "--assign",
         | 
| 431 | 
            +
                    help="Assign to user"
         | 
| 432 | 
            +
                )
         | 
| 433 | 
            +
                update_ticket_parser.add_argument(
         | 
| 434 | 
            +
                    "--tags",
         | 
| 435 | 
            +
                    help="Update tags (comma-separated)"
         | 
| 436 | 
            +
                )
         | 
| 437 | 
            +
                update_ticket_parser.add_argument(
         | 
| 438 | 
            +
                    "-d", "--description",
         | 
| 439 | 
            +
                    nargs="*",
         | 
| 440 | 
            +
                    help="Update description"
         | 
| 441 | 
            +
                )
         | 
| 442 | 
            +
                
         | 
| 443 | 
            +
                # Close ticket
         | 
| 444 | 
            +
                close_ticket_parser = tickets_subparsers.add_parser(
         | 
| 445 | 
            +
                    TicketCommands.CLOSE.value,
         | 
| 446 | 
            +
                    help="Close a ticket"
         | 
| 447 | 
            +
                )
         | 
| 448 | 
            +
                close_ticket_parser.add_argument(
         | 
| 449 | 
            +
                    "id",
         | 
| 450 | 
            +
                    help="Ticket ID"
         | 
| 451 | 
            +
                )
         | 
| 452 | 
            +
                close_ticket_parser.add_argument(
         | 
| 453 | 
            +
                    "--resolution",
         | 
| 454 | 
            +
                    help="Resolution description"
         | 
| 455 | 
            +
                )
         | 
| 456 | 
            +
                
         | 
| 457 | 
            +
                # Delete ticket
         | 
| 458 | 
            +
                delete_ticket_parser = tickets_subparsers.add_parser(
         | 
| 459 | 
            +
                    TicketCommands.DELETE.value,
         | 
| 460 | 
            +
                    help="Delete a ticket"
         | 
| 461 | 
            +
                )
         | 
| 462 | 
            +
                delete_ticket_parser.add_argument(
         | 
| 463 | 
            +
                    "id",
         | 
| 464 | 
            +
                    help="Ticket ID"
         | 
| 465 | 
            +
                )
         | 
| 466 | 
            +
                delete_ticket_parser.add_argument(
         | 
| 467 | 
            +
                    "--force",
         | 
| 468 | 
            +
                    action="store_true",
         | 
| 469 | 
            +
                    help="Force deletion without confirmation"
         | 
| 470 | 
            +
                )
         | 
| 471 | 
            +
                
         | 
| 472 | 
            +
                # Search tickets
         | 
| 473 | 
            +
                search_tickets_parser = tickets_subparsers.add_parser(
         | 
| 474 | 
            +
                    TicketCommands.SEARCH.value,
         | 
| 475 | 
            +
                    help="Search tickets"
         | 
| 476 | 
            +
                )
         | 
| 477 | 
            +
                search_tickets_parser.add_argument(
         | 
| 478 | 
            +
                    "query",
         | 
| 479 | 
            +
                    help="Search query"
         | 
| 480 | 
            +
                )
         | 
| 481 | 
            +
                search_tickets_parser.add_argument(
         | 
| 482 | 
            +
                    "--type",
         | 
| 483 | 
            +
                    choices=["task", "bug", "feature", "issue", "epic", "all"],
         | 
| 484 | 
            +
                    default="all",
         | 
| 485 | 
            +
                    help="Filter by ticket type"
         | 
| 486 | 
            +
                )
         | 
| 487 | 
            +
                search_tickets_parser.add_argument(
         | 
| 488 | 
            +
                    "--status",
         | 
| 489 | 
            +
                    choices=["open", "in_progress", "done", "closed", "blocked", "all"],
         | 
| 490 | 
            +
                    default="all",
         | 
| 491 | 
            +
                    help="Filter by status"
         | 
| 492 | 
            +
                )
         | 
| 493 | 
            +
                search_tickets_parser.add_argument(
         | 
| 494 | 
            +
                    "-n", "--limit",
         | 
| 495 | 
            +
                    type=int,
         | 
| 496 | 
            +
                    default=20,
         | 
| 497 | 
            +
                    help="Maximum results to show"
         | 
| 498 | 
            +
                )
         | 
| 499 | 
            +
                
         | 
| 500 | 
            +
                # Add comment to ticket
         | 
| 501 | 
            +
                comment_ticket_parser = tickets_subparsers.add_parser(
         | 
| 502 | 
            +
                    TicketCommands.COMMENT.value,
         | 
| 503 | 
            +
                    help="Add comment to a ticket"
         | 
| 504 | 
            +
                )
         | 
| 505 | 
            +
                comment_ticket_parser.add_argument(
         | 
| 506 | 
            +
                    "id",
         | 
| 507 | 
            +
                    help="Ticket ID"
         | 
| 508 | 
            +
                )
         | 
| 509 | 
            +
                comment_ticket_parser.add_argument(
         | 
| 510 | 
            +
                    "comment",
         | 
| 511 | 
            +
                    nargs="+",
         | 
| 512 | 
            +
                    help="Comment text"
         | 
| 513 | 
            +
                )
         | 
| 514 | 
            +
                
         | 
| 515 | 
            +
                # Update workflow state
         | 
| 516 | 
            +
                workflow_ticket_parser = tickets_subparsers.add_parser(
         | 
| 517 | 
            +
                    TicketCommands.WORKFLOW.value,
         | 
| 518 | 
            +
                    help="Update ticket workflow state"
         | 
| 519 | 
            +
                )
         | 
| 520 | 
            +
                workflow_ticket_parser.add_argument(
         | 
| 521 | 
            +
                    "id",
         | 
| 522 | 
            +
                    help="Ticket ID"
         | 
| 523 | 
            +
                )
         | 
| 524 | 
            +
                workflow_ticket_parser.add_argument(
         | 
| 525 | 
            +
                    "state",
         | 
| 526 | 
            +
                    choices=["todo", "in_progress", "ready", "tested", "done", "blocked"],
         | 
| 527 | 
            +
                    help="New workflow state"
         | 
| 528 | 
            +
                )
         | 
| 529 | 
            +
                workflow_ticket_parser.add_argument(
         | 
| 530 | 
            +
                    "--comment",
         | 
| 531 | 
            +
                    help="Optional comment for the transition"
         | 
| 320 532 | 
             
                )
         | 
| 321 533 |  | 
| 322 534 | 
             
                # Info command
         | 
    
        claude_mpm/config/__init__.py
    CHANGED
    
    | @@ -4,44 +4,35 @@ | |
| 4 4 | 
             
            __all__ = []
         | 
| 5 5 |  | 
| 6 6 | 
             
            # Import centralized path management
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                )
         | 
| 20 | 
            -
                __all__.extend([
         | 
| 21 | 
            -
                    'paths',
         | 
| 22 | 
            -
                    'ClaudeMPMPaths', 
         | 
| 23 | 
            -
                    'get_project_root',
         | 
| 24 | 
            -
                    'get_src_dir',
         | 
| 25 | 
            -
                    'get_claude_mpm_dir',
         | 
| 26 | 
            -
                    'get_agents_dir',
         | 
| 27 | 
            -
                    'get_services_dir',
         | 
| 28 | 
            -
                    'get_config_dir',
         | 
| 29 | 
            -
                    'get_version',
         | 
| 30 | 
            -
                    'ensure_src_in_path'
         | 
| 31 | 
            -
                ])
         | 
| 32 | 
            -
            except ImportError:
         | 
| 33 | 
            -
                pass
         | 
| 7 | 
            +
            from .paths import (
         | 
| 8 | 
            +
                paths, 
         | 
| 9 | 
            +
                ClaudeMPMPaths,
         | 
| 10 | 
            +
                get_project_root,
         | 
| 11 | 
            +
                get_src_dir,
         | 
| 12 | 
            +
                get_claude_mpm_dir,
         | 
| 13 | 
            +
                get_agents_dir,
         | 
| 14 | 
            +
                get_services_dir,
         | 
| 15 | 
            +
                get_config_dir,
         | 
| 16 | 
            +
                get_version,
         | 
| 17 | 
            +
                ensure_src_in_path
         | 
| 18 | 
            +
            )
         | 
| 34 19 |  | 
| 35 | 
            -
            #  | 
| 36 | 
            -
             | 
| 37 | 
            -
                from .hook_config import HookConfig
         | 
| 38 | 
            -
                __all__.append('HookConfig')
         | 
| 39 | 
            -
            except ImportError:
         | 
| 40 | 
            -
                pass
         | 
| 20 | 
            +
            # Import configuration classes - only those that exist
         | 
| 21 | 
            +
            from .agent_config import AgentConfig, get_agent_config, set_agent_config, reset_agent_config
         | 
| 41 22 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
                 | 
| 45 | 
            -
                 | 
| 46 | 
            -
             | 
| 47 | 
            -
                 | 
| 23 | 
            +
            __all__.extend([
         | 
| 24 | 
            +
                'paths',
         | 
| 25 | 
            +
                'ClaudeMPMPaths', 
         | 
| 26 | 
            +
                'get_project_root',
         | 
| 27 | 
            +
                'get_src_dir',
         | 
| 28 | 
            +
                'get_claude_mpm_dir',
         | 
| 29 | 
            +
                'get_agents_dir',
         | 
| 30 | 
            +
                'get_services_dir',
         | 
| 31 | 
            +
                'get_config_dir',
         | 
| 32 | 
            +
                'get_version',
         | 
| 33 | 
            +
                'ensure_src_in_path',
         | 
| 34 | 
            +
                'AgentConfig',
         | 
| 35 | 
            +
                'get_agent_config',
         | 
| 36 | 
            +
                'set_agent_config',
         | 
| 37 | 
            +
                'reset_agent_config'
         | 
| 38 | 
            +
            ])
         | 
| @@ -15,6 +15,9 @@ from dataclasses import dataclass | |
| 15 15 | 
             
            from pathlib import Path
         | 
| 16 16 | 
             
            from typing import Dict, Any, List, Optional
         | 
| 17 17 |  | 
| 18 | 
            +
            # Import constants for default values
         | 
| 19 | 
            +
            from claude_mpm.core.constants import NetworkConfig, SystemLimits, RetryConfig
         | 
| 20 | 
            +
             | 
| 18 21 |  | 
| 19 22 | 
             
            @dataclass
         | 
| 20 23 | 
             
            class SocketIOConfig:
         | 
| @@ -22,18 +25,18 @@ class SocketIOConfig: | |
| 22 25 |  | 
| 23 26 | 
             
                # Server settings
         | 
| 24 27 | 
             
                host: str = "localhost"
         | 
| 25 | 
            -
                port: int =  | 
| 28 | 
            +
                port: int = NetworkConfig.DEFAULT_DASHBOARD_PORT
         | 
| 26 29 | 
             
                server_id: Optional[str] = None
         | 
| 27 30 |  | 
| 28 31 | 
             
                # Connection settings
         | 
| 29 32 | 
             
                cors_allowed_origins: str = "*"  # Configure properly for production
         | 
| 30 | 
            -
                ping_timeout: int =  | 
| 31 | 
            -
                ping_interval: int =  | 
| 33 | 
            +
                ping_timeout: int = NetworkConfig.PING_TIMEOUT_STANDARD
         | 
| 34 | 
            +
                ping_interval: int = NetworkConfig.PING_INTERVAL_STANDARD
         | 
| 32 35 | 
             
                max_http_buffer_size: int = 1000000
         | 
| 33 36 |  | 
| 34 37 | 
             
                # Compatibility settings
         | 
| 35 38 | 
             
                min_client_version: str = "0.7.0"
         | 
| 36 | 
            -
                max_history_size: int =  | 
| 39 | 
            +
                max_history_size: int = SystemLimits.MAX_EVENT_HISTORY
         | 
| 37 40 |  | 
| 38 41 | 
             
                # Deployment settings
         | 
| 39 42 | 
             
                deployment_mode: str = "auto"  # auto, standalone, embedded, client
         | 
| @@ -47,7 +50,7 @@ class SocketIOConfig: | |
| 47 50 |  | 
| 48 51 | 
             
                # Health monitoring
         | 
| 49 52 | 
             
                health_check_interval: int = 30
         | 
| 50 | 
            -
                max_connection_attempts: int =  | 
| 53 | 
            +
                max_connection_attempts: int = RetryConfig.MAX_CONNECTION_RETRIES
         | 
| 51 54 | 
             
                reconnection_delay: int = 1
         | 
| 52 55 |  | 
| 53 56 | 
             
                @classmethod
         | 
    
        claude_mpm/constants.py
    CHANGED
    
    | @@ -99,6 +99,19 @@ class AggregateCommands(str, Enum): | |
| 99 99 | 
             
                EXPORT = "export"
         | 
| 100 100 |  | 
| 101 101 |  | 
| 102 | 
            +
            class TicketCommands(str, Enum):
         | 
| 103 | 
            +
                """Ticket subcommand constants."""
         | 
| 104 | 
            +
                CREATE = "create"
         | 
| 105 | 
            +
                LIST = "list"
         | 
| 106 | 
            +
                VIEW = "view"
         | 
| 107 | 
            +
                UPDATE = "update"
         | 
| 108 | 
            +
                DELETE = "delete"
         | 
| 109 | 
            +
                CLOSE = "close"
         | 
| 110 | 
            +
                SEARCH = "search"
         | 
| 111 | 
            +
                COMMENT = "comment"
         | 
| 112 | 
            +
                WORKFLOW = "workflow"
         | 
| 113 | 
            +
             | 
| 114 | 
            +
             | 
| 102 115 | 
             
            class CLIFlags(str, Enum):
         | 
| 103 116 | 
             
                """CLI flag constants (without prefix)."""
         | 
| 104 117 | 
             
                # Logging flags
         | 
    
        claude_mpm/core/__init__.py
    CHANGED
    
    | @@ -2,31 +2,21 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            from .claude_runner import ClaudeRunner
         | 
| 4 4 | 
             
            from .mixins import LoggerMixin
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            # Import config components if needed
         | 
| 7 | 
            -
            try:
         | 
| 8 | 
            -
                from .config import Config
         | 
| 9 | 
            -
                from .config_aliases import ConfigAliases
         | 
| 10 | 
            -
            except ImportError:
         | 
| 11 | 
            -
                pass
         | 
| 5 | 
            +
            from .config import Config
         | 
| 12 6 |  | 
| 13 7 | 
             
            # Import DI components
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
                 | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
                )
         | 
| 22 | 
            -
            except ImportError:
         | 
| 23 | 
            -
                pass
         | 
| 8 | 
            +
            from .container import DIContainer, ServiceLifetime, get_container
         | 
| 9 | 
            +
            from .service_registry import ServiceRegistry, get_service_registry, initialize_services
         | 
| 10 | 
            +
            from .injectable_service import InjectableService
         | 
| 11 | 
            +
            from .factories import (
         | 
| 12 | 
            +
                ServiceFactory, AgentServiceFactory, SessionManagerFactory, 
         | 
| 13 | 
            +
                ConfigurationFactory, get_factory_registry
         | 
| 14 | 
            +
            )
         | 
| 24 15 |  | 
| 25 16 | 
             
            __all__ = [
         | 
| 26 17 | 
             
                "ClaudeRunner",
         | 
| 27 18 | 
             
                "LoggerMixin",
         | 
| 28 19 | 
             
                "Config",
         | 
| 29 | 
            -
                "ConfigAliases",
         | 
| 30 20 | 
             
                "DIContainer",
         | 
| 31 21 | 
             
                "ServiceLifetime",
         | 
| 32 22 | 
             
                "get_container",
         |