claude-mpm 3.7.8__py3-none-any.whl → 3.8.1__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.
Files changed (93) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +0 -106
  3. claude_mpm/agents/INSTRUCTIONS.md +0 -96
  4. claude_mpm/agents/MEMORY.md +88 -0
  5. claude_mpm/agents/WORKFLOW.md +86 -0
  6. claude_mpm/agents/templates/code_analyzer.json +2 -2
  7. claude_mpm/agents/templates/data_engineer.json +1 -1
  8. claude_mpm/agents/templates/documentation.json +1 -1
  9. claude_mpm/agents/templates/engineer.json +1 -1
  10. claude_mpm/agents/templates/ops.json +1 -1
  11. claude_mpm/agents/templates/qa.json +1 -1
  12. claude_mpm/agents/templates/research.json +1 -1
  13. claude_mpm/agents/templates/security.json +1 -1
  14. claude_mpm/agents/templates/ticketing.json +2 -7
  15. claude_mpm/agents/templates/version_control.json +1 -1
  16. claude_mpm/agents/templates/web_qa.json +2 -2
  17. claude_mpm/agents/templates/web_ui.json +2 -2
  18. claude_mpm/cli/__init__.py +2 -2
  19. claude_mpm/cli/commands/__init__.py +2 -1
  20. claude_mpm/cli/commands/tickets.py +596 -19
  21. claude_mpm/cli/parser.py +217 -5
  22. claude_mpm/config/__init__.py +30 -39
  23. claude_mpm/config/socketio_config.py +8 -5
  24. claude_mpm/constants.py +13 -0
  25. claude_mpm/core/__init__.py +8 -18
  26. claude_mpm/core/cache.py +596 -0
  27. claude_mpm/core/claude_runner.py +166 -622
  28. claude_mpm/core/config.py +5 -1
  29. claude_mpm/core/constants.py +339 -0
  30. claude_mpm/core/container.py +461 -22
  31. claude_mpm/core/exceptions.py +392 -0
  32. claude_mpm/core/framework_loader.py +208 -94
  33. claude_mpm/core/interactive_session.py +432 -0
  34. claude_mpm/core/interfaces.py +424 -0
  35. claude_mpm/core/lazy.py +467 -0
  36. claude_mpm/core/logging_config.py +444 -0
  37. claude_mpm/core/oneshot_session.py +465 -0
  38. claude_mpm/core/optimized_agent_loader.py +485 -0
  39. claude_mpm/core/optimized_startup.py +490 -0
  40. claude_mpm/core/service_registry.py +52 -26
  41. claude_mpm/core/socketio_pool.py +162 -5
  42. claude_mpm/core/types.py +292 -0
  43. claude_mpm/core/typing_utils.py +477 -0
  44. claude_mpm/hooks/claude_hooks/hook_handler.py +213 -99
  45. claude_mpm/init.py +2 -1
  46. claude_mpm/services/__init__.py +78 -14
  47. claude_mpm/services/agent/__init__.py +24 -0
  48. claude_mpm/services/agent/deployment.py +2548 -0
  49. claude_mpm/services/agent/management.py +598 -0
  50. claude_mpm/services/agent/registry.py +813 -0
  51. claude_mpm/services/agents/deployment/agent_deployment.py +587 -268
  52. claude_mpm/services/agents/memory/agent_memory_manager.py +156 -1
  53. claude_mpm/services/async_session_logger.py +8 -3
  54. claude_mpm/services/communication/__init__.py +21 -0
  55. claude_mpm/services/communication/socketio.py +1933 -0
  56. claude_mpm/services/communication/websocket.py +479 -0
  57. claude_mpm/services/core/__init__.py +123 -0
  58. claude_mpm/services/core/base.py +247 -0
  59. claude_mpm/services/core/interfaces.py +951 -0
  60. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +23 -23
  61. claude_mpm/services/framework_claude_md_generator.py +3 -2
  62. claude_mpm/services/health_monitor.py +4 -3
  63. claude_mpm/services/hook_service.py +64 -4
  64. claude_mpm/services/infrastructure/__init__.py +21 -0
  65. claude_mpm/services/infrastructure/logging.py +202 -0
  66. claude_mpm/services/infrastructure/monitoring.py +893 -0
  67. claude_mpm/services/memory/indexed_memory.py +648 -0
  68. claude_mpm/services/project/__init__.py +21 -0
  69. claude_mpm/services/project/analyzer.py +864 -0
  70. claude_mpm/services/project/registry.py +608 -0
  71. claude_mpm/services/project_analyzer.py +95 -2
  72. claude_mpm/services/recovery_manager.py +15 -9
  73. claude_mpm/services/socketio/__init__.py +25 -0
  74. claude_mpm/services/socketio/handlers/__init__.py +25 -0
  75. claude_mpm/services/socketio/handlers/base.py +121 -0
  76. claude_mpm/services/socketio/handlers/connection.py +198 -0
  77. claude_mpm/services/socketio/handlers/file.py +213 -0
  78. claude_mpm/services/socketio/handlers/git.py +723 -0
  79. claude_mpm/services/socketio/handlers/memory.py +27 -0
  80. claude_mpm/services/socketio/handlers/project.py +25 -0
  81. claude_mpm/services/socketio/handlers/registry.py +145 -0
  82. claude_mpm/services/socketio_client_manager.py +12 -7
  83. claude_mpm/services/socketio_server.py +156 -30
  84. claude_mpm/services/ticket_manager.py +170 -7
  85. claude_mpm/utils/error_handler.py +1 -1
  86. claude_mpm/validation/agent_validator.py +27 -14
  87. claude_mpm/validation/frontmatter_validator.py +231 -0
  88. {claude_mpm-3.7.8.dist-info → claude_mpm-3.8.1.dist-info}/METADATA +58 -21
  89. {claude_mpm-3.7.8.dist-info → claude_mpm-3.8.1.dist-info}/RECORD +93 -53
  90. {claude_mpm-3.7.8.dist-info → claude_mpm-3.8.1.dist-info}/WHEEL +0 -0
  91. {claude_mpm-3.7.8.dist-info → claude_mpm-3.8.1.dist-info}/entry_points.txt +0 -0
  92. {claude_mpm-3.7.8.dist-info → claude_mpm-3.8.1.dist-info}/licenses/LICENSE +0 -0
  93. {claude_mpm-3.7.8.dist-info → claude_mpm-3.8.1.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="List recent tickets"
312
+ help="Manage tickets and tracking"
313
313
  )
314
314
  add_common_arguments(tickets_parser)
315
- tickets_parser.add_argument(
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
@@ -4,44 +4,35 @@
4
4
  __all__ = []
5
5
 
6
6
  # Import centralized path management
7
- try:
8
- from .paths import (
9
- paths,
10
- ClaudeMPMPaths,
11
- get_project_root,
12
- get_src_dir,
13
- get_claude_mpm_dir,
14
- get_agents_dir,
15
- get_services_dir,
16
- get_config_dir,
17
- get_version,
18
- ensure_src_in_path
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
- # Try to import HookConfig if it exists
36
- try:
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
- # Import AgentConfig
43
- try:
44
- from .agent_config import AgentConfig, get_agent_config, set_agent_config, reset_agent_config
45
- __all__.extend(['AgentConfig', 'get_agent_config', 'set_agent_config', 'reset_agent_config'])
46
- except ImportError:
47
- pass
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 = 8765
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 = 60
31
- ping_interval: int = 25
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 = 10000
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 = 3
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
@@ -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
- try:
15
- from .container import DIContainer, ServiceLifetime, get_container
16
- from .service_registry import ServiceRegistry, get_service_registry, initialize_services
17
- from .injectable_service import InjectableService
18
- from .factories import (
19
- ServiceFactory, AgentServiceFactory, SessionManagerFactory,
20
- ConfigurationFactory, get_factory_registry
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",