claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +2 -2
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +330 -86
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +363 -220
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +124 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/built/dashboard.js +2 -0
- claude_mpm/dashboard/static/built/socket-client.js +2 -0
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +133 -53
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +575 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +166 -64
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +185 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
- claude_mpm-4.0.4.dist-info/RECORD +417 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            """Tool access control system for managing which tools agents can use."""
         | 
| 2 2 |  | 
| 3 | 
            -
            from typing import Dict, List, Set, Optional
         | 
| 4 3 | 
             
            import logging
         | 
| 4 | 
            +
            from typing import Dict, List, Optional, Set
         | 
| 5 5 |  | 
| 6 6 | 
             
            logger = logging.getLogger(__name__)
         | 
| 7 7 |  | 
| @@ -9,39 +9,38 @@ logger = logging.getLogger(__name__) | |
| 9 9 | 
             
            class ToolAccessControl:
         | 
| 10 10 | 
             
                """
         | 
| 11 11 | 
             
                Manages tool access permissions for different agent types.
         | 
| 12 | 
            -
             | 
| 12 | 
            +
             | 
| 13 13 | 
             
                This ensures that only authorized agents can access specific tools,
         | 
| 14 14 | 
             
                particularly restricting TodoWrite to the PM (parent process) only.
         | 
| 15 15 | 
             
                """
         | 
| 16 | 
            -
             | 
| 16 | 
            +
             | 
| 17 17 | 
             
                # Default tool sets for different contexts
         | 
| 18 18 | 
             
                PM_TOOLS = {
         | 
| 19 | 
            -
                    "Task", | 
| 20 | 
            -
                    "TodoWrite", | 
| 21 | 
            -
                    "WebSearch", | 
| 22 | 
            -
                    "WebFetch" | 
| 19 | 
            +
                    "Task",  # For delegating to agents
         | 
| 20 | 
            +
                    "TodoWrite",  # For tracking tasks (PM ONLY)
         | 
| 21 | 
            +
                    "WebSearch",  # For understanding requirements
         | 
| 22 | 
            +
                    "WebFetch",  # For fetching external resources
         | 
| 23 23 | 
             
                }
         | 
| 24 | 
            -
             | 
| 24 | 
            +
             | 
| 25 25 | 
             
                AGENT_TOOLS = {
         | 
| 26 | 
            -
                    "Read", | 
| 27 | 
            -
                    "Write", | 
| 28 | 
            -
                    "Edit", | 
| 29 | 
            -
                    "MultiEdit", | 
| 30 | 
            -
                    "Bash", | 
| 31 | 
            -
                    "Grep", | 
| 32 | 
            -
                    "Glob", | 
| 33 | 
            -
                    "LS", | 
| 34 | 
            -
                    "WebSearch", | 
| 35 | 
            -
                    "WebFetch", | 
| 36 | 
            -
                    "NotebookRead", | 
| 37 | 
            -
                    "NotebookEdit" | 
| 26 | 
            +
                    "Read",  # Read files
         | 
| 27 | 
            +
                    "Write",  # Write files
         | 
| 28 | 
            +
                    "Edit",  # Edit files
         | 
| 29 | 
            +
                    "MultiEdit",  # Multiple edits
         | 
| 30 | 
            +
                    "Bash",  # Execute commands
         | 
| 31 | 
            +
                    "Grep",  # Search in files
         | 
| 32 | 
            +
                    "Glob",  # File pattern matching
         | 
| 33 | 
            +
                    "LS",  # List directory
         | 
| 34 | 
            +
                    "WebSearch",  # Search the web
         | 
| 35 | 
            +
                    "WebFetch",  # Fetch web content
         | 
| 36 | 
            +
                    "NotebookRead",  # Read Jupyter notebooks
         | 
| 37 | 
            +
                    "NotebookEdit",  # Edit Jupyter notebooks
         | 
| 38 38 | 
             
                }
         | 
| 39 | 
            -
             | 
| 39 | 
            +
             | 
| 40 40 | 
             
                # Tool restrictions by agent type
         | 
| 41 41 | 
             
                AGENT_RESTRICTIONS: Dict[str, Set[str]] = {
         | 
| 42 42 | 
             
                    # PM has very limited tools - delegation only
         | 
| 43 43 | 
             
                    "pm": PM_TOOLS,
         | 
| 44 | 
            -
                    
         | 
| 45 44 | 
             
                    # All other agents get standard tools WITHOUT TodoWrite
         | 
| 46 45 | 
             
                    "engineer": AGENT_TOOLS,
         | 
| 47 46 | 
             
                    "research": AGENT_TOOLS,
         | 
| @@ -51,34 +50,34 @@ class ToolAccessControl: | |
| 51 50 | 
             
                    "ops": AGENT_TOOLS,
         | 
| 52 51 | 
             
                    "version_control": AGENT_TOOLS,
         | 
| 53 52 | 
             
                    "data_engineer": AGENT_TOOLS,
         | 
| 54 | 
            -
                    "architect": AGENT_TOOLS
         | 
| 53 | 
            +
                    "architect": AGENT_TOOLS,
         | 
| 55 54 | 
             
                }
         | 
| 56 | 
            -
             | 
| 55 | 
            +
             | 
| 57 56 | 
             
                def __init__(self):
         | 
| 58 57 | 
             
                    """Initialize the tool access control system."""
         | 
| 59 58 | 
             
                    self.custom_restrictions: Dict[str, Set[str]] = {}
         | 
| 60 59 | 
             
                    logger.info("Tool access control system initialized")
         | 
| 61 | 
            -
             | 
| 60 | 
            +
             | 
| 62 61 | 
             
                def get_allowed_tools(self, agent_type: str, is_parent: bool = False) -> List[str]:
         | 
| 63 62 | 
             
                    """
         | 
| 64 63 | 
             
                    Get the list of allowed tools for an agent type.
         | 
| 65 | 
            -
             | 
| 64 | 
            +
             | 
| 66 65 | 
             
                    Args:
         | 
| 67 66 | 
             
                        agent_type: The type of agent (pm, engineer, research, etc.)
         | 
| 68 67 | 
             
                        is_parent: Whether this is the parent process (PM)
         | 
| 69 | 
            -
             | 
| 68 | 
            +
             | 
| 70 69 | 
             
                    Returns:
         | 
| 71 70 | 
             
                        List of allowed tool names
         | 
| 72 71 | 
             
                    """
         | 
| 73 72 | 
             
                    # Normalize agent type
         | 
| 74 73 | 
             
                    agent_type = agent_type.lower().replace(" ", "_").replace("-", "_")
         | 
| 75 | 
            -
             | 
| 74 | 
            +
             | 
| 76 75 | 
             
                    # Parent process (PM) gets PM tools
         | 
| 77 76 | 
             
                    if is_parent or agent_type == "pm":
         | 
| 78 77 | 
             
                        allowed = self.PM_TOOLS.copy()
         | 
| 79 78 | 
             
                        logger.debug(f"PM/Parent process allowed tools: {allowed}")
         | 
| 80 79 | 
             
                        return sorted(list(allowed))
         | 
| 81 | 
            -
             | 
| 80 | 
            +
             | 
| 82 81 | 
             
                    # Check custom restrictions first
         | 
| 83 82 | 
             
                    if agent_type in self.custom_restrictions:
         | 
| 84 83 | 
             
                        allowed = self.custom_restrictions[agent_type]
         | 
| @@ -86,74 +85,82 @@ class ToolAccessControl: | |
| 86 85 | 
             
                        allowed = self.AGENT_RESTRICTIONS[agent_type]
         | 
| 87 86 | 
             
                    else:
         | 
| 88 87 | 
             
                        # Default to agent tools for unknown types
         | 
| 89 | 
            -
                        logger.warning( | 
| 88 | 
            +
                        logger.warning(
         | 
| 89 | 
            +
                            f"Unknown agent type '{agent_type}', using default agent tools"
         | 
| 90 | 
            +
                        )
         | 
| 90 91 | 
             
                        allowed = self.AGENT_TOOLS.copy()
         | 
| 91 | 
            -
             | 
| 92 | 
            +
             | 
| 92 93 | 
             
                    # Ensure TodoWrite is NEVER in child agent tools
         | 
| 93 94 | 
             
                    allowed = allowed - {"TodoWrite"}
         | 
| 94 | 
            -
             | 
| 95 | 
            +
             | 
| 95 96 | 
             
                    logger.debug(f"Agent '{agent_type}' allowed tools: {allowed}")
         | 
| 96 97 | 
             
                    return sorted(list(allowed))
         | 
| 97 | 
            -
             | 
| 98 | 
            +
             | 
| 98 99 | 
             
                def format_allowed_tools_arg(self, agent_type: str, is_parent: bool = False) -> str:
         | 
| 99 100 | 
             
                    """
         | 
| 100 101 | 
             
                    Format the allowed tools as a comma-separated string for --allowedTools argument.
         | 
| 101 | 
            -
             | 
| 102 | 
            +
             | 
| 102 103 | 
             
                    Args:
         | 
| 103 104 | 
             
                        agent_type: The type of agent
         | 
| 104 105 | 
             
                        is_parent: Whether this is the parent process
         | 
| 105 | 
            -
             | 
| 106 | 
            +
             | 
| 106 107 | 
             
                    Returns:
         | 
| 107 108 | 
             
                        Comma-separated string of allowed tools
         | 
| 108 109 | 
             
                    """
         | 
| 109 110 | 
             
                    allowed_tools = self.get_allowed_tools(agent_type, is_parent)
         | 
| 110 111 | 
             
                    return ",".join(allowed_tools)
         | 
| 111 | 
            -
             | 
| 112 | 
            +
             | 
| 112 113 | 
             
                def set_custom_restrictions(self, agent_type: str, allowed_tools: Set[str]):
         | 
| 113 114 | 
             
                    """
         | 
| 114 115 | 
             
                    Set custom tool restrictions for a specific agent type.
         | 
| 115 | 
            -
             | 
| 116 | 
            +
             | 
| 116 117 | 
             
                    Args:
         | 
| 117 118 | 
             
                        agent_type: The agent type to customize
         | 
| 118 119 | 
             
                        allowed_tools: Set of allowed tool names
         | 
| 119 120 | 
             
                    """
         | 
| 120 121 | 
             
                    agent_type = agent_type.lower().replace(" ", "_").replace("-", "_")
         | 
| 121 | 
            -
             | 
| 122 | 
            +
             | 
| 122 123 | 
             
                    # Ensure TodoWrite is not in custom restrictions for non-PM agents
         | 
| 123 124 | 
             
                    if agent_type != "pm" and "TodoWrite" in allowed_tools:
         | 
| 124 | 
            -
                        logger.warning( | 
| 125 | 
            +
                        logger.warning(
         | 
| 126 | 
            +
                            f"Removing TodoWrite from custom restrictions for {agent_type}"
         | 
| 127 | 
            +
                        )
         | 
| 125 128 | 
             
                        allowed_tools = allowed_tools - {"TodoWrite"}
         | 
| 126 | 
            -
             | 
| 129 | 
            +
             | 
| 127 130 | 
             
                    self.custom_restrictions[agent_type] = allowed_tools
         | 
| 128 131 | 
             
                    logger.info(f"Set custom tool restrictions for {agent_type}: {allowed_tools}")
         | 
| 129 | 
            -
             | 
| 130 | 
            -
                def validate_tool_usage( | 
| 132 | 
            +
             | 
| 133 | 
            +
                def validate_tool_usage(
         | 
| 134 | 
            +
                    self, agent_type: str, tool_name: str, is_parent: bool = False
         | 
| 135 | 
            +
                ) -> bool:
         | 
| 131 136 | 
             
                    """
         | 
| 132 137 | 
             
                    Validate if an agent is allowed to use a specific tool.
         | 
| 133 | 
            -
             | 
| 138 | 
            +
             | 
| 134 139 | 
             
                    Args:
         | 
| 135 140 | 
             
                        agent_type: The type of agent
         | 
| 136 141 | 
             
                        tool_name: The name of the tool
         | 
| 137 142 | 
             
                        is_parent: Whether this is the parent process
         | 
| 138 | 
            -
             | 
| 143 | 
            +
             | 
| 139 144 | 
             
                    Returns:
         | 
| 140 145 | 
             
                        True if allowed, False otherwise
         | 
| 141 146 | 
             
                    """
         | 
| 142 147 | 
             
                    allowed_tools = self.get_allowed_tools(agent_type, is_parent)
         | 
| 143 148 | 
             
                    is_allowed = tool_name in allowed_tools
         | 
| 144 | 
            -
             | 
| 149 | 
            +
             | 
| 145 150 | 
             
                    if not is_allowed:
         | 
| 146 | 
            -
                        logger.warning( | 
| 147 | 
            -
             | 
| 151 | 
            +
                        logger.warning(
         | 
| 152 | 
            +
                            f"Agent '{agent_type}' attempted to use forbidden tool '{tool_name}'"
         | 
| 153 | 
            +
                        )
         | 
| 154 | 
            +
             | 
| 148 155 | 
             
                    return is_allowed
         | 
| 149 | 
            -
             | 
| 156 | 
            +
             | 
| 150 157 | 
             
                def get_todo_guidance(self, agent_type: str) -> str:
         | 
| 151 158 | 
             
                    """
         | 
| 152 159 | 
             
                    Get guidance text for agents on how to handle TODOs.
         | 
| 153 | 
            -
             | 
| 160 | 
            +
             | 
| 154 161 | 
             
                    Args:
         | 
| 155 162 | 
             
                        agent_type: The type of agent
         | 
| 156 | 
            -
             | 
| 163 | 
            +
             | 
| 157 164 | 
             
                    Returns:
         | 
| 158 165 | 
             
                        Guidance text for handling TODOs
         | 
| 159 166 | 
             
                    """
         | 
| @@ -170,4 +177,4 @@ class ToolAccessControl: | |
| 170 177 |  | 
| 171 178 |  | 
| 172 179 | 
             
            # Global instance for easy access
         | 
| 173 | 
            -
            tool_access_control = ToolAccessControl()
         | 
| 180 | 
            +
            tool_access_control = ToolAccessControl()
         | 
    
        claude_mpm/core/types.py
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            Central type definitions for Claude MPM.
         | 
| 3 5 |  | 
| @@ -16,7 +18,6 @@ Module-specific types should remain in their respective modules. | |
| 16 18 | 
             
            from dataclasses import dataclass
         | 
| 17 19 | 
             
            from datetime import datetime
         | 
| 18 20 | 
             
            from enum import Enum
         | 
| 19 | 
            -
            from pathlib import Path
         | 
| 20 21 | 
             
            from typing import Any, Dict, List, Optional, Tuple, Union
         | 
| 21 22 |  | 
| 22 23 |  | 
| @@ -24,18 +25,19 @@ from typing import Any, Dict, List, Optional, Tuple, Union | |
| 24 25 | 
             
            @dataclass
         | 
| 25 26 | 
             
            class ServiceResult:
         | 
| 26 27 | 
             
                """Standard result type for service operations."""
         | 
| 28 | 
            +
             | 
| 27 29 | 
             
                success: bool
         | 
| 28 30 | 
             
                message: str
         | 
| 29 31 | 
             
                data: Optional[Dict[str, Any]] = None
         | 
| 30 32 | 
             
                errors: Optional[List[str]] = None
         | 
| 31 | 
            -
             | 
| 33 | 
            +
             | 
| 32 34 | 
             
                def to_dict(self) -> Dict[str, Any]:
         | 
| 33 35 | 
             
                    """Convert to dictionary representation."""
         | 
| 34 36 | 
             
                    return {
         | 
| 35 | 
            -
                         | 
| 36 | 
            -
                         | 
| 37 | 
            -
                         | 
| 38 | 
            -
                         | 
| 37 | 
            +
                        "success": self.success,
         | 
| 38 | 
            +
                        "message": self.message,
         | 
| 39 | 
            +
                        "data": self.data,
         | 
| 40 | 
            +
                        "errors": self.errors,
         | 
| 39 41 | 
             
                    }
         | 
| 40 42 |  | 
| 41 43 |  | 
| @@ -43,18 +45,24 @@ class ServiceResult: | |
| 43 45 | 
             
            @dataclass
         | 
| 44 46 | 
             
            class DeploymentResult:
         | 
| 45 47 | 
             
                """Result of an agent deployment operation."""
         | 
| 48 | 
            +
             | 
| 46 49 | 
             
                deployed: List[str]
         | 
| 47 50 | 
             
                updated: List[str]
         | 
| 48 51 | 
             
                failed: List[str]
         | 
| 49 52 | 
             
                skipped: List[str]
         | 
| 50 53 | 
             
                errors: Dict[str, str]
         | 
| 51 54 | 
             
                metadata: Dict[str, Any]
         | 
| 52 | 
            -
             | 
| 55 | 
            +
             | 
| 53 56 | 
             
                @property
         | 
| 54 57 | 
             
                def total_processed(self) -> int:
         | 
| 55 58 | 
             
                    """Get total number of agents processed."""
         | 
| 56 | 
            -
                    return  | 
| 57 | 
            -
             | 
| 59 | 
            +
                    return (
         | 
| 60 | 
            +
                        len(self.deployed)
         | 
| 61 | 
            +
                        + len(self.updated)
         | 
| 62 | 
            +
                        + len(self.failed)
         | 
| 63 | 
            +
                        + len(self.skipped)
         | 
| 64 | 
            +
                    )
         | 
| 65 | 
            +
             | 
| 58 66 | 
             
                @property
         | 
| 59 67 | 
             
                def success_rate(self) -> float:
         | 
| 60 68 | 
             
                    """Calculate deployment success rate."""
         | 
| @@ -67,12 +75,13 @@ class DeploymentResult: | |
| 67 75 | 
             
            # Agent-related types
         | 
| 68 76 | 
             
            class AgentTier(Enum):
         | 
| 69 77 | 
             
                """Agent tier levels for precedence."""
         | 
| 78 | 
            +
             | 
| 70 79 | 
             
                PROJECT = "PROJECT"  # Highest precedence - project-specific agents
         | 
| 71 | 
            -
                USER = "USER" | 
| 72 | 
            -
                SYSTEM = "SYSTEM" | 
| 73 | 
            -
             | 
| 80 | 
            +
                USER = "USER"  # User-level agents
         | 
| 81 | 
            +
                SYSTEM = "SYSTEM"  # Lowest precedence - system agents
         | 
| 82 | 
            +
             | 
| 74 83 | 
             
                @classmethod
         | 
| 75 | 
            -
                def from_string(cls, value: str) ->  | 
| 84 | 
            +
                def from_string(cls, value: str) -> "AgentTier":
         | 
| 76 85 | 
             
                    """Convert string to AgentTier enum."""
         | 
| 77 86 | 
             
                    value_upper = value.upper()
         | 
| 78 87 | 
             
                    for tier in cls:
         | 
| @@ -84,6 +93,7 @@ class AgentTier(Enum): | |
| 84 93 | 
             
            @dataclass
         | 
| 85 94 | 
             
            class AgentInfo:
         | 
| 86 95 | 
             
                """Basic agent information."""
         | 
| 96 | 
            +
             | 
| 87 97 | 
             
                agent_id: str
         | 
| 88 98 | 
             
                name: str
         | 
| 89 99 | 
             
                tier: AgentTier
         | 
| @@ -92,7 +102,7 @@ class AgentInfo: | |
| 92 102 | 
             
                description: Optional[str] = None
         | 
| 93 103 | 
             
                capabilities: Optional[List[str]] = None
         | 
| 94 104 | 
             
                metadata: Optional[Dict[str, Any]] = None
         | 
| 95 | 
            -
             | 
| 105 | 
            +
             | 
| 96 106 | 
             
                def __post_init__(self):
         | 
| 97 107 | 
             
                    """Initialize default values."""
         | 
| 98 108 | 
             
                    if self.capabilities is None:
         | 
| @@ -105,13 +115,14 @@ class AgentInfo: | |
| 105 115 | 
             
            @dataclass
         | 
| 106 116 | 
             
            class MemoryEntry:
         | 
| 107 117 | 
             
                """Single memory entry for an agent."""
         | 
| 118 | 
            +
             | 
| 108 119 | 
             
                timestamp: datetime
         | 
| 109 120 | 
             
                content: str
         | 
| 110 121 | 
             
                category: str
         | 
| 111 122 | 
             
                agent_id: str
         | 
| 112 123 | 
             
                session_id: Optional[str] = None
         | 
| 113 124 | 
             
                metadata: Optional[Dict[str, Any]] = None
         | 
| 114 | 
            -
             | 
| 125 | 
            +
             | 
| 115 126 | 
             
                def __post_init__(self):
         | 
| 116 127 | 
             
                    """Initialize default values."""
         | 
| 117 128 | 
             
                    if self.metadata is None:
         | 
| @@ -121,6 +132,7 @@ class MemoryEntry: | |
| 121 132 | 
             
            # Hook-related types
         | 
| 122 133 | 
             
            class HookType(Enum):
         | 
| 123 134 | 
             
                """Types of hooks in the system."""
         | 
| 135 | 
            +
             | 
| 124 136 | 
             
                PRE_DELEGATION = "pre_delegation"
         | 
| 125 137 | 
             
                POST_DELEGATION = "post_delegation"
         | 
| 126 138 | 
             
                PRE_RESPONSE = "pre_response"
         | 
| @@ -129,16 +141,17 @@ class HookType(Enum): | |
| 129 141 | 
             
                SHUTDOWN = "shutdown"
         | 
| 130 142 |  | 
| 131 143 |  | 
| 132 | 
            -
            @dataclass | 
| 144 | 
            +
            @dataclass
         | 
| 133 145 | 
             
            class HookContext:
         | 
| 134 146 | 
             
                """Context passed to hook handlers."""
         | 
| 147 | 
            +
             | 
| 135 148 | 
             
                event_type: str
         | 
| 136 149 | 
             
                data: Dict[str, Any]
         | 
| 137 150 | 
             
                timestamp: datetime
         | 
| 138 151 | 
             
                source: Optional[str] = None
         | 
| 139 152 | 
             
                session_id: Optional[str] = None
         | 
| 140 153 | 
             
                metadata: Optional[Dict[str, Any]] = None
         | 
| 141 | 
            -
             | 
| 154 | 
            +
             | 
| 142 155 | 
             
                def __post_init__(self):
         | 
| 143 156 | 
             
                    """Initialize default values."""
         | 
| 144 157 | 
             
                    if self.metadata is None:
         | 
| @@ -149,12 +162,13 @@ class HookContext: | |
| 149 162 | 
             
            @dataclass
         | 
| 150 163 | 
             
            class ConfigSection:
         | 
| 151 164 | 
             
                """Configuration section with validation."""
         | 
| 165 | 
            +
             | 
| 152 166 | 
             
                name: str
         | 
| 153 167 | 
             
                values: Dict[str, Any]
         | 
| 154 168 | 
             
                schema: Optional[Dict[str, Any]] = None
         | 
| 155 169 | 
             
                is_valid: bool = True
         | 
| 156 170 | 
             
                validation_errors: Optional[List[str]] = None
         | 
| 157 | 
            -
             | 
| 171 | 
            +
             | 
| 158 172 | 
             
                def __post_init__(self):
         | 
| 159 173 | 
             
                    """Initialize default values."""
         | 
| 160 174 | 
             
                    if self.validation_errors is None:
         | 
| @@ -164,6 +178,7 @@ class ConfigSection: | |
| 164 178 | 
             
            # Task/Ticket types
         | 
| 165 179 | 
             
            class TaskStatus(Enum):
         | 
| 166 180 | 
             
                """Task/ticket status values."""
         | 
| 181 | 
            +
             | 
| 167 182 | 
             
                TODO = "todo"
         | 
| 168 183 | 
             
                IN_PROGRESS = "in_progress"
         | 
| 169 184 | 
             
                BLOCKED = "blocked"
         | 
| @@ -175,6 +190,7 @@ class TaskStatus(Enum): | |
| 175 190 | 
             
            @dataclass
         | 
| 176 191 | 
             
            class TaskInfo:
         | 
| 177 192 | 
             
                """Basic task/ticket information."""
         | 
| 193 | 
            +
             | 
| 178 194 | 
             
                task_id: str
         | 
| 179 195 | 
             
                title: str
         | 
| 180 196 | 
             
                status: TaskStatus
         | 
| @@ -184,7 +200,7 @@ class TaskInfo: | |
| 184 200 | 
             
                created_at: Optional[datetime] = None
         | 
| 185 201 | 
             
                updated_at: Optional[datetime] = None
         | 
| 186 202 | 
             
                metadata: Optional[Dict[str, Any]] = None
         | 
| 187 | 
            -
             | 
| 203 | 
            +
             | 
| 188 204 | 
             
                def __post_init__(self):
         | 
| 189 205 | 
             
                    """Initialize default values."""
         | 
| 190 206 | 
             
                    if self.metadata is None:
         | 
| @@ -199,13 +215,14 @@ class TaskInfo: | |
| 199 215 | 
             
            @dataclass
         | 
| 200 216 | 
             
            class SocketMessage:
         | 
| 201 217 | 
             
                """WebSocket/SocketIO message."""
         | 
| 218 | 
            +
             | 
| 202 219 | 
             
                event: str
         | 
| 203 220 | 
             
                data: Any
         | 
| 204 221 | 
             
                room: Optional[str] = None
         | 
| 205 222 | 
             
                namespace: Optional[str] = None
         | 
| 206 223 | 
             
                sid: Optional[str] = None
         | 
| 207 224 | 
             
                metadata: Optional[Dict[str, Any]] = None
         | 
| 208 | 
            -
             | 
| 225 | 
            +
             | 
| 209 226 | 
             
                def __post_init__(self):
         | 
| 210 227 | 
             
                    """Initialize default values."""
         | 
| 211 228 | 
             
                    if self.metadata is None:
         | 
| @@ -215,6 +232,7 @@ class SocketMessage: | |
| 215 232 | 
             
            # Health monitoring types
         | 
| 216 233 | 
             
            class HealthStatus(Enum):
         | 
| 217 234 | 
             
                """Service health status levels."""
         | 
| 235 | 
            +
             | 
| 218 236 | 
             
                HEALTHY = "healthy"
         | 
| 219 237 | 
             
                DEGRADED = "degraded"
         | 
| 220 238 | 
             
                UNHEALTHY = "unhealthy"
         | 
| @@ -224,13 +242,14 @@ class HealthStatus(Enum): | |
| 224 242 | 
             
            @dataclass
         | 
| 225 243 | 
             
            class HealthCheck:
         | 
| 226 244 | 
             
                """Health check result."""
         | 
| 245 | 
            +
             | 
| 227 246 | 
             
                service_name: str
         | 
| 228 247 | 
             
                status: HealthStatus
         | 
| 229 248 | 
             
                message: str
         | 
| 230 249 | 
             
                timestamp: datetime
         | 
| 231 250 | 
             
                metrics: Optional[Dict[str, Any]] = None
         | 
| 232 251 | 
             
                checks: Optional[Dict[str, bool]] = None
         | 
| 233 | 
            -
             | 
| 252 | 
            +
             | 
| 234 253 | 
             
                def __post_init__(self):
         | 
| 235 254 | 
             
                    """Initialize default values."""
         | 
| 236 255 | 
             
                    if self.metrics is None:
         | 
| @@ -243,6 +262,7 @@ class HealthCheck: | |
| 243 262 | 
             
            @dataclass
         | 
| 244 263 | 
             
            class ProjectCharacteristics:
         | 
| 245 264 | 
             
                """Analyzed project characteristics."""
         | 
| 265 | 
            +
             | 
| 246 266 | 
             
                path: Path
         | 
| 247 267 | 
             
                name: str
         | 
| 248 268 | 
             
                type: str  # e.g., "python", "node", "mixed"
         | 
| @@ -250,7 +270,7 @@ class ProjectCharacteristics: | |
| 250 270 | 
             
                entry_points: List[Path]
         | 
| 251 271 | 
             
                structure: Dict[str, Any]
         | 
| 252 272 | 
             
                metadata: Optional[Dict[str, Any]] = None
         | 
| 253 | 
            -
             | 
| 273 | 
            +
             | 
| 254 274 | 
             
                def __post_init__(self):
         | 
| 255 275 | 
             
                    """Initialize default values."""
         | 
| 256 276 | 
             
                    if self.metadata is None:
         | 
| @@ -260,6 +280,7 @@ class ProjectCharacteristics: | |
| 260 280 | 
             
            # Error types
         | 
| 261 281 | 
             
            class ErrorSeverity(Enum):
         | 
| 262 282 | 
             
                """Error severity levels."""
         | 
| 283 | 
            +
             | 
| 263 284 | 
             
                DEBUG = "debug"
         | 
| 264 285 | 
             
                INFO = "info"
         | 
| 265 286 | 
             
                WARNING = "warning"
         | 
| @@ -270,6 +291,7 @@ class ErrorSeverity(Enum): | |
| 270 291 | 
             
            @dataclass
         | 
| 271 292 | 
             
            class ErrorContext:
         | 
| 272 293 | 
             
                """Context for error handling."""
         | 
| 294 | 
            +
             | 
| 273 295 | 
             
                error: Exception
         | 
| 274 296 | 
             
                severity: ErrorSeverity
         | 
| 275 297 | 
             
                component: str
         | 
| @@ -278,7 +300,7 @@ class ErrorContext: | |
| 278 300 | 
             
                traceback: Optional[str] = None
         | 
| 279 301 | 
             
                recovery_attempted: bool = False
         | 
| 280 302 | 
             
                metadata: Optional[Dict[str, Any]] = None
         | 
| 281 | 
            -
             | 
| 303 | 
            +
             | 
| 282 304 | 
             
                def __post_init__(self):
         | 
| 283 305 | 
             
                    """Initialize default values."""
         | 
| 284 306 | 
             
                    if self.metadata is None:
         | 
| @@ -289,4 +311,4 @@ class ErrorContext: | |
| 289 311 | 
             
            ConfigDict = Dict[str, Any]
         | 
| 290 312 | 
             
            ErrorDict = Dict[str, str]
         | 
| 291 313 | 
             
            MetricsDict = Dict[str, Union[int, float, str]]
         | 
| 292 | 
            -
            ValidationResult = Tuple[bool, Optional[List[str]]]
         | 
| 314 | 
            +
            ValidationResult = Tuple[bool, Optional[List[str]]]
         |