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
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
PreToolUse Hook Template for Claude Code v2.0.30+
|
|
4
|
+
|
|
5
|
+
This template demonstrates how to create PreToolUse hooks that can modify
|
|
6
|
+
tool inputs before execution. Use cases include:
|
|
7
|
+
|
|
8
|
+
1. Context Injection: Add project context to Read/Edit operations
|
|
9
|
+
2. Security Guards: Validate file paths before operations
|
|
10
|
+
3. Logging: Log tool invocations before execution
|
|
11
|
+
4. Parameter Enhancement: Add default parameters to tool calls
|
|
12
|
+
|
|
13
|
+
Requirements:
|
|
14
|
+
- Claude Code v2.0.30 or higher
|
|
15
|
+
- Hook must be configured with "modifyInput": true in settings.json
|
|
16
|
+
|
|
17
|
+
Input Format (stdin):
|
|
18
|
+
{
|
|
19
|
+
"hook_event_name": "PreToolUse",
|
|
20
|
+
"tool_name": "Edit",
|
|
21
|
+
"tool_input": {
|
|
22
|
+
"file_path": "/path/to/file.py",
|
|
23
|
+
"old_string": "foo",
|
|
24
|
+
"new_string": "bar"
|
|
25
|
+
},
|
|
26
|
+
"session_id": "abc123...",
|
|
27
|
+
"cwd": "/working/directory"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
Output Format (stdout):
|
|
31
|
+
{
|
|
32
|
+
"action": "continue",
|
|
33
|
+
"tool_input": {
|
|
34
|
+
"file_path": "/path/to/file.py",
|
|
35
|
+
"old_string": "foo",
|
|
36
|
+
"new_string": "bar_modified"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
Or to block execution:
|
|
41
|
+
{
|
|
42
|
+
"action": "block",
|
|
43
|
+
"message": "Reason for blocking"
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
Or to continue without modification:
|
|
47
|
+
{
|
|
48
|
+
"action": "continue"
|
|
49
|
+
}
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
import json
|
|
53
|
+
import os
|
|
54
|
+
import sys
|
|
55
|
+
from pathlib import Path
|
|
56
|
+
from typing import Any, Dict, Optional
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class PreToolUseHook:
|
|
60
|
+
"""Base class for PreToolUse hooks with input modification support."""
|
|
61
|
+
|
|
62
|
+
def __init__(self):
|
|
63
|
+
"""Initialize the hook."""
|
|
64
|
+
self.debug = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "false").lower() == "true"
|
|
65
|
+
|
|
66
|
+
def log_debug(self, message: str) -> None:
|
|
67
|
+
"""Log debug message to stderr."""
|
|
68
|
+
if self.debug:
|
|
69
|
+
print(f"[PreToolUse Hook] {message}", file=sys.stderr)
|
|
70
|
+
|
|
71
|
+
def read_event(self) -> Optional[Dict[str, Any]]:
|
|
72
|
+
"""Read and parse the hook event from stdin."""
|
|
73
|
+
try:
|
|
74
|
+
event_data = sys.stdin.read()
|
|
75
|
+
if not event_data.strip():
|
|
76
|
+
return None
|
|
77
|
+
return json.loads(event_data)
|
|
78
|
+
except json.JSONDecodeError as e:
|
|
79
|
+
self.log_debug(f"Failed to parse event: {e}")
|
|
80
|
+
return None
|
|
81
|
+
except Exception as e:
|
|
82
|
+
self.log_debug(f"Error reading event: {e}")
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
def continue_execution(
|
|
86
|
+
self, modified_input: Optional[Dict[str, Any]] = None
|
|
87
|
+
) -> None:
|
|
88
|
+
"""Continue execution with optional modified input."""
|
|
89
|
+
response = {"action": "continue"}
|
|
90
|
+
if modified_input is not None:
|
|
91
|
+
response["tool_input"] = modified_input
|
|
92
|
+
print(json.dumps(response))
|
|
93
|
+
|
|
94
|
+
def block_execution(self, message: str) -> None:
|
|
95
|
+
"""Block execution with a message."""
|
|
96
|
+
response = {"action": "block", "message": message}
|
|
97
|
+
print(json.dumps(response))
|
|
98
|
+
|
|
99
|
+
def modify_input(
|
|
100
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
101
|
+
) -> Optional[Dict[str, Any]]:
|
|
102
|
+
"""
|
|
103
|
+
Modify tool input before execution.
|
|
104
|
+
|
|
105
|
+
Override this method in subclasses to implement custom logic.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
tool_name: Name of the tool being invoked
|
|
109
|
+
tool_input: Original tool input parameters
|
|
110
|
+
event: Full event data including session_id, cwd, etc.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Modified tool input dict, or None to continue without modification
|
|
114
|
+
"""
|
|
115
|
+
# Default: no modification
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
def should_block(
|
|
119
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
120
|
+
) -> tuple[bool, str]:
|
|
121
|
+
"""
|
|
122
|
+
Check if execution should be blocked.
|
|
123
|
+
|
|
124
|
+
Override this method in subclasses to implement validation logic.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
tool_name: Name of the tool being invoked
|
|
128
|
+
tool_input: Original tool input parameters
|
|
129
|
+
event: Full event data including session_id, cwd, etc.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Tuple of (should_block, reason)
|
|
133
|
+
"""
|
|
134
|
+
# Default: don't block
|
|
135
|
+
return False, ""
|
|
136
|
+
|
|
137
|
+
def run(self) -> None:
|
|
138
|
+
"""Main entry point for the hook."""
|
|
139
|
+
try:
|
|
140
|
+
# Read event from stdin
|
|
141
|
+
event = self.read_event()
|
|
142
|
+
if not event:
|
|
143
|
+
self.continue_execution()
|
|
144
|
+
return
|
|
145
|
+
|
|
146
|
+
tool_name = event.get("tool_name", "")
|
|
147
|
+
tool_input = event.get("tool_input", {})
|
|
148
|
+
|
|
149
|
+
self.log_debug(
|
|
150
|
+
f"Processing {tool_name} with input: {list(tool_input.keys())}"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Check if execution should be blocked
|
|
154
|
+
should_block, reason = self.should_block(tool_name, tool_input, event)
|
|
155
|
+
if should_block:
|
|
156
|
+
self.log_debug(f"Blocking {tool_name}: {reason}")
|
|
157
|
+
self.block_execution(reason)
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
# Try to modify input
|
|
161
|
+
modified_input = self.modify_input(tool_name, tool_input, event)
|
|
162
|
+
if modified_input is not None:
|
|
163
|
+
self.log_debug(f"Modified {tool_name} input")
|
|
164
|
+
self.continue_execution(modified_input)
|
|
165
|
+
else:
|
|
166
|
+
self.log_debug(f"No modification for {tool_name}")
|
|
167
|
+
self.continue_execution()
|
|
168
|
+
|
|
169
|
+
except Exception as e:
|
|
170
|
+
self.log_debug(f"Hook error: {e}")
|
|
171
|
+
# Always continue on error to avoid blocking Claude
|
|
172
|
+
self.continue_execution()
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# ============================================================================
|
|
176
|
+
# Example Implementations
|
|
177
|
+
# ============================================================================
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class ContextInjectionHook(PreToolUseHook):
|
|
181
|
+
"""
|
|
182
|
+
Example: Auto-inject project context into Read/Edit tool calls.
|
|
183
|
+
|
|
184
|
+
This hook adds project-specific context as comments to file operations.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
def __init__(self):
|
|
188
|
+
super().__init__()
|
|
189
|
+
self.project_context = self._load_project_context()
|
|
190
|
+
|
|
191
|
+
def _load_project_context(self) -> str:
|
|
192
|
+
"""Load project context from a file or environment."""
|
|
193
|
+
# Example: Load from .claude-context file
|
|
194
|
+
context_file = Path.cwd() / ".claude-context"
|
|
195
|
+
if context_file.exists():
|
|
196
|
+
return context_file.read_text()
|
|
197
|
+
return ""
|
|
198
|
+
|
|
199
|
+
def modify_input(
|
|
200
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
201
|
+
) -> Optional[Dict[str, Any]]:
|
|
202
|
+
"""Inject context into Read operations."""
|
|
203
|
+
if tool_name == "Read" and self.project_context:
|
|
204
|
+
# Add context as a note (this is conceptual - actual implementation depends on use case)
|
|
205
|
+
modified = tool_input.copy()
|
|
206
|
+
# You could add context to a metadata field if the tool supports it
|
|
207
|
+
modified["_context"] = self.project_context[:200]
|
|
208
|
+
return modified
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class SecurityGuardHook(PreToolUseHook):
|
|
213
|
+
"""
|
|
214
|
+
Example: Validate file paths before file operations.
|
|
215
|
+
|
|
216
|
+
This hook blocks operations on sensitive files or directories.
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
BLOCKED_PATHS = [
|
|
220
|
+
".env",
|
|
221
|
+
"credentials.json",
|
|
222
|
+
"secrets/",
|
|
223
|
+
".ssh/",
|
|
224
|
+
"id_rsa",
|
|
225
|
+
]
|
|
226
|
+
|
|
227
|
+
def should_block(
|
|
228
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
229
|
+
) -> tuple[bool, str]:
|
|
230
|
+
"""Block operations on sensitive files."""
|
|
231
|
+
if tool_name in ["Write", "Edit", "Read"]:
|
|
232
|
+
file_path = tool_input.get("file_path", "")
|
|
233
|
+
if any(blocked in file_path for blocked in self.BLOCKED_PATHS):
|
|
234
|
+
return True, f"Access to sensitive file blocked: {file_path}"
|
|
235
|
+
return False, ""
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class LoggingHook(PreToolUseHook):
|
|
239
|
+
"""
|
|
240
|
+
Example: Log all tool invocations before execution.
|
|
241
|
+
|
|
242
|
+
This hook logs tool calls to a file for debugging and audit purposes.
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
def __init__(self):
|
|
246
|
+
super().__init__()
|
|
247
|
+
self.log_file = Path.home() / ".claude-mpm" / "tool-calls.log"
|
|
248
|
+
self.log_file.parent.mkdir(exist_ok=True)
|
|
249
|
+
|
|
250
|
+
def modify_input(
|
|
251
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
252
|
+
) -> Optional[Dict[str, Any]]:
|
|
253
|
+
"""Log the tool call."""
|
|
254
|
+
try:
|
|
255
|
+
from datetime import datetime, timezone
|
|
256
|
+
|
|
257
|
+
log_entry = {
|
|
258
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
259
|
+
"tool_name": tool_name,
|
|
260
|
+
"session_id": event.get("session_id", ""),
|
|
261
|
+
"cwd": event.get("cwd", ""),
|
|
262
|
+
"parameters": list(tool_input.keys()),
|
|
263
|
+
}
|
|
264
|
+
with self.log_file.open("a") as f:
|
|
265
|
+
f.write(json.dumps(log_entry) + "\n")
|
|
266
|
+
except Exception as e:
|
|
267
|
+
self.log_debug(f"Failed to log tool call: {e}")
|
|
268
|
+
|
|
269
|
+
# Don't modify input, just log
|
|
270
|
+
return None
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class ParameterEnhancementHook(PreToolUseHook):
|
|
274
|
+
"""
|
|
275
|
+
Example: Add default parameters to tool calls.
|
|
276
|
+
|
|
277
|
+
This hook adds default values to tool parameters if not provided.
|
|
278
|
+
"""
|
|
279
|
+
|
|
280
|
+
def modify_input(
|
|
281
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
282
|
+
) -> Optional[Dict[str, Any]]:
|
|
283
|
+
"""Add default parameters."""
|
|
284
|
+
modified = tool_input.copy()
|
|
285
|
+
|
|
286
|
+
if tool_name == "Bash":
|
|
287
|
+
# Add default timeout if not specified
|
|
288
|
+
if "timeout" not in modified:
|
|
289
|
+
modified["timeout"] = 30000 # 30 seconds
|
|
290
|
+
return modified
|
|
291
|
+
|
|
292
|
+
elif tool_name == "Grep":
|
|
293
|
+
# Add line numbers by default
|
|
294
|
+
if "-n" not in modified:
|
|
295
|
+
modified["-n"] = True
|
|
296
|
+
return modified
|
|
297
|
+
|
|
298
|
+
return None
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
# ============================================================================
|
|
302
|
+
# Main Entry Point
|
|
303
|
+
# ============================================================================
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def main():
|
|
307
|
+
"""Main entry point - choose which hook implementation to use."""
|
|
308
|
+
# Select which hook implementation to use
|
|
309
|
+
# Uncomment the one you want to use:
|
|
310
|
+
|
|
311
|
+
# hook = ContextInjectionHook()
|
|
312
|
+
# hook = SecurityGuardHook()
|
|
313
|
+
# hook = LoggingHook()
|
|
314
|
+
# hook = ParameterEnhancementHook()
|
|
315
|
+
|
|
316
|
+
# Default: use base hook (no modification)
|
|
317
|
+
hook = PreToolUseHook()
|
|
318
|
+
|
|
319
|
+
hook.run()
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
if __name__ == "__main__":
|
|
323
|
+
main()
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
from collections import defaultdict
|
|
5
|
-
from datetime import datetime
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
6
|
from typing import Any, Dict, List, Optional
|
|
7
7
|
|
|
8
8
|
from claude_mpm.core.logger import get_logger
|
|
@@ -105,7 +105,7 @@ class ToolCallInterceptor:
|
|
|
105
105
|
"parameters": parameters.copy(), # Copy to avoid modifying original
|
|
106
106
|
},
|
|
107
107
|
metadata=metadata or {},
|
|
108
|
-
timestamp=datetime.now(),
|
|
108
|
+
timestamp=datetime.now(timezone.utc),
|
|
109
109
|
)
|
|
110
110
|
|
|
111
111
|
# Run hooks
|
|
@@ -125,10 +125,13 @@ class ToolCallInterceptor:
|
|
|
125
125
|
f"[{result.get('hook_name', 'Unknown')}] {result.get('error')}"
|
|
126
126
|
)
|
|
127
127
|
|
|
128
|
-
if
|
|
128
|
+
if (
|
|
129
|
+
result.get("modified")
|
|
130
|
+
and result.get("data")
|
|
131
|
+
and "parameters" in result.get("data", {})
|
|
132
|
+
):
|
|
129
133
|
# Update parameters if modified
|
|
130
|
-
|
|
131
|
-
modified_params = result["data"]["parameters"]
|
|
134
|
+
modified_params = result["data"]["parameters"]
|
|
132
135
|
|
|
133
136
|
if result.get("metadata"):
|
|
134
137
|
hook_metadata.update(result["metadata"])
|
|
@@ -6,14 +6,14 @@ Validation hooks for claude-mpm operations.
|
|
|
6
6
|
Inspired by awesome-claude-code's pre-push validation approach.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
import logging
|
|
10
9
|
from typing import Any, Callable, Dict, List, Optional
|
|
11
10
|
|
|
12
11
|
import yaml
|
|
13
12
|
|
|
13
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
14
14
|
from claude_mpm.validation import AgentValidator, ValidationResult
|
|
15
15
|
|
|
16
|
-
logger =
|
|
16
|
+
logger = get_logger(__name__)
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class ValidationHooks:
|
|
@@ -118,7 +118,7 @@ async def validate_agent_dependencies(profile_path: Path) -> ValidationResult:
|
|
|
118
118
|
result = ValidationResult(is_valid=True)
|
|
119
119
|
|
|
120
120
|
try:
|
|
121
|
-
with open(
|
|
121
|
+
with profile_path.open() as f:
|
|
122
122
|
profile_data = yaml.safe_load(f)
|
|
123
123
|
|
|
124
124
|
# Check for circular dependencies
|
claude_mpm/init.py
CHANGED
|
@@ -141,6 +141,25 @@ class ProjectInitializer:
|
|
|
141
141
|
if not gitignore.exists():
|
|
142
142
|
gitignore.write_text("logs/\n*.log\n*.pyc\n__pycache__/\n")
|
|
143
143
|
|
|
144
|
+
# Also ensure MCP directories are in main project .gitignore
|
|
145
|
+
try:
|
|
146
|
+
from claude_mpm.services.project.project_organizer import (
|
|
147
|
+
ProjectOrganizer,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Check if we're in a git repository
|
|
151
|
+
if (project_root / ".git").exists():
|
|
152
|
+
organizer = ProjectOrganizer(project_root)
|
|
153
|
+
# This will add MCP directories and other standard patterns
|
|
154
|
+
organizer.update_gitignore()
|
|
155
|
+
self.logger.debug(
|
|
156
|
+
"Updated project .gitignore with MCP and standard patterns"
|
|
157
|
+
)
|
|
158
|
+
except Exception as e:
|
|
159
|
+
self.logger.debug(
|
|
160
|
+
f"Could not update project gitignore with MCP patterns: {e}"
|
|
161
|
+
)
|
|
162
|
+
|
|
144
163
|
# Log successful creation with details
|
|
145
164
|
self.logger.info(f"Initialized project directory at {self.project_dir}")
|
|
146
165
|
self.logger.debug("Created directories: agents, config, responses, logs")
|
|
@@ -251,11 +270,11 @@ class ProjectInitializer:
|
|
|
251
270
|
"""
|
|
252
271
|
try:
|
|
253
272
|
# Read existing JSON configuration
|
|
254
|
-
with open(
|
|
273
|
+
with old_file.open() as f:
|
|
255
274
|
config = json.load(f)
|
|
256
275
|
|
|
257
276
|
# Write as YAML
|
|
258
|
-
with open(
|
|
277
|
+
with new_file.open("w") as f:
|
|
259
278
|
yaml.dump(config, f, default_flow_style=False, sort_keys=False)
|
|
260
279
|
|
|
261
280
|
self.logger.info(
|
|
@@ -291,7 +310,7 @@ class ProjectInitializer:
|
|
|
291
310
|
},
|
|
292
311
|
}
|
|
293
312
|
|
|
294
|
-
with open(
|
|
313
|
+
with config_file.open("w") as f:
|
|
295
314
|
yaml.dump(default_config, f, default_flow_style=False, sort_keys=False)
|
|
296
315
|
|
|
297
316
|
def _create_project_config(self, config_file: Path):
|
|
@@ -303,7 +322,7 @@ class ProjectInitializer:
|
|
|
303
322
|
"tickets": {"auto_create": True, "prefix": "TSK"},
|
|
304
323
|
}
|
|
305
324
|
|
|
306
|
-
with open(
|
|
325
|
+
with config_file.open("w") as f:
|
|
307
326
|
json.dump(project_config, f, indent=2)
|
|
308
327
|
|
|
309
328
|
def _copy_agent_templates(self):
|
|
@@ -13,7 +13,7 @@ chronological order for session replay and analysis.
|
|
|
13
13
|
|
|
14
14
|
import json
|
|
15
15
|
from dataclasses import asdict, dataclass, field
|
|
16
|
-
from datetime import datetime
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
17
|
from enum import Enum
|
|
18
18
|
from typing import Any, Dict, List, Optional, Set
|
|
19
19
|
|
|
@@ -204,7 +204,7 @@ class AgentSession:
|
|
|
204
204
|
and metric updates.
|
|
205
205
|
"""
|
|
206
206
|
if timestamp is None:
|
|
207
|
-
timestamp = datetime.
|
|
207
|
+
timestamp = datetime.now(timezone.utc).isoformat() + "Z"
|
|
208
208
|
|
|
209
209
|
# Categorize the event
|
|
210
210
|
category = self._categorize_event(event_type, data)
|
|
@@ -338,7 +338,7 @@ class AgentSession:
|
|
|
338
338
|
event.timestamp.replace("Z", "+00:00")
|
|
339
339
|
)
|
|
340
340
|
tool_op.duration_ms = int((end - start).total_seconds() * 1000)
|
|
341
|
-
except:
|
|
341
|
+
except Exception:
|
|
342
342
|
pass
|
|
343
343
|
|
|
344
344
|
event.correlation_id = corr_id
|
|
@@ -393,7 +393,7 @@ class AgentSession:
|
|
|
393
393
|
self.metrics.session_duration_ms = int(
|
|
394
394
|
(end - start).total_seconds() * 1000
|
|
395
395
|
)
|
|
396
|
-
except:
|
|
396
|
+
except Exception:
|
|
397
397
|
pass
|
|
398
398
|
|
|
399
399
|
# Finalize any pending delegations
|
|
@@ -448,7 +448,7 @@ class AgentSession:
|
|
|
448
448
|
filepath = directory / filename
|
|
449
449
|
|
|
450
450
|
# Save to file
|
|
451
|
-
with open(
|
|
451
|
+
with filepath.open("w", encoding="utf-8") as f:
|
|
452
452
|
json.dump(self.to_dict(), f, indent=2, ensure_ascii=False)
|
|
453
453
|
|
|
454
454
|
return str(filepath)
|
|
@@ -531,6 +531,8 @@ class AgentSession:
|
|
|
531
531
|
|
|
532
532
|
WHY: Enables analysis of historical sessions.
|
|
533
533
|
"""
|
|
534
|
-
with
|
|
534
|
+
with Path(filepath).open(
|
|
535
|
+
encoding="utf-8",
|
|
536
|
+
) as f:
|
|
535
537
|
data = json.load(f)
|
|
536
538
|
return cls.from_dict(data)
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Git repository model for agent sources."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Optional
|
|
7
|
+
from urllib.parse import urlparse
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class GitRepository:
|
|
12
|
+
"""Represents a Git repository configuration for agent sources.
|
|
13
|
+
|
|
14
|
+
This model tracks Git repositories that contain agent markdown files.
|
|
15
|
+
Repositories are cached locally and synced using ETag-based HTTP caching.
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
url: Full GitHub repository URL (e.g., https://github.com/owner/repo)
|
|
19
|
+
subdirectory: Optional subdirectory within repository (e.g., "agents/backend")
|
|
20
|
+
enabled: Whether this repository should be synced
|
|
21
|
+
priority: Priority for agent resolution (lower = higher precedence)
|
|
22
|
+
last_synced: Timestamp of last successful sync
|
|
23
|
+
etag: HTTP ETag from last sync for incremental updates
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
url: str
|
|
27
|
+
subdirectory: Optional[str] = None
|
|
28
|
+
enabled: bool = True
|
|
29
|
+
priority: int = 100
|
|
30
|
+
last_synced: Optional[datetime] = None
|
|
31
|
+
etag: Optional[str] = None
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def cache_path(self) -> Path:
|
|
35
|
+
"""Return cache directory path for this repository.
|
|
36
|
+
|
|
37
|
+
Cache structure: ~/.claude-mpm/cache/remote-agents/{owner}/{repo}/{subdirectory}/
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Absolute path to cache directory for this repository
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
>>> repo = GitRepository(
|
|
44
|
+
... url="https://github.com/bobmatnyc/claude-mpm-agents",
|
|
45
|
+
... subdirectory="agents"
|
|
46
|
+
... )
|
|
47
|
+
>>> repo.cache_path
|
|
48
|
+
Path('/Users/user/.claude-mpm/cache/remote-agents/bobmatnyc/claude-mpm-agents/agents')
|
|
49
|
+
"""
|
|
50
|
+
home = Path.home()
|
|
51
|
+
base_cache = home / ".claude-mpm" / "cache" / "remote-agents"
|
|
52
|
+
|
|
53
|
+
# Extract owner and repo from URL
|
|
54
|
+
owner, repo = self._parse_github_url(self.url)
|
|
55
|
+
|
|
56
|
+
# Build cache path: base/owner/repo/subdirectory
|
|
57
|
+
cache_path = base_cache / owner / repo
|
|
58
|
+
|
|
59
|
+
if self.subdirectory:
|
|
60
|
+
# Normalize subdirectory path (remove leading/trailing slashes)
|
|
61
|
+
normalized_subdir = self.subdirectory.strip("/")
|
|
62
|
+
cache_path = cache_path / normalized_subdir
|
|
63
|
+
|
|
64
|
+
return cache_path
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def identifier(self) -> str:
|
|
68
|
+
"""Return unique identifier for this repository.
|
|
69
|
+
|
|
70
|
+
Format: {owner}/{repo}/{subdirectory} or {owner}/{repo}
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Unique identifier string
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
>>> repo = GitRepository(
|
|
77
|
+
... url="https://github.com/owner/repo",
|
|
78
|
+
... subdirectory="agents"
|
|
79
|
+
... )
|
|
80
|
+
>>> repo.identifier
|
|
81
|
+
'owner/repo/agents'
|
|
82
|
+
"""
|
|
83
|
+
owner, repo = self._parse_github_url(self.url)
|
|
84
|
+
base_id = f"{owner}/{repo}"
|
|
85
|
+
|
|
86
|
+
if self.subdirectory:
|
|
87
|
+
normalized_subdir = self.subdirectory.strip("/")
|
|
88
|
+
return f"{base_id}/{normalized_subdir}"
|
|
89
|
+
|
|
90
|
+
return base_id
|
|
91
|
+
|
|
92
|
+
def validate(self) -> list[str]:
|
|
93
|
+
"""Validate repository configuration.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
List of validation error messages (empty if valid)
|
|
97
|
+
|
|
98
|
+
Validation checks:
|
|
99
|
+
- URL is not empty
|
|
100
|
+
- URL is valid HTTP/HTTPS format
|
|
101
|
+
- URL is a GitHub repository URL
|
|
102
|
+
- Priority is non-negative
|
|
103
|
+
- Priority is reasonable (<= 1000, warning only)
|
|
104
|
+
- Subdirectory is relative path (not absolute)
|
|
105
|
+
"""
|
|
106
|
+
errors = []
|
|
107
|
+
|
|
108
|
+
# Validate URL
|
|
109
|
+
if not self.url or not self.url.strip():
|
|
110
|
+
errors.append("URL cannot be empty")
|
|
111
|
+
return errors # Can't continue validation without URL
|
|
112
|
+
|
|
113
|
+
# Check URL format
|
|
114
|
+
try:
|
|
115
|
+
parsed = urlparse(self.url)
|
|
116
|
+
|
|
117
|
+
# Must be HTTP or HTTPS
|
|
118
|
+
if parsed.scheme not in ("http", "https"):
|
|
119
|
+
errors.append(
|
|
120
|
+
f"URL must use http:// or https:// protocol, got: {parsed.scheme}"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# Must be GitHub (for now)
|
|
124
|
+
if not parsed.netloc.endswith("github.com"):
|
|
125
|
+
errors.append(f"URL must be a GitHub repository, got: {parsed.netloc}")
|
|
126
|
+
|
|
127
|
+
# Should have owner/repo path structure
|
|
128
|
+
path_parts = [p for p in parsed.path.strip("/").split("/") if p]
|
|
129
|
+
if len(path_parts) < 2:
|
|
130
|
+
errors.append(f"URL must include owner/repo path, got: {parsed.path}")
|
|
131
|
+
|
|
132
|
+
except Exception as e:
|
|
133
|
+
errors.append(f"Invalid URL format: {e}")
|
|
134
|
+
|
|
135
|
+
# Validate priority
|
|
136
|
+
if self.priority < 0:
|
|
137
|
+
errors.append("Priority must be non-negative (0 or greater)")
|
|
138
|
+
|
|
139
|
+
if self.priority > 1000:
|
|
140
|
+
errors.append(
|
|
141
|
+
f"Priority {self.priority} is unusually high (recommended: 0-1000). "
|
|
142
|
+
"Lower priority numbers have higher precedence."
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# Validate subdirectory
|
|
146
|
+
if self.subdirectory:
|
|
147
|
+
# Must be relative path
|
|
148
|
+
if Path(self.subdirectory).is_absolute():
|
|
149
|
+
errors.append(
|
|
150
|
+
f"Subdirectory must be a relative path, got absolute: {self.subdirectory}"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Should not start with slash
|
|
154
|
+
if self.subdirectory.startswith("/"):
|
|
155
|
+
errors.append(
|
|
156
|
+
f"Subdirectory should not start with '/', got: {self.subdirectory}"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
return errors
|
|
160
|
+
|
|
161
|
+
def _parse_github_url(self, url: str) -> tuple[str, str]:
|
|
162
|
+
"""Parse GitHub URL to extract owner and repository name.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
url: GitHub repository URL
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Tuple of (owner, repository_name)
|
|
169
|
+
|
|
170
|
+
Example:
|
|
171
|
+
>>> repo = GitRepository(url="https://github.com/owner/repo")
|
|
172
|
+
>>> repo._parse_github_url(repo.url)
|
|
173
|
+
('owner', 'repo')
|
|
174
|
+
"""
|
|
175
|
+
# Remove .git suffix if present
|
|
176
|
+
url = url.rstrip("/")
|
|
177
|
+
if url.endswith(".git"):
|
|
178
|
+
url = url[:-4]
|
|
179
|
+
|
|
180
|
+
# Parse URL
|
|
181
|
+
parsed = urlparse(url)
|
|
182
|
+
path_parts = [p for p in parsed.path.strip("/").split("/") if p]
|
|
183
|
+
|
|
184
|
+
if len(path_parts) >= 2:
|
|
185
|
+
owner = path_parts[0]
|
|
186
|
+
repo = path_parts[1]
|
|
187
|
+
return owner, repo
|
|
188
|
+
|
|
189
|
+
# Fallback: Use URL as-is if parsing fails
|
|
190
|
+
# This will be caught by validation
|
|
191
|
+
return "unknown", "unknown"
|
|
192
|
+
|
|
193
|
+
def __repr__(self) -> str:
|
|
194
|
+
"""Return string representation of repository."""
|
|
195
|
+
return (
|
|
196
|
+
f"GitRepository(identifier='{self.identifier}', "
|
|
197
|
+
f"priority={self.priority}, enabled={self.enabled})"
|
|
198
|
+
)
|