claude-mpm 3.4.6__tar.gz → 3.4.9__tar.gz
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-3.4.6 → claude_mpm-3.4.9}/MANIFEST.in +3 -0
- {claude_mpm-3.4.6/src/claude_mpm.egg-info → claude_mpm-3.4.9}/PKG-INFO +1 -1
- claude_mpm-3.4.9/VERSION +1 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/run.py +53 -27
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/claude_runner.py +70 -6
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/simple_runner.py +70 -6
- claude_mpm-3.4.9/src/claude_mpm/scripts/socketio_daemon.py +229 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9/src/claude_mpm.egg-info}/PKG-INFO +1 -1
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm.egg-info/SOURCES.txt +1 -0
- claude_mpm-3.4.6/VERSION +0 -1
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/CLAUDE.md +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/LICENSE +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/README.md +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/claude-mpm +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/pyproject.toml +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/requirements.txt +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/scripts/run_mpm.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/scripts/ticket +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/setup.cfg +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/setup.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/__main__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/INSTRUCTIONS.md +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/agent_loader.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/agent_loader_integration.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/agents_metadata.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/backups/INSTRUCTIONS.md +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/base_agent.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/base_agent_loader.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/schema/agent_schema.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/system_agent_config.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/data_engineer.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/documentation.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/engineer.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/ops.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/pm.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/qa.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/research.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/security.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/test_integration.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/version_control.json +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/agents.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/info.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/memory.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/monitor.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/tickets.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/commands/ui.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/parser.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli/utils.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli_module/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli_module/args.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli_module/commands.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/cli_module/migration_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/config/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/config/socketio_config.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/constants.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/agent_name_normalizer.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/agent_registry.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/agent_session_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/base_service.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/config.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/config_aliases.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/container.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/factories.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/framework_loader.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/hook_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/injectable_service.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/interfaces.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/logger.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/minimal_framework_loader.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/mixins.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/pm_hook_interceptor.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/service_registry.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/session_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/socketio_pool.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/core/tool_access_control.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/dashboard/open_dashboard.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/deployment_paths.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/experimental/cli_enhancements.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/generators/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/generators/agent_profile_generator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/base_hook.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/logging_hook_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/memory_hooks_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/mpm_command_hook.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/submit_hook_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/builtin/workflow_start_hook.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/claude_hooks/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/claude_hooks/hook_handler.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/claude_hooks/hook_wrapper.sh +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/memory_integration_hook.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/tool_call_interceptor.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/hooks/validation_hooks.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/init.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/models/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/models/agent_definition.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/direct_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/factory.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/hook_integration_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/pty_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/simple_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/schemas/workflow_validator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_capabilities_generator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_deployment.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_lifecycle_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_management_service.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_memory_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_modification_tracker.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_persistence_service.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_profile_loader.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_registry.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/agent_versioning.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/base_agent_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/deployed_agent_discovery.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/exceptions.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_agent_loader.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/content_assembler.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/content_validator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/deployment_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/header.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/section_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator/version_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/framework_claude_md_generator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/health_monitor.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/hook_service.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/memory_builder.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/memory_optimizer.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/memory_router.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/backup_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/config_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/framework_protector.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/operations.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/state_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/template_deployer.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/validation_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/parent_directory_manager/version_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/project_analyzer.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/recovery_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/shared_prompt_cache.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/socketio_client_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/socketio_server.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/standalone_socketio_server.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/ticket_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/ticket_manager_di.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/ticketing_service_original.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/version_control/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/version_control/branch_strategy.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/version_control/conflict_resolution.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/version_control/git_operations.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/services/version_control/semantic_versioning.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/ticket_wrapper.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/ui/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/ui/rich_terminal_ui.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/ui/terminal_ui.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/config_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/dependency_manager.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/error_handler.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/framework_detection.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/import_migration_example.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/imports.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/path_operations.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/utils/paths.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/validation/__init__.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/validation/agent_validator.py +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm.egg-info/dependency_links.txt +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm.egg-info/entry_points.txt +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm.egg-info/requires.txt +0 -0
- {claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm.egg-info/top_level.txt +0 -0
|
@@ -28,6 +28,9 @@ recursive-include src/claude_mpm/config *.py
|
|
|
28
28
|
# Include hook files (including shell scripts)
|
|
29
29
|
recursive-include src/claude_mpm/hooks *.py *.sh
|
|
30
30
|
|
|
31
|
+
# Include package scripts
|
|
32
|
+
recursive-include src/claude_mpm/scripts *.py
|
|
33
|
+
|
|
31
34
|
# Exclude test and cache files
|
|
32
35
|
global-exclude __pycache__
|
|
33
36
|
global-exclude *.py[co]
|
claude_mpm-3.4.9/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.4.9
|
|
@@ -467,6 +467,7 @@ def _check_socketio_server_running(port, logger):
|
|
|
467
467
|
|
|
468
468
|
DESIGN DECISION: We try multiple endpoints and connection methods to ensure
|
|
469
469
|
robust detection. Some servers may be starting up and only partially ready.
|
|
470
|
+
Added retry logic to handle race conditions during server initialization.
|
|
470
471
|
|
|
471
472
|
Args:
|
|
472
473
|
port: Port number to check
|
|
@@ -483,34 +484,50 @@ def _check_socketio_server_running(port, logger):
|
|
|
483
484
|
# First, do a basic TCP connection check
|
|
484
485
|
try:
|
|
485
486
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
486
|
-
s.settimeout(
|
|
487
|
+
s.settimeout(2.0) # Increased from 1.0s for slower connections
|
|
487
488
|
result = s.connect_ex(('127.0.0.1', port))
|
|
488
489
|
if result != 0:
|
|
489
|
-
logger.debug(f"TCP connection to port {port} failed (not
|
|
490
|
+
logger.debug(f"TCP connection to port {port} failed (server not started yet)")
|
|
490
491
|
return False
|
|
491
492
|
except Exception as e:
|
|
492
493
|
logger.debug(f"TCP socket check failed for port {port}: {e}")
|
|
493
494
|
return False
|
|
494
495
|
|
|
495
|
-
# If TCP connection succeeds, try HTTP health check
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
logger.debug(f"✅ Socket.IO server health check passed on port {port}")
|
|
502
|
-
logger.debug(f"📄 Server response: {content[:100]}...")
|
|
503
|
-
return True
|
|
504
|
-
else:
|
|
505
|
-
logger.debug(f"⚠️ HTTP response code {response.getcode()} from port {port}")
|
|
506
|
-
return False
|
|
496
|
+
# If TCP connection succeeds, try HTTP health check with retries
|
|
497
|
+
# WHY: Even when TCP is accepting connections, the HTTP handler may not be ready
|
|
498
|
+
max_retries = 3
|
|
499
|
+
for retry in range(max_retries):
|
|
500
|
+
try:
|
|
501
|
+
response = urllib.request.urlopen(f'http://localhost:{port}/status', timeout=10) # Increased from 5s to 10s
|
|
507
502
|
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
503
|
+
if response.getcode() == 200:
|
|
504
|
+
content = response.read().decode()
|
|
505
|
+
logger.debug(f"✅ Socket.IO server health check passed on port {port} (attempt {retry + 1})")
|
|
506
|
+
logger.debug(f"📄 Server response: {content[:100]}...")
|
|
507
|
+
return True
|
|
508
|
+
else:
|
|
509
|
+
logger.debug(f"⚠️ HTTP response code {response.getcode()} from port {port} (attempt {retry + 1})")
|
|
510
|
+
if retry < max_retries - 1:
|
|
511
|
+
time.sleep(0.5) # Brief pause before retry
|
|
512
|
+
|
|
513
|
+
except urllib.error.HTTPError as e:
|
|
514
|
+
logger.debug(f"⚠️ HTTP error {e.code} from server on port {port} (attempt {retry + 1})")
|
|
515
|
+
if retry < max_retries - 1 and e.code in [404, 503]: # Server starting but not ready
|
|
516
|
+
logger.debug("Server appears to be starting, retrying...")
|
|
517
|
+
time.sleep(0.5)
|
|
518
|
+
continue
|
|
519
|
+
return False
|
|
520
|
+
except urllib.error.URLError as e:
|
|
521
|
+
logger.debug(f"⚠️ URL error connecting to port {port} (attempt {retry + 1}): {e.reason}")
|
|
522
|
+
if retry < max_retries - 1:
|
|
523
|
+
logger.debug("Connection refused - server may still be initializing, retrying...")
|
|
524
|
+
time.sleep(0.5)
|
|
525
|
+
continue
|
|
526
|
+
return False
|
|
527
|
+
|
|
528
|
+
# All retries exhausted
|
|
529
|
+
logger.debug(f"Health check failed after {max_retries} attempts - server not fully ready")
|
|
530
|
+
return False
|
|
514
531
|
|
|
515
532
|
except (ConnectionError, OSError) as e:
|
|
516
533
|
logger.debug(f"🔌 Connection error checking port {port}: {e}")
|
|
@@ -569,13 +586,17 @@ def _start_standalone_socketio_server(port, logger):
|
|
|
569
586
|
# 2. Event loop setup (~1s)
|
|
570
587
|
# 3. aiohttp server binding (~2-5s)
|
|
571
588
|
# 4. Socket.IO service initialization (~1-3s)
|
|
572
|
-
# Total: up to
|
|
573
|
-
max_attempts =
|
|
574
|
-
initial_delay = 0
|
|
575
|
-
max_delay =
|
|
589
|
+
# Total: up to 15+ seconds for full readiness (especially on Python 3.13)
|
|
590
|
+
max_attempts = 30 # Increased from 20 to handle Python 3.13 slower initialization
|
|
591
|
+
initial_delay = 1.0 # Increased from 0.5s to give daemon more time to fork
|
|
592
|
+
max_delay = 3.0 # Increased from 2.0s for slower systems
|
|
576
593
|
|
|
577
594
|
logger.info(f"Waiting up to {max_attempts * max_delay} seconds for server to be fully ready...")
|
|
578
595
|
|
|
596
|
+
# Give the daemon initial time to fork and start before checking
|
|
597
|
+
logger.debug("Allowing initial daemon startup time...")
|
|
598
|
+
time.sleep(0.5)
|
|
599
|
+
|
|
579
600
|
for attempt in range(max_attempts):
|
|
580
601
|
# Progressive delay - start fast, then slow down for socket binding
|
|
581
602
|
if attempt < 5:
|
|
@@ -596,9 +617,14 @@ def _start_standalone_socketio_server(port, logger):
|
|
|
596
617
|
else:
|
|
597
618
|
logger.debug(f"Server not yet accepting connections on attempt {attempt + 1}")
|
|
598
619
|
|
|
599
|
-
logger.error(f"❌ Socket.IO server
|
|
600
|
-
logger.
|
|
601
|
-
logger.
|
|
620
|
+
logger.error(f"❌ Socket.IO server health check failed after {max_attempts} attempts ({max_attempts * max_delay:.1f}s)")
|
|
621
|
+
logger.warning(f"⏱️ Server may still be starting - initialization can take 15+ seconds on some systems")
|
|
622
|
+
logger.warning(f"💡 The daemon process might be running but not yet accepting HTTP connections")
|
|
623
|
+
logger.error(f"🔧 Troubleshooting steps:")
|
|
624
|
+
logger.error(f" - Wait a few more seconds and try again")
|
|
625
|
+
logger.error(f" - Check for port conflicts: lsof -i :{port}")
|
|
626
|
+
logger.error(f" - Try a different port with --websocket-port")
|
|
627
|
+
logger.error(f" - Verify dependencies: pip install python-socketio aiohttp")
|
|
602
628
|
return False
|
|
603
629
|
|
|
604
630
|
except Exception as e:
|
|
@@ -184,12 +184,8 @@ class ClaudeRunner:
|
|
|
184
184
|
self.logger.warning(f"Failed to connect to Socket.IO server: {e}")
|
|
185
185
|
self.websocket_server = None
|
|
186
186
|
|
|
187
|
-
# Get version
|
|
188
|
-
|
|
189
|
-
from claude_mpm import __version__
|
|
190
|
-
version_str = f"v{__version__}"
|
|
191
|
-
except:
|
|
192
|
-
version_str = "v0.0.0"
|
|
187
|
+
# Get version with robust fallback mechanisms
|
|
188
|
+
version_str = self._get_version()
|
|
193
189
|
|
|
194
190
|
# Print styled welcome box
|
|
195
191
|
print("\033[32m╭───────────────────────────────────────────────────╮\033[0m")
|
|
@@ -750,6 +746,74 @@ class ClaudeRunner:
|
|
|
750
746
|
except Exception as e:
|
|
751
747
|
self.logger.debug(f"Failed to log session event: {e}")
|
|
752
748
|
|
|
749
|
+
def _get_version(self) -> str:
|
|
750
|
+
"""
|
|
751
|
+
Robust version determination with multiple fallback mechanisms.
|
|
752
|
+
|
|
753
|
+
WHY: The version display is critical for debugging and user experience.
|
|
754
|
+
This implementation ensures we always show the correct version rather than
|
|
755
|
+
defaulting to v0.0.0, even in edge cases where imports might fail.
|
|
756
|
+
|
|
757
|
+
DESIGN DECISION: We try multiple methods in order of preference:
|
|
758
|
+
1. Package import (__version__) - fastest for normal installations
|
|
759
|
+
2. importlib.metadata - standard for installed packages
|
|
760
|
+
3. VERSION file reading - fallback for development environments
|
|
761
|
+
4. Only then default to v0.0.0 with detailed error logging
|
|
762
|
+
|
|
763
|
+
Returns version string formatted as "vX.Y.Z"
|
|
764
|
+
"""
|
|
765
|
+
version = "0.0.0"
|
|
766
|
+
method_used = "default"
|
|
767
|
+
|
|
768
|
+
# Method 1: Try package import (fastest, most common)
|
|
769
|
+
try:
|
|
770
|
+
from claude_mpm import __version__
|
|
771
|
+
version = __version__
|
|
772
|
+
method_used = "package_import"
|
|
773
|
+
self.logger.debug(f"Version obtained via package import: {version}")
|
|
774
|
+
except ImportError as e:
|
|
775
|
+
self.logger.debug(f"Package import failed: {e}")
|
|
776
|
+
except Exception as e:
|
|
777
|
+
self.logger.warning(f"Unexpected error in package import: {e}")
|
|
778
|
+
|
|
779
|
+
# Method 2: Try importlib.metadata (standard for installed packages)
|
|
780
|
+
if version == "0.0.0":
|
|
781
|
+
try:
|
|
782
|
+
import importlib.metadata
|
|
783
|
+
version = importlib.metadata.version('claude-mpm')
|
|
784
|
+
method_used = "importlib_metadata"
|
|
785
|
+
self.logger.debug(f"Version obtained via importlib.metadata: {version}")
|
|
786
|
+
except importlib.metadata.PackageNotFoundError:
|
|
787
|
+
self.logger.debug("Package not found in importlib.metadata (likely development install)")
|
|
788
|
+
except ImportError:
|
|
789
|
+
self.logger.debug("importlib.metadata not available (Python < 3.8)")
|
|
790
|
+
except Exception as e:
|
|
791
|
+
self.logger.warning(f"Unexpected error in importlib.metadata: {e}")
|
|
792
|
+
|
|
793
|
+
# Method 3: Try reading VERSION file directly (development fallback)
|
|
794
|
+
if version == "0.0.0":
|
|
795
|
+
try:
|
|
796
|
+
# Calculate path relative to this file
|
|
797
|
+
version_file = Path(__file__).parent.parent.parent.parent / "VERSION"
|
|
798
|
+
if version_file.exists():
|
|
799
|
+
version = version_file.read_text().strip()
|
|
800
|
+
method_used = "version_file"
|
|
801
|
+
self.logger.debug(f"Version obtained via VERSION file: {version}")
|
|
802
|
+
else:
|
|
803
|
+
self.logger.debug(f"VERSION file not found at: {version_file}")
|
|
804
|
+
except Exception as e:
|
|
805
|
+
self.logger.warning(f"Failed to read VERSION file: {e}")
|
|
806
|
+
|
|
807
|
+
# Log final result
|
|
808
|
+
if version == "0.0.0":
|
|
809
|
+
self.logger.error(
|
|
810
|
+
"All version detection methods failed. This indicates a packaging or installation issue."
|
|
811
|
+
)
|
|
812
|
+
else:
|
|
813
|
+
self.logger.debug(f"Final version: {version} (method: {method_used})")
|
|
814
|
+
|
|
815
|
+
return f"v{version}"
|
|
816
|
+
|
|
753
817
|
def _register_memory_hooks(self):
|
|
754
818
|
"""Register memory integration hooks with the hook service.
|
|
755
819
|
|
|
@@ -184,12 +184,8 @@ class ClaudeRunner:
|
|
|
184
184
|
self.logger.warning(f"Failed to connect to Socket.IO server: {e}")
|
|
185
185
|
self.websocket_server = None
|
|
186
186
|
|
|
187
|
-
# Get version
|
|
188
|
-
|
|
189
|
-
from claude_mpm import __version__
|
|
190
|
-
version_str = f"v{__version__}"
|
|
191
|
-
except:
|
|
192
|
-
version_str = "v0.0.0"
|
|
187
|
+
# Get version with robust fallback mechanisms
|
|
188
|
+
version_str = self._get_version()
|
|
193
189
|
|
|
194
190
|
# Print styled welcome box
|
|
195
191
|
print("\033[32m╭───────────────────────────────────────────────────╮\033[0m")
|
|
@@ -750,6 +746,74 @@ class ClaudeRunner:
|
|
|
750
746
|
except Exception as e:
|
|
751
747
|
self.logger.debug(f"Failed to log session event: {e}")
|
|
752
748
|
|
|
749
|
+
def _get_version(self) -> str:
|
|
750
|
+
"""
|
|
751
|
+
Robust version determination with multiple fallback mechanisms.
|
|
752
|
+
|
|
753
|
+
WHY: The version display is critical for debugging and user experience.
|
|
754
|
+
This implementation ensures we always show the correct version rather than
|
|
755
|
+
defaulting to v0.0.0, even in edge cases where imports might fail.
|
|
756
|
+
|
|
757
|
+
DESIGN DECISION: We try multiple methods in order of preference:
|
|
758
|
+
1. Package import (__version__) - fastest for normal installations
|
|
759
|
+
2. importlib.metadata - standard for installed packages
|
|
760
|
+
3. VERSION file reading - fallback for development environments
|
|
761
|
+
4. Only then default to v0.0.0 with detailed error logging
|
|
762
|
+
|
|
763
|
+
Returns version string formatted as "vX.Y.Z"
|
|
764
|
+
"""
|
|
765
|
+
version = "0.0.0"
|
|
766
|
+
method_used = "default"
|
|
767
|
+
|
|
768
|
+
# Method 1: Try package import (fastest, most common)
|
|
769
|
+
try:
|
|
770
|
+
from claude_mpm import __version__
|
|
771
|
+
version = __version__
|
|
772
|
+
method_used = "package_import"
|
|
773
|
+
self.logger.debug(f"Version obtained via package import: {version}")
|
|
774
|
+
except ImportError as e:
|
|
775
|
+
self.logger.debug(f"Package import failed: {e}")
|
|
776
|
+
except Exception as e:
|
|
777
|
+
self.logger.warning(f"Unexpected error in package import: {e}")
|
|
778
|
+
|
|
779
|
+
# Method 2: Try importlib.metadata (standard for installed packages)
|
|
780
|
+
if version == "0.0.0":
|
|
781
|
+
try:
|
|
782
|
+
import importlib.metadata
|
|
783
|
+
version = importlib.metadata.version('claude-mpm')
|
|
784
|
+
method_used = "importlib_metadata"
|
|
785
|
+
self.logger.debug(f"Version obtained via importlib.metadata: {version}")
|
|
786
|
+
except importlib.metadata.PackageNotFoundError:
|
|
787
|
+
self.logger.debug("Package not found in importlib.metadata (likely development install)")
|
|
788
|
+
except ImportError:
|
|
789
|
+
self.logger.debug("importlib.metadata not available (Python < 3.8)")
|
|
790
|
+
except Exception as e:
|
|
791
|
+
self.logger.warning(f"Unexpected error in importlib.metadata: {e}")
|
|
792
|
+
|
|
793
|
+
# Method 3: Try reading VERSION file directly (development fallback)
|
|
794
|
+
if version == "0.0.0":
|
|
795
|
+
try:
|
|
796
|
+
# Calculate path relative to this file
|
|
797
|
+
version_file = Path(__file__).parent.parent.parent.parent / "VERSION"
|
|
798
|
+
if version_file.exists():
|
|
799
|
+
version = version_file.read_text().strip()
|
|
800
|
+
method_used = "version_file"
|
|
801
|
+
self.logger.debug(f"Version obtained via VERSION file: {version}")
|
|
802
|
+
else:
|
|
803
|
+
self.logger.debug(f"VERSION file not found at: {version_file}")
|
|
804
|
+
except Exception as e:
|
|
805
|
+
self.logger.warning(f"Failed to read VERSION file: {e}")
|
|
806
|
+
|
|
807
|
+
# Log final result
|
|
808
|
+
if version == "0.0.0":
|
|
809
|
+
self.logger.error(
|
|
810
|
+
"All version detection methods failed. This indicates a packaging or installation issue."
|
|
811
|
+
)
|
|
812
|
+
else:
|
|
813
|
+
self.logger.debug(f"Final version: {version} (method: {method_used})")
|
|
814
|
+
|
|
815
|
+
return f"v{version}"
|
|
816
|
+
|
|
753
817
|
def _register_memory_hooks(self):
|
|
754
818
|
"""Register memory integration hooks with the hook service.
|
|
755
819
|
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Pure Python daemon management for Socket.IO server.
|
|
4
|
+
No external dependencies required.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import time
|
|
10
|
+
import signal
|
|
11
|
+
import subprocess
|
|
12
|
+
import psutil
|
|
13
|
+
import json
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
# Handle imports for both development and installed scenarios
|
|
17
|
+
script_dir = Path(__file__).parent
|
|
18
|
+
try:
|
|
19
|
+
# When installed as package, this should work directly
|
|
20
|
+
from claude_mpm.services.socketio_server import SocketIOServer
|
|
21
|
+
except ImportError:
|
|
22
|
+
# When in development, add src to path
|
|
23
|
+
project_root = script_dir.parent.parent.parent # from scripts -> claude_mpm -> src -> project_root
|
|
24
|
+
src_path = project_root / "src"
|
|
25
|
+
if src_path.exists():
|
|
26
|
+
sys.path.insert(0, str(src_path))
|
|
27
|
+
from claude_mpm.services.socketio_server import SocketIOServer
|
|
28
|
+
|
|
29
|
+
PID_FILE = Path.home() / ".claude-mpm" / "socketio-server.pid"
|
|
30
|
+
LOG_FILE = Path.home() / ".claude-mpm" / "socketio-server.log"
|
|
31
|
+
|
|
32
|
+
def ensure_dirs():
|
|
33
|
+
"""Ensure required directories exist."""
|
|
34
|
+
PID_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
35
|
+
|
|
36
|
+
def is_running():
|
|
37
|
+
"""Check if server is already running."""
|
|
38
|
+
if not PID_FILE.exists():
|
|
39
|
+
return False
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
with open(PID_FILE) as f:
|
|
43
|
+
pid = int(f.read().strip())
|
|
44
|
+
|
|
45
|
+
# Check if process exists
|
|
46
|
+
process = psutil.Process(pid)
|
|
47
|
+
return process.is_running()
|
|
48
|
+
except (ValueError, psutil.NoSuchProcess, psutil.AccessDenied):
|
|
49
|
+
# Clean up stale PID file
|
|
50
|
+
PID_FILE.unlink(missing_ok=True)
|
|
51
|
+
return False
|
|
52
|
+
|
|
53
|
+
def start_server():
|
|
54
|
+
"""Start the Socket.IO server as a daemon with conflict detection."""
|
|
55
|
+
if is_running():
|
|
56
|
+
print("Socket.IO daemon server is already running.")
|
|
57
|
+
print(f"Use '{__file__} status' for details")
|
|
58
|
+
return
|
|
59
|
+
|
|
60
|
+
# Check for HTTP-managed server conflict
|
|
61
|
+
try:
|
|
62
|
+
import requests
|
|
63
|
+
response = requests.get("http://localhost:8765/health", timeout=1.0)
|
|
64
|
+
if response.status_code == 200:
|
|
65
|
+
data = response.json()
|
|
66
|
+
if 'server_id' in data:
|
|
67
|
+
print(f"⚠️ HTTP-managed server already running: {data.get('server_id')}")
|
|
68
|
+
print(f" Stop it first: socketio_server_manager.py stop --port 8765")
|
|
69
|
+
print(f" Or diagnose: socketio_server_manager.py diagnose")
|
|
70
|
+
return
|
|
71
|
+
except:
|
|
72
|
+
pass # No HTTP server, continue
|
|
73
|
+
|
|
74
|
+
ensure_dirs()
|
|
75
|
+
|
|
76
|
+
# Fork to create daemon
|
|
77
|
+
pid = os.fork()
|
|
78
|
+
if pid > 0:
|
|
79
|
+
# Parent process
|
|
80
|
+
print(f"Starting Socket.IO server (PID: {pid})...")
|
|
81
|
+
with open(PID_FILE, 'w') as f:
|
|
82
|
+
f.write(str(pid))
|
|
83
|
+
print("Socket.IO server started successfully.")
|
|
84
|
+
print(f"PID file: {PID_FILE}")
|
|
85
|
+
print(f"Log file: {LOG_FILE}")
|
|
86
|
+
sys.exit(0)
|
|
87
|
+
|
|
88
|
+
# Child process - become daemon
|
|
89
|
+
os.setsid()
|
|
90
|
+
os.umask(0)
|
|
91
|
+
|
|
92
|
+
# Redirect stdout/stderr to log file
|
|
93
|
+
with open(LOG_FILE, 'a') as log:
|
|
94
|
+
os.dup2(log.fileno(), sys.stdout.fileno())
|
|
95
|
+
os.dup2(log.fileno(), sys.stderr.fileno())
|
|
96
|
+
|
|
97
|
+
# Start server
|
|
98
|
+
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Starting Socket.IO server...")
|
|
99
|
+
server = SocketIOServer(host="localhost", port=8765)
|
|
100
|
+
|
|
101
|
+
# Handle signals
|
|
102
|
+
def signal_handler(signum, frame):
|
|
103
|
+
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Received signal {signum}, shutting down...")
|
|
104
|
+
server.stop()
|
|
105
|
+
PID_FILE.unlink(missing_ok=True)
|
|
106
|
+
sys.exit(0)
|
|
107
|
+
|
|
108
|
+
signal.signal(signal.SIGTERM, signal_handler)
|
|
109
|
+
signal.signal(signal.SIGINT, signal_handler)
|
|
110
|
+
|
|
111
|
+
# Start server
|
|
112
|
+
server.start()
|
|
113
|
+
|
|
114
|
+
# Keep running
|
|
115
|
+
try:
|
|
116
|
+
while True:
|
|
117
|
+
time.sleep(1)
|
|
118
|
+
except KeyboardInterrupt:
|
|
119
|
+
signal_handler(signal.SIGINT, None)
|
|
120
|
+
|
|
121
|
+
def stop_server():
|
|
122
|
+
"""Stop the Socket.IO daemon server."""
|
|
123
|
+
if not is_running():
|
|
124
|
+
print("Socket.IO daemon server is not running.")
|
|
125
|
+
print(f"Check for other servers: socketio_server_manager.py status")
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
with open(PID_FILE) as f:
|
|
130
|
+
pid = int(f.read().strip())
|
|
131
|
+
|
|
132
|
+
print(f"Stopping Socket.IO server (PID: {pid})...")
|
|
133
|
+
os.kill(pid, signal.SIGTERM)
|
|
134
|
+
|
|
135
|
+
# Wait for process to stop
|
|
136
|
+
for _ in range(10):
|
|
137
|
+
if not is_running():
|
|
138
|
+
print("Socket.IO server stopped successfully.")
|
|
139
|
+
PID_FILE.unlink(missing_ok=True)
|
|
140
|
+
return
|
|
141
|
+
time.sleep(0.5)
|
|
142
|
+
|
|
143
|
+
# Force kill if still running
|
|
144
|
+
print("Server didn't stop gracefully, forcing...")
|
|
145
|
+
os.kill(pid, signal.SIGKILL)
|
|
146
|
+
PID_FILE.unlink(missing_ok=True)
|
|
147
|
+
|
|
148
|
+
except Exception as e:
|
|
149
|
+
print(f"Error stopping server: {e}")
|
|
150
|
+
|
|
151
|
+
def status_server():
|
|
152
|
+
"""Check server status with manager integration info."""
|
|
153
|
+
if is_running():
|
|
154
|
+
with open(PID_FILE) as f:
|
|
155
|
+
pid = int(f.read().strip())
|
|
156
|
+
print(f"Socket.IO daemon server is running (PID: {pid})")
|
|
157
|
+
print(f"PID file: {PID_FILE}")
|
|
158
|
+
|
|
159
|
+
# Check if port is listening
|
|
160
|
+
try:
|
|
161
|
+
import socket
|
|
162
|
+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
163
|
+
result = sock.connect_ex(('localhost', 8765))
|
|
164
|
+
sock.close()
|
|
165
|
+
if result == 0:
|
|
166
|
+
print("✅ Server is listening on port 8765")
|
|
167
|
+
print("🔧 Management style: daemon")
|
|
168
|
+
else:
|
|
169
|
+
print("⚠️ WARNING: Server process exists but port 8765 is not accessible")
|
|
170
|
+
except:
|
|
171
|
+
pass
|
|
172
|
+
|
|
173
|
+
# Show management commands
|
|
174
|
+
print("\n🔧 Management Commands:")
|
|
175
|
+
print(f" • Stop: {__file__} stop")
|
|
176
|
+
print(f" • Restart: {__file__} restart")
|
|
177
|
+
|
|
178
|
+
# Check for manager conflicts
|
|
179
|
+
try:
|
|
180
|
+
import requests
|
|
181
|
+
response = requests.get("http://localhost:8765/health", timeout=1.0)
|
|
182
|
+
if response.status_code == 200:
|
|
183
|
+
data = response.json()
|
|
184
|
+
if 'server_id' in data and data.get('server_id') != 'daemon-socketio':
|
|
185
|
+
print(f"\n⚠️ POTENTIAL CONFLICT: HTTP-managed server also detected")
|
|
186
|
+
print(f" Server ID: {data.get('server_id')}")
|
|
187
|
+
print(f" Use 'socketio_server_manager.py diagnose' to resolve")
|
|
188
|
+
except:
|
|
189
|
+
pass
|
|
190
|
+
|
|
191
|
+
else:
|
|
192
|
+
print("Socket.IO daemon server is not running")
|
|
193
|
+
print(f"\n🔧 Start Commands:")
|
|
194
|
+
print(f" • Daemon: {__file__} start")
|
|
195
|
+
print(f" • HTTP-managed: socketio_server_manager.py start")
|
|
196
|
+
|
|
197
|
+
def main():
|
|
198
|
+
"""Main entry point."""
|
|
199
|
+
if len(sys.argv) < 2:
|
|
200
|
+
print("Usage: socketio-daemon.py {start|stop|restart|status}")
|
|
201
|
+
sys.exit(1)
|
|
202
|
+
|
|
203
|
+
command = sys.argv[1]
|
|
204
|
+
|
|
205
|
+
if command == "start":
|
|
206
|
+
start_server()
|
|
207
|
+
elif command == "stop":
|
|
208
|
+
stop_server()
|
|
209
|
+
elif command == "restart":
|
|
210
|
+
stop_server()
|
|
211
|
+
time.sleep(1)
|
|
212
|
+
start_server()
|
|
213
|
+
elif command == "status":
|
|
214
|
+
status_server()
|
|
215
|
+
else:
|
|
216
|
+
print(f"Unknown command: {command}")
|
|
217
|
+
print("Usage: socketio-daemon.py {start|stop|restart|status}")
|
|
218
|
+
sys.exit(1)
|
|
219
|
+
|
|
220
|
+
if __name__ == "__main__":
|
|
221
|
+
# Install psutil if not available
|
|
222
|
+
try:
|
|
223
|
+
import psutil
|
|
224
|
+
except ImportError:
|
|
225
|
+
print("Installing psutil...")
|
|
226
|
+
subprocess.check_call([sys.executable, "-m", "pip", "install", "psutil"])
|
|
227
|
+
import psutil
|
|
228
|
+
|
|
229
|
+
main()
|
|
@@ -130,6 +130,7 @@ src/claude_mpm/orchestration/archive/subprocess_orchestrator.py
|
|
|
130
130
|
src/claude_mpm/orchestration/archive/system_prompt_orchestrator.py
|
|
131
131
|
src/claude_mpm/orchestration/archive/wrapper_orchestrator.py
|
|
132
132
|
src/claude_mpm/schemas/workflow_validator.py
|
|
133
|
+
src/claude_mpm/scripts/socketio_daemon.py
|
|
133
134
|
src/claude_mpm/services/__init__.py
|
|
134
135
|
src/claude_mpm/services/agent_capabilities_generator.py
|
|
135
136
|
src/claude_mpm/services/agent_deployment.py
|
claude_mpm-3.4.6/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.4.6
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_mpm-3.4.6 → claude_mpm-3.4.9}/src/claude_mpm/agents/templates/.claude-mpm/memories/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|