claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/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 +432 -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 +254 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +41 -14
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +21 -44
- claude_mpm/agents/frontmatter_validator.py +292 -252
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/circuit-breakers.md +1005 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +72 -376
- claude_mpm/cli/commands/__init__.py +4 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +344 -0
- claude_mpm/cli/commands/agents.py +1673 -178
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +11 -7
- claude_mpm/cli/commands/analyze.py +18 -13
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +566 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +54 -17
- claude_mpm/cli/commands/configure.py +1184 -1055
- 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 +184 -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 +19 -19
- claude_mpm/cli/commands/doctor.py +51 -7
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +534 -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 +573 -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/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +252 -167
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1225 -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 +279 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1872 -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/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +369 -1
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +196 -3
- claude_mpm/cli/parsers/config_parser.py +96 -43
- 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/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +282 -0
- claude_mpm/cli/parsers/source_parser.py +138 -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 +994 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +54 -3
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
- claude_mpm/commands/mpm-agents-detect.md +177 -0
- claude_mpm/commands/mpm-agents-list.md +131 -0
- claude_mpm/commands/mpm-agents-recommend.md +223 -0
- claude_mpm/commands/mpm-config-view.md +150 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +297 -5
- claude_mpm/commands/mpm-init.md +401 -17
- claude_mpm/commands/mpm-monitor.md +418 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +79 -8
- claude_mpm/commands/mpm-ticket-organize.md +304 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +122 -0
- claude_mpm/commands/mpm.md +12 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- 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/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +28 -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 +24 -42
- claude_mpm/core/config.py +101 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +66 -1
- 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 +25 -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 +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +181 -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_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +49 -8
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +146 -18
- 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 +22 -15
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +122 -15
- 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/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- 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/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/system_context.py +38 -0
- 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/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +600 -18
- claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
- claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- 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 +50 -13
- 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 +36 -16
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
- claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
- claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
- claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +309 -178
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +183 -139
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -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/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +125 -122
- claude_mpm/experimental/cli_enhancements.py +5 -7
- 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/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
- 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/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- 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 +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -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 +179 -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/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +35 -9
- 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/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +56 -18
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
- claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
- 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 +5 -7
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- 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_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
- 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/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
- 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/facade/deployment_facade.py +3 -3
- 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 +249 -53
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- 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 +10 -10
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- 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/git_source_manager.py +629 -0
- 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 +11 -14
- claude_mpm/services/agents/local_template_manager.py +784 -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/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- 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 +209 -13
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +88 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +169 -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 +70 -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 +8 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- 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 +21 -21
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +305 -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 +11 -7
- 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/consumers/logging.py +1 -2
- 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/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- 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 +2 -6
- claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
- 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/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -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 +427 -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 +1542 -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 +24 -5
- 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 +591 -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 +5 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
- 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 +555 -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 +732 -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 +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +691 -0
- claude_mpm/services/monitor/daemon_manager.py +1040 -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 +3 -3
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- 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 +554 -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 +583 -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 +17 -3
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +23 -9
- 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/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- 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 +22 -41
- 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 +9 -9
- 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 +142 -8
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +24 -24
- 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 +3 -5
- 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 +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -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 +471 -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 +466 -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 +14 -8
- 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/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- 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/database-migration.md +199 -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/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/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/refactoring-patterns.md +180 -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/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/scripts/with_server.py +129 -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 +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +9 -9
- 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 +184 -36
- claude_mpm/utils/agent_filters.py +288 -0
- 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 +5 -3
- 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/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +131 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/structured_questions.py +619 -0
- 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-5.0.9.dist-info/METADATA +1028 -0
- claude_mpm-5.0.9.dist-info/RECORD +864 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -270
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
- claude_mpm/agents/templates/api_qa.json +0 -171
- claude_mpm/agents/templates/code_analyzer.json +0 -95
- claude_mpm/agents/templates/data_engineer.json +0 -152
- claude_mpm/agents/templates/documentation.json +0 -175
- claude_mpm/agents/templates/engineer.json +0 -176
- claude_mpm/agents/templates/imagemagick.json +0 -261
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/memory_manager.json +0 -155
- claude_mpm/agents/templates/ops.json +0 -175
- claude_mpm/agents/templates/project_organizer.json +0 -130
- claude_mpm/agents/templates/qa.json +0 -223
- claude_mpm/agents/templates/refactoring_engineer.json +0 -266
- claude_mpm/agents/templates/research.json +0 -163
- claude_mpm/agents/templates/security.json +0 -153
- claude_mpm/agents/templates/ticketing.json +0 -169
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
- claude_mpm/agents/templates/version_control.json +0 -147
- claude_mpm/agents/templates/web_qa.json +0 -254
- claude_mpm/agents/templates/web_ui.json +0 -176
- 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/commands/mpm-agents.md +0 -12
- claude_mpm/commands/mpm-config.md +0 -18
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- 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-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -69,7 +69,7 @@ class ProjectRegistry:
|
|
|
69
69
|
self.registry_dir.mkdir(parents=True, exist_ok=True)
|
|
70
70
|
except Exception as e:
|
|
71
71
|
self.logger.error(f"Failed to create registry directory: {e}")
|
|
72
|
-
raise ProjectRegistryError(f"Cannot create registry directory: {e}")
|
|
72
|
+
raise ProjectRegistryError(f"Cannot create registry directory: {e}") from e
|
|
73
73
|
|
|
74
74
|
def get_or_create_project_entry(self) -> Dict[str, Any]:
|
|
75
75
|
"""
|
|
@@ -104,7 +104,7 @@ class ProjectRegistry:
|
|
|
104
104
|
|
|
105
105
|
except Exception as e:
|
|
106
106
|
self.logger.error(f"Failed to get or create project entry: {e}")
|
|
107
|
-
raise ProjectRegistryError(f"Registry operation failed: {e}")
|
|
107
|
+
raise ProjectRegistryError(f"Registry operation failed: {e}") from e
|
|
108
108
|
|
|
109
109
|
def _find_existing_entry(self) -> Optional[Dict[str, Any]]:
|
|
110
110
|
"""
|
|
@@ -124,7 +124,9 @@ class ProjectRegistry:
|
|
|
124
124
|
# Search all registry files
|
|
125
125
|
for registry_file in self.registry_dir.glob("*.yaml"):
|
|
126
126
|
try:
|
|
127
|
-
with
|
|
127
|
+
with Path(registry_file).open(
|
|
128
|
+
encoding="utf-8",
|
|
129
|
+
) as f:
|
|
128
130
|
data = yaml.safe_load(f) or {}
|
|
129
131
|
|
|
130
132
|
# Check if project_path matches
|
|
@@ -491,7 +493,7 @@ class ProjectRegistry:
|
|
|
491
493
|
# Remove internal fields before saving
|
|
492
494
|
save_data = {k: v for k, v in data.items() if not k.startswith("_")}
|
|
493
495
|
|
|
494
|
-
with open(
|
|
496
|
+
with registry_file.open("w", encoding="utf-8") as f:
|
|
495
497
|
yaml.dump(
|
|
496
498
|
save_data, f, default_flow_style=False, sort_keys=False, indent=2
|
|
497
499
|
)
|
|
@@ -500,7 +502,7 @@ class ProjectRegistry:
|
|
|
500
502
|
|
|
501
503
|
except Exception as e:
|
|
502
504
|
self.logger.error(f"Failed to save registry data: {e}")
|
|
503
|
-
raise ProjectRegistryError(f"Failed to save registry: {e}")
|
|
505
|
+
raise ProjectRegistryError(f"Failed to save registry: {e}") from e
|
|
504
506
|
|
|
505
507
|
def list_projects(self) -> List[Dict[str, Any]]:
|
|
506
508
|
"""
|
|
@@ -517,7 +519,9 @@ class ProjectRegistry:
|
|
|
517
519
|
try:
|
|
518
520
|
for registry_file in self.registry_dir.glob("*.yaml"):
|
|
519
521
|
try:
|
|
520
|
-
with
|
|
522
|
+
with Path(registry_file).open(
|
|
523
|
+
encoding="utf-8",
|
|
524
|
+
) as f:
|
|
521
525
|
data = yaml.safe_load(f) or {}
|
|
522
526
|
projects.append(data)
|
|
523
527
|
except Exception as e:
|
|
@@ -553,7 +557,9 @@ class ProjectRegistry:
|
|
|
553
557
|
try:
|
|
554
558
|
for registry_file in self.registry_dir.glob("*.yaml"):
|
|
555
559
|
try:
|
|
556
|
-
with
|
|
560
|
+
with Path(registry_file).open(
|
|
561
|
+
encoding="utf-8",
|
|
562
|
+
) as f:
|
|
557
563
|
data = yaml.safe_load(f) or {}
|
|
558
564
|
|
|
559
565
|
# Check last accessed time
|
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Toolchain Analyzer Service for Claude MPM Framework
|
|
3
|
+
===================================================
|
|
4
|
+
|
|
5
|
+
WHY: This service orchestrates multiple detection strategies to analyze
|
|
6
|
+
project toolchains. It provides comprehensive analysis of languages,
|
|
7
|
+
frameworks, and deployment targets for auto-configuration.
|
|
8
|
+
|
|
9
|
+
DESIGN DECISION: Uses Strategy pattern for pluggable detection strategies,
|
|
10
|
+
enabling easy addition of new language detectors. Implements dependency
|
|
11
|
+
injection for integration with existing ProjectAnalyzer.
|
|
12
|
+
|
|
13
|
+
Part of TSK-0054: Auto-Configuration Feature - Phase 2
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import time
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Dict, List, Optional
|
|
19
|
+
|
|
20
|
+
from ...core.base_service import BaseService
|
|
21
|
+
from ..core.interfaces.project import IToolchainAnalyzer
|
|
22
|
+
from ..core.models.toolchain import (
|
|
23
|
+
ConfidenceLevel,
|
|
24
|
+
DeploymentTarget,
|
|
25
|
+
Framework,
|
|
26
|
+
LanguageDetection,
|
|
27
|
+
ToolchainAnalysis,
|
|
28
|
+
ToolchainComponent,
|
|
29
|
+
)
|
|
30
|
+
from .detection_strategies import (
|
|
31
|
+
GoDetectionStrategy,
|
|
32
|
+
IToolchainDetectionStrategy,
|
|
33
|
+
NodeJSDetectionStrategy,
|
|
34
|
+
PythonDetectionStrategy,
|
|
35
|
+
RustDetectionStrategy,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ToolchainAnalyzerService(BaseService, IToolchainAnalyzer):
|
|
40
|
+
"""Service for analyzing project toolchains using pluggable strategies.
|
|
41
|
+
|
|
42
|
+
WHY: Understanding project toolchain is essential for intelligent agent
|
|
43
|
+
recommendations. This service provides comprehensive analysis with
|
|
44
|
+
confidence scoring and evidence tracking.
|
|
45
|
+
|
|
46
|
+
DESIGN DECISION: Separates detection logic into pluggable strategies,
|
|
47
|
+
making it easy to add new language support. Uses dependency injection
|
|
48
|
+
to integrate with existing ProjectAnalyzer for enhanced detection.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
project_analyzer: Optional[any] = None,
|
|
54
|
+
dependency_analyzer: Optional[any] = None,
|
|
55
|
+
config: Optional[Dict] = None,
|
|
56
|
+
):
|
|
57
|
+
"""Initialize the toolchain analyzer.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
project_analyzer: Optional ProjectAnalyzer for enhanced detection
|
|
61
|
+
dependency_analyzer: Optional DependencyAnalyzer for dependency parsing
|
|
62
|
+
config: Optional configuration dictionary
|
|
63
|
+
"""
|
|
64
|
+
super().__init__(
|
|
65
|
+
name="ToolchainAnalyzer",
|
|
66
|
+
config=config,
|
|
67
|
+
enable_enhanced_features=False,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Store dependencies
|
|
71
|
+
self.project_analyzer = project_analyzer
|
|
72
|
+
self.dependency_analyzer = dependency_analyzer
|
|
73
|
+
|
|
74
|
+
# Initialize detection strategies
|
|
75
|
+
self._strategies: Dict[str, IToolchainDetectionStrategy] = {}
|
|
76
|
+
self._register_default_strategies()
|
|
77
|
+
|
|
78
|
+
# Analysis cache
|
|
79
|
+
self._cache: Dict[str, ToolchainAnalysis] = {}
|
|
80
|
+
self._cache_ttl = 300 # 5 minutes
|
|
81
|
+
|
|
82
|
+
def _register_default_strategies(self) -> None:
|
|
83
|
+
"""Register default detection strategies."""
|
|
84
|
+
self.register_strategy("nodejs", NodeJSDetectionStrategy())
|
|
85
|
+
self.register_strategy("python", PythonDetectionStrategy())
|
|
86
|
+
self.register_strategy("rust", RustDetectionStrategy())
|
|
87
|
+
self.register_strategy("go", GoDetectionStrategy())
|
|
88
|
+
|
|
89
|
+
def register_strategy(
|
|
90
|
+
self, name: str, strategy: IToolchainDetectionStrategy
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Register a new detection strategy.
|
|
93
|
+
|
|
94
|
+
WHY: Allows runtime registration of new detection strategies,
|
|
95
|
+
enabling extensibility without modifying core code.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
name: Unique name for the strategy
|
|
99
|
+
strategy: Detection strategy instance
|
|
100
|
+
"""
|
|
101
|
+
self._strategies[name] = strategy
|
|
102
|
+
self.logger.debug(f"Registered detection strategy: {name}")
|
|
103
|
+
|
|
104
|
+
async def _initialize(self) -> None:
|
|
105
|
+
"""Initialize the service."""
|
|
106
|
+
self.logger.info("ToolchainAnalyzerService initialized")
|
|
107
|
+
|
|
108
|
+
async def _cleanup(self) -> None:
|
|
109
|
+
"""Cleanup service resources."""
|
|
110
|
+
self._cache.clear()
|
|
111
|
+
self.logger.info("ToolchainAnalyzerService cleaned up")
|
|
112
|
+
|
|
113
|
+
def analyze_toolchain(self, project_path: Path) -> ToolchainAnalysis:
|
|
114
|
+
"""Analyze project toolchain and dependencies.
|
|
115
|
+
|
|
116
|
+
WHY: Provides complete toolchain analysis including languages,
|
|
117
|
+
frameworks, build tools, and deployment targets in a single call.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
project_path: Path to the project root directory
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
ToolchainAnalysis: Complete analysis result with confidence scores
|
|
124
|
+
|
|
125
|
+
Raises:
|
|
126
|
+
FileNotFoundError: If project_path does not exist
|
|
127
|
+
PermissionError: If project_path is not readable
|
|
128
|
+
"""
|
|
129
|
+
# Validate project path
|
|
130
|
+
if not project_path.exists():
|
|
131
|
+
raise FileNotFoundError(f"Project path does not exist: {project_path}")
|
|
132
|
+
if not project_path.is_dir():
|
|
133
|
+
raise ValueError(f"Project path is not a directory: {project_path}")
|
|
134
|
+
|
|
135
|
+
# Check cache
|
|
136
|
+
cache_key = str(project_path.absolute())
|
|
137
|
+
cached = self._get_from_cache(cache_key)
|
|
138
|
+
if cached:
|
|
139
|
+
self.logger.debug(f"Using cached analysis for {project_path}")
|
|
140
|
+
return cached
|
|
141
|
+
|
|
142
|
+
self.logger.info(f"Analyzing toolchain for project: {project_path}")
|
|
143
|
+
start_time = time.time()
|
|
144
|
+
|
|
145
|
+
# Detect language
|
|
146
|
+
language_detection = self.detect_language(project_path)
|
|
147
|
+
|
|
148
|
+
# Detect frameworks
|
|
149
|
+
frameworks = self.detect_frameworks(project_path)
|
|
150
|
+
|
|
151
|
+
# Detect build tools and package managers
|
|
152
|
+
build_tools = self._detect_build_tools(project_path)
|
|
153
|
+
package_managers = self._detect_package_managers(project_path)
|
|
154
|
+
|
|
155
|
+
# Detect development tools
|
|
156
|
+
dev_tools = self._detect_development_tools(project_path)
|
|
157
|
+
|
|
158
|
+
# Detect deployment target
|
|
159
|
+
deployment_target = self.detect_deployment_target(project_path)
|
|
160
|
+
|
|
161
|
+
# Calculate overall confidence
|
|
162
|
+
overall_confidence = self._calculate_overall_confidence(
|
|
163
|
+
language_detection, frameworks, deployment_target
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
# Create analysis result
|
|
167
|
+
analysis = ToolchainAnalysis(
|
|
168
|
+
project_path=project_path,
|
|
169
|
+
language_detection=language_detection,
|
|
170
|
+
frameworks=frameworks,
|
|
171
|
+
deployment_target=deployment_target,
|
|
172
|
+
build_tools=build_tools,
|
|
173
|
+
package_managers=package_managers,
|
|
174
|
+
development_tools=dev_tools,
|
|
175
|
+
overall_confidence=overall_confidence,
|
|
176
|
+
analysis_timestamp=time.time(),
|
|
177
|
+
metadata={
|
|
178
|
+
"analysis_duration_ms": (time.time() - start_time) * 1000,
|
|
179
|
+
"strategies_used": list(self._strategies.keys()),
|
|
180
|
+
},
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
# Cache the result
|
|
184
|
+
self._add_to_cache(cache_key, analysis)
|
|
185
|
+
|
|
186
|
+
duration_ms = (time.time() - start_time) * 1000
|
|
187
|
+
self.logger.info(
|
|
188
|
+
f"Toolchain analysis complete in {duration_ms:.2f}ms: "
|
|
189
|
+
f"{language_detection.primary_language} with {len(frameworks)} frameworks"
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
return analysis
|
|
193
|
+
|
|
194
|
+
def detect_language(self, project_path: Path) -> LanguageDetection:
|
|
195
|
+
"""Detect primary and secondary languages used in the project.
|
|
196
|
+
|
|
197
|
+
WHY: Language detection is foundational for all other analysis.
|
|
198
|
+
Multiple strategies are tried to ensure accurate detection.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
project_path: Path to the project root directory
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
LanguageDetection: Detected languages with confidence scores
|
|
205
|
+
|
|
206
|
+
Raises:
|
|
207
|
+
FileNotFoundError: If project_path does not exist
|
|
208
|
+
"""
|
|
209
|
+
if not project_path.exists():
|
|
210
|
+
raise FileNotFoundError(f"Project path does not exist: {project_path}")
|
|
211
|
+
|
|
212
|
+
detections: List[LanguageDetection] = []
|
|
213
|
+
|
|
214
|
+
# Run all strategies that can detect
|
|
215
|
+
for strategy_name, strategy in self._strategies.items():
|
|
216
|
+
try:
|
|
217
|
+
if strategy.can_detect(project_path):
|
|
218
|
+
detection = strategy.detect_language(project_path)
|
|
219
|
+
if detection:
|
|
220
|
+
detections.append(detection)
|
|
221
|
+
self.logger.debug(
|
|
222
|
+
f"Strategy '{strategy_name}' detected: "
|
|
223
|
+
f"{detection.primary_language} "
|
|
224
|
+
f"(confidence: {detection.primary_confidence.value})"
|
|
225
|
+
)
|
|
226
|
+
except Exception as e:
|
|
227
|
+
self.logger.warning(
|
|
228
|
+
f"Strategy '{strategy_name}' failed: {e}", exc_info=True
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# If no detections, return unknown
|
|
232
|
+
if not detections:
|
|
233
|
+
self.logger.warning(f"No language detected for {project_path}")
|
|
234
|
+
return LanguageDetection(
|
|
235
|
+
primary_language="Unknown",
|
|
236
|
+
primary_confidence=ConfidenceLevel.VERY_LOW,
|
|
237
|
+
secondary_languages=[],
|
|
238
|
+
language_percentages={"Unknown": 100.0},
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# If multiple detections, choose highest confidence
|
|
242
|
+
if len(detections) > 1:
|
|
243
|
+
# Sort by confidence level
|
|
244
|
+
confidence_order = {
|
|
245
|
+
ConfidenceLevel.HIGH: 4,
|
|
246
|
+
ConfidenceLevel.MEDIUM: 3,
|
|
247
|
+
ConfidenceLevel.LOW: 2,
|
|
248
|
+
ConfidenceLevel.VERY_LOW: 1,
|
|
249
|
+
}
|
|
250
|
+
detections.sort(
|
|
251
|
+
key=lambda d: confidence_order.get(d.primary_confidence, 0),
|
|
252
|
+
reverse=True,
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
# Merge secondary languages from other detections
|
|
256
|
+
primary = detections[0]
|
|
257
|
+
for other in detections[1:]:
|
|
258
|
+
# Add other primary languages as secondary
|
|
259
|
+
if other.primary_language != primary.primary_language:
|
|
260
|
+
primary.secondary_languages.append(
|
|
261
|
+
ToolchainComponent(
|
|
262
|
+
name=other.primary_language,
|
|
263
|
+
version=other.primary_version,
|
|
264
|
+
confidence=other.primary_confidence,
|
|
265
|
+
)
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
return detections[0]
|
|
269
|
+
|
|
270
|
+
def detect_frameworks(self, project_path: Path) -> List[Framework]:
|
|
271
|
+
"""Detect frameworks and their versions.
|
|
272
|
+
|
|
273
|
+
WHY: Framework detection enables targeted agent recommendations
|
|
274
|
+
and provides context for development assistance.
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
project_path: Path to the project root directory
|
|
278
|
+
|
|
279
|
+
Returns:
|
|
280
|
+
List[Framework]: List of detected frameworks with versions and types
|
|
281
|
+
|
|
282
|
+
Raises:
|
|
283
|
+
FileNotFoundError: If project_path does not exist
|
|
284
|
+
"""
|
|
285
|
+
if not project_path.exists():
|
|
286
|
+
raise FileNotFoundError(f"Project path does not exist: {project_path}")
|
|
287
|
+
|
|
288
|
+
all_frameworks: List[Framework] = []
|
|
289
|
+
seen_frameworks: set = set()
|
|
290
|
+
|
|
291
|
+
# Run all strategies that can detect
|
|
292
|
+
for strategy_name, strategy in self._strategies.items():
|
|
293
|
+
try:
|
|
294
|
+
if strategy.can_detect(project_path):
|
|
295
|
+
frameworks = strategy.detect_frameworks(project_path)
|
|
296
|
+
for fw in frameworks:
|
|
297
|
+
# Deduplicate by name (case-insensitive)
|
|
298
|
+
fw_key = fw.name.lower()
|
|
299
|
+
if fw_key not in seen_frameworks:
|
|
300
|
+
all_frameworks.append(fw)
|
|
301
|
+
seen_frameworks.add(fw_key)
|
|
302
|
+
self.logger.debug(
|
|
303
|
+
f"Detected framework: {fw.name} "
|
|
304
|
+
f"(type: {fw.framework_type}, version: {fw.version})"
|
|
305
|
+
)
|
|
306
|
+
except Exception as e:
|
|
307
|
+
self.logger.warning(
|
|
308
|
+
f"Framework detection failed for '{strategy_name}': {e}",
|
|
309
|
+
exc_info=True,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
# Sort by confidence and popularity
|
|
313
|
+
all_frameworks.sort(
|
|
314
|
+
key=lambda f: (
|
|
315
|
+
(
|
|
316
|
+
4
|
|
317
|
+
if f.confidence == ConfidenceLevel.HIGH
|
|
318
|
+
else (
|
|
319
|
+
3
|
|
320
|
+
if f.confidence == ConfidenceLevel.MEDIUM
|
|
321
|
+
else 2
|
|
322
|
+
if f.confidence == ConfidenceLevel.LOW
|
|
323
|
+
else 1
|
|
324
|
+
)
|
|
325
|
+
),
|
|
326
|
+
f.popularity_score,
|
|
327
|
+
),
|
|
328
|
+
reverse=True,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
return all_frameworks
|
|
332
|
+
|
|
333
|
+
def detect_deployment_target(
|
|
334
|
+
self, project_path: Path
|
|
335
|
+
) -> Optional[DeploymentTarget]:
|
|
336
|
+
"""Detect intended deployment environment.
|
|
337
|
+
|
|
338
|
+
WHY: Deployment target affects agent recommendations (e.g., DevOps
|
|
339
|
+
agents for Kubernetes, serverless agents for Lambda).
|
|
340
|
+
|
|
341
|
+
Args:
|
|
342
|
+
project_path: Path to the project root directory
|
|
343
|
+
|
|
344
|
+
Returns:
|
|
345
|
+
Optional[DeploymentTarget]: Detected deployment target or None if unclear
|
|
346
|
+
|
|
347
|
+
Raises:
|
|
348
|
+
FileNotFoundError: If project_path does not exist
|
|
349
|
+
"""
|
|
350
|
+
if not project_path.exists():
|
|
351
|
+
raise FileNotFoundError(f"Project path does not exist: {project_path}")
|
|
352
|
+
|
|
353
|
+
# Check for Docker
|
|
354
|
+
if (project_path / "Dockerfile").exists() or (
|
|
355
|
+
project_path / "docker-compose.yml"
|
|
356
|
+
).exists():
|
|
357
|
+
return DeploymentTarget(
|
|
358
|
+
target_type="container",
|
|
359
|
+
platform="docker",
|
|
360
|
+
confidence=ConfidenceLevel.HIGH,
|
|
361
|
+
requires_ops_agent=True,
|
|
362
|
+
metadata={
|
|
363
|
+
"docker_compose": (project_path / "docker-compose.yml").exists()
|
|
364
|
+
},
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
# Check for Kubernetes
|
|
368
|
+
if (project_path / "k8s").exists() or (project_path / "kubernetes").exists():
|
|
369
|
+
return DeploymentTarget(
|
|
370
|
+
target_type="container",
|
|
371
|
+
platform="kubernetes",
|
|
372
|
+
confidence=ConfidenceLevel.HIGH,
|
|
373
|
+
requires_ops_agent=True,
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
# Check for Vercel
|
|
377
|
+
if (project_path / "vercel.json").exists():
|
|
378
|
+
return DeploymentTarget(
|
|
379
|
+
target_type="serverless",
|
|
380
|
+
platform="vercel",
|
|
381
|
+
confidence=ConfidenceLevel.HIGH,
|
|
382
|
+
requires_ops_agent=False,
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
# Check for AWS
|
|
386
|
+
if (project_path / "serverless.yml").exists():
|
|
387
|
+
return DeploymentTarget(
|
|
388
|
+
target_type="serverless",
|
|
389
|
+
platform="aws",
|
|
390
|
+
confidence=ConfidenceLevel.MEDIUM,
|
|
391
|
+
requires_ops_agent=True,
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
# Check for Terraform
|
|
395
|
+
if list(project_path.glob("*.tf")):
|
|
396
|
+
return DeploymentTarget(
|
|
397
|
+
target_type="cloud",
|
|
398
|
+
platform="terraform",
|
|
399
|
+
confidence=ConfidenceLevel.MEDIUM,
|
|
400
|
+
requires_ops_agent=True,
|
|
401
|
+
)
|
|
402
|
+
|
|
403
|
+
# Check for GCP
|
|
404
|
+
if (project_path / "app.yaml").exists():
|
|
405
|
+
return DeploymentTarget(
|
|
406
|
+
target_type="cloud",
|
|
407
|
+
platform="gcp",
|
|
408
|
+
confidence=ConfidenceLevel.MEDIUM,
|
|
409
|
+
requires_ops_agent=False,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# No clear deployment target
|
|
413
|
+
self.logger.debug(f"No deployment target detected for {project_path}")
|
|
414
|
+
return None
|
|
415
|
+
|
|
416
|
+
def _detect_build_tools(self, project_path: Path) -> List[ToolchainComponent]:
|
|
417
|
+
"""Detect build tools used in the project."""
|
|
418
|
+
build_tools = []
|
|
419
|
+
|
|
420
|
+
# Check for common build tools
|
|
421
|
+
build_indicators = {
|
|
422
|
+
"webpack": ["webpack.config.js", "webpack.config.ts"],
|
|
423
|
+
"vite": ["vite.config.js", "vite.config.ts"],
|
|
424
|
+
"rollup": ["rollup.config.js"],
|
|
425
|
+
"parcel": [".parcelrc"],
|
|
426
|
+
"make": ["Makefile"],
|
|
427
|
+
"cmake": ["CMakeLists.txt"],
|
|
428
|
+
"gradle": ["build.gradle", "build.gradle.kts"],
|
|
429
|
+
"maven": ["pom.xml"],
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
for tool_name, indicators in build_indicators.items():
|
|
433
|
+
for indicator in indicators:
|
|
434
|
+
if (project_path / indicator).exists():
|
|
435
|
+
build_tools.append(
|
|
436
|
+
ToolchainComponent(
|
|
437
|
+
name=tool_name,
|
|
438
|
+
confidence=ConfidenceLevel.HIGH,
|
|
439
|
+
)
|
|
440
|
+
)
|
|
441
|
+
break
|
|
442
|
+
|
|
443
|
+
return build_tools
|
|
444
|
+
|
|
445
|
+
def _detect_package_managers(self, project_path: Path) -> List[ToolchainComponent]:
|
|
446
|
+
"""Detect package managers used in the project."""
|
|
447
|
+
package_managers = []
|
|
448
|
+
|
|
449
|
+
# Check for package manager indicators
|
|
450
|
+
pm_indicators = {
|
|
451
|
+
"npm": ["package-lock.json"],
|
|
452
|
+
"yarn": ["yarn.lock"],
|
|
453
|
+
"pnpm": ["pnpm-lock.yaml"],
|
|
454
|
+
"pip": ["requirements.txt"],
|
|
455
|
+
"poetry": ["poetry.lock"],
|
|
456
|
+
"pipenv": ["Pipfile.lock"],
|
|
457
|
+
"cargo": ["Cargo.lock"],
|
|
458
|
+
"go modules": ["go.sum"],
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
for pm_name, indicators in pm_indicators.items():
|
|
462
|
+
for indicator in indicators:
|
|
463
|
+
if (project_path / indicator).exists():
|
|
464
|
+
package_managers.append(
|
|
465
|
+
ToolchainComponent(
|
|
466
|
+
name=pm_name,
|
|
467
|
+
confidence=ConfidenceLevel.HIGH,
|
|
468
|
+
)
|
|
469
|
+
)
|
|
470
|
+
break
|
|
471
|
+
|
|
472
|
+
return package_managers
|
|
473
|
+
|
|
474
|
+
def _detect_development_tools(self, project_path: Path) -> List[ToolchainComponent]:
|
|
475
|
+
"""Detect development tools and utilities."""
|
|
476
|
+
dev_tools = []
|
|
477
|
+
|
|
478
|
+
# Check for common dev tools
|
|
479
|
+
tool_indicators = {
|
|
480
|
+
"docker": ["Dockerfile", "docker-compose.yml"],
|
|
481
|
+
"kubernetes": ["k8s", "kubernetes"],
|
|
482
|
+
"terraform": ["*.tf"],
|
|
483
|
+
"git": [".git"],
|
|
484
|
+
"pre-commit": [".pre-commit-config.yaml"],
|
|
485
|
+
"eslint": [".eslintrc.js", ".eslintrc.json"],
|
|
486
|
+
"prettier": [".prettierrc", ".prettierrc.json"],
|
|
487
|
+
"black": ["pyproject.toml"], # Could check for [tool.black]
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
for tool_name, indicators in tool_indicators.items():
|
|
491
|
+
for indicator in indicators:
|
|
492
|
+
if "*" in indicator:
|
|
493
|
+
# Glob pattern
|
|
494
|
+
if list(project_path.glob(indicator)):
|
|
495
|
+
dev_tools.append(
|
|
496
|
+
ToolchainComponent(
|
|
497
|
+
name=tool_name,
|
|
498
|
+
confidence=ConfidenceLevel.HIGH,
|
|
499
|
+
)
|
|
500
|
+
)
|
|
501
|
+
break
|
|
502
|
+
# Direct path
|
|
503
|
+
elif (project_path / indicator).exists():
|
|
504
|
+
dev_tools.append(
|
|
505
|
+
ToolchainComponent(
|
|
506
|
+
name=tool_name,
|
|
507
|
+
confidence=ConfidenceLevel.HIGH,
|
|
508
|
+
)
|
|
509
|
+
)
|
|
510
|
+
break
|
|
511
|
+
|
|
512
|
+
return dev_tools
|
|
513
|
+
|
|
514
|
+
def _calculate_overall_confidence(
|
|
515
|
+
self,
|
|
516
|
+
language_detection: LanguageDetection,
|
|
517
|
+
frameworks: List[Framework],
|
|
518
|
+
deployment_target: Optional[DeploymentTarget],
|
|
519
|
+
) -> ConfidenceLevel:
|
|
520
|
+
"""Calculate overall confidence for the analysis.
|
|
521
|
+
|
|
522
|
+
WHY: Overall confidence helps users understand reliability of
|
|
523
|
+
the complete analysis, not just individual components.
|
|
524
|
+
"""
|
|
525
|
+
# Start with language detection confidence
|
|
526
|
+
confidence_scores = {
|
|
527
|
+
ConfidenceLevel.HIGH: 4,
|
|
528
|
+
ConfidenceLevel.MEDIUM: 3,
|
|
529
|
+
ConfidenceLevel.LOW: 2,
|
|
530
|
+
ConfidenceLevel.VERY_LOW: 1,
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
scores = [confidence_scores.get(language_detection.primary_confidence, 1)]
|
|
534
|
+
|
|
535
|
+
# Add framework confidence scores
|
|
536
|
+
if frameworks:
|
|
537
|
+
framework_avg = sum(
|
|
538
|
+
confidence_scores.get(fw.confidence, 1) for fw in frameworks
|
|
539
|
+
) / len(frameworks)
|
|
540
|
+
scores.append(framework_avg)
|
|
541
|
+
|
|
542
|
+
# Add deployment target confidence if available
|
|
543
|
+
if deployment_target:
|
|
544
|
+
scores.append(confidence_scores.get(deployment_target.confidence, 1))
|
|
545
|
+
|
|
546
|
+
# Calculate average
|
|
547
|
+
avg_score = sum(scores) / len(scores)
|
|
548
|
+
|
|
549
|
+
# Convert back to confidence level
|
|
550
|
+
if avg_score >= 3.5:
|
|
551
|
+
return ConfidenceLevel.HIGH
|
|
552
|
+
if avg_score >= 2.5:
|
|
553
|
+
return ConfidenceLevel.MEDIUM
|
|
554
|
+
if avg_score >= 1.5:
|
|
555
|
+
return ConfidenceLevel.LOW
|
|
556
|
+
return ConfidenceLevel.VERY_LOW
|
|
557
|
+
|
|
558
|
+
def _get_from_cache(self, cache_key: str) -> Optional[ToolchainAnalysis]:
|
|
559
|
+
"""Get analysis from cache if valid."""
|
|
560
|
+
if cache_key in self._cache:
|
|
561
|
+
cached = self._cache[cache_key]
|
|
562
|
+
# Check if cache is still valid
|
|
563
|
+
if cached.analysis_timestamp:
|
|
564
|
+
age = time.time() - cached.analysis_timestamp
|
|
565
|
+
if age < self._cache_ttl:
|
|
566
|
+
return cached
|
|
567
|
+
# Remove stale cache
|
|
568
|
+
del self._cache[cache_key]
|
|
569
|
+
return None
|
|
570
|
+
|
|
571
|
+
def _add_to_cache(self, cache_key: str, analysis: ToolchainAnalysis) -> None:
|
|
572
|
+
"""Add analysis to cache."""
|
|
573
|
+
self._cache[cache_key] = analysis
|
|
574
|
+
|
|
575
|
+
# Limit cache size
|
|
576
|
+
if len(self._cache) > 100:
|
|
577
|
+
# Remove oldest entries
|
|
578
|
+
sorted_items = sorted(
|
|
579
|
+
self._cache.items(),
|
|
580
|
+
key=lambda x: x[1].analysis_timestamp or 0,
|
|
581
|
+
)
|
|
582
|
+
for key, _ in sorted_items[:-50]: # Keep only 50 most recent
|
|
583
|
+
del self._cache[key]
|