claude-mpm 3.9.11__py3-none-any.whl → 4.0.3__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 +1 -1
- 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 +203 -81
- 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 +305 -197
- 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 +104 -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/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 +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- 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 +120 -54
- 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 +223 -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 +145 -65
- 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 +170 -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.3.dist-info}/METADATA +27 -1
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.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.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
    
        claude_mpm/init.py
    CHANGED
    
    | @@ -1,30 +1,32 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """Initialization module for claude-mpm.
         | 
| 2 4 |  | 
| 3 5 | 
             
            Handles creation of necessary directories and configuration files.
         | 
| 4 6 | 
             
            """
         | 
| 5 7 |  | 
| 8 | 
            +
            import json
         | 
| 6 9 | 
             
            import os
         | 
| 7 10 | 
             
            import shutil
         | 
| 8 | 
            -
            from  | 
| 9 | 
            -
             | 
| 10 | 
            -
            import json
         | 
| 11 | 
            +
            from typing import Any, Dict, Optional
         | 
| 12 | 
            +
             | 
| 11 13 | 
             
            import yaml
         | 
| 12 14 |  | 
| 13 | 
            -
            from claude_mpm.core.logger import get_logger
         | 
| 14 15 | 
             
            from claude_mpm.core.constants import NetworkConfig
         | 
| 16 | 
            +
            from claude_mpm.core.logger import get_logger
         | 
| 15 17 |  | 
| 16 18 |  | 
| 17 19 | 
             
            class ProjectInitializer:
         | 
| 18 20 | 
             
                """Handles initialization of claude-mpm directories and configuration."""
         | 
| 19 | 
            -
             | 
| 21 | 
            +
             | 
| 20 22 | 
             
                def __init__(self):
         | 
| 21 23 | 
             
                    self.logger = get_logger("initializer")
         | 
| 22 24 | 
             
                    self.user_dir = Path.home() / ".claude-mpm"
         | 
| 23 25 | 
             
                    self.project_dir = None
         | 
| 24 | 
            -
             | 
| 26 | 
            +
             | 
| 25 27 | 
             
                def initialize_user_directory(self) -> bool:
         | 
| 26 28 | 
             
                    """Initialize user-level .claude-mpm directory structure.
         | 
| 27 | 
            -
             | 
| 29 | 
            +
             | 
| 28 30 | 
             
                    Creates:
         | 
| 29 31 | 
             
                    - ~/.claude-mpm/
         | 
| 30 32 | 
             
                      - agents/
         | 
| @@ -37,7 +39,7 @@ class ProjectInitializer: | |
| 37 39 | 
             
                    try:
         | 
| 38 40 | 
             
                        # Create main user directory
         | 
| 39 41 | 
             
                        self.user_dir.mkdir(exist_ok=True)
         | 
| 40 | 
            -
             | 
| 42 | 
            +
             | 
| 41 43 | 
             
                        # Create subdirectories
         | 
| 42 44 | 
             
                        directories = [
         | 
| 43 45 | 
             
                            self.user_dir / "agents" / "user-defined",
         | 
| @@ -46,34 +48,34 @@ class ProjectInitializer: | |
| 46 48 | 
             
                            self.user_dir / "templates",
         | 
| 47 49 | 
             
                            self.user_dir / "registry",
         | 
| 48 50 | 
             
                        ]
         | 
| 49 | 
            -
             | 
| 51 | 
            +
             | 
| 50 52 | 
             
                        for directory in directories:
         | 
| 51 53 | 
             
                            directory.mkdir(parents=True, exist_ok=True)
         | 
| 52 | 
            -
             | 
| 54 | 
            +
             | 
| 53 55 | 
             
                        # Check for migration from old settings.json to new configuration.yaml
         | 
| 54 56 | 
             
                        old_config_file = self.user_dir / "config" / "settings.json"
         | 
| 55 57 | 
             
                        config_file = self.user_dir / "config" / "configuration.yaml"
         | 
| 56 | 
            -
             | 
| 58 | 
            +
             | 
| 57 59 | 
             
                        # Migrate if old file exists but new doesn't
         | 
| 58 60 | 
             
                        if old_config_file.exists() and not config_file.exists():
         | 
| 59 61 | 
             
                            self._migrate_json_to_yaml(old_config_file, config_file)
         | 
| 60 62 | 
             
                        elif not config_file.exists():
         | 
| 61 63 | 
             
                            # Create default configuration if it doesn't exist
         | 
| 62 64 | 
             
                            self._create_default_config(config_file)
         | 
| 63 | 
            -
             | 
| 65 | 
            +
             | 
| 64 66 | 
             
                        # Copy agent templates if they don't exist
         | 
| 65 67 | 
             
                        self._copy_agent_templates()
         | 
| 66 | 
            -
             | 
| 68 | 
            +
             | 
| 67 69 | 
             
                        self.logger.info(f"Initialized user directory at {self.user_dir}")
         | 
| 68 70 | 
             
                        return True
         | 
| 69 | 
            -
             | 
| 71 | 
            +
             | 
| 70 72 | 
             
                    except Exception as e:
         | 
| 71 73 | 
             
                        self.logger.error(f"Failed to initialize user directory: {e}")
         | 
| 72 74 | 
             
                        return False
         | 
| 73 | 
            -
             | 
| 75 | 
            +
             | 
| 74 76 | 
             
                def initialize_project_directory(self, project_path: Optional[Path] = None) -> bool:
         | 
| 75 77 | 
             
                    """Initialize project-level .claude-mpm directory structure.
         | 
| 76 | 
            -
             | 
| 78 | 
            +
             | 
| 77 79 | 
             
                    Creates:
         | 
| 78 80 | 
             
                    - .claude-mpm/
         | 
| 79 81 | 
             
                      - agents/     (for project agent JSON files)
         | 
| @@ -89,94 +91,109 @@ class ProjectInitializer: | |
| 89 91 | 
             
                        else:
         | 
| 90 92 | 
             
                            # Check for the user's original working directory from launch script
         | 
| 91 93 | 
             
                            # The launch script sets CLAUDE_MPM_USER_PWD before changing to framework directory
         | 
| 92 | 
            -
                            user_pwd = os.environ.get( | 
| 93 | 
            -
             | 
| 94 | 
            +
                            user_pwd = os.environ.get("CLAUDE_MPM_USER_PWD")
         | 
| 95 | 
            +
             | 
| 94 96 | 
             
                            if user_pwd:
         | 
| 95 97 | 
             
                                # Use the original user working directory
         | 
| 96 98 | 
             
                                project_root = Path(user_pwd)
         | 
| 97 | 
            -
                                self.logger.debug( | 
| 99 | 
            +
                                self.logger.debug(
         | 
| 100 | 
            +
                                    f"Using user working directory from CLAUDE_MPM_USER_PWD: {project_root}"
         | 
| 101 | 
            +
                                )
         | 
| 98 102 | 
             
                            else:
         | 
| 99 103 | 
             
                                # Fallback to current working directory (backward compatibility)
         | 
| 100 104 | 
             
                                project_root = Path.cwd()
         | 
| 101 | 
            -
                                self.logger.debug( | 
| 102 | 
            -
             | 
| 105 | 
            +
                                self.logger.debug(
         | 
| 106 | 
            +
                                    f"CLAUDE_MPM_USER_PWD not set, using cwd: {project_root}"
         | 
| 107 | 
            +
                                )
         | 
| 108 | 
            +
             | 
| 103 109 | 
             
                            self.project_dir = project_root / ".claude-mpm"
         | 
| 104 | 
            -
             | 
| 110 | 
            +
             | 
| 105 111 | 
             
                        # Check if directory already exists
         | 
| 106 112 | 
             
                        directory_existed = self.project_dir.exists()
         | 
| 107 | 
            -
             | 
| 113 | 
            +
             | 
| 108 114 | 
             
                        # Migrate existing agents from project-specific subdirectory if needed
         | 
| 109 115 | 
             
                        self._migrate_project_agents()
         | 
| 110 | 
            -
             | 
| 116 | 
            +
             | 
| 111 117 | 
             
                        # Create project directory
         | 
| 112 118 | 
             
                        self.project_dir.mkdir(exist_ok=True)
         | 
| 113 | 
            -
             | 
| 119 | 
            +
             | 
| 114 120 | 
             
                        # Create subdirectories
         | 
| 115 121 | 
             
                        directories = [
         | 
| 116 | 
            -
                            self.project_dir | 
| 122 | 
            +
                            self.project_dir
         | 
| 123 | 
            +
                            / "agents",  # Direct agents directory for project agents
         | 
| 117 124 | 
             
                            self.project_dir / "config",
         | 
| 118 125 | 
             
                            self.project_dir / "responses",
         | 
| 119 126 | 
             
                            self.project_dir / "logs",
         | 
| 120 127 | 
             
                        ]
         | 
| 121 | 
            -
             | 
| 128 | 
            +
             | 
| 122 129 | 
             
                        for directory in directories:
         | 
| 123 130 | 
             
                            directory.mkdir(parents=True, exist_ok=True)
         | 
| 124 | 
            -
             | 
| 131 | 
            +
             | 
| 125 132 | 
             
                        # Create project configuration
         | 
| 126 133 | 
             
                        config_file = self.project_dir / "config" / "project.json"
         | 
| 127 134 | 
             
                        if not config_file.exists():
         | 
| 128 135 | 
             
                            self._create_project_config(config_file)
         | 
| 129 | 
            -
             | 
| 136 | 
            +
             | 
| 130 137 | 
             
                        # Create .gitignore for project directory
         | 
| 131 138 | 
             
                        gitignore = self.project_dir / ".gitignore"
         | 
| 132 139 | 
             
                        if not gitignore.exists():
         | 
| 133 140 | 
             
                            gitignore.write_text("logs/\n*.log\n*.pyc\n__pycache__/\n")
         | 
| 134 | 
            -
             | 
| 141 | 
            +
             | 
| 135 142 | 
             
                        # Log successful creation with details
         | 
| 136 143 | 
             
                        self.logger.info(f"Initialized project directory at {self.project_dir}")
         | 
| 137 144 | 
             
                        self.logger.debug(f"Created directories: agents, config, responses, logs")
         | 
| 138 | 
            -
             | 
| 145 | 
            +
             | 
| 139 146 | 
             
                        # Print appropriate message to console for visibility during startup
         | 
| 140 | 
            -
                         | 
| 141 | 
            -
             | 
| 142 | 
            -
             | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 145 | 
            -
                         | 
| 146 | 
            -
             | 
| 147 | 
            -
             | 
| 148 | 
            -
                             | 
| 149 | 
            -
             | 
| 150 | 
            -
             | 
| 147 | 
            +
                        # BUT: Don't print to stdout when running MCP server (interferes with JSON-RPC)
         | 
| 148 | 
            +
                        import sys
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                        is_mcp_mode = "mcp" in sys.argv and "start" in sys.argv
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                        if not is_mcp_mode:
         | 
| 153 | 
            +
                            if directory_existed:
         | 
| 154 | 
            +
                                print(f"✓ Found existing .claude-mpm/ directory in {project_root}")
         | 
| 155 | 
            +
                            else:
         | 
| 156 | 
            +
                                print(f"✓ Initialized .claude-mpm/ in {project_root}")
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                            # Check if migration happened
         | 
| 159 | 
            +
                            agents_dir = self.project_dir / "agents"
         | 
| 160 | 
            +
                            if agents_dir.exists() and any(agents_dir.glob("*.json")):
         | 
| 161 | 
            +
                                agent_count = len(list(agents_dir.glob("*.json")))
         | 
| 162 | 
            +
                                print(
         | 
| 163 | 
            +
                                    f"✓ Found {agent_count} project agent(s) in .claude-mpm/agents/"
         | 
| 164 | 
            +
                                )
         | 
| 165 | 
            +
             | 
| 151 166 | 
             
                        return True
         | 
| 152 | 
            -
             | 
| 167 | 
            +
             | 
| 153 168 | 
             
                    except Exception as e:
         | 
| 154 169 | 
             
                        self.logger.error(f"Failed to initialize project directory: {e}")
         | 
| 155 170 | 
             
                        print(f"✗ Failed to create .claude-mpm/ directory: {e}")
         | 
| 156 171 | 
             
                        return False
         | 
| 157 | 
            -
             | 
| 172 | 
            +
             | 
| 158 173 | 
             
                def _migrate_project_agents(self):
         | 
| 159 174 | 
             
                    """Migrate agents from old subdirectory structure to direct agents directory.
         | 
| 160 | 
            -
             | 
| 175 | 
            +
             | 
| 161 176 | 
             
                    WHY: We're simplifying the directory structure to match the deployment expectations.
         | 
| 162 | 
            -
                    The old structure had a subdirectory but the deployment now looks for agents | 
| 177 | 
            +
                    The old structure had a subdirectory but the deployment now looks for agents
         | 
| 163 178 | 
             
                    directly in .claude-mpm/agents/.
         | 
| 164 179 | 
             
                    """
         | 
| 165 180 | 
             
                    if not self.project_dir:
         | 
| 166 181 | 
             
                        return
         | 
| 167 | 
            -
             | 
| 182 | 
            +
             | 
| 168 183 | 
             
                    old_agents_dir = self.project_dir / "agents" / "project-specific"
         | 
| 169 184 | 
             
                    new_agents_dir = self.project_dir / "agents"
         | 
| 170 | 
            -
             | 
| 185 | 
            +
             | 
| 171 186 | 
             
                    # Check if old directory exists with JSON files
         | 
| 172 187 | 
             
                    if old_agents_dir.exists() and old_agents_dir.is_dir():
         | 
| 173 188 | 
             
                        json_files = list(old_agents_dir.glob("*.json"))
         | 
| 174 189 | 
             
                        if json_files:
         | 
| 175 | 
            -
                            self.logger.info( | 
| 176 | 
            -
             | 
| 190 | 
            +
                            self.logger.info(
         | 
| 191 | 
            +
                                f"Migrating {len(json_files)} agents from old subdirectory"
         | 
| 192 | 
            +
                            )
         | 
| 193 | 
            +
             | 
| 177 194 | 
             
                            # Ensure new agents directory exists
         | 
| 178 195 | 
             
                            new_agents_dir.mkdir(parents=True, exist_ok=True)
         | 
| 179 | 
            -
             | 
| 196 | 
            +
             | 
| 180 197 | 
             
                            # Move each JSON file
         | 
| 181 198 | 
             
                            migrated_count = 0
         | 
| 182 199 | 
             
                            for json_file in json_files:
         | 
| @@ -186,15 +203,26 @@ class ProjectInitializer: | |
| 186 203 | 
             
                                        # Move the file
         | 
| 187 204 | 
             
                                        shutil.move(str(json_file), str(target_file))
         | 
| 188 205 | 
             
                                        migrated_count += 1
         | 
| 189 | 
            -
                                        self.logger.debug( | 
| 206 | 
            +
                                        self.logger.debug(
         | 
| 207 | 
            +
                                            f"Migrated {json_file.name} to agents directory"
         | 
| 208 | 
            +
                                        )
         | 
| 190 209 | 
             
                                    else:
         | 
| 191 | 
            -
                                        self.logger.debug( | 
| 210 | 
            +
                                        self.logger.debug(
         | 
| 211 | 
            +
                                            f"Skipping {json_file.name} - already exists in target"
         | 
| 212 | 
            +
                                        )
         | 
| 192 213 | 
             
                                except Exception as e:
         | 
| 193 214 | 
             
                                    self.logger.error(f"Failed to migrate {json_file.name}: {e}")
         | 
| 194 | 
            -
             | 
| 215 | 
            +
             | 
| 195 216 | 
             
                            if migrated_count > 0:
         | 
| 196 | 
            -
                                 | 
| 197 | 
            -
             | 
| 217 | 
            +
                                # Don't print to stdout when running MCP server
         | 
| 218 | 
            +
                                import sys
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                                is_mcp_mode = "mcp" in sys.argv and "start" in sys.argv
         | 
| 221 | 
            +
                                if not is_mcp_mode:
         | 
| 222 | 
            +
                                    print(
         | 
| 223 | 
            +
                                        f"✓ Migrated {migrated_count} agent(s) from old location to agents/"
         | 
| 224 | 
            +
                                    )
         | 
| 225 | 
            +
             | 
| 198 226 | 
             
                            # Remove old directory if empty
         | 
| 199 227 | 
             
                            try:
         | 
| 200 228 | 
             
                                if not any(old_agents_dir.iterdir()):
         | 
| @@ -202,7 +230,7 @@ class ProjectInitializer: | |
| 202 230 | 
             
                                    self.logger.debug("Removed empty old subdirectory")
         | 
| 203 231 | 
             
                            except Exception as e:
         | 
| 204 232 | 
             
                                self.logger.debug(f"Could not remove old directory: {e}")
         | 
| 205 | 
            -
             | 
| 233 | 
            +
             | 
| 206 234 | 
             
                def _find_project_root(self) -> Optional[Path]:
         | 
| 207 235 | 
             
                    """Find project root by looking for .git or other project markers."""
         | 
| 208 236 | 
             
                    current = Path.cwd()
         | 
| @@ -215,149 +243,145 @@ class ProjectInitializer: | |
| 215 243 | 
             
                            return current
         | 
| 216 244 | 
             
                        current = current.parent
         | 
| 217 245 | 
             
                    return None
         | 
| 218 | 
            -
             | 
| 246 | 
            +
             | 
| 219 247 | 
             
                def _migrate_json_to_yaml(self, old_file: Path, new_file: Path):
         | 
| 220 248 | 
             
                    """Migrate configuration from JSON to YAML format.
         | 
| 221 | 
            -
             | 
| 249 | 
            +
             | 
| 222 250 | 
             
                    Args:
         | 
| 223 251 | 
             
                        old_file: Path to existing settings.json
         | 
| 224 252 | 
             
                        new_file: Path to new configuration.yaml
         | 
| 225 253 | 
             
                    """
         | 
| 226 254 | 
             
                    try:
         | 
| 227 255 | 
             
                        # Read existing JSON configuration
         | 
| 228 | 
            -
                        with open(old_file,  | 
| 256 | 
            +
                        with open(old_file, "r") as f:
         | 
| 229 257 | 
             
                            config = json.load(f)
         | 
| 230 | 
            -
             | 
| 258 | 
            +
             | 
| 231 259 | 
             
                        # Write as YAML
         | 
| 232 | 
            -
                        with open(new_file,  | 
| 260 | 
            +
                        with open(new_file, "w") as f:
         | 
| 233 261 | 
             
                            yaml.dump(config, f, default_flow_style=False, sort_keys=False)
         | 
| 234 | 
            -
             | 
| 235 | 
            -
                        self.logger.info( | 
| 236 | 
            -
             | 
| 262 | 
            +
             | 
| 263 | 
            +
                        self.logger.info(
         | 
| 264 | 
            +
                            f"Migrated configuration from {old_file.name} to {new_file.name}"
         | 
| 265 | 
            +
                        )
         | 
| 266 | 
            +
             | 
| 237 267 | 
             
                        # Optionally rename old file to .backup
         | 
| 238 | 
            -
                        backup_file = old_file.with_suffix( | 
| 268 | 
            +
                        backup_file = old_file.with_suffix(".json.backup")
         | 
| 239 269 | 
             
                        old_file.rename(backup_file)
         | 
| 240 270 | 
             
                        self.logger.info(f"Renamed old configuration to {backup_file.name}")
         | 
| 241 | 
            -
             | 
| 271 | 
            +
             | 
| 242 272 | 
             
                    except Exception as e:
         | 
| 243 273 | 
             
                        self.logger.error(f"Failed to migrate configuration: {e}")
         | 
| 244 274 | 
             
                        # Fall back to creating default config
         | 
| 245 275 | 
             
                        self._create_default_config(new_file)
         | 
| 246 | 
            -
             | 
| 276 | 
            +
             | 
| 247 277 | 
             
                def _create_default_config(self, config_file: Path):
         | 
| 248 278 | 
             
                    """Create default user configuration in YAML format."""
         | 
| 249 279 | 
             
                    default_config = {
         | 
| 250 280 | 
             
                        "version": "1.0",
         | 
| 251 281 | 
             
                        "hooks": {
         | 
| 252 282 | 
             
                            "enabled": True,
         | 
| 253 | 
            -
                            "port_range": list(NetworkConfig.SOCKETIO_PORT_RANGE)
         | 
| 254 | 
            -
                        },
         | 
| 255 | 
            -
                        "logging": {
         | 
| 256 | 
            -
                            "level": "INFO",
         | 
| 257 | 
            -
                            "max_size_mb": 100,
         | 
| 258 | 
            -
                            "retention_days": 30
         | 
| 283 | 
            +
                            "port_range": list(NetworkConfig.SOCKETIO_PORT_RANGE),
         | 
| 259 284 | 
             
                        },
         | 
| 285 | 
            +
                        "logging": {"level": "INFO", "max_size_mb": 100, "retention_days": 30},
         | 
| 260 286 | 
             
                        "agents": {
         | 
| 261 287 | 
             
                            "auto_discover": True,
         | 
| 262 | 
            -
                            "precedence": ["project", "user", "system"]
         | 
| 288 | 
            +
                            "precedence": ["project", "user", "system"],
         | 
| 263 289 | 
             
                        },
         | 
| 264 290 | 
             
                        "orchestration": {
         | 
| 265 291 | 
             
                            "default_mode": "subprocess",
         | 
| 266 | 
            -
                            "enable_todo_hijacking": False
         | 
| 267 | 
            -
                        }
         | 
| 292 | 
            +
                            "enable_todo_hijacking": False,
         | 
| 293 | 
            +
                        },
         | 
| 268 294 | 
             
                    }
         | 
| 269 | 
            -
             | 
| 270 | 
            -
                    with open(config_file,  | 
| 295 | 
            +
             | 
| 296 | 
            +
                    with open(config_file, "w") as f:
         | 
| 271 297 | 
             
                        yaml.dump(default_config, f, default_flow_style=False, sort_keys=False)
         | 
| 272 | 
            -
             | 
| 298 | 
            +
             | 
| 273 299 | 
             
                def _create_project_config(self, config_file: Path):
         | 
| 274 300 | 
             
                    """Create default project configuration."""
         | 
| 275 301 | 
             
                    project_config = {
         | 
| 276 302 | 
             
                        "version": "1.0",
         | 
| 277 303 | 
             
                        "project_name": Path.cwd().name,
         | 
| 278 | 
            -
                        "agents": {
         | 
| 279 | 
            -
             | 
| 280 | 
            -
                        },
         | 
| 281 | 
            -
                        "tickets": {
         | 
| 282 | 
            -
                            "auto_create": True,
         | 
| 283 | 
            -
                            "prefix": "TSK"
         | 
| 284 | 
            -
                        }
         | 
| 304 | 
            +
                        "agents": {"enabled": True},
         | 
| 305 | 
            +
                        "tickets": {"auto_create": True, "prefix": "TSK"},
         | 
| 285 306 | 
             
                    }
         | 
| 286 | 
            -
             | 
| 287 | 
            -
                    with open(config_file,  | 
| 307 | 
            +
             | 
| 308 | 
            +
                    with open(config_file, "w") as f:
         | 
| 288 309 | 
             
                        json.dump(project_config, f, indent=2)
         | 
| 289 | 
            -
             | 
| 310 | 
            +
             | 
| 290 311 | 
             
                def _copy_agent_templates(self):
         | 
| 291 312 | 
             
                    """Copy agent templates to user directory."""
         | 
| 292 313 | 
             
                    # Get the package directory
         | 
| 293 314 | 
             
                    package_dir = Path(__file__).parent
         | 
| 294 315 | 
             
                    templates_src = package_dir / "agents" / "templates"
         | 
| 295 316 | 
             
                    templates_dst = self.user_dir / "templates"
         | 
| 296 | 
            -
             | 
| 317 | 
            +
             | 
| 297 318 | 
             
                    if templates_src.exists():
         | 
| 298 319 | 
             
                        for template_file in templates_src.glob("*.md"):
         | 
| 299 320 | 
             
                            dst_file = templates_dst / template_file.name
         | 
| 300 321 | 
             
                            if not dst_file.exists():
         | 
| 301 322 | 
             
                                shutil.copy2(template_file, dst_file)
         | 
| 302 | 
            -
             | 
| 323 | 
            +
             | 
| 303 324 | 
             
                def validate_dependencies(self) -> Dict[str, bool]:
         | 
| 304 325 | 
             
                    """Validate that all required dependencies are available."""
         | 
| 305 326 | 
             
                    dependencies = {}
         | 
| 306 | 
            -
             | 
| 327 | 
            +
             | 
| 307 328 | 
             
                    # Check Python version
         | 
| 308 329 | 
             
                    import sys
         | 
| 309 | 
            -
             | 
| 310 | 
            -
                    
         | 
| 330 | 
            +
             | 
| 331 | 
            +
                    dependencies["python"] = sys.version_info >= (3, 8)
         | 
| 332 | 
            +
             | 
| 311 333 | 
             
                    # Check Claude CLI
         | 
| 312 | 
            -
                    dependencies[ | 
| 313 | 
            -
             | 
| 334 | 
            +
                    dependencies["claude_cli"] = shutil.which("claude") is not None
         | 
| 335 | 
            +
             | 
| 314 336 | 
             
                    # Check required Python packages
         | 
| 315 337 | 
             
                    required_packages = [
         | 
| 316 | 
            -
                         | 
| 317 | 
            -
                         | 
| 318 | 
            -
                         | 
| 319 | 
            -
                         | 
| 320 | 
            -
                         | 
| 321 | 
            -
                         | 
| 322 | 
            -
                         | 
| 323 | 
            -
                         | 
| 324 | 
            -
                         | 
| 325 | 
            -
                         | 
| 338 | 
            +
                        "ai_trackdown_pytools",
         | 
| 339 | 
            +
                        "yaml",
         | 
| 340 | 
            +
                        "dotenv",
         | 
| 341 | 
            +
                        "click",
         | 
| 342 | 
            +
                        "pexpect",
         | 
| 343 | 
            +
                        "psutil",
         | 
| 344 | 
            +
                        "requests",
         | 
| 345 | 
            +
                        "flask",
         | 
| 346 | 
            +
                        "watchdog",
         | 
| 347 | 
            +
                        "tree_sitter",
         | 
| 326 348 | 
             
                    ]
         | 
| 327 | 
            -
             | 
| 349 | 
            +
             | 
| 328 350 | 
             
                    for package in required_packages:
         | 
| 329 351 | 
             
                        try:
         | 
| 330 352 | 
             
                            __import__(package)
         | 
| 331 353 | 
             
                            dependencies[package] = True
         | 
| 332 354 | 
             
                        except ImportError:
         | 
| 333 355 | 
             
                            dependencies[package] = False
         | 
| 334 | 
            -
             | 
| 356 | 
            +
             | 
| 335 357 | 
             
                    return dependencies
         | 
| 336 | 
            -
             | 
| 358 | 
            +
             | 
| 337 359 | 
             
                def ensure_initialized(self) -> bool:
         | 
| 338 360 | 
             
                    """Ensure both user and project directories are initialized.
         | 
| 339 | 
            -
             | 
| 361 | 
            +
             | 
| 340 362 | 
             
                    Shows clear information about where directories are being created.
         | 
| 341 363 | 
             
                    """
         | 
| 342 364 | 
             
                    # Determine actual working directory
         | 
| 343 | 
            -
                    user_pwd = os.environ.get( | 
| 365 | 
            +
                    user_pwd = os.environ.get("CLAUDE_MPM_USER_PWD")
         | 
| 344 366 | 
             
                    if user_pwd:
         | 
| 345 367 | 
             
                        actual_wd = Path(user_pwd)
         | 
| 346 | 
            -
                        self.logger.info( | 
| 368 | 
            +
                        self.logger.info(
         | 
| 369 | 
            +
                            f"User working directory (from CLAUDE_MPM_USER_PWD): {actual_wd}"
         | 
| 370 | 
            +
                        )
         | 
| 347 371 | 
             
                    else:
         | 
| 348 372 | 
             
                        actual_wd = Path.cwd()
         | 
| 349 373 | 
             
                        self.logger.info(f"Working directory: {actual_wd}")
         | 
| 350 | 
            -
             | 
| 374 | 
            +
             | 
| 351 375 | 
             
                    framework_path = Path(__file__).parent.parent.parent
         | 
| 352 376 | 
             
                    self.logger.info(f"Framework path: {framework_path}")
         | 
| 353 | 
            -
             | 
| 377 | 
            +
             | 
| 354 378 | 
             
                    # Initialize user directory (in home)
         | 
| 355 379 | 
             
                    user_ok = self.initialize_user_directory()
         | 
| 356 | 
            -
             | 
| 380 | 
            +
             | 
| 357 381 | 
             
                    # Initialize project directory (in user's actual working directory)
         | 
| 358 382 | 
             
                    self.logger.info(f"Checking for .claude-mpm/ in {actual_wd}")
         | 
| 359 383 | 
             
                    project_ok = self.initialize_project_directory()
         | 
| 360 | 
            -
             | 
| 384 | 
            +
             | 
| 361 385 | 
             
                    return user_ok and project_ok
         | 
| 362 386 |  | 
| 363 387 |  | 
| @@ -371,9 +395,9 @@ def validate_installation(): | |
| 371 395 | 
             
                """Validate that claude-mpm is properly installed."""
         | 
| 372 396 | 
             
                initializer = ProjectInitializer()
         | 
| 373 397 | 
             
                deps = initializer.validate_dependencies()
         | 
| 374 | 
            -
             | 
| 398 | 
            +
             | 
| 375 399 | 
             
                all_ok = all(deps.values())
         | 
| 376 | 
            -
             | 
| 400 | 
            +
             | 
| 377 401 | 
             
                if not all_ok:
         | 
| 378 402 | 
             
                    print("❌ Missing dependencies:")
         | 
| 379 403 | 
             
                    for dep, status in deps.items():
         | 
| @@ -381,5 +405,5 @@ def validate_installation(): | |
| 381 405 | 
             
                            print(f"  - {dep}")
         | 
| 382 406 | 
             
                else:
         | 
| 383 407 | 
             
                    print("✅ All dependencies are installed")
         | 
| 384 | 
            -
             | 
| 385 | 
            -
                return all_ok
         | 
| 408 | 
            +
             | 
| 409 | 
            +
                return all_ok
         | 
    
        claude_mpm/models/__init__.py
    CHANGED
    
    | @@ -8,17 +8,17 @@ providing a single source of truth for data structures across the system. | |
| 8 8 | 
             
            from .agent_definition import (
         | 
| 9 9 | 
             
                AgentDefinition,
         | 
| 10 10 | 
             
                AgentMetadata,
         | 
| 11 | 
            -
                 | 
| 11 | 
            +
                AgentPermissions,
         | 
| 12 12 | 
             
                AgentSection,
         | 
| 13 | 
            +
                AgentType,
         | 
| 13 14 | 
             
                AgentWorkflow,
         | 
| 14 | 
            -
                AgentPermissions
         | 
| 15 15 | 
             
            )
         | 
| 16 16 |  | 
| 17 17 | 
             
            __all__ = [
         | 
| 18 | 
            -
                 | 
| 19 | 
            -
                 | 
| 20 | 
            -
                 | 
| 21 | 
            -
                 | 
| 22 | 
            -
                 | 
| 23 | 
            -
                 | 
| 24 | 
            -
            ]
         | 
| 18 | 
            +
                "AgentDefinition",
         | 
| 19 | 
            +
                "AgentMetadata",
         | 
| 20 | 
            +
                "AgentType",
         | 
| 21 | 
            +
                "AgentSection",
         | 
| 22 | 
            +
                "AgentWorkflow",
         | 
| 23 | 
            +
                "AgentPermissions",
         | 
| 24 | 
            +
            ]
         |