claude-mpm 4.1.26__py3-none-any.whl → 4.24.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +420 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +299 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +7 -4
- claude_mpm/agents/templates/{agentic_coder_optimizer.json → agentic-coder-optimizer.json} +33 -7
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +10 -4
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +43 -9
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +14 -4
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +25 -5
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +46 -21
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +167 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -378
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +15 -10
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +469 -1064
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +7 -7
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +143 -3
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +118 -8
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +137 -14
- claude_mpm/commands/mpm-help.md +285 -5
- claude_mpm/commands/mpm-init.md +374 -15
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +71 -9
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +15 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +85 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/dashboard.css +588 -6
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
- claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
- claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
- claude_mpm/dashboard/static/js/dashboard.js +245 -132
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +49 -22
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +112 -109
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +33 -7
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +9 -7
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +8 -4
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +141 -4
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +23 -21
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__main__.py +1 -1
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
claude_mpm/core/hook_manager.py
CHANGED
|
@@ -19,7 +19,7 @@ import queue
|
|
|
19
19
|
import subprocess
|
|
20
20
|
import threading
|
|
21
21
|
import uuid
|
|
22
|
-
from datetime import datetime
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
23
|
from typing import Any, Dict, Optional
|
|
24
24
|
|
|
25
25
|
from ..core.logger import get_logger
|
|
@@ -106,7 +106,9 @@ class HookManager:
|
|
|
106
106
|
hook_event = {
|
|
107
107
|
"hook_event_name": hook_type,
|
|
108
108
|
"session_id": self.session_id,
|
|
109
|
-
"timestamp": hook_data.get(
|
|
109
|
+
"timestamp": hook_data.get(
|
|
110
|
+
"timestamp", datetime.now(timezone.utc).isoformat()
|
|
111
|
+
),
|
|
110
112
|
**event_data,
|
|
111
113
|
}
|
|
112
114
|
|
|
@@ -182,7 +184,7 @@ class HookManager:
|
|
|
182
184
|
{
|
|
183
185
|
"tool_name": tool_name,
|
|
184
186
|
"tool_args": tool_args or {},
|
|
185
|
-
"timestamp": datetime.
|
|
187
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
186
188
|
},
|
|
187
189
|
)
|
|
188
190
|
|
|
@@ -205,7 +207,7 @@ class HookManager:
|
|
|
205
207
|
"tool_name": tool_name,
|
|
206
208
|
"exit_code": exit_code,
|
|
207
209
|
"result": str(result) if result is not None else None,
|
|
208
|
-
"timestamp": datetime.
|
|
210
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
209
211
|
},
|
|
210
212
|
)
|
|
211
213
|
|
|
@@ -220,7 +222,7 @@ class HookManager:
|
|
|
220
222
|
"""
|
|
221
223
|
return self._trigger_hook_event(
|
|
222
224
|
"UserPromptSubmit",
|
|
223
|
-
{"prompt": prompt, "timestamp": datetime.
|
|
225
|
+
{"prompt": prompt, "timestamp": datetime.now(timezone.utc).isoformat()},
|
|
224
226
|
)
|
|
225
227
|
|
|
226
228
|
def _trigger_hook_event(self, hook_type: str, event_data: Dict[str, Any]) -> bool:
|
|
@@ -250,7 +252,7 @@ class HookManager:
|
|
|
250
252
|
hook_data = {
|
|
251
253
|
"hook_type": hook_type,
|
|
252
254
|
"event_data": event_data,
|
|
253
|
-
"timestamp": datetime.
|
|
255
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
254
256
|
}
|
|
255
257
|
|
|
256
258
|
# Try to queue without blocking
|
|
@@ -182,14 +182,17 @@ class InjectableService(BaseService, ABC):
|
|
|
182
182
|
continue
|
|
183
183
|
|
|
184
184
|
attr = getattr(self, attr_name, None)
|
|
185
|
-
if
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
185
|
+
if (
|
|
186
|
+
attr
|
|
187
|
+
and hasattr(attr, "start")
|
|
188
|
+
and hasattr(attr, "running")
|
|
189
|
+
and not attr.running
|
|
190
|
+
):
|
|
191
|
+
try:
|
|
192
|
+
await attr.start()
|
|
193
|
+
logger.debug(f"Started dependency {attr_name}")
|
|
194
|
+
except Exception as e:
|
|
195
|
+
logger.warning(f"Failed to start dependency {attr_name}: {e}")
|
|
193
196
|
|
|
194
197
|
def __repr__(self) -> str:
|
|
195
198
|
"""Enhanced string representation showing dependencies."""
|
|
@@ -18,9 +18,10 @@ The hook works by:
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
import threading
|
|
21
|
-
from datetime import datetime
|
|
21
|
+
from datetime import datetime, timezone
|
|
22
22
|
from typing import Any, Dict, List, Optional
|
|
23
23
|
|
|
24
|
+
from ..core.enums import OperationResult
|
|
24
25
|
from ..core.logger import get_logger
|
|
25
26
|
|
|
26
27
|
|
|
@@ -158,7 +159,7 @@ class InstructionReinforcementHook:
|
|
|
158
159
|
# Create reminder todo
|
|
159
160
|
reminder_todo = {
|
|
160
161
|
"content": message,
|
|
161
|
-
"status":
|
|
162
|
+
"status": OperationResult.PENDING,
|
|
162
163
|
"activeForm": "Processing instruction reminder",
|
|
163
164
|
}
|
|
164
165
|
|
|
@@ -197,7 +198,7 @@ class InstructionReinforcementHook:
|
|
|
197
198
|
"enabled": self.enabled,
|
|
198
199
|
"test_mode": self.test_mode,
|
|
199
200
|
"injection_interval": self.injection_interval,
|
|
200
|
-
"timestamp": datetime.
|
|
201
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
201
202
|
}
|
|
202
203
|
|
|
203
204
|
def reset_counters(self):
|
|
@@ -8,8 +8,10 @@ import contextlib
|
|
|
8
8
|
import os
|
|
9
9
|
import subprocess
|
|
10
10
|
import uuid
|
|
11
|
+
from pathlib import Path
|
|
11
12
|
from typing import Any, Dict, Optional, Tuple
|
|
12
13
|
|
|
14
|
+
from claude_mpm.core.enums import ServiceState
|
|
13
15
|
from claude_mpm.core.logger import get_logger
|
|
14
16
|
|
|
15
17
|
|
|
@@ -35,7 +37,7 @@ class InteractiveSession:
|
|
|
35
37
|
self.runner = runner
|
|
36
38
|
self.logger = get_logger("interactive_session")
|
|
37
39
|
self.session_id = None
|
|
38
|
-
self.original_cwd =
|
|
40
|
+
self.original_cwd = Path.cwd()
|
|
39
41
|
|
|
40
42
|
# Initialize response tracking for interactive sessions
|
|
41
43
|
# WHY: Interactive sessions need response logging just like oneshot sessions.
|
|
@@ -178,7 +180,8 @@ class InteractiveSession:
|
|
|
178
180
|
# Notify WebSocket if connected
|
|
179
181
|
if self.runner.websocket_server:
|
|
180
182
|
self.runner.websocket_server.claude_status_changed(
|
|
181
|
-
status=
|
|
183
|
+
status=ServiceState.STARTING,
|
|
184
|
+
message="Launching Claude interactive session",
|
|
182
185
|
)
|
|
183
186
|
|
|
184
187
|
# Launch using selected method
|
|
@@ -225,7 +228,7 @@ class InteractiveSession:
|
|
|
225
228
|
"""
|
|
226
229
|
try:
|
|
227
230
|
# Restore original directory
|
|
228
|
-
if self.original_cwd and
|
|
231
|
+
if self.original_cwd and Path(self.original_cwd).exists():
|
|
229
232
|
with contextlib.suppress(OSError):
|
|
230
233
|
os.chdir(self.original_cwd)
|
|
231
234
|
|
|
@@ -278,7 +281,7 @@ class InteractiveSession:
|
|
|
278
281
|
self.runner.websocket_server.session_started(
|
|
279
282
|
session_id=self.session_id,
|
|
280
283
|
launch_method=self.runner.launch_method,
|
|
281
|
-
working_dir=
|
|
284
|
+
working_dir=Path.cwd(),
|
|
282
285
|
)
|
|
283
286
|
return True, None
|
|
284
287
|
|
|
@@ -310,6 +313,9 @@ class InteractiveSession:
|
|
|
310
313
|
print(
|
|
311
314
|
"\033[32m│\033[0m /mpm - MPM overview and help \033[32m│\033[0m"
|
|
312
315
|
)
|
|
316
|
+
print(
|
|
317
|
+
"\033[32m│\033[0m /mpm-init - Initialize or update project \033[32m│\033[0m"
|
|
318
|
+
)
|
|
313
319
|
print(
|
|
314
320
|
"\033[32m│\033[0m /mpm-agents - Show available agents \033[32m│\033[0m"
|
|
315
321
|
)
|
|
@@ -369,7 +375,7 @@ class InteractiveSession:
|
|
|
369
375
|
|
|
370
376
|
return cmd
|
|
371
377
|
# Normal mode - full command with all claude-mpm enhancements
|
|
372
|
-
cmd = ["claude", "--
|
|
378
|
+
cmd = ["claude", "--dangerously-skip-permissions"]
|
|
373
379
|
|
|
374
380
|
# Add custom arguments
|
|
375
381
|
if self.runner.claude_args:
|
|
@@ -377,6 +383,14 @@ class InteractiveSession:
|
|
|
377
383
|
self.logger.debug(f"Raw claude_args received: {self.runner.claude_args}")
|
|
378
384
|
cmd.extend(self.runner.claude_args)
|
|
379
385
|
|
|
386
|
+
# Add --agents flag if native agents mode is enabled
|
|
387
|
+
if getattr(self.runner, "use_native_agents", False):
|
|
388
|
+
agents_flag = self._build_agents_flag()
|
|
389
|
+
if agents_flag:
|
|
390
|
+
# Add --agents JSON directly (already properly formatted)
|
|
391
|
+
cmd.extend(agents_flag)
|
|
392
|
+
self.logger.info("✓ Native agents mode: Using --agents CLI flag")
|
|
393
|
+
|
|
380
394
|
# Add system instructions
|
|
381
395
|
from claude_mpm.core.claude_runner import create_simple_context
|
|
382
396
|
|
|
@@ -392,10 +406,42 @@ class InteractiveSession:
|
|
|
392
406
|
self.logger.info("✅ VERIFIED: --resume flag IS included in final command")
|
|
393
407
|
self.logger.debug(f"--resume position in command: {cmd.index('--resume')}")
|
|
394
408
|
else:
|
|
395
|
-
self.logger.debug("
|
|
409
|
+
self.logger.debug("[INFO]️ --resume flag NOT included in final command")
|
|
396
410
|
|
|
397
411
|
return cmd
|
|
398
412
|
|
|
413
|
+
def _build_agents_flag(self) -> Optional[list]:
|
|
414
|
+
"""Build --agents flag with all MPM agents.
|
|
415
|
+
|
|
416
|
+
Returns:
|
|
417
|
+
List with ["--agents", "<json>"] or None if conversion fails
|
|
418
|
+
"""
|
|
419
|
+
try:
|
|
420
|
+
from claude_mpm.services.native_agent_converter import NativeAgentConverter
|
|
421
|
+
|
|
422
|
+
converter = NativeAgentConverter()
|
|
423
|
+
agents = converter.load_agents_from_templates()
|
|
424
|
+
|
|
425
|
+
if not agents:
|
|
426
|
+
self.logger.warning("No agents loaded for native mode")
|
|
427
|
+
return None
|
|
428
|
+
|
|
429
|
+
# Generate JSON for --agents flag
|
|
430
|
+
agents_json = converter.generate_agents_json(agents)
|
|
431
|
+
summary = converter.get_conversion_summary(agents)
|
|
432
|
+
|
|
433
|
+
self.logger.info(
|
|
434
|
+
f"Native agents: {summary['total_agents']} agents, "
|
|
435
|
+
f"{summary['json_size_kb']} KB JSON"
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
# Return as list: ["--agents", "<json>"]
|
|
439
|
+
return ["--agents", agents_json]
|
|
440
|
+
|
|
441
|
+
except Exception as e:
|
|
442
|
+
self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
|
|
443
|
+
return None
|
|
444
|
+
|
|
399
445
|
def _prepare_environment(self) -> dict:
|
|
400
446
|
"""Prepare clean environment variables for Claude."""
|
|
401
447
|
clean_env = os.environ.copy()
|
|
@@ -450,7 +496,8 @@ class InteractiveSession:
|
|
|
450
496
|
# Notify WebSocket before exec
|
|
451
497
|
if self.runner.websocket_server:
|
|
452
498
|
self.runner.websocket_server.claude_status_changed(
|
|
453
|
-
status=
|
|
499
|
+
status=ServiceState.RUNNING,
|
|
500
|
+
message="Claude process started (exec mode)",
|
|
454
501
|
)
|
|
455
502
|
|
|
456
503
|
# This will not return if successful
|
|
@@ -490,7 +537,7 @@ class InteractiveSession:
|
|
|
490
537
|
# Notify WebSocket of error
|
|
491
538
|
if self.runner.websocket_server:
|
|
492
539
|
self.runner.websocket_server.claude_status_changed(
|
|
493
|
-
status=
|
|
540
|
+
status=ServiceState.ERROR, message=f"Failed to launch Claude: {error}"
|
|
494
541
|
)
|
|
495
542
|
|
|
496
543
|
def _handle_keyboard_interrupt(self) -> None:
|
claude_mpm/core/interfaces.py
CHANGED
|
@@ -33,7 +33,62 @@ from pathlib import Path
|
|
|
33
33
|
from typing import Any, Dict, Generic, List, Optional, Tuple, TypeVar
|
|
34
34
|
|
|
35
35
|
# Re-export everything from the new location for backward compatibility
|
|
36
|
-
from claude_mpm.services.core.interfaces import
|
|
36
|
+
from claude_mpm.services.core.interfaces import ( # noqa: F401
|
|
37
|
+
AgentCapabilitiesInterface,
|
|
38
|
+
AgentDeploymentInterface,
|
|
39
|
+
AgentMetadata,
|
|
40
|
+
CacheEntry,
|
|
41
|
+
CommandHandlerInterface,
|
|
42
|
+
HealthStatus,
|
|
43
|
+
HookServiceInterface,
|
|
44
|
+
IAgentRecommender,
|
|
45
|
+
IAgentRegistry,
|
|
46
|
+
IAutoConfigManager,
|
|
47
|
+
ICacheService,
|
|
48
|
+
IConfigurationManager,
|
|
49
|
+
IConfigurationService,
|
|
50
|
+
ICrashDetector,
|
|
51
|
+
IDeploymentStateManager,
|
|
52
|
+
IErrorHandler,
|
|
53
|
+
IEventBus,
|
|
54
|
+
IHealthCheck,
|
|
55
|
+
IHealthCheckManager,
|
|
56
|
+
IHealthMonitor,
|
|
57
|
+
ILocalProcessManager,
|
|
58
|
+
ILogMonitor,
|
|
59
|
+
IMemoryLeakDetector,
|
|
60
|
+
IModelProvider,
|
|
61
|
+
IModelRouter,
|
|
62
|
+
InterfaceRegistry,
|
|
63
|
+
IPerformanceMonitor,
|
|
64
|
+
IPromptCache,
|
|
65
|
+
IResourceMonitor,
|
|
66
|
+
IRestartManager,
|
|
67
|
+
IRestartPolicy,
|
|
68
|
+
IServiceContainer,
|
|
69
|
+
IServiceFactory,
|
|
70
|
+
IServiceLifecycle,
|
|
71
|
+
IStructuredLogger,
|
|
72
|
+
ITemplateManager,
|
|
73
|
+
IToolchainAnalyzer,
|
|
74
|
+
MemoryHookInterface,
|
|
75
|
+
MemoryServiceInterface,
|
|
76
|
+
ModelCapability,
|
|
77
|
+
ModelProvider,
|
|
78
|
+
ModelResponse,
|
|
79
|
+
ProjectAnalyzerInterface,
|
|
80
|
+
RunnerConfigurationInterface,
|
|
81
|
+
ServiceType,
|
|
82
|
+
SessionManagementInterface,
|
|
83
|
+
SocketIOServiceInterface,
|
|
84
|
+
SubprocessLauncherInterface,
|
|
85
|
+
SystemInstructionsInterface,
|
|
86
|
+
T,
|
|
87
|
+
TemplateRenderContext,
|
|
88
|
+
TicketManagerInterface,
|
|
89
|
+
UtilityServiceInterface,
|
|
90
|
+
VersionServiceInterface,
|
|
91
|
+
)
|
|
37
92
|
|
|
38
93
|
# Type variables for generic interfaces
|
|
39
94
|
T = TypeVar("T")
|
claude_mpm/core/lazy.py
CHANGED
|
@@ -16,7 +16,7 @@ import functools
|
|
|
16
16
|
import threading
|
|
17
17
|
import time
|
|
18
18
|
from dataclasses import dataclass, field
|
|
19
|
-
from datetime import datetime
|
|
19
|
+
from datetime import datetime, timezone
|
|
20
20
|
from typing import Any, Callable, Dict, Generic, Optional, Type, TypeVar
|
|
21
21
|
|
|
22
22
|
from ..core.logger import get_logger
|
|
@@ -121,7 +121,7 @@ class LazyService(Generic[T]):
|
|
|
121
121
|
# Track initialization
|
|
122
122
|
start_time = time.time()
|
|
123
123
|
if self._metrics.first_access is None:
|
|
124
|
-
self._metrics.first_access = datetime.now()
|
|
124
|
+
self._metrics.first_access = datetime.now(timezone.utc)
|
|
125
125
|
|
|
126
126
|
try:
|
|
127
127
|
self._logger.debug(f"Initializing lazy service: {self._name}")
|
|
@@ -417,7 +417,7 @@ class AsyncLazyService(Generic[T]):
|
|
|
417
417
|
|
|
418
418
|
start_time = time.time()
|
|
419
419
|
if self._metrics.first_access is None:
|
|
420
|
-
self._metrics.first_access = datetime.now()
|
|
420
|
+
self._metrics.first_access = datetime.now(timezone.utc)
|
|
421
421
|
|
|
422
422
|
try:
|
|
423
423
|
self._logger.debug(f"Async initializing: {self._name}")
|
claude_mpm/core/log_manager.py
CHANGED
|
@@ -16,18 +16,25 @@ DESIGN DECISIONS:
|
|
|
16
16
|
|
|
17
17
|
import asyncio
|
|
18
18
|
import json
|
|
19
|
-
import logging
|
|
20
19
|
import os
|
|
21
|
-
from datetime import datetime, timedelta
|
|
20
|
+
from datetime import datetime, timedelta, timezone
|
|
22
21
|
from pathlib import Path
|
|
23
22
|
from queue import Full, Queue
|
|
24
23
|
from threading import Lock, Thread
|
|
25
24
|
from typing import Any, Dict, Optional
|
|
26
25
|
|
|
26
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
27
|
+
|
|
27
28
|
from ..core.config import Config
|
|
28
29
|
from ..core.constants import SystemLimits
|
|
29
30
|
|
|
30
|
-
logger =
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
# Import cleanup utility for automatic cleanup
|
|
34
|
+
try:
|
|
35
|
+
from ..utils.log_cleanup import run_cleanup_on_startup
|
|
36
|
+
except ImportError:
|
|
37
|
+
run_cleanup_on_startup = None
|
|
31
38
|
|
|
32
39
|
|
|
33
40
|
class LogManager:
|
|
@@ -76,6 +83,9 @@ class LogManager:
|
|
|
76
83
|
# Start background threads
|
|
77
84
|
self._start_background_threads()
|
|
78
85
|
|
|
86
|
+
# Run automatic cleanup on startup if enabled
|
|
87
|
+
self._run_startup_cleanup()
|
|
88
|
+
|
|
79
89
|
def _setup_logging_config(self):
|
|
80
90
|
"""Load and setup logging configuration from config."""
|
|
81
91
|
logging_config = self.config.get("logging", {})
|
|
@@ -101,10 +111,62 @@ class LogManager:
|
|
|
101
111
|
}
|
|
102
112
|
|
|
103
113
|
# Base directories
|
|
104
|
-
self.base_log_dir = Path(
|
|
114
|
+
self.base_log_dir = Path(
|
|
115
|
+
logging_config.get("base_directory", ".claude-mpm/logs")
|
|
116
|
+
)
|
|
105
117
|
if not self.base_log_dir.is_absolute():
|
|
106
118
|
self.base_log_dir = Path.cwd() / self.base_log_dir
|
|
107
119
|
|
|
120
|
+
def _run_startup_cleanup(self):
|
|
121
|
+
"""Run automatic log cleanup on startup if enabled."""
|
|
122
|
+
if run_cleanup_on_startup is None:
|
|
123
|
+
return # Cleanup utility not available
|
|
124
|
+
|
|
125
|
+
# Check environment variable to skip cleanup (for configure command)
|
|
126
|
+
import os
|
|
127
|
+
|
|
128
|
+
if os.environ.get("CLAUDE_MPM_SKIP_CLEANUP", "0") == "1":
|
|
129
|
+
logger.debug("Startup cleanup skipped (CLAUDE_MPM_SKIP_CLEANUP=1)")
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
# Get cleanup configuration
|
|
134
|
+
cleanup_config = self.config.get("log_cleanup", {})
|
|
135
|
+
|
|
136
|
+
# Check if automatic cleanup is enabled (default: True)
|
|
137
|
+
if not cleanup_config.get("auto_cleanup_enabled", True):
|
|
138
|
+
logger.debug("Automatic log cleanup is disabled")
|
|
139
|
+
return
|
|
140
|
+
|
|
141
|
+
# Convert hours to days for cleanup utility
|
|
142
|
+
cleanup_params = {
|
|
143
|
+
"auto_cleanup_enabled": True,
|
|
144
|
+
"session_retention_days": self.retention_hours.get("sessions", 168)
|
|
145
|
+
// 24,
|
|
146
|
+
"archive_retention_days": cleanup_config.get(
|
|
147
|
+
"archive_retention_days", 30
|
|
148
|
+
),
|
|
149
|
+
"log_retention_days": cleanup_config.get("log_retention_days", 14),
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Run cleanup in background thread to avoid blocking startup
|
|
153
|
+
def cleanup_task():
|
|
154
|
+
try:
|
|
155
|
+
result = run_cleanup_on_startup(self.base_log_dir, cleanup_params)
|
|
156
|
+
if result:
|
|
157
|
+
logger.debug(
|
|
158
|
+
f"Startup cleanup completed: "
|
|
159
|
+
f"Removed {result.get('total_removed', 0)} items"
|
|
160
|
+
)
|
|
161
|
+
except Exception as e:
|
|
162
|
+
logger.debug(f"Startup cleanup failed: {e}")
|
|
163
|
+
|
|
164
|
+
cleanup_thread = Thread(target=cleanup_task, daemon=True)
|
|
165
|
+
cleanup_thread.start()
|
|
166
|
+
|
|
167
|
+
except Exception as e:
|
|
168
|
+
logger.debug(f"Could not run startup cleanup: {e}")
|
|
169
|
+
|
|
108
170
|
def _start_background_threads(self):
|
|
109
171
|
"""Start background threads for async operations."""
|
|
110
172
|
with self._lock:
|
|
@@ -137,7 +199,7 @@ class LogManager:
|
|
|
137
199
|
finally:
|
|
138
200
|
self.write_queue.task_done()
|
|
139
201
|
|
|
140
|
-
except:
|
|
202
|
+
except Exception:
|
|
141
203
|
continue # Timeout or other error, continue loop
|
|
142
204
|
|
|
143
205
|
def _process_cleanup_queue(self):
|
|
@@ -157,7 +219,7 @@ class LogManager:
|
|
|
157
219
|
finally:
|
|
158
220
|
self.cleanup_queue.task_done()
|
|
159
221
|
|
|
160
|
-
except:
|
|
222
|
+
except Exception:
|
|
161
223
|
continue # Timeout or other error, continue loop
|
|
162
224
|
|
|
163
225
|
async def setup_logging(self, log_type: str) -> Path:
|
|
@@ -242,7 +304,7 @@ class LogManager:
|
|
|
242
304
|
return 0
|
|
243
305
|
|
|
244
306
|
# Calculate cutoff time
|
|
245
|
-
cutoff_time = datetime.now() - timedelta(hours=retention_hours)
|
|
307
|
+
cutoff_time = datetime.now(timezone.utc) - timedelta(hours=retention_hours)
|
|
246
308
|
|
|
247
309
|
# Schedule async cleanup
|
|
248
310
|
deleted_count = await self._async_cleanup(directory, pattern, cutoff_time)
|
|
@@ -283,7 +345,9 @@ class LogManager:
|
|
|
283
345
|
|
|
284
346
|
try:
|
|
285
347
|
# Check file modification time
|
|
286
|
-
mtime = datetime.fromtimestamp(
|
|
348
|
+
mtime = datetime.fromtimestamp(
|
|
349
|
+
file_path.stat().st_mtime, tz=timezone.utc
|
|
350
|
+
)
|
|
287
351
|
if mtime < cutoff_time:
|
|
288
352
|
file_path.unlink()
|
|
289
353
|
deleted_count += 1
|
|
@@ -316,7 +380,7 @@ class LogManager:
|
|
|
316
380
|
return 0
|
|
317
381
|
|
|
318
382
|
# Calculate cutoff time
|
|
319
|
-
cutoff_time = datetime.now() - timedelta(hours=retention_hours)
|
|
383
|
+
cutoff_time = datetime.now(timezone.utc) - timedelta(hours=retention_hours)
|
|
320
384
|
deleted_count = 0
|
|
321
385
|
|
|
322
386
|
try:
|
|
@@ -332,7 +396,9 @@ class LogManager:
|
|
|
332
396
|
|
|
333
397
|
try:
|
|
334
398
|
# Check file modification time
|
|
335
|
-
mtime = datetime.fromtimestamp(
|
|
399
|
+
mtime = datetime.fromtimestamp(
|
|
400
|
+
file_path.stat().st_mtime, tz=timezone.utc
|
|
401
|
+
)
|
|
336
402
|
if mtime < cutoff_time:
|
|
337
403
|
file_path.unlink()
|
|
338
404
|
deleted_count += 1
|
|
@@ -350,13 +416,14 @@ class LogManager:
|
|
|
350
416
|
"""
|
|
351
417
|
One-time migration to move existing MPM logs to new subdirectory.
|
|
352
418
|
|
|
353
|
-
Moves mpm_*.log files from .claude-mpm/logs/
|
|
419
|
+
Moves mpm_*.log files from old locations to .claude-mpm/logs/mpm/
|
|
354
420
|
"""
|
|
355
421
|
try:
|
|
356
|
-
# Check
|
|
422
|
+
# Check old possible locations (including incorrectly created ones)
|
|
357
423
|
old_locations = [
|
|
358
|
-
Path.cwd() / "
|
|
359
|
-
|
|
424
|
+
Path.cwd() / "logs", # Incorrectly created in project root
|
|
425
|
+
Path.cwd() / ".claude-mpm" / "logs", # Correct base location
|
|
426
|
+
self.base_log_dir, # Current base location (.claude-mpm/logs/)
|
|
360
427
|
]
|
|
361
428
|
new_location = self.base_log_dir / "mpm"
|
|
362
429
|
|
|
@@ -413,7 +480,7 @@ class LogManager:
|
|
|
413
480
|
prompts_dir = await self.setup_logging("prompts")
|
|
414
481
|
|
|
415
482
|
# Generate filename with timestamp
|
|
416
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[
|
|
483
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S_%f")[
|
|
417
484
|
:-3
|
|
418
485
|
] # Microseconds to milliseconds
|
|
419
486
|
|
|
@@ -439,7 +506,7 @@ class LogManager:
|
|
|
439
506
|
|
|
440
507
|
# Prepare prompt data
|
|
441
508
|
prompt_data = {
|
|
442
|
-
"timestamp": datetime.now().isoformat(),
|
|
509
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
443
510
|
"type": prompt_type,
|
|
444
511
|
"content": content,
|
|
445
512
|
"metadata": metadata or {},
|
|
@@ -475,12 +542,12 @@ class LogManager:
|
|
|
475
542
|
|
|
476
543
|
if extension == ".json":
|
|
477
544
|
# JSON files also get structured metadata for consistency
|
|
478
|
-
with open(
|
|
545
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
479
546
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
480
547
|
# For markdown or text files
|
|
481
548
|
elif isinstance(data, dict):
|
|
482
549
|
# Write as formatted markdown with metadata
|
|
483
|
-
with open(
|
|
550
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
484
551
|
f.write("---\n")
|
|
485
552
|
f.write(f"timestamp: {data.get('timestamp', 'unknown')}\n")
|
|
486
553
|
f.write(f"type: {data.get('type', 'unknown')}\n")
|
|
@@ -492,7 +559,7 @@ class LogManager:
|
|
|
492
559
|
f.write(data.get("content", ""))
|
|
493
560
|
else:
|
|
494
561
|
# Write content directly
|
|
495
|
-
with open(
|
|
562
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
496
563
|
f.write(str(data))
|
|
497
564
|
except Exception as e:
|
|
498
565
|
logger.error(f"Failed to write {file_path}: {e}")
|
|
@@ -512,16 +579,18 @@ class LogManager:
|
|
|
512
579
|
message: Log message to write
|
|
513
580
|
level: Log level (INFO, WARNING, ERROR, DEBUG)
|
|
514
581
|
"""
|
|
515
|
-
timestamp = datetime.now().isoformat()
|
|
582
|
+
timestamp = datetime.now(timezone.utc).isoformat()
|
|
516
583
|
log_entry = f"[{timestamp}] [{level}] {message}\n"
|
|
517
584
|
|
|
518
585
|
# Get appropriate log file based on context
|
|
519
586
|
log_dir = self._get_log_directory("mpm")
|
|
520
|
-
log_file = log_dir / f"mpm_{datetime.now().strftime('%Y%m%d')}.log"
|
|
587
|
+
log_file = log_dir / f"mpm_{datetime.now(timezone.utc).strftime('%Y%m%d')}.log"
|
|
521
588
|
|
|
522
589
|
def write_task():
|
|
523
590
|
try:
|
|
524
|
-
|
|
591
|
+
# Ensure directory exists before writing (race condition with cleanup)
|
|
592
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
593
|
+
with log_file.open("a", encoding="utf-8") as f:
|
|
525
594
|
f.write(log_entry)
|
|
526
595
|
except Exception as e:
|
|
527
596
|
logger.error(f"Failed to write log: {e}")
|
|
@@ -597,7 +666,7 @@ class LogManager:
|
|
|
597
666
|
try:
|
|
598
667
|
self.write_queue.put_nowait(None)
|
|
599
668
|
self.cleanup_queue.put_nowait(None)
|
|
600
|
-
except:
|
|
669
|
+
except Exception:
|
|
601
670
|
pass
|
|
602
671
|
|
|
603
672
|
# Wait for threads to finish
|